diff -Nru glfw-2.6/compile.ami glfw-2.7.2/compile.ami --- glfw-2.6/compile.ami 2003-02-02 20:51:40.000000000 +0000 +++ glfw-2.7.2/compile.ami 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -.key MAKE,COMPILER -.bra { -.ket } - -;************************************************************************* -;* compile.ami - AmigaDOS compilation script -;* $Date: 2003/02/02 20:51:40 $ -;* $Revision: 1.2 $ -;* -;* This is a "helper" script for the top-level Makefile for GLFW. -;* -;* Usage 1: compile MAKEPROG SUFFIX -;* -;* MAKEPROG Name of make program (e.g. make or nmake) -;* SUFFIX Makefile suffix for a specific compiler (e.g. msvc) -;* -;* Usage 2: compile CLEAN -;************************************************************************* - -; Do we want to do a cleanup? -IF "{MAKE}" EQ "CLEAN" - Echo "Cleaning up..." - delete >NIL: lib/amigaos/#?.o QUIET - delete >NIL: lib/amigaos/glfw.lib QUIET - delete >NIL: lib/amigaos/libglfw.a QUIET - delete >NIL: examples/boing QUIET - delete >NIL: examples/gears QUIET - delete >NIL: examples/keytest QUIET - delete >NIL: examples/listmodes QUIET - delete >NIL: examples/mipmaps QUIET - delete >NIL: examples/mtbench QUIET - delete >NIL: examples/mthello QUIET - delete >NIL: examples/particles QUIET - delete >NIL: examples/pong3d QUIET - delete >NIL: examples/splitview QUIET - delete >NIL: examples/triangle QUIET - delete >NIL: examples/wave QUIET - Skip done -EndIF - -; Did we get a proper make program name? -IF "{COMPILER}" EQ "" - echo >T:mymake{$$} "make -f Makefile.amigaos.{MAKE}" -Else - echo >T:mymake{$$} "{MAKE} -f Makefile.amigaos.{COMPILER}" -EndIF -protect T:mymake{$$} SRWED add - -; Compile GLFW library -cd lib/amigaos -T:mymake{$$} - -; Compiler GLFW example programs -cd //examples -T:mymake{$$} -cd / - -; Remove temporary file -delete >NIL: T:mymake{$$} QUIET - -Lab done diff -Nru glfw-2.6/compile.bat glfw-2.7.2/compile.bat --- glfw-2.6/compile.bat 2007-03-15 03:20:18.000000000 +0000 +++ glfw-2.7.2/compile.bat 2011-06-25 19:28:56.000000000 +0000 @@ -1,217 +1,236 @@ -@echo off - -REM ********************************************************************** -REM * compile.bat - MS Windows compilation batch file -REM * $Date: 2007/03/15 03:20:18 $ -REM * $Revision: 1.3 $ -REM * -REM * This is a "helper" script for the top-level Makefile for GLFW. -REM * It was introduced to eliminate incompability issues between -REM * Windows NT, 2000 and 9x (it's easier to make a script/makefile -REM * run accross different unices from different vendors than to make -REM * a script/makefile run across different Windows versions from -REM * Microsoft!). -REM * -REM * This batch file has been tested under Windows 98, NT 4.0 and 2k. -REM * -REM * Usage 1: compile MAKEPROG SUFFIX -REM * -REM * MAKEPROG Name of make program (e.g. make or nmake) -REM * SUFFIX Makefile suffix for a specific compiler (e.g. msvc) -REM * -REM * Usage 2: compile CLEAN -REM ********************************************************************** - -REM ---------------------------------------------------------------------- -REM Check input arguments -REM ---------------------------------------------------------------------- - -IF %1 == CLEAN GOTO Cleanup -IF %1 == "" GOTO Error1 -IF "%2" == "" GOTO Error1 -IF NOT EXIST .\lib\win32\Makefile.win32.%2 GOTO Error2 -GOTO ArgsOK - -:Error1 -echo ************************************************************************* -echo *** NOTE: THIS PROGRAM IS USED BY THE TOP LEVEL MAKEFILE. *** -echo *** PLEASE READ 'README.HTML' FOR INFORMATION ON HOW TO COMPILE GLFW! *** -echo ************************************************************************* -echo Usage 1: %0 MAKEPROG SUFFIX -echo MAKEPROG - Name of make program (e.g. make or nmake) -echo SUFFIX - Makefile suffix for a specific compiler (e.g. mgw or msvc) -echo Usage 2: %0 CLEAN -goto End - -:Error2 -echo "%2" is not a vaild Makefile suffix -goto End - -:ArgsOK - -REM ---------------------------------------------------------------------- -REM Build GLFW library (both static and dynamic, where supported) -REM ---------------------------------------------------------------------- - -cd .\lib\win32 -%1 -f Makefile.win32.%2 - - -REM ---------------------------------------------------------------------- -REM Build example programs -REM ---------------------------------------------------------------------- - -cd ..\..\examples -%1 -f Makefile.win32.%2 - - -REM ---------------------------------------------------------------------- -REM Return to root directory -REM ---------------------------------------------------------------------- - -cd .. -GOTO End - - - -REM ---------------------------------------------------------------------- -REM Clean up compiled files -REM ---------------------------------------------------------------------- - -:Cleanup - -REM Library object files -IF EXIST .\lib\win32\enable.o del .\lib\win32\enable.o -IF EXIST .\lib\win32\fullscreen.o del .\lib\win32\fullscreen.o -IF EXIST .\lib\win32\glext.o del .\lib\win32\glext.o -IF EXIST .\lib\win32\image.o del .\lib\win32\image.o -IF EXIST .\lib\win32\init.o del .\lib\win32\init.o -IF EXIST .\lib\win32\input.o del .\lib\win32\input.o -IF EXIST .\lib\win32\joystick.o del .\lib\win32\joystick.o -IF EXIST .\lib\win32\tga.o del .\lib\win32\tga.o -IF EXIST .\lib\win32\thread.o del .\lib\win32\thread.o -IF EXIST .\lib\win32\time.o del .\lib\win32\time.o -IF EXIST .\lib\win32\window.o del .\lib\win32\window.o -IF EXIST .\lib\win32\win32_enable.o del .\lib\win32\win32_enable.o -IF EXIST .\lib\win32\win32_fullscreen.o del .\lib\win32\win32_fullscreen.o -IF EXIST .\lib\win32\win32_glext.o del .\lib\win32\win32_glext.o -IF EXIST .\lib\win32\win32_init.o del .\lib\win32\win32_init.o -IF EXIST .\lib\win32\win32_joystick.o del .\lib\win32\win32_joystick.o -IF EXIST .\lib\win32\win32_thread.o del .\lib\win32\win32_thread.o -IF EXIST .\lib\win32\win32_time.o del .\lib\win32\win32_time.o -IF EXIST .\lib\win32\win32_window.o del .\lib\win32\win32_window.o - -IF EXIST .\lib\win32\enable_dll.o del .\lib\win32\enable_dll.o -IF EXIST .\lib\win32\fullscreen_dll.o del .\lib\win32\fullscreen_dll.o -IF EXIST .\lib\win32\glext_dll.o del .\lib\win32\glext_dll.o -IF EXIST .\lib\win32\image_dll.o del .\lib\win32\image_dll.o -IF EXIST .\lib\win32\init_dll.o del .\lib\win32\init_dll.o -IF EXIST .\lib\win32\input_dll.o del .\lib\win32\input_dll.o -IF EXIST .\lib\win32\joystick_dll.o del .\lib\win32\joystick_dll.o -IF EXIST .\lib\win32\tga_dll.o del .\lib\win32\tga_dll.o -IF EXIST .\lib\win32\thread_dll.o del .\lib\win32\thread_dll.o -IF EXIST .\lib\win32\time_dll.o del .\lib\win32\time_dll.o -IF EXIST .\lib\win32\window_dll.o del .\lib\win32\window_dll.o -IF EXIST .\lib\win32\win32_dllmain_dll.o del .\lib\win32\win32_dllmain_dll.o -IF EXIST .\lib\win32\win32_enable_dll.o del .\lib\win32\win32_enable_dll.o -IF EXIST .\lib\win32\win32_fullscreen_dll.o del .\lib\win32\win32_fullscreen_dll.o -IF EXIST .\lib\win32\win32_glext_dll.o del .\lib\win32\win32_glext_dll.o -IF EXIST .\lib\win32\win32_init_dll.o del .\lib\win32\win32_init_dll.o -IF EXIST .\lib\win32\win32_joystick_dll.o del .\lib\win32\win32_joystick_dll.o -IF EXIST .\lib\win32\win32_thread_dll.o del .\lib\win32\win32_thread_dll.o -IF EXIST .\lib\win32\win32_time_dll.o del .\lib\win32\win32_time_dll.o -IF EXIST .\lib\win32\win32_window_dll.o del .\lib\win32\win32_window_dll.o - -IF EXIST .\lib\win32\enable.obj del .\lib\win32\enable.obj -IF EXIST .\lib\win32\fullscreen.obj del .\lib\win32\fullscreen.obj -IF EXIST .\lib\win32\glext.obj del .\lib\win32\glext.obj -IF EXIST .\lib\win32\image.obj del .\lib\win32\image.obj -IF EXIST .\lib\win32\init.obj del .\lib\win32\init.obj -IF EXIST .\lib\win32\input.obj del .\lib\win32\input.obj -IF EXIST .\lib\win32\joystick.obj del .\lib\win32\joystick.obj -IF EXIST .\lib\win32\tga.obj del .\lib\win32\tga.obj -IF EXIST .\lib\win32\thread.obj del .\lib\win32\thread.obj -IF EXIST .\lib\win32\time.obj del .\lib\win32\time.obj -IF EXIST .\lib\win32\window.obj del .\lib\win32\window.obj -IF EXIST .\lib\win32\win32_enable.obj del .\lib\win32\win32_enable.obj -IF EXIST .\lib\win32\win32_fullscreen.obj del .\lib\win32\win32_fullscreen.obj -IF EXIST .\lib\win32\win32_glext.obj del .\lib\win32\win32_glext.obj -IF EXIST .\lib\win32\win32_init.obj del .\lib\win32\win32_init.obj -IF EXIST .\lib\win32\win32_joystick.obj del .\lib\win32\win32_joystick.obj -IF EXIST .\lib\win32\win32_thread.obj del .\lib\win32\win32_thread.obj -IF EXIST .\lib\win32\win32_time.obj del .\lib\win32\win32_time.obj -IF EXIST .\lib\win32\win32_window.obj del .\lib\win32\win32_window.obj - -IF EXIST .\lib\win32\enable_dll.obj del .\lib\win32\enable_dll.obj -IF EXIST .\lib\win32\fullscreen_dll.obj del .\lib\win32\fullscreen_dll.obj -IF EXIST .\lib\win32\glext_dll.obj del .\lib\win32\glext_dll.obj -IF EXIST .\lib\win32\image_dll.obj del .\lib\win32\image_dll.obj -IF EXIST .\lib\win32\init_dll.obj del .\lib\win32\init_dll.obj -IF EXIST .\lib\win32\input_dll.obj del .\lib\win32\input_dll.obj -IF EXIST .\lib\win32\joystick_dll.obj del .\lib\win32\joystick_dll.obj -IF EXIST .\lib\win32\tga_dll.obj del .\lib\win32\tga_dll.obj -IF EXIST .\lib\win32\thread_dll.obj del .\lib\win32\thread_dll.obj -IF EXIST .\lib\win32\time_dll.obj del .\lib\win32\time_dll.obj -IF EXIST .\lib\win32\window_dll.obj del .\lib\win32\window_dll.obj -IF EXIST .\lib\win32\win32_dllmain_dll.obj del .\lib\win32\win32_dllmain_dll.obj -IF EXIST .\lib\win32\win32_enable_dll.obj del .\lib\win32\win32_enable_dll.obj -IF EXIST .\lib\win32\win32_fullscreen_dll.obj del .\lib\win32\win32_fullscreen_dll.obj -IF EXIST .\lib\win32\win32_glext_dll.obj del .\lib\win32\win32_glext_dll.obj -IF EXIST .\lib\win32\win32_init_dll.obj del .\lib\win32\win32_init_dll.obj -IF EXIST .\lib\win32\win32_joystick_dll.obj del .\lib\win32\win32_joystick_dll.obj -IF EXIST .\lib\win32\win32_thread_dll.obj del .\lib\win32\win32_thread_dll.obj -IF EXIST .\lib\win32\win32_time_dll.obj del .\lib\win32\win32_time_dll.obj -IF EXIST .\lib\win32\win32_window_dll.obj del .\lib\win32\win32_window_dll.obj - -REM Library files -IF EXIST .\lib\win32\libglfw.a del .\lib\win32\libglfw.a -IF EXIST .\lib\win32\libglfwdll.a del .\lib\win32\libglfwdll.a -IF EXIST .\lib\win32\glfw.exp del .\lib\win32\glfw.exp -IF EXIST .\lib\win32\glfwdll.exp del .\lib\win32\glfwdll.exp -IF EXIST .\lib\win32\glfw.lib del .\lib\win32\glfw.lib -IF EXIST .\lib\win32\glfwdll.lib del .\lib\win32\glfwdll.lib -IF EXIST .\lib\win32\glfw.dll del .\lib\win32\glfw.dll -IF EXIST .\lib\win32\glfw.tds del .\lib\win32\glfw.tds -IF EXIST .\lib\win32\init.tds del .\lib\win32\init.tds - -REM Executables and related files -IF EXIST .\examples\boing.exe del .\examples\boing.exe -IF EXIST .\examples\gears.exe del .\examples\gears.exe -IF EXIST .\examples\keytest.exe del .\examples\keytest.exe -IF EXIST .\examples\listmodes.exe del .\examples\listmodes.exe -IF EXIST .\examples\mipmaps.exe del .\examples\mipmaps.exe -IF EXIST .\examples\mtbench.exe del .\examples\mtbench.exe -IF EXIST .\examples\mthello.exe del .\examples\mthello.exe -IF EXIST .\examples\particles.exe del .\examples\particles.exe -IF EXIST .\examples\pong3d.exe del .\examples\pong3d.exe -IF EXIST .\examples\splitview.exe del .\examples\splitview.exe -IF EXIST .\examples\triangle.exe del .\examples\triangle.exe -IF EXIST .\examples\wave.exe del .\examples\wave.exe - -IF EXIST .\examples\boing.obj del .\examples\boing.obj -IF EXIST .\examples\gears.obj del .\examples\gears.obj -IF EXIST .\examples\keytest.obj del .\examples\keytest.obj -IF EXIST .\examples\listmodes.obj del .\examples\listmodes.obj -IF EXIST .\examples\mipmaps.obj del .\examples\mipmaps.obj -IF EXIST .\examples\mtbench.obj del .\examples\mtbench.obj -IF EXIST .\examples\mthello.obj del .\examples\mthello.obj -IF EXIST .\examples\particles.obj del .\examples\particles.obj -IF EXIST .\examples\pong3d.obj del .\examples\pong3d.obj -IF EXIST .\examples\splitview.obj del .\examples\splitview.obj -IF EXIST .\examples\triangle.obj del .\examples\triangle.obj -IF EXIST .\examples\wave.obj del .\examples\wave.obj - -IF EXIST .\examples\boing.tds del .\examples\boing.tds -IF EXIST .\examples\gears.tds del .\examples\gears.tds -IF EXIST .\examples\keytest.tds del .\examples\keytest.tds -IF EXIST .\examples\listmodes.tds del .\examples\listmodes.tds -IF EXIST .\examples\mipmaps.tds del .\examples\mipmaps.tds -IF EXIST .\examples\mtbench.tds del .\examples\mtbench.tds -IF EXIST .\examples\mthello.tds del .\examples\mthello.tds -IF EXIST .\examples\particles.tds del .\examples\particles.tds -IF EXIST .\examples\pong3d.tds del .\examples\pong3d.tds -IF EXIST .\examples\splitview.tds del .\examples\splitview.tds -IF EXIST .\examples\triangle.tds del .\examples\triangle.tds -IF EXIST .\examples\wave.tds del .\examples\wave.tds - -:End +@echo off + +REM ********************************************************************** +REM * compile.bat - MS Windows compilation batch file +REM * +REM * This is a "helper" script for the top-level Makefile for GLFW. +REM * It was introduced to eliminate incompability issues between +REM * Windows NT, 2000 and 9x (it's easier to make a script/makefile +REM * run accross different unices from different vendors than to make +REM * a script/makefile run across different Windows versions from +REM * Microsoft!). +REM * +REM * This batch file has been tested under Windows 98, NT 4.0 and 2k. +REM * +REM * Usage 1: compile MAKEPROG SUFFIX +REM * +REM * MAKEPROG Name of make program (e.g. make or nmake) +REM * SUFFIX Makefile suffix for a specific compiler (e.g. msvc) +REM * +REM * Usage 2: compile CLEAN +REM ********************************************************************** + +REM ---------------------------------------------------------------------- +REM Check input arguments +REM ---------------------------------------------------------------------- + +IF %1 == CLEAN GOTO Cleanup +IF %1 == "" GOTO Error1 +IF "%2" == "" GOTO Error1 +IF NOT EXIST .\lib\win32\Makefile.win32.%2 GOTO Error2 +GOTO ArgsOK + +:Error1 +echo ************************************************************************* +echo *** NOTE: THIS PROGRAM IS USED BY THE TOP LEVEL MAKEFILE. *** +echo *** PLEASE READ 'README.HTML' FOR INFORMATION ON HOW TO COMPILE GLFW! *** +echo ************************************************************************* +echo Usage 1: %0 MAKEPROG SUFFIX +echo MAKEPROG - Name of make program (e.g. make or nmake) +echo SUFFIX - Makefile suffix for a specific compiler (e.g. mgw or msvc) +echo Usage 2: %0 CLEAN +goto End + +:Error2 +echo "%2" is not a vaild Makefile suffix +goto End + +:ArgsOK + +REM ---------------------------------------------------------------------- +REM Build GLFW library (both static and dynamic, where supported) +REM ---------------------------------------------------------------------- + +cd .\lib\win32 +%1 -f Makefile.win32.%2 + + +REM ---------------------------------------------------------------------- +REM Build example programs +REM ---------------------------------------------------------------------- + +cd ..\..\examples +%1 -f Makefile.win32.%2 + + +REM ---------------------------------------------------------------------- +REM Build test programs +REM ---------------------------------------------------------------------- + +cd ..\tests +%1 -f Makefile.win32.%2 + + +REM ---------------------------------------------------------------------- +REM Return to root directory +REM ---------------------------------------------------------------------- + +cd .. +GOTO End + + + +REM ---------------------------------------------------------------------- +REM Clean up compiled files +REM ---------------------------------------------------------------------- + +:Cleanup + +REM Library object files +IF EXIST .\lib\win32\enable.o del .\lib\win32\enable.o +IF EXIST .\lib\win32\fullscreen.o del .\lib\win32\fullscreen.o +IF EXIST .\lib\win32\glext.o del .\lib\win32\glext.o +IF EXIST .\lib\win32\image.o del .\lib\win32\image.o +IF EXIST .\lib\win32\init.o del .\lib\win32\init.o +IF EXIST .\lib\win32\input.o del .\lib\win32\input.o +IF EXIST .\lib\win32\joystick.o del .\lib\win32\joystick.o +IF EXIST .\lib\win32\stream.o del .\lib\win32\stream.o +IF EXIST .\lib\win32\tga.o del .\lib\win32\tga.o +IF EXIST .\lib\win32\thread.o del .\lib\win32\thread.o +IF EXIST .\lib\win32\time.o del .\lib\win32\time.o +IF EXIST .\lib\win32\window.o del .\lib\win32\window.o +IF EXIST .\lib\win32\win32_enable.o del .\lib\win32\win32_enable.o +IF EXIST .\lib\win32\win32_fullscreen.o del .\lib\win32\win32_fullscreen.o +IF EXIST .\lib\win32\win32_glext.o del .\lib\win32\win32_glext.o +IF EXIST .\lib\win32\win32_init.o del .\lib\win32\win32_init.o +IF EXIST .\lib\win32\win32_joystick.o del .\lib\win32\win32_joystick.o +IF EXIST .\lib\win32\win32_thread.o del .\lib\win32\win32_thread.o +IF EXIST .\lib\win32\win32_time.o del .\lib\win32\win32_time.o +IF EXIST .\lib\win32\win32_window.o del .\lib\win32\win32_window.o + +IF EXIST .\lib\win32\enable_dll.o del .\lib\win32\enable_dll.o +IF EXIST .\lib\win32\fullscreen_dll.o del .\lib\win32\fullscreen_dll.o +IF EXIST .\lib\win32\glext_dll.o del .\lib\win32\glext_dll.o +IF EXIST .\lib\win32\image_dll.o del .\lib\win32\image_dll.o +IF EXIST .\lib\win32\init_dll.o del .\lib\win32\init_dll.o +IF EXIST .\lib\win32\input_dll.o del .\lib\win32\input_dll.o +IF EXIST .\lib\win32\joystick_dll.o del .\lib\win32\joystick_dll.o +IF EXIST .\lib\win32\stream_dll.o del .\lib\win32\stream_dll.o +IF EXIST .\lib\win32\tga_dll.o del .\lib\win32\tga_dll.o +IF EXIST .\lib\win32\thread_dll.o del .\lib\win32\thread_dll.o +IF EXIST .\lib\win32\time_dll.o del .\lib\win32\time_dll.o +IF EXIST .\lib\win32\window_dll.o del .\lib\win32\window_dll.o +IF EXIST .\lib\win32\win32_dllmain_dll.o del .\lib\win32\win32_dllmain_dll.o +IF EXIST .\lib\win32\win32_enable_dll.o del .\lib\win32\win32_enable_dll.o +IF EXIST .\lib\win32\win32_fullscreen_dll.o del .\lib\win32\win32_fullscreen_dll.o +IF EXIST .\lib\win32\win32_glext_dll.o del .\lib\win32\win32_glext_dll.o +IF EXIST .\lib\win32\win32_init_dll.o del .\lib\win32\win32_init_dll.o +IF EXIST .\lib\win32\win32_joystick_dll.o del .\lib\win32\win32_joystick_dll.o +IF EXIST .\lib\win32\win32_thread_dll.o del .\lib\win32\win32_thread_dll.o +IF EXIST .\lib\win32\win32_time_dll.o del .\lib\win32\win32_time_dll.o +IF EXIST .\lib\win32\win32_window_dll.o del .\lib\win32\win32_window_dll.o + +IF EXIST .\lib\win32\enable.obj del .\lib\win32\enable.obj +IF EXIST .\lib\win32\fullscreen.obj del .\lib\win32\fullscreen.obj +IF EXIST .\lib\win32\glext.obj del .\lib\win32\glext.obj +IF EXIST .\lib\win32\image.obj del .\lib\win32\image.obj +IF EXIST .\lib\win32\init.obj del .\lib\win32\init.obj +IF EXIST .\lib\win32\input.obj del .\lib\win32\input.obj +IF EXIST .\lib\win32\joystick.obj del .\lib\win32\joystick.obj +IF EXIST .\lib\win32\stream.obj del .\lib\win32\stream.obj +IF EXIST .\lib\win32\tga.obj del .\lib\win32\tga.obj +IF EXIST .\lib\win32\thread.obj del .\lib\win32\thread.obj +IF EXIST .\lib\win32\time.obj del .\lib\win32\time.obj +IF EXIST .\lib\win32\window.obj del .\lib\win32\window.obj +IF EXIST .\lib\win32\win32_enable.obj del .\lib\win32\win32_enable.obj +IF EXIST .\lib\win32\win32_fullscreen.obj del .\lib\win32\win32_fullscreen.obj +IF EXIST .\lib\win32\win32_glext.obj del .\lib\win32\win32_glext.obj +IF EXIST .\lib\win32\win32_init.obj del .\lib\win32\win32_init.obj +IF EXIST .\lib\win32\win32_joystick.obj del .\lib\win32\win32_joystick.obj +IF EXIST .\lib\win32\win32_thread.obj del .\lib\win32\win32_thread.obj +IF EXIST .\lib\win32\win32_time.obj del .\lib\win32\win32_time.obj +IF EXIST .\lib\win32\win32_window.obj del .\lib\win32\win32_window.obj + +IF EXIST .\lib\win32\enable_dll.obj del .\lib\win32\enable_dll.obj +IF EXIST .\lib\win32\fullscreen_dll.obj del .\lib\win32\fullscreen_dll.obj +IF EXIST .\lib\win32\glext_dll.obj del .\lib\win32\glext_dll.obj +IF EXIST .\lib\win32\image_dll.obj del .\lib\win32\image_dll.obj +IF EXIST .\lib\win32\init_dll.obj del .\lib\win32\init_dll.obj +IF EXIST .\lib\win32\input_dll.obj del .\lib\win32\input_dll.obj +IF EXIST .\lib\win32\joystick_dll.obj del .\lib\win32\joystick_dll.obj +IF EXIST .\lib\win32\stream_dll.obj del .\lib\win32\stream_dll.obj +IF EXIST .\lib\win32\tga_dll.obj del .\lib\win32\tga_dll.obj +IF EXIST .\lib\win32\thread_dll.obj del .\lib\win32\thread_dll.obj +IF EXIST .\lib\win32\time_dll.obj del .\lib\win32\time_dll.obj +IF EXIST .\lib\win32\window_dll.obj del .\lib\win32\window_dll.obj +IF EXIST .\lib\win32\win32_dllmain_dll.obj del .\lib\win32\win32_dllmain_dll.obj +IF EXIST .\lib\win32\win32_enable_dll.obj del .\lib\win32\win32_enable_dll.obj +IF EXIST .\lib\win32\win32_fullscreen_dll.obj del .\lib\win32\win32_fullscreen_dll.obj +IF EXIST .\lib\win32\win32_glext_dll.obj del .\lib\win32\win32_glext_dll.obj +IF EXIST .\lib\win32\win32_init_dll.obj del .\lib\win32\win32_init_dll.obj +IF EXIST .\lib\win32\win32_joystick_dll.obj del .\lib\win32\win32_joystick_dll.obj +IF EXIST .\lib\win32\win32_thread_dll.obj del .\lib\win32\win32_thread_dll.obj +IF EXIST .\lib\win32\win32_time_dll.obj del .\lib\win32\win32_time_dll.obj +IF EXIST .\lib\win32\win32_window_dll.obj del .\lib\win32\win32_window_dll.obj + +REM Library files +IF EXIST .\lib\win32\libglfw.a del .\lib\win32\libglfw.a +IF EXIST .\lib\win32\libglfwdll.a del .\lib\win32\libglfwdll.a +IF EXIST .\lib\win32\glfw.exp del .\lib\win32\glfw.exp +IF EXIST .\lib\win32\glfwdll.exp del .\lib\win32\glfwdll.exp +IF EXIST .\lib\win32\glfw.lib del .\lib\win32\glfw.lib +IF EXIST .\lib\win32\glfwdll.lib del .\lib\win32\glfwdll.lib +IF EXIST .\lib\win32\glfw.dll del .\lib\win32\glfw.dll +IF EXIST .\lib\win32\glfw.tds del .\lib\win32\glfw.tds +IF EXIST .\lib\win32\init.tds del .\lib\win32\init.tds + +REM Executables and related files +IF EXIST .\examples\boing.exe del .\examples\boing.exe +IF EXIST .\examples\gears.exe del .\examples\gears.exe +IF EXIST .\examples\listmodes.exe del .\examples\listmodes.exe +IF EXIST .\examples\mipmaps.exe del .\examples\mipmaps.exe +IF EXIST .\examples\mtbench.exe del .\examples\mtbench.exe +IF EXIST .\examples\mthello.exe del .\examples\mthello.exe +IF EXIST .\examples\particles.exe del .\examples\particles.exe +IF EXIST .\examples\pong3d.exe del .\examples\pong3d.exe +IF EXIST .\examples\splitview.exe del .\examples\splitview.exe +IF EXIST .\examples\triangle.exe del .\examples\triangle.exe +IF EXIST .\examples\wave.exe del .\examples\wave.exe + +IF EXIST .\examples\boing.obj del .\examples\boing.obj +IF EXIST .\examples\gears.obj del .\examples\gears.obj +IF EXIST .\examples\listmodes.obj del .\examples\listmodes.obj +IF EXIST .\examples\mipmaps.obj del .\examples\mipmaps.obj +IF EXIST .\examples\mtbench.obj del .\examples\mtbench.obj +IF EXIST .\examples\mthello.obj del .\examples\mthello.obj +IF EXIST .\examples\particles.obj del .\examples\particles.obj +IF EXIST .\examples\pong3d.obj del .\examples\pong3d.obj +IF EXIST .\examples\splitview.obj del .\examples\splitview.obj +IF EXIST .\examples\triangle.obj del .\examples\triangle.obj +IF EXIST .\examples\wave.obj del .\examples\wave.obj + +IF EXIST .\examples\boing.tds del .\examples\boing.tds +IF EXIST .\examples\gears.tds del .\examples\gears.tds +IF EXIST .\examples\listmodes.tds del .\examples\listmodes.tds +IF EXIST .\examples\mipmaps.tds del .\examples\mipmaps.tds +IF EXIST .\examples\mtbench.tds del .\examples\mtbench.tds +IF EXIST .\examples\mthello.tds del .\examples\mthello.tds +IF EXIST .\examples\particles.tds del .\examples\particles.tds +IF EXIST .\examples\pong3d.tds del .\examples\pong3d.tds +IF EXIST .\examples\splitview.tds del .\examples\splitview.tds +IF EXIST .\examples\triangle.tds del .\examples\triangle.tds +IF EXIST .\examples\wave.tds del .\examples\wave.tds + +IF EXIST .\tests\accuracy.exe del .\tests\accuracy.exe +IF EXIST .\tests\defaults.exe del .\tests\defaults.exe +IF EXIST .\tests\events.exe del .\tests\events.exe +IF EXIST .\tests\fsaa.exe del .\tests\fsaa.exe +IF EXIST .\tests\fsinput.exe del .\tests\fsinput.exe +IF EXIST .\tests\joysticks.exe del .\tests\joysticks.exe +IF EXIST .\tests\peter.exe del .\tests\peter.exe +IF EXIST .\tests\reopen.exe del .\tests\reopen.exe +IF EXIST .\tests\tearing.exe del .\tests\tearing.exe +IF EXIST .\tests\version.exe del .\tests\version.exe + +:End + diff -Nru glfw-2.6/compile.sh glfw-2.7.2/compile.sh --- glfw-2.6/compile.sh 2007-07-01 09:46:46.000000000 +0000 +++ glfw-2.7.2/compile.sh 2011-06-28 03:55:28.000000000 +0000 @@ -2,8 +2,8 @@ ########################################################################## # compile.sh - Unix/X11 configuration script -# $Date: 2007/07/01 09:46:46 $ -# $Revision: 1.15 $ +# $Date: 2007-09-20 23:16:57 $ +# $Revision: 1.16 $ # # This is a minimalist configuration script for GLFW, which is used to # determine the availability of certain features. @@ -33,14 +33,12 @@ # Misc. ########################################################################## -config_script=$0 +self=$0 # File descriptor usage: # 0 standard input # 1 file creation # 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan # 5 compiler messages saved in config.log # 6 checking for... messages and results exec 5>./config.log @@ -52,7 +50,7 @@ echo "\ This file contains any messages produced by compilers while -running $config_script, to aid debugging if $config_script makes a mistake. +running $self, to aid debugging if $self makes a mistake. " 1>&5 @@ -63,93 +61,95 @@ CC=cc fi -CFLAGS= -LFLAGS= -LDFLAGS= -INCS= -LIBS="-lGL -lX11" +# These will contain flags needed by both the GLFW library and programs +# They are also used by the compile and link tests below +# Note that CFLAGS and LFLAGS remain unmodified and are checked again +# before file generation +GLFW_CFLAGS="$CFLAGS" +GLFW_LFLAGS="$LFLAGS -lGL" +# These will contain flags needed by the GLFW library +GLFW_LIB_CFLAGS= +GLFW_LIB_LFLAGS= -########################################################################## -# Compilation commands -########################################################################## -compile='$CC -c $CFLAGS conftest.c 1>&5' -link='$CC -o conftest $CFLAGS $LFLAGS conftest.c $LIBS 1>&5' +# These will contain flags needed by programs using GLFW +GLFW_BIN_CFLAGS= +GLFW_BIN_LFLAGS= + +# This will contain flags needed by the GLFW shared library +SOFLAGS= ########################################################################## -# Check on what system we are running +# Add system-specific flags ########################################################################## -echo "Checking what kind of system this is... " 1>&6 +echo -n "Checking what kind of system this is... " 1>&6 case "x`uname 2> /dev/null`" in xLinux) - CFLAGS="$CFLAGS -Dlinux" - LDFLAGS="-shared" - echo " Linux" 1>&6 + GLFW_LIB_CFLAGS="$GLFW_LIB_CFLAGS -D_GLFW_USE_LINUX_JOYSTICKS" + SOFLAGS="-shared -Wl,-soname,libglfw.so" + echo "Linux" 1>&6 ;; xDarwin) - CFLAGS="$CFLAGS" - LDFLAGS="-flat_namespace -undefined suppress" - echo " Mac OS X" 1>&6 + SOFLAGS="-flat_namespace -undefined suppress" + echo "Mac OS X" 1>&6 ;; *) - LDFLAGS="-shared -soname libglfw.so" - echo " Generic Unix" 1>&6 + SOFLAGS="-shared -soname libglfw.so" + echo "Generic Unix" 1>&6 ;; esac -echo " " 1>&6 - ########################################################################## -# Check for X11 libs/include directories +# Check for X11 library directory ########################################################################## -echo "Checking for X11 libraries location... " 1>&6 +echo -n "Checking for X11 libraries location... " 1>&6 -# X11R6 in /usr/X11/lib ? if [ -r "/usr/X11/lib" ]; then - LFLAGS="$LFLAGS -L/usr/X11/lib" - INCS="-I/usr/X11/include" - echo " X11 libraries location: /usr/X11/lib" 1>&6 -# X11R/ in /usr/X11R7/lib ? + GLFW_LFLAGS="$GLFW_LFLAGS -L/usr/X11/lib" + GLFW_CFLAGS="-I/usr/X11/include $GLFW_CFLAGS" + echo "/usr/X11/lib" 1>&6 elif [ -r "/usr/X11R7/lib" ]; then - LFLAGS="$LFLAGS -L/usr/X11R7/lib" - INCS="-I/usr/X11R7/include" - echo " X11 libraries location: /usr/X11R7/lib" 1>&6 -# X11R6 in /usr/X11R6/lib ? + GLFW_LFLAGS="$GLFW_LFLAGS -L/usr/X11R7/lib" + GLFW_CFLAGS="-I/usr/X11R7/include $GLFW_CFLAGS" + echo "/usr/X11R7/lib" 1>&6 elif [ -r "/usr/X11R6/lib" ]; then - LFLAGS="$LFLAGS -L/usr/X11R6/lib" - INCS="-I/usr/X11R6/include" - echo " X11 libraries location: /usr/X11R6/lib" 1>&6 -# X11R5 in /usr/X11R5/lib ? + GLFW_LFLAGS="$GLFW_LFLAGS -L/usr/X11R6/lib" + GLFW_CFLAGS="-I/usr/X11R6/include $GLFW_CFLAGS" + echo "/usr/X11R6/lib" 1>&6 elif [ -r "/usr/X11R5/lib" ]; then - LFLAGS="$LFLAGS -L/usr/X11R5/lib" - INCS="-I/usr/X11R5/include" - echo " X11 libraries location: /usr/X11R5/lib" 1>&6 -# X11R6 in /opt/X11R6/lib (e.g. QNX)? + GLFW_LFLAGS="$GLFW_LFLAGS -L/usr/X11R5/lib" + GLFW_CFLAGS="-I/usr/X11R5/include $GLFW_CFLAGS" + echo "/usr/X11R5/lib" 1>&6 elif [ -r "/opt/X11R6/lib" ]; then - LFLAGS="$LFLAGS -L/opt/X11R6/lib" - INCS="-I/opt/X11R6/include" - echo " X11 libraries location: /opt/X11R6/lib" 1>&6 -# X11R6 in /usr/X/lib ? + # This location is used on QNX + GLFW_LFLAGS="$GLFW_LFLAGS -L/opt/X11R6/lib" + GLFW_CFLAGS="-I/opt/X11R6/include $GLFW_CFLAGS" + echo "/opt/X11R6/lib" 1>&6 elif [ -r "/usr/X/lib" ]; then - LFLAGS="$LFLAGS -L/usr/X/lib" - INCS="-I/usr/X/include" - echo " X11 libraries location: /usr/X/lib" 1>&6 + GLFW_LFLAGS="$GLFW_LFLAGS -L/usr/X/lib" + GLFW_CFLAGS="-I/usr/X/include $GLFW_CFLAGS" + echo "/usr/X/lib" 1>&6 else # TODO: Detect and report X11R7 in /usr/lib - echo " X11 libraries location: Unknown (assuming linker will find them)" 1>&6 + echo "unknown (assuming linker will find them)" 1>&6 fi -echo " " 1>&6 -CFLAGS="$CFLAGS $INCS" ########################################################################## -# Check if we are using GNU C +# Compilation commands ########################################################################## -echo "Checking whether we are using GNU C... " 1>&6 -echo "$config_script: checking whether we are using GNU C" >&5 +compile='$CC -c $GLFW_CFLAGS conftest.c 1>&5' +link='$CC -o conftest $GLFW_CFLAGS conftest.c $GLFW_LFLAGS 1>&5' + + +########################################################################## +# Check if we are using GNU C (or something claiming it is) +########################################################################## +echo -n "Checking whether we are using GNU C... " 1>&6 +echo "$self: checking whether we are using GNU C" >&5 cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='$CC -E conftest.c'; { (eval echo $self: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then use_gcc=yes else use_gcc=no fi rm -f conftest* -echo " Using GNU C: ""$use_gcc" 1>&6 -if [ "x$use_gcc" = xyes ]; then - CC=gcc -fi -echo " " 1>&6 +echo "$use_gcc" 1>&6 ########################################################################## # Check for X11 RandR availability ########################################################################## -echo "Checking for X11 RandR support... " 1>&6 -echo "$config_script: Checking for X11 RandR support" >&5 +echo -n "Checking for X11 RandR support... " 1>&6 +echo "$self: Checking for X11 RandR support" >&5 has_xrandr=no cat > conftest.c <&5; (eval $compile) 2>&5; }; then +if { (eval echo $self: \"$compile\") 1>&5; (eval $compile) 2>&5; }; then rm -rf conftest* has_xrandr=yes else - echo "$config_script: failed program was:" >&5 + echo "$self: failed program was:" >&5 cat conftest.c >&5 fi rm -f conftest* -echo " X11 RandR extension: ""$has_xrandr" 1>&6 +echo "$has_xrandr" 1>&6 + if [ "x$has_xrandr" = xyes ]; then - CFLAGS="$CFLAGS -D_GLFW_HAS_XRANDR" - LIBS="$LIBS -lXrandr" + GLFW_LIB_CFLAGS="$GLFW_LIB_CFLAGS -D_GLFW_HAS_XRANDR" + GLFW_LIB_LFLAGS="$GLFW_LIB_LFLAGS -lXrandr" fi -echo " " 1>&6 ########################################################################## # Check for X11 VidMode availability ########################################################################## -if [ "x$has_xrandr" != xyes ]; then +if [ "x$has_xrandr" = xno ]; then - echo "Checking for X11 VidMode support... " 1>&6 - echo "$config_script: Checking for X11 VidMode support" >&5 + echo -n "Checking for X11 VidMode support... " 1>&6 + echo "$self: Checking for X11 VidMode support" >&5 has_xf86vm=no cat > conftest.c <&5; (eval $compile) 2>&5; }; then + if { (eval echo $self: \"$compile\") 1>&5; (eval $compile) 2>&5; }; then rm -rf conftest* has_xf86vm=yes else - echo "$config_script: failed program was:" >&5 + echo "$self: failed program was:" >&5 cat conftest.c >&5 fi rm -f conftest* - echo " X11 VidMode extension: ""$has_xf86vm" 1>&6 + echo "$has_xf86vm" 1>&6 + if [ "x$has_xf86vm" = xyes ]; then - CFLAGS="$CFLAGS -D_GLFW_HAS_XF86VIDMODE" - LIBS="$LIBS -lXxf86vm -lXext" + GLFW_LIB_CFLAGS="$GLFW_LIB_CFLAGS -D_GLFW_HAS_XF86VIDMODE" + GLFW_LIB_LFLAGS="$GLFW_LIB_LFLAGS -lXxf86vm -lXext" fi - echo " " 1>&6 fi @@ -244,8 +240,8 @@ ########################################################################## # Check for pthread support ########################################################################## -echo "Checking for pthread support... " 1>&6 -echo "$config_script: Checking for pthread support" >&5 +echo -n "Checking for pthread support... " 1>&6 +echo "$self: Checking for pthread support" >&5 has_pthread=no cat > conftest.c <&5; (eval $link) 2>&5; }; then - rm -rf conftest* - has_pthread=yes -else - echo "$config_script: failed program was:" >&5 - cat conftest.c >&5 +if [ "x$has_pthread" = xno ]; then + CFLAGS_THREAD="-pthread" + LFLAGS_THREAD="-pthread" + GLFW_CFLAGS="$CFLAGS_OLD $CFLAGS_THREAD" + GLFW_LFLAGS="$LFLAGS_OLD $LFLAGS_THREAD" + if { (eval echo $self: \"$link\") 1>&5; (eval $link) 2>&5; }; then + rm -rf conftest* + has_pthread=yes + else + echo "$self: failed program was:" >&5 + cat conftest.c >&5 + fi fi # Try -lpthread if [ "x$has_pthread" = xno ]; then CFLAGS_THREAD="-D_REENTRANT" - CFLAGS="$CFLAGS_OLD $CFLAGS_THREAD" - LIBS="$LIBS_OLD -lpthread" - if { (eval echo $config_script: \"$link\") 1>&5; (eval $link) 2>&5; }; then + LFLAGS_THREAD="-lpthread" + GLFW_CFLAGS="$CFLAGS_OLD $CFLAGS_THREAD" + GLFW_LFLAGS="$LFLAGS_OLD $LFLAGS_THREAD" + if { (eval echo $self: \"$link\") 1>&5; (eval $link) 2>&5; }; then rm -rf conftest* has_pthread=yes else - echo "$config_script: failed program was:" >&5 + echo "$self: failed program was:" >&5 cat conftest.c >&5 fi fi # Try -lsocket (e.g. QNX) if [ "x$has_pthread" = xno ]; then - CFLAGS="$CFLAGS_OLD" - LIBS="$LIBS_OLD -lsocket" - if { (eval echo $config_script: \"$link\") 1>&5; (eval $link) 2>&5; }; then + CFLAGS_THREAD= + LFLAGS_THREAD="-lsocket" + GLFW_CFLAGS="$CFLAGS_OLD $CFLAGS_THREAD" + GLFW_LFLAGS="$LFLAGS_OLD $LFLAGS_THREAD" + if { (eval echo $self: \"$link\") 1>&5; (eval $link) 2>&5; }; then rm -rf conftest* has_pthread=yes else - echo "$config_script: failed program was:" >&5 + echo "$self: failed program was:" >&5 cat conftest.c >&5 fi fi -echo " pthread support: ""$has_pthread" 1>&6 +# Restore original values +GLFW_CFLAGS="$CFLAGS_OLD" +GLFW_LFLAGS="$LFLAGS_OLD" + +echo "$has_pthread" 1>&6 + if [ "x$has_pthread" = xyes ]; then - CFLAGS="$CFLAGS -D_GLFW_HAS_PTHREAD" -else - LIBS="$LIBS_OLD" + GLFW_CFLAGS="$GLFW_CFLAGS $CFLAGS_THREAD" + GLFW_LFLAGS="$GLFW_LFLAGS $LFLAGS_THREAD" + GLFW_LIB_CFLAGS="$GLFW_LIB_CFLAGS -D_GLFW_HAS_PTHREAD" fi -echo " " 1>&6 ########################################################################## @@ -308,42 +320,45 @@ ########################################################################## if [ "x$has_pthread" = xyes ]; then - echo "Checking for sched_yield support... " 1>&6 - echo "$config_script: Checking for sched_yield support" >&5 + echo -n "Checking for sched_yield... " 1>&6 + echo "$self: Checking for sched_yield" >&5 has_sched_yield=no - LIBS_OLD="$LIBS" + LFLAGS_OLD="$GLFW_LFLAGS" + LFLAGS_THREAD= cat > conftest.c < int main() {sched_yield(); return 0;} EOF - if { (eval echo $config_script: \"$compile\") 1>&5; (eval $compile) 2>&5; }; then + if { (eval echo $self: \"$compile\") 1>&5; (eval $compile) 2>&5; }; then has_sched_yield=yes else - echo "$config_script: failed program was:" >&5 + echo "$self: failed program was:" >&5 cat conftest.c >&5 fi if [ "x$has_sched_yield" = xno ]; then - LIBS="$LIBS_OLD -lrt" - if { (eval echo $config_script: \"$link\") 1>&5; (eval $link) 2>&5; }; then + LFLAGS_THREAD="-lrt" + GLFW_LFLAGS="$LFLAGS_OLD $LFLAGS_THREAD" + if { (eval echo $self: \"$link\") 1>&5; (eval $link) 2>&5; }; then + rm -f conftest* has_sched_yield=yes else - echo "$config_script: failed program was:" >&5 + echo "$self: failed program was:" >&5 cat conftest.c >&5 - LIBS="$LIBS_OLD" fi fi - rm -f conftest* + GLFW_LFLAGS="$LFLAGS_OLD" + + echo "$has_sched_yield" 1>&6 - echo " sched_yield: ""$has_sched_yield" 1>&6 if [ "x$has_sched_yield" = xyes ]; then - CFLAGS="$CFLAGS -D_GLFW_HAS_SCHED_YIELD" + GLFW_LIB_CFLAGS="$GLFW_LIB_CFLAGS -D_GLFW_HAS_SCHED_YIELD" + GLFW_LIB_LFLAGS="$GLFW_LIB_LFLAGS $LFLAGS_THREAD" fi - echo " " 1>&6 fi @@ -351,128 +366,145 @@ ########################################################################## # Check for glXGetProcAddressXXX availability ########################################################################## -echo "Checking for glXGetProcAddress support... " 1>&6 -echo "$config_script: Checking for glXGetProcAddress support" >&5 +echo -n "Checking for glXGetProcAddress variants... " 1>&6 +echo "$self: Checking for glXGetProcAddress variants" >&5 + has_glXGetProcAddress=no -has_glXGetProcAddressARB=no -has_glXGetProcAddressEXT=no -# glXGetProcAddress check -cat > conftest.c < conftest.c < #include #include int main() {void *ptr=(void*)glXGetProcAddress("glFun"); return 0;} EOF -if { (eval echo $config_script: \"$link\") 1>&5; (eval $link) 2>&5; }; then - rm -rf conftest* - has_glXGetProcAddress=yes -else - echo "$config_script: failed program was:" >&5 - cat conftest.c >&5 + if { (eval echo $self: \"$link\") 1>&5; (eval $link) 2>&5; }; then + rm -rf conftest* + has_glXGetProcAddress=yes + else + echo "$self: failed program was:" >&5 + cat conftest.c >&5 + fi + rm -f conftest* + + if [ "x$has_glXGetProcAddress" = xyes ]; then + echo "glXGetProcAddress" 1>&6 + GLFW_LIB_CFLAGS="$GLFW_LIB_CFLAGS -D_GLFW_HAS_GLXGETPROCADDRESS" + fi fi -rm -f conftest* -# glXGetProcAddressARB check -cat > conftest.c < conftest.c < #include #include int main() {void *ptr=(void*)glXGetProcAddressARB("glFun"); return 0;} EOF -if { (eval echo $config_script: \"$link\") 1>&5; (eval $link) 2>&5; }; then - rm -rf conftest* - has_glXGetProcAddressARB=yes -else - echo "$config_script: failed program was:" >&5 - cat conftest.c >&5 + if { (eval echo $self: \"$link\") 1>&5; (eval $link) 2>&5; }; then + rm -rf conftest* + has_glXGetProcAddress=yes + else + echo "$self: failed program was:" >&5 + cat conftest.c >&5 + fi + rm -f conftest* + + if [ "x$has_glXGetProcAddress" = xyes ]; then + echo "glXGetProcAddressARB" 1>&6 + GLFW_LIB_CFLAGS="$GLFW_LIB_CFLAGS -D_GLFW_HAS_GLXGETPROCADDRESSARB" + fi fi -rm -f conftest* -# glXGetProcAddressEXT check -cat > conftest.c < conftest.c < #include #include int main() {void *ptr=(void*)glXGetProcAddressEXT("glFun"); return 0;} EOF -if { (eval echo $config_script: \"$link\") 1>&5; (eval $link) 2>&5; }; then - rm -rf conftest* - has_glXGetProcAddressEXT=yes -else - echo "$config_script: failed program was:" >&5 - cat conftest.c >&5 -fi -rm -f conftest* + if { (eval echo $self: \"$link\") 1>&5; (eval $link) 2>&5; }; then + rm -rf conftest* + has_glXGetProcAddress=yes + else + echo "$self: failed program was:" >&5 + cat conftest.c >&5 + fi + rm -f conftest* -echo " glXGetProcAddress extension: ""$has_glXGetProcAddress" 1>&6 -echo " glXGetProcAddressARB extension: ""$has_glXGetProcAddressARB" 1>&6 -echo " glXGetProcAddressEXT extension: ""$has_glXGetProcAddressEXT" 1>&6 -if [ "x$has_glXGetProcAddress" = xyes ]; then - CFLAGS="$CFLAGS -D_GLFW_HAS_GLXGETPROCADDRESS" -fi -if [ "x$has_glXGetProcAddressARB" = xyes ]; then - CFLAGS="$CFLAGS -D_GLFW_HAS_GLXGETPROCADDRESSARB" + if [ "x$has_glXGetProcAddress" = xyes ]; then + echo "glXGetProcAddressEXT" 1>&6 + GLFW_LIB_CFLAGS="$GLFW_LIB_CFLAGS -D_GLFW_HAS_GLXGETPROCADDRESSEXT" + fi fi -if [ "x$has_glXGetProcAddressEXT" = xyes ]; then - CFLAGS="$CFLAGS -D_GLFW_HAS_GLXGETPROCADDRESSEXT" + +if [ "x$has_glXGetProcAddress" = xno ]; then + echo "no" 1>&6 fi -echo " " 1>&6 ########################################################################## -# Check for dlopen support +# Check for dlopen support if necessary ########################################################################## -echo "Checking for dlopen support... " 1>&6 -echo "$config_script: Checking for dlopen support" >&5 -has_dlopen=no +if [ "x$has_glXGetProcAddress" = xno ]; then -cat > conftest.c <&6 + echo "$self: Checking for dlopen" >&5 + has_dlopen=no + + cat > conftest.c < int main() {void *l=dlopen("libGL.so",RTLD_LAZY|RTLD_GLOBAL); return 0;} EOF -# First try without -ldl -if { (eval echo $config_script: \"$link\") 1>&5; (eval $link) 2>&5; }; then - rm -rf conftest* - has_dlopen=yes -else - echo "$config_script: failed program was:" >&5 - cat conftest.c >&5 -fi - -# Now try with -ldl if the previous attempt failed -if [ "x$has_dlopen" = xno ]; then - LIBS_OLD="$LIBS" - LIBS="$LIBS -ldl" - if { (eval echo $config_script: \"$link\") 1>&5; (eval $link) 2>&5; }; then + # First try without -ldl + if { (eval echo $self: \"$link\") 1>&5; (eval $link) 2>&5; }; then rm -rf conftest* has_dlopen=yes else - echo "$config_script: failed program was:" >&5 + echo "$self: failed program was:" >&5 cat conftest.c >&5 fi + + # Now try with -ldl if the previous attempt failed if [ "x$has_dlopen" = xno ]; then - LIBS="$LIBS_OLD" + LFLAGS_OLD="$GLFW_LFLAGS" + GLFW_LFLAGS="$GLFW_LFLAGS -ldl" + if { (eval echo $self: \"$link\") 1>&5; (eval $link) 2>&5; }; then + rm -rf conftest* + has_dlopen=yes + else + echo "$self: failed program was:" >&5 + cat conftest.c >&5 + fi + GLFW_LFLAGS="$LFLAGS_OLD" + if [ "x$has_dlopen" = xyes ]; then + GLFW_LIB_LFLAGS="$GLFW_LIB_LFLAGS -ldl" + fi + fi + rm -f conftest* + + echo "$has_dlopen" 1>&6 + + if [ "x$has_dlopen" = xyes ]; then + GLFW_LIB_CFLAGS="$GLFW_LIB_CFLAGS -D_GLFW_HAS_DLOPEN" fi -fi -rm -f conftest* -echo " dlopen support: ""$has_dlopen" 1>&6 -if [ "x$has_dlopen" = xyes ]; then - CFLAGS="$CFLAGS -D_GLFW_HAS_DLOPEN" fi -echo " " 1>&6 ########################################################################## # Check for sysconf support ########################################################################## -echo "Checking for sysconf support... " 1>&6 -echo "$config_script: Checking for sysconf support" >&5 +echo -n "Checking for sysconf... " 1>&6 +echo "$self: Checking for sysconf" >&5 has_sysconf=no cat > conftest.c <&5; (eval $link) 2>&5; }; then +if { (eval echo $self: \"$link\") 1>&5; (eval $link) 2>&5; }; then rm -rf conftest* has_sysconf=yes else - echo "$config_script: failed program was:" >&5 + echo "$self: failed program was:" >&5 cat conftest.c >&5 fi rm -f conftest* -echo " sysconf support: ""$has_sysconf" 1>&6 +echo "$has_sysconf" 1>&6 + if [ "x$has_sysconf" = xyes ]; then - CFLAGS="$CFLAGS -D_GLFW_HAS_SYSCONF" + GLFW_LIB_CFLAGS="$GLFW_LIB_CFLAGS -D_GLFW_HAS_SYSCONF" fi -echo " " 1>&6 ########################################################################## # Check for sysctl support ########################################################################## -echo "Checking for sysctl support... " 1>&6 -echo "$config_script: Checking for sysctl support" >&5 +echo -n "Checking for sysctl support... " 1>&6 +echo "$self: Checking for sysctl support" >&5 has_sysctl=no cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='$CC -E conftest.c'; { (eval echo $self: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then has_sysctl=yes fi rm -f conftest* -echo " sysctl support: ""$has_sysctl" 1>&6 +echo "$has_sysctl" 1>&6 + if [ "x$has_sysctl" = xyes ]; then - CFLAGS="$CFLAGS -D_GLFW_HAS_SYSCTL" + GLFW_LIB_CFLAGS="$GLFW_LIB_CFLAGS -D_GLFW_HAS_SYSCTL" fi -echo " " 1>&6 ########################################################################## -# Post fixups +# Last chance to change the flags before file generation ########################################################################## -if [ "x$use_gcc" = xyes ]; then - CFLAGS_SPEED="-c -I. -I.. $CFLAGS -O3 -ffast-math -Wall" - CFLAGS="-c -I. -I.. $CFLAGS -Os -Wall" - CFLAGS_LINK="$INCS -O3 -ffast-math -Wall" -else - CFLAGS_SPEED="-c -I. -I.. $CFLAGS -O" - CFLAGS="-c -I. -I.. $CFLAGS -O" - CFLAGS_LINK="$INCS -O" + +GLFW_LIB_CFLAGS="-c -I. -I.. $GLFW_LIB_CFLAGS" +GLFW_BIN_CFLAGS="-I../include $GLFW_BIN_CFLAGS" + +if [ "x$CFLAGS" = x ]; then + if [ "x$use_gcc" = xyes ]; then + GLFW_CFLAGS="$GLFW_CFLAGS -O2 -Wall" + else + GLFW_CFLAGS="$GLFW_CFLAGS -O" + fi fi -CFLAGS_LINK="-I../include $CFLAGS_LINK" -LFLAGS_LINK="../lib/x11/libglfw.a $LFLAGS -lGLU $LIBS -lm" + +GLFW_LFLAGS="$GLFW_LFLAGS -lm" + +GLFW_LIB_LFLAGS="$GLFW_LIB_LFLAGS -lX11" +GLFW_BIN_LFLAGS="-lGLU $GLFW_BIN_LFLAGS" ########################################################################## -# Create Makefiles +# Create makefiles and pkg-config template file ########################################################################## -# ./lib/x11/Makefile.x11 +# --------------------------------------------------------------------- +# Create Makefile for GLFW library +# --------------------------------------------------------------------- + MKNAME='./lib/x11/Makefile.x11' -echo "Creating ""$MKNAME""..." 1>&6 -echo " " 1>&6 -echo "$config_script: Creating ""$MKNAME""..." >&5 -echo "##########################################################################" >$MKNAME -echo "# Automatically generated Makefile for GLFW" >>$MKNAME -echo "##########################################################################" >>$MKNAME -echo "CC = $CC" >>$MKNAME -echo "CFLAGS = $CFLAGS" >>$MKNAME -echo "CFLAGS_SPEED = $CFLAGS_SPEED" >>$MKNAME -echo "LDFLAGS = $LDFLAGS" >>$MKNAME -echo "LFLAGS = $LFLAGS" >>$MKNAME -echo "LIBS = $LIBS" >>$MKNAME -echo " " >>$MKNAME + +echo "Creating $MKNAME" 1>&6 + +echo "$self: Creating $MKNAME" >&5 + +cat > "$MKNAME" <>$MKNAME -# ./examples/Makefile.x11 +# --------------------------------------------------------------------- +# Create Makefile for examples +# --------------------------------------------------------------------- + MKNAME='./examples/Makefile.x11' -echo "Creating ""$MKNAME""..." 1>&6 -echo " " 1>&6 -echo "$config_script: Creating ""$MKNAME""..." >&5 -echo "##########################################################################" >$MKNAME -echo "# Automatically generated Makefile for GLFW" >>$MKNAME -echo "##########################################################################" >>$MKNAME -echo "CC = $CC" >>$MKNAME -echo "CFLAGS = $CFLAGS_LINK" >>$MKNAME -echo "LFLAGS = $LFLAGS_LINK" >>$MKNAME -echo " " >>$MKNAME + +echo "Creating $MKNAME" 1>&6 + +echo "$self: Creating $MKNAME" >&5 + +cat > "$MKNAME" <>$MKNAME +# --------------------------------------------------------------------- +# Create Makefile for test programs +# --------------------------------------------------------------------- + +MKNAME='./tests/Makefile.x11' + +echo "Creating $MKNAME" 1>&6 + +echo "$self: Creating $MKNAME" >&5 +cat > "$MKNAME" <>$MKNAME + +# --------------------------------------------------------------------- +# Create pkg-config template file (which is used to create libglfw.pc) +# --------------------------------------------------------------------- -# ./lib/x11/libglfw.pc.in MKNAME="./lib/x11/libglfw.pc.in" -echo "Creating ""$MKNAME""..." 1>&6 -echo " " 1>&6 -echo "$config_script: Creating ""$MKNAME""..." >&5 + +echo "Creating $MKNAME" 1>&6 + +echo "$self: Creating $MKNAME" >&5 + cat > "$MKNAME" < + +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. + diff -Nru glfw-2.6/debian/changelog glfw-2.7.2/debian/changelog --- glfw-2.6/debian/changelog 2011-10-28 09:13:19.000000000 +0000 +++ glfw-2.7.2/debian/changelog 2011-10-11 12:18:14.000000000 +0000 @@ -1,3 +1,23 @@ +glfw (2.7.2-1) unstable; urgency=low + + * New upstream release (Closes: #640791). + * debian/control: + - Bump Standars-Version to 3.9.2 + - Add myself as Uplpaders. + - Delete quilt as B-D, not needed anymore. + - Raise B-D of debhelper to 7.0.50~ to use simple d/rules. + - Change homepage to http://www.glfw.org/. + - Change Vcs-* field into git repository. + - Add libglfw-dev dependency to mesa-common-dev and libglu1-mesa-dev + (Closes: #594956). + * debian/rules: Rewitting to use simple rules. + * Refreshing patches: + - debian/patches/fix_compilation_on_non_linux.patch. + - debian/patches/fix-soname.patch. + * debian/copyright: Rewritting as per dep5 format. + + -- Mahyuddin Susanto Tue, 11 Oct 2011 19:18:11 +0700 + glfw (2.6-5) unstable; urgency=low * Team upload. diff -Nru glfw-2.6/debian/control glfw-2.7.2/debian/control --- glfw-2.6/debian/control 2011-10-28 09:13:19.000000000 +0000 +++ glfw-2.7.2/debian/control 2011-10-11 11:59:30.000000000 +0000 @@ -2,20 +2,21 @@ Section: devel Priority: optional Maintainer: Debian Games Team -Uploaders: -Build-Depends: debhelper (>> 7.0.0), quilt, - libglu1-mesa-dev | libglu-dev, libgl1-mesa-dev | libgl-dev, - libxrandr-dev -Standards-Version: 3.8.0 -Vcs-Svn: svn://svn.debian.org/svn/pkg-games/packages/trunk/glfw/ -Vcs-Browser: http://svn.debian.org/wsvn/pkg-games/packages/trunk/glfw/?op=log -Homepage: http://glfw.sourceforge.net +Uploaders: Mahyuddin Susanto +Build-Depends: debhelper (>= 7.0.50~), + libgl1-mesa-dev | libgl-dev, + libglu1-mesa-dev | libglu-dev, + libxrandr-dev +Standards-Version: 3.9.2 +Vcs-Git: git://anonscm.debian.org/pkg-games/glfw.git +Vcs-Browser: http://anonscm.debian.org/git/pkg-games/glfw.git +Homepage: http://www.glfw.org/ Package: libglfw2 Section: libs Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: portable framework for OpenGL application development +Depends: ${misc:Depends}, ${shlibs:Depends} +Description: Shared libraries portable framework for OpenGL application development GLFW is a free, Open Source, framework for OpenGL application development. In short, it is a single library providing a powerful, portable API for otherwise operating system specific tasks such as opening an OpenGL @@ -29,8 +30,12 @@ Package: libglfw-dev Section: libdevel Architecture: any -Depends: libglfw2 (= ${binary:Version}), ${shlibs:Depends}, ${misc:Depends} -Description: portable framework for OpenGL application development +Depends: libglfw2 (= ${binary:Version}), + libglu1-mesa-dev | libglu-dev, + mesa-common-dev, + ${misc:Depends}, + ${shlibs:Depends} +Description: header files and static libraries portable framework for OpenGL application development GLFW is a free, Open Source, framework for OpenGL application development. In short, it is a single library providing a powerful, portable API for otherwise operating system specific tasks such as opening an OpenGL diff -Nru glfw-2.6/debian/copyright glfw-2.7.2/debian/copyright --- glfw-2.6/debian/copyright 2011-10-28 09:13:19.000000000 +0000 +++ glfw-2.7.2/debian/copyright 2011-10-11 12:01:50.000000000 +0000 @@ -1,32 +1,48 @@ -This package was debianized by Gonéri Le Bouder on -Wed, 16 Apr 2008 13:24:33 +0200 - -The actual maintainer is the Debian Games Team: -http://wiki.debian.org/Games/Development - -It was downloaded from http://glfw.sourceforge.net/ - -Upstream Author: Camilla Berglund - -Copyright: -Copyright © 2002-2006 Camilla Berglund - -The license used for GLFW is known as the zlib/libpng. - -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 +Format: http://dep.debian.net/deps/dep5/ +Upstream-Name: glfw +Upstream-Contact: Camilla Berglund , 2002-2006 Marcus Geelnard +Source: http://glfw.sourceforge.net/ + +Files: * +Copyright: 2006-2010 Camilla Berglund + 2002-2006 Marcus Geelnard +License: zlib/lipng + The license used for GLFW is known as the zlib/libpng. + . + 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 + . + 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. -3. This notice may not be removed or altered from any source distribution. +Files: debian/* +Copyright: 2011, Mahyuddin Susanto + 2008, Gonéri Le Bouder +License: GPL-2+ + This package is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + . + This package 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 General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see + . + On Debian systems, the complete text of the GNU General + Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". diff -Nru glfw-2.6/debian/patches/fix_compilation_on_non_linux.diff glfw-2.7.2/debian/patches/fix_compilation_on_non_linux.diff --- glfw-2.6/debian/patches/fix_compilation_on_non_linux.diff 2011-10-28 09:13:19.000000000 +0000 +++ glfw-2.7.2/debian/patches/fix_compilation_on_non_linux.diff 2011-10-11 12:10:09.000000000 +0000 @@ -1,14 +1,21 @@ ---- a/compile.sh -+++ b/compile.sh -@@ -93,6 +93,11 @@ - LDFLAGS="-flat_namespace -undefined suppress" - echo " Mac OS X" 1>&6 +Description: Fix FTBFS in GNU kFreeBSD +Author: Pino Toscano , Gonéri Le Bouder goneri@rulezlan.org +Bug-Debian: http://bugs.debian.org/558904 +Last-Update: 2011-10-11 + +Index: glfw/compile.sh +=================================================================== +--- glfw.orig/compile.sh 2011-10-11 18:47:14.348492865 +0700 ++++ glfw/compile.sh 2011-10-11 18:48:33.088883321 +0700 +@@ -95,6 +95,11 @@ + SOFLAGS="-flat_namespace -undefined suppress" + echo "Mac OS X" 1>&6 ;; +xGNU|xGNU/kFreeBSD) + CFLAGS="$CFLAGS" -+ LDFLAGS="-shared -Wl,-soname,libglfw.so.2" ++ SOFLAGS="-shared -Wl,-soname,libglfw.so.2" + echo " GNU" 1>&6 + ;; *) - LDFLAGS="-shared -soname libglfw.so" - echo " Generic Unix" 1>&6 + SOFLAGS="-shared -soname libglfw.so" + echo "Generic Unix" 1>&6 diff -Nru glfw-2.6/debian/patches/fix-soname.diff glfw-2.7.2/debian/patches/fix-soname.diff --- glfw-2.6/debian/patches/fix-soname.diff 2011-10-28 09:13:19.000000000 +0000 +++ glfw-2.7.2/debian/patches/fix-soname.diff 2011-10-11 12:09:45.000000000 +0000 @@ -1,13 +1,17 @@ -Index: glfw-2.6/compile.sh +Description: Fix symlink +Author: Gonéri Le Bouder goneri@rulezlan.org +Bug-Debian: http://bugs.debian.org/516988 + +Index: glfw-2.7.2/compile.sh =================================================================== ---- glfw-2.6.orig/compile.sh 2008-04-16 14:08:06.000000000 +0200 -+++ glfw-2.6/compile.sh 2008-04-16 14:08:21.000000000 +0200 -@@ -85,7 +85,7 @@ +--- glfw-2.7.2.orig/compile.sh 2011-09-09 04:35:06.592500628 +0700 ++++ glfw-2.7.2/compile.sh 2011-09-09 04:35:04.972498252 +0700 +@@ -88,7 +88,7 @@ case "x`uname 2> /dev/null`" in xLinux) - CFLAGS="$CFLAGS -Dlinux" -- LDFLAGS="-shared" -+ LDFLAGS="-shared -Wl,-soname,libglfw.so.2" - echo " Linux" 1>&6 + GLFW_LIB_CFLAGS="$GLFW_LIB_CFLAGS -D_GLFW_USE_LINUX_JOYSTICKS" +- SOFLAGS="-shared -Wl,-soname,libglfw.so" ++ SOFLAGS="-shared -Wl,-soname,libglfw.so.2" + echo "Linux" 1>&6 ;; xDarwin) diff -Nru glfw-2.6/debian/rules glfw-2.7.2/debian/rules --- glfw-2.6/debian/rules 2011-10-28 09:13:19.000000000 +0000 +++ glfw-2.7.2/debian/rules 2011-10-11 11:54:23.000000000 +0000 @@ -1,63 +1,25 @@ #!/usr/bin/make -f +# -*- makefile -*- +%: + dh ${@} -configure: configure-stamp -configure-stamp: - dh_testdir - QUILT_PATCHES=debian/patches quilt push -a || test $$? = 2 +override_dh_auto_install: PREFIX=/usr sh compile.sh + dh_auto_install - touch configure-stamp - - -build: build-stamp -build-stamp: configure-stamp - dh_testdir - +override_dh_installdirs: $(MAKE) x11 - - touch build-stamp - -clean: - dh_testdir - dh_testroot - - # Add here commands to clean up after the build process. - [ ! -f Makefile ] || $(MAKE) x11-clean - QUILT_PATCHES=debian/patches quilt pop -R -a || test $$? = 2 - rm -rf .pc - dh_clean build-stamp configure-stamp - -install: build - dh_testdir - dh_testroot - dh_prep - dh_installdirs sed -e 's,\@PREFIX\@,/usr,' ./lib/x11/libglfw.pc.in > ./lib/x11/libglfw.pc make x11-install PREFIX=$(CURDIR)/debian/tmp/usr cp lib/x11/libglfw.so debian/tmp/usr/lib/libglfw.so.2.6 +override_dh_installdocs: + dh_installdocs readme.html -# Build architecture-independent files here. -binary-indep: -# nothing to do - -# Build architecture-dependent files here. -binary-arch: build install - dh_testdir - dh_testroot - dh_installdocs readme.html - dh_installchangelogs - dh_install - dh_link - dh_strip - dh_compress - dh_fixperms - dh_makeshlibs - dh_shlibdeps - dh_installdeb - dh_gencontrol - dh_md5sums - dh_builddeb - -binary: binary-indep binary-arch -.PHONY: build clean binary-indep binary-arch binary install configure +verride_dh_clean: + [ ! -f Makefile ] || $(MAKE) x11-clean + find -name '*.o' -or -name '*.a' -or -name '*.so' | xargs rm + find -type f -executable -not -wholename "*debian*" -delete + rm config.log examples/Makefile.x11 lib/x11/Makefile.x11 + lib/x11/libglfw.pc lib/x11/libglfw.pc.in tests/Makefile.x11 + dh_clean diff -Nru glfw-2.6/debian/source/format glfw-2.7.2/debian/source/format --- glfw-2.6/debian/source/format 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/debian/source/format 2011-10-28 09:13:19.000000000 +0000 @@ -0,0 +1 @@ +3.0 (quilt) diff -Nru glfw-2.6/docs/glfwdoc.sty glfw-2.7.2/docs/glfwdoc.sty --- glfw-2.6/docs/glfwdoc.sty 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/docs/glfwdoc.sty 2010-08-07 16:52:22.000000000 +0000 @@ -16,8 +16,8 @@ \usepackage{times} % Logo macros -\newcommand{\OpenGL}[1][0]{\textbf{OpenGL}\texttrademark} -\newcommand{\GLFW}[1][0]{\textbf{GLFW}} +\newcommand{\OpenGL}[1][0]{OpenGL\textsuperscript{\textregistered}} +\newcommand{\GLFW}[1][0]{GLFW} % Encoding \usepackage[latin1]{inputenc} @@ -50,7 +50,8 @@ \vspace{0.5cm}{\LARGE\textbf{\glfwdoctype}}\\% \vspace{0.8cm}{\large\textbf{API version \glfwapiver}}\\% \textit{\today}\\% - \vspace{1.5cm}\textbf{\textcopyright2002-2007 Camilla Berglund}\\% + \vspace{1.5cm}\textbf{\textcopyright2002-2006 Marcus Geelnard}\\ + \textbf{\textcopyright2006-2010 Camilla Berglund}\\% \end{center}\end{titlepage}\newpage} % Colors diff -Nru glfw-2.6/docs/glfwrm.tex glfw-2.7.2/docs/glfwrm.tex --- glfw-2.6/docs/glfwrm.tex 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/docs/glfwrm.tex 2011-07-27 17:30:50.000000000 +0000 @@ -1,6 +1,6 @@ %------------------------------------------------------------------------- % GLFW Reference Manual -% API Version: 2.6 +% API Version: 2.7 %------------------------------------------------------------------------- % Document class @@ -8,14 +8,14 @@ % Document title and API version \newcommand{\glfwdoctype}[1][0]{Reference Manual} -\newcommand{\glfwapiver}[1][0]{2.6} +\newcommand{\glfwapiver}[1][0]{2.7} % Common document settings and macros \input{glfwdoc.sty} % PDF specific document settings \hypersetup{pdftitle={GLFW Reference Manual}} -\hypersetup{pdfauthor={Marcus Geelnard}} +\hypersetup{pdfauthor={Camilla Berglund}} \hypersetup{pdfkeywords={GLFW,OpenGL,reference,manual}} @@ -42,7 +42,7 @@ This document is primarily a function reference manual for the \GLFW\ API. For a description of how to use \GLFW\ you should refer to the \textit{GLFW Users Guide}. -\vspace{10cm} +\vspace{5cm} \large Trademarks @@ -96,30 +96,32 @@ to remedy this by providing the following functionality: \begin{itemize} -\item Opening and managing an \OpenGL\ window. +\item Opening and managing an \OpenGL\ context and its associated window. \item Keyboard, mouse and joystick input. \item A high precision timer. -\item Multi threading support. +\item Multi-threading support. \item Support for querying and using \OpenGL\ extensions. -\item Image file loading support. +\item Basic Targa image loading support. \end{itemize} -\vspace{18pt} All this functionality is implemented as a set of easy-to-use functions, which makes it possible to write an \OpenGL\ application framework in just a -few lines of code. The \GLFW\ API is completely operating system and -platform independent, which makes it very simple to port \GLFW\ based \OpenGL\ -applications to a variety of platforms. +few lines of code. The \GLFW\ API looks and behaves the same on all supported +platforms, making it very simple to port \GLFW\ based \OpenGL\ applications to +a variety of platforms. Currently supported platforms are: \begin{itemize} -\item Microsoft Windows\textsuperscript{\textregistered} 95/98/ME/NT/2000/XP/Vista. -\item Unix\textsuperscript{\textregistered} or Unix-like systems running the -X Window System\texttrademark, e.g. Linux\textsuperscript{\textregistered}, -IRIX\textsuperscript{\textregistered}, FreeBSD\textsuperscript{\textregistered}, -Solaris\texttrademark, QNX\textsuperscript{\textregistered} and -Mac OS\textsuperscript{\textregistered} X. -\item Mac OS\textsuperscript{\textregistered} X (Carbon)\footnote{Support for joysticks missing at the time of writing.} +\item Microsoft Windows\textsuperscript{\textregistered} (32-bit only). +\item Unix\textsuperscript{\textregistered} or Unix-like systems running +resonably a modern version of the X Window +System\texttrademark\footnote{X11.app on Mac OS X is not supported due to its +incomplete implementation of GLXFBConfigs} e.g. +Linux\textsuperscript{\textregistered}, +FreeBSD\textsuperscript{\textregistered} and Solaris\texttrademark (32- and +64-bit). +\item Mac OS\textsuperscript{\textregistered} X, using Cocoa\footnote{Joystick +input is not yet supported on Mac OS X.} (32- and 64-bit). \end{itemize} @@ -133,27 +135,26 @@ %------------------------------------------------------------------------- \section{The GLFW Window} -\GLFW\ only supports one opened window at a time. The window can be either +\GLFW\ only supports having one window open at a time. The window can be either a normal desktop window or a fullscreen window. The latter is completely -undecorated, without window borders, and covers the entire monitor. With -a fullscreen window, it is also possible to select which video mode to use. +undecorated, without window borders, and covers the entire monitor. With a +fullscreen window, it is also possible to select which video mode to use. When a window is opened, an \OpenGL\ rendering context is created and attached to the entire client area of the window. When the window is closed, the \OpenGL\ rendering context is detached and destroyed. Through a window it is possible to receive user input in the form of -keyboard and mouse input. User input is exposed through the \GLFW\ API via -callback functions. There are different callback functions for dealing with -different kinds of user input. Also, \GLFW\ stores most user input as -internal state that can be queried through different \GLFW\ API functions -(for instance it is possible to query the position of the mouse cursor -with the \textbf{glfwGetMousePos} function). +keyboard and mouse input. User input is exposed through the \GLFW\ API +primarily via a set of callback functions. Also, \GLFW\ stores most user input +as internal state that can be queried through different \GLFW\ API functions +(for instance it is possible to query the position of the mouse cursor with the +\textbf{glfwGetMousePos} function). As for user input, it is possible to receive information about window state changes, such as window resize or close events, through callback -functions. It is also possible to query different kinds of window -information through different \GLFW\ API functions. +functions. It is also possible to query some kinds of information about the +window information using \GLFW\ API functions. %------------------------------------------------------------------------- @@ -161,10 +162,10 @@ The \GLFW\ event loop is an open loop, which means that it is up to the programmer to design the loop. Events are processed by calling specific \GLFW\ functions, which in turn query the system for new input and window -events, and reports these events back to the program through callback +events and reports these events back to the program through callback functions. -The programmer decides when to call the event processing functions, and +The programmer decides when to call the event processing functions and when to abort the event loop. In pseudo language, a typical event loop might look like this: @@ -181,8 +182,8 @@ \begin{itemize} \item Block the event loop while waiting for new events. - \item Poll for new events, and continue the loop regardless if there are - any new events or not. + \item Poll for new events and continue the loop regardless of whether there + are any new events or not. \end{itemize} The first method is useful for interactive applications that do not @@ -217,21 +218,21 @@ functions. Also, the only \GLFW\ functions that may be safely called from callback functions are the different Get functions (e.g. \textbf{glfwGetKey}, \textbf{glfwGetTime}, \textbf{glfwGetWindowParam} -etc). +etc.). %------------------------------------------------------------------------- \section{Threads} \GLFW\ has functions for creating threads, which means that it is possible -to make multi threaded applications with \GLFW . The thread that calls -glfwInit becomes the main thread, and it is recommended that all +to make multi-threaded applications with \GLFW . The thread that calls +\textbf{glfwInit} becomes the main thread, and it is recommended that all \GLFW\ and \OpenGL\ functions are called from the main thread. Additional threads should primarily be used for CPU heavy tasks or for managing -other resources, such as file or sound I/O. +other resources such as file or sound I/O. It should be noted that the current implementation of \GLFW\ is not thread safe, so you should never call \GLFW\ functions from different threads. -\footnote{Of course, all thread managing functions are thread safe.} +\footnote{The thread management functions are of course thread safe.} %------------------------------------------------------------------------- @@ -242,9 +243,9 @@ %------------------------------------------------------------------------- \section{GLFW Initialization and Termination} -Before any \GLFW\ functions can be used, \GLFW\ must be initialized to -ensure proper functionality, and before a program terminates, \GLFW\ has to -be terminated in order to free up resources etc. +Before any other \GLFW\ functions can be used, \GLFW\ must be initialized to +ensure proper functionality, and before a program terminates \GLFW\ should be +terminated in order to free allocated resources, memory, etc. %------------------------------------------------------------------------- @@ -266,12 +267,20 @@ \begin{refdescription} The glfwInit function initializes \GLFW. No other \GLFW\ functions may be -used before this function has been called. +called before this function has succeeded. \end{refdescription} \begin{refnotes} This function may take several seconds to complete on some systems, while on other systems it may take only a fraction of a second to complete. + +This function registers a function calling \textbf{glfwTerminate} with the +atexit facility of the C library. + +On Mac OS X, this function will change the current directory of the application +to the \textbf{Contents/Resources} subdirectory of the application's bundle, if +present. For more information on bundles, see the Bundle Programming Guide +provided by Apple. \end{refnotes} @@ -292,9 +301,9 @@ \end{refreturn} \begin{refdescription} -The function terminates \GLFW. Among other things it closes the window, -if it is opened, and kills any running threads. This function must be -called before a program exits. +This function terminates \GLFW. Among other things it closes the window, if +open, and kills any running threads. This function should be called before a +program exits. \end{refdescription} @@ -323,16 +332,16 @@ \end{refreturn} \begin{refdescription} -The function returns the \GLFW\ library version. +This function returns the \GLFW\ library version. \end{refdescription} %------------------------------------------------------------------------- \pagebreak \section{Window Handling} -The main functionality of \GLFW\ is to provide a simple interface to -\OpenGL\ window management. \GLFW\ can open one window, which can be -either a normal desktop window or a fullscreen window. +The primary purpose of \GLFW\ is to provide a simple interface to +\OpenGL\ context creation and window management. \GLFW\ supports one window at +a time, which can be either a normal desktop window or a fullscreen window. %------------------------------------------------------------------------- @@ -350,21 +359,21 @@ \item [\textit{width}]\ \\ The width of the window. If \textit{width} is zero, it will be calculated as ${width=\frac{4}{3}height}$, if \textit{height} is not - zero. If both \textit{width} and \textit{height} are zero, then + zero. If both \textit{width} and \textit{height} are zero, \textit{width} will be set to 640. -\item [\textit{hieght}]\ \\ +\item [\textit{height}]\ \\ The height of the window. If \textit{height} is zero, it will be calculated as ${height=\frac{3}{4}width}$, if \textit{width} is not - zero. If both \textit{width} and \textit{height} are zero, then + zero. If both \textit{width} and \textit{height} are zero, \textit{height} will be set to 480. \item [\textit{redbits, greenbits, bluebits}]\ \\ The number of bits to use for each color component of the color buffer (0 means default color depth). For instance, setting \textit{redbits=5, - greenbits=6, and bluebits=5} will generate a 16-bit color buffer, if + greenbits=6 and bluebits=5} will create a 16-bit color buffer, if possible. \item [\textit{alphabits}]\ \\ - The number of bits to use for the alpha buffer (0 means no alpha - buffer). + The number of bits to use for the alpha channel of the color buffer (0 means + no alpha channel). \item [\textit{depthbits}]\ \\ The number of bits to use for the depth buffer (0 means no depth buffer). @@ -372,7 +381,7 @@ The number of bits to use for the stencil buffer (0 means no stencil buffer). \item [\textit{mode}]\ \\ - Selects which type of \OpenGL\ window to use. \textit{mode} can be + Selects which type of \OpenGL\ window to use. \textit{mode} must be either GLFW\_WINDOW, which will generate a normal desktop window, or GLFW\_FULLSCREEN, which will generate a window which covers the entire screen. When GLFW\_FULLSCREEN is selected, the video mode will be @@ -387,28 +396,40 @@ \end{refreturn} \begin{refdescription} -The function opens a window that best matches the parameters given to the +This function opens a window that best matches the parameters given to the function. How well the resulting window matches the desired window depends mostly on the available hardware and \OpenGL\ drivers. In general, selecting a fullscreen mode has better chances of generating a close match -than does a normal desktop window, since \GLFW\ can freely select from all -the available video modes. A desktop window is normally restricted to the -video mode of the desktop. +of buffers and channel sizes than does a normal desktop window, since \GLFW\ +can freely select from all the available video modes. A desktop window is +normally restricted to the video mode of the desktop. \end{refdescription} \begin{refnotes} For additional control of window properties, see \textbf{glfwOpenWindowHint}. -In fullscreen mode the mouse cursor is hidden by default, and any system -screensavers are prohibited from starting. In windowed mode the mouse -cursor is visible, and screensavers are allowed to start. To change the +In fullscreen mode the mouse cursor is hidden by default and the +screensaver is prohibited from starting. In windowed mode the mouse +cursor is visible and screensavers are allowed to start. To change the visibility of the mouse cursor, use \textbf{glfwEnable} or \textbf{glfwDisable} with the argument GLFW\_MOUSE\_CURSOR. In order to determine the actual properties of an opened window, use \textbf{glfwGetWindowParam} and \textbf{glfwGetWindowSize} (or \textbf{glfwSetWindowSizeCallback}). + +On Microsoft Windows, if the executable has an icon resource named +\textbf{GLFW\_ICON}, it will be set as the icon for the window. If no such +icon is present, the \textbf{IDI\_WINLOGO} icon will be used instead. + +On Mac OS X the \GLFW\ window has no icon, but programs using \GLFW\ will use +the application bundle's icon. For more information on bundles, see the Bundle +Programming Guide provided by Apple. + +For information on how the availability of different platform-specific +extensions affect the behavior of this function, see appendix +\ref{chap:compatibility}. \end{refnotes} @@ -418,14 +439,21 @@ \begin{tabular}{|l|l|p{7.0cm}|} \hline \raggedright \textbf{Name} & \textbf{Default} & \textbf{Description} \\ \hline GLFW\_REFRESH\_RATE & 0 & Vertical monitor refresh rate in Hz (only used for fullscreen windows). Zero means system default.\\ \hline -GLFW\_ACCUM\_RED\_BITS & 0 & Number of bits for the red channel of the accumulator buffer.\\ \hline -GLFW\_ACCUM\_GREEN\_BITS & 0 & Number of bits for the green channel of the accumulator buffer.\\ \hline -GLFW\_ACCUM\_BLUE\_BITS & 0 & Number of bits for the blue channel of the accumulator buffer.\\ \hline -GLFW\_ACCUM\_ALPHA\_BITS & 0 & Number of bits for the alpha channel of the accumulator buffer.\\ \hline +GLFW\_ACCUM\_RED\_BITS & 0 & Number of bits for the red channel of the accumulation buffer.\\ \hline +GLFW\_ACCUM\_GREEN\_BITS & 0 & Number of bits for the green channel of the accumulation buffer.\\ \hline +GLFW\_ACCUM\_BLUE\_BITS & 0 & Number of bits for the blue channel of the accumulation buffer.\\ \hline +GLFW\_ACCUM\_ALPHA\_BITS & 0 & Number of bits for the alpha channel of the accumulation buffer.\\ \hline GLFW\_AUX\_BUFFERS & 0 & Number of auxiliary buffers.\\ \hline GLFW\_STEREO & GL\_FALSE & Specify if stereo rendering should be supported (can be GL\_TRUE or GL\_FALSE).\\ \hline -GLFW\_WINDOW\_NO\_RESIZE & GL\_FALSE & Specify whether the window can be resized (not used for fullscreen windows).\\ \hline +GLFW\_WINDOW\_NO\_RESIZE & GL\_FALSE & Specify whether the window can be resized by the user (not used for fullscreen windows).\\ \hline GLFW\_FSAA\_SAMPLES & 0 & Number of samples to use for the multisampling buffer. Zero disables multisampling.\\ \hline +GLFW\_OPENGL\_VERSION\_MAJOR & 1 & Major number of the desired minimum \OpenGL\ version.\\ \hline +GLFW\_OPENGL\_VERSION\_MINOR & 1 & Minor number of the desired minimum \OpenGL\ version.\\ \hline +GLFW\_OPENGL\_FORWARD\_COMPAT & GL\_FALSE & Specify whether the \OpenGL\ context should be forward-compatible (i.e. disallow legacy functionality). + This should only be used when requesting \OpenGL\ version 3.0 or above.\\ \hline +GLFW\_OPENGL\_DEBUG\_CONTEXT & GL\_FALSE & Specify whether a debug context should be created.\\ \hline +GLFW\_OPENGL\_PROFILE & 0 & The \OpenGL\ profile the context should implement, or zero to let the system choose. + Available profiles are GLFW\_OPENGL\_CORE\_PROFILE and GLFW\_OPENGL\_COMPAT\_PROFILE.\\ \hline \end{tabular} \end{center} \caption{Targets for \textbf{glfwOpenWindowHint}} @@ -444,9 +472,9 @@ \begin{refparameters} \begin{description} \item [\textit{target}]\ \\ - Can be any of the constants in the table \ref{tab:winhints}. + Can be any of the tokens in the table \ref{tab:winhints}. \item [\textit{hint}]\ \\ - An integer giving the value of the corresponding target (see table + An integer giving the value of the corresponding token (see table \ref{tab:winhints}). \end{description} \end{refparameters} @@ -456,28 +484,58 @@ \end{refreturn} \begin{refdescription} -The function sets additional properties for a window that is to be opened. -For a hint to be registered, the function must be called before calling -\textbf{glfwOpenWindow}. When the \textbf{glfwOpenWindow} function is -called, any hints that were registered with the \textbf{glfwOpenWindowHint} -function are used for setting the corresponding window properties, and -then all hints are reset to their default values. +This function sets additional properties for a window that is to be opened. +For a hint to take effect, it must be set \emph{before} calling +\textbf{glfwOpenWindow}. When \textbf{glfwOpenWindow} is called, regardless of +whether it succeeds, all window hints are reset to their default values. \end{refdescription} \begin{refnotes} +All window hints are reset to their default values by each successful call to +\textbf{glfwInit} and by each call to \textbf{glfwOpenWindow}, whether +successful or not. + In order to determine the actual properties of an opened window, use \textbf{glfwGetWindowParam} (after the window has been opened). -GLFW\_STEREO is a hard constraint. If stereo rendering is requested, but -no stereo rendering capable pixel formats / visuals are available, +GLFW\_STEREO is a hard constraint. If stereo rendering is requested, but no +stereo rendering capable pixel formats / framebuffer configs are available, \textbf{glfwOpenWindow} will fail. -The GLFW\_REFRESH\_RATE property should be used with caution. Most +The GLFW\_REFRESH\_RATE hint should be used with caution. Most systems have default values for monitor refresh rates that are optimal for the specific system. Specifying the refresh rate can override these settings, which can result in suboptimal operation. The monitor may be unable to display the resulting video signal, or in the worst case it may even be damaged! + +The GLFW\_WINDOW\_NO\_RESIZE hint applies only to manual resizing by the user. +A window created with this hint enabled can still be resized by the application +by calling \textbf{glfwSetWindowSize}. + +The GLFW\_OPENGL\_VERSION\_MAJOR and GLFW\_OPENGL\_VERSION\_MINOR hints specify +the \OpenGL\ version that the created context must be compatible with, +\emph{not} the exact version to use. It is therefore perfectly safe to use the +default of version 1.1 for legacy code and you will still get +backwards-compatible contexts of version 3.0 and above when available. + +To make the behavior of the above version hints consistent across both modern +and legacy drivers, \textbf{glfwOpenWindow} will fail if the modern creation +mechanism (as specified in \textbf{WGL\_ARB\_create\_context} +and \textbf{GLX\_ARB\_create\_context}) is unavailable \emph{and} the created +context is of a version lower than the one that was requested. + +At the time of release, the exact meaning of what a "debug context" is (as +created using the GLFW\_OPENGL\_DEBUG\_CONTEXT hint) has yet to be defined by +the Khronos ARB WG. + +For information on how the availability of different extensions affect the +behavior of this function, see appendix \ref{chap:compatibility}. + +For full details on the workings of the \OpenGL\ version, forward-compatibility +and debug hints, see the specifications for \textbf{WGL\_ARB\_create\_context} +and \textbf{GLX\_ARB\_create\_context}, respectively. The relevant \GLFW\ +hints map very closely to their platform-specific counterparts. \end{refnotes} @@ -498,7 +556,7 @@ \end{refreturn} \begin{refdescription} -The function closes an opened window and destroys the associated \OpenGL\ +This function closes an opened window and destroys the associated \OpenGL\ context. \end{refdescription} @@ -517,7 +575,8 @@ Pointer to a callback function that will be called when a user requests that the window should be closed, typically by clicking the window close icon (e.g. the cross in the upper right corner of a window under - Microsoft Windows). The function should have the following C language + Microsoft Windows), and on Mac OS X also when selecting \textbf{Quit} from + the application menu. The function should have the following C language prototype: \texttt{int GLFWCALL functionname( void );} @@ -528,8 +587,8 @@ window will be closed. If the function returns GL\_FALSE, the window will not be closed. - If \textit{cbfun} is NULL, any previously selected callback function - will be deselected. + If \textit{cbfun} is NULL, any previously set callback function + will be unset. \end{description} \end{refparameters} @@ -538,16 +597,15 @@ \end{refreturn} \begin{refdescription} -The function selects which function to be called upon a window close -event. +This function sets the callback for window close events. A window has to be opened for this function to have any effect. \end{refdescription} \begin{refnotes} Window close events are recorded continuously, but only reported when -\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or -\textbf{glfwSwapBuffers} is called. +\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or \textbf{glfwSwapBuffers} +(with GLFW\_AUTO\_POLL\_EVENTS enabled) is called. The \OpenGL\ context is still valid when this function is called. @@ -582,7 +640,7 @@ \end{refreturn} \begin{refdescription} -The function changes the title of the opened window. +This function changes the title of the opened window. \end{refdescription} \begin{refnotes} @@ -614,7 +672,7 @@ \end{refreturn} \begin{refdescription} -The function changes the size of an opened window. The \textit{width} and +This function changes the size of an opened window. The \textit{width} and \textit{height} parameters denote the size of the client area of the window (i.e. excluding any window borders and decorations). @@ -624,8 +682,13 @@ \end{refdescription} \begin{refnotes} +This function has no effect if the window is iconified. + The \OpenGL\ context is guaranteed to be preserved after calling \textbf{glfwSetWindowSize}, even if the video mode is changed. + +This function is not affected by the value of the GLFW\_WINDOW\_NO\_RESIZE +hint. \end{refnotes} @@ -653,10 +716,16 @@ \end{refreturn} \begin{refdescription} -The function changes the position of an opened window. It does not have +This function changes the position of an opened window. It does not have any effect on a fullscreen window. \end{refdescription} +\begin{refnotes} +This function has no effect if the window is iconified. + +The behaviour of this function on multi-monitor systems is ill-defined. +\end{refnotes} + %------------------------------------------------------------------------- \subsection{glfwGetWindowSize} @@ -681,7 +750,7 @@ \end{refreturn} \begin{refdescription} -The function is used for determining the size of an opened window. +This function is used for determining the size of an opened window. The returned values are dimensions of the client area of the window (i.e. excluding any window borders and decorations). \end{refdescription} @@ -716,8 +785,8 @@ \textit{width} and \textit{height} are the dimensions of the window client area. - If \textit{cbfun} is NULL, any previously selected callback function - will be deselected. + If \textit{cbfun} is NULL, any previously set callback function + will be unset. \end{description} \end{refparameters} @@ -726,16 +795,18 @@ \end{refreturn} \begin{refdescription} -The function selects which function to be called upon a window size -change event. +This function sets the callback for window size change events. A window has to be opened for this function to have any effect. \end{refdescription} \begin{refnotes} Window size changes are recorded continuously, but only reported when -\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or -\textbf{glfwSwapBuffers} is called. +\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or \textbf{glfwSwapBuffers} +(with GLFW\_AUTO\_POLL\_EVENTS enabled) is called. + +When a callback function is set, it will be called with the current window +size before this function returns. \end{refnotes} @@ -799,14 +870,19 @@ GLFW\_DEPTH\_BITS & Number of bits for the depth buffer.\\ \hline GLFW\_STENCIL\_BITS & Number of bits for the stencil buffer.\\ \hline GLFW\_REFRESH\_RATE & Vertical monitor refresh rate in Hz. Zero indicates an unknown or a default refresh rate.\\ \hline -GLFW\_ACCUM\_RED\_BITS & Number of bits for the red channel of the accumulator buffer.\\ \hline -GLFW\_ACCUM\_GREEN\_BITS & Number of bits for the green channel of the accumulator buffer.\\ \hline -GLFW\_ACCUM\_BLUE\_BITS & Number of bits for the blue channel of the accumulator buffer.\\ \hline -GLFW\_ACCUM\_ALPHA\_BITS & Number of bits for the alpha channel of the accumulator buffer.\\ \hline +GLFW\_ACCUM\_RED\_BITS & Number of bits for the red channel of the accumulation buffer.\\ \hline +GLFW\_ACCUM\_GREEN\_BITS & Number of bits for the green channel of the accumulation buffer.\\ \hline +GLFW\_ACCUM\_BLUE\_BITS & Number of bits for the blue channel of the accumulation buffer.\\ \hline +GLFW\_ACCUM\_ALPHA\_BITS & Number of bits for the alpha channel of the accumulation buffer.\\ \hline GLFW\_AUX\_BUFFERS & Number of auxiliary buffers.\\ \hline GLFW\_STEREO & GL\_TRUE if stereo rendering is supported, else GL\_FALSE.\\ \hline +GLFW\_WINDOW\_NO\_RESIZE & GL\_TRUE if the window cannot be resized by the user, else GL\_FALSE.\\ \hline GLFW\_FSAA\_SAMPLES & Number of multisampling buffer samples. Zero indicated multisampling is disabled.\\ \hline -GLFW\_WINDOW\_NO\_RESIZE & GL\_TRUE if the window cannot be resized, else GL\_FALSE.\\ \hline +GLFW\_OPENGL\_VERSION\_MAJOR & Major number of the actual version of the context.\\ \hline +GLFW\_OPENGL\_VERSION\_MINOR & Minor number of the actual version of the context.\\ \hline +GLFW\_OPENGL\_FORWARD\_COMPAT & GL\_TRUE if the context is forward-compatible, else GL\_FALSE.\\ \hline +GLFW\_OPENGL\_DEBUG\_CONTEXT & GL\_TRUE if the context is a debug context.\\ \hline +GLFW\_OPENGL\_PROFILE & The profile implemented by the context, or zero.\\ \hline \end{tabular} \end{center} \caption{Window parameters for \textbf{glfwGetWindowParam}} @@ -831,13 +907,12 @@ \end{refparameters} \begin{refreturn} -The function returns different parameters depending on the value of -\textit{param}. Table \ref{tab:winparams} lists valid \textit{param} -values, and their corresponding return values. +The function returns the value the window parameter corresponding to the token +\textit{param}. Table \ref{tab:winparams} lists the available tokens. \end{refreturn} \begin{refdescription} -The function is used for acquiring various properties of an opened window. +This function is used for acquiring various properties of an opened window. \end{refdescription} \begin{refnotes} @@ -846,6 +921,9 @@ \OpenGL\ renderer is a 3rd party renderer, rather than the fallback Microsoft software \OpenGL\ renderer. In other words, it is not a real guarantee that the \OpenGL\ renderer is actually hardware accelerated. + +GLFW\_OPENGL\_VERSION\_MAJOR and GLFW\_OPENGL\_VERSION\_MINOR always return the +same values as those returned by \textbf{glfwGetGLVersion}. \end{refnotes} @@ -866,12 +944,18 @@ \end{refreturn} \begin{refdescription} -The function swaps the back and front color buffers of the window. If +This function swaps the back and front color buffers of the window. If GLFW\_AUTO\_POLL\_EVENTS is enabled (which is the default), -\textbf{glfwPollEvents} is called before swapping the front and back +\textbf{glfwPollEvents} is called after swapping the front and back buffers. \end{refdescription} +\begin{refnotes} +In previous versions of \GLFW , \textbf{glfwPollEvents} was called +\emph{before} buffer swap. This was changed in order to decrease input +lag but may affect code that relied on the former behavior. +\end{refnotes} + %------------------------------------------------------------------------- \subsection{glfwSwapInterval} @@ -896,7 +980,7 @@ \end{refreturn} \begin{refdescription} -The function selects the minimum number of monitor vertical retraces that +This function selects the minimum number of monitor vertical retraces that should occur between two buffer swaps. If the selected swap interval is one, the rate of buffer swaps will never be higher than the vertical refresh rate of the monitor. If the selected swap interval is zero, the @@ -905,8 +989,9 @@ \end{refdescription} \begin{refnotes} -This function will only have an effect on hardware and drivers that -support user selection of the swap interval. +This function will only have an effect on hardware and drivers that support +user selection of the swap interval. ATI drivers in particular have been known +to ignore this setting. \end{refnotes} @@ -929,8 +1014,8 @@ Where \textit{functionname} is the name of the callback function. - If \textit{cbfun} is NULL, any previously selected callback function - will be deselected. + If \textit{cbfun} is NULL, any previously set callback function + will be unset. \end{description} \end{refparameters} @@ -939,18 +1024,22 @@ \end{refreturn} \begin{refdescription} -The function selects which function to be called upon a window refresh -event, which occurs when any part of the window client area has been -damaged, and needs to be repainted (for instance, if a part of the window -that was previously occluded by another window has become visible). +This function sets the callback for window refresh events, which occurs when +any part of the window client area has been damaged, and needs to be repainted +(for instance, if a part of the window that was previously occluded by another +window has become visible). A window has to be opened for this function to have any effect. \end{refdescription} \begin{refnotes} Window refresh events are recorded continuously, but only reported when -\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or -\textbf{glfwSwapBuffers} is called. +\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or \textbf{glfwSwapBuffers} +(with GLFW\_AUTO\_POLL\_EVENTS enabled) is called. + +Modern windowing systems using hardware compositing, such as Aqua, Aero and +Compiz, very rarely need to refresh the contents of windows, so the specified +callback will very rarely be called on such systems. \end{refnotes} @@ -987,7 +1076,7 @@ \end{refreturn} \begin{refdescription} -The function returns a list of supported video modes. Each video mode is +This function returns a list of supported video modes. Each video mode is represented by a \textit{GLFWvidmode} structure, which has the following definition: @@ -1030,7 +1119,7 @@ \end{refreturn} \begin{refdescription} -The function returns the desktop video mode in a \textit{GLFWvidmode} +This function returns the desktop video mode in a \textit{GLFWvidmode} structure. See \textbf{glfwGetVideoModes} for a definition of the \textit{GLFWvidmode} structure. \end{refdescription} @@ -1043,9 +1132,10 @@ \textit{GreenBits} = 3 and \textit{BlueBits} = 2, which adds up to 8 bits in total. -The desktop video mode is the video mode used by the desktop, \textit{not} -the current video mode (which may differ from the desktop video mode if -the \GLFW\ window is a fullscreen window). +The desktop video mode is the video mode used by the desktop at the time +the \GLFW\ window was opened, \textit{not} the current video mode (which +may differ from the desktop video mode if the \GLFW\ window is a +fullscreen window). \end{refnotes} @@ -1083,7 +1173,7 @@ \end{refreturn} \begin{refdescription} -The function is used for polling for events, such as user input and +This function is used for polling for events, such as user input and window resize events. Upon calling this function, all window states, keyboard states and mouse states are updated. If any related callback functions are registered, these are called during the call to @@ -1092,7 +1182,7 @@ \begin{refnotes} \textbf{glfwPollEvents} is called implicitly from \textbf{glfwSwapBuffers} -if GLFW\_AUTO\_POLL\_EVENTS is enabled (default). Thus, if +if GLFW\_AUTO\_POLL\_EVENTS is enabled (as it is by default). Thus, if \textbf{glfwSwapBuffers} is called frequently, which is normally the case, there is no need to call \textbf{glfwPollEvents}. \end{refnotes} @@ -1115,10 +1205,10 @@ \end{refreturn} \begin{refdescription} -The function is used for waiting for events, such as user input and +This function is used for waiting for events, such as user input and window resize events. Upon calling this function, the calling thread will be put to sleep until any event appears in the event queue. When events -are ready, the events will be processed just as they are processed by +are available, they will be processed just as they are processed by \textbf{glfwPollEvents}. If there are any events in the queue when the function is called, the @@ -1127,12 +1217,11 @@ \end{refdescription} \begin{refnotes} -It is guaranteed that \textbf{glfwWaitEvents} will wake up on any event -that can be processed by \textbf{glfwPollEvents}. However, -\textbf{glfwWaitEvents} may wake up on events that are \emph{not} -processed or reported by \textbf{glfwPollEvents} too, and the function -may behave differently on different systems. Do no make any assumptions -about when or why \textbf{glfwWaitEvents} will return. +It is guaranteed that \textbf{glfwWaitEvents} will wake up on any event that +can be processed by \textbf{glfwPollEvents}. However, \GLFW\ receives many +events that are only processed internally and the function may behave +differently on different systems. Do not make any assumptions about when or why +\textbf{glfwWaitEvents} will return. \end{refnotes} @@ -1154,6 +1243,8 @@ GLFW\_KEY\_RCTRL & Right control key\\ \hline GLFW\_KEY\_LALT & Left alternate function key\\ \hline GLFW\_KEY\_RALT & Right alternate function key\\ \hline +GLFW\_KEY\_LSUPER & Left super key, WinKey, or command key\\ \hline +GLFW\_KEY\_RSUPER & Right super key, WinKey, or command key\\ \hline GLFW\_KEY\_TAB & Tabulator\\ \hline GLFW\_KEY\_ENTER & Enter\\ \hline GLFW\_KEY\_BACKSPACE & Backspace\\ \hline @@ -1171,6 +1262,11 @@ GLFW\_KEY\_KP\_DECIMAL & Keypad decimal (. or ,)\\ \hline GLFW\_KEY\_KP\_EQUAL & Keypad equal (=)\\ \hline GLFW\_KEY\_KP\_ENTER & Keypad enter\\ \hline +GLFW\_KEY\_KP\_NUM\_LOCK & Keypad num lock\\ \hline +GLFW\_KEY\_CAPS\_LOCK & Caps lock\\ \hline +GLFW\_KEY\_SCROLL\_LOCK & Scroll lock\\ \hline +GLFW\_KEY\_PAUSE & Pause key\\ \hline +GLFW\_KEY\_MENU & Menu key\\ \hline \end{tabular} \end{center} \caption{Special key identifiers} @@ -1217,14 +1313,15 @@ \end{refreturn} \begin{refdescription} -The function queries the current state of a specific keyboard key. The +This function queries the current state of a specific keyboard key. The physical location of each key depends on the system keyboard layout setting. \end{refdescription} \begin{refnotes} The constant GLFW\_KEY\_SPACE is equal to 32, which is the ISO~8859-1 code -for space. +for space. This is the only named \GLFW\ key identifier with a value in the +ISO~8859-1 range. Not all key codes are supported on all systems. Also, while some keys are available on some keyboard layouts, they may not be available on other @@ -1235,9 +1332,9 @@ GLFW\_KEY\_LSHIFT). A window must be opened for the function to have any effect, and -\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or -\textbf{glfwSwapBuffers} must be called before any keyboard events are -recorded and reported by \textbf{glfwGetKey}. +\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or \textbf{glfwSwapBuffers} +(with GLFW\_AUTO\_POLL\_EVENTS enabled) must be called before any keyboard +events are recorded and reported by \textbf{glfwGetKey}. \end{refnotes} @@ -1263,14 +1360,14 @@ \end{refreturn} \begin{refdescription} -The function queries the current state of a specific mouse button. +This function queries the current state of a specific mouse button. \end{refdescription} \begin{refnotes} A window must be opened for the function to have any effect, and -\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or -\textbf{glfwSwapBuffers} must be called before any mouse button events -are recorded and reported by \textbf{glfwGetMouseButton}. +\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or \textbf{glfwSwapBuffers} +(with GLFW\_AUTO\_POLL\_EVENTS enabled) must be called before any mouse button +events are recorded and reported by \textbf{glfwGetMouseButton}. GLFW\_MOUSE\_BUTTON\_LEFT is equal to GLFW\_MOUSE\_BUTTON\_1. GLFW\_MOUSE\_BUTTON\_RIGHT is equal to GLFW\_MOUSE\_BUTTON\_2. @@ -1289,34 +1386,32 @@ \begin{refparameters} \begin{description} \item [\textit{xpos}]\ \\ - Pointer to an integer that will be filled out with the horizontal - position of the mouse. + Pointer to an integer that will be set to the horizontal position of the + mouse cursor. \item [\textit{ypos}]\ \\ - Pointer to an integer that will be filled out with the vertical - position of the mouse. + Pointer to an integer that will be set to the vertical position of the mouse cursor. \end{description} \end{refparameters} \begin{refreturn} -The function returns the current mouse position in \textit{xpos} and +The function returns the current mouse cursor position in \textit{xpos} and \textit{ypos}. \end{refreturn} \begin{refdescription} -The function returns the current mouse position. If the cursor is not +This function returns the current mouse position. If the cursor is not hidden, the mouse position is the cursor position, relative to the upper -left corner of the window and limited to the client area of the window. -If the cursor is hidden, the mouse position is a virtual absolute -position, not limited to any boundaries except to those implied by the -maximum number that can be represented by a signed integer (normally --2147483648 to +2147483647). +left corner of the window and with the Y-axis down. If the cursor is hidden, +the mouse position is a virtual absolute position, not limited to any +boundaries except to those implied by the maximum number that can be +represented by a signed integer. \end{refdescription} \begin{refnotes} A window must be opened for the function to have any effect, and -\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or -\textbf{glfwSwapBuffers} must be called before any mouse movements are -recorded and reported by \textbf{glfwGetMousePos}. +\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or \textbf{glfwSwapBuffers} +(with GLFW\_AUTO\_POLL\_EVENTS enabled) must be called before any mouse +movements are recorded and reported by \textbf{glfwGetMousePos}. \end{refnotes} @@ -1342,11 +1437,11 @@ \end{refreturn} \begin{refdescription} -The function changes the position of the mouse. If the cursor is -visible (not disabled), the cursor will be moved to the specified -position, relative to the upper left corner of the window client area. -If the cursor is hidden (disabled), only the mouse position that is -reported by \GLFW\ is changed. +This function changes the position of the mouse. If the cursor is visible (not +disabled), the cursor will be moved to the specified position, relative to the +upper left corner of the window client area and with the Y-axis down. If the +cursor is hidden (disabled), only the mouse position that is reported by \GLFW\ +is changed. \end{refdescription} @@ -1367,16 +1462,16 @@ \end{refreturn} \begin{refdescription} -The function returns the current mouse wheel position. The mouse wheel can +This function returns the current mouse wheel position. The mouse wheel can be thought of as a third mouse axis, which is available as a separate wheel or up/down stick on some mice. \end{refdescription} \begin{refnotes} A window must be opened for the function to have any effect, and -\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or -\textbf{glfwSwapBuffers} must be called before any mouse wheel movements -are recorded and reported by \textbf{glfwGetMouseWheel}. +\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or \textbf{glfwSwapBuffers} +(with GLFW\_AUTO\_POLL\_EVENTS enabled) must be called before any mouse wheel +movements are recorded and reported by \textbf{glfwGetMouseWheel}. \end{refnotes} @@ -1400,7 +1495,7 @@ \end{refreturn} \begin{refdescription} -The function changes the position of the mouse wheel. +This function changes the position of the mouse wheel. \end{refdescription} @@ -1427,8 +1522,8 @@ \ref{tab:keys}), and \textit{action} is either GLFW\_PRESS or GLFW\_RELEASE. - If \textit{cbfun} is NULL, any previously selected callback function - will be deselected. + If \textit{cbfun} is NULL, any previously set callback function + will be unset. \end{description} \end{refparameters} @@ -1437,18 +1532,22 @@ \end{refreturn} \begin{refdescription} -The function selects which function to be called upon a keyboard key -event. The callback function is called every time the state of a single -key is changed (from released to pressed or vice versa). The reported keys -are unaffected by any modifiers (such as shift or alt). +This function sets the callback for keyboard key events. The callback function +is called every time the state of a single key is changed (from released to +pressed or vice versa). The reported keys are unaffected by any modifiers (such +as shift or alt) and each modifier is reported as a separate key. A window has to be opened for this function to have any effect. \end{refdescription} \begin{refnotes} +Keyboard key events are not intended for text input and many languages +will not be able to be input using it. Use Unicode character events for +text input instead. + Keyboard events are recorded continuously, but only reported when -\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or -\textbf{glfwSwapBuffers} is called. +\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or \textbf{glfwSwapBuffers} +(with GLFW\_AUTO\_POLL\_EVENTS enabled) is called. \end{refnotes} @@ -1473,8 +1572,8 @@ \textit{character} is a Unicode (ISO~10646) character, and \textit{action} is either GLFW\_PRESS or GLFW\_RELEASE. - If \textit{cbfun} is NULL, any previously selected callback function - will be deselected. + If \textit{cbfun} is NULL, any previously set callback function + will be unset. \end{description} \end{refparameters} @@ -1483,20 +1582,20 @@ \end{refreturn} \begin{refdescription} -The function selects which function to be called upon a keyboard character -event. The callback function is called every time a key that results in a -printable Unicode character is pressed or released. Characters are -affected by modifiers (such as shift or alt). +This function sets the callback for keyboard character events. The callback +function is called every time a key that results in a printable Unicode +character is pressed or released. Characters are affected by modifiers (such +as shift or alt). A window has to be opened for this function to have any effect. \end{refdescription} \begin{refnotes} Character events are recorded continuously, but only reported when -\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or -\textbf{glfwSwapBuffers} is called. +\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or \textbf{glfwSwapBuffers} +(with GLFW\_AUTO\_POLL\_EVENTS enabled) is called. -Control characters, such as tab and carriage return, are not reported to +Control characters such as tab and carriage return are not reported to the character callback function, since they are not part of the Unicode character set. Use the key callback function for such events (see \textbf{glfwSetKeyCallback}). @@ -1531,8 +1630,8 @@ \ref{tab:mousebuttons} on page \pageref{tab:mousebuttons}), and \textit{action} is either GLFW\_PRESS or GLFW\_RELEASE. - If \textit{cbfun} is NULL, any previously selected callback function - will be deselected. + If \textit{cbfun} is NULL, any previously set callback function + will be unset. \end{description} \end{refparameters} @@ -1541,16 +1640,15 @@ \end{refreturn} \begin{refdescription} -The function selects which function to be called upon a mouse button -event. +This function sets the callback for mouse button events. A window has to be opened for this function to have any effect. \end{refdescription} \begin{refnotes} Mouse button events are recorded continuously, but only reported when -\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or -\textbf{glfwSwapBuffers} is called. +\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or \textbf{glfwSwapBuffers} +(with GLFW\_AUTO\_POLL\_EVENTS enabled) is called. GLFW\_MOUSE\_BUTTON\_LEFT is equal to GLFW\_MOUSE\_BUTTON\_1. GLFW\_MOUSE\_BUTTON\_RIGHT is equal to GLFW\_MOUSE\_BUTTON\_2. @@ -1578,8 +1676,8 @@ \textit{x} and \textit{y} are the mouse coordinates (see \textbf{glfwGetMousePos} for more information on mouse coordinates). - If \textit{cbfun} is NULL, any previously selected callback function - will be deselected. + If \textit{cbfun} is NULL, any previously set callback function + will be unset. \end{description} \end{refparameters} @@ -1588,15 +1686,15 @@ \end{refreturn} \begin{refdescription} -The function selects which function to be called upon a mouse motion event. +This function sets the callback for mouse motion events. A window has to be opened for this function to have any effect. \end{refdescription} \begin{refnotes} Mouse motion events are recorded continuously, but only reported when -\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or -\textbf{glfwSwapBuffers} is called. +\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or \textbf{glfwSwapBuffers} +(with GLFW\_AUTO\_POLL\_EVENTS enabled) is called. \end{refnotes} @@ -1620,8 +1718,8 @@ Where \textit{functionname} is the name of the callback function, and \textit{pos} is the mouse wheel position. - If \textit{cbfun} is NULL, any previously selected callback function - will be deselected. + If \textit{cbfun} is NULL, any previously set callback function + will be unset. \end{description} \end{refparameters} @@ -1630,15 +1728,15 @@ \end{refreturn} \begin{refdescription} -The function selects which function to be called upon a mouse wheel event. +This function sets the callback for mouse wheel events. A window has to be opened for this function to have any effect. \end{refdescription} \begin{refnotes} Mouse wheel events are recorded continuously, but only reported when -\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or -\textbf{glfwSwapBuffers} is called. +\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or \textbf{glfwSwapBuffers} +(with GLFW\_AUTO\_POLL\_EVENTS enabled) is called. \end{refnotes} @@ -1683,13 +1781,13 @@ \end{refreturn} \begin{refdescription} -The function is used for acquiring various properties of a joystick. +This function is used for acquiring various properties of a joystick. \end{refdescription} \begin{refnotes} The joystick information is updated every time the function is called. -No window has to be opened for joystick information to be valid. +No window has to be opened for joystick information to be available. \end{refnotes} @@ -1721,7 +1819,7 @@ \end{refreturn} \begin{refdescription} -The function queries the current position of one or more axes of a +This function queries the current position of one or more axes of a joystick. The positional values are returned in an array, where the first element represents the first axis of the joystick (normally the X axis). Each position is in the range -1.0 to 1.0. Where applicable, the positive @@ -1741,7 +1839,7 @@ Use \textbf{glfwGetJoystickParam} to retrieve joystick capabilities, such as joystick availability and number of supported axes. -No window has to be opened for joystick input to be valid. +No window has to be opened for joystick input to be available. \end{refnotes} @@ -1774,7 +1872,7 @@ \end{refreturn} \begin{refdescription} -The function queries the current state of one or more buttons of a +This function queries the current state of one or more buttons of a joystick. The button states are returned in an array, where the first element represents the first button of the joystick. Each state can be either GLFW\_PRESS or GLFW\_RELEASE. @@ -1792,7 +1890,7 @@ Use \textbf{glfwGetJoystickParam} to retrieve joystick capabilities, such as joystick availability and number of supported buttons. -No window has to be opened for joystick input to be valid. +No window has to be opened for joystick input to be available. \end{refnotes} @@ -1819,15 +1917,14 @@ \end{refreturn} \begin{refdescription} -The function returns the state of a high precision timer. Unless the timer +This function returns the state of a high precision timer. Unless the timer has been set by the \textbf{glfwSetTime} function, the time is measured as the number of seconds that have passed since \textbf{glfwInit} was called. \end{refdescription} \begin{refnotes} The resolution of the timer depends on which system the program is running -on. The worst case resolution is somewhere in the order of $10~ms$, while -for most systems the resolution should be better than $1~\mu s$. +on. \end{refnotes} @@ -1851,7 +1948,7 @@ \end{refreturn} \begin{refdescription} -The function sets the current time of the high precision timer to the +This function sets the current time of the high precision timer to the specified time. Subsequent calls to \textbf{glfwGetTime} will be relative to this time. The time is given in seconds. \end{refdescription} @@ -1877,7 +1974,7 @@ \end{refreturn} \begin{refdescription} -The function puts the calling thread to sleep for the requested period of +This function puts the calling thread to sleep for the requested period of time. Only the calling thread is put to sleep. Other threads within the same process can still execute. \end{refdescription} @@ -1943,7 +2040,7 @@ \end{refreturn} \begin{refdescription} -The function reads an image from the file specified by the parameter +This function reads an image from the file specified by the parameter \textit{name} and returns the image information and data in a GLFWimage structure, which has the following definition: @@ -1984,10 +2081,6 @@ Paletted images are translated into true color or true color + alpha pixel formats. - -Please note that \OpenGL~1.0 does not support single component alpha maps, -so do not use images with Format = GL\_ALPHA directly as textures under -\OpenGL~1.0. \end{refnotes} @@ -2020,38 +2113,10 @@ \end{refreturn} \begin{refdescription} -The function reads an image from the memory buffer specified by the parameter -\textit{data} and returns the image information and data in a GLFWimage -structure, which has the following definition: - -\begin{lstlisting} -typedef struct { - int Width, Height; // Image dimensions - int Format; // OpenGL pixel format - int BytesPerPixel; // Number of bytes per pixel - unsigned char *Data; // Pointer to pixel data -} GLFWimage; -\end{lstlisting} - -\textit{Width} and \textit{Height} give the dimensions of the image. -\textit{Format} specifies an \OpenGL\ pixel format, which can be -GL\_LUMINANCE or GL\_ALPHA (for gray scale images), GL\_RGB or GL\_RGBA. -\textit{BytesPerPixel} specifies the number of bytes per pixel. -\textit{Data} is a pointer to the actual pixel data. - -By default the read image is rescaled to the nearest larger $2^m\times2^n$ -resolution using bilinear interpolation, if necessary, which is useful if -the image is to be used as an \OpenGL\ texture. This behavior can be -disabled by setting the GLFW\_NO\_RESCALE\_BIT flag. - -Unless the flag GLFW\_ORIGIN\_UL\_BIT is set, the first pixel in -\textit{img->Data} is the lower left corner of the image. If the flag -GLFW\_ORIGIN\_UL\_BIT is set, however, the first pixel is the upper left -corner. - -For single component images (i.e. gray scale), \textit{Format} is set -to GL\_ALPHA if the flag GLFW\_ALPHA\_MAP\_BIT flag is set, otherwise -\textit{Format} is set to GL\_LUMINANCE. +This function reads an image file from the memory buffer specified by the +parameter \textit{data} and returns the image information and data in a +GLFWimage structure. For more information on the \GLFW\ image struct, see +\textbf{glfwReadImage}. \end{refdescription} \begin{refnotes} @@ -2061,10 +2126,6 @@ Paletted images are translated into true color or true color + alpha pixel formats. - -Please note that \OpenGL~1.0 does not support single component alpha maps, -so do not use images with Format = GL\_ALPHA directly as textures under -\OpenGL~1.0. \end{refnotes} @@ -2088,10 +2149,10 @@ \end{refreturn} \begin{refdescription} -The function frees any memory occupied by a loaded image, and clears all +This function frees any memory occupied by a loaded image, and clears all the fields of the GLFWimage struct. Any image that has been loaded by the -\textbf{glfwReadImage} function should be deallocated using this function, -once the image is not needed anymore. +\textbf{glfwReadImage} function should be deallocated using this function +once the image is no longer needed. \end{refdescription} @@ -2134,7 +2195,7 @@ \end{refreturn} \begin{refdescription} -The function reads an image from the file specified by the parameter +This function reads an image from the file specified by the parameter \textit{name} and uploads the image to \OpenGL\ texture memory (using the \textbf{glTexImage2D} function). @@ -2202,7 +2263,7 @@ \end{refreturn} \begin{refdescription} -The function reads an image from the memory buffer specified by the parameter +This function reads an image from the memory buffer specified by the parameter \textit{data} and uploads the image to \OpenGL\ texture memory (using the \textbf{glTexImage2D} function). @@ -2269,7 +2330,7 @@ \end{refreturn} \begin{refdescription} -The function uploads the image specified by the parameter \textit{img} to +This function uploads the image specified by the parameter \textit{img} to \OpenGL\ texture memory (using the \textbf{glTexImage2D} function). If the GLFW\_BUILD\_MIPMAPS\_BIT flag is set, all mipmap levels for the @@ -2315,9 +2376,9 @@ \section{OpenGL Extension Support} One of the great features of \OpenGL\ is its support for extensions, which allow independent vendors to supply non-standard functionality in their -\OpenGL\ implementations. Using extensions is different under different -systems, which is why \GLFW\ has provided an operating system independent -interface to querying and using \OpenGL\ extensions. +\OpenGL\ implementations. As the mechanism for querying extensions varies +among systems, \GLFW\ provides an operating system independent interface for +querying \OpenGL\ version, extensions and entry points. %------------------------------------------------------------------------- @@ -2342,7 +2403,7 @@ \end{refreturn} \begin{refdescription} -The function does a string search in the list of supported \OpenGL\ +This function does a string search in the list of supported \OpenGL\ extensions to find if the specified extension is listed. \end{refdescription} @@ -2353,7 +2414,7 @@ In addition to checking for \OpenGL\ extensions, \GLFW\ also checks for extensions in the operating system ``glue API'', such as WGL extensions -under Windows and glX extensions under the X Window System. +under Microsoft Windows and GLX extensions under the X Window System. \end{refnotes} @@ -2374,12 +2435,12 @@ \end{refparameters} \begin{refreturn} -The function returns the pointer to the specified \OpenGL\ function if it -is supported, otherwise NULL is returned. +The function returns the address of the specified \OpenGL\ function, if it +is available. Otherwise NULL is returned. \end{refreturn} \begin{refdescription} -The function acquires the pointer to an \OpenGL\ extension function. Some +This function acquires the pointer to an \OpenGL\ extension function. Some (but not all) \OpenGL\ extensions define new API functions, which are usually not available through normal linking. It is therefore necessary to get access to those API functions at runtime. @@ -2420,11 +2481,11 @@ \end{refreturn} \begin{refdescription} -The function returns the \OpenGL\ implementation version. This is a -convenient function that parses the version number information from the -string returned by calling \texttt{glGetString(~GL\_VERSION~)}. The -\OpenGL\ version information can be used to determine what functionality -is supported by the used \OpenGL\ implementation. +This function returns the \OpenGL\ implementation version. This is a +convenient function that parses the version number information at the beginning +of the string returned by calling \texttt{glGetString(~GL\_VERSION~)}. The +\OpenGL\ version information can be used to determine what functionality is +supported by the used \OpenGL\ implementation. \end{refdescription} \begin{refnotes} @@ -2440,7 +2501,7 @@ A thread is a separate execution path within a process. All threads within a process share the same address space and resources. Threads execute in parallel, either virtually by means of time-sharing on a single processor, -or truly in parallel on several processors. Even on a multi-processor +or truly in parallel on multiple processors. Even on a multi-processor system, time-sharing is employed in order to maximize processor utilization and to ensure fair scheduling. \GLFW\ provides an operating system independent interface to thread management. @@ -2479,7 +2540,7 @@ \end{refreturn} \begin{refdescription} -The function creates a new thread, which executes within the same address +This function creates a new thread, which executes within the same address space as the calling process. The thread entry point is specified with the \textit{fun} argument. @@ -2514,7 +2575,7 @@ \end{refreturn} \begin{refdescription} -The function kills a running thread and removes it from the thread list. +This function kills a running thread and removes it from the thread list. \end{refdescription} \begin{refnotes} @@ -2577,7 +2638,7 @@ \end{refreturn} \begin{refdescription} -The function determines the thread ID for the calling thread. The ID is +This function determines the thread ID for the calling thread. The ID is the same value as was returned by \textbf{glfwCreateThread} when the thread was created. \end{refdescription} @@ -2610,7 +2671,7 @@ \end{refreturn} \begin{refdescription} -The function creates a mutex object, which can be used to control access +This function creates a mutex object, which can be used to control access to data that is shared between threads. \end{refdescription} @@ -2635,7 +2696,7 @@ \end{refreturn} \begin{refdescription} -The function destroys a mutex object. After a mutex object has been +This function destroys a mutex object. After a mutex object has been destroyed, it may no longer be used by any thread. \end{refdescription} @@ -2660,7 +2721,7 @@ \end{refreturn} \begin{refdescription} -The function will acquire a lock on the selected mutex object. If the +This function will acquire a lock on the selected mutex object. If the mutex is already locked by another thread, the function will block the calling thread until it is released by the locking thread. Once the function returns, the calling thread has an exclusive lock on the mutex. @@ -2688,7 +2749,7 @@ \end{refreturn} \begin{refdescription} -The function releases the lock of a locked mutex object. +This function releases the lock of a locked mutex object. \end{refdescription} @@ -2717,7 +2778,7 @@ \end{refreturn} \begin{refdescription} -The function creates a condition variable object, which can be used to +This function creates a condition variable object, which can be used to synchronize threads. \end{refdescription} @@ -2742,7 +2803,7 @@ \end{refreturn} \begin{refdescription} -The function destroys a condition variable object. After a condition +This function destroys a condition variable object. After a condition variable object has been destroyed, it may no longer be used by any thread. \end{refdescription} @@ -2773,7 +2834,7 @@ \end{refreturn} \begin{refdescription} -The function atomically unlocks the mutex specified by \textit{mutex}, and +This function atomically unlocks the mutex specified by \textit{mutex}, and waits for the condition variable \textit{cond} to be signaled. The thread execution is suspended and does not consume any CPU time until the condition variable is signaled or the amount of time specified by timeout @@ -2813,7 +2874,7 @@ \end{refreturn} \begin{refdescription} -The function restarts one of the threads that are waiting on the condition +This function restarts one of the threads that are waiting on the condition variable \textit{cond}. If no threads are waiting on \textit{cond}, nothing happens. If several threads are waiting on \textit{cond}, exactly one is restarted, but it is not specified which. @@ -2846,7 +2907,7 @@ \end{refreturn} \begin{refdescription} -The function restarts all the threads that are waiting on the condition +This function restarts all the threads that are waiting on the condition variable \textit{cond}. If no threads are waiting on \textit{cond}, nothing happens. \end{refdescription} @@ -2911,11 +2972,12 @@ \bigskip\begin{mysamepage}\hypertarget{lnk:autopollevents}{} \textbf{GLFW\_AUTO\_POLL\_EVENTS}\\ When GLFW\_AUTO\_POLL\_EVENTS is enabled, \textbf{glfwPollEvents} is -automatically called each time that \textbf{glfwSwapBuffers} is called. +automatically called each time that \textbf{glfwSwapBuffers} is called, +immediately after the buffer swap itself. When GLFW\_AUTO\_POLL\_EVENTS is disabled, calling \textbf{glfwSwapBuffers} will not result in a call to -\textbf{glfwPollEvents}. This can be useful if \textbf{glfwSwapBuffers} +\textbf{glfwPollEvents}. This can be useful if for example \textbf{glfwSwapBuffers} needs to be called from within a callback function, since calling \textbf{glfwPollEvents} from a callback function is not allowed. \end{mysamepage} @@ -2942,7 +3004,7 @@ When GLFW\_MOUSE\_CURSOR is disabled, the mouse cursor is invisible, and mouse coordinates are not limited to the drawing area of the window. It is -as if the mouse coordinates are recieved directly from the mouse, without +as if the mouse coordinates are received directly from the mouse, without being restricted or manipulated by the windowing system. \end{mysamepage} @@ -2968,16 +3030,16 @@ \bigskip\begin{mysamepage}\hypertarget{lnk:stickymousebuttons}{} \textbf{GLFW\_STICKY\_MOUSE\_BUTTONS}\\ -When GLFW\_STICKY\_MOUSE\_BUTTONS is enabled, mouse buttons that are -pressed will not be released until they are physically released and -checked with \textbf{glfwGetMouseButton}. This behavior makes it -possible to catch mouse buttons which were pressed and then released again -between two calls to \textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or -\textbf{glfwSwapBuffers}, which would otherwise have been reported as -released. Care should be taken when using this mode, since mouse buttons -that are not checked with \textbf{glfwGetMouseButton} will never be -released. Note also that enabling GLFW\_STICKY\_MOUSE\_BUTTONS does not -affect the behavior of the mouse button callback functionality. +When GLFW\_STICKY\_MOUSE\_BUTTONS is enabled, mouse buttons that are pressed +will not be released until they are physically released and checked with +\textbf{glfwGetMouseButton}. This behavior makes it possible to catch mouse +buttons which were pressed and then released again between two calls to +\textbf{glfwPollEvents}, \textbf{glfwWaitEvents} or \textbf{glfwSwapBuffers} +(with GLFW\_AUTO\_POLL\_EVENTS enabled), which would otherwise have been +reported as released. Care should be taken when using this mode, since mouse +buttons that are not checked with \textbf{glfwGetMouseButton} will never be +released. Note also that enabling GLFW\_STICKY\_MOUSE\_BUTTONS does not affect +the behavior of the mouse button callback functionality. When GLFW\_STICKY\_MOUSE\_BUTTONS is disabled, the status of a mouse button that is reported by \textbf{glfwGetMouseButton} is always the @@ -2989,8 +3051,8 @@ \bigskip\begin{mysamepage}\hypertarget{lnk:systemkeys}{} \textbf{GLFW\_SYSTEM\_KEYS}\\ When GLFW\_SYSTEM\_KEYS is enabled, pressing standard system key -combinations, such as \texttt{ALT+TAB} under Windows, will give the normal -behavior. Note that when \texttt{ALT+TAB} is issued under Windows in this +combinations, such as \texttt{Alt+Tab} under Windows, will give the normal +behavior. Note that when \texttt{Alt+Tab} is issued under Windows in this mode so that the \GLFW\ application is deselected when \GLFW\ is operating in fullscreen mode, the \GLFW\ application window will be minimized and the video mode will be set to the original desktop mode. When the \GLFW\ @@ -3021,14 +3083,156 @@ \end{refreturn} \begin{refdescription} -The function determines the number of active processors in the system. +This function determines the number of active processors in the system. \end{refdescription} \begin{refnotes} Systems with several logical processors per physical processor, also -known as SMT (Symmetric Multi Threading) processors, will report the +known as SMT (Symmetric Multi-Threading) processors, will report the number of logical processors. \end{refnotes} +%------------------------------------------------------------------------- +% GLFW Standards Conformance +%------------------------------------------------------------------------- +\appendix +\chapter{GLFW Compatibility} +\label{chap:compatibility} +\thispagestyle{fancy} + +This chapter describes the various API extensions used by this version of +\GLFW . It lists what are essentially implementation details, but which are +nonetheless vital knowledge for developers wishing to deploy their applications +on machines with varied specifications. + +Note that the information in this appendix is not a part of the API +specification but merely list some of the preconditions for certain parts of +the API to function on a given machine. As such, any part of it may change in +future versions without this being considered a breaking API change. + +%------------------------------------------------------------------------- +\section{ICCCM and EWMH Conformance} + +As \GLFW\ uses \textbf{Xlib}, directly, without any intervening toolkit +library, it has sole responsibility for interacting well with the many and +varied window managers in use on Unix-like systems. In order for applications +and window managers to work well together, a number of standards and +conventions have been developed that regulate behavior outside the scope of the +X11 API; most importantly the \textbf{Inter-Client Communication Conventions +Manual} (ICCCM) and \textbf{Extended Window Manager Hints} (EWMH) standards. + +\GLFW\ uses the ICCCM \textbf{WM\_DELETE\_WINDOW} protocol to intercept the user +attempting to close the \GLFW\ window. If the running window manager does not +support this protocol, the close callback will never be called. + +\GLFW\ uses the EWMH \textbf{\_NET\_WM\_PING} protocol, allowing the window +manager notify the user when the application has stopped responding, i.e. when +it has ceased to process events. If the running window manager does not +support this protocol, the user will not be notified if the application locks +up. + +\GLFW\ uses the EWMH \textbf{\_NET\_WM\_STATE} protocol to tell the window +manager to make the \GLFW\ window fullscreen. If the running window manager +does not support this protocol, fullscreen windows may not work properly. +\GLFW\ has a fallback code path in case this protocol is unavailable, but every +window manager behaves slightly differently in this regard. + +%------------------------------------------------------------------------- +\section{GLX Extensions} + +The \textbf{GLX} API is used to create \OpenGL\ contexts on Unix-like systems +using the X Window System. + +\GLFW\ uses the \textbf{GLXFBConfig} API to enumerate and select framebuffer +pixel formats. This requires either \textbf{GLX} 1.3 or greater, or the +\textbf{GLX\_SGIX\_fbconfig} extension. Where both are available, the SGIX +extension is preferred. If neither is available, \GLFW\ will be unable to open +windows. + +% This paragraph repeated almost verbatim below +\GLFW\ uses the \textbf{GLX\_SGI\_swap\_control} extension to provide vertical +retrace synchronization (or ``vsync''). Where this extension is unavailable, +calling \textbf{glfwSwapInterval} will have no effect. + +% This paragraph repeated almost verbatim below +\GLFW\ uses the \textbf{GLX\_ARB\_multisample} extension to create contexts +with multisampling anti-aliasing. Where this extension is unavailable, the +GLFW\_FSAA\_SAMPLES hint will have no effect. + +% This paragraph repeated almost verbatim below +\GLFW\ uses the \textbf{GLX\_ARB\_create\_context} extension when available, +even when creating \OpenGL\ contexts of version 2.1 and below. Where this +extension is unavailable, the GLFW\_OPENGL\_VERSION\_MAJOR and +GLFW\_OPENGL\_VERSION\_MINOR hints will only be partially supported, the +GLFW\_OPENGL\_DEBUG\_CONTEXT hint will have no effect, and setting the +GLFW\_OPENGL\_PROFILE or GLFW\_FORWARD\_COMPAT hints to a non-zero value will +cause \textbf{glfwOpenWindow} to fail. + +% This paragraph repeated almost verbatim below +\GLFW\ uses the \textbf{GLX\_ARB\_create\_context\_profile} extension to +provide support for context profiles. Where this extension is unavailable, +setting the GLFW\_OPENGL\_PROFILE hint to anything but zero will cause +\textbf{glfwOpenWindow} to fail. + +%------------------------------------------------------------------------- +\section{WGL Extensions} + +The \textbf{WGL} API is used to create \OpenGL\ contexts on Microsoft Windows +and other implementations of the Win32 API, such as Wine. + +\GLFW\ uses either the \textbf{WGL\_EXT\_extension\_string} or the +\textbf{WGL\_ARB\_extension\_string} extension to check for the presence of all +other \textbf{WGL} extensions listed below. If both are available, the EXT one +is preferred. If neither is available, no other extensions are used and many +\GLFW\ features related to context creation will have no effect or cause errors +when used. + +% This paragraph repeated almost verbatim above +\GLFW\ uses the \textbf{WGL\_EXT\_swap\_control} extension to provide vertical +retrace synchronization (or ``vsync''). Where this extension is unavailable, +calling \textbf{glfwSwapInterval} will have no effect. + +% This paragraph repeated almost verbatim above +\GLFW\ uses the \textbf{WGL\_ARB\_pixel\_format} and +\textbf{WGL\_ARB\_multisample} extensions to create contexts with multisampling +anti-aliasing. Where these extensions are unavailable, the GLFW\_FSAA\_SAMPLES +hint will have no effect. + +% This paragraph repeated almost verbatim above +\GLFW\ uses the \textbf{WGL\_ARB\_create\_context} extension when available, +even when creating \OpenGL\ contexts of version 2.1 and below. Where this +extension is unavailable, the GLFW\_OPENGL\_VERSION\_MAJOR and +GLFW\_OPENGL\_VERSION\_MINOR hints will only be partially supported, the +GLFW\_OPENGL\_DEBUG\_CONTEXT hint will have no effect, and setting the +GLFW\_OPENGL\_PROFILE or GLFW\_FORWARD\_COMPAT hints to a non-zero value will +cause \textbf{glfwOpenWindow} to fail. + +% This paragraph repeated almost verbatim above +\GLFW\ uses the \textbf{WGL\_ARB\_create\_context\_profile} extension to +provide support for context profiles. Where this extension is unavailable, +setting the GLFW\_OPENGL\_PROFILE hint to anything but zero will cause +\textbf{glfwOpenWindow} to fail. + +%------------------------------------------------------------------------- +\section{OpenGL 3.0+ on Mac OS X} + +Support for OpenGL 3.0 and above was introduced with Mac OS X 10.7, and even +then forward-compatible OpenGL 3.2 core profile contexts are supported and +there is no mechanism for requesting debug contexts. Earlier versions of Mac +OS X supports at most OpenGL version 2.1. + +Because of this, on Mac OS X 10.7, the GLFW\_OPENGL\_VERSION\_MAJOR and +GLFW\_OPENGL\_VERSION\_MINOR hints will fail if given a version above 3.2, the +GLFW\_OPENGL\_DEBUG\_CONTEXT and GLFW\_FORWARD\_COMPAT hints are ignored, and +setting the GLFW\_OPENGL\_PROFILE hint to anything except zero or +GLFW\_OPENGL\_CORE\_PROFILE will cause \textbf{glfwOpenWindow} to fail. + +Also, on Mac OS X 10.6 and below, the GLFW\_OPENGL\_VERSION\_MAJOR and +GLFW\_OPENGL\_VERSION\_MINOR hints will fail if given a version above 2.1, the +GLFW\_OPENGL\_DEBUG\_CONTEXT hint will have no effect, and setting the +GLFW\_OPENGL\_PROFILE or GLFW\_FORWARD\_COMPAT hints to a non-zero value will +cause \textbf{glfwOpenWindow} to fail. + + \end{document} diff -Nru glfw-2.6/docs/glfwug.tex glfw-2.7.2/docs/glfwug.tex --- glfw-2.6/docs/glfwug.tex 2007-09-01 16:36:11.000000000 +0000 +++ glfw-2.7.2/docs/glfwug.tex 2011-07-27 17:30:50.000000000 +0000 @@ -1,6 +1,6 @@ %------------------------------------------------------------------------- % GLFW Users Guide -% API Version: 2.6 +% API Version: 2.7 %------------------------------------------------------------------------- % Document class @@ -8,7 +8,7 @@ % Document title and API version \newcommand{\glfwdoctype}[1][0]{Users Guide} -\newcommand{\glfwapiver}[1][0]{2.6} +\newcommand{\glfwapiver}[1][0]{2.7} % Common document settings and macros \input{glfwdoc.sty} @@ -42,7 +42,7 @@ This document is a users guide for the \GLFW\ API that gives a practical introduction to using \GLFW . For a more detailed description of the \GLFW\ API you should refer to the \textit{GLFW Reference Manual}. -\vspace{10cm} +\vspace{5cm} \large Trademarks @@ -93,30 +93,29 @@ \begin{itemize} \item Opening and managing an \OpenGL\ window. \item Keyboard, mouse and joystick input. -\item A high precision timer. -\item Multi threading support. +\item High precision time input. +\item Multi-threading support. \item Support for querying and using \OpenGL\ extensions. -\item Image file loading support. +\item Rudimentary image file loading support. \end{itemize} \vspace{18pt} All this functionality is implemented as a set of easy-to-use functions, which makes it possible to write an \OpenGL\ application framework in just a -few lines of code. The \GLFW\ API is completely operating system and -platform independent, which makes it very simple to port \GLFW\ based \OpenGL\ -applications to a variety of platforms. +few lines of code. The \GLFW\ API is operating system and platform independent, +making it very simple to port \GLFW\ based \OpenGL\ applications between the +supported platforms. Currently supported platforms are: \begin{itemize} -\item Microsoft Windows\textsuperscript{\textregistered} 95/98/ME/NT/2000/XP/.NET Server. +\item Microsoft Windows\textsuperscript{\textregistered} \item Unix\textsuperscript{\textregistered} or Unix-like systems running the -X Window System\texttrademark, e.g. Linux\textsuperscript{\textregistered}, -IRIX\textsuperscript{\textregistered}, FreeBSD\textsuperscript{\textregistered}, -Solaris\texttrademark, QNX\textsuperscript{\textregistered} and -Mac OS\textsuperscript{\textregistered} X. -\item Mac OS\textsuperscript{\textregistered} X (Carbon)\footnote{Support for joysticks missing at the time of writing.} +X Window System\texttrademark with GLX version 1.3 or later +\item Mac OS X\textsuperscript{\textregistered} 10.5 and later, using Cocoa\footnote{Support for joysticks missing at the time of writing.} \end{itemize} +There is also deprecated support for Mac OS X versions 10.3 and 10.4, using the Carbon API. + %------------------------------------------------------------------------- % Getting Started @@ -131,8 +130,8 @@ %------------------------------------------------------------------------- \section{Initializing GLFW} Before using any of the \GLFW\ functions, it is necessary to call -\textbf{glfwInit}. It initializes internal working variables that are used -by other \GLFW\ functions. The C syntax is: +\textbf{glfwInit}. It initializes the parts of \GLFW\ that are not dependent on +a window, such as threading, timer and joystick input. The C syntax is: \begin{lstlisting} int glfwInit( void ) @@ -142,32 +141,28 @@ GL\_FALSE if it failed. When your application is done using \GLFW , typically at the very end of -the program, you should call \textbf{glfwTerminate}, which makes a clean -up and places \GLFW\ in a non-initialized state (i.e. it is necessary to -call \textbf{glfwInit} again before using any \GLFW\ functions). The C -syntax is: +the program, you should call \textbf{glfwTerminate}. The C syntax is: \begin{lstlisting} void glfwTerminate( void ) \end{lstlisting} -Among other things, \textbf{glfwTerminate} closes the \OpenGL\ window -unless it was closed manually, and kills any running threads that were -created using \GLFW . - +This releases any resources allocated by GLFW, closes the window if it is open +and kills any secondary threads created by \GLFW\. After this call, you must +call \textbf{glfwInit} again before using any \GLFW\ functions). %------------------------------------------------------------------------- \section{Opening An OpenGL Window} -Opening an \OpenGL\ window is done with the function -\textbf{glfwOpenWindow}. The function takes nine arguments, which are used -to describe the following properties of the window to open: +Opening an \OpenGL\ window is done with the \textbf{glfwOpenWindow} function. +The function takes nine arguments, which are used to describe the following +properties of the requested window: \begin{itemize} \item Window dimensions (width and height) in pixels. -\item Color and alpha buffer depth. -\item Depth buffer (Z-buffer) depth. -\item Stencil buffer depth. -\item Fullscreen or windowed mode. +\item Color and alpha buffer bit depth. +\item Depth buffer (Z-buffer) bit depth. +\item Stencil buffer bit depth. +\item Whether to use fullscreen or windowed mode. \end{itemize} The C language syntax for \textbf{glfwOpenWindow} is: @@ -189,18 +184,18 @@ \textit{depthbits} is zero, the opened window may not have a depth buffer. The \textit{mode} argument is used to specify if the window is to be a -s.c. fullscreen window, or a regular window. +fullscreen window or a regular window. If \textit{mode} is GLFW\_FULLSCREEN, the window will cover the entire -screen and no window borders will be visible. If possible, the video mode -will be changed to the mode that closest matches the \textit{width}, -\textit{height}, \textit{redbits}, \textit{greenbits}, \textit{bluebits} -and \textit{alphabits} arguments. Furthermore, the mouse pointer will be -hidden, and screensavers are prohibited. This is usually the best mode for -games and demos. +screen and no window border or decorations will be visible. If possible, the +video mode will be changed to the mode that closest matches the \textit{width}, +\textit{height}, \textit{redbits}, \textit{greenbits}, \textit{bluebits} and +\textit{alphabits} arguments. Furthermore, the mouse pointer will be hidden, +and screensavers are prohibited. This is usually the best mode for games and +demos. -If \textit{mode} is GLFW\_WINDOW, the window will be opened as a normal -window on the desktop. The mouse pointer will not be hidden, and +If \textit{mode} is GLFW\_WINDOW, the window will be opened as a normal, +decorated window on the desktop. The mouse pointer will not be hidden and screensavers are allowed to be activated. To close the window, you can either use \textbf{glfwTerminate}, as @@ -211,6 +206,10 @@ void glfwCloseWindow( void ) \end{lstlisting} +Note that you do not need to call \textbf{glfwTerminate} and \textbf{glfwInit} +before opening a new window after having closed the current one using +\textbf{glfwCloseWindow}. + %------------------------------------------------------------------------- \section{Using Keyboard Input} @@ -228,8 +227,8 @@ uppercase printable ISO 8859-1 (Latin 1) character (e.g. `A', `3' or `.'), or a special key identifier (see the \textit{GLFW Reference Manual} for a list of special key identifiers). \textbf{glfwGetKey} returns GLFW\_PRESS -(or 1) if the key is currently held down, or GLFW\_RELEASE (or 0) if the -key is not being held down. For example: +if the key is currently held down, or GLFW\_RELEASE if the key is not being +held down. For example: \begin{lstlisting} A_pressed = glfwGetKey( 'A' ); @@ -254,25 +253,27 @@ %------------------------------------------------------------------------- \section{Putting It Together: A Minimal GLFW Application} Now that you know how to initialize \GLFW , open a window and poll for -keyboard input, let us exemplify this with a simple \OpenGL\ program. In -the following example some error-checking has been omitted for the sake of -brevity: +keyboard input, let us exemplify this with a simple \OpenGL\ program: \begin{lstlisting} #include +#include int main( void ) { int running = GL_TRUE; // Initialize GLFW - glfwInit(); + if( !glfwInit() ) + { + exit( EXIT_FAILURE ); + } // Open an OpenGL window if( !glfwOpenWindow( 300,300, 0,0,0,0,0,0, GLFW_WINDOW ) ) { glfwTerminate(); - return 0; + exit( EXIT_FAILURE ); } // Main loop @@ -293,7 +294,7 @@ glfwTerminate(); // Exit program - return 0; + exit( EXIT_SUCCESS ); } \end{lstlisting} @@ -308,7 +309,7 @@ \chapter{Window Operations} \thispagestyle{fancy} In this chapter, you will learn more about window related \GLFW\ -functionality, including: setting and getting window properties, buffer +functionality, including setting and getting window properties, buffer swap control and video mode querying. @@ -316,9 +317,9 @@ \section{Setting Window Properties} In the previous chapter the \textbf{glfwOpenWindow} function was described, which specifies the sizes of the color, alpha, depth and -stencil buffers. It is also possible to request an accumulator buffer, -auxiliary buffers and stereo rendering by using the -\textbf{glfwOpenWindowHint} function: +stencil buffers. It is also possible to request a specific minimum OpenGL +version, multisampling anti-aliasing, an accumulation buffer, stereo +rendering and more by using the \textbf{glfwOpenWindowHint} function: \begin{lstlisting} void glfwOpenWindowHint( int target, int hint ) @@ -334,14 +335,21 @@ \begin{tabular}{|l|l|p{7.0cm}|} \hline \raggedright \textbf{Name} & \textbf{Default} & \textbf{Description} \\ \hline GLFW\_REFRESH\_RATE & 0 & Vertical monitor refresh rate in Hz (only used for fullscreen windows). Zero means system default.\\ \hline -GLFW\_ACCUM\_RED\_BITS & 0 & Number of bits for the red channel of the accumulator buffer.\\ \hline -GLFW\_ACCUM\_GREEN\_BITS & 0 & Number of bits for the green channel of the accumulator buffer.\\ \hline -GLFW\_ACCUM\_BLUE\_BITS & 0 & Number of bits for the blue channel of the accumulator buffer.\\ \hline -GLFW\_ACCUM\_ALPHA\_BITS & 0 & Number of bits for the alpha channel of the accumulator buffer.\\ \hline +GLFW\_ACCUM\_RED\_BITS & 0 & Number of bits for the red channel of the accumulation buffer.\\ \hline +GLFW\_ACCUM\_GREEN\_BITS & 0 & Number of bits for the green channel of the accumulation buffer.\\ \hline +GLFW\_ACCUM\_BLUE\_BITS & 0 & Number of bits for the blue channel of the accumulation buffer.\\ \hline +GLFW\_ACCUM\_ALPHA\_BITS & 0 & Number of bits for the alpha channel of the accumulation buffer.\\ \hline GLFW\_AUX\_BUFFERS & 0 & Number of auxiliary buffers.\\ \hline GLFW\_STEREO & GL\_FALSE & Specify if stereo rendering should be supported (can be GL\_TRUE or GL\_FALSE).\\ \hline -GLFW\_WINDOW\_NO\_RESIZE & GL\_FALSE & Specify whether the window can be resized (not used for fullscreen windows).\\ \hline +GLFW\_WINDOW\_NO\_RESIZE & GL\_FALSE & Specify whether the window can be resized by the user (not used for fullscreen windows).\\ \hline GLFW\_FSAA\_SAMPLES & 0 & Number of samples to use for the multisampling buffer. Zero disables multisampling.\\ \hline +GLFW\_OPENGL\_VERSION\_MAJOR & 1 & Major number of the desired minimum OpenGL version.\\ \hline +GLFW\_OPENGL\_VERSION\_MINOR & 1 & Minor number of the desired minimum OpenGL version.\\ \hline +GLFW\_OPENGL\_FORWARD\_COMPAT & GL\_FALSE & Specify whether the OpenGL context should be forward-compatible (i.e. disallow legacy functionality). + This should only be used when requesting OpenGL version 3.0 or above.\\ \hline +GLFW\_OPENGL\_DEBUG\_CONTEXT & GL\_FALSE & Specify whether a debug context should be created.\\ \hline +GLFW\_OPENGL\_PROFILE & 0 & The OpenGL profile the context should implement, or zero to let the system choose. + Available profiles are GLFW\_OPENGL\_CORE\_PROFILE and GLFW\_OPENGL\_COMPAT\_PROFILE.\\ \hline \end{tabular} \end{center} \caption{Targets for \textbf{glfwOpenWindowHint}} @@ -353,7 +361,7 @@ must be called before opening the window with the \textbf{glfwOpenWindow} function. -To request an accumulator buffer, set the GLFW\_ACCUM\_x\_BITS targets to +To request an accumulation buffer, set the GLFW\_ACCUM\_x\_BITS targets to values greater than zero (usually eight or sixteen bits per component). To request auxiliary buffers, set the GLFW\_AUX\_BUFFERS target to a value greater than zero. To request a stereo rendering capable window, set the @@ -366,6 +374,22 @@ The GLFW\_REFRESH\_RATE target should be used with caution, since it may result in suboptimal operation, or even a blank or damaged screen. +If you want to create a forward-compatible \OpenGL\ context, set the +GLFW\_OPENGL\_FORWARD\_COMPAT hint to GL\_TRUE. Note that such contexts are +only available for \OpenGL\ version 3.0 and above, so you will need to specify +a valid minimum version using the GLFW\_OPENGL\_VERSION\_MAJOR and +GLFW\_OPENGL\_VERSION\_MINOR hints. + +If you want to create a context using the core profile as available in \OpenGL\ +version 3.2 and above, set the GLFW\_OPENGL\_PROFILE hint accordingly. Note that +as above you have to set a valid minimum version for this to work. + +Note that versions of Mac OS X before 10.7 does not support \OpenGL\ 3.0 or +later, and that at the time of this release, Mac OS X 10.7 only supports +forward-compatible \OpenGL\ 3.2 core profile contexts. Due to the way default +values work in \GLFW\, you do not need to specify either GLFW\_FORWARD\_COMPAT +or GLFW\_OPENGL\_PROFILE for this to work. + Besides the parameters that are given with the \textbf{glfwOpenWindow} and \textbf{glfwOpenWindowHint} functions, a few more properties of a window can be changed after the window has been opened, namely the window title, @@ -380,7 +404,7 @@ \textit{title} is a null terminated ISO~8859-1 (8-bit Latin~1) string that will be used as the window title. It will also be used as the application -name (for instance in the application list when using \texttt{ALT+TAB} +name (for instance in the application list when using \texttt{Alt+Tab} under Windows, or as the icon name when the window is iconified under the X Window System). The default window name is ``GLFW Window'', which will be used unless \textbf{glfwSetWindowTitle} is called after the window @@ -436,14 +460,19 @@ GLFW\_DEPTH\_BITS & Number of bits for the depth buffer.\\ \hline GLFW\_STENCIL\_BITS & Number of bits for the stencil buffer.\\ \hline GLFW\_REFRESH\_RATE & Vertical monitor refresh rate in Hz. Zero indicates an unknown or a default refresh rate.\\ \hline -GLFW\_ACCUM\_RED\_BITS & Number of bits for the red channel of the accumulator buffer.\\ \hline -GLFW\_ACCUM\_GREEN\_BITS & Number of bits for the green channel of the accumulator buffer.\\ \hline -GLFW\_ACCUM\_BLUE\_BITS & Number of bits for the blue channel of the accumulator buffer.\\ \hline -GLFW\_ACCUM\_ALPHA\_BITS & Number of bits for the alpha channel of the accumulator buffer.\\ \hline +GLFW\_ACCUM\_RED\_BITS & Number of bits for the red channel of the accumulation buffer.\\ \hline +GLFW\_ACCUM\_GREEN\_BITS & Number of bits for the green channel of the accumulation buffer.\\ \hline +GLFW\_ACCUM\_BLUE\_BITS & Number of bits for the blue channel of the accumulation buffer.\\ \hline +GLFW\_ACCUM\_ALPHA\_BITS & Number of bits for the alpha channel of the accumulation buffer.\\ \hline GLFW\_AUX\_BUFFERS & Number of auxiliary buffers.\\ \hline GLFW\_STEREO & GL\_TRUE if stereo rendering is supported, else GL\_FALSE.\\ \hline +GLFW\_WINDOW\_NO\_RESIZE & GL\_TRUE if the window cannot be resized by the user, else GL\_FALSE.\\ \hline GLFW\_FSAA\_SAMPLES & Number of multisampling buffer samples. Zero indicated multisampling is disabled.\\ \hline -GLFW\_WINDOW\_NO\_RESIZE & GL\_TRUE if the window cannot be resized, else GL\_FALSE.\\ \hline +GLFW\_OPENGL\_VERSION\_MAJOR & Major number of the actual version of the context.\\ \hline +GLFW\_OPENGL\_VERSION\_MINOR & Minor number of the actual version of the context.\\ \hline +GLFW\_OPENGL\_FORWARD\_COMPAT & GL\_TRUE if the context is forward-compatible, else GL\_FALSE.\\ \hline +GLFW\_OPENGL\_DEBUG\_CONTEXT & GL\_TRUE if the context is a debug context.\\ \hline +GLFW\_OPENGL\_PROFILE & The profile implemented by the context, or zero.\\ \hline \end{tabular} \end{center} \caption{Window parameters for \textbf{glfwGetWindowParam}} @@ -470,12 +499,12 @@ of how to use a window size callback function: \begin{lstlisting} -int WinWidth, WinHeight; +int windowWidth, windowHeight; void GLFWCALL WindowResize( int width, int height ) { - WinWidth = width; - WinHeight = height; + windowWidth = width; + windowHeight = height; } int main( void ) @@ -498,8 +527,9 @@ void glfwGetWindowSize( int *width, int *height ) \end{lstlisting} -The \textit{width} and \textit{height} arguments are filled out with the -current window dimensions. +The variables pointed to by \textit{width} and \textit{height} are set to the +current window dimensions. Note that either of these may be NULL; that +argument is then ignored. %------------------------------------------------------------------------- @@ -522,11 +552,14 @@ void glfwSwapBuffers( void ) \end{lstlisting} -Besides swapping the front and back rendering buffers, -\textbf{glfwSwapBuffers} also calls \textbf{glfwPollEvents}\footnote{This -behavior can be disabled by calling \textbf{glfwDisable} with the argument -GLFW\_AUTO\_POLL\_EVENTS.}. This is to ensure frequent polling of events, -such as keyboard and mouse input, and window reshaping events. +After swapping the front and back rendering buffers, \textbf{glfwSwapBuffers} +by default calls \textbf{glfwPollEvents}\footnote{This behavior can be disabled +by calling \textbf{glfwDisable} with the argument GLFW\_AUTO\_POLL\_EVENTS.}. +This is to ensure frequent polling of events, such as keyboard and mouse input, +and window reshaping events. Even if a given application does not use input +events, without frequent polling of events (at \emph{least} once every few +seconds), most modern window systems will flag the application as unresponsive +and may suggest that the user terminate it. Sometimes it can be useful to select when the buffer swap will occur. With the function \textbf{glfwSwapInterval} it is possible to select the @@ -546,11 +579,12 @@ vertical retrace. However, a swap interval of 1 generally gives better visual quality. -It should be noted that not all \OpenGL\ implementations and hardware -support this function, in which case \textbf{glfwSwapInterval} will have -no effect. Sometimes it is only possible to affect the swap interval -through driver settings (e.g. the display settings under Windows, or as an -environment variable setting under Unix). +It should be noted that not all \OpenGL\ implementations and hardware support +this function, in which case \textbf{glfwSwapInterval} will have no effect. ATI +Radeon cards under Microsoft Windows are especially notorious in this regard. +Sometimes it is only possible to affect the swap interval through driver +settings (e.g. the display settings under Windows, or as an environment +variable setting under Unix). %------------------------------------------------------------------------- @@ -567,9 +601,9 @@ \end{lstlisting} The argument \textit{list} is a vector of GLFWvidmode structures, and -\textit{maxcount} is the maximum number of video modes that your vector -can hold. \textbf{glfwGetVideoModes} will return the actual number of -video modes detected on the system. +\textit{maxcount} is the maximum number of video modes that your vector can +hold. \textbf{glfwGetVideoModes} will return the number of video modes detected +on the system, up to \textit{maxcount}. The GLFWvidmode structure looks like this: @@ -622,12 +656,16 @@ keyboard and mouse input is collected by checking for input events. This has do be done manually by calling either \textbf{glfwPollEvents} or \textbf{glfwSwapBuffers} (which implicitly calls \textbf{glfwPollEvents} -for you). Normally this does not have to be a concern, since +for you). Normally this is not a cause for concern, as \textbf{glfwSwapBuffers} is called every frame, which should be often -enough (about 10-100 times per second for a normal \OpenGL\ application). -One exception is when rendering is paused, and then the program waits for -input to begin animation again. In this case \textbf{glfwPollEvents} has -to be called repeatedly until any new input events arrive. +enough (about 10-100 times per second for a normal \OpenGL\ application) that +the window will feel responsive. + +One exception is when an application is updating its view only in response to input. +In this case the \textbf{glfwWaitEvents} is useful, as it blocks the calling +thread until an event arrives. The refresh callback, set with +\textbf{glfwSetWindowRefreshCallback}, may also be useful for such +applications, especially on unbuffered window systems. If it is not desirable that \textbf{glfwPollEvents is} called implicitly from \textbf{glfwSwapBuffers}, call \textbf{glfwDisable} with the argument @@ -640,7 +678,7 @@ %------------------------------------------------------------------------- \section{Keyboard Input} -\GLFW\ gives three options for getting keyboard input: +\GLFW\ provides three mechanisms for getting keyboard input: \begin{itemize} \item Manually polling the state of individual keys. @@ -649,12 +687,12 @@ \item Automatically receive characters, using a callback function. \end{itemize} -Depending on what the keyboard input will be used for, either of the -methods may be more suitable. The main difference between the two last -options is that while characters are affected by modifier keys (such as -shift), key state is independent of any modifier keys. Also, special keys -(such as function keys, cursor keys and modifier keys) are not reported to -the character callback function. +Depending on what the keyboard input will be used for, different methods may be +preferred. The main difference between the two last methods is that while +characters are affected by modifier keys (such as shift), key state is +independent of any modifier keys. Also, special keys (such as function keys, +cursor keys and modifier keys) are not reported to the character callback +function. %------------------------------------------------------------------------- \subsection{Key state} @@ -685,8 +723,8 @@ When sticky keys are enabled, a key will not be released until it is checked with \textbf{glfwGetKey}. To disable sticky keys, call \textbf{glfwDisable} witht the argument GLFW\_STICKY\_KEYS. Then all keys -that are not currently held down will be released, and future key releases -will take place immediately when the user releases the key, without +that are not currently held down will be released and future key releases +will take place immediately when the user releases the key without waiting for \textbf{glfwGetKey} to check the key. By default sticky keys are disabled. @@ -702,8 +740,8 @@ the second section. To avoid this problem, always disable sticky keys before leaving a section of a program. -An alternative to using \textbf{glfwGetKey} is to register a keyboard -input callback function with \textbf{glfwSetKeyCallback}: +A usually better alternative to using \textbf{glfwGetKey} is to register a +keyboard input callback function with \textbf{glfwSetKeyCallback}: \begin{lstlisting} void glfwSetKeyCallback( GLFWkeyfun cbfun ) @@ -715,8 +753,10 @@ or GLFW\_RELEASE. To unregister a callback function, call \textbf{glfwSetKeyCallback} with \textit{fun} = NULL. -A callback function can be useful in some situations. For instance it can -replace multiple \textbf{glfwGetKey} calls with a switch/case statement. +Using the callback function, you can be sure not to miss any key press or +release events, regardless of how many may have occurred during the last frame. +It also encourages event-based design, where the application responds only to +actual events instead of having to poll for every supported event. %------------------------------------------------------------------------- \subsection{Character input} @@ -731,7 +771,7 @@ The argument \textit{fun} is a pointer to a callback function. The callback function shall take two integer arguments. The first is a Unicode -character code, and the second is GLFW\_PRESS if the key that generated +code point, and the second is GLFW\_PRESS if the key that generated the character was pressed, or GLFW\_RELEASE if it was released. To unregister a callback function, call \textbf{glfwSetCharCallback} with \textit{fun} = NULL. @@ -788,16 +828,17 @@ %------------------------------------------------------------------------- \subsection{Mouse position} -To read the mouse position, you can use the function -\textbf{glfwGetMousePos}: +To query the position of the mouse cursor, call \textbf{glfwGetMousePos}: \begin{lstlisting} void glfwGetMousePos( int *x, int *y ) \end{lstlisting} -The arguments \textit{x} and \textit{y} point to integer variables that -will be updated with the current absolute mouse position. An alternative -is to use a callback function instead, which can be set with +The variables pointed to by \textit{x} and \textit{y} will be updated with the +current position of the mouse cursor relative to the upper-left corner of the +client area of the \GLFW\ window. + +An alternative is to use a callback function, which can be set with \textbf{glfwSetMousePosCallback}: \begin{lstlisting} @@ -805,8 +846,13 @@ \end{lstlisting} The function that \textit{fun} points to will be called every time the -mouse position changes. The first argument to the callback function is -the mouse x position, and the second argument is the mouse y position. +mouse cursor moves. The first argument to the callback function is +the cursor x-coordinate and the second the cursor y-coordinate, both relative +to the upper-left corner of the client area of the \GLFW\ window. + +Note that while the \textbf{glfwGetMousePos} function only reports the final +position after cursor movement events have been processed, using a callback +function lets the application see each and every such event. %------------------------------------------------------------------------- @@ -817,24 +863,24 @@ int glfwGetMouseButton( int button ) \end{lstlisting} -The argument \textit{button} can be one of the following mouse button -identifiers: GLFW\_MOUSE\_BUTTON\_LEFT, GLFW\_MOUSE\_BUTTON\_RIGHT or +The argument \textit{button} can be any \GLFW\ mouse button token, i.e. +GLFW\_MOUSE\_BUTTON\_1 through GLFW\_MOUSE\_BUTTON\_8 or one of +GLFW\_MOUSE\_BUTTON\_LEFT, GLFW\_MOUSE\_BUTTON\_RIGHT or GLFW\_MOUSE\_BUTTON\_MIDDLE. \textbf{glfwGetMouseButton} will return -GLFW\_PRESS (which is a non-zero value) if the corresponding mouse -button is held down, otherwise it will return GLFW\_RELEASE (which is -equal to zero). - -Just as it is possible to make keys ``sticky'', it is also possible to -make mouse buttons appear as held down until the button is checked for -with \textbf{glfwGetMouseButton}. To enable sticky mouse buttons, call +GLFW\_PRESS (which is a non-zero value) if the corresponding mouse button is +held down, otherwise it will return GLFW\_RELEASE (which is equal to zero). + +Just as it is possible to make keys ``sticky'', it is also possible to make +each mouse button appear as held down until it is checked with +\textbf{glfwGetMouseButton}. To enable sticky mouse buttons, call \textbf{glfwEnable} with the argument GLFW\_STICKY\_MOUSE\_BUTTONS. When sticky mouse buttons are enabled, a mouse button will not be released until it is checked with \textbf{glfwGetMouseButton}. To disable sticky mouse buttons, call \textbf{glfwDisable} with the argument GLFW\_STICKY\_MOUSE\_BUTTONS. Then all mouse buttons that are not -currently held down will be released, and future mouse button releases -will take place immediately when the user releases the mouse button, +currently held down will be released and future mouse button releases +will take place immediately when the user releases the mouse button without waiting for \textbf{glfwGetMouseButton} to check for the mouse button. By default sticky mouse buttons are disabled. @@ -854,9 +900,10 @@ %------------------------------------------------------------------------- \subsection{Mouse wheel} -Some mice have a mouse wheel, which can be thought of as a third mouse -axis. To get the position of the mouse wheel, call -\textbf{glfwGetMouseWheel}: +Some mice have a mouse wheel, most commonly used for vertical scrolling. Also, +most modern touchpads allow the user to scroll at least vertically, either by +reserving an area for scrolling or through multi-finger gestures. To get the +position of the mouse wheel, call \textbf{glfwGetMouseWheel}: \begin{lstlisting} int glfwGetMouseWheel( void ) @@ -864,7 +911,8 @@ The function returns an integer that represents the position of the mouse wheel. When the user turns the wheel, the wheel position will increase or -decrease. +decrease. Note that since scrolling hardware has no absolute position, \GLFW\ +simply sets the position to zero when the window is opened. It is also possible to register a callback function for mouse wheel events with the \textbf{glfwSetMouseWheelCallback} function: @@ -918,7 +966,7 @@ %------------------------------------------------------------------------- \subsection{Joystick capabilities} -First, it is often necessary to determine if a joystick is connected, and +First, it is often necessary to determine if a joystick is connected and what its capabilities are. To get this information the function \textbf{glfwGetJoystickParam} can be used: @@ -936,6 +984,10 @@ joystick, \textit{param} should be GLFW\_AXES or GLFW\_BUTTONS, respectively. +Note that \GLFW\ supports both D-pads and POVs, even though they are not +explicitly mentioned in the API. D-pads are exposed as a set of four buttons +and POVs are as two axes. + %------------------------------------------------------------------------- \subsection{Joystick position} @@ -948,8 +1000,8 @@ As with \textbf{glfwGetJoystickParam}, the \textit{joy} argument specifies which joystick to retrieve information from. The -\textit{numaxes} argument specifies how many axes to return, and the -\textit{pos} argument specifies an array in which all the axis positions +\textit{numaxes} argument specifies how many axes to return positions for and the +\textit{pos} argument specifies an array in which they are stored. The function returns the actual number of axes that were returned, which could be less than \textit{numaxes} if the joystick does not support all the requested axes, or if the joystick is not connected. @@ -987,12 +1039,12 @@ int numbuttons ) \end{lstlisting} -The function works just like the \textbf{glfwGetJoystickAxis} function, -except that it returns the state of joystick buttons instead of axis -positions. Each button in the array specified by the \textit{buttons} -argument can be either GLFW\_PRESS or GLFW\_RELEASE, telling if the -corresponding button is currently held down or not. Unsupported buttons -will have the value GLFW\_RELEASE. +The function works just like the \textbf{glfwGetJoystickAxis} function, except +that it returns the state of joystick buttons instead of axis positions. Each +button in the array specified by the \textit{buttons} argument can be either +GLFW\_PRESS or GLFW\_RELEASE, indicating whether the corresponding button is +currently held down or not. Unsupported buttons will have the value +GLFW\_RELEASE. %------------------------------------------------------------------------- @@ -1196,8 +1248,8 @@ \end{enumerate} A list of official extensions, together with their definitions, can be -found at the \textit{OpenGL Extension Registry} -(\url{http://oss.sgi.com/projects/ogl-sample/registry/}). +found at the \textit{OpenGL Registry} +(\url{http://www.opengl.org/registry/}). To use a certain extension, the following steps must be performed: @@ -1212,6 +1264,12 @@ Please note that this chapter covers some advanced topics, and is quite specific to the C programming language. +For a much easier way to get access to \OpenGL\ extensions, you should probably +use a dedicated extension loading library such as GLEW or GLee. This kind of +library greatly reduces the amount of work necessary to use \OpenGL\ +extensions. GLEW in particular has been extensively tested with and works well +with \GLFW . + %------------------------------------------------------------------------- \section{Compile Time Check} @@ -1226,25 +1284,25 @@ // Extension is supported by the include files #else // Extension is not supported by the include files - // Update your file! + // Get a more up-to-date file! #endif \end{lstlisting} %------------------------------------------------------------------------- \section{Runtime Check} -Even if the compiler include files have defined all the necessary tokens, -the target system may not support the extension (perhaps it has a -different graphic card with a different \OpenGL\ implementation, or it has -an older driver). That is why it is necessary to do a run time check for -the extension support as well. This is done with the \GLFW\ function -\textbf{glfwExtensionSupported}, which has the C syntax: +Even if the compiler include files have defined all the necessary tokens, a +given machine may not actually support the extension (it may have a graphics +card with a different \OpenGL\ implementation, or an older driver). That is why +it is necessary to do a run time check for the extension support as well. This +is done with the \GLFW\ function \textbf{glfwExtensionSupported}, which has the +C syntax: \begin{lstlisting} int glfwExtensionSupported( const char *extension ) \end{lstlisting} -The argument \textit{extension} is a null terminated ISO~8859-1 string +The argument \textit{extension} is a null terminated ASCII string with the extension name. \textbf{glfwExtensionSupported} returns GL\_TRUE if the extension is supported, otherwise it returns GL\_FALSE. @@ -1262,7 +1320,7 @@ glfwExtensionSupported( "GL_ARB_multitexture" ); #else // Extension is not supported by the include files - // Update your file! + // Get a more up-to-date file! multitexture_supported = GL_FALSE; #endif \end{lstlisting} @@ -1283,16 +1341,16 @@ %------------------------------------------------------------------------- \section{Fetching Function Pointers} -Some extensions (not all) require the use of new \OpenGL\ functions, which -are not necessarily defined by your link libraries. Thus it is necessary -to get the function pointers dynamically at run time. This is done with -the \GLFW\ function \textbf{glfwGetProcAddress}: +Some extensions, though not all, require the use of new \OpenGL\ functions. +These entry points are not necessarily exposed by your link libraries, making +it necessary to find them dynamically at run time. You can retrieve these +entry points using the \textbf{glfwGetProcAddress} function: \begin{lstlisting} void * glfwGetProcAddress( const char *procname ) \end{lstlisting} -The argument \textit{procname} is a null terminated ISO~8859-1 string +The argument \textit{procname} is a null terminated ASCII string holding the name of the \OpenGL\ function. \textbf{glfwGetProcAddress} returns the address to the function if the function is available, otherwise NULL is returned. @@ -1310,21 +1368,20 @@ \begin{itemize} \item Do not use the function name for the variable name. Use something - similar (perhaps with a prefix or suffix), and then use + similar, perhaps by adding a prefix or suffix, and then use \texttt{\#define} to map the function name to your variable. \item The standard type definition naming convention for function pointers is \texttt{PFN\textit{xxxx}PROC}, where \texttt{\textit{xxxx}} is the uppercase version of the function name (e.g. - \texttt{PFNGLACTIVETEXTUREARBPROC}). Either make sure that a - compatible \texttt{gl.h} and/or \texttt{glext.h} file is used by - your compiler and rely on it to do the type definitions for you, or - use a custom type definition naming convention (e.g. - \texttt{\textit{xxxx}\_T} or something) and do the type definitions - yourself. + \texttt{PFNGLACTIVETEXTUREARBPROC}). Either make sure your compiler uses + a compatible \texttt{gl.h} and/or \texttt{glext.h} file and rely on it to + define these types, or use define the types yourself using a different + naming convention (for example \texttt{\textit{xxxx}\_T}) and do the + type definitions yourself. \end{itemize} -Here is an example of how to do it (here we use our own function pointer -type defintion): +Here is a slightly longer example of how to use an extension, this time using +our own function pointer type definition): \begin{lstlisting} // Type definition of the function pointer @@ -1357,27 +1414,25 @@ #endif \end{lstlisting} -Please note that the code example is not 100\% complete. First of all, -the GL\_ARB\_multitexture extension defines many more functions than the -single function that the code example defines. Secondly, checking if an -extension is supported using \textbf{glfwExtensionSupported} is not enough -to ensure that the corresponding functions will be valid. You also need to -check if the function pointers returned by \textbf{glfwGetProcAddress} are -non-NULL values. +Even this example leaves some things to be desired. First of all, the +GL\_ARB\_multitexture extension defines many more functions than the single +function used above. Secondly, checking if an extension is supported using +\textbf{glfwExtensionSupported} is not enough to ensure that the corresponding +functions will be valid. You also need to check that the all function pointers +returned by \textbf{glfwGetProcAddress} are non-NULL. %------------------------------------------------------------------------- \subsection{Function pointer type definitions} To make a function pointer type definition, you need to know the function prototype. This can often be found in the extension definitions (e.g. at -the \textit{OpenGL Extension Registry}). All the functions that are -defined for an extension are listed with their C prototype definitions -under the section \textit{New Procedures and Functions} in the extension -definition. +the \textit{OpenGL Registry}). All the entry points that are defined by an +extension are listed with their C prototype definitions under the section +\textit{New Procedures and Functions} in the extension definition. For instance, if we look at the definition of the GL\_ARB\_texture\_compression extension, we find a list of new functions. -One of the functions looks like this: +One of these is declared like this: \begin{lstlisting} void GetCompressedTexImageARB(enum target, int lod, void *img); @@ -1396,9 +1451,8 @@ \texttt{(APIENTRY * \textit{xxxx}\_T)}, where \textit{xxxx} is the uppercase version of the name (according to the proposed naming convention). The keyword \texttt{APIENTRY} is needed to be compatible -between different platforms. The \GLFW\ include file \texttt{GL/glfw.h} -always makes sure that \texttt{APIENTRY} is properly defined, regardless -of which platform the program is compiled on. +between different platforms. The \GLFW\ header file \texttt{GL/glfw.h} +ensures that \texttt{APIENTRY} is properly defined on all supported platforms. In other words, for the function \textbf{glGetCompressedTexImageARB} we get: @@ -1413,69 +1467,40 @@ %------------------------------------------------------------------------- % Multi Threading %------------------------------------------------------------------------- -\chapter{Multi Threading} +\chapter{Multi-threading} \thispagestyle{fancy} -Multi threading may not seem to be related to \OpenGL , and thus it may -seem to be out of the scope of \GLFW\ to provide multi threading support. -The initial intent of \GLFW\ was to provide the very basic functionality -needed to create an \OpenGL\ application, but as \GLFW\ grew to be a -platform for portable \OpenGL\ applications, it felt natural to include an -operating system independent multi threading layer in \GLFW . Hopefully -this will make \GLFW\ more attractive for advanced \OpenGL\ developers, as -well as inspire more programmers to use multi threading. - -In this chapter you will learn about multi threading and how you can use -\GLFW\ to create multi threaded applications. +The initial intent of \GLFW\ was to provide only the basic functionality +needed to create an \OpenGL\ application, but as \GLFW\ grew to be a +platform for portable \OpenGL\ applications, it came to include a basic +operating system independent multi-threading layer. -%------------------------------------------------------------------------- -\section{Why Use Multi Threading?} -Multi threading is not a new technology, neither is it an advanced -technology. In fact, multi threading could be found as early as 1985 in -consumer computers, namely the Amiga, whose operating system implemented -preemptive multi threading. During the early and mid 90's, consumer level -operating systems emerged for Intel based PCs that supported multi -threading. Still, over a decade later, many programmers, especially game -programmers, feel reluctant to using threading in their applications. -Why? - -There are probably many reasons that one can think of to avoid multi -threading, but many of them are based on ignorance and myths. The foremost -reason for not using multi threading is probably that it requires a new -way of thinking, but once accepted, threaded programming can take your -program to new performance levels and solve many problematic timing and -synchronization issues. - -In the following sections a few key reasons for using multi threaded -programming will be presented. +However, this layer is fairly isolated from the rest of \GLFW\ and most of the +rest of the API is \emph{not} thread-safe. This is important to keep in mind +when using \GLFW\ in a multi-threaded application. %------------------------------------------------------------------------- -\subsection{Take advantage of multi processor systems} -If an application is divided into several threads that can execute -concurrently, these threads will automatically execute on separate -processors in parallel on an SMP (symmetric multi-processing) system. - -Multi processor platforms are becoming increasingly common, in many -different forms. The classic multi processor system is based around several -processor chips that execute in parallel. More recent solutions focus on -placing several processor cores on a single chip. These cores may be -a few identical general purpose processors, or they may be several smaller, -specialized cores, such as in the Cell architecture by IBM, which is -used in the Playstation~3 game console. - -Another emerging technology known as SMT (symmetric multi threading) is -also becoming more and more popular. In short, it takes a single physical -processor, and divides it into several logical processors that can execute -separate threads. The idea behind this is to better utilize all available -CPU resources by running independent pieces of code on the same physical -CPU. - -The problem with SMP systems is of course that if an application is not -multi threaded, only one of the available processors will actually be -used to execute the application. This is probably the most important -aspect of multi threading. For SMP systems to be really useful, programs -\emph{must} be multi threaded. +\section{Why Use Multi-threading?} +Most computers being sold today have at least two CPU cores and many have four +or more. Even the cheapest netbooks have a semblance of multi-core in the form +of hyper-threading. With the individual cores not getting much faster, +increased performance can only be had by using the additional CPU cores. + +However, the \OpenGL\ API itself is single-threaded and a given context should +only be used by a single thread at a time. This means that the primary use for +multi-threading in the area of computer graphics isn't to distribute rendering +across multiple threads, but rather to relieve the render thread from doing +other kinds of work. Examples include collision and dynamics ticks, audio +processing and playback, networking and even rendering steps that don't involve +calling \OpenGL . + +The downside of using multi-threading is the added complexity that comes from +making a program non-sequential and to ensure that one thread does not +interfere with the data being used by another. Whether or not it is worth +making a given application multi-threaded is a complex question and as always, +there is no substitute for data and experience. Profile, measure and +experiment. %------------------------------------------------------------------------- @@ -1483,8 +1508,8 @@ In many situations, an application is placed in a wait state, waiting for a task to complete. Examples of such situations are: waiting for a file to load from disk, waiting for a vertical retrace (when using a double -buffered display, such as a \GLFW\ \OpenGL\ window), waiting for a display -to be cleared or data to be sent to the graphic card. +buffered display, such as a \GLFW\ window), waiting for a display +to be cleared or data to be sent to the graphics card. Some or all of these operations can be done asynchronously, if the conditions are right and the operating system supports it, but a simple @@ -1513,7 +1538,7 @@ %------------------------------------------------------------------------- \section{How To Use Multi Threading} -In general, every program runs as a process, which has its own memory +In general, every process, i.e. instance of a program, has its own memory space and its own set of resources, such as opened files etc. As a consequence, each process is coupled with a fairly large set of state. When the processor changes the execution from one process to another diff -Nru glfw-2.6/docs/Reference.pdf glfw-2.7.2/docs/Reference.pdf --- glfw-2.6/docs/Reference.pdf 2007-09-01 18:42:24.000000000 +0000 +++ glfw-2.7.2/docs/Reference.pdf 2011-08-12 12:21:01.000000000 +0000 @@ -1,2050 +1,2008 @@ %PDF-1.4 % -5 0 obj +1 0 obj << /S /GoTo /D (chapter.1) >> endobj -8 0 obj +4 0 obj (1 Introduction) endobj -9 0 obj +5 0 obj << /S /GoTo /D (chapter.2) >> endobj -12 0 obj +8 0 obj (2 GLFW Operation Overview) endobj -13 0 obj +9 0 obj << /S /GoTo /D (section.2.1) >> endobj -16 0 obj +12 0 obj (2.1 The GLFW Window) endobj -17 0 obj +13 0 obj << /S /GoTo /D (section.2.2) >> endobj -20 0 obj +16 0 obj (2.2 The GLFW Event Loop) endobj -21 0 obj +17 0 obj << /S /GoTo /D (section.2.3) >> endobj -24 0 obj +20 0 obj (2.3 Callback Functions) endobj -25 0 obj +21 0 obj << /S /GoTo /D (section.2.4) >> endobj -28 0 obj +24 0 obj (2.4 Threads) endobj -29 0 obj +25 0 obj << /S /GoTo /D (chapter.3) >> endobj -32 0 obj +28 0 obj (3 Function Reference) endobj -33 0 obj +29 0 obj << /S /GoTo /D (section.3.1) >> endobj -36 0 obj +32 0 obj (3.1 GLFW Initialization and Termination) endobj -37 0 obj +33 0 obj << /S /GoTo /D (subsection.3.1.1) >> endobj -40 0 obj +36 0 obj (3.1.1 glfwInit) endobj -41 0 obj +37 0 obj << /S /GoTo /D (subsection.3.1.2) >> endobj -44 0 obj +40 0 obj (3.1.2 glfwTerminate) endobj -45 0 obj +41 0 obj << /S /GoTo /D (subsection.3.1.3) >> endobj -48 0 obj +44 0 obj (3.1.3 glfwGetVersion) endobj -49 0 obj +45 0 obj << /S /GoTo /D (section.3.2) >> endobj -52 0 obj +48 0 obj (3.2 Window Handling) endobj -53 0 obj +49 0 obj << /S /GoTo /D (subsection.3.2.1) >> endobj -56 0 obj +52 0 obj (3.2.1 glfwOpenWindow) endobj -57 0 obj +53 0 obj << /S /GoTo /D (subsection.3.2.2) >> endobj -60 0 obj +56 0 obj (3.2.2 glfwOpenWindowHint) endobj -61 0 obj +57 0 obj << /S /GoTo /D (subsection.3.2.3) >> endobj -64 0 obj +60 0 obj (3.2.3 glfwCloseWindow) endobj -65 0 obj +61 0 obj << /S /GoTo /D (subsection.3.2.4) >> endobj -68 0 obj +64 0 obj (3.2.4 glfwSetWindowCloseCallback) endobj -69 0 obj +65 0 obj << /S /GoTo /D (subsection.3.2.5) >> endobj -72 0 obj +68 0 obj (3.2.5 glfwSetWindowTitle) endobj -73 0 obj +69 0 obj << /S /GoTo /D (subsection.3.2.6) >> endobj -76 0 obj +72 0 obj (3.2.6 glfwSetWindowSize) endobj -77 0 obj +73 0 obj << /S /GoTo /D (subsection.3.2.7) >> endobj -80 0 obj +76 0 obj (3.2.7 glfwSetWindowPos) endobj -81 0 obj +77 0 obj << /S /GoTo /D (subsection.3.2.8) >> endobj -84 0 obj +80 0 obj (3.2.8 glfwGetWindowSize) endobj -85 0 obj +81 0 obj << /S /GoTo /D (subsection.3.2.9) >> endobj -88 0 obj +84 0 obj (3.2.9 glfwSetWindowSizeCallback) endobj -89 0 obj +85 0 obj << /S /GoTo /D (subsection.3.2.10) >> endobj -92 0 obj +88 0 obj (3.2.10 glfwIconifyWindow) endobj -93 0 obj +89 0 obj << /S /GoTo /D (subsection.3.2.11) >> endobj -96 0 obj +92 0 obj (3.2.11 glfwRestoreWindow) endobj -97 0 obj +93 0 obj << /S /GoTo /D (subsection.3.2.12) >> endobj -100 0 obj +96 0 obj (3.2.12 glfwGetWindowParam) endobj -101 0 obj +97 0 obj << /S /GoTo /D (subsection.3.2.13) >> endobj -104 0 obj +100 0 obj (3.2.13 glfwSwapBuffers) endobj -105 0 obj +101 0 obj << /S /GoTo /D (subsection.3.2.14) >> endobj -108 0 obj +104 0 obj (3.2.14 glfwSwapInterval) endobj -109 0 obj +105 0 obj << /S /GoTo /D (subsection.3.2.15) >> endobj -112 0 obj +108 0 obj (3.2.15 glfwSetWindowRefreshCallback) endobj -113 0 obj +109 0 obj << /S /GoTo /D (section.3.3) >> endobj -116 0 obj +112 0 obj (3.3 Video Modes) endobj -117 0 obj +113 0 obj << /S /GoTo /D (subsection.3.3.1) >> endobj -120 0 obj +116 0 obj (3.3.1 glfwGetVideoModes) endobj -121 0 obj +117 0 obj << /S /GoTo /D (subsection.3.3.2) >> endobj -124 0 obj +120 0 obj (3.3.2 glfwGetDesktopMode) endobj -125 0 obj +121 0 obj << /S /GoTo /D (section.3.4) >> endobj -128 0 obj +124 0 obj (3.4 Input Handling) endobj -129 0 obj +125 0 obj << /S /GoTo /D (subsection.3.4.1) >> endobj -132 0 obj +128 0 obj (3.4.1 glfwPollEvents) endobj -133 0 obj +129 0 obj << /S /GoTo /D (subsection.3.4.2) >> endobj -136 0 obj +132 0 obj (3.4.2 glfwWaitEvents) endobj -137 0 obj +133 0 obj << /S /GoTo /D (subsection.3.4.3) >> endobj -140 0 obj +136 0 obj (3.4.3 glfwGetKey) endobj -141 0 obj +137 0 obj << /S /GoTo /D (subsection.3.4.4) >> endobj -144 0 obj +140 0 obj (3.4.4 glfwGetMouseButton) endobj -145 0 obj +141 0 obj << /S /GoTo /D (subsection.3.4.5) >> endobj -148 0 obj +144 0 obj (3.4.5 glfwGetMousePos) endobj -149 0 obj +145 0 obj << /S /GoTo /D (subsection.3.4.6) >> endobj -152 0 obj +148 0 obj (3.4.6 glfwSetMousePos) endobj -153 0 obj +149 0 obj << /S /GoTo /D (subsection.3.4.7) >> endobj -156 0 obj +152 0 obj (3.4.7 glfwGetMouseWheel) endobj -157 0 obj +153 0 obj << /S /GoTo /D (subsection.3.4.8) >> endobj -160 0 obj +156 0 obj (3.4.8 glfwSetMouseWheel) endobj -161 0 obj +157 0 obj << /S /GoTo /D (subsection.3.4.9) >> endobj -164 0 obj +160 0 obj (3.4.9 glfwSetKeyCallback) endobj -165 0 obj +161 0 obj << /S /GoTo /D (subsection.3.4.10) >> endobj -168 0 obj +164 0 obj (3.4.10 glfwSetCharCallback) endobj -169 0 obj +165 0 obj << /S /GoTo /D (subsection.3.4.11) >> endobj -172 0 obj +168 0 obj (3.4.11 glfwSetMouseButtonCallback) endobj -173 0 obj +169 0 obj << /S /GoTo /D (subsection.3.4.12) >> endobj -176 0 obj +172 0 obj (3.4.12 glfwSetMousePosCallback) endobj -177 0 obj +173 0 obj << /S /GoTo /D (subsection.3.4.13) >> endobj -180 0 obj +176 0 obj (3.4.13 glfwSetMouseWheelCallback) endobj -181 0 obj +177 0 obj << /S /GoTo /D (subsection.3.4.14) >> endobj -184 0 obj +180 0 obj (3.4.14 glfwGetJoystickParam) endobj -185 0 obj +181 0 obj << /S /GoTo /D (subsection.3.4.15) >> endobj -188 0 obj +184 0 obj (3.4.15 glfwGetJoystickPos) endobj -189 0 obj +185 0 obj << /S /GoTo /D (subsection.3.4.16) >> endobj -192 0 obj +188 0 obj (3.4.16 glfwGetJoystickButtons) endobj -193 0 obj +189 0 obj << /S /GoTo /D (section.3.5) >> endobj -196 0 obj +192 0 obj (3.5 Timing) endobj -197 0 obj +193 0 obj << /S /GoTo /D (subsection.3.5.1) >> endobj -200 0 obj +196 0 obj (3.5.1 glfwGetTime) endobj -201 0 obj +197 0 obj << /S /GoTo /D (subsection.3.5.2) >> endobj -204 0 obj +200 0 obj (3.5.2 glfwSetTime) endobj -205 0 obj +201 0 obj << /S /GoTo /D (subsection.3.5.3) >> endobj -208 0 obj +204 0 obj (3.5.3 glfwSleep) endobj -209 0 obj +205 0 obj << /S /GoTo /D (section.3.6) >> endobj -212 0 obj +208 0 obj (3.6 Image and Texture Loading) endobj -213 0 obj +209 0 obj << /S /GoTo /D (subsection.3.6.1) >> endobj -216 0 obj +212 0 obj (3.6.1 glfwReadImage) endobj -217 0 obj +213 0 obj << /S /GoTo /D (subsection.3.6.2) >> endobj -220 0 obj +216 0 obj (3.6.2 glfwReadMemoryImage) endobj -221 0 obj +217 0 obj << /S /GoTo /D (subsection.3.6.3) >> endobj -224 0 obj +220 0 obj (3.6.3 glfwFreeImage) endobj -225 0 obj +221 0 obj << /S /GoTo /D (subsection.3.6.4) >> endobj -228 0 obj +224 0 obj (3.6.4 glfwLoadTexture2D) endobj -229 0 obj +225 0 obj << /S /GoTo /D (subsection.3.6.5) >> endobj -232 0 obj +228 0 obj (3.6.5 glfwLoadMemoryTexture2D) endobj -233 0 obj +229 0 obj << /S /GoTo /D (subsection.3.6.6) >> endobj -236 0 obj +232 0 obj (3.6.6 glfwLoadTextureImage2D) endobj -237 0 obj +233 0 obj << /S /GoTo /D (section.3.7) >> endobj -240 0 obj +236 0 obj (3.7 OpenGL Extension Support) endobj -241 0 obj +237 0 obj << /S /GoTo /D (subsection.3.7.1) >> endobj -244 0 obj +240 0 obj (3.7.1 glfwExtensionSupported) endobj -245 0 obj +241 0 obj << /S /GoTo /D (subsection.3.7.2) >> endobj -248 0 obj +244 0 obj (3.7.2 glfwGetProcAddress) endobj -249 0 obj +245 0 obj << /S /GoTo /D (subsection.3.7.3) >> endobj -252 0 obj +248 0 obj (3.7.3 glfwGetGLVersion) endobj -253 0 obj +249 0 obj << /S /GoTo /D (section.3.8) >> endobj -256 0 obj +252 0 obj (3.8 Threads) endobj -257 0 obj +253 0 obj << /S /GoTo /D (subsection.3.8.1) >> endobj -260 0 obj +256 0 obj (3.8.1 glfwCreateThread) endobj -261 0 obj +257 0 obj << /S /GoTo /D (subsection.3.8.2) >> endobj -264 0 obj +260 0 obj (3.8.2 glfwDestroyThread) endobj -265 0 obj +261 0 obj << /S /GoTo /D (subsection.3.8.3) >> endobj -268 0 obj +264 0 obj (3.8.3 glfwWaitThread) endobj -269 0 obj +265 0 obj << /S /GoTo /D (subsection.3.8.4) >> endobj -272 0 obj +268 0 obj (3.8.4 glfwGetThreadID) endobj -273 0 obj +269 0 obj << /S /GoTo /D (section.3.9) >> endobj -276 0 obj +272 0 obj (3.9 Mutexes) endobj -277 0 obj +273 0 obj << /S /GoTo /D (subsection.3.9.1) >> endobj -280 0 obj +276 0 obj (3.9.1 glfwCreateMutex) endobj -281 0 obj +277 0 obj << /S /GoTo /D (subsection.3.9.2) >> endobj -284 0 obj +280 0 obj (3.9.2 glfwDestroyMutex) endobj -285 0 obj +281 0 obj << /S /GoTo /D (subsection.3.9.3) >> endobj -288 0 obj +284 0 obj (3.9.3 glfwLockMutex) endobj -289 0 obj +285 0 obj << /S /GoTo /D (subsection.3.9.4) >> endobj -292 0 obj +288 0 obj (3.9.4 glfwUnlockMutex) endobj -293 0 obj +289 0 obj << /S /GoTo /D (section.3.10) >> endobj -296 0 obj +292 0 obj (3.10 Condition Variables) endobj -297 0 obj +293 0 obj << /S /GoTo /D (subsection.3.10.1) >> endobj -300 0 obj +296 0 obj (3.10.1 glfwCreateCond) endobj -301 0 obj +297 0 obj << /S /GoTo /D (subsection.3.10.2) >> endobj -304 0 obj +300 0 obj (3.10.2 glfwDestroyCond) endobj -305 0 obj +301 0 obj << /S /GoTo /D (subsection.3.10.3) >> endobj -308 0 obj +304 0 obj (3.10.3 glfwWaitCond) endobj -309 0 obj +305 0 obj << /S /GoTo /D (subsection.3.10.4) >> endobj -312 0 obj +308 0 obj (3.10.4 glfwSignalCond) endobj -313 0 obj +309 0 obj << /S /GoTo /D (subsection.3.10.5) >> endobj -316 0 obj +312 0 obj (3.10.5 glfwBroadcastCond) endobj -317 0 obj +313 0 obj << /S /GoTo /D (section.3.11) >> endobj -320 0 obj +316 0 obj (3.11 Miscellaneous) endobj -321 0 obj +317 0 obj << /S /GoTo /D (subsection.3.11.1) >> endobj -324 0 obj +320 0 obj (3.11.1 glfwEnable/glfwDisable) endobj -325 0 obj +321 0 obj << /S /GoTo /D (subsection.3.11.2) >> endobj -328 0 obj +324 0 obj (3.11.2 glfwGetNumberOfProcessors) endobj +325 0 obj +<< /S /GoTo /D (appendix.A) >> +endobj +328 0 obj +(A GLFW Compatibility) +endobj 329 0 obj -<< /S /GoTo /D [330 0 R /FitH ] >> +<< /S /GoTo /D (section.A.1) >> endobj -332 0 obj << -/Length 310 -/Filter /FlateDecode ->> -stream -xuOO0 >5=2&&U0v([6Mj _4 8%i&D?cv]$k`S - Y\Ay6z*.j"d% ,J -e' U9B]pP[-헱th6dKw~w,3/}^M;I1 %21"MTKuԧ6ATB#U쿐hmHFڟ7=$RD"@tB,BC9\GQ0"Mm&=Fü(۴~W{aΊw -endstream +332 0 obj +(A.1 ICCCM and EWMH Conformance) endobj -330 0 obj << -/Type /Page -/Contents 332 0 R -/Resources 331 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 338 0 R ->> endobj -333 0 obj << -/D [330 0 R /FitH 765.769] ->> endobj -334 0 obj << -/D [330 0 R /FitH 740.862] ->> endobj -331 0 obj << -/Font << /F27 335 0 R /F30 336 0 R /F26 337 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -341 0 obj << -/Length 590 +333 0 obj +<< /S /GoTo /D (section.A.2) >> +endobj +336 0 obj +(A.2 GLX Extensions) +endobj +337 0 obj +<< /S /GoTo /D (section.A.3) >> +endobj +340 0 obj +(A.3 WGL Extensions) +endobj +341 0 obj +<< /S /GoTo /D (section.A.4) >> +endobj +344 0 obj +(A.4 OpenGL 3.0+ on Mac OS X) +endobj +345 0 obj +<< /S /GoTo /D [346 0 R /FitH ] >> +endobj +348 0 obj << +/Length 343 /Filter /FlateDecode >> stream -xڥUn0+Xql^&mg4մQ"U] `;s9γ46^9։!HȉM^9LmwA - Ek*blI7hϞLif+r'[IWE'CM%@ #>V&5qNY5 -]誈(9Vۚy8t-lp> RM ŬPucR5MfGC[QB7A HJҊ̩IbBl@ -Ẁ@ٟCQ!^SF82[~דnj_?#Nl̞Ծذibf4ƱD^5-;+j&S1ZgZr&v8Х]@\==ŸoR2m%1M7IJTcUg:u)^Ȣ1iIåvjڻ#ml"cĬ?0g;huLx3>ac2}N/CD(c~c! +xڕRKK@W13f9b#ڴ҈ѿfZD$oW` ӄ~yt"@,C%Z@A#%TKӫC6.*yN0XT> endobj -342 0 obj << -/D [340 0 R /FitH 765.769] +349 0 obj << +/D [346 0 R /FitH 778.724] >> endobj -343 0 obj << -/D [340 0 R /FitH 598.545] +350 0 obj << +/D [346 0 R /FitH 740.862] >> endobj -339 0 obj << -/Font << /F27 335 0 R /F33 344 0 R /F30 336 0 R >> +347 0 obj << +/Font << /F27 351 0 R /F30 352 0 R /F26 353 0 R >> /ProcSet [ /PDF /Text ] >> endobj -347 0 obj << -/Length 276 +357 0 obj << +/Length 654 /Filter /FlateDecode >> stream -xuQMO0+z,~XGLp`@۸[HjZHv7}yf=`2}d $rFy -)̀&!Hpd8gRӽ 2 2ʛ.+cU<ڍʪʆoڴ?F-DWQa<(I+-ie7]ߞ+^1eǟK[eD7vԳiXOķQ+'$L醔2T02!L(d  +xڥUn0+t::mpREDD%R ŴR&)/&9q7ofqg˵#Wwvc  Ğm(tOf]H7;56s_1fF"o}M)'g7>a ؃H4|ve J endstream endobj -346 0 obj << +356 0 obj << /Type /Page -/Contents 347 0 R -/Resources 345 0 R +/Contents 357 0 R +/Resources 355 0 R /MediaBox [0 0 595.276 841.89] -/Parent 338 0 R +/Parent 354 0 R >> endobj -348 0 obj << -/D [346 0 R /FitH 765.769] +358 0 obj << +/D [356 0 R /FitH 778.724] +>> endobj +359 0 obj << +/D [356 0 R /FitH 598.545] >> endobj -345 0 obj << -/Font << /F33 344 0 R >> +355 0 obj << +/Font << /F27 351 0 R /F33 360 0 R /F30 352 0 R >> /ProcSet [ /PDF /Text ] >> endobj -382 0 obj << +394 0 obj << /Length 911 /Filter /FlateDecode >> stream -xMS0VwemSeD꬟~ÛbJZz ӒOtoq  oap FC/ܸ6(QZ08x%ln0lF ܲ%h`FYbAaYQr5*᪋v}PQފgW(0-e]L@>rm#N Pͼ1n>9dfİ!v(9կw+Fveh[@\MDzz /rVG(Q8R AMY/c08]!*!w.:e$ҟđ?Sli43\Y=Gs.Rͤ&Uab-~^FAa0U?_K~]lepgQH0n4G!^~72[j$%: ҭ%+mJa?9uC՜/d֦\`wуlf,#YAj+@F٘2( $H_d. Áyq -@|f!MOT -H<0[|4`o%a0d|.,N6-V -srm#N Pͼ1n>9dfİ!v(9կw+Fveh[@\MDzz /rVG(Q8R AMY/c08]!*!w.:e$ҟđ?Sli43\Y=Gs.Rͤ&Uab-~^FAa0U?_K~]lepgQH0n4G!^~E 72[j$%: ҭ%۔0Nes6F +4DCՠ/d\aw=f>dd.g@ҬEAB2AzU |f2ft&Xs'o$XE=(1(Xp4BI  4MKu·|(d$O{mG⋧_<,r h"x spwͩ4d#Cm ]9D PP/-e\֒s dؠueܪ+,U^|l:p]/sZ>Ԋ꟡@İ r8*)AG? endstream endobj -381 0 obj << +393 0 obj << /Type /Page -/Contents 382 0 R -/Resources 380 0 R +/Contents 394 0 R +/Resources 392 0 R /MediaBox [0 0 595.276 841.89] -/Parent 338 0 R -/Annots [ 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R 357 0 R 358 0 R 359 0 R 360 0 R 361 0 R 362 0 R 363 0 R 364 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 370 0 R 371 0 R 372 0 R 373 0 R 374 0 R 375 0 R 376 0 R 377 0 R 378 0 R ] +/Parent 354 0 R +/Annots [ 361 0 R 362 0 R 363 0 R 364 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 370 0 R 371 0 R 372 0 R 373 0 R 374 0 R 375 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R ] >> endobj -349 0 obj << +361 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [69.87 577.991 147.429 587.631] -/Subtype /Link /A << /S /GoTo /D (chapter.1) >> >> endobj -350 0 obj << +362 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [69.87 551.449 219.516 563.173] -/Subtype /Link /A << /S /GoTo /D (chapter.2) >> >> endobj -351 0 obj << +363 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 540.006 203.502 549.504] -/Subtype /Link /A << /S /GoTo /D (section.2.1) >> >> endobj -352 0 obj << +364 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 524.204 217.684 535.954] -/Subtype /Link /A << /S /GoTo /D (section.2.2) >> >> endobj -353 0 obj << +365 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 512.907 197.861 522.405] -/Subtype /Link /A << /S /GoTo /D (section.2.3) >> >> endobj -354 0 obj << +366 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 499.358 148.455 508.856] -/Subtype /Link /A << /S /GoTo /D (section.2.4) >> >> endobj -355 0 obj << +367 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [69.87 474.878 179.218 484.518] -/Subtype /Link /A << /S /GoTo /D (chapter.3) >> >> endobj -356 0 obj << +368 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 461.351 277.082 470.848] -/Subtype /Link /A << /S /GoTo /D (section.3.1) >> >> endobj -357 0 obj << +369 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 445.549 183.375 457.299] -/Subtype /Link /A << /S /GoTo /D (subsection.3.1.1) >> >> endobj -358 0 obj << +370 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 432 212.294 443.75] -/Subtype /Link /A << /S /GoTo /D (subsection.3.1.2) >> >> endobj -359 0 obj << +371 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 418.45 217.301 430.201] -/Subtype /Link /A << /S /GoTo /D (subsection.3.1.3) >> >> endobj -360 0 obj << +372 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 404.901 193.509 416.652] -/Subtype /Link /A << /S /GoTo /D (section.3.2) >> >> endobj -361 0 obj << +373 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 391.352 228.713 403.102] -/Subtype /Link /A << /S /GoTo /D (subsection.3.2.1) >> >> endobj -362 0 obj << +374 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 377.803 248.109 389.553] -/Subtype /Link /A << /S /GoTo /D (subsection.3.2.2) >> >> endobj -363 0 obj << +375 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 364.254 229.934 376.004] -/Subtype /Link /A << /S /GoTo /D (subsection.3.2.3) >> >> endobj -364 0 obj << +376 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 350.704 282.657 362.455] -/Subtype /Link /A << /S /GoTo /D (subsection.3.2.4) >> >> endobj -365 0 obj << +377 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 337.155 239.25 348.906] -/Subtype /Link /A << /S /GoTo /D (subsection.3.2.5) >> >> endobj -366 0 obj << +378 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 323.606 237.81 335.357] -/Subtype /Link /A << /S /GoTo /D (subsection.3.2.6) >> >> endobj -367 0 obj << +379 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 310.057 234.789 321.807] -/Subtype /Link /A << /S /GoTo /D (subsection.3.2.7) >> >> endobj -368 0 obj << +380 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 296.508 239.621 308.258] -/Subtype /Link /A << /S /GoTo /D (subsection.3.2.8) >> >> endobj -369 0 obj << +381 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 282.958 276.592 294.709] -/Subtype /Link /A << /S /GoTo /D (subsection.3.2.9) >> >> endobj -370 0 obj << +382 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 269.409 236.589 281.16] -/Subtype /Link /A << /S /GoTo /D (subsection.3.2.10) >> >> endobj -371 0 obj << +383 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 255.86 238.411 267.611] -/Subtype /Link /A << /S /GoTo /D (subsection.3.2.11) >> >> endobj -372 0 obj << +384 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 242.311 248.545 254.061] -/Subtype /Link /A << /S /GoTo /D (subsection.3.2.12) >> >> endobj -373 0 obj << +385 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 228.762 224.796 240.512] -/Subtype /Link /A << /S /GoTo /D (subsection.3.2.13) >> >> endobj -374 0 obj << +386 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 215.212 226.007 226.963] -/Subtype /Link /A << /S /GoTo /D (subsection.3.2.14) >> >> endobj -375 0 obj << +387 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 201.663 291.733 213.414] -/Subtype /Link /A << /S /GoTo /D (subsection.3.2.15) >> >> endobj -376 0 obj << +388 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 190.367 171.745 199.865] -/Subtype /Link /A << /S /GoTo /D (section.3.3) >> >> endobj -377 0 obj << +389 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 174.565 239.676 186.315] -/Subtype /Link /A << /S /GoTo /D (subsection.3.3.1) >> >> endobj -378 0 obj << +390 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 161.016 245.785 172.766] -/Subtype /Link /A << /S /GoTo /D (subsection.3.3.2) >> >> endobj -383 0 obj << -/D [381 0 R /FitH 765.769] +395 0 obj << +/D [393 0 R /FitH 778.724] >> endobj -384 0 obj << -/D [381 0 R /FitH 603.28] +396 0 obj << +/D [393 0 R /FitH 603.28] >> endobj -380 0 obj << -/Font << /F27 335 0 R /F33 344 0 R >> +392 0 obj << +/Font << /F27 351 0 R /F33 360 0 R >> /ProcSet [ /PDF /Text ] >> endobj -430 0 obj << -/Length 1044 +442 0 obj << +/Length 1038 /Filter /FlateDecode >> stream -xr0y -/ei2e.:]8X%L1&m޾-4]y fsGG'`2`ɛɫw{Hz{I}{(?e >JdNh`7"?i31 W@R"w!  -cLFY*-A>4w`"GhVtcDŽN -*>H^A0sWuf,Ӟp-Ͳ(95QAВ.m; 59*YfW݄%G=-9FPh -ኖmK)>u4Jhr\A,3@sQ>.X/g]=Bd"%B?1'$MkU %Hz< lr;ZSGw3ͨ;$l3v6g9;:AeNt v-?0gw-x$CְоaOk {(l ?&ahcֳ. [R&{i(57JhBW}mWm*Wm4.?FboȢD>}V*x4!3g6jоTwYʜ1y&&6jB.W$}`S.両譹߆:YB ȥD< x-q9 &sT\ËF;]t1j9gyaqd#%xbߠVʎ vx.bgqT욥YmjB|Mʂ:ZxmM'Fs$_F5Fy8 gn-jV-\iLŽ,\}+spB,Sݹ`Mr㣗ˢ2OSGX0O?} [S2dץ]I1ڣ~ʚ^dNĈ'enW-Kc.8)_W[,gŮoXv|]'.z5nFhX;Np6> +xMSP +juѴ..Pʈ!_\՛."C 399 p 3`ɊKӋx1:;Gpa#Y\8t]oI2_IGɽs|^͹]Pl8)K.o?bb(_JisQ*Q'Dy7vL=ym:P +s/:qnlO ӞpΦji\qapC(Dfl C¬B'1¼%5:hIVj Yg[-8 nr l+ 00`ۚCu:/g]=B#,J.~]NHdJ4)AlfK,ԃ}hNA*>z>˖q6 + f)6S⧯akJ=]*Y;3F{0WY3׳1b] 0=71?״׃4 |=7,'A7Cx4f!(j>l endstream endobj -429 0 obj << +441 0 obj << /Type /Page -/Contents 430 0 R -/Resources 428 0 R +/Contents 442 0 R +/Resources 440 0 R /MediaBox [0 0 595.276 841.89] -/Parent 338 0 R -/Annots [ 379 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R 395 0 R 396 0 R 397 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R ] +/Parent 354 0 R +/Annots [ 391 0 R 397 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R 438 0 R ] >> endobj -379 0 obj << +391 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 726.545 179.676 738.296] -/Subtype /Link /A << /S /GoTo /D (section.3.4) >> >> endobj -385 0 obj << +397 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 712.996 215.338 724.746] -/Subtype /Link /A << /S /GoTo /D (subsection.3.4.1) >> >> endobj -386 0 obj << +398 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 699.447 218.087 711.197] -/Subtype /Link /A << /S /GoTo /D (subsection.3.4.2) >> >> endobj -387 0 obj << +399 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 685.897 201.713 697.648] -/Subtype /Link /A << /S /GoTo /D (subsection.3.4.3) >> >> endobj -388 0 obj << +400 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 672.348 243.374 684.099] -/Subtype /Link /A << /S /GoTo /D (subsection.3.4.4) >> >> endobj -389 0 obj << +401 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 658.799 229.432 670.55] -/Subtype /Link /A << /S /GoTo /D (subsection.3.4.5) >> >> endobj -390 0 obj << +402 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 645.25 227.621 657] -/Subtype /Link /A << /S /GoTo /D (subsection.3.4.6) >> >> endobj -391 0 obj << +403 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 631.701 242.141 643.451] -/Subtype /Link /A << /S /GoTo /D (subsection.3.4.7) >> >> endobj -392 0 obj << +404 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 618.152 240.33 629.902] -/Subtype /Link /A << /S /GoTo /D (subsection.3.4.8) >> >> endobj -393 0 obj << +405 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 604.602 238.683 616.353] -/Subtype /Link /A << /S /GoTo /D (subsection.3.4.9) >> >> endobj -394 0 obj << +406 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 591.053 242.152 602.804] -/Subtype /Link /A << /S /GoTo /D (subsection.3.4.10) >> >> endobj -395 0 obj << +407 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 577.504 280.344 589.254] -/Subtype /Link /A << /S /GoTo /D (subsection.3.4.11) >> >> endobj -396 0 obj << +408 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 563.955 266.403 575.705] -/Subtype /Link /A << /S /GoTo /D (subsection.3.4.12) >> >> endobj -397 0 obj << +409 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 550.406 279.112 562.156] -/Subtype /Link /A << /S /GoTo /D (subsection.3.4.13) >> >> endobj -398 0 obj << +410 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 536.856 247.334 548.607] -/Subtype /Link /A << /S /GoTo /D (subsection.3.4.14) >> >> endobj -399 0 obj << +411 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 523.307 235.388 535.058] -/Subtype /Link /A << /S /GoTo /D (subsection.3.4.15) >> >> endobj -400 0 obj << +412 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 509.758 253.574 521.508] -/Subtype /Link /A << /S /GoTo /D (subsection.3.4.16) >> >> endobj -401 0 obj << +413 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 496.209 145.062 507.959] -/Subtype /Link /A << /S /GoTo /D (section.3.5) >> >> endobj -402 0 obj << +414 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 482.66 206.622 494.41] -/Subtype /Link /A << /S /GoTo /D (subsection.3.5.1) >> >> endobj -403 0 obj << +415 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 469.11 204.811 480.861] -/Subtype /Link /A << /S /GoTo /D (subsection.3.5.2) >> >> endobj -404 0 obj << +416 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 455.561 192.462 467.312] -/Subtype /Link /A << /S /GoTo /D (subsection.3.5.3) >> >> endobj -405 0 obj << +417 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 442.012 233.872 453.762] -/Subtype /Link /A << /S /GoTo /D (section.3.6) >> >> endobj -406 0 obj << +418 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 428.463 217.902 440.213] -/Subtype /Link /A << /S /GoTo /D (subsection.3.6.1) >> >> endobj -407 0 obj << +419 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 414.914 255.472 426.664] -/Subtype /Link /A << /S /GoTo /D (subsection.3.6.2) >> >> endobj -408 0 obj << +420 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 401.364 214.869 413.115] -/Subtype /Link /A << /S /GoTo /D (subsection.3.6.3) >> >> endobj -409 0 obj << +421 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 387.815 236.971 399.566] -/Subtype /Link /A << /S /GoTo /D (subsection.3.6.4) >> >> endobj -410 0 obj << +422 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 374.266 274.541 386.016] -/Subtype /Link /A << /S /GoTo /D (subsection.3.6.5) >> >> endobj -411 0 obj << +423 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 360.717 264.232 372.467] -/Subtype /Link /A << /S /GoTo /D (subsection.3.6.6) >> >> endobj -412 0 obj << +424 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 347.168 235.127 358.918] -/Subtype /Link /A << /S /GoTo /D (section.3.7) >> >> endobj -413 0 obj << +425 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 333.618 256.705 345.369] -/Subtype /Link /A << /S /GoTo /D (subsection.3.7.1) >> >> endobj -414 0 obj << +426 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 320.069 239.719 331.82] -/Subtype /Link /A << /S /GoTo /D (subsection.3.7.2) >> >> endobj -415 0 obj << +427 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 306.52 230.752 318.27] -/Subtype /Link /A << /S /GoTo /D (subsection.3.7.3) >> >> endobj -416 0 obj << +428 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 295.224 148.455 304.721] -/Subtype /Link /A << /S /GoTo /D (section.3.8) >> >> endobj -417 0 obj << +429 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 279.422 227.589 291.172] -/Subtype /Link /A << /S /GoTo /D (subsection.3.8.1) >> >> endobj -418 0 obj << +430 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 265.872 233.545 277.623] -/Subtype /Link /A << /S /GoTo /D (subsection.3.8.2) >> >> endobj -419 0 obj << +431 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 252.323 219.451 264.074] -/Subtype /Link /A << /S /GoTo /D (subsection.3.8.3) >> >> endobj -420 0 obj << +432 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 238.774 226.378 250.525] -/Subtype /Link /A << /S /GoTo /D (subsection.3.8.4) >> >> endobj -421 0 obj << +433 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 227.347 150.56 236.975] -/Subtype /Link /A << /S /GoTo /D (section.3.9) >> >> endobj -422 0 obj << +434 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 211.676 225.014 223.426] -/Subtype /Link /A << /S /GoTo /D (subsection.3.9.1) >> >> endobj -423 0 obj << +435 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 198.126 230.971 209.877] -/Subtype /Link /A << /S /GoTo /D (subsection.3.9.2) >> >> endobj -424 0 obj << +436 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 184.577 218.96 196.328] -/Subtype /Link /A << /S /GoTo /D (subsection.3.9.3) >> >> endobj -425 0 obj << +437 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 171.028 228.658 182.779] -/Subtype /Link /A << /S /GoTo /D (subsection.3.9.4) >> >> endobj -426 0 obj << +438 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 159.732 200.283 169.229] -/Subtype /Link /A << /S /GoTo /D (section.3.10) >> >> endobj -431 0 obj << -/D [429 0 R /FitH 765.769] +443 0 obj << +/D [441 0 R /FitH 778.724] >> endobj -428 0 obj << -/Font << /F33 344 0 R >> +440 0 obj << +/Font << /F33 360 0 R >> /ProcSet [ /PDF /Text ] >> endobj -441 0 obj << -/Length 360 +458 0 obj << +/Length 550 /Filter /FlateDecode >> stream -xk0E`ڮ+ &PvH۴N؍es7p=H4F#/6́H|W^Ng8rF# -D(Z#Jጢrh易ruo$70,]Og04B!B^Bc6K<ʉ* ck&K"yk`S\+c c +m*d.$C2Qc^w)qZE]D&VeyjqݱCDx]F!նW\e, UY#A:ծq]Mʵahx43t~KQOL +6-Ox6b6?t9$ +I_ gOWJiIirEf9-nGw> endobj -427 0 obj << +439 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 726.545 220.334 738.296] -/Subtype /Link /A << /S /GoTo /D (subsection.3.10.1) >> >> endobj -432 0 obj << +444 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 712.996 226.291 724.746] -/Subtype /Link /A << /S /GoTo /D (subsection.3.10.2) >> >> endobj -433 0 obj << +445 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 699.447 212.196 711.197] -/Subtype /Link /A << /S /GoTo /D (subsection.3.10.3) >> >> endobj -434 0 obj << +446 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 685.897 219.745 697.648] -/Subtype /Link /A << /S /GoTo /D (subsection.3.10.4) >> >> endobj -435 0 obj << +447 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 672.348 235.487 684.099] -/Subtype /Link /A << /S /GoTo /D (subsection.3.10.5) >> >> endobj -436 0 obj << +448 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 661.052 176.338 670.55] -/Subtype /Link /A << /S /GoTo /D (section.3.11) >> >> endobj -437 0 obj << +449 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 645.25 254.872 657] -/Subtype /Link /A << /S /GoTo /D (subsection.3.11.1) >> >> endobj -438 0 obj << +450 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 631.701 277.89 643.451] -/Subtype /Link /A << /S /GoTo /D (subsection.3.11.2) >> >> endobj -442 0 obj << -/D [440 0 R /FitH 765.769] +451 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [69.87 607.39 189.145 619.113] +/A << /S /GoTo /D (appendix.A) >> >> endobj -439 0 obj << -/Font << /F33 344 0 R >> -/ProcSet [ /PDF /Text ] +452 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [86.233 595.946 266.326 605.444] +/A << /S /GoTo /D (section.A.1) >> >> endobj 453 0 obj << -/Length 613 +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [86.233 582.397 186.342 591.895] +/A << /S /GoTo /D (section.A.2) >> +>> endobj +454 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [86.233 568.848 188.763 578.345] +/A << /S /GoTo /D (section.A.3) >> +>> endobj +455 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [86.233 553.046 237.025 564.796] +/A << /S /GoTo /D (section.A.4) >> +>> endobj +459 0 obj << +/D [457 0 R /FitH 778.724] +>> endobj +456 0 obj << +/Font << /F33 360 0 R /F27 351 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +470 0 obj << +/Length 615 /Filter /FlateDecode >> stream -xݖo0>&\v|2J6RbUHPbώMRFˤJCbgy~!0(&k"aPf H3!`2eR46jIH/t - jڙ6rKP -0 -v ,  9T8bԚP)ΒMXoV~vKA;JkcmtykʢJ1J6Mi&_lsZ#aIT򄳝ô+/p -9!mPPd:_jø0EPb5vW^a&!snz"G! ,Xʀ=|_AN1OÀ)tiO )u4pq ")8պѡ{7Q'=ҏ۸X3}8.y/5F"'=$y\@%Iч "E>:rjMUEK~`iгm8c׵~qENګxSB8ۺL{|R*gRcU[V!V t (H{yvi:BvUg`HcH"fgdw+ +xݗo0>::eB6mh=t;`!A`ώMЌMZ`8`0~.#) 0ʤ3ݓrc + Eh0&10#~t痱[1@0XK  1 $%5aMXoѬBf;GPwFQ-vVIem&㡟m5[AI*0~MI$7|HHaH=&ugf}a)Bq} M$AI(Q* O1"+3+*3 1 sS;9 c꽻põ>Tȷf1{P 6+hNK#sOҋ([NFT#q&>`쵙#图=i꧔iwIC2Bvl-:WM>/"2/b|s6gtnYW?]jXu{{n2󗪡G}Wką<y>\%u&*}fs/1._KWs+Iǡ)S! ^MGۂ endstream endobj -452 0 obj << +469 0 obj << /Type /Page -/Contents 453 0 R -/Resources 451 0 R +/Contents 470 0 R +/Resources 468 0 R /MediaBox [0 0 595.276 841.89] -/Parent 456 0 R -/Annots [ 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R ] +/Parent 354 0 R +/Annots [ 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R ] >> endobj -443 0 obj << +460 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 586.67 268.912 598.54] -/Subtype /Link /A << /S /GoTo /D (table.3.1) >> >> endobj -444 0 obj << +461 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 573.12 326.391 584.991] -/Subtype /Link /A << /S /GoTo /D (table.3.2) >> >> endobj -445 0 obj << +462 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 559.571 210.003 571.322] -/Subtype /Link /A << /S /GoTo /D (table.3.3) >> >> endobj -446 0 obj << +463 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 548.275 244.312 557.773] -/Subtype /Link /A << /S /GoTo /D (table.3.4) >> >> endobj -447 0 obj << +464 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 532.473 324.1 544.343] -/Subtype /Link /A << /S /GoTo /D (table.3.5) >> >> endobj -448 0 obj << +465 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 518.924 338.281 530.674] -/Subtype /Link /A << /S /GoTo /D (table.3.6) >> >> endobj -449 0 obj << +466 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 505.374 248.468 517.245] -/Subtype /Link /A << /S /GoTo /D (table.3.7) >> >> endobj -450 0 obj << +467 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 491.972 272.937 503.696] -/Subtype /Link /A << /S /GoTo /D (table.3.8) >> >> endobj -454 0 obj << -/D [452 0 R /FitH 765.769] +471 0 obj << +/D [469 0 R /FitH 778.724] >> endobj -455 0 obj << -/D [452 0 R /FitH 603.28] +472 0 obj << +/D [469 0 R /FitH 603.28] >> endobj -451 0 obj << -/Font << /F27 335 0 R /F33 344 0 R >> +468 0 obj << +/Font << /F27 351 0 R /F33 360 0 R >> /ProcSet [ /PDF /Text ] >> endobj -469 0 obj << -/Length 1527 +486 0 obj << +/Length 1558 /Filter /FlateDecode >> stream -xڽX]w8}ϯcrF,,PsQSaٔ{FةiÖCOkW;sg$89<_N(vF\;F;"Fr|ya6w^f4<>/_)7E"y>Z+OfME%"/\!c, Fn*xq2,LX/Bd(gB]9yԹ̵(ƾz(^y]|䭸4dAI}ֺ^"J,)?gS sOoP n ^Luf}ER(L[[eS?)>>3$؜]؍uAKew'W@[ -૝n5Rq7TYu~V7T}q#v6CQDGpq1uDiivI `S -s, L iXLAnñkC=u*HڋSPj9Kܝ=VGܠBo  ?7 +xڵXMs6W(̈́A7ۭ=II$9$!H wA2euu%Rbݷ 8rr8vPZAQXa!re}_]_~^خ?5+$,a j.-߃)7cy+gߩ7~.?gyn(\ؘ?(mvg +,9_ .?]ttX,g?fBd]@šo%ٗoރGc||OZZs Jnhp=/BQҢt +(lq,EwYU.p4WuRI0&0W3ˊާꯎEZp,MIw`zRqnW[Zo[RW Vl.^TLKWqm!C1`@W!,[r`u T?CC80ROy,<4(.r=v桯'S & k{BcAM[n<&>r!w^~g3ڰ POߨKF~i-t &o]&-5I^#_Gf|WФ2+Be:Iv,b'iGKmd?j^F0\]s:Y&4;F!J>l/\8$\m]W%7%i)َI{}\*Ojy4ɀqq64U~/)j@qAA"X$=K#]Hڥ|ncڂ&9HW5rjB d?GBi0W\qrrKv?UlP*Qs moX3wu}wy~gg3lףh7b۳ 4${  W endstream endobj -468 0 obj << +485 0 obj << /Type /Page -/Contents 469 0 R -/Resources 467 0 R +/Contents 486 0 R +/Resources 484 0 R /MediaBox [0 0 595.276 841.89] -/Parent 456 0 R -/Annots [ 466 0 R 465 0 R ] +/Parent 490 0 R +/Annots [ 483 0 R 481 0 R 482 0 R ] >> endobj -466 0 obj << +483 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -465 0 obj << +481 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [194.876 178.81 201.351 192.117] /Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [506.933 230.206 513.409 243.923] /A << /S /GoTo /D (Hfootnote.1) >> >> endobj -6 0 obj << -/D [468 0 R /FitH 740.862] +482 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [212.461 196.333 218.937 210.05] +/A << /S /GoTo /D (Hfootnote.2) >> >> endobj -471 0 obj << -/D [468 0 R /FitH 162.502] +2 0 obj << +/D [485 0 R /FitH 740.862] >> endobj -467 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F26 337 0 R /F41 470 0 R >> +488 0 obj << +/D [485 0 R /FitH 173.652] +>> endobj +489 0 obj << +/D [485 0 R /FitH 162.502] +>> endobj +484 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F41 487 0 R /F26 353 0 R >> /ProcSet [ /PDF /Text ] >> endobj -476 0 obj << -/Length 1410 +495 0 obj << +/Length 1385 /Filter /FlateDecode >> stream -xXMs6W(@8Ǔ=ISu|HrHH._\` ۷o{[o$8J޺.on߯.}_ؖ ^23.ǬZ}_SI}FYA"tZQ\?Q$AglglF~Z|LX3a]?PҘza; -GtRF(!T>k$=׀B'q.iha԰6=! ߏ%{ma(5|DBr7 W$Y!U`- (t:2DG&ճ>@njn<YO>4CV(+yf٘ { lnT vh96POmmU%1~ODsoL/ y}h*& אjV\Xr_;MP'fkƋ.< "Uؚ2hZekևB|7Dm|)4Ь^52gJT6}#˂ֻbxQ?s(u4sh]dtU @#Bb Uon:A?p/$xs - E$ Z hK=W$ojFf>:W%|')V13 0ۙ'읯j#v;ꂍAEv'1c -(l;}f}[w9]2-YҥmD+<1[in =o꬝P]iZmb6*֙gH@':Qf/T&~\R1-.rYFKFLE>M͢`YճWS1,+P g(L< 2aA'㶍 - RdMIq -t2b -a0#7u_a" -yVef6M8E8ʼn --?º4l~Uۧ&+$\$B A"8S8r"Vr%Py7ۜF1; ",kG:4 jɦs^ר~Nr).}Ye>q uJrt'ؠ$bC -g$.'Ij+ʵX4nk=ݙ]ZgJ'EQF͜ʉi0X{.N˸駳|͙i]Eݼ+LiSb:{~Fꐜ ݻY*{D~D9(k`&tH]4X+z)-آY,$;Z`ekpFH7uN'a~Ԅ~wFW^pǭ$q.oy.p߄;Ua3淈SzS$ocLNio忟9_ +xXKs6W(Xߤzs;Ǚd1 0hW]KApvݥ]ͻu<ܝN4$N}|]}xBɚ[1kq*o0NƋ֤~Gfq?wuoޕbEnӀ/w+Pv~c< +.Z}:9{]* 1# e_A +7Ԕ'' "d,8{4Uey +m-]!cOtP +\诱0[PYhIHingՏ3`CN*0L)v[TXַGn3_,< IQH$kam-J+;$A>.z<;"?*m(C @뙷 XcB[a9HAF#>\&Wbf'bhMoBL!d:t5ɤY˴e%~iꌱZj3/g˓s4ݙٿ>9'q 'IpMgY\RNfgs[_ꆟ\UF=ۈ2-4m{3ψ=prL$\8]zm[\۰K$ՌLIL4p~SffCFE`25|ע.W "023t|c>U^f 9!$o/dد{͹c\|ȺaS[R=&i[eѿ endstream endobj -475 0 obj << +494 0 obj << /Type /Page -/Contents 476 0 R -/Resources 474 0 R +/Contents 495 0 R +/Resources 493 0 R /MediaBox [0 0 595.276 841.89] -/Parent 456 0 R -/Annots [ 473 0 R ] +/Parent 490 0 R +/Annots [ 492 0 R ] >> endobj -473 0 obj << +492 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -477 0 obj << -/D [475 0 R /FitH 764.175] +496 0 obj << +/D [494 0 R /FitH 778.724] +>> endobj +6 0 obj << +/D [494 0 R /FitH 739.268] >> endobj 10 0 obj << -/D [475 0 R /FitH 739.268] +/D [494 0 R /FitH 545.345] >> endobj 14 0 obj << -/D [475 0 R /FitH 545.345] +/D [494 0 R /FitH 278.047] >> endobj -18 0 obj << -/D [475 0 R /FitH 264.498] ->> endobj -474 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R >> +493 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F41 487 0 R >> /ProcSet [ /PDF /Text ] >> endobj -481 0 obj << -/Length 2178 +500 0 obj << +/Length 2110 /Filter /FlateDecode >> stream -xڵZɎ۸WhieF$EJ]N -!^$"Kn 1 -R4XeQ0Ntq7W`n]p<@:q\sݟN~α}rx"Iy3, u>hmhB(6ν`XM8>_*EKBGac맑Q8GA>".F=K)Y<$c{c/ޞ.mȐr Fk})#> -C~w} Es"Rpd.t @oCdfCAx۱Zf~P|5Kq -&L-iGN+gE%xCbqfpoݎr̢>ʃ}ѮJWwQdbC?# N9:j&N(E機$(q Pc^bKśsqq}:ͷ¦("o!SFB/褤S*y7k.dZy#F6 TWK"T \,[c1thu+d՗wEr8M%6M"֢zi'YGuZEz>A8BW[ؔڙ7T8P4eP9C{22o޾Y-b2%rX~j5(MuQ|{  gYVKѩ`Jhʴ0v ֜bf22MUulqXCj06b3ol8"G?Zah_0EUvҒ-j#DTu?o:=]4SS$УU+e2Mdl1L' y{6ޔFA,6/w'$kBghl6Ǐ2wڟ9Ș f[[OsS9 cSHw #-QayFԁQlJb2?:75:z8H&3D('Lx4"ZKx6[mU9i~QF|4Q\P>&-=weTYO(74^mDtU%U\/ QO\h4CT*daa\Wqqc,b ز"@kNl~2`-˔:v}eu׻R+duꗑ̶#ڄHԝ+gDfً蔨_A{((i3Sеdm ˧!i'f%XIEfv|ȍ֏0`lZTpsͦN<߭S) +xڵZ[8~Ѯj+BB-$]&< T0xյ}tΧ\${+{wɛ{>F1}o8FQz<ȼ?6_R3ʧLϤ%oE 0By~gSQ7yUܧaĦde;(0>~ytqƭ.!bμt3/e7@qȍ0X -;8ȓw3!"DX$O=>b^- 8>r::b$caTK'\19 $qp G2hV~grD"e掸Kk\|{Sl|;Ѕ`鿍F~O.a@PJ,>S&Mb+v616/>/jFOٕ>" + +oHjE|@Xgt"28 +Cr]ߨ+.倃Zc2 +`bqH]n¤TCmsLy|5d*ˑ.i;;i݁Ȕ&ZYj(׫:ٮZц1_𭢽B9hO(t-%]K Y^c* }5,3}V_,wb@I?,61XwXTKKjHRBUb q'haM1kK*VnvXe+$mcv[iUiuN zV9ˬ/"닽Z4#GbUX*(ǾadD"pcс>CfYͶH5xnҴ+5u&k̈};>j})b^+N:GI=/`EURBم:Bo^"kj慦MʶxlDL=  +x0Rzb+h̀Ll*{M$hz-JZ ad$3ҝ\cHJ c [2 EAtzIQ<%`|ܕ^B9ODY:dQU#sZE*tr}eI+, Djڈ.!uI=^!mm"^ۅ~rKVEf2o!&%iiyGBsi@p;RQWFkWc +\;zY[z5ֹEXt]J_Rl)&(l+*2?dC1t1dLy91XOv˥L#dO,pS*|J;-RW63* +(Fb@fMiꢀb;%>t 6jݎ>]7 :.t#뜨fTi1Iaٵ]ar}s[\1g>G]ަՙ5*ko'EUZ 'ˏKGmMl| 2l\LID}[4],(jƶi&Y +lM2N˒-˗=ȪGю'fXK$> -F%OL0@\h +1Z,$`Q2lm`VHW8F~䪁hS4iDZN,%g u ɥ蠓@nrwaHUm|W|̛< ͣmTT*kohThCpBe1fi i*juZdv< v<#(E 72stŽbHد{pY{/3ؚ}1 pB endstream endobj -480 0 obj << +499 0 obj << /Type /Page -/Contents 481 0 R -/Resources 479 0 R +/Contents 500 0 R +/Resources 498 0 R /MediaBox [0 0 595.276 841.89] -/Parent 456 0 R -/Annots [ 478 0 R ] +/Parent 490 0 R +/Annots [ 497 0 R ] >> endobj -478 0 obj << +497 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -482 0 obj << -/D [480 0 R /FitH 764.175] +501 0 obj << +/D [499 0 R /FitH 778.724] >> endobj -483 0 obj << -/D [480 0 R /FitH 719.97] +502 0 obj << +/D [499 0 R /FitH 739.268] >> endobj -485 0 obj << -/D [480 0 R /FitH 721.265] +504 0 obj << +/D [499 0 R /FitH 732.374] >> endobj -487 0 obj << -/D [480 0 R /FitH 707.716] +506 0 obj << +/D [499 0 R /FitH 718.825] >> endobj -488 0 obj << -/D [480 0 R /FitH 694.167] +507 0 obj << +/D [499 0 R /FitH 705.275] >> endobj -489 0 obj << -/D [480 0 R /FitH 680.618] +508 0 obj << +/D [499 0 R /FitH 691.726] >> endobj -490 0 obj << -/D [480 0 R /FitH 667.069] +509 0 obj << +/D [499 0 R /FitH 678.177] >> endobj -22 0 obj << -/D [480 0 R /FitH 481.667] +18 0 obj << +/D [499 0 R /FitH 492.775] >> endobj -26 0 obj << -/D [480 0 R /FitH 225.396] +22 0 obj << +/D [499 0 R /FitH 250.054] >> endobj -479 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F4 484 0 R /F59 486 0 R /F27 335 0 R /F26 337 0 R >> +498 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F4 503 0 R /F59 505 0 R /F26 353 0 R /F41 487 0 R /F27 351 0 R >> /ProcSet [ /PDF /Text ] >> endobj -495 0 obj << -/Length 684 +514 0 obj << +/Length 538 /Filter /FlateDecode >> stream -xڍTMo0+|)'ǴjV%M!GjU}lX($c{~3A;^p( I(("8C1fZۄF03o `w $(+PBc377-ds mBltkIÇ G1/(o{OHFZpn)3uvn d~ 0_-@Ǒs>dB .8N& gSΝ "ke.k.19q. [}ٍ֏j'čv EglV!ܕAo]4U=M=1/mBXXp' Z} Xd[K^a ^PW4ѭۭZ7TK~`玁*Wvԍ/ٵ:d‡QQu}M3G0]cSULp[,Z\dwU$I$L pdp^K8GT,  'Q$+ +siGSǑL|3?Lpsj2sHl_ub?u1 endstream endobj -494 0 obj << +513 0 obj << /Type /Page -/Contents 495 0 R -/Resources 493 0 R +/Contents 514 0 R +/Resources 512 0 R /MediaBox [0 0 595.276 841.89] -/Parent 456 0 R -/Annots [ 492 0 R 491 0 R ] +/Parent 490 0 R +/Annots [ 511 0 R 510 0 R ] >> endobj -492 0 obj << +511 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -491 0 obj << +510 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [250.828 666.211 257.304 677.696] /Subtype /Link -/A << /S /GoTo /D (Hfootnote.2) >> +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [248.395 679.782 254.871 691.246] +/A << /S /GoTo /D (Hfootnote.3) >> >> endobj -496 0 obj << -/D [494 0 R /FitH 764.175] +515 0 obj << +/D [513 0 R /FitH 778.724] >> endobj -497 0 obj << -/D [494 0 R /FitH 160.96] +516 0 obj << +/D [513 0 R /FitH 160.961] >> endobj -493 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R >> +512 0 obj << +/Font << /F30 352 0 R /F33 360 0 R >> /ProcSet [ /PDF /Text ] >> endobj -501 0 obj << -/Length 1115 +520 0 obj << +/Length 952 /Filter /FlateDecode >> stream -xڵWMs6W(T 48fRGL@STI*$hGxx"t>{:Q 1RBҘqVky~~yb$_V mX[\|uCyrn:+ Z,)WZ?-_3"t -":OjόWl&(>%h 7u$$RcEc%%T"玐v:BZJnٮHG-Վڰ -̅b~XJc -BsQdM7.jaо -vXشliO~~$82( l0Q2X>ڡ'ڻv˔3cӜmvu3Q֓ӔizRV6g4 %]ph|CBS~=$֓RaӒqJ!:peY-ie9lݳum})]R13/վXo-ө|X:_y\zI&˂AY:TS$ĄVu(#P-QeQ: +#BM/lS-};2DnJZKO#7FyO:D#n(?K3N<:g#v=j9%4A[2/rv?UC 7|ifiLaYà6_$z $oe \/ÀEP0gO ͣ#aПJԟ./2sUFE~?*dY.<6B` +xڵVKo8Wh57cmEuC,TRVv#%I4=2%73< ".6 J!M4RH3n&A?+&rmS[\/m՟QFypy P| +E Bqԣ$T.mUge1`X+U(oa˗`&'9l.(qlD~nBGBr,Ego>,zF +&',)pH]t;| X'TX pq30PKÁZ/MB1'IsL4B$FJ\acl{Y̙*tb%yTl۱뛢shPQ)("n(\t׽bI9r %,J'v?Fbʎk`hQ/S )#-7F*M,D\kpbdCT]n=h&3|%^ќg@zdJ9!5$4qA XV> O3SޔH3!s7/DXAHo+&RGs[OݽӯN9[xfH\1)uҰh9ja(wIWc"Avֶin(} ᝝o)nqlmR{?u 7Pu66Ӊ-"@ٻ) ):{) oڸ0xM7p|n{R ;=5;h̉hճx9n)_ endstream endobj -500 0 obj << +519 0 obj << /Type /Page -/Contents 501 0 R -/Resources 499 0 R +/Contents 520 0 R +/Resources 518 0 R /MediaBox [0 0 595.276 841.89] -/Parent 456 0 R -/Annots [ 498 0 R ] +/Parent 490 0 R +/Annots [ 517 0 R ] >> endobj -498 0 obj << +517 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -502 0 obj << -/D [500 0 R /FitH 764.175] +521 0 obj << +/D [519 0 R /FitH 778.724] +>> endobj +26 0 obj << +/D [519 0 R /FitH 739.268] >> endobj 30 0 obj << -/D [500 0 R /FitH 739.268] +/D [519 0 R /FitH 550.079] >> endobj 34 0 obj << -/D [500 0 R /FitH 550.079] ->> endobj -38 0 obj << -/D [500 0 R /FitH 462.189] +/D [519 0 R /FitH 448.64] >> endobj -503 0 obj << -/D [500 0 R /FitH 407.949] +522 0 obj << +/D [519 0 R /FitH 394.4] >> endobj -504 0 obj << -/D [500 0 R /FitH 409.097] +523 0 obj << +/D [519 0 R /FitH 395.498] >> endobj -499 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R >> +518 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R >> /ProcSet [ /PDF /Text ] >> endobj -509 0 obj << -/Length 1187 +528 0 obj << +/Length 1406 /Filter /FlateDecode >> stream -xX[6~У݉A%;ʹ3>$y`m٦b x7{{i8EO "jb='hFR(P!f\ -}^ٜI26kx05viG@6 S~݌ʩ8~a5SB9E -[u" "o=^_MZޮJ [:h|B -}Ct_ZKMП?J,@b-%kWJS Bt3 ]l8C}09' -UUh]u/gp%XRrvB -Jn%8Q9tI~^9X+\h k:R ȩk:$c!I13Y 4`ʞ"K:l] l _/r;LE8Xpjͻ4^ym9䝚s>I.PCVOy0`sY( EXCyB5,o@&!Neg7c.ds0Q&'FY3C2:=7A fצgnknE?|ŷS1k^l rˢQEGJR st>v۴؂>.uU]3&3%o̸kVQdWk$y=e'[D2lm[>⸩^FIbV:ͪ_nt[\'B8;H%ޒJW :ԪKB/RBw*ؘZA2r{=S+ М@zVjᏬzj ]1|ZIi}Vr9XD'ŶBfTsF%;+^.' yT(sڎ2s7+ WhD@6%CFԈR"t8:JlW} `&ZۛUO--Q#SF3^99USmzʇ2%Shv:NNr,C@.2M .vy!ׄ>,uy9LF?*yo`UiֳY"y4nl.nNi|$ɢDK^>;)-C})m0A979 +xXߓ6~_[M'M3msx$yl`t|]! w>{&v{+{7;=Qc͗^Q$Q{iz뻿xz-Y8E*oIMr=@.) +K _̊;,LfП&">ϒw0ͯ;חgy>wB/D8^|<{,]3s!hsac,1lY]ղ{ yuV"[6ɽS'_}J;΀h;baaje沶l6龪zev,LU۝knz!7 *rGb,Nj{h9cD+fheշߛ&y+~RIPW|17Y#Յzm#Y[2*pcpJ,>풷g7eRO z pGLJ\~petnõ^۲z2Uy6d2g=Vuq-+-}MH07Ƨx-,evm)+p3zsب҂fRNpm2d76^%diWZfkf Sڣ;[4pMP9\!Іw"B*> +mluBl6]uͶ?ZzИ@QD<@ƬA'̃nq޲ӉG9'{>Q,<8odCg&GdLAF$g!\miީlas(<Vs>c͒>| FY4`"v!jst!i@j)8܅q v2 x Y} 8d#_48t<1H&fڵӢ};VOJ9Wig1F9Q @H(vYPa@[Yءi l.4JE+Lu)Eeҡ8NȽo\*ie@QuCuͥ +m}K0 .st%Sv 8{3uNYV74g$:PppZ}s&9c747\};i:Y2 =bftfs3IQ1K PV͐*?н_hێst_ v_  ׋Iu]g| +! +U֪# +|}[SR~S'x2.f^z|'16!FiK> endobj -506 0 obj << +525 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -510 0 obj << -/D [508 0 R /FitH 764.175] +529 0 obj << +/D [527 0 R /FitH 778.724] >> endobj -42 0 obj << -/D [508 0 R /FitH 739.268] +38 0 obj << +/D [527 0 R /FitH 604.163] >> endobj -511 0 obj << -/D [508 0 R /FitH 692.43] +530 0 obj << +/D [527 0 R /FitH 550.312] >> endobj -512 0 obj << -/D [508 0 R /FitH 693.578] +531 0 obj << +/D [527 0 R /FitH 551.411] >> endobj -46 0 obj << -/D [508 0 R /FitH 500.637] +42 0 obj << +/D [527 0 R /FitH 361.384] >> endobj -513 0 obj << -/D [508 0 R /FitH 446.396] +532 0 obj << +/D [527 0 R /FitH 307.533] >> endobj -514 0 obj << -/D [508 0 R /FitH 447.545] +533 0 obj << +/D [527 0 R /FitH 308.632] >> endobj -507 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +526 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -520 0 obj << -/Length 1881 +538 0 obj << +/Length 372 /Filter /FlateDecode >> stream -xZKs6W(X$9i&&ICK)E"7]ER,Lr!#?,v}B[xػ(!n瞏Q Qz3xBݨڌ?RTGE6JƟo_C".Ty˘q0{b4F6 yϛ Yg _d1›.>~ 5 0ʕ+ &އ+RKGKZ VK Q8xt7&(Ng٘у9ʯQ:Ktѥ(MAt_E|N WW((-XM `Ku$ ]zi3|gV|jGqZ\0rL׻$!u{[M%F:N+ :Y% hl5N׫( -TZ.&Ls`U '4[j_Cѥ}Kz޾b TWqmVM*ٵ|$tPMYjj 6AĈX/6WS02$QVMϡϻ?oZ+% -ϴ\$d Q޼0ہ/N - Q(zp$wa&:uE%ROTTP{G 9" icM=-dga K|!Alw>VLI: fl&@-Ti=:<|ws9c ?ijbyم -H lŲD1{m>.37H|qwC;ny`^XGҵ9A*0&>٪x -9!zEz )LSVP1G;</vk|#~}6/~bQB#雜Y h1udO u*l. e{SϽ &'}D+}>GVT^h -rWkaRuwBÏPHQuu@Ï&={\ٱOdMBl Mtv Rs'k&G4"+A!$7iحB h딠k퉾Z#Gˢs_y5r#G5H֧X }p@tj,͊w2*4' IdS:O =PQ{H6}w(Pr A0#|Z |0zMHhp+gј`h+(0L@ڤࠄkq`X oKN6( Nᄰ?l Հf7t_KսQ"6g{8V,UXT[z?;ׁis+l$TnoMIQGy5];2X[p#c!Ʈ16-wKPr 5첅ӐaՁ - W;zTgɶ~R,#ܒ,Wy~PLvjQ -BAqYuo +xڍ=o0w +fklal&jJi!@R`B> |>:א xݘЅQCF)\QN\fR;L iSjYFS#ŎܐbgN~l;ˑUQ6ApF.f[] !;L~'Hm=Ej 1 +,mjXg{|o\Gkh)ev|5$(.Y]Cql뛣r֨VSU65ej૚reⳎANKr ^jI \}dz;7sؗ"_X#l)r4b*GY%:,nv99,|DG}[ endstream endobj -519 0 obj << +537 0 obj << /Type /Page -/Contents 520 0 R -/Resources 518 0 R +/Contents 538 0 R +/Resources 536 0 R /MediaBox [0 0 595.276 841.89] -/Parent 516 0 R -/Annots [ 517 0 R ] +/Parent 540 0 R +/Annots [ 535 0 R ] >> endobj -517 0 obj << +535 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> +>> endobj +539 0 obj << +/D [537 0 R /FitH 778.724] +>> endobj +536 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +544 0 obj << +/Length 1904 +/Filter /FlateDecode +>> +stream +xZKs6W(X$9i즓&ICK)E$']IP-ЃG6M|]|؇wa {Ļ^z>F/DY]/O˷7xr*2ҹ(~ Xq` +o_DLT^YZ?ȟ| vBa$=p?.Z= + +1›>} 07 Mg4pk% xr3%$Nٔ}ʯQHnP؛1$5ʨu7lMVd=?̮ʹ) $?xỊ8-UBF4^m`;_jY,|qDBU[kRiF3 [1,C@0 +ki湊ʆ.`I KX0p, O5:JOkh +fڬn6Y^eA!* Z7W|eDtE +|25JB٦R?A,IRET#TXӕEH~TD W>gG20 ݓ(6[|Oq?:mUEDA@<r}]T? A+oɇw_>_3 ^BI+hQ` cRz(X +o<; +|ʝ]hS04lj(x;tv#'@I fD.g0KBqU1SA4Ԅ!ΫT"P4GXz O0GpE!Njru> +H8 +lU9&(bB6.#bN-Swouѐx'P1Vœq!FEfRڔ-pS n?m#t['vqxV'(jC:1֙./%p}c~"sj%I9mRp?ozzU8 /fHQ()>TT7&(lK*-py-gvF_+5\Vi8*BF N7WlFSqiNtG|DZ»0 ^젋uJCDe6K';BO۬dH`$LjG`FQJqՅ*F9C +(*v\0O|0z9H/F4}48 CxkO (H ?~ۡߖ#A<łCqKydJşΫS +KvݤfzM.@k*$ulyv8-(QzOڞR5hzXKNN_ɀ#wSayxGՍjHa{UVmcaKVjj/c֐bJNɲ4۷KM&k?d Zb# )IG*Jjݙ7Q3a"st`{ s +endstream +endobj +543 0 obj << +/Type /Page +/Contents 544 0 R +/Resources 542 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 540 0 R +/Annots [ 541 0 R ] +>> endobj +541 0 obj << +/Type /Annot /Subtype /Link -/A << /S /GoTo /D (page.57) >> +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> >> endobj -521 0 obj << -/D [519 0 R /FitH 764.175] +545 0 obj << +/D [543 0 R /FitH 778.724] >> endobj -50 0 obj << -/D [519 0 R /FitH 739.268] +46 0 obj << +/D [543 0 R /FitH 739.268] >> endobj -54 0 obj << -/D [519 0 R /FitH 664.829] +50 0 obj << +/D [543 0 R /FitH 653.532] >> endobj -522 0 obj << -/D [519 0 R /FitH 610.589] +546 0 obj << +/D [543 0 R /FitH 597.04] >> endobj -523 0 obj << -/D [519 0 R /FitH 611.737] +547 0 obj << +/D [543 0 R /FitH 598.138] >> endobj -524 0 obj << -/D [519 0 R /FitH 598.188] +548 0 obj << +/D [543 0 R /FitH 584.589] >> endobj -525 0 obj << -/D [519 0 R /FitH 584.639] +549 0 obj << +/D [543 0 R /FitH 571.04] >> endobj -518 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R /F38 526 0 R /F15 527 0 R /F36 528 0 R >> +542 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F41 487 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R /F38 550 0 R /F15 551 0 R /F36 552 0 R >> /ProcSet [ /PDF /Text ] >> endobj -534 0 obj << -/Length 1608 +559 0 obj << +/Length 2052 /Filter /FlateDecode >> stream -xڵX[s8~ўU!!4II7]ǝ>t;Cp_GH\\ҹ|O瀝s\9>FDh,lN.J3OE Sl}DѮ(7$45RN>P;f.J\ .~Ek-;x+N0F`yqq1W[g?nC>sw$G@7+(b7s'oCbBԻRniDe;1ӛ?Ԧz]_nvq,DRQ?_ԋRRڐIԱjMMO.2RU\aXM+nEuGO6Z݈Jm:ވjmTF[QCu*ŨPh6ȲLTjin72UZľ%Gl5L@L4#2a+5MT&&ڥY'Gbٍ轸lCAf"BL ?Y!78KeY\QHF&6Y)&LEҺY!>D@]b3gEB:gyhBצVyQn Ϻ1j q9"pi)G3*6F$ -EjcIPܥ(&D߄a{`2FBeצFXHj~ -OYO"sN(IR &qez|[u*6D!`^יL}J ~{ A#>ꨅs[*}ʠ`BI쾹7P -P :N@E z+pޤ2?,!:*eYx`.RWO0Ҽdwc6u9 ,$fi}@mUsͿ!K11kAM{VGP}ZoTBXBU,g d\8Z21 J"{m!zgP}Nb9$KQ YJpm scA9?kBο1GRsmp -%r?.Qwt~w`qxB0~= =JrQ60Ə2 >ePv^:W,#Y9 - Fԧ̈́"{E̥pVa`q!O~<'D!ph+qMl}a3&RЇ!i58QIXBWЁ|ғ/_ H@-9їlB2 (؃7`vC*uYMfr-r8֩yWia:A>DuIiG2Roiep#z"M{\5pK`- '2b8p\Ï3  ޗ-s/sB`GT]9!Dg1~FXZQO -tyt6=sFó?ɍ M?. {3Xg;qf"O{u+.Bՠ_3/raMk(~] +xڵXYs6~[Aǣ$;NΤ3M'C E<⦿NH ~.~?e='w"00F$HsqyrE^ AeЫbo *h&%͕^iQzh0f7[53B#~5X>z<![/>< +P1/۟rH{P3ebT[xwgTHQMnyw/Ң+8AY|ыڝq}ӕYG鲌y_/?.)^}DkiCs$U>QF+ˈ.ίᄂePJD+}ΛaYS۪/͇T=2-Siּ1Ovy}Ht[~ +)FҨkBUQu07]ъr `j9Vhќ7{I!Y?x/&]DX +; 3KAw͵4n@uW & +VQ؏=B^Oe0 ]D``՟̵+J)bQñף r,g4\ly봐ѢLh5s6]QNW9_viּ.63zPEYjߦ2FrA" 8M +O1_V>5+p ![<2{<79SEюW{+vAKҞȹIƤ͞Z"ky~"9g ch~ gGK Ѫ6s!)nPVm]Skj`ܒnù@(8-b ҏJ$DWQ:P 5‚c@W]cnlDvt24!KJ-ESX +p6mZU@i zau z`XcD#4کM SS +r4Xz.F;P֙{#1?'h 0DTcv.Hwnб9)0B$?v7s(%ݞk( +i$}xuŇw7}K|Ui^r"E9~!}OGmEO@Ft4)~DC͊PO#vʥ(3|:ΥRdf.:p7L8gLvl+USm 弓w²g Jk̶P3wom!cL.n^\e.0;Z<-6 I#ɡ{QŶ&Ԡv# D)_U4DLLc`E'G쇄e)dBs|[JX@S%LĒIDPD⣃;:T8+prhQAAH$m'gB Mٚ~+1YфX>z O33L+9|ց QlZ rq33[1Wރi۪;mQZ}r>wv'^Y'ƾL>my\=pڵ;uU52DZ/*bX;TlѼ endstream endobj -533 0 obj << +558 0 obj << /Type /Page -/Contents 534 0 R -/Resources 532 0 R +/Contents 559 0 R +/Resources 557 0 R /MediaBox [0 0 595.276 841.89] -/Parent 516 0 R -/Annots [ 531 0 R 529 0 R 530 0 R ] +/Parent 540 0 R +/Annots [ 556 0 R 553 0 R 554 0 R 555 0 R ] >> endobj -531 0 obj << +556 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -529 0 obj << +553 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] -/Rect [271.195 296.004 286.824 307.754] +/Rect [189.552 347.322 199.421 359.072] +/A << /S /GoTo /D (appendix.A) >> +>> endobj +554 0 obj << +/Type /Annot /Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [258.966 192.112 274.595 203.863] /A << /S /GoTo /D (table.3.1) >> >> endobj -530 0 obj << +555 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [383.143 262.131 398.772 273.881] /Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [382.631 158.239 398.259 169.99] /A << /S /GoTo /D (table.3.1) >> >> endobj -535 0 obj << -/D [533 0 R /FitH 764.175] +560 0 obj << +/D [558 0 R /FitH 778.724] >> endobj -58 0 obj << -/D [533 0 R /FitH 430.389] +54 0 obj << +/D [558 0 R /FitH 323.733] >> endobj -536 0 obj << -/D [533 0 R /FitH 376.002] +561 0 obj << +/D [558 0 R /FitH 270.826] >> endobj -537 0 obj << -/D [533 0 R /FitH 377.15] +562 0 obj << +/D [558 0 R /FitH 271.925] >> endobj -532 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +557 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F41 487 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -541 0 obj << -/Length 1645 +566 0 obj << +/Length 2227 /Filter /FlateDecode >> stream -xXMo8Who6$E&ivu #ѱJr"mj$`X̛7ލџѫ {ě/(0coz_Ǘ.LL.d5ñ,o}F`7EbXNן'n'eUgeoPL">7;(0~.G`z]|sD"8^}{8ʕǸ8SkEC(C/Y'UnTXh`Bq)BQ˦W"M3umr-&mVVnWYDSngWM> |2+G+du#+ -jS7DL=k~Vh,]IqSY7b 2!Ѹ%!b<ׅe) 'v.[hd135d\ԈtBA}HVVi1u,b8U08BkSolB7*NLfn$eUz]]߯]oXRk8p[dʅAl0->E4ld}%<-TV3B$wQ.l, EcK_qsO%V5$5 s, 8.xbRԆ)X%blwx?thHNT(IYM%<:bx!ضSi*J4*]{=hW.EDu>ȟW{`涃Vʠ_BK5˕A.1>L{Vr)e$[c¡{ʲ[ϭV˨Cӳ_)aG(½"_A/ Ohԛ.z{Wțȥ4d6:ζqcDѺ(4i)K>7:3Lޭ/~*ec||9^\쀙vFӳ?0aho#~|uޫn1N}Δi_Vܾ뎎 b~@DQ]a%Z+CR~$l<,GpxQݨ%! IS'iR0tgz3ϓB/'>v_i5L'UdFQ>NFɰ1\bA[:p"PW̋d^J{:Kunnr湼 yX%k\!Ym7rF J2J4=^l(l@Rc/_&+g{}SU\1w}lPvҘfG;&p=3}x lzp9@څ!%]DiٮfR+Bo4YRlLI +ų4PՅse2m vM.ճ> +e puqx2ixA#7"i8mb2@щ-ź1,:QjY+`\h(`T52UTD^ñW5l0oe(8rQ'rE WC0aK.V6ZH IZHK +UuP3KTZW''#-0fi,m^+ëC,0ŲX E:-5Wj?*&N_cS|e+x[ +Es_D}_;".$AI.LmЅRKa]u@j\N$οh3[tE'„n\ +|ۉh2ĉv HSy?dn'-+uw/r, +q/Y+?s6\f 'Sz.Ly&˺KezQq ~:Q5Y1;|?5lDN3P͜Bs,j|>\|)oư彻ڑqbKEOƼV+Z-TYTksS-fe\n $(C@h? +Ul]ꅩ6ѥ*蔏J-g k/D4CawjԱ;[7c)v[Wj#Bxʍ)T0Q"zE}l] p@!*UQ5Y֭3`- ϣ-Nˑ3 9$`|;+SXLL](֕^V؅!0$XUQT :jWI=EfWP@)ggwbZ1x +i'P1@p1Azƈ!d#^ +/v!}Tv84ōa7Q #˛.R!0i'J+JL#7 + +ixCn>~*[q$<',8> d[Ypi@S9 CÒ7|z8G+8;(wai{bc'-u66Eź 1`B>) 묐 +rm3:`+DD3_ K\$è_B0#4-7qMxs/rgsMӤ^FzMiaP6'4kϙ>}sVn +CB=?OqG3alps8զɸ?>8'Yј5?]-?}JW'A$+d endstream endobj -540 0 obj << +565 0 obj << /Type /Page -/Contents 541 0 R -/Resources 539 0 R +/Contents 566 0 R +/Resources 564 0 R /MediaBox [0 0 595.276 841.89] -/Parent 516 0 R -/Annots [ 538 0 R ] +/Parent 540 0 R +/Annots [ 563 0 R ] >> endobj -538 0 obj << +563 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> ->> endobj -542 0 obj << -/D [540 0 R /FitH 764.175] ->> endobj -62 0 obj << -/D [540 0 R /FitH 489.619] ->> endobj -543 0 obj << -/D [540 0 R /FitH 435.379] ->> endobj -544 0 obj << -/D [540 0 R /FitH 436.528] ->> endobj -66 0 obj << -/D [540 0 R /FitH 257.135] +/A << /S /GoTo /D (page.64) >> >> endobj -545 0 obj << -/D [540 0 R /FitH 202.895] +567 0 obj << +/D [565 0 R /FitH 778.724] >> endobj -546 0 obj << -/D [540 0 R /FitH 204.044] +473 0 obj << +/D [565 0 R /FitH 209.303] >> endobj -539 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R >> +564 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F41 487 0 R >> /ProcSet [ /PDF /Text ] >> endobj -550 0 obj << -/Length 1574 +572 0 obj << +/Length 2068 /Filter /FlateDecode >> stream -xڵX[s8~ϯcC$[T -˖0}fuăk_{tsbGI[ -_"ws$<]^G/|boB"νG7_xǗɔ2<KQMp,TWoM"1EArDŽ, dJ|_2 ~.0FX*0}rY^GGnG>C楷_ހ?ZyG,ѿ8&D#c&* x3{S -iLom1K"D ,ʬM:TMI$7Ӧ wN}\݈wba]'J|oECZXŢP6z]{e-όM&M3_kg鷬XݣLҷYjh&S}VemȊvVkcZV}].m jm&K#zHfu cO~8Ʉڢ8,\v/yRZYg{v3m* Ebr}8rGfZ[@1?l龜8cPkQ GS>A%}e."B]Ճ z܁YETirD;{%ʸOc$~P0FoH3עl^A4Y -}ǵ WΟ^=,(x ^L`|62rcVLs`2FquC44ÓBa LmmٰHҧ0 aFڸ~[>B1)6u}0^`e!\p_KQUQi1vgRYvvxk7e㝨$źEG!3uR-)7,mu7k ÏXJK z@ޕɤ듪cKh nƦnSᵲȯĦ|p'Pb߯𕂮2'bwY~!`H$kN+9 -:  ql^˥)2#BJtAQ9%0Q!XqNm4V(e/fks  lu2BBɮ5n:2M4;Cm6yk Ϭ{>EVyׇfhGi74Kem#>Z;*>Vxm|[v -YV=M -. cc'7,] -.,=`֫+ -/b 3uGcvs?ȉ]!cќLC5\ 3%G1؄c눦zjc68F 1t}MlcOwɎG1C> ]8A"U[OK?88Zs~й@ >N Z(5Ft0`'\r%}ԙāNc~4xtC#hIX# 遙'_A?#iH)xlFOhL<#w.K!)C:3ǹ/aK -KQ껾 -}7tQtT.E'_d9v^7꺳_-$kIɜ}kI?Z-P)띂QbO +xY]s۶}`$XE=:74SYӦHH".,H@Tv:} {vYȶm-^^l˱̞9jcMm5 #z3kZo_?'n`tC7"wqo\rV< F_d:8V8/W6 -_>.Wwuүӕo#̦~ͶREֱ]# έv-Lt&7"-aZRTBi⼡:.q,X:г Z3a1Eލ@ RS XRm>:N>K^d0'^ʾ6 +V~6x06ix|T%Omv}.pG~08ȉ۟7 GI+:ٙ#.r`%f$5^\nMSvc'sn~U4E)j|ih}*XQgoSkzKO[^u$e[Om҆KqQʢ@7A̵;ʬ#1tx4t L{aZaS]z~ 8s $!0?] ]+]%6 dJ`R(G>].kGĶgI5ZͿծn~y/ުU%?#0י>> endobj -547 0 obj << +569 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] /Subtype /Link -/A << /S /GoTo /D (page.57) >> ->> endobj -551 0 obj << -/D [549 0 R /FitH 764.175] ->> endobj -70 0 obj << -/D [549 0 R /FitH 263.54] ->> endobj -552 0 obj << -/D [549 0 R /FitH 208.231] ->> endobj -553 0 obj << -/D [549 0 R /FitH 209.379] ->> endobj -548 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F63 515 0 R /F59 486 0 R /F4 484 0 R /F61 505 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -557 0 obj << -/Length 1389 -/Filter /FlateDecode ->> -stream -xXr8+p, qʙdlU@*piEtbi*XzyADD IHj|)/xV 4[, VsL&_V@!Þ䠩+saA\UZfaXRN1עM<#X"I+ d ~30׎qŻ٧/%$0@vyci3t;)X90dN 9%3'Kcs(N_@UGd]P.ͣZ%Ԍ?A}ZNml(,MU]JFvȒMڸa<)L )gy 7nJ͎cx5BD:~WU\Z3BWΥuuxu -$^.%4QJc7:lNm3!{ņPf1$5c!M>ܪnAy-p1#offˎc^G_m Q 7t(% 1c}')#ȑ@B^'!QeZ8Lj:k}L #`@$LJz')iRЇ|;k8 2 6xI/ Fm _O JN %N` f i($v?.e0)GSHDDY{K{ڼ/}sl\zS™4`n!Mٔ4O' ۪t\,I[MqZ5?%Łh? %{MBx]ϧ8 6)nU c5:*G@ w=m EG - -endstream -endobj -556 0 obj << -/Type /Page -/Contents 557 0 R -/Resources 555 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 516 0 R -/Annots [ 554 0 R ] ->> endobj -554 0 obj << -/Type /Annot /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> ->> endobj -558 0 obj << -/D [556 0 R /FitH 764.175] +/A << /S /GoTo /D (page.64) >> >> endobj -74 0 obj << -/D [556 0 R /FitH 519.718] ->> endobj -559 0 obj << -/D [556 0 R /FitH 466.253] ->> endobj -560 0 obj << -/D [556 0 R /FitH 467.402] ->> endobj -555 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F63 515 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -564 0 obj << -/Length 1311 -/Filter /FlateDecode ->> -stream -xXMs6W(v"7vF5!Ɂ!STIʲ J$GiDhvx nF?Fo1Vě-#) -(S,>o~џPǷz c͵#6Q}(EE`R>EHˆ-Z6؄5# -p}fS֖^q8Fp5M4AsO&( -!x.w9N8 o>㼴\W؛ Zmi-7-SVE !3{/>B\&|38ap"Who -fIc6R -à j.>cl{,ƐSuIVRhp1! g KGHg&i _Š" ^mۘ(>HǪ S#XHNVCĶpoʠ@Rf=i^~Y $MK6HERH0qГ?+7rmW )UZ͞ti#Nw5坃}ICLN(9Ģ"(?a43𔆰VE5.g:/ ~Vhg,/,tUnk4Ջ~EFVuOѳL\XD<]L_>!R̿{.  VWj*]6<'Sfr^$뚤o\,M6;_'?rkX?a8wY "#d`-1w.D4#phaF QN=1{wW(Y@ `HB %k,4WJY?)e@H,e{JWp!rw=i)@r!.ղ7N˚sRLi 1#gBI\݀-rUX 36L!封";[spW^g-{yJpPG4i0oo ҍ| s;/b<ksFi⊠=Nn) -endstream -endobj -563 0 obj << -/Type /Page -/Contents 564 0 R -/Resources 562 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 570 0 R -/Annots [ 561 0 R ] ->> endobj -561 0 obj << +568 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] /Subtype /Link -/A << /S /GoTo /D (page.57) >> ->> endobj -565 0 obj << -/D [563 0 R /FitH 764.175] ->> endobj -78 0 obj << -/D [563 0 R /FitH 739.268] ->> endobj -566 0 obj << -/D [563 0 R /FitH 692.51] ->> endobj -567 0 obj << -/D [563 0 R /FitH 693.659] ->> endobj -82 0 obj << -/D [563 0 R /FitH 449.379] ->> endobj -568 0 obj << -/D [563 0 R /FitH 392.967] +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [112.59 226.819 122.458 238.569] +/A << /S /GoTo /D (appendix.A) >> >> endobj -569 0 obj << -/D [563 0 R /FitH 394.115] +573 0 obj << +/D [571 0 R /FitH 778.724] >> endobj -562 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +570 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F41 487 0 R >> /ProcSet [ /PDF /Text ] >> endobj -574 0 obj << -/Length 1561 +577 0 obj << +/Length 1457 /Filter /FlateDecode >> stream -xڵXr6+f" hWIdqSQNj$ Z,Ni# )ȖmyE^u!F ,VAQyP,:xr6 O/Jֳ0r)?ҲKBAQCԣ9w6uW~AIH6=WK 6 _+ F<5Yיs_L~L<Ѷ' -Y| ; " 6ʛ b!brLrp}h MPM>Wl|ͺ:Jks&?7Ifd 8anW5!XQFzpgiEy`ix=&j(*HEڈe#! k"ŧԆ5+\UEm*}տ^շuVݭש$ :ݛ3zXBb] Ӷ{_1FxeA7b+*!>( V"σdZV@aeP#ueilȖn>|Nػxc¿u{1N4,M~gF><T`hlbx!ۮV>n/Jy@oM|? pt0h&u\78n/[1o{Nr^}܀ϛZ+ey!BGd.g>t~3WUe++u㢭ZVZÄD[Ļb\_Ht\m{0IAYTާy{+a,@j=&`M\+Mz[q@IO:&]yN@O {S4;c'M: $ QH)REYdF8?85?x~!v~~{=؆󳥟~Fxmh@XC}ǡ?c&JiS"LXO8X+$GL\8&Ul=5 +xXn8}WjVJ}f۠MY-LBեn~>$eppxЮq\|r u"J,׎"_>"T:˕yzxs=N/Ze3MU )xuh +KRm= (My9 ]1ؘ EnA蝏gz`x Q$=7_]g߽*}g_q3p\M>6pMs0Fsҥ&Mޟig؟F*awiP-M3'WթA)"ۤ~.x9\K3ϙc>w2;7BR8RޏSH$, f^؆ F>`C`U`=D|ϑ Ӱ8*1 nX] X}<NbpΞ`GK~UU#J,<(Wϔ4Zew, 3Jۊx>cu$Yt}zRD +8.CmVO8'alȅn7Aܨ:Xwc*:ҝ-KUIaT'\OY+?8mס$,O7YSZUO&zcXȪn}k[Ӆvt,/ahhdyljqe5s#) 1Cu %Ht4]ˌb(>4*(-s+*U LDc6p-(O?`J3 endstream endobj -573 0 obj << +576 0 obj << /Type /Page -/Contents 574 0 R -/Resources 572 0 R +/Contents 577 0 R +/Resources 575 0 R /MediaBox [0 0 595.276 841.89] -/Parent 570 0 R -/Annots [ 571 0 R ] +/Parent 540 0 R +/Annots [ 574 0 R ] >> endobj -571 0 obj << +574 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -575 0 obj << -/D [573 0 R /FitH 764.175] +578 0 obj << +/D [576 0 R /FitH 778.724] >> endobj -86 0 obj << -/D [573 0 R /FitH 657.39] +58 0 obj << +/D [576 0 R /FitH 739.268] >> endobj -576 0 obj << -/D [573 0 R /FitH 603.15] +579 0 obj << +/D [576 0 R /FitH 692.43] >> endobj -577 0 obj << -/D [573 0 R /FitH 604.298] +580 0 obj << +/D [576 0 R /FitH 693.528] >> endobj -90 0 obj << -/D [573 0 R /FitH 236.959] +62 0 obj << +/D [576 0 R /FitH 514.136] >> endobj -578 0 obj << -/D [573 0 R /FitH 182.571] +581 0 obj << +/D [576 0 R /FitH 459.896] >> endobj -579 0 obj << -/D [573 0 R /FitH 183.72] +582 0 obj << +/D [576 0 R /FitH 460.995] >> endobj -572 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +575 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F41 487 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -585 0 obj << -/Length 1139 +586 0 obj << +/Length 1458 /Filter /FlateDecode >> stream -xX]6}#}L;u=Im&,Ϳ ؛zm<>qu!h_L~Q5-V'8P -*k'ěɧL4a G]( -}=yJg"za5QN=gaSOV`R}rs;k;o -!#/i A<\h_Y>!!9&pUL,2A ɔݩi 7!RS*ln]n뒶?ΌWS,x[5oeƫu8a(2Jzx -Ļ_ˍ9V$HqOYd޴-2ŷ2ۺđIR_}u#),7>Tb-%sy -Tyr0ЛojyU63~'a޵^|Omp;R8(< -Zڎ  J9>$ ZuzGE -B-iSMIτ[V\٪GN%^kuU>& HB($0H# tzvޕ=Gn:l *AorZvcUbR8ID-g =pyܳL$]P+;T 'oBEG%gP@*rzlZBD}X2PX - ?՝paV|@Q&,Qc(59VRuʝ)횟UX2y `Zc -U,$S b-!QbB_U.@zVUj1r - &֭)1lC֕**`yE6V<6SuW}GoI(Lb!}P-U^b$NxUt櫡ę.wB_8@S;oqsD&12NM}mb;:eپ*6.]7 &WW9޽ǧNYhmq::9xe&-jL֤Q[l(-=_z:o Siwo-#8ٷůO\E//T?bͱ/Y45j o]3.6| |rK a +xڵX[s8~ީUIH{I3dlnNFr,Dln}d\>}waxv1y(+/( Dyuz|r6OJ3?,V2d:)QĄj+o>6+~L(͉OB>=3k FןB>O`Z@rب +cX<pzzuvzrruŅݪL^j H3͜lzN0Fa/;xk8|ЅVɺP?*Ur nT(ӾmvhXQ fgR=!bx|b_bvr,nQC$mp{ŇA 5|D1n8L>V5%:U.% |S{OevSʹeKqez>*6;$B0bg+(@ƀ¡2 ļE6i4 +7zL,`wr>XCcܘvPsV[zOD Cb稏 XzdM1p[<8e.sK@t[ue +20m 3&]htQ - Ԭ ><>3sc x-1G%hޚ4+ uuMvZk=1%.0IG!0qz>q ^({P)E:3w,Fi;ŰA +΂2Fk,O@JrzflLmNj! y42ޔw8N:eَK]]0P<]c[\;l&FgmZ=L=}? g71t[6w0FHq[B6ou\-D:z;> endobj -582 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/Parent 590 0 R +/Annots [ 583 0 R ] >> endobj -580 0 obj << +583 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [411.812 218.812 427.44 230.562] /Subtype /Link -/A << /S /GoTo /D (table.3.2) >> ->> endobj -581 0 obj << -/Type /Annot /Border[0 0 0]/H/N/C[1 0 0] -/Rect [429.157 173.72 444.786 185.47] -/Subtype /Link -/A << /S /GoTo /D (table.3.2) >> ->> endobj -586 0 obj << -/D [584 0 R /FitH 764.175] ->> endobj -94 0 obj << -/D [584 0 R /FitH 595.222] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> >> endobj 587 0 obj << -/D [584 0 R /FitH 541.349] +/D [585 0 R /FitH 778.724] >> endobj -588 0 obj << -/D [584 0 R /FitH 542.498] +66 0 obj << +/D [585 0 R /FitH 517.787] >> endobj -98 0 obj << -/D [584 0 R /FitH 354.567] +588 0 obj << +/D [585 0 R /FitH 462.477] >> endobj 589 0 obj << -/D [584 0 R /FitH 298.442] +/D [585 0 R /FitH 463.576] >> endobj -590 0 obj << -/D [584 0 R /FitH 299.59] ->> endobj -583 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +584 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F41 487 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj 594 0 obj << -/Length 1566 +/Length 1507 /Filter /FlateDecode >> stream -xX[s:~fV%FY la}fO( v1b~eU?gه"!EJ5j1Eg<{B|]kl^IFdW_#AϬx=[ x0ȵ21WZ&D`M;^"ٔү:>=[i'U I>/\(]%"ɮ I^)o(K=OC̀nlK1R]{|_2Y^.};=^ !]ۿ)8]XfH7= .kDxTY[( EȗB$za& ;0`ι\,L𓲡RQZ9eg#U$A(hpFC;C٤H,h1O9d_ʅ&$]ksZA=E^n͛j m8RWߪ(M(n2W7 -` -iy(" y-] Fc,^0q$ɽ:k('yhPscڝEPj8.j1=C/ H@Ĝh#< QBll=L0:5B(m="jv̰^::Fc zg)DMƒBDR;$x @*k~!tt'9W,Zi=,=dԙ5[3{3 -7EGZ3-R<5MA/.wuJd-[2חMOm³hU1aRnϗ*egDK4Y@R*Q&'#ɘjy[N"LtzEA&rOw`hoy=N9"!Ҥ^C + l)e8dM0{P892 6)nS`U;4ux:| rF᝝}nd 'y4 O70`Bnk)x[TF=Q)uڊvr樷qUZWv=50WQIGa^F5D_BBƮ11Z4.*Q-''63@p:~sDGp(l2&F=m> PϠ`Lu}*#fsS]wen[͐hQ۽,S7]İ(P3%v+?zmHC:@Ƞ  4aq߈nǾ+' +ZXڹU#A#ѩ?3|<巏8+X((ɦ ~ԆVNr8~^JPY*H +7jOQ6Go;l@S}ۈy>Ňcn) YQIw|?ڃ3{=<ĈB_$t wǯ'nmf?ǵLCuUTx5uK)3.6KjW+[UerQ̇uu;#_uڧ%2e.:]M endstream endobj 593 0 obj << @@ -2052,53 +2010,50 @@ /Contents 594 0 R /Resources 592 0 R /MediaBox [0 0 595.276 841.89] -/Parent 570 0 R +/Parent 590 0 R /Annots [ 591 0 R ] >> endobj 591 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj 595 0 obj << -/D [593 0 R /FitH 764.175] +/D [593 0 R /FitH 778.724] >> endobj -102 0 obj << -/D [593 0 R /FitH 598.013] +70 0 obj << +/D [593 0 R /FitH 739.268] >> endobj 596 0 obj << -/D [593 0 R /FitH 543.773] +/D [593 0 R /FitH 693.573] >> endobj 597 0 obj << -/D [593 0 R /FitH 544.921] +/D [593 0 R /FitH 694.672] >> endobj -106 0 obj << -/D [593 0 R /FitH 351.98] +74 0 obj << +/D [593 0 R /FitH 324.493] >> endobj 598 0 obj << -/D [593 0 R /FitH 297.74] +/D [593 0 R /FitH 271.396] >> endobj 599 0 obj << -/D [593 0 R /FitH 298.888] +/D [593 0 R /FitH 272.495] >> endobj 592 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R /F41 487 0 R >> /ProcSet [ /PDF /Text ] >> endobj 603 0 obj << -/Length 1541 +/Length 1341 /Filter /FlateDecode >> stream -xXIs6WHXA\S&d܌CDr>7A84$o_9wYY={xPع)CI9q ?H边|}sYugLmNyGwLp0 -[uM)Q'Ľ;gxj`}~l+:-׫+ (QҘ8~;@9{'$"dr>z5MM~O隵]-烜K56x \pXƚ.yPovZEdzvPw*Zf_rՂw-&lE=a[f`~fmM36V߶]k,4G4GQJHzٮ}튵OpР&B%!jU_$<.@5m\ Dz`RӺ2r箼ۙ=P/(fUqVYZTy"**ɥTɭ7:F0'C,:鑦|/( ٘ǰ6S$~3#l„teI=1-IG2ih>y[o"HZ>$ -CWd<-~Jhd$ :w\@$ygq+,+UI鞵bNqEN^eyW+K -K.BpLcMs:_[e>jd\AAMfڎjgn)+DU)J~PV-}֗//pcD2l=Moy|~02f&\Nd1{Cfr6)d - ]Yto>q/^ˋ_3]cZ񐓟vikBK_N]/{w0TAq2~,wo2a)[A?$ -1|u\Yb6ʿ]hnf(3QoK)DĽ~h9x ̳j LM+U|zl% EZ/ .1'\![=-ۇo#5ldC}|]QhȮ_V~_ +xXK8WpbEH>1;qUI ȶ0Lxęm! yj.iuyػXY~c`xb$8B.#ozZSWr+˕.eHW7qy*QpNjzμmER*r@QZ{&V{Sǫ恑~,.N( +`/wl%^|mp}X۩kaLT [dݔ/㬑:8r^҈ 1"Z?dݯtWeI|'Vh:[><-V-+ΖhwL 9/>^QN+<ܚպ2΄ٞeൔcǶ܏E}gHνivlD#`gLsBJRY`\K* gt߇&Յ}jyFd:ژZcP$(bZtOq>H@bl{WHc.iF 2 +jx5tΑcz bJm{}3ahqD"$F"Sqe9)Ӓ/`g2>٩^ kSOD9_;h hz\N0p!x +('"{LN&mj~+TjHE}Ys{]kGsO;1`ySy=rD@_Z~zGWS' "^젽T=/#O@gPVMȋRViQ|{n=GAcw:`! הfl2>݁Ȗqѿ۴0lUX~岀,atǵq,Mgdq..ྛ6~zg 7/iRY<<}3m+O*o[ Gl]ôuB(dN0kN+xr$!|n#W]3xd4d~ҭ6Uo;pJ|gvL`MsFc $_8 p7-gV,U!)T#Vg}+$$kRx}]a§2)X#]%f>+$gfIG&b3i2 d7v^wxem{DVU\vn8wz=³nW廎dB֎eJgDhQH~k9-" 6'{6(JuHU'\PF84̰]]qf6f~ UߓhIN?ˤ endstream endobj 602 0 obj << @@ -2106,46 +2061,42 @@ /Contents 603 0 R /Resources 601 0 R /MediaBox [0 0 595.276 841.89] -/Parent 570 0 R +/Parent 590 0 R /Annots [ 600 0 R ] >> endobj 600 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj 604 0 obj << -/D [602 0 R /FitH 764.175] +/D [602 0 R /FitH 778.724] >> endobj -110 0 obj << -/D [602 0 R /FitH 552.438] +78 0 obj << +/D [602 0 R /FitH 558.959] >> endobj 605 0 obj << -/D [602 0 R /FitH 497.724] +/D [602 0 R /FitH 504.719] >> endobj 606 0 obj << -/D [602 0 R /FitH 498.872] +/D [602 0 R /FitH 505.818] >> endobj 601 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj 610 0 obj << -/Length 1856 +/Length 1470 /Filter /FlateDecode >> stream -xڵZMs6W($S&n3M&uxLb.`-=]^ߎ^e#I,wB!@2ν?~L)P *)}Q2~!L%ʫo=!|vYI dJ [$xG #\7#gvcD֬!po}9 0zr9C'ާ_5\&xGM4D [71`gx6E<)#Hn>ګ8=[3 -$EP9 G ^ʊv3ƚ5Xcf(]*;bR6EK_"INU#q:L('8I2;vs̨G[-t$|yQCm~Vkvvevjn>VD\Qi$紊@""bLkױ=j;ZA$B4_54-HEMB0_ NS※яT"]֓T{JCe-@Fal'Q=RpD&z)Ѭ`_LGS&`; =1tO[5-e W! S3!)ɝ|\fjinrOBZ*ix2fɰL:RL$R2_w:L޶IDz>ea=h6,șK6,|ܦ19mC ,#m0En[O-M}kasP' -mFkCEVt -SaOg|c5Z{ -pWfaV))ĆV=D&$b!|Wba'y1&I],HRUd*tOS(A]@}t -wqډR(_EySI5 3Kţ] Ԓx"[P6@S -j -إ(Jkrx8>m7 -NcY'R}~guI5WU4I|mc^)~ O)?J=k"5uEp!. DB"g'U'hx6?RQu~*ơR7I-)FM(=עP9<~=ҥ]S[O*=DT ~I2<΅&ILkW]sY[3)yAF -SZ@]iYٲ0 ,g jY,d-3].bw>- Զ,V”&5eSoIf!B 2GF5Ȏ욀bw>V%ב>w/WK7gSG7IQU*gJą5 GߵȎbw> 50}nugQy07wuDPpajh]X ͮ vcPtdA,څ5p!H$໖Dٱ$ܛ]A:! ,gt$^'r;T4 $A4HAv+g0"؝U -ʟ"ڒߣkgG=//Ґ"pUN2'GdY|1ajaw0Gams8\fUsn:IMRն:A/ra+B*'p dZ5rn4syl`9}h7M_1mΕ/yxpa]l:Yކ@4'˒JUkLuooDYc!Rddx{LfŞǫNBw=.`U7TIWH -9 +xڵXMs6W(DI=9IFM\[I&CK) $]ER-?؇ݷK޵xGofh@boEBxқ-w`|*i8Vz?cS#@61ARrrc>Vyd> ('∏̻Hx +޺=?lگKpmE2f{-G@26q83 N_ \E =䜴i"AMEIp$u\8ыxsiz-a7!!QhZX_J;]ƿjVgce{{@EIf80ϙc1r-[NߏCv<  ~ rzhkH#;F90/رMuH9aîbT85p<!mX!sHf,Q(~:Vh!\:4fj\'CF:-?TF7/>_50?UpBL"_Dp:G@ iblztNsB1aBX+(@13NtVuZ_>qJ2KSk3`ͳ2+noCۄ*|{2;B Z^lEz{RfCYJ)ӓb0GF'EjZu-{#UUz12 X[Z "Ě15XHLc2[akBDd [mb umo؇0iD}e:m7b~VTM𵆉h_1Pr\f%tkU6:jOݶ*yr[aʱՓUtX;b0NVqd}vf5]섆ZK5՟򠝻Y0~H؛g7t XuX_gufsnts7+XBA58Ԡ*JDiF␑K8) +م0Vp߾Y/unjL'ISz6 lE)Q?N|_fӿO?.y85FCK%s"}p;`!MNj/lvO+٣@E+E' 0EHP=DAr$wz̴/ +@=b7o Cp|`FJ[}!1L|~]{|OcPtpN#5V*w3#ыH@Sr\)HQB˯KQQ4pyX' endstream endobj 609 0 obj << @@ -2153,546 +2104,543 @@ /Contents 610 0 R /Resources 608 0 R /MediaBox [0 0 595.276 841.89] -/Parent 570 0 R +/Parent 590 0 R /Annots [ 607 0 R ] >> endobj 607 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj 611 0 obj << -/D [609 0 R /FitH 764.175] +/D [609 0 R /FitH 778.724] >> endobj -114 0 obj << +82 0 obj << /D [609 0 R /FitH 739.268] >> endobj -118 0 obj << -/D [609 0 R /FitH 664.829] ->> endobj 612 0 obj << -/D [609 0 R /FitH 610.589] +/D [609 0 R /FitH 692.43] >> endobj 613 0 obj << -/D [609 0 R /FitH 611.737] +/D [609 0 R /FitH 693.528] +>> endobj +86 0 obj << +/D [609 0 R /FitH 294.421] >> endobj 614 0 obj << -/D [609 0 R /FitH 372.982] +/D [609 0 R /FitH 237.928] >> endobj 615 0 obj << -/D [609 0 R /FitH 374.278] ->> endobj -616 0 obj << -/D [609 0 R /FitH 360.729] ->> endobj -618 0 obj << -/D [609 0 R /FitH 347.179] ->> endobj -619 0 obj << -/D [609 0 R /FitH 333.63] ->> endobj -620 0 obj << -/D [609 0 R /FitH 320.081] ->> endobj -621 0 obj << -/D [609 0 R /FitH 306.532] +/D [609 0 R /FitH 239.027] >> endobj 608 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R /F65 617 0 R /F38 526 0 R /F15 527 0 R /F26 337 0 R >> +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -625 0 obj << -/Length 1360 +621 0 obj << +/Length 1154 /Filter /FlateDecode >> stream -xڵXKs6W(uL9mi餎9$9"$sJ*EY(;Y$Ƿ.M4\/&on8A-V("XI"01ZtYꕮf0b]Va9 (JL?ߒMxBDStʹ~_LPк8#ɗo{ccsiwER 019q0q1@!u:u[e-BFKATU:O`XwĊzۣJmCI[@B TiEyY 2昞Iix(Ʊd,th~%&u,F2g$ĨXX uT\aS|+hzb@?7Ǡ -{aM 5L`!~ڗUr㺚ʔtc4,$",ghȳ)|% dx!K7#1D54HpOqLe4FOa#P xK <+Ш5}UQYo Ϗ^CA\ƅorYdLCh$X_h+`A*'VB5]y"\zc٠b]MɣmjrrhѝUz[V;gt͝vѻv}0(+lƄ)=2ՋL(f[} -RQڗjZɌm'KKV{Q:]V b8vSu\L;ӎeIjW7Ƌ(bW'y54Hi NNnanuzm26RtI -/*WgH=Rm.iak9b ekỲQG`4` -N4ISWp(Wb{DYucf.-¹c]m(|1)hQN^xa -b{ ֏循lsݴO@T`/xPxSh@ɕߟVUy:!ReD7mJaHy#eN ]^ae +xX]sF}ׯG7 <&mqqU!+ eXjd M {޳s!t;{y G$hBR(P!fŨ:fDkwT$#%ZGKb?e싻S.J=+GR2p@͓c)"xj7o&4dyPjgq*?#d~-|TzJ0H'3 A=z/Za8jEU@Snf- Rfx^@}Qū6T-;!8`WL J@C'@zeM 9h2$X]` "J#9 c5|.Ċc941?>Ia +r%y=WW/t"'҉:.E.QT9qEn)K(k(']vg5ܲR?AKG i7u-znVCҕO+\Puq B`)5@S܊ma=Ӭp@#\NoVz3^YC5+W 5SP|>qA©-4y ?w*Fro4UpNy'o Qsx8&*rr'X}Z(褎7_3ᄡeղ[׍&pۜ+e揮߮ڞnڵ(Ub%mkڮR_2}f8AvΈC=Mu2Ӷ8Ml̓A,J1"O:b(C(缧C/gP8'C`]v(V؂+͚4+> endobj -622 0 obj << +618 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -626 0 obj << -/D [624 0 R /FitH 764.175] +616 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [411.812 263.876 427.44 275.626] +/A << /S /GoTo /D (table.3.2) >> >> endobj -122 0 obj << -/D [624 0 R /FitH 739.268] +617 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [484.204 218.793 499.833 230.543] +/A << /S /GoTo /D (table.3.2) >> >> endobj -627 0 obj << -/D [624 0 R /FitH 692.43] +622 0 obj << +/D [620 0 R /FitH 778.724] >> endobj -628 0 obj << -/D [624 0 R /FitH 693.578] +90 0 obj << +/D [620 0 R /FitH 640.335] >> endobj 623 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +/D [620 0 R /FitH 586.468] +>> endobj +624 0 obj << +/D [620 0 R /FitH 587.566] +>> endobj +94 0 obj << +/D [620 0 R /FitH 399.671] +>> endobj +625 0 obj << +/D [620 0 R /FitH 343.55] +>> endobj +626 0 obj << +/D [620 0 R /FitH 344.649] +>> endobj +619 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -633 0 obj << -/Length 1560 +630 0 obj << +/Length 2109 /Filter /FlateDecode >> stream -xX[wF~ׯQ:.}sZ'M&INEAb7e/ٖO` ug3v켜<_LpC0 -qH1 -8w| "q>N_yq9Sb)ʙOE u(oly. ) ZWaSQViٜ$`s,$|&'q#`z `3_io#>sIk@pk%oyy?µaCEl ]'LHzBƪt^*~U\k`ffX_5fQ64X+K)ά`I+X7>W'V%#֠YU2ƿJmJ#^ XQ*VPmn (JҦn뱍t#uGrnܱKR4l~[ cqjxhu[ Ez83eY܌HhY.wt@ju:|916`7oyvƖSN]ѕ5^ND,ۦd74hGN3˥g -冴t8rj PDS[ c2hP 5 3x57`G( w͹?9$taO^G=&ˑX wb,xG`9@ rlLcf9$xe9m?sޓ!$G"@rZ;Nh'9o_l= +xś[s+xu}ca*!3[{)'a kfg~i9(&UuR,Ւt;Nu:Aґ3{x\ٲ[zwNӝaܣ^7aVtD`czSX\ +='zwxFYA^S,xwyX>sq szum,˟}! C{E?}8E)ם۳ͽ +IDA6\@h]P[ *&RīPt`zQe? +6a:K!ZJn[1cR2/.QAto8\r_ y|61{gjϫh}Y݅QO#\ zo}Tò8c0bVX2$̾ϋ_Ԇ%Ъ$HDHю(TCb/x4 kW JU .b~wb6HK\J$ 8Pp*2i1Z[F+aT盖)=t8J"\q1vdFR+P=|..r˥_? g5m^ ׺6UiWIiGSfpeupQ%uo-rg!\wWSiC.BSqFx  $s0%8t}Bi.@SC1MG``!ad A n#g|iC.BSzzUw@6h#Ғ QG;ڙ_S(mHPEhrl<#v() ۙ?^iC.DS$Gp6SIL$/qì{L2ty1J_Ӟ8Y-%n LH,]ض>){bxe% @+I0fE@[IjyCWA!)&(LCI{H@5tLv<3@!潻yGcEBs*@[e2%LAfw(\W_.kB |A] vC6sy;Θ(VLs+:Ɋ,ZNA4K@eR*N =Ȕ@XQ`f*xF4 Xf&=bTw`VD)5B0)U%F@&1*zQռkY!岕BPIҭpdziRrVd)5BFx:/5r(HC&TV/Toĉ]N%2K3TX0 w?`O4†(FTd1EzM¾\c1Np +np@Wqװ{ɪ7W؟G0^EKaǯȅ@JtcNSTcm8(~ưZ Z$]F#M1KI45*_f $u N[P{{X(nυR;٩Piߟo&~!CRKfNzצ,٫ڹI .tuSaJv1 qbH KUWph~2!Vd)4"Mgq~"Q_("?3 ^}Ĺ `B|݋@Qsu@~x +"kZd3T&{)F endstream endobj -632 0 obj << +629 0 obj << /Type /Page -/Contents 633 0 R -/Resources 631 0 R +/Contents 630 0 R +/Resources 628 0 R /MediaBox [0 0 595.276 841.89] -/Parent 629 0 R -/Annots [ 630 0 R ] +/Parent 590 0 R +/Annots [ 627 0 R ] >> endobj -630 0 obj << +627 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -634 0 obj << -/D [632 0 R /FitH 764.175] +631 0 obj << +/D [629 0 R /FitH 778.724] >> endobj -126 0 obj << -/D [632 0 R /FitH 739.268] +474 0 obj << +/D [629 0 R /FitH 220.86] >> endobj -130 0 obj << -/D [632 0 R /FitH 583.534] +628 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 635 0 obj << -/D [632 0 R /FitH 529.294] +/Length 1792 +/Filter /FlateDecode +>> +stream +xY]s:}3$n&4udc|7w$ 6NǙAiϮvϪعss{?İC0 +p@0p<#g2uO>} )|L#} U ~N>kB"W0Bywyޗyg~@7F|޿T;M +p0_Ko[zk4#p m,b(-zbg +> |g]\8.gjsh^MG γR]D`7.0: !6:.5K}W,/T\SpBuM4P_h0d/ʹP<\u$eSLj#~ݻ7l\05ӖwKLr'CD1⸈fmc=?0\=ƒ!uRfӊ!yeKFp9ݲyV"InXqgE63;O4@ DF9%&NIjY>QmVӬ4tbάR4LDD.ny,"2 +8u+AXރCq*3>:{@!hU H7?0j4l#f ÕJh?nHor؟6v<m[n=6PB SA.ubZ%V!R21.j*Һ¦HmxY)[y\ڟҨԭKR 7xnd/5WɅ73tSVrUZM{tyl0FEMwz\&]Wf.VC5 x۴w(wwK*IkIx +3p_R`TAzC]T@դA`(0~.kd%fhY )O ^f=o|.PTvxtUܿiX-1jqkI,,o2Qj.> endobj +632 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> >> endobj 636 0 obj << -/D [632 0 R /FitH 530.442] +/D [634 0 R /FitH 778.724] >> endobj -134 0 obj << -/D [632 0 R /FitH 251.172] +98 0 obj << +/D [634 0 R /FitH 612.578] >> endobj 637 0 obj << -/D [632 0 R /FitH 196.785] +/D [634 0 R /FitH 559.385] >> endobj 638 0 obj << -/D [632 0 R /FitH 197.933] +/D [634 0 R /FitH 560.484] >> endobj -631 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R >> +102 0 obj << +/D [634 0 R /FitH 318.104] +>> endobj +639 0 obj << +/D [634 0 R /FitH 264.911] +>> endobj +640 0 obj << +/D [634 0 R /FitH 266.01] +>> endobj +633 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F41 487 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -643 0 obj << -/Length 1598 +645 0 obj << +/Length 1424 /Filter /FlateDecode >> stream -xڽX]w6.X2[,[eIvz,,\z~@€q4.o=z^aɛw {#%^Q$Q&qzF9^*}NUf8_Ǚgź( 4RN.Λ_|§"o(0Z1' #\`zly̳~^O>O$r]7:Y6OV]櫵s!мJUc -?c`ʟ+gtg -vnKt97uڹRŭ=Y<ةͺ.fJoN31t3bZ\$,VkeTyO~RP/1e^"QU[+OuU;Xw+bFElpS<-%e#,$b[̘Q( oJgYk\O )djL͏ 26h,q8љ5KniҐ",ۘ9N+zLi$i^?Dp -[v6 XHqԆ8##NV`#SkK??#9F yo&FCǨHB%Q -;i{wVjUF@~ړrSiuN 1Wu"B5qsӂ[ֲ QNnT6N-FD!YAi1`ZҿT!Q,ўqvum?rmD<A@af<qyJ-:tq;ĝI"9 - xIAE6X(w'nA CDaG)K)vup0@"=p3iOAPV K/٥e9 Pw0CH$}2icY07ew*Pm1L?9HL@. | _N_D 1 q+Dww~w^CDL{@<:ŐAw;a{XuJoNʞ欿)r3j|Cs=u ;Wkل+U&q2c(&W7Q4f[k+a',!|v2n-9: !#k;#>홾RIgDsǿLtVKbEYZ9Ő8KO6x/*ծp54ͺdE<\ 8nʥlU>H_-scp_ׂתLU5eXb[&ɡ_l Zm+o +Z./o_V.yU +Wk.o;3B1^(p\䶿 +T޽^tƮ6iEC$ŇO»#RzJycD9H0c= N:[_noX<j *^/);bgxNT#lL& ͞UAHw|T>_J>4Z{ +%cr\"s'U>dlDz27MNs(mT8h#&^0͛QGº)Xu mW%>R1:\) (-ýRb7p*F18ˏPmz]sy(4J=fEe BBD{5)5]Sd;m_o&],PaǏ0IzQ9"TmQYq;1(:m)"԰VugEc{P +qp&nCD"6#, ;WA;{RtF#,O00=?F1Y!Ayg`CgP{>]Vj6?$f"v$/-806G1O +-82`S?\pz^p&RhiX4D@>}:;p:Dt 0Iڒ۲~%nf~:ggӞ(Fk ysa8z֖M&yjF3YyK)EA?mǪ|8y6߻l~ysstgtO =fy/F]9 +|g8i.gC#}aQ*>t|_8Uݟ77W ~}nW^6a.v|Gu#솰|D@ўp%`];AM<6zZbv190_B.);@ +WiLHCҴ#d" lT>gʹaR| ehnD)/ SQPҦηAYmz7xMA+\X:g>8UͶWh q endstream endobj -642 0 obj << +644 0 obj << /Type /Page -/Contents 643 0 R -/Resources 641 0 R +/Contents 645 0 R +/Resources 643 0 R /MediaBox [0 0 595.276 841.89] -/Parent 629 0 R -/Annots [ 640 0 R 639 0 R ] +/Parent 641 0 R +/Annots [ 642 0 R ] >> endobj -640 0 obj << +642 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] /Subtype /Link -/A << /S /GoTo /D (page.57) >> ->> endobj -639 0 obj << -/Type /Annot /Border[0 0 0]/H/N/C[1 0 0] -/Rect [369.78 297.598 385.409 309.348] -/Subtype /Link -/A << /S /GoTo /D (table.3.3) >> +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> >> endobj -644 0 obj << -/D [642 0 R /FitH 764.175] +646 0 obj << +/D [644 0 R /FitH 778.724] >> endobj -138 0 obj << -/D [642 0 R /FitH 445.385] +106 0 obj << +/D [644 0 R /FitH 538.635] >> endobj -645 0 obj << -/D [642 0 R /FitH 391.145] +647 0 obj << +/D [644 0 R /FitH 484.395] >> endobj -646 0 obj << -/D [642 0 R /FitH 392.293] +648 0 obj << +/D [644 0 R /FitH 485.494] >> endobj -641 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +643 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -651 0 obj << -/Length 1415 +652 0 obj << +/Length 609 /Filter /FlateDecode >> stream -xXr8+x, <ڱ8cTj*I( -XC6h =e*.^wnBl lNwg&6F.v1_6FDMט/o˳1ex8+L{("_(яG2Pĥ&H*Po.?G EqT$¦` pK@|.)&-D ;K# c슕[b&bT84f?*&jDdbE8iYoy~edȥ㑅'AZ^Ž亸jңf Msy%]̮ahK*Nʛ6H)Cʸr*PHa{BN8IJ|@҇4&i&VtDy#*#B{^E%KmlCYzgqoS7fdq -1$PUR{?+/i<2n) ,ynNO(Vڥ ֛sHxwi1jwp VّvMPp$a9j^NA:\*t9pq6 " Sfi˿񝈴T*ܨkj$VRJU%CtC]LuH8 '? 7pv͐_G\Fp4ad -"`k)aN^h"VeB'?bB]zCL!dB3Tss}2C ȷ rZ3MZ4,(c-*spgD`2mx3dڦQ -kw8mWΑdy-N#5aF"U>ީ܌0N&A2\8<AkːyksHĻ.oɴͳcX.ye6x/_ckC Y;u،‘N͠I$.{߽KNzXUhЎqhL4s,徦b=_IlqQ Z0E> wG҄ьTw$! ݪlL)Ezr#x[^P}۲VmWRV5 BUXe*{UE/nZo2',fCrCVfPsƄnKD9Q=><ހiNf3esR.Evޑn !x6$ZMG]ΩNH$+Xy1HSM[<[ +x}TN0}W1ZKcYK +F%دIEqe[rWu[ .ѣsۏccbĎV7A''nr1vFi%W7 jjK+9tܜ2B/Ą7iwvJH-Mmr&+mz &'t0 2YJq&t^}U\z'v;- e c6q4]vrmxfU endstream endobj -650 0 obj << +651 0 obj << /Type /Page -/Contents 651 0 R -/Resources 649 0 R +/Contents 652 0 R +/Resources 650 0 R /MediaBox [0 0 595.276 841.89] -/Parent 629 0 R -/Annots [ 648 0 R 647 0 R ] +/Parent 641 0 R +/Annots [ 649 0 R ] >> endobj -648 0 obj << +649 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] /Subtype /Link -/A << /S /GoTo /D (page.57) >> ->> endobj -647 0 obj << -/Type /Annot /Border[0 0 0]/H/N/C[1 0 0] -/Rect [489.876 435.868 505.505 446.833] -/Subtype /Link -/A << /S /GoTo /D (table.3.4) >> ->> endobj -652 0 obj << -/D [650 0 R /FitH 764.175] ->> endobj -142 0 obj << -/D [650 0 R /FitH 569.467] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> >> endobj 653 0 obj << -/D [650 0 R /FitH 515.08] ->> endobj -654 0 obj << -/D [650 0 R /FitH 516.229] +/D [651 0 R /FitH 778.724] >> endobj -649 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +650 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R >> /ProcSet [ /PDF /Text ] >> endobj -658 0 obj << -/Length 1421 +657 0 obj << +/Length 1828 /Filter /FlateDecode >> stream -xXMs6W(&H6qi:iIDʜ! _ PkLr%ݷbkga|zꝃ-}b]G' -QǷ>l2|0ۄͥAVrPħ ,(/7O|[ "Ys"C<q⨨u&H𸕇V awJ8B#_Px0$e/7YʦZ` @Uv2.r +3 =2uO{2AjgD٤y؜2Ġ^mK|>KUW 2,<8K󛌷p֡tlOyds<7@@̨ۊsST Q&Jྰ:82ϵûv y*/*"@FqQTaљDoW9l]Dڔ",[:^y%l=gjj_Umٺsj )Y3' uK0v킛lI|[¦In_j7aFw ۴F=h!hTeO̊c*ìx9Oi4BQ>Ṣ)ffUmXG_w^uM¢>&u8/Zd}4~"c Isoav6UA8vA5tMLLIP+u=[\{0NndjTuO%qF6Iܒa0FcK)?gַ8/+IU4 - -m-lq-Jv @i\=MwqZڭ*]Uqcӈb󰀼 Q5ḘNģj I4M sCc:nd(y|=]iU>l#d>/@ w`,F<;tDhԇwKvdGk;'7A\> -x<&Ie zj \7USC{~vO^)b;]JuIAZc4h u.nOE}I L0ػ#Yb3 F.3rF.\"/PdΑd?bV -gyZ}ȅ -ar:I>6d -A)?ur58O3L(̸wvYhplΙ 4ML6LM'8N%PIl +xڵZMs6W(S&n3M&u.'3-}S+%z{s *=|::dq⢣&# D sDQ(+SՑ+dJ3J2C7Iů=e9aMp"EXe_)EW{Givi;o)Dr=6²:|ov2 m\,9b&䨱@JYEdl7җ⻽,|`q8Adp3ȩ8vAaԯjLO`FEU=g2YLr_*%voB!&I8Ͷy uGqlnb 8.Kan]6tLiF| +tҗCޭVWIUuJihY ++dQVm{CP6u@3 +R@6F T5@% L{2pӶ$mYH|^ݬRMMH> Tv٧ϗ*6a4g|xLReb"Y8J>V-ʏhn~eyMUCRo>sdTL툎\SPk9)Tdx&|Lirtr@EeGx8V7KVVnte3Z/^>\jwE2B>b|gOuH=0>Gx8g`Ўp,\e7jgp +Tw\JxcqbÕ9!ډ.)bB%*S]?ROhr0KOp)(u%@>=\u#x-TJ$|C @-u3\x cTyHs{p r>,d:`[dR0'_yE3.}dqW[ ۹i1|YoA| }_gvS!bxTә@=qC' +Er- ܅j/>"ḱ ZnypD}U?pɢܙNJ",o T+\IEio:&wqtއY58LDGwU Q1鎃 5Uu,uAZڿ^TC~"NQ7z/ endstream endobj -657 0 obj << +656 0 obj << /Type /Page -/Contents 658 0 R -/Resources 656 0 R +/Contents 657 0 R +/Resources 655 0 R /MediaBox [0 0 595.276 841.89] -/Parent 629 0 R -/Annots [ 655 0 R ] +/Parent 641 0 R +/Annots [ 654 0 R ] >> endobj -655 0 obj << +654 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -659 0 obj << -/D [657 0 R /FitH 764.175] +658 0 obj << +/D [656 0 R /FitH 778.724] >> endobj -146 0 obj << -/D [657 0 R /FitH 739.268] +110 0 obj << +/D [656 0 R /FitH 739.268] +>> endobj +114 0 obj << +/D [656 0 R /FitH 664.829] +>> endobj +659 0 obj << +/D [656 0 R /FitH 610.589] >> endobj 660 0 obj << -/D [657 0 R /FitH 692.43] +/D [656 0 R /FitH 611.688] >> endobj 661 0 obj << -/D [657 0 R /FitH 693.578] ->> endobj -150 0 obj << -/D [657 0 R /FitH 333.013] +/D [656 0 R /FitH 372.932] >> endobj 662 0 obj << -/D [657 0 R /FitH 278.626] +/D [656 0 R /FitH 374.178] >> endobj 663 0 obj << -/D [657 0 R /FitH 279.774] +/D [656 0 R /FitH 360.629] >> endobj -656 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> -/ProcSet [ /PDF /Text ] +665 0 obj << +/D [656 0 R /FitH 347.08] +>> endobj +666 0 obj << +/D [656 0 R /FitH 333.531] >> endobj 667 0 obj << -/Length 1330 +/D [656 0 R /FitH 319.982] +>> endobj +668 0 obj << +/D [656 0 R /FitH 306.432] +>> endobj +655 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R /F65 664 0 R /F38 550 0 R /F15 551 0 R /F26 353 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +672 0 obj << +/Length 1352 /Filter /FlateDecode >> stream -xڵX[s8~У=+@6v'x&mY ^.q$ NL2r}\ͮ?[Q=QC+rUoX2Nw2r2 d蛟V~ -PVz O5ʇ/͊sq6%ug D0rs{w3l4v:O3 -># {Gf'A! -]mA60U ebX-t'*Wmd',ƪC 4Kecwf̘) AWk]ȨJw')6+M ^ox /×AY\9.D Y܄qÛҫH8IǺ66vB 0caԎse`LJU"#GyzP]i$^M)G5]a(}]GʙX:]߹\n4{|ۗ%{ۮbd?Zo_{3"-mJ  ̟hw#o*ɑφ9Xn:[RK n@'B`ץsۮD=ŜZ8((iŔ!SQg1< &Tho_CCc4,m*hg"m{3T%91!zO@5yuM`2Z|8Y@֞ힳ8C" -.Юu@A -H q -Ry(ht?<=6w0r&\Rok9YxN]$(\aš[ I|*p5ZwZȜu৭Ԯi]M㺳+.}!/'@?NV r ۪~o?VQte\u~Sa?IZ.cLզ̌+k'4g Kvok|=NC9p,Ż ̂}<Ƞ m&hdz}S zȰxdO;2LPG3#IUvωg䜁b)dv`T.&;5;y$\4:Y/ApTOG9VOCܞCnǣiAqlǗ< +xڵXKs6W(uL$=mi餎=$9"$sJ*IEH<lr~ADz9{s +(ZQDp,%dWhO?nYL^j.VO}/,߁*~*CR_TuUgea4dt3(,ۻ薡sq7p q"V٧/;UcsqWER`0s`cB|}ͯ)wT[!aGV/6<)6ho0wq &hsJ4ZE<☞I>8CLτDmS4!H^WJX /:,+! ! 4(&b%WtaI 1)x +8 ^ī@|]meJ:A2r\i~-rPDzϑ)|&, dhkn!FD5?HpOV %42CTU4Fcy^ECb0x00)u('U Lځ(6>B/ R=u𕁓+bk +0d'VS- }JrlJ*cگ}CzpY۫{76>:wq_?:z_D|h`.+ zuDJ_dD6}ϲyDY 2ջGsnnz'V8HȡmGwV]Y2Yй[FIZNZ򂣬H̛Q fzUnwew N#n*}3v"Ծ9lT3.*Jgq_gpo׮n[{azI*x1eVMWCC6}kw2!O4M/l5]dl80^g_(V]f]%Xs \d|Lu̗h ICk qɦl 8wLӓRWpHѷMգZiz[´T$xuBS?WTj_U]Onzh<~[WyXb&K s;↚ qRr) endstream endobj -666 0 obj << +671 0 obj << /Type /Page -/Contents 667 0 R -/Resources 665 0 R +/Contents 672 0 R +/Resources 670 0 R /MediaBox [0 0 595.276 841.89] -/Parent 629 0 R -/Annots [ 664 0 R ] +/Parent 641 0 R +/Annots [ 669 0 R ] >> endobj -664 0 obj << +669 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> ->> endobj -668 0 obj << -/D [666 0 R /FitH 764.175] ->> endobj -154 0 obj << -/D [666 0 R /FitH 611.63] ->> endobj -669 0 obj << -/D [666 0 R /FitH 557.406] +/A << /S /GoTo /D (page.64) >> >> endobj -670 0 obj << -/D [666 0 R /FitH 558.554] +673 0 obj << +/D [671 0 R /FitH 778.724] >> endobj -158 0 obj << -/D [666 0 R /FitH 292.978] +118 0 obj << +/D [671 0 R /FitH 739.268] >> endobj -671 0 obj << -/D [666 0 R /FitH 238.606] +674 0 obj << +/D [671 0 R /FitH 692.43] >> endobj -672 0 obj << -/D [666 0 R /FitH 239.754] +675 0 obj << +/D [671 0 R /FitH 693.528] >> endobj -665 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +670 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -677 0 obj << -/Length 1439 +679 0 obj << +/Length 1551 /Filter /FlateDecode >> stream -xXIs6W(XK{rR'M]˝LATP$9vA#={^͞͞d#8&]EAA({7ubI9TV ezwQ"_|D(S 4uR.o^eUge( -KH77qodS<(0ݧf znό#v8f7{{ +H`q=t;w28V?{q]h -&Li+e"oeePge!"(7UoT>/nkŦي^g_aON~ޕmmR`-A1#03R1J6-($|<2 QEZ 4cш 8bO}v @QD<ı^ *饃?-e<G(#P{18rD}k6P_#"Tő<_,`|Ig&ӑ| FD% |lN}9Pw"lS%Ax< - le/jm#~߬GD`^C$GQ$ )k=8M0-}evC\R@`Mf+ #9i{`0eN4dr -Pdci9niY맵<~AvrrY=fGfum%JR*Z,SC<۲͍XP;MRzٮUٔ^*WP}uoR}`Ȇ~2, -OLCPLbɘS̀"BݝMG{rCe^!I &\8;SN)EA]R@v61DW@jb)Ri{YmD݃#ֹy}C?DM+Ț/ acgLݭ(҂S}uQCS\X'F"ϑ}tT2`gT1}s{Zcӭ^]_]a=N]'ǽ=`Na> t]!7k5$4b dPiUƽnv0 +km5~99xfaTΣLP95U y4#uPkjdPA~lavyY.8ꏘ.z9IB '΁z +8a4*;tֽ&t}qݑvGnu*[$D|v^TU+<@}\{( R a[uFߓi}bch ̉!f .raz9LW$'Xmf +21$sթ-O⮈𠿖=?=ŧ-<|w v/*#CG^N[b:4|[*BӍB5 aGmgrO^v)T6BK͂<_dIF;6f1szhw'1pXM*ш7ZJY%Nwf _N!|l7Z%? PB͒ԠWt+XF(;TVnn 17Q;G&r¹gjEMACBwmo;(c.nڣֶUN=*"MNfE=g݆ųfS2| w_Ղ_.޾~7w,TP0vWyծIKFBJu[uV I'jӘϦ⅖C(?6^voUVDtb hH/A+yq45 9Fҟ`K%>C=]o%В@BV ў nJ,%D<<BrQ4JH{ dlJA8>PtdB 8 +:=F{C@ćrc%Ї$?JhN[3q ԋhduZ?= endstream endobj -676 0 obj << +678 0 obj << /Type /Page -/Contents 677 0 R -/Resources 675 0 R +/Contents 679 0 R +/Resources 677 0 R /MediaBox [0 0 595.276 841.89] -/Parent 681 0 R -/Annots [ 674 0 R 673 0 R ] +/Parent 641 0 R +/Annots [ 676 0 R ] >> endobj -674 0 obj << +676 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -673 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [438.582 436.676 454.211 448.427] -/Subtype /Link -/A << /S /GoTo /D (table.3.3) >> +680 0 obj << +/D [678 0 R /FitH 778.724] >> endobj -678 0 obj << -/D [676 0 R /FitH 764.175] +122 0 obj << +/D [678 0 R /FitH 739.268] >> endobj -162 0 obj << -/D [676 0 R /FitH 638.66] +126 0 obj << +/D [678 0 R /FitH 583.534] >> endobj -679 0 obj << -/D [676 0 R /FitH 584.42] +681 0 obj << +/D [678 0 R /FitH 529.294] >> endobj -680 0 obj << -/D [676 0 R /FitH 585.569] +682 0 obj << +/D [678 0 R /FitH 530.392] >> endobj -675 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +130 0 obj << +/D [678 0 R /FitH 251.122] +>> endobj +683 0 obj << +/D [678 0 R /FitH 196.735] +>> endobj +684 0 obj << +/D [678 0 R /FitH 197.834] +>> endobj +677 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R >> /ProcSet [ /PDF /Text ] >> endobj -685 0 obj << -/Length 1691 +689 0 obj << +/Length 1553 /Filter /FlateDecode >> stream -xڵX[s8~mXfNn7Ӈl3%n6~'=$!}: {[{/'ϗg/|boB"νG\{//؈jSQB IC>-_߇"1EaZuFTTuVj">Dlz#%[M3 <{{/'B5Ou|x:|K'>ao ^GC; X ν?5 =BP훉FL> - x7w%U$l$q:aoNCģPA\)ǢIӆ=G!ہڜ((FRm9pҾ-"U<~dQ[,x19FZG[)g0y)1?5f[GtpN$,e HOtS_p ~ e@l LbS|Xmdr2<:4Zs} ώ0G̀8ВlHWfe1 tĎXdtIFEɸ2`ay,D`9s]$FiR%*@@Tv5 \گ -ITIMmk=mlYovIʤZ܇jSCwɌ>jy^JbF*y܋2z6m^].HX@,t9ҹmt1hL1־ dxч4h SD3۬eS|1"K`lCfDAzɥc]Z!oB0Moc~m]xzqРʭ}4" sAFȿ7wwڒ5RjCͯ6cŶ,rDX/ -baodJ<ԹE.RR¬FcpjjIC[(>}e!N=uZeS* X_ Іէ]f +aY{3+QCKz -s{\4 qlD \·~OaID}犅'*c]LT`0\XYI*#FjJK_3(T"X2/TlӸ$y#i{iXcjTVl'T+Sw^xN. 3:mٜM05WP4 m^֖8ʢɊ" ﮤcN%eeŘ4~}#_J5Vb[Rf(`^ -dyB9 e5"M=fy3rJ`S>@3'Ur8uHӮ&-*mR% x(1י`7l3{%ѺH?aT͉ԢѼ6Gw;*-׈S>@%Aģ{{ D@ڨj?8|U2{zܑ0z2fMD/6Ƣusg=XlXL?F@[uoR:5{î}s,_3vQ9lHË[,iΖwon燦)\FOyΈ +xڵXKs6Wfq&Bɣ8Ӵumu|H3,64PwA|eG=ǷsϹ0}O={("̗Nࡐs'!"4r ;wF7KQ4<z8ęyH.)s +j*W?.fSQVi w)Z6aoቇ!+Ahs_3z]'_'ZEQq,`PQl띏(b8sn'7jH0  L 7QHn 59a%fۍR7l#N㝨2]KeWieYnD6J,zQ:i0X.a'rYѓ&YQ4|f17|i(.E+ wFA?V$2%mdZMND-Eȓezto62¨ 62ͬFJ݈f}qYY$a[g!è44c(qЊ:pY$jӃ؄ETB=ef=[SծⱾpгy!-EB}T汾+3q &)֥q ȅuw"1#>2C))2?+!YIx?v3rfy3('9!vh" I5sԘ!sJ,;*UaݫTqWN"NxeFZ qf3Zv{L@E|bDB>ExUMнhuԳ|(?:D A|\N.GTtl4rN,n%wWd#vC`~5T*q/)~$}Mp +j4zwYdC}<֌u+A]{sI$\_S^W}YS,MAE+v{uHUsӔ\2wVMME3*,><غtNV^"-GuLS>Cn7kqv :قs@@w3SMB5VW3@o^h>YjK○o.no A9դo.>^^~GPNƞ~>LE5N7e4^m>.dk]UX9n,El3.k/~sh]ӼWB@4*νv endstream endobj -684 0 obj << +688 0 obj << /Type /Page -/Contents 685 0 R -/Resources 683 0 R +/Contents 689 0 R +/Resources 687 0 R /MediaBox [0 0 595.276 841.89] -/Parent 681 0 R -/Annots [ 682 0 R ] +/Parent 693 0 R +/Annots [ 686 0 R 685 0 R ] >> endobj -682 0 obj << +686 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -686 0 obj << -/D [684 0 R /FitH 764.175] +685 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [369.78 297.548 385.409 309.299] +/A << /S /GoTo /D (table.3.3) >> >> endobj -166 0 obj << -/D [684 0 R /FitH 739.268] +690 0 obj << +/D [688 0 R /FitH 778.724] >> endobj -687 0 obj << -/D [684 0 R /FitH 692.43] +134 0 obj << +/D [688 0 R /FitH 445.532] >> endobj -688 0 obj << -/D [684 0 R /FitH 693.578] +691 0 obj << +/D [688 0 R /FitH 391.145] >> endobj -170 0 obj << -/D [684 0 R /FitH 204.148] +692 0 obj << +/D [688 0 R /FitH 392.244] >> endobj -683 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +687 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -694 0 obj << -/Length 1519 +697 0 obj << +/Length 2181 /Filter /FlateDecode >> stream -xX_s8ўUIHɥ㤹ĝ>s\uo$ C<,j`w69wC0 -p@0p<#d|_? tz}O^ -u N)J1ͥ>c@x_2Eb0$.yF>TQ{ #\Ry{^I{+EǝcW@ |gS|twgJȹ]#o9 |R8P:q:N*.%:R P PޱºaƵ` j@I{wr ;\qsƨ$<}# y9`)hX *y -t|ϒ{e<[4 1$]hREH -yG>51#Y4BC4*YglI6p`(0.Qm/6ױ^ޗ8LlFαHՊzkZw5 V*92!R _a>WUa8 SWޮWKzOE ›d#] D?C@_@|4_~,H99r@OQkH (A~RefbMe$CXEJie bl;[$Yje%Q(7A/Տ(eJ<ɟVLb/x18}lr5"BudPKJFSPDJǴ捿M  CJ*Q"m -t@ld/![eLZ|ײ%#yPXsYTL'FxjF‘2k3-6iAд\mT~ՓXGw#CW{6u%H'qtR}O%VGf-@]8I{i(.\c@[ջz}neNLqy)i$mp;MjKq-ra1f.Z>댫8/Q% LïE]d%c+܆d!Ү.G9$֩WZŢW*m& +^RhL۠O*Iˠ,dܦ jyAQ[V9yҚm~=OJp?Oe\€@ږSބ|nZ&M_ִ $:-xA{5V nLq2xt>*Unqڻ{yk|n Z:8gsDhC +xŜnUz츖גE0'YVthѷ/ǒFԈpa C\?EMZ[uqt28%`&`jieqWwp툺kqZGIZ_\ ܚϟ|l AJ?nm JHZbpJYo(`Lpuޱ=8AYc)gva'.S +4qp6.*{uAY+7fV.4}epAUێe T AK +Pᰐր&9-o/cE†Ǝ^5Y̿6O0tMAgyt۬[4"-ms!K{߇'YTZa󶻲HxJ )^`;wOi'YUZ)Ҍ E3R*0J4g< +j<o|dYAodT0+67Ƚ^U,]0DԀ|SlR,֛O UV2*p}HĘab"jboJ! K[ UuZ"d%@[v"0$| n9-gtlz}U/MޛY>UG,sO(DOEgIBb/#˳صCE=|0^k L ͯf;vŘ'w3ȋj1g } g~}_|}A!b4|i=,~r'+"s*AO-h)OwJd㎢k q/?.fpqJǝrOd0y5N̉C>ؒCBۗ]<<4I;dgO.IWfFHjf)i{zy}) ؠޑLpXm64#2s1_}ueRߖ>JtZE}BQcE9o l^cBYJk Ts{wzA &xa>4!)hyrŏ!>*j@b:d+]f$yF 5aíӻ*߼1R3􇳧UP% n]%HqF P·/l#%5_r^&IW֥9WNEZQ+{ue(7Lv_edN)0οesdx=8VmUu-wFUݧwoKΡ 'A endstream endobj -693 0 obj << +696 0 obj << /Type /Page -/Contents 694 0 R -/Resources 692 0 R +/Contents 697 0 R +/Resources 695 0 R /MediaBox [0 0 595.276 841.89] -/Parent 681 0 R -/Annots [ 691 0 R 689 0 R 690 0 R ] ->> endobj -691 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/Parent 693 0 R +/Annots [ 694 0 R ] >> endobj -689 0 obj << +694 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [121.077 583.482 136.706 595.232] /Subtype /Link -/A << /S /GoTo /D (table.3.4) >> ->> endobj -690 0 obj << -/Type /Annot /Border[0 0 0]/H/N/C[1 0 0] -/Rect [174.4 583.482 187.302 595.232] -/Subtype /Link -/A << /S /GoTo /D (table.3.4) >> ->> endobj -695 0 obj << -/D [693 0 R /FitH 764.175] ->> endobj -696 0 obj << -/D [693 0 R /FitH 739.268] ->> endobj -697 0 obj << -/D [693 0 R /FitH 732.374] ->> endobj -174 0 obj << -/D [693 0 R /FitH 317.465] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> >> endobj 698 0 obj << -/D [693 0 R /FitH 263.225] +/D [696 0 R /FitH 778.724] >> endobj -699 0 obj << -/D [693 0 R /FitH 264.373] +475 0 obj << +/D [696 0 R /FitH 184.955] >> endobj -692 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F27 335 0 R /F63 515 0 R >> +695 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F26 353 0 R /F15 551 0 R >> /ProcSet [ /PDF /Text ] >> endobj 703 0 obj << -/Length 1323 +/Length 1513 /Filter /FlateDecode >> stream -xWKs6W(D'M<QLJ4Z,N)R(+YER"δA#b[8 ^c8 8&dDI!HHDYLfјr`[\!g,4g`KDJİvJe`&Vy,4A!NjaOżid]2ˬWf3e$`c}!C(vbxD1,6kGQ4O*ւ14 E <?1ke!Q[ň6g텪>@(Y4ˤj-20S.FC܇c⸹/;V*P,~| Ef(>`gf߭UKڦYf3N#cB`5hduMmʛ -VfF:/roqWoj=-UmN\u5YDt.$@fv%{,v2LPJW&Sp7E\Y7ozV+;+.?.,}'QsyBN XJQ)\&eJIi63]PZeۅ}@ATv0# [[+1bu|LB pO긆H Z -=f7Odf3xEIV 9:i,`J$5 -BB7Tٹ+-䡀Fй1 KMC֏y|j:M $2d:~ -8aɃRV?.}L bNhLId"ԥ^PQDah|LFR<)}=ᓱ&mI~tb@>ׯAxo=3']'@0+eՙ)g SH-qh*&;eW4[(=-ykU6d~G+BRq{T)l8\q/,8=3 -5,a$lk}V nl6"ASA%'"6wlR*]}cik f۝]lv6@ M{۹WeQJ⻶pԷgfwW`V05Wij??ӫREQVoTRORiC|ʐ!GFTQ: oL +xX[s:~Wf*ɖ/IKҴ=3m'cԗ$9i`շb9xuib`a˵`ڶ.g,WhL#8?.hu:(l,(k!O0911ˆ3q(ll#\~Rps~5lےT\ۀ%vDÌ`7+L5ʝa11K8_\Iuh.2Cl@t-* ܏sK|~b6|d뉼f\y"Mz&/06V^.D_$كp4IQ._WUycʕ}+}]" *a|J<oy!Rʌ#N 2T~dC:$]H|)Σ,9"ɎwL #c#^{1?]#":S\H'=CKX\$M{+?VI˱Ua)l=+")i %kE@jT^7)_06\g:5C=tCIYJNvZ~LWFS חKK~b WaY+q<]qWֲUE!|Ԋ5*$C^I=>6z?IMyoߴ=d:zY4Ck٢m@Fز({X9 aF3O$ʤ~\;Nw' i,Lt&9/7bkEe[Ɣ IWQxG a znx^}1ȥCzt$c9cSHlʥ&c$\]yxdx;tJzdqP€s\"fZCo1b @\fX0%#mC<4c<./魀4RU,vʨ4Xɞ%:60yvǨlD]rLqR-'`>+ֆ4D(¤6ۤ[Ӑ[Er$U~mڂ'>%S_]}יXKkrazs5o߼N^`DzT endstream endobj 702 0 obj << @@ -2700,155 +2648,161 @@ /Contents 703 0 R /Resources 701 0 R /MediaBox [0 0 595.276 841.89] -/Parent 681 0 R -/Annots [ 700 0 R ] +/Parent 693 0 R +/Annots [ 700 0 R 699 0 R ] >> endobj 700 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> +>> endobj +699 0 obj << +/Type /Annot /Subtype /Link -/A << /S /GoTo /D (page.57) >> +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [489.876 422.269 505.505 433.234] +/A << /S /GoTo /D (table.3.4) >> >> endobj 704 0 obj << -/D [702 0 R /FitH 764.175] +/D [702 0 R /FitH 778.724] >> endobj -178 0 obj << -/D [702 0 R /FitH 492.954] +138 0 obj << +/D [702 0 R /FitH 555.771] >> endobj 705 0 obj << -/D [702 0 R /FitH 438.567] +/D [702 0 R /FitH 501.531] >> endobj 706 0 obj << -/D [702 0 R /FitH 439.716] +/D [702 0 R /FitH 502.63] >> endobj 701 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -712 0 obj << -/Length 1429 +710 0 obj << +/Length 1497 /Filter /FlateDecode >> stream -xڵW[s8}Wvm4{˦tvNxkljɒx`e98pt1z5|pD0qL2Ri)#%5,f⏷&S*,M9ajlqC&&&gźP$K;5(^s+~LJ P$'Sˆ+-T#dn~%yPnl}D\{Xh}|讙`Hpkp5aj(LT#}*jS G y;xwkL̈́ -XRy,ۼ4Lv?b P<_.:sgc!r"Bnݕ+ XU1EºCS)RZ``OzJ"ZVC[twf :i-4,H}Iz؁X8A Vєk$u !hp^q텩/mN߮_I -IkgC7Ty 쏄SzUR"45oǹ$HA"*M~$BD '(T6%U`O3=tLESΦBrgWX+u$1]qSo=&!#- f $'XMeJ2pH}wHwRg;P>|Ms_qbnnN#;%3t8 MN&3:@}F>ݚ$ݭqsYspJ)_{ߧrP0P1v֒] R;,ϯnٍ ` )xCrm:7mËti>S(p)fmEb&~Xk, -LNmj eRD)g ?3֦U5t1dq UЃ rj/-]ƥ3m2H4պ[|ޭL5/u#}ІeM7i+Srbm:5U[ -nn=ĝCul@U2zZ#yK/Vte^9<[Q/ -ŝ{M~ D/ Nmu=( rU>ݨΥ)q BƒR7ZHd/Nw=R7RƐ'uiuZ;qH(QЍEjd|Ѹ̊dŞ7K:::7䧽OO)!%,ԧR}Fm"4tkaV)Щ- +xXr6}WQX 񘴎L.&I2ZlPKl uq$8{{.n=]^F/^#I,7[zF^ BD}ޗŻן'SJ-U>J *J&fooCI>XQ^^1+~L PL'!_gѭŦ 4!`ǷBﳪPYa(07a`~5a'Qz[5$i=Xa( #LGǙ *B[9BlI|̓H +*4 Y@̲zh3L3-RlYe{S $i㰫D %qxW|=SˁۂX!5 s(_"I(>LATXMY0e{ gU#WJ)uBx*6>ĔT.!3IJJs=G\.bSCRM9Zə!,"zEef sZ.rSdSV航U2{ ty&R3t1]Լ'y-`B"!h(9p `[d !c˶p}_U˥C-V߶m?mN?g?~Ofז4IԢI8T&ޘrՕ0uYezU͒țZ8+FLgy;#!>w~=dt4XT0I3!>ݴXDrK\-JDMPIQNcѐ'X0v{,ޭ- L\9CnDm\O@'lЀ A@szZYHF$O'~@ c@º~ٻ.F endstream endobj -711 0 obj << +709 0 obj << /Type /Page -/Contents 712 0 R -/Resources 710 0 R +/Contents 710 0 R +/Resources 708 0 R /MediaBox [0 0 595.276 841.89] -/Parent 681 0 R -/Annots [ 709 0 R 707 0 R 708 0 R ] +/Parent 693 0 R +/Annots [ 707 0 R ] >> endobj -709 0 obj << +707 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -707 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [411.812 502.828 427.44 514.579] -/Subtype /Link -/A << /S /GoTo /D (table.3.5) >> +711 0 obj << +/D [709 0 R /FitH 778.724] >> endobj -708 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [429.157 457 444.786 468.751] -/Subtype /Link -/A << /S /GoTo /D (table.3.5) >> +142 0 obj << +/D [709 0 R /FitH 739.268] +>> endobj +712 0 obj << +/D [709 0 R /FitH 692.43] >> endobj 713 0 obj << -/D [711 0 R /FitH 764.175] +/D [709 0 R /FitH 693.528] >> endobj -182 0 obj << -/D [711 0 R /FitH 671.086] +146 0 obj << +/D [709 0 R /FitH 346.365] >> endobj 714 0 obj << -/D [711 0 R /FitH 616.699] +/D [709 0 R /FitH 292.125] >> endobj 715 0 obj << -/D [711 0 R /FitH 617.848] +/D [709 0 R /FitH 293.224] >> endobj -186 0 obj << -/D [711 0 R /FitH 304.557] ->> endobj -716 0 obj << -/D [711 0 R /FitH 250.317] ->> endobj -717 0 obj << -/D [711 0 R /FitH 251.466] ->> endobj -710 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +708 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -721 0 obj << -/Length 1721 +719 0 obj << +/Length 1443 /Filter /FlateDecode >> stream -xڵXr6}WQX :ꤝ$)bJ*XDP"9ʃ"{ yػOG0qL 18B!|}^Ō2<KQ]TPK$EoC CyZ,EbF|[.4~&'q#Uzj,T]&~i;|Kדwo#۹#Hsw ׹cnv莧IE9 -={`oFA6 /<qICDC?Zs&}no-Dd1O/*KWg*|~jw8~OuX ,F$MX30fvXc~"ċ쎬FiVZ*)Lԏ%bw',>=$Z/i Iq8^Wz4zQ6j@LuJˢ),K2 d/n+0i *.XOT%'Ɇ4Qim:Y;VPU&O۪vYͲ{ JM`HI[Ҥġ=\w\Q^5JX:DѮƛPczx-71:tgOAlN#J4s($"эBrTLkb݆Zvg*+B֔;1wQHh#s/(U7t1q̜w%9,"0Fcv8On^>DP?3]:Ljc-Wy#W*[l4q0 qlНJM4$Y,jkrh;6i ML ;Q=ʂ'9ePԎ)bWI=r#l{?֬ش8$OP5I("c<mӔEȄXCz t^!ۢ[ؓ"owD >#U[. ]GP#TvuD \j˻3`bRw"cw!rD܅ e8{R}"yDZpH%جu S_.Po ل۰ P6j"1;K잎e&'#sRS|dtbF #uC$\:F—r{9LR;^Eu,́UR!hTvе^oVr ,y:i?wmgm {:HmR>f?rpg*7S:&0 ߥ4i#-} qd,KgL -?tBN +xڵX]s8}fbUv7ʹӏlN1088XHIG[&f7F!5K-, e5KoէwΔrl߈TTmQB5}U;?fHH1ԢF<9ۢP Δ0pZ56 H Fn?Lj؞.g'!MF >l%# 0mυr+'[?:&DİF4JοvD= ee!Ta !lHt6jKtUč"ܥv.S86=ȁtkxR*,:{ȅj9.FI:7 4p![]F`,ՠ,$]DQߔ{wRqcjzd/JQ9Y-RHUaZ[#Yw;(~*ӽoF!gK1\o'1 f߀;}n{o4N䴻 endstream endobj -720 0 obj << +718 0 obj << /Type /Page -/Contents 721 0 R -/Resources 719 0 R +/Contents 719 0 R +/Resources 717 0 R /MediaBox [0 0 595.276 841.89] -/Parent 681 0 R -/Annots [ 718 0 R ] +/Parent 693 0 R +/Annots [ 716 0 R ] >> endobj -718 0 obj << +716 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> +>> endobj +720 0 obj << +/D [718 0 R /FitH 778.724] +>> endobj +150 0 obj << +/D [718 0 R /FitH 601.311] +>> endobj +721 0 obj << +/D [718 0 R /FitH 547.805] >> endobj 722 0 obj << -/D [720 0 R /FitH 764.175] +/D [718 0 R /FitH 548.904] >> endobj -190 0 obj << -/D [720 0 R /FitH 289.569] +154 0 obj << +/D [718 0 R /FitH 290.005] >> endobj 723 0 obj << -/D [720 0 R /FitH 235.329] +/D [718 0 R /FitH 236.499] >> endobj 724 0 obj << -/D [720 0 R /FitH 236.478] +/D [718 0 R /FitH 237.598] >> endobj -725 0 obj << -/D [720 0 R /FitH 222.928] ->> endobj -719 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F63 515 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R >> +717 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj 729 0 obj << -/Length 1191 +/Length 1579 /Filter /FlateDecode >> stream -xڥWMs6W(X0H趲n:N$d%A$*> b]yrs3e5&q1Jp:a1H2 􁭙hx}Z݁+w&C;\*372QW -gsq0Mt<(t0{7Djk|0D;@yޯ,? (eٹEc0y1"X)d dgtyZ`gޞ,n`bEȋ8Az+6Ug#W]]0}F蟊d*s<XZ$G6q]`?^6#7B`ʘuwcuс@5y _Ua`j6sBlrÚ;I_>7FpۙK)s)-tK"oH2V /i}lPҁVn(e^cubr؏aC}[Yֹ81Ֆujsmq*"v#;o +xXɒ6+xF0\ؑ]v[irqHp2E*\,ߧAAAxaj( +hlֲWɳmavMj6 +<'6ajlN=b)f?eEī٧0 M suUuVAlJێȳldw>xj=Wq-6'!cD +}jŻɇOwo֡[\ rsk=7ץ49Lkڊ_q(oYmʎmAp\`C?XWپ{f—-Ox[&j2Ύktlkx2 !(ڶ=Ú5TE7QLG^#/ġ9Ш&&Z+t?^y(E\r,Ŏ U1+~'0E PZ! +=4RD\w1гO@əPɉ , +B<Z; mPmu`鉀s*cYE./H0J!))~[0=l\_,BR`L`f%ѡTo s9'a,1TvB#Zt9o蚺*NXU%jmQ#3stÎX"G9"ɭَi|13FP2X]+Ktb9-طvKwޖm.lQCh$H) (b*n4- F= ]18>Zny2#ZK 0섌=: M}I=Pc_ouE]y XZRkvgU= +2M.?^A@9' +ʦKAX:ZYEcpL;1 q@ QQ|N #hcjeb)YfZzjWr@:5y +~LxBP?à>yepS廚5s)#lDsfעՋ[^u23E0GO J_D͈T*n?+Y.6ʝ.\5k~P.D[ؾvLEg1ĶR;CDP=`VfT+yfpy =zDjѲ>=H'NC <:Bߥj"®fZ/r +ux ӉBK"sіoQ].~wxb?Q!U#`Y/ڷͨ;-R5%cRy>h~(J,.f]S +1+EUߛeg8.AًV +`W Ǒr,=qز„#<%=i~t^9&^LSR:4;eOzz!#0X;c}4߉  q9tz`ryFL2^q endstream endobj 728 0 obj << @@ -2856,1498 +2810,1857 @@ /Contents 729 0 R /Resources 727 0 R /MediaBox [0 0 595.276 841.89] -/Parent 731 0 R -/Annots [ 726 0 R ] +/Parent 693 0 R +/Annots [ 726 0 R 725 0 R ] >> endobj 726 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> +>> endobj +725 0 obj << +/Type /Annot /Subtype /Link -/A << /S /GoTo /D (page.57) >> +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [438.582 436.627 454.211 448.377] +/A << /S /GoTo /D (table.3.3) >> >> endobj 730 0 obj << -/D [728 0 R /FitH 764.175] +/D [728 0 R /FitH 778.724] +>> endobj +158 0 obj << +/D [728 0 R /FitH 638.66] +>> endobj +731 0 obj << +/D [728 0 R /FitH 584.42] +>> endobj +732 0 obj << +/D [728 0 R /FitH 585.519] >> endobj 727 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F63 515 0 R >> +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -735 0 obj << -/Length 1378 +736 0 obj << +/Length 1681 /Filter /FlateDecode >> stream -xXMs6W(X>8&mI:=$9$q"~XͿ(=MOaa88}X}d8 I,IFA$bD V,ڪrʼ#ɛ$[|_}(և"P0ةEy哱xX>WeyAX, #1ѿ%;; ̾~~ L]yBYp;kiQ@BBA41licc<_-HDD(>q؋yP`cyGg Eqg@ByDRPypoDK @.HGr^Jhb#@ ?,>I <:|2'^iBo6+O$^f #[E̦h2[F쯆c"]mvuj7̱1oH7cPؠ&UE^ZBEIhM_S2daWUH4Uە2*XCL<͡ l "=(Yv==z?5=V{϶MqԘyejaAyl>ͷRQCҗ hd]|KfTM6Ժ7ՕyJMg!1Dba똗pHj=R4ez߲9 TuR{'rw5 #N}Kϓ8:2~*x5*l)s\8\$~4yss8lI]P7.[rUgHaFE~mXG(ftxZwI9gQ_vKUYsJGwwu:qnjub5mx>e5*rַeU+5~;|xܫR DVQnzF@9E 1֝ ŃE pk̃b5Wkl ǡp"íEm]t54,-`pKMowю sRLNc!rИZBd AWNў%cU~ ‹)%!K&}M_bXb!Om8c=3!/I-uf:F1iB&HSJĔRLC2Iϐbrr: Җ4p?4b4`| :<]f7Mhc#A7tMԥ ΟMY*'NR5j9=,Nv~m*c{<\yCQ7,u2Чz+SnB9QF\ +xڵXr6}WҌ$퓣*JZrd2IРKT}$^DN< ݳ,ѳFZF>c|d;X//O6[\D&eL>^)m6r;UVo^+M,SQ_7t|#;e!ϤFW:}9̭SqW#ZZ'lmku\ Jk9ۘ`=Pja}`\D0D1qɋ>faK`!{Yw]iPD,G4m/lƐÏ@\2(q,§Vƭm+Oe $k(`60hg*8?bUAeS>“ߑ͓M) dWb!D(`w 덺8?,.:?]B)/ @㶪ddƛCh~S4;@<1ZbJ#-E}!ZCx(xvKHLΓ X<4Q,c$њ7>A-ygC>D/ +#T׿;.xA*AhS앑/G.}XaAWV~7|2'btzQ$ ]}iPYZÁ>нU}owvXgCд8 Z[tջt14|xWuESSOۡ!L1OeQ.!1.E2KD5VV%3Kf'~ڻqnWw e5XښJuJ!aNkrzDMGuR1R(6:(E,ʚ(> endobj -732 0 obj << +733 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> ->> endobj -736 0 obj << -/D [734 0 R /FitH 764.175] ->> endobj -194 0 obj << -/D [734 0 R /FitH 739.268] ->> endobj -198 0 obj << -/D [734 0 R /FitH 714.106] +/A << /S /GoTo /D (page.64) >> >> endobj 737 0 obj << -/D [734 0 R /FitH 662.133] +/D [735 0 R /FitH 778.724] >> endobj -738 0 obj << -/D [734 0 R /FitH 663.282] +162 0 obj << +/D [735 0 R /FitH 739.268] >> endobj -202 0 obj << -/D [734 0 R /FitH 386.855] +738 0 obj << +/D [735 0 R /FitH 692.43] >> endobj 739 0 obj << -/D [734 0 R /FitH 334.091] +/D [735 0 R /FitH 693.528] >> endobj -740 0 obj << -/D [734 0 R /FitH 335.24] +166 0 obj << +/D [735 0 R /FitH 204.099] >> endobj -733 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F15 527 0 R /F38 526 0 R /F63 515 0 R >> +734 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -744 0 obj << -/Length 1159 +746 0 obj << +/Length 1534 /Filter /FlateDecode >> stream -xڵWM8WpbE@W6N$d*qo $ 683m,_^q ppyx:HbI60"#`7w/oVի0Z*~DIyPHw;V/U(5 I̗oa^`$pۛ`sqY|^xNHF"ѻv&⢗}YB8X"NB]gt_ -ྎ~A!"4&IA{ 9?br.֒wPK).Neup \c<L ] (@Ě"< S\6[K$=LAfWĠlԕ]gp9 ):Gqo~MiVjqL^ 3$U43?D:JDD$ȆEII'-dx5 HyeR'2^'8Py )zj?+'׮MUȗE߱rV:kܪܪ-N4 *FVfhU37icꁾ;>Wդu~0vy`1o[at9qz4)\jl -Vgk49:su9ZC`.=>; -MTzާ{8IJtT5ׅɋT6_10mBW$\{S϶ -8.LΔvD˶O3=P5MnAF7{o{BONiUq=K<1ļDK㘓o1$h^JҗU֎v)*OM[QwP8I4ޤrM\P =48x8SjC ;osy>rMgSn^啡i ӼCVnKNm{Hoz"c܀iMI>#-%4L0Œ=풜Ĩގ5õtt01OHPPCmyP}r"6,T(@U{-4;'?w +xX[s8~Wf*ɒl>%-ɦC.C8 fڦ4GdlcRte_st|`s2;uC0 +p@0p<#h| O?ʴz]~uƋ0}}( +EpARr|}w|ޕi6Kb"'.yZ>lS.~)^y9`zk0|V(3~| wgqq%W ~%I Ł3A'}ҙmp +5#H҈" P Pںa,bcda% [<&S kRM^FM'!;a Tvu4*&KS@oLs 1;Ceܻ3TqOMN~OfMj<M2Hn2YU;0);u%hK=gUKf1Hak/cj yyOa(wrONQnu,kr5=EYTfLdoZCfk$ΞEd`B%Lf(JY_ח(e0O<_Rr+_VP?Y c!,FWQmhg[ȐOO2f]'Cd6mB%+m|JtM!,CJ*IѢm*EjMdϠZMLV|׫%"UǨKTok\`6sI GˬsLҴ86(g<7zo@b0%խ'MA%]`k \pX䊂tfȼdkN[gE VAނ بzVϤǍ$.?D@h! Yͭ8e$\Aft6& Zg5hPiJU=γwlO4Zw2eR|v:AN$*ZhJ{ftbm'@AB'ݣIl8$哌 r[m h" ڈ=@nYcG9иLRuxO V|h)Ze8?YLjbWv%0V{wF=w?ˑ0+:q e3h2%v~quw;?QVߍtTGffGkX+y> {t+EHP95|$\ù 39@\~m^<Q[/TA?(S-/j%e48}L o5:e7D۹!\;! ?|]0+i̓ʔ*췰 @ zXHN㗊]MC/e_iMz'tB}>Si k9\yiUr 2'LG endstream endobj -743 0 obj << +745 0 obj << /Type /Page -/Contents 744 0 R -/Resources 742 0 R +/Contents 746 0 R +/Resources 744 0 R /MediaBox [0 0 595.276 841.89] -/Parent 731 0 R -/Annots [ 741 0 R ] +/Parent 740 0 R +/Annots [ 743 0 R 741 0 R 742 0 R ] >> endobj -741 0 obj << +743 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> +>> endobj +741 0 obj << +/Type /Annot /Subtype /Link -/A << /S /GoTo /D (page.57) >> +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [121.077 583.482 136.706 595.232] +/A << /S /GoTo /D (table.3.4) >> >> endobj -745 0 obj << -/D [743 0 R /FitH 764.175] +742 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [174.4 583.482 187.302 595.232] +/A << /S /GoTo /D (table.3.4) >> >> endobj -206 0 obj << -/D [743 0 R /FitH 739.268] +747 0 obj << +/D [745 0 R /FitH 778.724] >> endobj -746 0 obj << -/D [743 0 R /FitH 692.43] +748 0 obj << +/D [745 0 R /FitH 739.268] >> endobj -747 0 obj << -/D [743 0 R /FitH 693.578] +749 0 obj << +/D [745 0 R /FitH 732.374] >> endobj -742 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R /F38 526 0 R >> +170 0 obj << +/D [745 0 R /FitH 317.465] +>> endobj +750 0 obj << +/D [745 0 R /FitH 263.225] +>> endobj +751 0 obj << +/D [745 0 R /FitH 264.323] +>> endobj +744 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F27 351 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -752 0 obj << -/Length 2324 +755 0 obj << +/Length 1332 /Filter /FlateDecode >> stream -xڵZ[s~ϯ>h}Jfl23ٌM.I:}[8 -_[mm-ۺ=Zm>˵ǹr[a1܄ٜ0Y )xM(p -3U(w,D /0=gVaSNو[6 Do|=lqj]׋a+wڟm/@}zF-Q!pl}9Uj"DNj"Rano$kyd~+lzz(i϶.(F3 ~tfk@uYjHM+49p#G,D\BB0?rrOb =RlP r h%/pHBؤY̕MDrG)O&ki{VnisT/Jڂ+nc-{qzZOlK9)oʇ}Kaǎr<>8+;#n1+ ME_F?"v_E}…`֑cI7G2PYvYge%`t:&@zmTx?dmfA7A>v*g eHMu&9Tk 9\So -$؇HHG=@rls>)W*Ul`Kq@xde>FɼE9"ded#YY+߅2UVU xRn \8uƷ \=6)X2>J"TݗՖ\d&إq|;iW´r(Hff|sfc -. - C -:J -*]sZY (\.Ze(Yx@ƶ -˴,:D.uߘPDI;:e\<ߔ# " U ?LBmq|0,9d?s,ue̴ot]8|U!$&; pW{cXU&l" 0?Q4յКؔɪL`&įG኿]mNM="~s6S Sf.~kt"o*CPFwMr9oC sgA^%`6l:#Lg -);4 -N^[QC5K,(Pc3H`h*j'Cu(DB$(ܛb:Ik1گHߞ:<8b#b k)l7t-F FjÍ.dp+HڅF:MNÑ9s?3'v68c8KAjh]TusmwONg{`z;:h&>GM@HibkvNӁĆ*'€χ0ׇ[K܎dˑ)0ijF Ӌmwۍz p\C=ˆO~)uRS$$[1SD$!Ñ1Ɵ!m2ƫ'x" %d2D>}MCPrXPۊضTG$495i#O̜6>cU>AN𧑧j79UЌ{S8Ur$jYOڧWe({~q<9DrL d@:m#q+6[^WִIf3I Vs qm1OLx-1аuѾJlZM :Pwp:Po}taY7=xiNkyzyeݒ3mNB -sv;7WG➘Fv6=Sg`9iK2Цۨ gF^䊈nj="c'[-C_ -}d[ 7n\PWϺae}FD='KFĭVCH7Dokq`[궑#Rc0nߜ{S:){sNai\M27eGB/(>duzZ`CW]v+3 Es2ȪqJM kiʨ ®.v -̇X_@|wd8r49(;"//ﯿ^-uԻWŽT +xWr6+f"ڕ:duff<YRJQQ !'cN qpt|l:x`"t%I!DHD|hL9^酮F,bEZl|aD((MC]m%1aDy:ٌ=5#*0:l_g#T£j%H`JFUsxl Σ7?[qoJ"$T"L QXlY J@Q/"ͱ\y~+]ty|c־|Vz]V?[" D%[y~dbcU+zv&+r҇hxgOa @q!F~ ovv7`Rꥅ÷ח'볿^M߸`Mm~ׁw҅ 9m` 0ZLq,`Ԫf(cl wƣO}YӏRZAր<-n-#uɑh#W@$!baC~,E $*-:3aEd[r.R_.bMzk!A (NC|ɥx J{ZGc ZF1C8A9tH`|Wq} |Nc s Dj2S$CK͏e(Wo5P1 r46f{Cm˾Ǧ)~cǁ!ES:I#;B/w_qUߛ1O`Ƞlfwڍyqa%۝Z# +`闩uLc${rVܝUi[!0 .޿I,l/OY>v+8UYZZ ):OO&^ 1k۵ڍ/c_oQ2Z"@Rح_zo2| `7 endstream endobj -751 0 obj << +754 0 obj << /Type /Page -/Contents 752 0 R -/Resources 750 0 R +/Contents 755 0 R +/Resources 753 0 R /MediaBox [0 0 595.276 841.89] -/Parent 731 0 R -/Annots [ 749 0 R 748 0 R ] +/Parent 740 0 R +/Annots [ 752 0 R ] >> endobj -749 0 obj << +752 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> +>> endobj +756 0 obj << +/D [754 0 R /FitH 778.724] +>> endobj +174 0 obj << +/D [754 0 R /FitH 492.954] +>> endobj +757 0 obj << +/D [754 0 R /FitH 438.567] +>> endobj +758 0 obj << +/D [754 0 R /FitH 439.666] +>> endobj +753 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +764 0 obj << +/Length 1475 +/Filter /FlateDecode +>> +stream +xڵW]s8}WvKniلNqA$ڦ4~,ɱa,{m[Šy 1e*̂/o?ƔᕞbPgSm>*NG_'CEQ(TGyu9"|23;@ #^[/MF"ןRo=^ {ǀO("t13"0ErxhNM&*`b1t:JWN#4YUڱpz3=O[ )XUyS)l([OZ"CQ衆šU܁9i;8!{߂iB ́GXug +s? " 7*!\_m4 0aG; Cq{/>jY<|q%j9ÙX d3Qvklvk;*o]! SvvsȭbS.QHc)ru+{u7zB#r(h{KNw*unO#ݛ?ng /}f}҃2z=Y"FwƋڇiKH,UڹcI(0mYzMrȦTw+:S[;-Q|o UjUqC\vS*{n[HPQJ2!5N@#L Ź-%s@B?o_K`ͦiޞVa"lnm}e?"<EP36)5r'VNJxBSS 3XJw녛> _=-gqg[pJz']xKur>e<e[Qfؘn;IjM=ɗөR$L +8.BH.=j3ƪu& +endstream +endobj +763 0 obj << +/Type /Page +/Contents 764 0 R +/Resources 762 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 740 0 R +/Annots [ 761 0 R 759 0 R 760 0 R ] +>> endobj +761 0 obj << +/Type /Annot /Subtype /Link -/A << /S /GoTo /D (page.57) >> +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> >> endobj -748 0 obj << +759 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] -/Rect [435.931 452.018 451.56 463.768] +/Rect [411.812 502.779 427.44 514.529] +/A << /S /GoTo /D (table.3.5) >> +>> endobj +760 0 obj << +/Type /Annot /Subtype /Link -/A << /S /GoTo /D (table.3.6) >> +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [429.157 456.95 444.786 468.701] +/A << /S /GoTo /D (table.3.5) >> >> endobj -753 0 obj << -/D [751 0 R /FitH 764.175] +765 0 obj << +/D [763 0 R /FitH 778.724] >> endobj -210 0 obj << -/D [751 0 R /FitH 739.268] +178 0 obj << +/D [763 0 R /FitH 671.086] >> endobj -214 0 obj << -/D [751 0 R /FitH 665.367] +766 0 obj << +/D [763 0 R /FitH 616.699] >> endobj -754 0 obj << -/D [751 0 R /FitH 612.219] +767 0 obj << +/D [763 0 R /FitH 617.798] >> endobj -755 0 obj << -/D [751 0 R /FitH 613.367] +182 0 obj << +/D [763 0 R /FitH 304.508] >> endobj -756 0 obj << -/D [751 0 R /FitH 333.742] +768 0 obj << +/D [763 0 R /FitH 250.268] >> endobj -757 0 obj << -/D [751 0 R /FitH 335.038] +769 0 obj << +/D [763 0 R /FitH 251.366] >> endobj -758 0 obj << -/D [751 0 R /FitH 321.488] +762 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> +/ProcSet [ /PDF /Text ] >> endobj -759 0 obj << -/D [751 0 R /FitH 307.939] +773 0 obj << +/Length 1724 +/Filter /FlateDecode +>> +stream +xڵXr6}WQX n:i'dh +RKm ."(ʱA#^=nL}~6 OJT3?"oI&D}Q$(>h<{v;#l*:+ p6'>|h>{&O0FU`z|yi^-&_'.G>C楛ɇO[»KǑwۭx nׅca؎IlD9={͝`oNA7 /ܺlqICDC߃8Zs&n$[>bL!]Ƿ,]z]R]_p<}[\NbDФK=CcfU.*1&P{EDvEVk'5|J +_{1e[֧DTU3%Aj][A[@M$) +B*+-Wx-) +꾧E1>w[*7i$jxhڪK`Vݧ_Rla븍 /LWm6 CkPGi\ `bm;Ɋln*1nD&l HM/L`7qD~ine;H$$b^5tHT*ҋQKjJmSZH$ߋ u&YEDU?va*vXz21~VK.B5$)+1VS(!=\wdQ_uJp[߷%uP(;Hܓ&hJLt&4'Z}\6:g-AEL2Dz͌/Y7gܪe«ݞ>H[nfof,ʨNLf2;((3.b fw{U{w}&N |ř􌸙m6AH8 I؀`Q+f?՘&^=Fe9xߔ |@ciF/i(B2-ۈAj@.5եS w]_K 637F篺AH`fg-"Gt"*KO~!9l!M{x0@P?3]g-FmNXEs)W*cl8FfIt6B)Mu5$ڄc5-h)cc,q:3[M2-|I)¶{Қ۶p^R'(f 5섩>XF_MSQ 8S'n:Љ[{P⤎bO9N^ 8#2;*LĀ/}G̫/\a㇝KreC09c"rD(e8Zc wGItPr8|Wlq~I'bIE8f@Q$fO1Efc;Gd9!1Y4!cV[MX1]'՘!?uCx{|9{dmbu觯ͽ%Xn 6> ď5RA@V|‘3mHXIM$vW~[:s6|lP +endstream +endobj +772 0 obj << +/Type /Page +/Contents 773 0 R +/Resources 771 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 740 0 R +/Annots [ 770 0 R ] >> endobj -760 0 obj << -/D [751 0 R /FitH 294.39] +770 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> >> endobj -761 0 obj << -/D [751 0 R /FitH 280.841] +774 0 obj << +/D [772 0 R /FitH 778.724] >> endobj -762 0 obj << -/D [751 0 R /FitH 267.292] +186 0 obj << +/D [772 0 R /FitH 289.569] >> endobj -750 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R /F65 617 0 R /F15 527 0 R /F39 763 0 R /F26 337 0 R >> +775 0 obj << +/D [772 0 R /FitH 235.329] +>> endobj +776 0 obj << +/D [772 0 R /FitH 236.428] +>> endobj +777 0 obj << +/D [772 0 R /FitH 222.879] +>> endobj +771 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F63 534 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R >> /ProcSet [ /PDF /Text ] >> endobj -768 0 obj << -/Length 1708 +781 0 obj << +/Length 1193 /Filter /FlateDecode >> stream -xڵYsF_h}ptqRUv\GnҌKHf -(wa'rYۏrs6z;9e!8$lB8e3[8g:^ƅqcte(u?+f"!E`pRjv|q EZHHW]ҼF2a$p)@txs_iNfGAV#B;g,{y)׎8u>l)3!31tqY*ɫ{?ho?\OϦ7o3Me\nEY6]e@ ?z5< eUБbu+q*Ϸ.#YzLybi?[xŴQ;5u)}2}Cg{&jlEtoct̲HF:[KQ݌y\m {SMʽMzn[dybU*l\Džh=i+Ҥ.i+H˴:.YvY3V5}gg-F -3+~}v-xs2c6ZD@/dն%Y?4AI^?s +xڥWMs6W(X0H趲n:N@d%A$*> b]yrs7e9%q1Jp:ˍa1H,·ݛmhx74|Z>+u&C;<+73Qe%W&Sq0~MkxQ`?ww#jk}0ԎDw$|XY8~@Pˀsg1uwɋ`bD bc*hj +6ԃ=_YSJ}FӋp7 +&m^Y֌G=+5ҭV۲jpK???kZ-xA$2!YnrH|q"tZ>V/(7qR?"SA$w㦮K^MPdyFҐfqU3UӚ7n4ٺo\ 0oyc]exY=ޟz^Սl&l3 Bn^#dMӺmO*GĊi6ʍf%{;fZn[%ϊhUM ? u'5If=kș0)unWlI~6Ғsѥ̬GKjGoLJۢUvU술EBH!w:EəFQ +vVgYYHb_[7S }ع!*+Y&.N +K&:@> endobj -765 0 obj << +778 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -764 0 obj << +782 0 obj << +/D [780 0 R /FitH 778.724] +>> endobj +779 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F63 534 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +786 0 obj << +/Length 1237 +/Filter /FlateDecode +>> +stream +xڵWK8Wp4U7p>2Vv[9$90lSacf0l ԟ??ag`fz=(q;ȗ( gwE^ު\-UQaRmXq` +ݧţKRey&E"bI yo5#`_w^oo-y=z}ABk#b(9.|}S5pع[U4Q!1.i&# M` a`k%mKP De֘!b F^-`M=$}f*}HC]ԵDC4QzK +ɔ0:=>; +$-@Pcz,LS٢lU~2#9GDjX܇>2 R.ysρ݂X# + 8$P|>VTnɡrS۴MAw6'Ͷ@ @)ͣ<6oՃj(Ohs7/q`{(j$iR$:5v$4]K3uFsd 0,1csԐğDk\̯;3NL>+l5>gP2tm+dq>U׽Kb|PgiyRȞ$'6k`9ez\{.)lu~G%F2lνf Zƚw~Hxk@騸XY.OxgG#CxC)LYS*~\C=>Wfm-gXX(Χ(n/UmÎӯ\d6F{D +endstream +endobj +785 0 obj << +/Type /Page +/Contents 786 0 R +/Resources 784 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 792 0 R +/Annots [ 783 0 R ] +>> endobj +783 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] -/Rect [435.931 274.086 451.56 285.837] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> +>> endobj +787 0 obj << +/D [785 0 R /FitH 778.724] +>> endobj +190 0 obj << +/D [785 0 R /FitH 739.268] +>> endobj +194 0 obj << +/D [785 0 R /FitH 714.106] +>> endobj +788 0 obj << +/D [785 0 R /FitH 660.673] +>> endobj +789 0 obj << +/D [785 0 R /FitH 661.772] +>> endobj +198 0 obj << +/D [785 0 R /FitH 398.344] +>> endobj +790 0 obj << +/D [785 0 R /FitH 344.361] +>> endobj +791 0 obj << +/D [785 0 R /FitH 345.459] +>> endobj +784 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +796 0 obj << +/Length 1166 +/Filter /FlateDecode +>> +stream +xڵWM8WhWŊ$@{ۯLmj?o!Ɂ٦ +bۀ$'3F׭ A;D J$EBHĘm2ayWkVmU +ҩHtOd8ԣa݊򥪛jMdgu X Iۛ`pXgu0NXF'2- 2F~eB`vo"D)1M,4f#Jb'bZ8<8[$zzכ{m/{uޟ~ޞ*cx;_PPiZȹ/h2E*X R0DZ?Nυ['PK).N LuY KꙆ!A>h&kwД@zbJL9p!68 q7;R_c)5yW٠!\ V[|$ Ϡ[U 9tL^ 2$"D/*D^u:y:4=O{u# <Ô2,:):l Q맕le`&pi +6UnkyJg5rµÆf.oiоc׊V5s}+T&麐ny3زmuj|rh7{[Ӥ(rsJ2,XUgp(꼲jkxtq<g#5h=sw6IiGJU8s\b(B(P?+` w 5Wp93uP:SP:/Y<C4yW =e yo;U}E;x{Ɋr:p^Fǜ~/B:jLOJ_&fWY;YOMSTb vbnPXI-4~osL(mUm|>Cf>3I!5 T;JanfxrԨ{~drдi~\VjKN]S(h5t&W`#0sqhJbL)g1^>+&F9/KQ}{i E> endobj +793 0 obj << +/Type /Annot /Subtype /Link -/A << /S /GoTo /D (table.3.6) >> +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> >> endobj -769 0 obj << -/D [767 0 R /FitH 764.175] +797 0 obj << +/D [795 0 R /FitH 778.724] >> endobj -218 0 obj << -/D [767 0 R /FitH 537.041] +202 0 obj << +/D [795 0 R /FitH 739.268] >> endobj -770 0 obj << -/D [767 0 R /FitH 482.801] +798 0 obj << +/D [795 0 R /FitH 692.43] >> endobj -771 0 obj << -/D [767 0 R /FitH 483.95] +799 0 obj << +/D [795 0 R /FitH 693.528] >> endobj -766 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +794 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R /F38 550 0 R >> /ProcSet [ /PDF /Text ] >> endobj -775 0 obj << -/Length 2412 +804 0 obj << +/Length 2314 /Filter /FlateDecode >> stream -xڵZn8}Wލ^DJ.$AΦ臙Aش-@<`Er:v+e:,V*˓wӓ QL/ Q8ӹxB9˅d&0نŚP$ f*QƄdGioP$ˆGwpi?S' #\e z `sO38=%,^Cǝ䏿3~S9r!*c*RMSFMd>ˢMգߌ"dVTd8ehnEJ!,]>4{׏cGŘSy/Y'T͠&µ,-u]qa(EvTjm3aGh2JikTxfIu[ʋl;f+} -iJoOQ4sI$Rbbh8X_;>|QUS]A'&ɤhe>E]>: -zaB=`کI_ڙSؙ=X>G_toH @g~mdkE.7C$vc' τy#r1lC~H. O Ñr?4syx+ `z\e)H\fTy%h^N5rU$O'F.Z&*ˏt _HC?;vŮ(mdry7wK - ><W80Wv60}X/KpwυdvH}Gn׏\SK=*0$7-yU`9062X/xUy`b@挰4-m^58Rz1F lRޤq2-Jg2y,hWe bmGxk:1jba+w՚C NWQnXikkQBQ>g.2S,<~zLJwWS0 ڹp۫$17@?_]^>|19@if}Qx/*>\1vO5v˅dfI#Dj0Ӱn%hesLuw`wfj!5BSowYޤLWo -zo3-VIqTf_w6:l2K7w]Gg&Ȟ\/Ġ#d\Eh0ަj7o.}/a)_݌F´ZO$KK,j:G/S֘Mtmj~ fWM/YaaЭkD5d_)vcդJ,1Zq5CֿJ?΋Mޑ3boVac6]o -vjPReD}B=jl%So27ans0%I7<컩HeȡØP:yj;ۼu0L&?EɝL<_}aqerV䨑,Dm`W~ku7blS $j.MsB'c\F2Hوam@od_zN -q[l(d&7[P -boA.tg=5( -A#t"Hqq;q@l[xvc Ѽ(7ft3Qn ~x]_9GՁR +xڵZ[s8~ϯꨑyJLe3T +ئ +ˤS[I܌ӁT0ssѹ`[˶>]>m$lrc0{vtNY/uW?.h/@6IaA)TRQo=lYASٝ|o4m*Kg6▍/??muZaj(.?<(PYOʝ0#gUJkaQ&LC0QA ۶g7J?^ {^s_=:qU@e-BEk?yYo=Ğ9a30 )0G3@X`tQ{zď7EXwm’`cq#σ@%pXǬ4 {-sLkXٲc $8,(fR[ +Hr%a`S vuC"YL0lAF" cf6Pf +ކ#r ` 6 iq Ȅ@M +!L471\+i3[Ҧ.S:IA([?%8/ƿ`An5n.x{ py2=uo2GP&0r)?E94JU,G#hC7Gݳa.p@X{Q%p޶It v23 uET$݅:E]xXyZ$|쒙V +T=RI$&&E\)1zs#Sp8%R9]#sZIP,s=mV_G KG0LmU/",9daF2sS f4dee"1`2g*k\O!iEҐTQ-ا! gcg~dRmÚ35YeF:Q*FAvwҨxb-'y\j!i'1ϔNR~ 4CL!\Y(*MLfnK㣟.0 AUV]RH9#S~ 4qL8\U:Ngz] U#;IWMf&I:ptx<א]sno{%bLzb7ԱK=AJńK峙fXu1<1ApcIܱ +%! ?Řհ6rdjS]hKeCNPY57ZQ(qJ@ @$*G\ڃ8J?-+" E㙨YoTg<J_(8i4k|PT0B2NP./;&ݠ +39 +? 27y뇋۫˛p' endstream endobj -774 0 obj << +803 0 obj << /Type /Page -/Contents 775 0 R -/Resources 773 0 R +/Contents 804 0 R +/Resources 802 0 R /MediaBox [0 0 595.276 841.89] -/Parent 731 0 R -/Annots [ 772 0 R ] +/Parent 792 0 R +/Annots [ 801 0 R 800 0 R ] >> endobj -772 0 obj << +801 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> +>> endobj +800 0 obj << +/Type /Annot /Subtype /Link -/A << /S /GoTo /D (page.57) >> +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [435.931 451.997 451.56 463.748] +/A << /S /GoTo /D (table.3.6) >> >> endobj -776 0 obj << -/D [774 0 R /FitH 764.175] +805 0 obj << +/D [803 0 R /FitH 778.724] >> endobj -777 0 obj << -/D [774 0 R /FitH 694.044] +206 0 obj << +/D [803 0 R /FitH 739.268] >> endobj -778 0 obj << -/D [774 0 R /FitH 695.339] +210 0 obj << +/D [803 0 R /FitH 665.373] >> endobj -779 0 obj << -/D [774 0 R /FitH 681.79] +806 0 obj << +/D [803 0 R /FitH 612.236] >> endobj -780 0 obj << -/D [774 0 R /FitH 668.241] +807 0 obj << +/D [803 0 R /FitH 613.335] >> endobj -781 0 obj << -/D [774 0 R /FitH 654.692] +808 0 obj << +/D [803 0 R /FitH 333.78] >> endobj -782 0 obj << -/D [774 0 R /FitH 641.143] +809 0 obj << +/D [803 0 R /FitH 335.026] >> endobj -783 0 obj << -/D [774 0 R /FitH 627.593] +810 0 obj << +/D [803 0 R /FitH 321.477] >> endobj -222 0 obj << -/D [774 0 R /FitH 290.456] +811 0 obj << +/D [803 0 R /FitH 307.927] >> endobj -784 0 obj << -/D [774 0 R /FitH 237.388] +812 0 obj << +/D [803 0 R /FitH 294.378] >> endobj -785 0 obj << -/D [774 0 R /FitH 238.536] +813 0 obj << +/D [803 0 R /FitH 280.829] >> endobj -773 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F65 617 0 R /F15 527 0 R /F39 763 0 R /F26 337 0 R /F63 515 0 R >> +814 0 obj << +/D [803 0 R /FitH 267.28] +>> endobj +802 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R /F65 664 0 R /F41 487 0 R /F15 551 0 R /F39 815 0 R /F26 353 0 R >> /ProcSet [ /PDF /Text ] >> endobj -790 0 obj << -/Length 1582 +820 0 obj << +/Length 1709 /Filter /FlateDecode >> stream -xڵXMs6W(u, <*M#׮,$A(H"U)C;HX>>5vvw.vF!X9>FDY,Oëߣ1ex8+\(HkE2LǦHH]I[N͊F e^Yj(1qIX[. 0FXjoٸ>.Wux(, iJ3Ls)AQJFG}o W*Vn>gQriV|$XOtoqz),IbʡS,l38ڎ(}T'uZˍ(F᫔tS (V'UNVs)ʹ)aϯa[lTZ?"QV8]ԇ Dόrp*5 لZfT0 (d]j\pG-X147]P'= SZoCGVs8y\չ8A\:~zB ~B$Y9! -9 -[P( z{)Ðwvkas.dSM8ҙGiþC+si:fTp3fpc-ܨP|S3NK!,l1G$tGSg̰Y܁.gպ(K B mD޷Ow՛Ydqph8[yѷµQ럳Y%b] ¯O~ -ip } INlOs f ve Y|P)W^}^iPm؁h 4 -S:M)Ϊjhӻ,{wFdɲ~ȅUReIGʼBvUVpG޵14h,oMWoƺx8\E~3q"n'* ;q~s*&.KeZRJ5F<\."HUX_3EvEĽdO't}6osK5k^Sqy8FT3 +xڵYKs6W(=tFIlq=-Qg(R%8HrpDb[K [ -}bM' +Q[ӹyxy}='"ld eH&)S7TwWWaQ\{DN~ H.2`:m}ZG!l=[s(0߳ʝk qG2[VL&!5LIXiK,q|8}~x{5U>qzDJb},ѨH=\Oԣr4 kЌ,1BRFyHYP$!HEkP*G$4w_mRG!ؕx앖!*EֈPGx!)T%84֛4 An8Be< #9U-vJp17OA|W95?k&T1DqGťJ +7ZaM*/ ({$>bżoߝ#EMZ!`QWKx7x4 lo@q o9XW]J㨎S 7\OR144KBj#:iZRY[ok:&ذբSrE7fifURpoޥDkR>oVA d !$yԛc]ךv +s* +w 2gH +c\MNe-]"y;do7}KI' +D 0bO[`ɂ ֢__9q!m;LN|LX>[9p%;ώ)#v.[v,Axrt<(p6,4 Z +Ds%:vjjXcf>aY+^y} Ҷ&پoY"u[[=wN#쨷Lb{ endstream endobj -789 0 obj << +819 0 obj << /Type /Page -/Contents 790 0 R -/Resources 788 0 R +/Contents 820 0 R +/Resources 818 0 R /MediaBox [0 0 595.276 841.89] -/Parent 794 0 R -/Annots [ 787 0 R 786 0 R ] +/Parent 792 0 R +/Annots [ 817 0 R 816 0 R ] >> endobj -787 0 obj << +817 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> +>> endobj +816 0 obj << +/Type /Annot /Subtype /Link -/A << /S /GoTo /D (page.57) >> +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [435.931 307.909 451.56 319.66] +/A << /S /GoTo /D (table.3.6) >> >> endobj -786 0 obj << +821 0 obj << +/D [819 0 R /FitH 778.724] +>> endobj +214 0 obj << +/D [819 0 R /FitH 570.914] +>> endobj +822 0 obj << +/D [819 0 R /FitH 516.674] +>> endobj +823 0 obj << +/D [819 0 R /FitH 517.773] +>> endobj +818 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +828 0 obj << +/Length 1429 +/Filter /FlateDecode +>> +stream +xXMs6W($zsL=9$q"UrKcDowOHbI 1B!ʤ7_x_gZgT2>.wPDRO7fŽOTUZE?#D|I+7x0ͧ{?o'-3|W!r/L|Ùyg DC41liXԪ~"*[~UFw/"mEYWzm9O˝)ާs?ӸI4]y1,(7qsח$ȼlP s~o0-8Ӄ <./?7l8}oS]RWYM[4ޕޖVȤN]$TDH0jgH c$UBJt:(238_ڃ[=uݞ]qgy;:B("%.}P@ F+jtq R>DRPipȆ 8UagFIh({VZA0B`<6L0;CCπtbN 9p[28 P}rgXMf +r%rxЦ}.L ?A:);RT#-;RW<[F1 jFDs{ "$(שBMy@(ӮUUhdD{,!*gVmWUZ@q76{8}W>T@U6l;i#vm7&P39xhZ[UJݎVf3pPgE~6&l}Lu?ĜSF<[-3dJlTCdMh{pb z.FR+T\:Y6ZlaNje7|@D?/GЛT]ҝR~.6kT';&> endobj +825 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] -/Rect [439.411 443.451 455.04 455.201] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> +>> endobj +824 0 obj << +/Type /Annot /Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [439.411 188.95 455.04 200.7] /A << /S /GoTo /D (table.3.7) >> >> endobj -791 0 obj << -/D [789 0 R /FitH 764.175] +829 0 obj << +/D [827 0 R /FitH 778.724] >> endobj -226 0 obj << -/D [789 0 R /FitH 611.562] +218 0 obj << +/D [827 0 R /FitH 637.066] >> endobj -792 0 obj << -/D [789 0 R /FitH 557.322] +830 0 obj << +/D [827 0 R /FitH 582.826] >> endobj -793 0 obj << -/D [789 0 R /FitH 558.47] +831 0 obj << +/D [827 0 R /FitH 583.925] >> endobj -788 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +222 0 obj << +/D [827 0 R /FitH 357.11] +>> endobj +832 0 obj << +/D [827 0 R /FitH 302.87] +>> endobj +833 0 obj << +/D [827 0 R /FitH 303.969] +>> endobj +826 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -799 0 obj << -/Length 1974 +837 0 obj << +/Length 1858 /Filter /FlateDecode >> stream -xڽY[WF~Wja7J4!{mt,_YEZY&Hߌox8@I`oaEaM8;=??"<]|DEZi -PNb!:)Ǘg>3QYY 8Ky/]k4z#(t>yuzyi9L-(|xK+HIw+7q&ν߭&MDbD oe#j<(}ct92_q<jIv-Vx4wOjOs#9`v>p>kڤ4?=OԥkXK'wuvVi%~(fmYWV/\[=V_(Zg 5~֣†R&W8t$W&.E!TQa;6@֛Ң~Qє`>(dKNxveJ߹ JZFȇep[>o_P:GQxL5G(]c> wqhH5p\F-"Sm0d|O~mK6ܲJU9;e66:+mgyQmKX{ E1v([HL;*pSQca+sk@o%Èd!"<26LbvCbi#8DaB_) -+FQ ل#)x%ZqɶtnjEQw]wn5Z5)."/k>LcRՉh<~hs6\lDѤ}f} -bejI oDfUY-FPt>qz:1\<]B?RߥhNw*yIY, \J`嫔ѮܙxxdMNEYn4#BOq8Z%PVQ,tII?ەѥj|irˁ bl8,k 36_ "SQ{Ce{v,V NTn;tFUv.Vh1<[eIdՃ%œfj4X *%Wc|VqlwZ5L#q-}{\IEm' + ^[ɬ@7q cPT ;_DAeeaz'Em;_K4/Z*7OV,2YM+ak*yB9AَԽ!@Ye;v+]3x95p4bG]Vil92܉! &M8FuOtv&~'$Nz'fsi9Khݎ{ݶ|w7jb?.|:Ie}K1Begf+[3# +xZKsFWpUyc-[jwK%l+AH(B#cq!=둱a`C0RzJjD3|tL܆gjӰX M_A"".hʥ\o1Wy )0&f-rqwwk%nSD BK I&*20ALr x:3X9T5\OR`njj"F/jL3sPυxVޗZ!NdW/|}i<'p'xi<\_MFón\zĥa(|H<[$M{&M~F`솲ŭ0PR1(?'(Bn >Lt;|ztMnJsۛY/S ~8B4Fy(my"`.)G/$qdaݏ^JaR{U65tEcHݍiw- Na6 .1Vonwë>W4OƷ>;fd8X_u9M8{ R|'!ry[(Fėjd4 _.wn+pʯ6pU@X\Po!\od [h@eH1=I ">6 >0цs?λhC#:5C RCC7IwPa)ǭҵ VҬUA^MA{,sBM޼@3q'6nEP0ԍ8M{\\27Nd"m|bs7jG)d +K61eCF0\F[uT#VvYH͞Vta#=$@HP6*aaobHwan23rt ͮh粥d5̆fax`%`QS̓L)DBɽ]!l$TY ZucheGi|`>-gM^]ڇ2^lʃUߠxe"in>L.OnkFڰa3#Qr=b]O2cj]\'>D˧*W5$@nhf1w݁y(㣦K 8 $`|2(xQbOb.$,HجliiQJۉ)`NP`ymyR49atp$z+QJAjC +b15="=N 譹bt: +uDY@0n&M7AϖȎA<+VHv1li/'kGſDkw ŸEmS_{ +|SA:P%k&T֍+•ʈSkqKRKR}XPk݆:Wy-rd8$p8(JRJ*i LFcA=-GBz*bj endstream endobj -798 0 obj << +836 0 obj << /Type /Page -/Contents 799 0 R -/Resources 797 0 R +/Contents 837 0 R +/Resources 835 0 R /MediaBox [0 0 595.276 841.89] -/Parent 794 0 R -/Annots [ 796 0 R 795 0 R ] +/Parent 792 0 R +/Annots [ 834 0 R ] >> endobj -796 0 obj << +834 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -795 0 obj << +838 0 obj << +/D [836 0 R /FitH 778.724] +>> endobj +476 0 obj << +/D [836 0 R /FitH 640.368] +>> endobj +477 0 obj << +/D [836 0 R /FitH 509.711] +>> endobj +478 0 obj << +/D [836 0 R /FitH 349.823] +>> endobj +479 0 obj << +/D [836 0 R /FitH 189.815] +>> endobj +835 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F15 551 0 R /F39 815 0 R /F26 353 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +842 0 obj << +/Length 1911 +/Filter /FlateDecode +>> +stream +xYr6+Z wwvȉkE$sJ +ݯCP8 e +s=85/o"8$bcg^Zy8k4.^ G?d銉GQZEۦHH੶rv9;;dygx@?mm~ 0,pC?9bbm@#ddwn+`u_Yk#'Om&hl,abeS'FI +:؂ܼ9otUjhrn3-rq5rxoRm.{:?ɢ5[EZTI8!MlX Lq#ͯ:~"LF".V֦r[Vx_x +.qa&Z/"(ٮi"?{co>ʣ+E1$;LlSTEa+2!BD ++,ε7Z3#PA$T(V90 +!M`X8yAЕkvYuqU +`Wl(C0ӷ@`xJrjpG`fqBa-9lyΧf6]^]^/g v=.ڄcbI"Sh/lj+,QM=;@0Y{d,eyT]Ʋ#FeYꡖܤ tk>]ͦ˛y!,z{Xa$)F{+`7ʀUCgIA#|vzl%H6dT}0^l~&AͺW\,BH VާkmWIuFG.R@dyovy%1ntbpJ#Wu ʦAbz&(~t-P5]0XhM[0U%u_k':ol,XeI::w%Y#Ҷ_M;8BmO\̣HbS Qb?e=0ƫ&WQOL9h{tc5Dj ełlH%H(@$*g"li9@-u?vG7r]*H ,Dqs\tYϠ`XA~@=3e\GXkW\uTJWԅ9VŹV#FC;Tp~ځ ̾g_j +t@ 먌&wvx[ "ꘊv$Ѷgr*PPM*7 yGIOj߫7ڱտLt +endstream +endobj +841 0 obj << +/Type /Page +/Contents 842 0 R +/Resources 840 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 846 0 R +/Annots [ 839 0 R ] +>> endobj +839 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [439.411 306.365 455.04 318.115] /Subtype /Link -/A << /S /GoTo /D (table.3.7) >> +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> >> endobj -800 0 obj << -/D [798 0 R /FitH 764.175] +843 0 obj << +/D [841 0 R /FitH 778.724] >> endobj -230 0 obj << -/D [798 0 R /FitH 508.349] +226 0 obj << +/D [841 0 R /FitH 274.426] >> endobj -801 0 obj << -/D [798 0 R /FitH 454.109] +844 0 obj << +/D [841 0 R /FitH 220.186] >> endobj -802 0 obj << -/D [798 0 R /FitH 455.257] +845 0 obj << +/D [841 0 R /FitH 221.285] >> endobj -797 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F15 527 0 R /F39 763 0 R /F26 337 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +840 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F41 487 0 R /F15 551 0 R /F39 815 0 R /F26 353 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R >> /ProcSet [ /PDF /Text ] >> endobj -807 0 obj << -/Length 1933 +851 0 obj << +/Length 1750 /Filter /FlateDecode >> stream -xڽY[WF~Уեo .=Ppڇ4#ѩ,9w&i%9@ث\vpZٛq-E{rc. -a[˵^\1ukaCB+&.I2wE#? przu.*-rQ=EԾϒM\E"Wzbi().gg|:Cjv\k ~ $ع|J™u3'D܄#D\yƪJj^+v]lgw.nߜ/z^X}2x(mTlkƽnJf -jwd}ɯlSOj_.xL`#YYZ gN<>߼JE[!]d,~~;#f7aUH?ƀg\~dTi͘vn_,{Mv϶L$c;yj}ZMlȏGz$؜^\vz{yzŦq -\JZ?IefI[2zv#Y8pO.З`CﻢO6 8af\E6ÿN$ tM)EYtFb2 -҉&!Pmݨyd5l6EK'h8@rFfεZ*UcާJ`%$%PFv4E@$ {Xk2Ƶk "+J \xݳ%7$֗29W=`Ol KteWYmB?it^뿓_mPuTL}wTdHCrq࿒J&b_-aJ x}yQ x"B膮B H#i202EG 3}Sgʏ̧zk'Em54ˏwirg,U8QyFV鲙|p{^y(\~Eg!cΗ5BƑ ;Y\,on >]%{P9啀X;ܧAfZfdb>ѶK>_CA\pggl&JwCjwUJw򮈍AMІCTM#BʫU 'E#vLx׀]`WŦUЊ}l6cu(+5]Em@Qj}u2zH_P%"،.U׋7UPu@%p Y>*iLY&v4F?@qnh8 .-2=tږLjw5C(&z?RECP n}9}}q 6~,'6`zrEg$ PP$(0EDYGC ICߊ@?hmȰc\r15;0 P -`t;Y'T2Lw'cC>_A@%0%^) R |YC؋nm G~u++O1=BЂ - ?'DojJ0 -qы:|%Jo[| -?hBS@׻GK$4z68cwؕ>t ~tA؎%xLv n! A]!9&U]q8` W՚-9 -gdƲGe5[7喗a-On$3 ^j\[ҷ^NoLT.,7bU\v۾,_?N,tH͖)]ƞ_ -/ d~OBO#=8p.%W%yyq푱ȩTLW]HVߘ>g‰gNۧ7o[;K-`?' +xXr6+$' I*#'-$%H"Y~}/b5lsf9uac4SXn(0NdXْrCk"iS=L嶧Vg/l$KTg*3-V;5Pu MhɲjVXIG8&o3j:~"L,}p$s ou[dDuA!қ!W(l/(R[ҽq#NRUKÚ87 ]OZ91'lWa3Xd#lb2rmp۳Q0 .4'|kb`mG0ѥ5uLu3u{XH +Bi6w +W7;拷flK漠)ǔ|粽'0/zvǵ^;"֣,;3I 7GKhR +BpKk>>gE),HvJWE*a'q$5)ٖj;)N=ŬL4R^FT<0W3YWyx@ge~soqDUv'zCkߐԬ)RHe%ҌwdWL[G}ˌdWȳݎi ZS\^r9$:Uc^[9+O<.ر3RO gJ>¯47iSaABE$QzxY{b~ڃ +9mZi@ug *CNNw[o*+5tFnNGl` ~29{ul~T&eRiP/h DnxY'p1l2iVv9ŜM5&G[0sz20TF(%$:^{T9E6{`ֵFj %5ttϴ/NI_)+ endstream endobj -806 0 obj << +850 0 obj << +/Type /Page +/Contents 851 0 R +/Resources 849 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 846 0 R +/Annots [ 848 0 R 847 0 R ] +>> endobj +848 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> +>> endobj +847 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [439.411 623.332 455.04 635.083] +/A << /S /GoTo /D (table.3.7) >> +>> endobj +852 0 obj << +/D [850 0 R /FitH 778.724] +>> endobj +849 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F63 534 0 R /F41 487 0 R /F15 551 0 R /F39 815 0 R /F26 353 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +857 0 obj << +/Length 1900 +/Filter /FlateDecode +>> +stream +xYv6+Z @$sU.ZdRG}ăQ&.Q8s΀r([/( Dyˍٜr<[Y`*ԷY??)kD1N~SYI9Iȧxgl3J`$O7I3ޛI͋}\#jh3S((A{n#F/EBW<<CCe_Vo4} >5HSCRJ,`[e{aȸ؅,Erhb< $.AS ڀVZpO H]E?dvyCc -q)c5 t`,7͇GGwspa7/yhT%28t_I!m;#ڻMHo +D`OwC6+\V zz~w~}zXveR]VgF`QnuPB9TH d& PmLuVMJ4ֻ|Rց>,.WZqqE:?$IyTn+ űк4kd +_qy8-J!q"p<兲o91!dVu)MgWĦuJUWg_5vHfh_'ڌHMnί:_A>T~IglP,vx:q?+9ўVd ǔ#œH@Y|>-jMɤ}JZ&"-c-k-/ϵ6n^#^]3n, :N]iW U.8J!|SnQʧu%.> endobj -804 0 obj << +854 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -803 0 obj << +853 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [439.411 246.988 455.04 258.738] /Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [439.411 578.509 455.04 590.259] /A << /S /GoTo /D (table.3.7) >> >> endobj -808 0 obj << -/D [806 0 R /FitH 764.175] +858 0 obj << +/D [856 0 R /FitH 778.724] >> endobj -234 0 obj << -/D [806 0 R /FitH 415.099] +230 0 obj << +/D [856 0 R /FitH 739.268] >> endobj -809 0 obj << -/D [806 0 R /FitH 360.858] +859 0 obj << +/D [856 0 R /FitH 692.43] >> endobj -810 0 obj << -/D [806 0 R /FitH 362.007] +860 0 obj << +/D [856 0 R /FitH 693.528] >> endobj -805 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F15 527 0 R /F39 763 0 R /F26 337 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +855 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R /F41 487 0 R /F15 551 0 R /F39 815 0 R /F26 353 0 R >> /ProcSet [ /PDF /Text ] >> endobj -814 0 obj << -/Length 1466 +864 0 obj << +/Length 504 /Filter /FlateDecode >> stream -xڽXr6}WQ /}'2}H2dNy HEwIN{(j={vq l-l-gW[Fk<|׵L ȵ/|~[o0r-p'!ǻ |sO~_ϾxԺ( -f( `n\|0:ť]x؟' P4*23o~'@C+/( --GbWsi3<_:'bǙE1Hy"+ ?S˷ùaK<Yz7F uOQ/ߐaijx 5#oL5&Rojsy}zgyKjuiMM2D<{p3vkT:pg;\`9,'Y۔A12דdosɩt5镆U^^AۼWqx5Q֧ H^jSÿR>a ʓ\ZºJy -^Ɩ|d7*Ԇ;дO%ìLg(WA4n/_h -Lj )3ű~/Ͳfxlfaidh,b kOtW=%!ts@ ڳ~tۑwԕ@]6ΓCOS6BI8kX Y@]">C gf&"8Cu/کM --AnQ_4Q2I2w ݀rtRE[khJ:us\oXde×1Gg\ 7^nU׶3Dbtl&dOiMu9ݏFZ&V6idЇlh45G]8  -@uKeLI5|Jܺ?7nP*a67 ˫ǞUXNKZ*"[^պT9F -@"َe2 ѕr|OUʎe#ZWr v)3RmJUr +xڍo0+pmx$ZZ""/8$Əu 64Ye-A#B#A#d9xv [yGBW4Qzٽ"R8 D4$;s⷇+T+`qOVQA:6u6&5s~9XC@#6EV2.c35LA O Tz!0؞ښ(QhRP? ̮"Ɛ4f0D&TnIw_WM[l˜h/׼ذ?ΗvT]|,!@[9t&fuJ،7[L ~ +.4]zQ폶[{H6]f/Qd)urF  (ocώB'|m+s碕smKv?RKIs75+Y=Ͽ endstream endobj -813 0 obj << +863 0 obj << /Type /Page -/Contents 814 0 R -/Resources 812 0 R +/Contents 864 0 R +/Resources 862 0 R /MediaBox [0 0 595.276 841.89] -/Parent 794 0 R -/Annots [ 811 0 R ] +/Parent 846 0 R +/Annots [ 861 0 R ] >> endobj -811 0 obj << +861 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -815 0 obj << -/D [813 0 R /FitH 764.175] +865 0 obj << +/D [863 0 R /FitH 778.724] >> endobj -812 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F15 527 0 R /F39 763 0 R /F26 337 0 R >> +862 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F41 487 0 R >> /ProcSet [ /PDF /Text ] >> endobj -819 0 obj << -/Length 1702 +869 0 obj << +/Length 1731 /Filter /FlateDecode >> stream -xڽXr6}WQD 趎Ǚvmu$aDH"x"ACg{ѯw.vF3[8F'|DEՇw)x|'2Xs} mLރ)m1JkƏ cqɔ[_4~ 0Fzj癸.g#CEǝz+v"=XpU3.L98?ksLsC.  L. f#ӫ:˟LX﷛MCxag$nRBre,sz6E=|mRz̓q:*;7>#⃯ͼجfP(YR%Qwx0I 㝱F|dZ 'P~9S) T3eb0n@خ@Xp;kL{'bi} -? - @CN@;7$ :wz7pժoeq@(hYlreWM띎nczx)Ņdxw/>_=QwYxSzQQf5Z_= N{'qQv+8QmPɑO槶cXЮQ M#VXTə1GVzFP T43h͕ʷ Mee -jk@1f !jΧmv׌¯`J褤AbNU62وƶ -h&* Ǖ'ns=: #/AJϵq)ɆSou-dS MVrt+ähYs}1fH(ڢ }wq{ ˍ$܃7K[ȃ:,zɧ'Y4d -@Ud:f 6,osU",c"?ȧC * =r N)]Tr$Mr|ZpKϒ-'=˧gpJS|@W#! Yݗްz^f&`_\8m6^zL{<8W&˟ \vb:W_8 +xڽX]o6}У=,Imi"]C +ŠZt"̖\IK%Gnރ!&% ~ ޾ q@0RX`2 "A$$ +&Iixvv4L0lԇ8[ї{EE!h\GuQyf'(FcɇWf[#x0[g-]:  G!R/8H !T2X+!<n70( LvD!va +k70˥.?*m|Y-yQ  Aw(0z S @W^ '}ّճ͋)M»G4XL +'sGtHͥH՘S*~[iּ7+G͙uiNJ89=*kp !C)0E7DCWafMfJ;v'>(V۷DX?Ͷ"1ݭqK7_¦bngZ+|7 Hi.+WgOm ~\Le-맺?%]W~,Pr%\ijVX +B1FHfDŤW{S)3|vMt>_5BG~ O{Nv_@X#vOk]_p`MX7Mi33:j&3˺t fu{R;$I7^Okwp qs˶}6FHBu[ӺLix'};: Cةn}D;S?"/+ۑb5ݬ]|KcwX;&맭LWW|z$H:yΟZy l>+hI/=Z2ADAu޿% $=&bp!BrY{"$CW4ǁZEPqPbtZ 1y֭6` m? "Q4h! +lF$|_mWO'X7 endstream endobj -818 0 obj << +868 0 obj << /Type /Page -/Contents 819 0 R -/Resources 817 0 R +/Contents 869 0 R +/Resources 867 0 R /MediaBox [0 0 595.276 841.89] -/Parent 794 0 R -/Annots [ 816 0 R ] +/Parent 846 0 R +/Annots [ 866 0 R ] >> endobj -816 0 obj << +866 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -820 0 obj << -/D [818 0 R /FitH 764.175] +870 0 obj << +/D [868 0 R /FitH 778.724] >> endobj -238 0 obj << -/D [818 0 R /FitH 739.268] +234 0 obj << +/D [868 0 R /FitH 739.268] >> endobj -242 0 obj << -/D [818 0 R /FitH 637.731] +238 0 obj << +/D [868 0 R /FitH 637.731] >> endobj -821 0 obj << -/D [818 0 R /FitH 583.49] +871 0 obj << +/D [868 0 R /FitH 583.49] >> endobj -822 0 obj << -/D [818 0 R /FitH 584.639] +872 0 obj << +/D [868 0 R /FitH 584.589] >> endobj -246 0 obj << -/D [818 0 R /FitH 264.574] +242 0 obj << +/D [868 0 R /FitH 264.524] >> endobj -823 0 obj << -/D [818 0 R /FitH 210.334] +873 0 obj << +/D [868 0 R /FitH 210.284] >> endobj -824 0 obj << -/D [818 0 R /FitH 211.483] +874 0 obj << +/D [868 0 R /FitH 211.383] >> endobj -817 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +867 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F41 487 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -828 0 obj << -/Length 1460 +878 0 obj << +/Length 1536 /Filter /FlateDecode >> stream -xXw(WS@cGڗER;d[um~7 8X88:|`Ea D"F4L<<>xi2BIΤz:'_go@Tx($1Nn̈́4*HL$$1_ofA y3&3 SFx BKlݦ9|u]om-=+MƯK8S۾+3Uyz˦vY>J̓zpK,0;3YRf)[U2E)3/M+DŽŻ:*E Y =a:m]uȌܟH(W6Qt8KuO`CB!zϡG'YDHE(zcjK#m;P|KU-k}QGڢx߽pXaL̖v 8 -c,jއߩBܩ |Tu͂% -N[Ů0NSٓI"G#]&;vxIG:ӎ|; ⨕Jn=c9e}jsʑ?.! W$r̼)xF-`Ԥ]lΰ)}s.I 6y^.L +m ?e98TX߷ {DS‘1's^9d+TW>s߈^oR"s$k`G%H0!o[yZKij@=/(Đkz |\ٴҭ+I4eK},X?/2}JW'iŷ.$*݉<+/;LRvwxu$ד6; @րM_ons +;-rF99PfòTaFT1**htѿ5m<Xvc+YUA^!(BiًSy_Vzf{>HвnwPdlQ{J Gapz]0}HRDQDauaaȓ m&옺{k3mAjҠhv\nL PA +IFEBĠJK#:} q[N W*yqU=_|GR{߽R"HAs[X\$ J׭?ٙAn裸$msV8lb;.s\x0H'*0SB8 +ڑ;agX,=} 1@)p>$8 o!$#Wx؎<@/:ɱ՟@~(m؀i/ivؘoL\w"=DpB%n+>0ݚ60*hg@ endstream endobj -827 0 obj << +877 0 obj << /Type /Page -/Contents 828 0 R -/Resources 826 0 R +/Contents 878 0 R +/Resources 876 0 R /MediaBox [0 0 595.276 841.89] -/Parent 794 0 R -/Annots [ 825 0 R ] +/Parent 846 0 R +/Annots [ 875 0 R ] >> endobj -825 0 obj << +875 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -829 0 obj << -/D [827 0 R /FitH 764.175] +879 0 obj << +/D [877 0 R /FitH 778.724] >> endobj -250 0 obj << -/D [827 0 R /FitH 438.61] +246 0 obj << +/D [877 0 R /FitH 438.61] >> endobj -830 0 obj << -/D [827 0 R /FitH 384.37] +880 0 obj << +/D [877 0 R /FitH 384.37] >> endobj -831 0 obj << -/D [827 0 R /FitH 385.519] +881 0 obj << +/D [877 0 R /FitH 385.469] >> endobj -826 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F63 515 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R >> +876 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F63 534 0 R /F41 487 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R >> /ProcSet [ /PDF /Text ] >> endobj -835 0 obj << -/Length 697 +885 0 obj << +/Length 728 /Filter /FlateDecode >> stream -xڽUKo0+|ú54ESH͡a<=f A;DY.\(! )'8" QAY1N,_EgKti*2 *Y/嶬, . }}w&>t-"W'ˇ nQxjGF.}z~!h߮ #sqsG󘮗K2IITkA#7ސ6EF-*BALi^;b}=&<x͢Q&qi~d. Mlʥ(p-=ްH!UC\ղFLXjw&(mY۪̏Jb7Zǹ AN-.[KJ8qVo_/nE͡+- Oo~ә'h(ԃrTBj'NC3YmT7CYߝMK/ FH0 x 1|Tp,&< #d?=ySI%'C et#bix6 |Lhganuz3KJc gL%/b]m;RO  (.!<8u}ݙg?ɏ}` +xڽUMS0W,mH@CDI{vM +4}.9AD͖( 8T +*ČGh@O3ISԅǃ6sf!K5Q9Em0x>4,^5":G+D0 +Ht2l%ܽlcD_gqH4FO/-x]}3CBr,EpF_;Z& BI#g]΋dc+^r=['cܚ(9F6V@"KB4jpԏ 3 ,3rjH Ԓ `mRic}EĞ)9 Ԯ[#oM\rTt*GN2 0˼RnW]ůcr[ݝݡ+^4o 8M+ qɥK{N}$bpuw~ , Wq6voNCIx?{;p$<6-[mօ]_]9qطf}zdSL-]TL,<>&67NssTX#;WSl[ھ慎kx:Yfŧ,"'.1crsw#j/:X;Z.!PTݐX]ѣd  +]\5pza 3 D endstream endobj -834 0 obj << +884 0 obj << /Type /Page -/Contents 835 0 R -/Resources 833 0 R +/Contents 885 0 R +/Resources 883 0 R /MediaBox [0 0 595.276 841.89] -/Parent 837 0 R -/Annots [ 832 0 R ] +/Parent 887 0 R +/Annots [ 882 0 R ] >> endobj -832 0 obj << +882 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -836 0 obj << -/D [834 0 R /FitH 764.175] +886 0 obj << +/D [884 0 R /FitH 778.724] >> endobj -833 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F59 486 0 R >> +883 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F41 487 0 R /F59 505 0 R >> /ProcSet [ /PDF /Text ] >> endobj -841 0 obj << -/Length 1772 +891 0 obj << +/Length 1780 /Filter /FlateDecode >> stream -xڵXKs6W(u$ lOi^NڦgrHr)H E|q~}ăE9qlR . ^-~^-kˌ^ μ4('3X^k ܘt=,Ϛ(f.X 1#K-cqޘQHvy,|ƝäWq4FTƀ򩹾Fd =ZVnkܻ.(SQ@ߝWbVF-,OB~CPEt6vJ' ]!4*㼤{sLnE ZV،AqoI6;=F`QSƘ,Ig lXc_nh! bi<w= fÖ@Wd )(KPHzT1È(MiP`711'Kٔ1l71qd(c) 2aX! u9+jfRtR@>ؙPi@A_kL֡$}΁|W (MG/ndSO0B!{ȤLFi@10!2u& 1B3 %O4<sm5y,Fyg(?@t<@$cv_115J>fC<B/54PO˴%`0J\t$t{Sb~CM\KW@,FLpAU5v2}=5GfQ/] 1b{>ky)}ۧ!mVOq ̕\ŚRK΋mw6J:j3]tjEǣ $e~N $0X6" Ǎԟ(ԌݽW9,xOAfl]ߣr+EsS:~UD՛?He疿~vN2]F THY{q2E'2#W30Еc:M+=Ҥ'S{ĺCEYVI =e^A8Vi)/7 +xڵXK8Wpl$`ͫfg]C˶0xym! Ɠu|oޫٓa%~֋|3E,FAxaU@؊rFsBgO7 *I AS+zӹ(+Yz @bC;l?Qg>bwf =b=w\= +QQ/=>| |{$ÑGh(Qg?;q-LAaB‚!LAB}ޗ TS*ĈajgY_*q% *Ba1m#$ DzHEUhOl2cŞ®3? + |)GnCZ4%7&Y& VCLȒe =8 b|6rhZ/DZ4^ǦkWsUrK_mx1+,6EօQ?˃rB +q/nrW ɥ5=݋Muh}@AnkQ@~ti0Gq/@-JmJk0<:2sXF aXu]==3P z1bq<Ӻ3s^φOaK݈Cq= +8aQz1Jm< F3*NǨKPpւD`|z̄:) $B)GA Eǰ:h;[E.?@ҍ!b`PAOB !62i2цQ!-Cg GK?sz BhjMC! OУsSiɚ r59[I$SH Dǒ HNZ_Z#ެD@ +)^bXB+r@[ ^˝v`kn=7h [MbӾܔnֶWFtyH6"Ӱw^&3=/{~:ER$:GTҍnsgO߾R7 9f`v%oռm1C-te[Z8%hHH7]{qٲY-˾ C2Ҩ;<<FUMe÷jL ߮Qc*hF`Q[U #^xQGSpej jnND۪.M+Ydg +^FT|3'i69xUuo 8 &ѩ>2@ާtdH ̫XNaLh֙ R.F#`TcpLvw{'T-bֈkW$jo j.ܽ*qnQԡOBm 4o6qctrj-4Ӷ|O8F]50:*E(NknY%kh@#HsΪD^t·2'0h=|.GQWvlp!th9iLO5 /z7_O{~?+vJas+ƍ ݒgݝMlz*p{݆ JMޭ)J"5apO#2Ug +_EWy,x&L.Q+P(PS|&v&~^دA3eGe4y% endstream endobj -840 0 obj << +890 0 obj << /Type /Page -/Contents 841 0 R -/Resources 839 0 R +/Contents 891 0 R +/Resources 889 0 R /MediaBox [0 0 595.276 841.89] -/Parent 837 0 R -/Annots [ 838 0 R ] +/Parent 887 0 R +/Annots [ 888 0 R ] >> endobj -838 0 obj << +888 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -842 0 obj << -/D [840 0 R /FitH 764.175] +892 0 obj << +/D [890 0 R /FitH 778.724] >> endobj -254 0 obj << -/D [840 0 R /FitH 739.268] +250 0 obj << +/D [890 0 R /FitH 739.268] >> endobj -258 0 obj << -/D [840 0 R /FitH 624.181] +254 0 obj << +/D [890 0 R /FitH 624.181] >> endobj -843 0 obj << -/D [840 0 R /FitH 569.941] +893 0 obj << +/D [890 0 R /FitH 569.941] >> endobj -844 0 obj << -/D [840 0 R /FitH 571.09] +894 0 obj << +/D [890 0 R /FitH 571.04] >> endobj -839 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F59 486 0 R /F61 505 0 R /F63 515 0 R >> +889 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F59 505 0 R /F61 524 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -848 0 obj << -/Length 1501 +898 0 obj << +/Length 1490 /Filter /FlateDecode >> stream -xYIoFW(dV.4 MSGEP$A#(E\ g")ʑmփm{>;[;֋gvF!8>F9 Bg8^rWTeRԯ~&ܯP${ $(?;~D,eYE_P+H Էhk9yF+A^.܂i -}I[@`aܴ+ Μ?;MwA& !6ܼU]$X]{#D;J6>mӹF?bqxy(HlWGGpH R:w "n%<<ϭ QQOj ~Xv*j%PCH*}R +‘;f@:3tO5AGنq؂r=N1 ,{8V(^QQۮ,4j^ -+Ct }L}Hu;]^Yt2*^ǍaŅ+JL{Qe Mtƍ\HW5hJAŕJݴuDu -68$f;RMKvR@orBЇ}nw<>;Ga]3H}+efnꁰe"'& 8q^Q8 *Ό&'2Ȅ4GBl/iz3 YZ YZl JFV?%0[ɲh̚Zm.>2[[\Gf΄>4EYGyL4֧s|ZJL*.+Kh+1Sx&_[ԅJ+Kͧmrdy2i>\\MƓ&+K3 $'wW -?.>kIQ&@lvtY]w$ݓ$hЊȃR# f SLn`|Ng'|n>@L2lp{QLa7k;:ebyXJ27: *W&U6qh6miӝ7σC:FneL.CryyaP(p)AN7tf/Lvk?*M.pJAZ U8Ehrފc.G | {U>N<,Nk8.YBtntVrLlL]TA'UZyp|41W: +xYYoF~ׯXI>9i:*" F\D)]+Q@>|3;_gF NH\FA$cDY,pACUR_ӲK-@1I(⒁7*E0^XlAiF2?5>z=;frG0mkCI$f 2X{ ,~&!EqDA41lib8C0b}R5mx^,/* QlK4B2 c|@EsSFؾ.%cx xk\$ X +#coGߣU& =VI܍U$(TjH3QoKN;=O'ߛ~ i^%ZD0ي # 3$| ǂqiO@KLqG$XF UnsH{$Q?kӧH;BBfɼ3o^' M/$FF?Uְ QwM.8M ]3meʡj`*Ձ>a,.ίz/ty霱uEaR묮,bdM3=6)Ew}މCvQ1oV:RuI푼 WwW]rM"֎CysUmZDg{ZFVfy gHw +Bu7|i+TN-ڥ:]uWX SB1ܪl2_M-,AXz<0:j)l9K:#1uULQho%q? +-x$a^`y`Pf3h@شt?(h_g!?^XYu͕Zf๶xݪݖЗk|`ҢPىn/9'gWVU0D(W遦8yl| Z7lTå)nܢ"i ہH^PSĩލ~ў-8֍񦩑Wx2hxr>H&N HP;q3B2/lja`_C4xشK=)$C#~`!ML endstream endobj -847 0 obj << +897 0 obj << /Type /Page -/Contents 848 0 R -/Resources 846 0 R +/Contents 898 0 R +/Resources 896 0 R /MediaBox [0 0 595.276 841.89] -/Parent 837 0 R -/Annots [ 845 0 R ] +/Parent 887 0 R +/Annots [ 895 0 R ] >> endobj -845 0 obj << +895 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -849 0 obj << -/D [847 0 R /FitH 764.175] +899 0 obj << +/D [897 0 R /FitH 778.724] >> endobj -262 0 obj << -/D [847 0 R /FitH 739.268] +258 0 obj << +/D [897 0 R /FitH 739.268] >> endobj -850 0 obj << -/D [847 0 R /FitH 692.43] +900 0 obj << +/D [897 0 R /FitH 692.43] >> endobj -851 0 obj << -/D [847 0 R /FitH 693.578] +901 0 obj << +/D [897 0 R /FitH 693.528] >> endobj -266 0 obj << -/D [847 0 R /FitH 421.083] +262 0 obj << +/D [897 0 R /FitH 421.033] >> endobj -852 0 obj << -/D [847 0 R /FitH 366.695] +902 0 obj << +/D [897 0 R /FitH 366.646] >> endobj -853 0 obj << -/D [847 0 R /FitH 367.844] +903 0 obj << +/D [897 0 R /FitH 367.744] >> endobj -846 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +896 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -857 0 obj << -/Length 908 +907 0 obj << +/Length 912 /Filter /FlateDecode >> stream -xڵVɎF+HQ`,l#`ȖD<j6I5x[W+A+D;N%Kb4F)[w9$wKW\GL][R"xPZ⠩Ey}wN|\U2|`Xsʩѝ:l!_y -Lګӏ^of-ue1F\;xıe= pkо !9\fp-MLO 椣魫*~MAoc$o6M dd^|SF׷XYw.we cJ"_n*d6ܳxܴLB8}sxhR5&{ڥvk'׼iHG]UqCdG>-(1+΂Y, !ѪXo\XW15}{@e XERvCYe|*qx?1p޴w(#(#Q(G?+1E5B(]Ub§b0X.ʟ u>U^RS>S*zkՙVd5&)BLc:^>dt̜#!xd h?l Z"~638̬9 澑Qi'"I1i7/< bcaol9*r<4egԲg -_]l7bk_kENs0Q]6ܵüJ6ܖ 3݉)Gd9oعkt,'hNڕ32}!([-c)_\+s219dz窤^3r[}MAC]ЄT~eVyO}RFQEQo:IW"!%X鶯v]yipo +j?C.&-US1K6.Vg&gU/C\t?JWˢn]ŵB%5aAX8`M phS`a%LceGxmqiQu P.g$ tȃPK$th5 +菱 pIQkb TpZ ݲfgT֪{VZk RK ڇ`2>Ǖ:҅11ՠwTL`e',S+_Dc)LQD`&F/djRcHkl8fZ.KE}i K-?4ľh!r3r3('L?K!5 aJ}62޺FiAz m`!a|3Ur> endobj -854 0 obj << +904 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -858 0 obj << -/D [856 0 R /FitH 764.175] +908 0 obj << +/D [906 0 R /FitH 778.724] >> endobj -270 0 obj << -/D [856 0 R /FitH 670.939] +266 0 obj << +/D [906 0 R /FitH 670.939] >> endobj -859 0 obj << -/D [856 0 R /FitH 616.699] +909 0 obj << +/D [906 0 R /FitH 616.699] >> endobj -860 0 obj << -/D [856 0 R /FitH 617.848] +910 0 obj << +/D [906 0 R /FitH 617.798] >> endobj -855 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F59 486 0 R /F61 505 0 R >> +905 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F59 505 0 R /F61 524 0 R >> /ProcSet [ /PDF /Text ] >> endobj -864 0 obj << -/Length 1199 +914 0 obj << +/Length 1195 /Filter /FlateDecode >> stream -xŘKs68J3$m<ɸU'$tH*}@zYA#Z`7$h ~Q#Q4#Ep(%R2ČGh2C߆7L᝞bPgM~L>oKш@rT>kDP* hL9 /^8@5%"ԟBoPds@RgqJփo?AG!֖kE`N߃LL!`H. 1'Li5TABИS,KC]Ҧ.MgwMӝlLgq۫ZVBdz+7׍g>W'Nb`y'S!11f>jIbX.'Vk4w>j@sׅYMDeB84u9ojlݿ`*_@njz:Wǿ7fQ X*5Ln[bDá+]スBg1e>Xwi-6́+wY?3!0)qR$S 3IA@F֑~txE -/_uxH2iDp(}'vSCD!&`qT@Hy \kIDHPnn9zPr@um ^'~ ^-XhYA#=_ޙG,#]wlZL^Al3ĊE~W3kuX)ob0zҁ<8%$y}yᘴxO Tt8q BDhf$^ - ۴Gb 3զ01kЌ荾d|%UK@1Ks{|?O=!BW]BH2W.bu_GxAdkWvJ7=KIUE=yRκ\zsИ|X |U>#WiC\P= ͝G 8`G:L<yғ3( >>ZJSO/D^,gSQMJԺ|p'48s$' -Щ"=5Nyy8e~t)r(^LDn].ڬ>C&baY+=~czƿuqJS<[xoӓo_T_X'w#Ȗ +xŘ[6)hĊ.H4mvvҭ;}HAt0lo0.G@0e2xD H@dHI3I ?33AOzWCF=La26x $Ow?'~Xf)~ ֶo+%"ԿBo]>= :oSHmǁ(Z |#(>hS\!Op,*51Wdm92}Hd]]1XRaVV)Ԛ&0 23BG\'[{ha.7Z[iEø#JU㴾̦4QhRdj=d#&E4ݺʳJVY1c5n,+m8e.r@s0^PQPx&7vIF D.,gX,_KeLX<fT@Rfajw&@x^-G'XFipo+äcT9܃Wnܦ;,`T@" p ߃,[U7l:L]AL3ĊnȖYuaCk" +?40y6Ƚ~~u*:b A1cR;.*0 Wt;A6큘Z082`0e=rW1mk}έ:ʆ'fZ8іnn{<։%4+Յ UQ|#$eq,]㰸6eýI⌲̳4j5ri DSXrP'ý=QeR9D^$a@{i|=ՠ_Vz[J@i=DT9No |I&Wi=/G4eA3ew?\9cg7*c|Ӯpb-[vtM~A(XcݏP{Q endstream endobj -863 0 obj << +913 0 obj << /Type /Page -/Contents 864 0 R -/Resources 862 0 R +/Contents 914 0 R +/Resources 912 0 R /MediaBox [0 0 595.276 841.89] -/Parent 837 0 R -/Annots [ 861 0 R ] +/Parent 887 0 R +/Annots [ 911 0 R ] >> endobj -861 0 obj << +911 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -865 0 obj << -/D [863 0 R /FitH 764.175] +915 0 obj << +/D [913 0 R /FitH 778.724] >> endobj -274 0 obj << -/D [863 0 R /FitH 739.268] +270 0 obj << +/D [913 0 R /FitH 739.268] >> endobj -278 0 obj << -/D [863 0 R /FitH 651.28] +274 0 obj << +/D [913 0 R /FitH 651.28] >> endobj -866 0 obj << -/D [863 0 R /FitH 597.04] +916 0 obj << +/D [913 0 R /FitH 597.04] >> endobj -867 0 obj << -/D [863 0 R /FitH 598.188] +917 0 obj << +/D [913 0 R /FitH 598.138] >> endobj -282 0 obj << -/D [863 0 R /FitH 407.499] +278 0 obj << +/D [913 0 R /FitH 407.45] >> endobj -868 0 obj << -/D [863 0 R /FitH 351.007] +918 0 obj << +/D [913 0 R /FitH 350.957] >> endobj -869 0 obj << -/D [863 0 R /FitH 352.155] +919 0 obj << +/D [913 0 R /FitH 352.056] >> endobj -862 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F59 486 0 R /F61 505 0 R /F63 515 0 R >> +912 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F59 505 0 R /F61 524 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -873 0 obj << -/Length 1035 +923 0 obj << +/Length 1059 /Filter /FlateDecode >> stream -xVM8WhE[l>Jj!Ɂ.ɿ zUXjU}U'zצ_1` כARbG,f\+c$80Rpsl$&Z<`sb5ŦE'j.}7XP)DC<%Tz? ! RweYOzv?ԯۿ㨬l`D(NM\r2JwqqL8~86GFh븈ʊqPQ/܌]l}S}%3 -tpeS)/a{>߭[I|y.v<[-6!k5p6>6 -4ͪwY}Iُ:bf i -ɧyn *+N .lhu5Q+ -I۳rQ/< Vv\#)n}/hͰ7]ܫT\c^L=ps\K Uf$&B_b0c -̔B4j-a̒3* b&g =Iv'ingw>ָPeZbSj\X21E @՜RZH ZZrŧ/U}XeUktD:QXա|z, +xWKs6WHΘ}œL2M\uzHr%JbKQ I%P֒N=ŷ #nGߏG^s(3BҘqS)}8aDw,cFy5ݭY-@Cw[LeM 8j}ϲǖzxuDa m3ؤMO_³F ɱ62hb))YHӘOcBy9{x~揎 %Xԝ%\f|Iy3`ўn'_p6_{_(%9 =pL\jE(>LE_B4!҄'ԟ﯃H' +:mˮ u` 6B+d*5hsĔorulzyo:_wB"dDŽ1L 0I2oahpxPxp'  G4 Wnv?|Һ"eGd}XF@F:o2 ZU1o&ugkE?EդuJvEYڕuQv.%|]nu.E@O>u;kqBfnneeg' Qfܧ(]q;_V>veQέU[s.h@Cް2^v -+=it76U57 y3릈tj|X c'n0[ʡVXm1nEjmlRER:*PqaL5ŅjBz҉51B +u\rHũB5:W> endobj -870 0 obj << +920 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -874 0 obj << -/D [872 0 R /FitH 764.175] +924 0 obj << +/D [922 0 R /FitH 778.724] >> endobj -286 0 obj << -/D [872 0 R /FitH 739.268] +282 0 obj << +/D [922 0 R /FitH 739.268] >> endobj -875 0 obj << -/D [872 0 R /FitH 692.43] +925 0 obj << +/D [922 0 R /FitH 692.43] >> endobj -876 0 obj << -/D [872 0 R /FitH 693.578] +926 0 obj << +/D [922 0 R /FitH 693.528] >> endobj -290 0 obj << -/D [872 0 R /FitH 453.362] +286 0 obj << +/D [922 0 R /FitH 453.312] >> endobj -877 0 obj << -/D [872 0 R /FitH 398.974] +927 0 obj << +/D [922 0 R /FitH 398.925] >> endobj -878 0 obj << -/D [872 0 R /FitH 400.123] +928 0 obj << +/D [922 0 R /FitH 400.023] >> endobj -871 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +921 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -882 0 obj << -/Length 1093 +932 0 obj << +/Length 1096 /Filter /FlateDecode >> stream -xX]s6}W,Z}XLwNaw[c_+[@3}`l ܫ{Mt7n:D DS4]`%%Œk4/O&,LhlC?6^ߦf8"U(7?w<TMI`Xʩ_tءhGKD0~޺|yn]?LG(Қq#їoπB/' -Eh^_G*Xhy(Y&0'&)uBƷy6O4Efs*&bIEԻ9` GvcY.KVE)0|A7<]&iY_-sNg`f%ѳIYv;˕)I!K8ZXFQ5zr[TM\K^EX*p[\r/8஌q5Q_sc¤J|mPR,(GPvJ E^G?(^ Lpgo4֒I˃ C__ wбcgJ.9AP<^u!CL-%\_|t:vj۰ i TAXUe -}DLɳ.}+n0vFr9O] GЙ^o{ MAao7Bi86;_7Up9DG}"jA0& C%EdJ0/'T-xYB5"7єڞ89'tk͒F m.UC}tEڜ ۵{Pc[m?f_Uث]HO>$e&{]aɎ;PA#a-ZN(+7áHߣp)R!N3).{I8zQ:@~` w&? [<ƃ.aiq#/M᷏Bo +Eh^m*Xhy(Y&0'&)uBy6M 4EOfu*FbIEkj(.E땙We^W,Yy禔 5$ve}7 M;U;kPG*gg;8,/h&k,k!gHbE;1ulϗ"jhXv-Yrueۂ9A}n*LJ3n+̎bA9S%mZW!XK&->[ }~&$V}lؙKvAPk-sa!&Q詆Z]udI Zjb +cAz?7 X@ZBqw2>"yB&W;ɳ.m3n0Fӻ> endobj -879 0 obj << +929 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -883 0 obj << -/D [881 0 R /FitH 764.175] +933 0 obj << +/D [931 0 R /FitH 778.724] >> endobj -294 0 obj << -/D [881 0 R /FitH 739.268] +290 0 obj << +/D [931 0 R /FitH 739.268] >> endobj -298 0 obj << -/D [881 0 R /FitH 664.829] +294 0 obj << +/D [931 0 R /FitH 664.829] >> endobj -884 0 obj << -/D [881 0 R /FitH 610.589] +934 0 obj << +/D [931 0 R /FitH 610.589] >> endobj -885 0 obj << -/D [881 0 R /FitH 611.737] +935 0 obj << +/D [931 0 R /FitH 611.688] >> endobj -302 0 obj << -/D [881 0 R /FitH 418.796] +298 0 obj << +/D [931 0 R /FitH 418.746] >> endobj -886 0 obj << -/D [881 0 R /FitH 364.556] +936 0 obj << +/D [931 0 R /FitH 364.506] >> endobj -887 0 obj << -/D [881 0 R /FitH 365.704] +937 0 obj << +/D [931 0 R /FitH 365.605] >> endobj -880 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F59 486 0 R /F61 505 0 R /F63 515 0 R >> +930 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F59 505 0 R /F61 524 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -892 0 obj << -/Length 1569 +942 0 obj << +/Length 1517 /Filter /FlateDecode >> stream -xXYo8~У ,K6)Rl6XłD]YJu4ɿߡHVRqu ?q4ػfz5{uFc$ 0 -"BZ{_o>pH>H(vn` x~ln?/Y2 $a`ןZ^U Tw 3~bd( 'l3׷{6=#Gq`;}&s'$F[$9+6S4 $˝M9^J+{C=G@3tO1A:g 9aAח(;LOK͟YH˾,%X!ٚv|/xdH3W'݋mU;{[_]Q ޓ-2S0B_6reYUZt?@tw<2-y̘EcM@l~'В# ,9g0\mu ҂O0З02r]O~\}=ڸl{ gg+gJ{}uѣ-d?PE'wGTNjkw7 *u c&kKoŒU#zӤ[{xd[n0m70SM*Ѭ0Tq0T竿>s4SN^$CeMZswJS}S۵i"ڥc6fZ2ȅ*m$o4ɢ lnPD`ƀ3[fAMiKiK&U* u)H<l.ClP%S*l"JU,.s.sLfFUWq *piN L;4+2*&0ޜ~kUZIWKlUtVKn`3r3c0wH}Z[F+/֟ Ѹ2f`O(/ g0]q';;"@ L_% 4tZ -ԯrC?i^ 9I,vcX[Q';8}Qe:KI6Z晦^r$q g>4d̐~".{E9\J;iU;%Ox .= 6&c +YЮialH|) W*1f2/ȢXaPv嵕P ۉ}\gyLL\EzBK@B{<&С:4l5[Wmӏ{/hMVE9ŝTTV]qߞeq+nL,Dބ&Tj3"^d>E u>UC}SF2z|ʗ 14y>5B>|nfJLjXϧ|"Ցcgό|y3#{̌꽃ph +xXn8}WbHJ|f7EmѦ^X02+K.M;4vCb]Ù33ޕ7׫٫3{#%V/( D/2Œr</`HGTZdmT}UDRĄ;Z~pnW\>yg}@QX|SWN7F9޻x3݂Y9ُKpG2^}5{ |zcGc!HrN0#pO0dsy!<ҵ(ޒH]jNTzUi +3A, +C %Ds&{6='׾Dʧ< )sX~8 +d G(w6值bgW7!HiJ PA1(~Wl4L!M 18a/0K$? +ć3S kRg;/yB9Y1Wb) G;suҽVeh=R:.=e($+Ϊj{ȡ<R"<C<%0u^=ƆA9l~gx%WVPz +q{)+#WzÆl` +l3k~.(TPDJe?h4%^ڀUnH(ӫ!Sw@#Q.tKOp( +G}RE?84#gv<#!Чq\0yM2vh®2W>e肠 8)|`a慱0>fpJ VI dQ.JFۉ}\y\\HxHOX ڡ 5*mN6Bm}bro~/{eF+m:/ʾSwRQYusTVd7,D*l7b9էڋmJEqC/2?h C*#iH5 vfwUO3gTh/!FwF7sc@|gTDF1cSgύHԽc#> endobj -889 0 obj << +939 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -893 0 obj << -/D [891 0 R /FitH 764.175] +943 0 obj << +/D [941 0 R /FitH 778.724] >> endobj -306 0 obj << -/D [891 0 R /FitH 739.268] +302 0 obj << +/D [941 0 R /FitH 739.268] >> endobj -894 0 obj << -/D [891 0 R /FitH 692.43] +944 0 obj << +/D [941 0 R /FitH 692.43] >> endobj -895 0 obj << -/D [891 0 R /FitH 693.578] +945 0 obj << +/D [941 0 R /FitH 693.528] >> endobj -310 0 obj << -/D [891 0 R /FitH 265.12] +306 0 obj << +/D [941 0 R /FitH 265.07] >> endobj -896 0 obj << -/D [891 0 R /FitH 210.88] +946 0 obj << +/D [941 0 R /FitH 210.83] >> endobj -897 0 obj << -/D [891 0 R /FitH 212.028] +947 0 obj << +/D [941 0 R /FitH 211.929] >> endobj -890 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +940 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -901 0 obj << -/Length 1118 +951 0 obj << +/Length 1069 /Filter /FlateDecode >> stream -xWKo8Wh5ÇH>6AE7kE--d)+Iw(R)+z0,Q73%(ov;((\g pM,EGNqou y -K dL2d!f!G@(Ľy;py`@`W#G'}2-4-Z28'Rڸd@7&;L9 -U$_;$u~ݙ0*3fjޕ3;nڸn]hSmV8m6[mg Ynz(!uoO\L쓠)f$wŒVdYM(oT 20QPNiDXE$~+ XVm6g.CaцP#Ž8D}8Q -kǷ8i^;m\ԝZ02߹[G7<-8q_$Bө/˓ VI)Y^Wu_?XN^r('Qh_R aѫa]:65wM9t+oЍ -}wm]WcĶ:^G|f}+!s $Z1L@7#7 OCqMvף+Ђ2^ܕm͵C̏pz9j~R<>4?H:b$P}GJ')$^[1 -YdTS7;#MHꕒGR:Pt*S 6x]7>ra fP[@zP%w"S҉13 -мrWD& a훞=u dP8um;c TD/) C -oO<!*a"_7iË OVE1]0tO&/Ə |[+Ds\0 F6G[:x^3c5쉁z8&iIfrHrIHb"U%R"%Lә4Hۇ%"zv>Q5("XI"0yzէ`؅-Mm[WoM|(E5á`EyqP1e{p(JL?6c,@}ozs=luޯ瓿&#u$P|JP> +ݷ+(!?&pL,:&S/p'SS+9,t;"OFR# zsoF޴ X6"ڸvɓbwZCf ۸lGo\̶:vdH0/r{VqnZtJ+eߥjS]c ^nPZTxaL߷!<%?P\D8⪻Q0ŌD*8xŐ< #u(<vR`y.:RG_Ոweq}$qxeL`Eۆ7(JAd /1 $6`daC{qf*W[Qt>lrEyzx_칲oeM aTG:vꡪڏMYf, < ٢,ևuqGmӵnhZ%TXrL@9#L-O5-L~A @*r m_ 6|=+ ?fTJQBRL6կyJJhWF?(!Do5*T +k45ȳHIpcUY`U鵖Vó +PH樓ñLJ:CC_̘jT,!4[A`׃j*?LI!՘>4'(MѬo4\;_ LBZjrVȈL_/IedU Z]?Ch AcOSdٿB`EU?1zʮFĎ#II_ +n+UHK2~{?dtmzt>HtdI{ endstream endobj -900 0 obj << +950 0 obj << /Type /Page -/Contents 901 0 R -/Resources 899 0 R +/Contents 951 0 R +/Resources 949 0 R /MediaBox [0 0 595.276 841.89] -/Parent 888 0 R -/Annots [ 898 0 R ] +/Parent 938 0 R +/Annots [ 948 0 R ] >> endobj -898 0 obj << +948 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -902 0 obj << -/D [900 0 R /FitH 764.175] +952 0 obj << +/D [950 0 R /FitH 778.724] >> endobj -314 0 obj << -/D [900 0 R /FitH 486.033] +310 0 obj << +/D [950 0 R /FitH 486.033] >> endobj -903 0 obj << -/D [900 0 R /FitH 431.793] +953 0 obj << +/D [950 0 R /FitH 431.793] >> endobj -904 0 obj << -/D [900 0 R /FitH 432.941] +954 0 obj << +/D [950 0 R /FitH 432.891] >> endobj -899 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F63 515 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R >> +949 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F63 534 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R >> /ProcSet [ /PDF /Text ] >> endobj -915 0 obj << -/Length 1688 +965 0 obj << +/Length 1705 /Filter /FlateDecode >> stream -xڽXے8}+U3ɶd1J6ٙeHR[IjJcbl֗aeIa -cV❃-Qb͗Ϙ1N`OMm3" '%'?6É*+>wB"ˣ4Q7l&!>_JۦBa,pئZG\BhMD -AoH}8 .yj|B|Y!zI12ͼ>KLks2.Xyi;vtsz V@m nx3َi84toSW>Ƕgj2+ m *9.ۊ0ZGJk)xQfzMoQuwuf{&uBPz/HrmݘzQ|aꃚZ CR`'WCO#X!I$M*oEfѶ*1hЉO4|e.SSS3k!nwA$in,#EJiThFu1[ U,\jx$6}O?fua|[ 1D vgC=m'jbCq!Y-Y@k-ΚSd]κj ]$-E&2.ݍ7U2ԭׅ~xXǸ+nn܊hv(Z9G'bwۂ9entfs}9rkXD̒GKm:iٴ uL&"@ 3_DERd6r>Ac|lM01HO^G~HoL7V +u7j캨1nQ0z#m#ׅ E] |o1t +#ht|ض xaljK`;eCd#-2YgY:kĶŐxjX܅\K" qXX/,ɉ.:OCQ YP/0'{odMTܶM*a^{,ȘVF|~b=.ma6".ՃA*ydQ}jym|~:6u2L&c+Cc2$P;C,"4{}Z$D>}*봌os@9RRhR|+rhc;ffCYg{fb{38LXRrYQTнNapW@H՘<>I몢3Mی֡2Pgʺ6Y.ԠPQm&r;@hÝk,$4“>Pl+ -եIA.+TID)r4$EHI5IJÈ +ZV,  +tE#Mis&:qgWg>]--^^>7B-AKUY;_!(V+ 3 +QF⦪|=^ɖϣVQnup+4.r-ҍ3|3^{^uJnr3C'EpB{HF1ZR31ۗ\D*( rzBs)Cۧ NcFQHM*"ʻG@Ӳ trW/CfM/UM@͵ (Ca\%JH÷!b<BbәDP3[ݣ3(#ÚXfs(u؆y'X_l {2 y>\]V)47'ŇT&Cxm*|"VÊݕN> )r2aitly?\ߎP ~6X,'ûa endstream endobj -914 0 obj << +964 0 obj << /Type /Page -/Contents 915 0 R -/Resources 913 0 R +/Contents 965 0 R +/Resources 963 0 R /MediaBox [0 0 595.276 841.89] -/Parent 888 0 R -/Annots [ 912 0 R 905 0 R ] +/Parent 938 0 R +/Annots [ 962 0 R 955 0 R ] >> endobj -912 0 obj << +962 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -905 0 obj << +955 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [448.247 570.819 463.876 582.569] /Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [448.247 570.775 463.876 582.526] /A << /S /GoTo /D (table.3.8) >> >> endobj -916 0 obj << -/D [914 0 R /FitH 764.175] +966 0 obj << +/D [964 0 R /FitH 778.724] >> endobj -318 0 obj << -/D [914 0 R /FitH 739.268] +314 0 obj << +/D [964 0 R /FitH 739.268] >> endobj -322 0 obj << -/D [914 0 R /FitH 716.846] +318 0 obj << +/D [964 0 R /FitH 716.846] >> endobj -917 0 obj << -/D [914 0 R /FitH 662.391] +967 0 obj << +/D [964 0 R /FitH 662.394] >> endobj -918 0 obj << -/D [914 0 R /FitH 663.54] +968 0 obj << +/D [964 0 R /FitH 663.493] >> endobj -919 0 obj << -/D [914 0 R /FitH 649.99] +969 0 obj << +/D [964 0 R /FitH 649.944] >> endobj -920 0 obj << -/D [914 0 R /FitH 458.498] +970 0 obj << +/D [964 0 R /FitH 458.479] >> endobj -921 0 obj << -/D [914 0 R /FitH 355.648] +971 0 obj << +/D [964 0 R /FitH 355.635] >> endobj -922 0 obj << -/D [914 0 R /FitH 266.347] +972 0 obj << +/D [964 0 R /FitH 266.341] >> endobj -913 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F4 484 0 R /F61 505 0 R /F59 486 0 R /F63 515 0 R >> +963 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F4 503 0 R /F61 524 0 R /F59 505 0 R /F63 534 0 R >> /ProcSet [ /PDF /Text ] >> endobj -926 0 obj << -/Length 2036 +976 0 obj << +/Length 2003 /Filter /FlateDecode >> stream -xZm6ίGTIdc.f4/͑dNƀOMmz]Y/B:90jgt>F17]z!F^#D؛./2<~.j㴘%`"1Eaw?;LU@DlNmFGq#/G`rn:kD#E8d|3-ෟG޾]#s~1DCL4B>~ӋW>t{(lnN7WZMdg۟R:ǤRmӅZT0S4OpW4Z٬]Ȏ`7y.I>\zn|j!(]7|6&*c(^&7>2]kf:PM"Q 2ȶ pV߬R%:LO04&f+5 -Of/|0ymu@IG>e}i))۞Ll.nN9g8L8J{n $6n3n۽! -Yre'|mY5&?0k^ޫ.Utv >b Erƛrp\O8 KloJy .Ƈ+F_5"2Y|A#FtU;GsCQ?$y]ʻ{=!R-5Jԭn/Y -[KkIYTg ~[y.ɳAt <`q3j3*&ivjMHsjEF\5!Ӄz+PD_Pl"$Ӏ, H~EPu&XՖD1˲$/Ka\L&r! 7С"^pVX0NH4~mؔ;͍3)XpR#aŵe|^oې]ǂyveS鏻D~8-FA9-Eh9}S "G! ctKd3ֆ:SZc9^Q|Q) -IlG!#9dG]+ g:,hۋ4å/b#V^(ɣtYjGX >қ[gEZ󁢑G86 ̬\C(C)8_|޽~ꓓ'M; ACݤC=)1*7hï5#5 tL>uD̔XhR8 RP^o*x_!;yq[KTjC~,fGV׻N( -h4L+h]~AqWo8ocMG>Gt$mY17:la(YVn -GTM  Q} .ɕ]zn"dz"-N록:m zBGNegs?r#cUáFC+Qԍ.gWBb c,:D ,,_ % PP8Fі. -G -tԨQoDn@Ҳo{o,/-B)Gxj|wZ%mfivC͖Dxux^Iڙ]C$w]0*ﺺ7[(" 0D监p=[^e~Ҍx/Y/ÜPE|szc'Vܿ ]ab):f,:Oe0}eM -|mF[ ]%wOV&'wȄ3XJ)9"i(oDBޗ_ld!5EpS}~<F4`qFquڕ ñտq~ +xYm6~fSH>&%km&vnm&\q_zŲc_V>˴rpTzMO_/ +>",Z)On__\L'iUge!_(tq#:ߒM+1C^W/@6#rfz`ZgQ:կ{ A9v!4@s'#m0 +Lwӗ^}Ά瀡q* &oZOdg+^}߭ZL*޶J:]Y_E叙WyM35\0hlv +5y{P?t.57:h-fńY݋v} TJ }=2]kf:q}M"Q2ȶ pVJkl넷\f*U٥VgHqd֟R=F<(}q[E7_Zc +^ e1 +B={h|eBi~Zp`Qb}M #MqKO%]xbfĮ%_ZHEIN?۲?k*䞙ܫ*:ϸ +BQZmX@ H@&t)0œLr0 e;)r ^ć7D/2i|A"FwU+x_9SZ!ɻI^rv/Ǡ`cS6g"%ˢ_.n8z@yA17| i06cA]e觇!/wJa ~{311"[9$͌oj^Ym>Ę!h蠔 =}޼}Loި&9 }ag*1*7hͯ55FtWIο&3i$a& bIKRPN/*xlBx+05vc].? ׌Eaא GzïWT-tpA;M_Ji ?7u7rV BOVبf@5LUs%j&lc)BzZV +b?Og^nߞfS*+űJx ZïHlmZF~e.МFHCeŢu+B>Q{;=,LM qرuYgm:Y^پѱ/Ep8tNVJGγUlMʋ~_ޜֆ&-E߫uŔ1P* ryxlfi~y[]!fJQ9(~X=IjK/x򧺂F?.\CQ p È PQJeF12q|]q`|. +6/l]$1 .H:Xw*AÀ-c 5,nU1@A7|VO/4$]C DX(?\V [61*4謽C8o; +#XQNCBl¶J Tޑ +~(#Qh= G Dq Dn`i*\Z 71 endstream endobj -925 0 obj << +975 0 obj << /Type /Page -/Contents 926 0 R -/Resources 924 0 R +/Contents 976 0 R +/Resources 974 0 R /MediaBox [0 0 595.276 841.89] -/Parent 888 0 R -/Annots [ 923 0 R ] +/Parent 938 0 R +/Annots [ 973 0 R ] >> endobj -923 0 obj << +973 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -927 0 obj << -/D [925 0 R /FitH 764.175] +977 0 obj << +/D [975 0 R /FitH 778.724] >> endobj -928 0 obj << -/D [925 0 R /FitH 739.268] +978 0 obj << +/D [975 0 R /FitH 739.268] >> endobj -929 0 obj << -/D [925 0 R /FitH 585.275] +979 0 obj << +/D [975 0 R /FitH 585.275] >> endobj -930 0 obj << -/D [925 0 R /FitH 397.18] +980 0 obj << +/D [975 0 R /FitH 397.18] >> endobj -326 0 obj << -/D [925 0 R /FitH 232.184] +322 0 obj << +/D [975 0 R /FitH 232.184] >> endobj -931 0 obj << -/D [925 0 R /FitH 177.944] +981 0 obj << +/D [975 0 R /FitH 177.944] >> endobj -932 0 obj << -/D [925 0 R /FitH 179.093] +982 0 obj << +/D [975 0 R /FitH 179.043] >> endobj -924 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F59 486 0 R /F4 484 0 R /F61 505 0 R >> +974 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F59 505 0 R /F4 503 0 R /F61 524 0 R >> /ProcSet [ /PDF /Text ] >> endobj -936 0 obj << -/Length 474 +986 0 obj << +/Length 477 /Filter /FlateDecode >> stream -xSMO0WH`qPĶrF$vNw;tⴇ(̛yo<AS2.nA!)IC-QLpE(LYzo~&B,,u˫9(O"o6-/)/|[ceV@:X\ARxȱƷ(ݞ0v}o> +xSn0+xDQc6FHm=92mHj)1-ٝY-"h}*{JPHpN% J G4G=?YĈ\Vܦ:x)RyB%m"i0 i1i+;!Gp&㧡rw[~{! MyPx/ahlP(fpV#hS^)0%&.ށK2; `4Q`KzE:uϯQ윗^Vr=pJc݄} ;jc% +"fsV7FiG 97 +qhήQ#%9FH}S',l5r{\֚w5&kմ8osĿqkl*Pjn(l0:4p=Xu'fNr-y7]twŐ!{'/k>m endstream endobj -935 0 obj << +985 0 obj << /Type /Page -/Contents 936 0 R -/Resources 934 0 R +/Contents 986 0 R +/Resources 984 0 R /MediaBox [0 0 595.276 841.89] -/Parent 888 0 R -/Annots [ 933 0 R ] +/Parent 938 0 R +/Annots [ 983 0 R ] >> endobj -933 0 obj << +983 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -937 0 obj << -/D [935 0 R /FitH 764.175] +987 0 obj << +/D [985 0 R /FitH 778.724] >> endobj -934 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R >> +984 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R >> /ProcSet [ /PDF /Text ] >> endobj -941 0 obj << -/Length 1440 +991 0 obj << +/Length 1037 /Filter /FlateDecode >> stream -xڵ]s8+@I:iNM!pf/<l=ZغOz[Ě,-#y ,o9s9Gr)SLR7} m;'"GAҿOpeED7s%wZX2ȳ0/+Els_Wk0#P|[ ,@Xŝ+q8Sָ1!0bȧ^exo'(ܭ J[tj腇-a߄+YDi/:Q@D7.H޾' q^bX7oymr;qNoo7qS s`>([\D0`8/C'ppP7Ѕ!*G]RTRV$שr쩬J;,2/]aIkL.TWBlB6<)Us,֎ ,[tdd%jB.m5P GGDa1Ev7\`v D4; ??Mϯ&\u.$ Uɛj&·K?L -T!Ea&46H9.TvG!A a4N0dsk1 7@ė{4؉=k(%EAh*ST:]34VWp~ -G!9C&=Xx! p`X.$ UIY|-:]Y5!V5I;O" R&fBH9D* #ZwC(vAL3]H&#zL42"M9")B97O]?xtj33 '{Bp8a؅+ê/v!i0J\i-?QK.Y+GY=$+PG' |D\ZAe<tt!t_Mt!dO|h @@|haʵ.2Y4JKOm,۶YrNbQagzH\0!F4L-U&w&2y_!ӭC0k˩M'PPP7V TI¤R jNWtN1+oHe?)dWurGd G4ztDj"H8`x \Ds8Aډ ̊k'ƊY乁^6t%WzP(swBnyθHM3p<6T,ά.5KÅ62N-U5No_#' Gz;GMw__H"GgQ s}~zϷ> endobj -938 0 obj << +988 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> +>> endobj +956 0 obj << +/Type /Annot /Subtype /Link -/A << /S /GoTo /D (page.57) >> +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [83.881 488.626 231.728 517.717] +/A << /S /GoTo /D (lnk:autopollevents) >> >> endobj -942 0 obj << -/D [940 0 R /FitH 764.175] +957 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [83.881 474.679 190.109 490.22] +/A << /S /GoTo /D (lnk:keyrepeat) >> >> endobj -457 0 obj << -/D [940 0 R /FitH 319.191] +958 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [83.881 420.083 209.516 476.273] +/A << /S /GoTo /D (lnk:mousecursor) >> >> endobj -939 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R >> +959 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [83.881 406.136 195.564 421.677] +/A << /S /GoTo /D (lnk:stickykeys) >> +>> endobj +960 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [83.881 392.188 260.712 407.73] +/A << /S /GoTo /D (lnk:stickymousebuttons) >> +>> endobj +961 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [83.881 378.24 199.207 393.782] +/A << /S /GoTo /D (lnk:systemkeys) >> +>> endobj +992 0 obj << +/D [990 0 R /FitH 778.724] +>> endobj +480 0 obj << +/D [990 0 R /FitH 373.912] +>> endobj +989 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R >> /ProcSet [ /PDF /Text ] >> endobj -947 0 obj << -/Length 1728 +997 0 obj << +/Length 1572 /Filter /FlateDecode >> stream -xڭs6+x43N߲F#)K7&a -h8&=dl$y?iW۸}:>n4֤=Fm%]DngusFv<:L9A8 Ҧ/~@3EM fJtotphXiEsFqsl!>ł[6F8@uJevy-`ڋE i%UܞAo i\`HXe{՘C!Y[R1%k࠽*x+pbDXOH RezeDH"i -|CDJ;RN¼W4}hI6hWHdCKN!$$kܗLq[|6X_*WTrbP.D\f#0H(U>PwY$_ %]XhKcܤy{ -Cd +xXn8+FfI4E@[Dۄ)JǤyGw6, ˒x_K;r뷾c8kmڱ(Ql{~bm3Յ:OtO^RRu떈{0Mg:+oԊVnU +nxzun.?gmGkixؑN O =f{%g:|ce=Xz̭ 0sOc+X}d⠫R tduvi,9Kl=L+')إKs%M7#~&]P%7T`eb1S_%1îI3崢^W؞TV4- AI )+Y2ъuScP/MDן^*kɓiqqcmVYOT5܅,gv%')6DX}i +puuuk/w(xb/((y];2[uCF$=_8͙q5BF!r$ Q(UZ'G,)u)Qћ!E,sJ`*~Oİ<n *#E d?~ コ>~׺+n w+Ln*i= NӢ4An*pM{; +n-i 9Ҁ}HaSQ*wlU-ZNPwTg(oI콠s_\oJ.lhxo5xϾCgP 3`Cѿ2UsU{y;:c27rɰ+7^v,rdѭbj4/Il'нVgcmo>BC"[[W뉠1S*:@Û͇vpsU\ġQ*"-:]Ii9 <dNB7xQS`¾C`jYS^.EԳ%G”d'VIINs>_pf^֣pv8'c d~y~ֳJNJ͟C&, endstream endobj -946 0 obj << +996 0 obj << /Type /Page -/Contents 947 0 R -/Resources 945 0 R +/Contents 997 0 R +/Resources 995 0 R /MediaBox [0 0 595.276 841.89] -/Parent 943 0 R -/Annots [ 944 0 R ] +/Parent 993 0 R +/Annots [ 994 0 R ] >> endobj -944 0 obj << +994 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -948 0 obj << -/D [946 0 R /FitH 764.175] +998 0 obj << +/D [996 0 R /FitH 778.724] >> endobj -458 0 obj << -/D [946 0 R /FitH 276.551] +326 0 obj << +/D [996 0 R /FitH 739.268] >> endobj -945 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R >> +330 0 obj << +/D [996 0 R /FitH 435.988] +>> endobj +995 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R >> /ProcSet [ /PDF /Text ] >> endobj -952 0 obj << -/Length 2185 +1002 0 obj << +/Length 1743 /Filter /FlateDecode >> stream -x͛[o6+|i)χE;Ywl;-XhmQI}hQ,S2MKED8!9:;s}v1>FƝDHPO;vo~!uOGe7_Lݩl?Ҷzwj؝ zo0Ŋwe˶h @۟np}frw]\ٟgjDٯժʧ8+;N60Hp -+#F0sy!Uml9Ys>&4ieOQ5LcB~,g/y%¼uH# P?4: 0>atӤ{c{9I"b+d"ذۍF; $Ӱb0"ܮ6^x Z7;8R(xX -n2KN v$uLCkhiDOMv|pQnJ"I(l2Xs\nn৉p;El9V9ʏjwG -[`aƍAa,2MDjV.ZŻWHjϥ"7v+fIeHTdxڌ2ûL [pʗ -Ae ̨g,QI 4: -mo0[v{%hg,_f끯П@HER*p;2&S@`a^O"bc i+qBjSدX>?f`n1Y4yhQr=Oamzl:#kT347wͰ를 ~f -j -nqMw3b/gWmO0F8/mO@ڿ;!ؽ>#c%UHT"#? 8*\m:+N5AQlSn0ŭcn`\Dvp.-J}LqW)ߘx:@ -AU:fzs~H79#ĔP"Q\bxITm-.2[KXXQ,tC"^@)3Xc}ODBܖMMFQU6M,s3SJd%рpSJ"bmp|2{{CM*m `nhx"3怔:7Hً0 --ƅ0scX6M@"DK@2QA" 9j;$"*R'){p1.|IEj;֜/}b@[J_V ڠ 江ZaBJ>Jbhn.mJ+;F6 `t{A8kiGzNm+uvd[nO1jtFxH%Hm\H$YH3ݮgU% +xYYsH~WdN8.|-uJƃXI'~{4#!I}Rk믯[N:Gc-=bMfkۖc2ϚY'g׽>;3ӕT[A ޗX՗"EfST#+,Lb}"'{fmU w0-pIAIֶ3v '?:.E y/غg`֪[\0$R8Ɲߪ +ci&" LD 1I0|e Vdߟ$yz- *)?a*3c?ؤ.\ dƦmR5 AxӨy_.Uyd,!hmS|rɟN`D+k|V~TaFM`J !6r!^ˎ1HULQt ]z) +#[2VJ K22ؐ:gl,|iݤ$(+Mi>wrj4JFi02C<}H8b7X$-#CbY7G"\p%ɫyƳwJRm1 v }4[X ) +[&ƒQCeU&2Bѵ)0eY0_Dr]i@2nta?@{J +@x<ply3h[}er#4<i +"vS9xs2BI[w +W|g?Bj h֏9@j +lIf;[WҨٷ22]-BĻ^G |rPUSD͚LM[UhZ^!)!NrH\)95{#ˋDKX+ߊxV5^knXUBx5 H5&ǧgD4$t.ϯzzd 2eh2MJ)FKDz@nqU+T\-:`jPc*KfEi #S kջ0 "~;0ZQ7=P2n{p]pL"޺XT$@r%=X-q[oA~VYZ5澚% | &Z)_y껨.;fcmb\AN6Y;̒tKP]<) Ɔ3Qvlf֍@jf:otСj1fve:;T47I9 k,SYDA^,-Y{dָjhlet"iY Wvv(cr!㰿lO^tLIF~WqFNOW[sw˿tx;ˬk(ۂ $LxAVqlw*7p |#k{?0v?;Zj +wO endstream endobj -951 0 obj << +1001 0 obj << /Type /Page -/Contents 952 0 R -/Resources 950 0 R +/Contents 1002 0 R +/Resources 1000 0 R /MediaBox [0 0 595.276 841.89] -/Parent 943 0 R -/Annots [ 949 0 R ] +/Parent 993 0 R +/Annots [ 999 0 R ] >> endobj -949 0 obj << +999 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> +/A << /S /GoTo /D (page.64) >> >> endobj -953 0 obj << -/D [951 0 R /FitH 764.175] +1003 0 obj << +/D [1001 0 R /FitH 778.724] >> endobj -459 0 obj << -/D [951 0 R /FitH 291.871] +334 0 obj << +/D [1001 0 R /FitH 739.268] >> endobj -460 0 obj << -/D [951 0 R /FitH 173.42] +338 0 obj << +/D [1001 0 R /FitH 413.089] >> endobj -950 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F26 337 0 R /F15 527 0 R >> +1000 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R /F41 487 0 R >> /ProcSet [ /PDF /Text ] >> endobj -957 0 obj << -/Length 2216 +1007 0 obj << +/Length 1048 /Filter /FlateDecode >> stream -xZ]s}Qg{yZǻ%'ٺ{K%%"ߧ 6BƐ}ʃ QwtAypsvqv3HcMQR:J2̖oSGߎ·.hg_"".xʬܜo9&bo 0э1|t0B|=;B̎sDJ8ocg vεCCgzܾB\ĵrH - ȬKK' F6#p U62%rciZ% J$r;_J)R  #/5ÕDJwӜHy?4VH 5+/J@SsUon'l?(/An&`e鏼4Xߒ""˿~NJN.O jt]0yt"XޓM-jFAz?C6x ڏO-0`Hhx*#BEǏ&w٘6HDFcG4A pH StDIP#FD\e32@06cUx[|)hyo`y13y )ؚɍCZ5 -<5?YZ#v8rj^Od 6Q L_fM*HpeVK)1OU=/wn HЩP|ʩ,= 17?&W7gGTgm| QE|^i.m0V>?j|ܭVfϼi"EW{AЄV4wD&bnO'4,bjҡ|] -Gv_'淓ɘtml->b#byc~* `AZArK}7PAjڇLй>Ћ @4oxty}7?NoΑ1e+~vmb 0HZ3DP%{AX n7pd :n|IbVEFxK%q7. ʝ@D{t_͋g*Og矾~3-csmLƞR"?Ioa w%=HE)_@*l~(^ʶɦ_{m,WϿάA,U 0nm7pY{f';6M.خBZ,֢&OIt,/ LCYAw LӒ흗ُ!'Ծ}7|G:tGM65M::VCjߴ!@0Y +xWMo8W(6KRG'uI:Mna(m )W붿~")˶]eу!J$g޼y321]{llBc4|3|/@yb|6ǷWր؜%+,7t]Y_7`n"!Egpz-w|kLs.?P[b5b.Z)۞^aWl۞#שF!vF 6 vzp\9IE Mۨ(~xn͋%}Nj䄠s1Ƿ `"~>4)hfasYT'x.gҢdqU{͈'rdU\.0Q Mg\]ߎdB>EWEpaq9Z!5!Ĝ˥{)U.|~"JQSV(v%~ll<$d5XYE +Ωj '#9],BcQq+ZlO_ӌuA6DƿWjFG.a[(T|:ygi'ݗ*vjw1kV0s@v\)T5͢FphKON-!76|CYe%]9v<*4D1p +!rb 4c#N 6Ƀ|~yD)S'4_̵DRꜲӘ E^0Y=GDW迪St~q7CI+U^j>%3FQсImڈ7]q| Kl +-:6%- C0bNIJ\moy*hB;`=}MOݣKM` endstream endobj -956 0 obj << +1006 0 obj << /Type /Page -/Contents 957 0 R -/Resources 955 0 R +/Contents 1007 0 R +/Resources 1005 0 R /MediaBox [0 0 595.276 841.89] -/Parent 943 0 R -/Annots [ 954 0 R 906 0 R 907 0 R 908 0 R 909 0 R 910 0 R 911 0 R ] ->> endobj -954 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.57) >> ->> endobj -906 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [83.881 293.843 231.728 322.934] -/Subtype /Link -/A << /S /GoTo /D (lnk:autopollevents) >> ->> endobj -907 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [83.881 279.895 190.109 295.437] -/Subtype /Link -/A << /S /GoTo /D (lnk:keyrepeat) >> ->> endobj -908 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [83.881 225.3 209.516 281.489] -/Subtype /Link -/A << /S /GoTo /D (lnk:mousecursor) >> ->> endobj -909 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [83.881 211.352 195.564 226.894] -/Subtype /Link -/A << /S /GoTo /D (lnk:stickykeys) >> +/Parent 993 0 R +/Annots [ 1004 0 R ] >> endobj -910 0 obj << +1004 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [83.881 197.404 260.712 212.946] /Subtype /Link -/A << /S /GoTo /D (lnk:stickymousebuttons) >> ->> endobj -911 0 obj << -/Type /Annot /Border[0 0 0]/H/N/C[1 0 0] -/Rect [83.881 183.457 199.207 198.998] -/Subtype /Link -/A << /S /GoTo /D (lnk:systemkeys) >> ->> endobj -472 0 obj << -/D [956 0 R /FitH 764.175] ->> endobj -461 0 obj << -/D [956 0 R /FitH 664.736] ->> endobj -462 0 obj << -/D [956 0 R /FitH 525.927] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.64) >> >> endobj -463 0 obj << -/D [956 0 R /FitH 386.998] +491 0 obj << +/D [1006 0 R /FitH 778.724] >> endobj -464 0 obj << -/D [956 0 R /FitH 179.128] +342 0 obj << +/D [1006 0 R /FitH 634.392] >> endobj -955 0 obj << -/Font << /F30 336 0 R /F33 344 0 R /F27 335 0 R /F15 527 0 R /F39 763 0 R /F26 337 0 R >> +1005 0 obj << +/Font << /F30 352 0 R /F33 360 0 R /F27 351 0 R >> /ProcSet [ /PDF /Text ] >> endobj -958 0 obj +1008 0 obj [939.8 644.7] endobj -960 0 obj +1010 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj -961 0 obj +1011 0 obj [531.3 531.3] endobj -962 0 obj +1012 0 obj [777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8] endobj -963 0 obj -[602.5 494 437.5 570 517 571.4 437.2 540.3 595.8 625.7 651.4 622.5 466.3 591.4 828.1 517 362.8 654.2 1000 1000 1000 1000 277.8 277.8 500 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.2 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 298.4 878 600.2 484.7 503.1 446.4 451.2 468.7 361.1 572.5 484.7 715.9] +1013 0 obj +[758.5 714.7 827.9 738.2 643.1 786.2 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 298.4 878 600.2 484.7 503.1 446.4 451.2 468.7 361.1 572.5 484.7 715.9] endobj -964 0 obj +1014 0 obj [556 167 333 611 278 333 333 0 333 606 0 611 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 389 555 500 500 833 778 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 832 667 667 667 722 667 667 722 778 389 500 667 611 889 722 722 611 722 667 556 611 722 667 889 667 611 611 333 278 333 570 500 333 500 500 444 500 444 333 500 556 278 278 500 278 778 556 500 500 500 389 389 278 556 444 667 500 444 389] endobj -965 0 obj +1015 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj -966 0 obj +1016 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj -967 0 obj +1017 0 obj [800 800 800 800] endobj -968 0 obj +1018 0 obj [1062.5] endobj -969 0 obj +1019 0 obj [556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 0 0 0 333 500 444 1000 500 500 333 1000 556 333 889 0 0 0 0 0 0 444 444] endobj -970 0 obj +1020 0 obj [777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500] endobj -971 0 obj +1021 0 obj [250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444] endobj -972 0 obj -[333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444] +1022 0 obj +[556 556 167 333 667 278 333 333 0 333 570 0 667 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444] endobj -973 0 obj << -/Length1 1014 -/Length2 5210 +1023 0 obj << +/Length1 1666 +/Length2 10004 /Length3 0 -/Length 5866 +/Length 11076 /Filter /FlateDecode >> stream -xڭg<\ݷE"-{/E Ѣ`3хE=: \O}9owu~^0ipʀpG _ss01!H&oxDD*P/[HTOT@ wpG@m9ֿ2`P7Gڀ5,͡%t@ph0 X"`k 'e 0?)0MVIuV8@ n{/) -0KwOuw F 0R}̩AgfP  -psq+qzq4!HK9 ;} }R 7MB@F\<V&Lf A`^A9as?D$@` v#_w -^@ٿBITx@=iMB~@x@?@( B@{o}W?^+;gEGS~#oSV !7Ð[A v[N-mk F 1X&|NY#B?AV˔52^=:GI:X;ƯQ{Ӻ;S7gijΖ\Z0Զx2)B nN|gq@ qLz?vYٜIg$ v%M&J\?fuZI}IDEGWD Wukc"ktx|TW~yNUAlY@P̡|.0lk#+PǤmvyt~jϻPKO:RT}vd)AnJ=t6H)E\na u+ɷSfyqD/9 +zbPD W2&~.gh֤;[\ݖ%ORnSyc6|fM1$S12Bu]Ml[ԮM%u`Ǘ={y~Tv\lh-fU=} ]/NxՂ@{#q"KP7h4 ,L\[5g93H*y&JY5V|];wtⴘ!H9!|/ԭ8G79mFioAG2?` =+jptH/3@Yo5Py];?0lk_xZ)Gpl2\IDYC6QL -l+6|ns((h dIW/3*Pa/S!_ƃo2dwƜ1yӂ:+5 ]=%lJ8x'\qyl;kK* ?(0h)F-FI,v˻MbrMPQgu(W?^щ3If^~Xdz*jޞ(>%)OH*ADˇHha$AR?޻CV-ZӍ $ f9dqXD\DڬY$pM߈!i.S3cۚU0C^Z\WDւ'>9<?㤪?58 Cte>9vDb{(\1Zi=>LWw1t+2"{N\7]|+]ODwSBv~ٜGi7aTp3e% ~o/C[j"LzſA.LD8K3`(?5eJEiKÙf,p1Ix.#w8OBөڙ+ecԒ4;S}_ - 6&X=OǮ,?9`tC7yn<0RM -M_'[Il!S3&rl>YtTV]CO9kcfT %/+] &kSQAt@WLRG(JWbȈ:χM- Wj?>lFB ؂DY`γ7Bku -~N".t; -= !"K&Kѱ}>v KZ(7RΏ1DA}]wc J%z;ik̈́ۻ~ch|+WQ>yҩ<!a,pڟB,eeHYE%Peܠc*^.*?N-oblmnRs2:N>LƓtT$epJ> ]K{6lߏKQr;rF뛘vddu"O՜Gsܩ]D|ˡ+5kstWVГ`j 1$Ij8b[)ɕ{a%u隩?*լhD5[.N"yJW(mم\yfڮ}&jGv,ʤ26a"3-:7f'K lXϿf4U|ӿaz@ ?4h.q 52#I]_d)ȁqi RncTP7&ȗz'c bsU:ڵþCM{G-Vle+8wG?W3^&jeİv]gc2H/7$ꢴfu -opRj FϚ#dJ3I邮.dMe9B \ҕqAfsh9Y8Na%gR\S/V&fNytkl.LJV gnxH{Hѱ;Z؝Ǟ"kkS+f JfI9r߶l.FFi* |x8b1~b͊MdWp"EUƃ -V +%.EI7}>_A'~~K+*n5k{Sև[x5cFCxxJcSCy<| -;:cA18L)d l 8K6&_Y+mv,wĬl<2ٸ*X "VYHR׹O`eLJ2 8:~ln}Hg4H)3O +ⲒOҍ+x+N7 Mh@e5Օ9O F+Yl62њaWxɠ /G6, |?뭅w+ ;QVd(W}Q>K8ȩ8=~xa!0>Skk4[3 ,ktoSjVj(׹Y麍 lSD$zyйSZp=4CE;uGaDudYNԎׯfD„_$u.4jiwڹ<ˆK!l*U&^.`W.ۦAk2ڸЉYt91[XdI36fll7Y~m. =izS('OD)rSpWe-+ړ Xd{՜LmEnH3 Oȍ+(7͊M>2᯼i(8m6 *${F0?L@O:xUZR6T:`N,'i{&;r]M9vtb[YJLI)`ֱ ׏\"8OȪPO4l:=ƢȍHإb%܇Qxeg^ZEmU|~(cfďm1pb~ 70BL VP q.`7]o%uhI@2͢wWol -q{3O;p/OfN~Su Q4Vz7E(GMJzWq6dk_jH3аRfV,i:? Ze_LRL϶D,GKOs$'J/p3?Dǫ3d~^g3DjI9TGUr.f-|;ou5r2FiI{(^9kO +xڍP.L^ݝ 8www-RܵHq-R;n9{3Nfyu=BE$f6I!Ll̬ %%96V++3++;JlyI!/J`{[!؉ t2(1 g$* %%ߏZS:1;)X^2m`S+B +ZB ,,@;gf0# +b P9\@fߔ@;_ԘV*4W"2;|79^4* ?4`U3;@SS`ne H+2C oC3qt @ZL |a?gS'+3o,üYLlg8#>,5j7273M_6/"d  rL-Y~'twd-~vy[^~<. ߊFHll3+SdaeO1O'+7Xd2af`{[h1 _<8L\6VN^˃OfThQ 7ѠkoB2 ?j (ICOGue?@^C "ks@fVW+,ˠ3q2r)rrZAL- +v}xeLm^.痞:,"ƠUsHٛ~$;7tGzd{Y^33`aC^\/`'ߍx,2 v RXt~3a1|X rX,,VA>?eHY_B9 r|!|9Ȯ' +/q@n SY@um`M+ I.;x!Ojh#^#+sQB/uMܹVi;Iիk"Yf(UND3> *t/ڞWjRi6LE\">Am <v1a) +HUÃ˘]~.ۧL)A"IUh9%.X&2آf}kt7g[gd<ƉlĘ8N;fK!0M =iVݫȇ)/L?|PHӛeTz:nb JS%ŀImOi|E4îǛj٦)\꫋bZsuѻ+OΧvqEǪ(He¼6zӴH W+* ;pg6;9H0?4l#<0 +5fo%ItTrn݅X? ɥ/:PIT@~2/_yN;1GuzAv|-,>̍ J[*LKѨ8j{1mb-9t53G(mB~|e?3.8, 3HڍHMFoNʼn G^7鐓Co5fet諾U NZ\#|c<i$ |?~v09 +P})yY&'[wGj)ue>pHOX]wȒ%Ӿ^3k$k0/,B_gܼs0U_`xZ7 +Pmz͵Oo½%w2A$:N(t߼QZ!zҦjŽ#o7 w Pq#m*7?lܰҋ&_G~ S:D.^>nX^ܪ̝Oo#dZNXZwpѼsC ;X5~Uw_컨~X7޾[L&8d 6j&=,-e+ikubS!jjji +UjJ8쎉 +H@h#ncoE񢜠RZ.*^cN ~,)p˺re_I]u24Uz}ѯiMO&zFqflj}kt:coR26J!wDSO  1pp鸗) mkУoE: QhC03 ܫ iDv_yh9sn7\bDwZWYY:z%$w5`o֕)n_Saߊfk73rp=GSk|RW񅠕p9~Ub$8~lTgzOO} ߃$KGv@uUQDћExZH5_!?i1_WQU$a`D历w廓Ihס(ۿ8)tz$yw#(Ϧβɚ׆GÛ>"%Q6&õSwž.Ë1ŀcL.ֈ`堌HN-F$|VloݖSUK.)̉V,.b'~=}&_T tblW$zPAߣej$PZ3-m4@&I[q]Gw|3kZl/H[ccSsVާmG;KSΧ+ i{՟k= , +A51I i;$6zv>cBӀirIlF0%:R?>)SG(FeK&.f.Y-G},tFYh +q촊P Cr.WStxP5y;Ʃ}}H"4KxOfqK a8nVgc?$\ΜڽSG&L/-6E_H*"VDW +hv:߷Nwb!0Rf$`>GuF9V!.'=ډy,\̄5kW J/mwXkJyӌ/!S曠-:wKSlzfxݚ-'b*;nBF񝍄8mHJϾ{= UBO3M3ZE}#λZ!OoIX$7_=@(i0yU^̞)!7%%RLj7?9PaK)>KFAѭ]-䀫o[eRRِ=J4gm8)uDFװr~Φ* +d:F퍛3s\0upcMio;gy};_S6p Gѝ5X.FJG]TXKC?A`cV'"3U%הͶ]9Ϝb.(ma#b\-}Tc2]ЃK*߃huF#!)e3rPc8'Q)]7AJB㤬MQTbP3@|QEC@u%$5Iick+{bp#GOs^7I9PւQ8ѪDvu"ZbY +J݌@\^Nӯ qgcgȅfQ6MЎ@txUK}cWW@&JճAC-*˓s 8gK'L(Ԝ1.RgvBYʠ"8X[OPEd }&[< @`pR=˶d"8c<;0ffW +3am蠿Itҝc7!٧V֤Adɍ>[(ϝas ,$NVDnw<^ D$9˕M +c< rKXDߊ Q^5pGAwy7h~IH +Ac.5ybJG*\ej,r7\UcE+WwYegvG'l"ƻ+KNΜuv^u.9K)"x'f|7j뱜Q +~%jQl~bu +x-Z~60/o$ ac~^m3_h%;"\$۬G;wZyp ƹNk1 Z}Xzg[T+[Q{5QH0v*Fo/ +{ +ښIRYٓRX 9==Br{a%ƧCtn'{0n\̋9 Ц >]-E('~E ++Os=x7!`b_h8u<V oVPz\}&HJ(s*7HQRN"߰XɹȽG{Շ%fLrI>1(x,Eb>G)`1Q<} wCtF!7Ȯr-/1ky*!⋛"A"?%DAE_K&.t)67>'{a_49DwEgL\@& ݐ/FqyOd'n/\U|[4_-|J1uK 0qvtW pC`t }~ra6sQ5DgN{vB1=yS"ՓӸK z56 *"jfw&Q bo +>e"Hqo8s>( hФTߋ#Y}.H؅TmxQ s3 LxG3SY}HxdZxǾP3=&O9ǐXԩۤn^7}_-riMq S X}M'c΂ڭPlSy1g)L=Ku=\Euf0R{pK +o>*0֯0}\0@qi!;8@jV!:*DS*nnn?1E6VX*֑͂/eVJ §d[/oAn^O &bUSX:LjQmbRϥ.C*=d +l=iceZp=Og,EMmq5g^RaIj?Z8KXdL]ZufC=T;W?YEaKܑB"{#bxg#e( ~0:xԛ~{9.ʐqWV-;ڦxKky=+-*{dPPATtЯqxJn F)w"DfXw!'j=,$ }a9˅4|QeP/zTzWO _d:hj+¢~% x}0윒B<ҵ }0^*P?R >QtŸAvۅkKb,-eBA|)M}#5Tg#U:0D`mg XmI6nOXd6.OûL<<]{uj#ʙ h-&5߶veWۜ+i56.E@ގ9\nқG,_ pZ^?ٺMNTӥb~6iˬvSNm?< +YD`6e[% 'Pk<҆y<1y94-MF!Uʷ[Qt)*3]9H~Ǽˀ,b0h`E OP(27d}"j8BU9|F=bR B ezDfL&} |bRob'k㪯ty>2|ɥh +rXBaM|];hX"p4ߥo*Lޅⴧ|ŐSQ?!/9OrYF<{_LE탂 ڄҨ Ĕ,ᅕ`=;K)"kV9fpE2a՛A7aչ~xGxz ln۴+wZR oS9Mǹo+oquiv-Ptqb*0#*{kBg?* +oO_OW0Ч"DUkEa= "Tq30!ĹŬW6$NAA +gC9 5AJgʨyE4'r£[Ձ*kRhWZ^]לMdu^Nz/L d&O9efoޫ{6R0721_ҵs©$G$ֆ!ac,I,;>ҵy;l^ c[Gpx0{ 2#%0J$sOT3*gݻ@=9%\ݷ"SES{PoԊZui>'aS1m rSLM]%r#եW bͿRE]VL>]=$ ZD('>*Cwʭ Ee5t4}A7éM=\WTp}Zx}kLy!J&&J3%;v\ + P$ TxtAAaێpW6+zV x㠘ʦ՘x(9A}g/Gc޷Ge2ᣜ}Gv;;W(S,KB+=\oV#Y3}QLY Uq˲/؝0t(vm?A5Iȶ +B#B$38X֟|Lga<>_F=I6pӫ\ZeUKC1x_ .@z puPɜ_bˎ}PdXCHN 0Lt?@xXFsH_oWW,jat_eM*k0ڋE6%9#+u4&)D^'W'Ɣw$wd9r+Soqu^89-2/뻇h*}22:mƃ@#zp&'|lѯb " +V=]UVk̲ed.\di]})a#Kڊd8$JE!bBEiKM#kȒ?< &!",Sc!z;q0W-qٍ3`F x)Kf=UZl22|M 8$]I1Ǘ^TkAf1R%}OBNTyw>ɤB~gr٨Yvcj$bUibBde2Z"9/RA;lz㔯dvek]ZA&"͡¥FZ6];AUyj[qszn*uC)wB^OCx;PIiI7_uVbWقi,X{xY*mV&zsN8&mãޓd*Œ?߄#UQ'@(|]l%&F/,*-_&9vSR%g Mcxrgp"u0]f`18vt +u͆__+r~ح}<:~cgЅ̖( +ɷ4?#]l#N%t1"'zE"A#b=-Q&.P_VupB\<6!UK_1hoρDso|T5ˍ[CދR;Xn+ZGQXmpk¯:Ci?O8f={9 ak<L+Sc`F' +j.x +8`bu،gjҽFj[:]ROY|PF3$WĭD.\`RL^4vd7~pȱfzh*2pP)`rGs '4o{Y6,A3~sq +Θ.dw$(j͂Yu]ks)+[QqŅ]zZ"̷o'PG?L|]+~&W]9_o2kU|iR+E>VU6$^&)akY𙭷jmK֎X)йƠ Pc|Ugw:Zgۉcw9TuF8Ͱ@Wk}H~9LwAނwٓ>O+vL=~Wr &9 cb[BɼhڤxFKy{^:G Cմִ7AJVUoى;JAIto7>19\9*Tz=W_m ++tW7,Θhi&ךmy^c-Ќ*6̟XcY84nyO>%ATiyu67T\TFT#Ki3*ۏk0ge'"-M\wli:yyWb<>ɶ/MO9YpDg_}Ǒ-=TbB )OXW~u6v7˱tŪu@jӔ1d;(_K.up|a!k@{Xl:Q4NqL"T۱U#{_.i4oiј3n|CAߣŧ I%#8хu,C0U0_Lk9!2(3S`;V5@//ȱ+}q(W;z~F ',&>BtU7E'm(:8ZNC}Q@VEqx"orkZrFxXv}O첔auw$Xx,.,ЄWs` "Vc&.za^͘t[⍺ĪR/~|?A*/,)qch[(BntS.Yف97'ֹۮV&YY\N)/ǷC,w +?k|MN']kR9㸂 `Ha!S;{ʸl'!mqdJNh=zu#SK6=D la{foȿ_ofR_X,> endobj -975 0 obj << -/Length1 761 -/Length2 1501 +1025 0 obj << +/Length1 1423 +/Length2 6396 /Length3 0 -/Length 2040 +/Length 7361 /Filter /FlateDecode >> stream -xڭk8/2ɠeFTo9)A2FƤAF̼cfdVRIB%g-XPR 5"VVINuյs|?ՎagH MĆx4 `x`[ nЎθM8{9@!,V "GlPhq*`"  p8@! -Ac0tQ Hd^88~K3cK@PX.bZ*H&H&GBicsǗ]h`?4.#Kq1"PP &(( Q@&;c,q ;=m-z ӟ-bD4\̃<$*9Pm~?oXy@ c߱"[ A#hJ~ǀl @@ѪVXb6 PF!yHPC­bx]} 1h[ y$H,vXjƂ!#F yW2{Vy bW@ ȳ7RJm-zT -'߿){%}B2q -37hr kRQgv]sT X^;m?qV_k3ѻ~vMX7B%O{E?Tjg3׿ʂ+gA#'}~K ;FfW|U4wFS\}T9aYJ{ޗ" W[eƁwcpN)][?)˵#fT0oyvyzTi۽$]{op0qK<:!<>N k_ [ {[ģi۰㯦k4iWT 􎗖s(PϽ"0EjK>[9aqiO::GY3׽N_T[ͽ;/4("kLSF#R -i7EI-q1mgM{a8EOя]A^Xg>9XZt1=VυZswGOif"Rb#|oa{5¶ctV8|*S8]k_4nuh9v&^(J5699@ȓ˔"e6M\jʣV6NE7qwC ]YZl -gYM1'?E\4+~)RWJا=6nG/ْD.!yߩ -ZTaqazb J,"W+5. -FkCQ˷>Q>3+P?[Α"> L2Gި 0c AXvlq@JrЄϚYqY,+*4TҲNĻ#w@&ډ {"ה|o5n:iK0 vMj[>62I. &KxA/HʸHWuV ӗ;m!O&%9x[}fġnmL^ [kFUk }tmhE5rWty8ޏMmu578n{y21dZ'mkl=9v֫e˲8}}G#jӔ}>h+/ @0sAk`p]X +"*?0 J<3J;o[_ys%- f4{Fwey*\l +a)3rE{ô?X"3l#͹o&~CI'3 +67۾RLAcl 0+;Ko_eje> Xhlt}@o8l֪=pxksdb;8^)/p;iР֜nu- ҄U^>l'JW" : 8u;ŸG7lHHšuԵl~xp{(K{Dͤ_ 2;)/=/ yBO2N>yJr80Tz$}N!M؛b aQ7O'ٯHt)Xzxi<̒fZqn \hاqox;"a^kׄE_U^.i? =v]ۚ7/p\cqNP~7ؐ#tu._m3]mR' ΣOKxj4_F2݌֛ 4juLs.?0ҟ[OaK{>H-u]FܪS4θТ mh(xwT-#>gZ w9IO2)N˫7~ +*0ykz !+Hgy}q0Bf٬M[;dgS]){T8A HnέP;Qe[ZIg'/#JldW;de&nwQ5t]=8h&>xF'YH,cYrz4VaMON=SM7_0})Cy`]pԊOA;۝ ~jE +7 lh'㠢{}4FՇ.S8(-ϓo͹rE_;{Q86v^ۀ 2VIʽ=$Z@AeWk_~Sp2/Z5Ij T[eI/\iCڗ;?/nNQW0> {rV!9e +"i~믓8{[)t-5)+]_ ~/Tc5֒wXd J^@17zqXAXHP_QnYOP}R&: +BËiy~\:֩JmBi=ºM9}%nd@G mOL[&ϧVȤ;535W. `>z+rtjK)|TW7Xw!Op.*o]Hw6&-*GoS0}_wXX@<}7p0j5MW4*q s򤇏gWjJą'2MPf=@qױި0I0SL:Nx?JZke7ĵlH&1C~F=!Dڊ4*Inۡ7%>9/bQFB/:wn#qg÷0݇PK^ƕq}Ӳ:'>32֗6ŭ;)FGid$dD$ʹMaBuN➔SdyI +ӥo󃚈0IC~9~N(tinYQ8ߞՏA:E4^ط/dJbg*tDqB9^I=WL=m֟p&kuxv},g7k*ĄD~oD ;,g k.#:xūi@7XO%ހsdrHs-+;;_#6. 0gi=N(j9yY'Sǥrt\ܢD7 P/HY>7fQP"}|w3{wA{x@T@"U~k?~zZ;YL-jjiCٌn`k9IXYDVJXzkŵ5G\ZMB^%_8t.jN}qp7/M ѱ܋vDh} O׆彚X_GSk 'p%RfE4 9xg\&Hť35_X$wʉbo>I +JN+wsl( \p"MZ\ @X+^ܘBBǍy%S `ƛ{pݴ>ҙ ?A|i~m@"Y]B6 +j< QCW7yq*P%^)T}t5([0N$(r㕔S.K`\FJbﺉSc(biopR뼗Cu׻Hc+C {;uٱuO2')[h:C + +>o-gz79]bKDP?7ju/aG[*ROB`gbiD*퍳ܩB&f+f;OdٴWU|E.%T  .qj+/e)aI̬4: .zg4vpx O−*џl|^GdP޻\7o (s[QW_zۙa vd{"*Rq ,;䚈`C+7eU.zP~H٠/.j{Ӂ(Y\y+&WѺ'/:v5CQ_c>vdB5IhʿaLqA4\K? +ݬP쩍}vT)\ot|U! 3Vj6v"zNP /1>U %ٻߺ0Q"\mph\aZJ8c}7CYTF!0L1eV|c츋Ǐ}˔Tk|.@dlfLϐ]uD[|gʢ1 D'Ϟ$hiSXmCaO^DplfI]L5.FSƨn+;9|IrP_砹 _we.wj.9b"ZHh_Aڭ8ŸmbǾ)#1aF+.t'mS_nԀ)x2Moqڗd̴sŗ">w+{gi +x[DTO܉ʏne>Qej"{bkxT}2ik;5T"dcdqt$ fz'e`z +>Sf)pGmVҵU'$$ 7~m߄Ounl7w/" "Jr:m40YBO=쾴gq#++; E^ʹՍL(6]w)Xgx|%%O SQLWݡdң']f=D7\qjLZ2?{|O5k^-x@xYwUW +b]rW*.M-kt#zJO<뵱raoTh -ΟoVsëjh#h?Uڌoț:>-X(yg\c=uD17{z9hTV~m +Nkҕ%]7itq:qᇈP_4dt~~Xt7|o.Gc&<4/B-͠'bpY۶|Wė.&IrGxsDoCG꽘3ەt3<1Ϣ"8+c^k/iYJ+(9 *^f[.;vGT,sl^t96-kxS^Ҋ~Q(ͭ8ɖ&}/@={ϗ)꣯1(v,xKsPC>Kc-!)̺A _Ʀ"yVAg.Ll[BM>hlPWv7z=otmBXSN^ rr9{/YkeR+N=J?G2)%t3:Ha.JTTd,3wbf)_qʤ$; ~6nma@9N'}r/ A[aw~>yY8osԹETc|M,' 8J d#6f1ādf g9o{@[~`^)`xՀkcm0-p^T)Kѳ`hYDD]Yqr 8jVSVtHZMο rCO18q΁`29ZWhE=ˊ5 CG7zQBbEtc$_:%zM|Zzkpxw>k`֕&3M!*Np/F+%C $B>O MnRẲ+;a°r6RY9| ,n N1"__\g^xS!8=q= fT(VB'n\L-d;09:ID#Fsa[u&!zԸסXP{=V\[a lGeŽv jI +E>(LΟIj 0X\ep> endobj -977 0 obj << -/Length1 811 -/Length2 1570 +1027 0 obj << +/Length1 1422 +/Length2 6694 /Length3 0 -/Length 2133 +/Length 7659 /Filter /FlateDecode >> stream -xڭS{8ifW:Lxd13B94 rNcLcwf0QHXDXP,*®J%rH@kϫmAcClW7V$2:8%JM -(\:eMBod l!d}c.J XC0=0 ԭ4E"T - ( (A0 J|`d Ch:(<T.,vْ=+ ?4^ȗRsS@}Ŧ@L,&Р֑!^mnc2)헃WLg+` HlC m՞Kaҩ@&p):ǖќ\j09 -hߚ@[%sܫy+5g -uuY_1L8$^<"D/+oβaQ4:+ )|r{Dx@gѠE :,6LAF-P(B0FfA_0y`쯂]+ĿdGDj p8#`d`?J*!w!y~t$}'TFvݱU▁9꽹6iqfI;1Tsc66(둇5fSee~r<`lS)r}|c-6~̡lHa;5x|T3, *\z")+B10f(v6J&[Gkhܼy^zO<\_Bva!q_+rgDVɁBFXTs_|!/ޓd9OwQjAs.ubF2# - PER܎]$h# qU3S`Z)0Y4m!ջB6muy~f=/HqeZ;GaTKdA)mU܉$^t͜>?ēL_ 1J{͓нXTU;Yޤ*y~M?;_uVx-3>3#y Z.P-OtGIr_,4GoJNHY7԰qԤEFC,'@t&m9o^u6tʦh=3,&Dٽ&LQ?y0L%wUI1z,rDٲW֢kmW{cTblf~nM2qkzߜk@sGYu%阱0_́hkEA#fM2iߣW)Z1'u֟{Yx;ۥ')*23*G RX։$6bFk3\l^CI0K~,"p1{&C$nH} _xOCՃ/2~l84ղgdiꡥݿC{NdFJq"VHXW*}tyD\d\xP| Q#'mƠs{ױ:[`xOw7_Dwae̹,掦ǯ;pp -+ ~8bQK -L˳f-0E3w44wk[R Պiv>W.ModH) v"x_3~r|K6ȧS]{wJW8)?7Q]|9q;u1{j/۫śI{[⮱Q»;ږgw?zu`T]qP*ߐ[IwkQkyf~X=yl#_D2`U=wvǔo<bSdIqy?GiwL8dZ:mFsF-JvUO± FVy5ZWOH :Ď +xڍtTk/%1HCtw 30 "RHH + % +HJHJ7H +J79{ZY?o?N Iu@B@!!!!a; A^P\9(#!`FFatp7 ĥABB@a!!Hi +j!/2 uqEa}r9rARR|Á$ QwLEG0 hpBPJ%ByH + +ݽH9n>/ +4xA>'/@=;2;GopF F:B^o k= ?:_`GG0P_MGN0/&7 ` y9"(//(D_i0]V;)#!pTH#&%8CNο@8y{¡M\0*t.PLHHHBJB]76~1=@g H0z} @  :@\pc?2fHJ=P ^N8?+hdddab?6%%0_T/,&"44o`__5 /Zp2WC` rBbB{~x+}!5o췙0ݡ00TFaBYC. VMp?mzA NP=Lz1@xA=6@~ˆY8 3&f]Rpxb@0 `FĀ ̆:A~S((G0!@ `3 5QqP;F[#*y{D"~Db7;0[@ ~G8Q&]D[ŻFW_rN!nxԲ561v70Vڄ/XslAaCفTbad3ABAiײ {U5= eoߦJlQe߰z|(g + +c8<&%#VWm2Uƺ}EU*{7<|O8~Бzs/Ժ~MT_ԇ*X> OktB %Z-J/$[q={^;M4b-0M󭇻ZW;|_I= ?u;F3]X_h,\\Ӏ vyVZ˟DhB5 +=#fwIvx|Gx[*A0xTUϛ[mJ>-wi'S9r|٧H/_4]8256ɛ{|S{^X 1xrzJHP/=N@kt$)E4KHi@8']~k=Wӯ>&Z2H2˱^}b:Q95e>=ђ+ |%%N}&rȢkSHvu(j Xe-͡@e̛VyƓɼ@Tqƕ^q'K3Õ^ |_?Z2%u휘jyF%kٺ\7a5û YIoCo)C9}avb![#nZ2sF=!g4p& kCB[ Q iGEH%'lZK2eY +z\$5@h[oI03.|ɧz1oe8]`'ݹXi&r'y9׫協l[ʪfM=씆Ija6t|˰H㱁Ԅ8/؜ez^#?kof2ErFE~֗r[e󚼷߼GfN?a%QtOዶj$yxE- ݾF>wYKX#EFc.%Iz٬-y.Sdo\>KȜ#à" )[t-s:z 2Y^_UZvTNw1k4k\?c;+AH’VOwa6)4 |Xl1%C緭h2^KB)Cc6as*]HB!eیH LJܾS}XɼZusĠw;09_޽-qؤ\̚eelȃ`Gv^V̗s6cgwOZoa7נ3\vM5+!|*R~u;³"5[?7lb5lKY)Ο=Td=rEFw +*cl|`Z#>]dm* }S0 &$ܛ?ǕߗuoV~PSO'89'A >%Z[,>U=yל.Rl gE6 +{_ԵdJ}V4{E"Ί,Iޥms+M{_,w6T~I?vb$0*&)Hon(zץA)BkBu)DbۊKOp%ػ]yx\)׍nwt +њ-A-l *K䦃m qM;;3@a!S]' +8tAxLU>N>琽cU1sKsjV^/]m0ݛ9kp5Y[?=7Vᏽ]_p,Vv]rɃ_g;wO^h_Uf; -_ᓭDKޯEzΑ3YBSƀCo.gUjigs!3FnkQy ax"Wl[ci@J1J1U I97nYsWhܞ_!;f*ZcA$ÅȘnO&݊48/ enİ4j$dV;>^<Me%I#j fTxtK{Tڰr%gHk3&C&>i {-J+@P7Gz7i6FgQ{iukM(,W |j=gHMG'98ƺRϰU@cS¤51EPl)w8~XsJ&8ܶ7#|jU)T[݀T4~|D\]Y~N.ݯ5.4+("qqMbk# 3s7Rm|LADU/3// #feM[-M;/V5*IEǎCgwdw0l[u(6$ğz|_zM4i9ҖBYnP [ALQtTk/ wbX]dhiN̙+9;:fϨ}S0h`ܱ\1۽/qlPHv͒Qs,3n: e$&[z+48jJ1}RwUI?QC= 8Rf~ 75“n?Yjg)0#3 +aoUJ׮u)әϓYJ-KO XmR}[b۞0 dzyV?)AT\;Cuk&sNp^а>Ndw?KU +F3^1-YgY-6 :N&QJ.k阦B:#%\XU̷,JbeG#+I1O Cʍ4CDkff_#;G'Y"5WkR\PMId͖ߴ23\Df߶^> endobj -979 0 obj << -/Length1 754 -/Length2 1256 +1029 0 obj << +/Length1 1398 +/Length2 6141 /Length3 0 -/Length 1787 +/Length 7093 /Filter /FlateDecode >> stream -xڭR{<Nfd"Ϟ361c̸5!2f1y΅FTn!QZV!>J#$uɵκFmsľt:s~}}q 8ryc"hܼ-OpDa#MY%P+*pa`P¦x&`A\`:| !D1X"0tB<Ɋa0 %>j -BM"qĀ1&0: B?Lm$piܕhFbi\6Go `J} []˺h6 @bؑÓ-C8c5ƶjgkR46O#OjMof#AO Q!} \3j3@#{zhg v&T}wQVkbEKMQH[yޓW#ƿَHB k%Klw^~"LxډUKm}_b[{'S}\(:3 PWYH=^PqÛX@+;IYulWrR @bpR&z`avW_mL%qό-H&A4|N{ÍvݜoO=L҅"YXGLR7p7k=iBԐ(\\_ٲLzc{1u/Y]3^ڮoBBCoՍ.ʹx$қ=^XUT$=d&7cH"wL2g0]Q},/\7"M.N!l)[ - e;Zl̼qtcgTۮ"8vz]LF|t|񋅥1qzV?:ތ78JC|k uTD|4hiEdZzM £V%rk|]/Ja;)*/j~_nZ9ZIUkq'EuhC:![O~CKAY'uh~JrIM+k㐻&5oa†b CUQ6;t Z -ߴY2d?B i{yqʣnu6[VMhkW?ՆrِרYow۪3̹ޖs& f1Xq cMYӚ{'nB_]WmD:{P"9=KC;J-M:$c;Y\Lq,.u\.AP[LҼU"Ųfp<w@ppb`h`gTEJt9x@Fxm@?> B( +P0[0 Wha58O%~ll. 7f@m% ~rAxY~PPbf _ ~A]"V !O۠n[w[`pOfk! VU#"b@qFCQC?|_7D};| ` A`ݟ=T%< @9J[p?+nn?&99(OHDFu@&0;8@M/Mp5.\WЂt pGf"6[Co!>;XA_vݑЄ߮OXl qwo* Y=K)A:Tz(ցA~=3>PfzJPmF%a6p_3'$" +! o|TQ;/5`ߺHTE`G꧈@ ;Z@a6p5[ϫe<6G6s#/pR NeSߓ|y"x'9Y2Qob8UXW^-W?`'&5(5YY0ra1f8!`~voηh16C6nslj#v~XIpP `PFǬ4$90%a ~R[R!dƫՆYOԦJnI IkGyvzE=yԧz /9* +0WUʭFݏXsU7e4:l? T*-m7#%''o媍>w3s8$Yȓ{yAͩ;ӍGe%Z3{{_d1iŶH>>ZU&5NL]%V66'@hA$%.۪X lZsx'#Ϙ0԰H<\H`bUlىmLM\(7G[݋jsy_{PFP'Gvӱ]DJCY>l$In"Bh?^'Y45=oyĥYR//铈+m&_;؍WO7s1kFfn @J';Dߖ]ӌ֗<2%i?-{<2#AfEfNĺw I&DmvB~1q!aBׄu{s]D4*߸z+ܣWu "Ѡ?zno_$kTԲGZKOsa5KKhiT(+@w0B7L ZH'~j.vvovbXd3T.шWF1QbL2j壽~otn /[7:ШN-ȧ[2a~ٳTh}1D;N"ȩ2t7?х\=bI|f6OKzS*0 gII¹EW&Ƣ#Si o \.;sWq-SKD'J¿P1aOkgX!s1˵fG.OR3!hD^Sн`hԅ-cJֺmyvMzUkR;ہeMf m霁00t6ņZǭQwF2C=uԫ>[ +`] j\14iŠ{*)ңmSAjWmts lv| + +͑͸Px9K/!- _)dgE rUYL?=U "+jU]x,9O5{Eu>^1ŁɡT8ƧJFQ)^jaJh0^όG?g^y0:Ԧ{St,`ҏ5w6J*S3GOUn]]ѵZZ`?߃F]"_)Vk^Wu?lfioN~- .8 ̆BqL{%N "GʸR^0PM/:S)sr/grCʠ?R|]M80dWm1aPFf|LYax{♷`]hL + av"Yfqrײ]f ZSu،·1EN*6:5楘D#׮\mg`ps]JI"-hIn21Hrl}ܕE +)ʲƎҧ/vQY'~ߝI$I1Ji,V͊יGDK| =YJ(4YyIgT)tQ;}> ]SVjA#=dkjs.X9G;NC0&2Cr,SC]^߈ 5b!'o}z>0wq-瞍o^ǀi0,|޹1TM@KϔTo TVUCN3=SޔbmyGVzk]ݝ=E.*ϖ|<[E{G>[<9ЬGm}u^-/@yciߨ9C60Z@l)|J/ltY{:|wZue`%UU^Ę(^T%{rn6Z%8q>>eq{Q׸[Iz_>GzLvLgy352 YUB[~wY{L e3󷬞LS |] :UtƿQV(6[\sbnԩR10Zٴ6q7yFSCZ.:їws%UtJ3g,MN)xhi>W\)O$ ڔRMQ?Ei~ t}p5b/0%ˁڰP cr?Q4Lt*;_s*Al*,8dn}x4G<"9P:!E@@z./3k-:'^?(['(c Fڧߙ:_~H!Ϯ5yQi1,Vڟڸ0uWhŕLX~&znd۵%[L-2 h)F\piʻűzMr`6y(VYaWR]s%:U,ۮ֬/w69{#-b20korةD7#aNh$> ?$)lI Pnsk^w"kꋫNXxc}<%g{>'bOp_-rߧ>Qo*r08v)"cs[,P gG wnrcC?eGPpp6c;PJ:`k>VTz]r2B:<6R^h 7~$ @˿\dR]q-%jޗXZ~_KCÍeK;wk 9v,ckXFnT HyVMAfLe/M'lR}% {xoHb=i҅8(>1Fo"-9_ ͭ(f95I~_>5O+T|`[<|fp:":92lr{)BRъ5cC.xͧk[<A=GY\q9ڏ;|om΋@`A35x?++Lf@9n&' Q4}6~Y5:@\;!pdε6UL&z +7h*8k\ORG^OONgt .;-V#B~аˌi!%Cb~KaV=_8xS޷݋ hs + +0ͅv?x^w"" UxO.yWwyK 7yD{/iC2ܤΙ9]6u[KNt;wJ]^ż_vvͽGRI^7(^r\)9]fWF~r6{ 1JL_Ev㑍/i<&K8Nsإs0OP%Tr=lvp[U&3*A#DQ`Q(gL"c0QNU[4N}UfPJ8U䋦TOK/b Gמ/ + +f2o~޵$O%AN>S;+lsz4V9auE=jeX(*$.|R+,fx*gc7چUF!s92ٕbX dbۺ`-edI㲑a4_ؓ-X-CTjp"͚<Ř kYͺDP4?܍6IU`789[L!fm^mEq~IXUZR"3ddm}Փ4ia0|0z+ J6{;8$߶R-,09n0 rlǜ:{Fl页ZrZxX43x1m4*&JzJn\)dq/YX&gܛI'ɒ{Mˀ62()IBwz@S`Ň&Oq`G@n U-}hk҄E^ vKnj,|T#?|mJ33q.؁H".2Wn'DŽ~2 +bp=:f`Y->u.eUkܯAIp]ڟLXBR7UFmłw۠ΏqrSbx||B]!e7g BgK.˳,ڕ>rG/,R N҉5ǒniS4$+ endstream endobj -980 0 obj << +1030 0 obj << /Type /FontDescriptor /FontName /KTQKTJ+CMR8 /Flags 4 @@ -4454,25 +4823,44 @@ /StemV 76 /XHeight 431 /CharSet (/four/three) -/FontFile 979 0 R +/FontFile 1029 0 R >> endobj -981 0 obj << -/Length1 830 -/Length2 1073 +1031 0 obj << +/Length1 1483 +/Length2 6502 /Length3 0 -/Length 1649 +/Length 7505 /Filter /FlateDecode >> stream -xڭ}8Tiۺ6F"j8!*-#1 *TwƩ3L>؄ImEmSm]*jEDlbkZ^>ﺟn)d`p.# 8?pMy$*p&T@'8:"E)8l'xH5#`!oѨH!B(fB 8TE"' ! 1& A -8Acy"p1eV4$XHA."&#$jA+5qR"JGǏPK;dH/ IL~Õ҉]OP.XYdqWAL+ JpL6o Ód^ǚ!N(֨#!`wJU dH}&\@eNk$)TӨDU\ -@Eb2uPzNp*Z%;Bq@ttK ãq KJ?Ij UapўE{U$$co]-©@(I.KڜUUu9{8=o)V<(]e~y~7}@7ũ9ǂ$ruہ3Z?Z{Pa#;޵`qX?ڛ morBOm,@~mSE¡0Qt}Csu!'f)wҟ_ -<L7ig|3G;73sVWtQa3.bؤ7sn7ò6?[dn=DŽ[ܞl:^ cMӻວUM-W}OKCe{X]K7yt&J'=VJ LTv]k>4T̀fG gf4? -I۫,Y3}sF(=ܦ({[p2~Njx+]>{Ct -;A_I=AMuyYǫ^z'[tgϊh;2ՋYR>|^Ck6S:p7#Z"(>*ݶoě[]0ΐq)oJns]]FNݤB⍧ykJdiÌ=VtC˾[q{o=]@w9QYQQv<*hQI'z>wM?p~vWFvFܘ7ll߲]?5y aXmi{gY7ůjQԶ_me/V"{8ahѕK<_[UJӯtE)[/%E-84+^p mwOAaTyTݒg^t=?|Yj]V%kmVKPv91U5;tӶ/e]ZFZ1myٰ&.uwțs?ݴVgF\KgǸ4avkVuѧC!μ{xC9B~gqFn%j::zc4j6+ +xڍxP[-E:ґޤ& "wE@zG4) +HWzA?߽3NfwdƬ+g(#(^~ Ho@@HA ، nH(.< (4hB;j"G0 _D_T@b;"P[& .nP{ߏN0_LLp3 +4QgtE5 C!(t@\<==H ^rA7-e35 ˠCyZAhCHt;@Wi] 5rxs8~ ?DJ.po(`A@nD=0k[th!nP~q}Jp[3Bڟ" F7ߟ:p߿WvP/.|p;DM"fAAb""+vUFsuA4 P;i!?? +Fl P8a_ktݠ^sZ~Я?Oh"0n1#5C?1#b^1_ ** wNoQkjp;@/ep.+h!z8# a=Co)ޑ; av¼xBφ&=!v55К[[Pۣu/ CP/vKK7]CtH{ =z`'݂D UFP@X`fMVz% GϪ-|@89n/ AZh/Ha6 ೅yX++Ǧb6t9(+0\l ܚw$.;_"M +psy˘dBG Kq}*ם}Gʷ&]ٻ;I-jȌDPs+@|ln 3Y)#AB9mLۦrA3N /E< +iJ{ +0utKQw/~n7D#>|Kn3'eZPBoD/0 (x\`=Ya\C,:m7 ]fCS{]i^MWG6*,a%v!hC!kγV|7vg/$6],?7i|tWṗ hbF*}}HNd="pk&؀ɨ/R횳>m!kRq9:_h{4* Q~CG'>mrm cW:6(SӈV"ӄ7E&:JG7Vmwj*i^oiptu .ϯROJf0Ͼg˜R= sos\Z3 #R|EMgjЃXj,,*#6HA+G3݉}9zd?P3Y=o3e9WߔQ1|r9 +v5^[T\y_͚D"ѻF{2} LRc Uu?f֜M=㡧6_@@C<#k j,ˉ*-vcYِ幐MQj6  3?j`>Q1 '<7,x0i^}UMPv7K54"\rY#IXY 4eveVS\߇zQK}Gk% [ El6.7VuMg;xKl97{xۚ _ ` ؎#zb?R:ך]i?=[6M".`VhkWxvڜϕ5g;mp ؛' x r#: +~H1R %6gihqigy/N V9g'-HAr7{a$_`~Ρ{B45ay~) L<JMw/5vjvQXת/Z,*"{DxMrԉ<~umF+1*0u;:>nVRUX|9*"L4=#i|>64/7 kV8$KmCkz*7YzfUn#U +]?zSha셜,b׉n|T$ڕvcx:-FcT/OM7V@{ɣ}N Ht6Ȏ o2rXq-{c0Jtt8۞}Kc Ja9oО4S`rU{Zp5W?r,l~;~c_1aZLQP K0Y8<␜2Z]r+ ϰ<.FħZ(TJRc<ю1W{xx a RK.7%q}LTDn=QtחDwaDlw,O;*^@i7\zGɘ@,/ +1Jm 8.VA>ԕ*/V\[v+u{mޤO ~Ğ=hr!TһdZe˙n3pQbXvbܵt{&_;ŹǗ50(Œ٭%x|);@ԹwM0?5s,cX ?80kЙJ֟AcbKEhy8R2c@e+߄v cv\u/IF;.cL&`w zPc0HhYڦyz@>r:1PQ:J/w=B !t! zxrr(([WhGm`ٚ.yF#1vDG)2y8V$‚%3= ByY7rʫW\_N0.O 50F'Nбv"g8܊̓^yNNNBG`«Zltٓy.L0g)[Y6|.Nv+O?Ķ1+Gߥ}Y=ޗGBr'7d*fq717ՍI- Jn6_B+lv?mu>zEJ:2N]\>;rūn[zʡ9jz^[>N9KBrevle\;lܚY_J%lf⌸tu)P&%#Pi*k +]kqZ1eqr]4l'hj#r`oPXh0C6x&Q!;'.uT>ͨWjxҡ>Sִ"J!L;LJek4J;ች"4UM=y@,xg 6)Mkþz4*KWU\81q9h̦,7<${p^>hފ6jd@mə[OJqtެ.>׻KWP{E>&/vbpA LBR7A"E[Pwxkˊ+m\ȏ'2Y{WQ lj6@e_ 켭kH簁eSjssKNՎx6|2>Q +mb6$/DҦyЈǴm|6'Fʔ ϺqxT QTgƣyii/iaWj5g˯ %G5< |6 Z@ Kwm2LeņWpΰՓ{9.(m,s!}T-5p +_ +`#Ioy +3WBlE4|^B];11X2/8F(?~5Qw>}zk6׷E;N^y_#ϻLQgSIk779,ssL5Js8v]ʝ4 [dqe 2a(6}|.z× , 2 —< u2Zme_3?mD龤=;Ӈ8ih}Ƅm__P)=X %ҤFPp ~6T,pA`Uz?ju + IqP훯IB>ہSGpj)I]QT{Y痯v GVcredYX#Z|?rD`ZW~:T @o2tyfěɝv>UA֗£Xl֕b_p3Ht8&wJz"Wq+LCЍ]Lˏ_ԉ[Ih(1bCkI' ?]<];^?ᥖYOZ ßE/9PhfEd7E9*쎗^rc7 +6_ c_Q}/O] Z]' }<V+ŵp|Syu{R%[ +\h&0ש |J7UhE}'ӴjPsx,?'EX1s"&QpXܣ~EެM}9@%g +40'|aZ:O|ƌpiJzFi*q|MvL)=Pr]`g1vZ>dYgCcصf!F)0xWE~AD*0ho\7)0.=Hg?i0J-Vi M;rJ1jvu T5wM٭*-9m 7]㴂% >k"8zztL:y=::sKU :A'Nி1'^do +)~{dDYȼ}_ݯ;NA~g ߉sBe%~ȕ,Mu҈׫ٺ^DuWLU@,'X +mi--\iUfȈ ]3Ejzs?Hrfˆkk2kejIicVuaYuEk};X!Sf*ay$m?Rworh%'۩#Jn7Fز5^0x%7> endobj -983 0 obj << -/Length1 753 -/Length2 650 +1033 0 obj << +/Length1 1401 +/Length2 5973 /Length3 0 -/Length 1166 +/Length 6927 /Filter /FlateDecode >> stream -xڭ{PTUCr@g`1 >FИb1R\p%lc__I!ɬ6:`sP 1~v]qCM47Hl?Ey -QeS&\Tӱn۽?مb;?Aw[5I,+O<~c.{_..+궅[f^1ǽ}F6G6V=cR,Fk).7O3_f'mr1aatfp[ .0K uu_^lj(tkɸk!;<`#8鸭@$o#KmD3s-unbVI@Tp߻/8K;˃7vݹ2 -x=֙4ξpIF38T, =:zi*'pĽ%я]ZtY al.G.|hC?uvE%#rtfπdJZOtwm!DugOnL[9nDTV.)e3?}vѕ[S&/v5k6?Doډ }^Zem}r2S/oL״Y}ٻ匼u9k/f1|Ev"j빭^?.G +xڍuT[6-  Ct483303t7" ȡA:$D ;Ykg߹}_.6#S!\ + +jV2@H\pq!.?fAr+@ `q6ugBu=\@Q)9Qi9(B!@B1.5ŵ J J( 4`᮸P E>*źɉxyy C\1(" u1p' x +L4sD`~MQX/\P8@h 9TGhG s6@Qa+\ Hhp 5XA  qpOk1Fa1O"?NY SC‘X h8w>"'Dy!,HO07s$'gcsc Y)) Y :,oi!sCq {8@<@,^DE0 |w@ TǙ׸@0=Q /[`(?+bgh-|(o8($+) JK]?7_V#@TAڣ1ohG2|wq6 I#-_)7oH嗛pC\.>pTda‰ߡR6BpPA:(.$*! mG`4p uMG@P:3Vlj}5P$4H&c(N0/~E(,.G?NJD491O/_h4Nkpo803ʇ; +o:Ra:HsKLUW${깟L1wiF%C6m!ϰx]B}'{m[0ðtZ"cD`'+-ku+-H%e ֊3 e<5ac>|A?Rmcw^RZD+@V;D>_b:NgY $6%.NLaEemIݫϿv܎ksz_s쿖z[8u-_^eM v )BAJ|G:?EVo*7L ̿ T] &f&'ȡ]%W$EݠQaljS݀'e3OيW^Hz) :!ʎpac<")59{}O:}mUs_{j"tncRhΝr2QRjݝ-RwUu 5t,ϣ I'k Sj>\Tuj0KD%P46.5g=w"#?]wW'Vc3c47]?>{JtNȟ+­\_ 4Q +]rO6l?J6~i8E]v ZJ`p(5wӁ8R,7=v՟L rrd +apa&0靑, 蟘JUM>" #2Pe9[*`BeˉbbW_Ӹre5fXl|07GKTc>,}_ZL39 a~͝UzT!2,F4$wu)Sէ*@GӣV;Ϩ9f+rvfLCz ~\l3DZ?אx^x0+ua.&w1{I—0{yjKKG#<*Gd~!YhF=Mxf#QˈR@HTC9 nlVЫ9OK IWcbg'ul_, +&v]\e6lDX/h)O35ڑ<Ɣ7dmڽܧ=z6rtJ`Ydlũ +PZd'3}(9YEċ4cK/߾dgmd3j!. az*$1r)Scʜ=ȻH(it[̥M\UY/nd}ڄf鞾{MtTQnޭWi𦧶Xe6sΨ6J, M$*6,c1R{Y}/ma^u D#탩kWGPHi#& ݅Tgb/)rca'P@c}R&7I +7VBElL=̯ +fQwX^탺 ܠyЧzlYf.aV )ub]^:zT7#<ִ.62ϛTa}tY_v2 FN"9)yie+Ko+f~9.+5zeCsۀ*怍9&5[4A`{ G. ưm!vx;Eq$0.7q7Έ!x +H16w{lR}mQ¡|e4ʲOg 8*re2-еoi<=4`f#RKWQ`Ŷn*Mj,I. ,I +_btgogJayl(?7']!K)/qH ď,MR;$mnpAZJ} j-HeցbKtbuqpn<9uGCڭI`d(ɓFB˚@XriS3{{jܐֳQ6}P +-_FGn.{zZ'uҢ#Yv:8nj6$gŞv;EQR\ݡmjწ7_n;g4UOo6 HK2SʜVpm<_m"Y _WJ9bMV"@娞6UWDfmpŌcR% +g=x&fÀi4W4=klf><ʪyDKMzQsONENp'1&_ˆ$ЧLi]߿|q&^Hlr'Mc.N~"aZd:,|ژ!AwDrqziz;N9]drf?3%_`&^9g'\Ѝ[驃;4FBZE_0lM|P+#^h n]LB"\e\_]ʝA6ƫ˂s"jBSs9$QPdPeǜg$V qmu|H-Rh֜ LJ0#$ac?gF~D8/hU盝F}-O~xCFI=0B2&w =.s/6rktV5Z_ <P P ]~4yIEmFU(XCtVFm*y¾b9*_*~^7;ex{9װڍw=k!_z6c9EA҄w4)sJMZ ey)oUD'Le^HRo<oz +VMJZ>aOpK5VGɡ7J_XS8K2w=sy=x +J 8*O/9{[p>݇zSlFv"MĶPֹ/> endobj -985 0 obj << -/Length1 837 -/Length2 1182 +1035 0 obj << +/Length1 1398 +/Length2 1220 /Length3 0 -/Length 1733 +/Length 2073 /Filter /FlateDecode >> stream -xڭRiTSqHH;H !!JP C %\ 71$28S(`@5*3- -Y`*$J]T]߷Zgool{06A"D# dу@t!{{` * R($OHDTw -JbAItDB+f9EtX) 2D0syJK$0,JDx\!`x0$SPX3uR$ `DQqF0H|]* XNmh?|"T>P5u3P"@.rQM?Ip(r!a+4-ąY+y4D a.K`eJ8Js"B>kfa\+7b_V(̈Q"YD|J$\%]6">5wAD24/`f n3Y"y"yDFya??"/̝$ܑ?d\"J{atx.ow1Dyns lQ:xu?V~FSG; DRKK(6[3uȬ*!4q!\2嶅'SΠ@rVSq6Ն'mcê)'_Yi*F2v&#'7.<*Oal \~zuMM7dO>&ǗM%F(WЩMjWL:~_ʮ?qn - zU<^G`ME?d' JqSZ 8#%y638ljqJðiؘ>S5n[/ҮqAo9sXC6kZo6M|c>:RAF9qj -R'?lSccnY1KVlɿI ]&q-r#R琉~/yk⼼,k\iuxg}8p38.Ut߾'V,¶;sSYZxT)VOMbEq~FWްဲ iذ"W[͹K/NkT"k];M-*q5 ybh% n'Wk}tPܿڙWԆF֌R^fiͽ91F 'c'+ҬIYz\ӽ̴/vl[>ʷ|~4X(Vtɹ ֜h[v;F0zUZv]}5YOZ߻RyU6fmZJ_y߳SCFLiuQխ5E8YoK# *Aw@Sc+aR,]kF.o~ |٧SPƑFE&YQ,;.PMe\é{mr?rqoOJ||Ʌ7D{3a@'tӊۓGx>in~$.- QLGoرz&GB`;fkW) _'-UfPag|,a|qRY +xڍSiX  ^AWm$$Ha (0d&N& +r+J"*JQы-W7@HI@'e99yw^槲xoHG !!ąFq!Ac0 B?1(\(DaaJ DT; pB Rİ)D8e0C 2p}Yt R$8”U7" +RA%<r8 l̘R8TzTA FرLĴxBA`C!(t%DX {,7ese a%FBqgBAlx42R,r3Vi :Ø +Na.`dE-BbJb*3M =0\J(Ni"MW Cr\Ʊ:T".ƀ/r}x]P#䘯I0iPKkvLr5(h2h@?F֣"uhNr @:ጁU"@rdͧWMN*֜ 2xHaAA>}Grx?Wc}M~PU+˅{>5蓑'|C A7 +<0C}p(,)O *G7S,~@`52tǀ9hө?J(PӆcFT.(DٻI?Jdpnrx|I61 z]x|>“F˦'(:htTP$0>]O[~K@[~˗|-֠I҂4{ۢn5y 1>'yNkK*+G$=v_إ&㭇׏ni{?*)w{t7f [1im]_mkNޢؒwϛe5uqE~#3Cr"%t~yzE/ +.M QeExaΡǥ j+彗$D3#s}ZtΚTIGuŁm~WkZ]T&;@-^Ij2k/N_ѶդKמϛ>oR͙\XDD^>nۋu]:]8^y~Ja[)\p`غ(*ڧ-Ϸ4ibOak()q9i̅cqv)Уձ] VwoYu4Y]jOΥ<խC_9k9fksoĬb|3HW!e/ыڱʴ=*}rraPԡn +BYfq[JaCĜG_*zx{k?M'ԏ8yy+ՅsڦldS& cP"%&VͨT;fu(4tJ_ZM=|fjLlUqf(ix;l0|qc$wYM85&،V.ؠ^_elZNvU5O`o%y nWpYSeAf%Z?r}-'~,Z˾^ѣux6/vvwaq#sTy)WK8vxˊXYY[Oltb>A7Nw[v;gF&LnhdI~1|jӣ|HbdM#;p(AdUqk^uc{n/K : SB爧ǐcI'? !/o卫]ӊfx3RF9O[;Kzy\L|tYm!C{]cgo=?LȊ '9CW9.H]]ƅqF]#+G ^eR endstream endobj -986 0 obj << +1036 0 obj << /Type /FontDescriptor /FontName /ZUTHPM+LCIRCLE10 /Flags 4 @@ -4543,59 +4952,42 @@ /StemV 40 /XHeight 0 /CharSet (/a4/a5/a6/a7) -/FontFile 985 0 R +/FontFile 1035 0 R >> endobj -987 0 obj << +1037 0 obj << /Length1 1606 -/Length2 7868 +/Length2 7846 /Length3 0 -/Length 8689 +/Length 8661 /Filter /FlateDecode >> stream -xڭWeT\ݒ%!@N! 445A<8Ipw wBpڸo{yfޏ=Uuv]{4٤@`ySpuQuI;@A#38dp0@ Ȃ-.!!!4:3`gbaaw.k up`0nXA`QAMPb PXa.`&3`A~%\m`Ko+lqqyx@\@pf u&`rC!wt8Y5d v<V K%=71@ 8)7s"$'5{- - p8T @=M1w pC`RpseC< `>];C!0`Obit\`ÛC^CSUW(:U?1<oxyl~A.Ͽ_kU 0~(Oke79hÁ0`m石P?F [vyk/'5lzXP_,Tb~S^=,|9p]Sb^NehKg0u\o`Yx]"eGݛIFz+ZoPȇxQ.irh1}-*c𛱫p?!v.z{!wd<q{>)THM8A(u[)\WBI>:6zf뮝W`GX?IՀj+/Mx -qJ3Y-1d (E􎬨Gp(傕үB"ݦm;2BTo-4Jh=[;R>'{çC/S -ZI'=tݿ k^: -gި6me1٫U&46nfk` -?Q3_.)/: 7&-e<\ @if'4Rzo> yFa)vܐ "@,:F܏y&ԟ!b]sxLRRl]@JYiOY>>hC;V0QZ$2'_]}ôM bmAQ Lm)i;_Oؗ#ˤF{10ާknlj[N&"GIW= Y kVTi -k?-aZV@-GkSa͉L1{=^G76,)C 5BWp)4Vͅjv[ vbhWDV]pJ :#N!n -n#mڪf$^#9%4TS 7Wnk|!|u\WSfo ݨg{ׯ`&`Yw\.=-g:'(pe;~-s:jouEyn$nYnJw,r d2V'{ -N'H-汗G ەV<] ֛ H3Xqf.q1^KkeU x#15$GQA-ֹǥm̡]bH,ɐSU',bA"3} x)(?1lL $=}w̥ -"Q{4GBĢ25v89+ƳX93B5їIb&qB`<:}^ټD -Y~5p B1~,-BK_.ekGO32Y0PϏ^Y?~1[I@);]]x'N1'ꕫX#>xm#@f3G?Hs>L]rTOP)j -m 5bSMNO u ]hãu0'sc'+zSn׏o7]>;_>Uc NZZs$xl*Gcwudf.bIRy1Ya'T%4=U˨MkkwuŁk|ś4 *wr4`c"=Tgiy~fkEb4?vx>h,0R'i쁕PU(2p\OW (J(#] -b͘pW' 2'{7g>mV,,zv=ZFA*Dy}lN5J<3=k+>9&C|vSզ1Pj SFrWi (bYHsDRIi]Kێf!âr} h*:]m2[BEt; 6̮4JZO"!`az"͇XQӘ=ӡl -q=Yl PH .F(8<iPFRG܀*.59R$-moZS^%cN!R&I˝/z~P&,A5^dP,zj)^s,ɡSYHcc%r9]#! P|[Dy;$(\Vo&a 5T"`l;N/ d&J>7DZyS% L=0IƘ_&l]n)_qCkqŲgj~{UE#YV -}x(#XA~G@d|b'vŏ klBs} Gوɴ`ݍ=]Τq :]6IjX5ث?fn &}{1#ϥֹ3qY|7aq*Ӈc>סg'<ϻ p8PDQ>ei Ara8miRWE#4w03Nr(\mb&]ľpA$x0,i -0|R -^Zd?M./9Y&,v z܃{s\򥭜^5@Yq-Y.x8@_Ϫ97FU1cyWWXcXARm^;*3L+xa{7\m2rOƤ?ξH9)\2\&^Z*EUr–kY,##%c7 -}uvb'yӅh7r)#[g&_=!7v;`9BC'qDնLa[tYYCAKϧhC*?n$=[jĩtz>SCfO_Un)е9~ў#E P^.Uq )Lfo !\e'&hy-ϭ|kƣz 3TA֕AMԓpѸ'n'rD> .X·Q]ϢWKѤ%4]JN|"Q Sro ;BPCyi2gȺ˼ g5J`j&/Z+#[gɅǰw8fж~EĚ,x3lfl0ć2lZ¼6 Wq#)s}R[UhJ|ܲKGW M2z˷Au^ʉxi el8n!.soo V>!qH=Z~AZ ~og2eaxٽI<㳡ڨ -9kM$5U}0P9ki{B sSlnumaI܄;}Op#Re>Z4nh}N&ZR%ZS`;I@ә햐2)r&; z?)ݑgz) ( Doe/ϺHEebg0̷Jer`?Iz}Z?x"|*$dDž dIY#GnA{S&&rL!;*w]9 *_rײĭY&eB?|^( `+qV.H$~_7`e1<^ @N~Jy;\96CtqwsFtt .*|h~rumRA|$#A+ 5` -WU>/<sq[[y;_:^_Tdoh7| -k -% W;^X;6] CA.e:'$hb=ݶk2MUL.mͶ|=X -WT -f+FH;ԶU0k6b?5 w-\ 5|$!~km8kꜳ]&g O|Q89Hd{Bű \T{ [ϵn`W~xϐ(M06-Qmsh?qњޒ4`ȟ0i5fЗ̰*Q=$>%kwvՈEDJA$@ܦCw{ga6qm!|(nHr $:M)]僶[+$M#&=G6 QELFPKEKoSE`D -gV_ $g9MPX][w҅kv߮>;$|vڎ̶G+ZWr3&&4^ŞJh>C[R'S}"p5%X|? 1iI?iDlmu}U80w5/qJF[RNfͣk-)y ,a[SaShK/+{W/;\뮭ƊҙLX8CF(υ`EM6lgE+3# ",_X,W<1G^\PCo5\)gdlX|i2]Vdj@ᥙ2컣b"G1[eZ=%'0<9)&;}7iz$!hoY_vB,J{q7)$O9Y ip57e_~K۸nנyJYNW@qҘϖ.EHN<2_<,C\9qMZ?h<+|r0xIu/" m'񡻝^qҪNeAX9K6GwsvpV+둔dK.5\sE7n*7χFwV X7{sNF:1ΞlT݇r ռ}ZõRxX=#Glf՝mo"dua[/n?4FbH@}eZ- ,jqM -is=u݂9 G5@TbpK=Ct$oBrDE`>vha\#UOaVGNYcaK#pZ,'dID#B!ƛLc7CVFojpz0,N8o*a"j@y!y #>(PAPU?ۢ~f٧W?Z8-k'Գ&`rK${Y4E6K eDR - nrb pwm}zpƗ) ܣ󏓗J{. I9Zc J -c[D/_* -963 JȧoTZMV{LpmvBo33228Kg -y 9Vs~vš[S'fŭczQ(XwNԂ1Zy?c#.-$Jʘ5jG.+%;ޠrʓ\fyen>ʉ[QBo<0%^ ^Z4A׵LB47Qs7wx3Zs!z䗰}Lz9Rۤ0b3Ɨmԁ]V: -fq .A4K38"m)ou5(8p]r~; !ޓ.!8ѡQI -*f{} VB؀/o9bқ[HgMMW9 fѧZB>a,=3erFY\g8F & v렍c~1?jpyG\8\oIQݢlA2;do.[l7F{A"@ګ -s(&hV {RJׇXAenB6a`~L5٨'19O8-{Mȼ8q︿LsZD;Eߐ=YDkcJ841۹czDJ OiNL lsM-N\i]͏,K;Z 1X[,'#kr\o Jhg~^؂,!.W;ySWk'KAu wCjO7< #, M?05N 74߿,(A,VDazX:~-sgŁ@7%$R*.-3<{PU{Jw0C\rhoZؒDME0o͐]m:`^7G[.k>x;Q?PE ~.>7-Ajr?cr#e>XVŒ5 aM ъ˅GO8rbOʟ6Ccs M% _UUj+Pچ{rѭJ>=bN0Xl;HR?qz6J0@t~ +Z_KyۢZ^TH\!8q:اa:fNQBRҾGe2|xCf6`"rLMNiteLMmd2&Ƹ]eazrãxZb4Ѭy;y7x+# 93%< fꢗx z=̚$RD:q>x< c3|eb6xIqr@XLyz0~cۊ./E(WrJ!_Б Uw:ɗ@q@L_PPY>p I8:Z]Ua;~5-Nty66ndTPe)oTx9h9I|=ڽ ҖrG&B9LumtIb[fНxE&ʌ.5 Ms~1Y:0&Io+n@9W;n'ϳhY,ԏ~ }v);vGA /~)S hS} MRE9kH:-#oR M;|:N? kY<@~߈1{'.I\ՁJ/l]}]="/{RQi8+['\4}%ϋ/_ĕ(%x)c?dZا6tKu|ϸ%Kk)EˈI DkX;czLՂE5fG'ÑCY|RA/"륻;:G>ǭNeU'wxl*oIo;|o+ QV?%N^\Bzzt …rP~30dKm:o|zd]7t\^Y\, _/p~5O1t\vefd[5VۮX-qP&ӄmu-`K)<a}k(KBuIr8ɫpE$Zw;;Iʿ")A뉋 )UȜoNɝ{bzgXNQi?XYaSb*"n6du.6,4 +qL +^t{f2g}H p W|9aQdnYAw&Udz*FWsEEmD4OVx-&,~T_q8~Ѻ_s˴ߞޅl,99-l =0sH/3Q73U;_Һrir͊f. 9ڴXOF}#.dyX^ZYA#I9o ĞW*vW9ƧI(w71;՚b.p}"Z8:e5y*2y$.chms5F.Ҹ/]p)Gg""rؓ1H?tČ:jvdd~c#L3ƭ8\A YbOgFi~f4^KN@Jr_K5ʌڪ{I4>ڎ}]<#Cm>[sPSֻ{X]1~J7i)aM7o.ⵌ,v7CI2E0=n8F_a85{^cx%7G FRN $lȎmt=[?늾Wh%Цne=ײ/QxY,PĚ_'7^NSЧ)*[d0_OHQT۠a OQI]ø5ŀh I߫+B 3j]j6SDSI=-uθ_ЩPHVq;9|a,_7Q wDćy~=}aX;rr<V1xۉQJLJJTR(*ubt3ׯC7\L%]=V9/wn. +ld]XL7V b}S8P4@:se4^UƛI-%_X]mlO)rGũcm\9qUmr OzIRGtVԜ"¤Y[Qƌ$-򒂑$$!//Mq8r4;(UywzAm 9˄Al źo?s*J_>Ikt{>Nhz!K!ҨΈ]QS.Pb4 )=yY^oL|F@<3um,uq'4{i%S'oJ15=^b ,:YH!o{h@9aqALfqCӅjuRwsfڷ?YG8 *fn.aT1lR%l홃 B+#R\L{oM[N4!bƐB5*YA;CxI `5ѩ2ڀ2R+ɟIgD~$Xusϕ u>X?q> Z'K}}6 9#n\̐*Tdܧ'YUeIl)Do+Q@f{KȣY64g{&Sc + ugLT<!o)݆_l-ؕ0Xxw {Ne, :'E`X$n0yŦ2c;.ךޫ?9I]N,|>KW@Q#4X6tqyà  O|?&'S2f+WAU]Hz%yP6hO:_^dQlbqE-e.~  6Mˢa2H15Ė,uk4IAuoN7pw`Tr\$*+3J»o >y0ѻR~Nc*Ab50W/_Q{x5hŮZ$~P@Ĺn f,6h`Y|sMl'1C޹ԗdp4|?yz$++b= }@61B_ li5{{v( *LuW- +j` s \cf1YQ7q.]52:Rٜ&AhR]$˩PcLNeR)>g]Me|_\ \h SRHjSXj[G7?>x!J΍cea_ݟtDuWx'Aͼ1ڪ7/]cFqʑm'(98^U*/Œ,/Vܠx $ˋEBުD!/0SM~𕏱('KY3S=F&Q\є},l>x&3JTh"_.I=R kr ` &y9J9fdNJ^iLq^MƣT"&H[R.reQ~lZKbSWVNnTlWc==:YeCc|KYGi9'Vq uAoťi\zz +f +Sq~lR]_ݦ冻3-07HBZdy x䏅?!Iɜب<+(SdȜ%zy +5&cu&^ +Tvf 6j^?~VEޕ}!1u^|ڽw)ɖܗUۀ^E *$ͯT'*1GmϤdKS'ʖc:5=H]@*pR@bݰeE:QkF`&UvL6[ 8Ja=m±V7]@>$<\qZipO2~>{ki4*pwcT# ]Rl gSݏ#"OaC߰\[$?|i튅:[ $GEü(@Mi!OvEy(?ŁP48_in~im(. ZV=>xwa96wqJLviE~$TWqR1w/d`LNYy@_6lʕ/s2E[Id4ߠ/0( \_xHt1ZBWk_E:Ct~f_!tjV ~ n>75F)g:a}A-uaq&=F9\Pljۛx3UhpQ7zbtqW'1Gӯ2+YkJ%6ЕIf,o܁FJ2.oI㫃 g9SQɹ1?'%0(_%9;-t_[v9u u"/(1R坿&dݒۣ@ DZyuþQK#+blY + wU`6#\67_unvXAU`[Z#AvԆXNaEW_&\OϦ~ +Zۅi[_~1,>M[ƾV@:(4v}.V.X$Ip.N #nI2:2#&_/,bg䐌c?_RK~.$M )hX ͨ柡 +X,aCuql6y֜}u>CYh5eOtVճC5~ФQ*@5ۋ6FlvieWl;ke_$8n2F~_%hxB/!%ݰ4zy{]<_3Uta^tj/i,FD1 Tѓv.|gMeiHˈB! >>1äsQ.RÕC{P6 <ւ΢Gg[:PPe)%M}WQy$nmi kDdц_(m%jvıՃwk!fԛN)MbkGʣ"Yxt'wް2*}埏pgMMnCBQ-қ̚HvzC*K7]UV_Omnzxv8J4 +7ЊPiՉEᦙYu{Samu&2W9_NSB^',4y+]3[ܨ=_u0Ch(ܬ˿|)LmR>׫gRqdZ<3 ++aݮx`u(C)lԹ\{(Z9 +K04jl VKݬBL{_$xʟ*wd(y::V"lٲbyq-s^t$HY:e< +"9[ɤqoʈN n`HnJf+vg&xM7}Ν@~:$nleH);?}L *ozWd񦦜Ѥ!/#G$33'8zߋ#s/|پ]_$%?kOz:[!9c: 2DP91CE>_賑=ܹݛ}hDTCg;9rQ{?fƗE8ASb^ L>|Fhd\-k7a7^Yr@C,r{R[n~eXtQ;dj%"᭔|In_}or7sn)#5ɸ$tN`THή*3ֆjkc5'ʭŖ.6U޹Xٶ?  ׍1 i?/>۠9qXBZNQƣ]Rt2@I(xu׉L薣uim$I, "u=ܒ\6 HEp5{8cͱE*/BݵYDJ<\y_L&RLX;q"xx1FV{qziݷKuũə'[uF1.IhUchɍpՋa3J)XM~F +i[TJTşx˘rvh-@D8 k\-`%3M 3ՎPɮ%s?Ж_3Ŭٓ/H3> endobj -989 0 obj << +1039 0 obj << /Length1 1612 -/Length2 14157 +/Length2 14135 /Length3 0 -/Length 14984 +/Length 14972 /Filter /FlateDecode >> stream -xڭct_%vvlضm۶m۶m['vNtb~UUk֬jl2"y%:c;CQ;[g:&zFN4 LVلfb 6103888`BvfJE5*0M' 3[7E%  $'!!+Uؚ8X] -F&N&TS;G#;[cJspM,؛8X89},f=pXYCnj/Bv6߾o0y;'g'#G {gwVyat67p'ŷ`gilgOI}|{ ,l&24[8[x|w ' [d@ p413p46qr;Y'_8X8;X014rmfa ϠHؚm7vDP}0009PߩL'-&{BX[| {kO T37 gfؚ} Ho9S8Z[ؚ|+fO_4DiNWg)2v;1~~'dgb?d e -Z%32ϓ53gV lq8:~]5&&&F0+vF\YyZL!eMŅv}~{Uu!ͳgG}&Wx>$T]l4G ej^Kһ`?U~O+(ꖾCv8B]?S>#5ơw#5'ZI$67ĖQP/2AF9Pb&#_b,$[hM#v+fp.l]Ԉ bKNGS;݃rUDϡҪbRy`9^/o4|P-Eߓl ЉfrpIJhپ T^)7<~1ȜѠ- Pao (6̦SU)^mMQ[?(8!D|!C9@\qcsД矝DF*NǂԔ+NrC̨B:Zlߢ,`#;ϢՔ`h_lS-˙{c'[^ڃ$<~6-İe4R fI5@&k]*0ťa?J"AA԰U@VF2ңUC~X_Yc]6Tw1 !T`-gDdEv4gsMJ[M7@ cW(دGC > 4)No"?La'|&6fo\{+YVdVOEzyf=)ua3=\CDt̀T\"%H9СIw*4:b4y$BLwYLD?"GcmkV!Neͧo-C(wDMo,& -xB+؎==,wc*p1kpPT#UFfى̩"!pG[7?𡜡&ŷvįfrPT/ ov*39nXDZ6M ~"  SHY]j{>gJċC8%ܮDlc׭Ɉs^+@ZTnsY\5Xg{رAdwu}S_3mhdj=$o]8O_ȯ[6$ImG}7>@UZ`\ -! -a0'=r\A *.o#z:1("> LxWNbA?yNth(!JL=)7;<١ln5Hof Ye3 4{Ρӎe Ȯgw Q=7o.o.…w%\2bOpDo#1Ւ?3J[A<=6\N5_pPuCe7_6a^-di kJ|c&D5LKHGL 3]]ʱBΨ -?~!W۰/Wv)Yi spH DQ53)ERyCd M -Wv"A%C9U<6EY=5\܋ݞ'~[zLq> dLO+tx2W1BJ"n:;LbfhNAKFqr7+vT ˢYI֝m̡jۤLB>sG8]$A@[Tu|:ngLUdd.j:$19poԶ^Հ  ߝɌ 3g cH$ noT͖s!xUS"y,dU'{@JNLtkdJw0VMٗ:|yp9p݌0QTrXCTB\~cCX:ԫ=*|wd)K?}ͨhgr+9)HU:J<8F_In?(=].䅽UMNƢ@B:VN٨d;GEZU.!E&7n\ݓdBoJ91irS^0)wG 31>4RhZqpvjl%<<(hٗSo{c`p/|}*hƬo:ۍ.܃NQyRVIJOTj8[1Q(m[[1;5 Rk'k!ak?d256uVJC&}+A){@4V ڄԶ,$*69mXMciiF%FZ+A_BCY3IPszۯT8*KRoVݫL;!~k'Cd̓C;I:8S\dTC_R=AadA=`Ug2‘!߃WU00{NA#N9_3:hU2T&6LM s~ a%YԷqڑF- =(k㚜$PB(\OE7m/4977wEԃ"_MTh@d56qm6dSo*jv.Y6䝀sp뀷ھw$rNQ^hNo0r#qOg&`3BQZR=R~k`_,"0 cbXO3]8Cy{5g P0/`ib`KjJ&/`wmZ- (MVob=GAO e/F -1%Gv@gt6,UV=ƄKW0PSOu3<T1w[!I{CrI$/8};{eg 1KE?$Qrkϐ*w.|ɻ׷ T{p]s,n-d|r|,o1qS[&'ˢ£)$|cy%{~*4z{T1,"ʣ^M,,u2juXIu2Ye~/ѽYr t*uf- -.,[To*Y̡Xqй 7P -^*eZaJB.tE~%U-W49Pk -'I Ba/8 mV6 LaH_՘p]'ru2sN^ty,}U"dJA:P}fzLo⓲g*f*t7(cy ܀h&gy -bJ@Y|hRmx_ȩ_'Rj6NamzYe2d}{*ܢ2riIhjj9-k'~-t` 5Lf/O:jgm^DK8S$L~ 0ψKu: `07@LF?^!=l3\.c5+'OCmp<|^p *dbO}ML KDp*ޫXztziQ' tdbKer NMƴ OiF;:/K -J9KA*S[$,=A "Ȑqս9?3C<0r_F)+bL04<*wrY~M#18>8 U*Uii&m9rCW=C`F5l pz 4Nqf%t4\Qڻ]vʆ)Ͼl>'Z .dni 17X|(rƠjZxz?<e(v-> Bܥ{}ffCd}fY>Lc/ td <ECaEWONg)-KW{8(|aSQ1l#{KRd;G+x UǬŬe_}\n^Z\ 2Vpj P#j{b_i+zoj@p::V!ou$Uk1"OÓ{n QzedRN1q"JGTC›{[2J+j,_VVY-!rUDkxM5 P[b..NehB//R\UTef:b̒IoR-<9S)ِ$r9ەqEu F*<]jka%opVtٯ,t+}ReK糊NG $e[e3ܟ8;oNzlO -e"gR{P EbZ#ƧֈZwN!­0 GԵ$#V]G߸xÆb RJ3Q_ԑ9V[ vpV\eδ )5jO{M{=u{'w XpKDZNr \yuC^!RKda>`1i&`wpI-B-L[-8[ -N?B "`4jkȲ -<^W4 - 23c@a4kmDz 4^ LӸ-%+,W dK/hhGZU(Pr!`ְ+ Y Mx댪3$2iFfH{|}PiW^zPl[ki~)§yx@\.h*9=!sD'gIY2M#m<^ S#YP|V!ՐdX(r-5.z=}zY\λs"#v%b%ϼE&BT$*7 NzcQ )2{AK$vm gR1ҹN[|9bU S2gRم뜋+a.&ңYϤ$&h_*Nbn~=o6m*n:̀evZ JI:e\{%r0 -;OSHha& xҡ7hCΦ)A*/ @%]g@@oU !& xGPy)aƄLQFnlT󟦛XDĵ?e0%J#?/Ywgh(#b~lVw@ N9 D`XPTԭ{.Ԓ:9b7Lzl[Es0UUvR\J4.ZG!=&j[P.eq?yR֛Ah=$LLG*Q4Pn؎kU@_c7u']S4@Ʊ, 6Q@v;נj'c@Ղ8PpD>"hg $k00` ][~( Q7u@idt|m6+.n)tgx}誧%j$vN[Ʃ0C{zp#Y?6|;{ʏ_,?P]+ǒPPCȮ; Jv(UJX$kjGBڌO}@q(u̻DSéR۽7$ϝ&Z97f O-PȮI?*=b~h!&^"bM3YC)8UG?{K&sIE/87b|AGҰ|NBo7LS"^fh6V[QdN@8gg?}ٗ]1=X'ܺ -}OMp1G$^Wi}8m^.fl~cS!Wz32D^uXhAV -?Dܴ9P+Ѫ_Qs-?@Xi`XRuqn| >i0qr+Jd+Zd҄7db6-{D1㖀nQQ"mH Nz ]h|T(A(C⿒Bs􂲣8-?%4T5Mn;Z"؉. {\s?ɢQͰ{k3ק'unBa6%j[FYYrVtG\Ta Enca?Ӝl7m)PVЇWMVo -9ej+Ic#agzLP?t^KF;{.0*)0&{Vy`zi0V{UFCEPbxUE_yDŽ@5vCkSM7L!0"~R.>')&B:hsFvhyY|ҍ̗8xj'A2?st(Ag] lҁ,3t=§8g> ˌ eDf8n&igVI@goE\`TlyGXQjL#fn&]MuAc~>)1#MAQ5_JlItkޑP~y{N>][!ٯa ȶu۲(f:R`A"?,,5.koI;rQ(($"1G KS!6/#lhS?yȴM1T6b5$8VRc HXE {͹8wRF;LƐ0- d"7G#1:vq!i70tl*Jv;X٥qyZGyH '$d #d4{,{0nڭO">iτt]N -B9eǒcy2AXL@m݂ -%0p+WaP Hڄ\NɐXW^CIp)5gZ7roQȈ_*$"}*WXAb]yQ~$5INſvsF$NE\M̦Yg@Ssc_EL9(5Fc0Gj#f?$$Sz%t/f&Is1^OO9O߲Й}SuЕߔ(kbr-`؍ŠF\ݎh|AI38(GPg *xا+/:R<|+)J-,ݞd)=`CNk $# hoQ:,{`3e@sSJ̥Fx4lZq1$¦w vJlYԻvA뙦#m*fcu(L(jB\d,].lB4-|z(jtO[1dIYA}xp$뼊(2c/}n6USaSf7 mm蠢&]\O=|%}M; w@+L[r6L&SfG w2%֫yBuuW <6dWLIé31T3 rBY=dcۈLs8]J:4zJ{ 9YV}8\_8[3e j%2PkwzHiKDB1 H. -zC`('OqnSjqsEΩ5yM*;K# -e\M\}57Vl27Q>- <:וּ%[&qz Q&V1x\4sc<:G͚pQ]Q5ܻcy=t.fi8BTdvUiYPn9UgS*mS kT$@A,)X"|+Rkl^^J~_ĬGN>ta`p -Aԃ[_0j1n>c_sF,G1yі@ L+khz( ->o9!-.:h|a6@ -qe(s*,pp@#"0eVJvOIֵ8\R\'UXc+Bdvs CD3Pd01 *Zދ֭|9T~e_U` V>c.; Y]P$5[G޲וQu2Eh;I!h6|/ntZ@)OgϺXC3&y_9 8+Svd%c6nv :jYq tΫ{#'PqGk[L<"O!,q?uRSim%鎓T<ezdθo~8hN(uϐP$^mI^CJĴ@mEZec@x-u~)Ԑ%ت4Xgt1ʉ}erSLlgUL+u2KQ^K0ԨRKEV); q!34n6 -?w7+[(ɳئ=DKC!/&௚$3ze5:\qkK4BK9\HT˨jH)Қd0+'_"]GVD GP)%ӍvDOflx}3kN۠UA3z x2}%C؀rH3\L@l$N&"έ S` >L$uDT"P2P ;b8Oae"Vh*`9o4dSh -R;r^CT~E`9Of|^|!'}jA Rmxxٻ2g[gYK}ST @u0;^e_PZoEaKE O>sȿۘ} 'EHYM4+aJXZlvPU,7`VZ}fٞf>m΂].%?r0^^n -^ohNx!fH%?*&~qԴ?vr_rZtY(m2S ~~I(3E\ }F퍣9q?*%F@<X.|hqCdGגLB2DMz.ڻh+xU Y\w/!qd(=eF-u"' Ďf-'h>K ]&F[ȉLmZv-S*3U}\L$B -&XA8:?Cq/Bb!Vח&5o?Ck['#%lGIMFƪcH|Ht7T($M&'Y,11JxͰ9{{!Krxkn"`HK` 93$1B(4Lx^m'C_ -J/0+/Vv2TP]T{"[(o!FyJ8EMKUKcOWWOsFx-АM -A~pEm 7>oqϊ"\<XǜZ^H7&=ՋZ? - (.Hid_GZ/ r2Iλ-E͍VTV@ŏpIDr{M2K4i ҲT)`#5p4\/ wbxVSNh.KFE=VWM:sl"Ew +xڭeP%S;;64ָ5n5и; ~ϙoܹ~?*ٙW̕;#LUI(bbcf(:{+9;)2=\TTn@3Z$vv@Rסc``/?!s{ @t@6@ ',QnfUs[ Hrv8pv4wXb3 5#h`v3s`dav+rqsLnfͪ*)o 3?mV#--<)_0 3['w '9`i`7_07pu/7/__u\\|u_Q-`Ō7onk['Eoy f/ 3Kg'% +E7%Ne>$oEF#ZA{ng"` +7su?\@Iȁ6C ̬6ںKz-UmA6+3]`迚 `bce? d/,*Rj SW{_b%guC\ dbpM/:+lKfeW_'rpgV4@fNq[xU_/oA!vY:ܼII^6PF͢J?M?}N]G{qhzR?) +7;xYK3t\-*nCsjN!pz ,¢|tA HkDkè+<=N:~z깁; dȍ0 H9%K7Z|@zx +}Cd>Kn^ 5)hãʘS kᰏ"]nob\=7Sq6amC3fõZ qo +{xGq;5K.Gr}#8i'?hq ]2 /+gSt[0 -a{,oɍ[dV&`P|`Sq"Znÿ f7%2SS?;;ZZMHĿc)qS暨Ms3EmSE_)i=UG;$Z@EL֧ +XL3'Z:`_!%>3/:Lc1p)};:uZ*lv;=M! ȳSDKhmK#ɀm, +mi:ֆ +;DNDO92Ph0`BmB/ծZXM0nEHwzqkF +qs6& +1x~PSR([' $`;uƐE2C`X +>1@(>tw(ȳ}v +t#ΕT|HgEr}en^Y6m*61wqÀπ%r~Q9ѵDCf#DyxBcfqa aiFOpv%Cw*QΕ@u,oN1/oѹl6@Zz> +pmߑGm5=}6q{ӂ-OLmI2z%7R#:.` HOꇚy"hFaP$WV`mͳʴlz'L]_vͺ0<>qe;Tw;#x}u'(S-!-V)Aaz笿X8,cR4>nն ~qG |F8>! ) d$e"E=qw=(UkYI~-ԡ( an4vQR3&a6GSfI8tʀ?"8hP6BdY*W$pY_/,e$gٝX9Vq1KEUC|þ!TXv&)P'/ZVvdғ+Fُ9 D`8?i=A_ipD-b*F޺0෯j$=sԂ4LI[, +bAxz N>vS-'D#C5h+sIڭo.H|LSRݘЭ[`2)VXz碉lx\&z545s 5_N.)Hu`FV'thk U8I35=!22>?dz),Pq{ʤB6wU補v}8>Q7Z`hSEՌz gò/zu؊̈́6F +B66Seut`ꃔ]\"9#NM#0]|`{uf~8Jc*Lq3B&>-TvՉ9S&r|40bZ*c^!6ev]3iU}m+So!]G:b|liY:vלo~5!IV,;nPƂh]SW< Zf' !;gf![81ϭ(@$ASbWq.JIR h<6aܖem逯mKvwK~6167 |ޭx=ݴsDTCD<ryTŋeVVb}dan|Gߦ/ +,M`L`~4QhAi +z>ȹ<|(f>7)m%&0:u\)Πi8gbnyΜ蹟.ށ9nȻ\t꾂CŖw wTf~4}4~c#Cvo϶ +#sS-@;*YZO:;q768fp7CϏ)?B{ė|cР—ywPKn&=Kh83 vW{4NvKrB1)Ҥ/IKzKkMHm'ФL[&gM-MեvI?0ޡ>x:uVKoաK+%vWH@$5\gNEuF%r532@LUƛ|b!^pn~5s{2 ӗ @"}<]5|d}Di@;ýjj hOpt}Q'[6o|xT2gQMGL-3J:l6U%=;V+d4c!D{fwpۡv$if%~Yy/4;3NTl힎5+v'~.ވAÍP~(Lo0trw澤'cjCMDJP]rc|ɕ'=WrVD r1YRXֳ:`)jp{Ve->b +XXUH5˶V\{=}A}|qmW w9tT )؂ω>}c OFkZAcx7Uޗ3ؑ5fYT>IGF}S&癟 Z|m=6Zji'|#8]2iW5=c~%%8Ò"A %I[?G]ǦpTw4 +Vƞh.A:aSD}Ag>6aE2%h}Y bt/L!ƕ;lἺCbFvLzit9(s]OAhf$QɠТ;~ORN_#~w;7n 9T##%sSiRYQj. ggCkJJ㕄yόJS|GSu :8BXY/Ό>-1AD΍ףԟH^';*Bfd Xӷ/ +؉4t:%=%qT +C\4 ,#FIK.d6eH7׉q@x؁}$&^ 0dg><9?`dƘR&(F,$@_WC1g`j|,"|$εSpH\(^+V'OCFGPaTEkz;+)lS"Y)*'܂u?ޝ |4L'Pfռ6xU#FE= +"\A3 4" vSȀh+P "UBz|6e.x>Bi19֎Momab):`e7qY`4Z*=0 VaA5wjȊ׶Rw/[Ca0GB P 0s%083+!'6>[[< ~!8iĉc2vђa~*sϘs}#ɈsUcNH9@r> 1Mg- [F4fyҤz~gYw*Ac'zY*ݮ#V :A=#N!Asr"U D b1{+ nmǩ@T~ǫS`A +:'U}NeV.nX>㖬Ԩ7>o15—+)6lDEdhJe2D=WϹ!ה)~b/"wx3$9Ue|$k@Fiy qI2X)[Dl{~J{4|:g4Rl§>*[DHZ[+?*jM5}*WrI9UynJ%ƐJs2:BT1waܣѠTI:!l%R f/` + |mSv(E8Q6jٜ>Uʯ=46r9\d׽.'Gqao[Ol$kђXQߥل k-s g*Qlj$B~,46cM9gT{7(e%3YEA6آ7I ͊LW p}a=m.d6v=- #P){཰- i5%,@շ]߄@n}A[LԳ0M'>؍*I*b/lE&$ɡjxk&GeplN{UcY}Qso݊ӄeW{gCco0WW_| 5J ()2\kePd)(~;d{[T0j/aUtq/l P-U )HMGYRx*?&J41Cs+gXarSU?: xɢk`o7/5ʰ}'ny[̷y J>8+;N)gp;2-[ +Xqbr RSaBJppF6*Bdg_1KE-Q0raCLz%&fjKSff,o6U +١hЩ𳬧~bo]O?f]v&2$1/`RR1Wc+wo{u_"okzRk/cӟ;=K4O9|<*KqSuT|θi^\F80nXHKoӧL?};俄&iMU^%fe';~%7;n (i:WjƦ@p؂тRE&;z +.Bճr<k`٧R]|mnv16YL_GLV$yuM.mY"qͷ- ۻn&,UUA1i!\T @LbCubH: < +22X6}fDu_b5wބВ^P͋ TeCf>Ji>.:p?WKaYe 4y# 1)f Xi9֭UN!W!H'cd'pp_CCvPqU+9Vkuz} iD +hqp^WExDd^pvsd>fjF-<~Ň~ эh:DlQch2i5N b@h3J=%zbߧ؏>xJWM +hWN)}E%J##?`~lY) 뇶c^]MQrEL&'8qr| =`Kp!|̮ۮ^k[{Nbj!=NC11`opGK|y%G~.E"^ FRϯwypcpS j=Ա'|lFZc%qܝV99}>XE͞&zĝC/܉m[7l]8(3yGL謁`׌Ts^TZ6,3oo@+J80QF~%Jp>*y8}APS2M$-dl iAДCXIΧ[98yYS[YZ aQ\?S H麦.exq gza0MUQAySEO܌o;V~, $i}ŪW,[u\0I vis4sFtfK +~z*@DiT?=$hn AU:dr/j~i@S@DB|_Z#U/I_1fJz<`6TeG1Glmy׸p|KnR|l1!l9<4gPI۪|ׂm Iɐt)encj}D2O#Z`Y.S+}@|MT$ ʥNЮ.fI]i*Vjqiel!Ҳ\[G"pzc#qOmE &^ 'OQ_C$6QUZ s~#KL Ց=AM0݌ZIY-@b#q*QѰWhfN=Af\ 1iP 8NrL,=|6MšjfB!Abkqs뗨}JMS?n]7)A ;&-e:"cLn~a|u'$>]R HTW)w-=/0CoJW*b}Uaa]WZ|XNb9h,dvǝvgƔu/N`k(luk+k;$OnmN:_A%LtP^+k(.N.Z@ȟ]"E? =߯'sڂ>8\^2QȡLzYhfl`SأZ0g<m8z'7f3̆&4w!)+!gb@TWWV~8 MPf/OOڵV˔%JQLbl^U.=$F` +. sjdڹmLxrhG >zFoDZ\Px"6S)c'1W +_<.Uʼ˵E(_yw1bɂIĵrzLϘ](WӎW4|k{I7O͖6Kɷ_}m2zm3+I.[5_Jdt * eHYMGҍSo%#k (tHIeոҶh̷Oo]f F"b5'V:پ\<|nqsFaC p5#i_-L>|ib7d]mTjm(of4U,٦ԇ\31xeE!@on0-Z)[^&LyG`ֹ: 'НzQ^|觗FbP707Cojep?ZZaFqbv9Kt&;Lo: W}D26*f|() q]:BSdzbNeefJQ_ïM7Rqq;pfV2RrE@b`R,|ipԠLUujHoF.g\~u7"&Rj͑ASte_AN` +筢ojR +00>xp03DF {rHZLY5x +à&*{;'0e(wjb"']Tl/[V;X[ŷ$|Ŋu_OmQ,+xQBFa;qS}іU/sezeˎ-jDFØYfNEV1$sT%j؜/{^y>$g媹|3d=&I3 VOG?os(8 L<ܒMlRޘ8"*ݝ+$ōt32<^?e.o8&5>ttV.Ozyr5 rI֢$hm;g.2_|||hrP?nfUbC7dLIwǣTlKS +'󻢦B2i2xD$ŚUM^V$L"f!~ J_n%&HP8A?~JMiVuUk o9:sEՇ!PC&"Bt M0#u"stK!S;9*wy`" 6EfunY ՎBWҬٚk]<*D)bw |1dz(ÕW( Bw6dyRo2bMCW1#Nt?N+SݺYC9kFߘ0Lt ݿ:#4^1֞O2APuoA4\7Êh7wq5P[%>-0  <) rݹk\,W9Y}MFkn~d3Qص3lxyV{ǁ^x[™Ҁy%.|I@7c "VCr}{[UVkB{KB4GcG10{{yKo5W߻a)Oø뭹:Qngb XɺP Gyۈ; ml((7;I8q@l IVlb~2߲ŵs7}cnPyUhi|2WuĠsd펷hsLR(`+a Z7YRJ GJJvnRc~_l~Qf]|P,,Wg:0;IK؝ nvFjl+A 4ɭ.Z3{m}C+7+q~9%ʮHXN28<002k Os{u5b&8?8>B} +lcM APEuuZ𮜖Odhgyk[_I݊9Ś&f}{!mQ3lSrM]Mpji{d=}b^Qm%=[$#]I))KЦؼTpL /$7^uyz$演-ȊSȍmvl.ВG59"5ʂ9 mHoqs= zƯoQESϴMh3Nw˙,4V~=9VZCCY~xhn9Uuϡ%-6 endstream endobj -990 0 obj << +1040 0 obj << /Type /FontDescriptor /FontName /ZHOEQX+NimbusMonL-Regu /Flags 4 @@ -4683,52 +5079,57 @@ /StemV 41 /XHeight 426 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/a/asterisk/b/braceleft/braceright/c/comma/d/e/f/g/h/i/j/k/l/m/n/o/p/parenleft/parenright/plus/r/s/semicolon/t/two/u/underscore/v/w/x/y/z) -/FontFile 989 0 R +/FontFile 1039 0 R >> endobj -991 0 obj << +1041 0 obj << /Length1 1630 -/Length2 7924 +/Length2 7902 /Length3 0 -/Length 8762 +/Length 8732 /Filter /FlateDecode >> stream -xڭVeXݺA AJ`IJD$DN鐔AZ%^5@!c)B!NnQqh\_Z96 Dy $ -0A^^6@ #z,ll An Gx?;@=` v^j)k(4J th>b P[ p  -8XC!6ߥ9d ?~ s -C;lApNg?s# G[Nlއֈv`6aQB<m\`{fX@!-6S?'@y]qԊ@<2P=~5.t;zǿo4VF"{/3h[C 6 #zO[ڃ_A~ =$enbn?;5& wu?yde/A/@H o"Z=&ܜp@TIoKwjA|6Vyqs*黊ן;; -Io+bI $޿\_ 9OC9M+A4o} ݐ/EB:" P:4Sql}opU -Yg-֊g8VNc'6Xmf?llěHH؂Bhiy?; 0J$F'H!J4$eWkyzt55541,/|Ɋop `a§A28!T*gݎW(ª=X'm&%\|nwOp+k+sh)4I\֮K}q -7:=?〧06Nsj f'v?z:*xD}}C1 VXL"h.'c t-o*1ᵼjގe`z>DT. Ô'?Z,6!dA="|z uӒ 1OXUb)7RzQŕWm q.VK$|JTCUqSO;gBW֔Yhg ݤn/ U+xuJ3DFS` %4v-,}Dk qiHj*ӂלcf8ܾ FZNNf9XitciE*A9%]RY%n{ƛm n: Ѳ#q)k >:9I*.MҔԩ!@p>B/Kf ˋTnXų_ifCiը -[qIH xGqez(3=1.g+Z6jwA9k{[BI 'L ghDi=FFl[ 6~_II:K5gڤM$ -[^O\MǞMrpĺf-!lOƴK HAjђ(>D0+k9i[p?tC:Hip>-ص%s6rmME8=,3[W%/ʨCbIZ"'=ͭθaX.SdnΝ -Hphqy}jׇ"Qӊl/ȓ[tvԚxȪ3zb#d./DVӧBVcɰ)Z§9<>L)z {XBd9b4簨\u0Rt2ˡ@42xQ W.$q|<? t]5zR0da&#ID"@$o:ߎ_!<~$ </̈0FO[NW7,-ٗ[(`0 h[cp$:|ม٢<]"EGV -U :Rq6~׽y ;+?O}(9y ȎPmc 'U3KqGi?*L()6 X5 xQԤ&?Dg&~V@ys &ދv6}@R?^0c 3jMI`l4&9ii\]_>~=8(ZOm΂@K kcJ*2u}7kfpȮ@'pE[6MzIoZ*)λ(&>RM . $?RnIGbiu`-N{V)qc@ -<<-bMfhHw(>6:c #{OP -FL^Z[cj uΌS1zEdR#~,zmN*ig:XŔ'7y7~!{ṉR+=xt{MsэN̫Zݠ=!JG), -Q]YKKr%2ٌPJfKԱ^dw_Mk-<ڛ>Ϗ?orn8zo5]صiQOrVȦOѧ3mhynGgV-mW2^@:hWX }A %+()vw=Yrla^q ^{aS"|:S}; Wg8VĮib#2xd x|8jF/&ц5 YymA}+nԦ'$3o%e_Ӗ?;(Y^`}. U O2tn/}5:A?5.73B3S5ڇΰjiy>kB"%gƖ_ҵJ;^ oȤnͤg?ms,gQ`fL6LN02H52t m10lB5kc%FuBo8Kph:#ՄuRSh{lcyjD҄fvic{\W"r!-?_`$gN>0KThܑ־A/m_ւկzgtX륐!p q3lQdl1@HtCY#aI8',@k/GکC8/&m,b5)Jkp:̌%T^^oF> -*kՍ9rgLrRx珉5J񘰫(C>\CY3Duf L|rܰwm̽ XSZTh{'(z`ONu.Ky[x5݂L 7It&8*`)l^ݥBp},ZɝO<4ŵԙlMFm=uK"SjD#cxn:Vddhu_hR=,H ȣ -Umbf]o;] {6$q5 -=|% *n{8QU7)Y<4 YAi䭄s^NtiE&k[Ǝ*}V,+q6oWy98 -bDUSΕV?e޷j2Xܾ(Yo#TMI̖4!~4cuƱU [g/20|}+GxGp6:-\\s ?nÞ3G3V6(Ll&jh.I?佭 -eu(%.qbVO%\`{ƷRQ1`7G0fTKtlm~TI,űl=ϭ;! O-CN{U~Z$vf{V7./ZU G&g"zNkOнqb氺ҵ>ƍl84&u|%6cOQ+nr-.x:cSp>3q5Y> 6h1HS8{Pte4-Z[m}v8­@f<8IHiSd[2q-eud"DqXAƹ9VsZ> b:&IJ5zMnZ*Nɔ.^r*R-*c#a rq<Yn>|S87,% <0%/4Ɩpo48{ tWiq 7V R{OsT]|E -ΐrohYAS*06r][ީuDU偓ٹZ*'P<ܱ}/& &!'V|`Xz9@p`MH3q>BLjt,zs799CP $X褸i9![`γHm2f8K4.r}Hĕ|6Cl,o#q)k6ETr;nF\&>~)_|]q~ wWٜY `;~Q2sz@^)F;bgbI/e'.OZcnS#"O\>t ?z/3pm %ZuD{o~GM-ĔM*Bz=d"j7!BT a`8˖놣gnke+;A'' b=faokLvUM^$Na>1|k^m"@s.'n2z3sQ\lrcI{n&S J(9;kQd.RGxl6ߧ'\.U2zܚo%^V]jB(riWLJM'9ƅ]f>~?=e%:"HJW (m&d#/ǛLerY٧֗}Fb ^6U']LأQN:I$ZEͷT(1'bﻬڻ(iw/(??]ꨕ -_( -< Ő `@Tx z*lZ1Ò3˿~Wϣ -}D1b.DE.q,L?m"t\nlNЯ#]^.#zc6.8n9걮AaNb ovs}o4gR%^l]Ԙ0L┟eh=L$2Ζ~Q̤}قc$Wy!-ɼv29|zё39VA9])kiZ-6E&-;tj4-(6!IhֲT(B -B]O}fIP9DDZ'>DDm+LTK/?^Ac)ͦyƶEɣRm(!W:5~ϕ(Sdذ,hlaӹ(\k(_E.9]mG6ftL/1־7WRA}gApx#3lU>ulz:P(:6^B#Ilj8o=ZJVO@&ե 3l$'$%ɅjGj D3R%|%Ě{evQƛgI@Z5F=WŔ0k;g/n&5cz~ KPctk3<-1;prJ/?l+qlG",c?9roFtRhr<&c  $i7-I‡=0־\X)Ǎ/bny!ZB//as?1X&mqrLc(;>Z?>/Y -i?EsW宭(wA ŬZ|w(9?9`/hUThqۯTeY=Q~֩.*Uy"9r7)4'ȼDc˭J١"9hs0 -a ƥoZz0 -do^n ||>7lGVdᗯ|\RHzQ"Gzn;OL˓ F,=19. ކa񸴩>a-9~B~2.zBAJVvsRg -F3;CTb& ȗgt>B +hLHtdZY eWE>gIc&;?fZZs #X- +T8[y\`; +'02;Xhʂ@#Pwim' AL`'Wg0@[(idQP*`Pk* A@[jK +]֐057tÜ!p3,3pwBN6 xۺ)=i0;1_u[ <@GOk-iQwKt{e@N>\a?ex!PW,a6N`8t'to'׿jNǜ PeQںyx ΀q:m.uǔ@ʜ= W>ZIqd Pq5n/hVr|Q^N<l qZ:=]j9AGm1o=[ 0?x.#5CmeCt|w]W0i \lu#- r <<!,ao17'77LF#v9:Pe7l=jl?k{.baoHrdzx]Ku +j\_fF} lo;pUu{؉;|O@-[eb2+:4;U]G16+C\= ~> hH$mB+<8dJݻ<024 +D F1KW>F{O! 1P*dWmq4'PB +ZH^p/%)oM5q]۵ +ќ2v'S'%Qc "3DI} +O5`ެJ&w@7K>ÑԆ_6'N5h n`7Q7?xdv=ɬ'PuHbx5}˒@6,i2˛oT9Q|/%i3FOB&4l˫5c֞$F23 i4i(,Fn`~Í^fC2& ݖ ;JKfOj(n7 +xI%F +(8NF9 ^b>tOB353*YP#ԙHڠ`Մ,Gq֕O+SQ +>}lL*lpHLo>S vGUPsMU.['ϒuywBg!~bF-s=%Զ=eJ];ВZ%J>r`FV[i@JkԴ+1$cJTo1#JCY NϘG^"|]P^+R`#A#uq|`SP>d<|-[.pri7`5(B\9;vo[G~ް۝p°,Ջ_f]'=7m_g\5QH2n`lXm;۞_ÈP߹H(vwgz-8?[Ku5 u/8GIl'DJ|V=ȼM7]G=x,:b8uS"mK݄9l%IFҬGʷMb ۸eM#՞!,cX/2NbM2̶x)Y~w;EBwOf.GFg%J$'P(|[͏d#:dhooz;>BP_lbGyL2RXX왬p\#7:v;4$m8My%}D28,IV"w4׏x-:P gG){ A~#Ckˍѻd&s ]ZDyk<(q.\5t&B/&QaOQ ^L"*A8#"؋ɹ5WƂY +XvIWL&"g= 5:K.eXV0 3YBrJ9z֬VEj,0»->&sְ@ҙʘ}j|yk\ɪM=Ga9Lp-] ^xoAvd殬Uzq~hJ W>1i[-ī;C>d&eK'aE)_;3&+pCs섆ZS#!qD%oӇ.p5r ʌtKM~} ]g}%>sVʫ2f_*+>Ϫ_t7ΟOՐ-$`e>v}]o]n/4⵬pfC ],yt,Y$,s'l܅pwL,hqW 58-b̉tҬN$[ʴ$tvf+0 RqMb1zMX`'#R}GȶF blİ8'"ރZ묪rd?|x O" N/Kj^+8a5&vPa 2Fh̀J]vd#ab"\9RAybRޏ$tzyuP:8lX^DAQ% 8_X9H^938/Wya#-Wz- Xb0Ypd"j]9_[}றd8W+.#'MN==G9|c/OCUt6ePM]9hNQdcO7j~X-)qrB칝vhqOw(<6 Shw> Dgr:`zOQ\Cc8 ͫ()vwhl[]ߦzҨ˦H~uO*-ŏM"E'zV(1/Ћ1~5:b˫;p%=ˋîȑ."u8¶{Pfj01"%uUlam"==$_lWb}BE$x [/̜mvLΣ3iv`"Q5w#I +V +S=q~*UVsoMUYFS{438w uy!DC'hN7Hy7[uHһ)`g*l0D~q]cvʥ.8R(SJ$ٿpҙ"?= +H:wNoc8|i~[./6Jm #ܦۨrW Bn"4t2%(:rD[UO,| >!^=8v$+@Tb,07!BJ` @H6.;KPc*oWY3R4"3:0J~cJ-۬}QN6-:JQu3eoϓDLe֧P2iZ]yAMܴ5FH^yK4P}ԴPg,RQdrskS>Kzb+ʪys.W#̖A bKXkCwYWwcOINb_D>[x"[- +?>撲'jr<-<9ይ ~-sZBs*q'=t<,GqhM)]&XoPeIѦ ~a'sd` +ތA7(h6,iL.2.\"xp]eu( :[w>#?*ڋ=z. #Jt5yz/@C+>h)b('QpZ8H{fD"qS0B>MwNŕ'/N.p[!ӦM{P-x,gpZ4 SB,J~ ݛTíBiLTORh>ВPo9s*ig8ĊW1AB Re.v'8BB6~Z?6,wN :] oJʸNf˒֌DZ1W +7\'ke¯⾞5UN8B^ 6}~W*r!`^ 2(qCY0S)=7{V95A79B ues]RٝFF+?7A޸;[N E$*^5}WU*8XFiH[*,Ʒ?3ʣ3]* T<-d/0HD}}|ûU63|t(zgdm=uܕC]c^K4c·Ň kOgK0e. (TiQ(DHv8sn"^`;4__IVȶ*FŌ +3=O[*3%D5^+}m#̇S_^z[XZvO1o- 9y@1Ղc[,Ã&tj}xԞ0/)WhM]˶<5\Qsڡ|I"rވƿ^b~PZ{p}BTAOxeN:+u;.YRX/b-cA Cϊ+GYfW)=@>Vi h+2^0At(^r//h ʤGy⊯ug>MxZsI{ +E?&vi,c`h:<ϝ?]?ⱖrfkN}+?>)`%a]n K@m݂%}̗y< +_WS\E/*F&&{%z'9K6꽥ٻ +/ ^Ux J O@=WHig)Z;w}b"7\|J0_OE܌s g$ $%l;6?BhR =m8`6@Nٗ/_AJ|w*{F-Rm9E}A*k4Mk1>Y[˜=0|"f-`[Wh-43S Z[[m8u%`;fVݩ6/ٟ֯QL[ f_%k q*ےd#L Bk_*1'Rm}lG>lѠvb/}4-9ʵ +2FzZ$A=ukվ!oL}YӶ@%^Ix:,l"hqݗ\g_⎩3IqR[.7\D$ǹ7_FaX6Y<]?,s 43#Mr"VE=Fnٵ:mX&zՓBS +*Ewr^lq5g >y'&FH}3"m:EuF(WRrigC^u +5ͳa Bk&f!NRLu^|\OA\=j<[lB +[J~/DOx,~>]iA0#F? XY0h9:' VvtȷX|TÑv+t0(AVhZO1t\*cL+3AǢju^l +yEn5)ӣ!| o+`jh]\=Hٳ-/L*4@ g^z}7D6k٤ȡs⭅6"X7vM\u6 *y+x!RWg[+iRC㹍p{PMEF'3DGW_n+Wy ^G4Ρ0i)SYfO$u +$6{ +(e endstream endobj -992 0 obj << +1042 0 obj << /Type /FontDescriptor /FontName /ZMYRJY+NimbusMonL-ReguObli /Flags 4 @@ -4740,73 +5141,77 @@ /StemV 43 /XHeight 426 /CharSet (/G/I/L/N/O/P/V/a/b/d/e/f/g/i/l/m/n/o/p/r/s/slash/t/u/x/y) -/FontFile 991 0 R +/FontFile 1041 0 R >> endobj -993 0 obj << +1043 0 obj << /Length1 1626 -/Length2 14502 +/Length2 15139 /Length3 0 -/Length 15344 +/Length 15989 /Filter /FlateDecode >> stream -xڭctf]&۩Xwl۶mN*mbVl*Tmyzϟ>ߏ=^ל\kȉTMv. L<K[Wg{[{n9zy%KGN.4v3v4f1) GwtRWѤ/?&tP|mlv._!U@w UTҖVPI*$v@'c)@h ;lۙYS3W,ag1hj0:8l- 'c;,Lm\%7 '/ /W0%{ggS'KWV%1tnOng/5 -u1s=\eY:;{~ -d/Ζv0v2:;OwNV翼e0X8mYr|嶰cgVL:O_ gf@x̀p -._)Tw,3@ -#?96%\mlmg 1|39??5F+boc:i㯖Y|oL;_ۙl,_zf&Щ}4vf gVVR?2T5O/ly{' @qs0R+],=_u31J?ˆۙڛ36.vf_M]5@n叽)oUzVKϡ 1ݾfPFnmJP)_'{24#=6ݩ||_R vN FRČS-&*%oPSN0nL1:P@ -ON)(F!{hsay )su+Y I0NZO܄1Cʄ T5YxW5Ľ"QZvNg2J[%: -6C2Y[@{ MʡMb$(,'%gt3w%b.^Pȁ%CO9C{̔U&|6 uZםň٢7\鴳M394L@BD"V94 JkZ鳜TZal -'C0۾5&GjSs{ #t5ue'%RMXcÔyT},=:k4-S@nWB-"Jq<j "+cZ' UZWpiwt}xt gzM?uS^ZT#4' -/# =)}$}$Kr -%^EHXԍE U;K2mtCdLV]]7{ѮIiNU-lCe Y6Q ؎NVR$M *em~U #p|וAэ|ou$ OrjEcXsdဋ( 0>'H`.Uv|dE'7XiS?^?CJrDz!xLj sq~Вo"q洹.I8\&b 8iQKjPcPeCI)޼[JHq 4#7g\#\tEp0HϋTs%/l^K=8t(`t])0$M11]&ZFwrA!oWsiwF׮nWX+]1oܻ3U/z|nTc6?PHRn/+Qn? ¶X,qBϛ5Bv G3RmL {\V]8 DL05w_ZCMuVGgBn Q#ҡTK -v=wWHR6v3 d7ƫi}[C@$5k9=yf4Fc/U\*J'ix)mMncCI)B~.HcMwg`^=퉌*:r qtYZN\:1 -}wj&L^ICDe$QX֢AIDj9i$PJ6`~2ȆG_Emџ!RTwm?"K>պAMjGP^ q#mhgX(*OCH)`Z[Iu(F1FjCEGv6\HYƃKsF"@ 7!-YK&,F݄oZqw|\%;joҠjSCu - ~.\Uqcgf^rn6CҌr[A- WJY{]xV1,`TF0FS1 ' 65}h(7 *3Z4:*өuví[L8ymRYI -XqIA+JhZj>|QD92>0[D0٣]I1hL2Dm]{lwmmeu6L@ă߉5 -Nr˺]^-`FV!ImMHNE=# -O=#3Z,ȶ<*+hԑ ,qvѰ$X!JJV$N`;Xw4M9Ͽ - ZqT)O1'9h&[J1+PI;#2 MToMHW -rN7^&Hw'ǵxA jY`Z%п8M6Td izuøPI 4Lg}ANa2957 Y';{ٛc9f͊qaD(R{$\\wN76pWK¿&G~X۾=ƕ^_Kԑcb}f?6}5JѵodW*쑦*+'f̓C)7 UгjbKMCM'Yk֮*/4R Z(}f8 ,EG,D+{GQ6n7d?X5:Jx-TFN)s%k*u4LWzح -+go[YοG"Q70ZcO`$s !<*DKn,ؿYcSRS݈ۼ+N$cW1+i&6 - V/a)w+xjh4 ;ӀTy qq˕'[lF01ƽbǁ-+aM{woلSAN{ɉX%:mF l(J8R6ڐXSad`=/,T)&$:RM<ˍg:%|!%3^ar%!nvkREZTUqLlwNijٵOƦDx9HŹLtK#ObPԣb| Լu+lR2+1y?FKr#N-wxBAp]Rq>'8dd@uGb2Axd|[%̙h_6$hԿP8UW"jE,a7gF~ Ճgb6f-~a%1Ňw\BjJun ke`vZ}݃0V*sT|}qϨCƒ x#^:-CA^ -x%#I=֒<3ēuPh/{8ck'9Q:Pa8q)bYP(6ςx ?v'07QO[2vAH֙ -svBa hʞ[LCUMt:1X+rȴ1KLH5As l)fg3Tpꂡ#LSwN,'~Qy ۨ=(d7˟.u2Ei^QxB # {xkGLLK!<QWʐc\gb/7Jw5RPt雿3&S0}-#d[I Y9m. ?F>h_nIiPJALʁHNwj5YaIRx,^ en]vel+W9V6@D pK|2]e&qzei""!խZD?7'Lf7MMXu eW~xD,c[5p ߈a6LsQ-4d(G=nպdU-:&8чG /HZx''zK;L 2?xFY5s=K>kWm# L6X{fԍg~-ǫ!c̘Dџ2,A|-K*E6J7r~ϫs41JhEƒlcŚe!qV8TgNJXy?>;`}cda\N愔{<,Zڿ)HnӍ~ZV 0?bט9<bi)U߄C`i>!*6.MQD1ʪx/xGPM9[g+, -*e03CAxM S:f䦔pXZ_;Nӣd`e9EK @ฤ3F4~8Awۂg -sg`ꇷ!L{wN5mMR#خJZ] -+M?&3Y@֙%s,v#u$5JUXҙ (OH~xXD aʜ \י7&@~q#sZ=o侢_meI"!yj"ܥtN=/l] TQKNY;TLvO?7h\$Vv@29 u^*3\޻i=P[]UysTb3Z_NQ^P,И e#!p(𬇎ؘ^͠Nٖ-F \ g:.R%O,{#7#D9bDFFi?{?v[l潒:!4Ol35L`LQׂ`=G& vٯd=X,ۃ1D޾t(&D D;v #f\^Mgƞ -+2G}<^CM0ȋF槯]xO6Fwv@L~P c}S^:wUJt nW)ppm(Ԅ.vƺAT5s[=SM/axYYkQ#@jLc\qDC[O3𻆛 o+qeؿ2L~Aİnsk_W*"hV!tI넄Sir)I"Q+@ff`-y=PulϿY !wZm13y2#קaH8ň#1l%cqdW _]#jx韋ZfsP1LƓ|"sΤ밇(Z2u-Q^oxc.dM-Š\%*ʆ12nYa˴pߗEχd\UFnLizJ+ixMK -Y}@dgۘ' ~[b;;|?YNWd۾@#ْM-4!t(ۏ p@}KfUovszWO3QCvu)N$ɵx.![-IЧ -;$yI&nx+XY<ŇLANJ~}4au[Fnwݙٳn𳥢!eI -VhjJ)rX|! Sw=xm0iFChO6c*0T} 8:Ԇ%>[i1qFxN~5Y;ס.um:s d9`s EKQ-Đ؏%R;F = dS[8+/PKag`,Q D|wk8+Poc1^l>}]S[n*Gl$٢>tLq uON5Ui kvґKq(݀fnu7-/5ZTj{a#bVM';s{葺4(ʼ)n>Mf@OzhCΒ:f_& $sˉ/rBP}6@Ѫ9x7Oko!B,bݼn2*؋ҷlZ*{ZmK0$9Ȃ.ܨ0 ⼤L1 D<]f%+T5&c"Wz$$'*DwxX~jfxSIs=^UΜQUVYJ*궵Y,\GPȃ[MR={Gy d "8̵8ϧ0&:*[l~R~$a47;z'l8];35(3Wvj3{NR殂axqgIjLOHKU^n% {7^뷻elA#cy FbVa:{'AU/d}SFW 9[ޥc6tg4S"!`*; 0RBA(  JX@ORTMX ^1O1PX$uƄ(QR:XF5q^]'QD%y -9"w_4j[ 9|#&/S[ -u[g(Dopsk϶7xժ_ӻ.B|So i;\)"g \ٜ tETX-l3QQv̪Ea(ho{>Wv0WM+Bu_3a'麟$nԹKK}ulĖ z^Mt:Q,> 0.1l)hnɄ%-}( R ^ߟ3\ec -w݋wW_YV MPΓu?pk$]D ]_ A\7 -?[fZLus;F^ss -<WsV5)εX_ wSխ8aWk 16tC1_yb<'2)c,ܗ? neB{>U9Q@qdIM=ͨiI9Et%Qk]vYx`7OѵԎkw0s0J?nl^i>N;[8Sn|7VKhO-Tnِ8@ҰbfNE>YF)ۣ(Xel `*\d8摒]&"d5F&W;Iɠ1ʰR6dO<' 9uӸ.U(plUL 1-3mK|npZ6ӓU=%R5+x󕕧Y*xtAb@htZCqET nm|XpϹ^i"+X%6/&aa:*cYnӶ^8 O6g491Zݶ+kW+6>gd~z&$ΰj1=W:lr x^\h]һWO>viFʳOOZmSDa+H'@>O; s|cߋ s]}m\]V_?#:re'[mKB3z}_!MN'D"+F`&/ {{dOsS>G[]8_QOLKGIVZ $_EdO[һ'n Oud2f+ڈX%TNCҶVW~I. Ĉ@>Ӝ鈡0Fv>:#&]! EU .cmc/)ĐB7>Ic0-9D(RlVuy脱ykpDk9a]U90#ET@i01 բjڙ@0.v^VWlGvRwkюq35b>56 ,ǫs+O=觌qjyhv>~mȸ'0J/2'f@bCjyM|#Q-+?vpmʞK0ɬ8. QV<6K_ 5`QߠxQz8I *Rz,".#6]&SCҶ-u`7#~1?A' NqU%j3-VVv'qwm̧t$#5ҵٸ"E-З5:r<к1:PP&Ғ]U/'DƋCv|yEpc520H92$"p ,!OBP>}' KP4ga똘C0NǴ4 [/Tr#]ܺF ~j뒠8km9RSr/cO2  -p^Y0>6{7:4s:B8dr~v^ZHс좽ۀs-)iR4W^, ဈ+ilRV,v>^NR?)M;cVGon=+ne%onN8kŸQy;VaN%[%όȱnࠫ+֯:. ]#A4ғi~tJp8Yܪє: !~- #Hs8KQeEm{t8pLIv~_aBo N%;}H¨72(4D sbza~,!VtE2PJ%X,Ղg1\Z9I?&@RzACj28%b2M\ -f3ҭ(7-Mh7;8'=utu5[V| ׷ PF[Tj[/cG' -2I{NH?HA*s,; -,14*H@ub(jV@PxSU6 aSY]Hñ-ح Iw|Ԝ*xkM$TK+jTO:=vR}0gH$&wžu l -%?h'̠Xfd@{|2_}49:niKDfHϡIYfo )G1''D -ROgLZcGFI*W􇊉 v*9"JWFn>Pq8ԨqՀya!"D VG57u6ѽwFev\^=14"tB-OrxUĞ٥ y 8j1Oni4>Nwq OoXG"M#9{lwi'tـgsju]Bdכ# N'Ȭ'zR2+L[Y䤂i4W-oÂoi]0,{7+QFr7$拍hk/meY9e;yWvlkZ'voa`pڝ# ɩya+|jr.6[Ty0e# -Kं0k-T h -CEB}2|]R.T./}ֻ$.ᐑt6c} QD:\\IeJnI3n#IfI+p&%|>2e))_;%m@$uؕhN{qR<#9ma,Y][Ώ!4q ޏjL!%h;eσ=[e$3*c~7Ek\28x)M0e}{hEMlj<>+hzrK|XUijlcȢDyPR0f2럏yNdMNm׊ -+V4}3/I.rT~|rRF\#w}CC0f^S '9BeY# ;Z{>nyY=͵1*C WeZX2z;HA2frg(ëHPՇKɏ0嗵~ۭ -1gVDy9#y  /R,ہ;V"95dsYX TYE9v7 |1uۮdRW~LSyo˦ũyA.fdtw6ܯ<{D c[]lE=p'-(TH }ru Ũa}72|af7rR f#%B$AOi} 0_qP1Nm<:j~lMS(m8sw"uE`?>E7A S56 4|}ָεEv4g""+ RDbq +giçi̴)]Үf)3صhop!Klx,c㣉7?r8UdF[fhǝ\XO:ttJfY1 ֔$Ex'n}:0^-rݱIY(!u1ȍFx 3kֹҊpE66܊~ԩ˒,eC=>yc;vS6CzmoB_ La9(̣w4ϟe 1MD kSHhx}e(<Sh>b+C:=\kwl!\`[k9ǐUP< -_bq|bou?~u ;{Fddgw_uv?y h`ol +9P֠V\_m[eV81'C?܃mCݝ +( !-D[d/C8Ոۄb=_C4wHOZIkVՉ^[trJt@?248} ݻG@OorB 0tk0~qvSqqЖYcJ0mjϔ7NGSi{V>{^CKL#TK<XC|&iz|cL*laZGm+MyF1# T;Ggʟ:c_N7A(`]18h(9VUcʯp$1.~a|r+4WC0w #?pKȊ6V=p&-W037R50 +|.1=ΕLџ|H~VܳJU#+;rtxГe[`xzqֱs-ҏz@ )j.Y] 2ǩFE'8ȳkN~Vo.?aʻ.]pjLӓ 3*^m>y[>H0U}60ԝqTOyy Ze)8t!\;z|ЎKhΎ4B۪b/: 10fvH1jYzpt~ƨ8Neaӛ`6tƸՍލW#7VܥxZCrvD+!Z| +nQc\2_b`p[ivفZ*Ctu^!?wvco$0N~f,۷G]ru~VnLWQ.5 -GnnLkv @uaU^dw*YVI+qci,9;BԴ.V~CX <o!tcG@*7'[J1_V灠 Fb[DYRݣvWPm*z,~9Q*liUMZ:˗."gȵwBaؐIvb9kJ8 7mPs5fYuKz(&XcH^yn;\02%-l(kҼQQǠm 1{jU:q=r5d)uvXJ$!82ԽNr0o2e X=;nTټe񹕪SuKCryphi~Y$z3hQ=A bU|,%{)=98Z~X Kqc +nVK.SA{ T7\BQ5 %ALgR0fI[Y1R_=V> \WX3>A;eF\V8hh(7US3tZq/|Qx<z)͔ 2a|N7>rs a却 +zx:PR smŨd޷e-N,/Dž + |".c6 +erٺU&cFnhHg:}d/ q75Ru5H$<`h7%xnzhz8]AAKl']UӦ4qɉ<=bP+&Ke*"+гzxށCj3TAtzsl~bH +_`mveq\flPݚwo\'e^X[Ҋ=`Q~teR]c$nzKeɂaǢ*G繫 p~QQXUgtn ȫr{1xc  *]+.̝rQ\{@cZp=7S~wKL ^"8.J[80s/> bDdZu4п[3O( }˺> +gYQ" 复Ê//_cyIe҆²ZLg1wN_Z{Imoɺ,)Vh޵4;3uXiƹctLH$Y-7`BN!i/yHZ}A[1VwPf7ư7F˦d]4V:M\ФmLUhHYLقRJ7$|"B$y@8&0_V[xS8B,ě!Yu }J /CJwY=s;k6sW )J]y9HX¼4ugkIż`3.Ubkt;U:vdO-,lM<|C|K5тǸ1c!߯^(·LXx['LՄÉI˧ 7֨[؄~.<%_bkٌ:GQf܂{7B|D:|QH)>tў|A4 d I$4'la!fuw|;sÎ7TDg2VZUEr2z)cg]L[M?[@$K%¸T ]9kwt hk21RݢW\Qr.\|+3=a><{=FcZuo +=6\ QxhjCMZ>V + j@96BE9T'Yc+';7G]|u:|0_` +zW"PJnGi/[npߓ)uhCx({M( +$ LEyJI)|쨻uIUEPҗ dBszZAj:!я+(;~]JYo<FmC_\<$둥\/?ά~)KH)fmkq@>in^Ogq~8B-qY:QwYbwlRJKY35p®+zm"41a+}T~_}U+ޫ +a?Ks!%+1qx" 9*Pqm2@#{_'W!㰪!0s-p@We0#"3/XF۾9hJtzq: ,[E$NBTWȥ&3a_^Fp~-AWR\Qjh-wE/wf( 2Io;K>w*<\Is$cKV~+Ԝw5O{bWaJk>gDD=ût!>[!~yoLZ]$}|Z.{EY~'tV/5t )GV18zDˉX+)o%1+:#|-瓘yC8<;tƵw,bJ]T'^coIueRguQ_kOsZaoۄ+c9}GѝI]n.N,}Uys+b7 +^&.1u@ pj- +,*7RAv&r/3[Yq" ::Z7^p}@T`7̡Vi1kA +Y:WLyE'nwSMS=K/fT 澠dz\iBfyt}fP5 1,nfʠSH`-ΡH@J{`@!2vk"2pՓKYe##;$*.& LirYsKg. +wϹ3g-SVdy&cͨ秤ɘF")̑_ I +;8;&vL3.~5{5SX|=Bdn:s(`ҋiLcl O<-oN%NY*dQ1bFt/6 t lhY*9Dj@e x w[}bE8DiIXBٴ+E kج&ۭIRͫ 2\>٪Z K "4kx-8`V Z5P$ӊ>L h~k7mі&׶g +\@vEpl*IjtiGl}KmLU8m{Xldh&K~ANQp> Bh[=N^)pt&,%,g~#X=BYGOɔ +Rr՗Rכ?[R<Ց4|!9fJwǜI$R u Lqm!q_Le1u)#Z1Ig`x-&xm}>nAhw)tJ"'m#ae)(5{ / u/金'^۳.o;~7PǗ"qtըG},c_[P!gD'?RpA Ş[mkYC7ıbpt(kuJ+x&5 ^B 8"~E. ů@$sf|g;J:VӽGS<<Ý@#e]EAH嬦$GK=TLa*oL ( }<i'-n*G7qЄYOCSc/?΋dʼny0@|R';^X,LS $P?GV:p#a/7eL3.nEӟϺ|d5P'ŏ;ʙ#l^e#y/x7g-u‘;RƫBiĽ8ͨ ֘"$:=+/rymo[wI&RM,8P\gkNUq S_Х?tbꚔ15R%?(! TbHFuP*8,C^FښP$ihQ䷬k,[zuGջ_myʰA &M5e(ɤ85WMu`D CZSpKcM"1$;}`W3sؗ"t<~U M92Mذ1j%G f<+P.eI#֛S1³-b%zzC |NlK*#ؗgq!lT٤V b ,3S[ aT#b=p_ 0CTKT89Εy.KZö˖<cfDET@LƋ0JKIS.Yew>gz2 |GK=Sh *.X!-o*6Uٍ~X|ךoS2UltOƟ|.KCZXeKO#MY=\{*YeU{˜H,twrlHz_9U.;Y1/p;nH1M zT9W]6\~AkrcEmM-c2ÁZ8xx"(m5T=/a8QS_CjY8j\qK +RZ Eӷ51iw׋U82wzdU)Q5 )ܤDmNlL`*JbydM CqVwmh&luIɓD=xl4e;p=LO&WI?ͫ˵ u K2{m :O=Q'vWө?jF7\RubV% #Wn5KѬHll +;*Igzb?"mp#MLlLT6G]Fny)k QG,릮hd~6Q3[SB䮙’ v 0(͑yP++q֤ɥ0uH׌aV(SL|8.h#Ɣ)[|Dd~źmӹ k|%=}q$N,?PKĽPˈVI>ceOWpWg6"TSthY0 Eŏ- fڠU=i ~M()7ؤ,6e4-OhB3gtg maY0/3bSBh7OgMb<4?  7}G$h$*3f"{?pEPrSÅ&-x@fxM1g˳|<}4U* Gۯ g D t"?34e 1k&qT(ok1|^p+húou h֦$`z6(FWMopE&f6?@=Y7'_)CA iQ!njAyvo}W]{!TH)߃)21)IH3< d7xε@57M%ŞP(Kˑ0֢:]!՚EwKnC4ޮ$ej-WS` /Z[}Y{t$E03yȱn\@ <2{Br NTaM[?<1/46Ќ/igWX?j ~5Wy{i!`rLI;=T;332ňV8'ߡ\j.YG8kc+9˞&=I)Ի WS||G! +BG4>YqUnMeX@ЛOnNidIIL%p΃3x +s :FWC$E3n|GP@"2O*щbԖl@:'tH9y(I>EPz[WT>-Dץ0, ޻sco!ha^`0:@V %l0 F-W!zƗ璊՟-ՙ^ݎ`.):B:}0IzcE&.*:v=;2qBFI|TK,GPKptF)BR Mc鍭5ʦ$va}ҵ+Kfj>e۞m|}v͊|3R0iG7W2%wk(?B9㐽/5~,n-pZ0TOcÖPCkgF= 2 խlJ"D;HF [`1c㍛dJ.[1E?u,$t6N^RJaBNX26 Up%E [c:b]590 jkiU1`(]iA@mx }/puҊ ybkOx0?-u p_8t#@W2W5Q31R?zPKjr /WO硎ƐזuSTi˃#?:}Ka9BD)=TC'"6#pHu(|o8BTUH_EJyi9&qb2>0CMgp<ͳA2杒LY|<p5z}wfj7#wUT"D47 HҰM`G'! B m%LwY۾*  TJ1||bu\Ǎ}+^ha[N%If~D k$yfpBNx6z"W-%7 &rw; :/+OPI O)gHI*! +jw *XK5 xmscBꛨQ0&4"$\&m]B V D?f}mFtcX`j8hH5M:[&ϾlcQd{ VqdX 'Jryid E5e8urvK M|SlXT]`y:y.S]3MmDt"Kwvq4}VQC '?T_Kd֣bv^=^ǟZVxR|)U&Xhxlx ;&b|^Z 1 UCQ@hNo)z9IhW\`*n]s,~[.qU>cnvfB!R2o=ń4*v/藣T-?Go`y-h^}1EL /zH͘8Q ʞʜw>φZG*$- VԱ끋6 j{|cF.Y"QHRPRL.1iuY۩2Kɡ~[O 16\=USP[da4ʈ9s~K?e^ E`P2Pʘi. gktedGNa$2dјRQـ <U.-#eZ1XϬ:ӥWp؀T)Fp Ujsd r7s-Xոz 3]z#V2 hJh +kUȎmN/*?,,~rm1g+|ռ  -5;$vc);FnB;uZ<h%xwcUci`5Me1"nڗ$G ~' M̴RbnZ ߯yߏTX"w h:"-#0ZjMB[:el~AZ]SY~VnqjZ)@NR5(x1R18o%BсX3c^C R an [Kw]Q!nOkZ+ I>p2F@⊇Ʈr2Mr3ay[h3n'^E nT@z aQs (@aTh|8Yys]}> G-eӨ@i'!0dmԕxTh +ޭ*VY>?|<˵o-DX3ΰ"#tl8evIvnD'ٛ4 %X4֤`Q_08lfO`WvCF.f}~J*[./%=rBu!DŽO_wG1`םt"W1ӵge>Cr{#.g +yraշFkB)h\nl'c"/5X/lfh˩UQI.T~k +Bx+XE砖x;C,юƨTV\iEc +epF{0b7@X +yʐGuy&XSJC0åBԭO;gV\kɸTҷ1];B yp[?c!uZ$vy,P_N¡ -lwNa(]=>D eM/ E[3ۇxI|LX <%%m#QH>ZW&4a܊_ #8}ߩi;B=4ЂVՉJC_s5.3aՏ3PC2軐NDOf-B26kğ )>MXR9!2zՁ.XX+鏘*߼i\ +xxܾm ;F^Gxq ʕ":]>Y~HX1բ,ke{ZgWu\[2+1Q]C׿ue`g}JǾVEs7:p?`>̔ h|^AH^j:%EHSmFY)N?:窷7fk= #g,>7;}hvp +]sa +߉ȴlEC9ZR[QՀL hr,<#R| +q@t3!iob&ʷ\6.J[j0 PTMɇr٠p԰ba rf[,'byauWsUKI-?x1]T]&uܢ 0#/] gCa&UbQ- ڤMK.1!)+5.j誢H[)ۻT 6DD ++-,41i?DP_~Yء“_YmLlĠ/rL_tiH5* +Y(ud;:f!ՐᮭŰnE٩-`T~yO@sa+m])(!X%n<‡ +ɬwt*Ps8cNY*%ͱP'IUe5Rku=) @b^evqҗ {L.cDM,X56Tb$'9FКs(8;]VC)9İb/d+fp ɖ=*)>/$.7`Ui+LNy1+`>m kE1s30sWҏ]0"/dT\cJz%+)j0)5UVt\6;HTuҘХE'E{erpY4ρ;,4al 㣺q\s+x] 1y8 }DݲMmV 8.U%|1>U'WL ׳KJŝnfIO~-'֨P=Zaa%0>MToX-ΣMSo5 )*騷nyv9vL0 fL( Q_7(}S\?mkZi`:h* uQ ~|Wѓj 9G4kMLo[Z9']Ljk8?Q`=R#3lz7ql.'F~>L7S9C[qB}d֐ۙR?tN=4) i%[N9fVu-AV 1!`U6Cs1>g5õo(4o6r_s:9aqY[|R~)3bPM:4wW󅌝?t9)]ls[rZ%#uPݜJu04VG"2 +ҩ;|n2j;zLQjȿ-$m!pf1u|%^ sVPtYᅵn|&18]K%>W'AOsreߛTV+ ߮9 0Jْ\a,)xYF؈DݽWlK3yuu>8(9](A|B)t**9=VL'\N飷Ȟs/{qU:ŏ9LX=#k< C)U~b6h{z/r!U4d%j0'~?agFl5eHq,{;=.NKʻ#r-΃kâ`tZ3䈅+V O!a<䜈V2Srش4y~u1ݥT$}7#HX|}SxyFt~jP?J+L6a3<;.Ɖ\f S: +Rg6<2!>ǝ\ể$ endstream endobj -994 0 obj << +1044 0 obj << /Type /FontDescriptor -/FontName /AITAPQ+NimbusRomNo9L-Medi +/FontName /IYTDXZ+NimbusRomNo9L-Medi /Flags 4 /FontBBox [-168 -341 1000 960] /Ascent 690 @@ -4815,62 +5220,61 @@ /ItalicAngle 0 /StemV 140 /XHeight 461 -/CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/Y/a/b/c/d/e/eight/f/five/four/g/h/hyphen/i/k/l/m/n/nine/o/one/p/period/r/s/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) -/FontFile 993 0 R +/CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/a/b/c/d/e/eight/f/fi/five/four/g/h/hyphen/i/k/l/m/n/nine/o/one/p/period/plus/r/s/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) +/FontFile 1043 0 R >> endobj -995 0 obj << +1045 0 obj << /Length1 1642 -/Length2 9596 +/Length2 9574 /Length3 0 -/Length 10447 +/Length 10426 /Filter /FlateDecode >> stream -xڭveT\-] .M8 Bp'{p 4$C @p'<;q޻=?jVͪf5 -qpr흭Pgu*^ x0_syX`ȃA^^ jokxm/?H-vœ'q pl9 M#euEKEu="v}jBP!p0  -pA!Zs>q@?@`:O{8q{7(rrSWA0W蓇D A07SVMyt P'Ok(OKaO4O0'S'2_e! -Z;''?>{ W4/`;pb>=嶵`re 33,OE'o5K2N#wK}ZI4ӢBO -lܝ=:;ywmhYc@llW[kڻ6@ˮ:COuOAك!C'*KK[ -ir|7]o3AyC%+ p>d_g5߿NfF -Z!7 ii]]k<5_{A3PXCjF[ YvWy.XqnA]jH]ug7ч]k.R'da.[n>WBځd"m xU# *'3^de8}g/RцeFoD^+Hzp^ A -NnSzd%zYӛ)3NpW`U#bDa<&-\}7-*} r&+U6_85`< 14 .QP}bM%5;Q+/;SɖS/BzJ=?cR {[k lRuܯ(7|Cpn"ơ8@[bzKA - 4/n֝ -CbYmֳDY'Ϧ}oP GP{{z.g;wƲ}i\37*t2 yi3{7A6 q P_n1Ji?͌wZ,!Yϭ$4f%oھ Uև+i7L'1OGVd|S{zXցG^_;G9=KCIZC1`vgGH/X15ĺjջ׆b"/$R:Iaero,%y=|3h1NP!T -&a@ei8TrX).O*´@p}mup 2ZKdaXWSMjWgar"60zh(yRפ4NNb:}6"%Ꝓ4/DC+ⶪU;nx{yANV-3|M;~7R5 ؕiZ$vb;ʠ~-IKMtN|MR >ߧi~EīnӔm,C1P}Ml0swIgG}ME=ΥW@ߌ}/f$#5h>g{z|"_ũiPDkJ\q$}ݸ},.N5-b6W۝|)K^gE20,^ćlgOQW9F Ь9^;g b5z"Q#iy0͒XXYU0Knbqh!UQU$$Qǭռ-3>G3.E2>[&.P[R4R.>X'O? D: fcBX\\Rui\(ӭeH;0b?}bv!m5߼rLPWփ)E%mIybx3F?9?"F%`pG'wnL8qfEԏ.$.^\ -Jҷ{$mc֯:Byzh*@Y9rUdDĵۡOs/\cp:ϿM $m!m9o-tZ4kh;|(6Kv2Ҽ{+ nc!~'c MNKXa{ͦnfp1䞧8.U?j8ӣ8^АyhļKEP /fm k~(FX9U5)}̛u 6h<\ TBYE zĝЊGijټ=(p~ եVQ"B_RV#]'uir2T$|<"dz9)܆7 ZH'BBQ*W46 9>X ;Tn_<:}Ԩw;Xjpd |2W!>U#?SbGٲ|m(NCIjj?3TTXEN#8Dt<ہ%HeLnV4lV BUJʔu>'cZ0[;jNE|L)I7s񸽷"rOi%m.2oɭ9$R:a?yDrƜ\_ -=fYC>t2+&"$g vʰ>~}<(ǠwWVȤY_;jOSD[<=7kTEOX[s?݋Xlufur,ʖF{*Ut`di@umlO+ѥI?9IW 5V9Si08Cd l# -7;u{cb' *2J<__-U<}om0m3Q]xze\g-^2`J_.2SiOҏf*G9!7j&t -V=1YIn-oW\1x).[dwo{yA˾>7qk%ofX: 2UH߹j& k[rsb!7N43Y245$SAeh$j+@ed*183h0SE("fNF6_ B`RG6*|.|gN۸+~R"Y}6@7vzϑ'_6F}gY٢:6@Z@0lFw:1Jµcm<EŐRcAR/R{@Gו-z'BBZ1>/-4bz).{kJ΅r^i9Sjrf]m/ -|]z$xRUkA" ".?"m:dwwB&ٻƟ]lӺ,tX&bFUuY$3:D%->jRAʕ5gL#~!3t|4쩌릦sR"Gn8=?zWVZ1*N$)\wO,)/r$W֏Z2j+ɰѰdzShNp6i!@/Jp\ΨL^#+Vb=> %ӊ~6a\BeKQ,PJd(sԋ NR煴XyҶQL;g`PW0~r7ש{wE*b*WoʐO"Q퇼kҌ[@-mɘZy FJM p i,c#ֶ"lH -ٌ/#Ӱᶖ -N7ѮQN/g~Ȁ Yٽ4ב 5SdC@S2kJbWfA-bq;/u]KW8 -;o6_\h*0* sR_ =( -!eX!F$y6h:e=3!a>e١NJAџ\acXd?%GfFؐjdډ4Lm6 |4_:kD4TR%doZRWK\: _Vo u?}UE +♂?2x٠Bd9,wrk|C\{{۰+m)xW$.Mqe8.W@#g aH^M].21ɒКP۾.7?|,OFx+dH%;vs1+YG)Y!Rs0}}Oic҅7 亡w~+dno3t -le'S#ã BhQ(;^RY tR8e%2V1/*=䗲_yYI9 @?OYDyF3{\ #-+{kc5?MMB$90Izx Ht倸~5J0 FbV9S+6pofdY6az[M -!+lC@vV;|GL_vwˎlřagEG=4(Of (3ɬX,Q _ޔhU66`Fsc;&A2?ty۹YXf|gXyv0-kEnkP -YԬxy3 FOpbIAjK4A ԨBojΫ^z)UY1~}E\*On DC_I|v;_$yq.2yv="ḓ|gO~J}gԒ~b$Ygةj}}ʗ~`rV'0-elP49L5 -K{ -qަQO  O>kV*+oJ[a.@aNA7Z(o鳸u;ԃ(/Jk!9Ʌʯz[k#_FgJxAN/LT{BuJ2rgEwԃ; քz.o>}ILOB8>R`{Kk5jXӸ%-Jj]9Rk!bA{[A~DUUjvnW*u~ 1۞UU$H)D7gO"B]۠=`QFQi҈ b"GknA7K -EVo^Xz̭릖l]Au2U*>kB]:t9_1Zzh%Z}!A6&nȬn\muU9pdȼS $#KI80ὩZ i44L -&OF)]MUD9a$+;i5:\l㗌EeDW…ytwNEC1^V',4IXظL-}fq|+’\'tyd*u15oϷGm79zu],$}8%81&ÜSi9zo=w-c hȷkq*^#kյȇ[WsW -d"LY euCvu'cne>KQ)鷴 9 9 *k<1ș\6Qfn7,tNˑј -z1HIednZvS67{ӯZϹ]CLkl,]W ~M?7$JO(L'9!lrQ?5״k.3E{D2(N{yM/{lLeu}5&#?p;%QG~6;Au)+tR %35|U="E'׆vf)x8|io@]4+80>Gf9&<ʼn]&KeB߶NImTL. wniwŬuzI_E63,kT/*+YYպ);!l6<0&UDdtMfG$Nͤq5T˚ 9.z0sGG[}tm0_yY27О -Z`"ښ2Ъ/0-<\iN< jOtfFsZe7BgГz'j&xvа h'Y6:B}:ؘKvCZ;cYݘm5,&^8G ȑw~,[bfR*~~;q:M֐4hVy4M={rs]q9]KRl& Ku Zw9܃ r&uAL_4\L}Vچa(}U1ؼ@{AR+FGyҩ狼7 `\kR=JHPХ`u#NW^ao%iN">[\yϖD?0J^qEMIE0r.3ǼY;=8îr+ r +xڭweTm-Npwk=8ƂHpw']}wfΚ{ϟsGzU]onjrufQ P +Pq0ssQ9(67 Z 4u9J@ `C<6V֮:M5mzFFY;gok +?gؘ?6]{k.Z doVo0spmqPq5Xڿ]_vMG &_wo%fϪ#'lڿU&U A<}x3s ~Ί`}666v?>:9:ZM? `s70M[85@G9@mjFk ^ค~_;`SIFa~@?5b:;Kp=mw2,ؗ7cq7ը%X:7渪QvN;Jl_N~)uq8 5G4 whG/a{wL]=M7/ywcG}2>al;DNXވh% Vp0̔o 97!OMT +k"_ Bz iۮpM Rx8$B"t?ۨ[ + +1Ud`WԉgGC[L8<:gGEVTπܚ.^sv&=g!6UG4@4w:i3ٓI\f~)*ƿJqبmSVAK+G&h.~V)68Z:D`߉%Ԁ~bӨ^x4]QL&KT}=@ezu6T#'뮆k6Slb[8i CW*,kߓD'e;uyVGd$'-+`@[[F +v ;vs?9)h Ƴ7IMJ_#T`RcD%sjӯ+]a# 8o][F⒏#]i.!=meK +5(niqo׬9$t02R[a-I?ã]k D{< vDRv)]Pa=8* ̵H_Fx,WTF^VHvxIv:4!϶ v+3}-%@tRGd;2}]&]w~no6ȇ[27ޞn=S|Ҟ97;;GsvluFڋlONmd"Ǜf%W`6gz[ b~FڊZQˢ/Y(v{xjeX*׫n95 (A.ߝy8cn 2/~$B]I8~ޝO80>²E@@~4 T `|T%bj}e{h]dWIl0 ӥ:v)j46j'Y mB$O{pWS};փ脟$=x&)\I|N@!u<^,__ j[ |+5<1I P>>$戬 +j0w(dRu%YRM0-]TCIKK9KI&)ttI~× [u H$ڊVdnw?p/1J%?b0,r. ++r\[ut/ϨmH>'*AaavTՏ?k,fmTKbXctGGh lfI ?^{lVJM5`CqցGLf I>G454˻HhQ:*D}T%+KYv:tuc69H׎jNzWjg{'r܊P= I)`DArhuSSDQ /$"ϥhM6C-/2 c6!8.[6Kn,xW^!\Y*X^vjjmCN1~"]]2ϐH0e?߫;1r3^˜qHb!B&H@>÷yK]ӨYDnѬtsW/,<Z&2 D8WSQ4onG=}}(!Fm'3.UUnE0@<®m9ʑ6'dc, wEEY5|!q +f7wW ѡePmKأ_K&͏,WOxe/!*SceiY1חkEaLvcgV? o8NEZ4홢r!UO1 _bP &8?ms 2]C2)¾A[*E\\˸Z nkaɆ?7Sҍ jE+fpɼE}]`u*x?4X~H[WI%Ɵ&uBK$_nfJ7]ꃓ5p껤V>'J*v' w-G./a 9D\ %K_#  +:cg慨I.3zp 2á7Fye,Her[)Ycw+K`* ]ӁlsH]zPP^&9myOָXA <1|Kʔ}n|Q]*&jg#?i!,`摈QUj2,zYRiN0{IĭbxɥM~GAp{r]MVB}A ,$f8c^s_hk$4u@`P4t c7ru"BEDIy1ľ;T M006惴 }ū Fx}uNA~O.L~>)u(+k} HkBۿFG2n˽ +ԯrnm&Jqik ٯ:]= CAR;('c14Ml0)DD^  +t6SՀvDm3R=̜v̒~X<q'9b_a;7˚V8LmK`g8#M S֒#. +F'$LS}\ IZ`NwX{ǟ(HzoN|$] Ŗ*/]ArTUU/؈Z1xV)V~nY.wY^~MB L 442ߏS] da>HjCO1;f?#>-[N&/~),iE|ejlFF(ޕ*cf4+qs cjgb3EtYK5qC=O ?PYPYGB|e,AYgz9i'Ye2T(쇢LXan? E 9>WQYh̾NWщCiklG ð +aJ DVPoUjv#Uǐ|&Se5 +1 E 9eR\x| 6pcj[j{Ai^mIj׍=9VvdkAv‰WQբ q 芄j+J =*^?t󴉮psjuG4W*<]F d.H7ܻK +[Q&7 + -ʥrӮE;:gؚӏPr(=@s.ps4oeîTQ\Cg-y"RL?%ø_ySI~] o%=^yݎ&up FˢdʺF'*!znj.31:ER6u `5hLP|]OOO{etdNO):%H($N] Q>4b%9:tp&FYOt $lY~fRTX6~Hu {l a#>AN hk}tsJ-jnWcZ6Zح X @ap䝬DvDBOd^ HџK5xv9 qc8o==>]mLRu`ä +^[) 5 +D5V1x /ctĴl.ͱJDr&_` +q4vF^ QG\tlz\c;e ?ai: jYBx;GVEVH\64IWzicd"D) hN2/ZE ,LS.GRsAӷş$:]ys\@nd7^TCRLqJ^:-1_P>1@8Y,$D TwC]Wueƫ,}!/{bO)w%wR:fTw"ebb +la0buƯ[3љ;R+@T* Q0|nnK;T@ {=^B,\pü k +uZT&}V 2:^gƔ_P٢y'M`TIXq7a x1,%fPjް&~/լCkVD9z%#mڒɌ%4I;@sBZjL}SԦ!I;E>(fx|$8!u+ iI +( RNh8LOpg2Ì8#iZCz3 |umEvqUV[Dj |!r2\9K%*mB :+MpmF=߹ZyиU}nI(V*pxbTծv:"lt~@Ir} I?ؤ +ݑ#q|%L{((]2(%jjQB_q_xͫ"mޚ*)9 CΌiGNk-)2q,()7E}Pk7Olyſ Ym5ɟ +w$yJĹ)GQf6ꅍꨡ'%ň @9ڇ )%Eq5/1qY~q3*#4R*,TsI$cu+D> Yx-;^2k]-xî7ݳC# +*gޝr[9Sf~u|ndųMZ@ѷbNmC ‚PPժ{pjEzZZ _1Z+#x28!tUm[Џu +C&V'v,&TvNQ2HhE€$>k|'m8u)ekXC HsTSt_?0?y>V}KI_Fv}cS;xk +mҗ % s<~ҕ,މ{4lNrzvg.Rv/2 ,;j:m^ͦH]@u!IF|Y16έBP9wG=kBnXe9Oh %.X$kAO!% <\I$:i0=7Fsde\ޚÕL%i_KeĵvJ +잣V GgQm_=,y״sUĠlsQ>bfgGo5bV塠8cnW25dg< 9|- Nw+т{eXF9UͽV&jwg%,Lh kT*hWW{Yu\RAci^evtWmlwNZq99[+,Ӫ.$\/euWdߣ_WPHssTcI@,]@d=r06 p*{_eޝTH$)%Wv20NL + 4| dNsyٹ;k'hqD#'L6K|5G\#!%\]f^?k.K}/ɘBB)!3-_\}^nDY 0GiZ%7wg ?SNOy8ఆ|1^M&Lx߶~w;"sH=઱;6`/j?P,7kb# + p$Ff qp< hNE c<`6 +Nj ͎ |H[Kr+Es}ʃsQsQVUѰM/קm)B0ҲD"]Ld봻6qf3|vN)1Ȫ5lV.ZؔVoA L86BHW"*Hg!quZ_(Ek'"TV$|4{5`v3e՟N|;9vS^(7B"{hl-=Q?5jJUB/gԖfoWi MXD%u^azj,0ɣ~X?LI:AB%̯AcL֖CaP-d)|p_D!wƊ tžJъNnV r9ǼtIpl_HxA2Gt`gqF>׎@5*w}2훗]I^f_N4KP7dut?vYD +b'f-O}Q~E4ۖ, 34EX/3+I7@7xʘ@DSMWuiH\|9uuɩEͰZxTbaҌsp=nZ*?yN节7&Hj`Sa[d/Z/!@YJi6!DXuX*P +a&'>TΥiykه`p4n`Ηꧨҟv8.h(=3`BMt>L ̀'<4{rLjŶЭ +}.Nbni'+Ǧtɋ@pgZptTBTq3~F5n/43QL z% Q=\;&yYx}!aQ2u jV>Ure:p}`cbh%#fRFA3d/[E}7/-LCt|)I `9Xn3)Uȴf8"6?r=:lv:0}3/ω# .E$2dye5ë$\3vH +n˴pfM8Mw ͊8Og:%3$;Q\bPA{?a#Cڸ}tcz endstream endobj -996 0 obj << +1046 0 obj << /Type /FontDescriptor /FontName /QRLXJK+NimbusRomNo9L-MediItal /Flags 4 @@ -4882,87 +5286,97 @@ /StemV 120 /XHeight 462 /CharSet (/D/I/a/b/c/comma/d/e/f/fl/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z) -/FontFile 995 0 R +/FontFile 1045 0 R >> endobj -997 0 obj << +1047 0 obj << /Length1 1630 -/Length2 17682 +/Length2 17993 /Length3 0 -/Length 18533 +/Length 18835 /Filter /FlateDecode >> stream -xڬeT\& ^hpww !Cpwwww !ۻOv>?jNy< -PƉ 6rvT喥W9>@C'4,,fnnnx - @AMKKLFt(?\Vv@OkG dQEMiyI@ht0(:Y c#`j`lkc4GO,aG!h tQ Gg``h'[>妶JS hhs|FUwNNv}&/'̧dp909Ys+ gGf@p:X?a> _7rg 'G)<3gLcf xfEo\j?3C;h -(o@2 B --le%oh91%ch3Y?ch r?yWk ?I;~E& A 7"`jhٳlLV 'j+TAƖ6oVI׿gTREY2T'UwG5r& @y>fa߄ @nϺUIۚ3:*N6&?>I?{ h dkh+ͩ;{hBLr(Ȯ^ ϷʶgjwkuC{۞ HշdE.7uoe;'?^1bکF&^©vVGj_2<_ ;$㔺0SʄLJoCн{Y1p.PYZjј4B7{OUwA` 7#7} ƹ3Cu\e&B(o$OvNV P=)*}cjƒ֭[ɝ |7M8]i-`Yv0t~vG1/e\ ::y)괿U𺗷*E$@%`5y@dQx'MW.J -g;6U PŚ?:I"\4,u]=wM|mIZ"[-zfRv!BB[miw}"Sx˕?&,@^v]#Jt@k4N;rTj3MOWj aTwPšOC\ 2:4^ bS<2)Q^cwN`d'^֙Bő -- -1ymƈl E[@TV\Fj iK,OH]D&2╵~KV_$T$KQMcWu6mRX%Va%UG5)Z [t*m!4I=a6.-;]8)ӍͿ30k!˱q#ln`rqp2 -2%Cn# -ל-1bYj<  #ꌇBTQ:RXh"Q VnH%<Ӣ -_Z)\{~'rVn,BEUe HܕL\k$th EWL1ƚմtx}Rkw~?h6Jk*)X{->>ɇ.T9urx\t!e̢KY}MabչkqO; -Q8q_;3s0#__%I@$Dp8V34#}څJ\MuH89ύ'uibq*DY$aAPz5XgݷD^`|EZ? } #-Ձ%DI4L{q)#Őg(1{U4\޳JFLܛ8MtDEP'9u3v,oJ}#ڮ*JHNym$fz7ۀw?1X<~(yEvs?c4b3: ӳmm !l2! n~QJz5~Zֱk ӡ~_Z6[\JǦC3x'^MO">At(Hav}]I&GJnY{3\PiM;x+힥f.V`:ޯਲ਼>;^}n>ϯD:bgB j+LpwH6iF_)YTpeylJG]*'В: 1m¨( -SzfVdvD_ xpBL 2fݗ08FyAx'YnXSubqv. R1lck -JC6 R2{|~Vyn?jQޙNAû*xn;^!? EQ[ŽX sIv]䲖9A:+kJn^<\9,M.@ znhJj+rK) 6rG/Y)<#-btQR1GT9uzӴlJv:ڟ1a5AFeW!ONkdiŰvw0Ψs'E`ǭpz׊o%Ëepmw,[yA4{d9 -H/"~іpױxoMcuRHT9~bD{gj=)bd|0} Wou[8fe]fe#6W3K$#֤wmDIsPpY~XUlGV3@0(U=rLCv[JP:ތfK7;(#c*̆W6,ޚɒiVbUuH[튙P oV9UDL=GQ s29l"C\z6dtRKt;?whZ [î6ՠS$PĀ}nG+> 'van$KUwqK70hWfb]=^[oʋu{|ĝoѩ!t?}#ݝXMeDt1֓\+OR [Ǒz]=P^$Ugd׉a;K^p#6wC%slXҷ$ %Li.bt:(;S[aO|..Ͼ I9/rɊDD'EhӐsE W`ub!Jx؀ĆLus+305toB . K"In[WK`w$Qb`[tk+P,^}֨f2ά[4KI.<ίSDR[P Җ*oZtd Ż:f2y'|*Yes/jSu#`Dhsҏ&Z2`ЂѾ%& - p{IuG4\p 6W_%{ H!|sB\a?BOp -G-(o џ^~Eϐ -! oh2\_$$ Iҟٔ7/Szou"!b-8J'vD&2;Kk|apKb(O":$4Q?r2r@Gox(5bsF{m)+_zY!Y![],M?J>ʎK#iȪ/+ku4:cU -/2d*X_2l]%$~RC7cϫ t2B{rY&V78LL38;ct7sh߸]sL|(Z[ s'AhE#"Vhz^%bY%Lxke[FȻ\}VR1H,pz)vrnKsN1L0v:pa%ڹlt]|\C{/ŖՁ|BgŽGE#Kю4J00p0NS?zMƆtq&iEf96 NkCEMŔGދu?cBE>ȷ"#Y]|*}z -)Ax؁>z[[CVd};*3G2W{ׂ" uQKU < .fA"^ŝUäa\ -&J -LXM#G}W|Bp==tʝЅQ#5k ^M mWn}4凖,Z^6l˨jt|e6ĎɊze_)GB%7IC,r&c 0YB=f*^%cS $`u=6KƯK)+V[8 -j/v0qM*> [D?)_ēLRTh'U~03Hbi2/ȃ( -PMt)"[ੈJNd&jѾ۴ИLS'T[:o\%`4,vE]pETWW^&w}}|sDbl v ]ݤ˓ |6U(kwMy[0lkX-kGB窮o6 HS 䟁$w[P gRF{+¬@Z g!;DUH÷MӘoT4q-OAef߬Y|ѯB݃sSzu 903>jSi10ʵAgUD(V3笠 jȂktfp%0@dDbvs}.e,f4BG,7 \@G tpP50}p]hf;FT^~-ee$<txd7Ad>m2(Y޳Qrn L~j yy ! B3@ćĔ8bQ/Nf UF;'3~t2H1ˀHe@aҹ 0`Ks[ÓoNuYy-t3GhnÍqPFs5(qqUogfrEQk_  6:hڇ$`KYQ%EA j(Z}'ӣ`͗J{L^6&0l˰[î;ua[\._)^;~zdWic{$ifu.1JqIvT5o9*rL -c<&)i7m!3@Mlgl|,߲3 W~ (;ϙm{~+zWE28my!|'./Iq.^-ǑڮI*TFو -ɓ"HwF+[/[.ww5banĦv ⡁SjǠ;RAS$pE3Pf* -WofE7B3C}פ~Pb~ '9EuhLC"E e2^_dS՜vZ\d/1yXӧYWk:z(Q})iPʈtSQq*6>CEk?!ǹ6~M@S1J/ٙEM偽I:wFF`6#\zW%+, ;y|OloCBi1t}F^ɺѝ0I[kRFVQā~˒@4Q̭YWE2)K"kk||6 n -Ozq;y1]v͹mnw .[BD}fhf<ñuL5궠7$tK  ^-7N4qo0"tE$;= H9˲ ߳RԜN+_C] -bc&+<8I-) -DPOt>R O*bcb[Pah: 0;n|_ wSd\"SCo00-#*G<.h]7 k6n*~]\ F8جA0{E*(qt(fE7y=߶DH2~E9]6~JD3-BL\@T3ZSiNOXcSCc!*IQqZ+Zַ@Ŋ% -_ϠBh;m<mxϨ{b7ʀ/xibm:T?ک\W-|EU&+IV Qorޛ)L6oNCzGCc UrR.}xUɵ8NW ^zmLLFA^C~Z-эQ?DZxs9]oC[@92V[ڕ,X_xgڤQǎYMKR8Z2RC0mM;,JRKs# i i}3B UD ](7 7 KrlyC%!g$=צjY>ËkΧ]>*$AB|.Wn?TeE˶U+Uʥ 6邇 dyajDBU0vΜEU{ݗt# @Ɯʴ d`0?:͠F)ꀋp=R]Z(/8Dy'EHt1ThUfd'Q9. ¿A,E* ^LF=F(15Zbt@7$trm(4 OAf[P206|L""=o#t~]6~T0K1,C)@%<,Ixoz2GޟB8t; 1YoԤmq߬>v\9r\x3"jw?Nl%!q\}#";oK"ᣰ0#EtL󫓃ٞd$+:x9-Hl֎}[_;b:TYM呏Kn+q n@cDj?h\[{^>| r!<{E`7.W^dx&qўYPkqU]fAF5h,ZBA9rq_*dF jd=Cfdgј`֢#5hcKMWÅ;e,^4mYf}橮>v(VgKCT;8 5ےg%ʠvj懸I !7Y:Dm4,2M>1(f*jUWRakZFo[0;,vSXAh|ב mH6qy+W$-u86Qͬ&ۏjE>l^ 㟠Cτ+ -}%ݯjs;&Bq}cNYЃ:PLPVL{D\W/as}zJ6 ߖg2S Ib:P?Bx kB5*]O׾6>$ݷ#OM߻,%VA@OV5,tR2noW!R/@~pf|0 Y[4Sf6ʪ\RGA);Gt*^$|b^P[tI>_mq-es=`T-B}/Һ֕L>x^^?˽!9R(=ɥdaХfK*/G R2%sS8zYng\])eg]|9І`+Uإ'cu4}f0pA4j6P}XB`%z4a^ՖWR>Gppb5t%th-0ͤ]^ex5G}Y暊.TR$bSY2`fT&% Zew ӷuH^z!aQ0K+sJd[+TI@=g:l꯸% iρ0䄛{b湠)eүʬBR -H0,^qQ&IN]CN1i>,e!<ϕĿTȸ풲k]gl nGopI!AA4:g6iekezCknI!uLE^hLdߌtEOEa}wM`+Dm fsy1tLpx5awed_mn\>.S+B .IC>1@Ybr[)P:bp|?V.ښq\:cYӪMoˍt:笀3-3}3ߊ:x@KgL M$wdZ}řB\´!{1N$ I,䧞~b)Q9(gVEMq2/GH]c#F(r#T,WDC79sy)ZAyWj$%6^R:޲; eZ '##cY{9$p4,hvn)jIE8%DbZ\)b֠ 4y=6PvvV|- :UtRA>}8G|sD c3עxVəbA+klvs1Α|5wx/fӤ]s/ kB%5bAu"˔Hb.JL^N6@);2f[U P/{c e/YwK;9:*Of_9ìC__ "40Dqꎮ&m$/\E[*^?.dk#yZ*y+S9.F(cV󃹚Nx}raK۰ms's+>gU;g"<;.& LZMjA_gQ7쑠(g'R9S -8)hh<_kp$T_i@B HP* MI) N깤p T;YH -\t HDҀL,B4'.xEBgZm[Іqk*4:'3df/eh?'if);E׍IIv0-6KvioO6KX -T @WenpnjAfㆂź6@%7%^ *|f$s;)[Cx[Qץ-W~Bz[ӻM$.l FkWbc.I:c|i8us}\8.ɤq!oULA 4N$=CS$+:J2 [y{ !Bz qsެtZPYJcF9FUXcf۱?GN+<Î;iu3F gzi3v2Cc1׊a}իx'/k70Iy-\g{]>fJ(m àhufNZXcD|x2Del}ø7{|~%cDfq([#dOZpI?_ŵ" V.\sA\jzG@k4tNu}ٯ`$ -riE_YƤ`]W>z_ %3ULv e›>\K72(s[796E_V~1Pc1yr̉TE3*%: -cJ  S ?⚕^k*g4I-c;4MNDI.3:OXUX9>шPAEn8 8u1vȾR‚ c!dfO[Z%^#S89Uw!ӹZ`_UوǘLe]k,*bi|Pi wm)KFIZ9M@NIZ-d=΁>Lct`nˬ)'obo

%Flfdukd9?6^eǀ}b4/åEԯh*A"(5GOt&Z6yǾb܂gKڦ WYVI zM m/hFvY.D?FYsVa6ހ7Zkz\dkT@[8IM` " UKsy!W Fba}'4G*5bh㸶ђє.z{ m:J"_,h6撐 b cY7ἚvaIJ7[.H*PkЂzX68׈gRey2lB8T{]؉%q'(7 Qbe]Yf$םjOS6AJ dҒL\:+PgR竽! W*-EIv"~4LC;4,s ؼ_f'B/EO/Q1^` ;7jTR ?c5vHw7gsg); -XJv83&AWz_Omt56#31$}%q|zf&c$/iuf=l&e 2D#{{ r4/J'yk1>b=ERD@_,ܻiTCԱ`~s,%Ts?SfhUOtQם9$:cv$ "D׵ak 3[YN+HirNQA:Gp an =3 ec5 9a}?~kav:p<ӟmşdq鰃:٩J?V$W6A"q^a>Q-} | jшkڋ[G*F|WϐWoqPCTi]Gn{ɋЅ- imwo 6${wVI<̥`Qm:-:~]Γ-t|;c:O8XA҃ˈG#l hÅdUe*_U~qR'#<.*j:`1G `9zZHnqJBdMK÷J14y}e$Q_KZ --{Rrr5N{%:}GTU7AZ;DT`hX OQ4&Q{BA)%H qNXp8p0j͠Ȣ4Wᛗ#BZ,3Ƿ׷=LL1g|`X%}3kݥ+k/~-$])3Q|7#'7KBnx/ zfV -*Tp2 -x^Z{"'*v'#">(,EA#|asQ$e &% ,UPu"xTڐ233ϊvauu˾ /Q J8wpſq#3B -{jLU)&hShfMzl*#YmO\썃|IvA[V#>n3l߷;m4o"voIBҩ)8r^'>Xa)Ir|rq ƣIDVb|Z&dmD Q ?O*۬L_U^%v;&ETĥ.{,_}7]{tY`BQ~vi#mWY3[*v8cf9k;mB ŇlY7 Wuo?BL0kp +!F -ȪVkkD),+qgml4Fe^8R )u5dvE\5֒ +V'7ʘuaј!Z*pRo!aT7m3taJRA-,K+a-,~ \%lH5W1 ꭬Vp^lިvԇ]_J ,'$*ɹ0 QAp4CxyZ4jм@]?wNOzB.r:67 -8)VdGrohEg,)mq*XPJ}XJ)hcfݥsH JGdKGaeʙWyv[K)$CF3C -'d‹vZ2MzNdk*9L?8܁ Mgfn `ѽ`&[ro6Xpت:#隷"L'HQ^mTe -1,qfLQ!J B8oa1*>[.^zEo "%p QB„n84](~u]B`W7 AF+Yb0qjACbc +xڬctf]&bݩضmwlۨضm'b۶}q?c5q5ؤD +ʴƶ&b@'ZF:.- 3௜T(bdP71a[;w 3s':%55I1毧@Qdn06+hJʉ(T&@k@hB 0uX0[S#_,AG⯛?*w#N ? +!;ۿ6ul,*;O'sb;ZUlMZ9Sҿtaj ,'7b- f`4-f /__u m/ڔoL#,̊$o\L foƶ@kw),ߐ3ߑ'?tos3;1Kg2߭MLo[facQX`j`gM-&W[ MbnadLt+z uuq%%łApRqF? ٺF)ȍ gd O䃣C{n qcaH |N>!^]+2[ԫQT]=p Ib. ̾A c]/CCb +hDŽUt:%ϖVR29c,#S Y7?Q($3B~K1p )jEN}'C-O(p&RI:SFxqo iBuTÿ,yS|Ҳrvh?) Ur'Ebæ+J2.IG;U5a_QxڽaHST/F.ׇ%Iqްwc#vvnfPrFOn"7~s̅_5/y !- +q.w-(TL=C+[۴9/B,pyW}rJ L,u=.n%c!.7 +x`#ȹ3 KO]C dZryՈQ5z28($_bn[L⸭ zuO1qo_",*VdR`:G5G@;tƇ|fA@3ҝEs4f Pc%l]EH0\U֚xyܪK e'J6v͌ϒ\kg/OW :*3D&X@0v,g9Dk^Rq.7UWJ8i{bH 3lvr)!\+]x:yp4ԛeZFT [A=l@'AF5&p{8b1u6RCJ/*l)J˭Lo[Ɋ*&UFv6WW&IPJ^Gf ƵSzo`x438ߗ#gjYYR}V {uClpx9(J~dְz`Ts#en i2H]6nsfo2 kJB@$a.d#?KCm<ؾ'gp2kP%(e+x4zsÂ]Xi2/)VzQ} bb.E;zZcKF ^|MtecqW{޿3N!4tKƒà5ݑƕ2d>2wNҳ*ܐf>ۤjB5#+nF-tCt;.J2:|u5~M; k6 B~j`y(?|E}qDoEW2^ +}%<ż+%exǣ4I$ JuF737wz/*PUTl3ֽr/6v9^JJ'\)Q4xՅ``H‘E}U$T>lb@"J@n&l@>xgtbح@7P5 ƉcfbGil v=]"r3XN`ؤvڱAq +](Ih!W-3k*#:T8*9h+K +!;vU^lj 1-vX{"3HPw{, !-U1Yl憎't+') +T]ְ|qo4Ĝf֩ -*ъ~i"$kYm-3:'5>L[bG_sǾֈQ.l oR u|ݰ0u$WZ)G+ˬk.q.UX@2[J¥n5xLc"= UE0M"bB*N%4^r.C7MKs{EW1a~K`7fMnP>X0޾֛RԘux$|f%U] HCUu’d9"jsPq -<$`= I jٴ{$BUUh4O*75J`!cY_2T{қᑑJK'4?WK +gtz"_3 1t tt LΖcJaxZ $pn1Cr*:g2ocgV`Z4l@ꁍTl9h R])BbycThs7Mـ +Y+XYmo'S3LI?VOfc}0$X 9L;RLz}x|2trP +DA [yƜk-;PLj_&p LՇj{)5PߊyO\L?eK|iɲ'2y:H|{p!ؼFs:;U@&t45e1)Z29p9/9D#OmEO@֯ʒ)'ӱ$IuOi2^'[wOQM\b8T:/"P0Rc4=6fq *U1]u<4!󆓓oǛT8>w%@sY} +_6|γ!8-MdⶬC扒qt$&Wx_Q"fYKI,D\slq6Й+go1S(x#:E߰uЭI% +Y V׏ni՟`ʯsX՛M.~hfX% iXOBTJ +-BO'lg\)ւ2$H]$9EH}Y96=).vh'v#̣XJjIոI>! iO{Ht?SAOJ6H0wn~d3\nt +c'G}j*nzTP\aC, uuEk[`9ހ>3UFr{)C@Sc5ʯ]JSz9~L,&twv_."pG2UIUz*ꈾVD-~1,]NBIUl X7F&cYCp(͸L $~㎘p+(6-aRGB hb <=Cl~&@nז"\kPU^;?Y}-Od@r3'~P7X[u#cR* ejjwNت.I rAFE`lĴoW#pERO-Tm] +kIwQ)"{PnkzJR9%z;*O|؈[<x3ߐSR9b"aE@ݗ\ t۬uTT[FԫQ/}8>)SZTcӸZX!B!%(;f $:`͚n[d_2()͕l$ɂPO"q-:#$MB勂Mh=CEdMʒGX[zdn;3^n$0ʏI޳qc2ÌVV=2*R]hGhxa@SqWosSZU. +o&IPNmɑۋϭϑ{V^ڤK =ҟ9Vݔi+xSTfYf߿xlkWDQ|J,uZht৳UW5¹ l?CmedgŬWrqam&)آ1k +fxIQb1!׆N$\ ǢaiAMjb̋P:zܞՊC +- aGΞZD-MhD^յ}Xځ%N |[_[̃'8L~s|]8hqO@<7T'|<9'̙qQG=orqiP<#yiGQ;;lzluq DERՃe|2a)c*e9!7 ]xj=װns1;FgΨYr< N#GQG$|Yӕ[9K3.)G0Z٪U`ѭڛN0i+2H|WuU2pen@?$ZfϱdR#PR54;I+# 1nO#QLq;ObTOd!djlAQ_.ʝ&Q׊"uFxcZ{Bky:M<|FWˠ Ńf|ex~'K|Ǜ[0|;}B}3!ȹt"*Ʀx"DSc=Tp̑H"$PiÉ(MÌf̱攗4fޥHP9 b"RN<6eҢo·O:8:j%Ba}(&QVpB*TՀ/gC8t/'tZv | l?$"S~y׮|̼ʅ1_\zlN˱-udw録Lmά TLִgՎrr `֜=k. H;mU o +Ws+޺xX=Ep(Ki׵ǂt~_8뫬j`]#Ò9dtbVp^lTT)bSuHɼDyGK/`z04P60 + b`OrH^<ܥXtFZ—8:6_aYne(?;}+fу_ޏ,!,~ˆ`^򍵇\cc#<͍=pIkϘ箾\0%˝j'?\|i̴ +?1Wp.kgFP=X"@j8BU#  ,\ֻP r,^dmw{) +~< y囃M \ @E኷aDWAS2晴E8^;]Ko~GEGc : LӈN쒝dU>ӺJW4B wjNNY'rAkXj[0Н_nf4IqPhi5α7uȧG,P P2'@:/q0vg'Ƚrmj=YdrDl(Ti9F ++ypXٙ@ O|dP͟uMT`d!g6Hhm~ZPg$jbmCE Z:0OQ%AX8OЍQ~'~n5;>]F-"Rbm{e2|Nm' er?͈O !}!/LQE#믈Gt8԰ +kBwcfb4\kld  XLEfh,`rykTuQfh@c(c#w~R1VK' +S]P**iT\T- h?N? ,)ǟU5uݫL:Z`k &~޼Yfl&aPҥkaVO[\z>#jHbڇ4${,SoC-SV62#2 PڹXK4 K @ PX@>5F7gW.v=`3 /P_}p+ p= Aⲉ v|ޓI.x+X<@vRv7$VSNk +|pPm(xǀ)`[^LېU$S4؁<`Eh)8Ւ +wm.xX0n; ##GUTRqp2IuK6ceJ|)A3T| eA.+XwLSGF(y:lJ uŐt7n򱞈@mgIZn+&Dc.G+pc\>g,z 1n$It1l]T5;^YށKko _lW7Hl4@҉ONq UgCKXL7b"˶crh?5HV +^wh^{gr"@PߍlMY9Fp0H C ӐXqM{1̺ +?Xt p?nWi;|}q{tBI^TPkDV5?] .'q/fRI:oMNR^(ڪ; $4RGQ#պpj I +{hfc TW&B޷ֲ-}kESotOI{|~W.p y3m8|%ݤSvdEReK`,)xNZ{ +dɾ$Rx&+qg s",~1.E\(vV18lAHª0ZIvKaloJE6{\SN%tNm2f&B:S +Axl]u$8nN/:/!#=5Ti!^(w8%wt_'c[WG0{OxMEF%Y{#z9/K8'e9\l4oI|ZJ70@Re7 +SeA-(nC0 kavcEw-nJ*G-c(E(Z^WHO8FOn`qoc N f-hEr3(3 +%Y<5_,_vx߄k`ג;I0'N_ZּTUo}0uxSF 8D3腰j2mG|6vXp/~r]<CkL1Rӻşl3.Ou^-G Z6Hj B#H>e NE9{w^̃%)ݥ9^M +[}pfEUOo +$~*@1""[Tvկw%K,ES3BOǀB؀ *kY]d:!F]C[OB@z)VϨNI"a?f/N,i`.զuݳygݨJPAB7[Fcru!Zj/BwX"E*8-$ y_K]>*&ͥ|z U  `/`"yU?cAgҞ HX<Oa>i-RRYtMt &F%A3L{(qʧrFEJ{בW.glxL[ Cˎ•ew/E&q_# 1HuЄs{}P9+tHk +z`/I4J_i~web$0,>vj#s]qvn?oDž~l$AmwQ3D:0͡ȸWZȴt|ġit3ܖ(J h]{'%EA_{S  ؒR#ӏϕKͩ[X8q-oE/ +:'6OP 8gpN 5BӑF~#QXj$݂ખ"T-ckf0ڻѣHFHɀT,@NkuBŁzHZߓHE_P^N}3[>ァJ$E޾'V4\<0Rf]⏺6;}Mp2j%$:ИӰXd\gEJhZ\.ywm/š|]Dp!XUtu@ I8b.z uӑqDp$ѻT{9C`”tktPkF ˙>ү͔M >'p8⑟JwVJs_?-3OIi-߂ZQK6 +z~<_ULU.C8U23%F*uyƦQ]j.P%r, 벱XqɇG +(A{}[LUU7}tן38ϥ#3Zӽ>u)mZ*sB8D݀s(Vg }OEa #loI4\fag9_#-'WƓPBa)[ElLnR9uo+3 a\w= +BEȒsgJj- л*>^є[J~饣 ڐ& nݢ((MT3$2ft7 +>ЖN};{y=tJ]-jLݙEg|}AE$~W.3|Ţ7_gXj?6=ev@ÝD'tGEA.pszV@.1ٹlry 4qyBkG D[b\F䃾7#P1Ĺ毩S:tZTZr +U&rqWO eù7'3Ճg P/ߡQV:;\$O01@jLrۖdw0$R!9[`-Ӯ 47Re9svKqt߁SY- sw ;Ɓ +GyJy?treK-.pA0ޡIXlZ C3jK0&:vy3DSaj^z_5IH>+5 Vް)+9X'lEw~hΕ\}ʷV 뼅 |k>0 M0g"{3z'|x\-5Ě6]h |1Z NC/k!|rq \BǓ0`ޱ,UQy +zZb1>q' G$ŧ۠oZzf  +M[:F#*URcr1Wcg ^`q{7UΔGF9 }LȧqW*+%89JΨK02|/?ZiNۆO#TIZY@[LT?:SqZOblܖYhl37^%d*70X "UM[nX,r^m/.AI+^57)-`V҉6F^;IZ]Wۣ &*@_wM +Π}4+H}Jv&ju^-؃)~dv5 (j<;Ƚp_&/w7 e`- EH_x+BTS2n5lN+>f+Fl6Oң݈a5b,{ +(xhnS^Wq 5`^UdVBกQ%L: T> .; !^'4$d|Gg?#fMV9"D+3udyv + VcI  ݙeލM +;GIJ&ƈDMZ:%Jql'HEF쿔aPX}͢_?H 4dT|$EC/jݒ! vz'&|8=X=)aFr:~^^m4;͍?Q4*,)N ž)}o;,EiGĢvZ[7uxdgOCYUo\P/=ي]_v]!^;I Rz؉|yi^/ x8^v CP5ATMm a2Wmչ;n_'3϶i\95q=Jvgup`k*by]ޫY$Buw4 +g TgU8A,-DɳLt:xl҅~l +|Sy&ˇp;WMO-iStvd"$a,S~-scC[jCE)صT_aV1K)G@!Z8"[A§6}NʓI5~{cFQ +>ԇ]IwѽNfh#6rI,+DB|0&Tjӥ̈́Yq*>9\FCA0=?M1J+f?D$ώ9(3NlMKmd\+b?zo@|wa)#,>!fjLM%eAT/NSwl';C\-$`~ws|5Ϯ_A0imc֟YNPwÃ*zVΚjNb_xЗ"R?]O {}Q>2b$C6(Gp T Aq2;^lDep=%f_gr_ tvQ413'YTuBܡٜS +w9͌'W4%^C2=DZm{=őŨJf*G }@8Bl[QM& +Y#/{V&B^b_K*JVVD2!3y.ZyRϹ6gU0~iK,uw˹z}Ձ APiQR9Eҁm$vb_8b:{LVo7\u7M,ao4Ce<jcSr "D|٘d$x&=S?v!"K1ˏ)B `Bҋ9=<Е wLmm6AQa.MQif/b3RKѓ&yq"%I*Kfde*_ղ K5 xx!C#eU{[?{XS*"`E AQٌ(G:;XP ^Gd1}jHsny[}Y*놈dH$ [T|<|X9s=Kd2?VTN撷&:?ҤqRoa&)L= B##:m4=~ru)ܚiW'vϬɦ6%p潖.Ϧz SzG`*'{CoD&7j/΢? +)k)Ƅ(B6eٚG2Ʀd;7ӊ ط^x=j3P{*Rjҥ"āgD>bůo\$n3!-i%YSryђN`0Vw5O\j=(z=)_WӞ+0Jѕ27_dFd&@26'm1my`V'_o.A,9JdB@k+ +@mrqe \Dh r8Y3 +Ԁ +k]}-n ?4vJ!{Z}&qeM t~J;MK&H/uXyϺFrڙ&bY2Vl˾>ܔgGRdFW' 0>#`ΉG_B>eoPl$ߡHO9-BtPTV( M,ιAwiRJM!PP_i^V6 }'Z!m  yZ7uE@1EF!hS@;KRhV'M&Kd묒wiEJ"c-Vc*2Wk3p[) +\LԾ' n EL5#9w/B*ew3 @0 ;9UN5/D +Tg߀k,-4y>$Kй Ss"xd10S۫HgQδX;x,_ TX [hg'U6kɶ Zt1ӡ3d$EP$`8%ЂϤ$g5qI*fW[8t Z/A^X"FDD)ݓנ³Ye<}V'3`Mm}^9`Nc1kta&կ->oЙ 6`}K + !45y3G$r,Sx-##) S#-li/jY픤)yiǕuf=Mc~Is=M9mFK֗*M^dIHB" rv&nO}#wmg϶RZܲA:"V%5D([(P lV>Rݲ dqE5N9,zxNMV!RSno{/A۬g{h$)rSCMJ?TH]Dbac,V^0Rnܡ2<^lkd>!w DeD>]SիfF+Kj~N:B/T7'V +qyZ]ԟZHw|ƳC fb{ER2٘ $oFM`DqN$?jlӖRiS?mi?3TxE(Q!_MT;-Oc񴵗ZnPdt:?0oX|5[2ڛW]}MO,o")##n8~Z8oϼOx\iJS#0Hvy#gí& {Gc!)ǃvEBUiJBu pl??Ma^x\BF/A +.́^{p/k6|5<$-I`qN2= tS^%tb8QqzMdTқ#Iݙ@X*ZȚ +F-yI=(:31,}0:bL GNluȏ) 3\AyIdts#Թy% F6R xVzpbu-PfWV)llTJa?zS_:y`u |1w1ULb~wfmRI"ӟRCkZk>k;)ʼ]-d> endobj -999 0 obj << +1049 0 obj << /Length1 1647 -/Length2 11847 +/Length2 11673 /Length3 0 -/Length 12702 +/Length 12523 /Filter /FlateDecode >> stream -xڭweT]ݒ-݂KpHpws 8kpCpkpwwwݾ}{OqثYUk֪7 $m vb`e(Zژ:;(˳,eL7 ,ihI??? @^CU_L{:ZZ. k[; ''E '^@ v1mXl@˿Jsd}s@fn 73_3`c tX8` 6vlwؼcdʶNfvNʒ鋉_-aN_%ӼN&`GX =;i8;Z-3da9:Ӽsu:_7v]#ڜ{L3`$Eln `lO3 Im M=$2 "ߩMls>hLY5lM KsZd#]!nV--@@eK'/sۮ-w>w'vԿX}? 5wl -jLʹ{{W8ہIKm,<:_k'K7;+;; F -lf ԜLO_ûO@n 3Y[3 TjaI`:ETΔ⇦ôuA9m@4 B"Di-Ϗۣݦ"Ya6MW}.p}2%wZ#y5 }.X VbwUgYЮ;; $,δo~db [D}eQ!8oA6TKs̉ ,"|Z2 ' 9k BCvSzgLO2#ˈ١]"yN4Auq -~5t}oa2B`'wKkO:+3 ZJoO&B, | Źyِ6ɂ=`A -ӑ#s[Z?3ŀ7L&ɱvYsX0ўbpT/>Sϫߍ!\QSn@I{x\?#Ze$:18ѯNcM$FpqqU4-t(gIѺ4Fh1:\ICXU{Ȑ(YrNN 羿꒑W\?WnDke]دUsx)dqe~V坧RXo'$O͛C.SwNɼ^YEs{5nAsmESuRbǬt>mvdXWcVȺj?8Mh RRb"^ O`~f\C ^{ѝbr nqu~/ ^uн;x1W>ܫЭwǪ';@L?Lk'$w|$멅O,l]Sg!zjVM2[A߀}tMk)[+_b|eS29#NVVRkxᖞgb}h}?t";}⮀hlV Z]3OpF ,`,}M-4W-@,0&A wrRYe%\Wq5Ƞ|)NTx%[s)j+\GA#گ f\e5u)<T"75!O8jSv^4މiJktNzQމNg0.Gxjݻ -_J1I+9Юjv?bM\`3ݻk?h@J[bUFۅ98ղsT &ZzBkMmQ#-6}n$Чt41>Iv_pf}3>b y9|g~;lEI9$"Kn6"re;b>&z^O 6lgi gΥĤQqSǿK1׾ŁvaG#ZGw -SP/d~{MڛVHI}0qgkGxM p ߗb6`/"uS %߲VNU釯Y{ŨHľ?Ra Q>!7:gúk=znJ,dsL?AǙkqQjJO eh=tJ" ֱJ=72(?e޵ϳWԑlԁ9VĢsyn0M^;j7J+)K?D&jJ¸a+h#}lOfqmjQUv͔[7K-_NzfA"qgH){n'׋ckT6JzFebffp 0~_I/s-eDa 4mIh~"#e֌g~}VO5"ULkm0=C\ߧq;iCeB︭daLxi)G /vK⡢lJn^3 N`2AɘcKն4ĉxc -+Pw]½Ru6Ա@UǔItn,2)vl3i.ɺ~KBc=K5Ai`;mb({a z:=oao׷yUeMbJ-J]Cw:(~ӪYTg*;ȣopb8IK~4tP5AJrohqjQDnGӸzb},WV@>l<ZFQӇV@gl8{(I?gӄ[thxp<QB87:B4t?d8u~"iH7Դojcz CvgmxS'"lܸj;tOXQ$G, [EJ`:LHU53 'A\WS.e~:˨ү*?Y$.?\PxKeZwln -E}Q -w7F)qD;pM,Ww'mFueL8ڞ: ٸ7r&E$DzWuⱙuG?M*i,: $ -Ǽ9l!ֳ1}[*N^qƽg6,fՊYo[pk<;{/`XJ/R^(>Vݑ4KHjiTfJ - "Ǐ>z,zv3cSxD ->՟/ <-{ݞ>E)ntjd< r͘xsNL(PsBɠC/9H-tKs푹jNI@(y8Vea}0LK˘wn}-K._."ڴY%Ihat&+e˾dnsU.Ylvk -p7B z%9Nast;H,rlp.. --Mo)Br9YRQ8Ie`nHd*$0hP[yni7k 5?:)F3AV*6"/:7>|nȓ72lr߰[P)&NSQs/Gw:e\Pڼԧ7'ZHE/LM;Vp -U^PwB(0IaAүCu?ߨɮmfNj~-X%>h4DӃ a\MI|*NdaΫOdO5$+]c^!fto˂Ӽ9 -m !e6A``COW%q$!M#Bg~q̈́5_Ӱ,4hAŐ ڋyNJr8g_")qaؑPl(䖷%IR W{GO>,^DRE0URˀ/Gi"+ OZDC_p2iLXMj㕄AsїY!Y$-mSFf&vPr;Lѧ@v8oѰ~w(YI -w%1] -TZ!$e_9rJ|YYp]C;<1xl{ĠV9dkf6}Yc^|%JC<n`;~# 8aUPy&ꌫC&5=L\txig3/h V3oqHħwPp@75(]#Z5c;?e`_ٓk~eisC5;F3p#BϼDUz-L -}7T*Do@;m49?d }r!}WײXg!E\"d9cdɬߪo岎2gx1 VITp.;ȗBș!zy[dtꅵc&{npZx> #g}c.|]o+k2-3eDoxAn!Éq6{=GQʝ%B2aRYIF w^-i(=KP;"RO%œLQʏ45k -<4hRE!e -O {/$aka_urζT>f{ܥIc!zX8Y4E͠mޫ 1zef' >.p?c爻 <ەtDAxujaW䶐::'CWh{eThi2VLi3qnNkNe?EsY>Ь@p1qȁJgzc4ؘ$)hӯTeeD(MsΫtDSzZ%Ha$1JOc"x a{" +"E0m߶mwŶ4`=}<*1hO+X'% ,Pg!>/nd",vu=-}UKV8NO3<ȿ^=Q@C3iWnS$^ B,FsVqkD=džW{ʊϜ-7]N3CbS)!#BZ2c@{Iy]} ]9*chvu=eͅ>Eָ̒x(iH7cDZduFr%ax;/O׾tw"x[j 5lfhG}D7ͻ^$ctQ~RQ -kkJ|xXLol, -&y8SGCϲ {ǚ yn9lTL?"/3+:敻 ? _XLXGdh 8:fe#I+j\mԕj'ʲ}|ű= E=Pں_xLX0 -B/qxQ4b-v>+Cޏ!x R d6 -P.Ha2K#N -4$uuե$#-s%Xww z[Tl$ݜpb ER:,R =ˌ[B'D&JX.? ~âujpN-mObB𵉄hTڀ@7Crs佲n41;c}{i>=)K0\X & / pAmB(|[QqǓ v{& E -r饄ɡ|#GޔjK>Ün*}gCQY* 6S5GwB NڶbNUo.FC'WaqQNQi~z@@beBT:_̸>bpA$%I~Lǭ荎-rsd(a{;Ε\Թ,^_*6C xekʾ̢g;飂nV=BdB=wpkF6]<HMȡ0RKSe7u -6B{͓KpՄ9zG5ä"V~& :(,AI+>Qj e0}6,5si&fb4)-})\˔(ޡL`˔sڅE>J@BK:nlmj| <HD !'Thy ݨ<TEidwTdgԄ;̘ZhQiFgrӗɳG|<;d3}y[P0b o{Ybί<2>7ދIJ09{FDrD@e{Rlܓg7bFAɶ߷y>*)?VHO -jWGЉ[ -c8JyxoTT1_Bx.X]}H.Oi$L b1ݚ -2b09퇿.v/hۤ|$mrlqcVVC0{@NJVVjp&JB,<7B (WVY&&[UQ-(yr2V*BsPkXOM B8jqӚY]fgے,oI& bHςqrx մNV=`ú+u#yI +EgN<=>1ODwi @ϸ.A&t~6!\ƧKV.,O\~~(fLyVĜ%MLu\VnR%Z-0fQreGPo}Epo~"'`vh9A=jlƅar"`#|:C(y{g2qmjGorf[:(*Y|@ÌgM,z,DsWm|[?_EOAQ3p1רAi"ㅫL1 +PݶC"HHx> -j~b]z5nfvÜzڽJo;U)0X'8\Suir@kXwZMӤU RmMiZSUX&,W˶Ga1j[QG"\>ODyA6Q:G>{ò6^yz:)@s˔=)ب\uU?NoS -AyHgT4rBߒf*ܜޚ; [{m~3#hX Q)3oP"fཚgFXt a VA$aS\ΤA:-A0#uLbmA~G,X}DmնOxAI{`fW,jND#NYIT3qY,a-s^㓗E"'D&Foun;QҒhQvMj:!OlD<~k"B{ j3/,K?5C*Kv؋g,[x$}8k&^R'<{Ԉ]F# D}T_m 0%|Vq2WmB DރC N+0D4U)mTYaX| N;'vvVފ)Stg\jLeqg>Jv,dbߪ~@U\*&%.0|C|>aaw5(CiaaZ!o ,  ʁ2DUE^\4Ƿs-,ʄP9pbr۸awNdſs}ɴh.@o -@t#Qe"G[9Ff,)"&5Ker&Tc?2\U?j$c3KW?N٢qX( yҊUp;_@ 8ݬnT+, 0}(Fg O!ơWUĚ璍V.Ģ{/V@n5%|[,k_ 5N!b]FZJ5](t#&XW@ 3x+o;MNʕ43ZT2yd씪y6O@? CK|6ejC9WpW%nHvuz -<㺠^&?eT޸/b_n=P!/n\ӘGU:2IY:yAC]BA)=jq&-49VB\dZW騼z>``76$  )|FeKsF`û?)P}Ȳ^4NH!0 6;"W 1,jAnDF2l+'Y  ZГnb)P$i:@&= -:EPw帗 RqvL'~5k$)]TT9WYѾ@te)g>i}#j%냤4yq&^($A2$( OMmKms93up?ܧx8$H$R[A'61&\fQ¹?$9gnwo=/plQ<8%|Z"0_ /fP;HUfT~]փhւ=i>A/"wp0d (ng~+kS5xwkp3aJSdf.t$IЕYF-I:#;ZitLГ7K:ɒhq+Q(0mO`g"ح Ǘ&c+ 6v=m}f!,.[L!ߴ¥e3""-!Iʝ|`;dna>%N'@&}}LF҄"R]&ٽ%I$T%4hU`6l{m镢:X"nXߢI~h4a/!$"9fh5 zC6݊tf??ƱBHdu.#R@F;Mf;|v7|w(M(g.ቢdYPM%4$%ᖿ2no%*P߮ilVgqIT,Qi$37#Iy 4"oW%7F9A|1=5O[us`vnl-b?*)aE1$UWu6NoHrh2K;,}q=0u(q@ӻ66Ҙ`QWmbSHՎdt"/"PлҧZӓ Oy0tZ1\NKGgW)~u%=~A{rAt^6~v8+Eoq ʗn!C -j*G*rf, c -4`R9)082t⇼GL2pˇUV1چz Gen|z&!<,c-7z`\WC%%-x,M9_b˾t[gnHNSCn{%5"ɎG֚i9oẤju侓7488!fΦ^J8LPG_C gh7Mꈄe3А夭^VOl #WL?ܽ #@X {p^`*+ -Mh mh U;2`: />s]s^ Lp;@>7 9b %R Dу7p4xOT_feD'Symf -{frIy_7a 2 ?Yw:=.|[ `rv?X@do{?dٓj e#iAbl]b -|=TG -i6PL<0AĊ@[۳)+r[s_ a%+#[xp!P+|#>񻢺{~JNHU{Ms0_I~v]:>VZ]am_cr0+ꤷ\ΧȲ3r)x\6 +.2j.Eպth'K͜NtPV(ue k"qcۇx%d?S9KjVhYT/q}\zŝ5֧"OsWj$ko"$)KI1Ej{A/6欢hk`-S5q\E艍@I̢v|.xR; I̊I3qm@ |4GXBF"|UޣqĄH:-,0TCD `-3EQ?eU|><ή*sJA@ϤU&bpfy~OvqԘC.$+96YBOwtAiƧRcb8ZOeyݞ5cct*s +1rbr)몤:=(ITh:آosBJɑ+)@ p&UQYN꺭YL绘fiByVے$ߓ+ fUmd C8)V", {jRW5>0]UxtLby\i$bg0d2Qx.USnJ+bC/gTi +VrVvh0r,# L,_L\ +th9?ǗhM DÈD֝yּ'ƇPneo&Y:.+pȚNشM-E%51!kZV 0IcxE52څL<ȷ8vݶ&#,Ę2׿3`<vYJck-`D]nz;U)r!񧣘c3닟p$f +m*̓wb +Jx8czR'3h!BkL]7$ 8}2iv¼s/1o j-{tBx/@an,ܨtٰ!O$ٍ6xZ)5a ]L׷o8V/uM;C5kM%WΥ_)aҝQ=OM.}Zu閃G#ͨ$bcӈwQ-$3!70P\] )߳&A'/o{e '>Vȍ䝣~ v!H,ĒiWqw/jR0/Nsn,YKlםΘ1 C5R `lDl@=M`9S01ՑYswM¢(18?={/7/A Q /k}m1Ȁ{4mdO9#0e2a6f*VcTh8.6-;EYojt7+zY8=63-*xY@{#}vDDs=w,&s{p}9 <9v|L,%.0 ҀңUb?myh+0^4Xe` . ی~21G|^n'}w|phП𡔰$ПNgL|E+S1)G@gs[Qj3p4YjLes &U3I^I׃+$i|P҅@z3q)g},m{] nZIa$E瘓ڢoD3Gh^sĢe$oCh\k{ͳh)vh29k.f}*;Dml3 mMX"a֒< + yvAO~kuU`V==eJ՝Ï Efimim,|`҂$J #kGEOxy/EitݎA?_e=RG%oOљX9M|ۄnN&/X*7M~-f$: GGO݃ELAs Z89\aɘg޲_ aly̪G[fsm?Ad|!%sL%U b;8 D(49A~ CDD"RD޶$𸸚'XNF +3w +,viظuzYVk["F2PVX?W9ZuIȽs + ȓY~bXS#"48 DJVnzkn_{j*rV!]HC~գU“CN4ZT'9o!;+v"2gBF\0-o4k<7c wTq],KMV=9>-{V/E]oDGUwv$0X;ilP*1Ěp)PhB TsE՘1ks tZCiTq[Z$2ày{;q4:D) 0a;+"-)Eܪ*,/偂5e5IJ gC߂W:?$NH@)]PkhD՟}Y4ogv F#SCf4K 9D2~68إzT{S;/z OR[ du*x9K.-lȊ.ND +,z^aijN m܆>U/ K! -D(rw߶z8IWH\^|,aq%-IՄ(B"N:7PEMAGB?)ͳpsm}jw?: qc5y.#&xvx> +twv%ނ} m%get` ,$gl?5RG1 +{8NX`]!tOdПz߮c!C0lԍ͆Sc$Q1cRxM +w,>W<-5\xh%i PKKq U)޷=k:g'vjXz~#ճTb0 Pدvo~]zSerqp``rX_G2ytELr&%5oij_kkj U1Ar[%{萇P[DKn' +=Ҹ ?!!Wkm  l}l[̭9X8-A[BX(C\?st ϥo\xJަήK)ZX 9c[tj'ES 'ɽȋ񏬳)c=\A&'谇ƮrTiͥ%I +'PF6TB`}lEy~EAp[~g9̉ܝVb\>RԪ:]9+E%TC˄|dtqGHzG r&(':).b/Jz`5ə=]꺨#/W,b zq?wZ|27WU|0{cEhd&.*f1U@,VHe18IpZ$T>8BKzV}yXV&)f$=?))=0U n0LEQD\$t6)*ZN>hK^n#h튱 SٖyL,T5MEiԧܹHeϡQ؜%^P|(dmz,}Ie?ԩۍBaF^Ujb _(];'U`'=ju4k N.Z 4aas*aDK;h!,\zRG_Z!OJA;[ެCp"U:EGEj#enϦ(uvjO~v0$!3A=:8G Y:T,z04IP>'"yw_שbDvJ8SO0M2Pݱ +}ϑ^N%j~Rôf_t K/0GI e$ %^Aq.f~kHQb+eEnvYUz#;*mr,VA+V~0C> (L7V)qDb<\.v Bl(+ crVΫS"gAfjz6{LXS6"xŸf'm3ZVL;VRO Tȣ݄a0Й<|?Co.EHtw9̎;ku=Q~B)<[VC +qC2vF?iȧΙvtO .Q[1%Ϛ.Û=#G{C77 k~Ks~[tl}~?4[$YOi߸ mQV5nVpT&#W%};02M#XObU$QC"Ғz}vfV2VVx>lp7sbf=ʠXXU]9w9W*]Xܭ%3uF_'U!__6{EHN_OJ&[5ZC@Щ+獵/}p_Uys:ۆ49&O#3{͂S4ZRmO5>'Q43 ?Kힴ~g O0WŝጺSG@gWj&vI9xO5Ly\-~^l+Q a]]q7BBLI S(uA$ѴnP#9sú9^iUX0fHiMw3t.Lb2_O_%A!J+ί (ry U=?AAb_Ml\NIIUF!D䕁(aIfqY^@/[6 Ydoϗ +ѤmMnGqς5]Py#hE'z RPMÕJ:R 6/oKX'>30P2vii9γ!}b2%,&+a fP>vnH ƫZw tDg{IL9,i;g^oi;܁3Ԧ1Ξ1a<}f ~ f2\v;C*X_#蓬-Ry?rD|&fk_!,ZV Zpqj8^bޝ<.Tc~=¯ftR.qRJۺ +gj2+8^ڰi("nVnY򟿪6;')8( \"nY^s?/P@aV8CƐqk8ٖxNA8SHNuR,J l ׂZ[1b#§BS#OUFGY#m4+(=W(決׎xWEp2w_7g7pv]ޏMt'b@G1֖*^Ji .&`J0}aQX8VK#04(|ؑA-CcWJB}P299. J2Z^Zln- +kĐhew1b?`ΈM4k{f͊inãkQhM`c(Nz iEIcFvK0vmSNR^R~jX*Hj9{nQ5SDgBC&mm]Əۘ,`N[-Mo~q%m&Xw_pkxe-EsԒjf.]J_0 X]f6o^^0h66زԌ N%I?&g/L~yR@E:V&c e:RB҆Kp-mD]i{!\M~}X 1+c, +tEclQ&Q?OL8$!a%J\m](q[59@hp`UKGM.kg\T|BpL5vuSm al~ /½_s g',ىCi'j"*FW@EFNfW|諅 nZۭ_?= +  VBw"8шF鍡ij%RπB' XɢiD6lBr ֟Z{H~jqk tu.cjI1Vy @4*N97KG"“zqGb#ܲk4ⴣYzިBEYnq2f=V+O)cۇ4޺)Y"0mpJb` 6լiAYFx4|c!Jݩ4ս FsތK nu5V(nyeߦGsz z;ss;'_MY׬9XgR~ +xe6~)Ye>bl|6 we~<8+I\‰7xT߸cT*wN3(c;)!ߟ}dLJ2;A\˛ci&UR%ϞS׾Mǀ?bMʛF0@~}M*䰚TPѣ-W$IU; +MR'R Y}:ba=iAʧDU~,3"Kl8}fyJC&RS7+W ơGNǪPgIև%g=C􅩟~ߕ@}Jqu@fSBHit^ .!DR@o3$=y +p,Bzam^X0 +H#9StYYy!mA4ytF1i])󇮑Bper Xu2M^d(+D|v_0dX͡l)u.XG}m=p{WWOWlB {ڗcSF?2~Ȕb-wrP1FOz:ȉ[|W} (DUWH 9. +YMZ M?hՏr>mcſ;^.eɄD|`w+jsDudq*wъal ⺠]o9BB~i-DZJN$a-!Ǭ5xMR h>-Ťg`nDFk~m$?O~l됽tAA>7/AO3Cߣ.7p[A#"sN@筯U=njV +8:$A:lj4Az52g +]ݕX|6HnӸAVݔ=-Zf^1nBvBe$e|o~ƾo5oDoa_1=&PJ$\{"S~P3+uO`L+\+{p'|%j]ׄoz5=}NgߺMi~|$@f-;!P?]Z䋳*|s1`L.Е4ҧ +E\Y9!d#$aS<Î;EgTJM> +W *Ep 8)W\POCxp8]ePz+=`ЉygpcW, z16źӘb,mɓ E'y;{#a]y&!HKK)”_ma0F&ΚSL>#jnB@2ʊW7FC=l@Cl{=kxc{u!q}a.ݔG]@y"͡ӄ@p˚-W{lN%FU&,~rҴ/ڭNAjOWaT`%Z}A6 endstream endobj -1000 0 obj << +1050 0 obj << /Type /FontDescriptor -/FontName /ZMZSVV+NimbusRomNo9L-ReguItal +/FontName /DKBOTZ+NimbusRomNo9L-ReguItal /Flags 4 /FontBBox [-169 -270 1010 924] /Ascent 668 @@ -5040,2176 +5456,2278 @@ /ItalicAngle -15 /StemV 78 /XHeight 441 -/CharSet (/B/D/F/G/H/L/M/P/R/S/U/W/a/b/c/comma/d/e/equal/f/five/g/greater/h/hyphen/i/k/l/m/n/o/one/p/r/s/seven/six/t/two/u/v/w/x/y/zero) -/FontFile 999 0 R +/CharSet (/A/B/D/F/G/H/L/M/P/R/U/W/a/b/c/comma/d/e/equal/f/five/g/greater/h/hyphen/i/k/l/m/n/o/one/p/r/s/six/t/two/u/v/w/x/y/zero) +/FontFile 1049 0 R >> endobj -959 0 obj << +1009 0 obj << /Type /Encoding -/Differences [2/fi/fl 33/exclam 39/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 61/equal/greater 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z 95/underscore 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft 125/braceright 147/quotedblleft/quotedblright] +/Differences [2/fi/fl 33/exclam/quotedbl 39/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 61/equal/greater 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z 95/underscore 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft 125/braceright 147/quotedblleft/quotedblright] >> endobj -526 0 obj << +550 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /YHMDQL+CMMI10 -/FontDescriptor 974 0 R -/FirstChar 22 +/BaseFont /DKVUJG+CMMI10 +/FontDescriptor 1024 0 R +/FirstChar 66 /LastChar 119 -/Widths 963 0 R +/Widths 1013 0 R >> endobj -763 0 obj << +815 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GJOBMO+CMMI8 -/FontDescriptor 976 0 R +/FontDescriptor 1026 0 R /FirstChar 109 /LastChar 110 -/Widths 958 0 R +/Widths 1008 0 R >> endobj -527 0 obj << +551 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /KUHQNJ+CMR10 -/FontDescriptor 978 0 R +/BaseFont /RRRXTV+CMR10 +/FontDescriptor 1028 0 R /FirstChar 43 /LastChar 61 -/Widths 962 0 R +/Widths 1012 0 R >> endobj -528 0 obj << +552 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KTQKTJ+CMR8 -/FontDescriptor 980 0 R +/FontDescriptor 1030 0 R /FirstChar 51 /LastChar 52 -/Widths 961 0 R +/Widths 1011 0 R >> endobj -337 0 obj << +353 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JTGICU+CMSY10 -/FontDescriptor 982 0 R +/FontDescriptor 1032 0 R /FirstChar 0 /LastChar 15 -/Widths 970 0 R +/Widths 1020 0 R >> endobj -470 0 obj << +487 0 obj << /Type /Font /Subtype /Type1 /BaseFont /AQKOUH+CMSY8 -/FontDescriptor 984 0 R +/FontDescriptor 1034 0 R /FirstChar 13 /LastChar 13 -/Widths 968 0 R +/Widths 1018 0 R >> endobj -484 0 obj << +503 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZUTHPM+LCIRCLE10 -/FontDescriptor 986 0 R +/FontDescriptor 1036 0 R /FirstChar 4 /LastChar 7 -/Widths 967 0 R +/Widths 1017 0 R >> endobj -505 0 obj << +524 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FPQMUJ+NimbusMonL-Bold -/FontDescriptor 988 0 R +/FontDescriptor 1038 0 R /FirstChar 97 /LastChar 121 -/Widths 965 0 R -/Encoding 959 0 R +/Widths 1015 0 R +/Encoding 1009 0 R >> endobj -486 0 obj << +505 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZHOEQX+NimbusMonL-Regu -/FontDescriptor 990 0 R +/FontDescriptor 1040 0 R /FirstChar 40 /LastChar 125 -/Widths 966 0 R -/Encoding 959 0 R +/Widths 1016 0 R +/Encoding 1009 0 R >> endobj -617 0 obj << +664 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZMYRJY+NimbusMonL-ReguObli -/FontDescriptor 992 0 R +/FontDescriptor 1042 0 R /FirstChar 47 /LastChar 121 -/Widths 960 0 R -/Encoding 959 0 R +/Widths 1010 0 R +/Encoding 1009 0 R >> endobj -335 0 obj << +351 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /AITAPQ+NimbusRomNo9L-Medi -/FontDescriptor 994 0 R -/FirstChar 45 +/BaseFont /IYTDXZ+NimbusRomNo9L-Medi +/FontDescriptor 1044 0 R +/FirstChar 2 /LastChar 122 -/Widths 972 0 R -/Encoding 959 0 R +/Widths 1022 0 R +/Encoding 1009 0 R >> endobj -515 0 obj << +534 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QRLXJK+NimbusRomNo9L-MediItal -/FontDescriptor 996 0 R +/FontDescriptor 1046 0 R /FirstChar 3 /LastChar 122 -/Widths 964 0 R -/Encoding 959 0 R +/Widths 1014 0 R +/Encoding 1009 0 R >> endobj -344 0 obj << +360 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /TZVHXZ+NimbusRomNo9L-Regu -/FontDescriptor 998 0 R +/BaseFont /XWWGRR+NimbusRomNo9L-Regu +/FontDescriptor 1048 0 R /FirstChar 2 /LastChar 148 -/Widths 969 0 R -/Encoding 959 0 R +/Widths 1019 0 R +/Encoding 1009 0 R >> endobj -336 0 obj << +352 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /ZMZSVV+NimbusRomNo9L-ReguItal -/FontDescriptor 1000 0 R +/BaseFont /DKBOTZ+NimbusRomNo9L-ReguItal +/FontDescriptor 1050 0 R /FirstChar 44 /LastChar 121 -/Widths 971 0 R -/Encoding 959 0 R +/Widths 1021 0 R +/Encoding 1009 0 R >> endobj -338 0 obj << +354 0 obj << /Type /Pages /Count 6 -/Parent 1001 0 R -/Kids [330 0 R 340 0 R 346 0 R 381 0 R 429 0 R 440 0 R] +/Parent 1051 0 R +/Kids [346 0 R 356 0 R 393 0 R 441 0 R 457 0 R 469 0 R] >> endobj -456 0 obj << +490 0 obj << /Type /Pages /Count 6 -/Parent 1001 0 R -/Kids [452 0 R 468 0 R 475 0 R 480 0 R 494 0 R 500 0 R] +/Parent 1051 0 R +/Kids [485 0 R 494 0 R 499 0 R 513 0 R 519 0 R 527 0 R] >> endobj -516 0 obj << +540 0 obj << /Type /Pages /Count 6 -/Parent 1001 0 R -/Kids [508 0 R 519 0 R 533 0 R 540 0 R 549 0 R 556 0 R] +/Parent 1051 0 R +/Kids [537 0 R 543 0 R 558 0 R 565 0 R 571 0 R 576 0 R] >> endobj -570 0 obj << +590 0 obj << /Type /Pages /Count 6 -/Parent 1001 0 R -/Kids [563 0 R 573 0 R 584 0 R 593 0 R 602 0 R 609 0 R] +/Parent 1051 0 R +/Kids [585 0 R 593 0 R 602 0 R 609 0 R 620 0 R 629 0 R] >> endobj -629 0 obj << +641 0 obj << /Type /Pages /Count 6 -/Parent 1001 0 R -/Kids [624 0 R 632 0 R 642 0 R 650 0 R 657 0 R 666 0 R] +/Parent 1051 0 R +/Kids [634 0 R 644 0 R 651 0 R 656 0 R 671 0 R 678 0 R] >> endobj -681 0 obj << +693 0 obj << /Type /Pages /Count 6 -/Parent 1001 0 R -/Kids [676 0 R 684 0 R 693 0 R 702 0 R 711 0 R 720 0 R] +/Parent 1051 0 R +/Kids [688 0 R 696 0 R 702 0 R 709 0 R 718 0 R 728 0 R] >> endobj -731 0 obj << +740 0 obj << /Type /Pages /Count 6 -/Parent 1002 0 R -/Kids [728 0 R 734 0 R 743 0 R 751 0 R 767 0 R 774 0 R] +/Parent 1052 0 R +/Kids [735 0 R 745 0 R 754 0 R 763 0 R 772 0 R 780 0 R] >> endobj -794 0 obj << +792 0 obj << /Type /Pages /Count 6 -/Parent 1002 0 R -/Kids [789 0 R 798 0 R 806 0 R 813 0 R 818 0 R 827 0 R] +/Parent 1052 0 R +/Kids [785 0 R 795 0 R 803 0 R 819 0 R 827 0 R 836 0 R] >> endobj -837 0 obj << +846 0 obj << /Type /Pages /Count 6 -/Parent 1002 0 R -/Kids [834 0 R 840 0 R 847 0 R 856 0 R 863 0 R 872 0 R] +/Parent 1052 0 R +/Kids [841 0 R 850 0 R 856 0 R 863 0 R 868 0 R 877 0 R] >> endobj -888 0 obj << +887 0 obj << /Type /Pages /Count 6 -/Parent 1002 0 R -/Kids [881 0 R 891 0 R 900 0 R 914 0 R 925 0 R 935 0 R] +/Parent 1052 0 R +/Kids [884 0 R 890 0 R 897 0 R 906 0 R 913 0 R 922 0 R] >> endobj -943 0 obj << +938 0 obj << +/Type /Pages +/Count 6 +/Parent 1052 0 R +/Kids [931 0 R 941 0 R 950 0 R 964 0 R 975 0 R 985 0 R] +>> endobj +993 0 obj << /Type /Pages /Count 4 -/Parent 1002 0 R -/Kids [940 0 R 946 0 R 951 0 R 956 0 R] +/Parent 1052 0 R +/Kids [990 0 R 996 0 R 1001 0 R 1006 0 R] >> endobj -1001 0 obj << +1051 0 obj << /Type /Pages /Count 36 -/Parent 1003 0 R -/Kids [338 0 R 456 0 R 516 0 R 570 0 R 629 0 R 681 0 R] +/Parent 1053 0 R +/Kids [354 0 R 490 0 R 540 0 R 590 0 R 641 0 R 693 0 R] >> endobj -1002 0 obj << +1052 0 obj << /Type /Pages -/Count 28 -/Parent 1003 0 R -/Kids [731 0 R 794 0 R 837 0 R 888 0 R 943 0 R] +/Count 34 +/Parent 1053 0 R +/Kids [740 0 R 792 0 R 846 0 R 887 0 R 938 0 R 993 0 R] >> endobj -1003 0 obj << +1053 0 obj << /Type /Pages -/Count 64 -/Kids [1001 0 R 1002 0 R] +/Count 70 +/Kids [1051 0 R 1052 0 R] >> endobj -1004 0 obj << +1054 0 obj << /Type /Outlines -/First 7 0 R -/Last 31 0 R -/Count 18 +/First 3 0 R +/Last 327 0 R +/Count 23 +>> endobj +343 0 obj << +/Title 344 0 R +/A 341 0 R +/Parent 327 0 R +/Prev 339 0 R +>> endobj +339 0 obj << +/Title 340 0 R +/A 337 0 R +/Parent 327 0 R +/Prev 335 0 R +/Next 343 0 R +>> endobj +335 0 obj << +/Title 336 0 R +/A 333 0 R +/Parent 327 0 R +/Prev 331 0 R +/Next 339 0 R +>> endobj +331 0 obj << +/Title 332 0 R +/A 329 0 R +/Parent 327 0 R +/Next 335 0 R >> endobj 327 0 obj << /Title 328 0 R /A 325 0 R -/Parent 319 0 R -/Prev 323 0 R +/Parent 1054 0 R +/Prev 27 0 R +/First 331 0 R +/Last 343 0 R +/Count 4 >> endobj 323 0 obj << /Title 324 0 R /A 321 0 R -/Parent 319 0 R -/Next 327 0 R +/Parent 315 0 R +/Prev 319 0 R >> endobj 319 0 obj << /Title 320 0 R /A 317 0 R -/Parent 31 0 R -/Prev 295 0 R -/First 323 0 R -/Last 327 0 R -/Count -2 +/Parent 315 0 R +/Next 323 0 R >> endobj 315 0 obj << /Title 316 0 R /A 313 0 R -/Parent 295 0 R -/Prev 311 0 R +/Parent 27 0 R +/Prev 291 0 R +/First 319 0 R +/Last 323 0 R +/Count -2 >> endobj 311 0 obj << /Title 312 0 R /A 309 0 R -/Parent 295 0 R +/Parent 291 0 R /Prev 307 0 R -/Next 315 0 R >> endobj 307 0 obj << /Title 308 0 R /A 305 0 R -/Parent 295 0 R +/Parent 291 0 R /Prev 303 0 R /Next 311 0 R >> endobj 303 0 obj << /Title 304 0 R /A 301 0 R -/Parent 295 0 R +/Parent 291 0 R /Prev 299 0 R /Next 307 0 R >> endobj 299 0 obj << /Title 300 0 R /A 297 0 R -/Parent 295 0 R +/Parent 291 0 R +/Prev 295 0 R /Next 303 0 R >> endobj 295 0 obj << /Title 296 0 R /A 293 0 R -/Parent 31 0 R -/Prev 275 0 R -/Next 319 0 R -/First 299 0 R -/Last 315 0 R -/Count -5 +/Parent 291 0 R +/Next 299 0 R >> endobj 291 0 obj << /Title 292 0 R /A 289 0 R -/Parent 275 0 R -/Prev 287 0 R +/Parent 27 0 R +/Prev 271 0 R +/Next 315 0 R +/First 295 0 R +/Last 311 0 R +/Count -5 >> endobj 287 0 obj << /Title 288 0 R /A 285 0 R -/Parent 275 0 R +/Parent 271 0 R /Prev 283 0 R -/Next 291 0 R >> endobj 283 0 obj << /Title 284 0 R /A 281 0 R -/Parent 275 0 R +/Parent 271 0 R /Prev 279 0 R /Next 287 0 R >> endobj 279 0 obj << /Title 280 0 R /A 277 0 R -/Parent 275 0 R +/Parent 271 0 R +/Prev 275 0 R /Next 283 0 R >> endobj 275 0 obj << /Title 276 0 R /A 273 0 R -/Parent 31 0 R -/Prev 255 0 R -/Next 295 0 R -/First 279 0 R -/Last 291 0 R -/Count -4 +/Parent 271 0 R +/Next 279 0 R >> endobj 271 0 obj << /Title 272 0 R /A 269 0 R -/Parent 255 0 R -/Prev 267 0 R +/Parent 27 0 R +/Prev 251 0 R +/Next 291 0 R +/First 275 0 R +/Last 287 0 R +/Count -4 >> endobj 267 0 obj << /Title 268 0 R /A 265 0 R -/Parent 255 0 R +/Parent 251 0 R /Prev 263 0 R -/Next 271 0 R >> endobj 263 0 obj << /Title 264 0 R /A 261 0 R -/Parent 255 0 R +/Parent 251 0 R /Prev 259 0 R /Next 267 0 R >> endobj 259 0 obj << /Title 260 0 R /A 257 0 R -/Parent 255 0 R +/Parent 251 0 R +/Prev 255 0 R /Next 263 0 R >> endobj 255 0 obj << /Title 256 0 R /A 253 0 R -/Parent 31 0 R -/Prev 239 0 R -/Next 275 0 R -/First 259 0 R -/Last 271 0 R -/Count -4 +/Parent 251 0 R +/Next 259 0 R >> endobj 251 0 obj << /Title 252 0 R /A 249 0 R -/Parent 239 0 R -/Prev 247 0 R +/Parent 27 0 R +/Prev 235 0 R +/Next 271 0 R +/First 255 0 R +/Last 267 0 R +/Count -4 >> endobj 247 0 obj << /Title 248 0 R /A 245 0 R -/Parent 239 0 R +/Parent 235 0 R /Prev 243 0 R -/Next 251 0 R >> endobj 243 0 obj << /Title 244 0 R /A 241 0 R -/Parent 239 0 R +/Parent 235 0 R +/Prev 239 0 R /Next 247 0 R >> endobj 239 0 obj << /Title 240 0 R /A 237 0 R -/Parent 31 0 R -/Prev 211 0 R -/Next 255 0 R -/First 243 0 R -/Last 251 0 R -/Count -3 +/Parent 235 0 R +/Next 243 0 R >> endobj 235 0 obj << /Title 236 0 R /A 233 0 R -/Parent 211 0 R -/Prev 231 0 R +/Parent 27 0 R +/Prev 207 0 R +/Next 251 0 R +/First 239 0 R +/Last 247 0 R +/Count -3 >> endobj 231 0 obj << /Title 232 0 R /A 229 0 R -/Parent 211 0 R +/Parent 207 0 R /Prev 227 0 R -/Next 235 0 R >> endobj 227 0 obj << /Title 228 0 R /A 225 0 R -/Parent 211 0 R +/Parent 207 0 R /Prev 223 0 R /Next 231 0 R >> endobj 223 0 obj << /Title 224 0 R /A 221 0 R -/Parent 211 0 R +/Parent 207 0 R /Prev 219 0 R /Next 227 0 R >> endobj 219 0 obj << /Title 220 0 R /A 217 0 R -/Parent 211 0 R +/Parent 207 0 R /Prev 215 0 R /Next 223 0 R >> endobj 215 0 obj << /Title 216 0 R /A 213 0 R -/Parent 211 0 R +/Parent 207 0 R +/Prev 211 0 R /Next 219 0 R >> endobj 211 0 obj << /Title 212 0 R /A 209 0 R -/Parent 31 0 R -/Prev 195 0 R -/Next 239 0 R -/First 215 0 R -/Last 235 0 R -/Count -6 +/Parent 207 0 R +/Next 215 0 R >> endobj 207 0 obj << /Title 208 0 R /A 205 0 R -/Parent 195 0 R -/Prev 203 0 R +/Parent 27 0 R +/Prev 191 0 R +/Next 235 0 R +/First 211 0 R +/Last 231 0 R +/Count -6 >> endobj 203 0 obj << /Title 204 0 R /A 201 0 R -/Parent 195 0 R +/Parent 191 0 R /Prev 199 0 R -/Next 207 0 R >> endobj 199 0 obj << /Title 200 0 R /A 197 0 R -/Parent 195 0 R +/Parent 191 0 R +/Prev 195 0 R /Next 203 0 R >> endobj 195 0 obj << /Title 196 0 R /A 193 0 R -/Parent 31 0 R -/Prev 127 0 R -/Next 211 0 R -/First 199 0 R -/Last 207 0 R -/Count -3 +/Parent 191 0 R +/Next 199 0 R >> endobj 191 0 obj << /Title 192 0 R /A 189 0 R -/Parent 127 0 R -/Prev 187 0 R +/Parent 27 0 R +/Prev 123 0 R +/Next 207 0 R +/First 195 0 R +/Last 203 0 R +/Count -3 >> endobj 187 0 obj << /Title 188 0 R /A 185 0 R -/Parent 127 0 R +/Parent 123 0 R /Prev 183 0 R -/Next 191 0 R >> endobj 183 0 obj << /Title 184 0 R /A 181 0 R -/Parent 127 0 R +/Parent 123 0 R /Prev 179 0 R /Next 187 0 R >> endobj 179 0 obj << /Title 180 0 R /A 177 0 R -/Parent 127 0 R +/Parent 123 0 R /Prev 175 0 R /Next 183 0 R >> endobj 175 0 obj << /Title 176 0 R /A 173 0 R -/Parent 127 0 R +/Parent 123 0 R /Prev 171 0 R /Next 179 0 R >> endobj 171 0 obj << /Title 172 0 R /A 169 0 R -/Parent 127 0 R +/Parent 123 0 R /Prev 167 0 R /Next 175 0 R >> endobj 167 0 obj << /Title 168 0 R /A 165 0 R -/Parent 127 0 R +/Parent 123 0 R /Prev 163 0 R /Next 171 0 R >> endobj 163 0 obj << /Title 164 0 R /A 161 0 R -/Parent 127 0 R +/Parent 123 0 R /Prev 159 0 R /Next 167 0 R >> endobj 159 0 obj << /Title 160 0 R /A 157 0 R -/Parent 127 0 R +/Parent 123 0 R /Prev 155 0 R /Next 163 0 R >> endobj 155 0 obj << /Title 156 0 R /A 153 0 R -/Parent 127 0 R +/Parent 123 0 R /Prev 151 0 R /Next 159 0 R >> endobj 151 0 obj << /Title 152 0 R /A 149 0 R -/Parent 127 0 R +/Parent 123 0 R /Prev 147 0 R /Next 155 0 R >> endobj 147 0 obj << /Title 148 0 R /A 145 0 R -/Parent 127 0 R +/Parent 123 0 R /Prev 143 0 R /Next 151 0 R >> endobj 143 0 obj << /Title 144 0 R /A 141 0 R -/Parent 127 0 R +/Parent 123 0 R /Prev 139 0 R /Next 147 0 R >> endobj 139 0 obj << /Title 140 0 R /A 137 0 R -/Parent 127 0 R +/Parent 123 0 R /Prev 135 0 R /Next 143 0 R >> endobj 135 0 obj << /Title 136 0 R /A 133 0 R -/Parent 127 0 R +/Parent 123 0 R /Prev 131 0 R /Next 139 0 R >> endobj 131 0 obj << /Title 132 0 R /A 129 0 R -/Parent 127 0 R +/Parent 123 0 R +/Prev 127 0 R /Next 135 0 R >> endobj 127 0 obj << /Title 128 0 R /A 125 0 R -/Parent 31 0 R -/Prev 115 0 R -/Next 195 0 R -/First 131 0 R -/Last 191 0 R -/Count -16 +/Parent 123 0 R +/Next 131 0 R >> endobj 123 0 obj << /Title 124 0 R /A 121 0 R -/Parent 115 0 R -/Prev 119 0 R +/Parent 27 0 R +/Prev 111 0 R +/Next 191 0 R +/First 127 0 R +/Last 187 0 R +/Count -16 >> endobj 119 0 obj << /Title 120 0 R /A 117 0 R -/Parent 115 0 R -/Next 123 0 R +/Parent 111 0 R +/Prev 115 0 R >> endobj 115 0 obj << /Title 116 0 R /A 113 0 R -/Parent 31 0 R -/Prev 51 0 R -/Next 127 0 R -/First 119 0 R -/Last 123 0 R -/Count -2 +/Parent 111 0 R +/Next 119 0 R >> endobj 111 0 obj << /Title 112 0 R /A 109 0 R -/Parent 51 0 R -/Prev 107 0 R +/Parent 27 0 R +/Prev 47 0 R +/Next 123 0 R +/First 115 0 R +/Last 119 0 R +/Count -2 >> endobj 107 0 obj << /Title 108 0 R /A 105 0 R -/Parent 51 0 R +/Parent 47 0 R /Prev 103 0 R -/Next 111 0 R >> endobj 103 0 obj << /Title 104 0 R /A 101 0 R -/Parent 51 0 R +/Parent 47 0 R /Prev 99 0 R /Next 107 0 R >> endobj 99 0 obj << /Title 100 0 R /A 97 0 R -/Parent 51 0 R +/Parent 47 0 R /Prev 95 0 R /Next 103 0 R >> endobj 95 0 obj << /Title 96 0 R /A 93 0 R -/Parent 51 0 R +/Parent 47 0 R /Prev 91 0 R /Next 99 0 R >> endobj 91 0 obj << /Title 92 0 R /A 89 0 R -/Parent 51 0 R +/Parent 47 0 R /Prev 87 0 R /Next 95 0 R >> endobj 87 0 obj << /Title 88 0 R /A 85 0 R -/Parent 51 0 R +/Parent 47 0 R /Prev 83 0 R /Next 91 0 R >> endobj 83 0 obj << /Title 84 0 R /A 81 0 R -/Parent 51 0 R +/Parent 47 0 R /Prev 79 0 R /Next 87 0 R >> endobj 79 0 obj << /Title 80 0 R /A 77 0 R -/Parent 51 0 R +/Parent 47 0 R /Prev 75 0 R /Next 83 0 R >> endobj 75 0 obj << /Title 76 0 R /A 73 0 R -/Parent 51 0 R +/Parent 47 0 R /Prev 71 0 R /Next 79 0 R >> endobj 71 0 obj << /Title 72 0 R /A 69 0 R -/Parent 51 0 R +/Parent 47 0 R /Prev 67 0 R /Next 75 0 R >> endobj 67 0 obj << /Title 68 0 R /A 65 0 R -/Parent 51 0 R +/Parent 47 0 R /Prev 63 0 R /Next 71 0 R >> endobj 63 0 obj << /Title 64 0 R /A 61 0 R -/Parent 51 0 R +/Parent 47 0 R /Prev 59 0 R /Next 67 0 R >> endobj 59 0 obj << /Title 60 0 R /A 57 0 R -/Parent 51 0 R +/Parent 47 0 R /Prev 55 0 R /Next 63 0 R >> endobj 55 0 obj << /Title 56 0 R /A 53 0 R -/Parent 51 0 R +/Parent 47 0 R +/Prev 51 0 R /Next 59 0 R >> endobj 51 0 obj << /Title 52 0 R /A 49 0 R -/Parent 31 0 R -/Prev 35 0 R -/Next 115 0 R -/First 55 0 R -/Last 111 0 R -/Count -15 +/Parent 47 0 R +/Next 55 0 R >> endobj 47 0 obj << /Title 48 0 R /A 45 0 R -/Parent 35 0 R -/Prev 43 0 R +/Parent 27 0 R +/Prev 31 0 R +/Next 111 0 R +/First 51 0 R +/Last 107 0 R +/Count -15 >> endobj 43 0 obj << /Title 44 0 R /A 41 0 R -/Parent 35 0 R +/Parent 31 0 R /Prev 39 0 R -/Next 47 0 R >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R -/Parent 35 0 R +/Parent 31 0 R +/Prev 35 0 R /Next 43 0 R >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 31 0 R -/Next 51 0 R -/First 39 0 R -/Last 47 0 R -/Count -3 +/Next 39 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R -/Parent 1004 0 R -/Prev 11 0 R +/Parent 27 0 R +/Next 47 0 R /First 35 0 R -/Last 319 0 R -/Count 11 +/Last 43 0 R +/Count -3 >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R -/Parent 11 0 R -/Prev 23 0 R +/Parent 1054 0 R +/Prev 7 0 R +/Next 327 0 R +/First 31 0 R +/Last 315 0 R +/Count 11 >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R -/Parent 11 0 R +/Parent 7 0 R /Prev 19 0 R -/Next 27 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R -/Parent 11 0 R +/Parent 7 0 R /Prev 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R -/Parent 11 0 R +/Parent 7 0 R +/Prev 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R -/Parent 1004 0 R -/Prev 7 0 R -/Next 31 0 R -/First 15 0 R -/Last 27 0 R -/Count 4 +/Parent 7 0 R +/Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R -/Parent 1004 0 R -/Next 11 0 R ->> endobj -1005 0 obj << -/Names [(Doc-Start) 334 0 R (Hfootnote.1) 471 0 R (Hfootnote.2) 497 0 R (chapter*.1) 343 0 R (chapter*.2) 384 0 R (chapter*.3) 455 0 R] -/Limits [(Doc-Start) (chapter*.3)] ->> endobj -1006 0 obj << -/Names [(chapter.1) 6 0 R (chapter.2) 10 0 R (chapter.3) 30 0 R (lnk:autopollevents) 920 0 R (lnk:keyrepeat) 921 0 R (lnk:mousecursor) 922 0 R] -/Limits [(chapter.1) (lnk:mousecursor)] ->> endobj -1007 0 obj << -/Names [(lnk:stickykeys) 928 0 R (lnk:stickymousebuttons) 929 0 R (lnk:systemkeys) 930 0 R (lstlisting.2.-1) 483 0 R (lstlisting.3.-10) 559 0 R (lstlisting.3.-11) 566 0 R] -/Limits [(lnk:stickykeys) (lstlisting.3.-11)] ->> endobj -1008 0 obj << -/Names [(lstlisting.3.-12) 568 0 R (lstlisting.3.-13) 576 0 R (lstlisting.3.-14) 578 0 R (lstlisting.3.-15) 587 0 R (lstlisting.3.-16) 589 0 R (lstlisting.3.-17) 596 0 R] -/Limits [(lstlisting.3.-12) (lstlisting.3.-17)] ->> endobj -1009 0 obj << -/Names [(lstlisting.3.-18) 598 0 R (lstlisting.3.-19) 605 0 R (lstlisting.3.-2) 503 0 R (lstlisting.3.-20) 612 0 R (lstlisting.3.-21) 614 0 R (lstlisting.3.-22) 627 0 R] -/Limits [(lstlisting.3.-18) (lstlisting.3.-22)] ->> endobj -1010 0 obj << -/Names [(lstlisting.3.-23) 635 0 R (lstlisting.3.-24) 637 0 R (lstlisting.3.-25) 645 0 R (lstlisting.3.-26) 653 0 R (lstlisting.3.-27) 660 0 R (lstlisting.3.-28) 662 0 R] -/Limits [(lstlisting.3.-23) (lstlisting.3.-28)] ->> endobj -1011 0 obj << -/Names [(lstlisting.3.-29) 669 0 R (lstlisting.3.-3) 511 0 R (lstlisting.3.-30) 671 0 R (lstlisting.3.-31) 679 0 R (lstlisting.3.-32) 687 0 R (lstlisting.3.-33) 696 0 R] -/Limits [(lstlisting.3.-29) (lstlisting.3.-33)] ->> endobj -1012 0 obj << -/Names [(lstlisting.3.-34) 698 0 R (lstlisting.3.-35) 705 0 R (lstlisting.3.-36) 714 0 R (lstlisting.3.-37) 716 0 R (lstlisting.3.-38) 723 0 R (lstlisting.3.-39) 737 0 R] -/Limits [(lstlisting.3.-34) (lstlisting.3.-39)] ->> endobj -1013 0 obj << -/Names [(lstlisting.3.-4) 513 0 R (lstlisting.3.-40) 739 0 R (lstlisting.3.-41) 746 0 R (lstlisting.3.-42) 754 0 R (lstlisting.3.-43) 756 0 R (lstlisting.3.-44) 770 0 R] -/Limits [(lstlisting.3.-4) (lstlisting.3.-44)] ->> endobj -1014 0 obj << -/Names [(lstlisting.3.-45) 777 0 R (lstlisting.3.-46) 784 0 R (lstlisting.3.-47) 792 0 R (lstlisting.3.-48) 801 0 R (lstlisting.3.-49) 809 0 R (lstlisting.3.-5) 522 0 R] -/Limits [(lstlisting.3.-45) (lstlisting.3.-5)] ->> endobj -1015 0 obj << -/Names [(lstlisting.3.-50) 821 0 R (lstlisting.3.-51) 823 0 R (lstlisting.3.-52) 830 0 R (lstlisting.3.-53) 843 0 R (lstlisting.3.-54) 850 0 R (lstlisting.3.-55) 852 0 R] -/Limits [(lstlisting.3.-50) (lstlisting.3.-55)] ->> endobj -1016 0 obj << -/Names [(lstlisting.3.-56) 859 0 R (lstlisting.3.-57) 866 0 R (lstlisting.3.-58) 868 0 R (lstlisting.3.-59) 875 0 R (lstlisting.3.-6) 536 0 R (lstlisting.3.-60) 877 0 R] -/Limits [(lstlisting.3.-56) (lstlisting.3.-60)] ->> endobj -1017 0 obj << -/Names [(lstlisting.3.-61) 884 0 R (lstlisting.3.-62) 886 0 R (lstlisting.3.-63) 894 0 R (lstlisting.3.-64) 896 0 R (lstlisting.3.-65) 903 0 R (lstlisting.3.-66) 917 0 R] -/Limits [(lstlisting.3.-61) (lstlisting.3.-66)] ->> endobj -1018 0 obj << -/Names [(lstlisting.3.-67) 931 0 R (lstlisting.3.-7) 543 0 R (lstlisting.3.-8) 545 0 R (lstlisting.3.-9) 552 0 R (lstnumber.-1.1) 485 0 R (lstnumber.-1.2) 487 0 R] -/Limits [(lstlisting.3.-67) (lstnumber.-1.2)] ->> endobj -1019 0 obj << -/Names [(lstnumber.-1.3) 488 0 R (lstnumber.-1.4) 489 0 R (lstnumber.-1.5) 490 0 R (lstnumber.-10.1) 560 0 R (lstnumber.-11.1) 567 0 R (lstnumber.-12.1) 569 0 R] -/Limits [(lstnumber.-1.3) (lstnumber.-12.1)] ->> endobj -1020 0 obj << -/Names [(lstnumber.-13.1) 577 0 R (lstnumber.-14.1) 579 0 R (lstnumber.-15.1) 588 0 R (lstnumber.-16.1) 590 0 R (lstnumber.-17.1) 597 0 R (lstnumber.-18.1) 599 0 R] -/Limits [(lstnumber.-13.1) (lstnumber.-18.1)] ->> endobj -1021 0 obj << -/Names [(lstnumber.-19.1) 606 0 R (lstnumber.-2.1) 504 0 R (lstnumber.-20.1) 613 0 R (lstnumber.-21.1) 615 0 R (lstnumber.-21.2) 616 0 R (lstnumber.-21.3) 618 0 R] -/Limits [(lstnumber.-19.1) (lstnumber.-21.3)] ->> endobj -1022 0 obj << -/Names [(lstnumber.-21.4) 619 0 R (lstnumber.-21.5) 620 0 R (lstnumber.-21.6) 621 0 R (lstnumber.-22.1) 628 0 R (lstnumber.-23.1) 636 0 R (lstnumber.-24.1) 638 0 R] -/Limits [(lstnumber.-21.4) (lstnumber.-24.1)] ->> endobj -1023 0 obj << -/Names [(lstnumber.-25.1) 646 0 R (lstnumber.-26.1) 654 0 R (lstnumber.-27.1) 661 0 R (lstnumber.-28.1) 663 0 R (lstnumber.-29.1) 670 0 R (lstnumber.-3.1) 512 0 R] -/Limits [(lstnumber.-25.1) (lstnumber.-3.1)] ->> endobj -1024 0 obj << -/Names [(lstnumber.-30.1) 672 0 R (lstnumber.-31.1) 680 0 R (lstnumber.-32.1) 688 0 R (lstnumber.-33.1) 697 0 R (lstnumber.-34.1) 699 0 R (lstnumber.-35.1) 706 0 R] -/Limits [(lstnumber.-30.1) (lstnumber.-35.1)] ->> endobj -1025 0 obj << -/Names [(lstnumber.-36.1) 715 0 R (lstnumber.-37.1) 717 0 R (lstnumber.-38.1) 724 0 R (lstnumber.-38.2) 725 0 R (lstnumber.-39.1) 738 0 R (lstnumber.-4.1) 514 0 R] -/Limits [(lstnumber.-36.1) (lstnumber.-4.1)] ->> endobj -1026 0 obj << -/Names [(lstnumber.-40.1) 740 0 R (lstnumber.-41.1) 747 0 R (lstnumber.-42.1) 755 0 R (lstnumber.-43.1) 757 0 R (lstnumber.-43.2) 758 0 R (lstnumber.-43.3) 759 0 R] -/Limits [(lstnumber.-40.1) (lstnumber.-43.3)] ->> endobj -1027 0 obj << -/Names [(lstnumber.-43.4) 760 0 R (lstnumber.-43.5) 761 0 R (lstnumber.-43.6) 762 0 R (lstnumber.-44.1) 771 0 R (lstnumber.-45.1) 778 0 R (lstnumber.-45.2) 779 0 R] -/Limits [(lstnumber.-43.4) (lstnumber.-45.2)] ->> endobj -1028 0 obj << -/Names [(lstnumber.-45.3) 780 0 R (lstnumber.-45.4) 781 0 R (lstnumber.-45.5) 782 0 R (lstnumber.-45.6) 783 0 R (lstnumber.-46.1) 785 0 R (lstnumber.-47.1) 793 0 R] -/Limits [(lstnumber.-45.3) (lstnumber.-47.1)] ->> endobj -1029 0 obj << -/Names [(lstnumber.-48.1) 802 0 R (lstnumber.-49.1) 810 0 R (lstnumber.-5.1) 523 0 R (lstnumber.-5.2) 524 0 R (lstnumber.-5.3) 525 0 R (lstnumber.-50.1) 822 0 R] -/Limits [(lstnumber.-48.1) (lstnumber.-50.1)] ->> endobj -1030 0 obj << -/Names [(lstnumber.-51.1) 824 0 R (lstnumber.-52.1) 831 0 R (lstnumber.-53.1) 844 0 R (lstnumber.-54.1) 851 0 R (lstnumber.-55.1) 853 0 R (lstnumber.-56.1) 860 0 R] -/Limits [(lstnumber.-51.1) (lstnumber.-56.1)] ->> endobj -1031 0 obj << -/Names [(lstnumber.-57.1) 867 0 R (lstnumber.-58.1) 869 0 R (lstnumber.-59.1) 876 0 R (lstnumber.-6.1) 537 0 R (lstnumber.-60.1) 878 0 R (lstnumber.-61.1) 885 0 R] -/Limits [(lstnumber.-57.1) (lstnumber.-61.1)] ->> endobj -1032 0 obj << -/Names [(lstnumber.-62.1) 887 0 R (lstnumber.-63.1) 895 0 R (lstnumber.-64.1) 897 0 R (lstnumber.-65.1) 904 0 R (lstnumber.-66.1) 918 0 R (lstnumber.-66.2) 919 0 R] -/Limits [(lstnumber.-62.1) (lstnumber.-66.2)] ->> endobj -1033 0 obj << -/Names [(lstnumber.-67.1) 932 0 R (lstnumber.-7.1) 544 0 R (lstnumber.-8.1) 546 0 R (lstnumber.-9.1) 553 0 R (page.1) 333 0 R (page.10) 551 0 R] -/Limits [(lstnumber.-67.1) (page.10)] ->> endobj -1034 0 obj << -/Names [(page.11) 558 0 R (page.12) 565 0 R (page.13) 575 0 R (page.14) 586 0 R (page.15) 595 0 R (page.16) 604 0 R] -/Limits [(page.11) (page.16)] ->> endobj -1035 0 obj << -/Names [(page.17) 611 0 R (page.18) 626 0 R (page.19) 634 0 R (page.2) 477 0 R (page.20) 644 0 R (page.21) 652 0 R] -/Limits [(page.17) (page.21)] ->> endobj -1036 0 obj << -/Names [(page.22) 659 0 R (page.23) 668 0 R (page.24) 678 0 R (page.25) 686 0 R (page.26) 695 0 R (page.27) 704 0 R] -/Limits [(page.22) (page.27)] ->> endobj -1037 0 obj << -/Names [(page.28) 713 0 R (page.29) 722 0 R (page.3) 482 0 R (page.30) 730 0 R (page.31) 736 0 R (page.32) 745 0 R] -/Limits [(page.28) (page.32)] ->> endobj -1038 0 obj << -/Names [(page.33) 753 0 R (page.34) 769 0 R (page.35) 776 0 R (page.36) 791 0 R (page.37) 800 0 R (page.38) 808 0 R] -/Limits [(page.33) (page.38)] ->> endobj -1039 0 obj << -/Names [(page.39) 815 0 R (page.4) 496 0 R (page.40) 820 0 R (page.41) 829 0 R (page.42) 836 0 R (page.43) 842 0 R] -/Limits [(page.39) (page.43)] ->> endobj -1040 0 obj << -/Names [(page.44) 849 0 R (page.45) 858 0 R (page.46) 865 0 R (page.47) 874 0 R (page.48) 883 0 R (page.49) 893 0 R] -/Limits [(page.44) (page.49)] ->> endobj -1041 0 obj << -/Names [(page.5) 502 0 R (page.50) 902 0 R (page.51) 916 0 R (page.52) 927 0 R (page.53) 937 0 R (page.54) 942 0 R] -/Limits [(page.5) (page.54)] ->> endobj -1042 0 obj << -/Names [(page.55) 948 0 R (page.56) 953 0 R (page.57) 472 0 R (page.6) 510 0 R (page.7) 521 0 R (page.8) 535 0 R] -/Limits [(page.55) (page.8)] ->> endobj -1043 0 obj << -/Names [(page.9) 542 0 R (page.i) 342 0 R (page.ii) 348 0 R (page.iii) 383 0 R (page.iv) 431 0 R (page.v) 442 0 R] -/Limits [(page.9) (page.v)] ->> endobj -1044 0 obj << -/Names [(page.vi) 454 0 R (section.2.1) 14 0 R (section.2.2) 18 0 R (section.2.3) 22 0 R (section.2.4) 26 0 R (section.3.1) 34 0 R] -/Limits [(page.vi) (section.3.1)] ->> endobj -1045 0 obj << -/Names [(section.3.10) 294 0 R (section.3.11) 318 0 R (section.3.2) 50 0 R (section.3.3) 114 0 R (section.3.4) 126 0 R (section.3.5) 194 0 R] -/Limits [(section.3.10) (section.3.5)] ->> endobj -1046 0 obj << -/Names [(section.3.6) 210 0 R (section.3.7) 238 0 R (section.3.8) 254 0 R (section.3.9) 274 0 R (subsection.3.1.1) 38 0 R (subsection.3.1.2) 42 0 R] -/Limits [(section.3.6) (subsection.3.1.2)] ->> endobj -1047 0 obj << -/Names [(subsection.3.1.3) 46 0 R (subsection.3.10.1) 298 0 R (subsection.3.10.2) 302 0 R (subsection.3.10.3) 306 0 R (subsection.3.10.4) 310 0 R (subsection.3.10.5) 314 0 R] -/Limits [(subsection.3.1.3) (subsection.3.10.5)] ->> endobj -1048 0 obj << -/Names [(subsection.3.11.1) 322 0 R (subsection.3.11.2) 326 0 R (subsection.3.2.1) 54 0 R (subsection.3.2.10) 90 0 R (subsection.3.2.11) 94 0 R (subsection.3.2.12) 98 0 R] -/Limits [(subsection.3.11.1) (subsection.3.2.12)] ->> endobj -1049 0 obj << -/Names [(subsection.3.2.13) 102 0 R (subsection.3.2.14) 106 0 R (subsection.3.2.15) 110 0 R (subsection.3.2.2) 58 0 R (subsection.3.2.3) 62 0 R (subsection.3.2.4) 66 0 R] -/Limits [(subsection.3.2.13) (subsection.3.2.4)] ->> endobj -1050 0 obj << -/Names [(subsection.3.2.5) 70 0 R (subsection.3.2.6) 74 0 R (subsection.3.2.7) 78 0 R (subsection.3.2.8) 82 0 R (subsection.3.2.9) 86 0 R (subsection.3.3.1) 118 0 R] -/Limits [(subsection.3.2.5) (subsection.3.3.1)] ->> endobj -1051 0 obj << -/Names [(subsection.3.3.2) 122 0 R (subsection.3.4.1) 130 0 R (subsection.3.4.10) 166 0 R (subsection.3.4.11) 170 0 R (subsection.3.4.12) 174 0 R (subsection.3.4.13) 178 0 R] -/Limits [(subsection.3.3.2) (subsection.3.4.13)] ->> endobj -1052 0 obj << -/Names [(subsection.3.4.14) 182 0 R (subsection.3.4.15) 186 0 R (subsection.3.4.16) 190 0 R (subsection.3.4.2) 134 0 R (subsection.3.4.3) 138 0 R (subsection.3.4.4) 142 0 R] -/Limits [(subsection.3.4.14) (subsection.3.4.4)] ->> endobj -1053 0 obj << -/Names [(subsection.3.4.5) 146 0 R (subsection.3.4.6) 150 0 R (subsection.3.4.7) 154 0 R (subsection.3.4.8) 158 0 R (subsection.3.4.9) 162 0 R (subsection.3.5.1) 198 0 R] -/Limits [(subsection.3.4.5) (subsection.3.5.1)] +/Parent 1054 0 R +/Prev 3 0 R +/Next 27 0 R +/First 11 0 R +/Last 23 0 R +/Count 4 >> endobj -1054 0 obj << -/Names [(subsection.3.5.2) 202 0 R (subsection.3.5.3) 206 0 R (subsection.3.6.1) 214 0 R (subsection.3.6.2) 218 0 R (subsection.3.6.3) 222 0 R (subsection.3.6.4) 226 0 R] -/Limits [(subsection.3.5.2) (subsection.3.6.4)] +3 0 obj << +/Title 4 0 R +/A 1 0 R +/Parent 1054 0 R +/Next 7 0 R >> endobj 1055 0 obj << -/Names [(subsection.3.6.5) 230 0 R (subsection.3.6.6) 234 0 R (subsection.3.7.1) 242 0 R (subsection.3.7.2) 246 0 R (subsection.3.7.3) 250 0 R (subsection.3.8.1) 258 0 R] -/Limits [(subsection.3.6.5) (subsection.3.8.1)] +/Names [(Doc-Start) 350 0 R (Hfootnote.1) 488 0 R (Hfootnote.2) 489 0 R (Hfootnote.3) 516 0 R (appendix.A) 326 0 R (chapter*.1) 359 0 R] +/Limits [(Doc-Start) (chapter*.1)] >> endobj 1056 0 obj << -/Names [(subsection.3.8.2) 262 0 R (subsection.3.8.3) 266 0 R (subsection.3.8.4) 270 0 R (subsection.3.9.1) 278 0 R (subsection.3.9.2) 282 0 R (subsection.3.9.3) 286 0 R] -/Limits [(subsection.3.8.2) (subsection.3.9.3)] +/Names [(chapter*.2) 396 0 R (chapter*.3) 472 0 R (chapter.1) 2 0 R (chapter.2) 6 0 R (chapter.3) 26 0 R (lnk:autopollevents) 970 0 R] +/Limits [(chapter*.2) (lnk:autopollevents)] >> endobj 1057 0 obj << -/Names [(subsection.3.9.4) 290 0 R (table.3.1) 457 0 R (table.3.2) 458 0 R (table.3.3) 459 0 R (table.3.4) 460 0 R (table.3.5) 461 0 R] -/Limits [(subsection.3.9.4) (table.3.5)] +/Names [(lnk:keyrepeat) 971 0 R (lnk:mousecursor) 972 0 R (lnk:stickykeys) 978 0 R (lnk:stickymousebuttons) 979 0 R (lnk:systemkeys) 980 0 R (lstlisting.2.-1) 502 0 R] +/Limits [(lnk:keyrepeat) (lstlisting.2.-1)] >> endobj 1058 0 obj << -/Names [(table.3.6) 462 0 R (table.3.7) 463 0 R (table.3.8) 464 0 R] -/Limits [(table.3.6) (table.3.8)] +/Names [(lstlisting.3.-10) 596 0 R (lstlisting.3.-11) 598 0 R (lstlisting.3.-12) 605 0 R (lstlisting.3.-13) 612 0 R (lstlisting.3.-14) 614 0 R (lstlisting.3.-15) 623 0 R] +/Limits [(lstlisting.3.-10) (lstlisting.3.-15)] >> endobj 1059 0 obj << -/Kids [1005 0 R 1006 0 R 1007 0 R 1008 0 R 1009 0 R 1010 0 R] -/Limits [(Doc-Start) (lstlisting.3.-28)] +/Names [(lstlisting.3.-16) 625 0 R (lstlisting.3.-17) 637 0 R (lstlisting.3.-18) 639 0 R (lstlisting.3.-19) 647 0 R (lstlisting.3.-2) 522 0 R (lstlisting.3.-20) 659 0 R] +/Limits [(lstlisting.3.-16) (lstlisting.3.-20)] >> endobj 1060 0 obj << -/Kids [1011 0 R 1012 0 R 1013 0 R 1014 0 R 1015 0 R 1016 0 R] -/Limits [(lstlisting.3.-29) (lstlisting.3.-60)] +/Names [(lstlisting.3.-21) 661 0 R (lstlisting.3.-22) 674 0 R (lstlisting.3.-23) 681 0 R (lstlisting.3.-24) 683 0 R (lstlisting.3.-25) 691 0 R (lstlisting.3.-26) 705 0 R] +/Limits [(lstlisting.3.-21) (lstlisting.3.-26)] >> endobj 1061 0 obj << -/Kids [1017 0 R 1018 0 R 1019 0 R 1020 0 R 1021 0 R 1022 0 R] -/Limits [(lstlisting.3.-61) (lstnumber.-24.1)] +/Names [(lstlisting.3.-27) 712 0 R (lstlisting.3.-28) 714 0 R (lstlisting.3.-29) 721 0 R (lstlisting.3.-3) 530 0 R (lstlisting.3.-30) 723 0 R (lstlisting.3.-31) 731 0 R] +/Limits [(lstlisting.3.-27) (lstlisting.3.-31)] >> endobj 1062 0 obj << -/Kids [1023 0 R 1024 0 R 1025 0 R 1026 0 R 1027 0 R 1028 0 R] -/Limits [(lstnumber.-25.1) (lstnumber.-47.1)] +/Names [(lstlisting.3.-32) 738 0 R (lstlisting.3.-33) 748 0 R (lstlisting.3.-34) 750 0 R (lstlisting.3.-35) 757 0 R (lstlisting.3.-36) 766 0 R (lstlisting.3.-37) 768 0 R] +/Limits [(lstlisting.3.-32) (lstlisting.3.-37)] >> endobj 1063 0 obj << -/Kids [1029 0 R 1030 0 R 1031 0 R 1032 0 R 1033 0 R 1034 0 R] -/Limits [(lstnumber.-48.1) (page.16)] +/Names [(lstlisting.3.-38) 775 0 R (lstlisting.3.-39) 788 0 R (lstlisting.3.-4) 532 0 R (lstlisting.3.-40) 790 0 R (lstlisting.3.-41) 798 0 R (lstlisting.3.-42) 806 0 R] +/Limits [(lstlisting.3.-38) (lstlisting.3.-42)] >> endobj 1064 0 obj << -/Kids [1035 0 R 1036 0 R 1037 0 R 1038 0 R 1039 0 R 1040 0 R] -/Limits [(page.17) (page.49)] +/Names [(lstlisting.3.-43) 808 0 R (lstlisting.3.-44) 822 0 R (lstlisting.3.-45) 830 0 R (lstlisting.3.-46) 832 0 R (lstlisting.3.-47) 844 0 R (lstlisting.3.-48) 859 0 R] +/Limits [(lstlisting.3.-43) (lstlisting.3.-48)] >> endobj 1065 0 obj << -/Kids [1041 0 R 1042 0 R 1043 0 R 1044 0 R 1045 0 R 1046 0 R] -/Limits [(page.5) (subsection.3.1.2)] +/Names [(lstlisting.3.-49) 871 0 R (lstlisting.3.-5) 546 0 R (lstlisting.3.-50) 873 0 R (lstlisting.3.-51) 880 0 R (lstlisting.3.-52) 893 0 R (lstlisting.3.-53) 900 0 R] +/Limits [(lstlisting.3.-49) (lstlisting.3.-53)] >> endobj 1066 0 obj << -/Kids [1047 0 R 1048 0 R 1049 0 R 1050 0 R 1051 0 R 1052 0 R] -/Limits [(subsection.3.1.3) (subsection.3.4.4)] +/Names [(lstlisting.3.-54) 902 0 R (lstlisting.3.-55) 909 0 R (lstlisting.3.-56) 916 0 R (lstlisting.3.-57) 918 0 R (lstlisting.3.-58) 925 0 R (lstlisting.3.-59) 927 0 R] +/Limits [(lstlisting.3.-54) (lstlisting.3.-59)] >> endobj 1067 0 obj << -/Kids [1053 0 R 1054 0 R 1055 0 R 1056 0 R 1057 0 R 1058 0 R] -/Limits [(subsection.3.4.5) (table.3.8)] +/Names [(lstlisting.3.-6) 561 0 R (lstlisting.3.-60) 934 0 R (lstlisting.3.-61) 936 0 R (lstlisting.3.-62) 944 0 R (lstlisting.3.-63) 946 0 R (lstlisting.3.-64) 953 0 R] +/Limits [(lstlisting.3.-6) (lstlisting.3.-64)] >> endobj 1068 0 obj << -/Kids [1059 0 R 1060 0 R 1061 0 R 1062 0 R 1063 0 R 1064 0 R] -/Limits [(Doc-Start) (page.49)] +/Names [(lstlisting.3.-65) 967 0 R (lstlisting.3.-66) 981 0 R (lstlisting.3.-7) 579 0 R (lstlisting.3.-8) 581 0 R (lstlisting.3.-9) 588 0 R (lstnumber.-1.1) 504 0 R] +/Limits [(lstlisting.3.-65) (lstnumber.-1.1)] >> endobj 1069 0 obj << -/Kids [1065 0 R 1066 0 R 1067 0 R] -/Limits [(page.5) (table.3.8)] +/Names [(lstnumber.-1.2) 506 0 R (lstnumber.-1.3) 507 0 R (lstnumber.-1.4) 508 0 R (lstnumber.-1.5) 509 0 R (lstnumber.-10.1) 597 0 R (lstnumber.-11.1) 599 0 R] +/Limits [(lstnumber.-1.2) (lstnumber.-11.1)] >> endobj 1070 0 obj << -/Kids [1068 0 R 1069 0 R] -/Limits [(Doc-Start) (table.3.8)] +/Names [(lstnumber.-12.1) 606 0 R (lstnumber.-13.1) 613 0 R (lstnumber.-14.1) 615 0 R (lstnumber.-15.1) 624 0 R (lstnumber.-16.1) 626 0 R (lstnumber.-17.1) 638 0 R] +/Limits [(lstnumber.-12.1) (lstnumber.-17.1)] >> endobj 1071 0 obj << -/Dests 1070 0 R +/Names [(lstnumber.-18.1) 640 0 R (lstnumber.-19.1) 648 0 R (lstnumber.-2.1) 523 0 R (lstnumber.-20.1) 660 0 R (lstnumber.-21.1) 662 0 R (lstnumber.-21.2) 663 0 R] +/Limits [(lstnumber.-18.1) (lstnumber.-21.2)] >> endobj 1072 0 obj << -/Type /Catalog -/Pages 1003 0 R -/Outlines 1004 0 R -/Names 1071 0 R -/PageMode/UseOutlines/PageLabels << /Nums [0 << /S /D >> 1 << /S /r >> 7 << /S /D >> ] >> -/OpenAction 329 0 R +/Names [(lstnumber.-21.3) 665 0 R (lstnumber.-21.4) 666 0 R (lstnumber.-21.5) 667 0 R (lstnumber.-21.6) 668 0 R (lstnumber.-22.1) 675 0 R (lstnumber.-23.1) 682 0 R] +/Limits [(lstnumber.-21.3) (lstnumber.-23.1)] >> endobj 1073 0 obj << -/Author(Marcus Geelnard)/Title(GLFW Reference Manual)/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.3)/Keywords(GLFW,OpenGL,reference,manual) -/CreationDate (D:20070901203038+02'00') -/ModDate (D:20070901203038+02'00') +/Names [(lstnumber.-24.1) 684 0 R (lstnumber.-25.1) 692 0 R (lstnumber.-26.1) 706 0 R (lstnumber.-27.1) 713 0 R (lstnumber.-28.1) 715 0 R (lstnumber.-29.1) 722 0 R] +/Limits [(lstnumber.-24.1) (lstnumber.-29.1)] +>> endobj +1074 0 obj << +/Names [(lstnumber.-3.1) 531 0 R (lstnumber.-30.1) 724 0 R (lstnumber.-31.1) 732 0 R (lstnumber.-32.1) 739 0 R (lstnumber.-33.1) 749 0 R (lstnumber.-34.1) 751 0 R] +/Limits [(lstnumber.-3.1) (lstnumber.-34.1)] +>> endobj +1075 0 obj << +/Names [(lstnumber.-35.1) 758 0 R (lstnumber.-36.1) 767 0 R (lstnumber.-37.1) 769 0 R (lstnumber.-38.1) 776 0 R (lstnumber.-38.2) 777 0 R (lstnumber.-39.1) 789 0 R] +/Limits [(lstnumber.-35.1) (lstnumber.-39.1)] +>> endobj +1076 0 obj << +/Names [(lstnumber.-4.1) 533 0 R (lstnumber.-40.1) 791 0 R (lstnumber.-41.1) 799 0 R (lstnumber.-42.1) 807 0 R (lstnumber.-43.1) 809 0 R (lstnumber.-43.2) 810 0 R] +/Limits [(lstnumber.-4.1) (lstnumber.-43.2)] +>> endobj +1077 0 obj << +/Names [(lstnumber.-43.3) 811 0 R (lstnumber.-43.4) 812 0 R (lstnumber.-43.5) 813 0 R (lstnumber.-43.6) 814 0 R (lstnumber.-44.1) 823 0 R (lstnumber.-45.1) 831 0 R] +/Limits [(lstnumber.-43.3) (lstnumber.-45.1)] +>> endobj +1078 0 obj << +/Names [(lstnumber.-46.1) 833 0 R (lstnumber.-47.1) 845 0 R (lstnumber.-48.1) 860 0 R (lstnumber.-49.1) 872 0 R (lstnumber.-5.1) 547 0 R (lstnumber.-5.2) 548 0 R] +/Limits [(lstnumber.-46.1) (lstnumber.-5.2)] +>> endobj +1079 0 obj << +/Names [(lstnumber.-5.3) 549 0 R (lstnumber.-50.1) 874 0 R (lstnumber.-51.1) 881 0 R (lstnumber.-52.1) 894 0 R (lstnumber.-53.1) 901 0 R (lstnumber.-54.1) 903 0 R] +/Limits [(lstnumber.-5.3) (lstnumber.-54.1)] +>> endobj +1080 0 obj << +/Names [(lstnumber.-55.1) 910 0 R (lstnumber.-56.1) 917 0 R (lstnumber.-57.1) 919 0 R (lstnumber.-58.1) 926 0 R (lstnumber.-59.1) 928 0 R (lstnumber.-6.1) 562 0 R] +/Limits [(lstnumber.-55.1) (lstnumber.-6.1)] +>> endobj +1081 0 obj << +/Names [(lstnumber.-60.1) 935 0 R (lstnumber.-61.1) 937 0 R (lstnumber.-62.1) 945 0 R (lstnumber.-63.1) 947 0 R (lstnumber.-64.1) 954 0 R (lstnumber.-65.1) 968 0 R] +/Limits [(lstnumber.-60.1) (lstnumber.-65.1)] +>> endobj +1082 0 obj << +/Names [(lstnumber.-65.2) 969 0 R (lstnumber.-66.1) 982 0 R (lstnumber.-7.1) 580 0 R (lstnumber.-8.1) 582 0 R (lstnumber.-9.1) 589 0 R (page.1) 349 0 R] +/Limits [(lstnumber.-65.2) (page.1)] +>> endobj +1083 0 obj << +/Names [(page.10) 567 0 R (page.11) 573 0 R (page.12) 578 0 R (page.13) 587 0 R (page.14) 595 0 R (page.15) 604 0 R] +/Limits [(page.10) (page.15)] +>> endobj +1084 0 obj << +/Names [(page.16) 611 0 R (page.17) 622 0 R (page.18) 631 0 R (page.19) 636 0 R (page.2) 496 0 R (page.20) 646 0 R] +/Limits [(page.16) (page.20)] +>> endobj +1085 0 obj << +/Names [(page.21) 653 0 R (page.22) 658 0 R (page.23) 673 0 R (page.24) 680 0 R (page.25) 690 0 R (page.26) 698 0 R] +/Limits [(page.21) (page.26)] +>> endobj +1086 0 obj << +/Names [(page.27) 704 0 R (page.28) 711 0 R (page.29) 720 0 R (page.3) 501 0 R (page.30) 730 0 R (page.31) 737 0 R] +/Limits [(page.27) (page.31)] +>> endobj +1087 0 obj << +/Names [(page.32) 747 0 R (page.33) 756 0 R (page.34) 765 0 R (page.35) 774 0 R (page.36) 782 0 R (page.37) 787 0 R] +/Limits [(page.32) (page.37)] +>> endobj +1088 0 obj << +/Names [(page.38) 797 0 R (page.39) 805 0 R (page.4) 515 0 R (page.40) 821 0 R (page.41) 829 0 R (page.42) 838 0 R] +/Limits [(page.38) (page.42)] +>> endobj +1089 0 obj << +/Names [(page.43) 843 0 R (page.44) 852 0 R (page.45) 858 0 R (page.46) 865 0 R (page.47) 870 0 R (page.48) 879 0 R] +/Limits [(page.43) (page.48)] +>> endobj +1090 0 obj << +/Names [(page.49) 886 0 R (page.5) 521 0 R (page.50) 892 0 R (page.51) 899 0 R (page.52) 908 0 R (page.53) 915 0 R] +/Limits [(page.49) (page.53)] +>> endobj +1091 0 obj << +/Names [(page.54) 924 0 R (page.55) 933 0 R (page.56) 943 0 R (page.57) 952 0 R (page.58) 966 0 R (page.59) 977 0 R] +/Limits [(page.54) (page.59)] +>> endobj +1092 0 obj << +/Names [(page.6) 529 0 R (page.60) 987 0 R (page.61) 992 0 R (page.62) 998 0 R (page.63) 1003 0 R (page.64) 491 0 R] +/Limits [(page.6) (page.64)] +>> endobj +1093 0 obj << +/Names [(page.7) 539 0 R (page.8) 545 0 R (page.9) 560 0 R (page.i) 358 0 R (page.ii) 395 0 R (page.iii) 443 0 R] +/Limits [(page.7) (page.iii)] +>> endobj +1094 0 obj << +/Names [(page.iv) 459 0 R (page.v) 471 0 R (section.2.1) 10 0 R (section.2.2) 14 0 R (section.2.3) 18 0 R (section.2.4) 22 0 R] +/Limits [(page.iv) (section.2.4)] +>> endobj +1095 0 obj << +/Names [(section.3.1) 30 0 R (section.3.10) 290 0 R (section.3.11) 314 0 R (section.3.2) 46 0 R (section.3.3) 110 0 R (section.3.4) 122 0 R] +/Limits [(section.3.1) (section.3.4)] +>> endobj +1096 0 obj << +/Names [(section.3.5) 190 0 R (section.3.6) 206 0 R (section.3.7) 234 0 R (section.3.8) 250 0 R (section.3.9) 270 0 R (section.A.1) 330 0 R] +/Limits [(section.3.5) (section.A.1)] +>> endobj +1097 0 obj << +/Names [(section.A.2) 334 0 R (section.A.3) 338 0 R (section.A.4) 342 0 R (subsection.3.1.1) 34 0 R (subsection.3.1.2) 38 0 R (subsection.3.1.3) 42 0 R] +/Limits [(section.A.2) (subsection.3.1.3)] +>> endobj +1098 0 obj << +/Names [(subsection.3.10.1) 294 0 R (subsection.3.10.2) 298 0 R (subsection.3.10.3) 302 0 R (subsection.3.10.4) 306 0 R (subsection.3.10.5) 310 0 R (subsection.3.11.1) 318 0 R] +/Limits [(subsection.3.10.1) (subsection.3.11.1)] +>> endobj +1099 0 obj << +/Names [(subsection.3.11.2) 322 0 R (subsection.3.2.1) 50 0 R (subsection.3.2.10) 86 0 R (subsection.3.2.11) 90 0 R (subsection.3.2.12) 94 0 R (subsection.3.2.13) 98 0 R] +/Limits [(subsection.3.11.2) (subsection.3.2.13)] +>> endobj +1100 0 obj << +/Names [(subsection.3.2.14) 102 0 R (subsection.3.2.15) 106 0 R (subsection.3.2.2) 54 0 R (subsection.3.2.3) 58 0 R (subsection.3.2.4) 62 0 R (subsection.3.2.5) 66 0 R] +/Limits [(subsection.3.2.14) (subsection.3.2.5)] +>> endobj +1101 0 obj << +/Names [(subsection.3.2.6) 70 0 R (subsection.3.2.7) 74 0 R (subsection.3.2.8) 78 0 R (subsection.3.2.9) 82 0 R (subsection.3.3.1) 114 0 R (subsection.3.3.2) 118 0 R] +/Limits [(subsection.3.2.6) (subsection.3.3.2)] +>> endobj +1102 0 obj << +/Names [(subsection.3.4.1) 126 0 R (subsection.3.4.10) 162 0 R (subsection.3.4.11) 166 0 R (subsection.3.4.12) 170 0 R (subsection.3.4.13) 174 0 R (subsection.3.4.14) 178 0 R] +/Limits [(subsection.3.4.1) (subsection.3.4.14)] +>> endobj +1103 0 obj << +/Names [(subsection.3.4.15) 182 0 R (subsection.3.4.16) 186 0 R (subsection.3.4.2) 130 0 R (subsection.3.4.3) 134 0 R (subsection.3.4.4) 138 0 R (subsection.3.4.5) 142 0 R] +/Limits [(subsection.3.4.15) (subsection.3.4.5)] +>> endobj +1104 0 obj << +/Names [(subsection.3.4.6) 146 0 R (subsection.3.4.7) 150 0 R (subsection.3.4.8) 154 0 R (subsection.3.4.9) 158 0 R (subsection.3.5.1) 194 0 R (subsection.3.5.2) 198 0 R] +/Limits [(subsection.3.4.6) (subsection.3.5.2)] +>> endobj +1105 0 obj << +/Names [(subsection.3.5.3) 202 0 R (subsection.3.6.1) 210 0 R (subsection.3.6.2) 214 0 R (subsection.3.6.3) 218 0 R (subsection.3.6.4) 222 0 R (subsection.3.6.5) 226 0 R] +/Limits [(subsection.3.5.3) (subsection.3.6.5)] +>> endobj +1106 0 obj << +/Names [(subsection.3.6.6) 230 0 R (subsection.3.7.1) 238 0 R (subsection.3.7.2) 242 0 R (subsection.3.7.3) 246 0 R (subsection.3.8.1) 254 0 R (subsection.3.8.2) 258 0 R] +/Limits [(subsection.3.6.6) (subsection.3.8.2)] +>> endobj +1107 0 obj << +/Names [(subsection.3.8.3) 262 0 R (subsection.3.8.4) 266 0 R (subsection.3.9.1) 274 0 R (subsection.3.9.2) 278 0 R (subsection.3.9.3) 282 0 R (subsection.3.9.4) 286 0 R] +/Limits [(subsection.3.8.3) (subsection.3.9.4)] +>> endobj +1108 0 obj << +/Names [(table.3.1) 473 0 R (table.3.2) 474 0 R (table.3.3) 475 0 R (table.3.4) 476 0 R (table.3.5) 477 0 R (table.3.6) 478 0 R] +/Limits [(table.3.1) (table.3.6)] +>> endobj +1109 0 obj << +/Names [(table.3.7) 479 0 R (table.3.8) 480 0 R] +/Limits [(table.3.7) (table.3.8)] +>> endobj +1110 0 obj << +/Kids [1055 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R] +/Limits [(Doc-Start) (lstlisting.3.-26)] +>> endobj +1111 0 obj << +/Kids [1061 0 R 1062 0 R 1063 0 R 1064 0 R 1065 0 R 1066 0 R] +/Limits [(lstlisting.3.-27) (lstlisting.3.-59)] +>> endobj +1112 0 obj << +/Kids [1067 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R 1072 0 R] +/Limits [(lstlisting.3.-6) (lstnumber.-23.1)] +>> endobj +1113 0 obj << +/Kids [1073 0 R 1074 0 R 1075 0 R 1076 0 R 1077 0 R 1078 0 R] +/Limits [(lstnumber.-24.1) (lstnumber.-5.2)] +>> endobj +1114 0 obj << +/Kids [1079 0 R 1080 0 R 1081 0 R 1082 0 R 1083 0 R 1084 0 R] +/Limits [(lstnumber.-5.3) (page.20)] +>> endobj +1115 0 obj << +/Kids [1085 0 R 1086 0 R 1087 0 R 1088 0 R 1089 0 R 1090 0 R] +/Limits [(page.21) (page.53)] +>> endobj +1116 0 obj << +/Kids [1091 0 R 1092 0 R 1093 0 R 1094 0 R 1095 0 R 1096 0 R] +/Limits [(page.54) (section.A.1)] +>> endobj +1117 0 obj << +/Kids [1097 0 R 1098 0 R 1099 0 R 1100 0 R 1101 0 R 1102 0 R] +/Limits [(section.A.2) (subsection.3.4.14)] +>> endobj +1118 0 obj << +/Kids [1103 0 R 1104 0 R 1105 0 R 1106 0 R 1107 0 R 1108 0 R] +/Limits [(subsection.3.4.15) (table.3.6)] +>> endobj +1119 0 obj << +/Kids [1109 0 R] +/Limits [(table.3.7) (table.3.8)] +>> endobj +1120 0 obj << +/Kids [1110 0 R 1111 0 R 1112 0 R 1113 0 R 1114 0 R 1115 0 R] +/Limits [(Doc-Start) (page.53)] +>> endobj +1121 0 obj << +/Kids [1116 0 R 1117 0 R 1118 0 R 1119 0 R] +/Limits [(page.54) (table.3.8)] +>> endobj +1122 0 obj << +/Kids [1120 0 R 1121 0 R] +/Limits [(Doc-Start) (table.3.8)] +>> endobj +1123 0 obj << +/Dests 1122 0 R +>> endobj +1124 0 obj << +/Type /Catalog +/Pages 1053 0 R +/Outlines 1054 0 R +/Names 1123 0 R +/PageMode/UseOutlines/PageLabels<>1<>6<>]>> +/OpenAction 345 0 R +>> endobj +1125 0 obj << +/Author(Camilla Berglund)/Title(GLFW Reference Manual)/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.10)/Keywords(GLFW,OpenGL,reference,manual) +/CreationDate (D:20110812142059+02'00') +/ModDate (D:20110812142059+02'00') /Trapped /False -/PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) +/PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj xref -0 1074 -0000000001 65535 f -0000000002 00000 f -0000000003 00000 f -0000000004 00000 f -0000000000 00000 f +0 1126 +0000000000 65535 f 0000000015 00000 n -0000031170 00000 n -0000290686 00000 n +0000032316 00000 n +0000338324 00000 n 0000000060 00000 n 0000000092 00000 n -0000033221 00000 n -0000290563 00000 n +0000034392 00000 n +0000338203 00000 n 0000000137 00000 n -0000000181 00000 n -0000033270 00000 n -0000290489 00000 n -0000000229 00000 n -0000000267 00000 n -0000033319 00000 n -0000290402 00000 n -0000000315 00000 n -0000000357 00000 n -0000036362 00000 n -0000290315 00000 n -0000000405 00000 n -0000000446 00000 n -0000036411 00000 n -0000290241 00000 n -0000000494 00000 n -0000000524 00000 n -0000039542 00000 n -0000290127 00000 n -0000000570 00000 n -0000000609 00000 n -0000039591 00000 n -0000290016 00000 n -0000000657 00000 n -0000000715 00000 n -0000039640 00000 n -0000289942 00000 n -0000000768 00000 n -0000000801 00000 n -0000041531 00000 n -0000289855 00000 n -0000000854 00000 n -0000000892 00000 n -0000041679 00000 n -0000289781 00000 n -0000000945 00000 n -0000000984 00000 n -0000044277 00000 n -0000289654 00000 n -0000001032 00000 n -0000001070 00000 n -0000044326 00000 n -0000289580 00000 n -0000001123 00000 n -0000001162 00000 n -0000047110 00000 n -0000289493 00000 n -0000001215 00000 n -0000001258 00000 n -0000049471 00000 n -0000289406 00000 n -0000001311 00000 n -0000001351 00000 n -0000049620 00000 n -0000289319 00000 n -0000001404 00000 n -0000001455 00000 n -0000051898 00000 n -0000289232 00000 n -0000001508 00000 n -0000001551 00000 n -0000054003 00000 n -0000289145 00000 n -0000001604 00000 n -0000001646 00000 n -0000056031 00000 n -0000289058 00000 n -0000001699 00000 n -0000001740 00000 n -0000056179 00000 n -0000288971 00000 n -0000001793 00000 n -0000001835 00000 n -0000058457 00000 n -0000288884 00000 n -0000001888 00000 n -0000001938 00000 n -0000058604 00000 n -0000288797 00000 n -0000001992 00000 n -0000002035 00000 n -0000060776 00000 n -0000288710 00000 n -0000002089 00000 n -0000002132 00000 n -0000060925 00000 n -0000288621 00000 n -0000002186 00000 n -0000002231 00000 n -0000063207 00000 n -0000288530 00000 n -0000002286 00000 n -0000002328 00000 n -0000063357 00000 n -0000288438 00000 n -0000002383 00000 n -0000002426 00000 n -0000065614 00000 n -0000288360 00000 n -0000002481 00000 n -0000002536 00000 n -0000068188 00000 n -0000288230 00000 n -0000002585 00000 n -0000002620 00000 n -0000068238 00000 n -0000288151 00000 n -0000002674 00000 n -0000002717 00000 n -0000070717 00000 n -0000288072 00000 n -0000002771 00000 n -0000002815 00000 n -0000072994 00000 n -0000287940 00000 n -0000002864 00000 n -0000002902 00000 n -0000073044 00000 n -0000287861 00000 n -0000002956 00000 n -0000002996 00000 n -0000073194 00000 n -0000287768 00000 n -0000003050 00000 n -0000003090 00000 n -0000075656 00000 n -0000287675 00000 n -0000003144 00000 n -0000003180 00000 n -0000077949 00000 n -0000287582 00000 n -0000003234 00000 n -0000003278 00000 n -0000080087 00000 n -0000287489 00000 n -0000003332 00000 n -0000003373 00000 n -0000080236 00000 n -0000287396 00000 n -0000003427 00000 n -0000003468 00000 n -0000082284 00000 n -0000287303 00000 n -0000003522 00000 n -0000003565 00000 n -0000082433 00000 n -0000287210 00000 n -0000003619 00000 n -0000003662 00000 n -0000084750 00000 n -0000287117 00000 n -0000003716 00000 n -0000003760 00000 n -0000087157 00000 n -0000287024 00000 n -0000003815 00000 n -0000003861 00000 n -0000087306 00000 n -0000286931 00000 n -0000003916 00000 n -0000003969 00000 n -0000089861 00000 n -0000286838 00000 n -0000004024 00000 n -0000004074 00000 n -0000091902 00000 n -0000286745 00000 n -0000004129 00000 n -0000004181 00000 n -0000094364 00000 n -0000286652 00000 n -0000004236 00000 n -0000004283 00000 n -0000094514 00000 n -0000286559 00000 n -0000004338 00000 n -0000004383 00000 n -0000096953 00000 n -0000286480 00000 n -0000004438 00000 n -0000004487 00000 n -0000100820 00000 n -0000286349 00000 n -0000004536 00000 n -0000004566 00000 n -0000100870 00000 n -0000286270 00000 n -0000004620 00000 n -0000004657 00000 n -0000101020 00000 n -0000286177 00000 n -0000004711 00000 n -0000004748 00000 n -0000102922 00000 n -0000286098 00000 n -0000004802 00000 n -0000004837 00000 n -0000106135 00000 n -0000285967 00000 n -0000004886 00000 n -0000004935 00000 n -0000106185 00000 n -0000285888 00000 n -0000004989 00000 n -0000005028 00000 n -0000109171 00000 n -0000285795 00000 n -0000005082 00000 n -0000005127 00000 n -0000112649 00000 n -0000285702 00000 n -0000005181 00000 n -0000005220 00000 n -0000115160 00000 n -0000285609 00000 n -0000005274 00000 n -0000005317 00000 n -0000118010 00000 n -0000285516 00000 n -0000005371 00000 n -0000005420 00000 n -0000120859 00000 n -0000285437 00000 n -0000005474 00000 n -0000005522 00000 n -0000125340 00000 n -0000285306 00000 n -0000005571 00000 n -0000005619 00000 n -0000125390 00000 n -0000285227 00000 n -0000005673 00000 n -0000005721 00000 n -0000125539 00000 n -0000285134 00000 n -0000005775 00000 n -0000005819 00000 n -0000127717 00000 n -0000285055 00000 n -0000005873 00000 n -0000005915 00000 n -0000131432 00000 n -0000284924 00000 n -0000005964 00000 n -0000005995 00000 n -0000131482 00000 n -0000284845 00000 n -0000006049 00000 n -0000006091 00000 n -0000133700 00000 n -0000284752 00000 n -0000006145 00000 n -0000006188 00000 n -0000133849 00000 n -0000284659 00000 n -0000006242 00000 n -0000006282 00000 n -0000135475 00000 n -0000284580 00000 n -0000006336 00000 n -0000006377 00000 n -0000137379 00000 n -0000284449 00000 n -0000006426 00000 n -0000006457 00000 n -0000137429 00000 n -0000284370 00000 n -0000006511 00000 n -0000006552 00000 n -0000137577 00000 n -0000284277 00000 n -0000006606 00000 n -0000006648 00000 n -0000139330 00000 n -0000284184 00000 n -0000006702 00000 n -0000006741 00000 n -0000139479 00000 n -0000284105 00000 n -0000006795 00000 n -0000006836 00000 n -0000141290 00000 n -0000283974 00000 n -0000006886 00000 n -0000006930 00000 n -0000141340 00000 n -0000283895 00000 n -0000006985 00000 n -0000007026 00000 n -0000141490 00000 n -0000283802 00000 n -0000007081 00000 n -0000007123 00000 n -0000143777 00000 n -0000283709 00000 n -0000007178 00000 n -0000007217 00000 n -0000143926 00000 n -0000283616 00000 n -0000007272 00000 n -0000007313 00000 n -0000145760 00000 n -0000283537 00000 n -0000007368 00000 n -0000007412 00000 n -0000148326 00000 n -0000283420 00000 n -0000007462 00000 n -0000007500 00000 n -0000148376 00000 n -0000283341 00000 n -0000007555 00000 n -0000007604 00000 n -0000151477 00000 n -0000283262 00000 n -0000007659 00000 n -0000007711 00000 n -0000008155 00000 n -0000008374 00000 n -0000007764 00000 n -0000008274 00000 n -0000008324 00000 n -0000280896 00000 n -0000281420 00000 n -0000279951 00000 n -0000281599 00000 n -0000009362 00000 n -0000009143 00000 n -0000008472 00000 n -0000009262 00000 n -0000009312 00000 n -0000281247 00000 n -0000009986 00000 n -0000009817 00000 n -0000009460 00000 n -0000009936 00000 n -0000011421 00000 n -0000011571 00000 n -0000011721 00000 n -0000011874 00000 n -0000012027 00000 n -0000012180 00000 n -0000012333 00000 n -0000012483 00000 n -0000012636 00000 n -0000012795 00000 n -0000012949 00000 n -0000013107 00000 n -0000013260 00000 n -0000013419 00000 n -0000013578 00000 n -0000013737 00000 n -0000013896 00000 n -0000014054 00000 n -0000014212 00000 n -0000014371 00000 n -0000014530 00000 n -0000014689 00000 n -0000014848 00000 n -0000015007 00000 n -0000015167 00000 n -0000015327 00000 n -0000015487 00000 n -0000015647 00000 n -0000015800 00000 n -0000015959 00000 n -0000017902 00000 n -0000016217 00000 n -0000011050 00000 n -0000010058 00000 n -0000016118 00000 n -0000016168 00000 n -0000018055 00000 n -0000018214 00000 n -0000018373 00000 n -0000018532 00000 n -0000018691 00000 n -0000018849 00000 n -0000019003 00000 n -0000019162 00000 n -0000019320 00000 n -0000019479 00000 n -0000019639 00000 n -0000019799 00000 n -0000019959 00000 n -0000020119 00000 n -0000020279 00000 n -0000020439 00000 n -0000020599 00000 n -0000020752 00000 n -0000020909 00000 n -0000021067 00000 n -0000021226 00000 n -0000021379 00000 n -0000021538 00000 n -0000021697 00000 n -0000021856 00000 n -0000022015 00000 n -0000022174 00000 n -0000022333 00000 n -0000022486 00000 n -0000022645 00000 n -0000022803 00000 n -0000022960 00000 n -0000023113 00000 n -0000023272 00000 n -0000023431 00000 n -0000023590 00000 n -0000023749 00000 n -0000023901 00000 n -0000024060 00000 n -0000024219 00000 n -0000024377 00000 n -0000024536 00000 n -0000025448 00000 n -0000024740 00000 n -0000017427 00000 n -0000016302 00000 n -0000024690 00000 n -0000025608 00000 n -0000025768 00000 n -0000025928 00000 n -0000026088 00000 n -0000026248 00000 n -0000026401 00000 n -0000026556 00000 n -0000026765 00000 n -0000025253 00000 n -0000024812 00000 n -0000026715 00000 n -0000027726 00000 n -0000027875 00000 n -0000028025 00000 n -0000028176 00000 n -0000028327 00000 n -0000028476 00000 n -0000028627 00000 n -0000028778 00000 n -0000029028 00000 n -0000027531 00000 n -0000026837 00000 n -0000028929 00000 n -0000028979 00000 n -0000281717 00000 n -0000154613 00000 n -0000156908 00000 n -0000159660 00000 n -0000159710 00000 n -0000163512 00000 n -0000163562 00000 n -0000163612 00000 n -0000163662 00000 n -0000031017 00000 n -0000030868 00000 n -0000031268 00000 n -0000030721 00000 n -0000029113 00000 n -0000280093 00000 n -0000031218 00000 n -0000163462 00000 n -0000033022 00000 n -0000033368 00000 n -0000032883 00000 n -0000031392 00000 n -0000033171 00000 n -0000035864 00000 n -0000036460 00000 n -0000035725 00000 n -0000033466 00000 n -0000036013 00000 n -0000036063 00000 n -0000280235 00000 n -0000036112 00000 n -0000280550 00000 n -0000036162 00000 n -0000036212 00000 n -0000036262 00000 n -0000036312 00000 n -0000037657 00000 n -0000037508 00000 n -0000037910 00000 n -0000037361 00000 n -0000036596 00000 n -0000037811 00000 n -0000037861 00000 n -0000039343 00000 n -0000039789 00000 n -0000039204 00000 n -0000038008 00000 n -0000039492 00000 n -0000039689 00000 n -0000039739 00000 n -0000280379 00000 n -0000041332 00000 n -0000041828 00000 n -0000041193 00000 n -0000039925 00000 n -0000041481 00000 n -0000041580 00000 n -0000041629 00000 n -0000041728 00000 n -0000041778 00000 n -0000281070 00000 n -0000281835 00000 n -0000044078 00000 n -0000044575 00000 n -0000043939 00000 n -0000041977 00000 n -0000044227 00000 n -0000044375 00000 n -0000044425 00000 n -0000044475 00000 n -0000044525 00000 n -0000279380 00000 n -0000279668 00000 n -0000279810 00000 n -0000046756 00000 n -0000046908 00000 n -0000046607 00000 n -0000047258 00000 n -0000046452 00000 n -0000044763 00000 n -0000047060 00000 n -0000047159 00000 n -0000047209 00000 n -0000049272 00000 n -0000049769 00000 n -0000049133 00000 n -0000047407 00000 n -0000049421 00000 n -0000049520 00000 n -0000049570 00000 n -0000049669 00000 n -0000049719 00000 n -0000051699 00000 n -0000052046 00000 n -0000051560 00000 n -0000049905 00000 n -0000051848 00000 n -0000051946 00000 n -0000051996 00000 n -0000053804 00000 n -0000054152 00000 n -0000053665 00000 n -0000052195 00000 n -0000053953 00000 n -0000054052 00000 n -0000054102 00000 n -0000055832 00000 n -0000056328 00000 n -0000055693 00000 n -0000054301 00000 n -0000055981 00000 n -0000056080 00000 n -0000056129 00000 n -0000056228 00000 n -0000056278 00000 n -0000281953 00000 n -0000058258 00000 n -0000058752 00000 n -0000058119 00000 n -0000056477 00000 n -0000058407 00000 n -0000058505 00000 n -0000058554 00000 n -0000058653 00000 n -0000058703 00000 n -0000060425 00000 n -0000060576 00000 n -0000060276 00000 n -0000061073 00000 n -0000060121 00000 n -0000058901 00000 n -0000060726 00000 n -0000060825 00000 n -0000060875 00000 n -0000060974 00000 n -0000061024 00000 n -0000063008 00000 n -0000063505 00000 n -0000062869 00000 n -0000061222 00000 n -0000063157 00000 n -0000063257 00000 n -0000063307 00000 n -0000063406 00000 n -0000063455 00000 n -0000065415 00000 n -0000065764 00000 n -0000065276 00000 n -0000063654 00000 n -0000065564 00000 n -0000065664 00000 n -0000065714 00000 n -0000067989 00000 n -0000068737 00000 n -0000067850 00000 n -0000065913 00000 n -0000068138 00000 n -0000068288 00000 n -0000068338 00000 n -0000068388 00000 n -0000068438 00000 n -0000068488 00000 n -0000280721 00000 n -0000068538 00000 n -0000068588 00000 n -0000068637 00000 n -0000068687 00000 n -0000070518 00000 n -0000070866 00000 n -0000070379 00000 n -0000068938 00000 n -0000070667 00000 n -0000070767 00000 n -0000070816 00000 n -0000282071 00000 n -0000072795 00000 n -0000073344 00000 n -0000072656 00000 n -0000071015 00000 n -0000072944 00000 n -0000073094 00000 n -0000073144 00000 n -0000073244 00000 n -0000073294 00000 n -0000075455 00000 n -0000075306 00000 n -0000075806 00000 n -0000075159 00000 n -0000073480 00000 n -0000075606 00000 n -0000075706 00000 n -0000075756 00000 n -0000077747 00000 n -0000077598 00000 n -0000078098 00000 n -0000077451 00000 n -0000075955 00000 n -0000077899 00000 n -0000077999 00000 n -0000078048 00000 n -0000079888 00000 n -0000080386 00000 n -0000079749 00000 n -0000078247 00000 n -0000080037 00000 n -0000080137 00000 n -0000080186 00000 n -0000080286 00000 n -0000080336 00000 n -0000082085 00000 n -0000082583 00000 n -0000081946 00000 n -0000080535 00000 n -0000082234 00000 n -0000082333 00000 n -0000082383 00000 n -0000082483 00000 n -0000082533 00000 n -0000084548 00000 n -0000084399 00000 n -0000084898 00000 n -0000084252 00000 n -0000082732 00000 n -0000084700 00000 n -0000084799 00000 n -0000084848 00000 n -0000282189 00000 n -0000086958 00000 n -0000087356 00000 n -0000086819 00000 n -0000085047 00000 n -0000087107 00000 n -0000087207 00000 n -0000087256 00000 n -0000089409 00000 n -0000089561 00000 n -0000089260 00000 n -0000090011 00000 n -0000089105 00000 n -0000087505 00000 n -0000089711 00000 n -0000089761 00000 n -0000089811 00000 n -0000089911 00000 n -0000089961 00000 n -0000091703 00000 n -0000092052 00000 n -0000091564 00000 n -0000090160 00000 n -0000091852 00000 n -0000091952 00000 n -0000092002 00000 n -0000094015 00000 n -0000094166 00000 n -0000093866 00000 n -0000094664 00000 n -0000093711 00000 n -0000092201 00000 n -0000094314 00000 n -0000094414 00000 n -0000094464 00000 n -0000094564 00000 n -0000094614 00000 n -0000096754 00000 n -0000097153 00000 n -0000096615 00000 n -0000094813 00000 n -0000096903 00000 n -0000097003 00000 n -0000097053 00000 n -0000097103 00000 n -0000098713 00000 n -0000098912 00000 n -0000098574 00000 n -0000097302 00000 n -0000098862 00000 n -0000282307 00000 n -0000100621 00000 n -0000101169 00000 n -0000100482 00000 n -0000099023 00000 n -0000100770 00000 n -0000100920 00000 n -0000100970 00000 n -0000101070 00000 n -0000101120 00000 n -0000102723 00000 n -0000103071 00000 n -0000102584 00000 n -0000101344 00000 n -0000102872 00000 n -0000102972 00000 n -0000103021 00000 n -0000105934 00000 n -0000105785 00000 n -0000106684 00000 n -0000105638 00000 n -0000103233 00000 n -0000106085 00000 n -0000106235 00000 n -0000106285 00000 n -0000106335 00000 n -0000106385 00000 n -0000106435 00000 n -0000106485 00000 n -0000106535 00000 n -0000106584 00000 n -0000106634 00000 n -0000279524 00000 n -0000108970 00000 n -0000108821 00000 n -0000109320 00000 n -0000108674 00000 n -0000106885 00000 n -0000109121 00000 n -0000109221 00000 n -0000109271 00000 n -0000112101 00000 n -0000112799 00000 n -0000111962 00000 n -0000109469 00000 n -0000112250 00000 n -0000112300 00000 n -0000112350 00000 n -0000112400 00000 n -0000112449 00000 n -0000112499 00000 n -0000112549 00000 n -0000112599 00000 n -0000112699 00000 n -0000112749 00000 n -0000114959 00000 n -0000114810 00000 n -0000115309 00000 n -0000114663 00000 n -0000113000 00000 n -0000115110 00000 n -0000115210 00000 n -0000115260 00000 n -0000282425 00000 n -0000117809 00000 n -0000117660 00000 n -0000118160 00000 n -0000117513 00000 n -0000115458 00000 n -0000117960 00000 n -0000118060 00000 n -0000118110 00000 n -0000120658 00000 n -0000120509 00000 n -0000121009 00000 n -0000120362 00000 n -0000118348 00000 n -0000120809 00000 n -0000120909 00000 n -0000120959 00000 n -0000122883 00000 n -0000123082 00000 n -0000122744 00000 n -0000121197 00000 n -0000123032 00000 n -0000125141 00000 n -0000125689 00000 n -0000125002 00000 n -0000123219 00000 n -0000125290 00000 n -0000125440 00000 n -0000125489 00000 n -0000125589 00000 n -0000125639 00000 n -0000127518 00000 n -0000127865 00000 n -0000127379 00000 n -0000125838 00000 n -0000127667 00000 n -0000127766 00000 n -0000127815 00000 n -0000128931 00000 n -0000129130 00000 n -0000128792 00000 n -0000128014 00000 n -0000129080 00000 n -0000282543 00000 n -0000131233 00000 n -0000131631 00000 n -0000131094 00000 n -0000129241 00000 n -0000131382 00000 n -0000131532 00000 n -0000131582 00000 n -0000133501 00000 n -0000133999 00000 n -0000133362 00000 n -0000131780 00000 n -0000133650 00000 n -0000133750 00000 n -0000133799 00000 n -0000133899 00000 n -0000133949 00000 n -0000135276 00000 n -0000135625 00000 n -0000135137 00000 n -0000134148 00000 n -0000135425 00000 n -0000135525 00000 n -0000135575 00000 n -0000137180 00000 n -0000137727 00000 n -0000137041 00000 n -0000135761 00000 n -0000137329 00000 n -0000137478 00000 n -0000137527 00000 n -0000137627 00000 n -0000137677 00000 n -0000139131 00000 n -0000139629 00000 n -0000138992 00000 n -0000137876 00000 n -0000139280 00000 n -0000139380 00000 n -0000139429 00000 n -0000139529 00000 n -0000139579 00000 n -0000141091 00000 n -0000141640 00000 n -0000140952 00000 n -0000139778 00000 n -0000141240 00000 n -0000141390 00000 n -0000141440 00000 n -0000141540 00000 n -0000141590 00000 n -0000282661 00000 n -0000143578 00000 n -0000144074 00000 n -0000143439 00000 n -0000141789 00000 n -0000143727 00000 n -0000143827 00000 n -0000143876 00000 n -0000143975 00000 n -0000144024 00000 n -0000145561 00000 n -0000145910 00000 n -0000145422 00000 n -0000144223 00000 n -0000145710 00000 n -0000145810 00000 n -0000145860 00000 n -0000148124 00000 n -0000162516 00000 n -0000162676 00000 n -0000162831 00000 n -0000162986 00000 n -0000163142 00000 n -0000163306 00000 n -0000147975 00000 n -0000148724 00000 n -0000147828 00000 n -0000146059 00000 n -0000148276 00000 n -0000148426 00000 n -0000148476 00000 n -0000148525 00000 n -0000148574 00000 n -0000148624 00000 n -0000148674 00000 n -0000151129 00000 n -0000151627 00000 n -0000150990 00000 n -0000148873 00000 n -0000151278 00000 n -0000151328 00000 n -0000151378 00000 n -0000151428 00000 n -0000151527 00000 n -0000151577 00000 n -0000152457 00000 n -0000152656 00000 n -0000152318 00000 n -0000151763 00000 n -0000152606 00000 n -0000154414 00000 n -0000154663 00000 n -0000154275 00000 n -0000152754 00000 n -0000154563 00000 n -0000282779 00000 n -0000156709 00000 n -0000156958 00000 n -0000156570 00000 n -0000154761 00000 n -0000156858 00000 n -0000159461 00000 n -0000159759 00000 n -0000159322 00000 n -0000157056 00000 n -0000159610 00000 n -0000162367 00000 n -0000163712 00000 n -0000162180 00000 n -0000159883 00000 n -0000163849 00000 n -0000278970 00000 n -0000163880 00000 n -0000164199 00000 n -0000164230 00000 n -0000164341 00000 n -0000164898 00000 n -0000165369 00000 n -0000165488 00000 n -0000165851 00000 n -0000165886 00000 n -0000165912 00000 n -0000166475 00000 n -0000166581 00000 n -0000166912 00000 n -0000167244 00000 n -0000173230 00000 n -0000173489 00000 n -0000175648 00000 n -0000175871 00000 n -0000178123 00000 n -0000178365 00000 n -0000180271 00000 n -0000180498 00000 n -0000182266 00000 n -0000182528 00000 n -0000183812 00000 n -0000184044 00000 n -0000185896 00000 n -0000186124 00000 n -0000194933 00000 n -0000195198 00000 n -0000210303 00000 n -0000210710 00000 n -0000219592 00000 n -0000219880 00000 n -0000235345 00000 n -0000235752 00000 n -0000246319 00000 n -0000246619 00000 n -0000265273 00000 n -0000265784 00000 n -0000278607 00000 n -0000282881 00000 n -0000283001 00000 n -0000283113 00000 n -0000283186 00000 n -0000290759 00000 n -0000290954 00000 n -0000291162 00000 n -0000291404 00000 n -0000291647 00000 n -0000291889 00000 n -0000292132 00000 n -0000292374 00000 n -0000292617 00000 n -0000292858 00000 n -0000293099 00000 n -0000293342 00000 n -0000293584 00000 n -0000293827 00000 n -0000294061 00000 n -0000294292 00000 n -0000294527 00000 n -0000294761 00000 n -0000294996 00000 n -0000295229 00000 n -0000295464 00000 n -0000295697 00000 n -0000295932 00000 n -0000296167 00000 n -0000296402 00000 n -0000296634 00000 n -0000296869 00000 n -0000297103 00000 n -0000297338 00000 n -0000297545 00000 n -0000297716 00000 n -0000297886 00000 n -0000298057 00000 n -0000298227 00000 n -0000298398 00000 n -0000298568 00000 n -0000298739 00000 n -0000298908 00000 n -0000299075 00000 n -0000299242 00000 n -0000299432 00000 n -0000299637 00000 n -0000299853 00000 n -0000300101 00000 n -0000300347 00000 n -0000300591 00000 n -0000300829 00000 n -0000301077 00000 n -0000301324 00000 n -0000301567 00000 n -0000301810 00000 n -0000302053 00000 n -0000302296 00000 n -0000302497 00000 n -0000302624 00000 n -0000302751 00000 n -0000302885 00000 n -0000303018 00000 n -0000303150 00000 n -0000303274 00000 n -0000303390 00000 n -0000303514 00000 n -0000303648 00000 n -0000303775 00000 n -0000303893 00000 n -0000303983 00000 n -0000304067 00000 n -0000304107 00000 n -0000304307 00000 n +0000000180 00000 n +0000034440 00000 n +0000338131 00000 n +0000000227 00000 n +0000000265 00000 n +0000034489 00000 n +0000338045 00000 n +0000000313 00000 n +0000000355 00000 n +0000037478 00000 n +0000337959 00000 n +0000000403 00000 n +0000000444 00000 n +0000037527 00000 n +0000337886 00000 n +0000000492 00000 n +0000000522 00000 n +0000040350 00000 n +0000337759 00000 n +0000000568 00000 n +0000000607 00000 n +0000040399 00000 n +0000337648 00000 n +0000000655 00000 n +0000000713 00000 n +0000040448 00000 n +0000337574 00000 n +0000000766 00000 n +0000000799 00000 n +0000042555 00000 n +0000337487 00000 n +0000000852 00000 n +0000000890 00000 n +0000042704 00000 n +0000337413 00000 n +0000000943 00000 n +0000000982 00000 n +0000046214 00000 n +0000337286 00000 n +0000001030 00000 n +0000001068 00000 n +0000046263 00000 n +0000337212 00000 n +0000001121 00000 n +0000001160 00000 n +0000049662 00000 n +0000337125 00000 n +0000001213 00000 n +0000001256 00000 n +0000057414 00000 n +0000337038 00000 n +0000001309 00000 n +0000001349 00000 n +0000057562 00000 n +0000336951 00000 n +0000001402 00000 n +0000001453 00000 n +0000059750 00000 n +0000336864 00000 n +0000001506 00000 n +0000001549 00000 n +0000061987 00000 n +0000336777 00000 n +0000001602 00000 n +0000001644 00000 n +0000062136 00000 n +0000336690 00000 n +0000001697 00000 n +0000001738 00000 n +0000064207 00000 n +0000336603 00000 n +0000001791 00000 n +0000001833 00000 n +0000066394 00000 n +0000336516 00000 n +0000001886 00000 n +0000001936 00000 n +0000066542 00000 n +0000336429 00000 n +0000001990 00000 n +0000002033 00000 n +0000068732 00000 n +0000336342 00000 n +0000002087 00000 n +0000002130 00000 n +0000068881 00000 n +0000336255 00000 n +0000002184 00000 n +0000002228 00000 n +0000074064 00000 n +0000336166 00000 n +0000002282 00000 n +0000002324 00000 n +0000074213 00000 n +0000336075 00000 n +0000002379 00000 n +0000002422 00000 n +0000076367 00000 n +0000335997 00000 n +0000002477 00000 n +0000002532 00000 n +0000080039 00000 n +0000335867 00000 n +0000002581 00000 n +0000002616 00000 n +0000080089 00000 n +0000335788 00000 n +0000002670 00000 n +0000002713 00000 n +0000082560 00000 n +0000335709 00000 n +0000002767 00000 n +0000002811 00000 n +0000084828 00000 n +0000335577 00000 n +0000002860 00000 n +0000002898 00000 n +0000084878 00000 n +0000335498 00000 n +0000002952 00000 n +0000002992 00000 n +0000085028 00000 n +0000335405 00000 n +0000003046 00000 n +0000003086 00000 n +0000087445 00000 n +0000335312 00000 n +0000003140 00000 n +0000003176 00000 n +0000092610 00000 n +0000335219 00000 n +0000003230 00000 n +0000003274 00000 n +0000094824 00000 n +0000335126 00000 n +0000003328 00000 n +0000003369 00000 n +0000094973 00000 n +0000335033 00000 n +0000003423 00000 n +0000003464 00000 n +0000097134 00000 n +0000334940 00000 n +0000003518 00000 n +0000003561 00000 n +0000097284 00000 n +0000334847 00000 n +0000003615 00000 n +0000003658 00000 n +0000099741 00000 n +0000334754 00000 n +0000003712 00000 n +0000003756 00000 n +0000102138 00000 n +0000334661 00000 n +0000003811 00000 n +0000003857 00000 n +0000102287 00000 n +0000334568 00000 n +0000003912 00000 n +0000003965 00000 n +0000104857 00000 n +0000334475 00000 n +0000004020 00000 n +0000004070 00000 n +0000106907 00000 n +0000334382 00000 n +0000004125 00000 n +0000004177 00000 n +0000109418 00000 n +0000334289 00000 n +0000004232 00000 n +0000004279 00000 n +0000109568 00000 n +0000334196 00000 n +0000004334 00000 n +0000004379 00000 n +0000112010 00000 n +0000334117 00000 n +0000004434 00000 n +0000004483 00000 n +0000115738 00000 n +0000333986 00000 n +0000004532 00000 n +0000004562 00000 n +0000115788 00000 n +0000333907 00000 n +0000004616 00000 n +0000004653 00000 n +0000115938 00000 n +0000333814 00000 n +0000004707 00000 n +0000004744 00000 n +0000117822 00000 n +0000333735 00000 n +0000004798 00000 n +0000004833 00000 n +0000121025 00000 n +0000333604 00000 n +0000004882 00000 n +0000004931 00000 n +0000121075 00000 n +0000333525 00000 n +0000004985 00000 n +0000005024 00000 n +0000124073 00000 n +0000333432 00000 n +0000005078 00000 n +0000005123 00000 n +0000126376 00000 n +0000333339 00000 n +0000005177 00000 n +0000005216 00000 n +0000126526 00000 n +0000333246 00000 n +0000005270 00000 n +0000005313 00000 n +0000131767 00000 n +0000333153 00000 n +0000005367 00000 n +0000005416 00000 n +0000137074 00000 n +0000333074 00000 n +0000005470 00000 n +0000005518 00000 n +0000140595 00000 n +0000332943 00000 n +0000005567 00000 n +0000005615 00000 n +0000140645 00000 n +0000332864 00000 n +0000005669 00000 n +0000005717 00000 n +0000140794 00000 n +0000332771 00000 n +0000005771 00000 n +0000005815 00000 n +0000143061 00000 n +0000332692 00000 n +0000005869 00000 n +0000005911 00000 n +0000146841 00000 n +0000332561 00000 n +0000005960 00000 n +0000005991 00000 n +0000146891 00000 n +0000332482 00000 n +0000006045 00000 n +0000006087 00000 n +0000149098 00000 n +0000332389 00000 n +0000006141 00000 n +0000006184 00000 n +0000149247 00000 n +0000332296 00000 n +0000006238 00000 n +0000006278 00000 n +0000150877 00000 n +0000332217 00000 n +0000006332 00000 n +0000006373 00000 n +0000152777 00000 n +0000332086 00000 n +0000006422 00000 n +0000006453 00000 n +0000152827 00000 n +0000332007 00000 n +0000006507 00000 n +0000006548 00000 n +0000152975 00000 n +0000331914 00000 n +0000006602 00000 n +0000006644 00000 n +0000154751 00000 n +0000331821 00000 n +0000006698 00000 n +0000006737 00000 n +0000154900 00000 n +0000331742 00000 n +0000006791 00000 n +0000006832 00000 n +0000156714 00000 n +0000331611 00000 n +0000006882 00000 n +0000006926 00000 n +0000156764 00000 n +0000331532 00000 n +0000006981 00000 n +0000007022 00000 n +0000156914 00000 n +0000331439 00000 n +0000007077 00000 n +0000007119 00000 n +0000159149 00000 n +0000331346 00000 n +0000007174 00000 n +0000007213 00000 n +0000159298 00000 n +0000331253 00000 n +0000007268 00000 n +0000007309 00000 n +0000161083 00000 n +0000331174 00000 n +0000007364 00000 n +0000007408 00000 n +0000163666 00000 n +0000331057 00000 n +0000007458 00000 n +0000007496 00000 n +0000163716 00000 n +0000330978 00000 n +0000007551 00000 n +0000007600 00000 n +0000166786 00000 n +0000330899 00000 n +0000007655 00000 n +0000007707 00000 n +0000172654 00000 n +0000330782 00000 n +0000007755 00000 n +0000007795 00000 n +0000172704 00000 n +0000330703 00000 n +0000007844 00000 n +0000007894 00000 n +0000175020 00000 n +0000330610 00000 n +0000007943 00000 n +0000007981 00000 n +0000175071 00000 n +0000330517 00000 n +0000008030 00000 n +0000008068 00000 n +0000176708 00000 n +0000330438 00000 n +0000008117 00000 n +0000008164 00000 n +0000008641 00000 n +0000008860 00000 n +0000008217 00000 n +0000008760 00000 n +0000008810 00000 n +0000327933 00000 n +0000328465 00000 n +0000326973 00000 n +0000328646 00000 n +0000009912 00000 n +0000009693 00000 n +0000008958 00000 n +0000009812 00000 n +0000009862 00000 n +0000328289 00000 n +0000011373 00000 n +0000011523 00000 n +0000011673 00000 n +0000011826 00000 n +0000011979 00000 n +0000012132 00000 n +0000012285 00000 n +0000012435 00000 n +0000012588 00000 n +0000012747 00000 n +0000012901 00000 n +0000013059 00000 n +0000013212 00000 n +0000013371 00000 n +0000013530 00000 n +0000013689 00000 n +0000013848 00000 n +0000014006 00000 n +0000014164 00000 n +0000014323 00000 n +0000014482 00000 n +0000014641 00000 n +0000014800 00000 n +0000014959 00000 n +0000015119 00000 n +0000015279 00000 n +0000015439 00000 n +0000015599 00000 n +0000015752 00000 n +0000015911 00000 n +0000017848 00000 n +0000016169 00000 n +0000011002 00000 n +0000010010 00000 n +0000016070 00000 n +0000016120 00000 n +0000018001 00000 n +0000018160 00000 n +0000018319 00000 n +0000018478 00000 n +0000018637 00000 n +0000018795 00000 n +0000018949 00000 n +0000019108 00000 n +0000019266 00000 n +0000019425 00000 n +0000019585 00000 n +0000019745 00000 n +0000019905 00000 n +0000020065 00000 n +0000020225 00000 n +0000020385 00000 n +0000020545 00000 n +0000020698 00000 n +0000020855 00000 n +0000021013 00000 n +0000021172 00000 n +0000021325 00000 n +0000021484 00000 n +0000021643 00000 n +0000021802 00000 n +0000021961 00000 n +0000022120 00000 n +0000022279 00000 n +0000022432 00000 n +0000022591 00000 n +0000022749 00000 n +0000022906 00000 n +0000023059 00000 n +0000023218 00000 n +0000023377 00000 n +0000023536 00000 n +0000023695 00000 n +0000023847 00000 n +0000024006 00000 n +0000024165 00000 n +0000024323 00000 n +0000024482 00000 n +0000025624 00000 n +0000024686 00000 n +0000017373 00000 n +0000016254 00000 n +0000024636 00000 n +0000025784 00000 n +0000025944 00000 n +0000026104 00000 n +0000026264 00000 n +0000026424 00000 n +0000026577 00000 n +0000026732 00000 n +0000026891 00000 n +0000027041 00000 n +0000027194 00000 n +0000027347 00000 n +0000027500 00000 n +0000027703 00000 n +0000025389 00000 n +0000024758 00000 n +0000027653 00000 n +0000028679 00000 n +0000028828 00000 n +0000028978 00000 n +0000029129 00000 n +0000029280 00000 n +0000029429 00000 n +0000029580 00000 n +0000029731 00000 n +0000029981 00000 n +0000028484 00000 n +0000027788 00000 n +0000029882 00000 n +0000029932 00000 n +0000052619 00000 n +0000071706 00000 n +0000090344 00000 n +0000129100 00000 n +0000129150 00000 n +0000129200 00000 n +0000129250 00000 n +0000170515 00000 n +0000032009 00000 n +0000032163 00000 n +0000031860 00000 n +0000032464 00000 n +0000031705 00000 n +0000030066 00000 n +0000327117 00000 n +0000032364 00000 n +0000032414 00000 n +0000328764 00000 n +0000176657 00000 n +0000034193 00000 n +0000034538 00000 n +0000034054 00000 n +0000032588 00000 n +0000034342 00000 n +0000036979 00000 n +0000037576 00000 n +0000036840 00000 n +0000034649 00000 n +0000037128 00000 n +0000037178 00000 n +0000327261 00000 n +0000037228 00000 n +0000327581 00000 n +0000037278 00000 n +0000037328 00000 n +0000037378 00000 n +0000037428 00000 n +0000038640 00000 n +0000038491 00000 n +0000038894 00000 n +0000038344 00000 n +0000037725 00000 n +0000038794 00000 n +0000038844 00000 n +0000040151 00000 n +0000040594 00000 n +0000040012 00000 n +0000038979 00000 n +0000040300 00000 n +0000040496 00000 n +0000040544 00000 n +0000327407 00000 n +0000042356 00000 n +0000042853 00000 n +0000042217 00000 n +0000040730 00000 n +0000042505 00000 n +0000042604 00000 n +0000042654 00000 n +0000042753 00000 n +0000042803 00000 n +0000328109 00000 n +0000043594 00000 n +0000043793 00000 n +0000043455 00000 n +0000043002 00000 n +0000043743 00000 n +0000328882 00000 n +0000046015 00000 n +0000046510 00000 n +0000045876 00000 n +0000043891 00000 n +0000046164 00000 n +0000046312 00000 n +0000046361 00000 n +0000046411 00000 n +0000046461 00000 n +0000326394 00000 n +0000326686 00000 n +0000326830 00000 n +0000049156 00000 n +0000049309 00000 n +0000049461 00000 n +0000049007 00000 n +0000049811 00000 n +0000048844 00000 n +0000046711 00000 n +0000049612 00000 n +0000049711 00000 n +0000049761 00000 n +0000052420 00000 n +0000052669 00000 n +0000052281 00000 n +0000049973 00000 n +0000052569 00000 n +0000055225 00000 n +0000055076 00000 n +0000055427 00000 n +0000054929 00000 n +0000052780 00000 n +0000055377 00000 n +0000057215 00000 n +0000057711 00000 n +0000057076 00000 n +0000055538 00000 n +0000057364 00000 n +0000057463 00000 n +0000057512 00000 n +0000057611 00000 n +0000057661 00000 n +0000059551 00000 n +0000059899 00000 n +0000059412 00000 n +0000057873 00000 n +0000059700 00000 n +0000059799 00000 n +0000059849 00000 n +0000329000 00000 n +0000061788 00000 n +0000062285 00000 n +0000061649 00000 n +0000060061 00000 n +0000061937 00000 n +0000062036 00000 n +0000062086 00000 n +0000062185 00000 n +0000062235 00000 n +0000064008 00000 n +0000064356 00000 n +0000063869 00000 n +0000062447 00000 n +0000064157 00000 n +0000064256 00000 n +0000064306 00000 n +0000066195 00000 n +0000066691 00000 n +0000066056 00000 n +0000064505 00000 n +0000066344 00000 n +0000066443 00000 n +0000066492 00000 n +0000066591 00000 n +0000066641 00000 n +0000068379 00000 n +0000068530 00000 n +0000068230 00000 n +0000069029 00000 n +0000068075 00000 n +0000066840 00000 n +0000068682 00000 n +0000068781 00000 n +0000068831 00000 n +0000068930 00000 n +0000068979 00000 n +0000071507 00000 n +0000071755 00000 n +0000071368 00000 n +0000069178 00000 n +0000071656 00000 n +0000073865 00000 n +0000074362 00000 n +0000073726 00000 n +0000071853 00000 n +0000074014 00000 n +0000074113 00000 n +0000074163 00000 n +0000074263 00000 n +0000074313 00000 n +0000329118 00000 n +0000076168 00000 n +0000076517 00000 n +0000076029 00000 n +0000074524 00000 n +0000076317 00000 n +0000076417 00000 n +0000076467 00000 n +0000077495 00000 n +0000077694 00000 n +0000077356 00000 n +0000076666 00000 n +0000077644 00000 n +0000079840 00000 n +0000080588 00000 n +0000079701 00000 n +0000077792 00000 n +0000079989 00000 n +0000080139 00000 n +0000080189 00000 n +0000080239 00000 n +0000080289 00000 n +0000080339 00000 n +0000327755 00000 n +0000080389 00000 n +0000080438 00000 n +0000080488 00000 n +0000080538 00000 n +0000082361 00000 n +0000082709 00000 n +0000082222 00000 n +0000080789 00000 n +0000082510 00000 n +0000082610 00000 n +0000082659 00000 n +0000084629 00000 n +0000085178 00000 n +0000084490 00000 n +0000082858 00000 n +0000084778 00000 n +0000084928 00000 n +0000084978 00000 n +0000085078 00000 n +0000085128 00000 n +0000087244 00000 n +0000087095 00000 n +0000087595 00000 n +0000086948 00000 n +0000085314 00000 n +0000087395 00000 n +0000087495 00000 n +0000087545 00000 n +0000329236 00000 n +0000090145 00000 n +0000090394 00000 n +0000090006 00000 n +0000087744 00000 n +0000090294 00000 n +0000092408 00000 n +0000092259 00000 n +0000092759 00000 n +0000092112 00000 n +0000090518 00000 n +0000092560 00000 n +0000092660 00000 n +0000092710 00000 n +0000094625 00000 n +0000095123 00000 n +0000094486 00000 n +0000092908 00000 n +0000094774 00000 n +0000094874 00000 n +0000094923 00000 n +0000095023 00000 n +0000095073 00000 n +0000096935 00000 n +0000097434 00000 n +0000096796 00000 n +0000095272 00000 n +0000097084 00000 n +0000097184 00000 n +0000097234 00000 n +0000097334 00000 n +0000097384 00000 n +0000099539 00000 n +0000099390 00000 n +0000099889 00000 n +0000099243 00000 n +0000097583 00000 n +0000099691 00000 n +0000099790 00000 n +0000099839 00000 n +0000101939 00000 n +0000102337 00000 n +0000101800 00000 n +0000100038 00000 n +0000102088 00000 n +0000102188 00000 n +0000102237 00000 n +0000329354 00000 n +0000104405 00000 n +0000104557 00000 n +0000104256 00000 n +0000105007 00000 n +0000104101 00000 n +0000102486 00000 n +0000104707 00000 n +0000104757 00000 n +0000104807 00000 n +0000104907 00000 n +0000104957 00000 n +0000106708 00000 n +0000107057 00000 n +0000106569 00000 n +0000105156 00000 n +0000106857 00000 n +0000106957 00000 n +0000107007 00000 n +0000109066 00000 n +0000109217 00000 n +0000108917 00000 n +0000109718 00000 n +0000108762 00000 n +0000107206 00000 n +0000109368 00000 n +0000109468 00000 n +0000109518 00000 n +0000109618 00000 n +0000109668 00000 n +0000111811 00000 n +0000112210 00000 n +0000111672 00000 n +0000109867 00000 n +0000111960 00000 n +0000112060 00000 n +0000112110 00000 n +0000112160 00000 n +0000113772 00000 n +0000113971 00000 n +0000113633 00000 n +0000112359 00000 n +0000113921 00000 n +0000115539 00000 n +0000116088 00000 n +0000115400 00000 n +0000114082 00000 n +0000115688 00000 n +0000115838 00000 n +0000115888 00000 n +0000115988 00000 n +0000116038 00000 n +0000329472 00000 n +0000117623 00000 n +0000117971 00000 n +0000117484 00000 n +0000116237 00000 n +0000117772 00000 n +0000117872 00000 n +0000117921 00000 n +0000120824 00000 n +0000120675 00000 n +0000121573 00000 n +0000120528 00000 n +0000118133 00000 n +0000120975 00000 n +0000121125 00000 n +0000121175 00000 n +0000121225 00000 n +0000121274 00000 n +0000121324 00000 n +0000121374 00000 n +0000121424 00000 n +0000121474 00000 n +0000121524 00000 n +0000326540 00000 n +0000123873 00000 n +0000123724 00000 n +0000124223 00000 n +0000123577 00000 n +0000121787 00000 n +0000124023 00000 n +0000124123 00000 n +0000124173 00000 n +0000126178 00000 n +0000126029 00000 n +0000126674 00000 n +0000125882 00000 n +0000124372 00000 n +0000126326 00000 n +0000126426 00000 n +0000126476 00000 n +0000126575 00000 n +0000126624 00000 n +0000128901 00000 n +0000129300 00000 n +0000128762 00000 n +0000126823 00000 n +0000129050 00000 n +0000131568 00000 n +0000131917 00000 n +0000131429 00000 n +0000129437 00000 n +0000131717 00000 n +0000131817 00000 n +0000131867 00000 n +0000329590 00000 n +0000134232 00000 n +0000134083 00000 n +0000134433 00000 n +0000133936 00000 n +0000132105 00000 n +0000134383 00000 n +0000136873 00000 n +0000136724 00000 n +0000137223 00000 n +0000136577 00000 n +0000134596 00000 n +0000137024 00000 n +0000137124 00000 n +0000137173 00000 n +0000138148 00000 n +0000138347 00000 n +0000138009 00000 n +0000137424 00000 n +0000138297 00000 n +0000140396 00000 n +0000140944 00000 n +0000140257 00000 n +0000138445 00000 n +0000140545 00000 n +0000140695 00000 n +0000140744 00000 n +0000140844 00000 n +0000140894 00000 n +0000142862 00000 n +0000143209 00000 n +0000142723 00000 n +0000141106 00000 n +0000143011 00000 n +0000143110 00000 n +0000143159 00000 n +0000144319 00000 n +0000144518 00000 n +0000144180 00000 n +0000143371 00000 n +0000144468 00000 n +0000329708 00000 n +0000146642 00000 n +0000147040 00000 n +0000146503 00000 n +0000144642 00000 n +0000146791 00000 n +0000146941 00000 n +0000146991 00000 n +0000148899 00000 n +0000149397 00000 n +0000148760 00000 n +0000147189 00000 n +0000149048 00000 n +0000149148 00000 n +0000149197 00000 n +0000149297 00000 n +0000149347 00000 n +0000150678 00000 n +0000151027 00000 n +0000150539 00000 n +0000149546 00000 n +0000150827 00000 n +0000150927 00000 n +0000150977 00000 n +0000152578 00000 n +0000153124 00000 n +0000152439 00000 n +0000151163 00000 n +0000152727 00000 n +0000152876 00000 n +0000152925 00000 n +0000153024 00000 n +0000153074 00000 n +0000154552 00000 n +0000155050 00000 n +0000154413 00000 n +0000153273 00000 n +0000154701 00000 n +0000154801 00000 n +0000154850 00000 n +0000154950 00000 n +0000155000 00000 n +0000156515 00000 n +0000157064 00000 n +0000156376 00000 n +0000155199 00000 n +0000156664 00000 n +0000156814 00000 n +0000156864 00000 n +0000156964 00000 n +0000157014 00000 n +0000329826 00000 n +0000158950 00000 n +0000159446 00000 n +0000158811 00000 n +0000157213 00000 n +0000159099 00000 n +0000159199 00000 n +0000159248 00000 n +0000159347 00000 n +0000159396 00000 n +0000160884 00000 n +0000161233 00000 n +0000160745 00000 n +0000159595 00000 n +0000161033 00000 n +0000161133 00000 n +0000161183 00000 n +0000163464 00000 n +0000169520 00000 n +0000169680 00000 n +0000169834 00000 n +0000169991 00000 n +0000170147 00000 n +0000170310 00000 n +0000163315 00000 n +0000164066 00000 n +0000163168 00000 n +0000161382 00000 n +0000163616 00000 n +0000163766 00000 n +0000163816 00000 n +0000163866 00000 n +0000163916 00000 n +0000163966 00000 n +0000164016 00000 n +0000166438 00000 n +0000166936 00000 n +0000166299 00000 n +0000164215 00000 n +0000166587 00000 n +0000166637 00000 n +0000166687 00000 n +0000166737 00000 n +0000166836 00000 n +0000166886 00000 n +0000167769 00000 n +0000167968 00000 n +0000167630 00000 n +0000167072 00000 n +0000167918 00000 n +0000169371 00000 n +0000170565 00000 n +0000169184 00000 n +0000168066 00000 n +0000170465 00000 n +0000329944 00000 n +0000172455 00000 n +0000172754 00000 n +0000172316 00000 n +0000170663 00000 n +0000172604 00000 n +0000174819 00000 n +0000175122 00000 n +0000174677 00000 n +0000172852 00000 n +0000174968 00000 n +0000176507 00000 n +0000176759 00000 n +0000176364 00000 n +0000175234 00000 n +0000176858 00000 n +0000325974 00000 n +0000176890 00000 n +0000177210 00000 n +0000177242 00000 n +0000177354 00000 n +0000177690 00000 n +0000178162 00000 n +0000178282 00000 n +0000178646 00000 n +0000178682 00000 n +0000178709 00000 n +0000179273 00000 n +0000179380 00000 n +0000179712 00000 n +0000180190 00000 n +0000191388 00000 n +0000191646 00000 n +0000199128 00000 n +0000199353 00000 n +0000207133 00000 n +0000207367 00000 n +0000214581 00000 n +0000214810 00000 n +0000222436 00000 n +0000222700 00000 n +0000229748 00000 n +0000229982 00000 n +0000232176 00000 n +0000232406 00000 n +0000241188 00000 n +0000241455 00000 n +0000256549 00000 n +0000256958 00000 n +0000265811 00000 n +0000266101 00000 n +0000282212 00000 n +0000282633 00000 n +0000293180 00000 n +0000293482 00000 n +0000312439 00000 n +0000312971 00000 n +0000325616 00000 n +0000330048 00000 n +0000330168 00000 n +0000330288 00000 n +0000330361 00000 n +0000338396 00000 n +0000338592 00000 n +0000338795 00000 n +0000339031 00000 n +0000339274 00000 n +0000339516 00000 n +0000339759 00000 n +0000340001 00000 n +0000340244 00000 n +0000340486 00000 n +0000340729 00000 n +0000340971 00000 n +0000341214 00000 n +0000341455 00000 n +0000341691 00000 n +0000341921 00000 n +0000342156 00000 n +0000342390 00000 n +0000342625 00000 n +0000342860 00000 n +0000343093 00000 n +0000343328 00000 n +0000343561 00000 n +0000343796 00000 n +0000344028 00000 n +0000344261 00000 n +0000344494 00000 n +0000344729 00000 n +0000344943 00000 n +0000345114 00000 n +0000345284 00000 n +0000345455 00000 n +0000345625 00000 n +0000345796 00000 n +0000345966 00000 n +0000346137 00000 n +0000346307 00000 n +0000346478 00000 n +0000346648 00000 n +0000346816 00000 n +0000347002 00000 n +0000347205 00000 n +0000347408 00000 n +0000347628 00000 n +0000347879 00000 n +0000348124 00000 n +0000348366 00000 n +0000348605 00000 n +0000348854 00000 n +0000349100 00000 n +0000349343 00000 n +0000349586 00000 n +0000349829 00000 n +0000350072 00000 n +0000350259 00000 n +0000350366 00000 n +0000350493 00000 n +0000350627 00000 n +0000350759 00000 n +0000350890 00000 n +0000351013 00000 n +0000351129 00000 n +0000351249 00000 n +0000351379 00000 n +0000351507 00000 n +0000351582 00000 n +0000351700 00000 n +0000351800 00000 n +0000351884 00000 n +0000351924 00000 n +0000352105 00000 n trailer -<< /Size 1074 -/Root 1072 0 R -/Info 1073 0 R -/ID [<33E73D46303F644F885F5B2626E29C75> <33E73D46303F644F885F5B2626E29C75>] >> +<< /Size 1126 +/Root 1124 0 R +/Info 1125 0 R +/ID [<1C110026B2C57CA27660C35FAD7D771F> <1C110026B2C57CA27660C35FAD7D771F>] >> startxref -304703 +352497 %%EOF diff -Nru glfw-2.6/docs/UsersGuide.pdf glfw-2.7.2/docs/UsersGuide.pdf --- glfw-2.6/docs/UsersGuide.pdf 2007-09-01 18:42:24.000000000 +0000 +++ glfw-2.7.2/docs/UsersGuide.pdf 2011-08-12 12:21:01.000000000 +0000 @@ -1,1725 +1,1761 @@ %PDF-1.4 % -5 0 obj +1 0 obj << /S /GoTo /D (chapter.1) >> endobj -8 0 obj +4 0 obj (1 Introduction) endobj -9 0 obj +5 0 obj << /S /GoTo /D (chapter.2) >> endobj -12 0 obj +8 0 obj (2 Getting Started) endobj -13 0 obj +9 0 obj << /S /GoTo /D (section.2.1) >> endobj -16 0 obj +12 0 obj (2.1 Initializing GLFW) endobj -17 0 obj +13 0 obj << /S /GoTo /D (section.2.2) >> endobj -20 0 obj +16 0 obj (2.2 Opening An OpenGL Window) endobj -21 0 obj +17 0 obj << /S /GoTo /D (section.2.3) >> endobj -24 0 obj +20 0 obj (2.3 Using Keyboard Input) endobj -25 0 obj +21 0 obj << /S /GoTo /D (section.2.4) >> endobj -28 0 obj +24 0 obj (2.4 Putting It Together: A Minimal GLFW Application) endobj -29 0 obj +25 0 obj << /S /GoTo /D (chapter.3) >> endobj -32 0 obj +28 0 obj (3 Window Operations) endobj -33 0 obj +29 0 obj << /S /GoTo /D (section.3.1) >> endobj -36 0 obj +32 0 obj (3.1 Setting Window Properties) endobj -37 0 obj +33 0 obj << /S /GoTo /D (section.3.2) >> endobj -40 0 obj +36 0 obj (3.2 Getting Window Properties) endobj -41 0 obj +37 0 obj << /S /GoTo /D (section.3.3) >> endobj -44 0 obj +40 0 obj (3.3 Buffer Swapping) endobj -45 0 obj +41 0 obj << /S /GoTo /D (section.3.4) >> endobj -48 0 obj +44 0 obj (3.4 Querying Video Modes) endobj -49 0 obj +45 0 obj << /S /GoTo /D (chapter.4) >> endobj -52 0 obj +48 0 obj (4 Input Handling) endobj -53 0 obj +49 0 obj << /S /GoTo /D (section.4.1) >> endobj -56 0 obj +52 0 obj (4.1 Event Polling) endobj -57 0 obj +53 0 obj << /S /GoTo /D (section.4.2) >> endobj -60 0 obj +56 0 obj (4.2 Keyboard Input) endobj -61 0 obj +57 0 obj << /S /GoTo /D (subsection.4.2.1) >> endobj -64 0 obj +60 0 obj (4.2.1 Key state) endobj -65 0 obj +61 0 obj << /S /GoTo /D (subsection.4.2.2) >> endobj -68 0 obj +64 0 obj (4.2.2 Character input) endobj -69 0 obj +65 0 obj << /S /GoTo /D (subsection.4.2.3) >> endobj -72 0 obj +68 0 obj (4.2.3 Key repeat) endobj -73 0 obj +69 0 obj << /S /GoTo /D (subsection.4.2.4) >> endobj -76 0 obj +72 0 obj (4.2.4 Special system keys) endobj -77 0 obj +73 0 obj << /S /GoTo /D (section.4.3) >> endobj -80 0 obj +76 0 obj (4.3 Mouse Input) endobj -81 0 obj +77 0 obj << /S /GoTo /D (subsection.4.3.1) >> endobj -84 0 obj +80 0 obj (4.3.1 Mouse position) endobj -85 0 obj +81 0 obj << /S /GoTo /D (subsection.4.3.2) >> endobj -88 0 obj +84 0 obj (4.3.2 Mouse buttons) endobj -89 0 obj +85 0 obj << /S /GoTo /D (subsection.4.3.3) >> endobj -92 0 obj +88 0 obj (4.3.3 Mouse wheel) endobj -93 0 obj +89 0 obj << /S /GoTo /D (subsection.4.3.4) >> endobj -96 0 obj +92 0 obj (4.3.4 Hiding the mouse cursor) endobj -97 0 obj +93 0 obj << /S /GoTo /D (section.4.4) >> endobj -100 0 obj +96 0 obj (4.4 Joystick Input) endobj -101 0 obj +97 0 obj << /S /GoTo /D (subsection.4.4.1) >> endobj -104 0 obj +100 0 obj (4.4.1 Joystick capabilities) endobj -105 0 obj +101 0 obj << /S /GoTo /D (subsection.4.4.2) >> endobj -108 0 obj +104 0 obj (4.4.2 Joystick position) endobj -109 0 obj +105 0 obj << /S /GoTo /D (subsection.4.4.3) >> endobj -112 0 obj +108 0 obj (4.4.3 Joystick buttons) endobj -113 0 obj +109 0 obj << /S /GoTo /D (chapter.5) >> endobj -116 0 obj +112 0 obj (5 Timing) endobj -117 0 obj +113 0 obj << /S /GoTo /D (section.5.1) >> endobj -120 0 obj +116 0 obj (5.1 High Resolution Timer) endobj -121 0 obj +117 0 obj << /S /GoTo /D (section.5.2) >> endobj -124 0 obj +120 0 obj (5.2 Sleep) endobj -125 0 obj +121 0 obj << /S /GoTo /D (chapter.6) >> endobj -128 0 obj +124 0 obj (6 Image and Texture Import) endobj -129 0 obj +125 0 obj << /S /GoTo /D (section.6.1) >> endobj -132 0 obj +128 0 obj (6.1 Texture Loading) endobj -133 0 obj +129 0 obj << /S /GoTo /D (section.6.2) >> endobj -136 0 obj +132 0 obj (6.2 Image Loading) endobj -137 0 obj +133 0 obj << /S /GoTo /D (chapter.7) >> endobj -140 0 obj +136 0 obj (7 OpenGL Extension Support) endobj -141 0 obj +137 0 obj << /S /GoTo /D (section.7.1) >> endobj -144 0 obj +140 0 obj (7.1 Compile Time Check) endobj -145 0 obj +141 0 obj << /S /GoTo /D (section.7.2) >> endobj -148 0 obj +144 0 obj (7.2 Runtime Check) endobj -149 0 obj +145 0 obj << /S /GoTo /D (section.7.3) >> endobj -152 0 obj +148 0 obj (7.3 Fetching Function Pointers) endobj -153 0 obj +149 0 obj << /S /GoTo /D (subsection.7.3.1) >> endobj -156 0 obj +152 0 obj (7.3.1 Function pointer type definitions) endobj -157 0 obj +153 0 obj << /S /GoTo /D (chapter.8) >> endobj +156 0 obj +(8 Multi-threading) +endobj +157 0 obj +<< /S /GoTo /D (section.8.1) >> +endobj 160 0 obj -(8 Multi Threading) +(8.1 Why Use Multi-threading?) endobj 161 0 obj -<< /S /GoTo /D (section.8.1) >> +<< /S /GoTo /D (subsection.8.1.1) >> endobj 164 0 obj -(8.1 Why Use Multi Threading?) +(8.1.1 Avoid unnecessary waiting) endobj 165 0 obj -<< /S /GoTo /D (subsection.8.1.1) >> +<< /S /GoTo /D (subsection.8.1.2) >> endobj 168 0 obj -(8.1.1 Take advantage of multi processor systems) +(8.1.2 Improve real time performance) endobj 169 0 obj -<< /S /GoTo /D (subsection.8.1.2) >> -endobj -172 0 obj -(8.1.2 Avoid unnecessary waiting) -endobj -173 0 obj -<< /S /GoTo /D (subsection.8.1.3) >> -endobj -176 0 obj -(8.1.3 Improve real time performance) -endobj -177 0 obj << /S /GoTo /D (section.8.2) >> endobj -180 0 obj +172 0 obj (8.2 How To Use Multi Threading) endobj -181 0 obj +173 0 obj << /S /GoTo /D (section.8.3) >> endobj -184 0 obj +176 0 obj (8.3 Creating Threads) endobj -185 0 obj +177 0 obj << /S /GoTo /D (section.8.4) >> endobj -188 0 obj +180 0 obj (8.4 Data Sharing Using Mutex Objects) endobj -189 0 obj +181 0 obj << /S /GoTo /D (section.8.5) >> endobj -192 0 obj +184 0 obj (8.5 Thread Synchronization Using Condition Variables) endobj -193 0 obj +185 0 obj << /S /GoTo /D (section.8.6) >> endobj -196 0 obj +188 0 obj (8.6 Calling GLFW Functions From Multiple Threads) endobj -197 0 obj -<< /S /GoTo /D [198 0 R /FitH ] >> +189 0 obj +<< /S /GoTo /D [190 0 R /FitH ] >> endobj -200 0 obj << -/Length 298 +192 0 obj << +/Length 335 /Filter /FlateDecode >> stream -xuQKOA v:!x@ȮdD+zjKIA86WP=ۈiq`r5.iqQ/.e-Fr`F-UW|N Y[7#+k11l|ovaɖæn0Z=bJee&  Db.kh$~L] -c94Zslz<6CLurT _1Ip@ -J7Ybu@5p_}O;Ęr/M.e$)u{iQ7-ju +xڕRKK@W13̾bQPx=6BZ5dETf7c V@0NG@4:GY,Z P-a/GŬdUq01Ȃ +U.6tF [݀xښo64fF'cA=D*ݾR vhЇ(bmp}HS%OC% '?S+tAA +><(v_ AGR zel餱8WfԗOݶk q)|WG?uleG\?1_0%f4tֻUn4ߞ]|ED endstream endobj -198 0 obj << +190 0 obj << /Type /Page -/Contents 200 0 R -/Resources 199 0 R +/Contents 192 0 R +/Resources 191 0 R /MediaBox [0 0 595.276 841.89] -/Parent 206 0 R +/Parent 198 0 R >> endobj -201 0 obj << -/D [198 0 R /FitH 765.769] +193 0 obj << +/D [190 0 R /FitH 778.724] >> endobj -202 0 obj << -/D [198 0 R /FitH 740.862] +194 0 obj << +/D [190 0 R /FitH 740.862] >> endobj -199 0 obj << -/Font << /F27 203 0 R /F30 204 0 R /F26 205 0 R >> +191 0 obj << +/Font << /F27 195 0 R /F30 196 0 R /F26 197 0 R >> /ProcSet [ /PDF /Text ] >> endobj -209 0 obj << -/Length 616 +201 0 obj << +/Length 688 /Filter /FlateDecode >> stream -xڥU]o0}1Hxl%ʔSaji85n35dcs&6^-.B;^s{88 %޷YvL=Os=4L h`L 2ߊPJY;^w˭23-WveӋZ*3piG\ s-V)IjTPW_.(b6Gчьu5(XeUםedmH7SQHF 0N - / /D$5{A+ʖ/W[(<˕3 -J(ͤʾ_s5Ձ#rA&#=n3^6V) DJ iAXW>f\{G{8"j cmxX>6.Qwl#ڎ+טfԗLTpZ(lEѾbO\w'R}28oPu^F*6jZ+ 6/RuĐՙDz+Dǡ*1)Rq~}x+뚵doQΙ"SNʼn0g}}W|[B9˾$|qa% ' b1:1 /Y +xڥV]o0}5CxL$ԮU`ji85nVm0sDZ/Y9Й]Aˮn(vPQ;҉!E嗬p~i~enA$0ݡsAǡ֬nnnCVY+яXV+^.Ћvm,^1+!z>v1|-H޲j/:i6VJT Ɇ eA[JZط&ޓYmy͚wAtIq +Cwv!@ 8a =D :Y^DIb>>H0F& B!16} +RPncEF'āvi57LŘleS~Ś +[vOsTޔ,5 RY\*OFrlOByB%+i. 5Dc8 ktI}00udG{&?fNI endstream endobj -208 0 obj << +200 0 obj << /Type /Page -/Contents 209 0 R -/Resources 207 0 R +/Contents 201 0 R +/Resources 199 0 R /MediaBox [0 0 595.276 841.89] -/Parent 206 0 R +/Parent 198 0 R >> endobj -210 0 obj << -/D [208 0 R /FitH 765.769] ->> endobj -211 0 obj << -/D [208 0 R /FitH 598.545] ->> endobj -207 0 obj << -/Font << /F27 203 0 R /F33 212 0 R /F30 204 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -215 0 obj << -/Length 297 -/Filter /FlateDecode ->> -stream -x}Rj09FiL6GBiisX(=fwCwnKb{̛08 q#JG+t> endobj -216 0 obj << -/D [214 0 R /FitH 765.769] +203 0 obj << +/D [200 0 R /FitH 598.545] >> endobj -213 0 obj << -/Font << /F33 212 0 R >> +199 0 obj << +/Font << /F27 195 0 R /F33 204 0 R /F30 196 0 R >> /ProcSet [ /PDF /Text ] >> endobj -249 0 obj << -/Length 1010 +237 0 obj << +/Length 1009 /Filter /FlateDecode >> stream -xZMsFWp-+{[٬ckje`&X:$4@ށ7c` -D sP:voDDpXr3L˪A°:> y>W=i\nJf* 4'M>w7f1ͭo%VɽckZZ+! 0s|D1ͪE+Zfߌ~(x>3V sbw|t{2K& OIs.>6o< -]ĩ83*q?=ssn(WIV8ST#`esˀW9[h~zi,۩M4N&8`_N  EGNrSX2 z65HulrA}ScVrd -34Yw򦼫py[=VAeY`@)*#8^b_K?H&b?<8QϪʫ(wqA0%EDD$*̾͂njzA9\/K4ի< +'e3Pϐ:h0#Б љ3qzUT(6-T0&+ټTWtLF#C?= e:Bˇn)ƍ-mf>e!1*yK3'K 5c-%X A~aZOFԏEd Vh[@.fmDo[!cSEx6';J5>ԽzS֨ͷZZ󳉲VT=2N0G_1߫l <<:@iC_џ!P{rvۇQgR 8} x Ac˞/0 T"ݕuܵ 3Fɑ <0c>! TTq޿߭/K[ +xZMF&=[첵ǫxX1(ek3|M`e%dA@b~= йwwX8,A)42х܁V 9C0) 0GB UsnoWZI=rcCi`ۛ|ʂV̷Z1r-sgZ}J9>"fTf墕VF},>5ό/@y-g7 ĂsRˋBW%qa>-ጿHO8ipRB*=ܧ4Umus 1*T 0iɀW>.k|LTԿ|Tz64ULm*l0/'z}]i!ܔ:V ޣM)yRѷ(!'.?B]ZF\wŪk|'8bEeq< 3i$[yy+qyS=AeYGo@)*S逆b5淭̟l(| XHp1(ϒ'jwZeU1p%f$2H96y0݌M/(>< iZ:Y9)+2xTA95/MΜ}լ7TYGymu11c^bΦ\f24{Y י\v_<Z>߿vMO1l]΀oR'v;1r.ίR&|4+~Pc]0؜/Jp[CwHW-`dFXԻN? t.b"^Oao2VۼHw TQo{ 4+AرJ;geѭڨ6ze`RCTy'%yju҆p09E鐳C> :Ӕb o^ [v|_Yf[]d0chZ:zo9 +@Tqvvyfɰ endstream endobj -248 0 obj << +236 0 obj << /Type /Page -/Contents 249 0 R -/Resources 247 0 R +/Contents 237 0 R +/Resources 235 0 R /MediaBox [0 0 595.276 841.89] -/Parent 206 0 R -/Annots [ 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R ] +/Parent 198 0 R +/Annots [ 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R ] >> endobj -217 0 obj << +205 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [69.87 577.991 147.429 587.631] -/Subtype /Link /A << /S /GoTo /D (chapter.1) >> >> endobj -218 0 obj << +206 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [69.87 551.449 160.64 563.173] -/Subtype /Link /A << /S /GoTo /D (chapter.2) >> >> endobj -219 0 obj << +207 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 537.753 194.829 549.504] -/Subtype /Link /A << /S /GoTo /D (section.2.1) >> >> endobj -220 0 obj << +208 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 524.204 247.433 535.954] -/Subtype /Link /A << /S /GoTo /D (section.2.2) >> >> endobj -221 0 obj << +209 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 510.655 210.44 522.405] -/Subtype /Link /A << /S /GoTo /D (section.2.3) >> >> endobj -222 0 obj << +210 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 497.105 337.943 508.856] -/Subtype /Link /A << /S /GoTo /D (section.2.4) >> >> endobj -223 0 obj << +211 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [69.87 472.794 182.174 484.518] -/Subtype /Link /A << /S /GoTo /D (chapter.3) >> >> endobj -224 0 obj << +212 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 459.098 230.785 470.848] -/Subtype /Link /A << /S /GoTo /D (section.3.1) >> >> endobj -225 0 obj << +213 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 445.549 232.596 457.299] -/Subtype /Link /A << /S /GoTo /D (section.3.2) >> >> endobj -226 0 obj << +214 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 432 187.771 443.75] -/Subtype /Link /A << /S /GoTo /D (section.3.3) >> >> endobj -227 0 obj << +215 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 418.45 215.676 430.201] -/Subtype /Link /A << /S /GoTo /D (section.3.4) >> >> endobj -228 0 obj << +216 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [69.87 394.139 160.683 405.863] -/Subtype /Link /A << /S /GoTo /D (chapter.4) >> >> endobj -229 0 obj << +217 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 380.443 172.858 392.193] -/Subtype /Link /A << /S /GoTo /D (section.4.1) >> >> endobj -230 0 obj << +218 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 366.894 181.651 378.644] -/Subtype /Link /A << /S /GoTo /D (section.4.2) >> >> endobj -231 0 obj << +219 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 353.344 188.687 365.095] -/Subtype /Link /A << /S /GoTo /D (subsection.4.2.1) >> >> endobj -232 0 obj << +220 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 339.795 215.785 351.546] -/Subtype /Link /A << /S /GoTo /D (subsection.4.2.2) >> >> endobj -233 0 obj << +221 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 326.246 195.342 337.997] -/Subtype /Link /A << /S /GoTo /D (subsection.4.2.3) >> >> endobj -234 0 obj << +222 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 312.697 235.825 324.447] -/Subtype /Link /A << /S /GoTo /D (subsection.4.2.4) >> >> endobj -235 0 obj << +223 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 299.148 168.767 310.898] -/Subtype /Link /A << /S /GoTo /D (section.4.3) >> >> endobj -236 0 obj << +224 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 285.599 215.807 297.349] -/Subtype /Link /A << /S /GoTo /D (subsection.4.3.1) >> >> endobj -237 0 obj << +225 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 274.302 212.556 283.8] -/Subtype /Link /A << /S /GoTo /D (subsection.4.3.2) >> >> endobj -238 0 obj << +226 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 260.753 206.698 270.251] -/Subtype /Link /A << /S /GoTo /D (subsection.4.3.3) >> >> endobj -239 0 obj << +227 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 244.951 255.788 256.701] -/Subtype /Link /A << /S /GoTo /D (subsection.4.3.4) >> >> endobj -240 0 obj << +228 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 231.402 174.723 243.152] -/Subtype /Link /A << /S /GoTo /D (section.4.4) >> >> endobj -241 0 obj << +229 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 217.853 236.294 229.603] -/Subtype /Link /A << /S /GoTo /D (subsection.4.4.1) >> >> endobj -242 0 obj << +230 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 204.303 221.763 216.054] -/Subtype /Link /A << /S /GoTo /D (subsection.4.4.2) >> >> endobj -243 0 obj << +231 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 190.754 218.512 202.505] -/Subtype /Link /A << /S /GoTo /D (subsection.4.4.3) >> >> endobj -244 0 obj << +232 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [69.87 166.443 121.978 178.166] -/Subtype /Link /A << /S /GoTo /D (chapter.5) >> >> endobj -245 0 obj << +233 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 152.747 214.148 164.497] -/Subtype /Link /A << /S /GoTo /D (section.5.1) >> >> endobj -250 0 obj << -/D [248 0 R /FitH 765.769] +238 0 obj << +/D [236 0 R /FitH 778.724] >> endobj -251 0 obj << -/D [248 0 R /FitH 603.28] +239 0 obj << +/D [236 0 R /FitH 603.28] >> endobj -247 0 obj << -/Font << /F27 203 0 R /F33 212 0 R >> +235 0 obj << +/Font << /F27 195 0 R /F33 204 0 R >> /ProcSet [ /PDF /Text ] >> endobj -272 0 obj << -/Length 837 +259 0 obj << +/Length 790 /Filter /FlateDecode >> stream -xX]S@}ϯiI责Xl0Y 5, 5] !!5jҎ<$ wι{ֵ~TGYO˓~CalAVpeyEW; -օM]t!> :?[]{t)@|-KBoօŌX]D\B=+YS;kt"0C}8>}1a&Y!&dإ7QdSp ]ab8Ja$2h]'deF X4Ȗ?p1o:.̍B4AyH< 8ݒy-$NS;j$7ˁ0Dv9 Y{2ø]]Oۈ lb0*=sFo"E-ϯI$ -Y@VAOQfReS ^c(dT""#\Ms<1WkЧ`K5ǫkȡTGpVk7*3 +SčA57[Q5\u\c.AD'BM!l"( -3w%ġ=Q r3UAY YRIMcS)Ušׇv¿&e #1CoΒF)^ -Ѣn75-KbGaV3rקǓB/?ŠXтlشzq8sTFY"_oa4́ -aPx9m"ߤ`gq Ow8f%q5ja_9rCa!vq +xXS@pp괩IQ& Cj.aA&њC1[qm cCardk`FpexFƅIl(2O'Bs|g:M]k,!g&ljofc渌6P⍕Lka٠ 娺 ,Lq=SL$˗115a- +%ZMőz5f0 G^%S:i5+[jy y;.qn\8rxX 9Y Ot iODQ\jS=Es9dF3zBmؓBw_j2"eΜ1(d72٬c *)uʴ.[ +y6 vZ] Tc$!2.7v /H&Շ`Uubt9*&ylm\ݪ bhKkآ]LTc.QsjA߸ʼnyc2X! +)E$f0Ӥ:b(ouEAo λ4% +Wʞ4֔TdWI6 e$:@} [l:{OTTwR|ҁK&xkڣB4oڣ +NA4<ԇq5͚ۣ"T"WLlZ\}'qwx߬`'r߯|BX1^ND)^tYdN& >jY2m.:0B^CcˀQ߰]B +8? endstream endobj -271 0 obj << +258 0 obj << /Type /Page -/Contents 272 0 R -/Resources 270 0 R +/Contents 259 0 R +/Resources 257 0 R /MediaBox [0 0 595.276 841.89] -/Parent 206 0 R -/Annots [ 246 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R ] +/Parent 198 0 R +/Annots [ 234 0 R 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R ] >> endobj -246 0 obj << +234 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 726.545 137.557 738.296] -/Subtype /Link /A << /S /GoTo /D (section.5.2) >> >> endobj -252 0 obj << +240 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [69.87 702.234 212.163 713.957] -/Subtype /Link /A << /S /GoTo /D (chapter.6) >> >> endobj -253 0 obj << +241 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 688.538 185.404 700.288] -/Subtype /Link /A << /S /GoTo /D (section.6.1) >> >> endobj -254 0 obj << +242 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 674.988 179.665 686.739] -/Subtype /Link /A << /S /GoTo /D (section.6.2) >> >> endobj -255 0 obj << +243 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [69.87 650.677 219.166 662.401] -/Subtype /Link /A << /S /GoTo /D (chapter.7) >> >> endobj -256 0 obj << +244 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 636.981 206.872 648.731] -/Subtype /Link /A << /S /GoTo /D (section.7.1) >> >> endobj -257 0 obj << +245 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 625.684 181.498 635.182] -/Subtype /Link /A << /S /GoTo /D (section.7.2) >> >> endobj -258 0 obj << +246 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [86.233 609.883 231.505 621.633] -/Subtype /Link /A << /S /GoTo /D (section.7.3) >> >> endobj -259 0 obj << +247 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [111.324 596.333 290.959 608.084] -/Subtype /Link /A << /S /GoTo /D (subsection.7.3.1) >> >> endobj -260 0 obj << +248 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [69.87 572.022 165.92 583.746] /Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [69.87 572.022 163.181 583.746] /A << /S /GoTo /D (chapter.8) >> >> endobj -261 0 obj << +249 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [86.233 558.326 233.545 570.076] /Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [86.233 558.326 230.817 570.076] /A << /S /GoTo /D (section.8.1) >> >> endobj -262 0 obj << +250 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [111.324 544.777 335.118 556.527] /Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [111.324 544.777 265.857 556.527] /A << /S /GoTo /D (subsection.8.1.1) >> >> endobj -263 0 obj << +251 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [111.324 531.227 265.857 542.978] /Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [111.324 531.227 283.912 542.978] /A << /S /GoTo /D (subsection.8.1.2) >> >> endobj -264 0 obj << +252 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [111.324 517.678 283.912 529.429] /Subtype /Link -/A << /S /GoTo /D (subsection.8.1.3) >> ->> endobj -265 0 obj << -/Type /Annot /Border[0 0 0]/H/N/C[1 0 0] -/Rect [86.233 504.129 242.458 515.88] -/Subtype /Link +/Rect [86.233 517.678 242.458 529.429] /A << /S /GoTo /D (section.8.2) >> >> endobj -266 0 obj << +253 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [86.233 490.58 188.752 502.33] /Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [86.233 504.129 188.752 515.88] /A << /S /GoTo /D (section.8.3) >> >> endobj -267 0 obj << +254 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [86.233 477.031 266.468 488.781] /Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [86.233 490.58 266.468 502.33] /A << /S /GoTo /D (section.8.4) >> >> endobj -268 0 obj << +255 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [86.233 463.481 336.929 475.232] /Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [86.233 477.031 336.929 488.781] /A << /S /GoTo /D (section.8.5) >> >> endobj -269 0 obj << +256 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [86.233 449.932 329.38 461.683] /Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [86.233 463.481 329.38 475.232] /A << /S /GoTo /D (section.8.6) >> >> endobj -273 0 obj << -/D [271 0 R /FitH 765.769] +260 0 obj << +/D [258 0 R /FitH 778.724] >> endobj -270 0 obj << -/Font << /F33 212 0 R /F27 203 0 R >> +257 0 obj << +/Font << /F33 204 0 R /F27 195 0 R >> /ProcSet [ /PDF /Text ] >> endobj -278 0 obj << -/Length 1524 +265 0 obj << +/Length 1442 /Filter /FlateDecode >> stream -xڽX]s:}ϯc2sH\KKa J#/$ʒ;5m%8W] ;7vN&ϗ+;Y(02u>MO޼8O?H&fO~ -;s EӢi6Za_a0 P47$_U:  1Ϫ*㫤Hr2VT'+ˉ$I4cfb,7Qne͌!Y2y+Ux#JeIRbbɛzA.,!iy6|٭49fs %Q 8 973`IY"rF,ԺfߥycKlط(%zˏ3=2 -z S ^nv]*0EG (1]|p1Ƌ:.^2aaI}(c`;`q]j7y"b7^vSBu#DCE>ړG7hƐ.C.?sFx_v`(Yc/\|@E!,~G!'m2ܾkyg9˽!=j^=6xB iA2>r˺.[6C Px.?tu -" NAe<\hש - E~RdUEQK;&{*N1B=@~ +xڽX[s8~ϯc2Cd[Y0tiXiD}C)YcIۥ}hc9wn=\͞ G0JqJƋ1JȋArˏOdbA\luC)$QI'+ǂ9וQX JBˮ@k3"# Pz|̳}x(.gb/oAB&m7B j} ro/ȏ=6|:( +b 6k c47U!{K!$fJɼ۵`D8-ijCSi +TEVP3[3N̰fgZqQavk3E1͆ 6l +p&7X}7T:'\xe.esjo\",japdM Nd?7[+ W}g7ܭ\׽6OD>J#mA=(Dc`zz-{l~#;3WtuQzҠ:n xV߆XcLn^: Vݿ~NHkQKh~͖aǸ)Й#E)l(c΄~{C$b4], n20,Q=|:샶bC?QoAm}IW.?w (YĚO~ +B}bKϻK]F!'$BC(y|RNZpNKrV1"ދ v0-[NJG!m ]ZA> + &Px޽2q +z>@y"=Q$!($2uLٚpʡ(dn7p w$'p_:<.X(J.yow[w/U/ endstream endobj -277 0 obj << +264 0 obj << /Type /Page -/Contents 278 0 R -/Resources 276 0 R +/Contents 265 0 R +/Resources 263 0 R /MediaBox [0 0 595.276 841.89] -/Parent 206 0 R -/Annots [ 275 0 R 274 0 R ] +/Parent 198 0 R +/Annots [ 262 0 R 261 0 R ] >> endobj -275 0 obj << +262 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> >> endobj -274 0 obj << +261 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [194.876 178.81 201.351 192.117] /Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [274.435 191.95 280.911 205.666] /A << /S /GoTo /D (Hfootnote.1) >> >> endobj -6 0 obj << -/D [277 0 R /FitH 740.862] +2 0 obj << +/D [264 0 R /FitH 740.862] >> endobj -280 0 obj << -/D [277 0 R /FitH 162.502] +267 0 obj << +/D [264 0 R /FitH 162.501] >> endobj -276 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F26 205 0 R /F41 279 0 R >> +263 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F41 266 0 R /F26 197 0 R >> /ProcSet [ /PDF /Text ] >> endobj -285 0 obj << -/Length 1751 +272 0 obj << +/Length 1674 /Filter /FlateDecode >> stream -xڽYs8~_=S-[i3Z#ۚboL'uc bj5V.//^g8 E8"|(B)%CDY̓tFUbJl~^LA -J!E\2ؤ ?DLtQviDPm:cЯBi'b\Z ĮR4pT&NͿw# "|:/33vʷN%]Y\:vWe2QXqVlԪ7 A?΃x0 8cN[F^:YQl^hK0G|`ar-l(i<O,&11XjݷJ{ zDv aԥ'8݉[whId67RcA|Z'ml7(Ÿm!pvu1yUO+У~O臟[BDH} QfK(BN_QeיR@*"J*-4^[m+Kv1ehSA!FhWha1CDTM8]iO BbL%{lT94D$geՑ)ǘ$0F|uR0~=GC~&ɠ6,âE}&w.Fϒ)â3B -R(+ e -pծ|+rӔCvXe[,NtA^BO?`ͳd ,<+BSX$Tgb"5"8or_fXC?z9TWi^f1C, 9? -wY -OaSVk6q=Z丈@L PM#be-ivHy4kO0:ɁS߱)' -΋9sZڿv9͏I8&͇= co{6J8deuatB\-M:NlM]š' ȸvU~뻅Ӊ.C4m@kV*uJCvQ@^+&jGڶxؿܜƶMf -:ggY7iF2] +xڵYs8~_=S$[i3dzovnm]1 i8 V߮v?mw=z;G0 +qH“BxRЛ͇ɔrޮ|eg#JƂ@( *ڔLy Y# +M@<,,u|)TL`D_/hQ+Wz`ymN'I=JTElBxg%dvfKxTzI?6*iF/*8 =m=aԟRDW?մo!H7Wq R$zMl*$C:F$ctaଇ{!9bԃ@CܺLQ;a;+8۸79۠Fi\rQS޹9AD>r;Sm!>b6|M#1pa8Zd:5J+jئsB-.(S5WEn#ƾrTB%eˆ`bM3@ݡF8ĤC9&`id2HHN*z+X +N3~lńU,p\l+;prBz]E| d&VE?76L leu{W /i76#.o{R@F pGHM4}A'̃p/Wޢ~}JA?L{! +RӖRe Ce4avF8ڔSHn8?kh*g8uD>i;OيF]/ ̘b\<8^/0,OUEbn>PWlq"'oc;#je7LTB3SHEDr6@?z vB;D!6R4W6O{v;JޖE ԿR-aFȇW7_RlQ_DZ)0rF--k0`+<:rg:I'oa+DePk;L<[Ul"ܥ&K3:[ٰ=z4sʼ;PaTC@_2u')z~z)t+ S5]\%**=6U5x|K P'YqtkwW)j˸BC'ɐrgilKJl}%w}5kmVB%لvhZt@'mQ>L Pw 璷h9@,Rh5NQtj@?ԷjVԶLW*m7_v,H4/C$.ߺb|t:qisI3Іg!Se66Iu]Fvw+=Er'ȵcUs}zG}AjyRϭ*3z@M'@L8V<\ wsp o ;;7irUV5ޖWuH +4L# endstream endobj -284 0 obj << +271 0 obj << /Type /Page -/Contents 285 0 R -/Resources 283 0 R +/Contents 272 0 R +/Resources 270 0 R /MediaBox [0 0 595.276 841.89] -/Parent 294 0 R -/Annots [ 282 0 R ] +/Parent 198 0 R +/Annots [ 269 0 R ] >> endobj -282 0 obj << +269 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> >> endobj -286 0 obj << -/D [284 0 R /FitH 764.175] +273 0 obj << +/D [271 0 R /FitH 778.724] >> endobj -10 0 obj << -/D [284 0 R /FitH 739.268] +6 0 obj << +/D [271 0 R /FitH 739.268] >> endobj -14 0 obj << -/D [284 0 R /FitH 495.334] +10 0 obj << +/D [271 0 R /FitH 496.96] >> endobj -287 0 obj << -/D [284 0 R /FitH 419.485] +274 0 obj << +/D [271 0 R /FitH 421.111] >> endobj -289 0 obj << -/D [284 0 R /FitH 420.781] +276 0 obj << +/D [271 0 R /FitH 422.357] >> endobj -292 0 obj << -/D [284 0 R /FitH 321.104] +279 0 obj << +/D [271 0 R /FitH 336.229] >> endobj -293 0 obj << -/D [284 0 R /FitH 322.4] +280 0 obj << +/D [271 0 R /FitH 337.475] >> endobj -18 0 obj << -/D [284 0 R /FitH 245.391] +14 0 obj << +/D [271 0 R /FitH 247.327] >> endobj -283 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R /F26 205 0 R >> +270 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F41 266 0 R /F4 275 0 R /F60 277 0 R /F61 278 0 R /F26 197 0 R >> /ProcSet [ /PDF /Text ] >> endobj -299 0 obj << -/Length 2457 +285 0 obj << +/Length 2556 /Filter /FlateDecode >> stream -xڽ[[6~_G$ERRߺi&H7h- -MBd%_C.ۣه`|?ss77(^Q(Q?W7>٧RsgeM_"&|ؤ鷷 ɢL"1__|. {0ͿnK8TwE -(;qqM7p(*G PXL4ji^ӼhOg+"oÜYS>[Kn%ʵЛ,($Yms\?0] UƏ̖I:丫Ӵ\Rj6&}LUzڶ|%y`?p~]U'MmP>eU}=`  tI׏2<'brВ5)ԃ3?b׽0"( !dA/^!uY'8,q9LX]7e^"ևZi#$5Fǭ]D $lQ$ve:@8HX1ҙʭc -L"<S+H'Xg -WOE PzKa AQQ< AdUmo]hDmeVW2 (L2uS3m<1Ӧ۲c]`ZR0p!WIU:CQQ^b]/qDy8@_=5B_/ 8xuYN]'0bM1ʶyBp Xv9e,fybM/eB]Ǫ/nF.%L c.SA~O2JI|0C"j,N# -uadУjX<e\V\p6nǤħ ?06Mǁ :ЄhS坌"$x8:&/ [,YmJd_jHFB]s}\;YɢDg+dh\Z]RYRVUm$'\q,ijD.T*\z.Գ0dhתK+_l拭+؝*uP 4VGoGйlY%yI4Y%eާqf$+8['$ ?]kWjXX8쳝zŐ}^B!7c -0:n;qXb.%C#7i];\*7bnڟ*%4(M]\M?ym9 7-#=6::8Kɴӑ&H U;TZ2Y?0}-֣0J*un4.Z=1p8 4,=ұ(Buݻ>~EG_tXD>ZXI Es{KnXleҀφ2 DSmb1&+w)4`@8یɂtr2ia2UɿD4#.PGC(x,mIHs?#'x&mZv~ k*G3Krm䝢LqsW*v&Y8Mjg<^d躷eWً؆=6G|lƿwi$oγ6qm3RegʳF.;+/?|yz3ib]q*[ ^vDl` AnbQ-h+Ep^;٦h9Z"Vyyz^d ;Dp? l vYɃ94Cqs*Rk2m2},mx܋MaZ%XEC<3FJ:xܥ?p텽- ×WQȉ {DwžB%)W ]4O<!O;}t -]užF -vͯyrM`}ڿ|b+{ 1ӥ!Ef -Ig -sf͹43f A3]NWX=iZV%|zB۷پL-}Le 6-'pKSZm'c35j!-tu) <5MΖui I+ tQvaBW96`l`*@ЅLGL6n?Ф.XXe}QjoFKIadƐyT卬󸼀Cxז*D%A,T$Z|>I|zeB"N&(T@PO\-T^@lS\La뱎*$xhO"(A[깷$ <"?RQ ΨTs1M$TzeҀ +x[n8}Wb)lO'l{F;32m -K]:-J$u1X},aUNx`kcaO7?QlimykylXO+K9y{_+>W@]q) RC9a3q6ț/u}6M|nxI`Z/;o?4 Gn!p NPx̊v7|+ ;w(b7op7Pu @gb?0zTQy%Yx+yasxV6oŊ- 7p!G[e/bϢ |F?><ѣgu˭̚תr%T.<*v?slkk:$L7&R9$QzVJٛdiӯsjc& qYC]>P| +>rn|. $$Mz +PBn)S7)a +(BlDrϳG-kbC6$_ȯ3kiu+NLA_F QޛLE]2 W`Y |)#dY?lkfL^aϠsF.%r.yr=LvGw.eGe=#kEZI.NJ5xİ̈́5եVf- C6֒jV#)Srw(axzv|{QC(:vqQ΂en [y&yG[[([*igJ+ZUaB5puf$t|sҨ4LR>p x'l5DeFjdȮnbʚ1Xh&09~#k¢J+,3vf |;AZ$\p|,`bnL96:CzubH,i&h +q9d1)/cqr(^@Yg +ET;*zu(^XYœY>:D6U+qc2eh/><۷VQ&|Z bS7,',_)FHⰢD (ઞx1T$'쉸՟Xiq} ,-3h MIZ'd<5IiNS>­t۟[(I 6@Et·V~ +K;r6>#u: D":|P1߉t6Bg# wSsϻ)Kk(~u +NDHM+NS(Q<a +eB 9я4)B|>nJij=W&ݳ&~ ȝ4 $Q)"*xBms$B4$_YǬCN/lǤ|؀5и:`T]I>YFJ^|q̥np6 T_4f[tT@w5B0Y. P ˰u*.9tFt j_%_YK}e8t x SJnPlӭn(Ȯ+9xjk ,yMQU9QNĊ&|kmYOkGz&'5P*>{myMB雸[3UǬ6JN6%# 0baJo{sR5Ek =)%,DĞd-zfSJOW:6g ̉~ mJ`HN75?t#LQX˱voP.=' 'WDMi+@=+uy%jJ;? endstream endobj -298 0 obj << +284 0 obj << /Type /Page -/Contents 299 0 R -/Resources 297 0 R +/Contents 285 0 R +/Resources 283 0 R /MediaBox [0 0 595.276 841.89] -/Parent 294 0 R -/Annots [ 296 0 R 295 0 R ] +/Parent 296 0 R +/Annots [ 282 0 R 281 0 R ] >> endobj -296 0 obj << +282 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> >> endobj -295 0 obj << +281 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [104.702 197.25 112.149 209.121] /Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [104.702 176.827 112.149 188.698] /A << /S /GoTo /D (chapter.4) >> >> endobj -300 0 obj << -/D [298 0 R /FitH 764.175] +286 0 obj << +/D [284 0 R /FitH 778.724] >> endobj -301 0 obj << -/D [298 0 R /FitH 638.675] +287 0 obj << +/D [284 0 R /FitH 638.675] >> endobj -302 0 obj << -/D [298 0 R /FitH 639.97] +288 0 obj << +/D [284 0 R /FitH 639.921] >> endobj -303 0 obj << -/D [298 0 R /FitH 626.421] +289 0 obj << +/D [284 0 R /FitH 626.371] >> endobj -304 0 obj << -/D [298 0 R /FitH 612.872] +290 0 obj << +/D [284 0 R /FitH 612.822] >> endobj -305 0 obj << -/D [298 0 R /FitH 599.323] +291 0 obj << +/D [284 0 R /FitH 599.273] >> endobj -306 0 obj << -/D [298 0 R /FitH 309.957] +292 0 obj << +/D [284 0 R /FitH 323.457] >> endobj -307 0 obj << -/D [298 0 R /FitH 311.253] +293 0 obj << +/D [284 0 R /FitH 324.703] >> endobj -22 0 obj << -/D [298 0 R /FitH 266.245] +18 0 obj << +/D [284 0 R /FitH 247.695] >> endobj -308 0 obj << -/D [298 0 R /FitH 192.269] +294 0 obj << +/D [284 0 R /FitH 171.846] >> endobj -309 0 obj << -/D [298 0 R /FitH 193.565] +295 0 obj << +/D [284 0 R /FitH 173.092] >> endobj -297 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F26 205 0 R /F27 203 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R >> +283 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F26 197 0 R /F27 195 0 R /F4 275 0 R /F60 277 0 R /F61 278 0 R >> /ProcSet [ /PDF /Text ] >> endobj -313 0 obj << -/Length 2706 +300 0 obj << +/Length 2687 /Filter /FlateDecode >> stream -xڵ\mo8_} $,_DJٻ4n%Yt"ԑlpIҍdE3 gFrqp໫oF NHp -"b!HĈ$Zfo?Ώ(dz*Y U6[/W -룐P08p~,a"FF"7%ݻ8=N~; p -P`qw,%qpߌ B_;bC1bX+nm+Lj%շzImY\Ū=f2S>-麽E[*<\i|tB#WWf,nwj6!(FC1<{@1\d?cLo# 1Pav%kU-nˡ8ʴrǵ^@,il,뵾<|ߞ1OH{3<3@ZMtQ9@njxv<'^ie7~E^)CZ>vםj+EXa kcԀa Ur8,|!ޥؐ G 2 ԂvYTJ;FIa(7bx;zu*KAr$1ޖ M.N./;잭v*{\k. %}~ -C um#'#\dca_B!l/ 6ǹMj)@"=ǟ7* qC`<[{0X>{u=Q/8H#|y<8:w"{-=n:7 F-ex6}>>{ #(/!r<gCH9wDH/;ά)q7; -y@G",rs-Mj3DŦc3Kd*SSbJֹCYK[J^woMnf6Ub$elשuZe]1ahBт([|W"F3t^Z<}8S*X6jP 7;3[d6~0za}^ާ+n!#E6!U-aH Wd:(>D?dʺG@rG f-0sF4%߲)ذrׅ!c d҄2[AZ09/;PFO/CJQLd;YV/!) Wea-p.!jآZd=a` U޹@\ƳVm[Q!vz~zHi%{eP[S=ed_ZPaa5>"qٝim̸J. -yv4 -4v:e -˛T5d`IsbrqcQV^4=|dAK̇c B)ա#(&J'$D886qM0OWkmro5>,ӵkFZwgjv1;}G_ՒІwa6=g[ j,zo@=˫=_aG@QW>'( ^.e9 s^Xp}}/F1\{m,G՘v0bxg@C|SߚhX80ͮ6FzaE!9ȆСv#$I;f\Ľ^NJfۉ<yf }*8Mg+BndJMZZML(p)7; lbmwdbW&:u^owu~iA|XŎ ^:1-60FD7p/dXΓMgb,9iPi$Evag:Or뵌c{oCa|ĈeͲٞ1'$cm2S-iɳo.L +}|9=aX[O,c$]:MrUoKبrFط#Ĥ]uNX?F&2Z4hl-s2ߘ +J]5M_ +mYӭ$ep^lQl?“]Y1ռiL';!KPo*J*ЩVi=ſ(roE~ V3Luo2 7Պ6ih˩g/BVTk&LTCn񐖫yE*~vQ8 *NBl0ϯ+̇@a]]Bv׾%Dw;C),aQi(!cNc;;XQaHd9h xd:R] .(rо`,4zgwusVH.zk_J=8{k9x8 R">rQ.p%@ X%#Y*ˁc%'VG`} C3{$Ku9p3p@p<Ɍ>gI!#d[աU[1a]I}xLEtz=a>|`=4c׃=zrx='ְc=@8XgKCyYָcUi d)5ZF c*_~`]U#ijO7Wg|3LcnJR]=P<*QBsGl8plXIc"+rma>mJR]K=P<-~W$]VZdIV[R/~wc#v}7cmd.Z(Փc}spcQ_V@ X]#Yˁc]'֒cPۣioʉ*:ͧf_$Ly[ckd.Zo(Oe!J߁M{Y6ceid).eZJ(ec[cufd.uZ(Btwۀ,ɚ;gz5a$)Hv@ c=ytp/tX+|~E*,0FϿZc=rxq'c=ޒ! qTɀE R]=P<1܈>͒R (:ī- XZY*Cc:'xzCҀ#f~heQm+% endstream endobj -312 0 obj << +299 0 obj << /Type /Page -/Contents 313 0 R -/Resources 311 0 R +/Contents 300 0 R +/Resources 298 0 R /MediaBox [0 0 595.276 841.89] -/Parent 294 0 R -/Annots [ 310 0 R ] +/Parent 296 0 R +/Annots [ 297 0 R ] >> endobj -310 0 obj << +297 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> +>> endobj +301 0 obj << +/D [299 0 R /FitH 778.724] +>> endobj +302 0 obj << +/D [299 0 R /FitH 665.773] +>> endobj +303 0 obj << +/D [299 0 R /FitH 667.019] +>> endobj +304 0 obj << +/D [299 0 R /FitH 653.47] +>> endobj +305 0 obj << +/D [299 0 R /FitH 593.643] +>> endobj +306 0 obj << +/D [299 0 R /FitH 573.32] +>> endobj +22 0 obj << +/D [299 0 R /FitH 474.843] +>> endobj +307 0 obj << +/D [299 0 R /FitH 398.994] +>> endobj +308 0 obj << +/D [299 0 R /FitH 400.24] +>> endobj +309 0 obj << +/D [299 0 R /FitH 386.691] +>> endobj +310 0 obj << +/D [299 0 R /FitH 373.142] +>> endobj +311 0 obj << +/D [299 0 R /FitH 359.592] +>> endobj +312 0 obj << +/D [299 0 R /FitH 346.043] +>> endobj +313 0 obj << +/D [299 0 R /FitH 332.494] >> endobj 314 0 obj << -/D [312 0 R /FitH 764.175] +/D [299 0 R /FitH 318.945] >> endobj 315 0 obj << -/D [312 0 R /FitH 665.773] ->> endobj -316 0 obj << -/D [312 0 R /FitH 667.069] +/D [299 0 R /FitH 305.396] >> endobj 317 0 obj << -/D [312 0 R /FitH 653.519] +/D [299 0 R /FitH 291.846] >> endobj 318 0 obj << -/D [312 0 R /FitH 593.693] +/D [299 0 R /FitH 278.297] >> endobj 319 0 obj << -/D [312 0 R /FitH 573.369] ->> endobj -26 0 obj << -/D [312 0 R /FitH 474.892] +/D [299 0 R /FitH 264.748] >> endobj 320 0 obj << -/D [312 0 R /FitH 385.494] +/D [299 0 R /FitH 251.199] >> endobj 321 0 obj << -/D [312 0 R /FitH 386.79] +/D [299 0 R /FitH 237.65] >> endobj 322 0 obj << -/D [312 0 R /FitH 373.241] +/D [299 0 R /FitH 224.101] >> endobj 323 0 obj << -/D [312 0 R /FitH 359.692] +/D [299 0 R /FitH 210.551] >> endobj 324 0 obj << -/D [312 0 R /FitH 346.143] +/D [299 0 R /FitH 197.002] >> endobj 325 0 obj << -/D [312 0 R /FitH 332.593] +/D [299 0 R /FitH 183.453] >> endobj 326 0 obj << -/D [312 0 R /FitH 319.044] +/D [299 0 R /FitH 169.904] >> endobj -327 0 obj << -/D [312 0 R /FitH 305.495] +298 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F4 275 0 R /F61 278 0 R /F41 266 0 R /F60 277 0 R /F63 316 0 R >> +/ProcSet [ /PDF /Text ] >> endobj +330 0 obj << +/Length 1770 +/Filter /FlateDecode +>> +stream +xڵ[o6+fgvfN6[E7E&Jjԑ3YZ D;+O(R~IzēDD8:Fkͯ#Q,ed(*z?>>9z7Roi>!xtqʨ +qL&OzlEj2%Lb|V%7M#a˿sxdU5G JuaH+]ގѕI{eۈ /ʻG7rFQGS}TƑQ΋h#:O+%{P0! 4FD Q# ՃoL/߳335VcX`r~eƞh EanCvWr070X쯵*GT`ɥ!lCtWr07,X쯵ct@(CERb$LJotpzf'UfWi޴7tmC> endobj -330 0 obj << -/D [312 0 R /FitH 278.397] +327 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.39) >> >> endobj 331 0 obj << -/D [312 0 R /FitH 264.848] +/D [329 0 R /FitH 778.724] >> endobj 332 0 obj << -/D [312 0 R /FitH 251.298] +/D [329 0 R /FitH 741.858] >> endobj 333 0 obj << -/D [312 0 R /FitH 237.749] +/D [329 0 R /FitH 728.309] >> endobj 334 0 obj << -/D [312 0 R /FitH 224.2] +/D [329 0 R /FitH 714.76] >> endobj 335 0 obj << -/D [312 0 R /FitH 210.651] +/D [329 0 R /FitH 701.211] >> endobj 336 0 obj << -/D [312 0 R /FitH 197.102] +/D [329 0 R /FitH 687.662] >> endobj 337 0 obj << -/D [312 0 R /FitH 183.552] +/D [329 0 R /FitH 674.112] >> endobj 338 0 obj << -/D [312 0 R /FitH 170.003] +/D [329 0 R /FitH 660.563] >> endobj -311 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F4 288 0 R /F61 291 0 R /F60 290 0 R /F63 328 0 R >> -/ProcSet [ /PDF /Text ] +339 0 obj << +/D [329 0 R /FitH 647.014] +>> endobj +340 0 obj << +/D [329 0 R /FitH 633.465] >> endobj -342 0 obj << -/Length 1623 -/Filter /FlateDecode ->> -stream -xڵ[o6+fHJ°6sْ5.-5bߑH<O$ {&&,̂X R1aLz0߯t1`2l&onSX‰P!$R^^6?kd_l*\z yRr{Z} -zkݸhAu&?{ 6ᦺ{ I p $6Օ!w\~oqpGAaM.$ߥ"B p!%)%; ◇G # ̶Mǖ4y% K$JQYb"bAgySly>RICEix,3;pաZGHJ%Clw[l,6~حe2b}b3A"eOK(&$'-Zq|0Οe,<d+#1ɉ9/:UΧh+ջ^{]hB1D*T*ddnC(;֞VYQs]`|~szq~|t݄<-,vInw|lm2a!,3wg3~حe~ï%X &]Yf3ͧfszeolg%*8I `Inrw|lm2aB"?@W@L4]٦`r温бE"kr+%Mrk$dn~ddn@(;ցV%$anOuӐg3=:5_7IqЫ>fЯZcNrcoYzTP[ l~(c~m(8y;}&?/qL"a->;d\!Hg *XI̢ &_WeZ;F_\~r+/Iia;䎏mMF6?>g}1%؈%1f$7/;>6K[ M -HbL y=ȞݺPv=4x;F+ROZص.<]뮉8CAĘTArc mYzu=Ic/_%scڀM֎-MF?V0;ӈ;ͳMF ? gh#s}kE[|d_wȸ>C؍ceLlITO(M,ibSφ]ĘArc lY{zm~­sZI8f JI,-o@CNi$$Q\-YAUu UŅ"'J5D*%J!4r9NPB!DR+s<5GBJ.s$'G󳨟x\7imr.j}3'X-caa֌h;& ȀaimG֋̿d0 -AUmˣLAi7Ꚛ:z%׽$aq0ܺ#a; vDM6[Yt+ײ9Wea9֋uZtYmle}W!_r -endstream -endobj 341 0 obj << -/Type /Page -/Contents 342 0 R -/Resources 340 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 294 0 R -/Annots [ 339 0 R ] +/D [329 0 R /FitH 619.916] >> endobj -339 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +342 0 obj << +/D [329 0 R /FitH 606.366] >> endobj 343 0 obj << -/D [341 0 R /FitH 764.175] +/D [329 0 R /FitH 592.817] >> endobj 344 0 obj << -/D [341 0 R /FitH 741.858] +/D [329 0 R /FitH 579.268] >> endobj 345 0 obj << -/D [341 0 R /FitH 728.309] +/D [329 0 R /FitH 565.719] >> endobj 346 0 obj << -/D [341 0 R /FitH 714.76] +/D [329 0 R /FitH 552.17] >> endobj 347 0 obj << -/D [341 0 R /FitH 701.211] +/D [329 0 R /FitH 538.621] >> endobj 348 0 obj << -/D [341 0 R /FitH 687.662] +/D [329 0 R /FitH 525.071] >> endobj 349 0 obj << -/D [341 0 R /FitH 674.112] +/D [329 0 R /FitH 511.522] >> endobj 350 0 obj << -/D [341 0 R /FitH 660.563] +/D [329 0 R /FitH 497.973] >> endobj 351 0 obj << -/D [341 0 R /FitH 647.014] +/D [329 0 R /FitH 484.424] >> endobj 352 0 obj << -/D [341 0 R /FitH 633.465] +/D [329 0 R /FitH 470.875] >> endobj 353 0 obj << -/D [341 0 R /FitH 619.916] +/D [329 0 R /FitH 457.325] >> endobj -354 0 obj << -/D [341 0 R /FitH 606.366] +328 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F61 278 0 R /F63 316 0 R /F60 277 0 R /F4 275 0 R /F41 266 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +358 0 obj << +/Length 1669 +/Filter /FlateDecode +>> +stream +xڵXn8}WbDJڷp)68mm+K.MݯߡD9m%SÙ3ggՅ-Qb6Ϙ1N`"lnS"nh)PycYgee$m}h.xT mK0)ȵrl 4 +iRdinYh#RdG5".r\fk]|_Wc<:<ƛL4HC3iS)LBEU ͺN曒ƛ`T2pqCߔIH"yɵt6v2$D(?al|L.{51C"8LJ?3 y!Pc +nS*<5iu}-RzFC#}oJ7Dix:}2C)BΡxL:< Kx9A &$YU>eެ:AHz+b$> >tr9 ڭO,' ıʄ4吝?:&- ;%\+@ +q:^ Z{+'ԣ= `M_Z<\jp}D͂g qP٨ XEB10=(`j@W"?VEL6) Ƙʨt:ǧ3U) nLӌmoE@~Y6rKvjh4 UGsۛ# ,S ,i4twkߓAsz`6"ī^?FM5ۖ{hs|4ՐyR@XF"rU~f.S R]óFoCj(=:!?hjT%W%Mx\TM)8.+VUF&`Q #`2sl=](f=VewWfւ VVaqvSi(WOØDZ`-6#J7Zv8iT< +}Q՜OjC$cW&\-yW!>=Le.tLKș_Va‘ƃ%LaG s!;N@cЌxtzk߻V'a,?dB~0=pC]-~Tܹ[v5K5,ۍHx3`n8ɽs /no\/~+)#jx:趯w}.; jE˥mU$T_f> endobj 355 0 obj << -/D [341 0 R /FitH 592.817] +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.39) >> >> endobj -356 0 obj << -/D [341 0 R /FitH 579.268] +354 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [346.586 347.985 362.215 359.736] +/A << /S /GoTo /D (table.3.1) >> >> endobj -357 0 obj << -/D [341 0 R /FitH 565.719] +359 0 obj << +/D [357 0 R /FitH 778.724] >> endobj -358 0 obj << -/D [341 0 R /FitH 552.17] +26 0 obj << +/D [357 0 R /FitH 739.268] >> endobj -359 0 obj << -/D [341 0 R /FitH 538.621] +30 0 obj << +/D [357 0 R /FitH 496.96] >> endobj 360 0 obj << -/D [341 0 R /FitH 525.071] +/D [357 0 R /FitH 394.16] >> endobj 361 0 obj << -/D [341 0 R /FitH 511.522] ->> endobj -362 0 obj << -/D [341 0 R /FitH 497.973] +/D [357 0 R /FitH 395.259] >> endobj -340 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F60 290 0 R /F61 291 0 R /F63 328 0 R /F4 288 0 R /F27 203 0 R >> +356 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F4 275 0 R /F60 277 0 R /F61 278 0 R >> /ProcSet [ /PDF /Text ] >> endobj -367 0 obj << -/Length 1675 +366 0 obj << +/Length 2126 /Filter /FlateDecode >> stream -xڵXn8}WbEJ[Z8i:@[DʒKRw(EI&}0t159s8X.F=dSZ֗ϳ:ٌi^?Q(gV -Z!NaE팰(M69cKJٝ`-p|\-VT Eˬ`? [!,P߳{a1Gs@k01Y pVv' SyNk@Wr=[s3M$Lww2 ! -8Fujb\OO7Ǵo8b)2>4b|)(dDqf6LO~<@~yO'4M߼˳02c|egh[NAn`xsa'"YeF@|`Cݨ{47ď`trr~Mԫz4u`?Po>C 4 +{/0@ٛnO~!Exۆ|:ШjB~Vc^uԳSE̍ZD4EI˷)~ ՔF~oU!dn&d{Q . $-A Pj+EwXe2SU,)W"suTW;bhjSȹ 5UoIS`OL]3%>B-a?>򕩲qVע˺fڟ˅rj=D<-4h*:h|ID( 5y?]ۧ.H"]7 iJ-uכT[-cRTYB926٠fI>P0/ +Ƽ.V(?.2 +3'(\D(OFw`tbƆ10:Qt #eF-Jb"(S)gU +Q?C`9n8pHZ9py7zCX taBŰDjP"DZaDف1H#9ڣV(?.>3)H`70DZa^|G [,uchtXWj"clAb"SIcS9E` /xp[} q"zh!aׇj|wv6taaݖ. ](֕ZdhTO&qLEf4 3 %!wᵂ(IkNGx? NoFY_v'4߮,YAļda! ʔsedOխ&d%k]R U=ު:惾O'*^܍*Xs{ɛyȴt7>,1uCק>eۋ/9.L6m.T[Riz/aTS%-Zj .pp;u`'6XnFt`'J-uv+H""^SYRPef{H8Cxe"T}}NU9uЪaFO+Z=.SXr7xbz2]g6뇫d?NLl!uBZy{YDdC%ԇJLdY!9^˾Z 03M!p9 O ⺓0l kӅ [JL3ю1n`\eྵ0hn^ #a[[,} a89}8Gī^uPVu\&hkncK<28M&Up/̋gqqO&k*Dܛ>'*#n3WNnm A֦!mdQMŞfG͌-~\:bb[n%[t$[Nn!k(]DRu!VN# Mԝ>QRfV(w{_ufQ`9]HeYպx-Z7+fϫUেjC!P:STŹl9Ũq<5h`ƒYkWO6v Fۺ@:,5f;DH=y#TCR d'+y\Γ,DY Wg0sŋ^=~OIV6N/g^ endstream endobj -366 0 obj << +365 0 obj << /Type /Page -/Contents 367 0 R -/Resources 365 0 R +/Contents 366 0 R +/Resources 364 0 R /MediaBox [0 0 595.276 841.89] -/Parent 294 0 R -/Annots [ 364 0 R 363 0 R ] ->> endobj -364 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/Parent 296 0 R +/Annots [ 363 0 R ] >> endobj 363 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [346.586 361.584 362.215 373.335] /Subtype /Link -/A << /S /GoTo /D (table.3.1) >> ->> endobj -368 0 obj << -/D [366 0 R /FitH 764.175] ->> endobj -30 0 obj << -/D [366 0 R /FitH 739.268] ->> endobj -34 0 obj << -/D [366 0 R /FitH 496.96] +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.39) >> >> endobj -369 0 obj << -/D [366 0 R /FitH 407.562] +367 0 obj << +/D [365 0 R /FitH 778.724] >> endobj -370 0 obj << -/D [366 0 R /FitH 408.857] +362 0 obj << +/D [365 0 R /FitH 216.078] >> endobj -365 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R >> +364 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R >> /ProcSet [ /PDF /Text ] >> endobj -376 0 obj << -/Length 2463 +371 0 obj << +/Length 2442 /Filter /FlateDecode >> stream -xśKs6~vؙ-"ɹ#Dlvӗɔ0J'ؽʏp&~V>AH! f*$. OroJ?"Kӭ>ށUkv`Tc E`|s﮳~Kg_\q9躷1ԯ+ -D/^2Až\G Jg!)ޕsl:mF`\z 4 0}˓m$]sᡪ -)'^$^*[~ڹTKT>4]PI RWLnlMP :858QD&@>UvuswT2VρVu~j'"]SЪ}ʲ kTSY]!n6>[e.2.轙 -ZͿ}I]S5;qSUhUMxy543Mx_gMEUgBS f +ta r}PTu-΃cibpY)!MZU]4R1[ VG*uHA#.ՖeZ)ۥtuV <Mh*aU6/ՠI|z*8 ZRqhvQ;OVzc-(dۨ[gBpa.43׫%:yMIe -OzpFf'OOk@k;I46g9h> jn̕vlDomD0? n= 2:$RDk5&ԃIUr{`nwz,@D0"=jb9uJ٠9:J]PqX" -&gTͬӒsfO_ɨ3{Vҕ (\2jmUW2]vMDnq"0W'ZPVAFI:*Aho`'s"Z=l%%>]asخߪ vu%|ą:>o9⼾],y=JMo[56GauMʺ>M) +~{gF\^Rl槚fkdxFjw@9,Gdljצ2D3I,f5xi }o= NЌC2{r;4Ó-O%#.{lkv?0@B^S/DHr0o U&hWze`aC^n'CmzR;ڹe*fURv|hegߍpJ$htŠ[saQY@0u_Ej!h!ͩG Ry>\Ӡ"^`K2{ds%r"Q^ oy#o-G sH#I)CeW +W-',^E/"FIȨ/̣Ő)XcuܤgaV饍o) Mq'?fDʴ +ۛe5=0[] 8ȅ ] DM9pfm*Iدe|ߩJt>CZȺ$4ծm%O6G_kBMj34ÛD]O`i?N00Gp +9(z'p[3}[W k,'~đu,7a}_g31 *  +m@f1M*i]ֱUɁ#pIAx%MaBWV3 ˑQV)ImI呮L4ԈP}tےGD}DX;t%S(VShæ5cD $iޞmTn+1͡$De]KA츖18XNzf0M:. Li 'ѳD]U:UT$.hA4zli xB'dx%oefVެ+Ե I&}csSVh՛}5}k<6]m]( + ۱H=v%Ɇ@E.e(r jzVL6[, s**0UI |_c D=Ezf 5vK{ri56nkf/8XcQb̯E5N}Dk<-6k8ԩe^HFg q`UO$|5!7F5U_"7 FĖՀa:]KfŖ|p{3~OiɍMUQ 3*A>E +k~ q<zx2>ch=f=PC#tN!ZXڏ= N!p[5 ek(!Hwi$2vr\%B䤁M$Z::g=ric[1G4٭xU.G-3ꭗ1 lDbϤ환JtDu'tf$)&yYdSQaa&#.iT* u#ʲnxWWry~llī9Զidϱ7Z5)LDQDylZ72sJuymyҡ+*1 DSa\s10I횋yҞ6}\^44 Mac$6,vgUʌp> endobj -373 0 obj << +368 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> >> endobj 372 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [334.205 268.341 349.834 280.092] -/Subtype /Link -/A << /S /GoTo /D (table.3.2) >> +/D [370 0 R /FitH 778.724] +>> endobj +373 0 obj << +/D [370 0 R /FitH 503.252] +>> endobj +374 0 obj << +/D [370 0 R /FitH 504.498] +>> endobj +375 0 obj << +/D [370 0 R /FitH 377.86] +>> endobj +376 0 obj << +/D [370 0 R /FitH 379.106] >> endobj 377 0 obj << -/D [375 0 R /FitH 764.175] +/D [370 0 R /FitH 306.666] >> endobj 378 0 obj << -/D [375 0 R /FitH 672.977] ->> endobj -379 0 obj << -/D [375 0 R /FitH 674.272] +/D [370 0 R /FitH 307.912] >> endobj -380 0 obj << -/D [375 0 R /FitH 548.355] +34 0 obj << +/D [370 0 R /FitH 233.259] >> endobj -381 0 obj << -/D [375 0 R /FitH 549.651] +369 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F41 266 0 R /F27 195 0 R /F4 275 0 R /F60 277 0 R /F61 278 0 R >> +/ProcSet [ /PDF /Text ] >> endobj +383 0 obj << +/Length 2450 +/Filter /FlateDecode +>> +stream +xڽ\Ms6WhoĦxrf3C-+Tgk6H_"LCwm=߻WR>( D/w+y|m^yJ6/ +`I)]w<9d"m\C~po|$<:ѿo~Վ"po*Cﵼs1Ng S?X7 ͷ- $!T-L`1{{փIy6,_eI$jvto)A>@S% D2$VY=ϗI^ +f.H[NYd(yp'0赆*%)FQHjM&YQ4pHEۦϯq%6׏1s~Qxw+@86^ 2{΍@1Hө͂6FALw[1 rE8~՞+nOXuÂ7bvKs`}[Q4\.tïMY$/M9Q)r9Сw͠c\v%~H[,[I0AVj+rwH7I=kSi8>:౺ϧ|E@i Ao c$ݵ ־fӯ?Q>E_G#"aBcԽ$HbPXW]T I6(9$#k*V\ձ[ ׺0.E6ޠ%~-+?4cHvLPG0vLA +JBŽ [ > , 5m`:rA=tl%4?$w22*"%-ӫJ`I`(cX&̭HSg\-ΠUӈ ZQ=n|w8At3Ķ>lyH Q_WwM=lGq6wQ-Led(n{rKq@5ԴsB"rPӁU=:0 + (+Is$CM9p,J7Rr@=Z!dL.x2͑ 2ܨX9 +Bqurˊ˳Ja@ο+hs$CA9p,h7"t@=A3 Z P:sid>FM(ǺCS*"c +Sv +.\L_kvݰ髟P3>YuTqQWxNd!/ҷN Bd%M֑DNfbtO[.+UoJ-wy]9 otOa9g.NQ&%4iqA/NDŤۅn> endobj -383 0 obj << -/D [375 0 R /FitH 479.226] +380 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.39) >> >> endobj -38 0 obj << -/D [375 0 R /FitH 405.111] +379 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [334.205 685.101 349.834 696.851] +/A << /S /GoTo /D (table.3.2) >> >> endobj 384 0 obj << -/D [375 0 R /FitH 313.89] +/D [382 0 R /FitH 778.724] >> endobj 385 0 obj << -/D [375 0 R /FitH 315.186] +/D [382 0 R /FitH 739.268] >> endobj 386 0 obj << -/D [375 0 R /FitH 216.367] +/D [382 0 R /FitH 732.374] >> endobj 387 0 obj << -/D [375 0 R /FitH 217.663] +/D [382 0 R /FitH 632.697] >> endobj 388 0 obj << -/D [375 0 R /FitH 166.266] +/D [382 0 R /FitH 633.943] >> endobj 389 0 obj << -/D [375 0 R /FitH 167.562] +/D [382 0 R /FitH 581.688] >> endobj -374 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R >> -/ProcSet [ /PDF /Text ] +390 0 obj << +/D [382 0 R /FitH 582.934] >> endobj -395 0 obj << -/Length 2502 -/Filter /FlateDecode ->> -stream -xڽ\Q~_8C U6ٻT.swئT{Z <̌ SVKu6<}tPDnD$ DH9O+^<0\%傺U񐮒oO?G#O?|YP~UZFz"?{&ioH;%nSнwvjD{0n,,ww:+# xQ;ᾔ7s>1ExRVI벲/1,vIJVP/k4+Y) ¹Smw囄u:<`WIȀEM-kBa*~>1]UJUE9^+&uԵypsP =wEUg/|s},]R͗I(jR UϺ4tWmQ)W-t>rSCUgUaww8]%uR<`gcZIz)RAD7g,>|krPTL[=1 JuaS!Â>ʐ)#tjФvcOBḽ)hn|A]d -m c֍g+@/+6{JOMM[WBxk Y 4zj&!<ކQ;,U96;dcAcX!A]Td*6w(*tTj/SL& XҜB+ry"] ֨+(Z)#⁺@>_)L`Ɠ Xn {GFENZ!;=/Ck,T^Չ.ssL_|)T,RB*)MfwV}ke~hC -(uΕ).qfsRnFBt vV,~IVgׂ̋z,%7dE~=OFp/pf0e$GUr 5g U%K@(h]4u)5QIo^o`N\ؾȓ|a$$09 8'2hN5q띲K^ǿkyn.ЀCXb -o!\h 2 J=u of M\#o. q7n | bB/ZT\ʏ7 D"T,eKOr{_+i -endstream -endobj -394 0 obj << -/Type /Page -/Contents 395 0 R -/Resources 393 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 416 0 R -/Annots [ 392 0 R ] +391 0 obj << +/D [382 0 R /FitH 517.13] >> endobj 392 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/D [382 0 R /FitH 518.376] +>> endobj +393 0 obj << +/D [382 0 R /FitH 504.827] +>> endobj +394 0 obj << +/D [382 0 R /FitH 491.278] +>> endobj +395 0 obj << +/D [382 0 R /FitH 477.729] >> endobj 396 0 obj << -/D [394 0 R /FitH 764.175] +/D [382 0 R /FitH 464.18] >> endobj 397 0 obj << -/D [394 0 R /FitH 706.421] +/D [382 0 R /FitH 450.631] >> endobj 398 0 obj << -/D [394 0 R /FitH 707.716] +/D [382 0 R /FitH 437.081] >> endobj 399 0 obj << -/D [394 0 R /FitH 694.167] +/D [382 0 R /FitH 423.532] >> endobj 400 0 obj << -/D [394 0 R /FitH 680.618] +/D [382 0 R /FitH 409.983] >> endobj 401 0 obj << -/D [394 0 R /FitH 667.069] +/D [382 0 R /FitH 396.434] >> endobj 402 0 obj << -/D [394 0 R /FitH 653.52] +/D [382 0 R /FitH 382.885] >> endobj 403 0 obj << -/D [394 0 R /FitH 639.97] +/D [382 0 R /FitH 369.335] >> endobj 404 0 obj << -/D [394 0 R /FitH 626.421] +/D [382 0 R /FitH 355.786] >> endobj 405 0 obj << -/D [394 0 R /FitH 612.872] +/D [382 0 R /FitH 342.237] >> endobj 406 0 obj << -/D [394 0 R /FitH 599.323] +/D [382 0 R /FitH 229.158] >> endobj 407 0 obj << -/D [394 0 R /FitH 585.774] ->> endobj -408 0 obj << -/D [394 0 R /FitH 572.224] ->> endobj -409 0 obj << -/D [394 0 R /FitH 558.675] ->> endobj -410 0 obj << -/D [394 0 R /FitH 545.126] +/D [382 0 R /FitH 230.257] >> endobj -411 0 obj << -/D [394 0 R /FitH 531.577] ->> endobj -412 0 obj << -/D [394 0 R /FitH 418.498] +381 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F4 275 0 R /F60 277 0 R /F61 278 0 R /F27 195 0 R >> +/ProcSet [ /PDF /Text ] >> endobj 413 0 obj << -/D [394 0 R /FitH 419.647] +/Length 2104 +/Filter /FlateDecode +>> +stream +xś[s+xu}ca*!3[{)'a kfg~iY#ıeYVZ2Nt>~P$; Pٙ-;uz;ݻ}۫j}ZY 1B#iPOnWHg1łw'YIU| ' q;:.0$W/Hz؜Y³/Pt3%s{ߢGm"õmxQ#o +ZWVʬ J]$ETxzG&Tv%1&v/"^yD@8=BY<5l4^ (>M{ fA_Wr#gSz p}tz=u׷>aٸc0bVX2$̾ϋ_Ԇв$dHDw!Q!(d(PΜËh8P@46Z8q*18C]D%OIE\L20M!'aX?q*Q8UɄ@J1JԿ@VaY@]I%!+qPTz&! $_=gb7P{4JV Zp;y"潻yGcE\sJm YHiK m  H,QnEI:HhJ~.o܊`.pe'v"K00Sꪵ@R-PJdAKJ` 5L%'-v jsT;B0+aRhrРճ4SY/ +as-+DWtlTtieE!V){b9+a +b#lF!r*i؈w_ +Tĉ]N%2K3T0w?`O4†(Fd"ÿ*W +:pŬtPpu V8.~ռ[\.M<64 qA ߆qh k5Y +ea W%,uMt>+qZ맙_pPA:G\L6:j>hN-h*'\C;3l  +0m5"X.8d6u:գW6-dEԯBmUJ`6aZ%߯eb4Jk'v>0U`|'>7/bE\CJ7Qc٣_$`7G( Ub%6}{v6}epT چ,hSUݸW`48LNO<\Ɏ9.,ӿ0r~1f5-HW/g, @]SHPZ.eyV!Z _zo + ^^GzJq +a4jPXj2v +~3Iқaaɛ|x0HR6E wV}}nWj% $h/?`WGqg*p$E#Q_!q*qLWq8؄(ʟc0/tPD`S[W'J +endstream +endobj +412 0 obj << +/Type /Page +/Contents 413 0 R +/Resources 411 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 408 0 R +/Annots [ 410 0 R ] >> endobj -42 0 obj << -/D [394 0 R /FitH 356.188] +410 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.39) >> >> endobj 414 0 obj << -/D [394 0 R /FitH 178.72] +/D [412 0 R /FitH 778.724] >> endobj -415 0 obj << -/D [394 0 R /FitH 180.016] +409 0 obj << +/D [412 0 R /FitH 220.86] >> endobj -393 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R /F27 203 0 R >> +411 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R >> /ProcSet [ /PDF /Text ] >> endobj -420 0 obj << -/Length 2813 +419 0 obj << +/Length 2676 /Filter /FlateDecode >> stream -xڵ[Ys8~ࣵe#AyJjO2L$%A7 !ʱe} n<߻:{q}=؏wBE{!w:zJ3WU.߀ -S1ASؤ%k 碬"W7KLyϒ$3qG~Wӽ΀4:-g.AN0%< (8vʍ&ͼgZr@QtJQ$B׊z!*PVNJ4QwnUy.|.⛺*E}k>#y|P&a("6VdYW,k$ -"ɲjj 'Aw"^JAE^W0YG[V!s5C,eo=K"/!umaZJWMi!7c Y+\*_.Hy,چVrH›im]/ ANZ"Cن,!_|(6N7XX\3\lJdb_حE>rOibє S]RXy$3qL4yaF~*d~H|/Asex1&f(愷 0\SA갷i@ |oWvCG'1?,V1TJ4'6BC'}bH٘h -'`;Nz&tR]H*Yr_K%((MI|`CX( G -t9S Q'IK@'{'?8 NKrIK]:.Y +]d[tϴ՘B -4U?,.FETΠ꒾وe"),=&fbe2Z"e0 PkUi 0U'myҭ Cr!BE&.|#&LrVL&J|Iʀ@ʏ~.zۦ*LA1 }ϴL0,k[e=35j|ô}L*MI*ߍE !&W۷iB*g<8^k.F&- )4žM(o"zcCkFHhP\mqfba"{ji9UڵCyWA,]xNM.JL @m'c8 L,NdBPV69C'E}@7l$-r9=ab*TJ3ifwuY47Z[2nAkY*. t%[/ - -!Koт$X06-|c"2mJ/um[1OTVDQuD]b(-O3w Mx93YAӓ}23[مEЁ~6YXsufX J y[Y>,߀ʲpq_4Nݭؚ[Px`(;Y(m= ]LD5!fH{,ل)XԦҳҬ+Xf2JΨTU-6:(^ݍSkVd)}INL5nDږnoK*1Ś:o=5[ZazS)qnx@c>ƚN%5#,Dt0҃3RtΠ('(lsr%Ib([?BɕN'(PC(5w<Qv;zȅNuxEb1'2vdK./ ƒz^̡S,#LMr(Y2~rE%OۀtȨI$qIV+Ѯ?1ɺ6.\݉h|w`ёQ߅:fQC^'x1nb}p1@eƌuZc-5!!9ql ݢu-dwI5>abfG,(t| 0y1FG=dP`a?И(U矲S?K@)uG%$1yrew=J ]@((գJ(RO?.lw:P3]ߊX)rp>pL9J9sGߵ3);vfl[t`iM8sap+:/.r_Ez/ Q}@z㓂/V5fqB8 -H)}08ܳm]؁N@8`fpx//Һ:&K*/J^w";1Ep񔎋xRvٶ>vz `]W؈R'$cs'P:*&zĈۘx ^1"kı!!yhR)}18"ܳm؁N"Ot8(#_N0BpJ&)s]%I&á|ydH6tz&?Fap0R/@qlD&-sp~DԮ]ڣ .I{? EtoL=k#׿cn;xKr/Eb7K (sۯ޾y姗\@&1: +xڵZK6ϯQ!ILfr֎=qQ52AJ^ F@J0B> +&iz{vNWRE$w!?)EFWUvA+h+eL4oo !X&ޡ{!  Ղ3V\k!?H0`mxsـZ>~/픅uM|źtvFf6 ˔?vf竹gF Kk4)fn@Y߫we}1~CzP;WQb+dzǦ*Zi$ʲN;z_S:*DS߄Ֆԛ _qZ}Yl/rG"rVVoPp8R YWwBr[Zȇ>Q1 + ђjg<9D뾖k9*o8B;6VkgLAԻ&*{MI26bG1NOi簱0jP;[vMV 8q3\7odкB+52Doue&0J6z@ l>0ZtERHm$ATQb*t%`%ˍs ai߸jd܉ژxY>6;@+a)Rq^.VPH[ɧ7O^ԢjcJWMM-BNoGNer=кQ,k;Jr+/يb2t(x[1bB}YpNjq SY'(I lsPžK8r*K\FK]Qf#wN$!D;0"TPfo~h"LCIt +=0C%ͮ +ǭS0N hw4)vY:F~Q +J15Lt.HK`<|JWl&$='60[4+P?D!00NYLxYgFSԋFh׼U5M' 8MKKx cΓݢG&"$_$8xD"ڔND^OODάtfͧ[M!rX썅)mGh]gnW~U+k dw NtIbxl;F & \|!_r/m$Hxf1eCsEg餆fz&sHϨ3ZBc[LfH?)5bF6Eo"waQeEuVŲɴIǹlo_J)l/pJƊBE&_ b)w'7Ėv1b4[h7)MNx9 )$1_>A!3%_~HاςKYIBZ @ #$='6x^69LxY R1M,;͐Ǚ[S jeOK!ы%M% 4iə tf +֩6]p8PS;RWt'D4fw 6y0iez0|4gZˀ~4:GԶ>Ca3Kעï+R MTџ/}Př94KWaHCH> -i;wmv 3)bp0sc:>.?gw>Lc핏'WV\ ~ꤗ.gW;r,w}k.EŎ0mk 3o㽎vi/w+C:78y;fب`VD}7*ͣ^kl*ݞ>Yfg?yDMb>$|3j3=otUҖJ4}YYc<UwQ0rK؟t}F9Qi՜2l3 d jm=]U)ˍ6JGaO]9SѺbg 9pΘGJs؛p ytd ڔaU;p~:FCL/qoAJOfۦJ_^wo߼rn>I~2؊.+p endstream endobj -419 0 obj << +418 0 obj << /Type /Page -/Contents 420 0 R -/Resources 418 0 R +/Contents 419 0 R +/Resources 417 0 R /MediaBox [0 0 595.276 841.89] -/Parent 416 0 R -/Annots [ 417 0 R 391 0 R ] +/Parent 408 0 R +/Annots [ 416 0 R 415 0 R ] >> endobj -417 0 obj << +416 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> >> endobj -391 0 obj << +415 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [508.268 724.951 514.744 738.668] /Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [139.24 513.61 145.716 527.327] /A << /S /GoTo /D (Hfootnote.2) >> >> endobj +420 0 obj << +/D [418 0 R /FitH 778.724] +>> endobj +38 0 obj << +/D [418 0 R /FitH 739.268] +>> endobj 421 0 obj << -/D [419 0 R /FitH 764.175] +/D [418 0 R /FitH 573.187] >> endobj 422 0 obj << -/D [419 0 R /FitH 645.449] +/D [418 0 R /FitH 574.433] >> endobj 423 0 obj << -/D [419 0 R /FitH 646.745] ->> endobj -46 0 obj << -/D [419 0 R /FitH 468.118] +/D [418 0 R /FitH 420.559] >> endobj 424 0 obj << -/D [419 0 R /FitH 365.171] +/D [418 0 R /FitH 421.805] >> endobj -425 0 obj << -/D [419 0 R /FitH 366.466] +42 0 obj << +/D [418 0 R /FitH 243.178] >> endobj -426 0 obj << -/D [419 0 R /FitH 269.042] +425 0 obj << +/D [418 0 R /FitH 166.441] >> endobj -427 0 obj << -/D [419 0 R /FitH 268.085] +417 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F41 266 0 R /F4 275 0 R /F60 277 0 R /F61 278 0 R >> +/ProcSet [ /PDF /Text ] >> endobj +429 0 obj << +/Length 2194 +/Filter /FlateDecode +>> +stream +xڵ[[s۸~FfL;>d K͉$')H6)|xG7o~`8"lHtFZHI(3:4ïx= S? +C *}s"fp@/#Z~v HFlfsyvЫ3 %g^'w u[uYjpncjwh``#úߖ}|ONdO^IJ|>أ-/>v9ɟ-aMnnmYn*/9$EG:)`@ywVS72.mKwnNU蒱HP[2gj)q9 GSN3?RЬy"Hk-$T: "`F.+Vj+1: #t-[ Ȭ˿a^w: <),*T!cZyo[;CDҀ Ve8vԏ-C0 +r!M``ñ2fʮ NB Dyj +IE"i;7,|!1&Hq.eb !4/쎄Ɖv7yv2*ԥVMQ<20I-j&049H-(#ƶZFǶv!Cc{YprAiEb[ҳgc8-'l_QY>"+UZbSثpZC9[/61^Wh1nX9CxwVmt``4yS8O˴)ٮQ 3I@^Wt`}ۭv h,mmS]mtL!<= +k$A\HR2 E(Q}_L/BV~qTqFX h$q k +uF "d8֪uF IixV Da5.tU:фlO]ۍ6>xt)"ɬ4j +2Wc'6L. ñ: Y$4(>gkNxS./Ԕ{W +ox NA%S2$GNuH=ݡi%x8wz{Ý]cs؝<@Avvہ C<# Cx`XA.W}_ +MLe{}zD}"K0p > }\dz+3CP8D\J +(5IfD79HB֯ѨUkWN5NunRtkb+;m*]KvE]pVM 3{hGkp!k6Kpr5/lsn+ڕ~ڼy+#߬%4Ӽ_ 0]bv +endstream +endobj 428 0 obj << -/D [419 0 R /FitH 254.536] +/Type /Page +/Contents 429 0 R +/Resources 427 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 408 0 R +/Annots [ 426 0 R ] >> endobj -429 0 obj << -/D [419 0 R /FitH 240.987] +426 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.39) >> >> endobj 430 0 obj << -/D [419 0 R /FitH 227.438] +/D [428 0 R /FitH 778.724] >> endobj 431 0 obj << -/D [419 0 R /FitH 213.888] +/D [428 0 R /FitH 706.421] >> endobj 432 0 obj << -/D [419 0 R /FitH 200.339] +/D [428 0 R /FitH 707.667] >> endobj 433 0 obj << -/D [419 0 R /FitH 171.626] +/D [428 0 R /FitH 610.242] >> endobj -418 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R /F63 328 0 R >> -/ProcSet [ /PDF /Text ] +434 0 obj << +/D [428 0 R /FitH 609.236] +>> endobj +435 0 obj << +/D [428 0 R /FitH 595.686] >> endobj -437 0 obj << -/Length 1304 -/Filter /FlateDecode ->> -stream -xڵYr6+Z @3]4Fi&,/d 9E;^)C4./Υqp`9{yp@0X` "A$Lmp.?2_Pÿr sw,㭙> -;D!". RWvNDh*Z^\0$ 8 Sl)5SLV;o뛤n13E9m;%I}24x{ :ݚ*T=bDJ?$BK%AR"L;dQS{} Or^q2H"Wjփ N "L4BZ{򣹎VCRB6&ݣcg. @*x/D/˰ -a xxJr0IED:iebIR>*a'b t@:J<_!l/)n<1N67Bb&q^S;9H"!=8S=R$41yLWЬBf}{]^xIjK;N3zUEy֓"G,q -/w/\AZ_fb+s+jQG ňN?aljn[)K b^%b夅A>}Fl[B6&FY( MHG]ZyZ -a{g5ڍzPZHҼMP(.o;Rlr|.$$*W_f EBgBg!4٨?>ٜ\_^*nxky pE+Sk?⁸7e5O{}ߴv kd!sW -jW&IɌ7wsDj׮{Ełp/n)lѠ@@ₔ -endstream -endobj 436 0 obj << -/Type /Page -/Contents 437 0 R -/Resources 435 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 416 0 R -/Annots [ 434 0 R ] +/D [428 0 R /FitH 582.137] >> endobj -434 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +437 0 obj << +/D [428 0 R /FitH 568.588] >> endobj 438 0 obj << -/D [436 0 R /FitH 764.175] +/D [428 0 R /FitH 555.039] >> endobj 439 0 obj << -/D [436 0 R /FitH 719.97] +/D [428 0 R /FitH 541.49] >> endobj 440 0 obj << -/D [436 0 R /FitH 721.265] +/D [428 0 R /FitH 489.235] >> endobj 441 0 obj << -/D [436 0 R /FitH 707.716] +/D [428 0 R /FitH 490.481] >> endobj 442 0 obj << -/D [436 0 R /FitH 694.167] +/D [428 0 R /FitH 476.932] >> endobj -445 0 obj << -/D [436 0 R /FitH 608.039] +443 0 obj << +/D [428 0 R /FitH 463.383] >> endobj 446 0 obj << -/D [436 0 R /FitH 609.335] +/D [428 0 R /FitH 377.255] >> endobj -435 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R /F38 443 0 R /F15 444 0 R /F26 205 0 R /F27 203 0 R >> +447 0 obj << +/D [428 0 R /FitH 378.501] +>> endobj +427 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F4 275 0 R /F60 277 0 R /F61 278 0 R /F63 316 0 R /F38 444 0 R /F15 445 0 R /F26 197 0 R >> /ProcSet [ /PDF /Text ] >> endobj -450 0 obj << -/Length 1435 +451 0 obj << +/Length 1420 /Filter /FlateDecode >> stream -xڵ]s8+@I:iNM!pf/<l=ZغOz[Ě,-#y ,o9s93:ۙ^ltO>ZB1Hawn4։npJԵQ |P{yFu:m}e=Ekg( -|nWo߱k \ܹ3pl{sM#p |jP\6|!lѠ4Q@ׯ^x.殎M*^~tnd]Ƒ}Orn4 n)/ -g4䊳w0 kߘn[涻|&Qp`:lp4_NG}bO-t n$ IC@U򏢻2ͣy딲Z'QNu%TfOe%Uay sN]frN`bKezd/q I:dv\(d` ޒUk}}%$ӏf/Y.WUeOrRH#Y n0̘"xp 0Fte֟Wq ]xbhLsv5\EyK~?I]HӢ0 -DOY pjf_*vG!A a4N0dsk1 7@ė{4؉=k(%EAh*ST:]34VWp~ -G!9C&=Xx! p`X.$ UIY|-:]Y5!V5I;O" R&fBH9D* #ZwC(vAL3]H&#zL42"M9")B97O]?xtj33 '{Bp8a؅+ê/v!i0J\i-?QK.Y+GY=$+PG' |D\ZAe<tt!t_Mt!dO|h @@|haʵ.2Y4JKOm,۶YrNbQagzH\0!F4L-U&w&2y_!ӭC0k˩M'PPP7V TI¤R jNWtN1+oHe?)dWurGd G4ztDj"H8`x \Ds8Aډ ̊k'ƊY乁^6t%WzP(swBnyθHM3p<6T,ά.5KÅ62N-U5oMo_#' Gz;GMw__H"GgQ s}~zϷ|/BH+\ #Uri!]lW,!!Ya[<h[rȆg\Y6l'L>\w"r<9s}cqho/\]jK:Ucej ^MI-귭5O2BeW*:STJKݤᓺhΌEKieJ+#0Yda4Q&qu\[""⹋nl8-{^JkMt06~Ԟ1|W\CZV@WL_J&Mn6 QNFpE؈h ڽڈw..sBʵh ) ׋HCЫ-OO#h 2C)Thr٧^Jg#EQ@)6#?k$jɸre 3|L0, &EZ/D7Aك+D躬A)oQ7{6ź.A,BQbh~ +ўNXB1J@mMXƍХ''-R=4bi.jb$p0V @$U7 $AW} Zv<9 +;5j#;.HY@AP=~RH%E;E4BU%q:i\&I7F:'o&䆛!6s*F^[w's\Z*OnS78m\o`Ŗ.ctqΈ(^*e4Zi&UQEZ, { Mgy*s'"#poi&vPdЩ("RRF-?PԻ0/ endstream endobj -449 0 obj << +450 0 obj << /Type /Page -/Contents 450 0 R -/Resources 448 0 R +/Contents 451 0 R +/Resources 449 0 R /MediaBox [0 0 595.276 841.89] -/Parent 416 0 R -/Annots [ 447 0 R ] +/Parent 408 0 R +/Annots [ 448 0 R ] >> endobj -447 0 obj << +448 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> >> endobj -451 0 obj << -/D [449 0 R /FitH 764.175] +452 0 obj << +/D [450 0 R /FitH 778.724] >> endobj -371 0 obj << -/D [449 0 R /FitH 319.191] +46 0 obj << +/D [450 0 R /FitH 739.268] >> endobj -448 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R >> +50 0 obj << +/D [450 0 R /FitH 499.213] +>> endobj +54 0 obj << +/D [450 0 R /FitH 240.542] +>> endobj +449 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F41 266 0 R /F26 197 0 R >> /ProcSet [ /PDF /Text ] >> endobj -455 0 obj << -/Length 1721 +456 0 obj << +/Length 2578 /Filter /FlateDecode >> stream -xڭs6+3N߲F&%)K7&aWi8&=dl$yvW;vZ֧HcMQR:J2gusFn킰Cp{/fA Ha)$m?} -6봁"9#}AAXp #`6~Z t\f7n"p VÐV™Z`g}_@Ӯ\9\0$x~/Ľw5PaH"dWoE@L3 ?̕wHj_%kCDJ;RN¼;K}j1Oϋlӡg`K#X2W9C5$QI…EeI1RZ$b^_iZQ J|3t;gsC*a -VVx*\nIfβ s1ݬbLwT"2xT! J --^xް!ǵxmR-+cL&x5sKx5S 䇳lAO2(N)q:8}cs+aWğĸfql&ۡw99G5-^7Wp:N3iYWlқfwN7f:M @iyaNqa٫ a@T)0ǑllC%OK!Xf=1AԠ)ɇ>8dc*)P~R^FN@r d)^~ iEdI$φu(nqƝ!5 [PIꓪQD2 J# !6(@*49 1 I搒 $I.RGcopѿ>D҆ -IS$wQ.ǰllC% ^/ LFAұ7F'ERCԆQSA->p"ZWPrF1J%Xa{J{$m^Ӗ?մ-7i: + -vH?_NKuU1o?,/u{jUgn'gS)GVTw}HyLU~:X|I~_Q.Yhl[tD#-NJpći%p@ UG&M]r\ &%$X㾬f -2Ph74$6r!2@Bˊ&n(RFSk .p:yܗ]xW7 'U 2.%V.rY%TkV4)9*̃}\Zfg_VqL,hl|%ILN:0ޑq+X?&u&f0u:˅WwuYXlFc(uC Ny[lSzcnnSdBIj\ʬfP335FdګqC+*xM%r7$Mܐh݆X-vjL]h2,5i'+ -<]xixVuL3g1 fg4_J򓶆K @ck7& qߊ*y8M#`_MC&J -g 8#047To\%TM2 I vn믝3i>^W~F-|2W''sUw -ϷaU+0_ +xڵZ[o6~ϯУ$,)>i={EQbѶYJu7~E"%'<%j8q8P[{ػ⻟(F N"00F>McqO]^ /E#vy/|б()L N%a ^7yU>. %1[|5H|Qaz{i")n. p V PD[n/{<$$vȭ0X .qxm#@ȋQIdi34tmM|ŋ4K_L!%o\O.W6mUUˋ ŕ5yV?c|Rr:! keѵx°ܤul}1TrI[yn*3y7/;5rzZ? ` }m+^RԶڦ/gZmqVBxr K;KǬv'"mFeɋɪՃT +ʬm0y=V nFIjll6퍡-ˬ_p{0VSTj/85o)ˮnifNۊ *Vo6V%~sAx%xYxj&~ۆpg]n!_YQ` z7P6fUR:l@[nERW2;U6 QJbFe +PzTv( +DgW'!cⱈ E. F t'WO,"QY$o>^ ke#VL+s9^ `;rdR$dXCa@\`N>i-lz"3HzO%8 (3s$agxYgs>m ]3,!""2oaP?H!96/$,HcvH#cB? vYE< (gS)9oٸklIr=w&JA)ȏ->;'#Cv@i&ư DΤGVffvl$ItVfdeFf*30(qS_tbdž LD ٧g ʧӃ= o>u #d{3J()u) Wp%Y'U9nHr@ Vͩn + +9o"Dcئ]X*2: 9A9u#5k0DUq㏳~퇍fji?X uwwU+9M ]uP=zqe*)n|Y\Lz]dk>7|]]r~P +R'oۭ6r_ndiַ@\ Nwd%c0,`Uys_= +sv߱s[Idž+y,7}*2pCڢK[T՝g9HBb<5"4uupYM޴N?*ᵹJ+otZ#y@-ҭ=ɨs{';XN9Kv,W*OZBŹS}xg34sSV4VjET^樇>{m}%loힼ}%1bGGX ڰ[ +a̿ze4;:~8 ;`SvPUy"|!-಄0~.SJh]YmԻ{h ISo~94A!] +M/l76ؒ(ة_ JP%Z +0͖c,U;=+(${V#'N18o}s@|_0Fa\7fN"?lG!'L^> !F!/hFcBqzzHkd1ƙu5F endstream endobj -454 0 obj << +455 0 obj << /Type /Page -/Contents 455 0 R -/Resources 453 0 R +/Contents 456 0 R +/Resources 454 0 R /MediaBox [0 0 595.276 841.89] -/Parent 416 0 R -/Annots [ 452 0 R ] +/Parent 408 0 R +/Annots [ 453 0 R ] >> endobj -452 0 obj << +453 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> >> endobj -456 0 obj << -/D [454 0 R /FitH 764.175] +457 0 obj << +/D [455 0 R /FitH 778.724] >> endobj -390 0 obj << -/D [454 0 R /FitH 276.551] +58 0 obj << +/D [455 0 R /FitH 628.698] >> endobj -453 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R >> -/ProcSet [ /PDF /Text ] +458 0 obj << +/D [455 0 R /FitH 574.31] >> endobj -460 0 obj << -/Length 1357 -/Filter /FlateDecode ->> -stream -xWMw6ϯ`9s i7c]$9> Ld'$`ԛ.h@z>zꍏǮ:!FNH#N˫7=j.V.^U|y7P@}p{|YdEWz!:w}7";zFwDmj.׋.,!!!qgX9v;N@|Dp/~uyc !PD%c @Ӆ(DQ!sB"umyhgVE^pS#7 )ur@b;~Z8EVgBʪGGmRQ%OL=WS-ާɓG$ٜ2n&3_TB&+svaŠbÌm[& Iz44.Hh\"KG[yx^E԰t0D` j%T|53CS\̈́S)1 Mƴ+f؞8!" -/%' O;nνC!Ezdʎ'}rJX uH1leL/R 醛ߥ^YBfcYu lY0`+GS }sXq5~~0F?v3^0,O2 PIV{(tX"sg dBq5G7JV\ʪ/qV< MkH<TeEeT#sR\o췀MoD')t[\bqRgU[㜪mõjw -%p$( -&WЃɚ(R1e|Cxyu#B>PLZBcXmހ8pecYLU)vwM `%xr1ɝ&AQ@E1r7>ji_Y_W%>!]^lV0szV}&Kof/V>~)m(mIk վ* Rƒ4(P\F%&lwinE BZ15~4,?uʌe#BGw`v \/ڦ#<3kxmŶOP> endobj -457 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +460 0 obj << +/D [455 0 R /FitH 421.683] >> endobj 461 0 obj << -/D [459 0 R /FitH 764.175] ->> endobj -50 0 obj << -/D [459 0 R /FitH 739.268] +/D [455 0 R /FitH 422.929] >> endobj -54 0 obj << -/D [459 0 R /FitH 499.213] +462 0 obj << +/D [455 0 R /FitH 181.132] >> endobj -58 0 obj << -/D [459 0 R /FitH 274.415] +463 0 obj << +/D [455 0 R /FitH 182.231] >> endobj -458 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F26 205 0 R >> +454 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F26 197 0 R /F27 195 0 R /F4 275 0 R /F60 277 0 R /F61 278 0 R >> /ProcSet [ /PDF /Text ] >> endobj -465 0 obj << -/Length 2613 +467 0 obj << +/Length 2073 /Filter /FlateDecode >> stream -xڵZ[o~ϯУ,ItӶMM[EʒK}PHq D gÙ -{{'{{X{!F^#D{H?%exZT/juRq J!1EaNw [Bݠ_/O",%;) -#a -\~xin"Q2oOgǑwFRܻxe ftڍ=GL/,(%bdĈA]*Yy C$}'Q)Ze)3Is ^S;&28YW:X!F0V%9ot⺁x:/(4`f4@+(]bՅ$zS@dūK R'$ `jnƟ$LwEX {d )c7d )1~4ufav 49eB\R0NW[QeW,E]XxIU,mg `$K`#bbK>@QDx1[!GWzj M ؚ6\-}ءJ\z -ayZ%~Dd z`G<Ij`c 4.b. %hڪc_kNsxF4*kmAg=:rV U lT 03,{$N1`79"BàiDݸ4ymo45}%jHm8W"2!qu;_"gd 6 )][gC܌wK()2 ,Y~vn'Xګ"%;握  KO_f1kpՀI­*F(Ծ9ZȏMG&wa}yPr ElDNϩRHP&]T[ؒh_? q -y==Y2q0ؙ8B KXh -9v;fI#䰨3ɝlmaiJ{|c<<\f״L i! P|͛(Hc\R!.q?]\n̊ڧ)Qe6᫫AlE%f%(Z# : Je"wk_~Is -{(+W>$6֧!VnϋQ6ǎoLDxFM7#F]+6~^.yivœ;OleZ`sJB"SHj,ם4ZTm=>vWJv5\EͨA0zc^]mhs`#PfdN2wVlV3%G -ԧ6'Ҽ8EwRci3PnzC&Ί왚x2kWU99TE!*v3L]ܶ7 L]7|@!M]P}\%ES:[R;9pKG܇EC<瓂iAXV4㣶O -6p8]jUmͳF8*1Ke;g=Rl7[WA\x@iL +xYr6+BtdOFt:mCĖ"U>{AE),Ht{瀦6LիiPf@L⻮>Xowo,fNJ^L9)wu`[E׆I7|R6EY"tFm'.\e+I_~~w']]\sEꜱI1#^i=XxlFn ل9b1Y351,ئDj&<$@̰"bϪFQt8(]dDr]2nzTd:!vjڻr/orQ +DְX1!.c@DMIrM*JVVN 3<1Iď`Fǜ\Kx˒G9>3&(&6fd\Fyf~KGE0)U0{٦Sƶ:]=yA˟ޠő\/XǤڌeej'ez'm>˘YP`P&z8<~x0;*&%R ^& +1OyXJM- RG4B/+3gwq-fʋM8qJSQT>fi5*-Uw'i)Y4rģXaهs?ֈkq,./*PtEI%|]\Xy9y p+8vu5V`ᆷ! ,SV V06^&jd-#4+uIkLe4CX1n="J^>H|3ХW"uU6Bc" *\X{pċA;ƺ2 ۃ,rXG"~CQE:~%O f{$p}A~sǥQF3ƪvZU̡eΐW *jc4m\-d2^#fB&ePA꜌G,9ġB m465Ç|5q" X:1't 0C1 +f@i.tDŽ}ɓm Y(ȿE5[>* m̓h.f΋tAv0i]L`V WGrfQXμΔ^ ⅜T=u$Bcn}hx 9&@|.rcc0XQɳ_ZU{<`:K>';pKXթꭣ"8]yçvyY& \EGXq-#y AjGO$'<(X5B}s>\l;O6TgG)Xlq{LlJ1?>.+gM6gc1Fj[^3vfJ)WP%8;%907({1҇YT]ʾg K'愎e joUtD[m .ջ~46 PHӖwن&H1Y" @b ?F&{!; ߣ_]NܬGOuq$x(Ul+x*|kw(j M%bee+2V;0` `)Grfd ηb޼辉Yb̌_ķ$:VD]Ld*THrUTуHJ/[ܼ ÈOKQSN\Fk:3i endstream endobj -464 0 obj << +466 0 obj << /Type /Page -/Contents 465 0 R -/Resources 463 0 R +/Contents 467 0 R +/Resources 465 0 R /MediaBox [0 0 595.276 841.89] /Parent 473 0 R -/Annots [ 462 0 R ] +/Annots [ 464 0 R ] >> endobj -462 0 obj << +464 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> >> endobj -466 0 obj << -/D [464 0 R /FitH 764.175] +468 0 obj << +/D [466 0 R /FitH 778.724] >> endobj 62 0 obj << -/D [464 0 R /FitH 669.345] ->> endobj -467 0 obj << -/D [464 0 R /FitH 614.958] ->> endobj -468 0 obj << -/D [464 0 R /FitH 616.254] +/D [466 0 R /FitH 622.038] >> endobj 469 0 obj << -/D [464 0 R /FitH 462.38] +/D [466 0 R /FitH 540.934] >> endobj 470 0 obj << -/D [464 0 R /FitH 463.676] +/D [466 0 R /FitH 542.033] +>> endobj +66 0 obj << +/D [466 0 R /FitH 351.433] >> endobj 471 0 obj << -/D [464 0 R /FitH 221.879] +/D [466 0 R /FitH 283.73] >> endobj 472 0 obj << -/D [464 0 R /FitH 223.028] +/D [466 0 R /FitH 284.976] >> endobj -463 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R >> +70 0 obj << +/D [466 0 R /FitH 211.798] +>> endobj +465 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F4 275 0 R /F60 277 0 R /F61 278 0 R >> /ProcSet [ /PDF /Text ] >> endobj 477 0 obj << -/Length 2108 +/Length 2106 /Filter /FlateDecode >> stream -xڵYYs~U0HT<˻Nv2V -"!YTxq(l _7vp~qQ#,VNQNHn>2RoT|[LJ&Mŏ@R!E&-OꃯnEYE^PO%!$Z I7F+aN4[ (`N$0#PpynWny̙˒Sr4DC⎆l>WV|y4ϐz0M^ -):j?'Yiq JO*Ӡ˚F(tuz |0G55_-@Z=j |?2痧'$WÎ! -"L)zONn`Ī8sUճUZ7\~]]܏RoEORn}Zw7]+#Yky1F !(4 /yl-wM=#@x\F3 , ^&.̤W'Xݒ_Bd}M~ v4於'IyVa1Fqix70Q ij e =l=FSۢ4&mҚ/3EFqȆ#R l̗YpBS ~pᏘн<Ծ8,2PO#;dN)U'2~X' 9rȇ n;A+X+Y&l0Fj]`` ~S,b=}u\ҙG_B4>ecͨ<o6A"v]NL 42?BiZ ->J:/2O>VI70aB&QƇ@{ ?e@̼DX@SJk^to׍-cPG٫`eO"m*4$6x*aW mяzzA0 -ѬPD^?wUQ yuӲ(AK%O"& ɓZD\6Zz ZE.h[=+ExRd q2)Zp>(X0EEIoZ^Q 8uSndu|eVS xw"NmAvA?K=b -)Bz7 B ;29 ԸK:9g͋ym6RUeiUf^ԙ<1~ēZU~[i1l.V_tZcBn!/c -]xge ;荛 ?DFTJyvKbegؚJܪޙ~0-^Ake#qzu>wzj=hA~KS=ï* b֝L6nCiu O(ן|;a4C?4>- +x͚s6WѺPx96W+鴝 %A64#PRlI=$H`X=xwwfq[{Gbo$zoI_*T>uaUZX)-1NAI-̄/3\ Hb\Ϣe`|#ȯן@6 8k+ `Bx5<{h(zxWi1o=E'qQlc>*M|C=Y留,TVv&ϞlN﬇V*/~)ⲊJyXZU2Q]]\H`!jhjGv(X>TOf؟:++JKoTVz:~2c;hkζfE,Zy"I:(ho DsAlFBxw0bM'B^?TOC _~_n#9?"y^r<:n}1 +0 e۴G 8߽#uGy! +9Sj)T?zG#?8Kőd<򲿛:|(hS:: 2 H`Z39E6V(Z#@o "ъT։Tx(e'nI +eX=OSּo>L6JɰQR]ҢlΞhM*_hbi܌z؊CH!9 p.R% ` +*Er*^z|*z"dz&o >Ot\L|0-_p3~-GxM`r9(p_´&[XYȻ-I|:;)NvN# 'Xyڮe4XwOxѧyie>~~|Z,?[ HzؚgC/% ,U3} v}31 endstream endobj 476 0 obj << @@ -1732,323 +1768,335 @@ >> endobj 474 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> >> endobj 478 0 obj << -/D [476 0 R /FitH 764.175] ->> endobj -66 0 obj << -/D [476 0 R /FitH 664.93] +/D [476 0 R /FitH 778.724] >> endobj 479 0 obj << -/D [476 0 R /FitH 581.554] +/D [476 0 R /FitH 692.871] >> endobj 480 0 obj << -/D [476 0 R /FitH 582.703] +/D [476 0 R /FitH 694.117] >> endobj -70 0 obj << -/D [476 0 R /FitH 392.076] +74 0 obj << +/D [476 0 R /FitH 603.56] +>> endobj +78 0 obj << +/D [476 0 R /FitH 531.284] >> endobj 481 0 obj << -/D [476 0 R /FitH 324.355] +/D [476 0 R /FitH 476.896] >> endobj 482 0 obj << -/D [476 0 R /FitH 325.651] +/D [476 0 R /FitH 478.142] >> endobj -74 0 obj << -/D [476 0 R /FitH 252.445] +483 0 obj << +/D [476 0 R /FitH 392.162] +>> endobj +484 0 obj << +/D [476 0 R /FitH 393.261] +>> endobj +82 0 obj << +/D [476 0 R /FitH 270.058] +>> endobj +485 0 obj << +/D [476 0 R /FitH 215.67] +>> endobj +486 0 obj << +/D [476 0 R /FitH 216.916] >> endobj 475 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R >> +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F4 275 0 R /F61 278 0 R /F60 277 0 R >> /ProcSet [ /PDF /Text ] >> endobj -486 0 obj << -/Length 2051 +490 0 obj << +/Length 2140 /Filter /FlateDecode >> stream -xڵ[s۶+hPIOI8MڜHNd( 9D⸿,H7A,Q]ޝ닗^3BovRz e7[z]^}hLlDe^^o={RX[ - ) oTY몁"9Fq^ݩ"҂/0F֭ 㪟1i2zAja(X]7{,{<.\+xӋ$O#voF HpG\$`@xnm`@xCY^BI,sQMgґNBOs5> -C5*7Ӽp#_jž7Ntm׭ 'CGui^ibi;ZT$%qE;5y>hXXb\/Oݗ&U+N~y54xr+SBHlZ;Th&TFHosϘ ' _>Uie1OU)/ԪzG9sғvqTOшdV꯺QqyFb^?^x]Ve(tUOYzE+43fZNfmm+L^F$'e~'si0R+ ؾ1ŽQ r.6+6o*T5sMR\F)fHOZdkG1. ,t#~(ߥ|~.cH͒fcWSuʷ4qF._/zԲyFIZ'ePZnb5S>6E@\!u H~D汖?e`$FhR[쭒նЫzWQV3hkUF9]zU|d"szAdSrIX;2{Iy״V}fL- <Nje{z']**Q8agTe35A0$q&:tO -=QE -|ICFԕ<0 v-v#:c"дA c2B\W5.)g ?g6 Z`P bh@Ѧ7aev@1:; $%(v զ~d̔x~\l0M ?̖w:U Kn;"u}$W6nr.5Xl"]*BvE릙ڢ"vj񳳨PΣ{!lJA Y@ A@Y0L7 DC}`0@-3PO t- 1w@4"ȲV1U:h,%᠕-RP=;Hg9Y37Tי͕>ou/s6W%i!g:5ܰ]c?*6P;޻?>N'_^{߿|~yպsvpsY}a黛WN3v6>=, G6w83Uluː&өeD[ \ _WQ微'of<ýJyJ0|Kǭ1xd|N:@}DIHdÑQ޿GZV"jUԾuݾL)ˋ\7r<=|~+I*ʺƔsS3M~.բhٻqU$AOAa{Bj!|un:z~@cZI*Ggͯ}r)rF~H?gm +xڵZYs6~5c @[utLaSTyD.ʖD?x$Q^ZZȺx=7,! +kh<$o_&SL]Mlm'ĶPxVl1q%+$lC^~EK&p_ d{QW՝7 btz~ob>닿!+ށֶY\JlrSkv'"DLMP'B<|>qˏ>.兌o]"jE L +Ud몂xA|P6ISaB:|篈*YDu$^<NJ\'3KkQV+y(Xɳ8ɖJDsi}[&] +z6Xwq5o+ZVl?_ͮ#s׹C# +եT}CM^CB?|cRV!|r⣴̟E6}cwOPXUgU\BXV&;p|*?ah!V{ɔ$HdzHP2ދd2sf^ $G~/²^ w6}_23ˊe8n^8e[T>@NJO$NBTb06qCI{@va4 :CȨVQ}ҋ}V?v# bJ75dq$rU/mhz${#C^sc<9xAU^-F#qp* .Vwh"etbX]| +󓒍y1Nպ!٢dS{{zp$L7XDY?::EzGFl:BUGp(N~aP( ΀ssl hq@Y{Xصk' G] =ֵ]"7^=_#R}(ޞVXC,|!:Ԡ<8iz|EJQ?#H:#8/ +@@3ectY 2=S7NHBG"U%4ÛCN6YR'~Ô|hqzU-n#J=VXu ִTjT.! R [trEN&|%ݯ']'|hGm3D/=Y0' l}b= `Ri؆s~z_: $/d"B;~vQUk-K0\]5Y/'*_ N; LMEV l`Th$٢dOb&J>s**b1-4+մ[Ӻ2z,jٳҸ(X'qp2MρLRoix9Naj zA}cO\S(O/B0m쏚H>}r'j=raC +\g$~ ƥ]/`E鲆vV!ԙj/FMuQƞ ʨD9fG3Q%4xDPD/ $Kw踞=QOTrbeS}mRo&³\hF|1AvK#OG\ȧmD pJ endstream endobj -485 0 obj << +489 0 obj << /Type /Page -/Contents 486 0 R -/Resources 484 0 R +/Contents 490 0 R +/Resources 488 0 R /MediaBox [0 0 595.276 841.89] /Parent 473 0 R -/Annots [ 483 0 R ] +/Annots [ 487 0 R ] >> endobj -483 0 obj << +487 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> ->> endobj -487 0 obj << -/D [485 0 R /FitH 764.175] ->> endobj -488 0 obj << -/D [485 0 R /FitH 739.268] ->> endobj -489 0 obj << -/D [485 0 R /FitH 732.374] ->> endobj -78 0 obj << -/D [485 0 R /FitH 641.817] ->> endobj -82 0 obj << -/D [485 0 R /FitH 569.54] ->> endobj -490 0 obj << -/D [485 0 R /FitH 515.153] +/A << /S /GoTo /D (page.39) >> >> endobj 491 0 obj << -/D [485 0 R /FitH 516.448] +/D [489 0 R /FitH 778.724] >> endobj 492 0 obj << -/D [485 0 R /FitH 437.243] +/D [489 0 R /FitH 523.654] >> endobj 493 0 obj << -/D [485 0 R /FitH 438.391] +/D [489 0 R /FitH 524.752] >> endobj 86 0 obj << -/D [485 0 R /FitH 362.61] +/D [489 0 R /FitH 421.873] >> endobj 494 0 obj << -/D [485 0 R /FitH 308.223] +/D [489 0 R /FitH 340.388] >> endobj 495 0 obj << -/D [485 0 R /FitH 309.519] +/D [489 0 R /FitH 341.633] >> endobj -484 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F4 288 0 R /F61 291 0 R /F27 203 0 R /F60 290 0 R >> +496 0 obj << +/D [489 0 R /FitH 228.555] +>> endobj +497 0 obj << +/D [489 0 R /FitH 229.653] +>> endobj +488 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F4 275 0 R /F60 277 0 R /F61 278 0 R >> /ProcSet [ /PDF /Text ] >> endobj -499 0 obj << -/Length 2018 +502 0 obj << +/Length 2194 /Filter /FlateDecode >> stream -xڵs8+3EՇ%۽z~\ i; m+K2c!0jwvfv{ƽvF3:F'|DY#[`H9e2u U"W0PRxi@x_Y`Hy,I^+=.R]י-]{]m7Pqg}>$w6ʥr ^8ޟ8!!#l(j'd-= (i=6b'Ե:%-rQ4{!=KRr%2*~9|_??}]|z7ۿ|!-n\fHhc/5y7 d`8k.&Q2&2kbneLڪܓyJ{\2^.evoJ>_"^-ռWlNceRjf6) "_MS`wRL+eg-Lyla{P s(Ȃ -;^) =0#3z3Ѿ}&buwt Ё|Z. ߳̉dds"fs &OY;]Vy|OIR!Hu-bOk|RP,b/`)98J+yQqH斏YpmPk.!8rHJih (> m؝.k7|0lZi1c r1}1Hȡ Cm M]ـz1>FS:JwRRԧhfze{eOMb@#C5O}OfɎC]wT%f[Mdf[ d6WdyIY HMT8A.Q(KQ" I)jj=|H f9AQS14$wK>0J;]&B>/Iij_ )P^~9fa׻D jJ% Pt3mj=_lL曌ob*'yfJ28oC+-AN0^ա݂8 +xڵZYs6~Ue!8y$O3dk{$DBB +IEix˒` ٍuCyrss~zQLﺎFΗ˛?g4_>q>"?ld~~)-qJFD\y!"o4&N] S/0rpê[o.@6 IӋ?/c +ζspj3W!D=AQ1!`/!#>VKm*|Y>vCBo^gE!gSfR%e,;t^Zg$^8ԛ=]>x+%HpY@Cd{$wUłDʵ~ث +u';_:;J85P{_XA9 Qk}b$2$qodAqUEKҽAz:4'Yj~.d5U0~~n ?2l t,Ujov =gQ".* !\%IU@/4rO$*ʀp^r~p 8GQETIт7WHy:=WR?ש>AleJ<4QYЕd\Gul+LM[$OjF~,%JUV%WEXn^j>7Ȫo' fQC碔?jzS0L5:bͺ- +F) m}FAL@STˆpj–stbo&Btژk5d*z+(\Yj)@Q#,D׉i"PjyyS +UwuU~=Zj0oGl4@ИcM(Y\UْPx͓8 !![:&p~Xp"E "\p߅( ݬ#l3 E %ɳ;{wÙLd)[?A慉~٣i<"̟6Dq+ƃp  2v5ŀ=A#Cj<Ń \JVa3N{86wU|`ֲ/Arx99ȗ F|=rzd0;#$2&xMgpUC'_ sb2|ۑPI<*T]IdG s߳!YLUNUUBmё.R 2Y3!ۖ]'g"5ԬkX7 H+H !-"˲+cr"8<(oﮆԞkwhδj ٿ) s8_7.exL@T0za̓'ן#7`Az xi <ݞ`<5Zẋq:DZ2?( < Ot5@{z׶g:V= j̞`00 +^xCs\(|!{= _W{N&ire<6Y)͑<۳֧ft2sBxF]m4iSQyjžcu"L]*@\ZzwwVk4iYa͢" zYV9,-zCeI OF-J'Py'GoS˫0EWCMԵȀ2PL +&LZU?nh6ۤQ'lxѶ3[aqj ر + ke endstream endobj -498 0 obj << +501 0 obj << /Type /Page -/Contents 499 0 R -/Resources 497 0 R +/Contents 502 0 R +/Resources 500 0 R /MediaBox [0 0 595.276 841.89] /Parent 473 0 R -/Annots [ 496 0 R ] +/Annots [ 499 0 R 498 0 R ] >> endobj -496 0 obj << +499 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> >> endobj -500 0 obj << -/D [498 0 R /FitH 764.175] ->> endobj -501 0 obj << -/D [498 0 R /FitH 619.039] +498 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [336.714 426.898 343.19 440.615] +/A << /S /GoTo /D (Hfootnote.3) >> >> endobj -502 0 obj << -/D [498 0 R /FitH 620.188] +503 0 obj << +/D [501 0 R /FitH 778.724] >> endobj 90 0 obj << -/D [498 0 R /FitH 518.116] ->> endobj -503 0 obj << -/D [498 0 R /FitH 450.868] +/D [501 0 R /FitH 739.268] >> endobj 504 0 obj << -/D [498 0 R /FitH 452.017] +/D [501 0 R /FitH 692.282] >> endobj 505 0 obj << -/D [498 0 R /FitH 353.57] +/D [501 0 R /FitH 693.528] >> endobj 506 0 obj << -/D [498 0 R /FitH 354.718] ->> endobj -94 0 obj << -/D [498 0 R /FitH 268.449] +/D [501 0 R /FitH 647.251] >> endobj 507 0 obj << -/D [498 0 R /FitH 212.35] +/D [501 0 R /FitH 629.18] >> endobj 508 0 obj << -/D [498 0 R /FitH 213.646] +/D [501 0 R /FitH 606.604] >> endobj 509 0 obj << -/D [498 0 R /FitH 167.91] +/D [501 0 R /FitH 559.978] >> endobj -497 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R >> +510 0 obj << +/D [501 0 R /FitH 561.224] +>> endobj +94 0 obj << +/D [501 0 R /FitH 486.469] +>> endobj +98 0 obj << +/D [501 0 R /FitH 384.841] +>> endobj +511 0 obj << +/D [501 0 R /FitH 317.052] +>> endobj +512 0 obj << +/D [501 0 R /FitH 318.151] +>> endobj +513 0 obj << +/D [501 0 R /FitH 163.389] +>> endobj +500 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F4 275 0 R /F61 278 0 R /F60 277 0 R >> /ProcSet [ /PDF /Text ] >> endobj -514 0 obj << -/Length 2263 +517 0 obj << +/Length 2350 /Filter /FlateDecode >> stream -xZ[s~Ա OgIֵI;-RTyV= G>xL~@=yػx?(f HIR!oy_&7?~ezE<q>%xR4?o$>֗Bd0I-?DLHA^FgS< ;-#a7%].sAV_ C/o؋'mk  -vR5*fObEe/Wl.j^E7Ikç*ô]fGN1MM(R1NX -`J)ocN~ʪ-ˣ$ ˸U/'iV6dhS.IM2eN⺧]~%I/GjD"(90[O: Wΰۤ\Z -\:7wo61aygH)K$AHA*屷G_*(veqϽJm"ڨUOJ$&GA f/50/? :9Ft@>׷AWPqd Zj ($|YudB8lR *+xz%P4a%CMJPH) ܕ+ d0NN*>C^Q ->UwMF@a*OkT/([ؓ,~nlw}?i_]TU1c#jEq3P%&FJ\7b\bоyrĸ0p^;Z+dG#cJW IDK:Z/`jaZ2lu.&ۅ,I}ɷ3O[Z&L#saY*2'ZW'תRƠRg ĕ6(儀jL,|qai8Ƽ_h (l~HWzh5L{<&qzy8[iY\X01y?%G1cnQz-iYbʼ90 'Bџ~nWpEO;XZɆYmۅ[hYgq'| -h&MYFh^M2fGR>$ya"Ʈ?٢49(|7\CqNY%Xt $ªt.CDY8d(B6;e4&)8hJmW?n/yvk ;27ys& Π -Fd Z$Gr)Fg2N@\Ћ^c(x\1҆0ඳE5õWaݘ1- -*QԮ:jS3$}9I%鞩^$jSWŽ*[ڈoR@ɘLI<*#6ksRgӼ ^8;[}o|y !depui6<[P bU5fr(|) 2I:MIE.͚ibƑCetOs7n$E|H Q(H8p7=鏅/{=/\tr*-{^VTNۖ?qYpDí^5(r'uZޙf=NK^0JA <,e5Ϫpؠ,L~VUi]>c<6œ{Gyj)MY?In +xڵZr۶}WQ:cHSz$3McwL,1H_ B][Hn+ww}b 18B!8JS'yIb-HRHLQ})aQVi I&d! _a=pW֝@IW_ +V(7[]}9\{ 8;W^|p_j5G]X{(@`xVQTu:lYUZK<"J4“B=R/SfM+_,z}.d̔FFi[ <2q[dOwZnJajȔG36WG21lōsEŐE8A) ~[)AY$ˈOK :8lJGygw[2H8[G:D4wb= CBC|A0v\? Ȕp}`BpV 8Db6Od&BxLaj N#rc3s >|'v9DzH[+SV$nQGqp:ð0A:UMJa__SER. MB~wWz{Ns +w:)`c9CXws*m J3 wdY6ZY +.LgBk{Re*OSQ A5E|QkX `GaJ Sc[RgcRo5T[n|[|"zz"!Ǡ)+pו[%Zդ,J=;:|U]b 2sj+T4՛$S!\t[՞oϳ(6YŔYj1|Vl2G=w&Vn> [~/lm52/Qyarn^iⳬ'oDUmI)Z- +h>i_YbV˰j?SXBi$n%9gCTuτT%``X ˆ;pce>yYEu.>􇾣)%}z1+h6%L|/謘;9g:3chx9bؑ f-Y$ F釣lIO6 6C3 L B 81\|Іr]Y?nO?p^ [fj#g8ϐux:<1y +>7ώtd>9w͍\|,z04.rI8[& ;Ny,fCh.QsKxIG냑Ks|rŧ(M*@F 99g9BC(!եhB蘻 =uޟ jdǡ:#-20-"/rAJb>9B>!ĺڧwY5~"p1DHdrB!pr4 ]L%x,D:Phy|94%1?JË=r V.4.ho|tԠ@}XqMpWlRʥ~p5-C'.qZKlX-ñm?PX'[h۬ endstream endobj -513 0 obj << +516 0 obj << /Type /Page -/Contents 514 0 R -/Resources 512 0 R +/Contents 517 0 R +/Resources 515 0 R /MediaBox [0 0 595.276 841.89] /Parent 473 0 R -/Annots [ 511 0 R 510 0 R ] +/Annots [ 514 0 R ] >> endobj -511 0 obj << +514 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] /Subtype /Link -/A << /S /GoTo /D (page.40) >> ->> endobj -510 0 obj << -/Type /Annot /Border[0 0 0]/H/N/C[1 0 0] -/Rect [339.147 546.291 345.623 560.008] -/Subtype /Link -/A << /S /GoTo /D (Hfootnote.3) >> ->> endobj -515 0 obj << -/D [513 0 R /FitH 764.175] ->> endobj -516 0 obj << -/D [513 0 R /FitH 739.268] ->> endobj -517 0 obj << -/D [513 0 R /FitH 725.947] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.39) >> >> endobj 518 0 obj << -/D [513 0 R /FitH 679.322] ->> endobj -519 0 obj << -/D [513 0 R /FitH 680.618] ->> endobj -98 0 obj << -/D [513 0 R /FitH 605.863] +/D [516 0 R /FitH 778.724] >> endobj 102 0 obj << -/D [513 0 R /FitH 504.235] +/D [516 0 R /FitH 739.268] +>> endobj +519 0 obj << +/D [516 0 R /FitH 692.282] >> endobj 520 0 obj << -/D [513 0 R /FitH 436.446] +/D [516 0 R /FitH 693.528] >> endobj 521 0 obj << -/D [513 0 R /FitH 437.594] ->> endobj -106 0 obj << -/D [513 0 R /FitH 307.616] +/D [516 0 R /FitH 555.457] >> endobj 522 0 obj << -/D [513 0 R /FitH 253.229] +/D [516 0 R /FitH 554.45] >> endobj 523 0 obj << -/D [513 0 R /FitH 254.525] +/D [516 0 R /FitH 540.901] >> endobj 524 0 obj << -/D [513 0 R /FitH 174.284] +/D [516 0 R /FitH 527.351] >> endobj -512 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F4 288 0 R /F61 291 0 R /F60 290 0 R >> +106 0 obj << +/D [516 0 R /FitH 377.05] +>> endobj +525 0 obj << +/D [516 0 R /FitH 309.114] +>> endobj +526 0 obj << +/D [516 0 R /FitH 310.36] +>> endobj +527 0 obj << +/D [516 0 R /FitH 296.81] +>> endobj +515 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F4 275 0 R /F60 277 0 R /F61 278 0 R >> /ProcSet [ /PDF /Text ] >> endobj -528 0 obj << -/Length 1989 +531 0 obj << +/Length 1746 /Filter /FlateDecode >> stream -xڵZ[s۶~tBӧxv>;m&th PK_qAӮ a746.~=mQܮX 1aܮ˟6_PgֲUH$$1]gF$Na$pWԽgͰgtq{Ka3!J",g?`Ϯ!L࡛ gJ<9 -4DcbJ6mUչ>[e+}yg诹O >űU_nӯS4aN,TMGV4e/v++snEamZV񂅲9\(<#O6fY\r(Hoݚ,eEݤR*Q5HŘYFve5`\QiUۗnV?s^(V K{bטl.9CVlAt2-|jk$PF F@q~E5Aϣ? -?aƋ Jݭ jEݦB_͌;&-iD,OD#w(ۤqNb?S tO;]أ'9ᷛtNMSxHǹj'vv1Ni0L&_?\%uj8b@^ݏ?65j3蹗AUUPWGzR(a "tO4e`U?;$J #`aa~nd%#PVyWS[>C3˭,=[W.19bxQ0G̴ҽ~:Nݗd IU==}bvi(ۃb\!%03N<2K-ϳ"A;A*5r -s0E;ղb]V۴ql+\Ǫƈ, ]r<co5娷V)1/:yDb6FQ V{.iUrWڙ6MvL8Vdvl}X M7sXhrݥi`+mb(u.'VMľwr>x,+"GyȺA-Ui本NjZ;k eMۋp_GO7j:,]ȏ:e1tпyND:7R=J8*7@"2y -q{u)6 8XUAjX4Rg,O+_.+z) ˈXJrT$D{՗*RQlSM}Z!'PHݫbaΦ"T 0:*.D@7~nQ@ ]|]_͖2RjCV_/$O K!Ew^Wj akYI(7[Wݻ ˆ;G_?_@uڤ?wV>sl;vbx $pn11S8uWXqP8S68)ϏaـkzՙHC{`g8bB $K]L˺H:R \RɊQOaYIv3S_%:m-mB}ȋ e[MvFMz~8fmUo@M ˰eods+V,&In##64K<~Dq@BB2( D+jUq m4SFߕ`:ipqLa!:GYizȥqrD0WM0 Jsa>y i=`STFMDԦah!*JFI.dd27jxIMd\ ]9ܛϼ[s72YX*UDFZ|7L\ͱҦ >¥Vwk o%ˢj2⢽1&dod#@zh V. .v cf7&<ʰ1.ǂ:#9 p)o/Yn8^bZ,LefgW$GEr4 bۤ9μo؂(c/dc0| Nlxk#@SggxHPUw2:Ps*GYY%A"9 +8k8&T iV/Un 9ޡ(Sgb+WD}߸*c^i'~>g&VAYíe'qeɗX+pD{dcp9|  {~I$N-f,R/oB ('C!^BS٤1*B_o*sPbYJ[͆Ljlmc9YQjD%껺ٌVVmRM`n:6Crh +8="|#m7a֡1tBc6d63MRs +p7kz-kPl^%˳vk`O# &K >Т$*W4r]B;˫YP 8ưSCdgmMQ)dxG8x4Њ@u}/g*N,6iW35^tGϮ6c/a=%.hnKelj݀ c d崐" |>XJু٩/$TP$<~zb9JbIˉNK, /0ა?1OOj:1~ Ť>4u}~RmOiP 4m= \u*euN,ɨ4l/ 9gWDj̮zufq'W_(zZ3֫xPm=ZL%mh<8m4[J.& +;%65-h{ٿEIqAʛŋ +>z7 endstream endobj -527 0 obj << +530 0 obj << /Type /Page -/Contents 528 0 R -/Resources 526 0 R +/Contents 531 0 R +/Resources 529 0 R /MediaBox [0 0 595.276 841.89] /Parent 473 0 R -/Annots [ 525 0 R ] +/Annots [ 528 0 R ] >> endobj -525 0 obj << +528 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> ->> endobj -529 0 obj << -/D [527 0 R /FitH 764.175] +/A << /S /GoTo /D (page.39) >> >> endobj -530 0 obj << -/D [527 0 R /FitH 674.8] +532 0 obj << +/D [530 0 R /FitH 778.724] >> endobj -531 0 obj << -/D [527 0 R /FitH 673.843] +110 0 obj << +/D [530 0 R /FitH 739.268] >> endobj -532 0 obj << -/D [527 0 R /FitH 660.294] +114 0 obj << +/D [530 0 R /FitH 545.345] >> endobj 533 0 obj << -/D [527 0 R /FitH 646.745] ->> endobj -110 0 obj << -/D [527 0 R /FitH 496.444] +/D [530 0 R /FitH 397.792] >> endobj 534 0 obj << -/D [527 0 R /FitH 428.507] +/D [530 0 R /FitH 398.891] >> endobj 535 0 obj << -/D [527 0 R /FitH 429.803] +/D [530 0 R /FitH 299.214] >> endobj 536 0 obj << -/D [527 0 R /FitH 416.254] +/D [530 0 R /FitH 300.46] >> endobj -526 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R /F27 203 0 R >> +118 0 obj << +/D [530 0 R /FitH 237.001] +>> endobj +529 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F38 444 0 R /F4 275 0 R /F60 277 0 R /F61 278 0 R /F15 445 0 R >> /ProcSet [ /PDF /Text ] >> endobj 540 0 obj << -/Length 1768 +/Length 1070 /Filter /FlateDecode >> stream -xڵXr8+x,mxVjI4 Ip.q$]>LICox9عX|,>|vC0O0B8oˋ?ZS_+U^VNj& CSĄ t\]/ZTeYEb&.|yh #`i,[xθo?o_s׭L]Ykp,p]PXP>`I{AQCh:y-} Mg%h#|Z Cb9 ?PVa؁7ZWdoiI(}b'SѨFN  (9w%ܦ {ݬz']c)9PWUlʸi9(C3Ʀi9=,'r͓Ŗ͍V}l51P:I%@R O6}"W HWO+'ȧՕ`т֕TBAg٪rf ߢ0'Z -7·f׉]_0DaeqvM7Ψ$ءq&fgcKgҜyDcxh9Aq ֌@|3ǧz(U<6&OUkDYd̙FOr.C0&TQN'W_gz۫2Λj23%`nYM JKکy<sa`7'\LوcHÎdZA@t2'I;7ף~=wp>c +xڭWK6W(kHJ:AhPۮm 5CVZ0E| "vvcH%8! E=D1 _&HYfMImgj} P) +M2'=/wTy] 4y{ALN=yvab\HWLH] }0ѹ,!@?8 ?ݏ~$%cpbx2\R,h},P>$ +&ѧ'Iڐa}L.2,aʩ` rbcv&arI4#D dH3g@ČO(c}{rT/%)q̜& e Vf'{ݦr*󠝞@PCĖVUݕ㘻Г}xفBrpE@ }-uߴmܦ'*@7?e^eW`Kk~HQ. [U(Tx9MNn-XJAFՕJ{I7l4$/4ԗOp ~F|kUwX΋ GYӨkQyeW +Oϵo(YIRtz∂A/=? endstream endobj 539 0 obj << @@ -2056,251 +2104,239 @@ /Contents 540 0 R /Resources 538 0 R /MediaBox [0 0 595.276 841.89] -/Parent 546 0 R +/Parent 544 0 R /Annots [ 537 0 R ] >> endobj 537 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> >> endobj 541 0 obj << -/D [539 0 R /FitH 764.175] ->> endobj -114 0 obj << -/D [539 0 R /FitH 739.268] ->> endobj -118 0 obj << -/D [539 0 R /FitH 545.345] +/D [539 0 R /FitH 778.724] >> endobj 542 0 obj << -/D [539 0 R /FitH 397.792] +/D [539 0 R /FitH 739.268] >> endobj 543 0 obj << -/D [539 0 R /FitH 398.941] ->> endobj -544 0 obj << -/D [539 0 R /FitH 299.264] ->> endobj -545 0 obj << -/D [539 0 R /FitH 300.56] ->> endobj -122 0 obj << -/D [539 0 R /FitH 237.101] +/D [539 0 R /FitH 732.374] >> endobj 538 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F38 443 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R /F15 444 0 R >> +/Font << /F30 196 0 R /F33 204 0 R /F4 275 0 R /F60 277 0 R /F61 278 0 R /F27 195 0 R /F15 445 0 R /F26 197 0 R /F38 444 0 R >> /ProcSet [ /PDF /Text ] >> endobj -550 0 obj << -/Length 1068 +548 0 obj << +/Length 1956 /Filter /FlateDecode >> stream -xڭWMs6W(X xl:Nǭ!Ɂ!~i 4}ooAśwA$mv(&XIb0Ч>L%Ko<ӫ/Qh08~}bו`X4J,t /`5p߷ ~,YPXBT`"mŧ/e= DB޲D\DXp{/ $dhp~gORb!S8"dX{%P!B(O7>%8LF .\>D^%,?CSb$+i3bq,w"GJflG%c6B=L/c}C ( H۳zIʫݎ*cgI:By/vBg"7B`CArM]$!PtYW@-/({IDaw|/@6,&^ͼ "A}9qrUM5Ζ(kV,iQ>6:܋v{ƪʣk2GLgi{FΚ-SjJ]~LO4)щMscPtȷPD8ٵ;z#֭UfjeAW-'nT񋊻vDcXuvs3 ڧ Vԥ'{Ӧ* APC)7Uӕ:ثГ{A;?Vi;@^W=n~ʼˮxyosK~H>|z2.oBc*F'Lw>EOk%= R$suku5MI*"E$TX -K!+m"5CJ-Xm* bxȚp]_D>5.XژAFՅJ{Il4$/5`4Of?!|)htŹ6i3Nۮ+K@RmCCҎ3G(N< +xڵXYs6~ׯԉP9mnL ^!%ʱ!1Eo٫ {[(0ezίo^XRkY-1_A +K!1E~-ve6 |.:)rp$D|~J hzYlY~Z>GBpcQ6V=0]> +P#%"a|k֋? *+$з-0]Sԍk)V>@1Pz>";`aZ,)b&|- 2M6>XJ}.x&rqSRVrD#-~Gk֊)iMXoI| nlNy@4jtoJu)*o $ Z,QNLS9HgE_UfUmtJ>_D`co]vg 0POǤrڀb_l膭1BlG~05GK"k~>Wi\0jjA?՚1Eq|ؔ 9r!QU8w~Tf?")D:mu9||'ї(MY +mrMfnP c(I|1Q7|?2y*CY{ ƞ9nO,{a;S88;2!BTq 5Lrz& _8IOf˿ +ϗL5, ϩfn/ $9qr*v} 7QMR񝮒й{ ā,F4lGKž6J.90?@́ .s`gρS`tr5jQ!G6b[J+P t1I7*/t/[mM!wrVBkI4?GG&J9eP(cGX6B%YQΎ+[ u%FbQr7o;=+AzQإ1$qxCtk# s>t`p;8 ;F !U}]tTݴ+xG&ܸpǓIiOLCj\lMΦBR7RcSt;v[!m`BEptPږL9mejo,TEP =:6<$~ R'j7e2$Θ=`%5wnuݫzE[.xJm p);uQJ,NI{`C$"/RK$BS &!}v_xvumdeIiۛ 0} 0%*rʜEY |6&RxD팫7Wws~w;}!L\iy6Ȗ%7;L  D.+ς֦.^v*JH.La 4X/'{$֦L;mBHH:wlC^via^/Qt9A@37n)jI1*B{TI0uɪ,RjU .+E(yV;%ORRz.F endstream endobj -549 0 obj << +547 0 obj << /Type /Page -/Contents 550 0 R -/Resources 548 0 R +/Contents 548 0 R +/Resources 546 0 R /MediaBox [0 0 595.276 841.89] -/Parent 546 0 R -/Annots [ 547 0 R ] +/Parent 544 0 R +/Annots [ 545 0 R ] >> endobj -547 0 obj << +545 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> >> endobj -551 0 obj << -/D [549 0 R /FitH 764.175] +549 0 obj << +/D [547 0 R /FitH 778.724] >> endobj -552 0 obj << -/D [549 0 R /FitH 739.268] +122 0 obj << +/D [547 0 R /FitH 739.268] >> endobj -553 0 obj << -/D [549 0 R /FitH 732.374] +126 0 obj << +/D [547 0 R /FitH 450.369] >> endobj -548 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R /F27 203 0 R /F15 444 0 R /F26 205 0 R /F38 443 0 R >> +550 0 obj << +/D [547 0 R /FitH 389.756] +>> endobj +551 0 obj << +/D [547 0 R /FitH 391.002] +>> endobj +546 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F41 266 0 R /F4 275 0 R /F60 277 0 R /F61 278 0 R >> /ProcSet [ /PDF /Text ] >> endobj -557 0 obj << -/Length 1786 +555 0 obj << +/Length 2722 /Filter /FlateDecode >> stream -xڵXKsHWhoü%qK%k*,Y0R{l I@fH ,믻{;{'竓g/F!z>F/DY6އ *}9yq6zi -R%CjgWfÿs"f(,m^P$ H fWi>3O0FWֽo/N@6:k/'B_x'm+W& nw'jQߣp!% -h } -\S.]_{{ !f2i-UyXC:_8ٯ$ϊj Q`b%Z&*56bvڼ4욬N[-{2C&e{>*N_SE$ -"*h*з<`ԪXeCizө.T kqlC%kz CL>62>ץVO*woBe - ']| cV`ee^;34kΨۨ# D < O;J>bLcm Gk{@iJ:OgB%8l:یgj3\ \ƤȒ&cր 㬦LV|36%bhfF WH[U6 "?eg9d ({B>KV͜BEqp*y@2D F@ @6(Q8GKj vDxi5fFFt܏pX=h*{Z2@T !] -81dd!ۄY;v~ncĕQ1PQLCC @+UYS@Q:˽Jcg;~mT7 ) R4C=#xLs~Fɍ3~ ȧ5 -|''1"sUO%{r-g"dھPajvf1n@khЀ%z| -n~5;~iz\.T%t@<#ծlG2 0 00d$f@c58i {_k|-ՓtCՋdvrj cmsн;J hzo{殲jWfD804gk욘:`ٚ?nT*vv`r"h\`(8dMC߶7m7CBUzbļ#쵋HjrMosm)+C{ۂ4ˋ_/ϗ Z+"98 Mhˡf<&Xo"uo f;\&ʏ uXGM%$/= -A]/_/^]yͫ$;m{u9K{qD磋UԈǸ@,{Tu; C$G2-EA8b:gW]Cn-ڮP♸(;wB^ F{N`ۥDJ׺u܀޵QZ=u~n/vS`Baz>,01ֿ1M:gyѮ>QMUw;MЧ-' +xڵ[]o6}ϯd/I>e0lL7 Eش#@\nR$9JL$:$ϥ+l\}\}b`8`!n,VίϿ/(óo +yz}LV|'@q($]79'l"vqIfwZAa;_n_rKW?Bθ( +ܞ;vVp'@py.Kny?t>|!THCH$~|q>dNΝh (z ED9̞ȧZ" qP2 gJ Z=5oj :Pk0phB4hMS=ź6 "@?F=~ 2zC[UC剱 +QH&?|_nx%1dg[u\;U0NSyMx/S'OQB&| ,58L~ ߧ)HfBp`WiXY!BY $-P<_}-)yv ׷._=O~r@e{Mx͑ \ñzMq\JAj{elxkʭ*Pm,+>,P<ڒEdX#́e'҆cam>lolhg}Sns$Cu9nW@p7-dlYDQHnT$3ew8 jAp7- ?q, "Dpcjd6jJ_(eeP@ tVՙ9X֙}+mXx8i/6W1wn3pndMp*P-,:;5eG52=Iӷ&E+-EPGL=/\g_Re%NsP!~Z<>S$ @ʿlLQ z~ +4ە7>S6{_R;XO;FT C8lDAz*tɅ]|dq!NI\ݗmZ+!y%-ӔknmŖiwF4EbT4 +IYsSvT`+Aq*d#6{w׷ EAP% 1e1aMQ¨D-PTZW͔?bϪtݗ_l;OUKSgm+5xQ)Z"EekWr'Zm™= a5p\G}OԈ]ЪHc +T6ۡPR +e}Bi(Zkha:SE4Gd? tcdmO<+D|^ R:vB'Hy0k> yVO(\Zg .<7La\>!umZQgW<)b{vݨW KHhs`wq1zI`Xr}gJ`K̠Ͱ =ѯ3h~'^mīs$%S<._k?:F#!4Kk/.[8.Pm.Yλ9X_u):.5ف6IU>$@-PV!kNͥZ ,^5NBˋ7~Qp*[q)>4  &FnH(|;|uk}h |́ "O* u B8R-P<p`4ϥ5 o]i@CN!Zxl(#Bˡ`J(F(! >xq;!j}*7S&Q d  +*q51G26#>-P<:VfSnC{v?Ň7<!vC.+SUQRn ,L\xl#FNˑcJ(Փ$uQ"M$n$ on75~#S-p-OjFy J5?ży^mڜYwnk7A6(rW"^l~6vvl7,29)M]~joP/0Y endstream endobj -556 0 obj << +554 0 obj << /Type /Page -/Contents 557 0 R -/Resources 555 0 R +/Contents 555 0 R +/Resources 553 0 R /MediaBox [0 0 595.276 841.89] -/Parent 546 0 R -/Annots [ 554 0 R ] +/Parent 544 0 R +/Annots [ 552 0 R ] >> endobj -554 0 obj << +552 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> >> endobj -558 0 obj << -/D [556 0 R /FitH 764.175] +556 0 obj << +/D [554 0 R /FitH 778.724] >> endobj -126 0 obj << -/D [556 0 R /FitH 739.268] +557 0 obj << +/D [554 0 R /FitH 739.268] >> endobj -130 0 obj << -/D [556 0 R /FitH 436.615] +558 0 obj << +/D [554 0 R /FitH 732.374] >> endobj 559 0 obj << -/D [556 0 R /FitH 372.063] +/D [554 0 R /FitH 718.825] >> endobj 560 0 obj << -/D [556 0 R /FitH 373.358] +/D [554 0 R /FitH 705.275] >> endobj -555 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R >> -/ProcSet [ /PDF /Text ] +561 0 obj << +/D [554 0 R /FitH 691.726] +>> endobj +562 0 obj << +/D [554 0 R /FitH 678.177] >> endobj -564 0 obj << -/Length 2836 -/Filter /FlateDecode ->> -stream -xڵ\]o6}ϯd/I}`2il6Ah@iGl(/)䛇%:=>^|]|b`8cp<@ ur{ex=ٔIOowBL,Q& - )+R\?6YE|zE\Ƀ~Pq#\engt3C٫3. -}Dpy-[yv -N7B4@.6#ȌݱtP^i.K:lOTI- }2K׭aL-*AɔS;o\9rK{"shʵX~<(WĖ0$Dn |fJ'FD4"ۦITT 3noV[Ƈbwxh%24yؚʧ -3Dn>y%^ӄB?bC>}s=8As2,L?6pm᫯%P[8A.8QO-|I@|7d&oM $<e\SÇxr_.fVT'zU(D\rUϻ81Qu]G[}?Ed#080o#3슭Oc3)bL~R˺뽉T U/w_=}kj9q$ѹpB}80Do#슜;t)v0, x6ij|hyov ߍ:J0q[͛LINL*f xqӨe =ik|hz ovEIߍ:/ȭ96]CEk!i?7O}}|w?yIl"45>4Ć7"#cJ01bOw_oMZkOlqЇ paĭF&.|w֠ĖF YgdXٖu$yHlOkչ- (e=ik|hz ovEIߍ:زqulol0{80fn#3슍u$e\uR۳YI1 Efi&W:cEn GƮ_md`]1wN_o6s"?*ʸP1g# l620gͮxXGrR"Ϋjfd\@sCTVaR.DId0uZHٕ]yGr(T1O+5S:h{{ʨ҇誃'l&ЦI[!s}]7uhZI((#GŖq}uT`N@ 2xREq3KRnk<9,EwHMCtf;iUE2GFẬ7sTѮ)hՐ$棃 xw$Rؙ@zT\lgroiy uDY3|*'%uGp4DkvHip -F^],g1_NxP,h[Q0|SBoj#S!+`3؎m=v@o>Nܘvka~R/Z(&-En}kWIfk&dX-y*u72\7Ғre݅t\fX^k" ڛXM2>{3~.mdIl ޖشJ˥=–4QwBڣ.Lyȴ2<!p4(i=dش̶ -cN{(V,Rz[)#Q i45>4\7cp~/FTP~47W\⣀T5TK"َFr"DpaPCGC8ͮ XGuGɀp\&CBc?J@ -0fҰPC  -fWx#@Bt@(|"ك"[? #MM*Lk:ZE29aRCGH8BͮX XG"sR#TfU*CRhQo y2I Rfu) ."1xҠiGN6rlvߍ- )mm翝Xm T]Jj -!d%\Az)pՒHMԃp̌-ʫ~ ߪy|UU?ubS[vnkWߛ }}\ UMUՅmmW6ҨKyU>~> endobj -561 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +564 0 obj << +/D [554 0 R /FitH 651.079] >> endobj 565 0 obj << -/D [563 0 R /FitH 764.175] +/D [554 0 R /FitH 637.53] >> endobj 566 0 obj << -/D [563 0 R /FitH 707.51] +/D [554 0 R /FitH 623.98] >> endobj 567 0 obj << -/D [563 0 R /FitH 708.806] +/D [554 0 R /FitH 610.431] >> endobj 568 0 obj << -/D [563 0 R /FitH 695.256] +/D [554 0 R /FitH 596.882] >> endobj 569 0 obj << -/D [563 0 R /FitH 681.707] +/D [554 0 R /FitH 583.333] >> endobj 570 0 obj << -/D [563 0 R /FitH 668.158] +/D [554 0 R /FitH 569.784] +>> endobj +130 0 obj << +/D [554 0 R /FitH 492.776] >> endobj 571 0 obj << -/D [563 0 R /FitH 654.609] +/D [554 0 R /FitH 358.208] >> endobj 572 0 obj << -/D [563 0 R /FitH 641.06] +/D [554 0 R /FitH 357.201] >> endobj 573 0 obj << -/D [563 0 R /FitH 627.511] +/D [554 0 R /FitH 291.398] >> endobj 574 0 obj << -/D [563 0 R /FitH 613.961] +/D [554 0 R /FitH 292.644] >> endobj 575 0 obj << -/D [563 0 R /FitH 600.412] +/D [554 0 R /FitH 279.094] >> endobj 576 0 obj << -/D [563 0 R /FitH 586.863] +/D [554 0 R /FitH 265.545] >> endobj 577 0 obj << -/D [563 0 R /FitH 573.314] +/D [554 0 R /FitH 251.996] >> endobj 578 0 obj << -/D [563 0 R /FitH 559.765] +/D [554 0 R /FitH 238.447] >> endobj 579 0 obj << -/D [563 0 R /FitH 546.215] ->> endobj -134 0 obj << -/D [563 0 R /FitH 470.833] ->> endobj -580 0 obj << -/D [563 0 R /FitH 337.355] +/D [554 0 R /FitH 224.898] >> endobj -581 0 obj << -/D [563 0 R /FitH 336.398] +553 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F4 275 0 R /F63 316 0 R /F61 278 0 R /F27 195 0 R /F41 266 0 R /F60 277 0 R >> +/ProcSet [ /PDF /Text ] >> endobj +583 0 obj << +/Length 1101 +/Filter /FlateDecode +>> +stream +xڵW[6~WtEKF]J$CaX%Lwy`,[:;;7A4^^q((JbZ7} BCJ¾N$/7wPŰ/9 +6yd`8›h݆(,`uu1n9rπ:9ñ +ZU=7Ve_b<+>uEMEk64Lբa+1 PZ(w&/t9 |靈jq޵ؠIx6cz;7:UV@_~4fx68CuΓ{_ILlXڦ,P1O[V5k~`oD7a]BnN'f]'. +]uUXdo+1IS:d][ˁ(逯e;'NBN&uY[KE/_(Q(! }0T`W3Qp.A2O<\ +=D%K+qw: +̀ɖXoL"FUx81B~RYX;:dl @=#(یJD@M3hK̷vQɡPSHLN\(^,tOk gUXTEcXamD㭫cfR:3w9_}[:ZKmL;ʕ.Ҹ[/PǠQPt}E_ᐴ"\볶a*B=4QxkH̏638R0Xpf&KBr6}폆ngÖ*8kUPaVKޜ4xʤ*t"%O:,DP`7TxdLA1)+i<'D&?Ƃ`0pJUgt;tb߲$FYwkȿ^r4H{I(\%\FG`*r̂y~M[+o3{PŸуPh2*uj=U\{U8 +endstream +endobj 582 0 obj << -/D [563 0 R /FitH 272.773] +/Type /Page +/Contents 583 0 R +/Resources 581 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 544 0 R +/Annots [ 580 0 R ] >> endobj -583 0 obj << -/D [563 0 R /FitH 274.069] +580 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.39) >> >> endobj 584 0 obj << -/D [563 0 R /FitH 260.52] ->> endobj -585 0 obj << -/D [563 0 R /FitH 246.97] +/D [582 0 R /FitH 778.724] >> endobj 586 0 obj << -/D [563 0 R /FitH 233.421] +/D [582 0 R /FitH 618.351] >> endobj 587 0 obj << -/D [563 0 R /FitH 219.872] +/D [582 0 R /FitH 619.597] >> endobj -588 0 obj << -/D [563 0 R /FitH 206.323] ->> endobj -562 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F4 288 0 R /F63 328 0 R /F61 291 0 R /F60 290 0 R >> +581 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F15 445 0 R /F39 585 0 R /F26 197 0 R /F4 275 0 R /F60 277 0 R /F61 278 0 R >> /ProcSet [ /PDF /Text ] >> endobj 592 0 obj << -/Length 1109 +/Length 1335 /Filter /FlateDecode >> stream -xڵWK8+t4["ɖlFvgXR KH吤(Z~T&39PV?ZAMoW7>A`I$E5 - @0%Z$741N*x}i_oAB%ÁQ0MC=UiiĽދ7mL̯;tʹ1ːn+A  HP}p> nYs!42˜_hvQmzKQ0?+1c!wj_Yq\)[O'wˏ70 Ƿf'*Qb*,4,2XoggN|`(?mty7aC=ˉ*WEzK!/6pb(jbXQ4G~UAB>x9]>N]! 1 S*ӝ퀀{4jWvqgWqfU[wr*ݙU 4^AmA"Q C8E]2vrkxШ#s&aҧܟK=K:aW6]m- & ␖Du!upMmX`.~QUhr|H][>dHoGv+иR O[oc4PgPM}'48F8+g}ѯr[~-?ruա 3ܜMwuít;s;(uw׮%y%'x:DAy؅ i4 Nh+zY⪉H63:?B(GLOD=s떋8*ZwF [A%f0IO-8~hHB.X뭄^ZZ M&4|ʤ`3`")X uIa0c.Mt_EQ{fM57)xn`tnG%.S\`bA>pG3c'MÑ 6(\\FGTk3;6V՟d!.#3P~ q M{ iXB|U=MK "0p|[amąs^e_( F)HlвB76wh8`X} ;]*74JJe }} +C]8C(be58\!HjWZ@AغKyRdRlKybka*²뭩3`zR*N6[1t Ѩ6sʗtQR XzCAty~'%IJ.z<RK^L-g1dńYW4nJs9Vu_yUkbgPڊ.guXnw2VDAH7"}@qLzz{uVGN7}尩(eSR_cy4zYxRl@w vuq>6*Ur&0~1(N GR;61Ѿe-9%g H!PAk~T;Vq M\+vQXASGqy +xȮ8t5MEU_(yQCY[$7egZ+ 'S!W ~GƢ~R\PbZߊ7WȘō1A"5PzvJpQ(Ր=QFfTV d;A;ԙoۍ{$+-: +?*liOm +-ENOS)1A'E _K|#Q* endstream endobj 591 0 obj << @@ -2308,792 +2344,774 @@ /Contents 592 0 R /Resources 590 0 R /MediaBox [0 0 595.276 841.89] -/Parent 546 0 R -/Annots [ 589 0 R ] +/Parent 544 0 R +/Annots [ 589 0 R 588 0 R ] >> endobj 589 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> +>> endobj +588 0 obj << +/Type /Annot +/Border[0 0 0]/H/N/C[0 1 1] +/Rect [73.503 398.386 278.404 409.728] +/Subtype/Link/A<> >> endobj 593 0 obj << -/D [591 0 R /FitH 764.175] +/D [591 0 R /FitH 778.724] +>> endobj +134 0 obj << +/D [591 0 R /FitH 739.268] +>> endobj +594 0 obj << +/D [591 0 R /FitH 493.818] >> endobj 595 0 obj << -/D [591 0 R /FitH 618.351] +/D [591 0 R /FitH 473.494] >> endobj 596 0 obj << -/D [591 0 R /FitH 619.646] +/D [591 0 R /FitH 453.17] +>> endobj +597 0 obj << +/D [591 0 R /FitH 378.65] +>> endobj +598 0 obj << +/D [591 0 R /FitH 358.326] +>> endobj +599 0 obj << +/D [591 0 R /FitH 338.002] >> endobj 590 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F15 444 0 R /F39 594 0 R /F26 205 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R >> +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F41 266 0 R /F61 278 0 R >> /ProcSet [ /PDF /Text ] >> endobj -601 0 obj << -/Length 1383 +603 0 obj << +/Length 2417 /Filter /FlateDecode >> stream -xڽWr6}WQ w-m(mgL&a5/ -wI`)LeX={vICśb}SQl$8Jom|\^\ᮼ.?HѸ.3~޾+ -x$|7ݕ>p)ו~]1%]w,ȡ {sKglI`-X7, It \!/v<8Q " {~Pz#ҝ -H}D -#&>ATzJTǐoQsa## eHeUڛ(6 ML0$Hxm !\۟g8Ѿ\".fEtI+uUed2;FTeuc }!]“7%P:+ rЪhZ-*U^{º^\{?4zg<(D@},]*D6]BcrxA҈@OYA^`DXȎ'q;رU|4k{>BJ_8rHa7omreε6ڎy~.MW}GmQgPl~9cۑh@5?[.F.KΑe8`hcp|ф"TKe <i΋ N@e~~PʼHѱW(&Lu[ e7PSU}1tF]i.~~Z6 -v?Y'VWj$r.ׇKJ]rW wn 0;fC,`ev&EV s|(ɤEQΫ~%8.-x]ݔ"ӑ .ya$݋5mL/AִE9*JcRQLL9\m,ejPp 4&v.=v [yk -su8xs"*q2m[Xa/V!0]!8kU+1>f VyХua 0Y=tHx"\U}_ȃH5MkxYڵ2j~37P)I (0t,ۮ w3}_VJBJ<>\76@w_Oh}PrYO5s<ߠ ?&_ %f;ppvVC$g0D=$ɱֻRGTA3P5q$%E>qseby)pvVPSb3n7?AG +x\]o6}ϯP{1fDJ(0dShI"Pm9Ɩt^J$-*rbQTE6uH_^^=xw}ϱw"Ōy w~]߼|A?ys![_9A! ~c:K}VEpLg?T~.#W¨[𦝜/0 :N&@|o`0m6e83 tO/m\r];VR^+XD缘:{ 8JVOO&bbbX*YZy:FYh,h9["w%JL}v2KԚ,QWjdյK_Yd:C^ N_5e2̈Jc1H%MƻDѓ;M:x=uɧ~Vux>K52ydKI2)嬏jP`:Lsc_襢GQ-ňr6`w:zAn,|(Aa{b?E*3XN79vxGoVybFVekJ`sәd3:Y!笴!uHnO@w5@u]J|=!_ +V?R@lG]CaEk(vO=YU6މN4Q= 99#/ZDnʹkwH5arM@d.(:mBBPL4py.C8~%$ע|3җg>gIʾ"|x-youeYq)m3Ed ,rִ5A)kj5auJ3@8=ѐ/5C= HkWNkv"i.˓JYз}5 +Pߛyd!/\iu(Uyet_sQG+K͛TbQukW˴vYa6)M^$ Vk ^zGs4ZC%7.杔Yh˳>H}mК=SC{Ћkv̞UGX2 pMaQ9  /)ZFMj%E!{/%-iÁ[/9봗$Ń^]=r?,%qpZTJz8@I8{ P<|9A qǪl0@8֘sr,k B̌ j%Rָc<h K9Z鵆:} N(C,5MM Ǻg%2MToRSyLPHnrX t@=V#v'0@>g/F,('(kp59pYk9G&/,Wn1_{40G౲4P&e`-Ec`8&GBc z> endobj -598 0 obj << +600 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> ->> endobj -597 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[0 1 1] -/Rect [112.153 396.482 428.825 408.102] -/Subtype/Link/A<> +/A << /S /GoTo /D (page.39) >> >> endobj -602 0 obj << -/D [600 0 R /FitH 764.175] +604 0 obj << +/D [602 0 R /FitH 778.724] >> endobj 138 0 obj << -/D [600 0 R /FitH 739.268] ->> endobj -603 0 obj << -/D [600 0 R /FitH 492.192] ->> endobj -604 0 obj << -/D [600 0 R /FitH 471.868] +/D [602 0 R /FitH 739.268] >> endobj 605 0 obj << -/D [600 0 R /FitH 451.544] +/D [602 0 R /FitH 648.776] >> endobj 606 0 obj << -/D [600 0 R /FitH 377.024] +/D [602 0 R /FitH 648.953] >> endobj 607 0 obj << -/D [600 0 R /FitH 356.7] +/D [602 0 R /FitH 635.404] >> endobj 608 0 obj << -/D [600 0 R /FitH 336.376] +/D [602 0 R /FitH 621.855] >> endobj -142 0 obj << -/D [600 0 R /FitH 264.997] +609 0 obj << +/D [602 0 R /FitH 608.306] >> endobj -599 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F61 291 0 R >> -/ProcSet [ /PDF /Text ] +610 0 obj << +/D [602 0 R /FitH 594.757] >> endobj -612 0 obj << -/Length 2483 -/Filter /FlateDecode ->> -stream -x͜]o6+{1fMii1 Zdݙ z--BUn&?)YZqw/[1:34zht{$ 瑡$:2:&\$,at{wx}eŘѮ:=l7"UX‰)~uucFY7Nx;]/DG򯀨^yK~bztFĨhGo@A$qXDI2pZ?o%IC<&&%Ԍ(&"h>VQEi >0f,(!f+8RU)73CY$YҥhŤ qd$FkCJ:zs0OA'6^fe mY7n97hvnK jϚS^$X?a94=`0]Ƨ#.H+9.(Xs@QM$OdO0eA@1[0c4#Î21@a.\1 x~J)ƺk[0p54/n;/0]ӚᄖSOlC*:8k<*p1%V:4VRJy-%q&nlmǦx[!mșê6MgZ46yٰmևڥf*_{o_m&U2anUtu^Im_ + CF4~5{ٳt`:؄"rMī3d)}U2P(4F22a ".\SskfԼzfUU|̫Se刽 -&Ra7ذa!wZv8귱 c'@ P>2e\f/ #wZ=2./k|ޣz`=\i֍>6medîQD]i'c5~u41 -Jll+#vBµN{bn8,,J* +  <~5 zx)C4F22a!.\ι+_R4s[i04 F22a!.\_,1#s4_⹼V;IYIiuRLm8sn!uR[_mNuSu )_?+<lA/f $2H0Kl|YI8F؞6V9XS9#@i5>GGw@~]V,a\/}:i7N6/z -M%v%v%vɚ%v%Xk|>;YO ce0*kyl([L]cKl4LjvAeG,W[g4M -endstream -endobj 611 0 obj << -/Type /Page -/Contents 612 0 R -/Resources 610 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 639 0 R -/Annots [ 609 0 R ] +/D [602 0 R /FitH 581.208] >> endobj -609 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +142 0 obj << +/D [602 0 R /FitH 536.25] +>> endobj +612 0 obj << +/D [602 0 R /FitH 435.125] >> endobj 613 0 obj << -/D [611 0 R /FitH 764.175] +/D [602 0 R /FitH 436.371] >> endobj 614 0 obj << -/D [611 0 R /FitH 739.268] +/D [602 0 R /FitH 309.596] >> endobj 615 0 obj << -/D [611 0 R /FitH 732.374] +/D [602 0 R /FitH 310.842] >> endobj 616 0 obj << -/D [611 0 R /FitH 718.825] +/D [602 0 R /FitH 297.293] >> endobj 617 0 obj << -/D [611 0 R /FitH 705.275] +/D [602 0 R /FitH 283.744] >> endobj 618 0 obj << -/D [611 0 R /FitH 691.726] +/D [602 0 R /FitH 270.194] >> endobj 619 0 obj << -/D [611 0 R /FitH 678.177] +/D [602 0 R /FitH 256.645] >> endobj 620 0 obj << -/D [611 0 R /FitH 664.628] ->> endobj -146 0 obj << -/D [611 0 R /FitH 619.621] +/D [602 0 R /FitH 243.096] >> endobj 621 0 obj << -/D [611 0 R /FitH 504.996] +/D [602 0 R /FitH 229.547] >> endobj 622 0 obj << -/D [611 0 R /FitH 506.292] +/D [602 0 R /FitH 215.998] >> endobj 623 0 obj << -/D [611 0 R /FitH 379.517] +/D [602 0 R /FitH 202.449] >> endobj 624 0 obj << -/D [611 0 R /FitH 380.813] +/D [602 0 R /FitH 188.899] >> endobj 625 0 obj << -/D [611 0 R /FitH 367.263] ->> endobj -626 0 obj << -/D [611 0 R /FitH 353.714] +/D [602 0 R /FitH 175.35] >> endobj -627 0 obj << -/D [611 0 R /FitH 340.165] +601 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F61 278 0 R /F4 275 0 R /F60 277 0 R /F63 316 0 R /F41 266 0 R >> +/ProcSet [ /PDF /Text ] >> endobj +629 0 obj << +/Length 2864 +/Filter /FlateDecode +>> +stream +xڵ[ks۸_~: oj{M\Gi0dq"$C+QTfQ"x\ bQCWQQ:S!)B}K1mXaM+$ * \ݿS|o""REtF ɽ= +}ÿ/0FˡՍ` Ы3 ,6% ,0p\xwkb}H1zM7yR]KQL}.b\eǷR5ZOqNm=VěmYfk CGa(8#1y9c9pVM^?:AF5S.Beدz(IYp *5`@k! P0n~TyKGrP\g؃9OBo۪[;r皚JyhNZ!y }=q$`0.!HNzHCQ9☟Siy#i`dZhּpxWTdsûKcq uAbԭ J-I6#Sw|-FxW<*DqyxY>[:m F[.p[/Y.R/B &PgfmTjoHj1l4m2]0'PJ+emT^oH^1l4mB)G Clr-rc+PLYEqr0g`{*6t$[Ll<^񷄢zC%sݖT)mi3ۍ~굲,\\N3׃-OtF08b-Uf.J߸RpIqZK+agD7cƨ)BfC\RZ^{4+U(Iި\smC%Tпd+0YVwu %|BV]5Asa03 ]&Ѡ] 4\&0i?n%>T Z\e8 QQܑBt2+o`- +7aK} д|ͅ^btl$쀴,ÌغL۹zdf#9`\eszπ qYK1|oF/+?3z߭+Rn\PSFq;6TVzɛ B C*|űiױI[_;N/)dl>Vss$֮VG|xrAc3SPz{;׃NSS>%^gEӨ4wPQv9^gɲ6+3Uޚ^Vn!h2BRn +nOA\ţm!sӢ@@[ٻW߶G.UQD_`Wxz>XPVU: +Sm_lW(D״j'^hVm*m.Uz0)ܟ@ V N0JG']<eKj%{(c5|4*aXQ^pd֋iy0L +!0!YXdƔ%ףn5&N`1OԘ,ɉ6j3lt@3x'!~|suKJU}{?]-2ԹpP!,XB>sy~\:~TǕaPpجr :PN*@IQİ[etRT^a?xa-r4Q Z':[Mz݊2T֚ h&`ѶhAm^1[{~'UҤ Ȓ!'4Эu`hx!rB 'X:m `zΌ> endobj -629 0 obj << -/D [611 0 R /FitH 313.067] +626 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.39) >> >> endobj 630 0 obj << -/D [611 0 R /FitH 299.518] +/D [628 0 R /FitH 778.724] >> endobj 631 0 obj << -/D [611 0 R /FitH 285.968] +/D [628 0 R /FitH 720.072] >> endobj 632 0 obj << -/D [611 0 R /FitH 272.419] +/D [628 0 R /FitH 721.318] >> endobj 633 0 obj << -/D [611 0 R /FitH 258.87] +/D [628 0 R /FitH 707.769] >> endobj 634 0 obj << -/D [611 0 R /FitH 245.321] +/D [628 0 R /FitH 694.22] >> endobj 635 0 obj << -/D [611 0 R /FitH 193.066] +/D [628 0 R /FitH 680.67] >> endobj 636 0 obj << -/D [611 0 R /FitH 194.362] +/D [628 0 R /FitH 667.121] >> endobj 637 0 obj << -/D [611 0 R /FitH 180.813] +/D [628 0 R /FitH 653.572] >> endobj 638 0 obj << -/D [611 0 R /FitH 167.263] +/D [628 0 R /FitH 640.023] >> endobj -610 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R /F63 328 0 R /F27 203 0 R >> -/ProcSet [ /PDF /Text ] +639 0 obj << +/D [628 0 R /FitH 626.474] >> endobj -643 0 obj << -/Length 2780 -/Filter /FlateDecode ->> -stream -xڵ[ks6_~v, ~pxev2DYJJRv<{HSIÙI.p.߻|U{G؛-G1c^bDϧ7WL O?Ui9iw":P} -YHwLOӲʊ\ M81=ߒT#_-ǻ}UN7rv [hUӘzϿGYr4@4'p$OŦojbc/"!"ax"(,jz R( ^z]`:l:u@CٔswHdx q B(<#zLkZkh6,/# emdǼtoߍRxC1Et] 3G bcfv2 6lrXG"XQ󏑼.pal]옗Ͷ\rXm5LӀ!ƈd|MUl]Q@e]-Ųxŧ~,l x$b8pan]ӻͶtX.B1+Tcqaȇ1b081}E-dK&ѿ.w|mR$5[KuQǬ^5Vڮ %"\PSʶ/0]Ezxַǧbw]}p(|;2QJPzF)_$$6Dc(I8uۺ bpAꦁw,nn{qP=+/CHs*DEP@PbFP(w P ۩l3N|}VD^YBSU-QLD43C& Y:d呣֩Zk8V\dԨ 1Y6i^j[NBz]3 'A#fNحzNM'(>~P7qLT뷪.\}ZCo_ 9΄! -%P 0C jnֻR0}7m)[Q:Nue -jQ1Skth{-הª;bW4dTe+81wYJTQb|z2MG(dm[|,ҪJou<ل+dwdcZ -ͭHjǪ0a .R bQ)J,t!p *  cQv+*mY-3})] -/LN47M66;E.u@dKtlVFukYrMK0ĝvV6I.=鬪2okV?mgҔ5s1*YEro ZtWm]06-zַFIv֩l՜^ miYYtDY@_c͓ȰXU-`<ɹHɟиGu孙Q(A5Mx+bn)HX2K(-:jGI;JVb1ۀ"P"VɶR_g/$>g'TD˺U7+=*ɾD"]fyC61nl&0hVT;u3"k`7!bI?aA)FcޔY_[ͪ% p)vI.9ʇ$MWӇc}NR)eWE|y JycACRǻYl ~2zHb lzٻ].3tw ,h1T5 E^&ɤČf,'Ml-FXB&E~Y T>/zyT`8kk1bꡍј"=Y_ܾ|?ڜMk3C4mRaV}qHÆOzf[;+1́꾋#l1:nyfnx*CQ;i#.pv8069FvYf[9x[bX_ BO]#w,΃N(<i|n#;{-ncH7_KHÈ>!蝳nlKN{= ̇ -endstream -endobj -642 0 obj << -/Type /Page -/Contents 643 0 R -/Resources 641 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 639 0 R -/Annots [ 640 0 R ] +146 0 obj << +/D [628 0 R /FitH 581.669] >> endobj 640 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/D [628 0 R /FitH 494.196] >> endobj -644 0 obj << -/D [642 0 R /FitH 764.175] +641 0 obj << +/D [628 0 R /FitH 495.442] >> endobj -645 0 obj << -/D [642 0 R /FitH 741.858] +642 0 obj << +/D [628 0 R /FitH 382.42] >> endobj -646 0 obj << -/D [642 0 R /FitH 728.309] +643 0 obj << +/D [628 0 R /FitH 383.666] >> endobj -647 0 obj << -/D [642 0 R /FitH 714.76] +644 0 obj << +/D [628 0 R /FitH 175.8] >> endobj -648 0 obj << -/D [642 0 R /FitH 701.211] +645 0 obj << +/D [628 0 R /FitH 177.046] >> endobj -649 0 obj << -/D [642 0 R /FitH 687.662] +646 0 obj << +/D [628 0 R /FitH 163.497] >> endobj -150 0 obj << -/D [642 0 R /FitH 642.654] +627 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F4 275 0 R /F60 277 0 R /F61 278 0 R /F63 316 0 R /F27 195 0 R /F41 266 0 R /F26 197 0 R >> +/ProcSet [ /PDF /Text ] >> endobj +651 0 obj << +/Length 2543 +/Filter /FlateDecode +>> +stream +xڽ[o8+MJrccȴhFLozEUT@:0jERU^ۯ|! 0>qu* +2vA @ V뛫/矪ty%~^m}3W*!i i.>$v vn¡!|*l﬩2@;Eq0@FX(#3p O^ɒ3Ϝ7Xbw6h,C b*w% CXz*_S6@@L#"; +3k d!B\_?Vn//n[ n.8_U>Sώ'Z,Nx*JxFؿ;k lĀR$~MwY!jx@Dʧ!GHwW. wSAW3 pzxUK Y'<3{%KL,v:$(!&"ldg`|"JoJ'h&I;RV"Ꝯ" +2?_s6 0h^]HM iWt7*0Fe>s¡es&m\"q)^7$_5T?dEi)/ɍ1;ri]r6}el_bE<d>Զ.L77w)mM)P|\/WtT,Uu1F[U.ualtSeAɹlڦįL5kؤkZX0h$ _woy%$lKPAQTITBq# \z7rncr %3#>0`&bI-1y*:xچZAHQ_>܀Mqb&w#<cmW +Yv6#]L0JC>amh.!7bt/cS~."/]ŋFj84{WLǀVeZ/WbY+I [4D:\Gꇁi+)>@ab}x[[\+F:7'n%ȡ/Dg fUgWDVؤo̓ʳ2,e{!w۔O͜9юfm[#4?6TE!1H_մJR6ksֶ~0jr?9棐`b> endobj -651 0 obj << -/D [642 0 R /FitH 556.424] +648 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.39) >> >> endobj 652 0 obj << -/D [642 0 R /FitH 443.198] +/D [650 0 R /FitH 778.724] >> endobj 653 0 obj << -/D [642 0 R /FitH 444.494] +/D [650 0 R /FitH 741.858] >> endobj 654 0 obj << -/D [642 0 R /FitH 249.973] +/D [650 0 R /FitH 728.309] >> endobj 655 0 obj << -/D [642 0 R /FitH 251.268] +/D [650 0 R /FitH 714.76] >> endobj 656 0 obj << -/D [642 0 R /FitH 237.719] +/D [650 0 R /FitH 701.211] >> endobj 657 0 obj << -/D [642 0 R /FitH 224.17] +/D [650 0 R /FitH 687.662] >> endobj 658 0 obj << -/D [642 0 R /FitH 210.621] +/D [650 0 R /FitH 674.112] >> endobj 659 0 obj << -/D [642 0 R /FitH 197.072] +/D [650 0 R /FitH 660.563] >> endobj 660 0 obj << -/D [642 0 R /FitH 183.522] +/D [650 0 R /FitH 647.014] >> endobj 661 0 obj << -/D [642 0 R /FitH 169.973] +/D [650 0 R /FitH 633.465] >> endobj -641 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F61 291 0 R /F60 290 0 R /F63 328 0 R /F4 288 0 R /F27 203 0 R /F26 205 0 R >> -/ProcSet [ /PDF /Text ] +662 0 obj << +/D [650 0 R /FitH 619.916] +>> endobj +663 0 obj << +/D [650 0 R /FitH 606.366] >> endobj -665 0 obj << -/Length 2772 -/Filter /FlateDecode ->> -stream -x\mo8_aP$ERCH.rֽ- -צa)'MZ"3XÙg%t˳:c4fvR)5 UDxϖ/Wׯ6_pI?3z^oF](AŜ@#o >ϙ(txm=\Gv}PA0[X됉*D ė/ EJguϫ$]}JҤz?٦͟SneebH8csa|!h UM$C\q7`*j_./*U&=&12.lB=k"61x6iZ|lyov c* -R'ۍގUO!IbW=?^czVNӑ1ftf7,D?ֈk0T(cg_oa_u_&eڈ|֗R}:4d##솠)ߎ iP+ HȖRIk"}3{X~H -Nb#lCl4-Z|l##g bUgLL'/yL0nMƙI..2Mn"ƒ -"싐+mDu]} r'Y O2a0w:4##w,&1vp^RA?5J^]_Z.zX>A!PN1=i[|lFovBc1Z@iY"__l6.ˎ}S,H(G`!F잀5N %4tiَK: L?Ю(_ =qff7|B?]"sqr[Ǖ肮OgIN@6IuIxHu:47l#膟O7qu OC&X\w:4##u:!$dH.6I|"&^v,1K#:#m~YޥlsW*M拀IQsmJkQ]бeIsFCxM̜`m-*g+$ۥ}D{γM0WamCֹOYehaME@R # ݈BFGqYX.)^C[׊Bw x'iZ}n38@dc9ޱ̭;;xf d9xIx)s׋Ȓ.1P>lӇluRCDBTar6_@B褎LjT*j9 .3[-ꄗOj3qPr,*7-X,o.-$Fôo}fN%xyJ:\6ː4YP !"T6n;X@R9O6c;pT9ZWlӛv3K÷ - -Bw_oZ;]E Q~'BU6ԧPxX:';Ӷ2QQ@LaL784AO p -;uo@NV&f:NLiF`4a&?S e7zjՙJu0iMEQmcj#"vu( ]_?QfEjݯ)\z|ya^%T_ݛŦH)*=9Bp> *2uOt~1LF@ YdGal~Q~fi0# 20z?qaĤ!OQF6>Hᬕ7ٖ1ãBE(J > endobj -662 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +665 0 obj << +/D [650 0 R /FitH 579.268] >> endobj 666 0 obj << -/D [664 0 R /FitH 764.175] +/D [650 0 R /FitH 565.719] >> endobj 667 0 obj << -/D [664 0 R /FitH 741.858] +/D [650 0 R /FitH 552.17] >> endobj 668 0 obj << -/D [664 0 R /FitH 728.309] +/D [650 0 R /FitH 538.621] >> endobj 669 0 obj << -/D [664 0 R /FitH 714.76] +/D [650 0 R /FitH 525.071] >> endobj 670 0 obj << -/D [664 0 R /FitH 701.211] +/D [650 0 R /FitH 511.522] >> endobj 671 0 obj << -/D [664 0 R /FitH 687.662] +/D [650 0 R /FitH 497.973] >> endobj 672 0 obj << -/D [664 0 R /FitH 674.112] +/D [650 0 R /FitH 484.424] >> endobj 673 0 obj << -/D [664 0 R /FitH 660.563] +/D [650 0 R /FitH 470.875] >> endobj 674 0 obj << -/D [664 0 R /FitH 647.014] +/D [650 0 R /FitH 457.325] >> endobj 675 0 obj << -/D [664 0 R /FitH 633.465] +/D [650 0 R /FitH 443.776] >> endobj 676 0 obj << -/D [664 0 R /FitH 619.916] +/D [650 0 R /FitH 430.227] >> endobj 677 0 obj << -/D [664 0 R /FitH 606.366] +/D [650 0 R /FitH 416.678] >> endobj 678 0 obj << -/D [664 0 R /FitH 592.817] +/D [650 0 R /FitH 403.129] >> endobj -679 0 obj << -/D [664 0 R /FitH 579.268] +150 0 obj << +/D [650 0 R /FitH 288.953] >> endobj -680 0 obj << -/D [664 0 R /FitH 565.719] +679 0 obj << +/D [650 0 R /FitH 160.045] >> endobj -681 0 obj << -/D [664 0 R /FitH 552.17] +649 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F63 316 0 R /F61 278 0 R /F60 277 0 R /F4 275 0 R /F27 195 0 R >> +/ProcSet [ /PDF /Text ] >> endobj +683 0 obj << +/Length 1573 +/Filter /FlateDecode +>> +stream +xX]o6}У=,I=kdp, m1(%OR"U9mhL{x?vVvW7.vFK̗/ QW:05ST:"x+NP>B$EL`$.2"|:y1qχ7``$p®k_oveθ4*g\$=,6o+}!_qwgzÑ~G .9XW0_YQ(cڐ ,T9Ӏqj:3wjnr`= K̩P|:V3&$7Ak]#?nSN6Tv*HW1%!\>i#YT S +f +D|jEI մ3&N'@pjכ@~1iT!CS(ep 8q!O 1"2D'kT;̑H +*4bQcY+[ɩmQg]8O֟u1`m&eUQm:{*ʎġ{rFsb`.6B!o3>Gs&FYA{{Ql(β{LY)|" L#敋V@P4y_l}0Kw2Gjigh4vpo 7 06-O2I݋"Ux`&Y}ۚe(4[I$z-<Dj O Ii-<攔yLn>mu.HT>S&tdL49W&]`+mt2I89F&DŽt렱:L+ja0EptDmhmiRֲzrMAjYR|I{O㪗u0oj񠳗&sۉcڲhRE.\FG/;xVll^gBðA@?Es8>))f\j˾߁IK\gRKd(yac_qrn& v-nUvиr~ Cr<fXZǫVdYm,.,jԛ5߬dݣH0Y{Tq$<\`KRThwiSv-ȐB{ ^ܩԮ:p2I7ۮ{6otDB714U|@]B1A{OUAUO>nF +YKJ`ɶW.;$5LaϵSs$Jí,HFK8T}Xtê{w> }I-O88$+{IyAڶzjg ' M.@}P|:y>&4( +ղԺ+=Ztl:~vW J%PbYR%#%MzΒ .#O*ALH ϭbYc?\̉YĽHh^@Uk~[V'ܾ +endstream +endobj 682 0 obj << -/D [664 0 R /FitH 538.621] +/Type /Page +/Contents 683 0 R +/Resources 681 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 647 0 R +/Annots [ 680 0 R ] >> endobj -683 0 obj << -/D [664 0 R /FitH 525.071] +680 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.39) >> >> endobj 684 0 obj << -/D [664 0 R /FitH 511.522] +/D [682 0 R /FitH 778.724] >> endobj 685 0 obj << -/D [664 0 R /FitH 497.973] +/D [682 0 R /FitH 741.858] >> endobj 686 0 obj << -/D [664 0 R /FitH 484.424] +/D [682 0 R /FitH 676.054] >> endobj 687 0 obj << -/D [664 0 R /FitH 470.875] ->> endobj -154 0 obj << -/D [664 0 R /FitH 356.186] +/D [682 0 R /FitH 677.3] >> endobj 688 0 obj << -/D [664 0 R /FitH 230.696] +/D [682 0 R /FitH 550.525] >> endobj 689 0 obj << -/D [664 0 R /FitH 229.739] +/D [682 0 R /FitH 551.771] >> endobj 690 0 obj << -/D [664 0 R /FitH 166.266] +/D [682 0 R /FitH 538.222] >> endobj -691 0 obj << -/D [664 0 R /FitH 167.562] ->> endobj -663 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F63 328 0 R /F60 290 0 R /F61 291 0 R /F4 288 0 R /F27 203 0 R >> +681 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F60 277 0 R /F61 278 0 R /F4 275 0 R /F41 266 0 R /F63 316 0 R /F27 195 0 R >> /ProcSet [ /PDF /Text ] >> endobj -695 0 obj << -/Length 1170 +694 0 obj << +/Length 1650 /Filter /FlateDecode >> stream -xڵW]sF}W:fߒ''%3Nʤ$ӑ -J"w]HcxAs{=k-7o>TJ#U{;ݤ} -G!!E\2\^/|1Tey"9F1տ e~/5#aO YMqli ]6P o|~{ , mrq:̻a) Æ,kߚm,nE}) '25ˢ.ǵy5Q0yZw}=n|y]X ۋsa*7Rxvꋕ+|V8 Iʭ(>aAߢ8R .ok~28W{˾__D*B~"|P]ҊiQ]bR6k۬תŕ:_MӘ ݪh6٬(4_(BE[:fjh̠#?^՗u5WChJy@RTbxP6:Ӈ̐|ÅhaTU92 Y\ϋrUɍ(8wl`DXn ,$&We/|}6]gе˜jSQSH=0D3Wl{ T=:cE%vh,F0$SU*{LgK"z]ʝPZifQ( -K"2*2Ap< A_Tկ!pF!+WcFp0N#x^;p6)QMrh@~̥ʛ;7s?Ng.q)p: .Ϲi~zͪ:.?/ڛMy2S_Tvazi>(zT1|8~'n_kL;4@_xйx)UIXs3N3m<(.Bښ+(^8V֖@աBB o,I[ǚ=YktYZ^_1!WE^9t&jA|Yl\fY6Is+ȁ d RiD'T~5/ad <='a+<7J`ٛW%)޼mQ u@:O7p8ŒV(*z]VG6DآE}0Tu7v_7{Sh,ʳi$BYS٨\-I{qN]Ŷ6bhǖK;o~QwefqMn y˅yB$!hVlDYSαBxwhb=YFj@LfUFX\R;$%O6fls*&v6}ƽ˞'ֽr$H)Ɇj |N Xk3ޡ߀]Nda1)ND]S +v\\E⺊ +7|*&:2 o-MQ&LC-V/̯k6kY[t3w@y{,$aeA]G9zCI:5!pZ[g`[Ѭ@hO /m!ELRPl/bhnbqp`\:t +><_ + `0*zƐ5Pg4P7{ޛ{43J\z$L>[A$3_7K&BT-}Kt .Y77=qی8]x3BE٘$*rf~NԕeZg3--s'5E5.) endstream endobj -694 0 obj << +693 0 obj << /Type /Page -/Contents 695 0 R -/Resources 693 0 R +/Contents 694 0 R +/Resources 692 0 R /MediaBox [0 0 595.276 841.89] -/Parent 639 0 R -/Annots [ 692 0 R ] +/Parent 647 0 R +/Annots [ 691 0 R ] >> endobj -692 0 obj << +691 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> >> endobj -696 0 obj << -/D [694 0 R /FitH 764.175] +695 0 obj << +/D [693 0 R /FitH 778.724] >> endobj -697 0 obj << -/D [694 0 R /FitH 645.449] +154 0 obj << +/D [693 0 R /FitH 739.268] >> endobj -698 0 obj << -/D [694 0 R /FitH 646.745] +158 0 obj << +/D [693 0 R /FitH 449.538] >> endobj -699 0 obj << -/D [694 0 R /FitH 633.196] +162 0 obj << +/D [693 0 R /FitH 214.671] >> endobj -693 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F61 291 0 R /F63 328 0 R /F27 203 0 R /F4 288 0 R /F60 290 0 R >> +692 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F41 266 0 R >> /ProcSet [ /PDF /Text ] >> endobj -703 0 obj << -/Length 1494 +699 0 obj << +/Length 1923 /Filter /FlateDecode >> stream -xڽXK6WVeHu -Ҵ&HдqC-6ITʻ kY||7CSPn~GFIBNDINg9wo_}ݺӈz_:ųwaKЃC ^|۱`+FRpIe~~ %C jg\}a^Mx$'-6>S'70p#;6 X~Hbh_y4F_(Ds$c]ROߟx+x&4d$\eׂ_CZQJ y+qMuKh`Dyv40H0ghfnsn7|^!PK :3Wq3Ҥ׀DQ xX7c+x!8kɏUz^DD hHU[X@P}Ƙ c#T@A=veB\G!2kg -`? ?.яWU.S[kxعt|V̊]’u UsQAFUmXOd \ďfG]=XieSuVPŚKb2`!\KX \X0z:g` j4u/Khb]d|w(Y9Y*k[?o|7"uKn}'nB<"PS21qFpK XFM%aPS͋SkMy]$UB\_\,Eu@f?妸ZzvVVڏrcMWl1]KTf;dOEZWzO8XblT:]vaMF)$Tz Fd6+{j:4moaa{<׀4 @:T|Œ8LVk4+y!&2G(i>9g![WbʢE U5tgC9ZߺztYdzCWC2uR1E32?( +xڍX˲6߯`vRgv7)q*O+eg\0AA,K@t3.QyyI|HitD%$}twzǛR?NJ!}' h~Zfb8/L9-jY!vX1~"NbPp_dJSI͹re]™q<^5he+JRx$ I/nOVfㅓ cIAx {֪L IӨ|zD +SN$п Q=8Sl%gDca^$a]Y;BK%\ҕSF< I[tk3. \Q!=G1j@$YQ+@R2QK Cт +A͏HѠY}]qJUޞ9jm(MƼ-@]J(!o7u1z~!O3߼՜[vxഒ +|B^I ;T%Xsuc=l(0OL0Lxn{T ^:E |4>l6* 9NKiA!O/Or\1xK"'\Vl}t40G 9hl4jqSʪſd6~_`QY[,͈T'P gkJ+$ CYt^+:O]6DL%CL04h񵖆;\11IUrYBoeF%8 $Q:iA +וϚ _WkYZ@``a?BA2Ϊ,ۆCL [G!%P-2'@;$r SC@\з`YjI;2@CfYg80З:Mܽh/+1bmZ9n*.U6 +Q 3T*gZS T3IBZ75?fq"ͬx? |7I PÏ+C=65A@}jbVX/{HHul֯<xI1)Ap6p$ݮeTPY}Z/R L~l]ސхnSRMYST&MaУ<-#`o'bmrqҶ`S _v|8;_Jm>6rgP +GP-Rc.eDXo4ey+57v}䌘|a%A8zj!a QXr"L`\܏/"'K>ǿET`|8*12+J5-%~Mmj)fi&ԏꐝ릾?D!|FVi'"T5u4(IbggP=I|R 5>îgFgOwP.BѴ7Ϧ׏hUǐRKQٶʠ +Fk59ݷ*xŃ:6fD`I/z*q$CMԯ^&g;ڪuA:ļP?@> Ջrj$E8pcqit7k7=_m|a[/>,S,~{o{z`/"j d,B?Kɤth'Hg?@\k_↋}C:| endstream endobj -702 0 obj << +698 0 obj << /Type /Page -/Contents 703 0 R -/Resources 701 0 R +/Contents 699 0 R +/Resources 697 0 R /MediaBox [0 0 595.276 841.89] -/Parent 639 0 R -/Annots [ 700 0 R ] +/Parent 647 0 R +/Annots [ 696 0 R ] >> endobj -700 0 obj << +696 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> >> endobj -704 0 obj << -/D [702 0 R /FitH 764.175] +700 0 obj << +/D [698 0 R /FitH 778.724] >> endobj -158 0 obj << -/D [702 0 R /FitH 739.268] +166 0 obj << +/D [698 0 R /FitH 621.923] >> endobj -162 0 obj << -/D [702 0 R /FitH 407.264] +170 0 obj << +/D [698 0 R /FitH 454.713] >> endobj 701 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R >> +/D [698 0 R /FitH 235.8] +>> endobj +702 0 obj << +/D [698 0 R /FitH 217.729] +>> endobj +703 0 obj << +/D [698 0 R /FitH 195.153] +>> endobj +697 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R >> /ProcSet [ /PDF /Text ] >> endobj -708 0 obj << -/Length 2034 +707 0 obj << +/Length 2349 /Filter /FlateDecode >> stream -xڍY[s4~c2_sp:eP8axT[MmH)׳|DoF)7|N }1Fn ]P.ɣouy?%]uS+> M -/>==_q\Ԭ3IYiWOjHo(Q?lgyκ柛W3iAW0#XHU?Yy6_n~qtm>ϓi]F6B0cp$aOVEBʯsg;46_{n -*fHE8 -mm=bJ "]k^'+䭴dmTO ʊSR -AVz_`]1pN;ٜכ|u˩u(S1!7>A\(Hf ]'hm(iᙦ|-|3#qn[*y]Lrug ,LBJiIf鞥o<2nxkeDqS/Ljl˺۹-1:cʏ*Gb] -3r[x -o'M69𞉋hCYNrUA,=-ja[89uhQ=mQ+ תFA n񦧆h'155O;0 V񧎁1=RݸO/٪c ;}tLgGV3nf>F0_h] =_9z <_Y`>`7Wl!JKk* -x:B#d$/z 7|ai a]脬0)]VD@Qk0E!Q7a =CM=J: -V.ppJؕ\| B.kGuY?k$-uH[0徯xғ"EhSV¨EE\b0(+ -Q -!3X2!mL HTW9>"]9b;684$'N>$ ;6>훀'iO=~K<|لvTU -U5Hnz%TUmUehrA+Q$5ۏ^"7z;q y$<@%}C%_~STGyw'FQ0b=>r"kzgC]BG}h8uvKJ6:t3Iy.199/g{8ng?9mȜӷa\5sk{&1L]B -)рӰOlXC3lƋ[蒘SK$S~~ܰQja)נgȷoΒ\g4*/Wh?= 5bU?*&M+S͞yf 'ut1{>#~\{FWH04zAf(-YmҶS -ruGnz"=OJk3jB5&Z -+ XWh cx=nh/׮РmϹXӿKdJ9#ȳLy:iă+{c32|-_ߨM[l: w [6=j* }id,: cs -3!ьLYאּu̫M7d_U^ +xڽZYs6~`ޤ-ɼf2NvRT&EHEjy~Cǖ}ų`WW߾g8 %8!jDBeIʂ?~z|C9^zIѧ{F26z}]˴u$kսiH0^cf +\c쪃tEOip`LOStK[}_QeNI~$(T(c ~Cm2d[K<9hPN#$hXG0Ɂ j5 o"LA0>e+Mqg;/CP^`$"/LA~*}VZSU^s'$#xΝS߾vY].y>UJVwE82@.4oi9gX +=e\7Q˶59P>RӥcuA +-8sAʽ~R3Nӭײi4 |af'z[l{J#[UWd3l(,̨ ۝,;un#/ ^喓ޘF0 Ad9j't(;;+}7;A[i9Vv!7[ΥыVQBf:iCLU<$a˳9O^gs +}hR"UQPF_gg!>1</Klߢ16sK + ʓ"{ oyi783q)Cp*/&cW!JtxE%O!#^f 6* eG!vP* yħ1%@͞!di:;48֔g'گ: Y366So"bEarN { "vn@gΖUrWrRJ.QK"0NYJ u[ͺP<ERIxR,6^g:}h$] C6ik|4%y2BVfz@c{'wqB1yicяF ZL$@{ADRP=>o$՚zf_  G_!>1}+l{K@|}!?xqWzr,U e xVndlr7p5aزe`rASIrme7iu& _[֗wݡv|@NGE}ӒLhnxD+WkٸoRX[6 -frCOz{8[R ]fh:B|f)3gw5,V{:<.fk~2HenoW”H%j:t?[:vm=fAͦ?Df7nV?o|z77Sߢ-#i{]X&\ݳ{%IWW:3F'J?nNE }`=Q](;{kxBnlwZ;>(bSx endstream endobj -707 0 obj << +706 0 obj << /Type /Page -/Contents 708 0 R -/Resources 706 0 R +/Contents 707 0 R +/Resources 705 0 R /MediaBox [0 0 595.276 841.89] -/Parent 639 0 R -/Annots [ 705 0 R ] +/Parent 647 0 R +/Annots [ 704 0 R ] >> endobj -705 0 obj << +704 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> +>> endobj +708 0 obj << +/D [706 0 R /FitH 778.724] +>> endobj +174 0 obj << +/D [706 0 R /FitH 695.216] >> endobj 709 0 obj << -/D [707 0 R /FitH 764.175] +/D [706 0 R /FitH 632.917] >> endobj -166 0 obj << -/D [707 0 R /FitH 739.268] +710 0 obj << +/D [706 0 R /FitH 634.163] >> endobj -170 0 obj << -/D [707 0 R /FitH 472.293] +711 0 obj << +/D [706 0 R /FitH 521.084] >> endobj -174 0 obj << -/D [707 0 R /FitH 292.76] +712 0 obj << +/D [706 0 R /FitH 522.183] >> endobj -706 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R >> +713 0 obj << +/D [706 0 R /FitH 368.456] +>> endobj +714 0 obj << +/D [706 0 R /FitH 369.555] +>> endobj +705 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F4 275 0 R /F61 278 0 R /F60 277 0 R >> /ProcSet [ /PDF /Text ] >> endobj -713 0 obj << -/Length 2225 +720 0 obj << +/Length 2656 /Filter /FlateDecode >> stream -xڵZ]{6ϯw>ػl;tNϴ -m6<ƛ$HGNl0x{ۋ(sܮ4DAJ3D<]o}w"I >_qHRpNPL#dpZioEAty#%3AD/BDO ZO>{PMzs{%X5 ESJTڀnrB˫Smn \rե,׳X*uy$_/IXC_ԇuj߳O2vZ8/f8O:rRI@() 1FY%@BA0\|:˜,^ǾJ| -@gp/`#͍v׼e6K6f2qUp!ö,&lP_4r~w֞&U4k_Z.}:7e== IeʻBk`Ԃy]p+fjd+b8ee[i+6ϔ(:SݖϫF/t6@Q,Ҍec^טMjӍ>*qƠt:|٘P%(m֝qAˡq7W!^;Y@x-[c_SFt@,1^Ht;@ٻ5J"Ok;!QUn݁ߎƛr,b-]T=׳nLXhFplf{bn|"?T~ --2vW]SLelI]tڄqVM?]4ʮ3aV up2V#\EF4-42b{&=رA)ڙNAR;),/o:!ahl3g M| Sf4ƪ1 -.>AeNkХJ4O2z-ٽm]V2{ JbuK.Jۻ쬚E#7Su5Vuc\mQkca/@YvSiѤA#e8o꭛R`s1rp ~L}װeW$D:h .&_+"aWMb|j95G]XwfX۶?FP{>Zȫſi:e7r` Nv=ߍS0OOys[o$6"8gfߴӵ>T2 Q%SMPߖ~7dYiZYhHQl;ƏgBp@*7b(P%A˃4iG&<3'\&';!1K aHs̤sHRpf*0@w𢞌o6[pqPn,2~jJ F>A) wԫ;h0ڍQ7- -$_@tE|jAUeijF-yJσZ]r')W^ 13'6vjNUKrF(&6WdnN)4|jg^>:C#]X>lk7/ -%P;#Jce8GFY*1 sO !{n泞5|g4`'RKPZm=w>_Mͷ~0bp -̦@LqDLʞdaNqi,.f-OWɂ{J#[V3mR3X7/X0f4Lcf|18Mt:T3sa^)Ŗ=4G.f4c9B.Sz_Xf;IH5p'4xR^Kq!/вpB8+і"c-ߤ}ރ{7g_ޝ|(SmGIyq +B /ވ7|.~P! +N +t'|M^+Ͽ"^q3E_ ^ T'Cg^BT}0Jcvg?{k@{y!  Å?5X߂R$$ArK0ˆ jmf@   Ks(Hӣ {ߏ;&'#I0x`20|bD/!#4NbsҹD?})R_1Y^d)E2 +( QuO.uΆ$M;HM>/W^5 Jjkju^_f*Lj`| K5ld)b*vO֞cO|Cy-(QR/ $;)8p+X/8DBg=R#YX/(8c%Yan%_}͛Ίޗ}s ; P W"?΋ >a, ;Bꁗ=e!8.$k;x>($֑$ B)KKeid)KDztO`-Hz)t/ՙ=L=Z(udA +0Rwf+SEu\Rg"]JɎz/Hv0m=`azy:@S~,ZW JNx.,uirX Zr@|ו4 P%v[l-TE(qzKjdVjuOV`Y^)%$]2k K8֘sr,;H;"A(!|[-.DEH JR&E`--:Ӑ(H ??\_-}o% +')/U=M+=Z(uD$E8N.۱?^-3ƈ<1^g{$K=8ֳ{P<눞1Twqog`2O\x|g wā[`%9:"_ ?Hv|]^c8LSr%Kjd)VbuO`Y]&9 Rg&u` ǚ%b(UjrTHQSu_ʟ(ir +Kld)`vOc|WSHElIS$.w q݂}X7 Rc;~z L^Vn-}:ۉ7Mխz,eYr+K6'd ˞e/-\V}x`r M.Ӫ,\l&18W5σr#/S(~fY=fA01eՊn<TnjaMYRo'@áFe1=-<+429| TMi#SeSKbo;/CYvSMSCO^eͧ'RO_N:;!y#hX~vwc'Z)> endobj -710 0 obj << +717 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> ->> endobj -714 0 obj << -/D [712 0 R /FitH 764.175] ->> endobj -178 0 obj << -/D [712 0 R /FitH 695.216] +/A << /S /GoTo /D (page.39) >> >> endobj 715 0 obj << -/D [712 0 R /FitH 476.304] +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [115.317 293.809 130.945 305.559] +/A << /S /GoTo /D (section.8.5) >> >> endobj 716 0 obj << -/D [712 0 R /FitH 458.233] ->> endobj -717 0 obj << -/D [712 0 R /FitH 435.656] ->> endobj -182 0 obj << -/D [712 0 R /FitH 350.729] ->> endobj -718 0 obj << -/D [712 0 R /FitH 288.429] +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [271.064 146.59 286.693 158.34] +/A << /S /GoTo /D (figure.8.1) >> >> endobj -719 0 obj << -/D [712 0 R /FitH 289.725] +721 0 obj << +/D [719 0 R /FitH 778.724] >> endobj -720 0 obj << -/D [712 0 R /FitH 176.646] +722 0 obj << +/D [719 0 R /FitH 739.268] >> endobj -721 0 obj << -/D [712 0 R /FitH 177.794] +723 0 obj << +/D [719 0 R /FitH 732.374] >> endobj -711 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F4 288 0 R /F61 291 0 R /F60 290 0 R >> -/ProcSet [ /PDF /Text ] +724 0 obj << +/D [719 0 R /FitH 718.825] >> endobj -726 0 obj << -/Length 1513 -/Filter /FlateDecode ->> -stream -xڵXM8W[\5llCQ ;dCQXITY&;~[؎'Tb[nu~zm<]XΞG0JqJڋ1Jȋ i~GASs<˫V|VRFl \^6Uݠ($ Wϲ sexQaG׽˛q΄j9wF'Du &@i̼n3rx,iʝP9\xf;sxT0MP R˭q?1 `B,>/'A !]# ݢJmV慻5ݯJUfޫLܼprXiDE6S10vI>dU|",kEHD=}GP<^q8Ҹo7Q/kwSX$Vg@!4OBQ]Ԓ74ݎ"kx`0vWnEk.~Y!+cc=4>(JQɘtV_+.~&іu" -| -Τq W |CUk)Qٶ-_ݟx7P`&46JM8AЧQ*b#Jd:SpՖgQ=_[.N`q_CM9QBȐO|6وbX5Cu=p!Z ,᫆?Q[0GS}c]ytTænTk-CT-ô?]⊅ECS-N] hZhUY_Jy;6Ya?vST7I#?AlKua׍&]p}p1X -+<7#E(I0dF1x=IQ'#Co)\®yFZzXoH҅ YuSId$t)1JdNSz%Xg/t`_C xвMf4D!6L=ݖff45DHwZ )@p& 4uc6lTתoş_X ƿʓEcG9e+ {!@@Pڜ\5sE> )xNO:`.: mFVnZ;'}bl:;0O'(Gjk'r7tZ4n_3ns_-'wQYgM6U9[TSm69}LǕ1\4 L2ئf9n9ۼSƲ*[%W#Q eݖ+Dm*f>$lͅMv7x_V -Co.$,l:w&~30y:M:JϺ,XzSgm?t7c1 -IKm,5餒J7%meqǡi/-[J?yQT63xN`g")m A;nk[vpt';AbÁ?b -endstream -endobj 725 0 obj << -/Type /Page -/Contents 726 0 R -/Resources 724 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 722 0 R -/Annots [ 723 0 R ] +/D [719 0 R /FitH 705.275] >> endobj -723 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +726 0 obj << +/D [719 0 R /FitH 691.726] >> endobj 727 0 obj << -/D [725 0 R /FitH 764.175] +/D [719 0 R /FitH 678.177] >> endobj 728 0 obj << -/D [725 0 R /FitH 618.498] +/D [719 0 R /FitH 664.628] >> endobj 729 0 obj << -/D [725 0 R /FitH 619.646] +/D [719 0 R /FitH 651.079] >> endobj -724 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R >> -/ProcSet [ /PDF /Text ] +730 0 obj << +/D [719 0 R /FitH 637.53] >> endobj -735 0 obj << -/Length 2685 -/Filter /FlateDecode ->> -stream -xڵm۶ߧ`7wLHNIsWg$mę-Qk/L{ '-D ۋ/.G} 6^X/1aAݭ/o_ݼfܿ|d/!_gW?}*P&"F:߿T'|2*kИ_~/K"K '~C_.(^ Hqo'[w߀BCw y@x( ..iKGM|ߒ$AOdKPPiA1,6(tb&CKH"1!W!zQI‘, 8Q"$P3DD؋hH"q"8VqЧ"6N3ypϓ,$!o4Ġ bI1YhLb}^k1Ijju^_S(@x<{}l]edͶ!n }NX4WϷa1" JP#>CHJN$W9Ͷ#nJ$:H"$"1B.Cx!qcs*#soe !v˵&L@#Hq09ҵvӕꮄ~U 4N0VǗ]dE aLJDg)3>)$4 gW /q 6H(8FW>vº oM2-:1"Xַ(òUFlBК n+UF lBkXG!]bnK}? ¢+t]F΂|X4+0R͇`a#v˵Dޮdg+yi b .+UFlBk=q@ / :KjI/\TqID Z+ͣǦUFlKBК5{z<ʬ<6d02cF[,b ‚PCy7erVz%D0G$(CfUFlBk4dDg" ->mZLks'~B|y؄ȄmDr@Mce9{ϛ/R c*#oe!v˵NLyxU]ayL""(wH`A#v˵N3q_z08svSyذȰmCZ.=J89s97۲Z7tQ $fY/rܗJ<_i>622f[b\RrkwC*j B~͂R?-(\'w v'eUl42k&o[w;uW4mZz;GyEK^nUUb,]wO C3B}\7.dVnLikWbTIuaKOC^34f@ ŰLnۡ:DU+NDn'2ɦ|Yxruld Sg(w&^"[OhTu]6ɪ~@'T\r`ce70/Ǒ }薭ɷYre,o q(}:A|Q(\u -GތGd! Ґ[ܾ(4i6 M"l"3'AYpD6w0}WT6z0>QإW2WULȞ:!-dԴޡ1j1EGy,W*_R6ܤ5$ -#7tٻ8uwùOyxqQL~/ҁ_3[&0S}mwf3Yzڬw6ݨ/LF>IIu]YƸSM(';z{PON#J6OLj ѱzo=Ϙ{ X֬x$OM:M36hF2CP6pmLߌ="k3iމ[;/3;}g&bN?Ǐ EZӕlrJiF%ĄF]8Bȃ&-Bnfm |:XC-/f0b!Ldc@Q/:?_Fu> endobj 732 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/D [719 0 R /FitH 610.431] >> endobj -730 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [115.317 293.809 130.945 305.559] -/Subtype /Link -/A << /S /GoTo /D (section.8.5) >> +733 0 obj << +/D [719 0 R /FitH 596.882] >> endobj -731 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [271.064 146.59 286.693 158.34] -/Subtype /Link -/A << /S /GoTo /D (figure.8.1) >> +734 0 obj << +/D [719 0 R /FitH 583.333] +>> endobj +735 0 obj << +/D [719 0 R /FitH 569.784] >> endobj 736 0 obj << -/D [734 0 R /FitH 764.175] +/D [719 0 R /FitH 556.234] >> endobj 737 0 obj << -/D [734 0 R /FitH 739.268] +/D [719 0 R /FitH 542.685] >> endobj 738 0 obj << -/D [734 0 R /FitH 732.374] +/D [719 0 R /FitH 529.136] >> endobj 739 0 obj << -/D [734 0 R /FitH 718.825] +/D [719 0 R /FitH 515.587] >> endobj 740 0 obj << -/D [734 0 R /FitH 705.275] +/D [719 0 R /FitH 502.038] >> endobj 741 0 obj << -/D [734 0 R /FitH 691.726] +/D [719 0 R /FitH 488.489] >> endobj 742 0 obj << -/D [734 0 R /FitH 678.177] +/D [719 0 R /FitH 474.939] >> endobj -743 0 obj << -/D [734 0 R /FitH 664.628] +178 0 obj << +/D [719 0 R /FitH 264.879] >> endobj -744 0 obj << -/D [734 0 R /FitH 651.079] +718 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F4 275 0 R /F60 277 0 R /F61 278 0 R /F27 195 0 R /F38 444 0 R >> +/ProcSet [ /PDF /Text ] >> endobj -745 0 obj << -/D [734 0 R /FitH 637.53] +749 0 obj << +/Length 2375 +/Filter /FlateDecode +>> +stream +xڵZK6ׯ`Y>K ]'3'9N&S}HlG +=@X:|_ߧ+ޫ{~Gڋ|3E,F$/0ԼZc-f+'BRP x_}Uh w+/H#*zo@6I8ҿ#x;CPQo}/[@Iboߍz!%ÿ8!U~_|.T~x'\ҥ[H?o^y#3fXi6i@JMS)ͅq߲ɊWtDYdˍl;= {.#ʊh`Gf/UZ@n=aHP& 2oxT,rer7r4״M&YIse g +ҶmdHH/UG4,SAjЦJp2o +H(D~韂`wU*^tzY%fEj̱kEԑR%Je,%VGDWԡlG^Ų1< &1b?ď¤oP?b+]pPGA됁ЀxPcU[JiGBL$9B/A Lje( !?v!ɂH)Jv58±p|pBǐ24-SZ$]v C!HYB|.3YJ *GMnj|_SBDɗeE=b(B[ڂ)aUݣ@"$RlDId>8_WVj1q9 ce`Bf=mڪP˧O +lՈؤ]Af Y$n= P\Yl[p!K*i#XvcW=e!7. ;y_/KmDas+U[:1Q<ހ.Dd"nÝ_)\?pKl>5Ͽ̫r˰UnR bi! [_M:ذRimj^.zɚ*CᏆ(NZi7;e tNu);\ )YW$5gOnkD@@}˲ay:GuR6 &*=dzV!2Ϸ1w2VzDvm^Wg겛X-d$7Yy&Rk _7ҏ(@S; gC ^}fu X@v-, w|,b(@!-XeyjNjB ͈햯a>}tĈ!mr/򍾉fcƄY&By^YMyDI1_q力a| $3F;<3vhMN&gdjmolIHH=G$ݔ]U6;z]m1 h8]Kv) KciEײ`G4H &asE  3H |}{6m¤|0a#>q_=B<3M4^H] !\}^ۊu#lR}]o$3zɋ;Z_:kCOKu2: c/$\׌[`om}&`9ʗ'wJHxf_8O={?]֥]߽yO m767ԸۈM5Q44vUH-nJw*[-L{WRovT&t| _4#*s U~p~\g|K%lJ}]gf52Dؤ<;' H.6t'jkH.Og]qnqp 4e{[ Y3uQz$vLv\ nOVD=1Jqrޑ 'Wt)\}T,Z5 ;^j[ONV$B`DE)RSm븨9ٰЭ3[\^6VkjuQwH P +endstream +endobj +748 0 obj << +/Type /Page +/Contents 749 0 R +/Resources 747 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 743 0 R +/Annots [ 746 0 R 745 0 R ] >> endobj 746 0 obj << -/D [734 0 R /FitH 623.98] ->> endobj -747 0 obj << -/D [734 0 R /FitH 610.431] ->> endobj -748 0 obj << -/D [734 0 R /FitH 596.882] +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.39) >> >> endobj -749 0 obj << -/D [734 0 R /FitH 583.333] +745 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [101.08 324.453 116.709 336.203] +/A << /S /GoTo /D (figure.8.2) >> >> endobj 750 0 obj << -/D [734 0 R /FitH 569.784] +/D [748 0 R /FitH 778.724] >> endobj 751 0 obj << -/D [734 0 R /FitH 556.234] +/D [748 0 R /FitH 645.449] >> endobj 752 0 obj << -/D [734 0 R /FitH 542.685] +/D [748 0 R /FitH 646.695] >> endobj 753 0 obj << -/D [734 0 R /FitH 529.136] +/D [748 0 R /FitH 580.891] >> endobj 754 0 obj << -/D [734 0 R /FitH 515.587] +/D [748 0 R /FitH 582.137] >> endobj 755 0 obj << -/D [734 0 R /FitH 502.038] +/D [748 0 R /FitH 516.333] >> endobj 756 0 obj << -/D [734 0 R /FitH 488.489] +/D [748 0 R /FitH 517.579] >> endobj 757 0 obj << -/D [734 0 R /FitH 474.939] +/D [748 0 R /FitH 390.804] >> endobj -186 0 obj << -/D [734 0 R /FitH 264.879] +758 0 obj << +/D [748 0 R /FitH 392.05] >> endobj -733 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F4 288 0 R /F60 290 0 R /F61 291 0 R /F27 203 0 R /F38 443 0 R >> +747 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F38 444 0 R /F27 195 0 R /F4 275 0 R /F61 278 0 R /F60 277 0 R >> /ProcSet [ /PDF /Text ] >> endobj 763 0 obj << -/Length 2393 +/Length 1625 /Filter /FlateDecode >> stream -xڵZK6ϯqTAHHɮ]I9N6;84"|Xֿ 5aJnt7Ѐz> |q=G^#I=??~ 3K%E?Vݿt%=RPJcD9%"`"`O "|aI>➏dS=fO8dr_w?G޾(#QipF\!~_D|,idYUdjD,"_5-xy{WoReRqIIj TTePX$7P9_ VDG1=m"[+eav,뢔i5sX"M9~C -I%Lk1SI]!}K:_Փn"&]nlE(EVV3{| Cbڽ6IPYScB]tE)3QGD&˥F\aV&Vd&ϕ1`Iۦ\:D_P~~tB^E]};c13Y $ӡ[fM[iR)pW;8CcȺ,l5z/6WY@:  5YO[WφfK8d U]F.CCiE9k{,s<{(OiMq %oyB =V"3Нya,nFg" 8p~ fI`9bw]&bE@ttT_Tmi%#0XgGe#!EKY3ºIXoG<fu -ma].R0r0[m%2DX˱hF5VI vDeRY˿~%;)_ҺLP~af[QMAO.ڛ{.OsCH58sz`6+\Hz X8%KPOw .%]սږ<3TobwPS`PmjʝqEJLi0*J߀Ҧ+צ=q9Ajrߒ:.|eEYιv)F}1Vhjb|"!l`>yO)2 Փ&l4ډe -Qz#`}Jf9yqp50L#[JZdg@wJy#{sji BNZG_3M -m k9%7牛7C^IgfК~LFdjmotdtJJpL穃Ҷ+Z~Gڪ ;mz:W@aLD]0Q>'"DςW#7RaRؿAotȟ -$K`svYT -%ƒrg*LLRYYIKp;y*H-LX}o9fhje8"Mݑf6 Qv s0Y؇)EZ–+j1"Oʴ%cbuyr MFG=uE߫kԶ.ӟR(D<6_ʄ5.zP`g]euNE]W5mMfHqihx*-ZhU'n oU>X&(vϝW;?:iFe**~W%P9.+uwY+[¦gUjYS@O\DeSLfdy~b!J5iK!"O Ҽ{`f]*oBZO]oK5NTytBq#N.B \'r+$f-R_qx4VUz+ n* -NVj=3P('ybQ;띓 -ݔ;ӕg#i%\sM,="42 3 +xڽ[KoFWQB>k AN8F%ŧ-\`Po8~h.`Nj'/@0)xA ez v<~Z|wٮXޔǷWՇmHoV,7ۛZf&;ܔ< -\[bC(ۻ߅ďU ;8 {<+´nt5ܡmrm@+:ÅХ'.ܜ]^=Cg {gwt}s Vqp2zV¢Wް}l2 Ж jd\]I+ Fj\"b{!\sǫm0vhTp:i=?Fx\4"k|[QYM5Q]Uǃ +c(- X6lN{q^'O܃ i0@D ciƭgtrGDx@kkһ2vf~s-r"[+0+RW_z0<1Qk?@n%.wΓ,~}=Bƺ[~# fTA +㬴E0"Te;2㡍<#R%BMVFl0Ņ98:( +ӱI5 + \}~.76kY~p_8C lN. XCS]3QbR3"dIj:TI-BzJz7xM34^seuj a1iGٍh,JZg44Np'M#-Y*(WY2{lm'(˅o5{> endobj 760 0 obj << /Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] /Subtype /Link -/A << /S /GoTo /D (page.40) >> ->> endobj -759 0 obj << -/Type /Annot /Border[0 0 0]/H/N/C[1 0 0] -/Rect [101.08 324.652 116.709 336.402] -/Subtype /Link -/A << /S /GoTo /D (figure.8.2) >> +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.39) >> >> endobj 764 0 obj << -/D [762 0 R /FitH 764.175] +/D [762 0 R /FitH 778.724] >> endobj 765 0 obj << -/D [762 0 R /FitH 645.449] +/D [762 0 R /FitH 658.187] >> endobj 766 0 obj << -/D [762 0 R /FitH 646.745] +/D [762 0 R /FitH 666.436] >> endobj 767 0 obj << -/D [762 0 R /FitH 580.941] +/D [762 0 R /FitH 625.908] >> endobj 768 0 obj << -/D [762 0 R /FitH 582.237] +/D [762 0 R /FitH 634.157] >> endobj 769 0 obj << -/D [762 0 R /FitH 516.433] +/D [762 0 R /FitH 620.608] >> endobj 770 0 obj << -/D [762 0 R /FitH 517.729] +/D [762 0 R /FitH 580.08] >> endobj 771 0 obj << -/D [762 0 R /FitH 390.953] +/D [762 0 R /FitH 588.329] +>> endobj +744 0 obj << +/D [762 0 R /FitH 555.747] >> endobj 772 0 obj << -/D [762 0 R /FitH 392.249] +/D [762 0 R /FitH 396.005] >> endobj -761 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F38 443 0 R /F27 203 0 R /F4 288 0 R /F61 291 0 R /F60 290 0 R >> -/ProcSet [ /PDF /Text ] +773 0 obj << +/D [762 0 R /FitH 404.254] +>> endobj +774 0 obj << +/D [762 0 R /FitH 390.705] +>> endobj +775 0 obj << +/D [762 0 R /FitH 350.177] >> endobj -777 0 obj << -/Length 1634 -/Filter /FlateDecode ->> -stream -xZQo6~࣍,#=芮KA&fs&;J,)*ѧa#[wQJ %g/f_ZɨGW2 -AL߼c4N?ܬ 7j5@EG#-)^·vkXjߥNWLIJoM^7.۪mH?i2z'N̎?)qF&Aw~ցt69|%~V=Z1ʨ}-WNʨ^PNG`Et vwZ8h$HB -78^Pzw( MX/AZhXAˁT΢z˩J"VT @w$kM4?j3VRh `|bg98 x@zdE~&jI? N$YUpus▜oKTjAf` 6N76f@X( YL[A˦kՍ[Hymo¨ts[C4A,!JrsVeae7&үJ{?HԴ2hd)[vƭTe)'tǨYj*Qr{n#PsG͑M NGӢ _;eShz je|:=.{?rK֔CMߝvwM9cWyn1AfAs9uR?hL_/NRҺfogF7.X h"]RgT Qk3@Q;Ak6k5WQ40CQf@S ̪̊('RzZQ:O"0nX.ɔd h=L.Y؎gX+7Up9R{G-+^]߮cV~XЧj|d][\\nʋ/Uޗ7C>Z{xNI7KmtZj3S0R$\B9lQ8ܵ[ `ѱ0Թ quauY^W#yXO9:w~響tQ9Ukcm5r)I-BP#)3M62/iǐ| -{Rx$-$'12vd 1X;#+²RϺVGudjp#pX)&&H$D v@Lfsm)xSԆ)jw:#X=STd@96LrYbB0d-L{F,Ӑ'9dFr'ZYZݱ=UDF5>wm} ӱk#&%Ϸ`6jmyAf%^WtH^>MT_W, -#Hfԣ 1GYj\x=js39T= l R?D[ai.fsAS+HC ܂+H'éK[P6439ǐ|>:VMHBfgѝA4 u CFEd*tg]{|nh0e -endstream -endobj 776 0 obj << -/Type /Page -/Contents 777 0 R -/Resources 775 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 722 0 R -/Annots [ 774 0 R ] +/D [762 0 R /FitH 358.426] >> endobj -774 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +777 0 obj << +/D [762 0 R /FitH 317.898] >> endobj 778 0 obj << -/D [776 0 R /FitH 764.175] +/D [762 0 R /FitH 326.147] >> endobj 779 0 obj << -/D [776 0 R /FitH 658.1] +/D [762 0 R /FitH 312.598] >> endobj 780 0 obj << -/D [776 0 R /FitH 666.448] +/D [762 0 R /FitH 272.07] >> endobj 781 0 obj << -/D [776 0 R /FitH 625.87] +/D [762 0 R /FitH 280.319] >> endobj 782 0 obj << -/D [776 0 R /FitH 634.219] +/D [762 0 R /FitH 266.77] >> endobj 783 0 obj << -/D [776 0 R /FitH 620.67] ->> endobj -784 0 obj << -/D [776 0 R /FitH 580.092] +/D [762 0 R /FitH 253.22] >> endobj -785 0 obj << -/D [776 0 R /FitH 588.441] +759 0 obj << +/D [762 0 R /FitH 220.639] >> endobj -758 0 obj << -/D [776 0 R /FitH 555.809] +761 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F4 275 0 R /F61 278 0 R >> +/ProcSet [ /PDF /Text ] >> endobj +787 0 obj << +/Length 2603 +/Filter /FlateDecode +>> +stream +xڽ[KϯoRyƃIo[v9ƞl84b-EE*T{ăQ;5?ޣw7|a`x/( D(Oo?.(Nj/ ^!Y?֔B"|!AKr_$y(XFBxŏR`%#a{uw7 EzYo!VU/(jw[ýAB|ՄS9qB4/h!" B! ~ :~yVKߚ[Kޒ{L *Zs{e:S);S6}IsNҬi?]pRTVď@zKB oJ֤l&+Y1YZscZ؇wc^ Tnc39IS 2)~ǘe?XJ) ;_ +zoIV:V5ܰH ?Y5G;dX 0H`Maw #N C0yߟ0CB6ضU*Uh\|jq(CE 8s( k[K0F}ϲۆ)wy0ƄYK( a`9o*=-ajp?b}C}s0}J{ަaK?r2\Diɐ(d|/BBG!&`IPÁ/@FpG4@Q$:@4x~pPCpZ%Z}P$DPG>X+!!*f + + :*U,0}~3!X\K:^H15eiePB*xeYxMk*!6оm `SCgfoJd"'[c]Sy+۝PQPy }-<:<rŮfGRiԉ:ќrL~紈N},XX +͌ Dqhs +=oMV\ 3vVT:IlKZV) #ԱJ;6ٴᵃ&d8D`_: :hovæ +EqFZO,p|>(m\جF2R搦/=f|=O^EM""_bA`GָBuT1Hξci33+ԼBIėL9L:P{y=`|ZEBXYO_sSXW! )qAZ $DC!mHm>e} 2& +Ĭ_JFĜ`G .CRBD^|+|)/K63r~fx^@W +8t<WtU^*}3BG|)yKI63w~fx3UTaγKȊ[9xuܤPGé|!'HGR +[tYg $63b2axւ/xI#`f Ou:e] +3R7 k|)/K63r~fx,ܼh&{( +h85:pfo1]PQ̟PQ$ίO/vo^H{'#^XՄ7ޙJO> 2j^"-lGH{^1oN!mh#!fy([9y7TszNu&z;HgH&%_yN#7`}%($&9E{TJu*;}QN x[9GV#*ɍWmz}v4^6+ K:ۺ8> endobj -787 0 obj << -/D [776 0 R /FitH 404.241] +784 0 obj << +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/N/C[1 0 0] +/Rect [512.504 763.178 525.406 778.72] +/A << /S /GoTo /D (page.39) >> >> endobj 788 0 obj << -/D [776 0 R /FitH 390.692] +/D [786 0 R /FitH 778.724] +>> endobj +182 0 obj << +/D [786 0 R /FitH 739.268] >> endobj 789 0 obj << -/D [776 0 R /FitH 350.114] +/D [786 0 R /FitH 613.834] >> endobj 790 0 obj << -/D [776 0 R /FitH 358.463] +/D [786 0 R /FitH 615.08] >> endobj 791 0 obj << -/D [776 0 R /FitH 317.885] +/D [786 0 R /FitH 601.531] >> endobj 792 0 obj << -/D [776 0 R /FitH 326.234] +/D [786 0 R /FitH 470.234] >> endobj 793 0 obj << -/D [776 0 R /FitH 312.685] +/D [786 0 R /FitH 469.227] >> endobj 794 0 obj << -/D [776 0 R /FitH 272.107] +/D [786 0 R /FitH 455.678] >> endobj 795 0 obj << -/D [776 0 R /FitH 280.456] +/D [786 0 R /FitH 442.129] >> endobj 796 0 obj << -/D [776 0 R /FitH 266.906] +/D [786 0 R /FitH 428.58] >> endobj 797 0 obj << -/D [776 0 R /FitH 253.357] +/D [786 0 R /FitH 415.031] >> endobj -773 0 obj << -/D [776 0 R /FitH 220.726] +798 0 obj << +/D [786 0 R /FitH 401.482] >> endobj -775 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F4 288 0 R /F61 291 0 R >> -/ProcSet [ /PDF /Text ] +799 0 obj << +/D [786 0 R /FitH 387.932] +>> endobj +800 0 obj << +/D [786 0 R /FitH 337.93] >> endobj 801 0 obj << -/Length 2634 +/D [786 0 R /FitH 336.924] +>> endobj +802 0 obj << +/D [786 0 R /FitH 323.374] +>> endobj +803 0 obj << +/D [786 0 R /FitH 309.825] +>> endobj +785 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F38 444 0 R /F4 275 0 R /F61 278 0 R /F60 277 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +807 0 obj << +/Length 2609 /Filter /FlateDecode >> stream -xڽ[KϯoRy&$Cn${{}HЈ9h'4`;5tY0{w7oi0J׳(@1糈Ljdv6ۏ;‚J8W>[?ڥBNa_~fsP_wwP/h$| > Pםǟ0Pv v1%-7VG@xvhFng!|Ϳ,FB$ѐHh%#`~s:~y.ꫲvxT/U־uy҇\Tc fw#傰AܫכC]˝Hk-z+״XYE> MZŭ:UD}ѿկ$kJ3@Y4+R1ZiahEu=ܩ}^g]^Ӯ|ܥHcA? -.0f-r]fu5XJaȚ,cr1%ޤz!s :~blt^JEtY@_߷Rf@KqcG/@!7"7(kFMG ٦F:<2.Clw|FGz1=U O9cx !%=lu~d8<`XUN&%(KXnCX P5p P#<ѤD(IѬ#3D [~%4JW}5#CeP6*xmFB|48a^t7VLGR~qJk0}~31X;%7}cO3VmAwi)eP,Q@6@ք#(߶@D"@$#ِ7I2x~ҿ5ċz; B!!AD̋1ʐs,v03efH Ds6 -Uso0wAg#,AEl*tشcèIVl FXŌ:T[B -9<.1I F$b 36[5ş{HXy& ~&V~+:Y `;­Y$Df%m$5peW̛<m1aroIl`T`0*|Dl~;Qؗ (2#`MXi<B#>̠`Ŵ.\0;CiS8!KL|\Sv$ʿ &zgE&9 ~w>MAφ$8g$<5tu SJWNEׄ.S_CD}n:=vE 2&c<LwJnlfg`gۂɃ:},߉%t˖o\){ƥ-sIo.ͺ g}A)yڕ+:];~x KUV-KY^fӞ)!ǗS&5maEY9mJ6U^nT ddPZؕTo䕮%4ՇuSʛO.4("SfezoRY٥ݞ]vؕW?ab\ zƘvP,6Aв,ԬH3cUQꪴrmsh(F8}}lwv]?561JK:_Lu!_o8(ơK -vNH2|ieJ+'Z_[Q۔:}݂E^ow4 #ԲO:p=Æ5ǦnݪѶZS+2j-RcI[%$[1m7mUTe$>m) xzT_kŨfsFEkVZ*`-vXV>^ˁ /HpWuKyh$oY,I(0_Z.pY"S&z`Uo CIx^>޾{_('bS1j6Uf +o8/UǶw13yW;y<- >ؤ?^m壼m^C뤗UpcoeV43BzPP6rZ܋.OsYSF􈤏 ޢ[kdh-=HGרJA[ݾG2]G0Mծ)?zU CO)XoMɪ,iU7ʪPyP+:Q 8u/̦@q!iWvkLeJO¶ֈ5EY|?&c)m[M%6c#dAr& ƞC +2+yU VvRowzUZHU~k^Kj>&z\iwvc@}8{t^ moʓ>jx[)AGx3"נּᛁ# G2Kuړ6i]3>b0F!vMŠw\ќ ?6ߤ%[0ᥡ_B4>$8&($Udxȴ݉C1#kC}?$( ̃4*փe7`1":!.IB\KPPj>QgT|-q|J|=j4JpԪ21"_C %DcK![nyI'P(0 "I0 <8'ÜXpbbI3<%VN  P\c7 )f&& *|x^a?tӛu9؍V-8l&>"\y y[͊3B"D0|%[ESZ0J"Qx`'b2$T/T5)ժz0LĊt\?rۦ +8(80^neS(1iM-JJDDV^Aq_`arFnMD=׃WwX(B fc vJ \;&Tq=遢҄}'g +A/ 4I[k|Np"G0-1UO^}6cu"!`?@{"YR .KV7ATg*A~8kIBJ} +V~rϘK7_Wxeֵz0'erȁ $h֚x +Q[CN}u[b2jAD \nǟR]#p_ #Im5%$AU dڦyie27c=x-ov=^ωM$PaK8-Y"&2{ d6EnGwڛdZTƒ.rw6#fq]bTCm.6}m^VVoMNT<9`=Ϭ endstream endobj -800 0 obj << +806 0 obj << /Type /Page -/Contents 801 0 R -/Resources 799 0 R +/Contents 807 0 R +/Resources 805 0 R /MediaBox [0 0 595.276 841.89] -/Parent 722 0 R -/Annots [ 798 0 R ] +/Parent 743 0 R +/Annots [ 804 0 R ] >> endobj -798 0 obj << +804 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> ->> endobj -802 0 obj << -/D [800 0 R /FitH 764.175] ->> endobj -190 0 obj << -/D [800 0 R /FitH 739.268] ->> endobj -803 0 obj << -/D [800 0 R /FitH 613.834] ->> endobj -804 0 obj << -/D [800 0 R /FitH 615.13] ->> endobj -805 0 obj << -/D [800 0 R /FitH 601.581] ->> endobj -806 0 obj << -/D [800 0 R /FitH 470.284] ->> endobj -807 0 obj << -/D [800 0 R /FitH 469.327] +/A << /S /GoTo /D (page.39) >> >> endobj 808 0 obj << -/D [800 0 R /FitH 455.778] +/D [806 0 R /FitH 778.724] >> endobj 809 0 obj << -/D [800 0 R /FitH 442.228] +/D [806 0 R /FitH 537.242] >> endobj 810 0 obj << -/D [800 0 R /FitH 428.679] +/D [806 0 R /FitH 538.488] >> endobj 811 0 obj << -/D [800 0 R /FitH 415.13] +/D [806 0 R /FitH 505.107] >> endobj 812 0 obj << -/D [800 0 R /FitH 401.581] +/D [806 0 R /FitH 508.176] >> endobj 813 0 obj << -/D [800 0 R /FitH 388.032] +/D [806 0 R /FitH 408.871] >> endobj 814 0 obj << -/D [800 0 R /FitH 338.03] +/D [806 0 R /FitH 410.117] >> endobj 815 0 obj << -/D [800 0 R /FitH 337.073] +/D [806 0 R /FitH 270.165] >> endobj 816 0 obj << -/D [800 0 R /FitH 323.524] +/D [806 0 R /FitH 271.411] >> endobj 817 0 obj << -/D [800 0 R /FitH 309.974] +/D [806 0 R /FitH 238.03] >> endobj -799 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F38 443 0 R /F4 288 0 R /F61 291 0 R /F60 290 0 R >> +818 0 obj << +/D [806 0 R /FitH 241.099] +>> endobj +805 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F4 275 0 R /F61 278 0 R /F60 277 0 R >> /ProcSet [ /PDF /Text ] >> endobj -821 0 obj << -/Length 2666 +822 0 obj << +/Length 2508 /Filter /FlateDecode >> stream -xڵ[[s6~5c з$m2d2֝N١EV&DBd][@  =ypy =1/b'Tx.Inrmn?4Y.~(Fo/pxUVS)U/(I yG_ RnpRJ>%h)C}毿O@vmg/RͿ,>EBLD[ -QgWt}CzT 3@w~Ζkui/곎U\I'u_6q欲bcI}|#@6m-:ku-mZZb5T!a,~%m\ƵQ^jUmZjs¸~JAԨk#Ifkc"gh/f˦,4Pu%c4:!JuA8 qO!LZ*@SQi:8~贑 '`}w~։6qw f{!1 -]C, !<[ ;ǐ 2l 8*< FX$FZ䁡#ZO%ޏ: I F':8MC"Ac9f@:uO|xd. ٸ2@ C]A -:,Y|w>V0T]$W.B 3ɹ[s e0z;k"`,d|.` \o:#K  gZr7^Cg18L>*GP8hVHcqExz=%g3pH'q}f W;Kqk g*l'vrpf8` Dќ.!iH`v2s˰ifAqC;(Ӻ)s]|g]N[RilAnl#-ʔ{:٫.)ݺ.*Zs )Ԯ.;Sn6SUޠ=ꙻ,< Vd -nCi\x.iM--3ףuwz%ַbDWa%$ZJH⽞`ZoPA|fy@:)Ϝ y SXs*`Ԝ&C ]B.WPTLXOnыCqFhsZ- +yJW 2 Y g IDpDzv.!a+wfL|jMcL|gI$d`S#;mZOOj*xQ:Owق ҁ> iSf7NB[o D| 9h܀+\ne\ |꣗]Ul:0m.O*904 F&-}. ݓޅv775*}Ձ{E>5`J1ⓐÐ4G6tq5r Cڞ -ۚv0:$)||q{75E3v`촵1bXQ@G_ ôDW j7yuՌAk}c?vt˸vK((u*sES!qkZg`S֋mp3bU%]?@E:%+9ϸ3dhH+=KI跪UAftPnH U֥Ho(+@ْhi 8!3Tg TgVWTms| -c.zCsz% Wx.$dzUvg"Asmg -TA@Q:"n:~2in&uxfN]hK×lFᩄt |E« -@2:~ﲟV^yB2OG??q~0]W֏pLǮMnI {ʳbr='O2,{LXG<0x{;A#wA<Dz|\r\rj޾=dB*(€r" ޼o~ERVi7`.W wC|AķJ@Rֺoo6t UmcBln>@"pr/+'?doے8BF$90DY`A Ҧ(:jQw3 "qU 7Q8.p(JϹѫA(qZ-*DS{Дwy#=,`*o.WR5;$ w"!\&2 +]Vx.J=̩-],uU;>ɗKTÉrαV;3Y^`×k5"y@Fjbkeom'7.LI09STJ?9klX*͡pV,!]3aOx>,2"@Bj\E%/c+ I%,GM9ǔ(82g=ƪf=TSEF2O͛$U;d%gWigbvE9N9`7o~ *^CX+Djy5&e̜Ɗy1un?"T g*e  yZ=QL2oOEĥMO&gy]*I.Y3 6JnRP\:_bYݹ3)g!G z,uzϡ"f!=XlIa7*7 [&" mGx&x+latKݾm1̐.f+<Lw%G0xӿ&O:V\TM;K.B_Vx.J\=̥-K,5¥Z_Parm&`I3ÎsDs~*q\Vx.J(=-~,52\6vcw:jo Z; +Ә&L.n2tL7rZg3$ѼiF +v.[\+9r3 ,yxZ Mq-mR}WX=B׿οC~[h+93 8zx֙p1I# +LNPrcr_&`ȇӵN=y\ +E+p +]ɑ˾oeɃӵNnʏt|~LdlE0xq5q@+<]ɑoeуӵH;}gWx <{5+i 'JAzNf?):cѥ<墷EY/CH쥍![Qv[7贈yUaXuߞG@\17J#zucX*u8.:VxD߃ܥvo9T(&I8:݆cZ"u&>T/{yF*,*I?3]^A dx%}6dI+ʧjP> endobj -818 0 obj << +819 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> ->> endobj -822 0 obj << -/D [820 0 R /FitH 764.175] +/A << /S /GoTo /D (page.39) >> >> endobj 823 0 obj << -/D [820 0 R /FitH 537.217] +/D [821 0 R /FitH 778.724] >> endobj 824 0 obj << -/D [820 0 R /FitH 538.513] +/D [821 0 R /FitH 739.268] >> endobj 825 0 obj << -/D [820 0 R /FitH 505.032] +/D [821 0 R /FitH 732.374] >> endobj 826 0 obj << -/D [820 0 R /FitH 508.2] +/D [821 0 R /FitH 718.825] >> endobj 827 0 obj << -/D [820 0 R /FitH 408.846] +/D [821 0 R /FitH 705.275] >> endobj 828 0 obj << -/D [820 0 R /FitH 410.142] +/D [821 0 R /FitH 621.401] >> endobj 829 0 obj << -/D [820 0 R /FitH 270.14] +/D [821 0 R /FitH 620.394] >> endobj 830 0 obj << -/D [820 0 R /FitH 271.436] +/D [821 0 R /FitH 606.845] >> endobj 831 0 obj << -/D [820 0 R /FitH 237.956] +/D [821 0 R /FitH 593.295] >> endobj 832 0 obj << -/D [820 0 R /FitH 241.124] +/D [821 0 R /FitH 579.746] >> endobj -819 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R /F4 288 0 R /F61 291 0 R /F60 290 0 R >> -/ProcSet [ /PDF /Text ] +833 0 obj << +/D [821 0 R /FitH 566.197] +>> endobj +834 0 obj << +/D [821 0 R /FitH 552.648] +>> endobj +835 0 obj << +/D [821 0 R /FitH 539.099] >> endobj -837 0 obj << -/Length 2550 -/Filter /FlateDecode ->> -stream -xڵ\mo6_pnXK>l"E[]Xۢr"T$IXvLy!dI3Cj8pշ $XmH ,V폷T:/>ۤW?(G!1E\2H]_K"iUge~A\^F"x%i{j+dn*%uo6}K\]犨Cի3 š֏WF]A!8 -;.\ \.S|ג(T4B Ǻ%= |$* 3m'Q>4VAbIQhMaI;)> -XՎ-\RxʊTJM"TӔhFkSb1=zfja)f>Z|b iԉ/Ta`WZ`Zdr~4z.{z/FK臮I sȥF$䜥U6E ":n&r$>|?F(p]sfC%V#"6>>XI,ͣb͊iEC`X m`PC3.ߦPA@dM!20+v\|TG5gR&?/;|h^y /cMR+Dai;M븷7bIGH2`u;|h* /cMʂ"lS~ -Iu&[f'aPH~9=D4؎u=]6P?/;|h^y /cMP(SX8>$,6OzX;ۻV^yf#H~=D6؎uBJQ0[f+~/}/x.ao3|E֋99u3MYD[nÒE֕&۹$_KWP$U|qY']޲]G,?'Uak]lN6xXKDzY":T>zvO@.mt{#C -M^땆zlOD׵}1>ۊ8j4cReGr3[Cd ڟ!]fkKAmvVEX3SZWH`Wn5ݶz郶ږc=HuTR}5%>1Gr1Ѱ+ר,WSZrEGN0MD͏L` oaX%J5NƤr(BhKvY?,He},$rI11h}4>۲lIʨ՚Ҿܛ.eA9me ;5oP ˜lJ տ2t,ؙ9BMCOWFʯ FAK=lNzC]-c, |96k1ltZoں ʱ`BQdrh)|XO)a&斧lX-膊d5zbMHEo#ڥOH*;+o}=Zj59AH$sRnM&c"n|hW -endstream -endobj 836 0 obj << -/Type /Page -/Contents 837 0 R -/Resources 835 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 833 0 R -/Annots [ 834 0 R ] +/D [821 0 R /FitH 525.55] >> endobj -834 0 obj << -/Type /Annot -/Border[0 0 0]/H/N/C[1 0 0] -/Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +837 0 obj << +/D [821 0 R /FitH 512] >> endobj 838 0 obj << -/D [836 0 R /FitH 764.175] +/D [821 0 R /FitH 498.451] >> endobj 839 0 obj << -/D [836 0 R /FitH 739.268] +/D [821 0 R /FitH 484.902] >> endobj 840 0 obj << -/D [836 0 R /FitH 732.374] +/D [821 0 R /FitH 434.9] >> endobj 841 0 obj << -/D [836 0 R /FitH 718.825] +/D [821 0 R /FitH 433.893] >> endobj 842 0 obj << -/D [836 0 R /FitH 705.275] +/D [821 0 R /FitH 420.344] >> endobj 843 0 obj << -/D [836 0 R /FitH 621.401] +/D [821 0 R /FitH 406.795] >> endobj 844 0 obj << -/D [836 0 R /FitH 620.444] ->> endobj -845 0 obj << -/D [836 0 R /FitH 606.894] ->> endobj -846 0 obj << -/D [836 0 R /FitH 593.345] ->> endobj -847 0 obj << -/D [836 0 R /FitH 579.796] ->> endobj -848 0 obj << -/D [836 0 R /FitH 566.247] ->> endobj -849 0 obj << -/D [836 0 R /FitH 552.698] ->> endobj -850 0 obj << -/D [836 0 R /FitH 539.148] +/D [821 0 R /FitH 393.246] >> endobj -851 0 obj << -/D [836 0 R /FitH 525.599] ->> endobj -852 0 obj << -/D [836 0 R /FitH 512.05] ->> endobj -853 0 obj << -/D [836 0 R /FitH 498.501] ->> endobj -854 0 obj << -/D [836 0 R /FitH 484.952] ->> endobj -855 0 obj << -/D [836 0 R /FitH 434.95] ->> endobj -856 0 obj << -/D [836 0 R /FitH 433.993] ->> endobj -857 0 obj << -/D [836 0 R /FitH 420.444] ->> endobj -858 0 obj << -/D [836 0 R /FitH 406.894] ->> endobj -859 0 obj << -/D [836 0 R /FitH 393.345] ->> endobj -194 0 obj << -/D [836 0 R /FitH 289.239] +186 0 obj << +/D [821 0 R /FitH 289.139] >> endobj -860 0 obj << -/D [836 0 R /FitH 185.495] +845 0 obj << +/D [821 0 R /FitH 185.395] >> endobj -835 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F4 288 0 R /F61 291 0 R /F60 290 0 R /F38 443 0 R /F27 203 0 R >> +820 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F4 275 0 R /F61 278 0 R /F60 277 0 R /F38 444 0 R /F27 195 0 R >> /ProcSet [ /PDF /Text ] >> endobj -864 0 obj << -/Length 599 +849 0 obj << +/Length 565 /Filter /FlateDecode >> stream -xڅMo0 -A - ̱UTM90 *[`Ϳڕz@̼ό w{ $%(Bq$1e J ww_ -j]Nu^Ga($GL'y|oanP!aD -ќee8ܚtի睧cs~NһmjU0孷T{%gq=y.`CjQr,JxS ڇO+'jۺ;X]Tg'$ ~Mkr}), ʈ.*¨>fΆ\>^)zG.Bc}`-'QDҦ>IPr2^K2TWr5u7Nn߽B +xmSMo0+|)8cqlf(RӄMb`ChHc{xޛ@h}ν; #(Q8c),CygRQ IV"x +ۢ(f O@/Q8 BH8 #0a9><2$}ɽ1Q_ YQzW@y7,KylQDXg +N]hL#́s 2hr?o(-[l\RO>>`8f|x(i,s}bB2R#F JҽnLm֮=ZͧPu{llU}z[.HUfE 56j_\ PRGkuF$gu}ҧ}{,|J J\m7SG;=*ъNqqJYvUP>Sxl)݂Ed¤pXߎ=l'<6($sO6-2``bj.BdWט8Phև;faqՈAt` 7+QE[Y' endstream endobj -863 0 obj << +848 0 obj << /Type /Page -/Contents 864 0 R -/Resources 862 0 R +/Contents 849 0 R +/Resources 847 0 R /MediaBox [0 0 595.276 841.89] -/Parent 833 0 R -/Annots [ 861 0 R ] +/Parent 851 0 R +/Annots [ 846 0 R ] >> endobj -861 0 obj << +846 0 obj << /Type /Annot +/Subtype /Link /Border[0 0 0]/H/N/C[1 0 0] /Rect [512.504 763.178 525.406 778.72] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> +/A << /S /GoTo /D (page.39) >> >> endobj -281 0 obj << -/D [863 0 R /FitH 764.175] +268 0 obj << +/D [848 0 R /FitH 778.724] >> endobj -865 0 obj << -/D [863 0 R /FitH 739.268] +850 0 obj << +/D [848 0 R /FitH 739.268] >> endobj -862 0 obj << -/Font << /F30 204 0 R /F33 212 0 R /F27 203 0 R >> +847 0 obj << +/Font << /F30 196 0 R /F33 204 0 R /F27 195 0 R /F41 266 0 R >> /ProcSet [ /PDF /Text ] >> endobj -866 0 obj +852 0 obj [939.8 644.7] endobj -867 0 obj +853 0 obj [777.8 277.8 333.3 277.8 500 500 500 500 500 500 500] endobj -868 0 obj +854 0 obj [750 758.5 714.7 827.9 738.2 643.1 786.2 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 298.4 878 600.2 484.7 503.1 446.4 451.2 468.7 361.1 572.5] endobj -870 0 obj +856 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj -871 0 obj +857 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj -872 0 obj +858 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj -873 0 obj +859 0 obj [800 800 800 800] endobj -874 0 obj +860 0 obj [1062.5] endobj -875 0 obj -[556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 0 0 0 333 500 444 1000 500 500 333 1000 556 333 889 0 0 0 0 0 0 444 444] +861 0 obj +[333 556 556 167 333 611 278 333 333 0 333 564 0 611 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 180 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 469 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 541 0 0 0 333 500 444 1000 500 500 333 1000 556 333 889 0 0 0 0 0 0 444 444] endobj -876 0 obj +862 0 obj [777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500] endobj -877 0 obj +863 0 obj [500 167 333 556 278 333 333 0 333 675 0 556 389 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 214 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 422 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444] endobj -878 0 obj +864 0 obj [556 556 167 333 667 278 333 333 0 333 570 0 667 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 278 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 581 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444] endobj -879 0 obj << -/Length1 1012 -/Length2 5089 +865 0 obj << +/Length1 1679 +/Length2 10168 /Length3 0 -/Length 5739 +/Length 11246 /Filter /FlateDecode >> stream -xڭe\TAT@Q61RP HwJw 02C# J7 -4twK(%}9x}{?]Zko6cǠ\ܼ"/pu!dX$-kEP !D`<6XM !@ᄄY5K-hc`HփB2-3&HB 4)1пp\NW2ف+p `um+-Y\RN= a'?C#]UZ0) -p -pˎtG#H,D9#~h?\"G۩aDcu<ѿoj0 -zs2erhD|A҃jxH4 ܯU -pՙg5Ɖ -B_ I+M|X$|EZUjO0(m+y?P@(Z FWRիb+.RZpAx( Ax@\myD;F<5|X#9OL!S(7QQ.ySd "02G]! $$.Yp nbוrM)%JέiYbBy{>vsS$ Ħiޓ -LTV=ʋ)ꖯv3dIа4kcIbgD<ļ)v So"7hGғbIU*j7ءIJtiQhPb -YԸF{qtsR?] XCep+:{5Hp'X) o$a%潫1;S|?DqVuƚȹ@ Џ3ReYLpv7eRvVgTL.Jc{[dIjvi[M99+|3|&Z{-ݻ~_:)(fS=``oGkfXp;J5K\ꞘCDMl.sgyEnLЅO.B<|._N*UO'}CB_Կ'wa3(z(H]C8VBp Sut沚6y/TrBo9ik>}Zdq}O^>O5{" -(l5Ί 0-(E9gHT -F*"+xmwHyEUwp! -h؉?1VhON 62޿|~?\Eqs9t?jHq Oi2tjkK[K9Îㅐ -dbf@?L`؍\Ţ̥0w8j - y~Y/w?:*:ň.9Bhڏ@@)zXV[p a|ĻLhF0srIaz$mħݝ!5+b''l&JmyIU9n]Gj,WG5Ʃz^4)= -^q0}zb]dwkTa&w)4f4b^T+bŒK)C`pCK!wrqa ueI&4Q-/-"gB8HKuj)q FF:{tEaX*+ 맜je wWEQOʯ;Kƣ%9YiLe=w]ʣFquagmL%tX;ԣ4ךT–BRӭ=Sw5K栺ydmCj\loG*:{1MBǮƮ0GuS#!,s >߳H*|%TUT]44HgssDy7p=A]1~H0+ -BE %G^q! K'f&z`þ|{6a?OⷸdQxޡá9;J: I>L#8̂X -5RR/ - ^&x(Co8=:3ّowM5۸kFpw6W/d.a9wEݽ<*A^4yؼ2&C wͥS *q\wH~h(*xu >f7iu@@? 2TFiF9qg(Fcd[<)ЁF(@ -Q5h` :!uS}rNU$j$Åkr&Zd3ʥ2jqn}Ueڱ|ZhǝĉC/W8"XNi32Oδ<5Zbm5@n'C<>lU$d$pScZתwPctԾKj]#z?eneWwZTRF%3EB(D0!.,S1}:~{QR+;"I%ՒN]:u@SelF(?/#^ q_In=(i\`"lfm鍚N~UҁH' hM22(_{/(jfKU׮DP7E2^ Ɵ=ANReե`\gwg^D3u/k<ӥa|ZJ62M9氒#5BlP~2#⣞p%wӲdPb g7NblmmW>_^@ǡ_4}[|e|Mu -?NTo;7'_'V)&qjǹd%XO]۫pFV\9k:ӊ6Rݘ4ųv{iCF֡ -cɶڙ<,^zW<y™!"7O c ؛bf3z^o;Y#oghX ݉{bU'פ~݇&D/bmOWlau }?=6PmSU ߟK"ӫW?q -]mjdI#B;3qBɒ;~x°&?P8]t/T_ɐh -mc|[Xi2r( KAc\_ۥ~}j& S2n{kp-#-^kDI!J J>Em'6qzCܐ@,11&ӅC7sDN'9`s9,&]H맃t ;Sn_M-)cK•Z]@1b9(l gc7G;JmUDɭ2ƪk"8K&a.^ Y@ ӊdQT vYIU_icv̯7"J$%ǧ^ W>CyU-Zaw7.&h,KCPjRΑhB73Hf,g26 +*JAsVE-Bqoo2~ȒDݵ%L^"GuJ w^(2K2ٱ6}jG-BT{%N̸5u誁J*l{s]#}י鞨(n{*b\:!L/chڳ6)#9S'pv3q[kjsA_%e1`kx^T'vHe]6?wZBsx+CzڄC3A{[<ڊg<<',}1di1sT͈c -h vvqa^e>9\GaZ,XK#{-M u_zڼHC'ώ?}ƥP(Q'P'm R~ >0LěIOˈA !HXz#`$p{mV qg Qm\Bs"P6]1{7DAe҆# Vn+:JHkBd.¡q -YW;lVA5)6_dcz̉ NL[D->Խ뺡=êЀqh|))8˺r I nUΐ{zhTݞ12j|:j嘑=,âɄ2J>EEߗ:dD*Ncd;_O Zm5n~qҲm,g[VجO(z9UOuTvjY`1bqį'ɍBjh9N܈_'xQ3b=_kw\krnp7I@8s^7ԒM+Qixkۜ_DJnni3M>f*oriӝκrl.pLS6]GROKmY'Я=]1bןNM;W/x\gR-5ύ+at=JüpCkr ;\4lO]~xMJ54@>68uKN3 -,h/IV mps㪴9@>}Տ|hXejS]2c?&/Q +xڍT.L7HK3tww4 0CwttwwH4H#!]w]=o?o|kz*i 1AlBiUUEN76j[F rqCe!Be2@賡*fp q qp886d`K*@ rE8ymy~0X08YpH:\@G*jrxhhA, `B=<<؀lk1Fj\Aߔj@_6`?Z+x؃-@.n sv +@ ʟ,dO; 88+=. g;l46t @NR|f?W ԕl#0mu88h,p!>#+onN:`g7_6"d (C[r<-l'r-~qX=@_h>@w''lhDw{ 9׏' 8{cLju_6P`RRO+7#~8_ )~xnLZ ) 0F8[z? ?z/v>*DTE,nUDyY9y8x] `͟4s؃A!/g/=ߞyfχc1YG ]\^h+x>k cl  +{|vߢ?]` +AH%sп 7_n/\_Pn/(`w>/0s(PT5n...{7y, ¡7"'7\&(AiӍ$EJr&}jR7>[M^ds/a +Ҥ(\a^Gc[Zjѽ}8-ك\_)[<[LP&|D{Uwtw"hIuã#8G)o + .b+s\O`cMڙc*~~C[re| Kmb׮`5"”g)+N2&>Voĺ[uOْe&f< +)Yb2Ȱ+] tg`#y,<핢_tvō^oZ}W\pw"!FaʷsXeRW{>PV %b댢YyIQ ` S_uwDy Í^s;S7bka>kAt8St@%IMֹ&^B-\A0jʖ ?V%8`|nhƙ#r 6֤$٢XOOSRdkwCcȭgzԔGp[9Yցg9WDДbKK˟(K9oR8m jC˱8{;*f6e=ބXsئlԇF˰!j +G uzd>3LIyu5McAuMLp޾iz`6qƸ,p5Wx|w?:Pca_H-kw[!?ʯRAߏ6#9Z~w}ܲ&&լmrnfC-" q~չGN/4?_Ix ]ݙJa@ҜOz+enҽ҉M׏#6˞_]W!Y映+pZzicC#-LO ƅ%G ͔ɺD_8[1HjCtO1|q?E]lcv!/mȔh1^;'<$L 2`i`c`QN)Λ' ]Ezx>SU(he``Jڏp.c 0pIKfR {_oo݌z/O9Tp+yi,N*)rX#iU@›!Ow<-9V,,s|*o; Msp0־mq;-5+$̋'[I,3ʆFT]ᱠz LPi'70}z9Ch_a D.0o2;M/jÐqQVm畻r\'ڱ'^b|.m 5uM卮A!~8۸-]c`#`JBoMpNzU&@5N[lq+#Hghk$r[H7儯1%8skԻ#hE>$EDK8 "w +mio7ve8xy+>O|rT/F`&&%T_o _Zmk=z2Z_w+S"1S ǭ2qV ETq gO+j+k[X b)r( )0h\%k^hM]jx?!Jg)1%Ty-2'9;e1 ʧ?I=>C'rf"OLX+Sf]L{^ai DAb]}z"TV'3s(g.w;oa:aN2dϚe%:7$!Þ*2$3޶< DDe[ yp0;7.e/c+'*b\1cC߱SVW?^b텔ymǻ"8X-DWc+.Ex ['͝t0v5 BKH}י@ȓVưSǮ#w(ͮdK!zEbմX|AL?. + &aV&?g(t$dIl^5aL"^tvbiRd/yq||k׳ff[Bp/a uJHJl$/&lu 1WJmf=:%c?]t؆}*H RdllFQ}"u|-#o8"Q2?-?:Oe/ie+b`^s#VC4YtvTҙB]~v*SG0E?T|;` +$HbK GyH:AmݦrLZIRUJsQ7#@ ;NHNJB{كhZ}EYC.=FK?=}Aܓ6:],_:Ne[} @jCr +=C* ̧fX0V"y`T3U=~e(E7lL7c*ǘ[ɟp6e.a=fJ;emf BEx뵤f9T# dv&w_+:ᬲS$aɐ.m+}[um}zRzŪ=J?BkNEr&Jup41+U_4 +]/sg=mQݐv5s5KȍYxpm7MvfKݔ }$*8zH +H!PalD]4"uՓ{_t#LxF$L/[P0WmXO}_s># *J+3; pHxj=T +$k"/4a<NDCmB3wh-RU&vr(F%:C# Ppt@grP/j-09hEvǼ7pqr +uQ_{|qH^J +^" bjKqyqIJ  +d+ؘ@)^j-׿խtHoJsڵ.V2^3^vrv8~eVzw%syޟ!Ld{Gu6!e%I.~?c,Z̒ǃACtIn^:Av ϿHZFH>v뿞d^:pqP2卟l'IB7ͮfӕ"ʕߞdcܬ5K1Ԇ~jcXwYRG`uz|_eyM%&{CFDɶhڂ-+>yaڽdu|g5C\:]pW6JǙHKoD㋮$Lg;0peHsR8˦8ӮOMb3ΰ p^k=Q*<(fe71Grǰ{9qF9 ,Pq-^#04<I`rr Ŕ-+3p`>LqM # ]hSBS%@$+1;E(k7P= xU4lS>j~GOT)ErN⃼8J%'A%BC#6^+͏r"o=j[Cfw{(;h~=\|e_Mg}ﺛ,ZZG٨ulG\Tq:`Îf%"IB+W B ߏ%e]G\F1p,ĸ88gR}/8ai)^mxEü aW%o5#BCLbM؍R DoS:`6")E1\i.>KlfDU#?ħmg\}DǀDL5pFNS09ƖKz6t"F/b~+5}J~`NV'*0B2y"iJ+O%VjqS@o3BcHY,9p9N?vzTsN\P2Q,5xCxCFJ,eG! ts4~\2ƀ wi+&,1/Awr6NCɦ{z&yWY (s4QA.KB~ҕ~i#xV:GhW,$ y;3i]Yܢb))qXKMH5~*֬9"$-0cO-a T$a}cv bZvU^ydd)}g۰ b%Lw#\6{'ln4^]3Vkh 3BI%Jm2) Y W]D3֔S-\|:nwo;²#H\C4vgfVWđ|Tz?&d Z;NnXF>Nxe-D'*9;vt-lr +V:>`ҌE*Ɓ cCmfz&? S߉}e82d8qB}-DƆK:f.rdqtӪ|:&!bc]T=J@H+ +>2'd&uɔd.Z,f=/#Sd;[2R68O8 `D)h{ +1RϹe5=mdK&޿BbTR$&E(\xง~ZL`}IZ2\(J*y@_T@W$51AZԽ,3B3!aɜZVwXN(Xppouz?vJJ7` }zkH2$dpK_[ 4ع>P [ճ0` ݵ4֘V7QnQsK˙?"k$~иdoU0Q"N +eGMRL񈑰$wJ5\4A47]YħwunNrK,M?5 Cқ=Kq\>vDnb,;&ѐUȎU˚uuD'"ן_|c졯b$-ƒc("E Qn:.3ÉXۃf/Q-<W|5%D+@C=E/AS|t,0hM%kzIԒy.ԥ-M?Two6gUu(!{2/Ǫu,7$"8}PM9J$yDL9?Cܘ6I6%ؙJltleaJA@;l1eve$A-Li,,B0D u'r1Wߴ!>A!i*LUÏ]YU%_?GS|IjxnJB^9JѠԭQoasV k$Wc;ro'QڶĻܞ*V~$V؆Zv@YK#ZNH:_\ +yĭx~ͧɤ%b_E`iP0#%oKG"`>hި&'yUS6R$2Kpdk:vM@tK@c:ƴޝa.n2!WO$ h?m4Xr7EѯKyWut>,;rb]o"  +;2$#]z7_Dbu +4/d>Fy=trW7{){؛K[۰k@5[GAosՂ {<xoꤕjx./Bs +9OMOo.Ȑr`C8&bjlvfJӗ,6wZ;LuF=;V7T*#!]w [TQSM=vb|`Ne,9X-9}Ia* +#v^ `y"]-E$s][L%e8K¤ln^VEq2jvEղP0':?*/D/k5Vc"g>8a2ω_)mΐ ehK`sl^)HYTx E5~Zvs>GHe-|x:chGlIyEnnTKx1q\;y%n:n+gb< +LW.G@I~R8+%uX{b7[*Ycb8qmr̆7."'uwpqZ禉efK Bsǂh<-5 Ӫ'Z22at%@egwy=Y5A1oȡZS6@/=^ xQ k)'t7x~ZOXб;ZL`UKD}"a4  a)j4k]xl"N~VGȌAb>mg +o#yB|d]XٱDcfUG$ WoR&nZr~ކ=K$ lڧح ]: ++܀ް>Sv.VR2Yse啯o bEeN_-AN/[ZUʕUqq,0?bLQ6[;4"&OaXLE=@6?0n y}ȦnNrGhwUZbKF%M'Qֱv->u.Ҍ@.Qy\՞}+0$wQEcuƎ4Cd򵆩qՂD\If[ > $V7(#\Q6O o,u[w}\khKA.TZ_-E]sQPaOƾXda4d0n d͛ŝB0-2;'6k#+G` &~ggWmzSk~( &QWӴ J;tCɸ4;ԻLc5gyT-Xܥ 5IZ–4w6A^k~gnj2_Q@1$?!L&JaOdG1”w{\J]wi} Ů|>= |muoRu -n7S0Q0]@#k}y$.vcו(w* }u'{WjxW&)q,֏6^y6O "`J0aa=y~:f_CbOBUX|ĝ59K:Cq7EݐWQ8H=StT!??Ʉo歲 > /(AJ%a\sIy;GX#)60?jE:.y-qcVE Ad ew]v(MN79P8<]ܠ-z̮w/Lf -Ah2M̘l$o1SR5> endobj -881 0 obj << -/Length1 761 -/Length2 1501 +867 0 obj << +/Length1 1423 +/Length2 6396 /Length3 0 -/Length 2040 +/Length 7361 /Filter /FlateDecode >> stream -xڭk8/2ɠeFTo9)A2FƤAF̼cfdVRIB%g-XPR 5"VVINuյs|?ՎagH MĆx4 `x`[ nЎθM8{9@!,V "GlPhq*`"  p8@! -Ac0tQ Hd^88~K3cK@PX.bZ*H&H&GBicsǗ]h`?4.#Kq1"PP &(( Q@&;c,q ;=m-z ӟ-bD4\̃<$*9Pm~?oXy@ c߱"[ A#hJ~ǀl @@ѪVXb6 PF!yHPC­bx]} 1h[ y$H,vXjƂ!#F yW2{Vy bW@ ȳ7RJm-zT -'߿){%}B2q -37hr kRQgv]sT X^;m?qV_k3ѻ~vMX7B%O{E?Tjg3׿ʂ+gA#'}~K ;FfW|U4wFS\}T9aYJ{ޗ" W[eƁwcpN)][?)˵#fT0oyvyzTi۽$]{op0qK<:!<>N k_ [ {[ģi۰㯦k4iWT 􎗖s(PϽ"0EjK>[9aqiO::GY3׽N_T[ͽ;/4("kLSF#R -i7EI-q1mgM{a8EOя]A^Xg>9XZt1=VυZswGOif"Rb#|oa{5¶ctV8|*S8]k_4nuh9v&^(J5699@ȓ˔"e6M\jʣV6NE7qwC ]YZl -gYM1'?E\4+~)RWJا=6nG/ْD.!yߩ -ZTaqazb J,"W+5. -FkCQ˷>Q>3+P?[Α"> L2Gި 0c AXvlq@JrЄϚYqY,+*4TҲNĻ#w@&ډ {"ה|o5n:iK0 vMj[>62I. &KxA/HʸHWuV ӗ;m!O&%9x[}fġnmL^ [kFUk }tmhE5rWty8ޏMmu578n{y21dZ'mkl=9v֫e˲8}}G#jӔ}>h+/ @0sAk`p]X +"*?0 J<3J;o[_ys%- f4{Fwey*\l +a)3rE{ô?X"3l#͹o&~CI'3 +67۾RLAcl 0+;Ko_eje> Xhlt}@o8l֪=pxksdb;8^)/p;iР֜nu- ҄U^>l'JW" : 8u;ŸG7lHHšuԵl~xp{(K{Dͤ_ 2;)/=/ yBO2N>yJr80Tz$}N!M؛b aQ7O'ٯHt)Xzxi<̒fZqn \hاqox;"a^kׄE_U^.i? =v]ۚ7/p\cqNP~7ؐ#tu._m3]mR' ΣOKxj4_F2݌֛ 4juLs.?0ҟ[OaK{>H-u]FܪS4θТ mh(xwT-#>gZ w9IO2)N˫7~ +*0ykz !+Hgy}q0Bf٬M[;dgS]){T8A HnέP;Qe[ZIg'/#JldW;de&nwQ5t]=8h&>xF'YH,cYrz4VaMON=SM7_0})Cy`]pԊOA;۝ ~jE +7 lh'㠢{}4FՇ.S8(-ϓo͹rE_;{Q86v^ۀ 2VIʽ=$Z@AeWk_~Sp2/Z5Ij T[eI/\iCڗ;?/nNQW0> {rV!9e +"i~믓8{[)t-5)+]_ ~/Tc5֒wXd J^@17zqXAXHP_QnYOP}R&: +BËiy~\:֩JmBi=ºM9}%nd@G mOL[&ϧVȤ;535W. `>z+rtjK)|TW7Xw!Op.*o]Hw6&-*GoS0}_wXX@<}7p0j5MW4*q s򤇏gWjJą'2MPf=@qױި0I0SL:Nx?JZke7ĵlH&1C~F=!Dڊ4*Inۡ7%>9/bQFB/:wn#qg÷0݇PK^ƕq}Ӳ:'>32֗6ŭ;)FGid$dD$ʹMaBuN➔SdyI +ӥo󃚈0IC~9~N(tinYQ8ߞՏA:E4^ط/dJbg*tDqB9^I=WL=m֟p&kuxv},g7k*ĄD~oD ;,g k.#:xūi@7XO%ހsdrHs-+;;_#6. 0gi=N(j9yY'Sǥrt\ܢD7 P/HY>7fQP"}|w3{wA{x@T@"U~k?~zZ;YL-jjiCٌn`k9IXYDVJXzkŵ5G\ZMB^%_8t.jN}qp7/M ѱ܋vDh} O׆彚X_GSk 'p%RfE4 9xg\&Hť35_X$wʉbo>I +JN+wsl( \p"MZ\ @X+^ܘBBǍy%S `ƛ{pݴ>ҙ ?A|i~m@"Y]B6 +j< QCW7yq*P%^)T}t5([0N$(r㕔S.K`\FJbﺉSc(biopR뼗Cu׻Hc+C {;uٱuO2')[h:C + +>o-gz79]bKDP?7ju/aG[*ROB`gbiD*퍳ܩB&f+f;OdٴWU|E.%T  .qj+/e)aI̬4: .zg4vpx O−*џl|^GdP޻\7o (s[QW_zۙa vd{"*Rq ,;䚈`C+7eU.zP~H٠/.j{Ӂ(Y\y+&WѺ'/:v5CQ_c>vdB5IhʿaLqA4\K? +ݬP쩍}vT)\ot|U! 3Vj6v"zNP /1>U %ٻߺ0Q"\mph\aZJ8c}7CYTF!0L1eV|c츋Ǐ}˔Tk|.@dlfLϐ]uD[|gʢ1 D'Ϟ$hiSXmCaO^DplfI]L5.FSƨn+;9|IrP_砹 _we.wj.9b"ZHh_Aڭ8ŸmbǾ)#1aF+.t'mS_nԀ)x2Moqڗd̴sŗ">w+{gi +x[DTO܉ʏne>Qej"{bkxT}2ik;5T"dcdqt$ fz'e`z +>Sf)pGmVҵU'$$ 7~m߄Ounl7w/" "Jr:m40YBO=쾴gq#++; E^ʹՍL(6]w)Xgx|%%O SQLWݡdң']f=D7\qjLZ2?{|O5k^-x@xYwUW +b]rW*.M-kt#zJO<뵱raoTh -ΟoVsëjh#h?Uڌoț:>-X(yg\c=uD17{z9hTV~m +Nkҕ%]7itq:qᇈP_4dt~~Xt7|o.Gc&<4/B-͠'bpY۶|Wė.&IrGxsDoCG꽘3ەt3<1Ϣ"8+c^k/iYJ+(9 *^f[.;vGT,sl^t96-kxS^Ҋ~Q(ͭ8ɖ&}/@={ϗ)꣯1(v,xKsPC>Kc-!)̺A _Ʀ"yVAg.Ll[BM>hlPWv7z=otmBXSN^ rr9{/YkeR+N=J?G2)%t3:Ha.JTTd,3wbf)_qʤ$; ~6nma@9N'}r/ A[aw~>yY8osԹETc|M,' 8J d#6f1ādf g9o{@[~`^)`xՀkcm0-p^T)Kѳ`hYDD]Yqr 8jVSVtHZMο rCO18q΁`29ZWhE=ˊ5 CG7zQBbEtc$_:%zM|Zzkpxw>k`֕&3M!*Np/F+%C $B>O MnRẲ+;a°r6RY9| ,n N1"__\g^xS!8=q= fT(VB'n\L-d;09:ID#Fsa[u&!zԸסXP{=V\[a lGeŽv jI +E>(LΟIj 0X\ep> endobj -883 0 obj << -/Length1 810 -/Length2 1984 +869 0 obj << +/Length1 1454 +/Length2 7227 /Length3 0 -/Length 2550 +/Length 8211 /Filter /FlateDecode >> stream -xڭy<Ӻ2RČk"f|13p߄r;b]9r;&k"GVX!]Bow}|?B۝5đA32~ -G([8 `F99c*$ DpB09 ΋DjCc2şJJ{& =A/ ,ؑ -` @SQC ɀgǠ4p qdx5sa`}9܌A$Zc6Ƌ@EaA*"@*Ke3 -^_v-"kH D@@zx  %'}5cCk;ÙwCc$%S589Fgdki*=J @?*Ll8x2wZ&P#(DoA }j ~gյ!B?N,JIߌ_5 @,dlՍ]bZG~uG>E,Vq,c@gyfOnKn5]|j936 x HG.>lZ[y6]T؞d!hrio\@O]kVhsF^CV(ӻ4V3fW(5{/2Z 㙗fܔc cOkؾV_,)ew ;*0߶"2G$ nzu`E4峬Qꓜɢgz^x~\@.OPH@7[N- \y\sngfkw C @ap Bx#yHi; 7SVl[1کDWF)Wg`0jdn줁mq]a~Htx_T^~^D9H >7[[6>Sfʖ7[SbRx,;՞8/|9@8uXI"U;Q׈>ۥk*aAUӕRJ+b.H^^bg\‚:3᫼uap>3e(q"ۻZA-==)qbB 0x^ee@Q9/MqǶ5QI\G{{`:)66>6{7K~튊gi*, %}i~6j4峣?;筞 *6T ^vJxiHA&ׂ7&!e --YtKܬ2Ha?͏SU!\ ߈pPCjBf6x]:&{ -暔Փ*GoFKT83{(jy&W;Ħ 5Y1Wrj/k7oީ8x{kSvF6<Ϝ|DLvG\*,%F\%p#nZߠCvT)IϞ[#[n`2770E-~;'Y|KoɯvTT\?2H}]6Q@PfdLV!PVE/^zur2Uҗҭ7\S#PqW~β;:lq2Xe@zW|ҏ2WO \nkϏRe -,ӷi`DD^eY^GhD[M)simTM(ǃۜ6ߴJ-5Fo="ۮ+,_*55Q4]-;T-%u_^_ϳ(?yTU -1ҴrY't& iH#TT?Nn.eZTzy[x=IfIa3(%Og>{l m,-C6P.zk%L#, &6M7l,nѳb:2‡<"LdJ9GX&vX%cBw$V jA+/zv~t*Fj 37MJCMy3,ȡG3gCuTst| 5THh}hɃ.2>8 + `C8c0!F^8 +*Q6_L/".%2IG݀&5`W^ʂϕ}F?ҷc~ _Q7wB@O췙1\0? ){0k,?VYto +Ye6B=P!vCCMC _ 3ax`fӿTOD\B"AcNă:@|~K (G0.LyGDEP1o@L y9cn0OL&(o?)H$fi_/N".O*{//@6y|]:rLY|U@߷UzN|^~ XL,~Oid1h@U>0|tTi<2kqtyuoR[5`y=}s'WNz^h 4ءx[G*zzJ&ՇlѢ7R!rvWx>_HR + ޖxvsdc0oaa^9ۥ?ISoy;HpZpgZ@ؗI7a^||@LKmi':T:O`ˬ̴!N<ψyq#o&[%,]aeDņjavSdxӏ= R4cp +Fnٳnx1Ajn"\x͇Rc,Y x8VF6X`wM'\X9FhEhhR& MUf*BA73LjNw/wS0Tq] (hVMSF8%$* YCGF5Gc?ǜYI/w*CFr?_ =`* HkXuݮ~:y{vlj0AM۷i=tvDxV/?Kʉ 0ˣhbMJ"u,y1[k}}]UqAչ +4P}e!T_b6i rIe?M0f#0CGYjD;EM@hU!|?fΪv}suNwC)ɾ/X.XTgBJvOjO!qG+qY<$j07헯?wPe ϿMֽٲU' F*0H3:|+_G?^6|֭"Typ,b;e<8 +fo/4Ct,RQ JFF`<فW8y;H\N 7(_z[wR$F+͙{٨uV=h@ y-qƒ6stm+7yRF_:m.4.uf{Nla[P]$GLXEWpYM%NVTΛ=΀ɖi&b0O`!z.@nBõhkc|#zeN6{u/wQoZ"$Ҧd"P2^2%Պ2,I4:,/gp]K?}} ¿ECj+Cn0Wӌ;ƴq/g;uM .\taJ`V̢h+M ²O !ܮ&!=wŸCGli$DjLlfQvZ3b+^vٻ?A +)3^13i"!&/70Ȝ5JI2m=pʒSbΝOLr_4 y9dL+a[A$|qy +3yP"=nVPah3y/fY|{~tD0/}1zlZ+Dq'p/v@=9[K}ϕi?{=I bis|r`)9W(DpEG*y>n*TWfH(6UO JXٳ qMX񸈽w/*҇ܥun%b,uż͌zyJ",d;\ʷa)<=y&Xdwz  >B=BFͅ>_W^\ck||k&3X=}k8I|xGRE)BLUvPb=.x9;{H6ym8<']-;᪴|;,Oc\ga˅p +4Gs\ bUu\繦vv*~`°}~,, 2(*xl(=&a!iPH4?O*:JzϤv;݆|&CD̛G6,bM{&s@:oŠ0sy`/Q孨$k@4Ԅz7vFp`gĘݤJ +)VȂnM wH`c1g@lS܍g;C:a#8(`[)jM̡ӛ%9>^d;3nWҭZpOZkMv9 gSں9D\J~fH%,gNC J3Wrnh ]WϪKyQn}* اu*1 wzo*n.oMQnGߤxPFZCTt.11.ik]^p7zqA=웟([A#vT%;V (e}<~]bxr+E<6SN 53;_1,Q#imf#THZ}2rr$7hImiM`Mc:62ڕ.Jk>%Ua\Be?PM +'>h}E? Dq1fOX՘^pcFHHhv0ݡ6%AW7}qIlKHtwwPfrٜePgiৎmEA//7ְN-tWui*Z郍CȜIz:-B#|A=C YF(PNKx@GM%2΂*g:pYUar`"W哰vY +Vo q܎@4]sXJƚrx [7 ^p,) `=Jh>L׷qAfw2̜糃jUjA@/] ,de?9<o3=07 8y_g^kC<<Ŭq;@󚠧9imJy:w!Y &nI8UCSi/6mUJ,͸ +*LQG?Y!̱^#޿aىp>pj/*/r [?o'Wޖw;<µxvrvLw <ғ1+rHI)_GT62TFs/ADW- dh}Zse_C&n_XfD5 Mf,Fڹ/*&u])NDÏ cJq!_.XO; r 3^hUk蝀^0J&R޶8U*p]HyR3!\xN|6Lt5;C8'R e{ϻvvfc8+~wj7n^CHV?߻kƢ}[HQ9tւ Y:ض4ygAHE3Deu~t%:Wi7?iuMtAzk ¬q|bݻ|ohq%_7}j836S~mnm,5#]^ ,hL߅mys7FtJujͤ`h'8ڪ?ݷyw[6@s{p@o(E/v.oLYGz<-!')ZǼLPSjɍ_w;w[N`W]j5KCSK?#x?~D܊xczopiͩ<γ="Fw]:sӈtt-@akXfj_n^Mˀ..  +ܝ)LEeʒ,jO .:N= +Ik=8Hp+NĝzyK1Q@}Mnm,I.&S)rWbo~*a}<8n; 8i*ոʟ+vnsԒ/\t[B7-glp=sdnLM{$ՇHߨ"i:MWi/q^%$E 5 Ǜd'Y{yl3pH6Vs}u{(ĵQk #n{YֺLLƽ2h{):vMA9[ H!t>7*pog< e#>ޱ3çQI-7j;`jV4TnԿ&ieFRy|?I̱Ŕx 1 ?c;(RNj@Ȃ(>ƯuhG5a8j⇸ c40\̀ 5]Jw$RN)\ٞ(Jh RXSlNux.q{'# g>sEI^ys8QDrspa-rET WJ Ր|R`4>[XyDTSD;G\ߴ*n1&irx?xn=]EXvo1I|qJEx3M'*yW۫O)^uחf __W[M3my sF"}֦~ô*Xt&Kh{zӊj̢}y;63oғng 6Ȳ6 '4WZvQ!.l ?/=t<}!:tc3K1}h ΰv3o"-4=_b}TצJ/7 +gG"y\P2aUx<}ld$CYx?@q]%vN=Y{q|(YI]kVu «JN&QW5zU@.[1apmKXyb7]GRNjܤOcor)]:saaxq8:c#]&\GވD-g6y.MIxbCy$]:l %/5fkw!t@5ء+1ea|\>*<6(}nl`.oƐSƍ>}rօgܳ5 IhFEN(H OY '?e]& p:s)gOef"!ZyV9Ѹ z .9;{߳ܥIg1+3L_!n<ۨWW8&UR'nφh^ce= E$7Q3Ypx\<4}-RZbHczo';@to]p]h|R^솕4iݳﶹ̫2*6Lo4 ´H-jGt<&xp>t}xT]F* #v1s&OFSEٜX˃ʳul1NYbIRQiqkɝ#'Io}Z;ٹ;jwcLʄF4 y}|h5!l:1]Jap3G5E+cC/y~m{G`Aa?J/of],j^; mtPiX up/MR +\;xE2Q:A| +uu?DWl o~̯TB ߕ:]}%z3AV`bPH0׾hyd2䤢iJlDsjiVv%Er>#~#-dR#WxiؒJSv-yt+JR% 7z0ƣ) |p%o,rKC,X';IPXqA@gfhldSȨ)˫%%r| bDxqG5kR)' +:[qhyosؑ[ĖgZ~rV[2Lq:P;m)b飜Q, 2"ޠ:P zp\dNjR@]$G)Gc3y=O)JTg[6KQRro{elٲРn+;oB*}2+^k$I2r֝n$.SFs 83m67'{ikfRU$inGd16E+9$(Gb4ٛد~0p4G"`lW%wmE58EhiN./5L2@ endstream endobj -884 0 obj << +870 0 obj << /Type /FontDescriptor /FontName /CANSPV+CMR10 /Flags 4 -/FontBBox [-251 -250 1009 969] +/FontBBox [-40 -250 1009 750] /Ascent 694 /CapHeight 683 /Descent -194 @@ -3695,27 +3704,56 @@ /StemV 69 /XHeight 431 /CharSet (/five/one/plus/two/zero) -/FontFile 883 0 R +/FontFile 869 0 R >> endobj -885 0 obj << -/Length1 812 -/Length2 943 +871 0 obj << +/Length1 1465 +/Length2 6395 /Length3 0 -/Length 1500 +/Length 7387 /Filter /FlateDecode >> stream -xڭyTW]*BXD .`@D%--dF L& U1 -Z -nTYGDl% -*Zp)Jz?s~~#'I ,̅X8Ix 4&HF `b>$YQ23g@Q8ðpfDqqDOrLQ19@4Ŕ8y -?rMėzR3P`&9 0rPSxR cH=5* ?7}$W>; Qc1غ -qM7pTB(U\I𩁫=q-&i4 (1B>o' HV8~@ z.W@ (\ @\#} t"%8| @( -ѱTcZib i` -byNP&Z?INE~m@4*``ocps#QpD.  P#(^Z3 0- $:w1Tߔ0r`AL. OUG;2[..eXe:vyHvMƬkMۮz,TΪQ4A sڶga}Vb^GodcdVvb4wi^JE&E j {2Vh.L*c?u:>2}p>+8"JkЩ,F\'߸ČB.dFg_419Q辸bҌ5átƽrgi֤岾d wv?`fh>lC0sG)wIlܭ1ʥMd:W`wwhYaFŝ]7S&,+MRvG-D#C-u5\;;luڙ=l5޿Y^ٻ|{+~揅EF{@w~0}ot⛗LicBxׅƬы=֍9ʝln)ݙzvA=fNkr  zNoSɟV5x!h&!>V ɾ>=yto$7qAMϚS!ԹATd0tyg7Zڡ=UZ8aW9-܎jYPQ{pemVB~ Ot+exu Xz^^8uI}NӞ9m—[oV-PՇ)'>Qtf뒦og9ډ&(J +xڍx4}ۿVmCԮkM DĦW)GQ{fQfjJik_&' Z26pk"u Pcfփ qc +;9[ 0;- +h* =\+/E+(r@Q +S(hPr8#<Wܠڬ;9aHޯ!`^{|>B`6ʰqsՇA\*tP޿1;0 ]`O=z^0?g3Ub F} ?<l $l; +uF 0z08 o#җS򿄲pO7([T _ߨOvQf U{lֆp (K_^WwFnPo9_ + pԆ[Bm nN-UAZvDf97cpB т Aqab@!0uV䈺[Qϸ +0 + +\]P @>|]{8GLpW_Zz= +  (kN_? +p"!Ψd~a ZBM{Axspxېjja啎xA$+{5L g6ҴfKƧ}9.G:Y$k} ( R%HS胗  |z3VӰ&|㸩FZ +Gj7k*K)>x|<'(vQ .ϯ 5iu2O3&~$Co)Hu)XUqC .EpBhmwk.R4 ƃJ M2uO2́X{o'zM%rPn4,]fnrpX%-ا>'Lq11KJ$9sL<Ň[S"J.H8Hۨm Pyi7kT'7' CqC u_~  _8{*23wo.o*w굴Zmf9N$F%LyG5ăĒ(ע\҃MGO8. X{W#ۓf FshJz#%$=o{&FO)JX +E`.cxvʵn$I|w 5ʌ6R2s^an?T4;7 g絺/S>eAḧe_rh3+A#VgRS\'/ȥIV~z;޷;[yNK ŸVgi}u8bT/#81˓y.:wm`x9J*jKmx{5r_k0#u@[CJoޅچ9 nH;t}LtNeW+p"j?P6ɬ'7oGB;jFoL=#ZuҸ"ۢ4t|8%qƘ & n)H')iH_ogͭ^fL`wSf +KG;Aʄӄw-wDnE- $-r짉FNȃ;T﫞y:ra _rZUO=Vɂʫj`^4hqgm'Oƌۗ{|ѹ +l ౩>reL?1q"8^[&:D}?\8\ ?Uж[q # ♎x9ҵ[f}9=Ƣg񭥖o!4T{c^[q5ۛ+tvkAi{g_k~<8Pbͥ)k1hpF2&3!Ha{[w9xx󖚓и n #qy`m&8'±c`رKu8T^"Xm4/o'ߵy壐H>X#pr%`e˞ +}dxd۔wUE*i*}2tCy3=TUfF$J 9W4zI."?dH;adڟoTc}XşLu`:B?Rf>f堸q1 +л;A>v<ő*wd=kOYYͿzĶVyާM.ȂXl>ݒ-笘r}q|hT~tV>՗li;@U*32M7Uq9+w\);*PwFBȔ}%֋U9gvJsٖ$5SlWY[kC\Y/74LzZn> K/+K_(~ӿblU ,o0 IRq 6ԙjuvآIٌU㣡|;6E)3,VՊ25_RjrOGpx&%!+&ŒOs'TR'^i%ZdñTgkkԙ6a ZDQx/Mn>LM1[Yo)k"3?\, yU ~G|SSa;u'+;g }'fbJO̿R'q%Nk*~7D>7؈,GkEE\*A sAqo&8Qb(罛DwQHI/0@k9^jך<(keoQ@<$a$M[\x x;Zݔ.ork:&*2 +T%8T'CLjK+3e =4y^ wI VJk9+H ++*] +G#2Lymm $aF ^+ڭc ~d Of񭎫yT>+CWY 8͇gj4|9@D:WǴX:\ãMA[=m|d艎B_fq5Rakd&T#1K{ JȤ*SV}ϴUX;qN$;e 幙.nݲrq+trJE@Eό$`vg*[bR]x,]}PirMa@G+v!*ED]Oh|Q8|F +Kg<:NGؐr*icdDD;5 wL:K^hCN= 8'ܙkCBKaE)-"ՓJƬvIQ/Gzbe-4Kwr vb05.Zjb>GnY(6oOz-8 Gj}Du:=u "Nܛ;;O/S814]eզ5O~jJ0'-}%@ϺcMQ5Zw(oG8U6 E%mSJc= gۖCr9VWsJF;[=Ƥ֜[5gU_X6Nܻ2Ƈnx +DKΞjD +o_#RUBIszThKϙyT4El]]P(`s 'H$s>|)ҟoHԩm*XxcM- GUw_9pf_MzxQ:Z}D{<ۭgnKNzg55IW]A"+5i +)N0Gb/HdaOYl}c~HGsLgݳ+FY_ro'Ꮀw0u3L :8{5$M w_~Sw9τ҄p+CBi` gy V>inai#뗑&ܩ ; +M +nAyNa3ՋPqM^~Dː"9O> endobj -887 0 obj << -/Length1 753 -/Length2 650 +873 0 obj << +/Length1 1401 +/Length2 5973 /Length3 0 -/Length 1166 +/Length 6927 /Filter /FlateDecode >> stream -xڭ{PTUCr@g`1 >FИb1R\p%lc__I!ɬ6:`sP 1~v]qCM47Hl?Ey -QeS&\Tӱn۽?مb;?Aw[5I,+O<~c.{_..+궅[f^1ǽ}F6G6V=cR,Fk).7O3_f'mr1aatfp[ .0K uu_^lj(tkɸk!;<`#8鸭@$o#KmD3s-unbVI@Tp߻/8K;˃7vݹ2 -x=֙4ξpIF38T, =:zi*'pĽ%я]ZtY al.G.|hC?uvE%#rtfπdJZOtwm!DugOnL[9nDTV.)e3?}vѕ[S&/v5k6?Doډ }^Zem}r2S/oL״Y}ٻ匼u9k/f1|Ev"j빭^?.G +xڍuT[6-  Ct483303t7" ȡA:$D ;Ykg߹}_.6#S!\ + +jV2@H\pq!.?fAr+@ `q6ugBu=\@Q)9Qi9(B!@B1.5ŵ J J( 4`᮸P E>*źɉxyy C\1(" u1p' x +L4sD`~MQX/\P8@h 9TGhG s6@Qa+\ Hhp 5XA  qpOk1Fa1O"?NY SC‘X h8w>"'Dy!,HO07s$'gcsc Y)) Y :,oi!sCq {8@<@,^DE0 |w@ TǙ׸@0=Q /[`(?+bgh-|(o8($+) JK]?7_V#@TAڣ1ohG2|wq6 I#-_)7oH嗛pC\.>pTda‰ߡR6BpPA:(.$*! mG`4p uMG@P:3Vlj}5P$4H&c(N0/~E(,.G?NJD491O/_h4Nkpo803ʇ; +o:Ra:HsKLUW${깟L1wiF%C6m!ϰx]B}'{m[0ðtZ"cD`'+-ku+-H%e ֊3 e<5ac>|A?Rmcw^RZD+@V;D>_b:NgY $6%.NLaEemIݫϿv܎ksz_s쿖z[8u-_^eM v )BAJ|G:?EVo*7L ̿ T] &f&'ȡ]%W$EݠQaljS݀'e3OيW^Hz) :!ʎpac<")59{}O:}mUs_{j"tncRhΝr2QRjݝ-RwUu 5t,ϣ I'k Sj>\Tuj0KD%P46.5g=w"#?]wW'Vc3c47]?>{JtNȟ+­\_ 4Q +]rO6l?J6~i8E]v ZJ`p(5wӁ8R,7=v՟L rrd +apa&0靑, 蟘JUM>" #2Pe9[*`BeˉbbW_Ӹre5fXl|07GKTc>,}_ZL39 a~͝UzT!2,F4$wu)Sէ*@GӣV;Ϩ9f+rvfLCz ~\l3DZ?אx^x0+ua.&w1{I—0{yjKKG#<*Gd~!YhF=Mxf#QˈR@HTC9 nlVЫ9OK IWcbg'ul_, +&v]\e6lDX/h)O35ڑ<Ɣ7dmڽܧ=z6rtJ`Ydlũ +PZd'3}(9YEċ4cK/߾dgmd3j!. az*$1r)Scʜ=ȻH(it[̥M\UY/nd}ڄf鞾{MtTQnޭWi𦧶Xe6sΨ6J, M$*6,c1R{Y}/ma^u D#탩kWGPHi#& ݅Tgb/)rca'P@c}R&7I +7VBElL=̯ +fQwX^탺 ܠyЧzlYf.aV )ub]^:zT7#<ִ.62ϛTa}tY_v2 FN"9)yie+Ko+f~9.+5zeCsۀ*怍9&5[4A`{ G. ưm!vx;Eq$0.7q7Έ!x +H16w{lR}mQ¡|e4ʲOg 8*re2-еoi<=4`f#RKWQ`Ŷn*Mj,I. ,I +_btgogJayl(?7']!K)/qH ď,MR;$mnpAZJ} j-HeցbKtbuqpn<9uGCڭI`d(ɓFB˚@XriS3{{jܐֳQ6}P +-_FGn.{zZ'uҢ#Yv:8nj6$gŞv;EQR\ݡmjწ7_n;g4UOo6 HK2SʜVpm<_m"Y _WJ9bMV"@娞6UWDfmpŌcR% +g=x&fÀi4W4=klf><ʪyDKMzQsONENp'1&_ˆ$ЧLi]߿|q&^Hlr'Mc.N~"aZd:,|ژ!AwDrqziz;N9]drf?3%_`&^9g'\Ѝ[驃;4FBZE_0lM|P+#^h n]LB"\e\_]ʝA6ƫ˂s"jBSs9$QPdPeǜg$V qmu|H-Rh֜ LJ0#$ac?gF~D8/hU盝F}-O~xCFI=0B2&w =.s/6rktV5Z_ <P P ]~4yIEmFU(XCtVFm*y¾b9*_*~^7;ex{9װڍw=k!_z6c9EA҄w4)sJMZ ey)oUD'Le^HRo<oz +VMJZ>aOpK5VGɡ7J_XS8K2w=sy=x +J 8*O/9{[p>݇zSlFv"MĶPֹ/> endobj -889 0 obj << -/Length1 837 -/Length2 1182 +875 0 obj << +/Length1 1398 +/Length2 1220 /Length3 0 -/Length 1733 +/Length 2073 /Filter /FlateDecode >> stream -xڭRiTSqHH;H !!JP C %\ 71$28S(`@5*3- -Y`*$J]T]߷Zgool{06A"D# dу@t!{{` * R($OHDTw -JbAItDB+f9EtX) 2D0syJK$0,JDx\!`x0$SPX3uR$ `DQqF0H|]* XNmh?|"T>P5u3P"@.rQM?Ip(r!a+4-ąY+y4D a.K`eJ8Js"B>kfa\+7b_V(̈Q"YD|J$\%]6">5wAD24/`f n3Y"y"yDFya??"/̝$ܑ?d\"J{atx.ow1Dyns lQ:xu?V~FSG; DRKK(6[3uȬ*!4q!\2嶅'SΠ@rVSq6Ն'mcê)'_Yi*F2v&#'7.<*Oal \~zuMM7dO>&ǗM%F(WЩMjWL:~_ʮ?qn - zU<^G`ME?d' JqSZ 8#%y638ljqJðiؘ>S5n[/ҮqAo9sXC6kZo6M|c>:RAF9qj -R'?lSccnY1KVlɿI ]&q-r#R琉~/yk⼼,k\iuxg}8p38.Ut߾'V,¶;sSYZxT)VOMbEq~FWްဲ iذ"W[͹K/NkT"k];M-*q5 ybh% n'Wk}tPܿڙWԆF֌R^fiͽ91F 'c'+ҬIYz\ӽ̴/vl[>ʷ|~4X(Vtɹ ֜h[v;F0zUZv]}5YOZ߻RyU6fmZJ_y߳SCFLiuQխ5E8YoK# *Aw@Sc+aR,]kF.o~ |٧SPƑFE&YQ,;.PMe\é{mr?rqoOJ||Ʌ7D{3a@'tӊۓGx>in~$.- QLGoرz&GB`;fkW) _'-UfPag|,a|qRY +xڍSiX  ^AWm$$Ha (0d&N& +r+J"*JQы-W7@HI@'e99yw^槲xoHG !!ąFq!Ac0 B?1(\(DaaJ DT; pB Rİ)D8e0C 2p}Yt R$8”U7" +RA%<r8 l̘R8TzTA FرLĴxBA`C!(t%DX {,7ese a%FBqgBAlx42R,r3Vi :Ø +Na.`dE-BbJb*3M =0\J(Ni"MW Cr\Ʊ:T".ƀ/r}x]P#䘯I0iPKkvLr5(h2h@?F֣"uhNr @:ጁU"@rdͧWMN*֜ 2xHaAA>}Grx?Wc}M~PU+˅{>5蓑'|C A7 +<0C}p(,)O *G7S,~@`52tǀ9hө?J(PӆcFT.(DٻI?Jdpnrx|I61 z]x|>“F˦'(:htTP$0>]O[~K@[~˗|-֠I҂4{ۢn5y 1>'yNkK*+G$=v_إ&㭇׏ni{?*)w{t7f [1im]_mkNޢؒwϛe5uqE~#3Cr"%t~yzE/ +.M QeExaΡǥ j+彗$D3#s}ZtΚTIGuŁm~WkZ]T&;@-^Ij2k/N_ѶդKמϛ>oR͙\XDD^>nۋu]:]8^y~Ja[)\p`غ(*ڧ-Ϸ4ibOak()q9i̅cqv)Уձ] VwoYu4Y]jOΥ<խC_9k9fksoĬb|3HW!e/ыڱʴ=*}rraPԡn +BYfq[JaCĜG_*zx{k?M'ԏ8yy+ՅsڦldS& cP"%&VͨT;fu(4tJ_ZM=|fjLlUqf(ix;l0|qc$wYM85&،V.ؠ^_elZNvU5O`o%y nWpYSeAf%Z?r}-'~,Z˾^ѣux6/vvwaq#sTy)WK8vxˊXYY[Oltb>A7Nw[v;gF&LnhdI~1|jӣ|HbdM#;p(AdUqk^uc{n/K : SB爧ǐcI'? !/o卫]ӊfx3RF9O[;Kzy\L|tYm!C{]cgo=?LȊ '9CW9.H]]ƅqF]#+G ^eR endstream endobj -890 0 obj << +876 0 obj << /Type /FontDescriptor /FontName /ZUTHPM+LCIRCLE10 /Flags 4 @@ -3786,53 +3845,53 @@ /StemV 40 /XHeight 0 /CharSet (/a4/a5/a6/a7) -/FontFile 889 0 R +/FontFile 875 0 R >> endobj -891 0 obj << +877 0 obj << /Length1 1606 -/Length2 8636 +/Length2 8614 /Length3 0 -/Length 9458 +/Length 9434 /Filter /FlateDecode >> stream -xڭteT[5w  @F $kp܃w ޙygo~ͼ?SUg׮uZU]b\Be] -bg x1K;͠ (Z-<<nAAA4z4 dm0i0'`񟞗 k0hq/@ jXiUwr&9e- t2ہ,A@3`q}X@?9s`I:@ 5Ꮛ t9;@k'30PsCn% -q:[8oe 1 zq V/ ?%{yB@`g9;ؙy~spE6;ߪ7sp6䯨:8иy^rZ@_r[h -n>W_ b33/$,!`;% -S}I `ߩ E7q{OhY;;e3{^6 gf ;!:O f/m[H, rZ6+3e[@` |`2/ޜouks:Tԡ ));5_F ?d _g%3`R2_?`d?S5[ -\^뭿FtZ-A,>BGtwr;iUBm>Tsԏ =5{:HU,;.n1*@]z#"-Ƿ^2F(Z}=D6Xʊz'f=Q"Kg,R2 +MZD|1#FK -?GT* .)vDoXN( -jw{tbo%^$@QK0q+'$w~x.jDi=lccYNzcu"nc|F*A41Bw|eBâ(Dy ,9#PV,__ }gȊ}G Ġp]l/%HI4Q^)z N.,RI;+DӤٶ3_VܯH(I3P:l?iQOXΠ]9 ՚2j6Hs$ӫ 6R_RN+}V hA.kٸZX') bչA&~`1hw -xib{4 -ݓ ?B?_P4o%j{'2zpj3û(!݉o&Uk5~Rd<+.xS1̓eEeQ.fCryt,@ǔ|S=/.Mzjo>( -*pBD[ ֐؟X-Y͍a 72xUv&QP5޼84fF@~+AC WN#*Bʝ{2(&.QbW%Nc%s{Okμ[W1-򇾻} DT9n^<=ؾ@$ԟ2~MB[ Hr3qN*y"IyLn`8=} .8*e]6>Y }%E<Wki}UAaVn'$Z^oɊb5|^QvI8vySaIWSjpEa 3d&$@WJm?54g]X;ta0_o{;Bܠϸǿ&>o$"b5k)TP|k],֯$:!qM1&&6Rt ٶ-nnZf&d3^ocqa~SNCh~Xo\ ÍS7<'^-2xXeQ< % P_,pۼ#3m 1s)&ndo̢PWKZ~7:=/MjXMzI,ijYc0ZwƉ@TգYM-|HUlʺ̢=ոB}Z)@J(_kWK92aS) ??UJǚ7*sv#Q1,]OJ-|8Bbl&y7 -$|<Z_oW -ٮrK`!lopܖZ+'…T\Kuk3 k \θBAUa3ԯpJʢJˊC>MiLh]pbMϧeDe77x#P}w5-Ď=O5c(bFӪ8M^0aL &dߣEuhКϫD?nׇ ټ]{12[P54m6tºf)9C*_`*6X3(^-"nռ x#/#6+w7Soܑ//xB#pѓ -]ּuk*HhI1D vݣN]waj u¿E~_N׉y'@r%pQziԼ&E4Σp|}y hY=awUojO %~zMckQyBյ !\רss]c`呤wn) |Vʥ E>1̱Ȉ.q"?w2&J3UY=:' /%U1Æm͇s?;F T xRćѴC{z-JBcKN6^X\uld4RA,YAvOnb%ԣȅ eTy&MUnaeю֔%yzm!G@'Z 3 I,tp@;'z^e۾I/A}:ӂ9&4'8JCuvY}TLgW`.̀nEh0x>5c33Y*'I1=aOIl d{;S\ke,o VS9}"%=;*/zYQ8}WRzI!)}opI7>(7 u>'FQK:ݧD%Skcbzf})wJ}4.8`">ȱgjle-lW3W&gK-C)#ƿ XѱeYiQO-'60_-Oiw6VZ,O&T_Ov"((E x6~Uy--1uV#o&&i}ehoV)b$^'DϞSK(b d*'Llu9.nl;OÁka>qONKЌ[bV*D3;1sFth~UУcgw2A<`,fpGJby}6`ȑKGd歶Z"EQ<9gGsƴ -\:d6Cm5 BmQ^28L*YNR -ChH{ce=n$,w]dPOD~6Rou=I~dEm\|s^Zm)HDԍga=i5&DnU! -KS~s _ӱdVx(7h(*D3I+L&?766Rڭy #S _c]5t f1R/i5nnQp<3j/Ic)9mWbS||3HQBrR`O/0Ժ ɞ]&@CMMlG >z== q<dvfB- =2)k$\2ͷEHƼPQE`β+VDX_NwTWRt[9O鐫"wi+u7Eʹ7mf_)-7{^&P~ |k>oZ6NF˔ aDzrq&O=A&[2'W 끖Ak7&W6DYc3>zr2 S{ X91,:U.er4ؼ1_@ope`ޮU#HQъ v ~HJ^!ɵ" -}(aKHswq$T8pGHJBą)?u(]ixnT~jzpʰ'd9da,oPh.3|:_#aV Cl}ز=1mؼ%EMHe'\AG{jߚ p|UB/*iݧ*VDffrx:sn\ȋ́ \Hd[t0i3vsug>uo(_z3}!~Fn̯㭳h\ҒLwqUQxNcґIl%NBRF:Ν姖v{F5r3^FݤHr1ݑFR!m=HsvƔ1V]ڍu MOs7b_-i]˶Ҋ@&K5k< ˟6h ʙ=>oS}Ǘޥ\_LV\k T%ck Rc}Uư?[L*a[acj`O}BHٷ,L=6k[#FG Xs!7gb\Pc8TCU6/U0~E,֎-K'=/hcpχTSRWd\[0S Esۉ(67vK]gy|wX3k$]1k,AvI?&iJ ̿MWu~g n5YĿZN=\17!:>dy-o -TJPwXu]]wgF 䤲Ȕd/ZV`WQ8=Sz(nn*0"4/Jק}|ܓ$Bh`h%MJ瑘&a2n(:ce0+Wxu>- uNH{(W ~ )U,ZWN-FV~jҟ,OƳ|Hi[ݖtdHa4ʔZ4OoU=[NZf]"8rݜrXc: -1\ѦQ {ɟxCh cľeE]<ݞ鉨5eF]jxwdWXLϘ0(w7e4N>a:ZX2z^6 <4>эʯ52 t&t %rkN7.uEw%X{)L5ϑsַk31I]`MٙBZ;o<ȽvE}b#ޠ=;+bϮ&!b;-k.E㛰k?^d] 1Kgg]œ!-z'"9~F$XZЂ3#~ۄ]FҒN$,PaeEo 9vL'⾝j0,|:cttu33o;$RL ítmEBI/$ISpnqŅ8TNS7W׾嬒V)BsBjyRQWM49ŵxURoٶkDkա#{'rvkpPݤ/hz@ *"}2V[W"ݓO,w9URp#?4G!M*Dȿ͐[f0^Tv/;UJ^I`2eK+7 oFUyS{oQsLI`d0s7oWLYiY\=n)(el+%yqF~'E^.i~648zHdUJ#Ӓ8"3iCʕ.`V]'7i!4̙zSAMԗ@|$h%s{9o-:5IϷ~槿&@b{uss]KMikH +ApprNVp5(DCh xt +`10@0"g @9 bB=a`[;YOۀ_?)+bI3~< [%8]x@" >f8=4p;#U5扰D ?PLk(OKaK0@<jY`cG0g/p0_ 0%?t~$}A!#xs8x<a!_0<,0en_?`!@-AXB@WQϿci ۧge Mș 86@?oTZ׆p6Mn\8tº;C!-җpCm7˼7 t^uX[wsBKۼjq%έ  1kh;l9q bR_&#<-`WhnBx۬Pb)XeV'LqkD bKPF +ƷJx +Y)|(&o FkN>a_zԲC3Z>ko{郆k:tS _!7 CݜEG"0ZG5X +L7k^kb</j -ՏH*Q[lV\ YI?la ElTլnt Ka[ϖJ5ou۽O•] xĆY +_-LxC_Jc |HX Cl!r?!&7)/ejLL;$.kʌ,uy~ wŏ`놳> &`DHiw;6?4,8oX#M؍HKR1>+wBVh^@^d(t)"ˇdU~3'M\ ׯ1_u[{V$ + D>x~ (%q?DSRzwA`NLx^9?t3'2"? l#^3aHd [1\nrTUd.6|TI@_C;Ttxobn6𒂯TgLkQk݊x Ch5MW $6*`9og> +Bοӈ{JDBǭYrW*?"#w^bw) '\C0-Ɲd+$W5A'{inLtN$Ɯ7AN]}ʛfH?aƌ I?Qd(uz5pқ+֓=oovC׎N XM<Wa< l#N|:Iw1pИph_ {\3B+h23}Ky2x'_ݐ i|묷ytwkdYt| t yآ 5]@9(&\Y$v[gxCU>w(5:ƤPjJP@徺1 +~;6j^̫ :7řb(oՌLOj-D9o7_WD9ay_j4KU{@X2;⮭ +bJ6U]~dJ5=k]-l5?[mD3'%Ԙn2IdMςFR}qe~ҢqTNjhٕ#[͒ 准8dZ݈gDi~X귿r=?#R|_v +,R_߱Qݝ[)ŦoH3bgIV"vS^x=BH"74VԮ%FUf9m䧺Z".c$g_e64bkl^?OMdj{H$v ] +2OJk +kWHUl)G~Mpo6덀'!F0Zw/5"&GU;D=13._QDqaRY0;8ۘϝHƑ,"T&Z[hDsr"& =L:e;󑻾1M9<6:Y%BZF.#7 X0-01E_bGhgΕo l-ĩ2;4P(P1-@*0OO!1dלQ N /<k>4J4@e?~ӷf~Q0z4RR%HqDU \Abp@e3|"=|S .ǹ8#T\'yoǐxL %E贅aX [=-`2*E lX~hJ.׆N= Q& OA%eюg]%U2IBx$8R7EiVЖ J3i3:I{0;f-~! ny3]ڌ%le8R h)5Рn˘{Xj׀5rdז][E9yJsT,%EmYɅQrUt0&CxO 3xзeVrlaYXw=W}NgRF_?}Qo}hi +{m72-ھ}MA\caE @U&S +dۉ{LuҞwئJ32xV PC }-*F|7#(zު(I/"K54_Bհ߉8FV?@E?5|ɇO+|a#ĴĐVR[utnOHT GԻqd䓵Y IpO̯j$O:y}Ϡ_2%["Gw^E{B80,t)\3)/!TD@deV,ɦJ!U}E}xnaF P(hK}|6v+u{Ĥ^bMп>MvrFfrLH3PɒS>7x+/jl7za-0CV4W*lyBߚsO`$؛d .?l/s@D Ůc:_i³ g\a7;C Mn:M8BI.dI$MvbGe*<KyQ <=?Y5HנQΗf'UT2tz68{ {D"B,ꈰ\N$?ʗ Ĕpړw[2]ꔛK>2ҺYPg>mLg%$bZư.CȨh`xl/N5r|LcTV7~M8n<`_* +`|I&8Nݔ5$R8MfraLޫ{/$})q}H: ugNQ>V_ iYM^9YpM$ +c0ӆɨ>!5 n7Y8N^))/V}0q\ 8^ZIӧxь_B.ZziRYXE׫u6?h c|+=s>@J8 TnJ˛`6Q"oT LL$ %6%侊+*g1eVZa.eл]2NlxsM0jMFS#1Ck0A%$zGT+E| h[^6-d#gbx鐚$X [l_eϯ\sElob2= I#VCeBID=RȔQ:Qyw%l #'g %)P7P<]ċyMњEIe6Ya +S҃/iY6v3Z6<(#{Q惲(z0VED2uxM TF<|5A>͌6ltmW07bsz kc ruFd0by]д4=:Kd|gpJtδyL<# tW_aTIWPB;a4F,7iڋ #kPYʁyʆr7PeHYxjI,Ѩc2Z[%NMǴ t|lؓf*6vu(6~ gw{w$V} k,Ae_xeLx ŝ_H}.v4K'{5;DJ[.FGwk0CjK9!s;O$k~aLzp~֍+~8+P#BA] 8P鑚{b&E~ʷ7 +9uKX,(U}RPWGhY6hQӾWgB4# ylZXF|OXO(g A#.Lwǫr"--n[RUQLV_q"k˪&€ |U#O/ 2H 9ڡyeہhަGg:Ź*xϧ~o8Gk0SzC8)By/_/F 6NNXm/Ƣz ղ{pC$ƹv,OIt4W[]HR~! .Oxq>k +W0rN+ ?}Kz>L}"3&YEDŽԌ̠`7 춬-s2>l~48sA+F\~=dsDojhtN (ksD됪F*!t $٨/uؓVhg뀲 [gAaOKI#H0'[v}#/͓yK̽DE7A&Oy#x|6o(x{ޑO<Ҁ&%a(W3.9|~6;{Kvq!-#F\R l.xJ4t$I;ͬƻa:7]Sޓ:S1F[A2:eڹ/A[xI9ψ('@Qg:4ԦFo'RjtIZ{UG߇b>ie(@O}U}mF),ӅGf'˕zz%)m,dUDVm ׮3\($WmZ~CdS,7qdk >6ii]$rDL$dO RοY-*~%[K.cXJ|8\έcCr"FNȐٝL:Y!Vd0m m:Sӌ/1ʴFo1f-W $<3}4Z`1L!Q="2ju7?Gk}>گ&/6}V嫗YJpyp uHDH'TcUˁ$_"L<昸d%_)%4 ' GH=gg48?syK(4w@btvfݹy 66R#*~7HuS6k=bV"yF)V{Oiϡ3ܘhD/\QI(yz~middzeİG䞝B9#"W'I;Y(Q2w|œ&oxZJr:}gV Ր$\(!Ewٶ,#f/*ӛ=b\f;5kЬ~jH8x_j8bS`U0t-}Z-_쭝Z׽y')lö0'3.njdv.6 hY36(Fk,MZS~0M|r$&CʗqL~RG'rNbtVlrvIAdX+9N5X@*lL}~ÀeB[T0~qrTl*k3RZuo&ZABԤIP8j +Ud6! =G:^qKՄԗsĠxhل?C$-4Mh!LPhC)w53jQ^Nkt'3 VvCXOZט&7է:E齥Ar56s tۮ&^6FZĚY>~r.EfF^>^">Ouma:V^'S_ ,'H ZQ*V/V.2clΧ]sf7D7SiLblp>^厸Լ +I =d~#P ?%;."0ԝ$^~V5u endstream endobj -892 0 obj << +878 0 obj << /Type /FontDescriptor /FontName /DWRYLS+NimbusMonL-Bold /Flags 4 @@ -3844,92 +3903,88 @@ /StemV 101 /XHeight 439 /CharSet (/a/b/c/d/e/f/g/h/i/l/m/n/numbersign/o/p/r/s/t/u/v/w/y) -/FontFile 891 0 R +/FontFile 877 0 R >> endobj -893 0 obj << +879 0 obj << /Length1 1612 -/Length2 16818 +/Length2 16796 /Length3 0 -/Length 17652 +/Length 17635 /Filter /FlateDecode >> stream -xڬeP]-;4R;{A;[.5ҸC̜{sGE<;3ʕrz*(IUE-̀RNnL,|%3wȉ@I) -4uqr0u 9 ˋ@ wrrvhi3xX9>|;9;B_oTn@= +$ VHw3{s9X:;9ZS/(` -9mnzq16 g `jnNGs{w[:`*N 7oV t6u'7d7 fj=eX؀M j/ GbpZZA0 ߪ7uvnE'7ޒ oNslYGK'+˿ -tWhڿ$L-@Kf%')4w*3ω? #kCK+:_07@co -7u?lu3 QG0hZظ[,Mv_vMG #j&4mi=]@GNHά!#%#GEM/U.sx3=l yXY}_kES7WOߒYXUH:;Y3+n? ]]XkЁ@O9꒓9mZf[-NЄ~/+PsIFQA@SZo{M(SG}9^l{e>/9m_&U7AQ rvՂ6 U50DSpWO_ 0)QS:Qk OϨ @SB -p!ӬN ބDp~AmGIObخ .,*Ӻ_}=7% 4;N) h" ΄'zEx:TӽOv{S0wDouQ~3XfG8m&;kWs`kZt~uUhx#100t4.C^|w"5JG*ힹDEa^)yK5bH$oRE<9 -|XQ#zZIී0_d3Kf:| -{QA'XҘbU@8h/ cydvocv/C(P$b:3b]HT#mH񇑤.j -ɣfЗ ACG! gGIm~<*2I~?W-Qe4L9ZQ_I,~Bi0>}\n mDLh[ `dcFR5{ Y9UH\A1E,q|nXuÿs31BЬ~}G_CC+49BDӽE6M84Q:'tLis$Amt1I^0?a=ήӨdlI_Ӂi -lVnI"wdtR r;,Ie)o4LRwq,G ,g;4¼(6=` -L 5Ӗ6Na,%o'^V] JcF07yn-ӌlŠӟCj֚?8jYYs_2~c XGhU츽I}`!kod6qdRFmh`$0%>bh ڙ%M`CΤ_D@9$-z -S4Du]:s؈v# 6ؙeh -x?\x{ȆQu$/L^Mev׵ah#ֿ80='5#judFc sKgo2䗈ғdmcXi˓Vw\?'Qg$n˸hvZ'| -((Ɯ| -)+ĬRLAK͇Mމ}l.AHܷ?x I QÖB8zuws~+>0ffy#eK$ -CBZb‰MHGKr2E52#"X+e ©!(CFqGU>`Cw FQƻURoh9)2b#};>UI¥_p1eN‘iʛ&K%t!gʢ1yɢotU3yR25#jQCsjdD{4T (JloSGE+< ~!R*a_%P*ʘ.|YJ$e"$bF֋^g]xm:ݣ'XACt?ˏmӭ bEP0NJ6sIw6/WT0wPYP~QzE*BRDA3Sn'H+cŧ}Qz0sss ŵ_3c!2RZS*ὲσ2LOnuk3Q奇FĪr~{c*TSHW+&ynOA< -,BN猪N<{v券/(*)KLl7O|82Xp$Z}q9b#~K}{V9l_BPgCQ9(c5\By} zMqz&PBGhXϠ0 -%)K{qMtF~%f3*#X//(ʋx9擸ƿdpɒ7jJ2[%_ -Itik2|< y@= S,n !m8JqH8|>}plbq%QA%'g}C,V r4#۱_ɺ܎"tXʱr`L|*|Ԛ=y1°hqR=gGuk#& W<95#q4yXzfEæzSOXC,lKτjv/<CkM -kJT3`gqsB_3$Jӝy~Gqj.I -dR꺨>QcCh3Q`=,Rߴ!n>mWf7mUK:F>>"QMYִ)r| -Ȝ#C#$rdv 44'W$ .zmsFEvnj+c_`lC. ,a~%`Н`,JUbxP;ChU;/nh:(@8qEpHze~4&+=VC/k8کD3S%YG/2F髞$Bظ S%~:{>vO*މ=hheyzLۮqƯջi*;5Vlm)9w_N˚AX>&/QiTq#(']:+kEN/m_:pehϮF]PH&ZهTC3D)>y'{vhE9z=.<~,3P[~^@x /oniC؛&vH!| SD `Noֻ,3PR=Q<ޛ*uw[8Z-l⇴I:1&i+ -qTK7xݣ՚+-o s̒M+Sk _"%Q ].۲+2AkIG5zwi(j}'7$J,}%/ghw*qAY%hjgeziܻahWߘ{7iQS]^v=OTo,,:7&X5,tXFz- >(I'Q2<8쬶~K MԽw 6e~w. u1K`b+U@qY0^UPT{ׯyݖfoAdR}f͸fMs>>}fNDi533[zOs?oPho`m0B -e-qT :, 0l65b; UDIv.V\0.c@=Jxrs# ^ps'H~a\S|̧i&ba'! w?M7QOhȏt>RP-Taz5;^RuC`]:*Ύ紀|ug~ظr΄Z~$ QVCP>GOK1=lxuF[Qd\pl/ 05YK8a*H! H@sm8̕e`_ģ<c̍Oaހa۶KQUODO.o{gTI -؞LJ85HgG1N@?qanZ>q zm~SI̥ʱEsv"ȼb;ՕD2~*aC|D|!e0t}ds_2I -O7m l,c :@;,]⥥nX ]N*!*+٣9@8oGs.\[]ʞAEXzj[CZi^25OBM[#cq~SBҧ!3=Uu*u0d0$%i{ ȁ`}Zc|\V7'{U>$&J{֚6l'8%T=H䉌Zz`tr)&< }tM#^4\jUq J@Hl,(pQ~Y3,Q9!6eGVSCUcj*CE;ɏ,J{{oNzh1߹de~:eN3Ld>?ma2ih YEWbIօr"6)YAeV1s5%r']5ΛB⒱jͦa=c̞ k1+`"(7P?/B#]LAqfdndG _pp7£#a#5Ue}1ful=+5AZyq*`ߕ5[f7RQx?o[PG{0 `IEîbGAvH,^?Z6;^eb8Lݒȍ <Ҫ`bs0E+_'c< ,F]b?3Ή6$dmkDBble -I&ʳq뜑r4atȑ@PcܞK+*+|N -pYuP  N b<5w&+33:JŽSpE%GB!][nƶk1 -OC,po 썫|caRCm:3ug3yusZ$:"3% -=;CjZ|XnS2*[ӕܝ-7_9LgNqgrϯ!N\H32zzNx݄WʟCPH\N6W=v\&' -D+ޒB;qRNԮsFt%Q=_hoEypʘRU {Ugq{68gN^U -v.0j:߰.2C*lťjLc'vSRnq\~`1VTޖ]K h~Fl8(@gSK>`!ޱws ~ϣQ7ՏY,Gf#y!dTg것2WTg{]<mAPy>9ynSPU(KUJ+ؾ˦ '߆VL6c/5:'#=-41 @`cfU<ՆպKb+Wa9ypQ.Ȃ'@cU=O:č NPt}f>(MZR'K$@|:= '| D;sZEgB2ց#r lg^|h&rJZ; ;kAr=ORNltTιk|߯YY}6߫Z#qG-Dxp\- КG[j4avrӕ089l^-/QFqcЃUOh-W֟᠐6T&KB(:T70NH-m?%skT}\b' 2A -:Y/I}"k6{`eAWr>yW=9IluLkM3vń7%B.h:AWh80p\wz\wׇwzcv d@h<GV$p-B=}e?g9#"+ƾkv;3 ]wǎ/6l0V(II'||҃"_I8t![*4;|GCfI4H)qVĶe{D=!Jzc%x .hY-099Zt?1̻I3I?PWw=NG6rݕ)\sյOJx9rry_b2u"UI`N [- Mʉ8gp+ewc9Qz= U=mdܽ +{!G -j1m$Mp]L`C\z'u{PIH1ҏG֙h,P9&@?K/U{h).Qym?Mi|+g^]{.TiOI:EDO9D,(bSj1Bi%jUs,8ktSW8u6i/vJiL [`>/_dpU~G&jBp&CK*>%ٯH̏"_WS+8Q4%202s<94s"=9l!Cu@8.c囌(UɍZ;>޶R50&FtdwB plZ ϳV{Dg{΢,`)>j; -bʸb%7aߺϙ5DyJ<+犳0%0jw" iFlaj=mZYhyxl#Ma<7U"q2ρ}iU5r)8BBg3$3z!XޯA7r+'īa+} ϊqGC;aFmSTvhAbC=jv0eTu[AAE@@촏x'!$ju`慪 ySGZkS)U勚9A >UZڍ(g ~#ܰGyi$?#Ϲd_14't>-6$YC်*, wRźʪchwcɂh@gyJ~!L` v1,iNUJ?#֚AEDKhN-;m[HݦU:N_ٷCJsĮ?` +\RyP?zJ?z󥒗4D'zRw QLSw[VܺcKlފ6!%KYuq1A.͹V"ՍNQx!%Ƅ?@jNpO+<~1ʐm3JTG GSS5T5'i{ oGQ7ima 9ʾ$[DY x/dr MvHYn{z2<|V'OoBk|8r G:ƷeDuϏ+K73zecbOP)R/"m|/Yb u[(3cFv-/hK`!߿rV oyE74 kHˆXbMAaw %ݝ]!cejR]4Yh:O(ѓ$b_`Mfo|S_f:őgOT6oi!_d*:O0I1<|].J90,I]C!VQuێn~' Qc*d ?҇@ zrHݞ[}A+TQAYuh߼ir2˪7( D1=\D w^\V V[i1Ek4~<;<5߉?2C1p9 NIߟee7 -/C-NKQzFsLEϭ.R``C  Gx[(gHzK ;,}jijOv΋S/G^ay>p{Ew~r*6t -Y*"@&ϝoN!}b bGӬ<66E-9.9' -aۙ1`Po*mkiU0[R[3D!TU6Xo}K^gENagNW^Ӻjޛȡ%<652~dn o4|tHvE[NBOX1(8A -샫2.}MN!΢M* 1V× i2|daЅ d -Ty FB'>{Mh> -LK4 Q1h>_ GaWjM-hW K -=k)]yw|ڼ>4a L:ZSۼ9b*7͌&>3_[L8O&/5ŏKwn %9}6.ryI1Zv?z~¹cE(&Ƕ`k$Ljfdc^q$lS䚏v6wr6}yBg>Q7^oL3QR)g'.OրYR^#Dм7`f~L s{J@xxqͺ/f6䆖N֧._MDi(oe q?fa*DJA_0FJ u@5zVR6&jlŁ -1eہR[iQI]%J$NjIOQlCHxU^Θ$)tdqӑٺ" w'Q PvWqiɿ "WA$vng9M?d47/h:< FSގ.0* -"cC>{.!LbĂ;(;zwSFkkV$5TiipfY`Te͸v!~297 Ĝ>qXGX*?cXBs;룂^e)[*:|+};Dn4й,Oc+g9C50_VNp:1&+q6C_I^I a\V;3 -B:]LYl&-r?k8TL+ |ߐ ~R W bH^q8FZߙK'GgdNp`@ l>V&ޛq^^5G4z U^kIEZX;ܽW=42טG˓VT` Ŭ'; /P42$Fͫ@;%rN_ -rFL{غ*RHv9]S]C؝''ɑ E)qsy=L19!C ƖaxpĐ>)mcPTzxN~#XӇ=6e˦@Z!o<O_W;'SKW> Kw9bƯvK@~#q;ւe$ rt3Dz5GXk%0MchKDX+S,FoI_ky,G/ v3С*ؽ%rQ@ORgWa%` 4 -xP٘K3Oljg -/_L`3 ,&~vN;}_Y^٢U#Zp}xRܬAH̀:Iÿ(+yá>$+^ӱ_-F}$C{U1qKy;weX4ey&*}74&J@g09h1ɵϭkgazUP۬-7 -lkde(֏)[0j)8p e:xIKb9O{d)zɎRpШ`1ZwDoLeut10eӼ3^zƑ5+GS)B|Υ|D;f:150 9c5EO0'w0U?bw1.H53tfhfY:ݧrcéZ;Ă]1h װ~'haչ@kZ2*f|bMכ&z|#7p5C\"L%q:c27W|`0ON=,fMXBG"3]B3w;NxwXE{ܦҷG, `>h#č#Ca CLg ryJϟJѹ -aO.i*WY -IneC]{C2/ewUtfL'EY~,4Nγy:;#\۔$}/֙O/ԛ߅k,+F`s\DfŸfs3R%)gGq,⡀1m@I*eէX\I3&gd}ؘ -%K# raâ*t Υ1s&g{^GYJ1f/qJyz~):`v|]2vAKdOi7^e u~L;!$!&jOP*Y#?\Wm2﨩6!T%ĆxF}(_cԦ'_ı rJsNk~ pCO_A_{ J^z=^ZWwr5['t3Iq믲Q v|rfo^sy -sACm@5zNN%?b.f:YL8+/=_Nި +xڬeT^%Ay !wwnsqn?}{j͚UڛDYA(`b`ad(Zٙ(83-\b@c1 āVV @Pբ/?!@ hhި@@- #(RHƶeW[+S)H0wp{0u74ƿX".c#6)=lg`p6`eojjvsrtvaLblͪ,.o Kc?]#L])_0 c+{' `fhk7_0Ggpu/g-/__um=_QhkΈ7)on +{Eo f/ c3{[I7%Ne>$oEF!{ZVa[cWajMGd"afdEhl2Կf@g[+{_EL 3-Lmi=ǿ]@{$WQgRє;_Q{8%?JQp0_0DE O +oBnCZl[23˿ + FYQۛemWt",:Yf~ M@;ԫU;tmT|{ flhX8u|ߗ=N^x٠l;`2,AN;ӊ߂d<ؙPQ5,~!jgsz#s$cRՁ2` t>>]v <1O)I"}>@JHƳĖHΠH'PXW~5.EڬoL-u(ϏxQff`tOA\ieM l!~-^g(ֳs7l@঍Tڔܵ-6۷gd|]흼xOTmWwv, \Dr FvCkm,LN_7jSRroJ܏̟)( -ٞU5M](5?Dq5k{ڞJCȫ8S  +U%ȏQ#Qy ҏ+;G\_ᮈ@~Qo ?$)-aBkVENd)ج{3*N'>N6 ~h:,E~q3*:Nk3ƃ s`OK~ӽoTlRUWF&k]m]d?&ޏPԽұ6NuV;>՛@]r&cďkhQѓ̍ӨP}JjojdzrfjE.\"cQhJ&kWga@pN~3>њBӽk?&bGW pGobB: ?LP'{cXFѰ߀MSg[] (!WЯo@1桐kUerN_ WjcRZddj9cS+!?r>V;9=5.q bcxȷ_,/X>װAƙ?($Q5k>K:7{,L̚Sk†68Rby,f6>|Ҭajb oc֧\Ζ6#oͼE݀CfGhq%0.}X4M 4ߜ 9&^/ +@:g4 +Wn Fm$5Nuw4S]}ynT>"i&+ww/&Af䲼 +ʮ)NW]DC嘧ZatG =xDoe2zRM)WS;H15FiZ$/4F:Kkzkr*o/W*azK$?*dشNg G0+FOGO+B,qe >J.B'M$f>EW6 +bli,LJZnKf ɍ/az(Vr O夓r*Ajk-?3[ +6 Ddzzә%^TBYԧ0RA+_^mԜ'?Hg +ׂEN ~p;X32Joz<jd= \fCڅWZ G.e]Gj6ԞaxQ1AZo*)sssP +I9ӣ`!X'Z"'2] h6=vR]`9]6 >oʃ}2ضOGG{1gͭ^(hń-=5CmOT(0qKmszT%ǫ=uO1$ڤd+@VJ&{m] +΁0 p{{fX >{s1ږG [0*5f3)ȋF4~M=[O M 2ȫβdڵ*ˈaKe^"}֤J\ö@J`YgyM]! 3]Nم +% +2.Ќ~l\ʪ&Xa5R 8\CKg.xa?UK GBsRB\OoZ zRU<KG'"|7<7 Xt+}}h~0w"g6iBJE{E=1C1~2Ǔ ?>LeEߴP; +C 3C%4~|'T/ ݣ[-eVm7iynzdN1H=̚VW#PvV_ЦZxk-gx}DՉF)Z +G^]ck"SyTў"b +}i@LȜ)$W2*m.CJd_SĠbDudGR;BA*5в6>4+m.#{xYI"]+7~~L2"iauh VEGrWKm{ݛ[`2Qy, L5ZoK8oU\ǂ(I ˸|E "%Z+[ӗ1Wx;EWS +r#˽Yޛc*BgFJH&wVnIq.OܗS]Y440;ϣ_ox2??њZ%] pfor!0TtŎ +:9MX7"sп#XiFiC @fIn~B2)؊l0 si6nX_hIF{N;ǶK n(yp%݄=E9'u t?),i1ÓޓPd1Lv^(8>>_c |47jS Y6vaiv_\zنd<1i>ܼMc\cVFXѠs sv0M2,e0ccۗ{Mmixોة$s#Gd@P^٤bnO V՚kv䃙7Z שij&sN udFPDC"=~#&Gĕo*Kvhy(̺*%BUg}g|aJnx•IE~rނkc4 'OQҖF oa b;H$CazWdw#4$: C2ḵYSs},g& *Hcxpy?ee &TP-(?5>Nkեﲳd9tpƛ\BwţjNz_^հ" t74kF-NP%AP+aQjdxZϰK FH rn CDsa# 9șB}M3!| VXE\ɞM_ |X UIbY\!ʳhAWJV_4gQ]}gєHB9,4Cȉ#Sw#ud4VOpEJ[ |Ok 6ؑu{T4>VCR} U Ic{9HYr]Q,g6yF|WrdguQn5vⱕ83*f؁auV:ixȜ$cZ;&8Jڵ9EM 7"/UyUfRwwt{89=.6{Q0;r +)"T+r*bYJwz_tL D2jG8 e4ɤ>OiPec.R81*+g4g4S%;vG-"JF+"9 EseRW 2h`}V㈑UU\koʕ2N)€ĥL$Jer)^hV- lLJm&}# {Ou.aq~ʪ(/iö[۱%_cD7ل'88 +9 P!(:g;I9򹦠5v@TveE^8CH2$Hty%渀QzN O1E&R1/6_$MدޱpGIp?^RZV%mN}AfF,_ OpDR Y m̍õWDgm7s׽ó'OƖ#:CZ|Q 9e K*#Vcwm V@^>չJ<}'Ikg?}9]\y +(JAkNLX8[vJGZ <vͯMO#s>47]5Y})uٖDC"YPXgn:T['_﴾_BQѥ{i&0Cvn\>)(PdF-S\)4ϕQbK{\]y;NLd(+Ne|Owy;: h7VWqŊެ^lTK3M5"4W3 jIU>Bvk(+CVоϨidk`1~n,2MJz}.| & y-Mo$M!Hk΀S4ɛʬ ͚5LYgrG}c.V=R6bzV| =+j +9,}/m ++۔2w#w=Ѭd ENV?sskM@p^orTNvޭ|*\PmaCULPSU#i[`r(2j!`{*Dت +ejVO_F-Do^G+!v/ LiyaWg}JH-=0Lo(rȠ;o{x;DSpiB]Rvx&NKVq1gRk_X0ukGQ1%/?"JG91Ql"\-)I^VK,. çu1+Ic]\:A,Zy߻+E=b*Pz s 'Q`~nz^` CRg/TUx~L mo(zlkP8ٚ,Äa5_]eltgh]ˋ !CcĉBUMr& O#{ +^lKwf(!R.k5ǖJ~c]|25Gce1MԻ EFl|'mR0MYcN~ϭÌ&ǘ߸pD$"*V6[7xV JbJ# +ZWA NPꃷ4%(-4[pC78zF`nl]t)=IoC>Q+ల^[>MRN11܃nBL_|*׹- +c#RabCkQ !Gtk6I*D-%[p}'<,9%Xp2b + +srl]f8F',RSw>cuvӚs )[u.gƏk}?g yaR)LNمkϒJXѨewn仞G/%=[;[d<& #?6>L/Ʌ`>W4ԕ`{{6FD޴zzH˻Yځ1\g&`50:ߠxWƺ"ƚuۋUN89,}^mI[^sU to7H;jrF\?yoI&i0v|?'!:!\7TޒVBЏ|vrߟ?@J]aMI"KU48lEp~q.aC!80xQx4"1QGpPzȽ1&P>s2>Wp4@ၿj*)jx|Ou%7 P}CzWP(:`5; 5`o m9\n!C+|J{h6v y׉Nk*!d)R#_^Jhget.o  r6 +4j'}{KᏟJ$nig&"}}kF`NXdiF9~A գYކ}m?uװKY?հQx<ȴ%F3Pq߳G@pj&w +R)Ẍr8Fr$3:=|I &R4UG&J6 h}T<,,hn12qy/!^9uw}>yѬ?|C v,L=覷#J=Լ`$k,?\iwp ܟjmi%?(I4Ҭ~, fm]G^ݱΣ8w-]maW4*x ?TyüZ}N0n hVYІ~2νv9YXk4A;KG.RyV_j ԈD.%~yY^$Nk$8$"ndҳ?`ߪېO>FJUJ*S˜#iHY\/(t'"$"bmg'B)lc*c_{nz]-1o8E܋2XyDʖϦ~muw- ~,Al`b5)PJ0=3q 4)u[ƾ7;t^Wɑ}[v6wʕҒMȃMuKMX C Ccgd9L6'}ċ~$]tÏ 1q\v0k25q▤|FB.y}n$8ij/vfzHե5KȗLgK jXR7Dt +'J/]9ЖαJ.}3_3~kpGh2fB++G: lw5zEMLH]wyH#b8c!.:rbq8-:uijHWB @/|呎L>[̒}~ڼiMD)2dYni-`Et GA}W5X^rq~'1!Ul|4$>$Wkkx7=hE9(!/:_C뵿bٙ@_žrZc%g("eQ *~UP%TժƪzQ4&[Ge(묗4vÅ)݌8"t;ڬVtA23F~!E-ױtg ֟/fsO ;#4m@mce=T>sL$ +ۼi"]GJXMׇ?&Ch[6ʘ^lUHlZM?Wκe8sJq)@FJ/KMXY + +4K zGpݺ;EeyČb&coSRca{u}M]u1^ +.7s|CJIO∃ ]kQD5ZVx.Q$E\]0-菉,#hO8yni_Hc9{ ]`yU^Y=˻[}yv4:o#(oJK=:||e(!fQxJ˚!_oѾ>^M';[}.v,'氷JD෌VXdAoa]:+32!J5QXaizÇk#0pf;k +:PVNpB~R@2!@n,Z!Ѡ T5g &QK jBCDa-@M4KjlwsmX;PRYʝc wWya)P^} p{S9j4N:_b\Rc]}S0BLQrkyj'Z]TUc͙J{B4 }77jx,G:֮XrDw-L"Iԓ>5\ B B"S|*<3s=ً3K1z`͟8<4)"ݤGJ3-oJbk7.G`29ZHf[hEbx +PLO9E_ܳa0i +săOpH_mA,SgOa^wmP: `-^Åt-=>W9\>~6ҫr:Iw% pWU0e v +TE$)nN#j#P,F*Hgs?=SuX) +_ i-: *xT{ĕz!m.ӂ )& +ugx>=1($~qi'>`7 XttXJ +#{Xonw> ZSB#ii ySفOwJW9P?;n(уߗ6}kkA)ez9vP[e/6Ḋ[V g~8(O?6(nMWU)?* +ٓQ0C.b+T@yA\m/?N|}(,v#'+Nk'*thlm/"bvae+*9;?]%\V kQ;s N\Qbp;JHubp5ԶPlpcʜ)ΎLN@T5A<.;aBu;Er[Se[d'aGV. ~JζTI ٛ ^՝H COsQ& ubB$͎J{9 q~e$PV>bƥ?;S**6q C ]q"bځGv/I, qe1*Tg gU13heQ^JKsU-}#/Oo\&w&A\NF)_+*[w Fh𼔫i*rcXP,HmMWC#@l# ea<La!`D!̋P ss t'#6\&=-Z&Qftޔfv(JwrF"%@\.1\`Ϳp +l +JX@ύn⧻1s|6_z8H,}[E| ǢDG:.?mslAM_9WoԬgi#R3nrDcH+F=~h<K{ծ$czn탼9Kou> )bOf%p0w4nXjpEEtVp>t6qR.~@O{*dΜOV&ŐuGLVޥB@wa\؉FLbՔޣ^VJtRbgPkPtV_[m +:~+w>7%Mp$jc>1!eE q`T/rh=T%ofǢ_ݶfUh2Rf<~h!T (أr1W)p o^ #;3@S3\]tk| /yRuKa@w +1"zJ"BP̗buWa2Oiv ~? ۘ M͟:<6ܷCbi1֖\,tFB/ZU1qƑI"~ʎiĀrtqFVe4c4\  R$rFy"hstmS^q_ּ@(~?ԋq +_DoRQ9{/㝞L>,ڦtn#890zŊs)Y3VAq X5m} N +a dnuh vGNy,JrȬy磙ή\GliЖ:S6/vqFVa!A+5䡶hoCߴ\EG)5naZ)Kgإ?DWC3 Y酩3A\9~_3Q*]F!PoM W+>O=RWo'0߲y-p!P:u]mw4[k9JC6A_c!LQ!ȢS?Qm)q y(? +jgἳBwY ;:􀙾,^ՉpĆ@3kao>dQpJB&+T[_ҕt +L$1U<;'0@<^fhb>7yxi#\fCG-:АDi:UX60%TC@ôG_ fg!~$$T+u՛ +W}N{pWn=u3_IӅ'(GCtGndi=4`!Zܔt(g]h^  endstream endobj -894 0 obj << +880 0 obj << /Type /FontDescriptor /FontName /THAVHJ+NimbusMonL-Regu /Flags 4 @@ -3941,67 +3996,63 @@ /StemV 41 /XHeight 426 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/a/ampersand/asterisk/b/backslash/bar/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/e/equal/exclam/f/g/greater/h/hyphen/i/j/k/l/less/m/n/numbersign/o/one/p/parenleft/parenright/period/plus/quotedbl/quoteright/r/s/semicolon/slash/t/three/two/u/underscore/v/w/x/y/z/zero) -/FontFile 893 0 R +/FontFile 879 0 R >> endobj -895 0 obj << +881 0 obj << /Length1 1630 -/Length2 11308 +/Length2 11346 /Length3 0 -/Length 12154 +/Length 12185 /Filter /FlateDecode >> stream -xڭveT\ۖupw=w n$ A>}x_猳k.kqh)4Y%,!@Y++'{ -EĪvS5o/2-3q6s-@ SPP qrY۸5tYek ț @CocGM jX@ANE t:jnoX@@ # - c8X*ͅK`pqZ܀@ǿ # \z -,n%f3mFqqup9ޢI#OW3׿b`m%hPW3 W,s 6zF ; 72`8͜-@77:z3GGސwg W ؊ -[lk2_"`prnOwƷ$,!`/% -]?SNO?'k_<;bf6do 9k܀=8F]?]ޚ"`& +'? Y'R ja2o% riw[ߜ88 ӲY9%? 忧&ɳJ(~`nؿwM#at!GR arqy~MĿi8V6suy>rqpp|27 _j`6li psv~V?= @^Xڦf I s,*tFl -V>UՏi;v|U`w%H{ٍKNt}.f6` 8t5۸/qi~;[|kǬ]Sp|Bxx@\. sv;,]TS6vO$tElOBչCR(Ϡ\u{mk>lLE~b_Yxm7is}Hmq/{e2eψb0~)=g<[D}!ܑ.K C@6|i0ڦ@qh8d3ZeN{O _FF`Ov:& - SI<m,3ѨtSUHA`+t`ve> He[F,KuS2SyLuRǴ @m]l / -54 m!$]^b{iuwz[O㰞%aW5$nqX ҥbUNX -Dÿxfwnu/np&)~o>|7 EhɺDj+jH%֩ڀӆorڤ]9ZA<8k.b2Иu rjIv}nʿAt2 h}ӄ Sۑ]B,Ue 'kvFt]/!JmY9>D1ӷL7t:x4%s RK®EpPwu0YN~ Y*}%,ZȽ3 ת,0p|YR :-=>nj?g>U{ i]Sxi]4.-֮hmO8s^F+ng8lr]9˱߄*6*/,2~EH -(AϿȼir|A_jT>¨- ȸ[7hwK@| -1fhΊxïZ8&Ԓ@#j^/Jpgn;~qsᛱg&89;2ĐX1EG= -.EnHb^o-SY6٦p*HpLIMNKP yEk5UntYhK:aG<7pfp*-]˨=Ls?uT?{]ez٥K*ty%]q*r$\W%i%@W5|q(o[lg}LSEnkmU׻c@KAO厦["38MܛjH @qͮZ1 /A%J{^pfyG;JkD!sFW-W.05gMY138+T% - 2m0B\WJ (l04x'#ȯ -kJ2 3u~؋>8*$+l=7,wp9i0}Q' ]m1M8Tn*L)&{Es.O8}IUi}! \*0VY{1~lK)v:R9J# CLk>YH' /JtU_ݑ`~ֵAVCI6 0Qo@+iYJb 1n}/Vcgf hȭQM/.zےwqVJ!=-V}D#snJRKR4%xz2-Zx,I2.׺$4T=r>Uģ Z~u{+G &3]Bܫ .y&LX.$=ܰ];5骰!5aԊD +Ix*G.h7q Wz_Kp4TX\+kU<[5Ijc8uB) kX4zaG S!uChn_@:OA/L^K9yp#P ݠoF-+};x4BvFO߬ K27 *(:C6`us3BŠ/TD[y<҅2^iG #YlWR6M1tH䆽Vǰ"3ϙNܤ3Mk3r_w*RF4M" _n>wNVH - -+<21"~žvr*>̖F}wr_o6W0ҩ8;1IHTr}DՃ ;Q\;K~OՍ`b!cLRMW!QG]m;K;kc}C2.ae3?e)0xxh`:9KZ2S D6G'XCf0fIP}()&TׄU9M̾oP)@J߯Yǚl>ޙҁoTܻ{BX.6@K:n#8rXh̊.SܲsdNԛItiP,g(>HyX iHfWt -XM{Sńi3y_o _ԉά4,[Q~S'r*!ʒF:Q#5J}Q -bpb 5y?~ o:vʎL]YnCOåj@ލn [T- ,`J|ۛo Xhzhd@іLa -P< - yx##.ȥyNx -W$p&i 46HiiER3 H)3.Hnƞ86UOEbAƟp[zd$5 Z&3ኖ]tx]$uΕ~XRbU4X,#YR#tDM'̗VZQ?a9r|5U9CN]=mpMJgI!;:brtw3Η\h'FɾDxK<2`h5q%HׁlxXҕRJ+QH-V[ Lp3 ~McVT>[)zıSXɎhO;gKͦ{N.* 玒yt'{4{Qșh?, JE1ډf*Sg;~8 qVP,OC}-un[g(/^ʧ[#CajMwфjN50ml/9˽c)zڙL`*L2;z;+gEOތ#up+/@ Gf.,~N>ʾ@sgd>UVʶӌ3$8 T1K9A]7%`WQWSLzP#| -..)Lu[{Y$7.(&ƭRe.noT~ -3^DHturASʶz&`>zP2=t<a5KKpC]B_Kn]hj|lh[ -_FycsކJ>Ơb(.5)VqPnb2crwJȓ(la -75\Ny8âpHLA'T$~^&-; iV~-1ϠWF Ojr C-^']r!2 .z.I縕a~5$U MAR8̍eJ00}aq+ىg~ж(O_{S85?4O̔eـ!R&SW=rbb=G'Y;KnߨjAIdjpEqKe:i:gQ&3EHAiwIj^݉)p(cj|SL2wQ$%lb{|e]R WRޓaV^oТCNÓNȂ -dӺeVG'gY# Ɂ>WN{ݑܝ|4Hp yB<7MN2.73`a} -[15L n/)H-h#,؍7;LN$C ~N0Gԋȑ䡵_Ag{آ.5V>ZbT}=鵱2C"|/9b 31 T"5rS|z^ŇBؾ,Y}}d4ԧLU}ƼXH~(5QDAfqPA˷Wm]oXOcޭfSngae]C'<Y9+d5$(~ Rk,N&lN5)Ogk%ۦF; `eB֘_Ŵqϖv7T޺v1\M䥫Y#֚!{jSzjSx0b'A ^pb d|Z6ƍ7|0B֬UBJ"G} (GM+l%fqO:{}EBŮb0R7 DZACz Jd_,:dUEl)Qu\'7IK1=1qPg@_Oy:nxa%ٖ_?QXmNjYEܺM = th]%z6s,B)VaH1x%ݰ,bsFYϨmI?8=zu[ԋ8U| -v͆tf.dlg [^c`>WCiqN^"v4_,5spA抁]h@^?z濢ß0HA8FǍq'h!5W;$ueͅS~k?){qIG -^"J].TI%:mη_V뎂ZEݖ2tsFM$K-T<`UQ?H%  @;ԾM4)h#UQ)D5ԇpW/f}Z6,ڪu)Y"<\Lm@|gdG"<׻/0c1QE0:ge$kJiשΩnPo9-UяʣU,f_*ʘ/D7yM'znfP< 9@ds)<#Typtz:*XMqaA6wT]PA -BGNmTx3":8.thB/ ୮+#7TvZF̢o<3Y3)8 q4k#4v9+{6cEޟ9I\ O3ŦF#ũ%>Ex'߾'MMhwlxo>Я?48rQ!F[_ߎ4>G.s4 e75 ->2gU㫯1zQˏIљޗ~4 ?Jj3 5#eITywD/_6[dh V~WzlB&Fu5D2a>"1,EdWv*NJ-Ue@c릸KjF&KL33=ƩlӖi*c6];M=0YYi&_R -Šʋ~.]#b/ĎEOzJ6RESc J}nėd?2mc2 :qX߸0ؿ/N[wp.Au{ڸ +! zNZ.`Jf_9!G'JlP , ftp.8c˖rx4O٭E%QvuT Z{[up!mX<{PGNlneS:E_ϡf[}׀ɹ?TjΡZ횚P5{ ~DzxAiVh%;[r˞Dw'Y ѿ~#]]uh ӝ-;_^7F[Pt_"'aRXpFAYھRJޕ+ςͲFy*bUlR[r4{(VGxENg*,DTٹ+OOY_M?^nofqIZѠ8r@8XkѨTM_k XE}.uLAnM˵m-OwMR̯a+Hڷ9-~Gv_;d&펰k2sC$)-znkWͶHUR&YCEl^ГVx5Օva ήOcIJvu׋ʜ4g-ne JRQ:^5ʯr\? ʮ-Znc"^LrD@>%xEsJ@%V_4,Wvopx`* Ҟ"[Մj)ºc|1 [pfyCcѼ[g ,[kJqk%} L {|/gf*AdZAL~yyk2#@ 4]C@ xDS%xC'ovuD MZ%n] 1^U#.x'7JZ08l|j̒,bDQUD/%w^IYDj sXOdϐL~'A!)~NWv+U -y6i ?lUuOo|ɴd0/J '3ut4[뫒?Hv(YyaX4aMz HJ i7: |f 0;4 󏅼Ee̿GހzaVW2Go6ӌ3NJa.Y)hYY4 v{i%sHND H@ w1 i=I=uE{IJSd4H&W:GIHz$33Z9LT)T/ۭe:9vm -iʕ6xwBO ĢEI=EMw4zk5>H4GВe ofՃKՑj n_î? cwHQ@Cgfݢw\cO"աwW -K!%A;d\^$wǟ>w6@T$n|s:cJd )`!0_2@8*@Mj=T3$Q[k 6 UXk'xzpK.-rz6Qpo@1"lK*Oʚ>br PhIv@ -I?&,A=j,;K -G\> /&.VZq63j6IYcj7kSbU]O5`5 -Ϩ!(.~_џ,]1wԉ:d>/LT`RV{9o*H2Yt4I$BƯq{qZO*AV{ ;~~6˹6.a7mtU'Z&iqv۳YhQ}gJ[cw;O1l 7ZEEC'V82Wd-W`"-)U_,ecݰ'/7MD ^i7s]Ih--g/̸4w + IDKDf mVɹU,<ga"M[ / q1!F?CvI‡xO_?wu5I?5?=FsZ8LeTQv,azWE4RtzB벂WyT."G5Hj+57eik$^BZS=Lv"?Gsfa2*Ɏkq$0yP5WܑmMBY03?.{n}cLRp[Fu|W2Mx߯/HUQ6P°oD,hK|?r]Jl3"ʘ>Kv5PJaQL߂SǷr_F9UsϨ]6$? ~sm4~\'Eq|sᝇi&ugqdrE@)z\B]w=rJrv{/>0 [A -[is*`W4/'=zBRPt >Ϙ6_voڇ?Wa=vz >d@r!6qt|4BomۨkVF-4{P^2ڶ:sIbUi|ZH@<|1f'4pdCc_f[(\1Uz6ZjɍݴfN|ƕQvXoQSi3u,_eH8K+zn]%C ͽdǥ -C#Z#D*v;S)RqEաdwC쮄PW1~*+n"@΂FQڋdaM#c:'q >ƹQ2&#̝|zQ_= +xڭveT\5wkqww.A[KnAwwwK >Ν;~kf~tԮ%γRME $a`e\X>T7rBҦ @d89(@ /_.3"o`+ۃ;yj@5` T>ʫпW9\Ljno W`Wko\S491@.`W׷g`byv0s798yؿaodjWsUMZuBM!vG7O GsZ{yC!`W +`vu3zF 7Wտ*`L],@o4oM_}KNNv^G;5! ;KVη搷V`E?1wkgފ0ptX,QT!o)3YD?DywF%߾N-fgbjdo#@ =cgqva`;&u@(? EMNV`Obn 4{v- c} bg7Lln<@^\ϦQSJE鿻aT{it-'sp7Y賳shd- ۲/My{A O9꒣PMzV+AЄ~_PSifQA`㷀mJ0)?m^N/ +#=vtRA~ X|LlFg:>W J[pz;JȦ:\ qi~;7OlZxzFt|n`txh}8d))e2;ǎzf,YrkDPD0_A !0cV= gR9ZH$0cު⚮89?BDufU*Gu&Bb:,r\`*# Pb >GXf¸? 57!D0i?(ow,sX[QQ3 xs 43cBĭ8*vDŽsB6>N,7̩AΑ.m_µċ5l OLGMO$q#-fsRSϠ&wr̲sGגJ(8BqP6(֗g|Mɖ܏?\o鈴P7g(foyv̦xЧXYSZ씶 Ppx}AEb JMۇ~ @飯0b_8EfϔMļPݘX^.*Xv xRRk: +e'B /7xXjC)W_OꪹLJɸIҕ"H”'+AGrʧkv OfĦډ73`B=d-SrW +Eo.C>m0`TX:kz"0 W8O\.2w-jlH4]ma#rg#?MkDY`$vL=lŨ*d)瑮 ޛ_Wt!IBxc&t`CXfys`CPQ b5E$#QWs?Ƀ}2uZm}0BRF{9Z(LȌ5ĩld`?t_Tɴ; T*Cl +Qi{} 7sxbg.f%WOni.d IA:W qƾO#P[=F9/r׭_);9U;fWl`v}L;b0j\l==oB]-op:Ƽ{#j p>%oVѽ):7~f +66%sGhA' ˲)AJ"R(*#Dpz̅tpܷoLOhzZ9sOFMTrߧ17$ʍ>.K^J%4mڴT{=C%P}heٿh*>祏OKȆ#&rz@wJuhL#(FpaeGB9'&+XW%yS[lIPge՟%zLKrBN9 0JR4I6+']%h8+qC=TdL#=p> =|X\C*a/B1~-\ʒ\NՕtĵ>j~adΫawm *+Ic`I>?w\ryU F#sϯEvӊeejd{d u8tpaZ'T;}b+"EV敜_ ]D*3Ia?04>m6f +۵$5;Їgw Jq'3e;yrTȧՒ{^{s[ۈ*$uneJ} j}^=sgъӬ;%*L/z xG3E3I;xKҼdpAxVRtCs<*1ǵ?շSUߧY)U;Fr#0u +q~hl<fbfQ3aMHfky/^>}3U ^ ]W_yo6JpGg Ƌz`Pa V+dS༰D#\ ?VDɡy=7hm0GciKh|EC + F!D#Iܼ&F1*M~Km~uOmcq⊔*cܝ{-DX> 9@*'e[޸%=IVٝf-K#t͔ñ֑Lp@̖w#14L^.Zȍkk^6wg9W!FPWIt!m 0q +3$oJʈîޣ>U/'d +?rqd8ǹ#DbT0~1tԪQng.^ :}fJՃ]톤WS('h7hOlQ&b|*ch.T3qfP1s/B~jBq2b moe,ďPCL0ZE"&EG#t;RtGD,w__[zW J{2ң4C1A?cZ6]4菘s1H^V,yi@H c.dm.DւHauXL=Ը4ٍT`&T3ay(o]@p_>>TuWZ,܄pi YXkte\ u) 6&3=k!h:2/#FGg0οAAͳvnɸWCOm?ryΜXǒhUDMunsr./PsӺOE~ܣ$*[d52(*GqNh1j?y]+2iq"VvK91;fbjZW2fΊ` +ȱZTcNo}ċP-e? ή(?$i9Yk~)y-gf۪(Zjb߶qyWYI-7\(;hˤcu ˟*>ߒ _B8H77MmGA؇ ຠlpumKu Rrfvn?4(:]snarf}$['՗ /k#fX,8E:U7pac3 ` +qo'ms2ůYB]A8tj3skcF0NFu{Ε`r%4 6`(l&@sۋmD +#ɝ%V# yC='e%'/W|ylH&gχ k?mJE7c=XY_c~YHΆ_&YFMУPQ #!{Q=>tL{ 'A4ςN wY'8N`O3Ƴ Aʡ+ +&OJ/B i5Αˤ4>j~E䰩lE7.:7ܪBď0d5Sᦚ#غ\%xf 8Ҡv,Q1:d+6Ov:*]sȕ_Sd&M޵ǒ7YiZQ$ %,~OkGTӝI'3z 0U\",a;tʉI,`}%5r#K/8;u:Is>YȁC+N~Av73D8! OP 26$ tU*_F%(\cg'{رoǘؤ<}hwC]P==!GkG_Eڗ+hD"4qXUg}>{~-֤o+Mu7>VlIG]ڛ "z1oWDg[nCq=@*X3 +}hV*Ra#P-0<>Ae#M6՗o%NFssxٸVנh~ĐFc }6`>luCks#R7rYJ{>H1Bׅ+Â!lskLч/.q C^q _ZG;hIy.z87Y^.]z*"gX^dSou1k0XX]SyW"fҽ@[?x 9.TEo-^Lbw +<ˣBy՗]j^/zK8҃R ˇ) k=rCNJ3Zp(;R4YBU< /ձ{u]xhO#>ҾgP]C?E#vG@Տ=J_o"d*K1YriF 6p+Zf~gҎbk@5dAY>nA̔@dVPrd.5Y]|/>TǕsJ胓eLHN :O~&w:/yÑaj g8s]'T.δ16'#"< ꑃ%Q#j՚ux9OzEd5cP{։얞;f"NʷjA᩸IR'Huu{8{ߗ1~WHJ0MjII0_-Pv13ssNS"1~}H(OnUgj#uXnri lW L:{\h6Pੌi?*4lczJD]f: W??쎧l_FLLB?纝yW:v4`^=`ꛣ|א2Nu"3_ db(.M:2CϏ*)lŌLmЃu' "@D*A|X+c{)˨> RJZGI ӗEEo CYm2eґ扶k7)@нqbͽ.m +t;X':ZJ`zRk-˔^J\Qfnuifz*(^$Y9WrWf쭍 |r- +vp_~no_mȸ i v6`;!TrPYX#aݴ|Np>Ļ\_'Bm/V?H +JDצF2y{%8Bn3D>Ur/δ,?nj +[Q3{F:vFE퀏^P8$vV1E>6)>[|~8/CStD4 +M{eHdϩZ>bv&i/0<X Ub'ˍ'>xߚn³1#X=^ e྾<QjX7KXWiI|E{d#f V2\-'z+\+cGjߋ>=f +k#V䨈(]9T D_V,6׆wz9R+EB6q͝k<ՋBO 'tɛJ@)x)v+H}`{Yps7m)m;VMcq\$|mӼ'@Y(pAUR9P_i J~^@z7 5^a=u 4 ]%WaoQz'_ D³x۽H1 +%Th'/BQ),|/ط 1򘧯[A*]ǒ|zq@dGmdCԓu{_1d^(}~Uvij|#:ϑ7MUV qgrdkD {IMzKv2,PFDb*17^MZȧ̙\V~[&-O"؛X;y_ .W4A|oUnqU|`KQ^wETR' SLL(UH`120&>՚0XԿ@$ ÍƙK&6JP}y//⪹v.+%'"gV_)v&uݪ+$փt1:4n;]Ÿ㾶=+TofG^Erpp‡aa#7ҔI.TѱʊM5)/a܈ʎc9;Cߍu٨ 9'D_A6JEiLݹ''sYoAϴ I)Q"]MP4 =,oNۛ*)xO""گh)"|X<*3[[y>ѿiqcwB F4'_`͂+O@[B{CQE$E?%<_QȾsQ5[NGTTI]Dr~((kF䃗`=Hd"#VG W"֬5UD7963ܲάm# k@9 XJ(Q8)6maеcwPz +$p~˶d$ e],*d&ǘlY`X2ܱv5f2kTWwR&&j<\UiL*}ݍ ~쏼()$-F<E2痤Z3⠑ut0 +3:^(~~i? 5fawH&I8Fѩ"BnA-s}" +y3i_Z1Ml%-u {̢2SࡡRүHv#= ǽzhJR[lِS5ܿU$!N^<&)Fs]#* +_okGǖ 嚿9m?您9yɧN{~ 琸%vw$ja.W cA4ap ;[aQAg :~5{8b1Xvt/αUۄ +hf{;} AT>HGO5">q&C1PAiELė%yL]EцN|_e%n7ԈNfk */?W*ZdvAjƿbp(&෭d-5/jYA o`PFe<^{F}>Blf&O_c*q3) +UPU˼U)jϜhH>?3YKۍZa]J.+fR[OΜc\fxBwP2_ϲ/"T]Vn8!n汬8䊴;\n;4>#)s$-XFǔA.FhL)zeu{LlYw𯶵=\ s6MM8{ NALD D&(#ax>eaR,xS|R!7klNTJ \k) UF7/JنHeyD&WDk8^Lʈ[j^յvlY+&y2'I&S|$F+Ka Lq\#HuE xi|9.t +蝘/KYN,:rMAzۉLXy N]Yu:yAE|3(4D +2i)*VQ2kHrWIjܙ{2V^%r]HE: +^zqwv)c푄Z3_@ +@rѾA^$Q +엫ח쎰|VI~~ᗝWc&ˤ38YmӋlϙ }/Ӂ!vKӸъPlS6kQMPl_4 {6Va [*U|1yz۲n.() JD -cłt턟G]QB y 3KUR +˚( j1ZyejT48޷.urφ-w/>=A +kf kۖK7F=?UUⁿq q/=\Q+-/t7?Z|BJ=m\FZ!`(0NRPK(,IRL|)uY۠6!7y! -#[f.1R!QωNOʈ*{y(T? ܣ6yt&rvf3]_^O_k_;sehXi*R=+3VpL21mZ<25oźHN%a"z' xN!)wn;eL͢C\Rxyɂ\y9gGkYijy91F 9bMߵk? ڰCUVѓ߇_{jO5@d2(]@zMi|ðKڝ&۷8X=TP){PnHt'o48xT|lNlي9x]+4Tz J揎J;Z?JP\)!;/_U Aolo7lnږHP$]{/,TIT`9xæD/dA #lx:&f=%,LYy%íOJ@ URa}KgHGn^fP,ѝN/OtJѯZk ?Ӡ|%C-D` ޾+vi=F$ ;Mŀu0cwqQ(9^Jl5v@.'T\U,~1AF*!cXo'm"bGj:'Ȉ$4ƦӨ!pyg5.!)qpm )Lݪk}4gOCr܁p'LlF}/U=n6) endstream endobj -896 0 obj << +882 0 obj << /Type /FontDescriptor -/FontName /QWAKOH+NimbusMonL-ReguObli +/FontName /PYTCNQ+NimbusMonL-ReguObli /Flags 4 /FontBBox [-61 -237 774 811] /Ascent 625 @@ -4010,77 +4061,81 @@ /ItalicAngle -12 /StemV 43 /XHeight 426 -/CharSet (/B/C/E/F/G/I/L/M/N/O/P/R/S/T/U/V/W/a/b/c/comma/d/e/exclam/f/g/greater/h/i/k/l/less/m/n/o/p/parenleft/parenright/period/r/s/slash/t/u/v/w/x/y/z) -/FontFile 895 0 R +/CharSet (/B/C/E/F/G/I/L/M/N/O/P/R/S/T/U/V/W/a/b/c/comma/d/e/exclam/f/g/greater/h/hyphen/i/k/l/less/m/n/o/p/parenleft/parenright/period/r/s/slash/t/u/v/w/x/y/z) +/FontFile 881 0 R >> endobj -897 0 obj << +883 0 obj << /Length1 1626 -/Length2 15270 +/Length2 15248 /Length3 0 -/Length 16112 +/Length 16094 /Filter /FlateDecode >> stream -xڭct]%N*cIŶضmۮضm;o>=ߟڋsXA^(ngL 1rqR㒥4Ñ8 -lE u @h `a0sqqD=-̝TJԴt)`Nf?@k;{׎@ 0D4$Tr -bdma 0:vv&7d4t7m,,f{l5v1_ݿ;L7q::`g埒 tw'`bdom7`dak@3CGk0cӝUohoo/oY/ N@kS8f96cgVlMLQ33AZ{LprvSXf#[#r]_CX[%ch gZVꤜ D/-L LZ8[M,/ @_t*VoKտ3H* _lv&Oaa;w=3' _n&U?<0bv&I_. [5@;n}Θ'2=+ù;odJT{|$ľQпƮ/=|6icHx˚7x]CJ_M8Q 1B=fIvBIxJQI`?k?o{$_㴆8.& ?)GG{ B RD;~RcFBw#i] g^ep0?ޕz|Dapa>cRRI"ٹ$y d$eջQ*FE[d МIs) Q" -mH9{Ls$&*~1BtА>aU?Y{_)iOC,}2(֣aR9{@Q56#X8 I}!Y=F Lꭷ*P_׏vܬX P7DM还sS+G/Hpʕ9_m@9kj)Au'ք^Z0A7+b!S j;q8-ɓ@)rRay;i@3vu9)AW #QI CUqz,V_RΡEIi5RN7K9%+Ax3 -x yez5 < yjfOyJZNظqxa2 2w> 4&dq#J"am+')kذo^D8' ϒҧˉ^a- R%Ti7o~;ii;`al5dǶxAZ1r*ZPmep{[p84U=uLmk: -\L= .Xf>sTOV`)y}}~zפ+7)y7c6Qb7(i I"9ƀIRdždиz-' kZah[_z❧YG "$}J!-A\rF܈$˄?&ϤV?mBJw[WH:էTaINxzA\! }9#~ RƔur֪n&~OXM:!j~D=XI΄:J;J2e*ʟ.DCA;g0 ?q-)oBo۾ {ՙLyށF՞;礂 v5T!J?j,;藢嵩塉#{'Q'ўd$zJTD}|,2]P>oK&U[0LҤ&2ϑ3xRwKz3E Vӂ>!x.ad˕K>p9n?rej^NsФƬRvEbKkKSUY cᾝ$bhMi'B4KIvQΌxWw̜xN}ܾ x< 6xx (nıD0 IY2u7hcpu"s"UӤ|ws [#޿'âheB Q@LE,=vx~~lMn2ȵOn~%GiBz40hBurh=U5'Hr(ʘSb2DA_ \խ+IQ񧐠RU1\^~j tVE`K Y*jO; -,7 t*9ɱ7>tԣ!DOC2P) ~m؏%k5e^X#r~qtkFv0\JE d'GmP91""}zg@D.hIf7=D*}wya,Bs:I" PnH4usҒ.x3m7Nţ\h30kgfFtCǬ |e2|#ʽe`7Qf_$ZRclKC=6$2f˵9V&̓S.>ov᷻/gLpgq ꍸNTW5 dq~r܇5[l~̔y"% (z"s -އ]̘CY)6c䙑3wK!R,nTO1JTn dr2SP ]jD9c֯H-pi,"{!ni!8]e֗)ہ}.7bxZ5q$Q)=d&莲l1Re?<\pBrQڴܐH˦ ZG!s=^R߈p=jZm6=xIAKtAQd!oǺ%fa2iu5wf;@--~ȗv4"DJ`ht(}ZvM+X!5SS27N\g_Q8VB'Yz~|1 c'-}/ zqd3bK9a;c I!|`Q9K/僕>RCQ%(t>J$k}k(5*-qW}:2($3/jwyKWZ)*ȭRR@_%E?}&TxLBE_s T|%](Pw\D.~6t3J %K^~JRy+V(/)g]t/p+䞈v -nDrB?9 2t%!Okyyɨ2/6&n 6]nV {OV1C+: M#B3ɿkxu6Xxc7._H"P<]=K(>bfÇ3S>ȅh#jcQYy16@X&X[7crf^:T^IQcb0+a%;aG]q؊o(Їs܁d'#HID {4( 3x -yvTChrFEO}m6j$k@U:d$;p+Pw TiJ"ہf藉qǗRI]{\g$D8G8_@cj<$?6K+|7|Xd\7i<4qi\b1%J:+cWꭟIԆ`y^6w;x3@!c_Q5tK_1c#uuִͤjT3_/;OG:x~\^I/ZpL(PA_>rv(s^|S~g~Ի0ƌCZs%@KY]`bSeAKWbSG"v׍Gĭ=VlTQDz#o^oh QY;ȹ17+ŷjW@Aг@+D`w5ZRD Jt?ÙtVmt!ڈ9uXOfVLGiQį B9Nd`㼗^cZcF۪̈A1x<Ӳm~nre2x jU ͎0n -c! -)DыncsߟM HνI)I򥹿(ƆH=&e}t#uM_<Wr UorY1" 1JL}/w쑄/[˒o06#2%g2qUf f8?i\L3$hӻ_' fdA9 J%:.{2v69D${wOI)~4Zzۀo߲iOIP.A -%OSHѰ#)ԑ,F*HJi5FN͐\e3Lf[G6O&UэgbV4V.`(0l=(?T:߃!k嶻 2(̮/w1X$NeL3z䚌^h ؅M._rȳ7mj Nuh -kJ?kXn-73h3`}b{ھVoG]s;wsv ?}JyDZuyo'(:o]A8IeY߼qkI| 6ԅOIxkϬuji!͛'Bŀfbkd>' ۃϞQLN[B]E|pape#J~rz32ʋ*l$Y-HoJSȠ>>x0~V(J* -՘U<SNł?}P1/PnՈUA m;ecJgכiF {v-ht !wueU:%hv W66b!eqŠsU(COŮpeۻ`7TЌ 9D`5Yt๿˒P 'ioqG-Bk tjϬ~魎~+b ?}UE՞Uk3-'+>sPؐ -=o[#}(  WдsfM`IA.ҒZ~] 㯬!FW>kk N5(?dxﯲReb^%<7G )G2)&)wZog]-m1 2lDï"l9~2T0ġ*yr?޳ 4 -ݕBxfN90@{QS =2b n( bq꼄Ͻ"{{QzӨ7h?2JVCȱ}Z'ֿOW,IyZP>(YEOzfmEo:B<u6X,#VD-|h -?{` -$g譯h-BbԎ3d {LoF0{Ȁ gadQ2ӎv@d-_i:OW8> YK`˪NXݠ !l-ԣp:{gụYՌO}3.r奔M\|H,Rȏ42 T7B55=lE/Յ|x|KgwdUnJG82Xrf;ADu{oVdTP/Fml'|$Af8>,:W$"tN ZEY>nTuYf]O0;D0Pe|JkkkpdI%Uq|md^֨ TG\eV74j݊>׳(Nh:;[!KJ0=Q*O-#=&D̯yL퉶_`чyb4.3Q)I-Փ6!O?KP\:o?SbR I-E %YrXHP<#} - -:8 +څALSb4{YL$S |?hNd*^Or b`Ѳ4LWHZ5^\B,ν75|iyƧ ]p b~V2Vr6D>76\P݊2 "}oFWRƝ߳$yx~H_P&NA| U)PͣbH["솚= -l;$y9qF7<0&D -a"A!燘ۗ:A˨zs#EZp9x`5PIy|^vDlJyAJVq29oE)@=֘dh!7aw;Gǭm0[˼df/z#þ:lkA5y?;߇&B)q+fн=G4k.s*Ax]3{SAwfdkXrr&57L`-P(R}w醑E-qcky -8~Pf71@ϛcOdIg$x -U8y5@8uY3ZC's[r]U94vkzrqw5&^;ǟb07 UUtw)3&I=LDjM3ZNɧ$AXX4ݔ^Lf>U6)vI,?YORNW%4&Xt2Vˏe$*ɡ+w"R'^!B@R>yqA*ҕ90ޕBdbzi b)y@j1)qP?w3t%7 ⥱O8j>w ~}dػ3_VxǾ8:|"ѩ?a6y^KOij;ck{/ Es};R5BQ+ -Fd4mlUJIpCB BlxI1!cDImQB`ړ }~}c\V{W R |+w"YLyO/_̰V -z,Q.R -}?Ҿy\Q}8[BFW4w`Ѥ ̔q@+pBspZ(-`ra n@[{Bڼ1Jc^9Lc@$z&BSU~fo?)F*>mMrb sGPQ01;.l2Do߭ih  ćK3`b5MJ;0[\kD!7 %x(p Yi u}ILR7|= LzUuf ވPWٯ0QWe$T('ϱ<휸/0ۛb[/?seYqUt"{?f3N{N>wŰ dN 0WXVy+#wvL80;-\ֽ-g~Ƕ{( -:y) "?U[h -`]7Z NxbܭY6:gJ^ m2g~ 2+\ZE "xD{9OPGQs:au+xIg 4_ RY>[ _egVrc[{O 80züj8Ýd]0//y'Ʉ -)3`L:92-хJ? +u -N Ӆ+SO8'.cZbKUЫTH[I03\UIuǼgdixöIs>> ToqTq:͙CC=E~X'VgAdGEaڹֆwJbUQg1;/Z6Ne_\a&ssOiQ"y ;kb= |XnH1r䐩j 5zA蕆N̕N/uދ@~SS,匭=GDHt_KDo2fIo٦JK `@z Qh]硣6.G -'wvfWVKLIS# 7 +HN咅[.ovSa*HA"BtiKwBRA7G_6z2%=w] hQr;gʣglDD>J':!X - >EXB#"h_iXf-M3+y2 BO5I䫣]o٧U$-]QUVxXs|pEg\pxf Y^u$dPO]꽬giZ.-@ _ 8ѲTVi@CB;Xz0|!.n|u{wF=zE)ه1HB$I- :eR?ss6< 6R%Hn/-6"4L5,^$%Tּ'=N`4ZMbMSJ%X;De -|JQ6n-ꑬ -VP+ /z9eh3̀2YyPRyt\6ь6R[&l8[* kМu@wceDa*ӗ_!ptʱ22r5G7]iңpusQT]IC /1gWdѫ- #GBɘhrz>j ^\G!ÌD@z&qwJb.S.ANF<͊lM,SJ6ϳ׉˽Vk{h>28#;BӒ4D0H83ΚO*$FO%䠡F~z۷J -1wl,ObЫa8k -߉~ -) -.Ŵs,iujLg[K3! !zb}~ĆFR3\B !ip_u3It k~ gYqM3m9LlfS$r5Xu$+*6PFڣM:=:aa?u [8SþdXhugp]94etBBA(g9MI' oUI߭*~%ԭRY+Qsf%dk2[v# QK)+g U@i9=ts,dDg#d0lNѝgV,bt#-bOo?#x΢Xq {Hh ]zǐXr=P ',jf'VlӒk/<K6z T샩DGgPZGVa2*H$E>0^iC^‡+Uvs!~3 pZ߳F _gRP䎼d{r;9XgWIN*"{6~I]e[{'RR4N&;A]}73MMn`d Pzo9 `*{!*qʤ/X(ԌRQۅJjJz69 QbHkhIpC PkFJIąp֎X-v L[C}wټSw&}]+\ӏZKJ}oꍄ;rŕO'e~s_ ڨj$Sj*Ik4!MY-d℩.'2Nxt>TrRlbմPŐ.wp@SsNVc5W S0Zo`] [O>Ba2#W7(iE~V3By>}F{^`zLAT#d#_{7ͅy^l=ٷlnRɎ穫e?k^? lG&vꤘ%d1Ü2إL]u@}-p鱡Th )^R8Wjrw N1sMjz]sij^;=P/txS uW>FR^W1cvuASl22X$p*km!uh Rp&kr申`8!O:p &#s!o‚@4.2EAˏS_ >%bau_>nGN3O^ EJ% LGsK?F" gΔƬ7Clx}&5SLx Q8t6)#JhșHdI=t6τDׯVU |?E2NS{dUF~̠ڊqd+Z&ܦP* _JTX8oxCYaustDݦ`dC)^$ 8%LFkZ[ ˾ˊTZotכ)LohV!zP*5l]<:h*ڏZ6`^4Q29 ɷM -ZDrjV8o -e1KN18%{77zZ|WeBժrQ!o1)UdbY(`=2oUopkKdßCWPƊtvKurIq}5͒4Wރ*._nxQ '?X+%tpE( -6Y_=? S)d.\|Qp x TB8 }| b2mKR$!i CH/hbdf*'_TfMNUӟQ^ 7 t1HaCUNJYZde|/.$b;),)lg#W#oע.IRpmW=51ȑ SrԄ5Z,"RϹ܆ysd=3&3gj[#O' TP*jx8`kfm􄶯})Dx0ƥXLE@쿼Q ,8n*|jR: U ^5pK_Fax 5uOnp9۲?E㱲CgRi#_K=3vivf~7vdO(՚#"!;Ͳ삕akH_}lj4o癵1U2,jBT7M1Qm9kH܍E`b ' ia0|,B"1s8kE3~^Cr!U"Xe7 F}#Q!~'ƿ~JU +C[U 󳱮V^(8qwR6%UNcw^gF+GYQh?NH?d^M6K" UQBܷP{ZfQfm~꿟e_lhD&TʔŴ"MG2*}a^P>SA#=W?/ЂBK7i2y) LsĖh:/ZƜ+9Zlk]8o&XpJYMκʇQ0Nh8ZqHuDb7} .@@T )kեͼۼ}x)͡5ȀogI5+ -D{z5.}K8L#˰?]܃xR`qQ{vٲFfI',{D"oǜC}?:ܸi$(rPj!h@5qfLlSյ}&/A Xu=Tf=\9Dܺ% R -j:+.XSrڠ,-wL 6@9WD LԀb@5N$ F/7 o Ϛ2j)T?3@9>a44eBxUI_ߎ;ы s3z$O3Ȼэg:ˈ -?Jr> zԏ%Nϩj%봊 u?yU%'\ 8Lһpt=UolxE.soQ-tuA.[չ?轣>(sQM-OME&z6]),!U)m$/icqzrXqǪ<$#g\#Z\RZDr wqP]qf,łh0 gw| G|2{`Tyd14gzFr}M"؉*%4Iԣ/KzMaz˲GU pط̤Gk*<Ą5|Jƺ>:_]CTPoqӕXT +dty6vZDW/ct!+P?͜UFoKI*yH3J %|ҒhSHPW-5?dr.RbmO1rӅ:#Af[B7^|t=^5%Bh^l֡J~F'̀iǩx[ߣ>Hg${K0s]p,?D Cvm.,dcIX!Ri2OקMWРEPm z4HsOp 'l9Iqs}ۦфFMIP_=[zy8_F11LzŻG.fZ v7v[]984\q0xPܬ굈N_[szfk!ێ^g .l&pHd.͢#MZې’32b]fSn3W+փۘpss5ۉnPOp^p# aO#w"D2s{k8&v$^p_u=+# w#zo I4O3lZQxP~mntjpdG(C c%H^̵^n0SK/HbV; ]J I]Vn@mr 2JLKWjwUUMԙ=493@\%FJ1r2Tx0BuK;}rm}$XBѡ w,<;g3s~tվ^k]^wUS)(3~73قYXr6FN %;9;^FYCΉHI)4[ي|u @h `c"RD-U%uZzzc0r͇'@ ڂ?B_;*9`ja +hJIh$T@[5@ ca ivv&b0n@Wc?*=xXfN& ͇݇# 2v>*'OnŇ`gaibgOI}Ђ -lA0O.# dom#ſ`8,lhfhb >|;Y'_v_, )"+GNcGn3 [DfEo蜁j?3C `4Ed߱G-Fw3ǒ1| Edq1vs6:)GKۚ}oHh`66Z_rU[-_t*Vo_Ee_ +CVq?K3_ ۹<Yxw/!Yh +_tK1[c;Flhk1iK]]ƈKv) QOC?U +|}RBy ^25L񽵺-ؿ;NyalPs3Q8_قbQ;ؙPT+z%jgw?%wŦG6N@o?CtG=0:<4} ӻOH@oxBv3p7~yr涇Pu*kؖ&kZAO_X]uwm#!lsW$T}4W+<0H QFV +s=Cfd^QBjփz H +]"3.ƙ8]Wk)"hv==Ls_A3]+( +I)о?I'ûNs9b4) lFTHݗl>ƪ5K7D)%ԃ$ +ƍwGHYS7q4`9-˳q8/N6(o*}:3BUN4fpc)}d;EۈIyՕtk 7T&o3砚x t' :i7EF\]=z޺}ӊm̈2@.g-K? 7f=l\1fVtSxqƨ~øғp>l֨݅ޅW=o-6ka qi K%]go-kǠ,b.[^7};exmdH;ۍ MɲOu_p +Lb %|zO6*>C*[p +?Ƽ .1Z%Rدmlvh#73ka5o 8Cm|?5g2_{I+?hc8,s} {F/6ioW'-> XŹ wvLХRtmװ#̍U]݋i2(T/ !z>O,?\'.">#K #R<&/ثuBob'I'7wjS=I +[+L:Ks|Y-οjX6|2";/G͟-w?s6{X\ jsrZ/rd%M>` i(T>=vtq9I DD"LhŽU1dT&}J@ʈj"/c<I[{7ta3{csG/F\R0!|5Jx7ZOD-]r'ə-?D)A!و%?ORyڝ^JK + eO{:6K<֑ UR4(jY[anVNC"Dؠcղ{f,Ug{Im-RGS"h#a{ifeq/ʨ|IU TL_&zt$߳H9.%_Dtp920ihE22M3 Em%/mPWj&^Nc< 6N5>M\ 5 *w4j. yfۼhm `W,{%u୚ l3Il:o-0wZ +>hC3;{+7MfsdC2.v稚d!0Ny |_0җJV,qX>s[8OO6. +]ȫN*4RyT _WD?m ۖLuQ6?PVNƇ쇍ο(ͨ`@m] +Gmu?-_ޑ׌(s駓4C SOK2شU6>[bo#Pzki}'w5KgVNUyzY#Y5!_΢YqRAW"@divN:!!љ&WfMXy;At,:Dh-އy}>#<-,y]MSZB ? yZ}\g+N(5)RYVؠ9nXjR%7%|H\AVxr 7^ʹͿN*)#jMwPd_>A5\ ȧ]ON'V"4ۣ r"C&9yN=FrH r7I XRlF[?VsQ(,]/')Yy H4"0 xG+Bw'rO+dT` x:@9HM_afJxPq瘗4]$< gZ";/ +I&tpuɭ bKTQraH$G>0XxSϜ&dϱ' A(ǓAHRy uÞ[٥eG6٘eE+7ElvSXx/<.֋WuP/1SVpsZpX#6sƟuWj`I!;ͥhܐ(^uy]RH/k4_&氩+ :;-ߵsBuu+1ݰ]AC,% d~f"8v| *NELVI3`XfcFSQfl?t4Tr?ϭ'CQ̵}~?y._K6@nuamT!w_"P)gzC)GLkǂ'~mt*)+!Z^A"* ڮ5<{89DP[{8x7 AqȢDy77i1yu)Z@-cLWc>1WYU}M3|[tƋ$hE~ 8vvYS  vH$Iwu4mD ՝n]d@]W3lN1>hRBjmSRC M; ybkT E!n7Lۦ{P^M,S D3}#`{=Ud97XDƔ!<($1[OI.v\EBuu&4M^dI ⷳFMċ8cô +MsBa6C}Fc)=[x҂=z_DPR]?p9X,˱^Yzǧ(JްXќ\os^j1!"μRA1t9Ue~S$MCfѦWʌȟwvc5v87A1y7,} ICM- ^ Ι_r :` gx pv,\Z^}?#M="Y[ؖ qr2SN> jߦ6 Ho3︥K,ˇcob +&r33ҡ%B6σo( +>;<@>J&.Zv:Ϊ4T݌ ^:/IKevRgVG9?\ƭzW( 78?X2 +ZQ8R<=?Q]`(!XZG,[Œ=Z39rS2Eulh4̵U&i2;oە7_[/_ؒf%4`v" UvKpec)1W8*" M8ݝiTV;^ CR/y֕G'+j +xpt<,2d|~qJճgiP;C^D|[sro/p +ڔl) +>4CQj +]\@ CS)]Lְʷ'o7 k +#Gih}طa]UD5W Y]P0] +(cjr~1&FķzҌkj y4|&/M\?/Ғn6h0Ap*kW^ kaHT-dJy:RӀȖ"ĢJf)O_яD=?KA~hV htj~YxhX^%54 .s̶ k}_΀m)̹1lpߩWCm+/&S)mjM$ezc$qAP +~_hV6l 'V{x`xB $fcb[glѣ6Ne/I/k<~!X)C՘_MU;<>g[ӲP5g +\d1; VxVرOUZF01U> U1}~郊(ʧN-2#!g0GZkcVdCsU(x4c5p,~ZBym~~FapmmQ? Ĥv2z#&?mumBx].6qQ-YPkleҸqc P"6( #i!5߾Wf}B'ϟ78ʋ]6 0M`QI+s&ঊdubr.wz T+- rc쯸*5gz;c}L0HВ(1 ~kQH_,6"*٣fc*db]JbXeE_!~ϗ3z-VZU5oC_+Sl}VY{aIJ`EApձۢW%L@2^-ik l?"@_͏C.`U/BK6ܨ;=dEEhA^٥w{ v҃yO@~6z]g7. rlPP3(vXX}_fv?yݿYfM\FG`O89辀|I73߼?mJ~Hfէ`KV]?@#(#lQX_ҽ|Z$jv8cӍlgs;r!p$|ȘůFy.iE(!@!T{U0Qe.njxH2JC(4Hk!(k,=}z7DfWbHQX=u3/)İO퓵*13U)US`e#{6r3Dosݑ/@Υ}ppﺸV!jRi"rTmN* O$Hrewtßj[FMc4-(.҂[ħ-9jF u +/q,`Ӫ|Jp6٪@xh4n/ͼ/>xQh8R-P(:Cy"x<ju&N- +K]"XkdO6yUIRR9&=Em RsNQ:lN*'y)R`b!*CL\b_i _e ڥFTt Б)jT`fjGԕR6}赃 ,ӽL%WGY@WL$mTŪLW/v#r34*~ `Chl 2(:pZͺ<pgT?jFB=YKH}ʂ.x1Y?TI4s)Tde®~7k zl2K!"=1O_Ew.E4,TO.p#rċ 1yi,]Z˯iN 1ZdQ *Dv9jXv_J^nDoQ$kxuBk8h$~nF4?]-C7vH44i-,za>Ui%yC>0ʟɲ\gV!A/_/w -|m2>}1"Nul}s"P"=t+bBWy@vLi04H:{,oM"}UwPj#4[w^a`$+[sj }pweh JsNl/^(ƒ;>gZ8@lSdjFMy''ZS|Xx,~c|ƳȐ,V6G||rqZf-LYO%,/ \}H7gRLJ߫9UrE 3B8f$?|%8G4W`1=,(o-ɿ2Vߌ~F\ZqO$o@\f6 "*V5*M@mzL o9@!opp ŌgtEUUV½Z}^s%01+Nz*caM4Oãp +Ck{zxM;/BDcjH#[=NV8|qV/4UP}ֳ1 _u`k##ݵiWC-L2 %I!bg1c7(RkO9ùUۅVGγz ƦPޠS7U߂+We' `tt W\@9wEozs_HCKu6,ؐ4 {w\1vƐό%1 $v`H?d)AK  B3c/miӣ7pZ8l|ĺz%qS]ZTHQm2;9Z/0k\-65iC=rO~ ^NIp]Ύ"{Σ@oEzM Ϯq (3ƀi.fVFלar\FY+Z:8Bʰ`;, 7 7FNEAcV!}11ݦ0/' R><[(u1 _LyUB4?sYٿ,Ø+赛e{|M8? s=' ]&mBw}[Fdh9G4(nh|ad-{Z9>.EGܟ"McXϩtH"|t%2I,h̓c|=Qexa\oZ&z=N<(O#v({𱈔BrY]όA !4Њ$iUr0&ul"e;ñ_T97zRvGY@.?^Ib' +0r}#}\% dɱB<N4≺fm^d4GtnGQgxW𵶑V(DD14t7g}'3)%2?8ޟ4;n8ʠ$܏`ź![{҉]ۂaşch NȺ:WɮpX .l6aJBk VZa+n\+xˌaXdh|n|L{B6%l?: qI΂#nS +{KNdf4Y57Ϣ/({"u6;~`|ȘVeȔi/a ))q(`+1_NvYw \x$GS5VύۄqD6 +?- "3 {vi <+÷c0rE=:=vDŽF\r!GgY9\?>2.Dl9s J/Q=ki*-c?ʚţbd|3F!N1OT|7HB_ڹgО )aF Bzd7zyfzecH{JPaUj;7bQu σVZT]DONiԿf+( +H_lDRwc6*YENgӭG1/?Ω>=O%ԥ2_In,!.'Բ,b%*[x7\Ql,e F~ +6IEG$JzmX&K턺YA6yVB4/zo"f[[Zr?uvt(3%uZ]#w=S0~)[&3&\BGWf8&xe:w bCߵ([]\g2s禳f:+,+JXu6, /t ԈJkLU~6X$YeB1hI&0,پ +t@]"V^#[#L e:|:h ZW֎.{dK~7/Z,4٢ rq i.pA祻xPGD:m1jGhG8%ڱGUT{A@ y!vO*y7 +Jyd=-t]?xeLUz,*nX[ث߫㏚/ØƠ$C(!IU0hix ߂G80@̋xI0?#70dQSN7R-|hMZsϞ#CM.)YW㑉{ޟ`{Tpzҵs 12$gL7VEJLuQv#Tɉ’-iDe`Z]Rq ~($ +*,Tp@_۸6g@|7X ?XTJK"e~Ԭrws3apgJm/7ٷՑyZ$2_\8 J5Lt U(o氁GfLI  f4"GJ ԨxX" *cf 9zTHrRdgm¨ =>>SN ܳ4Wk/?"q5{Dh5Cq䥴1Kڥv TB?vĐ|#-yiPYFtZgU]<`lT؇$BP N5^槵b +Î{aX`#U2Q Ά1d٫a}*UY#Ynr@o]'ŸIzEX۾xgNWT'5u9J_7yfcoy4P ›ɩYU䳼ˆrV,>Vglސhp|s^Y'ht3{h%Hr4YJΒN+'mzrA>"vub$VnB|ъ/%"͎&6l \A/GE)`mfx2^ + 71|cqh(Ċ0)Q] BLb#L{-ҔdaObE ʀlm$+WwӇg@ ۉ,9ߡ_=gZm6VucGP 2gb|6V1ĵŗ׃Z0 "S-4Ȭ& t))Y1f̈\,n⟵k|eĚx@|&"%`$‡#nUv2*g%Y;剋ѓECS;F@㪿,Q*!,9oh|?7:Lsi s&w\*ZZ11Aξ\dY;9i^ P;i-^$V`SJ *K3N0ҵnz09|aߗYg9ElDa%OU}1g7̋MC;Y&7n U"dr8o9-/c~tx\%(fKQ΅KҡS^(^ݭ! 'wHV-γc:[{#1UozQbI干AqGCю);>۩v@d|Fa_j[RPݜHo.0'W5is H٨Ψl)covw85]lA^țԭC,&O+l+ =!6V_]h-$/O7_>FRcиA$ Ò104﹂E7I 5ߊ Qv`? ~=ҟ)_>M#>%el^@>1 +7l| Cܮ.9%S'!=r%xĆ+%tXա0EMbQI4$m535]d [/RlП62+G-#`5M|NQxvٮ*DcX{ \ +d9(නn2+*j ޶m'ODy^ZFX+U'<KD(dB$ـ^LqHժMqJWʟJ%p-C2DKFw̴{HiO(ip m|R_8(Bb!dt&Cy{#o/pO uE: 3daZ+=wKq0Ƃ%!\.KMc5+$٦ʽ]djt5JdiRC<n϶hV(6ҿ1_ v(inlyg{у m_i#ĶSVb Tic=e<%7 Ƞmd!fqdtB26zJ-=>M!1&պ)$M~KD;ϗﶔ +ZCON nw S`B6!F}yog:x~IrѶ*Ťv}iUhվgqRX^(^[/28PMͯ9vr._Z3l"M*QIE6NS.“q0u Jh4h&BJԅkߑ b+; endstream endobj -898 0 obj << +884 0 obj << /Type /FontDescriptor /FontName /FCIWLQ+NimbusRomNo9L-Medi /Flags 4 @@ -4092,104 +4147,106 @@ /StemV 140 /XHeight 461 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/a/b/c/colon/d/e/eight/f/fi/five/four/g/h/hyphen/i/j/k/l/m/n/o/one/p/period/question/r/s/seven/six/t/three/two/u/v/w/x/y/z/zero) -/FontFile 897 0 R +/FontFile 883 0 R >> endobj -899 0 obj << +885 0 obj << /Length1 1630 -/Length2 18949 +/Length2 18985 /Length3 0 -/Length 19789 +/Length 19831 /Filter /FlateDecode >> stream -xڬcpgo&ccb۶mv:ضm۶m;~ wD/ 7m1~TEђ\O0B;k[&(Ԏ'mPy8혂;hrٔuѝuI$#5u2G##-g^0!9#9{!ZkI rW+D&#Rd2~c"LГ)Njg3i%!>5r|j\yU힄m E$wcDvWDd.6?ܳC/1x-n϶{_x'!\B=_۴aGwG#6lxmˌ^i^x[(W+fwMl[_]J]m(tvЯ*˺)+hjd#YzFz! /e ->0H qmB](K趺cCq ZOQ#\3F1g"=#1NaE꫖}ohw>xI wX7P*9u@`ui? 8eNpI Gf; ^qEU%5tL)ٺJ⍂30_vg:D~ kDtq_#~}Mwe@~304AwDSik,{#_2"hzH%PT5RpDodzZJ{g_!;?6DQHg~CeNgRC%80٤jòij~@iE/&*XOĴ^$5sl1 03UVY僋R_7C M P7"v2Sf>Xjw0ワ8u`UL|i2닍S[ ӝmH/p;4Q; ʸ"Z/V]IM^]d1Ӱ˃["߆`j4!8U0%H$8foR r@wZ %RZDJIzfߓQPN)z^ ~"ik;@ Mo ]3389AW+Pe?@?0a`z;,mt=WpZJ5xVŝDR/ Լ)2} r'=N!1ը6ЉPJ;zxY5X`ڰnovn]#>U֒OFћqLZw pM,@;ijr2$۝rg1O9&*PLs0Ԉ ]|LzŎdסܘ?nϝ/W&<[WUIμL`կxo c42䢁/no]&S͟|زd1Fw9stN7l"MvrB)Lz}=ߙZ j#𶒽s,䐴H;'SGq8jSsteF>sMDCwo_/,VCnPSGrvhRuNŜrnf|qh>cfNl0O=B GAsei5HZs{"3kB?.+oAzMs-Gٞ|ݔi%c컂d ,8TSʿMJ &߿kNTb7x:^A1"5 i0JٓxK#@T1#ܗp3X 96khFۻY }_ԫN-L-P_OKOGŀM9&JtnVo>/Z6n%:bN씔-jzjtcc}6[vvAO$z -UI.s%yL[1a7 h-ފx,ݳUn?!4-Or&*nFkqH%JD6@IF T5^?(R ,Iz,6NkOzŭ`wM.h1xyjs- -LiNȸ31|[ Ob!w#UEFWyz,< rCH%}e}f;fu7l>lU|j뒉FzgrlQkg\ J-`Bgw+0> l5jTS|Qu䦭r9c 4ё4 od 7R{)H*ގOGYdq{`vuGLڡpN!Gm50d;_:8F|eۗ@N`n A\+?-Xy𩯵=Έ;N,\`0?%bقqfBP+sŊFi=jRl8$Si@i $DD -a^R 'ƠQ9LQ /9b`K"&FBՠᏈVrq mZqH+aw5Q -&k#㑺9U߮fIQTWWl{VdC7*bn>#+S;tj؜1SX6bB@I,A=d߽/QS28~,/.{vH!:#NbRȆX,gՔ@75ӞxU uyh%sFlo/߅ÙހVMQ4oPkg`=N)F#Hkp.;3PܚNEk32+jG3HOQ[)dNd-tu:ΐjC<'L;Ez[=n?#Q6é yBx~>?:0&iNq(ҹ>X7CsÜ܍1|7#qS4۝k|6ОklJFgw*"y7vgZn1ػ0GV{lQx:Ýu̲|qz :sHfVj/SKfWGN)R$,SR_%MPtK6I2VʁQ_*)qK+ p>]YUP1§?җK|QG뿂k0V`To=SE. R=<4@TXٲz6E` /Isv<85jEw bNüԞ"lBw$w94C љfyTӍ(?aaAQbW}KE^ 1PE!n0eaa+ H?)>*#^2uk?Gh;Bv;&+!Dbg+ -Lo`nE!k/Լ~ޙtNƆbmtQI)FE)F 0 2)eMsHkg3tERr}aX#KJ=Kg^|k^`!!_I[%Uze!S:5C6nM -NX[a[ -\f7}ՆA[XPW&~`A񆧬% T}tU'N5ɨ]إNHˡ@0ն?< ?Ya#/ZIP-cIeG?X A<>rt{vBrS27W|Q{b~`+d,}.(30HڳBGIӻYs&K?d|*ٚ pZ)@J~_ f!nm'R#EMhZ:<8>v;xlUYZeK(nr>*/o|F@ 5˙z5.6 -kna$bJ-œvRCpww8"=4ADP#B>n7Ҽ; -'ihqtekvӀJe8~NS(%ԟ[ i"J%錽WbDGQSyJ>g)I'513#AM_BOV }k7 ĵrݜ{W k 7buj?L,)KO$\}Yx:\6Geeh^.b\&t=Jn,(98BW;/z3NP1_OL0fd+]'4^}-ރEյ' a5|N„'D2mi7 VCKgfEK)ND%N؍{1.ca摿!  hR F:tm#{g)6^Mz-JUw|PX:^ܘ⤺Oh90vM _{~Qd{W.T2=EDo|Wg.m6^ЋK拗1YnO'9q;92.vYƿi - 轝Rn)&%-yV]L.GŞV%;!IS_0y*:f<6Kx Z~=-pYd2<<=oOT#lc<(mf}zh 8o^P.F$pjiGƷ~^6( Jp4]+j ]fjals-?[.,}6 -:{]fNBEW9i@aTر;8`"> |I]3:s8aX%,Yn'4}&h郰}X,u\|a4D3RuX4)(*U5F06BTwQDBt_h>}Ƴ ?pջ_ЭrM -J"ޫG}Vؒgܓ-d[VϷ-ѳdz=9-4e۰;Y3#VX2 ʖ9%"Utm #&v(O,Kh:BQ)T[vd&S2қ!Qsc(`prG(u0?+n62'q:[Av;#$ٌԺɍh,?! lOó#l+,Q'-˰ØcdbTmJmUǐJ -Kd1P`[r)B$g:jye;Haj#d+%xaR ^tplUݧ蔃9u~Vu;>vTݬ%Ac2B /zY7"#1G5Z6ZG F=K7TwP;R|.+%&F:gA8܄ -Nϰlםا-2tJ9&U %WE mr# :K@}KuRv];pmӮ2 JPtD~&ϘRˢ.)-ye^!eIfR09SC1Mzi l$s9AHۃB$41 ex4J"^> -Em(šU4|O8}ڇb‘Ƹ$&>W>+\bpVVS! -t']־ϕVtEtg*¥r[&4KhҡV׭ -:h~S:]dWv17s_T|0O)3YD*XS=N*5; s>o![;\I7{/(ә$yFN4 `HY%Xzvm]~Ϋ#*U@AٚT GޱzͿj/.KxV(V9r]>mQcCEIi E_.aE5q%,ɤڱZ[>cXH>"N{[õ()4@[`MlѮ#RgRklpm1#JĪ'EHa D>堜7&Ak= p*_>@lxPqajǴlH.E WoiHX So7ַ'kQ!LU2PvV\4dA`_;2x\+p]?I:?סA/"л Ua1цkپ  -RwUd- Fy6; M Z:K@Pu-~BiYhҌYQLJRDz c0ŶpP :*Shhlo_s9\QѾf$*%=[p Rx+2^GxOŝ[Q&-VGCā] CpO鹔mQM˃@ٶl8Er1V GȒ4NWktk -,zw -a)LP}\{1l&g2:!*О:`f}qŭUsIRsb^^g6LxL ;S#ХT&ȡ"s.08& -]~BhږJ1JAA 祪bG҉*acą!e*x1mdwkRD˄.̣U4w <4 h^wV:a#s1tKKzR4AMR;g#KfLnعզTp+t -[<"#;E9ջ<;McVşC!,?̔Ah9/pKad\;)c JM0jZOJ dRgTwDWYjH~rץ)vٚ<-|P6Rl*{OPp!1QڼigE:BQw-/wA^AA2>7_A<QOWiV̶OS"͉8<\WR!ʰ5C>P63?~i$]pBjK+ZwL #$v{6mZ=$y˚=Oxpn"踎 'xHsTS -u!&He=tv V0j7uiXŞur>Mc$5q%QHHv 2Yjҥxۛ `JWy!"|; Ҷ533+T \I_< w|0V=gObqen9ɀƐ\nE4?K'xCBf'Y#1P襛Vbt -@D`u(gU&pzK6Dln<-V}e%rp' yV[Nfc~%y(& cSDHkVuYSQ0wd3:%K400r >M唈sȊ1E%F ʣ$(ۥ0[s8ީ"㯸CKe7xhF"[̭N`f  ۪H^y)QJ?[pGt:񗧇+A -=Vݚi ;9-NW0oCʎ\?RqGɗ%,E`vi&Tb,Y&L(yGϔ1U@7pr`}nHh񯭦EYYN6YR`E]3JKO!Y(_E&N'Wɻ0ŵ#N:J(G‚tAŁR`laKдzv*$~wmg^LG=GEO9QiCO -?=-ZB-UMM'_NA'!0ʪ)kΩ[WS$<:'t:JCu>cC3D҆T0nPC,cgߣC~Ŵ4j6FcZrD,6%H^AhEZ>JeR0[9m} ys_=Bb޷+;gLy·ߩᥴN85Sl> 4.P㇓:%+^H!unD% o(N byHOVpZa7}:&7|]}1Q=w3s^ h;4ZYےZrPxk/-#w2*LR>0i >-4(hI-zpc ="zqB!* -p.E= -KlGRM8OG_ !1Cn%RMTP7L s.W:̐[= -+ʶI'B䴝{(j%Nt&s)DpPbڎtZF @VB#qeundOXES C(LD:|B?CvT[x >/ҮDžuV}%z ?x@ZgQ`/0mf{(GLu^%dJXζX-//+%&_ڟ{;c4aѡ͜J,w+dDp!{p{::[-~뇴p3E' }踖[D[L iE]jxLO?jM+ n@I AwI|6FЫI@b.lF|GP\lbvܓ*xIj? J*MlӽM̰j*p3#Jv&"RdlnY)*(/9sIEv9Ǽ3gSASo3z؅H?Uf,H! Iނ_X̡srruV2O/>~f@gi;+F=لk?S`H$w]չ)Y;6jA/l?ctIκ-jdrZF+B8`2u,dߏ*$rO0w+c A*gPΆuAPr_i?fW/OY'83ihYCzʕ.׽rB4TRf (~W?eLęS#LcDV#EMp~AwqUzȺ'KpiP1hd@k w}Wq CƵ8:uwGW{IܢKnyNT'&>/E-1 Ce OH9>ԶdwAAO6t -D”bc#BmJ7!-X:N{ZY` 3S2ghX]=UJWC`ŲTKb, Ի 6K?bfS6v :.#-O-W_;c萆 F4ͬ"OSbBp\z:YA}C]d[i>a-讄 E-S"zA7r:vM>]A01'))'>ɸ|I󀢢;t:I}O0\& "ۙ ˺ o^k:V7GBo}5Wz4w҂! Ah f* -Hב%NZY33"o^~nNcR=&mѸ\0|l菿,OP>w:CT+ixRVV3ⅵK֎ nf=|ys3 -خ@ d!i)/o=zV|RaqdϾ4ER1pb S' w3ˎSXSgKOϻwՁ!~~!FIʿ -b΍V{F+ktOmN[. f!8/4\PC?`T49?zZCK={rⱤ>TT}!,OGV:$n,!:8 >[LߵDfߤ<hPnP Rx$&AkJ7aI0@uedYf+z^ ULmۃ°Q h^9Ci(ʨ소42[}0'~r`٨t(~e؄&wLSzG*#?Ypԅp%o-#)\=> -,뒦9?z<ឡK.,u@Wӿ$IU%6k-!FiY\s:N~ŚXO&hg}TD:@BA}Q坬e(@R'bY2UOVdXعˎjd;$ݿ:9sswecbNf&*oŊZP9I C$Unn˸ -Ơ6r唰ĝ gJ#o 7)˹|VƱbh!3!xE2.k3m{+:?mi1Bݔ_(# -N3{H~+-3mǻ;te9UZ= -r7KN y5@ѱ_ a -8*+>R8+yeXv(P 9XG`6!bOΥo몑[tcT4H2SB8˥_W04SbEk]02rcz]hS٧¥~@P'|߫UJ(<_5\5gPJDj%@'jN+5;qEOxCmýW34|Z qjZ=A;[_?R}+; ?1|,UM -}σw=;j`S$kKf Վ (Q ql5 B>2}0L**u%xAgQu6/[ -I-&οB+B$)Eeȍ!v.wKtŅql(f$S2+kC1~ +HLEǏ._xAY"!褳w -|ϼ.>W̕C,ml\PQ:)#}"Slg_pl/(M/Lr*U!{:tPtLV҇1 me{mmج0J?C4ʏwvO 4D𭶬X\e-wTo"2O:,0] -[%C˸$X"h`^g%ڦ~h&od׺L$S@O |z?9`=pWaihRsAtԸ8|t*R]@5V@.T2fFA,hDo=fP=t^9tv5ުk*K -q>꘺,^NiÜM~@$u#s'tqp|:" 2uްe -l+H8Me\i 5xKq2D%RO0Vmj@ㅖ& Mc ;x=?&V9ZjQ7gdǼ -xg vG?Ϋiuck0J҆Շ \,YjCCO- - ,g.%Exie@O4}1"]ntl@@qL0h"[K[LiFQȫЕfmW6&`">P.'XJ_O0LD}޴ >1 ZͳdiD -MPE5$ZAB:릦2JQsgUz6[|鮈7bs˪6_ wG 5:[HKڇ9$ZG~!:(%e -cg3ɠߣ3gh@6L, RX b)[ˊuZ6䒪;!;Y<1S=S6=Ef;ԧoS<9"}M*}v/J0p8}gXn Lz[B$V{mYeLr&uZeI_=f/2٫g5E7!p2gJ@K+^64zwR -L9Ǜo˃eV(? K.x6,e~&|q;pY &_Vfr;A72c"lS}XzZWi6ַa޿ĖR -sdm5T6,1L hmv[t7a)0˵r 8-)^fiQtڂiXi6enm-A6#x#v<8BB> xJrz$ϲ /ii(,A Fx\';. jƚqx֤OS(CѾymI']]&v3Fz$ҀJr n^~ş8"Y27nu.[ds -8oppY5V9BƯ ->~RFwEn p;\by|+a?9A!jH:i"nL I`"R6frf 3Ar@ -yZȗ `yeiEfUs#bj^m$=㚚=(_V,$%DF-:^4.^qθ %FG?D!Ck:PsΦ}w3rD \sn]0{_j?=]5n$t,NFzjAc>=D ~LMN˞]7n -H1l_<ll1Lv w똚!t_GuF} k. Pq?VKBL/5穅N@p@4B*Oȭ}{LS2))n6 xy.ĵoe5E*] rzն(6njm5'VWK42] ܉{l>e[C'd hfI<]D(EG`ٚq#q}@)߬J*Fj9<}lG|%ۧCҨ x#qbJA*U0}@\O1)L)_ه sb1>} +eO oe_RųJr#FچBfVi,;~,"!-JnhfoM0 Nó5,߬ );}k9,ײy?yOD,p]_MySR(= /5kn-zdVIk'IXf7Ľb8bˊX dJ6=_yR;(ƘuP\XQӁä.ϰ=ǥ2d4V8i<4!S05],B]KWʁ&g)MSIСw)v.s7Id倛?x.~g;.$΋ѣ_ܺR6YF#DnpaWυȕ_C= & P!0XP?𻗘_N5X -'g6 *!W3w?-f6՞]G7m?cM)wt2TsDÂ91i$%wr^?Co kx8NA -kۃD{acP3=mQF+YATLbP)803FMҋZ Vn$? mR;"x;Gˌ.]PHg~XV$2o׾fBOo2뉚ڜQk- K;{B#lM;Ʊ%]{|Ė^{E#JLg|gsB*2ɫZdWYh3sVV8K۠ n͕:^9Ed7(Z3 ه#gŷ{?CB6fG%<紗98®oɿHIKAxk _ds#{׹[2r1n/uq74 x\z[u5h=D -=mf n<qN@Bt\ -oO@I,,xߣ( -ZȽ|L|6 WٷvCS[na]!S #դ `wm<( +xڬct&vVl۶mgŪضmV슝m;|ݧOu>?5q{. +e5sGS+ #3/@E^ёGAh瀣sZ;:yZ@s8 +`ၣ9:y9[[Z5ThS ?,#]-?܁vN@׿ׁj@ +ĔudR)fjgm6:i 3GsZsa%08ͬ=̀NN@g{kk:)_99;k bl +UY\uZhퟖe jbpz0vq3/psv +@Kgs;_L?/ݛ89y+_^kW# ߜfs[Z;1+2ݜt׀E;:ýpLSXf#[#r<_%M.o 1q3y?cbomZq5;˿032[i"i 4Wv5Xٿ@g;k_n5V 3[Y:CǿM@_U?4Q"{9th?`DE=> ,VnoA<~bOYofu?~) 3GVGO?f37g$?= 4[[v4 rm.g s^ZXSc^:2w .??$';6: o?n;,YlD_"˦ rWɂb겆2竜/y3msVyᏚc2J9>Q5stÓ̥5QTt4cf($bǫSw \`zAj3ΕFX<3 ؄Ӟ>AV づo6cVO|YlAڧ`{Í@޴o&捕)O3l͔F\2=h+߅1#{ R)+XϞ{hZ?LsS)͹Gxfڣt(J@ EZn@}4bd;ӆmuY4EK؃%ȿOo@ K(ppڇuwYJ,,$!ZuoI֙+w1hUjj;fVG>-أ"_Yn$2Њ뫕2'n*G +4 +ltDyr q`y,VfQLP(n`5\wQF i!?PVaԜ|C;` vazKf dSAl2s9wH*peOx_R +GnF:, +)rJ*og$Z6ۥ~5),\|7o oR9-Ӡ4.l,g~M`Q6pVc~5pqإdpfGJK8 +#YLԩ(jYj8|eC3נY|xY؞%ԝ,Ih)&H8zLPH>՚K@syWط4F4i` |:#&6QIy~+ճN85g\4}iZ:a82A-xx"As LD lzrj[@*b5.,Z[[0ׯ֍E7JU)}wWrf8Ft'@7eOH?Q |7R$G},!Z YyJڭ24֯㲒 ۺ;oꋿ, `iqƺa2͛S?2bq9mt~NsH B7K.ixjgϷxk U oBW][7&e$pG~Ƚz$H;32w5I`4wg*.E*9,<&RU]?eeZjI t71wWFۛBum"F0e/{ +!:p-G/27}y4f] ɇ6ou><@koؕ;jm,b&Zl[+˛xT{%WO$:I63%'Qnu{3uΚ +{ڔW1AvAVr.^Shv&~C?h +ے +Ӗr(^H:Zlvtp-=[*0!l 1ӧ1ɣ^Y6h\$)w<,Ol7BD٥A v-65X%,X;~Fg+ǟPT=7l~iЬQ&檿J?+n>W63^Y+S2R%NzZ\Yg4Y۫J=E;ȌohD__9q|1k, aM;ݟS[ +MX$PzivGRzP$u K}{5M0z[gەc-#.{{NׅZyO/$)'y4WN+e= + +AB18NFcѭuQ;uhTLxa/+Il[.lpl.,d4(nXUi>A"aq.qKoHEnW){ +%d}XA"+ܜSX*>"B'w.BKsKx%LlzT:dqnO&+'0C~\'-qߧ&SnTbGLCU蜌d0KX>Mאd`q;7'&RoY.Ng{YWHyԾ|lq O)4׫mĿD(HY3~7m["hnDyPcda!;|s($6(? +l +} i;.MĢh 2*?=TT/ы|GHKJQXXGbAּ J 7eY+N&  +à(١psM|V!F-ZrU|TnT Mri,SȮ7s zӏogpφA_M~z;vKW()7];SOoUV+ۃk|3H0~rBh΃lhI&y4#6O {[#!lɧN"\xpк)+ +Dx`[OćBj˦-]b>qkBl5-0Krl'ﶁwx][} { N +A ̤S"Pn$ /޸4B*l˵tti Ej/E'ϲ5Ԇ&LR suS_j< hvx:Bf +lrLfg(ΐd&1/.v;,MoE:="ʿ +Лy !.hgUݪTbM ˑg=nCB o03C7Yhn TaɃb4PYeoR ֕ŞғwV %(7凸s^Q I\=x^>y|:>s,tl6B/=| +!MAdt&ۊ(*%BpuV Ȣ^[G*gW&%o?>0,"동觙LӳjG  +8#i:,LHJ"8{5vP' c$Z!JL+>|A$|gBU +Z`EmEOf$2&y +CM~rU+75qEvZ%Jc/fc9 ˙mOKN䌒U?彼(#L n v^ +<:230D(0eIf~V>}2dOޱYXG|呡bLw uteITJ>aFFKro٧:X |vd{8;1*ڝsv$N7-5+d06G&GnFA9(BjT=K癳|}Z)tώ{^a킲W}85R jP%ϗ1?r]y^- ^11k[aƲ35DžlVOE!*Φ<:N}.ȩ1Z$/~`NE(փzbQE^ O3~[O:Ipf(Ӷ{o2/]?Ͻ'<a\j/uYskJ4Td4Q%Qǵ}E ,-Ta>HWEY%,_?? +k߱#ь79Xԗ͗YD/ V~r0f3BM\Fo(UO(Q-yDA'\ITڂ:F6ԤP!F-E+X§/xxJb0{8/锘ܵs$6~"ȏ4з~4xW [J%9k4w=Puso 5[*ߦ3d+?Ղ&w 6d7T4HFq:L' +wae&Yֲӧif,ݺbtۺSR{O~ cF/\Y&ŋhkCmuqb'5G!hM7AZ~ʶL&z\cn1 ?fjT z Q$܇"ž'_?ߥ絩r&"DᴛxٚBD .eT +? &[na]/=9|v̉a.\z0W4D$,&jp (>tS ac*d:X1{Nv*Ѫ5D5g#D.Lrtϵ*xl*x9 asY]kI5Ypϣ32]dJk\~e[1 t` 5/G`1l"ޜ¥Y?ء0Ek> *3w IS6}b,H7/ɍglra# eۭ__|1u5IP+λ[bz]N("$굥),c=Vm GQ\:479B5*Uǣ+ڻm5ŷ%yFUiOHUZT0Q?T`#3 Gʹ`6vQ)AE}k!U~(]DuUB@!2o]أDfct +HJi* jtFZpF'*z(-yëF2Pڦ{wڡɍԀЫ_vnBUX"G 0hD*, +`ZP%풱a43)ԯ;AxmKV|5 +ץB*Dh%^OqIBGN[vZoid&9,7Y}ϵih}&t8L]pbo l/ _NM>XY @w TS`ktquU;n_.\O.zhL .w蚦epMX@2:;38j<Zy?} ۜ"eQm88_U}~XLJtvJ_"m(]I⴨/pɇb'*T)i{: +`5>7C,N)*t8?k/DrjlUw/g7H-CI72{[yɐҔ:lu7k✠gI`Qa=~4ƽ)1>>1-GpӢpU>zT<-.['n !7‚FV[um%7rEBnK5Ojqqz=X1 /ypAKIR6sƶ9G7'A&|˖gf[]9:P0逆Gom)"d[,KCe: +5$xӫvģ'bM%X^6p1 +,?BmwU_gG&]uY{ 7 ?|ei9Yr qQ6>( +jF56Ɵ`"_%una98H"Fn6DNq7EoUĻ2/X ӹBET +rMuUxSEI?oXjΖ`K]a]P3!u#Ia ًe}'u`g$A&<º >q?O~~G^ثL؎%-ǟ Շpq4گa}{bdxox>0F@ . Qq>[uP,c{p#x_"0iK3>@q1wZU l<09'no7U9)C 2ZdjlQhV?RCfiJdk6<}vL^{{Im oQ5/"L(ivf(fS]%L"M;sH-][=m F{3C~R鸘r Tgž^p~ ,&;b9bmи46լU3fOz' +;)W$T8&Lx Y+CsO,@s2U|u|RF_4uJa#L¥ hq(lDrwLɐWOp#U-Va5J#Ƹ4}d!+>и5>v>D 2ֻ{%$yX2MoZ *ala~) QRR${|ɓ;R*]~'B"2M6~{Ҙg1IO>b}yw`o.Աio{vgP>9t5ԬyK^r೏gb|u89ց047}C7hjzرxn t%13!:h(Xo8 +ō%v[G)RX6”}6 EDFQ?L؉Џ7IPs^Q|?Ye,=eCF賛+|V7Jklq6/k³ +o3' QlcZhqNB?ڐ\ѮuVH:M*Vo/)˽v-|KPU|mӡ_G܈#Ѡpݝ%{6 +09?[z)~lP9/` S 8CX}!ٗ:Va0Sb]Iu01\f#֖JHn]}$-HP\'ڽ Yu>.*uX߇p ~NRXr.)\s3Hz?ڪ^dN{PVlx jS„8is-nP9e=ذ޻?JP.C/ȆD `‹R;zݬwJ~8 +dinC*r&& 엁yL 2ZqR?lTQ ޹sr.2yqPd6R~stT4"X)ٚ딥HOVmҩђ3aloȐk]D钦(Y3;-.mDc/"lNݗ'zP6V"2UPZfG$n/lLsKZWv4y-A O0d% Ql+/zk$4ތ& Еa8z"u¶,{-IEyG+%-:ϳ4}2`ʵq"I"-a#6@;pK/Ciḩ{.OקK܅g5"(b>N+u[=.?e"AStc,;%a.nhlvxneCZ{yQyՉé{Y=VGr/SxIx0B6g'(5O"["fnY'mKd; 5ga%ivX3As40_Nss{(m@ׂSizgf|Ima4qd{[d)(zSUb_ҥǝ{Ȇn#L١—ϫqvP+fjMr&u- O=jdm5]';.UW<2%4S|VMX4ta5}@$Sx]|-g(oaA}Z0_%Ui?t1(@X ~`~F +y +7ZbjNe֞eQ8{"'iXPA%Tme}YdC-_Gs)ӝ1=M@2펍)sߵ6guA Z[s;?&RO $+\u[Av7QA2K.[*;ukO anŻ{HSGbn-uD\_-1 |9:z-$# {Ni[tal;gCpi0U~qb0B1CW-;K JZH3^e: w:0NI3[E (Go`.#>qڰk-7stfb!!G$B_p0ThVHcM2!@lenXzpgDRfzӒ!tH;W|Rr؅62L#7P=Tҍ__@U9\1.Kg"0F(|b"f!:R E{gJ!оb)JW,_20֣i9O\@-[Ro^~ЉLb +D=%EJBC@OTRuF\.3͠`ȊGur~>EgxQ3؈) .ѝ4;"0nS[^S7%^HlF"Bz:3kᳲApۧ|F"$~gLSa V9uLmʪv {_mKc':?.dfKGH=[L}srh +{E2j _EːFOd { +M-;TYH_M,S-I?KMDY@A9ij=YVK U۹o2BU LMF~ze隊ʬb!`,[ 0ZW"O T6G1`B%A)maD}{$~ tԾ%} y8NUȅWp`A5AmL%4e>cxF>X.ⴽ>\}j`⣱N_ٹ=W t1Ǹ4]z2 +i7Ò?Iw~"^bo^`2j^O9 9 FH\8h9J+FjgըQ%=pΕnKՈR}[m)Z K0R]|V̊%=a=c7?1'n,n"Wx d]ٺ=H]aw nX>6'FbcAzfTi/Ed"f0TUPT~qIe\+VY)4^ +ӄHvwV95 J@n 5\ hvS2WJ{>;Ix-e]ݠA|gʐJ=iK#=>ԓ^G!z bo#Ihd?ϟT^5 tF-*@7o=hFZPgo1F;FDFTC7A»UL-p4x+VQ?mbx+̚h|cLH݇^/Q'C:)j(S&S߷2o+ 9 '#|ɽ(?)%?aN!Sq4HW{ۦ-lb~ dՓPiPzjrΖbsf̀L\p I]s5C")ӷtU8U*Kl8m_w@$:Ȣl3YB@+6^|Jإ17 Hi':\ud ^ܮ-)낎vZLi5! u P}bv>0F ܩ 6o#R^:i +f׺#)Ipl +rkm4Of9 +#g.أGHŔ'$$CWTFaB|kUge u[<̩ET%b?N :k,CB%Zl;1޹”_"M94~T,Ĉc՟l7F%tm)_L9̶mʁTboUCSx҄QvU +ZB (9Y9vDSq}f +O>eɸ-&OIKXa.f숮o6/\)ުf]- +3F~h6UWxR(Et[HAlmB s&} +C>Ʌ{*r +h_0-iց,4 Vb2=iRònHCB;ύ}<@ki7l.D۰"LndփVTД}ӊ{2 p+-e"E'xGйM1'2qHNU[.GEQ &9FytIay.;*ؚ=B>c/C'[ v]lW#ۥ6^+FK|Ipc=N yf(%%AY!Y$= Q2x.qf!J7Pj`rSPHn0- ]L$^4 oƖi`Z.R<4jB:/Z@U*csatWMUUGU`Rx@PT, +TϦsOh+)f >3bD;[ԗ0l6F3ʇRQTvuiSm}?u?8[暡,o)/aWp4JZRΈ5DToű%أw_&;E2@1zF-Ǝ~󾁭q> {Lu&y#16DQ/[ oeز4UHӥ?Xo< }ׁ+XYlORQ)K-U\.Ku +'#F' kS%LddU S@"Co:üF͔4# UUg RPDmTdv}q)*K[ZTĊo<. +Ubsڼ#2>nй~N&@Wwc?[eE\D-X/{-ٰh*L׾k;xW1xz>Яybk˙A +(s[rx;nE^$'[jy?lG܆*Hc? 0qǵP+Ax6'WshՅ4ۇݫQnƭֈMPڳ%gs%1ai2ɜm>$E$09P#βV0H|\o!\ d3zWsmj&Y4|ѓGՄwyYi"u]lj|'Vs;\Aޢ>{^ hOP9mƓGc>^r&iF"$:X4Nh14ƶ/clR*~Bij1m34};i3[k):)+_ʼ,:Mvt=~hR/}F!Ş[$V=5K>.ӽsIÙC7ri+ L~N]&e-=CSfFsA%b ~8Q?dgְ1w]󉞃4N7zW<`+ْeiRE֫h 0!(Gܒc) ױ[ LZs(}LT>'"Jg!|fyqP)wkհtHU ZVf'w5Y8tXNsFTոӆ~Z{z0P`0ITUފ{GbLn7t,{-պfߐ mJ.G0믲c*Y% +Hax~¡ާ :d]xݠ}㙊 {jҀlz 6B `0*j8rlb'0eW.JD!+mTZ[V/ɏԷ*ĸzt)=C +a9sX4=v}u/P(N.]{PAQ'>&$R7m&[r:+0o}Bש:Ȭt.R|t b ·QUX"J.@w)#4y:QvlL;X3VZTY㲶-j<14ǥ~<(1a/$ҲܶصAO5zǔboC&ٙfgrxcgYRz꽬ҙ5g99N)GvT3`-..aCZuH+b7NCDWP zd'z#9}a5'$[q][}}O SGP HꏞJ>MqV$K@Y2BEz_Oko~o~ ^` IrB|7ŤX_'Aե/2k(Z^AxwUjb50͕5$(Cg*jQ3H>3lsҒV,_^@]}=R!S3U%ݽKyKR +0xѹhL +bބ[)︃[4Zu+2G5c^ZfHYX8ݩ?6CVdvJ5R]Yςb{ǘBt ȇ>}ΙPfcNAϗ)nRbG8˷MctrZҪDӎ/ރcm5:-|r\AUv&x^#KS=Hk)K? AƴXD*5Xsg@ ōTp6[eÂ1(u XwFKh1-"RMU@8HpDnI).CMKGQ>ܞ3uw&g"%-qeuY)TXK2Rй[pRⲺ)ÞIo5- +Jp30NJ߽֒Ζ{/3cH?BVHY&;͜Φʏ38:5TaL!pAbaaSZĞj)Q-+jE,~Q1noM 춭V^w0"+a!gag;cp`Z"O{:zmB8RSPChkIvԶ 'SdBKUUn#.kb@b xH>eesI!Ls$kL^1+4t?1?a .4&Ib` {6٣D~jb lv] 2Xildw2%gܛ|5*cLh]8ElI}׮_gD3~e:df Kdqc'(ޕ?4˙7ePh +ɞCBt M_`AnJ -n+5VţQme ޮMG0Dm}bQv%A%XSI%; endstream endobj -900 0 obj << +886 0 obj << /Type /FontDescriptor -/FontName /MMINTI+NimbusRomNo9L-Regu +/FontName /OZCCIH+NimbusRomNo9L-Regu /Flags 4 /FontBBox [-168 -281 1000 924] /Ascent 678 @@ -4198,80 +4255,77 @@ /ItalicAngle 0 /StemV 85 /XHeight 450 -/CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/a/b/c/colon/comma/d/e/eight/equal/exclam/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/percent/period/q/question/quotedblleft/quotedblright/quoteleft/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) -/FontFile 899 0 R +/CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/a/b/c/colon/comma/d/dotaccent/e/eight/equal/exclam/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/percent/period/q/question/quotedblleft/quotedblright/quoteleft/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) +/FontFile 885 0 R >> endobj -901 0 obj << +887 0 obj << /Length1 1647 -/Length2 12319 +/Length2 11947 /Length3 0 -/Length 13172 +/Length 12795 /Filter /FlateDecode >> stream -xڭweTܒ- .wwwoh=\wΝuߛ?GSjWuj QRe671sa`ad(mM\UmyT-]]ABho'fb 47XY,<<<Q{O' Z]E_\&D>"vʏn {[s;q9`D$Ԓ -Is;s&\M@@Sٜ`a03՚33`n -305w 8;?~K'c;;pLAfa 'L Ȫ$&:]] f7A..21@ƞ? W'sKc'3_>{c{g @gs# GNSܖ@;E?17s/( 03@`RwH '+'k_{wj WHcgkr _ƶ@ޚ?8G -a;X89a:K=͔.V cmW33w?D~? S? s;C;`QoJS`LfyJD``bxϑo"]]fFff??:_sblg1zi 6uurPm??sssS?MB33]'t{Y CԾgDlT| el}k\:vxݓQSvp1!ehx_,mBp2koO*Nw9]`9 DmC+>>L>깂çˋsBpQÐk^X#d({l;.7ڂ"\9.$Cy/G}?.ο;ݖRpgRKÝFݮq5oOv?pgfm.V^QݕWnԽgnFj/@C$E"6JMtE'@RQ1g׀988p' -%zv d;0soD9j_$znYаCK&gQEǿ\4(WC S KŒ@tpтalU\{Jhq;;(Bs]:C'۝nd-~FQpp1!8=?c>O P#{Zja/MP!,xdr_Xvˤe$"׆<Ϣi>txJkD)"i!I8>0E kS嵇1C -2ChHpTpw9K |&v;TK/7qQmP$ N|Ոpo)Fh]ū.jy; t|Tee nJ@׬ܛz"7. -k,f|KԠia|ɰIʒWE2I#U ?hy'󗟐>K1?+!|*DZYF N4evϲ"E3Cunܮ,Jt͍"z@uk -8FڎEmDݐbwippr;B.Ucj`JݷB'ì2Mtg_4*cv!yf6HPLͽb8_!ZU^~(qp?e pXjG|qPĬҿ2`z!f...j^? KdݢVoYd[fx7FqjZ3܀n̏L - X(kq%/rX^zn]8紛_!"C4mĐ˺ϙkNl=ˉ2DkW>t} n;S04]MaRe؆[yQn& 1G6d$1j>`l5ǗPH xEjs6at.{WkkϼMFX䜶OaWΊ\3s)lsO8__h.XUV)y'dSCНT =u@[_JJ{rlBfw㟎ҍ;3r9iA]_$zG.ƒ &ɢ1(b5и)OfbAh?F#O TLn*.3WNVVƀ;P԰[lܩꏞ‘@]vs7 ;b60)^BKAxzg$nT_-:'4zRZaэ"&%7h"!Cҗ>SV ْ:־m\.t5>#v5^k)!a̦a|#!yaܤp lBwnQ3G-`ke6>Rv6[xUg[N]b=nPߌVc 0 9mV'\D5Yk B Աfi.P=V<`ŭ߂g$1os\;؞B) iKs/GE@eD5|5#\3UilIy8 f|Ñk KIzNȴȠkO  Ɉu(UZXir]5SHLsTǠE~# iVq ʛ'U]6Ơ;*~YBܱopdS9m!bE{0\ΟU{~9"eN07;wLgͽa~.eLmŮq5eqԾneSGWΩ=?)WKpp -JbAb_]fgMӝ0Ekn yw9dgr43i7ꖴI{lZ5:kp dwG&]1²TYdgq*^lϭՏ cI!iYo~N%-Ь]>?pǷpviEgeafۇ0wrN,{UU$8,}6FK@®OY3 88ALD/7%C;ϓoLG J_ф)Έ^>=G4 cs?/`O)s%_)*fPns%kE)G;fO: 0FB/r5:d9BԳ8ޘ6by~zr:K3~D]D5T 08q񻰛ec"ͽX^z\a%D^έE3q*Mwmr HSKB|s-cGϧǃW<E|q-CX30CۼpO%V_;tWr#>}a<,SC1?KSY/} ꟟׷|yh'`7Ǩiʝ/rKk;"o`)%:5ł2} < -]btt-:r$Ԅ,ꦑN݇ѭ`w; X'2;D ١ 'J)Z27pcQtҘ[HM"ސ-$y]luC>-_! vSv^ ,ԯ2Csm#nS$,f"Ov3v\x Z!7Ge"X5R Hq!}ѫ|$ƒf ~/r0>7Y.Q QY QZGqgu!?= {BcQfv@rjUHHaHU;qHb_,@:Ԩ㦵KLu}7$GJ'BDs0->po0EnJ]]-jCib9';9kyO8~#bZǙ2y*<ȓUր1Fni,bDfAhOs -ɞA/#dmU81 -kS*St6 yZ¤i{ -F'?YSo)E@ -o!B%>m_rp-;:!x{s"'Ętz Bc^h[,w-4TC-h#q2 {JKЪ -9a~ fÑgE,b^X֔=,a92;$M3@% Z0c5zL kg [ -5/љ(%XdR(MAR5; WKB-EƆ0U6nȤo< ʬ":޼[§.~ؕBk - b)۷NU'Eԭ\@WMR X᮱ֲРx-Ax9Ŗs؁ρVqֳջ 9 4'by<[em?#+΍7X6*Uk~s+TF6'=y1@i|KLEaa!}Lpʗ@ܰh}YFg6B _/ƃU̶o^ krQe Fx?]Ah k -=Ԟ. 0XݖuC? W KPiLXXVRIe!Pv10[cW+5ffN{E$._1n Xb֚бIj柙bRbУ^J aߔfXl_˪& Mhe5$e| DaJK IH_Gy62ڮZ>LNg'3ԙWbM:.XF[&4B;I/=_qиCD!:ï/Wi{XmXaǔ0"w9A$FӜc\YsUK>F7_m>r/GvT>+odytUSzrsׂfyqt4b:d&`٫l`KE8N: ['iJ\a vbh}{rP!fda:W'ҪF28`9Ɇr{6}:6ֱo1X6Nj"Y]0dPiPw+"st^׊Ue7᧲u^ZS\my&ǏY[S@$,6n>s"ţ;ّHd8`qBՐf)JAW*b)3|/3Ȯ&:J,@N{V)C=f||e(喦hd꟞H,Ȑ -%؄5)#>*X'fqwyTn}.is*p8uKb3&&c pXQ26t<-ku6gWZKŀa1h7 Sh5I&֔>P? -! gYM_/jm2yX"xnlZ7)-"li(Zgڢa%"[W,.-/yhcH"jP'9 wesCӸ佝hS"614H`ð[G$c!fjirne˜~%V{3ބ&w +`U%婍ya~T8]gKIt Pw<řHψ>ƭiPc߱ɕY>s}Lp7#@?Z|)uVJWJ;'I^rH+myzדQDi!SsN!V, ŹGi%)]2N&>1''m5"LOKXg(B5B;Pb8|dEM*$YtHxhy xa;|@L,HRe=tՔ67etѵ٤ -X8c]H#%Y -m䗵޴ߤ^KOthh+Biϥ\z -,tRs牜ٙ酢=]o#PXnAjfA2e;i -DZԟ+R_dlnݟu@4XqGDR]iB e-cBI\6RzRoO1FqOۛnğ,)MYo A$Y_oQgQVՊw>AOi+ο`17E7lCuZmmc#γ3d#d494fP _s\m"ꋙ5< DQJ覡Ú18 b)Zq+a\N1Żj6dէow!҃ϴֺF-1'?J$E:]#`;@dT!!u,\iMW y/.!P( -6$O(7kNBh!}fY# Z} g"mri{>6p~.s>n='K5ُ';mx\хmPᾁ"J2 nRLJ1">hj,MΈuWz.3Jrv$_Mfζz:v?ᩜfW %^N_ܳyKSaB{ES3D6pOf1ubNXn A ԦLK`Oͭ^cЧm5N[st̊Kwu̬=RK): >7sO;"* -F%(?lњ8h5 >Eh:zUa=֒9N8(D hS&gZɓ>OX\'L -R>s6l]պIVlb4LK(z6]8{xF -oc2uC证8  -[>vWnz#Ut5`3gB6\>22y׆?W|ٽRM~5Q.do334(%_}MYvW({-Omn;Go"q ug3jwP`~%6rVX v_ņׇԨ -dw <>oTvDgFgDg;eW,1yc sS2X߉ jԯat;y"t&UC''%KW7&vӌ>Az574Vc p)LR/lA6YFa)A20JgI/Ҭ_B2|̗YE(lhEN0^(;b)Qp;"G#d]D- Yt^4qTbJq RHh^rܕuy*ĺ *C@.*-a6ڑ -LY̹'R92 -gM2aS$\v;'^7@[k p^?Y4둾ˠcdkڶO5ަ1Bsڠ^sP4~95O"W9Ӣ2Ǹ }G<{Pߤ~7)@qJ6XUsIV?4g`rA99]:Q>Vp:%'0voJ(TN3YM2 WWxѝ!fYXGowr& warK{La OOJMOVW$`g>Mu?XMÀ zg쿿>otest7侌@W23{{)2[il$/%V˖!<nN -cޛ;gMtT>4$9ŘxyGv{_/\`oɘŠjt6tb/oE-1ӆHߕI?2H<DN!gFrM&,;+d*폣_c,?^˾RkE!5 ?% 3^=A#q - poecP-<X,^:BZLl)LV+6p[f' MP^ke -؆2CQ#fNM6 qȄp`pr}&@ʡ9O֯cFH6sˆ~ PW-SjQfծo[>C\П@&' oU['+6JNM,$9Iؙ7 D_| Xz|^ƟKRƱ`kg]BA#sCZ1zhjDEJ9UP?YSؿ ZPh>"PV<f FqfsIDήڒWau[3ݢJ΢|rc$o=!L/vN3I)nY+H$n0&")A!4,0- W?Lb=v =A2+E-X>]qvNb9lk -@*+em}}JM_K'^o>_ߴ$ZVRdj_?a_Ӆ@!.0rli5C{f70S@. 7oY/G*lWcd ^WpZ 2V)N{[CQp[8f4E* *e¸h}sqԁM_Νrٱ-*\ 6~XS?X*JVc/ny'#(7| $d:Abd)$p&N$| - -oy eH]ӟD0ablՅc7+wlQ3@`ե-0v42xH zJ3u%izͣJ,$ qZӼ r EQw-3nwFԯzrys{nO $3ʙ._Q=xSNgڬOU+?Ҫj_z@]Kr1ƒve_)liOIӳsQ^͸%X34UBŗ.L FZ%1 -@ uGn&B[J|!JwˌAwM;=.E#n$dO F*1g%s|S {607.5_uO^-)s2 UgMm`{Uf˾ qQ OI I=O9kd˥g}X %5HXY<`5 -Ə^Da2ΒM%EzLCivISEO4JSK"yKFʼn:^-cɐ$EX ]U$?xGfޙڲ61ݶ tΗBzr :N:ϟX~|r鵋X{$ XlqP<ʸm@lT[9Pm->"BҬ =}Uƞd2l *I -oDLlZkn\=Otx*~q㗖 HdxcLSn_H* :ݩE|BQ eۃ`X5tRWlGmܨ6 %e1Y\nF'xE/$䔧ɽVbr='HOڜ -|huk/~W)gB#3QXb'a -QSRě ]~[xTl-6d, J/}ݢkP8Bp/]5JfĶ:a -P7woT:L{WIFڷP7dG' ,^}.hT9%Rĺ ~`^"JZވ<I*a%4Y -KщW=DLI!F~v㸳zz1k_ ZouԋeuT40 @$t:u@Wa{0sEl B1Yo IUn\EȊYo;QSiFkADd);Y(IF " -_s([_y0"(3N`V O V'[FڬxXwq,S3u7Oc`mohW/*CaϴpE\j*I7;"b;q/D.#أ$}{qlvKű1ַZ4]x~J<@J8SMH~cauy>c]ċg$^GNKC򑩼^ǕIYyG۞ATi,dDs({bl)*zSwLǁN8Rڵl]3Jdݬch'(_bd\U$fYDr:kS_޾btIN3סm~.͟#]uŞUZ [(vm%[Z8B('E.E5]4>O,0zei,ʵĀbļ(x*cJ(KɄ灝Tͺ(S83t^LJR)ݮH~_9,&KXD ZD?|e%C&`<rDΕǵ E^;N!q` ޡwLŴ5 +xڭweT\.NNp =4ҸCpw.wwww|ߙ3gֹw̝k%OUOUUM@F@  oam 2)Vw'=l3@`El]-Z5e :I2S`af~pZl6w +V@7iyI@h/B ka qLA Js`~vln@c_*F-`071r4+w)lAw0E x(&Ƀ!3H_zwCK8ZYZ7? }w @ײ2p,/WCk +߭5?0]6f 1r2sCl a4QL /o No:Us 6kx +>ii)J37ocICd򟇿DD@.w&V.^70#/#@:-\,,,u7qc_}61yo6vgm^?4FZLNKWfd -Uux'7hS]. 5 59?K,*/!܊8*5{`d́wDV|-\qޗ*WA`h@x@~{l/\bIz)r!Ɯ[kT3sSW'GŧFֆ\1=_x%\\PqBO J;0Qf:1Uײ)̸MFecsAD&rI?CP Zȧ,!  q9֐?Dϊ!Vu{Ikh/Aamd~Fˬ(!?MoyIJ&/ KU"@K{ba~_u djQuXoWE'~3*/4PBF7X*`YnkMhܜ OxWZ6Ma)Îuy]h i=6eLG4/s]N[/_'bJ p&UҢ+k9r,7by]OKAwP"Iyd + M?.J2([DZ+m/nG$)S nOR y;'4 7R4^-Oج9y5tGfZ?f7&;1/~a;`N;tKrP?`uvvw[C׎6|f}C0A]6 js<=xVdJD4!j@mcBC /r0׌{Q0w܈;ajˆjCu6EB>R:7 ؗ{b٧";9)AOBnSiIm: ڃiU1A(m?Vt}3L lag sQ%G +'nstBu.6IIc솵,c1bN]=I6IAmGpZa|:Zz4A?Ιhyk{hɹVǩ~B?pu xP/鎕rf9䐺JD% +-֭p:POi$CN8gml`Qݔ!?dB4Qbیp 2P4 obt9%>&a7~,X1WӇÝ(h? |ĨN2)E xrxB8qAnDdŒ,\h$3ڶmR,>pQ,p߶TQ}=TE#g8E5⯔U2ϘKz>S}z{$12Xx3Bljm7Ξ\Uuߝk:>+A>1t>)?Lؽtc!T8/YUC *qy#b"rT;Gh |$=Ŧd󳂷*;OՌ\aI|[45>WMouuŕk;F~w|)P^ޡ>x WiI)9BKVʄ + bMKCtZ:)dfб`a.Gq])CIf.qv^>WRAaql~U$ps R/햝YďQ˖OlF/?IJ!A +-t?l=ugC7*@ΉsJsCaQ8m> +EԒY.w++l(i +^`^TlCE䯞yDb84/ZLOrޙQaOŧMAں†)V06bV=Y"EFj:Sw +jbBJfJ2R +p߻^O +s]Ϝ?ëw4Y4vwF9112~̺rG*z}Ѩ +%maJ9mFJXN N*!` !ͼ$ݮ*yPQd]w4frIjϨ:ATNcVHNq>!rAPܬiX9%&QQ(9v,$tۧEڎ]qBj=! p7hr-JI(F +nq՟܄ΟKmqus('PӷC̄ׄn>3) s߫#+M*FQ.&/B$##f]  ݬjs7U'I9-な2HRTC_,b,_k4Y ƶ@Ntv80>qd+oћNꏴ; J-ZXE8(&˝C/o$yKg#  TLnq6|F+"k=~c?h1#ZT_<4!m}#[/#h/}9R[j!? Iwm sCRO"~-S +&dr +[4C^.a7!{̅dD\{K?3)<7m^S !"|R|ft]eGm yMN.*7Ƒи mjG$z5OIy +a}K_mX#擵H μ &|p.i˺:+^ ^ɺ*(}">D:dQ/g΍ThF/~-T`}y(#*>V9JgziQߚLOoC7/[~M =X|Q-?ONj(!#4* +\ȕ/l lr2.:U)\Oa|5Jg2'yF\Nz%UG,N, @&'4)`DB^[VW@&ڼ+ eǩeJ>}DŽpYIIcf_MԖvڂA,<;Cu5_'$Tݒha{ N,ncQ{?U- E?li>8?  |"32NكQ`)z*uRAM]cd=Wl\hRl_{]E# ݮ9VUp8XqrQa0%teKe8vbF/AR_3!#,LYe8\WRhV汋 4~F ®F1sxREL\7e׷lJM2VIwܤJY=J3^H^XS`7f%a`ۘآ tLKp +8}Ti^ 4 Tvt +͆{yǙen"J!EE(}^DŽbRgQU'k(R#~f~diR FBˤu`(g6f{ԄQeIǛ&e֚+\Zh}`jOTby[n&*491c*9"dñXYlA%~]tt ًAvn|}& +t^y҆֌Y-ҏǺF:vi&1EŽ@=H>F"PЗL /_]xV`Hco%m3&ND `0,5h)g r_u Y_ǦdUM +Dgc ߦb?st/SS*m2)`P\L;WKr7mB ?-_ |Ov3Ia)[!o˞IZԚD8Li. v,{E9 ֹXD%3@O]Αeʺ$I;},013WWqtƦo~> Ble>y'!B]$N[&.ۯb<^2݆OdᰄZ2R'C#F1 -d&CQ47 %VaZ~ +uW=I3~׎#,DJvD058FTA'e7~\Q?Hu` p}>Silo@O\r *4tG]+ +ODiE^RxyOG|Oޣy^/(^T +lCN8B^6 [jpeliv> O챾}S,#-6v_qӌ:*. ۵bMO= +dK^Qu[bL6g}&_0 +U{\w[8Yč*鑹/C3G!bu}3yےW3j_WH2u7T53@ TjȋMWj +ՏoBIRjַctqDNr\AȼevǙ {p\Ob^!%w;z2NrјNm{oİݛ'85S=6j%&rO^+B>rJ<5=G8EK'-L'7:̎u>[Y ȤSN,EydUjϨK+kfzqri-,./ch]dwoDrޭ0ðp}1S?s?Zm^"},蟻?U|ԝ?Kk<:jy>5u'%0dev?ճG$f>tMKaj?Y +HU\ ~Z}]>DEÇ+&ФgBXĚd-YRe.#>_;RZzô'gb!*h^ ji^~)Zz'@" e;ŒF~,#vENyaWzy&[=QrD:r'ѳ}sjLc@@Șw> +΃%8!zvifqcݓ!}wwv-˜"鐔8mDMӯژ%Uu&q֏3PRk0eKVr"\zP+nI +/ĻEW-%lߘ$[[:5(_k-_곘HM-OpפG5RК`:4?zO)@G/Sa># ~zI%1Xb-.YD DeKZ: +g^_RFfȂxQ?R33{}Q9~A#|kV(2WvGv +.lQyu(y|Z} wN*|8>/M,&ɒRK*DȼF_tY||13O'w>߈$MTIQhO{Q@ӗUB PZ{,FԘa]| <1 B|Bpv9r)J~#Ee8{^WeObOR욭)*̘]wn R*|&໵hoqf=ַh_~wTd6`\da3,p}zcYXKEk|mj bF!( z|:}\}h|4vv +]nr<{fXR+,+@JqU_G(WFO\P{ ֘CJJ +z^:!Chӟi%Tt6^J%M~E#㻏$9jvDTI8t~lx>Qк †k,4s,9ס=Eb:?ӊ/`’ 9|X8a b] RAõUEC:,Db~LAzfd]Nb IG{k͎:co=2E5w㢠hRRvKxI f `[8 ng 5.bGS(G-`%7 U7dOU3}GÂVЄܐ+ z殻M^j v򑓇׫>}*KPrP>,ҁ8}FV<}uhQ%9cn'{J^9*7f{Ł8F8Q9Sa8xɪZ۾Co69  r*SQh i)-#b;{`,2O3=1VM}XRGMh ȜQNCڥ ΙK/1?#q@@] Qz:cf&EW@ = +C8raehFKNfoÀgazK?e ct56A!A;E<}Bc:67dxfV 1Äj4wf޿F Cl!4"&L390"q|Z}@;__ϟ“w{VX>tGY. ШSD2}M4 ?/H40q8ėD '_]B)5Ϋն.' zqNbG'g]L5muPzW#2MM[P䀀B4@%jksmbH6jDSŻ_W.UGBՙa_mKJ0 z+}MYm l G|Y- 78Цm֠]8j.;VU 7YG*!J~ } ͵/fB]Qy?oakt6мY(-hDa>{N鶼4Gl@a)c |zK9yzmSҷ?QUݼWV-֤Lt:)hO3/J_{*I;*3mDFl 'E o ZϹQh`#xk! 0AgA30+e⳿4ԣ`A +u^z4z M ur* |HfLl x6_a +-< (n#lw<ב~1^>.>i㕞 f,ǩ@%7Ǹ 膈]z+:)Hn{h/8a84o7)کiD(X6|[EXXO0mg$Gi| u84xpBb|oTrp u/S~8bq' pKZz tk("I{z"خŦG! +TX̫a9$kׅ5o9*>\[)No1{gXv𾈐3VvxZ}n1Ǵ01ɨ~Bݶ:W؝yq׷Ru<MYH1TYgV.Yd[!Ȃ7;[uB||]Oosru[XKHWN4Xۻ񝽿.&&: ȢWKAcd~XsDg 12\s(ԨB5U/| +w-(:fzm^rvYZhFdTqkw.cq?gyթ}Z<0K0aN:"6U hƚ`JnJ9SbOWg"_%c*G >O[M n8,#ޖfsPlU^-Ua$tg:f٫1;ۡ% q\_+gBVf'RBZOyQ"zb!цŖpo)Ae/3ܞ!~d:>J.tg#ad%3dZչ̝aݮϨ, +E/vp+1%QtnTF9^)MEnTyi.k4ݩGF@EOކڷRN:ۗx|_IFNcEjJ l[u\e\; LThQļ}뉓o؀0<(G/{1TO6:pӄJvXo5CNɳQ ckL2]MhO p!g|5 +#J#V/6 a\Λ6D 0r˿]7W}twhfΪ9g౎BJEa;lDcLuw#sf| +2z{uE{#D]Ƙ Xd9C$Laþ ̓rzX2P*{.-7 5|co |Bn Hzwm1n` ǟ!вK!U]JYz-qWA%N_H{ge(Mw+R%z懈kJ̈M=dFFôq y h[^ն>er p!um4Y>"MPv rLPf7`옼z[-L]'AtTJy uX!G{,dɽfaUBYPdRs>G" yIǹO,L16qgwϝAhov*FĹ Wh +Oa_iOPYǘQKKpX +UHSAdҢ q_G +vPI=-^f#SwM~XRt6쥵 %wZBXF%lҧJ봼O2sSS,h5h?laz7<΄$xs.H 7]cHɱ;W'+\w^kd=~xWb6w~g׌ߣ=eŖBV"F þ/!lP[[jWFᅏЈ|Rqϟ;5@!ݫcѸ4/FVboNk/ wޗگhc'3 +kdv7F[hޓ endstream endobj -902 0 obj << +888 0 obj << /Type /FontDescriptor -/FontName /KHAZRF+NimbusRomNo9L-ReguItal +/FontName /XMZPGN+NimbusRomNo9L-ReguItal /Flags 4 /FontBBox [-169 -270 1010 924] /Ascent 668 @@ -4280,1954 +4334,1933 @@ /ItalicAngle -15 /StemV 78 /XHeight 441 -/CharSet (/D/E/F/G/I/L/M/N/O/P/R/S/U/W/a/b/c/comma/d/e/f/fl/g/h/i/j/k/l/m/n/o/one/p/r/s/seven/t/two/u/v/w/x/y/zero) -/FontFile 901 0 R +/CharSet (/A/D/F/G/I/L/M/N/O/P/R/U/W/a/b/c/comma/d/e/f/fl/g/h/i/j/k/l/m/n/o/one/p/r/s/t/two/u/v/w/x/y/zero) +/FontFile 887 0 R >> endobj -869 0 obj << +855 0 obj << /Type /Encoding -/Differences [2/fi/fl 33/exclam/quotedbl/numbersign 37/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright 95/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright 147/quotedblleft/quotedblright] +/Differences [1/dotaccent/fi/fl 33/exclam/quotedbl/numbersign 37/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright 95/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright 147/quotedblleft/quotedblright] >> endobj -443 0 obj << +444 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VPPZQH+CMMI10 -/FontDescriptor 880 0 R +/FontDescriptor 866 0 R /FirstChar 65 /LastChar 117 -/Widths 868 0 R +/Widths 854 0 R >> endobj -594 0 obj << +585 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GJOBMO+CMMI8 -/FontDescriptor 882 0 R +/FontDescriptor 868 0 R /FirstChar 109 /LastChar 110 -/Widths 866 0 R +/Widths 852 0 R >> endobj -444 0 obj << +445 0 obj << /Type /Font /Subtype /Type1 /BaseFont /CANSPV+CMR10 -/FontDescriptor 884 0 R +/FontDescriptor 870 0 R /FirstChar 43 /LastChar 53 -/Widths 867 0 R +/Widths 853 0 R >> endobj -205 0 obj << +197 0 obj << /Type /Font /Subtype /Type1 /BaseFont /NPUAAT+CMSY10 -/FontDescriptor 886 0 R +/FontDescriptor 872 0 R /FirstChar 0 /LastChar 15 -/Widths 876 0 R +/Widths 862 0 R >> endobj -279 0 obj << +266 0 obj << /Type /Font /Subtype /Type1 /BaseFont /AQKOUH+CMSY8 -/FontDescriptor 888 0 R +/FontDescriptor 874 0 R /FirstChar 13 /LastChar 13 -/Widths 874 0 R +/Widths 860 0 R >> endobj -288 0 obj << +275 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZUTHPM+LCIRCLE10 -/FontDescriptor 890 0 R +/FontDescriptor 876 0 R /FirstChar 4 /LastChar 7 -/Widths 873 0 R +/Widths 859 0 R >> endobj -290 0 obj << +277 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DWRYLS+NimbusMonL-Bold -/FontDescriptor 892 0 R +/FontDescriptor 878 0 R /FirstChar 35 /LastChar 121 -/Widths 872 0 R -/Encoding 869 0 R +/Widths 858 0 R +/Encoding 855 0 R >> endobj -291 0 obj << +278 0 obj << /Type /Font /Subtype /Type1 /BaseFont /THAVHJ+NimbusMonL-Regu -/FontDescriptor 894 0 R +/FontDescriptor 880 0 R /FirstChar 33 /LastChar 125 -/Widths 871 0 R -/Encoding 869 0 R +/Widths 857 0 R +/Encoding 855 0 R >> endobj -328 0 obj << +316 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /QWAKOH+NimbusMonL-ReguObli -/FontDescriptor 896 0 R +/BaseFont /PYTCNQ+NimbusMonL-ReguObli +/FontDescriptor 882 0 R /FirstChar 33 /LastChar 122 -/Widths 870 0 R -/Encoding 869 0 R +/Widths 856 0 R +/Encoding 855 0 R >> endobj -203 0 obj << +195 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FCIWLQ+NimbusRomNo9L-Medi -/FontDescriptor 898 0 R +/FontDescriptor 884 0 R /FirstChar 2 /LastChar 122 -/Widths 878 0 R -/Encoding 869 0 R +/Widths 864 0 R +/Encoding 855 0 R >> endobj -212 0 obj << +204 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /MMINTI+NimbusRomNo9L-Regu -/FontDescriptor 900 0 R -/FirstChar 2 +/BaseFont /OZCCIH+NimbusRomNo9L-Regu +/FontDescriptor 886 0 R +/FirstChar 1 /LastChar 148 -/Widths 875 0 R -/Encoding 869 0 R +/Widths 861 0 R +/Encoding 855 0 R >> endobj -204 0 obj << +196 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /KHAZRF+NimbusRomNo9L-ReguItal -/FontDescriptor 902 0 R +/BaseFont /XMZPGN+NimbusRomNo9L-ReguItal +/FontDescriptor 888 0 R /FirstChar 3 /LastChar 121 -/Widths 877 0 R -/Encoding 869 0 R +/Widths 863 0 R +/Encoding 855 0 R >> endobj -206 0 obj << +198 0 obj << /Type /Pages /Count 6 -/Parent 903 0 R -/Kids [198 0 R 208 0 R 214 0 R 248 0 R 271 0 R 277 0 R] +/Parent 889 0 R +/Kids [190 0 R 200 0 R 236 0 R 258 0 R 264 0 R 271 0 R] >> endobj -294 0 obj << +296 0 obj << /Type /Pages /Count 6 -/Parent 903 0 R -/Kids [284 0 R 298 0 R 312 0 R 341 0 R 366 0 R 375 0 R] +/Parent 889 0 R +/Kids [284 0 R 299 0 R 329 0 R 357 0 R 365 0 R 370 0 R] >> endobj -416 0 obj << +408 0 obj << /Type /Pages /Count 6 -/Parent 903 0 R -/Kids [394 0 R 419 0 R 436 0 R 449 0 R 454 0 R 459 0 R] +/Parent 889 0 R +/Kids [382 0 R 412 0 R 418 0 R 428 0 R 450 0 R 455 0 R] >> endobj 473 0 obj << /Type /Pages /Count 6 -/Parent 903 0 R -/Kids [464 0 R 476 0 R 485 0 R 498 0 R 513 0 R 527 0 R] +/Parent 889 0 R +/Kids [466 0 R 476 0 R 489 0 R 501 0 R 516 0 R 530 0 R] >> endobj -546 0 obj << +544 0 obj << /Type /Pages /Count 6 -/Parent 903 0 R -/Kids [539 0 R 549 0 R 556 0 R 563 0 R 591 0 R 600 0 R] +/Parent 889 0 R +/Kids [539 0 R 547 0 R 554 0 R 582 0 R 591 0 R 602 0 R] >> endobj -639 0 obj << +647 0 obj << /Type /Pages /Count 6 -/Parent 903 0 R -/Kids [611 0 R 642 0 R 664 0 R 694 0 R 702 0 R 707 0 R] +/Parent 889 0 R +/Kids [628 0 R 650 0 R 682 0 R 693 0 R 698 0 R 706 0 R] >> endobj -722 0 obj << +743 0 obj << /Type /Pages /Count 6 -/Parent 904 0 R -/Kids [712 0 R 725 0 R 734 0 R 762 0 R 776 0 R 800 0 R] +/Parent 890 0 R +/Kids [719 0 R 748 0 R 762 0 R 786 0 R 806 0 R 821 0 R] >> endobj -833 0 obj << +851 0 obj << /Type /Pages -/Count 3 -/Parent 904 0 R -/Kids [820 0 R 836 0 R 863 0 R] +/Count 1 +/Parent 890 0 R +/Kids [848 0 R] >> endobj -903 0 obj << +889 0 obj << /Type /Pages /Count 36 -/Parent 905 0 R -/Kids [206 0 R 294 0 R 416 0 R 473 0 R 546 0 R 639 0 R] +/Parent 891 0 R +/Kids [198 0 R 296 0 R 408 0 R 473 0 R 544 0 R 647 0 R] >> endobj -904 0 obj << +890 0 obj << /Type /Pages -/Count 9 -/Parent 905 0 R -/Kids [722 0 R 833 0 R] +/Count 7 +/Parent 891 0 R +/Kids [743 0 R 851 0 R] >> endobj -905 0 obj << +891 0 obj << /Type /Pages -/Count 45 -/Kids [903 0 R 904 0 R] +/Count 43 +/Kids [889 0 R 890 0 R] >> endobj -906 0 obj << +892 0 obj << /Type /Outlines -/First 7 0 R -/Last 159 0 R +/First 3 0 R +/Last 155 0 R /Count 33 >> endobj -195 0 obj << -/Title 196 0 R -/A 193 0 R -/Parent 159 0 R -/Prev 191 0 R ->> endobj -191 0 obj << -/Title 192 0 R -/A 189 0 R -/Parent 159 0 R -/Prev 187 0 R -/Next 195 0 R ->> endobj 187 0 obj << /Title 188 0 R /A 185 0 R -/Parent 159 0 R +/Parent 155 0 R /Prev 183 0 R -/Next 191 0 R >> endobj 183 0 obj << /Title 184 0 R /A 181 0 R -/Parent 159 0 R +/Parent 155 0 R /Prev 179 0 R /Next 187 0 R >> endobj 179 0 obj << /Title 180 0 R /A 177 0 R -/Parent 159 0 R -/Prev 163 0 R +/Parent 155 0 R +/Prev 175 0 R /Next 183 0 R >> endobj 175 0 obj << /Title 176 0 R /A 173 0 R -/Parent 163 0 R +/Parent 155 0 R /Prev 171 0 R +/Next 179 0 R >> endobj 171 0 obj << /Title 172 0 R /A 169 0 R -/Parent 163 0 R -/Prev 167 0 R +/Parent 155 0 R +/Prev 159 0 R /Next 175 0 R >> endobj 167 0 obj << /Title 168 0 R /A 165 0 R -/Parent 163 0 R -/Next 171 0 R +/Parent 159 0 R +/Prev 163 0 R >> endobj 163 0 obj << /Title 164 0 R /A 161 0 R /Parent 159 0 R -/Next 179 0 R -/First 167 0 R -/Last 175 0 R -/Count -3 +/Next 167 0 R >> endobj 159 0 obj << /Title 160 0 R /A 157 0 R -/Parent 906 0 R -/Prev 139 0 R +/Parent 155 0 R +/Next 171 0 R /First 163 0 R -/Last 195 0 R -/Count 6 +/Last 167 0 R +/Count -2 >> endobj 155 0 obj << /Title 156 0 R /A 153 0 R -/Parent 151 0 R +/Parent 892 0 R +/Prev 135 0 R +/First 159 0 R +/Last 187 0 R +/Count 6 >> endobj 151 0 obj << /Title 152 0 R /A 149 0 R -/Parent 139 0 R -/Prev 147 0 R -/First 155 0 R -/Last 155 0 R -/Count -1 +/Parent 147 0 R >> endobj 147 0 obj << /Title 148 0 R /A 145 0 R -/Parent 139 0 R +/Parent 135 0 R /Prev 143 0 R -/Next 151 0 R +/First 151 0 R +/Last 151 0 R +/Count -1 >> endobj 143 0 obj << /Title 144 0 R /A 141 0 R -/Parent 139 0 R +/Parent 135 0 R +/Prev 139 0 R /Next 147 0 R >> endobj 139 0 obj << /Title 140 0 R /A 137 0 R -/Parent 906 0 R -/Prev 127 0 R -/Next 159 0 R -/First 143 0 R -/Last 151 0 R -/Count 3 +/Parent 135 0 R +/Next 143 0 R >> endobj 135 0 obj << /Title 136 0 R /A 133 0 R -/Parent 127 0 R -/Prev 131 0 R +/Parent 892 0 R +/Prev 123 0 R +/Next 155 0 R +/First 139 0 R +/Last 147 0 R +/Count 3 >> endobj 131 0 obj << /Title 132 0 R /A 129 0 R -/Parent 127 0 R -/Next 135 0 R +/Parent 123 0 R +/Prev 127 0 R >> endobj 127 0 obj << /Title 128 0 R /A 125 0 R -/Parent 906 0 R -/Prev 115 0 R -/Next 139 0 R -/First 131 0 R -/Last 135 0 R -/Count 2 +/Parent 123 0 R +/Next 131 0 R >> endobj 123 0 obj << /Title 124 0 R /A 121 0 R -/Parent 115 0 R -/Prev 119 0 R +/Parent 892 0 R +/Prev 111 0 R +/Next 135 0 R +/First 127 0 R +/Last 131 0 R +/Count 2 >> endobj 119 0 obj << /Title 120 0 R /A 117 0 R -/Parent 115 0 R -/Next 123 0 R +/Parent 111 0 R +/Prev 115 0 R >> endobj 115 0 obj << /Title 116 0 R /A 113 0 R -/Parent 906 0 R -/Prev 51 0 R -/Next 127 0 R -/First 119 0 R -/Last 123 0 R -/Count 2 +/Parent 111 0 R +/Next 119 0 R >> endobj 111 0 obj << /Title 112 0 R /A 109 0 R -/Parent 99 0 R -/Prev 107 0 R +/Parent 892 0 R +/Prev 47 0 R +/Next 123 0 R +/First 115 0 R +/Last 119 0 R +/Count 2 >> endobj 107 0 obj << /Title 108 0 R /A 105 0 R -/Parent 99 0 R +/Parent 95 0 R /Prev 103 0 R -/Next 111 0 R >> endobj 103 0 obj << /Title 104 0 R /A 101 0 R -/Parent 99 0 R +/Parent 95 0 R +/Prev 99 0 R /Next 107 0 R >> endobj 99 0 obj << /Title 100 0 R /A 97 0 R -/Parent 51 0 R -/Prev 79 0 R -/First 103 0 R -/Last 111 0 R -/Count -3 +/Parent 95 0 R +/Next 103 0 R >> endobj 95 0 obj << /Title 96 0 R /A 93 0 R -/Parent 79 0 R -/Prev 91 0 R +/Parent 47 0 R +/Prev 75 0 R +/First 99 0 R +/Last 107 0 R +/Count -3 >> endobj 91 0 obj << /Title 92 0 R /A 89 0 R -/Parent 79 0 R +/Parent 75 0 R /Prev 87 0 R -/Next 95 0 R >> endobj 87 0 obj << /Title 88 0 R /A 85 0 R -/Parent 79 0 R +/Parent 75 0 R /Prev 83 0 R /Next 91 0 R >> endobj 83 0 obj << /Title 84 0 R /A 81 0 R -/Parent 79 0 R +/Parent 75 0 R +/Prev 79 0 R /Next 87 0 R >> endobj 79 0 obj << /Title 80 0 R /A 77 0 R -/Parent 51 0 R -/Prev 59 0 R -/Next 99 0 R -/First 83 0 R -/Last 95 0 R -/Count -4 +/Parent 75 0 R +/Next 83 0 R >> endobj 75 0 obj << /Title 76 0 R /A 73 0 R -/Parent 59 0 R -/Prev 71 0 R +/Parent 47 0 R +/Prev 55 0 R +/Next 95 0 R +/First 79 0 R +/Last 91 0 R +/Count -4 >> endobj 71 0 obj << /Title 72 0 R /A 69 0 R -/Parent 59 0 R +/Parent 55 0 R /Prev 67 0 R -/Next 75 0 R >> endobj 67 0 obj << /Title 68 0 R /A 65 0 R -/Parent 59 0 R +/Parent 55 0 R /Prev 63 0 R /Next 71 0 R >> endobj 63 0 obj << /Title 64 0 R /A 61 0 R -/Parent 59 0 R +/Parent 55 0 R +/Prev 59 0 R /Next 67 0 R >> endobj 59 0 obj << /Title 60 0 R /A 57 0 R -/Parent 51 0 R -/Prev 55 0 R -/Next 79 0 R -/First 63 0 R -/Last 75 0 R -/Count -4 +/Parent 55 0 R +/Next 63 0 R >> endobj 55 0 obj << /Title 56 0 R /A 53 0 R -/Parent 51 0 R -/Next 59 0 R +/Parent 47 0 R +/Prev 51 0 R +/Next 75 0 R +/First 59 0 R +/Last 71 0 R +/Count -4 >> endobj 51 0 obj << /Title 52 0 R /A 49 0 R -/Parent 906 0 R -/Prev 31 0 R -/Next 115 0 R -/First 55 0 R -/Last 99 0 R -/Count 4 +/Parent 47 0 R +/Next 55 0 R >> endobj 47 0 obj << /Title 48 0 R /A 45 0 R -/Parent 31 0 R -/Prev 43 0 R +/Parent 892 0 R +/Prev 27 0 R +/Next 111 0 R +/First 51 0 R +/Last 95 0 R +/Count 4 >> endobj 43 0 obj << /Title 44 0 R /A 41 0 R -/Parent 31 0 R +/Parent 27 0 R /Prev 39 0 R -/Next 47 0 R >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R -/Parent 31 0 R +/Parent 27 0 R /Prev 35 0 R /Next 43 0 R >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R -/Parent 31 0 R +/Parent 27 0 R +/Prev 31 0 R /Next 39 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R -/Parent 906 0 R -/Prev 11 0 R -/Next 51 0 R -/First 35 0 R -/Last 47 0 R -/Count 4 +/Parent 27 0 R +/Next 35 0 R >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R -/Parent 11 0 R -/Prev 23 0 R +/Parent 892 0 R +/Prev 7 0 R +/Next 47 0 R +/First 31 0 R +/Last 43 0 R +/Count 4 >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R -/Parent 11 0 R +/Parent 7 0 R /Prev 19 0 R -/Next 27 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R -/Parent 11 0 R +/Parent 7 0 R /Prev 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R -/Parent 11 0 R +/Parent 7 0 R +/Prev 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R -/Parent 906 0 R -/Prev 7 0 R -/Next 31 0 R -/First 15 0 R -/Last 27 0 R -/Count 4 +/Parent 7 0 R +/Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R -/Parent 906 0 R -/Next 11 0 R +/Parent 892 0 R +/Prev 3 0 R +/Next 27 0 R +/First 11 0 R +/Last 23 0 R +/Count 4 >> endobj -907 0 obj << -/Names [(Doc-Start) 202 0 R (Hfootnote.1) 280 0 R (Hfootnote.2) 433 0 R (Hfootnote.3) 524 0 R (Item.1) 318 0 R (Item.10) 607 0 R] +3 0 obj << +/Title 4 0 R +/A 1 0 R +/Parent 892 0 R +/Next 7 0 R +>> endobj +893 0 obj << +/Names [(Doc-Start) 194 0 R (Hfootnote.1) 267 0 R (Hfootnote.2) 425 0 R (Hfootnote.3) 513 0 R (Item.1) 305 0 R (Item.10) 598 0 R] /Limits [(Doc-Start) (Item.10)] >> endobj -908 0 obj << -/Names [(Item.11) 608 0 R (Item.12) 715 0 R (Item.13) 716 0 R (Item.14) 717 0 R (Item.15) 860 0 R (Item.16) 865 0 R] +894 0 obj << +/Names [(Item.11) 599 0 R (Item.12) 701 0 R (Item.13) 702 0 R (Item.14) 703 0 R (Item.15) 845 0 R (Item.16) 850 0 R] /Limits [(Item.11) (Item.16)] >> endobj -909 0 obj << -/Names [(Item.2) 319 0 R (Item.3) 509 0 R (Item.4) 516 0 R (Item.5) 517 0 R (Item.6) 603 0 R (Item.7) 604 0 R] +895 0 obj << +/Names [(Item.2) 306 0 R (Item.3) 506 0 R (Item.4) 507 0 R (Item.5) 508 0 R (Item.6) 594 0 R (Item.7) 595 0 R] /Limits [(Item.2) (Item.7)] >> endobj -910 0 obj << -/Names [(Item.8) 605 0 R (Item.9) 606 0 R (chapter*.1) 211 0 R (chapter*.2) 251 0 R (chapter.1) 6 0 R (chapter.2) 10 0 R] +896 0 obj << +/Names [(Item.8) 596 0 R (Item.9) 597 0 R (chapter*.1) 203 0 R (chapter*.2) 239 0 R (chapter.1) 2 0 R (chapter.2) 6 0 R] /Limits [(Item.8) (chapter.2)] >> endobj -911 0 obj << -/Names [(chapter.3) 30 0 R (chapter.4) 50 0 R (chapter.5) 114 0 R (chapter.6) 126 0 R (chapter.7) 138 0 R (chapter.8) 158 0 R] +897 0 obj << +/Names [(chapter.3) 26 0 R (chapter.4) 46 0 R (chapter.5) 110 0 R (chapter.6) 122 0 R (chapter.7) 134 0 R (chapter.8) 154 0 R] /Limits [(chapter.3) (chapter.8)] >> endobj -912 0 obj << -/Names [(figure.8.1) 758 0 R (figure.8.2) 773 0 R (lstlisting.2.-1) 287 0 R (lstlisting.2.-2) 292 0 R (lstlisting.2.-3) 301 0 R (lstlisting.2.-4) 306 0 R] +898 0 obj << +/Names [(figure.8.1) 744 0 R (figure.8.2) 759 0 R (lstlisting.2.-1) 274 0 R (lstlisting.2.-2) 279 0 R (lstlisting.2.-3) 287 0 R (lstlisting.2.-4) 292 0 R] /Limits [(figure.8.1) (lstlisting.2.-4)] >> endobj -913 0 obj << -/Names [(lstlisting.2.-5) 308 0 R (lstlisting.2.-6) 315 0 R (lstlisting.2.-7) 320 0 R (lstlisting.3.-10) 380 0 R (lstlisting.3.-11) 382 0 R (lstlisting.3.-12) 384 0 R] +899 0 obj << +/Names [(lstlisting.2.-5) 294 0 R (lstlisting.2.-6) 302 0 R (lstlisting.2.-7) 307 0 R (lstlisting.3.-10) 375 0 R (lstlisting.3.-11) 377 0 R (lstlisting.3.-12) 385 0 R] /Limits [(lstlisting.2.-5) (lstlisting.3.-12)] >> endobj -914 0 obj << -/Names [(lstlisting.3.-13) 386 0 R (lstlisting.3.-14) 388 0 R (lstlisting.3.-15) 397 0 R (lstlisting.3.-16) 412 0 R (lstlisting.3.-17) 414 0 R (lstlisting.3.-18) 422 0 R] +900 0 obj << +/Names [(lstlisting.3.-13) 387 0 R (lstlisting.3.-14) 389 0 R (lstlisting.3.-15) 391 0 R (lstlisting.3.-16) 406 0 R (lstlisting.3.-17) 421 0 R (lstlisting.3.-18) 423 0 R] /Limits [(lstlisting.3.-13) (lstlisting.3.-18)] >> endobj -915 0 obj << -/Names [(lstlisting.3.-19) 424 0 R (lstlisting.3.-20) 426 0 R (lstlisting.3.-21) 439 0 R (lstlisting.3.-22) 445 0 R (lstlisting.3.-8) 369 0 R (lstlisting.3.-9) 378 0 R] +901 0 obj << +/Names [(lstlisting.3.-19) 431 0 R (lstlisting.3.-20) 433 0 R (lstlisting.3.-21) 440 0 R (lstlisting.3.-22) 446 0 R (lstlisting.3.-8) 360 0 R (lstlisting.3.-9) 373 0 R] /Limits [(lstlisting.3.-19) (lstlisting.3.-9)] >> endobj -916 0 obj << -/Names [(lstlisting.4.-23) 467 0 R (lstlisting.4.-24) 469 0 R (lstlisting.4.-25) 471 0 R (lstlisting.4.-26) 479 0 R (lstlisting.4.-27) 481 0 R (lstlisting.4.-28) 488 0 R] +902 0 obj << +/Names [(lstlisting.4.-23) 458 0 R (lstlisting.4.-24) 460 0 R (lstlisting.4.-25) 462 0 R (lstlisting.4.-26) 469 0 R (lstlisting.4.-27) 471 0 R (lstlisting.4.-28) 479 0 R] /Limits [(lstlisting.4.-23) (lstlisting.4.-28)] >> endobj -917 0 obj << -/Names [(lstlisting.4.-29) 490 0 R (lstlisting.4.-30) 492 0 R (lstlisting.4.-31) 494 0 R (lstlisting.4.-32) 501 0 R (lstlisting.4.-33) 503 0 R (lstlisting.4.-34) 505 0 R] +903 0 obj << +/Names [(lstlisting.4.-29) 481 0 R (lstlisting.4.-30) 483 0 R (lstlisting.4.-31) 485 0 R (lstlisting.4.-32) 492 0 R (lstlisting.4.-33) 494 0 R (lstlisting.4.-34) 496 0 R] /Limits [(lstlisting.4.-29) (lstlisting.4.-34)] >> endobj -918 0 obj << -/Names [(lstlisting.4.-35) 507 0 R (lstlisting.4.-36) 518 0 R (lstlisting.4.-37) 520 0 R (lstlisting.4.-38) 522 0 R (lstlisting.4.-39) 530 0 R (lstlisting.4.-40) 534 0 R] +904 0 obj << +/Names [(lstlisting.4.-35) 504 0 R (lstlisting.4.-36) 509 0 R (lstlisting.4.-37) 511 0 R (lstlisting.4.-38) 519 0 R (lstlisting.4.-39) 521 0 R (lstlisting.4.-40) 525 0 R] /Limits [(lstlisting.4.-35) (lstlisting.4.-40)] >> endobj -919 0 obj << -/Names [(lstlisting.5.-41) 542 0 R (lstlisting.5.-42) 544 0 R (lstlisting.5.-43) 552 0 R (lstlisting.6.-44) 559 0 R (lstlisting.6.-45) 566 0 R (lstlisting.6.-46) 580 0 R] +905 0 obj << +/Names [(lstlisting.5.-41) 533 0 R (lstlisting.5.-42) 535 0 R (lstlisting.5.-43) 542 0 R (lstlisting.6.-44) 550 0 R (lstlisting.6.-45) 557 0 R (lstlisting.6.-46) 571 0 R] /Limits [(lstlisting.5.-41) (lstlisting.6.-46)] >> endobj -920 0 obj << -/Names [(lstlisting.6.-47) 582 0 R (lstlisting.6.-48) 595 0 R (lstlisting.7.-49) 614 0 R (lstlisting.7.-50) 621 0 R (lstlisting.7.-51) 623 0 R (lstlisting.7.-52) 635 0 R] +906 0 obj << +/Names [(lstlisting.6.-47) 573 0 R (lstlisting.6.-48) 586 0 R (lstlisting.7.-49) 605 0 R (lstlisting.7.-50) 612 0 R (lstlisting.7.-51) 614 0 R (lstlisting.7.-52) 631 0 R] /Limits [(lstlisting.6.-47) (lstlisting.7.-52)] >> endobj -921 0 obj << -/Names [(lstlisting.7.-53) 650 0 R (lstlisting.7.-54) 652 0 R (lstlisting.7.-55) 654 0 R (lstlisting.7.-56) 688 0 R (lstlisting.7.-57) 690 0 R (lstlisting.7.-58) 697 0 R] +907 0 obj << +/Names [(lstlisting.7.-53) 640 0 R (lstlisting.7.-54) 642 0 R (lstlisting.7.-55) 644 0 R (lstlisting.7.-56) 679 0 R (lstlisting.7.-57) 686 0 R (lstlisting.7.-58) 688 0 R] /Limits [(lstlisting.7.-53) (lstlisting.7.-58)] >> endobj -922 0 obj << -/Names [(lstlisting.8.-59) 718 0 R (lstlisting.8.-60) 720 0 R (lstlisting.8.-61) 728 0 R (lstlisting.8.-62) 737 0 R (lstlisting.8.-63) 779 0 R (lstlisting.8.-64) 781 0 R] +908 0 obj << +/Names [(lstlisting.8.-59) 709 0 R (lstlisting.8.-60) 711 0 R (lstlisting.8.-61) 713 0 R (lstlisting.8.-62) 722 0 R (lstlisting.8.-63) 765 0 R (lstlisting.8.-64) 767 0 R] /Limits [(lstlisting.8.-59) (lstlisting.8.-64)] >> endobj -923 0 obj << -/Names [(lstlisting.8.-65) 784 0 R (lstlisting.8.-66) 765 0 R (lstlisting.8.-67) 767 0 R (lstlisting.8.-68) 769 0 R (lstlisting.8.-69) 771 0 R (lstlisting.8.-70) 786 0 R] +909 0 obj << +/Names [(lstlisting.8.-65) 770 0 R (lstlisting.8.-66) 751 0 R (lstlisting.8.-67) 753 0 R (lstlisting.8.-68) 755 0 R (lstlisting.8.-69) 757 0 R (lstlisting.8.-70) 772 0 R] /Limits [(lstlisting.8.-65) (lstlisting.8.-70)] >> endobj -924 0 obj << -/Names [(lstlisting.8.-71) 789 0 R (lstlisting.8.-72) 791 0 R (lstlisting.8.-73) 794 0 R (lstlisting.8.-74) 803 0 R (lstlisting.8.-75) 806 0 R (lstlisting.8.-76) 814 0 R] +910 0 obj << +/Names [(lstlisting.8.-71) 775 0 R (lstlisting.8.-72) 777 0 R (lstlisting.8.-73) 780 0 R (lstlisting.8.-74) 789 0 R (lstlisting.8.-75) 792 0 R (lstlisting.8.-76) 800 0 R] /Limits [(lstlisting.8.-71) (lstlisting.8.-76)] >> endobj -925 0 obj << -/Names [(lstlisting.8.-77) 823 0 R (lstlisting.8.-78) 825 0 R (lstlisting.8.-79) 827 0 R (lstlisting.8.-80) 829 0 R (lstlisting.8.-81) 831 0 R (lstlisting.8.-82) 839 0 R] +911 0 obj << +/Names [(lstlisting.8.-77) 809 0 R (lstlisting.8.-78) 811 0 R (lstlisting.8.-79) 813 0 R (lstlisting.8.-80) 815 0 R (lstlisting.8.-81) 817 0 R (lstlisting.8.-82) 824 0 R] /Limits [(lstlisting.8.-77) (lstlisting.8.-82)] >> endobj -926 0 obj << -/Names [(lstlisting.8.-83) 843 0 R (lstlisting.8.-84) 855 0 R (lstnumber.-1.1) 289 0 R (lstnumber.-10.1) 381 0 R (lstnumber.-11.1) 383 0 R (lstnumber.-12.1) 385 0 R] +912 0 obj << +/Names [(lstlisting.8.-83) 828 0 R (lstlisting.8.-84) 840 0 R (lstnumber.-1.1) 276 0 R (lstnumber.-10.1) 376 0 R (lstnumber.-11.1) 378 0 R (lstnumber.-12.1) 386 0 R] /Limits [(lstlisting.8.-83) (lstnumber.-12.1)] >> endobj -927 0 obj << -/Names [(lstnumber.-13.1) 387 0 R (lstnumber.-14.1) 389 0 R (lstnumber.-15.1) 398 0 R (lstnumber.-15.10) 407 0 R (lstnumber.-15.11) 408 0 R (lstnumber.-15.12) 409 0 R] +913 0 obj << +/Names [(lstnumber.-13.1) 388 0 R (lstnumber.-14.1) 390 0 R (lstnumber.-15.1) 392 0 R (lstnumber.-15.10) 401 0 R (lstnumber.-15.11) 402 0 R (lstnumber.-15.12) 403 0 R] /Limits [(lstnumber.-13.1) (lstnumber.-15.12)] >> endobj -928 0 obj << -/Names [(lstnumber.-15.13) 410 0 R (lstnumber.-15.14) 411 0 R (lstnumber.-15.2) 399 0 R (lstnumber.-15.3) 400 0 R (lstnumber.-15.4) 401 0 R (lstnumber.-15.5) 402 0 R] +914 0 obj << +/Names [(lstnumber.-15.13) 404 0 R (lstnumber.-15.14) 405 0 R (lstnumber.-15.2) 393 0 R (lstnumber.-15.3) 394 0 R (lstnumber.-15.4) 395 0 R (lstnumber.-15.5) 396 0 R] /Limits [(lstnumber.-15.13) (lstnumber.-15.5)] >> endobj -929 0 obj << -/Names [(lstnumber.-15.6) 403 0 R (lstnumber.-15.7) 404 0 R (lstnumber.-15.8) 405 0 R (lstnumber.-15.9) 406 0 R (lstnumber.-16.1) 413 0 R (lstnumber.-17.1) 415 0 R] +915 0 obj << +/Names [(lstnumber.-15.6) 397 0 R (lstnumber.-15.7) 398 0 R (lstnumber.-15.8) 399 0 R (lstnumber.-15.9) 400 0 R (lstnumber.-16.1) 407 0 R (lstnumber.-17.1) 422 0 R] /Limits [(lstnumber.-15.6) (lstnumber.-17.1)] >> endobj -930 0 obj << -/Names [(lstnumber.-18.1) 423 0 R (lstnumber.-19.1) 425 0 R (lstnumber.-2.1) 293 0 R (lstnumber.-20.1) 427 0 R (lstnumber.-20.2) 428 0 R (lstnumber.-20.3) 429 0 R] +916 0 obj << +/Names [(lstnumber.-18.1) 424 0 R (lstnumber.-19.1) 432 0 R (lstnumber.-2.1) 280 0 R (lstnumber.-20.1) 434 0 R (lstnumber.-20.2) 435 0 R (lstnumber.-20.3) 436 0 R] /Limits [(lstnumber.-18.1) (lstnumber.-20.3)] >> endobj -931 0 obj << -/Names [(lstnumber.-20.4) 430 0 R (lstnumber.-20.5) 431 0 R (lstnumber.-20.6) 432 0 R (lstnumber.-21.1) 440 0 R (lstnumber.-21.2) 441 0 R (lstnumber.-21.3) 442 0 R] +917 0 obj << +/Names [(lstnumber.-20.4) 437 0 R (lstnumber.-20.5) 438 0 R (lstnumber.-20.6) 439 0 R (lstnumber.-21.1) 441 0 R (lstnumber.-21.2) 442 0 R (lstnumber.-21.3) 443 0 R] /Limits [(lstnumber.-20.4) (lstnumber.-21.3)] >> endobj -932 0 obj << -/Names [(lstnumber.-22.1) 446 0 R (lstnumber.-23.1) 468 0 R (lstnumber.-24.1) 470 0 R (lstnumber.-25.1) 472 0 R (lstnumber.-26.1) 480 0 R (lstnumber.-27.1) 482 0 R] +918 0 obj << +/Names [(lstnumber.-22.1) 447 0 R (lstnumber.-23.1) 459 0 R (lstnumber.-24.1) 461 0 R (lstnumber.-25.1) 463 0 R (lstnumber.-26.1) 470 0 R (lstnumber.-27.1) 472 0 R] /Limits [(lstnumber.-22.1) (lstnumber.-27.1)] >> endobj -933 0 obj << -/Names [(lstnumber.-28.1) 489 0 R (lstnumber.-29.1) 491 0 R (lstnumber.-3.1) 302 0 R (lstnumber.-3.2) 303 0 R (lstnumber.-3.3) 304 0 R (lstnumber.-3.4) 305 0 R] +919 0 obj << +/Names [(lstnumber.-28.1) 480 0 R (lstnumber.-29.1) 482 0 R (lstnumber.-3.1) 288 0 R (lstnumber.-3.2) 289 0 R (lstnumber.-3.3) 290 0 R (lstnumber.-3.4) 291 0 R] /Limits [(lstnumber.-28.1) (lstnumber.-3.4)] >> endobj -934 0 obj << -/Names [(lstnumber.-30.1) 493 0 R (lstnumber.-31.1) 495 0 R (lstnumber.-32.1) 502 0 R (lstnumber.-33.1) 504 0 R (lstnumber.-34.1) 506 0 R (lstnumber.-35.1) 508 0 R] +920 0 obj << +/Names [(lstnumber.-30.1) 484 0 R (lstnumber.-31.1) 486 0 R (lstnumber.-32.1) 493 0 R (lstnumber.-33.1) 495 0 R (lstnumber.-34.1) 497 0 R (lstnumber.-35.1) 505 0 R] /Limits [(lstnumber.-30.1) (lstnumber.-35.1)] >> endobj -935 0 obj << -/Names [(lstnumber.-36.1) 519 0 R (lstnumber.-37.1) 521 0 R (lstnumber.-38.1) 523 0 R (lstnumber.-39.1) 531 0 R (lstnumber.-39.2) 532 0 R (lstnumber.-39.3) 533 0 R] +921 0 obj << +/Names [(lstnumber.-36.1) 510 0 R (lstnumber.-37.1) 512 0 R (lstnumber.-38.1) 520 0 R (lstnumber.-39.1) 522 0 R (lstnumber.-39.2) 523 0 R (lstnumber.-39.3) 524 0 R] /Limits [(lstnumber.-36.1) (lstnumber.-39.3)] >> endobj -936 0 obj << -/Names [(lstnumber.-4.1) 307 0 R (lstnumber.-40.1) 535 0 R (lstnumber.-40.2) 536 0 R (lstnumber.-41.1) 543 0 R (lstnumber.-42.1) 545 0 R (lstnumber.-43.1) 553 0 R] +922 0 obj << +/Names [(lstnumber.-4.1) 293 0 R (lstnumber.-40.1) 526 0 R (lstnumber.-40.2) 527 0 R (lstnumber.-41.1) 534 0 R (lstnumber.-42.1) 536 0 R (lstnumber.-43.1) 543 0 R] /Limits [(lstnumber.-4.1) (lstnumber.-43.1)] >> endobj -937 0 obj << -/Names [(lstnumber.-44.1) 560 0 R (lstnumber.-45.1) 567 0 R (lstnumber.-45.10) 576 0 R (lstnumber.-45.11) 577 0 R (lstnumber.-45.12) 578 0 R (lstnumber.-45.13) 579 0 R] +923 0 obj << +/Names [(lstnumber.-44.1) 551 0 R (lstnumber.-45.1) 558 0 R (lstnumber.-45.10) 567 0 R (lstnumber.-45.11) 568 0 R (lstnumber.-45.12) 569 0 R (lstnumber.-45.13) 570 0 R] /Limits [(lstnumber.-44.1) (lstnumber.-45.13)] >> endobj -938 0 obj << -/Names [(lstnumber.-45.2) 568 0 R (lstnumber.-45.3) 569 0 R (lstnumber.-45.4) 570 0 R (lstnumber.-45.5) 571 0 R (lstnumber.-45.6) 572 0 R (lstnumber.-45.7) 573 0 R] +924 0 obj << +/Names [(lstnumber.-45.2) 559 0 R (lstnumber.-45.3) 560 0 R (lstnumber.-45.4) 561 0 R (lstnumber.-45.5) 562 0 R (lstnumber.-45.6) 563 0 R (lstnumber.-45.7) 564 0 R] /Limits [(lstnumber.-45.2) (lstnumber.-45.7)] >> endobj -939 0 obj << -/Names [(lstnumber.-45.8) 574 0 R (lstnumber.-45.9) 575 0 R (lstnumber.-46.1) 581 0 R (lstnumber.-47.1) 583 0 R (lstnumber.-47.2) 584 0 R (lstnumber.-47.3) 585 0 R] +925 0 obj << +/Names [(lstnumber.-45.8) 565 0 R (lstnumber.-45.9) 566 0 R (lstnumber.-46.1) 572 0 R (lstnumber.-47.1) 574 0 R (lstnumber.-47.2) 575 0 R (lstnumber.-47.3) 576 0 R] /Limits [(lstnumber.-45.8) (lstnumber.-47.3)] >> endobj -940 0 obj << -/Names [(lstnumber.-47.4) 586 0 R (lstnumber.-47.5) 587 0 R (lstnumber.-47.6) 588 0 R (lstnumber.-48.1) 596 0 R (lstnumber.-49.1) 615 0 R (lstnumber.-49.2) 616 0 R] +926 0 obj << +/Names [(lstnumber.-47.4) 577 0 R (lstnumber.-47.5) 578 0 R (lstnumber.-47.6) 579 0 R (lstnumber.-48.1) 587 0 R (lstnumber.-49.1) 606 0 R (lstnumber.-49.2) 607 0 R] /Limits [(lstnumber.-47.4) (lstnumber.-49.2)] >> endobj -941 0 obj << -/Names [(lstnumber.-49.3) 617 0 R (lstnumber.-49.4) 618 0 R (lstnumber.-49.5) 619 0 R (lstnumber.-49.6) 620 0 R (lstnumber.-5.1) 309 0 R (lstnumber.-50.1) 622 0 R] +927 0 obj << +/Names [(lstnumber.-49.3) 608 0 R (lstnumber.-49.4) 609 0 R (lstnumber.-49.5) 610 0 R (lstnumber.-49.6) 611 0 R (lstnumber.-5.1) 295 0 R (lstnumber.-50.1) 613 0 R] /Limits [(lstnumber.-49.3) (lstnumber.-50.1)] >> endobj -942 0 obj << -/Names [(lstnumber.-51.1) 624 0 R (lstnumber.-51.10) 633 0 R (lstnumber.-51.11) 634 0 R (lstnumber.-51.2) 625 0 R (lstnumber.-51.3) 626 0 R (lstnumber.-51.4) 627 0 R] +928 0 obj << +/Names [(lstnumber.-51.1) 615 0 R (lstnumber.-51.10) 624 0 R (lstnumber.-51.11) 625 0 R (lstnumber.-51.2) 616 0 R (lstnumber.-51.3) 617 0 R (lstnumber.-51.4) 618 0 R] /Limits [(lstnumber.-51.1) (lstnumber.-51.4)] >> endobj -943 0 obj << -/Names [(lstnumber.-51.5) 628 0 R (lstnumber.-51.6) 629 0 R (lstnumber.-51.7) 630 0 R (lstnumber.-51.8) 631 0 R (lstnumber.-51.9) 632 0 R (lstnumber.-52.1) 636 0 R] +929 0 obj << +/Names [(lstnumber.-51.5) 619 0 R (lstnumber.-51.6) 620 0 R (lstnumber.-51.7) 621 0 R (lstnumber.-51.8) 622 0 R (lstnumber.-51.9) 623 0 R (lstnumber.-52.1) 632 0 R] /Limits [(lstnumber.-51.5) (lstnumber.-52.1)] >> endobj -944 0 obj << -/Names [(lstnumber.-52.2) 637 0 R (lstnumber.-52.3) 638 0 R (lstnumber.-52.4) 645 0 R (lstnumber.-52.5) 646 0 R (lstnumber.-52.6) 647 0 R (lstnumber.-52.7) 648 0 R] +930 0 obj << +/Names [(lstnumber.-52.2) 633 0 R (lstnumber.-52.3) 634 0 R (lstnumber.-52.4) 635 0 R (lstnumber.-52.5) 636 0 R (lstnumber.-52.6) 637 0 R (lstnumber.-52.7) 638 0 R] /Limits [(lstnumber.-52.2) (lstnumber.-52.7)] >> endobj -945 0 obj << -/Names [(lstnumber.-52.8) 649 0 R (lstnumber.-53.1) 651 0 R (lstnumber.-54.1) 653 0 R (lstnumber.-55.1) 655 0 R (lstnumber.-55.10) 669 0 R (lstnumber.-55.11) 670 0 R] +931 0 obj << +/Names [(lstnumber.-52.8) 639 0 R (lstnumber.-53.1) 641 0 R (lstnumber.-54.1) 643 0 R (lstnumber.-55.1) 645 0 R (lstnumber.-55.10) 660 0 R (lstnumber.-55.11) 661 0 R] /Limits [(lstnumber.-52.8) (lstnumber.-55.11)] >> endobj -946 0 obj << -/Names [(lstnumber.-55.12) 671 0 R (lstnumber.-55.13) 672 0 R (lstnumber.-55.14) 673 0 R (lstnumber.-55.15) 674 0 R (lstnumber.-55.16) 675 0 R (lstnumber.-55.17) 676 0 R] +932 0 obj << +/Names [(lstnumber.-55.12) 662 0 R (lstnumber.-55.13) 663 0 R (lstnumber.-55.14) 664 0 R (lstnumber.-55.15) 665 0 R (lstnumber.-55.16) 666 0 R (lstnumber.-55.17) 667 0 R] /Limits [(lstnumber.-55.12) (lstnumber.-55.17)] >> endobj -947 0 obj << -/Names [(lstnumber.-55.18) 677 0 R (lstnumber.-55.19) 678 0 R (lstnumber.-55.2) 656 0 R (lstnumber.-55.20) 679 0 R (lstnumber.-55.21) 680 0 R (lstnumber.-55.22) 681 0 R] +933 0 obj << +/Names [(lstnumber.-55.18) 668 0 R (lstnumber.-55.19) 669 0 R (lstnumber.-55.2) 646 0 R (lstnumber.-55.20) 670 0 R (lstnumber.-55.21) 671 0 R (lstnumber.-55.22) 672 0 R] /Limits [(lstnumber.-55.18) (lstnumber.-55.22)] >> endobj -948 0 obj << -/Names [(lstnumber.-55.23) 682 0 R (lstnumber.-55.24) 683 0 R (lstnumber.-55.25) 684 0 R (lstnumber.-55.26) 685 0 R (lstnumber.-55.27) 686 0 R (lstnumber.-55.28) 687 0 R] +934 0 obj << +/Names [(lstnumber.-55.23) 673 0 R (lstnumber.-55.24) 674 0 R (lstnumber.-55.25) 675 0 R (lstnumber.-55.26) 676 0 R (lstnumber.-55.27) 677 0 R (lstnumber.-55.28) 678 0 R] /Limits [(lstnumber.-55.23) (lstnumber.-55.28)] >> endobj -949 0 obj << -/Names [(lstnumber.-55.3) 657 0 R (lstnumber.-55.4) 658 0 R (lstnumber.-55.5) 659 0 R (lstnumber.-55.6) 660 0 R (lstnumber.-55.7) 661 0 R (lstnumber.-55.8) 667 0 R] +935 0 obj << +/Names [(lstnumber.-55.3) 653 0 R (lstnumber.-55.4) 654 0 R (lstnumber.-55.5) 655 0 R (lstnumber.-55.6) 656 0 R (lstnumber.-55.7) 657 0 R (lstnumber.-55.8) 658 0 R] /Limits [(lstnumber.-55.3) (lstnumber.-55.8)] >> endobj -950 0 obj << -/Names [(lstnumber.-55.9) 668 0 R (lstnumber.-56.1) 689 0 R (lstnumber.-57.1) 691 0 R (lstnumber.-58.1) 698 0 R (lstnumber.-58.2) 699 0 R (lstnumber.-59.1) 719 0 R] +936 0 obj << +/Names [(lstnumber.-55.9) 659 0 R (lstnumber.-56.1) 685 0 R (lstnumber.-57.1) 687 0 R (lstnumber.-58.1) 689 0 R (lstnumber.-58.2) 690 0 R (lstnumber.-59.1) 710 0 R] /Limits [(lstnumber.-55.9) (lstnumber.-59.1)] >> endobj -951 0 obj << -/Names [(lstnumber.-6.1) 316 0 R (lstnumber.-6.2) 317 0 R (lstnumber.-60.1) 721 0 R (lstnumber.-61.1) 729 0 R (lstnumber.-62.1) 738 0 R (lstnumber.-62.10) 747 0 R] +937 0 obj << +/Names [(lstnumber.-6.1) 303 0 R (lstnumber.-6.2) 304 0 R (lstnumber.-60.1) 712 0 R (lstnumber.-61.1) 714 0 R (lstnumber.-62.1) 723 0 R (lstnumber.-62.10) 732 0 R] /Limits [(lstnumber.-6.1) (lstnumber.-62.10)] >> endobj -952 0 obj << -/Names [(lstnumber.-62.11) 748 0 R (lstnumber.-62.12) 749 0 R (lstnumber.-62.13) 750 0 R (lstnumber.-62.14) 751 0 R (lstnumber.-62.15) 752 0 R (lstnumber.-62.16) 753 0 R] +938 0 obj << +/Names [(lstnumber.-62.11) 733 0 R (lstnumber.-62.12) 734 0 R (lstnumber.-62.13) 735 0 R (lstnumber.-62.14) 736 0 R (lstnumber.-62.15) 737 0 R (lstnumber.-62.16) 738 0 R] /Limits [(lstnumber.-62.11) (lstnumber.-62.16)] >> endobj -953 0 obj << -/Names [(lstnumber.-62.17) 754 0 R (lstnumber.-62.18) 755 0 R (lstnumber.-62.19) 756 0 R (lstnumber.-62.2) 739 0 R (lstnumber.-62.20) 757 0 R (lstnumber.-62.3) 740 0 R] +939 0 obj << +/Names [(lstnumber.-62.17) 739 0 R (lstnumber.-62.18) 740 0 R (lstnumber.-62.19) 741 0 R (lstnumber.-62.2) 724 0 R (lstnumber.-62.20) 742 0 R (lstnumber.-62.3) 725 0 R] /Limits [(lstnumber.-62.17) (lstnumber.-62.3)] >> endobj -954 0 obj << -/Names [(lstnumber.-62.4) 741 0 R (lstnumber.-62.5) 742 0 R (lstnumber.-62.6) 743 0 R (lstnumber.-62.7) 744 0 R (lstnumber.-62.8) 745 0 R (lstnumber.-62.9) 746 0 R] +940 0 obj << +/Names [(lstnumber.-62.4) 726 0 R (lstnumber.-62.5) 727 0 R (lstnumber.-62.6) 728 0 R (lstnumber.-62.7) 729 0 R (lstnumber.-62.8) 730 0 R (lstnumber.-62.9) 731 0 R] /Limits [(lstnumber.-62.4) (lstnumber.-62.9)] >> endobj -955 0 obj << -/Names [(lstnumber.-63.1) 780 0 R (lstnumber.-64.1) 782 0 R (lstnumber.-64.2) 783 0 R (lstnumber.-65.1) 785 0 R (lstnumber.-66.1) 766 0 R (lstnumber.-67.1) 768 0 R] +941 0 obj << +/Names [(lstnumber.-63.1) 766 0 R (lstnumber.-64.1) 768 0 R (lstnumber.-64.2) 769 0 R (lstnumber.-65.1) 771 0 R (lstnumber.-66.1) 752 0 R (lstnumber.-67.1) 754 0 R] /Limits [(lstnumber.-63.1) (lstnumber.-67.1)] >> endobj -956 0 obj << -/Names [(lstnumber.-68.1) 770 0 R (lstnumber.-69.1) 772 0 R (lstnumber.-7.1) 321 0 R (lstnumber.-7.10) 331 0 R (lstnumber.-7.11) 332 0 R (lstnumber.-7.12) 333 0 R] +942 0 obj << +/Names [(lstnumber.-68.1) 756 0 R (lstnumber.-69.1) 758 0 R (lstnumber.-7.1) 308 0 R (lstnumber.-7.10) 318 0 R (lstnumber.-7.11) 319 0 R (lstnumber.-7.12) 320 0 R] /Limits [(lstnumber.-68.1) (lstnumber.-7.12)] >> endobj -957 0 obj << -/Names [(lstnumber.-7.13) 334 0 R (lstnumber.-7.14) 335 0 R (lstnumber.-7.15) 336 0 R (lstnumber.-7.16) 337 0 R (lstnumber.-7.17) 338 0 R (lstnumber.-7.18) 344 0 R] +943 0 obj << +/Names [(lstnumber.-7.13) 321 0 R (lstnumber.-7.14) 322 0 R (lstnumber.-7.15) 323 0 R (lstnumber.-7.16) 324 0 R (lstnumber.-7.17) 325 0 R (lstnumber.-7.18) 326 0 R] /Limits [(lstnumber.-7.13) (lstnumber.-7.18)] >> endobj -958 0 obj << -/Names [(lstnumber.-7.19) 345 0 R (lstnumber.-7.2) 322 0 R (lstnumber.-7.20) 346 0 R (lstnumber.-7.21) 347 0 R (lstnumber.-7.22) 348 0 R (lstnumber.-7.23) 349 0 R] +944 0 obj << +/Names [(lstnumber.-7.19) 332 0 R (lstnumber.-7.2) 309 0 R (lstnumber.-7.20) 333 0 R (lstnumber.-7.21) 334 0 R (lstnumber.-7.22) 335 0 R (lstnumber.-7.23) 336 0 R] /Limits [(lstnumber.-7.19) (lstnumber.-7.23)] >> endobj -959 0 obj << -/Names [(lstnumber.-7.24) 350 0 R (lstnumber.-7.25) 351 0 R (lstnumber.-7.26) 352 0 R (lstnumber.-7.27) 353 0 R (lstnumber.-7.28) 354 0 R (lstnumber.-7.29) 355 0 R] +945 0 obj << +/Names [(lstnumber.-7.24) 337 0 R (lstnumber.-7.25) 338 0 R (lstnumber.-7.26) 339 0 R (lstnumber.-7.27) 340 0 R (lstnumber.-7.28) 341 0 R (lstnumber.-7.29) 342 0 R] /Limits [(lstnumber.-7.24) (lstnumber.-7.29)] >> endobj -960 0 obj << -/Names [(lstnumber.-7.3) 323 0 R (lstnumber.-7.30) 356 0 R (lstnumber.-7.31) 357 0 R (lstnumber.-7.32) 358 0 R (lstnumber.-7.33) 359 0 R (lstnumber.-7.34) 360 0 R] +946 0 obj << +/Names [(lstnumber.-7.3) 310 0 R (lstnumber.-7.30) 343 0 R (lstnumber.-7.31) 344 0 R (lstnumber.-7.32) 345 0 R (lstnumber.-7.33) 346 0 R (lstnumber.-7.34) 347 0 R] /Limits [(lstnumber.-7.3) (lstnumber.-7.34)] >> endobj +947 0 obj << +/Names [(lstnumber.-7.35) 348 0 R (lstnumber.-7.36) 349 0 R (lstnumber.-7.37) 350 0 R (lstnumber.-7.38) 351 0 R (lstnumber.-7.39) 352 0 R (lstnumber.-7.4) 311 0 R] +/Limits [(lstnumber.-7.35) (lstnumber.-7.4)] +>> endobj +948 0 obj << +/Names [(lstnumber.-7.40) 353 0 R (lstnumber.-7.5) 312 0 R (lstnumber.-7.6) 313 0 R (lstnumber.-7.7) 314 0 R (lstnumber.-7.8) 315 0 R (lstnumber.-7.9) 317 0 R] +/Limits [(lstnumber.-7.40) (lstnumber.-7.9)] +>> endobj +949 0 obj << +/Names [(lstnumber.-70.1) 773 0 R (lstnumber.-70.2) 774 0 R (lstnumber.-71.1) 776 0 R (lstnumber.-72.1) 778 0 R (lstnumber.-72.2) 779 0 R (lstnumber.-73.1) 781 0 R] +/Limits [(lstnumber.-70.1) (lstnumber.-73.1)] +>> endobj +950 0 obj << +/Names [(lstnumber.-73.2) 782 0 R (lstnumber.-73.3) 783 0 R (lstnumber.-74.1) 790 0 R (lstnumber.-74.2) 791 0 R (lstnumber.-75.1) 793 0 R (lstnumber.-75.2) 794 0 R] +/Limits [(lstnumber.-73.2) (lstnumber.-75.2)] +>> endobj +951 0 obj << +/Names [(lstnumber.-75.3) 795 0 R (lstnumber.-75.4) 796 0 R (lstnumber.-75.5) 797 0 R (lstnumber.-75.6) 798 0 R (lstnumber.-75.7) 799 0 R (lstnumber.-76.1) 801 0 R] +/Limits [(lstnumber.-75.3) (lstnumber.-76.1)] +>> endobj +952 0 obj << +/Names [(lstnumber.-76.2) 802 0 R (lstnumber.-76.3) 803 0 R (lstnumber.-77.1) 810 0 R (lstnumber.-78.1) 812 0 R (lstnumber.-79.1) 814 0 R (lstnumber.-8.1) 361 0 R] +/Limits [(lstnumber.-76.2) (lstnumber.-8.1)] +>> endobj +953 0 obj << +/Names [(lstnumber.-80.1) 816 0 R (lstnumber.-81.1) 818 0 R (lstnumber.-82.1) 825 0 R (lstnumber.-82.2) 826 0 R (lstnumber.-82.3) 827 0 R (lstnumber.-83.1) 829 0 R] +/Limits [(lstnumber.-80.1) (lstnumber.-83.1)] +>> endobj +954 0 obj << +/Names [(lstnumber.-83.10) 838 0 R (lstnumber.-83.11) 839 0 R (lstnumber.-83.2) 830 0 R (lstnumber.-83.3) 831 0 R (lstnumber.-83.4) 832 0 R (lstnumber.-83.5) 833 0 R] +/Limits [(lstnumber.-83.10) (lstnumber.-83.5)] +>> endobj +955 0 obj << +/Names [(lstnumber.-83.6) 834 0 R (lstnumber.-83.7) 835 0 R (lstnumber.-83.8) 836 0 R (lstnumber.-83.9) 837 0 R (lstnumber.-84.1) 841 0 R (lstnumber.-84.2) 842 0 R] +/Limits [(lstnumber.-83.6) (lstnumber.-84.2)] +>> endobj +956 0 obj << +/Names [(lstnumber.-84.3) 843 0 R (lstnumber.-84.4) 844 0 R (lstnumber.-9.1) 374 0 R (page.1) 193 0 R (page.10) 414 0 R (page.11) 420 0 R] +/Limits [(lstnumber.-84.3) (page.11)] +>> endobj +957 0 obj << +/Names [(page.12) 430 0 R (page.13) 452 0 R (page.14) 457 0 R (page.15) 468 0 R (page.16) 478 0 R (page.17) 491 0 R] +/Limits [(page.12) (page.17)] +>> endobj +958 0 obj << +/Names [(page.18) 503 0 R (page.19) 518 0 R (page.2) 273 0 R (page.20) 532 0 R (page.21) 541 0 R (page.22) 549 0 R] +/Limits [(page.18) (page.22)] +>> endobj +959 0 obj << +/Names [(page.23) 556 0 R (page.24) 584 0 R (page.25) 593 0 R (page.26) 604 0 R (page.27) 630 0 R (page.28) 652 0 R] +/Limits [(page.23) (page.28)] +>> endobj +960 0 obj << +/Names [(page.29) 684 0 R (page.3) 286 0 R (page.30) 695 0 R (page.31) 700 0 R (page.32) 708 0 R (page.33) 721 0 R] +/Limits [(page.29) (page.33)] +>> endobj 961 0 obj << -/Names [(lstnumber.-7.35) 361 0 R (lstnumber.-7.36) 362 0 R (lstnumber.-7.4) 324 0 R (lstnumber.-7.5) 325 0 R (lstnumber.-7.6) 326 0 R (lstnumber.-7.7) 327 0 R] -/Limits [(lstnumber.-7.35) (lstnumber.-7.7)] +/Names [(page.34) 750 0 R (page.35) 764 0 R (page.36) 788 0 R (page.37) 808 0 R (page.38) 823 0 R (page.39) 268 0 R] +/Limits [(page.34) (page.39)] >> endobj 962 0 obj << -/Names [(lstnumber.-7.8) 329 0 R (lstnumber.-7.9) 330 0 R (lstnumber.-70.1) 787 0 R (lstnumber.-70.2) 788 0 R (lstnumber.-71.1) 790 0 R (lstnumber.-72.1) 792 0 R] -/Limits [(lstnumber.-7.8) (lstnumber.-72.1)] +/Names [(page.4) 301 0 R (page.5) 331 0 R (page.6) 359 0 R (page.7) 367 0 R (page.8) 372 0 R (page.9) 384 0 R] +/Limits [(page.4) (page.9)] >> endobj 963 0 obj << -/Names [(lstnumber.-72.2) 793 0 R (lstnumber.-73.1) 795 0 R (lstnumber.-73.2) 796 0 R (lstnumber.-73.3) 797 0 R (lstnumber.-74.1) 804 0 R (lstnumber.-74.2) 805 0 R] -/Limits [(lstnumber.-72.2) (lstnumber.-74.2)] +/Names [(page.i) 202 0 R (page.ii) 238 0 R (page.iii) 260 0 R (section.2.1) 10 0 R (section.2.2) 14 0 R (section.2.3) 18 0 R] +/Limits [(page.i) (section.2.3)] >> endobj 964 0 obj << -/Names [(lstnumber.-75.1) 807 0 R (lstnumber.-75.2) 808 0 R (lstnumber.-75.3) 809 0 R (lstnumber.-75.4) 810 0 R (lstnumber.-75.5) 811 0 R (lstnumber.-75.6) 812 0 R] -/Limits [(lstnumber.-75.1) (lstnumber.-75.6)] +/Names [(section.2.4) 22 0 R (section.3.1) 30 0 R (section.3.2) 34 0 R (section.3.3) 38 0 R (section.3.4) 42 0 R (section.4.1) 50 0 R] +/Limits [(section.2.4) (section.4.1)] >> endobj 965 0 obj << -/Names [(lstnumber.-75.7) 813 0 R (lstnumber.-76.1) 815 0 R (lstnumber.-76.2) 816 0 R (lstnumber.-76.3) 817 0 R (lstnumber.-77.1) 824 0 R (lstnumber.-78.1) 826 0 R] -/Limits [(lstnumber.-75.7) (lstnumber.-78.1)] +/Names [(section.4.2) 54 0 R (section.4.3) 74 0 R (section.4.4) 94 0 R (section.5.1) 114 0 R (section.5.2) 118 0 R (section.6.1) 126 0 R] +/Limits [(section.4.2) (section.6.1)] >> endobj 966 0 obj << -/Names [(lstnumber.-79.1) 828 0 R (lstnumber.-8.1) 370 0 R (lstnumber.-80.1) 830 0 R (lstnumber.-81.1) 832 0 R (lstnumber.-82.1) 840 0 R (lstnumber.-82.2) 841 0 R] -/Limits [(lstnumber.-79.1) (lstnumber.-82.2)] +/Names [(section.6.2) 130 0 R (section.7.1) 138 0 R (section.7.2) 142 0 R (section.7.3) 146 0 R (section.8.1) 158 0 R (section.8.2) 170 0 R] +/Limits [(section.6.2) (section.8.2)] >> endobj 967 0 obj << -/Names [(lstnumber.-82.3) 842 0 R (lstnumber.-83.1) 844 0 R (lstnumber.-83.10) 853 0 R (lstnumber.-83.11) 854 0 R (lstnumber.-83.2) 845 0 R (lstnumber.-83.3) 846 0 R] -/Limits [(lstnumber.-82.3) (lstnumber.-83.3)] +/Names [(section.8.3) 174 0 R (section.8.4) 178 0 R (section.8.5) 182 0 R (section.8.6) 186 0 R (subsection.4.2.1) 58 0 R (subsection.4.2.2) 62 0 R] +/Limits [(section.8.3) (subsection.4.2.2)] >> endobj 968 0 obj << -/Names [(lstnumber.-83.4) 847 0 R (lstnumber.-83.5) 848 0 R (lstnumber.-83.6) 849 0 R (lstnumber.-83.7) 850 0 R (lstnumber.-83.8) 851 0 R (lstnumber.-83.9) 852 0 R] -/Limits [(lstnumber.-83.4) (lstnumber.-83.9)] +/Names [(subsection.4.2.3) 66 0 R (subsection.4.2.4) 70 0 R (subsection.4.3.1) 78 0 R (subsection.4.3.2) 82 0 R (subsection.4.3.3) 86 0 R (subsection.4.3.4) 90 0 R] +/Limits [(subsection.4.2.3) (subsection.4.3.4)] >> endobj 969 0 obj << -/Names [(lstnumber.-84.1) 856 0 R (lstnumber.-84.2) 857 0 R (lstnumber.-84.3) 858 0 R (lstnumber.-84.4) 859 0 R (lstnumber.-9.1) 379 0 R (page.1) 201 0 R] -/Limits [(lstnumber.-84.1) (page.1)] +/Names [(subsection.4.4.1) 98 0 R (subsection.4.4.2) 102 0 R (subsection.4.4.3) 106 0 R (subsection.7.3.1) 150 0 R (subsection.8.1.1) 162 0 R (subsection.8.1.2) 166 0 R] +/Limits [(subsection.4.4.1) (subsection.8.1.2)] >> endobj 970 0 obj << -/Names [(page.10) 438 0 R (page.11) 451 0 R (page.12) 456 0 R (page.13) 461 0 R (page.14) 466 0 R (page.15) 478 0 R] -/Limits [(page.10) (page.15)] +/Names [(table.3.1) 362 0 R (table.3.2) 409 0 R] +/Limits [(table.3.1) (table.3.2)] >> endobj 971 0 obj << -/Names [(page.16) 487 0 R (page.17) 500 0 R (page.18) 515 0 R (page.19) 529 0 R (page.2) 286 0 R (page.20) 541 0 R] -/Limits [(page.16) (page.20)] +/Kids [893 0 R 894 0 R 895 0 R 896 0 R 897 0 R 898 0 R] +/Limits [(Doc-Start) (lstlisting.2.-4)] >> endobj 972 0 obj << -/Names [(page.21) 551 0 R (page.22) 558 0 R (page.23) 565 0 R (page.24) 593 0 R (page.25) 602 0 R (page.26) 613 0 R] -/Limits [(page.21) (page.26)] +/Kids [899 0 R 900 0 R 901 0 R 902 0 R 903 0 R 904 0 R] +/Limits [(lstlisting.2.-5) (lstlisting.4.-40)] >> endobj 973 0 obj << -/Names [(page.27) 644 0 R (page.28) 666 0 R (page.29) 696 0 R (page.3) 300 0 R (page.30) 704 0 R (page.31) 709 0 R] -/Limits [(page.27) (page.31)] +/Kids [905 0 R 906 0 R 907 0 R 908 0 R 909 0 R 910 0 R] +/Limits [(lstlisting.5.-41) (lstlisting.8.-76)] >> endobj 974 0 obj << -/Names [(page.32) 714 0 R (page.33) 727 0 R (page.34) 736 0 R (page.35) 764 0 R (page.36) 778 0 R (page.37) 802 0 R] -/Limits [(page.32) (page.37)] +/Kids [911 0 R 912 0 R 913 0 R 914 0 R 915 0 R 916 0 R] +/Limits [(lstlisting.8.-77) (lstnumber.-20.3)] >> endobj 975 0 obj << -/Names [(page.38) 822 0 R (page.39) 838 0 R (page.4) 314 0 R (page.40) 281 0 R (page.5) 343 0 R (page.6) 368 0 R] -/Limits [(page.38) (page.6)] +/Kids [917 0 R 918 0 R 919 0 R 920 0 R 921 0 R 922 0 R] +/Limits [(lstnumber.-20.4) (lstnumber.-43.1)] >> endobj 976 0 obj << -/Names [(page.7) 377 0 R (page.8) 396 0 R (page.9) 421 0 R (page.i) 210 0 R (page.ii) 216 0 R (page.iii) 250 0 R] -/Limits [(page.7) (page.iii)] +/Kids [923 0 R 924 0 R 925 0 R 926 0 R 927 0 R 928 0 R] +/Limits [(lstnumber.-44.1) (lstnumber.-51.4)] >> endobj 977 0 obj << -/Names [(page.iv) 273 0 R (section.2.1) 14 0 R (section.2.2) 18 0 R (section.2.3) 22 0 R (section.2.4) 26 0 R (section.3.1) 34 0 R] -/Limits [(page.iv) (section.3.1)] +/Kids [929 0 R 930 0 R 931 0 R 932 0 R 933 0 R 934 0 R] +/Limits [(lstnumber.-51.5) (lstnumber.-55.28)] >> endobj 978 0 obj << -/Names [(section.3.2) 38 0 R (section.3.3) 42 0 R (section.3.4) 46 0 R (section.4.1) 54 0 R (section.4.2) 58 0 R (section.4.3) 78 0 R] -/Limits [(section.3.2) (section.4.3)] +/Kids [935 0 R 936 0 R 937 0 R 938 0 R 939 0 R 940 0 R] +/Limits [(lstnumber.-55.3) (lstnumber.-62.9)] >> endobj 979 0 obj << -/Names [(section.4.4) 98 0 R (section.5.1) 118 0 R (section.5.2) 122 0 R (section.6.1) 130 0 R (section.6.2) 134 0 R (section.7.1) 142 0 R] -/Limits [(section.4.4) (section.7.1)] +/Kids [941 0 R 942 0 R 943 0 R 944 0 R 945 0 R 946 0 R] +/Limits [(lstnumber.-63.1) (lstnumber.-7.34)] >> endobj 980 0 obj << -/Names [(section.7.2) 146 0 R (section.7.3) 150 0 R (section.8.1) 162 0 R (section.8.2) 178 0 R (section.8.3) 182 0 R (section.8.4) 186 0 R] -/Limits [(section.7.2) (section.8.4)] +/Kids [947 0 R 948 0 R 949 0 R 950 0 R 951 0 R 952 0 R] +/Limits [(lstnumber.-7.35) (lstnumber.-8.1)] >> endobj 981 0 obj << -/Names [(section.8.5) 190 0 R (section.8.6) 194 0 R (subsection.4.2.1) 62 0 R (subsection.4.2.2) 66 0 R (subsection.4.2.3) 70 0 R (subsection.4.2.4) 74 0 R] -/Limits [(section.8.5) (subsection.4.2.4)] +/Kids [953 0 R 954 0 R 955 0 R 956 0 R 957 0 R 958 0 R] +/Limits [(lstnumber.-80.1) (page.22)] >> endobj 982 0 obj << -/Names [(subsection.4.3.1) 82 0 R (subsection.4.3.2) 86 0 R (subsection.4.3.3) 90 0 R (subsection.4.3.4) 94 0 R (subsection.4.4.1) 102 0 R (subsection.4.4.2) 106 0 R] -/Limits [(subsection.4.3.1) (subsection.4.4.2)] +/Kids [959 0 R 960 0 R 961 0 R 962 0 R 963 0 R 964 0 R] +/Limits [(page.23) (section.4.1)] >> endobj 983 0 obj << -/Names [(subsection.4.4.3) 110 0 R (subsection.7.3.1) 154 0 R (subsection.8.1.1) 166 0 R (subsection.8.1.2) 170 0 R (subsection.8.1.3) 174 0 R (table.3.1) 371 0 R] -/Limits [(subsection.4.4.3) (table.3.1)] +/Kids [965 0 R 966 0 R 967 0 R 968 0 R 969 0 R 970 0 R] +/Limits [(section.4.2) (table.3.2)] >> endobj 984 0 obj << -/Names [(table.3.2) 390 0 R] -/Limits [(table.3.2) (table.3.2)] +/Kids [971 0 R 972 0 R 973 0 R 974 0 R 975 0 R 976 0 R] +/Limits [(Doc-Start) (lstnumber.-51.4)] >> endobj 985 0 obj << -/Kids [907 0 R 908 0 R 909 0 R 910 0 R 911 0 R 912 0 R] -/Limits [(Doc-Start) (lstlisting.2.-4)] +/Kids [977 0 R 978 0 R 979 0 R 980 0 R 981 0 R 982 0 R] +/Limits [(lstnumber.-51.5) (section.4.1)] >> endobj 986 0 obj << -/Kids [913 0 R 914 0 R 915 0 R 916 0 R 917 0 R 918 0 R] -/Limits [(lstlisting.2.-5) (lstlisting.4.-40)] +/Kids [983 0 R] +/Limits [(section.4.2) (table.3.2)] >> endobj 987 0 obj << -/Kids [919 0 R 920 0 R 921 0 R 922 0 R 923 0 R 924 0 R] -/Limits [(lstlisting.5.-41) (lstlisting.8.-76)] +/Kids [984 0 R 985 0 R 986 0 R] +/Limits [(Doc-Start) (table.3.2)] >> endobj 988 0 obj << -/Kids [925 0 R 926 0 R 927 0 R 928 0 R 929 0 R 930 0 R] -/Limits [(lstlisting.8.-77) (lstnumber.-20.3)] +/Dests 987 0 R >> endobj 989 0 obj << -/Kids [931 0 R 932 0 R 933 0 R 934 0 R 935 0 R 936 0 R] -/Limits [(lstnumber.-20.4) (lstnumber.-43.1)] +/Type /Catalog +/Pages 891 0 R +/Outlines 892 0 R +/Names 988 0 R +/PageMode/UseOutlines/PageLabels<>1<>4<>]>> +/OpenAction 189 0 R >> endobj 990 0 obj << -/Kids [937 0 R 938 0 R 939 0 R 940 0 R 941 0 R 942 0 R] -/Limits [(lstnumber.-44.1) (lstnumber.-51.4)] ->> endobj -991 0 obj << -/Kids [943 0 R 944 0 R 945 0 R 946 0 R 947 0 R 948 0 R] -/Limits [(lstnumber.-51.5) (lstnumber.-55.28)] ->> endobj -992 0 obj << -/Kids [949 0 R 950 0 R 951 0 R 952 0 R 953 0 R 954 0 R] -/Limits [(lstnumber.-55.3) (lstnumber.-62.9)] ->> endobj -993 0 obj << -/Kids [955 0 R 956 0 R 957 0 R 958 0 R 959 0 R 960 0 R] -/Limits [(lstnumber.-63.1) (lstnumber.-7.34)] ->> endobj -994 0 obj << -/Kids [961 0 R 962 0 R 963 0 R 964 0 R 965 0 R 966 0 R] -/Limits [(lstnumber.-7.35) (lstnumber.-82.2)] ->> endobj -995 0 obj << -/Kids [967 0 R 968 0 R 969 0 R 970 0 R 971 0 R 972 0 R] -/Limits [(lstnumber.-82.3) (page.26)] ->> endobj -996 0 obj << -/Kids [973 0 R 974 0 R 975 0 R 976 0 R 977 0 R 978 0 R] -/Limits [(page.27) (section.4.3)] ->> endobj -997 0 obj << -/Kids [979 0 R 980 0 R 981 0 R 982 0 R 983 0 R 984 0 R] -/Limits [(section.4.4) (table.3.2)] ->> endobj -998 0 obj << -/Kids [985 0 R 986 0 R 987 0 R 988 0 R 989 0 R 990 0 R] -/Limits [(Doc-Start) (lstnumber.-51.4)] ->> endobj -999 0 obj << -/Kids [991 0 R 992 0 R 993 0 R 994 0 R 995 0 R 996 0 R] -/Limits [(lstnumber.-51.5) (section.4.3)] ->> endobj -1000 0 obj << -/Kids [997 0 R] -/Limits [(section.4.4) (table.3.2)] ->> endobj -1001 0 obj << -/Kids [998 0 R 999 0 R 1000 0 R] -/Limits [(Doc-Start) (table.3.2)] ->> endobj -1002 0 obj << -/Dests 1001 0 R ->> endobj -1003 0 obj << -/Type /Catalog -/Pages 905 0 R -/Outlines 906 0 R -/Names 1002 0 R -/PageMode/UseOutlines/PageLabels << /Nums [0 << /S /D >> 1 << /S /r >> 5 << /S /D >> ] >> -/OpenAction 197 0 R ->> endobj -1004 0 obj << -/Author(Marcus Geelnard)/Title(GLFW Users Guide)/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.3)/Keywords(GLFW,OpenGL,guide,manual) -/CreationDate (D:20070901203041+02'00') -/ModDate (D:20070901203041+02'00') +/Author(Marcus Geelnard)/Title(GLFW Users Guide)/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.10)/Keywords(GLFW,OpenGL,guide,manual) +/CreationDate (D:20110812142101+02'00') +/ModDate (D:20110812142101+02'00') /Trapped /False -/PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) +/PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj xref -0 1005 -0000000001 65535 f -0000000002 00000 f -0000000003 00000 f -0000000004 00000 f -0000000000 00000 f +0 991 +0000000000 65535 f 0000000015 00000 n -0000019316 00000 n -0000261498 00000 n +0000018385 00000 n +0000289303 00000 n 0000000060 00000 n 0000000092 00000 n -0000021708 00000 n -0000261376 00000 n +0000020700 00000 n +0000289183 00000 n 0000000137 00000 n -0000000173 00000 n -0000021757 00000 n -0000261302 00000 n -0000000221 00000 n -0000000261 00000 n -0000022004 00000 n -0000261215 00000 n -0000000309 00000 n -0000000356 00000 n -0000025586 00000 n -0000261128 00000 n -0000000404 00000 n -0000000447 00000 n -0000029259 00000 n -0000261054 00000 n -0000000495 00000 n -0000000565 00000 n -0000035747 00000 n -0000260930 00000 n -0000000611 00000 n -0000000649 00000 n -0000035796 00000 n -0000260856 00000 n -0000000697 00000 n -0000000745 00000 n -0000039422 00000 n -0000260769 00000 n -0000000793 00000 n -0000000841 00000 n -0000043675 00000 n -0000260682 00000 n -0000000889 00000 n -0000000927 00000 n -0000047453 00000 n -0000260608 00000 n -0000000975 00000 n -0000001018 00000 n -0000056414 00000 n -0000260483 00000 n -0000001064 00000 n -0000001099 00000 n -0000056463 00000 n -0000260409 00000 n -0000001147 00000 n -0000001183 00000 n -0000056512 00000 n -0000260285 00000 n -0000001231 00000 n -0000001268 00000 n -0000059704 00000 n -0000260211 00000 n -0000001321 00000 n -0000001355 00000 n -0000062715 00000 n -0000260124 00000 n -0000001408 00000 n -0000001448 00000 n -0000062863 00000 n -0000260037 00000 n -0000001501 00000 n -0000001536 00000 n -0000063012 00000 n -0000259963 00000 n -0000001589 00000 n -0000001633 00000 n -0000065767 00000 n -0000259839 00000 n -0000001681 00000 n -0000001715 00000 n -0000065816 00000 n -0000259765 00000 n -0000001768 00000 n -0000001807 00000 n -0000066064 00000 n -0000259678 00000 n -0000001860 00000 n -0000001898 00000 n -0000068885 00000 n -0000259591 00000 n -0000001951 00000 n -0000001987 00000 n -0000069133 00000 n -0000259517 00000 n -0000002040 00000 n -0000002088 00000 n -0000072510 00000 n -0000259403 00000 n -0000002136 00000 n -0000002174 00000 n -0000072559 00000 n -0000259325 00000 n -0000002228 00000 n -0000002275 00000 n -0000072709 00000 n -0000259233 00000 n -0000002329 00000 n -0000002372 00000 n -0000075651 00000 n -0000259155 00000 n -0000002426 00000 n -0000002468 00000 n -0000078174 00000 n -0000259025 00000 n -0000002515 00000 n -0000002543 00000 n -0000078224 00000 n -0000258946 00000 n -0000002592 00000 n -0000002637 00000 n -0000078473 00000 n -0000258867 00000 n -0000002686 00000 n -0000002715 00000 n -0000082652 00000 n -0000258736 00000 n -0000002762 00000 n -0000002808 00000 n -0000082702 00000 n -0000258657 00000 n -0000002857 00000 n -0000002896 00000 n -0000086941 00000 n -0000258578 00000 n -0000002945 00000 n -0000002982 00000 n -0000091397 00000 n -0000258447 00000 n -0000003029 00000 n -0000003075 00000 n -0000091745 00000 n -0000258368 00000 n -0000003124 00000 n -0000003166 00000 n -0000095158 00000 n -0000258275 00000 n -0000003215 00000 n -0000003252 00000 n -0000099704 00000 n -0000258157 00000 n -0000003301 00000 n -0000003351 00000 n -0000104754 00000 n -0000258092 00000 n -0000003405 00000 n -0000003464 00000 n -0000108954 00000 n -0000257975 00000 n -0000003511 00000 n -0000003548 00000 n -0000109004 00000 n -0000257857 00000 n -0000003597 00000 n -0000003645 00000 n -0000111605 00000 n -0000257778 00000 n -0000003699 00000 n -0000003766 00000 n -0000111655 00000 n -0000257685 00000 n -0000003820 00000 n -0000003871 00000 n -0000111705 00000 n -0000257606 00000 n -0000003925 00000 n -0000003980 00000 n -0000114496 00000 n -0000257513 00000 n -0000004029 00000 n -0000004079 00000 n -0000114696 00000 n -0000257420 00000 n -0000004128 00000 n -0000004168 00000 n -0000121723 00000 n -0000257327 00000 n -0000004217 00000 n -0000004273 00000 n -0000131718 00000 n -0000257234 00000 n -0000004322 00000 n -0000004394 00000 n -0000140399 00000 n -0000257155 00000 n -0000004443 00000 n -0000004511 00000 n -0000004943 00000 n -0000005162 00000 n -0000004564 00000 n -0000005062 00000 n -0000005112 00000 n -0000255371 00000 n -0000255717 00000 n -0000254426 00000 n -0000255894 00000 n -0000006176 00000 n -0000005957 00000 n -0000005260 00000 n -0000006076 00000 n -0000006126 00000 n -0000255544 00000 n -0000006821 00000 n -0000006652 00000 n -0000006274 00000 n -0000006771 00000 n -0000008347 00000 n -0000008497 00000 n -0000008646 00000 n -0000008799 00000 n -0000008952 00000 n -0000009104 00000 n -0000009257 00000 n -0000009407 00000 n -0000009560 00000 n -0000009713 00000 n -0000009861 00000 n -0000010013 00000 n -0000010163 00000 n -0000010316 00000 n +0000000172 00000 n +0000020748 00000 n +0000289111 00000 n +0000000219 00000 n +0000000259 00000 n +0000020996 00000 n +0000289025 00000 n +0000000307 00000 n +0000000354 00000 n +0000024692 00000 n +0000288939 00000 n +0000000402 00000 n +0000000445 00000 n +0000028344 00000 n +0000288866 00000 n +0000000493 00000 n +0000000563 00000 n +0000035187 00000 n +0000288743 00000 n +0000000609 00000 n +0000000647 00000 n +0000035236 00000 n +0000288669 00000 n +0000000695 00000 n +0000000743 00000 n +0000041372 00000 n +0000288582 00000 n +0000000791 00000 n +0000000839 00000 n +0000051808 00000 n +0000288495 00000 n +0000000887 00000 n +0000000925 00000 n +0000052057 00000 n +0000288421 00000 n +0000000973 00000 n +0000001016 00000 n +0000057694 00000 n +0000288296 00000 n +0000001062 00000 n +0000001097 00000 n +0000057743 00000 n +0000288222 00000 n +0000001145 00000 n +0000001181 00000 n +0000057792 00000 n +0000288098 00000 n +0000001229 00000 n +0000001266 00000 n +0000060962 00000 n +0000288024 00000 n +0000001319 00000 n +0000001353 00000 n +0000063951 00000 n +0000287937 00000 n +0000001406 00000 n +0000001446 00000 n +0000064100 00000 n +0000287850 00000 n +0000001499 00000 n +0000001534 00000 n +0000064248 00000 n +0000287776 00000 n +0000001587 00000 n +0000001631 00000 n +0000067058 00000 n +0000287652 00000 n +0000001679 00000 n +0000001713 00000 n +0000067106 00000 n +0000287578 00000 n +0000001766 00000 n +0000001805 00000 n +0000067355 00000 n +0000287491 00000 n +0000001858 00000 n +0000001896 00000 n +0000070298 00000 n +0000287404 00000 n +0000001949 00000 n +0000001985 00000 n +0000073457 00000 n +0000287330 00000 n +0000002038 00000 n +0000002086 00000 n +0000073855 00000 n +0000287218 00000 n +0000002134 00000 n +0000002171 00000 n +0000073904 00000 n +0000287142 00000 n +0000002224 00000 n +0000002271 00000 n +0000077008 00000 n +0000287051 00000 n +0000002325 00000 n +0000002368 00000 n +0000077357 00000 n +0000286973 00000 n +0000002422 00000 n +0000002464 00000 n +0000079855 00000 n +0000286843 00000 n +0000002511 00000 n +0000002539 00000 n +0000079905 00000 n +0000286764 00000 n +0000002588 00000 n +0000002633 00000 n +0000080154 00000 n +0000286685 00000 n +0000002682 00000 n +0000002711 00000 n +0000084505 00000 n +0000286554 00000 n +0000002758 00000 n +0000002804 00000 n +0000084555 00000 n +0000286475 00000 n +0000002853 00000 n +0000002892 00000 n +0000088693 00000 n +0000286396 00000 n +0000002941 00000 n +0000002978 00000 n +0000093090 00000 n +0000286265 00000 n +0000003025 00000 n +0000003071 00000 n +0000096398 00000 n +0000286186 00000 n +0000003120 00000 n +0000003162 00000 n +0000096798 00000 n +0000286093 00000 n +0000003211 00000 n +0000003248 00000 n +0000101439 00000 n +0000285975 00000 n +0000003297 00000 n +0000003347 00000 n +0000106271 00000 n +0000285910 00000 n +0000003401 00000 n +0000003460 00000 n +0000111041 00000 n +0000285793 00000 n +0000003507 00000 n +0000003544 00000 n +0000111091 00000 n +0000285675 00000 n +0000003593 00000 n +0000003641 00000 n +0000111141 00000 n +0000285596 00000 n +0000003695 00000 n +0000003746 00000 n +0000113644 00000 n +0000285517 00000 n +0000003800 00000 n +0000003855 00000 n +0000113694 00000 n +0000285424 00000 n +0000003904 00000 n +0000003954 00000 n +0000116758 00000 n +0000285331 00000 n +0000004003 00000 n +0000004043 00000 n +0000121688 00000 n +0000285238 00000 n +0000004092 00000 n +0000004148 00000 n +0000131624 00000 n +0000285145 00000 n +0000004197 00000 n +0000004269 00000 n +0000140203 00000 n +0000285066 00000 n +0000004318 00000 n +0000004386 00000 n +0000004855 00000 n +0000005074 00000 n +0000004439 00000 n +0000004974 00000 n +0000005024 00000 n +0000283298 00000 n +0000283644 00000 n +0000282353 00000 n +0000283821 00000 n +0000006160 00000 n +0000005941 00000 n +0000005172 00000 n +0000006060 00000 n +0000006110 00000 n +0000283471 00000 n +0000007711 00000 n +0000007861 00000 n +0000008010 00000 n +0000008163 00000 n +0000008316 00000 n +0000008468 00000 n +0000008621 00000 n +0000008771 00000 n +0000008924 00000 n +0000009077 00000 n +0000009225 00000 n +0000009377 00000 n +0000009527 00000 n +0000009680 00000 n +0000009833 00000 n +0000009992 00000 n +0000010151 00000 n +0000010310 00000 n 0000010469 00000 n -0000010628 00000 n -0000010787 00000 n -0000010946 00000 n -0000011105 00000 n -0000011258 00000 n -0000011417 00000 n -0000011574 00000 n -0000011733 00000 n -0000011892 00000 n -0000012045 00000 n -0000012204 00000 n -0000012363 00000 n -0000012522 00000 n -0000012672 00000 n -0000014210 00000 n -0000012924 00000 n -0000007984 00000 n -0000006893 00000 n -0000012825 00000 n -0000012875 00000 n -0000014363 00000 n -0000014513 00000 n -0000014666 00000 n -0000014819 00000 n -0000014969 00000 n -0000015122 00000 n -0000015275 00000 n -0000015428 00000 n -0000015587 00000 n -0000015736 00000 n -0000015889 00000 n -0000016048 00000 n -0000016207 00000 n -0000016366 00000 n -0000016518 00000 n -0000016669 00000 n -0000016822 00000 n -0000016975 00000 n -0000017177 00000 n -0000013927 00000 n -0000013009 00000 n -0000017127 00000 n -0000019163 00000 n -0000019014 00000 n -0000019414 00000 n -0000018867 00000 n -0000017262 00000 n -0000254568 00000 n -0000019364 00000 n -0000141616 00000 n -0000021509 00000 n -0000022053 00000 n -0000021370 00000 n -0000019538 00000 n -0000021658 00000 n -0000021806 00000 n -0000254710 00000 n -0000021856 00000 n -0000254854 00000 n -0000255025 00000 n -0000021906 00000 n -0000021956 00000 n -0000256011 00000 n -0000025036 00000 n -0000024887 00000 n -0000025735 00000 n -0000024740 00000 n -0000022202 00000 n -0000025187 00000 n -0000025237 00000 n -0000025287 00000 n -0000025336 00000 n -0000025386 00000 n -0000025436 00000 n -0000025486 00000 n -0000025536 00000 n -0000025635 00000 n -0000025685 00000 n -0000028810 00000 n -0000030205 00000 n -0000028671 00000 n -0000025884 00000 n -0000028959 00000 n -0000029009 00000 n -0000029059 00000 n -0000029109 00000 n -0000029159 00000 n -0000029209 00000 n -0000029308 00000 n -0000029358 00000 n -0000029407 00000 n -0000029457 00000 n -0000029507 00000 n -0000029557 00000 n -0000029607 00000 n -0000029657 00000 n -0000255196 00000 n -0000029707 00000 n -0000029757 00000 n -0000029807 00000 n -0000029857 00000 n -0000029907 00000 n -0000029957 00000 n -0000030005 00000 n -0000030055 00000 n -0000030105 00000 n -0000030155 00000 n -0000032197 00000 n -0000033344 00000 n -0000032058 00000 n -0000030354 00000 n -0000032346 00000 n -0000032396 00000 n -0000032446 00000 n -0000032496 00000 n -0000032545 00000 n -0000032595 00000 n -0000032645 00000 n -0000032695 00000 n -0000032745 00000 n -0000032795 00000 n -0000032845 00000 n -0000032895 00000 n -0000032945 00000 n -0000032995 00000 n -0000033045 00000 n -0000033095 00000 n -0000033144 00000 n -0000033194 00000 n -0000033244 00000 n -0000033294 00000 n -0000035545 00000 n -0000035396 00000 n -0000035944 00000 n -0000035249 00000 n -0000033493 00000 n -0000035697 00000 n -0000035844 00000 n -0000035894 00000 n -0000052202 00000 n -0000038920 00000 n -0000038771 00000 n -0000039770 00000 n -0000038624 00000 n -0000036080 00000 n -0000039072 00000 n -0000039122 00000 n -0000039172 00000 n -0000039222 00000 n -0000039272 00000 n -0000039322 00000 n -0000039372 00000 n -0000039471 00000 n -0000039520 00000 n -0000039570 00000 n -0000039620 00000 n -0000039670 00000 n -0000039720 00000 n -0000054490 00000 n -0000047149 00000 n -0000042628 00000 n -0000043823 00000 n -0000042489 00000 n -0000039906 00000 n -0000042777 00000 n -0000042827 00000 n -0000042877 00000 n -0000042927 00000 n -0000042977 00000 n -0000043027 00000 n -0000043077 00000 n -0000043126 00000 n -0000043175 00000 n -0000043225 00000 n -0000043275 00000 n -0000043325 00000 n -0000043375 00000 n -0000043425 00000 n -0000043475 00000 n -0000043525 00000 n -0000043575 00000 n -0000043625 00000 n -0000043724 00000 n -0000043773 00000 n -0000256128 00000 n -0000047000 00000 n -0000048002 00000 n -0000046853 00000 n -0000043959 00000 n -0000047303 00000 n -0000047353 00000 n -0000047403 00000 n -0000047502 00000 n -0000047552 00000 n -0000047602 00000 n -0000047652 00000 n -0000047702 00000 n -0000047752 00000 n -0000047802 00000 n -0000047852 00000 n -0000047902 00000 n -0000047952 00000 n -0000049675 00000 n -0000050173 00000 n -0000049536 00000 n -0000048151 00000 n -0000049824 00000 n -0000049874 00000 n -0000049923 00000 n -0000049973 00000 n -0000050023 00000 n -0000253996 00000 n -0000254284 00000 n -0000050073 00000 n -0000050123 00000 n -0000052003 00000 n -0000052252 00000 n -0000051864 00000 n -0000050348 00000 n -0000052152 00000 n -0000054291 00000 n -0000054540 00000 n -0000054152 00000 n -0000052350 00000 n -0000054440 00000 n -0000056215 00000 n -0000056561 00000 n -0000056076 00000 n -0000054638 00000 n -0000056364 00000 n -0000059505 00000 n -0000060052 00000 n -0000059366 00000 n -0000056672 00000 n -0000059654 00000 n -0000059753 00000 n -0000059803 00000 n -0000059853 00000 n -0000059902 00000 n -0000059952 00000 n -0000060002 00000 n -0000256245 00000 n -0000062516 00000 n -0000063061 00000 n -0000062377 00000 n -0000060188 00000 n -0000062665 00000 n -0000062763 00000 n -0000062813 00000 n -0000062912 00000 n -0000062962 00000 n -0000065468 00000 n -0000066212 00000 n -0000065329 00000 n -0000063197 00000 n -0000065617 00000 n -0000065667 00000 n -0000065717 00000 n -0000065864 00000 n -0000065914 00000 n -0000065964 00000 n -0000066014 00000 n -0000066112 00000 n -0000066162 00000 n -0000068586 00000 n -0000069330 00000 n -0000068447 00000 n -0000066348 00000 n -0000068735 00000 n -0000068785 00000 n -0000068835 00000 n -0000068934 00000 n -0000068984 00000 n -0000069034 00000 n -0000069083 00000 n -0000069182 00000 n -0000069231 00000 n -0000069281 00000 n -0000072106 00000 n -0000071957 00000 n -0000072909 00000 n -0000071810 00000 n -0000069466 00000 n -0000072260 00000 n -0000072310 00000 n -0000072360 00000 n -0000072410 00000 n -0000072460 00000 n -0000072609 00000 n -0000072659 00000 n -0000072759 00000 n -0000072809 00000 n -0000072859 00000 n -0000075254 00000 n -0000075851 00000 n -0000075115 00000 n -0000073045 00000 n -0000075403 00000 n -0000075453 00000 n -0000075501 00000 n -0000075551 00000 n -0000075601 00000 n -0000075701 00000 n -0000075751 00000 n -0000075801 00000 n -0000077975 00000 n -0000078523 00000 n -0000077836 00000 n -0000075987 00000 n -0000078124 00000 n -0000078274 00000 n -0000078324 00000 n -0000078374 00000 n -0000078424 00000 n -0000256362 00000 n -0000079973 00000 n -0000080272 00000 n -0000079834 00000 n -0000078685 00000 n -0000080122 00000 n -0000080172 00000 n -0000080222 00000 n -0000082453 00000 n -0000082852 00000 n -0000082314 00000 n -0000080447 00000 n -0000082602 00000 n -0000082752 00000 n -0000082802 00000 n -0000086044 00000 n -0000087439 00000 n -0000085905 00000 n -0000082988 00000 n -0000086193 00000 n -0000086243 00000 n -0000086292 00000 n -0000086342 00000 n -0000086392 00000 n -0000086442 00000 n -0000086492 00000 n -0000086542 00000 n -0000086591 00000 n -0000086641 00000 n -0000086691 00000 n -0000086741 00000 n -0000086791 00000 n -0000086841 00000 n -0000086891 00000 n -0000086991 00000 n -0000087041 00000 n -0000087091 00000 n -0000087141 00000 n -0000087191 00000 n -0000087240 00000 n -0000087289 00000 n -0000087339 00000 n -0000087389 00000 n -0000088917 00000 n -0000089216 00000 n -0000088778 00000 n -0000087588 00000 n -0000089066 00000 n -0000254140 00000 n -0000089116 00000 n -0000089166 00000 n -0000091151 00000 n -0000091002 00000 n -0000091795 00000 n -0000090855 00000 n -0000089391 00000 n -0000091347 00000 n -0000091447 00000 n -0000091497 00000 n -0000091547 00000 n -0000091597 00000 n -0000091647 00000 n -0000091695 00000 n -0000094609 00000 n -0000096107 00000 n -0000094470 00000 n -0000091906 00000 n -0000094758 00000 n -0000094808 00000 n -0000094858 00000 n -0000094908 00000 n -0000094958 00000 n -0000095008 00000 n -0000095058 00000 n -0000095108 00000 n -0000095208 00000 n -0000095258 00000 n -0000095308 00000 n -0000095358 00000 n -0000095408 00000 n -0000095458 00000 n -0000095508 00000 n -0000095558 00000 n -0000095608 00000 n -0000095658 00000 n -0000095708 00000 n -0000095758 00000 n -0000095808 00000 n -0000095857 00000 n -0000095907 00000 n -0000095957 00000 n -0000096007 00000 n -0000096057 00000 n -0000256479 00000 n -0000099256 00000 n -0000100353 00000 n -0000099117 00000 n -0000096256 00000 n -0000099405 00000 n -0000099455 00000 n -0000099505 00000 n -0000099555 00000 n -0000099604 00000 n -0000099654 00000 n -0000099754 00000 n -0000099804 00000 n -0000099854 00000 n -0000099904 00000 n -0000099954 00000 n -0000100004 00000 n -0000100054 00000 n -0000100104 00000 n -0000100153 00000 n -0000100203 00000 n -0000100253 00000 n -0000100303 00000 n -0000103507 00000 n -0000105004 00000 n -0000103368 00000 n -0000100515 00000 n -0000103656 00000 n -0000103706 00000 n -0000103756 00000 n -0000103806 00000 n -0000103855 00000 n -0000103905 00000 n -0000103955 00000 n -0000104005 00000 n -0000104055 00000 n -0000104105 00000 n -0000104155 00000 n -0000104205 00000 n -0000104255 00000 n -0000104305 00000 n -0000104355 00000 n -0000104405 00000 n -0000104454 00000 n -0000104504 00000 n -0000104554 00000 n -0000104604 00000 n -0000104654 00000 n -0000104704 00000 n -0000104804 00000 n -0000104854 00000 n -0000104904 00000 n -0000104954 00000 n -0000106543 00000 n -0000106892 00000 n -0000106404 00000 n -0000105153 00000 n -0000106692 00000 n -0000106742 00000 n -0000106792 00000 n -0000106842 00000 n -0000108755 00000 n -0000109054 00000 n -0000108616 00000 n -0000107041 00000 n -0000108904 00000 n -0000111406 00000 n -0000111754 00000 n -0000111267 00000 n -0000109152 00000 n -0000111555 00000 n -0000114297 00000 n -0000114946 00000 n -0000114158 00000 n -0000111852 00000 n -0000114446 00000 n -0000114546 00000 n -0000114596 00000 n -0000114646 00000 n -0000114746 00000 n -0000114796 00000 n -0000114846 00000 n -0000114896 00000 n -0000256596 00000 n -0000116815 00000 n -0000117114 00000 n -0000116676 00000 n -0000115082 00000 n -0000116964 00000 n -0000117014 00000 n -0000117064 00000 n -0000120320 00000 n -0000120474 00000 n -0000120171 00000 n -0000121773 00000 n -0000120016 00000 n -0000117250 00000 n -0000120625 00000 n -0000120675 00000 n -0000120725 00000 n -0000120775 00000 n -0000120825 00000 n -0000120875 00000 n -0000120925 00000 n -0000120975 00000 n -0000121025 00000 n -0000121075 00000 n -0000121124 00000 n -0000121173 00000 n -0000121223 00000 n -0000121273 00000 n -0000121323 00000 n -0000121373 00000 n -0000121423 00000 n -0000121473 00000 n -0000121523 00000 n -0000121573 00000 n -0000121623 00000 n -0000121673 00000 n -0000127842 00000 n -0000124692 00000 n -0000124543 00000 n -0000125294 00000 n -0000124396 00000 n -0000121922 00000 n -0000124844 00000 n -0000124894 00000 n -0000124944 00000 n -0000124994 00000 n -0000125044 00000 n -0000125094 00000 n -0000125144 00000 n -0000125194 00000 n -0000125244 00000 n -0000128492 00000 n -0000127297 00000 n -0000128542 00000 n -0000127158 00000 n -0000125443 00000 n -0000127446 00000 n -0000127496 00000 n -0000127544 00000 n -0000127594 00000 n -0000127643 00000 n -0000127693 00000 n -0000127742 00000 n -0000127792 00000 n -0000127892 00000 n -0000127942 00000 n -0000127992 00000 n -0000128042 00000 n -0000128092 00000 n -0000128142 00000 n -0000128192 00000 n -0000128242 00000 n -0000128292 00000 n -0000128342 00000 n -0000128392 00000 n -0000128442 00000 n -0000131519 00000 n -0000132515 00000 n -0000131380 00000 n -0000128665 00000 n -0000131668 00000 n -0000131768 00000 n -0000131818 00000 n -0000131867 00000 n -0000131917 00000 n -0000131967 00000 n -0000132017 00000 n -0000132067 00000 n -0000132117 00000 n -0000132167 00000 n -0000132216 00000 n -0000132266 00000 n -0000132316 00000 n -0000132365 00000 n -0000132415 00000 n -0000132465 00000 n -0000135550 00000 n -0000136246 00000 n -0000135411 00000 n -0000132664 00000 n -0000135699 00000 n -0000135749 00000 n -0000135799 00000 n -0000135849 00000 n -0000135899 00000 n -0000135947 00000 n -0000135997 00000 n +0000010622 00000 n +0000010781 00000 n +0000010938 00000 n +0000011097 00000 n +0000011256 00000 n +0000011409 00000 n +0000011568 00000 n +0000011727 00000 n +0000011886 00000 n +0000012036 00000 n +0000013519 00000 n +0000012288 00000 n +0000007348 00000 n +0000006258 00000 n +0000012189 00000 n +0000012239 00000 n +0000013672 00000 n +0000013822 00000 n +0000013975 00000 n +0000014128 00000 n +0000014278 00000 n +0000014431 00000 n +0000014584 00000 n +0000014737 00000 n +0000014896 00000 n +0000015046 00000 n +0000015199 00000 n +0000015358 00000 n +0000015517 00000 n +0000015670 00000 n +0000015822 00000 n +0000015973 00000 n +0000016126 00000 n +0000016328 00000 n +0000013244 00000 n +0000012373 00000 n +0000016278 00000 n +0000018232 00000 n +0000018083 00000 n +0000018483 00000 n +0000017936 00000 n +0000016413 00000 n +0000282495 00000 n +0000018433 00000 n +0000141386 00000 n +0000020501 00000 n +0000021045 00000 n +0000020362 00000 n +0000018607 00000 n +0000020650 00000 n +0000020796 00000 n +0000282637 00000 n +0000020846 00000 n +0000282781 00000 n +0000282952 00000 n +0000020896 00000 n +0000020946 00000 n +0000024140 00000 n +0000023991 00000 n +0000024841 00000 n +0000023844 00000 n +0000021207 00000 n +0000024292 00000 n +0000024342 00000 n +0000024392 00000 n +0000024442 00000 n +0000024492 00000 n +0000024542 00000 n +0000024592 00000 n +0000024642 00000 n +0000024741 00000 n +0000024791 00000 n +0000283938 00000 n +0000027897 00000 n +0000029341 00000 n +0000027758 00000 n +0000024990 00000 n +0000028046 00000 n +0000028096 00000 n +0000028146 00000 n +0000028196 00000 n +0000028245 00000 n +0000028295 00000 n +0000028393 00000 n +0000028443 00000 n +0000028492 00000 n +0000028542 00000 n +0000028592 00000 n +0000028642 00000 n +0000028692 00000 n +0000028742 00000 n +0000028792 00000 n +0000283123 00000 n +0000028842 00000 n +0000028892 00000 n +0000028942 00000 n +0000028992 00000 n +0000029042 00000 n +0000029091 00000 n +0000029141 00000 n +0000029191 00000 n +0000029241 00000 n +0000029291 00000 n +0000031493 00000 n +0000032790 00000 n +0000031354 00000 n +0000029503 00000 n +0000031642 00000 n +0000031692 00000 n +0000031742 00000 n +0000031792 00000 n +0000031841 00000 n +0000031891 00000 n +0000031941 00000 n +0000031991 00000 n +0000032041 00000 n +0000032091 00000 n +0000032141 00000 n +0000032191 00000 n +0000032241 00000 n +0000032291 00000 n +0000032341 00000 n +0000032391 00000 n +0000032440 00000 n +0000032490 00000 n +0000032540 00000 n +0000032590 00000 n +0000032640 00000 n +0000032690 00000 n +0000032740 00000 n +0000034985 00000 n +0000034836 00000 n +0000035383 00000 n +0000034689 00000 n +0000032939 00000 n +0000035137 00000 n +0000035284 00000 n +0000035333 00000 n +0000038064 00000 n +0000037865 00000 n +0000038114 00000 n +0000037726 00000 n +0000035519 00000 n +0000038014 00000 n +0000040874 00000 n +0000041421 00000 n +0000040735 00000 n +0000038212 00000 n +0000041023 00000 n +0000041073 00000 n +0000041123 00000 n +0000041173 00000 n +0000041222 00000 n +0000041272 00000 n +0000041322 00000 n +0000044397 00000 n +0000044248 00000 n +0000045747 00000 n +0000044101 00000 n +0000041570 00000 n +0000044549 00000 n +0000044599 00000 n +0000044649 00000 n +0000044699 00000 n +0000044749 00000 n +0000044799 00000 n +0000044849 00000 n +0000044899 00000 n +0000044948 00000 n +0000044998 00000 n +0000045048 00000 n +0000045098 00000 n +0000045148 00000 n +0000045197 00000 n +0000045247 00000 n +0000045297 00000 n +0000045347 00000 n +0000045397 00000 n +0000045447 00000 n +0000045497 00000 n +0000045547 00000 n +0000045597 00000 n +0000045647 00000 n +0000045697 00000 n +0000284055 00000 n +0000048406 00000 n +0000048207 00000 n +0000048455 00000 n +0000048068 00000 n +0000045883 00000 n +0000048356 00000 n +0000051606 00000 n +0000051457 00000 n +0000052156 00000 n +0000051310 00000 n +0000048553 00000 n +0000051758 00000 n +0000051857 00000 n +0000051907 00000 n +0000051957 00000 n +0000052007 00000 n +0000052106 00000 n +0000054719 00000 n +0000055667 00000 n +0000054580 00000 n +0000052305 00000 n +0000054868 00000 n +0000054918 00000 n +0000054968 00000 n +0000055018 00000 n +0000055068 00000 n +0000055118 00000 n +0000055168 00000 n +0000055218 00000 n +0000055268 00000 n +0000055318 00000 n +0000055367 00000 n +0000055417 00000 n +0000055467 00000 n +0000055517 00000 n +0000281923 00000 n +0000282211 00000 n +0000055567 00000 n +0000055617 00000 n +0000057495 00000 n +0000057841 00000 n +0000057356 00000 n +0000055855 00000 n +0000057644 00000 n +0000060763 00000 n +0000061310 00000 n +0000060624 00000 n +0000057965 00000 n +0000060912 00000 n +0000061011 00000 n +0000061060 00000 n +0000061110 00000 n +0000061160 00000 n +0000061210 00000 n +0000061260 00000 n +0000063752 00000 n +0000064297 00000 n +0000063613 00000 n +0000061459 00000 n +0000063901 00000 n +0000064000 00000 n +0000064050 00000 n +0000064149 00000 n +0000064198 00000 n +0000284172 00000 n +0000066759 00000 n +0000067503 00000 n +0000066620 00000 n +0000064433 00000 n +0000066908 00000 n +0000066958 00000 n +0000067008 00000 n +0000067155 00000 n +0000067205 00000 n +0000067255 00000 n +0000067305 00000 n +0000067404 00000 n +0000067453 00000 n +0000069999 00000 n +0000070547 00000 n +0000069860 00000 n +0000067639 00000 n +0000070148 00000 n +0000070198 00000 n +0000070248 00000 n +0000070347 00000 n +0000070397 00000 n +0000070447 00000 n +0000070497 00000 n +0000073254 00000 n +0000073105 00000 n +0000074103 00000 n +0000072958 00000 n +0000070683 00000 n +0000073407 00000 n +0000073506 00000 n +0000073556 00000 n +0000073606 00000 n +0000073656 00000 n +0000073705 00000 n +0000073755 00000 n +0000073805 00000 n +0000073953 00000 n +0000074003 00000 n +0000074053 00000 n +0000076809 00000 n +0000077554 00000 n +0000076670 00000 n +0000074239 00000 n +0000076958 00000 n +0000077058 00000 n +0000077108 00000 n +0000077158 00000 n +0000077208 00000 n +0000077257 00000 n +0000077307 00000 n +0000077406 00000 n +0000077456 00000 n +0000077505 00000 n +0000079656 00000 n +0000080204 00000 n +0000079517 00000 n +0000077690 00000 n +0000079805 00000 n +0000079955 00000 n +0000080005 00000 n +0000080055 00000 n +0000080105 00000 n +0000081656 00000 n +0000081955 00000 n +0000081517 00000 n +0000080366 00000 n +0000081805 00000 n +0000081855 00000 n +0000081905 00000 n +0000284289 00000 n +0000084306 00000 n +0000084705 00000 n +0000084167 00000 n +0000082130 00000 n +0000084455 00000 n +0000084605 00000 n +0000084655 00000 n +0000087796 00000 n +0000089193 00000 n +0000087657 00000 n +0000084854 00000 n +0000087945 00000 n +0000087995 00000 n +0000088045 00000 n +0000088095 00000 n +0000088145 00000 n +0000088195 00000 n +0000088245 00000 n +0000088295 00000 n +0000088345 00000 n +0000088395 00000 n +0000088444 00000 n +0000088493 00000 n +0000088543 00000 n +0000088593 00000 n +0000088643 00000 n +0000088743 00000 n +0000088793 00000 n +0000088843 00000 n +0000088893 00000 n +0000088943 00000 n +0000088993 00000 n +0000089043 00000 n +0000089093 00000 n +0000089143 00000 n +0000090676 00000 n +0000090975 00000 n +0000090537 00000 n +0000089355 00000 n +0000090825 00000 n +0000282067 00000 n +0000090875 00000 n +0000090925 00000 n +0000092862 00000 n +0000092713 00000 n +0000093438 00000 n +0000092566 00000 n +0000091150 00000 n +0000093040 00000 n +0000093140 00000 n +0000093190 00000 n +0000093240 00000 n +0000093289 00000 n +0000093338 00000 n +0000093388 00000 n +0000096199 00000 n +0000097546 00000 n +0000096060 00000 n +0000093562 00000 n +0000096348 00000 n +0000096448 00000 n +0000096498 00000 n +0000096548 00000 n +0000096598 00000 n +0000096648 00000 n +0000096698 00000 n +0000096748 00000 n +0000096847 00000 n +0000096897 00000 n +0000096947 00000 n +0000096997 00000 n +0000097047 00000 n +0000097097 00000 n +0000097147 00000 n +0000097197 00000 n +0000097247 00000 n +0000097297 00000 n +0000097347 00000 n +0000097397 00000 n +0000097447 00000 n +0000097497 00000 n +0000100792 00000 n +0000101836 00000 n +0000100653 00000 n +0000097708 00000 n +0000100941 00000 n +0000100991 00000 n +0000101041 00000 n +0000101091 00000 n +0000101141 00000 n +0000101190 00000 n +0000101239 00000 n +0000101289 00000 n +0000101339 00000 n +0000101389 00000 n +0000101489 00000 n +0000101539 00000 n +0000101589 00000 n +0000101638 00000 n +0000101688 00000 n +0000101736 00000 n +0000101786 00000 n +0000284406 00000 n +0000104774 00000 n +0000106371 00000 n +0000104635 00000 n +0000102011 00000 n +0000104923 00000 n +0000104973 00000 n +0000105023 00000 n +0000105073 00000 n +0000105122 00000 n +0000105172 00000 n +0000105222 00000 n +0000105272 00000 n +0000105322 00000 n +0000105372 00000 n +0000105422 00000 n +0000105472 00000 n +0000105522 00000 n +0000105572 00000 n +0000105622 00000 n +0000105672 00000 n +0000105721 00000 n +0000105771 00000 n +0000105821 00000 n +0000105871 00000 n +0000105921 00000 n +0000105971 00000 n +0000106021 00000 n +0000106071 00000 n +0000106121 00000 n +0000106171 00000 n +0000106221 00000 n +0000106321 00000 n +0000108313 00000 n +0000108810 00000 n +0000108174 00000 n +0000106520 00000 n +0000108462 00000 n +0000108512 00000 n +0000108562 00000 n +0000108612 00000 n +0000108660 00000 n +0000108710 00000 n +0000108760 00000 n +0000110842 00000 n +0000111191 00000 n +0000110703 00000 n +0000108972 00000 n +0000110991 00000 n +0000113445 00000 n +0000113892 00000 n +0000113306 00000 n +0000111302 00000 n +0000113594 00000 n +0000113744 00000 n +0000113792 00000 n +0000113842 00000 n +0000116559 00000 n +0000117108 00000 n +0000116420 00000 n +0000113990 00000 n +0000116708 00000 n +0000116808 00000 n +0000116858 00000 n +0000116908 00000 n +0000116958 00000 n +0000117008 00000 n +0000117058 00000 n +0000120285 00000 n +0000120439 00000 n +0000120136 00000 n +0000121738 00000 n +0000119981 00000 n +0000117244 00000 n +0000120590 00000 n +0000120640 00000 n +0000120690 00000 n +0000120740 00000 n +0000120790 00000 n +0000120840 00000 n +0000120890 00000 n +0000120940 00000 n +0000120990 00000 n +0000121040 00000 n +0000121089 00000 n +0000121138 00000 n +0000121188 00000 n +0000121238 00000 n +0000121288 00000 n +0000121338 00000 n +0000121388 00000 n +0000121438 00000 n +0000121488 00000 n +0000121538 00000 n +0000121588 00000 n +0000121638 00000 n +0000284523 00000 n +0000127782 00000 n +0000124639 00000 n +0000124490 00000 n +0000125240 00000 n +0000124343 00000 n +0000121887 00000 n +0000124791 00000 n +0000124841 00000 n +0000124891 00000 n +0000124941 00000 n +0000124991 00000 n +0000125041 00000 n +0000125091 00000 n +0000125141 00000 n +0000125191 00000 n +0000128429 00000 n +0000127234 00000 n +0000128479 00000 n +0000127095 00000 n +0000125389 00000 n +0000127383 00000 n +0000127433 00000 n +0000127483 00000 n +0000127533 00000 n +0000127583 00000 n +0000127633 00000 n +0000127683 00000 n +0000127732 00000 n +0000127832 00000 n +0000127882 00000 n +0000127932 00000 n +0000127982 00000 n +0000128032 00000 n +0000128082 00000 n +0000128132 00000 n +0000128182 00000 n +0000128232 00000 n +0000128281 00000 n +0000128331 00000 n +0000128380 00000 n +0000131425 00000 n +0000132421 00000 n +0000131286 00000 n +0000128602 00000 n +0000131574 00000 n +0000131674 00000 n +0000131724 00000 n +0000131773 00000 n +0000131823 00000 n +0000131873 00000 n +0000131923 00000 n +0000131973 00000 n +0000132023 00000 n +0000132072 00000 n +0000132122 00000 n +0000132172 00000 n +0000132222 00000 n +0000132271 00000 n +0000132321 00000 n +0000132371 00000 n +0000135399 00000 n +0000136097 00000 n +0000135260 00000 n +0000132570 00000 n +0000135548 00000 n +0000135598 00000 n +0000135648 00000 n +0000135698 00000 n +0000135748 00000 n +0000135798 00000 n +0000135848 00000 n +0000135898 00000 n +0000135948 00000 n +0000135998 00000 n 0000136047 00000 n -0000136096 00000 n -0000136146 00000 n -0000136196 00000 n -0000256713 00000 n -0000139152 00000 n -0000140499 00000 n -0000139013 00000 n -0000136382 00000 n -0000139301 00000 n -0000139351 00000 n -0000139401 00000 n -0000139451 00000 n -0000139501 00000 n -0000139551 00000 n -0000139601 00000 n -0000139651 00000 n -0000139701 00000 n -0000139751 00000 n -0000139801 00000 n -0000139851 00000 n -0000139901 00000 n -0000139951 00000 n -0000140001 00000 n -0000140050 00000 n -0000140100 00000 n -0000140150 00000 n -0000140199 00000 n -0000140249 00000 n -0000140299 00000 n -0000140349 00000 n -0000140449 00000 n -0000141467 00000 n -0000141716 00000 n -0000141328 00000 n -0000140648 00000 n -0000141666 00000 n -0000141814 00000 n -0000141845 00000 n -0000141916 00000 n -0000253495 00000 n -0000142243 00000 n -0000142622 00000 n -0000143013 00000 n -0000143380 00000 n -0000143415 00000 n -0000143441 00000 n -0000144004 00000 n -0000144110 00000 n -0000144577 00000 n -0000145054 00000 n -0000150913 00000 n -0000151171 00000 n -0000153330 00000 n -0000153553 00000 n -0000156222 00000 n -0000156463 00000 n -0000158081 00000 n -0000158336 00000 n -0000159620 00000 n -0000159852 00000 n -0000161704 00000 n -0000161932 00000 n -0000171510 00000 n -0000171790 00000 n -0000189563 00000 n -0000190121 00000 n -0000202396 00000 n -0000202770 00000 n -0000219003 00000 n -0000219408 00000 n -0000239318 00000 n -0000239861 00000 n -0000253154 00000 n -0000256806 00000 n -0000256924 00000 n -0000257009 00000 n -0000257079 00000 n -0000261570 00000 n -0000261755 00000 n -0000261925 00000 n -0000262087 00000 n -0000262263 00000 n -0000262447 00000 n -0000262666 00000 n -0000262904 00000 n -0000263146 00000 n -0000263385 00000 n -0000263627 00000 n -0000263869 00000 n -0000264111 00000 n -0000264353 00000 n -0000264595 00000 n -0000264837 00000 n -0000265079 00000 n -0000265321 00000 n -0000265563 00000 n -0000265805 00000 n -0000266041 00000 n -0000266279 00000 n -0000266516 00000 n -0000266750 00000 n -0000266983 00000 n -0000267217 00000 n -0000267451 00000 n -0000267680 00000 n -0000267914 00000 n -0000268148 00000 n -0000268380 00000 n -0000268619 00000 n -0000268853 00000 n -0000269087 00000 n -0000269321 00000 n -0000269554 00000 n -0000269790 00000 n -0000270024 00000 n -0000270258 00000 n -0000270495 00000 n -0000270737 00000 n -0000270978 00000 n -0000271220 00000 n -0000271454 00000 n -0000271688 00000 n -0000271921 00000 n -0000272163 00000 n -0000272402 00000 n -0000272636 00000 n -0000272870 00000 n -0000273103 00000 n -0000273337 00000 n -0000273570 00000 n -0000273804 00000 n -0000274036 00000 n -0000274265 00000 n -0000274496 00000 n -0000274730 00000 n -0000274964 00000 n -0000275198 00000 n -0000275431 00000 n -0000275667 00000 n -0000275901 00000 n -0000276116 00000 n -0000276286 00000 n -0000276455 00000 n -0000276625 00000 n -0000276794 00000 n -0000276964 00000 n -0000277130 00000 n -0000277297 00000 n -0000277486 00000 n -0000277682 00000 n -0000277883 00000 n -0000278085 00000 n -0000278308 00000 n -0000278546 00000 n -0000278774 00000 n -0000278860 00000 n -0000278979 00000 n -0000279105 00000 n -0000279232 00000 n -0000279358 00000 n -0000279483 00000 n -0000279608 00000 n -0000279734 00000 n -0000279859 00000 n -0000279984 00000 n -0000280109 00000 n -0000280226 00000 n -0000280339 00000 n -0000280454 00000 n -0000280573 00000 n -0000280694 00000 n -0000280770 00000 n -0000280861 00000 n -0000280901 00000 n -0000281099 00000 n +0000138961 00000 n +0000140303 00000 n +0000138822 00000 n +0000136233 00000 n +0000139110 00000 n +0000139160 00000 n +0000139210 00000 n +0000139260 00000 n +0000139310 00000 n +0000139360 00000 n +0000139410 00000 n +0000139460 00000 n +0000139510 00000 n +0000139560 00000 n +0000139610 00000 n +0000139660 00000 n +0000139710 00000 n +0000139760 00000 n +0000139809 00000 n +0000139855 00000 n +0000139905 00000 n +0000139955 00000 n +0000140003 00000 n +0000140053 00000 n +0000140103 00000 n +0000140153 00000 n +0000140253 00000 n +0000141237 00000 n +0000141486 00000 n +0000141098 00000 n +0000140452 00000 n +0000141436 00000 n +0000284640 00000 n +0000141597 00000 n +0000141628 00000 n +0000141699 00000 n +0000281412 00000 n +0000142026 00000 n +0000142405 00000 n +0000142796 00000 n +0000143163 00000 n +0000143198 00000 n +0000143224 00000 n +0000143791 00000 n +0000143897 00000 n +0000144364 00000 n +0000144841 00000 n +0000156208 00000 n +0000156466 00000 n +0000163947 00000 n +0000164170 00000 n +0000172501 00000 n +0000172741 00000 n +0000180248 00000 n +0000180503 00000 n +0000187550 00000 n +0000187782 00000 n +0000189975 00000 n +0000190203 00000 n +0000199757 00000 n +0000200037 00000 n +0000217793 00000 n +0000218351 00000 n +0000230657 00000 n +0000231038 00000 n +0000247253 00000 n +0000247658 00000 n +0000267610 00000 n +0000268163 00000 n +0000281079 00000 n +0000284717 00000 n +0000284835 00000 n +0000284920 00000 n +0000284990 00000 n +0000289374 00000 n +0000289559 00000 n +0000289729 00000 n +0000289891 00000 n +0000290066 00000 n +0000290250 00000 n +0000290469 00000 n +0000290707 00000 n +0000290949 00000 n +0000291188 00000 n +0000291430 00000 n +0000291672 00000 n +0000291914 00000 n +0000292156 00000 n +0000292398 00000 n +0000292640 00000 n +0000292882 00000 n +0000293124 00000 n +0000293366 00000 n +0000293608 00000 n +0000293844 00000 n +0000294082 00000 n +0000294319 00000 n +0000294553 00000 n +0000294786 00000 n +0000295020 00000 n +0000295254 00000 n +0000295483 00000 n +0000295717 00000 n +0000295951 00000 n +0000296183 00000 n +0000296422 00000 n +0000296656 00000 n +0000296890 00000 n +0000297124 00000 n +0000297357 00000 n +0000297593 00000 n +0000297827 00000 n +0000298061 00000 n +0000298298 00000 n +0000298540 00000 n +0000298781 00000 n +0000299023 00000 n +0000299257 00000 n +0000299491 00000 n +0000299724 00000 n +0000299966 00000 n +0000300205 00000 n +0000300439 00000 n +0000300673 00000 n +0000300906 00000 n +0000301140 00000 n +0000301373 00000 n +0000301607 00000 n +0000301839 00000 n +0000302071 00000 n +0000302299 00000 n +0000302533 00000 n +0000302767 00000 n +0000303001 00000 n +0000303233 00000 n +0000303467 00000 n +0000303704 00000 n +0000303938 00000 n +0000304138 00000 n +0000304308 00000 n +0000304477 00000 n +0000304647 00000 n +0000304816 00000 n +0000304986 00000 n +0000305148 00000 n +0000305330 00000 n +0000305526 00000 n +0000305725 00000 n +0000305927 00000 n +0000306142 00000 n +0000306378 00000 n +0000306619 00000 n +0000306725 00000 n +0000306844 00000 n +0000306970 00000 n +0000307097 00000 n +0000307223 00000 n +0000307348 00000 n +0000307473 00000 n +0000307599 00000 n +0000307724 00000 n +0000307849 00000 n +0000307973 00000 n +0000308090 00000 n +0000308203 00000 n +0000308318 00000 n +0000308437 00000 n +0000308558 00000 n +0000308633 00000 n +0000308722 00000 n +0000308760 00000 n +0000308937 00000 n trailer -<< /Size 1005 -/Root 1003 0 R -/Info 1004 0 R -/ID [<57DF966AA1DB9ADA25EFF840B530A338> <57DF966AA1DB9ADA25EFF840B530A338>] >> +<< /Size 991 +/Root 989 0 R +/Info 990 0 R +/ID [<4987BFBFFC7628FF21E924187A7FAF99> <4987BFBFFC7628FF21E924187A7FAF99>] >> startxref -281486 +309318 %%EOF diff -Nru glfw-2.6/examples/boing.c glfw-2.7.2/examples/boing.c --- glfw-2.6/examples/boing.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/boing.c 2009-11-08 14:39:24.000000000 +0000 @@ -27,6 +27,7 @@ * a hidden computer or VCR. *****************************************************************************/ +#include #include #include #include @@ -45,29 +46,29 @@ void DrawBoingBallBand( GLfloat long_lo, GLfloat long_hi ); void DrawGrid( void ); -#define RADIUS 70.0 -#define STEP_LONGITUDE 22.5 /* 22.5 makes 8 bands like original Boing */ -#define STEP_LATITUDE 22.5 - -#define DIST_BALL (RADIUS * 2.0 + RADIUS * 0.1) - -#define VIEW_SCENE_DIST (DIST_BALL * 3.0+ 200.0)/* distance from viewer to middle of boing area */ -#define GRID_SIZE (RADIUS * 4.5) /* length (width) of grid */ -#define BOUNCE_HEIGHT (RADIUS * 2.1) -#define BOUNCE_WIDTH (RADIUS * 2.1) - -#define SHADOW_OFFSET_X -20.0 -#define SHADOW_OFFSET_Y 10.0 -#define SHADOW_OFFSET_Z 0.0 +#define RADIUS 70.f +#define STEP_LONGITUDE 22.5f /* 22.5 makes 8 bands like original Boing */ +#define STEP_LATITUDE 22.5f + +#define DIST_BALL (RADIUS * 2.f + RADIUS * 0.1f) + +#define VIEW_SCENE_DIST (DIST_BALL * 3.f + 200.f)/* distance from viewer to middle of boing area */ +#define GRID_SIZE (RADIUS * 4.5f) /* length (width) of grid */ +#define BOUNCE_HEIGHT (RADIUS * 2.1f) +#define BOUNCE_WIDTH (RADIUS * 2.1f) + +#define SHADOW_OFFSET_X -20.f +#define SHADOW_OFFSET_Y 10.f +#define SHADOW_OFFSET_Z 0.f -#define WALL_L_OFFSET 0.0 -#define WALL_R_OFFSET 5.0 +#define WALL_L_OFFSET 0.f +#define WALL_R_OFFSET 5.f /* Animation speed (50.0 mimics the original GLUT demo speed) */ -#define ANIMATION_SPEED 50.0 +#define ANIMATION_SPEED 50.f /* Maximum allowed delta time per physics iteration */ -#define MAX_DELTA_T 0.02 +#define MAX_DELTA_T 0.02f /* Draw ball, or its shadow */ typedef enum { DRAW_BALL, DRAW_BALL_SHADOW } DRAW_BALL_ENUM; @@ -76,15 +77,15 @@ typedef struct {float x; float y; float z;} vertex_t; /* Global vars */ -GLfloat deg_rot_y = 0.0; -GLfloat deg_rot_y_inc = 2.0; +GLfloat deg_rot_y = 0.f; +GLfloat deg_rot_y_inc = 2.f; GLfloat ball_x = -RADIUS; GLfloat ball_y = -RADIUS; -GLfloat ball_x_inc = 1.0; -GLfloat ball_y_inc = 2.0; +GLfloat ball_x_inc = 1.f; +GLfloat ball_y_inc = 2.f; DRAW_BALL_ENUM drawBallHow; double t; -double t_old = 0.0; +double t_old = 0.f; double dt; /* Random number generator */ @@ -103,8 +104,8 @@ *****************************************************************************/ GLfloat TruncateDeg( GLfloat deg ) { - if ( deg >= 360.0 ) - return (deg - 360.0); + if ( deg >= 360.f ) + return (deg - 360.f); else return deg; } @@ -173,8 +174,8 @@ { GLfloat radTheta, degTheta; - radTheta = 2.0 * atan2( size / 2.0, dist ); - degTheta = (180.0 * radTheta) / M_PI; + radTheta = 2.f * (GLfloat) atan2( size / 2.f, dist ); + degTheta = (180.f * radTheta) / (GLfloat) M_PI; return degTheta; } @@ -191,7 +192,7 @@ /* * Clear background. */ - glClearColor( 0.55, 0.55, 0.55, 0.0 ); + glClearColor( 0.55f, 0.55f, 0.55f, 0.f ); glShadeModel( GL_FLAT ); } @@ -270,7 +271,7 @@ dt2 = dt_total > MAX_DELTA_T ? MAX_DELTA_T : dt_total; dt_total -= dt2; BounceBall( dt2 ); - deg_rot_y = TruncateDeg( deg_rot_y + deg_rot_y_inc*(dt2*ANIMATION_SPEED) ); + deg_rot_y = TruncateDeg( deg_rot_y + deg_rot_y_inc*((float)dt2*ANIMATION_SPEED) ); } /* Set ball position */ @@ -335,28 +336,28 @@ /* Bounce on walls */ if ( ball_x > (BOUNCE_WIDTH/2 + WALL_R_OFFSET ) ) { - ball_x_inc = -0.5 - 0.75 * (GLfloat)rand() / (GLfloat)RAND_MAX; + ball_x_inc = -0.5f - 0.75f * (GLfloat)rand() / (GLfloat)RAND_MAX; deg_rot_y_inc = -deg_rot_y_inc; } if ( ball_x < -(BOUNCE_HEIGHT/2 + WALL_L_OFFSET) ) { - ball_x_inc = 0.5 + 0.75 * (GLfloat)rand() / (GLfloat)RAND_MAX; + ball_x_inc = 0.5f + 0.75f * (GLfloat)rand() / (GLfloat)RAND_MAX; deg_rot_y_inc = -deg_rot_y_inc; } /* Bounce on floor / roof */ if ( ball_y > BOUNCE_HEIGHT/2 ) { - ball_y_inc = -0.75 - 1.0 * (GLfloat)rand() / (GLfloat)RAND_MAX; + ball_y_inc = -0.75f - 1.f * (GLfloat)rand() / (GLfloat)RAND_MAX; } if ( ball_y < -BOUNCE_HEIGHT/2*0.85 ) { - ball_y_inc = 0.75 + 1.0 * (GLfloat)rand() / (GLfloat)RAND_MAX; + ball_y_inc = 0.75f + 1.f * (GLfloat)rand() / (GLfloat)RAND_MAX; } /* Update ball position */ - ball_x += ball_x_inc * (dt*ANIMATION_SPEED); - ball_y += ball_y_inc * (dt*ANIMATION_SPEED); + ball_x += ball_x_inc * ((float)dt*ANIMATION_SPEED); + ball_y += ball_y_inc * ((float)dt*ANIMATION_SPEED); /* * Simulate the effects of gravity on Y movement. @@ -367,7 +368,7 @@ if ( deg > 80 ) deg = 80; if ( deg < 10 ) deg = 10; - ball_y_inc = sign * 4.0 * sin_deg( deg ); + ball_y_inc = sign * 4.f * (float) sin_deg( deg ); } @@ -400,15 +401,15 @@ * Color this polygon with red or white. */ if ( colorToggle ) - glColor3f( 0.8, 0.1, 0.1 ); + glColor3f( 0.8f, 0.1f, 0.1f ); else - glColor3f( 0.95, 0.95, 0.95 ); + glColor3f( 0.95f, 0.95f, 0.95f ); #if 0 if ( lat_deg >= 180 ) if ( colorToggle ) - glColor3f( 0.1, 0.8, 0.1 ); + glColor3f( 0.1f, 0.8f, 0.1f ); else - glColor3f( 0.5, 0.5, 0.95 ); + glColor3f( 0.5f, 0.5f, 0.95f ); #endif colorToggle = ! colorToggle; @@ -416,28 +417,28 @@ * Change color if drawing shadow. */ if ( drawBallHow == DRAW_BALL_SHADOW ) - glColor3f( 0.35, 0.35, 0.35 ); + glColor3f( 0.35f, 0.35f, 0.35f ); /* * Assign each Y. */ - vert_ne.y = vert_nw.y = cos_deg(long_hi) * RADIUS; - vert_sw.y = vert_se.y = cos_deg(long_lo) * RADIUS; + vert_ne.y = vert_nw.y = (float) cos_deg(long_hi) * RADIUS; + vert_sw.y = vert_se.y = (float) cos_deg(long_lo) * RADIUS; /* * Assign each X,Z with sin,cos values scaled by latitude radius indexed by longitude. * Eg, long=0 and long=180 are at the poles, so zero scale is sin(longitude), * while long=90 (sin(90)=1) is at equator. */ - vert_ne.x = cos_deg( lat_deg ) * (RADIUS * sin_deg( long_lo + STEP_LONGITUDE )); - vert_se.x = cos_deg( lat_deg ) * (RADIUS * sin_deg( long_lo )); - vert_nw.x = cos_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * sin_deg( long_lo + STEP_LONGITUDE )); - vert_sw.x = cos_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * sin_deg( long_lo )); - - vert_ne.z = sin_deg( lat_deg ) * (RADIUS * sin_deg( long_lo + STEP_LONGITUDE )); - vert_se.z = sin_deg( lat_deg ) * (RADIUS * sin_deg( long_lo )); - vert_nw.z = sin_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * sin_deg( long_lo + STEP_LONGITUDE )); - vert_sw.z = sin_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * sin_deg( long_lo )); + vert_ne.x = (float) cos_deg( lat_deg ) * (RADIUS * (float) sin_deg( long_lo + STEP_LONGITUDE )); + vert_se.x = (float) cos_deg( lat_deg ) * (RADIUS * (float) sin_deg( long_lo )); + vert_nw.x = (float) cos_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * (float) sin_deg( long_lo + STEP_LONGITUDE )); + vert_sw.x = (float) cos_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * (float) sin_deg( long_lo )); + + vert_ne.z = (float) sin_deg( lat_deg ) * (RADIUS * (float) sin_deg( long_lo + STEP_LONGITUDE )); + vert_se.z = (float) sin_deg( lat_deg ) * (RADIUS * (float) sin_deg( long_lo )); + vert_nw.z = (float) sin_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * (float) sin_deg( long_lo + STEP_LONGITUDE )); + vert_sw.z = (float) sin_deg( lat_deg + STEP_LATITUDE ) * (RADIUS * (float) sin_deg( long_lo )); /* * Draw the facet. @@ -516,7 +517,7 @@ glBegin( GL_POLYGON ); - glColor3f( 0.6, 0.1, 0.6 ); /* purple */ + glColor3f( 0.6f, 0.1f, 0.6f ); /* purple */ glVertex3f( xr, yt, z_offset ); /* NE */ glVertex3f( xl, yt, z_offset ); /* NW */ @@ -542,7 +543,7 @@ glBegin( GL_POLYGON ); - glColor3f( 0.6, 0.1, 0.6 ); /* purple */ + glColor3f( 0.6f, 0.1f, 0.6f ); /* purple */ glVertex3f( xr, yt, z_offset ); /* NE */ glVertex3f( xl, yt, z_offset ); /* NW */ @@ -567,12 +568,19 @@ int running; /* Init GLFW */ - glfwInit(); + if( !glfwInit() ) + { + fprintf( stderr, "Failed to initialize GLFW\n" ); + exit( EXIT_FAILURE ); + } + if( !glfwOpenWindow( 400,400, 0,0,0,0, 16,0, GLFW_WINDOW ) ) { + fprintf( stderr, "Failed to open GLFW window\n" ); glfwTerminate(); - return 0; + exit( EXIT_FAILURE ); } + glfwSetWindowTitle( "Boing (classic Amiga demo)" ); glfwSetWindowSizeCallback( reshape ); glfwEnable( GLFW_STICKY_KEYS ); @@ -602,5 +610,6 @@ while( running ); glfwTerminate(); - return 0; + exit( EXIT_SUCCESS ); } + diff -Nru glfw-2.6/examples/gears.c glfw-2.7.2/examples/gears.c --- glfw-2.6/examples/gears.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/gears.c 2009-11-08 14:39:24.000000000 +0000 @@ -13,6 +13,12 @@ * - Conversion to GLFW * - Time based rendering (frame rate independent) * - Slightly modified camera that should work better for stereo viewing + * + * + * Camilla Berglund: + * - Removed FPS counter (this is not a benchmark) + * - Added a few comments + * - Enabled vsync */ @@ -26,12 +32,12 @@ #define M_PI 3.141592654 #endif +/* The program exits when this is zero. + */ static int running = 1; -static double t0 = 0.0; -static double t; -static double dt; -static int Frames = 0; +/* If non-zero, the program exits after that many seconds + */ static int autoexit = 0; /** @@ -41,8 +47,7 @@ Input: inner_radius - radius of hole at center outer_radius - radius at center of teeth - width - width of gear - teeth - number of teeth + width - width of gear teeth - number of teeth tooth_depth - depth of tooth **/ @@ -57,38 +62,38 @@ GLfloat u, v, len; r0 = inner_radius; - r1 = outer_radius - tooth_depth / 2.0; - r2 = outer_radius + tooth_depth / 2.0; + r1 = outer_radius - tooth_depth / 2.f; + r2 = outer_radius + tooth_depth / 2.f; - da = 2.0 * M_PI / teeth / 4.0; + da = 2.f * (float) M_PI / teeth / 4.f; glShadeModel(GL_FLAT); - glNormal3f(0.0, 0.0, 1.0); + glNormal3f(0.f, 0.f, 1.f); /* draw front face */ glBegin(GL_QUAD_STRIP); for (i = 0; i <= teeth; i++) { - angle = i * 2.0 * M_PI / teeth; - glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); - glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); + angle = i * 2.f * (float) M_PI / teeth; + glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), width * 0.5f); + glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), width * 0.5f); if (i < teeth) { - glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); - glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5); + glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), width * 0.5f); + glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), width * 0.5f); } } glEnd(); /* draw front sides of teeth */ glBegin(GL_QUADS); - da = 2.0 * M_PI / teeth / 4.0; + da = 2.f * (float) M_PI / teeth / 4.f; for (i = 0; i < teeth; i++) { - angle = i * 2.0 * M_PI / teeth; + angle = i * 2.f * (float) M_PI / teeth; - glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); - glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5); - glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5); - glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5); + glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), width * 0.5f); + glVertex3f(r2 * (float) cos(angle + da), r2 * (float) sin(angle + da), width * 0.5f); + glVertex3f(r2 * (float) cos(angle + 2 * da), r2 * (float) sin(angle + 2 * da), width * 0.5f); + glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), width * 0.5f); } glEnd(); @@ -97,57 +102,57 @@ /* draw back face */ glBegin(GL_QUAD_STRIP); for (i = 0; i <= teeth; i++) { - angle = i * 2.0 * M_PI / teeth; - glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); - glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); + angle = i * 2.f * (float) M_PI / teeth; + glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), -width * 0.5f); + glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), -width * 0.5f); if (i < teeth) { - glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5); - glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); + glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), -width * 0.5f); + glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), -width * 0.5f); } } glEnd(); /* draw back sides of teeth */ glBegin(GL_QUADS); - da = 2.0 * M_PI / teeth / 4.0; + da = 2.f * (float) M_PI / teeth / 4.f; for (i = 0; i < teeth; i++) { - angle = i * 2.0 * M_PI / teeth; + angle = i * 2.f * (float) M_PI / teeth; - glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5); - glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5); - glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5); - glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); + glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), -width * 0.5f); + glVertex3f(r2 * (float) cos(angle + 2 * da), r2 * (float) sin(angle + 2 * da), -width * 0.5f); + glVertex3f(r2 * (float) cos(angle + da), r2 * (float) sin(angle + da), -width * 0.5f); + glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), -width * 0.5f); } glEnd(); /* draw outward faces of teeth */ glBegin(GL_QUAD_STRIP); for (i = 0; i < teeth; i++) { - angle = i * 2.0 * M_PI / teeth; + angle = i * 2.f * (float) M_PI / teeth; - glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); - glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); - u = r2 * cos(angle + da) - r1 * cos(angle); - v = r2 * sin(angle + da) - r1 * sin(angle); - len = sqrt(u * u + v * v); + glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), width * 0.5f); + glVertex3f(r1 * (float) cos(angle), r1 * (float) sin(angle), -width * 0.5f); + u = r2 * (float) cos(angle + da) - r1 * (float) cos(angle); + v = r2 * (float) sin(angle + da) - r1 * (float) sin(angle); + len = (float) sqrt(u * u + v * v); u /= len; v /= len; glNormal3f(v, -u, 0.0); - glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5); - glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5); - glNormal3f(cos(angle), sin(angle), 0.0); - glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5); - glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5); - u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da); - v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da); - glNormal3f(v, -u, 0.0); - glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5); - glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5); - glNormal3f(cos(angle), sin(angle), 0.0); + glVertex3f(r2 * (float) cos(angle + da), r2 * (float) sin(angle + da), width * 0.5f); + glVertex3f(r2 * (float) cos(angle + da), r2 * (float) sin(angle + da), -width * 0.5f); + glNormal3f((float) cos(angle), (float) sin(angle), 0.f); + glVertex3f(r2 * (float) cos(angle + 2 * da), r2 * (float) sin(angle + 2 * da), width * 0.5f); + glVertex3f(r2 * (float) cos(angle + 2 * da), r2 * (float) sin(angle + 2 * da), -width * 0.5f); + u = r1 * (float) cos(angle + 3 * da) - r2 * (float) cos(angle + 2 * da); + v = r1 * (float) sin(angle + 3 * da) - r2 * (float) sin(angle + 2 * da); + glNormal3f(v, -u, 0.f); + glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), width * 0.5f); + glVertex3f(r1 * (float) cos(angle + 3 * da), r1 * (float) sin(angle + 3 * da), -width * 0.5f); + glNormal3f((float) cos(angle), (float) sin(angle), 0.f); } - glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5); - glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5); + glVertex3f(r1 * (float) cos(0), r1 * (float) sin(0), width * 0.5f); + glVertex3f(r1 * (float) cos(0), r1 * (float) sin(0), -width * 0.5f); glEnd(); @@ -156,19 +161,19 @@ /* draw inside radius cylinder */ glBegin(GL_QUAD_STRIP); for (i = 0; i <= teeth; i++) { - angle = i * 2.0 * M_PI / teeth; - glNormal3f(-cos(angle), -sin(angle), 0.0); - glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); - glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); + angle = i * 2.f * (float) M_PI / teeth; + glNormal3f(-(float) cos(angle), -(float) sin(angle), 0.f); + glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), -width * 0.5f); + glVertex3f(r0 * (float) cos(angle), r0 * (float) sin(angle), width * 0.5f); } glEnd(); } -static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0; +static GLfloat view_rotx = 20.f, view_roty = 30.f, view_rotz = 0.f; static GLint gear1, gear2, gear3; -static GLfloat angle = 0.0; +static GLfloat angle = 0.f; /* OpenGL draw function & timing */ static void draw(void) @@ -187,46 +192,25 @@ glPopMatrix(); glPushMatrix(); - glTranslatef(3.1, -2.0, 0.0); - glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0); + glTranslatef(3.1f, -2.f, 0.f); + glRotatef(-2.f * angle - 9.f, 0.f, 0.f, 1.f); glCallList(gear2); glPopMatrix(); glPushMatrix(); - glTranslatef(-3.1, 4.2, 0.0); - glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0); + glTranslatef(-3.1f, 4.2f, 0.f); + glRotatef(-2.f * angle - 25.f, 0.f, 0.f, 1.f); glCallList(gear3); glPopMatrix(); glPopMatrix(); - - Frames++; - - { - double t_new = glfwGetTime(); - dt = t_new - t; - t = t_new; - - if (t - t0 >= 5.0) - { - double seconds = t - t0; - double fps = Frames / seconds; - printf("%d frames in %6.3f seconds = %6.3f FPS\n", Frames, seconds, fps); - t0 = t; - Frames = 0; - if ((t >= 0.999 * autoexit) && (autoexit)) - { - running = 0; - } - } - } } /* update animation parameters */ static void animate(void) { - angle += 100.0*dt; + angle = 100.f * (float) glfwGetTime(); } @@ -271,7 +255,7 @@ znear = 5.0f; zfar = 30.0f; - xmax = znear * 0.5; + xmax = znear * 0.5f; glViewport( 0, 0, (GLint) width, (GLint) height ); glMatrixMode( GL_PROJECTION ); @@ -286,10 +270,10 @@ /* program & OpenGL initialization */ static void init(int argc, char *argv[]) { - static GLfloat pos[4] = {5.0, 5.0, 10.0, 0.0}; - static GLfloat red[4] = {0.8, 0.1, 0.0, 1.0}; - static GLfloat green[4] = {0.0, 0.8, 0.2, 1.0}; - static GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0}; + static GLfloat pos[4] = {5.f, 5.f, 10.f, 0.f}; + static GLfloat red[4] = {0.8f, 0.1f, 0.f, 1.f}; + static GLfloat green[4] = {0.f, 0.8f, 0.2f, 1.f}; + static GLfloat blue[4] = {0.2f, 0.2f, 1.f, 1.f}; GLint i; glLightfv(GL_LIGHT0, GL_POSITION, pos); @@ -302,19 +286,19 @@ gear1 = glGenLists(1); glNewList(gear1, GL_COMPILE); glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); - gear(1.0, 4.0, 1.0, 20, 0.7); + gear(1.f, 4.f, 1.f, 20, 0.7f); glEndList(); gear2 = glGenLists(1); glNewList(gear2, GL_COMPILE); glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); - gear(0.5, 2.0, 2.0, 10, 0.7); + gear(0.5f, 2.f, 2.f, 10, 0.7f); glEndList(); gear3 = glGenLists(1); glNewList(gear3, GL_COMPILE); glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); - gear(1.3, 2.0, 0.5, 10, 0.7); + gear(1.3f, 2.f, 0.5f, 10, 0.7f); glEndList(); glEnable(GL_NORMALIZE); @@ -337,18 +321,24 @@ /* program entry */ int main(int argc, char *argv[]) { - // Init GLFW and open window - glfwInit(); + if( !glfwInit() ) + { + fprintf( stderr, "Failed to initialize GLFW\n" ); + exit( EXIT_FAILURE ); + } + if( !glfwOpenWindow( 300,300, 0,0,0,0, 16,0, GLFW_WINDOW ) ) { + fprintf( stderr, "Failed to open GLFW window\n" ); glfwTerminate(); - return 0; + exit( EXIT_FAILURE ); } + glfwSetWindowTitle( "Gears" ); glfwEnable( GLFW_KEY_REPEAT ); - glfwSwapInterval( 0 ); + glfwSwapInterval( 1 ); - // Special args? + // Parse command-line options init(argc, argv); // Set callback functions @@ -378,5 +368,6 @@ glfwTerminate(); // Exit program - return 0; + exit( EXIT_SUCCESS ); } + diff -Nru glfw-2.6/examples/getopt.c glfw-2.7.2/examples/getopt.c --- glfw-2.6/examples/getopt.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/examples/getopt.c 2010-08-25 13:40:52.000000000 +0000 @@ -0,0 +1,253 @@ +/***************************************************************************** +* getopt.c - competent and free getopt library. +* $Header: /cvsroot/freegetopt/freegetopt/getopt.c,v 1.2 2003/10/26 03:10:20 vindaci Exp $ +* +* Copyright (c)2002-2003 Mark K. Kim +* 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. +* +* * Neither the original author of this software nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "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 THE +* COPYRIGHT OWNER OR CONTRIBUTORS 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 "getopt.h" + + +/* 2009-10-12 Camilla Berglund + * + * Removed unused global static variable 'ID'. + */ + + +char* optarg = NULL; +int optind = 0; +int opterr = 1; +int optopt = '?'; + + +static char** prev_argv = NULL; /* Keep a copy of argv and argc to */ +static int prev_argc = 0; /* tell if getopt params change */ +static int argv_index = 0; /* Option we're checking */ +static int argv_index2 = 0; /* Option argument we're checking */ +static int opt_offset = 0; /* Index into compounded "-option" */ +static int dashdash = 0; /* True if "--" option reached */ +static int nonopt = 0; /* How many nonopts we've found */ + +static void increment_index() +{ + /* Move onto the next option */ + if(argv_index < argv_index2) + { + while(prev_argv[++argv_index] && prev_argv[argv_index][0] != '-' + && argv_index < argv_index2+1); + } + else argv_index++; + opt_offset = 1; +} + + +/* +* Permutes argv[] so that the argument currently being processed is moved +* to the end. +*/ +static int permute_argv_once() +{ + /* Movability check */ + if(argv_index + nonopt >= prev_argc) return 1; + /* Move the current option to the end, bring the others to front */ + else + { + char* tmp = prev_argv[argv_index]; + + /* Move the data */ + memmove(&prev_argv[argv_index], &prev_argv[argv_index+1], + sizeof(char**) * (prev_argc - argv_index - 1)); + prev_argv[prev_argc - 1] = tmp; + + nonopt++; + return 0; + } +} + + +int getopt(int argc, char** argv, char* optstr) +{ + int c = 0; + + /* If we have new argv, reinitialize */ + if(prev_argv != argv || prev_argc != argc) + { + /* Initialize variables */ + prev_argv = argv; + prev_argc = argc; + argv_index = 1; + argv_index2 = 1; + opt_offset = 1; + dashdash = 0; + nonopt = 0; + } + + /* Jump point in case we want to ignore the current argv_index */ + getopt_top: + + /* Misc. initializations */ + optarg = NULL; + + /* Dash-dash check */ + if(argv[argv_index] && !strcmp(argv[argv_index], "--")) + { + dashdash = 1; + increment_index(); + } + + /* If we're at the end of argv, that's it. */ + if(argv[argv_index] == NULL) + { + c = -1; + } + /* Are we looking at a string? Single dash is also a string */ + else if(dashdash || argv[argv_index][0] != '-' || !strcmp(argv[argv_index], "-")) + { + /* If we want a string... */ + if(optstr[0] == '-') + { + c = 1; + optarg = argv[argv_index]; + increment_index(); + } + /* If we really don't want it (we're in POSIX mode), we're done */ + else if(optstr[0] == '+' || getenv("POSIXLY_CORRECT")) + { + c = -1; + + /* Everything else is a non-opt argument */ + nonopt = argc - argv_index; + } + /* If we mildly don't want it, then move it back */ + else + { + if(!permute_argv_once()) goto getopt_top; + else c = -1; + } + } + /* Otherwise we're looking at an option */ + else + { + char* opt_ptr = NULL; + + /* Grab the option */ + c = argv[argv_index][opt_offset++]; + + /* Is the option in the optstr? */ + if(optstr[0] == '-') opt_ptr = strchr(optstr+1, c); + else opt_ptr = strchr(optstr, c); + /* Invalid argument */ + if(!opt_ptr) + { + if(opterr) + { + fprintf(stderr, "%s: invalid option -- %c\n", argv[0], c); + } + + optopt = c; + c = '?'; + + /* Move onto the next option */ + increment_index(); + } + /* Option takes argument */ + else if(opt_ptr[1] == ':') + { + /* ie, -oARGUMENT, -xxxoARGUMENT, etc. */ + if(argv[argv_index][opt_offset] != '\0') + { + optarg = &argv[argv_index][opt_offset]; + increment_index(); + } + /* ie, -o ARGUMENT (only if it's a required argument) */ + else if(opt_ptr[2] != ':') + { + /* One of those "you're not expected to understand this" moment */ + if(argv_index2 < argv_index) argv_index2 = argv_index; + while(argv[++argv_index2] && argv[argv_index2][0] == '-'); + optarg = argv[argv_index2]; + + /* Don't cross into the non-option argument list */ + if(argv_index2 + nonopt >= prev_argc) optarg = NULL; + + /* Move onto the next option */ + increment_index(); + } + else + { + /* Move onto the next option */ + increment_index(); + } + + /* In case we got no argument for an option with required argument */ + if(optarg == NULL && opt_ptr[2] != ':') + { + optopt = c; + c = '?'; + + if(opterr) + { + fprintf(stderr,"%s: option requires an argument -- %c\n", + argv[0], optopt); + } + } + } + /* Option does not take argument */ + else + { + /* Next argv_index */ + if(argv[argv_index][opt_offset] == '\0') + { + increment_index(); + } + } + } + + /* Calculate optind */ + if(c == -1) + { + optind = argc - nonopt; + } + else + { + optind = argv_index; + } + + return c; +} + + +/* vim:ts=3 +*/ diff -Nru glfw-2.6/examples/getopt.h glfw-2.7.2/examples/getopt.h --- glfw-2.6/examples/getopt.h 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/examples/getopt.h 2010-08-25 13:40:52.000000000 +0000 @@ -0,0 +1,63 @@ +/***************************************************************************** +* getopt.h - competent and free getopt library. +* $Header: /cvsroot/freegetopt/freegetopt/getopt.h,v 1.2 2003/10/26 03:10:20 vindaci Exp $ +* +* Copyright (c)2002-2003 Mark K. Kim +* 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. +* +* * Neither the original author of this software nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "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 THE +* COPYRIGHT OWNER OR CONTRIBUTORS 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 GETOPT_H_ +#define GETOPT_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + + +extern char* optarg; +extern int optind; +extern int opterr; +extern int optopt; + +int getopt(int argc, char** argv, char* optstr); + + +#ifdef __cplusplus +} +#endif + + +#endif /* GETOPT_H_ */ + + +/* vim:ts=3 +*/ diff -Nru glfw-2.6/examples/heightmap.c glfw-2.7.2/examples/heightmap.c --- glfw-2.6/examples/heightmap.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/examples/heightmap.c 2010-08-26 12:07:28.000000000 +0000 @@ -0,0 +1,850 @@ +//======================================================================== +// Heightmap example program using OpenGL 3 core profile +// Copyright (c) 2010 Olivier Delannoy +// +// 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. +// +//======================================================================== + +#include +#include +#include +#include +#include +#include "getopt.h" + + +#define GLFW_NO_GLU 1 +#include + +/* OpenGL 3.3 support + * Functions are effectively mapped in init_opengl() */ +#ifndef GL_VERSION_3_0 +/* no defines */ +#endif + +#ifndef GL_VERSION_2_0 + +typedef char GLchar; + +#define GL_BLEND_EQUATION_RGB 0x8009 +#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_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_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#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_VERSION_1_5 + +typedef ptrdiff_t GLintptr; +typedef ptrdiff_t GLsizeiptr; + +#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_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 +#endif + + + + +/* OpenGL 3.0 */ +typedef void (APIENTRY * PFN_glGenVertexArrays)(GLsizei n, GLuint *arrays); +typedef void (APIENTRY * PFN_glBindVertexArray)(GLuint array); +typedef void (APIENTRY * PFN_glDeleteVertexArrays)(GLsizei n, GLuint *arrays); +/* OpenGL 2.0 */ +typedef GLuint (APIENTRY * PFN_glCreateShader)(GLenum type); +typedef void (APIENTRY * PFN_glDeleteShader)(GLuint shader); +typedef void (APIENTRY * PFN_glCompileShader)(GLuint shader); +typedef void (APIENTRY * PFN_glShaderSource)(GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); +typedef void (APIENTRY * PFN_glGetShaderiv)(GLuint shader, GLenum pname, GLint *params); +typedef void (APIENTRY * PFN_glGetShaderInfoLog)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef GLuint (APIENTRY * PFN_glCreateProgram)(void); +typedef void (APIENTRY * PFN_glDeleteProgram)(GLuint program); +typedef void (APIENTRY * PFN_glAttachShader)(GLuint program, GLuint shader); +typedef void (APIENTRY * PFN_glLinkProgram)(GLuint program); +typedef void (APIENTRY * PFN_glGetProgramiv)(GLuint program, GLenum pname, GLint *params); +typedef void (APIENTRY * PFN_glGetProgramInfoLog)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRY * PFN_glValidateProgram)(GLuint program); +typedef void (APIENTRY * PFN_glUseProgram)(GLuint program); +typedef GLint (APIENTRY * PFN_glGetUniformLocation)(GLuint program, const GLchar *name); +typedef void (APIENTRY * PFN_glUniformMatrix4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef GLint (APIENTRY * PFN_glGetAttribLocation)(GLuint program, const GLchar *name); +typedef void (APIENTRY * PFN_glEnableVertexAttribArray)(GLuint index); +typedef void (APIENTRY * PFN_glVertexAttrib1f)(GLuint index, GLfloat x); +typedef void (APIENTRY * PFN_glVertexAttribPointer)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +/* OpenGL 1.5 */ +typedef void (APIENTRY * PFN_glBindBuffer)(GLenum target, GLuint buffer); +typedef void (APIENTRY * PFN_glDeleteBuffers)(GLsizei n, const GLuint *buffers); +typedef void (APIENTRY * PFN_glGenBuffers)(GLsizei n, GLuint *buffers); +typedef void (APIENTRY * PFN_glBufferData)(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); +typedef void (APIENTRY * PFN_glBufferSubData)(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); + +/* OpenGL function pointers */ +static PFN_glGenBuffers pglGenBuffers = NULL; +static PFN_glGenVertexArrays pglGenVertexArrays = NULL; +static PFN_glDeleteVertexArrays pglDeleteVertexArrays = NULL; +static PFN_glCreateShader pglCreateShader = NULL; +static PFN_glShaderSource pglShaderSource = NULL; +static PFN_glCompileShader pglCompileShader = NULL; +static PFN_glGetShaderiv pglGetShaderiv = NULL; +static PFN_glGetShaderInfoLog pglGetShaderInfoLog = NULL; +static PFN_glDeleteShader pglDeleteShader = NULL; +static PFN_glCreateProgram pglCreateProgram = NULL; +static PFN_glAttachShader pglAttachShader = NULL; +static PFN_glLinkProgram pglLinkProgram = NULL; +static PFN_glUseProgram pglUseProgram = NULL; +static PFN_glGetProgramiv pglGetProgramiv = NULL; +static PFN_glGetProgramInfoLog pglGetProgramInfoLog = NULL; +static PFN_glDeleteProgram pglDeleteProgram = NULL; +static PFN_glGetUniformLocation pglGetUniformLocation = NULL; +static PFN_glUniformMatrix4fv pglUniformMatrix4fv = NULL; +static PFN_glGetAttribLocation pglGetAttribLocation = NULL; + +/* Map height updates */ +#define MAX_CIRCLE_SIZE (5.0f) +#define MAX_DISPLACEMENT (1.0f) +#define DISPLACEMENT_SIGN_LIMIT (0.3f) +#define MAX_ITER (200) +#define NUM_ITER_AT_A_TIME (1) + +/* Map general information */ +#define MAP_SIZE (10.0f) +#define MAP_NUM_VERTICES (80) +#define MAP_NUM_TOTAL_VERTICES (MAP_NUM_VERTICES*MAP_NUM_VERTICES) +#define MAP_NUM_LINES (3* (MAP_NUM_VERTICES - 1) * (MAP_NUM_VERTICES - 1) + \ + 2 * (MAP_NUM_VERTICES - 1)) + + +/* OpenGL function pointers */ + +static PFN_glBindVertexArray pglBindVertexArray = NULL; +static PFN_glBufferData pglBufferData = NULL; +static PFN_glBindBuffer pglBindBuffer = NULL; +static PFN_glBufferSubData pglBufferSubData = NULL; +static PFN_glEnableVertexAttribArray pglEnableVertexAttribArray = NULL; +static PFN_glVertexAttribPointer pglVertexAttribPointer = NULL; + +#define RESOLVE_GL_FCN(type, var, name) \ + if (status == GL_TRUE) \ + {\ + var = glfwGetProcAddress((name));\ + if ((var) == NULL)\ + {\ + status = GL_FALSE;\ + }\ + } + + +static GLboolean init_opengl(void) +{ + GLboolean status = GL_TRUE; + RESOLVE_GL_FCN(PFN_glCreateShader, pglCreateShader, "glCreateShader"); + RESOLVE_GL_FCN(PFN_glShaderSource, pglShaderSource, "glShaderSource"); + RESOLVE_GL_FCN(PFN_glCompileShader, pglCompileShader, "glCompileShader"); + RESOLVE_GL_FCN(PFN_glGetShaderiv, pglGetShaderiv, "glGetShaderiv"); + RESOLVE_GL_FCN(PFN_glGetShaderInfoLog, pglGetShaderInfoLog, "glGetShaderInfoLog"); + RESOLVE_GL_FCN(PFN_glDeleteShader, pglDeleteShader, "glDeleteShader"); + RESOLVE_GL_FCN(PFN_glCreateProgram, pglCreateProgram, "glCreateProgram"); + RESOLVE_GL_FCN(PFN_glAttachShader, pglAttachShader, "glAttachShader"); + RESOLVE_GL_FCN(PFN_glLinkProgram, pglLinkProgram, "glLinkProgram"); + RESOLVE_GL_FCN(PFN_glUseProgram, pglUseProgram, "glUseProgram"); + RESOLVE_GL_FCN(PFN_glGetProgramiv, pglGetProgramiv, "glGetProgramiv"); + RESOLVE_GL_FCN(PFN_glGetProgramInfoLog, pglGetProgramInfoLog, "glGetProgramInfoLog"); + RESOLVE_GL_FCN(PFN_glDeleteProgram, pglDeleteProgram, "glDeleteProgram"); + RESOLVE_GL_FCN(PFN_glGetUniformLocation, pglGetUniformLocation, "glGetUniformLocation"); + RESOLVE_GL_FCN(PFN_glUniformMatrix4fv, pglUniformMatrix4fv, "glUniformMatrix4fv"); + RESOLVE_GL_FCN(PFN_glGetAttribLocation, pglGetAttribLocation, "glGetAttribLocation"); + RESOLVE_GL_FCN(PFN_glGenVertexArrays, pglGenVertexArrays, "glGenVertexArrays"); + RESOLVE_GL_FCN(PFN_glDeleteVertexArrays, pglDeleteVertexArrays, "glDeleteVertexArrays"); + RESOLVE_GL_FCN(PFN_glBindVertexArray, pglBindVertexArray, "glBindVertexArray"); + RESOLVE_GL_FCN(PFN_glGenBuffers, pglGenBuffers, "glGenBuffers"); + RESOLVE_GL_FCN(PFN_glBindBuffer, pglBindBuffer, "glBindBuffer"); + RESOLVE_GL_FCN(PFN_glBufferData, pglBufferData, "glBufferData"); + RESOLVE_GL_FCN(PFN_glBufferSubData, pglBufferSubData, "glBufferSubData"); + RESOLVE_GL_FCN(PFN_glEnableVertexAttribArray, pglEnableVertexAttribArray, "glEnableVertexAttribArray"); + RESOLVE_GL_FCN(PFN_glVertexAttribPointer, pglVertexAttribPointer, "glVertexAttribPointer"); + return status; +} +/********************************************************************** + * Default shader programs + *********************************************************************/ + +static const char* default_vertex_shader = +"#version 150\n" +"uniform mat4 project;\n" +"uniform mat4 modelview;\n" +"in float x;\n" +"in float y;\n" +"in float z;\n" +"\n" +"void main()\n" +"{\n" +" gl_Position = project * modelview * vec4(x, y, z, 1.0);\n" +"}\n"; + +static const char* default_fragment_shader = +"#version 150\n" +"out vec4 gl_FragColor;\n" +"void main()\n" +"{\n" +" gl_FragColor = vec4(0.2, 1.0, 0.2, 1.0); \n" +"}\n"; + +/********************************************************************** + * Values for shader uniforms + *********************************************************************/ + +/* Frustum configuration */ +static GLfloat view_angle = 45.0f; +static GLfloat aspect_ratio = 4.0f/3.0f; +static GLfloat z_near = 1.0f; +static GLfloat z_far = 100.f; + +/* Projection matrix */ +static GLfloat projection_matrix[16] = { + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f +}; + +/* Model view matrix */ +static GLfloat modelview_matrix[16] = { + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f +}; + +/********************************************************************** + * Heightmap vertex and index data + *********************************************************************/ + +static GLfloat map_vertices[3][MAP_NUM_TOTAL_VERTICES]; +static GLuint map_line_indices[2*MAP_NUM_LINES]; + +/* Store uniform location for the shaders + * Those values are setup as part of the process of creating + * the shader program. They should not be used before creating + * the program. + */ +static GLuint mesh; +static GLuint mesh_vbo[4]; + +/********************************************************************** + * OpenGL helper functions + *********************************************************************/ + +/* Load a (text) file into memory and return its contents + */ +static char* read_file_content(const char* filename) +{ + FILE* fd; + size_t size = 0; + char* result = NULL; + + fd = fopen(filename, "r"); + if (fd != NULL) + { + size = fseek(fd, 0, SEEK_END); + (void) fseek(fd, 0, SEEK_SET); + + result = malloc(size + 1); + result[size] = '\0'; + if (fread(result, size, 1, fd) != 1) + { + free(result); + result = NULL; + } + (void) fclose(fd); + } + return result; +} + +/* Creates a shader object of the specified type using the specified text + */ +static GLuint make_shader(GLenum type, const char* shader_src) +{ + GLuint shader; + GLint shader_ok; + GLsizei log_length; + char info_log[8192]; + + shader = pglCreateShader(type); + if (shader != 0) + { + pglShaderSource(shader, 1, (const GLchar**)&shader_src, NULL); + pglCompileShader(shader); + pglGetShaderiv(shader, GL_COMPILE_STATUS, &shader_ok); + if (shader_ok != GL_TRUE) + { + fprintf(stderr, "ERROR: Failed to compile %s shader\n", (type == GL_FRAGMENT_SHADER) ? "fragment" : "vertex" ); + pglGetShaderInfoLog(shader, 8192, &log_length,info_log); + fprintf(stderr, "ERROR: \n%s\n\n", info_log); + pglDeleteShader(shader); + shader = 0; + } + } + return shader; +} + +/* Creates a program object using the specified vertex and fragment text + */ +static GLuint make_shader_program(const char* vertex_shader_src, const char* fragment_shader_src) +{ + GLuint program = 0u; + GLint program_ok; + GLuint vertex_shader = 0u; + GLuint fragment_shader = 0u; + GLsizei log_length; + char info_log[8192]; + + vertex_shader = make_shader(GL_VERTEX_SHADER, (vertex_shader_src == NULL) ? default_vertex_shader : vertex_shader_src); + if (vertex_shader != 0u) + { + fragment_shader = make_shader(GL_FRAGMENT_SHADER, (fragment_shader_src == NULL) ? default_fragment_shader : fragment_shader_src); + if (fragment_shader != 0u) + { + /* make the program that connect the two shader and link it */ + program = pglCreateProgram(); + if (program != 0u) + { + /* attach both shader and link */ + pglAttachShader(program, vertex_shader); + pglAttachShader(program, fragment_shader); + pglLinkProgram(program); + pglGetProgramiv(program, GL_LINK_STATUS, &program_ok); + + if (program_ok != GL_TRUE) + { + fprintf(stderr, "ERROR, failed to link shader program\n"); + pglGetProgramInfoLog(program, 8192, &log_length, info_log); + fprintf(stderr, "ERROR: \n%s\n\n", info_log); + pglDeleteProgram(program); + pglDeleteShader(fragment_shader); + pglDeleteShader(vertex_shader); + program = 0u; + } + } + } + else + { + fprintf(stderr, "ERROR: Unable to load fragment shader\n"); + pglDeleteShader(vertex_shader); + } + } + else + { + fprintf(stderr, "ERROR: Unable to load vertex shader\n"); + } + return program; +} + +/********************************************************************** + * Geometry creation functions + *********************************************************************/ + +/* Generate vertices and indices for the heightmap + */ +static void init_map(void) +{ + int i; + int j; + int k; + GLfloat step = MAP_SIZE / (MAP_NUM_VERTICES - 1); + GLfloat x = 0.0f; + GLfloat z = 0.0f; + /* Create a flat grid */ + k = 0; + for (i = 0 ; i < MAP_NUM_VERTICES ; ++i) + { + for (j = 0 ; j < MAP_NUM_VERTICES ; ++j) + { + map_vertices[0][k] = x; + map_vertices[1][k] = 0.0f; + map_vertices[2][k] = z; + z += step; + ++k; + } + x += step; + z = 0.0f; + } +#if DEBUG_ENABLED + for (i = 0 ; i < MAP_NUM_TOTAL_VERTICES ; ++i) + { + printf ("Vertice %d (%f, %f, %f)\n", + i, map_vertices[0][i], map_vertices[1][i], map_vertices[2][i]); + + } +#endif + /* create indices */ + /* line fan based on i + * i+1 + * | / i + n + 1 + * | / + * |/ + * i --- i + n + */ + + /* close the top of the square */ + k = 0; + for (i = 0 ; i < MAP_NUM_VERTICES -1 ; ++i) + { + map_line_indices[k++] = (i + 1) * MAP_NUM_VERTICES -1; + map_line_indices[k++] = (i + 2) * MAP_NUM_VERTICES -1; + } + /* close the right of the square */ + for (i = 0 ; i < MAP_NUM_VERTICES -1 ; ++i) + { + map_line_indices[k++] = (MAP_NUM_VERTICES - 1) * MAP_NUM_VERTICES + i; + map_line_indices[k++] = (MAP_NUM_VERTICES - 1) * MAP_NUM_VERTICES + i + 1; + } + + for (i = 0 ; i < (MAP_NUM_VERTICES - 1) ; ++i) + { + for (j = 0 ; j < (MAP_NUM_VERTICES - 1) ; ++j) + { + int ref = i * (MAP_NUM_VERTICES) + j; + map_line_indices[k++] = ref; + map_line_indices[k++] = ref + 1; + + map_line_indices[k++] = ref; + map_line_indices[k++] = ref + MAP_NUM_VERTICES; + + map_line_indices[k++] = ref; + map_line_indices[k++] = ref + MAP_NUM_VERTICES + 1; + } + } + +#ifdef DEBUG_ENABLED + for (k = 0 ; k < 2 * MAP_NUM_LINES ; k += 2) + { + int beg, end; + beg = map_line_indices[k]; + end = map_line_indices[k+1]; + printf ("Line %d: %d -> %d (%f, %f, %f) -> (%f, %f, %f)\n", + k / 2, beg, end, + map_vertices[0][beg], map_vertices[1][beg], map_vertices[2][beg], + map_vertices[0][end], map_vertices[1][end], map_vertices[2][end]); + } +#endif +} + +static void generate_heightmap__circle(float* center_x, float* center_y, + float* size, float* displacement) +{ + float sign; + /* random value for element in between [0-1.0] */ + *center_x = (MAP_SIZE * rand()) / (1.0f * RAND_MAX); + *center_y = (MAP_SIZE * rand()) / (1.0f * RAND_MAX); + *size = (MAX_CIRCLE_SIZE * rand()) / (1.0f * RAND_MAX); + sign = (1.0f * rand()) / (1.0f * RAND_MAX); + sign = (sign < DISPLACEMENT_SIGN_LIMIT) ? -1.0f : 1.0f; + *displacement = (sign * (MAX_DISPLACEMENT * rand())) / (1.0f * RAND_MAX); +} + +/* Run the specified number of iterations of the generation process for the + * heightmap + */ +static void update_map(int num_iter) +{ + assert(num_iter > 0); + while(num_iter) + { + /* center of the circle */ + float center_x; + float center_z; + float circle_size; + float disp; + size_t ii; + generate_heightmap__circle(¢er_x, ¢er_z, &circle_size, &disp); + disp = disp / 2.0f; + for (ii = 0u ; ii < MAP_NUM_TOTAL_VERTICES ; ++ii) + { + GLfloat dx = center_x - map_vertices[0][ii]; + GLfloat dz = center_z - map_vertices[2][ii]; + GLfloat pd = (2.0f * sqrtf((dx * dx) + (dz * dz))) / circle_size; + if (fabs(pd) <= 1.0f) + { + /* tx,tz is within the circle */ + GLfloat new_height = disp + (cos(pd*3.14f)*disp); + map_vertices[1][ii] += new_height; + } + } + --num_iter; + } +} + +/********************************************************************** + * OpenGL helper functions + *********************************************************************/ + +/* Create VBO, IBO and VAO objects for the heightmap geometry and bind them to + * the specified program object + */ +static void make_mesh(GLuint program) +{ + GLuint attrloc; + + pglGenVertexArrays(1, &mesh); + pglGenBuffers(4, mesh_vbo); + pglBindVertexArray(mesh); + /* Prepare the data for drawing through a buffer inidices */ + pglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh_vbo[3]); + pglBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)* MAP_NUM_LINES * 2, map_line_indices, GL_STATIC_DRAW); + + /* Prepare the attributes for rendering */ + attrloc = pglGetAttribLocation(program, "x"); + pglBindBuffer(GL_ARRAY_BUFFER, mesh_vbo[0]); + pglBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * MAP_NUM_TOTAL_VERTICES, &map_vertices[0][0], GL_STATIC_DRAW); + pglEnableVertexAttribArray(attrloc); + pglVertexAttribPointer(attrloc, 1, GL_FLOAT, GL_FALSE, 0, 0); + + attrloc = pglGetAttribLocation(program, "z"); + pglBindBuffer(GL_ARRAY_BUFFER, mesh_vbo[2]); + pglBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * MAP_NUM_TOTAL_VERTICES, &map_vertices[2][0], GL_STATIC_DRAW); + pglEnableVertexAttribArray(attrloc); + pglVertexAttribPointer(attrloc, 1, GL_FLOAT, GL_FALSE, 0, 0); + + attrloc = pglGetAttribLocation(program, "y"); + pglBindBuffer(GL_ARRAY_BUFFER, mesh_vbo[1]); + pglBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * MAP_NUM_TOTAL_VERTICES, &map_vertices[1][0], GL_DYNAMIC_DRAW); + pglEnableVertexAttribArray(attrloc); + pglVertexAttribPointer(attrloc, 1, GL_FLOAT, GL_FALSE, 0, 0); +} + +/* Update VBO vertices from source data + */ +static void update_mesh(void) +{ + pglBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLfloat) * MAP_NUM_TOTAL_VERTICES, &map_vertices[1][0]); +} + +/********************************************************************** + * GLFW callback functions + *********************************************************************/ + +/* The program runs as long as this is GL_TRUE + */ +static GLboolean running = GL_TRUE; + +/* GLFW Window management functions */ +static int GLFWCALL close_window_callback(void) +{ + running = GL_FALSE; + + /* Disallow window closing + * The window will be closed when the main loop terminates */ + return GL_FALSE; +} + +static void GLFWCALL key_callback(int key, int action) +{ + switch(key) + { + case GLFW_KEY_ESC: + /* Exit program on Escape */ + running = GL_FALSE; + break; + } +} + +/* Print usage information */ +static void usage(void) +{ + printf("Usage: heightmap [-v ] [-f ]\n"); + printf(" heightmap [-h]\n"); +} + +int main(int argc, char** argv) +{ + int ch, iter; + double dt; + double last_update_time; + int frame; + float f; + GLint uloc_modelview; + GLint uloc_project; + + char* vertex_shader_path = NULL; + char* fragment_shader_path = NULL; + char* vertex_shader_src = NULL; + char* fragment_shader_src = NULL; + GLuint shader_program; + + while ((ch = getopt(argc, argv, "f:v:h")) != -1) + { + switch (ch) + { + case 'f': + fragment_shader_path = optarg; + break; + case 'v': + vertex_shader_path = optarg; + break; + case 'h': + usage(); + exit(EXIT_SUCCESS); + default: + usage(); + exit(EXIT_FAILURE); + } + } + + if (fragment_shader_path) + { + vertex_shader_src = read_file_content(fragment_shader_path); + if (!fragment_shader_src) + { + fprintf(stderr, + "ERROR: unable to load fragment shader from '%s'\n", + fragment_shader_path); + exit(EXIT_FAILURE); + } + } + + if (vertex_shader_path) + { + vertex_shader_src = read_file_content(vertex_shader_path); + if (!vertex_shader_src) + { + fprintf(stderr, + "ERROR: unable to load vertex shader from '%s'\n", + fragment_shader_path); + exit(EXIT_FAILURE); + } + } + + if (GL_TRUE != glfwInit()) + { + fprintf(stderr, "ERROR: Unable to initialize GLFW\n"); + usage(); + + free(vertex_shader_src); + free(fragment_shader_src); + exit(EXIT_FAILURE); + } + + glfwEnable(GLFW_AUTO_POLL_EVENTS); /* No explicit call to glfwPollEvents() */ + + glfwOpenWindowHint(GLFW_WINDOW_NO_RESIZE, GL_TRUE); + glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); + glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2); + glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_FALSE); + + if (GL_TRUE != glfwOpenWindow(800, 600, 0, 0, 0, 0, 0, 0, GLFW_WINDOW)) + { + fprintf(stderr, "ERROR: Unable to create the OpenGL context and associated window\n"); + usage(); + + free(vertex_shader_src); + free(fragment_shader_src); + exit(EXIT_FAILURE); + } + + glfwSetWindowTitle("GLFW OpenGL3 Heightmap demo"); + /* Register events callback */ + glfwSetWindowCloseCallback(close_window_callback); + glfwSetKeyCallback(key_callback); + + if (GL_TRUE != init_opengl()) + { + fprintf(stderr, "ERROR: unable to resolve OpenGL function pointers\n"); + free(vertex_shader_src); + free(fragment_shader_src); + exit(EXIT_FAILURE); + } + /* Prepare opengl resources for rendering */ + shader_program = make_shader_program(vertex_shader_src , fragment_shader_src); + free(vertex_shader_src); + free(fragment_shader_src); + + if (shader_program == 0u) + { + fprintf(stderr, "ERROR: during creation of the shader program\n"); + usage(); + exit(EXIT_FAILURE); + } + + pglUseProgram(shader_program); + uloc_project = pglGetUniformLocation(shader_program, "project"); + uloc_modelview = pglGetUniformLocation(shader_program, "modelview"); + + /* Compute the projection matrix */ + f = 1.0f / tanf(view_angle / 2.0f); + projection_matrix[0] = f / aspect_ratio; + projection_matrix[5] = f; + projection_matrix[10] = (z_far + z_near)/ (z_near - z_far); + projection_matrix[11] = -1.0f; + projection_matrix[14] = 2.0f * (z_far * z_near) / (z_near - z_far); + pglUniformMatrix4fv(uloc_project, 1, GL_FALSE, projection_matrix); + + /* Set the camera position */ + modelview_matrix[12] = -5.0f; + modelview_matrix[13] = -5.0f; + modelview_matrix[14] = -20.0f; + pglUniformMatrix4fv(uloc_modelview, 1, GL_FALSE, modelview_matrix); + + /* Create mesh data */ + init_map(); + make_mesh(shader_program); + + /* Create vao + vbo to store the mesh */ + /* Create the vbo to store all the information for the grid and the height */ + + /* setup the scene ready for rendering */ + glViewport(0, 0, 800, 600); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + /* main loop */ + frame = 0; + iter = 0; + dt = last_update_time = glfwGetTime(); + + while (running) + { + ++frame; + /* render the next frame */ + glClear(GL_COLOR_BUFFER_BIT); + glDrawElements(GL_LINES, 2* MAP_NUM_LINES , GL_UNSIGNED_INT, 0); + + /* display and process events through callbacks */ + glfwSwapBuffers(); + /* Check the frame rate and update the heightmap if needed */ + dt = glfwGetTime(); + if ((dt - last_update_time) > 0.2) + { + /* generate the next iteration of the heightmap */ + if (iter < MAX_ITER) + { + update_map(NUM_ITER_AT_A_TIME); + update_mesh(); + iter += NUM_ITER_AT_A_TIME; + } + last_update_time = dt; + frame = 0; + } + } + + exit(EXIT_SUCCESS); +} + diff -Nru glfw-2.6/examples/keytest.c glfw-2.7.2/examples/keytest.c --- glfw-2.6/examples/keytest.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/keytest.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,264 +0,0 @@ -//======================================================================== -// This is a small test application for GLFW. -// Keyboard input test. -//======================================================================== - -#include -#include -#include - -int running; -int keyrepeat = 0; -int systemkeys = 1; - - -//======================================================================== -// keyfun() -//======================================================================== - -void GLFWCALL keyfun( int key, int action ) -{ - if( action != GLFW_PRESS ) - { - return; - } - - switch( key ) - { - case GLFW_KEY_ESC: - printf( "ESC => quit program\n" ); - running = GL_FALSE; - break; - case GLFW_KEY_F1: - case GLFW_KEY_F2: - case GLFW_KEY_F3: - case GLFW_KEY_F4: - case GLFW_KEY_F5: - case GLFW_KEY_F6: - case GLFW_KEY_F7: - case GLFW_KEY_F8: - case GLFW_KEY_F9: - case GLFW_KEY_F10: - case GLFW_KEY_F11: - case GLFW_KEY_F12: - case GLFW_KEY_F13: - case GLFW_KEY_F14: - case GLFW_KEY_F15: - case GLFW_KEY_F16: - case GLFW_KEY_F17: - case GLFW_KEY_F18: - case GLFW_KEY_F19: - case GLFW_KEY_F20: - case GLFW_KEY_F21: - case GLFW_KEY_F22: - case GLFW_KEY_F23: - case GLFW_KEY_F24: - case GLFW_KEY_F25: - printf( "F%d\n", 1 + key - GLFW_KEY_F1 ); - break; - case GLFW_KEY_UP: - printf( "UP\n" ); - break; - case GLFW_KEY_DOWN: - printf( "DOWN\n" ); - break; - case GLFW_KEY_LEFT: - printf( "LEFT\n" ); - break; - case GLFW_KEY_RIGHT: - printf( "RIGHT\n" ); - break; - case GLFW_KEY_LSHIFT: - printf( "LSHIFT\n" ); - break; - case GLFW_KEY_RSHIFT: - printf( "RSHIFT\n" ); - break; - case GLFW_KEY_LCTRL: - printf( "LCTRL\n" ); - break; - case GLFW_KEY_RCTRL: - printf( "RCTRL\n" ); - break; - case GLFW_KEY_LALT: - printf( "LALT\n" ); - break; - case GLFW_KEY_RALT: - printf( "RALT\n" ); - break; - case GLFW_KEY_TAB: - printf( "TAB\n" ); - break; - case GLFW_KEY_ENTER: - printf( "ENTER\n" ); - break; - case GLFW_KEY_BACKSPACE: - printf( "BACKSPACE\n" ); - break; - case GLFW_KEY_INSERT: - printf( "INSERT\n" ); - break; - case GLFW_KEY_DEL: - printf( "DEL\n" ); - break; - case GLFW_KEY_PAGEUP: - printf( "PAGEUP\n" ); - break; - case GLFW_KEY_PAGEDOWN: - printf( "PAGEDOWN\n" ); - break; - case GLFW_KEY_HOME: - printf( "HOME\n" ); - break; - case GLFW_KEY_END: - printf( "END\n" ); - break; - case GLFW_KEY_KP_0: - printf( "KEYPAD 0\n" ); - break; - case GLFW_KEY_KP_1: - printf( "KEYPAD 1\n" ); - break; - case GLFW_KEY_KP_2: - printf( "KEYPAD 2\n" ); - break; - case GLFW_KEY_KP_3: - printf( "KEYPAD 3\n" ); - break; - case GLFW_KEY_KP_4: - printf( "KEYPAD 4\n" ); - break; - case GLFW_KEY_KP_5: - printf( "KEYPAD 5\n" ); - break; - case GLFW_KEY_KP_6: - printf( "KEYPAD 6\n" ); - break; - case GLFW_KEY_KP_7: - printf( "KEYPAD 7\n" ); - break; - case GLFW_KEY_KP_8: - printf( "KEYPAD 8\n" ); - break; - case GLFW_KEY_KP_9: - printf( "KEYPAD 9\n" ); - break; - case GLFW_KEY_KP_DIVIDE: - printf( "KEYPAD DIVIDE\n" ); - break; - case GLFW_KEY_KP_MULTIPLY: - printf( "KEYPAD MULTIPLY\n" ); - break; - case GLFW_KEY_KP_SUBTRACT: - printf( "KEYPAD SUBTRACT\n" ); - break; - case GLFW_KEY_KP_ADD: - printf( "KEYPAD ADD\n" ); - break; - case GLFW_KEY_KP_DECIMAL: - printf( "KEYPAD DECIMAL\n" ); - break; - case GLFW_KEY_KP_EQUAL: - printf( "KEYPAD =\n" ); - break; - case GLFW_KEY_KP_ENTER: - printf( "KEYPAD ENTER\n" ); - break; - case GLFW_KEY_SPACE: - printf( "SPACE\n" ); - break; - case 'R': - keyrepeat = (keyrepeat+1) & 1; - if( keyrepeat ) - { - glfwEnable( GLFW_KEY_REPEAT ); - } - else - { - glfwDisable( GLFW_KEY_REPEAT ); - } - printf( "R => Key repeat: %s\n", keyrepeat ? "ON" : "OFF" ); - break; - case 'S': - systemkeys = (systemkeys+1) & 1; - if( systemkeys ) - { - glfwEnable( GLFW_SYSTEM_KEYS ); - } - else - { - glfwDisable( GLFW_SYSTEM_KEYS ); - } - printf( "S => System keys: %s\n", systemkeys ? "ON" : "OFF" ); - break; - default: - if( key > 0 && key < 256 ) - { - printf( "%c\n", (char) key ); - } - else - { - printf( "???\n" ); - } - break; - } - - fflush( stdout ); -} - - -//======================================================================== -// main() -//======================================================================== - -int main( void ) -{ - int width, height; - double t; - - // Initialise GLFW - glfwInit(); - - // Open OpenGL window - if( !glfwOpenWindow( 250,100, 0,0,0,0, 0,0, GLFW_WINDOW ) ) - { - glfwTerminate(); - return 0; - } - - // Set key callback function - glfwSetKeyCallback( keyfun ); - - // Set tile - glfwSetWindowTitle( "Press some keys!" ); - - // Main loop - running = GL_TRUE; - while( running ) - { - // Get time and mouse position - t = glfwGetTime(); - - // Get window size (may be different than the requested size) - glfwGetWindowSize( &width, &height ); - height = height > 0 ? height : 1; - - // Set viewport - glViewport( 0, 0, width, height ); - - // Clear color buffer - glClearColor( (GLfloat)(0.5+0.5*sin(3.0*t)), 0.0f, 0.0f, 0.0f); - glClear( GL_COLOR_BUFFER_BIT ); - - // Swap buffers - glfwSwapBuffers(); - - // Check if the window was closed - running = running && glfwGetWindowParam( GLFW_OPENED ); - } - - // Close OpenGL window and terminate GLFW - glfwTerminate(); - - return 0; -} diff -Nru glfw-2.6/examples/Makefile.amigaos.gcc glfw-2.7.2/examples/Makefile.amigaos.gcc --- glfw-2.6/examples/Makefile.amigaos.gcc 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/Makefile.amigaos.gcc 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -########################################################################## -# Makefile for GLFW test programs on AmigaOS using GCC. -#------------------------------------------------------------------------- -# To compile the test files using this makefile, run: -# make -f Makefile.amigaos.gcc -########################################################################## - -# Default: Build all tests -default: triangle listmodes mthello pong3d mtbench \ - particles splitview mipmaps keytest gears \ - boing wave - - -# Compiler settings -CC = gcc -CFLAGS = -noixemul -I../include -Wall -O3 -ffast-math -m68020 -m68881 - -# Linker settings -LFLAGS = -L../lib/amigaos -lm -lglfw -lgl -lamiga -s - - - - -# Rule for triangle -triangle: triangle.c - $(CC) $(CFLAGS) triangle.c $(LFLAGS) -o $@ - -# Rule for listmodes -listmodes: listmodes.c - $(CC) $(CFLAGS) listmodes.c $(LFLAGS) -o $@ - -# Rule for mthello -mthello: mthello.c - $(CC) $(CFLAGS) mthello.c $(LFLAGS) -o $@ - -# Rule for pong3d -pong3d: pong3d.c - $(CC) $(CFLAGS) pong3d.c $(LFLAGS) -o $@ - -# Rule for mtbench -mtbench: mtbench.c - $(CC) $(CFLAGS) mtbench.c $(LFLAGS) -o $@ - -# Rule for particles -particles: particles.c - $(CC) $(CFLAGS) particles.c $(LFLAGS) -o $@ - -# Rule for splitview -splitview: splitview.c - $(CC) $(CFLAGS) splitview.c $(LFLAGS) -o $@ - -# Rule for mipmaps -mipmaps: mipmaps.c - $(CC) $(CFLAGS) mipmaps.c $(LFLAGS) -o $@ - -# Rule for keytest -keytest: keytest.c - $(CC) $(CFLAGS) keytest.c $(LFLAGS) -o $@ - -# Rule for gears -gears: gears.c - $(CC) $(CFLAGS) gears.c $(LFLAGS) -o $@ - -# Rule for boing -boing: boing.c - $(CC) $(CFLAGS) boing.c $(LFLAGS) -o $@ - -# Rule for wave -wave: wave.c - $(CC) $(CFLAGS) wave.c $(LFLAGS) -o $@ diff -Nru glfw-2.6/examples/Makefile.amigaos.vbcc glfw-2.7.2/examples/Makefile.amigaos.vbcc --- glfw-2.6/examples/Makefile.amigaos.vbcc 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/Makefile.amigaos.vbcc 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -########################################################################## -# Makefile for GLFW test programs on AmigaOS using VBCC. -#------------------------------------------------------------------------- -# To compile the test files using this makefile, run: -# make -f Makefile.amigaos.vbcc -########################################################################## - -# Default: Build all tests -default: triangle listmodes mthello pong3d mtbench \ - particles splitview mipmaps keytest gears \ - boing wave - - -# Compiler settings -CC = vc -CFLAGS = -I/include -O1 -c99 -cpu=68020 -fpu=68881 - -# Linker settings -LFLAGS = -L/lib/amigaos -lglfw -lgl -lamiga -lm881 - - - - -# Rule for triangle -triangle: triangle.c - $(CC) $(CFLAGS) $(LFLAGS) -o $@ triangle.c - -# Rule for listmodes -listmodes: listmodes.c - $(CC) $(CFLAGS) $(LFLAGS) -o $@ listmodes.c - -# Rule for mthello -mthello: mthello.c - $(CC) $(CFLAGS) $(LFLAGS) -o $@ mthello.c - -# Rule for pong3d -pong3d: pong3d.c - $(CC) $(CFLAGS) $(LFLAGS) -o $@ pong3d.c - -# Rule for mtbench -mtbench: mtbench.c - $(CC) $(CFLAGS) $(LFLAGS) -o $@ mtbench.c - -# Rule for particles -particles: particles.c - $(CC) $(CFLAGS) $(LFLAGS) -o $@ particles.c - -# Rule for splitview -splitview: splitview.c - $(CC) $(CFLAGS) $(LFLAGS) -o $@ splitview.c - -# Rule for mipmaps -mipmaps: mipmaps.c - $(CC) $(CFLAGS) $(LFLAGS) -o $@ mipmaps.c - -# Rule for keytest -keytest: keytest.c - $(CC) $(CFLAGS) $(LFLAGS) -o $@ keytest.c - -# Rule for gears -gears: gears.c - $(CC) $(CFLAGS) $(LFLAGS) -o $@ gears.c - -# Rule for boing -boing: boing.c - $(CC) $(CFLAGS) $(LFLAGS) -o $@ boing.c - -# Rule for wave -wave: wave.c - $(CC) $(CFLAGS) $(LFLAGS) -o $@ wave.c diff -Nru glfw-2.6/examples/Makefile.carbon glfw-2.7.2/examples/Makefile.carbon --- glfw-2.6/examples/Makefile.carbon 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/examples/Makefile.carbon 2010-05-29 18:23:40.000000000 +0000 @@ -0,0 +1,76 @@ +########################################################################## +# Makefile for GLFW test programs on Mac OS X using Apple GCC. +#------------------------------------------------------------------------- +# To compile the test files using this makefile, run: +# make -f Makefile.carbon +########################################################################## + +# Compiler settings +CC = gcc +CFLAGS = -I../include -m32 + +# Linker settings +LIB = ../lib/carbon/libglfw.a +HEADER = ../include/GL/glfw.h +LFLAGS = $(LIB) -framework AGL -framework OpenGL -framework Carbon -m32 + +# Default: Build all tests +all: Triangle.app/Contents/MacOS/Triangle \ + listmodes \ + mthello \ + Pong3D.app/Contents/MacOS/Pong3D \ + mtbench \ + Particles.app/Contents/MacOS/Particles \ + SplitView.app/Contents/MacOS/SplitView \ + Mipmaps.app/Contents/MacOS/Mipmaps \ + Gears.app/Contents/MacOS/Gears \ + Boing.app/Contents/MacOS/Boing \ + Wave.app/Contents/MacOS/Wave + +Triangle.app/Contents/MacOS/Triangle: triangle.c $(LIB) $(HEADER) + /bin/sh bundle.sh Triangle + $(CC) $(CFLAGS) triangle.c $(LFLAGS) -o Triangle.app/Contents/MacOS/Triangle + +listmodes: listmodes.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) listmodes.c $(LFLAGS) -o listmodes + +mthello: mthello.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) mthello.c $(LFLAGS) -o mthello + +Pong3D.app/Contents/MacOS/Pong3D: pong3d.c $(LIB) $(HEADER) + /bin/sh bundle.sh Pong3D + cp pong3d_*.tga Pong3D.app/Contents/Resources/ + $(CC) $(CFLAGS) pong3d.c $(LFLAGS) -o Pong3D.app/Contents/MacOS/Pong3D + +mtbench: mtbench.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) mtbench.c $(LFLAGS) -o mtbench + +Particles.app/Contents/MacOS/Particles: particles.c $(LIB) $(HEADER) + /bin/sh bundle.sh Particles + $(CC) $(CFLAGS) particles.c $(LFLAGS) -o Particles.app/Contents/MacOS/Particles + +SplitView.app/Contents/MacOS/SplitView: splitview.c $(LIB) $(HEADER) + /bin/sh bundle.sh SplitView + $(CC) $(CFLAGS) splitview.c $(LFLAGS) -o SplitView.app/Contents/MacOS/SplitView + +Mipmaps.app/Contents/MacOS/Mipmaps: mipmaps.c $(LIB) $(HEADER) + /bin/sh bundle.sh Mipmaps + cp mipmaps.tga Mipmaps.app/Contents/Resources/ + $(CC) $(CFLAGS) mipmaps.c $(LFLAGS) -o Mipmaps.app/Contents/MacOS/Mipmaps + +Gears.app/Contents/MacOS/Gears: gears.c $(LIB) $(HEADER) + /bin/sh bundle.sh Gears + $(CC) $(CFLAGS) gears.c $(LFLAGS) -o Gears.app/Contents/MacOS/Gears + +Boing.app/Contents/MacOS/Boing: boing.c $(LIB) $(HEADER) + /bin/sh bundle.sh Boing + $(CC) $(CFLAGS) boing.c $(LFLAGS) -o Boing.app/Contents/MacOS/Boing + +Wave.app/Contents/MacOS/Wave: wave.c $(LIB) $(HEADER) + /bin/sh bundle.sh Wave + $(CC) $(CFLAGS) wave.c $(LFLAGS) -o Wave.app/Contents/MacOS/Wave + +clean: + rm -rf Triangle.app listmodes mthello Pong3D.app mtbench Particles.app \ + SplitView.app Mipmaps.app Gears.app Boing.app Wave.app + diff -Nru glfw-2.6/examples/Makefile.carbon.universal glfw-2.7.2/examples/Makefile.carbon.universal --- glfw-2.6/examples/Makefile.carbon.universal 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/examples/Makefile.carbon.universal 2010-05-29 18:23:40.000000000 +0000 @@ -0,0 +1,78 @@ +########################################################################## +# Makefile for GLFW test programs on Mac OS X using Apple GCC. +#------------------------------------------------------------------------- +# To compile the test files using this makefile, run: +# make -f Makefile.carbon.universal +########################################################################## + +# Compiler settings +CC = gcc +FATFLAGS = -isysroot /Developer/SDKs/MacOSX10.4u.sdk \ + -mmacosx-version-min=10.4 -arch ppc -arch i386 +CFLAGS = -I../include $(FATFLAGS) + +# Linker settings +LIB = ../lib/carbon/libglfw.a +HEADER = ../include/GL/glfw.h +LFLAGS = $(LIB) -framework AGL -framework OpenGL -framework Carbon -m32 + +# Default: Build all tests +all: Triangle.app/Contents/MacOS/Triangle \ + listmodes \ + mthello \ + Pong3D.app/Contents/MacOS/Pong3D \ + mtbench \ + Particles.app/Contents/MacOS/Particles \ + SplitView.app/Contents/MacOS/SplitView \ + Mipmaps.app/Contents/MacOS/Mipmaps \ + Gears.app/Contents/MacOS/Gears \ + Boing.app/Contents/MacOS/Boing \ + Wave.app/Contents/MacOS/Wave + +Triangle.app/Contents/MacOS/Triangle: triangle.c $(LIB) $(HEADER) + /bin/sh bundle.sh Triangle + $(CC) $(CFLAGS) triangle.c $(LFLAGS) -o Triangle.app/Contents/MacOS/Triangle + +listmodes: listmodes.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) listmodes.c $(LFLAGS) -o listmodes + +mthello: mthello.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) mthello.c $(LFLAGS) -o mthello + +Pong3D.app/Contents/MacOS/Pong3D: pong3d.c $(LIB) $(HEADER) + /bin/sh bundle.sh Pong3D + cp pong3d_*.tga Pong3D.app/Contents/Resources/ + $(CC) $(CFLAGS) pong3d.c $(LFLAGS) -o Pong3D.app/Contents/MacOS/Pong3D + +mtbench: mtbench.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) mtbench.c $(LFLAGS) -o mtbench + +Particles.app/Contents/MacOS/Particles: particles.c $(LIB) $(HEADER) + /bin/sh bundle.sh Particles + $(CC) $(CFLAGS) particles.c $(LFLAGS) -o Particles.app/Contents/MacOS/Particles + +SplitView.app/Contents/MacOS/SplitView: splitview.c $(LIB) $(HEADER) + /bin/sh bundle.sh SplitView + $(CC) $(CFLAGS) splitview.c $(LFLAGS) -o SplitView.app/Contents/MacOS/SplitView + +Mipmaps.app/Contents/MacOS/Mipmaps: mipmaps.c $(LIB) $(HEADER) + /bin/sh bundle.sh Mipmaps + cp mipmaps.tga Mipmaps.app/Contents/Resources/ + $(CC) $(CFLAGS) mipmaps.c $(LFLAGS) -o Mipmaps.app/Contents/MacOS/Mipmaps + +Gears.app/Contents/MacOS/Gears: gears.c $(LIB) $(HEADER) + /bin/sh bundle.sh Gears + $(CC) $(CFLAGS) gears.c $(LFLAGS) -o Gears.app/Contents/MacOS/Gears + +Boing.app/Contents/MacOS/Boing: boing.c $(LIB) $(HEADER) + /bin/sh bundle.sh Boing + $(CC) $(CFLAGS) boing.c $(LFLAGS) -o Boing.app/Contents/MacOS/Boing + +Wave.app/Contents/MacOS/Wave: wave.c $(LIB) $(HEADER) + /bin/sh bundle.sh Wave + $(CC) $(CFLAGS) wave.c $(LFLAGS) -o Wave.app/Contents/MacOS/Wave + +clean: + rm -rf Triangle.app listmodes mthello Pong3D.app mtbench Particles.app \ + SplitView.app Mipmaps.app Gears.app Boing.app Wave.app + diff -Nru glfw-2.6/examples/Makefile.cocoa glfw-2.7.2/examples/Makefile.cocoa --- glfw-2.6/examples/Makefile.cocoa 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/examples/Makefile.cocoa 2011-07-27 12:33:31.000000000 +0000 @@ -0,0 +1,76 @@ +########################################################################## +# Makefile for GLFW examples on Mac OS X on Cocoa using Apple GCC +#------------------------------------------------------------------------- +# To compile the test files using this makefile, run: +# make -f Makefile.cocoa +########################################################################## + +# Compiler settings +CC ?= cc +CFLAGS ?= -O2 -g +CFLAGS += -I../include + +# Linker settings +LIB = ../lib/cocoa/libglfw.a +LFLAGS = $(LIB) -framework Cocoa -framework OpenGL + +# Default: Build all tests +all: Triangle.app/Contents/MacOS/Triangle \ + listmodes \ + mthello \ + Pong3D.app/Contents/MacOS/Pong3D \ + mtbench \ + Particles.app/Contents/MacOS/Particles \ + SplitView.app/Contents/MacOS/SplitView \ + Mipmaps.app/Contents/MacOS/Mipmaps \ + Gears.app/Contents/MacOS/Gears \ + Boing.app/Contents/MacOS/Boing \ + Wave.app/Contents/MacOS/Wave + +Triangle.app/Contents/MacOS/Triangle: triangle.c $(LIB) + /bin/sh bundle.sh Triangle + $(CC) $(CFLAGS) triangle.c $(LFLAGS) -o Triangle.app/Contents/MacOS/Triangle + +listmodes: listmodes.c $(LIB) + $(CC) $(CFLAGS) listmodes.c $(LFLAGS) -o listmodes + +mthello: mthello.c $(LIB) + $(CC) $(CFLAGS) mthello.c $(LFLAGS) -o mthello + +Pong3D.app/Contents/MacOS/Pong3D: pong3d.c $(LIB) + /bin/sh bundle.sh Pong3D + cp pong3d_*.tga Pong3D.app/Contents/Resources/ + $(CC) $(CFLAGS) pong3d.c $(LFLAGS) -o Pong3D.app/Contents/MacOS/Pong3D + +mtbench: mtbench.c $(LIB) + $(CC) $(CFLAGS) mtbench.c $(LFLAGS) -o mtbench + +Particles.app/Contents/MacOS/Particles: particles.c $(LIB) + /bin/sh bundle.sh Particles + $(CC) $(CFLAGS) particles.c $(LFLAGS) -o Particles.app/Contents/MacOS/Particles + +SplitView.app/Contents/MacOS/SplitView: splitview.c $(LIB) + /bin/sh bundle.sh SplitView + $(CC) $(CFLAGS) splitview.c $(LFLAGS) -o SplitView.app/Contents/MacOS/SplitView + +Mipmaps.app/Contents/MacOS/Mipmaps: mipmaps.c $(LIB) + /bin/sh bundle.sh Mipmaps + cp mipmaps.tga Mipmaps.app/Contents/Resources/ + $(CC) $(CFLAGS) mipmaps.c $(LFLAGS) -o Mipmaps.app/Contents/MacOS/Mipmaps + +Gears.app/Contents/MacOS/Gears: gears.c $(LIB) + /bin/sh bundle.sh Gears + $(CC) $(CFLAGS) gears.c $(LFLAGS) -o Gears.app/Contents/MacOS/Gears + +Boing.app/Contents/MacOS/Boing: boing.c $(LIB) + /bin/sh bundle.sh Boing + $(CC) $(CFLAGS) boing.c $(LFLAGS) -o Boing.app/Contents/MacOS/Boing + +Wave.app/Contents/MacOS/Wave: wave.c $(LIB) + /bin/sh bundle.sh Wave + $(CC) $(CFLAGS) wave.c $(LFLAGS) -o Wave.app/Contents/MacOS/Wave + +clean: + rm -rf Triangle.app listmodes mthello Pong3D.app mtbench Particles.app \ + SplitView.app Mipmaps.app Gears.app Boing.app Wave.app + diff -Nru glfw-2.6/examples/Makefile.dos.djgpp glfw-2.7.2/examples/Makefile.dos.djgpp --- glfw-2.6/examples/Makefile.dos.djgpp 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/Makefile.dos.djgpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -########################################################################## -# Makefile for GLFW test programs under DOS using DJGPP. -#------------------------------------------------------------------------- -# To compile the test files using this makefile, run: -# make -f Makefile.dos.djgpp -# NOTE: You need long filename support (e.g. compile under Windows9x or -# use a LFN driver such as DOSLFN) -########################################################################## - -# Compiler settings -CC = gcc -CFLAGS = -I../include -Wall -O3 -ffast-math - -# Linker settings -LFLAGS = -L../lib/dos -lglfw -lglu -lgl -s - - -# Default: Build all tests -all: triangle.exe listmodes.exe mthello.exe pong3d.exe mtbench.exe \ - particles.exe splitview.exe mipmaps.exe keytest.exe gears.exe \ - boing.exe wave.exe - - -# Rule for triangle -triangle.exe: triangle.c - $(CC) $(CFLAGS) triangle.c $(LFLAGS) -o $@ - -# Rule for listmodes -listmodes.exe: listmodes.c - $(CC) $(CFLAGS) listmodes.c $(LFLAGS) -o $@ - -# Rule for mthello -mthello.exe: mthello.c - $(CC) $(CFLAGS) mthello.c $(LFLAGS) -o $@ - -# Rule for pong3d -pong3d.exe: pong3d.c - $(CC) $(CFLAGS) pong3d.c $(LFLAGS) -lm -o $@ - -# Rule for mtbench -mtbench.exe: mtbench.c - $(CC) $(CFLAGS) mtbench.c $(LFLAGS) -o $@ - -# Rule for particles -particles.exe: particles.c - $(CC) $(CFLAGS) particles.c $(LFLAGS) -lm -o $@ - -# Rule for splitview -splitview.exe: splitview.c - $(CC) $(CFLAGS) splitview.c $(LFLAGS) -lm -o $@ - -# Rule for mipmaps -mipmaps.exe: mipmaps.c - $(CC) $(CFLAGS) mipmaps.c $(LFLAGS) -lm -o $@ - -# Rule for keytest -keytest.exe: keytest.c - $(CC) $(CFLAGS) keytest.c $(LFLAGS) -lm -o $@ - -# Rule for gears -gears.exe: gears.c - $(CC) $(CFLAGS) gears.c $(LFLAGS) -lm -o $@ - -# Rule for boing -boing.exe: boing.c - $(CC) $(CFLAGS) boing.c $(LFLAGS) -lm -o $@ - -# Rule for wave -wave.exe: wave.c - $(CC) $(CFLAGS) wave.c $(LFLAGS) -lm -o $@ - diff -Nru glfw-2.6/examples/Makefile.macosx.gcc glfw-2.7.2/examples/Makefile.macosx.gcc --- glfw-2.6/examples/Makefile.macosx.gcc 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/Makefile.macosx.gcc 1970-01-01 00:00:00.000000000 +0000 @@ -1,96 +0,0 @@ -########################################################################## -# Makefile for GLFW test programs on Windows using Apple GCC. -#------------------------------------------------------------------------- -# To compile the test files using this makefile, run: -# make -f Makefile.macosx.gcc -########################################################################## - -# Compiler settings -CC = gcc -CFLAGS = -I../include - -# Linker settings -LFLAGS = ../lib/macosx/libglfw.a -framework AGL -framework OpenGL -framework Carbon - -# Default: Build all tests -all: Triangle.app/Contents/MacOS/GLFWApplication \ - ListModes.app/Contents/MacOS/GLFWApplication \ - MTHello.app/Contents/MacOS/GLFWApplication \ - Pong3D.app/Contents/MacOS/GLFWApplication \ - MTBench.app/Contents/MacOS/GLFWApplication \ - Particles.app/Contents/MacOS/GLFWApplication \ - SplitView.app/Contents/MacOS/GLFWApplication \ - Mipmaps.app/Contents/MacOS/GLFWApplication \ - KeyTest.app/Contents/MacOS/GLFWApplication \ - Gears.app/Contents/MacOS/GLFWApplication \ - Boing.app/Contents/MacOS/GLFWApplication \ - Wave.app/Contents/MacOS/GLFWApplication - -# Rule for triangle -Triangle.app/Contents/MacOS/GLFWApplication: triangle.c - /bin/sh bundle.sh Triangle - $(CC) $(CFLAGS) triangle.c $(LFLAGS) -o Triangle.app/Contents/MacOS/Triangle - -# Rule for listmodes -ListModes.app/Contents/MacOS/GLFWApplication: listmodes.c - /bin/sh bundle.sh ListModes - $(CC) $(CFLAGS) listmodes.c $(LFLAGS) -o ListModes.app/Contents/MacOS/ListModes - -# Rule for mthello -MTHello.app/Contents/MacOS/GLFWApplication: mthello.c - /bin/sh bundle.sh MTHello - $(CC) $(CFLAGS) mthello.c $(LFLAGS) -o MTHello.app/Contents/MacOS/MTHello - -# Rule for pong3d -Pong3D.app/Contents/MacOS/GLFWApplication: pong3d.c - /bin/sh bundle.sh Pong3D - cp pong3d_*.tga Pong3D.app/Contents/Resources/ - $(CC) $(CFLAGS) pong3d.c $(LFLAGS) -o Pong3D.app/Contents/MacOS/Pong3D - -# Rule for mtbench -MTBench.app/Contents/MacOS/GLFWApplication: mtbench.c - /bin/sh bundle.sh MTBench - $(CC) $(CFLAGS) mtbench.c $(LFLAGS) -o MTBench.app/Contents/MacOS/MTBench - -# Rule for particles -Particles.app/Contents/MacOS/GLFWApplication: particles.c - /bin/sh bundle.sh Particles - $(CC) $(CFLAGS) particles.c $(LFLAGS) -o Particles.app/Contents/MacOS/Particles - -# Rule for splitview -SplitView.app/Contents/MacOS/GLFWApplication: splitview.c - /bin/sh bundle.sh SplitView - $(CC) $(CFLAGS) splitview.c $(LFLAGS) -o SplitView.app/Contents/MacOS/SplitView - -# Rule for mipmaps -Mipmaps.app/Contents/MacOS/GLFWApplication: mipmaps.c - /bin/sh bundle.sh Mipmaps - cp mipmaps.tga Mipmaps.app/Contents/Resources/ - $(CC) $(CFLAGS) mipmaps.c $(LFLAGS) -o Mipmaps.app/Contents/MacOS/Mipmaps - -# Rule for keytest -KeyTest.app/Contents/MacOS/GLFWApplication: keytest.c - /bin/sh bundle.sh KeyTest - $(CC) $(CFLAGS) keytest.c $(LFLAGS) -o KeyTest.app/Contents/MacOS/KeyTest - -# Rule for gears -Gears.app/Contents/MacOS/GLFWApplication: gears.c - /bin/sh bundle.sh Gears - $(CC) $(CFLAGS) gears.c $(LFLAGS) -o Gears.app/Contents/MacOS/Gears - -# Rule for boing -Boing.app/Contents/MacOS/GLFWApplication: boing.c - /bin/sh bundle.sh Boing - $(CC) $(CFLAGS) boing.c $(LFLAGS) -o Boing.app/Contents/MacOS/Boing - -# Rule for wave -Wave.app/Contents/MacOS/GLFWApplication: wave.c - /bin/sh bundle.sh Wave - $(CC) $(CFLAGS) wave.c $(LFLAGS) -o Wave.app/Contents/MacOS/Wave - - -# Clean -clean: - rm -rf Triangle.app ListModes.app MTHello.app Pong3D.app MTBench.app \ - Particles.app SplitView.app Mipmaps.app KeyTest.app Gears.app Boing.app Wave.app - diff -Nru glfw-2.6/examples/Makefile.win32.bcc glfw-2.7.2/examples/Makefile.win32.bcc --- glfw-2.6/examples/Makefile.win32.bcc 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/Makefile.win32.bcc 1970-01-01 00:00:00.000000000 +0000 @@ -1,75 +0,0 @@ -########################################################################## -# Makefile for GLFW test programs on Windows using Borland C++ Builder -# Compiler 5.x. -#------------------------------------------------------------------------- -# To compile the test files using this makefile, run: -# make -f Makefile.win32.bcc -########################################################################## - -# Compiler settings -CC = bcc32 -CFLAGS = -O2 -OS -Ov -q -w-par -I..\\include -#CFLAGS = -O2 -OS -Ov -q -w-par -I..\\include -DGLFW_DLL - -# Linker settings -LFLAGS = ..\\lib\\win32\\glfw.lib opengl32.lib glu32.lib -#LFLAGS = ..\\lib\\win32\\glfwdll.lib opengl32.lib glu32.lib - -# Subsystem settings -WINDOWS = -tW -Dmain="__stdcall WinMain" -CONSOLE = -tWC - - -# Default: Build all tests -all: triangle.exe listmodes.exe mthello.exe pong3d.exe mtbench.exe \ - particles.exe splitview.exe mipmaps.exe keytest.exe gears.exe \ - boing.exe wave.exe - - -# Rule for triangle -triangle.exe: triangle.c - $(CC) $(CFLAGS) -e$@ $(WINDOWS) triangle.c $(LFLAGS) - -# Rule for listmodes -listmodes.exe: listmodes.c - $(CC) $(CFLAGS) -e$@ $(CONSOLE) listmodes.c $(LFLAGS) - -# Rule for mthello -mthello.exe: mthello.c - $(CC) $(CFLAGS) -e$@ $(CONSOLE) mthello.c $(LFLAGS) - -# Rule for pong3d -pong3d.exe: pong3d.c - $(CC) $(CFLAGS) -e$@ $(WINDOWS) pong3d.c $(LFLAGS) - -# Rule for mtbench -mtbench.exe: mtbench.c - $(CC) $(CFLAGS) -e$@ $(CONSOLE) mtbench.c $(LFLAGS) - -# Rule for particles -particles.exe: particles.c - $(CC) $(CFLAGS) -e$@ $(CONSOLE) particles.c $(LFLAGS) - -# Rule for splitview -splitview.exe: splitview.c - $(CC) $(CFLAGS) -e$@ $(WINDOWS) splitview.c $(LFLAGS) - -# Rule for mipmaps -mipmaps.exe: mipmaps.c - $(CC) $(CFLAGS) -e$@ $(WINDOWS) mipmaps.c $(LFLAGS) - -# Rule for keytest -keytest.exe: keytest.c - $(CC) $(CFLAGS) -e$@ $(CONSOLE) keytest.c $(LFLAGS) - -# Rule for gears -gears.exe: gears.c - $(CC) $(CFLAGS) -e$@ $(CONSOLE) gears.c $(LFLAGS) - -# Rule for boing -boing.exe: boing.c - $(CC) $(CFLAGS) -e$@ $(WINDOWS) boing.c $(LFLAGS) - -# Rule for wave -wave.exe: wave.c - $(CC) $(CFLAGS) -e$@ $(WINDOWS) wave.c $(LFLAGS) diff -Nru glfw-2.6/examples/Makefile.win32.cross-mgw glfw-2.7.2/examples/Makefile.win32.cross-mgw --- glfw-2.6/examples/Makefile.win32.cross-mgw 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/Makefile.win32.cross-mgw 2010-08-25 13:54:34.000000000 +0000 @@ -1,5 +1,5 @@ ########################################################################## -# Makefile for GLFW test programs on Windows using MinGW32. +# Makefile for GLFW test programs for Windows on Unix using MinGW32 #------------------------------------------------------------------------- # To compile the test files using this makefile, run: # make -f Makefile.win32.cross-mgw @@ -7,73 +7,58 @@ TARGET ?= i586-mingw32msvc- -# Compiler settings CC = gcc -CFLAGS = -I../include -Wall -O3 -ffast-math +CFLAGS = -I../include -Wall -O2 -# Linker settings -LFLAGS = -L../lib/win32 -lglfw -lglu32 -lopengl32 +LIB = ../lib/win32/libglfw.a +LFLAGS = $(LIB) -lglu32 -lopengl32 -# Subsystem settings WINDOWS = -mwindows -e _mainCRTStartup CONSOLE = -mconsole +BINARIES = triangle.exe listmodes.exe mthello.exe pong3d.exe mtbench.exe \ + particles.exe splitview.exe mipmaps.exe gears.exe boing.exe \ + wave.exe heightmap.exe -# Default: Build all tests -all: triangle.exe listmodes.exe mthello.exe pong3d.exe mtbench.exe \ - particles.exe splitview.exe mipmaps.exe keytest.exe gears.exe \ - boing.exe wave.exe +all: $(BINARIES) - -clean: - @rm -f *.o *.obj *.tds *.exe - - -# Rule for triangle -triangle.exe: triangle.c +triangle.exe: triangle.c $(LIB) $(TARGET)$(CC) $(CFLAGS) $(WINDOWS) triangle.c $(LFLAGS) -o $@ -# Rule for listmodes -listmodes.exe: listmodes.c +listmodes.exe: listmodes.c $(LIB) $(TARGET)$(CC) $(CFLAGS) $(CONSOLE) listmodes.c $(LFLAGS) -o $@ -# Rule for mthello -mthello.exe: mthello.c +mthello.exe: mthello.c $(LIB) $(TARGET)$(CC) $(CFLAGS) $(CONSOLE) mthello.c $(LFLAGS) -o $@ -# Rule for pong3d -pong3d.exe: pong3d.c +pong3d.exe: pong3d.c $(LIB) $(TARGET)$(CC) $(CFLAGS) $(WINDOWS) pong3d.c $(LFLAGS) -lm -o $@ -# Rule for mtbench -mtbench.exe: mtbench.c +mtbench.exe: mtbench.c $(LIB) $(TARGET)$(CC) $(CFLAGS) $(CONSOLE) mtbench.c $(LFLAGS) -o $@ -# Rule for particles -particles.exe: particles.c +particles.exe: particles.c $(LIB) $(TARGET)$(CC) $(CFLAGS) $(CONSOLE) particles.c $(LFLAGS) -lm -o $@ -# Rule for splitview -splitview.exe: splitview.c +splitview.exe: splitview.c $(LIB) $(TARGET)$(CC) $(CFLAGS) $(WINDOWS) splitview.c $(LFLAGS) -lm -o $@ -# Rule for mipmaps -mipmaps.exe: mipmaps.c +mipmaps.exe: mipmaps.c $(LIB) $(TARGET)$(CC) $(CFLAGS) $(WINDOWS) mipmaps.c $(LFLAGS) -lm -o $@ -# Rule for keytest -keytest.exe: keytest.c - $(TARGET)$(CC) $(CFLAGS) $(CONSOLE) keytest.c $(LFLAGS) -lm -o $@ - -# Rule for gears -gears.exe: gears.c - $(TARGET)$(CC) $(CFLAGS) $(CONSOLE) gears.c $(LFLAGS) -lm -o $@ +gears.exe: gears.c $(LIB) + $(TARGET)$(CC) $(CFLAGS) $(WINDOWS) gears.c $(LFLAGS) -lm -o $@ -# Rule for boing -boing.exe: boing.c +boing.exe: boing.c $(LIB) $(TARGET)$(CC) $(CFLAGS) $(WINDOWS) boing.c $(LFLAGS) -lm -o $@ -# Rule for wave -wave.exe: wave.c +wave.exe: wave.c $(LIB) $(TARGET)$(CC) $(CFLAGS) $(WINDOWS) wave.c $(LFLAGS) -lm -o $@ +heightmap.exe: heightmap.c getopt.c $(LIB) + $(TARGET)$(CC) $(CFLAGS) $(WINDOWS) heightmap.c getopt.c $(LFLAGS) -lm -o $@ + + +clean: + rm -f $(BINARIES) + diff -Nru glfw-2.6/examples/Makefile.win32.cygwin glfw-2.7.2/examples/Makefile.win32.cygwin --- glfw-2.6/examples/Makefile.win32.cygwin 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/Makefile.win32.cygwin 2010-08-25 13:54:34.000000000 +0000 @@ -1,79 +1,64 @@ ########################################################################## -# Makefile for GLFW test programs on Windows using Cygwin. +# Makefile for GLFW test programs on Windows using Cygwin #------------------------------------------------------------------------- # To compile the test files using this makefile, run: # make -f Makefile.win32.cygwin ########################################################################## -# Compiler settings CC = gcc -CFLAGS = -I../include -Wall -mwin32 -O3 -ffast-math -#CFLAGS = -I../include -Wall -mwin32 -O3 -ffast-math -DGLFW_DLL +CFLAGS = -I../include -Wall -O2 -mwin32 -mno-cygwin -# Linker settings -LFLAGS = -mno-cygwin -mwindows -L../lib/win32 -lglfw -lglu32 -lopengl32 -lm -s -#LFLAGS = -L../lib/win32 -lglfwdll -lglu32 -lopengl32 -lm -s - -# Subsystem settings -WINDOWS = -mno-cygwin -mwindows -e _mainCRTStartup -CONSOLE = - - -# Default: Build all tests -all: triangle.exe listmodes.exe mthello.exe pong3d.exe mtbench.exe \ - particles.exe splitview.exe mipmaps.exe keytest.exe gears.exe \ - boing.exe wave.exe +LIB = ../lib/win32/libglfw.a +LFLAGS = -mno-cygwin $(LIB) -lglu32 -lopengl32 +WINDOWS = -mwindows -e _mainCRTStartup +CONSOLE = -mconsole -clean: - @rm -f *.o *.obj *.tds *.exe +BINARIES = triangle.exe listmodes.exe mthello.exe pong3d.exe mtbench.exe \ + particles.exe splitview.exe mipmaps.exe gears.exe boing.exe \ + wave.exe heightmap.exe +all: $(BINARIES) -# Rule for triangle -triangle.exe: triangle.c +triangle.exe: triangle.c $(LIB) $(CC) $(CFLAGS) $(WINDOWS) triangle.c $(LFLAGS) -o $@ -# Rule for listmodes -listmodes.exe: listmodes.c +listmodes.exe: listmodes.c $(LIB) $(CC) $(CFLAGS) $(CONSOLE) listmodes.c $(LFLAGS) -o $@ -# Rule for mthello -mthello.exe: mthello.c +mthello.exe: mthello.c $(LIB) $(CC) $(CFLAGS) $(CONSOLE) mthello.c $(LFLAGS) -o $@ -# Rule for pong3d -pong3d.exe: pong3d.c +pong3d.exe: pong3d.c $(LIB) $(CC) $(CFLAGS) $(WINDOWS) pong3d.c $(LFLAGS) -o $@ -# Rule for mtbench -mtbench.exe: mtbench.c +mtbench.exe: mtbench.c $(LIB) $(CC) $(CFLAGS) $(CONSOLE) mtbench.c $(LFLAGS) -o $@ -# Rule for particles -particles.exe: particles.c +particles.exe: particles.c $(LIB) $(CC) $(CFLAGS) $(CONSOLE) particles.c $(LFLAGS) -o $@ -# Rule for splitview -splitview.exe: splitview.c +splitview.exe: splitview.c $(LIB) $(CC) $(CFLAGS) $(WINDOWS) splitview.c $(LFLAGS) -o $@ -# Rule for mipmaps -mipmaps.exe: mipmaps.c +mipmaps.exe: mipmaps.c $(LIB) $(CC) $(CFLAGS) $(WINDOWS) mipmaps.c $(LFLAGS) -o $@ -# Rule for keytest -keytest.exe: keytest.c - $(CC) $(CFLAGS) $(CONSOLE) keytest.c $(LFLAGS) -o $@ - -# Rule for gears -gears.exe: gears.c - $(CC) $(CFLAGS) $(CONSOLE) gears.c $(LFLAGS) -o $@ - -# Rule for boing -boing.exe: boing.c - $(CC) $(CFLAGS) $(CONSOLE) boing.c $(LFLAGS) -o $@ - -# Rule for wave -wave.exe: wave.c - $(CC) $(CFLAGS) $(CONSOLE) wave.c $(LFLAGS) -o $@ +gears.exe: gears.c $(LIB) + $(CC) $(CFLAGS) $(WINDOWS) gears.c $(LFLAGS) -o $@ + +boing.exe: boing.c $(LIB) + $(CC) $(CFLAGS) $(WINDOWS) boing.c $(LFLAGS) -o $@ + +wave.exe: wave.c $(LIB) + $(CC) $(CFLAGS) $(WINDOWS) wave.c $(LFLAGS) -o $@ + +heightmap.exe: heightmap.c getopt.c $(LIB) + $(CC) $(CFLAGS) $(WINDOWS) heightmap.c getopt.c $(LFLAGS) -o $@ + + + + +clean: + rm -f $(BINARIES) diff -Nru glfw-2.6/examples/Makefile.win32.lcc glfw-2.7.2/examples/Makefile.win32.lcc --- glfw-2.6/examples/Makefile.win32.lcc 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/Makefile.win32.lcc 2010-08-25 13:54:34.000000000 +0000 @@ -21,8 +21,8 @@ # Default: Build all tests all: triangle.exe listmodes.exe mthello.exe pong3d.exe mtbench.exe \ - particles.exe splitview.exe mipmaps.exe keytest.exe gears.exe \ - boing.exe wave.exe + particles.exe splitview.exe mipmaps.exe gears.exe boing.exe \ + wave.exe heightmap.exe # Rule for triangle @@ -57,13 +57,9 @@ mipmaps.exe: mipmaps.c $(CC) $(CFLAGS) mipmaps.c $(LFLAGS) -o $@ -s $(WINDOWS) -# Rule for keytest -keytest.exe: keytest.c - $(CC) $(CFLAGS) keytest.c $(LFLAGS) -o $@ -s $(CONSOLE) - # Rule for gears gears.exe: gears.c - $(CC) $(CFLAGS) gears.c $(LFLAGS) -o $@ -s $(CONSOLE) + $(CC) $(CFLAGS) gears.c $(LFLAGS) -o $@ -s $(WINDOWS) # Rule for boing boing.exe: boing.c @@ -72,3 +68,7 @@ # Rule for wave wave.exe: wave.c $(CC) $(CFLAGS) wave.c $(LFLAGS) -o $@ -s $(WINDOWS) + +# Rule for heightmap +heightmap.exe: heightmap.c getopt.c + $(CC) $(CFLAGS) heightmap.c getopt.c $(LFLAGS) -o $@ -s $(WINDOWS) diff -Nru glfw-2.6/examples/Makefile.win32.mgw glfw-2.7.2/examples/Makefile.win32.mgw --- glfw-2.6/examples/Makefile.win32.mgw 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/Makefile.win32.mgw 1970-01-01 00:00:00.000000000 +0000 @@ -1,75 +0,0 @@ -########################################################################## -# Makefile for GLFW test programs on Windows using MinGW32. -#------------------------------------------------------------------------- -# To compile the test files using this makefile, run: -# make -f Makefile.win32.mgw -########################################################################## - -# Compiler settings -CC = gcc -CFLAGS = -I../include -Wall -O3 -ffast-math -#CFLAGS = -I../include -Wall -O3 -ffast-math -DGLFW_DLL - -# Linker settings -LFLAGS = -L../lib/win32 -lglfw -lglu32 -lopengl32 -s -#LFLAGS = -L../lib/win32 -lglfwdll -lglu32 -lopengl32 -s - -# Subsystem settings -WINDOWS = -mwindows -CONSOLE = -mconsole - - -# Default: Build all tests -all: triangle.exe listmodes.exe mthello.exe pong3d.exe mtbench.exe \ - particles.exe splitview.exe mipmaps.exe keytest.exe gears.exe \ - boing.exe wave.exe - - -# Rule for triangle -triangle.exe: triangle.c - $(CC) $(CFLAGS) $(WINDOWS) triangle.c $(LFLAGS) -o $@ - -# Rule for listmodes -listmodes.exe: listmodes.c - $(CC) $(CFLAGS) $(CONSOLE) listmodes.c $(LFLAGS) -o $@ - -# Rule for mthello -mthello.exe: mthello.c - $(CC) $(CFLAGS) $(CONSOLE) mthello.c $(LFLAGS) -o $@ - -# Rule for pong3d -pong3d.exe: pong3d.c - $(CC) $(CFLAGS) $(WINDOWS) pong3d.c $(LFLAGS) -lm -o $@ - -# Rule for mtbench -mtbench.exe: mtbench.c - $(CC) $(CFLAGS) $(CONSOLE) mtbench.c $(LFLAGS) -o $@ - -# Rule for particles -particles.exe: particles.c - $(CC) $(CFLAGS) $(CONSOLE) particles.c $(LFLAGS) -lm -o $@ - -# Rule for splitview -splitview.exe: splitview.c - $(CC) $(CFLAGS) $(WINDOWS) splitview.c $(LFLAGS) -lm -o $@ - -# Rule for mipmaps -mipmaps.exe: mipmaps.c - $(CC) $(CFLAGS) $(WINDOWS) mipmaps.c $(LFLAGS) -lm -o $@ - -# Rule for keytest -keytest.exe: keytest.c - $(CC) $(CFLAGS) $(CONSOLE) keytest.c $(LFLAGS) -lm -o $@ - -# Rule for gears -gears.exe: gears.c - $(CC) $(CFLAGS) $(CONSOLE) gears.c $(LFLAGS) -lm -o $@ - -# Rule for boing -boing.exe: boing.c - $(CC) $(CFLAGS) $(WINDOWS) boing.c $(LFLAGS) -lm -o $@ - -# Rule for wave -wave.exe: wave.c - $(CC) $(CFLAGS) $(WINDOWS) wave.c $(LFLAGS) -lm -o $@ - diff -Nru glfw-2.6/examples/Makefile.win32.mingw glfw-2.7.2/examples/Makefile.win32.mingw --- glfw-2.6/examples/Makefile.win32.mingw 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/examples/Makefile.win32.mingw 2010-08-25 13:54:34.000000000 +0000 @@ -0,0 +1,57 @@ +########################################################################## +# Makefile for GLFW test programs on Windows using bare MinGW +#------------------------------------------------------------------------- +# To compile the test files using this makefile, run: +# make -f Makefile.win32.mingw +########################################################################## + +CC = gcc +CFLAGS = -I../include -Wall -O2 + +LIB = ../lib/win32/libglfw.a +LFLAGS = $(LIB) -lglu32 -lopengl32 -s + +WINDOWS = -mwindows +CONSOLE = -mconsole + +HEADER = ../include/GL/glfw.h + +all: triangle.exe listmodes.exe mthello.exe pong3d.exe mtbench.exe \ + particles.exe splitview.exe mipmaps.exe gears.exe boing.exe \ + wave.exe heightmap.exe + +triangle.exe: triangle.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(WINDOWS) triangle.c $(LFLAGS) -o $@ + +listmodes.exe: listmodes.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) listmodes.c $(LFLAGS) -o $@ + +mthello.exe: mthello.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) mthello.c $(LFLAGS) -o $@ + +pong3d.exe: pong3d.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(WINDOWS) pong3d.c $(LFLAGS) -lm -o $@ + +mtbench.exe: mtbench.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) mtbench.c $(LFLAGS) -o $@ + +particles.exe: particles.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) particles.c $(LFLAGS) -lm -o $@ + +splitview.exe: splitview.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(WINDOWS) splitview.c $(LFLAGS) -lm -o $@ + +mipmaps.exe: mipmaps.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(WINDOWS) mipmaps.c $(LFLAGS) -lm -o $@ + +gears.exe: gears.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(WINDOWS) gears.c $(LFLAGS) -lm -o $@ + +boing.exe: boing.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(WINDOWS) boing.c $(LFLAGS) -lm -o $@ + +wave.exe: wave.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(WINDOWS) wave.c $(LFLAGS) -lm -o $@ + +heightmap.exe: heightmap.c getopt.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(WINDOWS) heightmap.c getopt.c $(LFLAGS) -lm -o $@ diff -Nru glfw-2.6/examples/Makefile.win32.msvc glfw-2.7.2/examples/Makefile.win32.msvc --- glfw-2.6/examples/Makefile.win32.msvc 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/Makefile.win32.msvc 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -########################################################################## -# Makefile for GLFW test programs on Windows using MS VC++ 6.x. -#------------------------------------------------------------------------- -# To compile the test files using this makefile, run: -# nmake -f Makefile.win32.msvc -########################################################################## - -# Compiler settings -CC = cl -CFLAGS = /nologo /Ox /I..\\include -#CFLAGS = /nologo /Ox /I..\\include /DGLFW_DLL - -# Linker settings -LFLAGS = ..\\lib\\win32\\glfw.lib opengl32.lib glu32.lib user32.lib -#LFLAGS = ..\\lib\\win32\\glfwdll.lib opengl32.lib glu32.lib - -# Subsystem settings -WINDOWS = /link /subsystem:windows /entry:mainCRTStartup -CONSOLE = /link /subsystem:console - - -# Default: Build all tests -all: triangle.exe listmodes.exe mthello.exe pong3d.exe mtbench.exe \ - particles.exe splitview.exe mipmaps.exe keytest.exe gears.exe \ - boing.exe wave.exe - - -# Rule for triangle -triangle.exe: triangle.c - $(CC) $(CFLAGS) /Fe$@ triangle.c $(LFLAGS) $(WINDOWS) - -# Rule for listmodes -listmodes.exe: listmodes.c - $(CC) $(CFLAGS) /Fe$@ listmodes.c $(LFLAGS) $(CONSOLE) - -# Rule for mthello -mthello.exe: mthello.c - $(CC) $(CFLAGS) /Fe$@ mthello.c $(LFLAGS) $(CONSOLE) - -# Rule for pong3d -pong3d.exe: pong3d.c - $(CC) $(CFLAGS) /Fe$@ pong3d.c $(LFLAGS) $(WINDOWS) - -# Rule for mtbench -mtbench.exe: mtbench.c - $(CC) $(CFLAGS) /Fe$@ mtbench.c $(LFLAGS) $(CONSOLE) - -# Rule for particles -particles.exe: particles.c - $(CC) $(CFLAGS) /Fe$@ particles.c $(LFLAGS) $(CONSOLE) - -# Rule for splitview -splitview.exe: splitview.c - $(CC) $(CFLAGS) /Fe$@ splitview.c $(LFLAGS) $(WINDOWS) - -# Rule for mipmaps -mipmaps.exe: mipmaps.c - $(CC) $(CFLAGS) /Fe$@ mipmaps.c $(LFLAGS) $(WINDOWS) - -# Rule for keytest -keytest.exe: keytest.c - $(CC) $(CFLAGS) /Fe$@ keytest.c $(LFLAGS) $(CONSOLE) - -# Rule for gears -gears.exe: gears.c - $(CC) $(CFLAGS) /Fe$@ gears.c $(LFLAGS) $(CONSOLE) - -# Rule for boing -boing.exe: boing.c - $(CC) $(CFLAGS) /Fe$@ boing.c $(LFLAGS) $(WINDOWS) - -# Rule for wave -wave.exe: wave.c - $(CC) $(CFLAGS) /Fe$@ wave.c $(LFLAGS) $(WINDOWS) diff -Nru glfw-2.6/examples/Makefile.win32.ow glfw-2.7.2/examples/Makefile.win32.ow --- glfw-2.6/examples/Makefile.win32.ow 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/Makefile.win32.ow 2010-08-25 13:54:34.000000000 +0000 @@ -21,8 +21,8 @@ # Default: Build all tests all: triangle.exe listmodes.exe mthello.exe pong3d.exe mtbench.exe \ - particles.exe splitview.exe mipmaps.exe keytest.exe gears.exe \ - boing.exe wave.exe + particles.exe splitview.exe mipmaps.exe gears.exe boing.exe \ + wave.exe heightmap.exe # Rule for triangle @@ -57,13 +57,9 @@ mipmaps.exe: mipmaps.c $(CC) $(CFLAGS) /Fe$@ mipmaps.c $(LFLAGS) $(WINDOWS) -# Rule for keytest -keytest.exe: keytest.c - $(CC) $(CFLAGS) /Fe$@ keytest.c $(LFLAGS) $(CONSOLE) - # Rule for gears gears.exe: gears.c - $(CC) $(CFLAGS) /Fe$@ gears.c $(LFLAGS) $(CONSOLE) + $(CC) $(CFLAGS) /Fe$@ gears.c $(LFLAGS) $(WINDOWS) # Rule for boing boing.exe: boing.c @@ -72,3 +68,7 @@ # Rule for wave wave.exe: wave.c $(CC) $(CFLAGS) /Fe$@ wave.c $(LFLAGS) $(WINDOWS) + +# Rule for heightmap +heightmap.exe: heightmap.c getopt.c + $(CC) $(CFLAGS) /Fe$@ heightmap.c getopt.c $(LFLAGS) $(WINDOWS) diff -Nru glfw-2.6/examples/Makefile.win32.pellesc glfw-2.7.2/examples/Makefile.win32.pellesc --- glfw-2.6/examples/Makefile.win32.pellesc 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/Makefile.win32.pellesc 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -########################################################################## -# Makefile for GLFW test programs on Windows using Pelles C. -#------------------------------------------------------------------------- -# To compile the test files using this makefile, run: -# pomake /F Makefile.win32.pellesc -########################################################################## - -# Compiler settings -CC = cc -CFLAGS = /Ot /I..\include /Ze -#CFLAGS = /Ot /I..\include /Ze /DGLFW_DLL - -# Linker settings -LFLAGS = /LIBPATH:..\lib\win32 glfw.lib opengl32.lib glu32.lib user32.lib kernel32.lib -#LFLAGS = /LIBPATH:..\lib\win32 glfwdll.lib opengl32.lib glu32.lib kernel32.lib - -# Subsystem settings -WINDOWS = /SUBSYSTEM:WINDOWS /ENTRY:_mainCRTStartup -CONSOLE = /SUBSYSTEM:CONSOLE - - -# Default: Build all tests -all: triangle.exe listmodes.exe mthello.exe pong3d.exe mtbench.exe \ - particles.exe splitview.exe mipmaps.exe keytest.exe gears.exe \ - boing.exe wave.exe - - -# Rule for triangle -triangle.exe: triangle.c - $(CC) $(CFLAGS) triangle.c /OUT:$@ $(WINDOWS) $(LFLAGS) - -# Rule for listmodes -listmodes.exe: listmodes.c - $(CC) $(CFLAGS) listmodes.c /OUT:$@ $(CONSOLE) $(LFLAGS) - -# Rule for mthello -mthello.exe: mthello.c - $(CC) $(CFLAGS) mthello.c /OUT:$@ $(CONSOLE) $(LFLAGS) - -# Rule for pong3d -pong3d.exe: pong3d.c - $(CC) $(CFLAGS) pong3d.c /OUT:$@ $(WINDOWS) $(LFLAGS) - -# Rule for mtbench -mtbench.exe: mtbench.c - $(CC) $(CFLAGS) mtbench.c /OUT:$@ $(CONSOLE) $(LFLAGS) - -# Rule for particles -particles.exe: particles.c - $(CC) $(CFLAGS) particles.c /OUT:$@ $(CONSOLE) $(LFLAGS) - -# Rule for splitview -splitview.exe: splitview.c - $(CC) $(CFLAGS) splitview.c /OUT:$@ $(WINDOWS) $(LFLAGS) - -# Rule for mipmaps -mipmaps.exe: mipmaps.c - $(CC) $(CFLAGS) mipmaps.c /OUT:$@ $(WINDOWS) $(LFLAGS) - -# Rule for keytest -keytest.exe: keytest.c - $(CC) $(CFLAGS) keytest.c /OUT:$@ $(CONSOLE) $(LFLAGS) - -# Rule for gears -gears.exe: gears.c - $(CC) $(CFLAGS) gears.c /OUT:$@ $(CONSOLE) $(LFLAGS) - -# Rule for boing -boing.exe: boing.c - $(CC) $(CFLAGS) boing.c /OUT:$@ $(WINDOWS) $(LFLAGS) - -# Rule for wave -wave.exe: wave.c - $(CC) $(CFLAGS) wave.c /OUT:$@ $(WINDOWS) $(LFLAGS) diff -Nru glfw-2.6/examples/Makefile.x11.in glfw-2.7.2/examples/Makefile.x11.in --- glfw-2.6/examples/Makefile.x11.in 2007-03-15 03:20:19.000000000 +0000 +++ glfw-2.7.2/examples/Makefile.x11.in 2010-08-25 10:13:52.000000000 +0000 @@ -1,54 +1,44 @@ +BINARIES = triangle listmodes mthello pong3d mtbench particles splitview \ + mipmaps gears boing wave heightmap -# Default: Build all tests -all: triangle listmodes mthello pong3d mtbench particles splitview \ - mipmaps keytest gears boing wave +all: $(BINARIES) - -# Rule for triangle -triangle: triangle.c +triangle: triangle.c ../lib/x11/libglfw.a $(CC) $(CFLAGS) triangle.c $(LFLAGS) -o $@ -# Rule for listmodes -listmodes: listmodes.c +listmodes: listmodes.c ../lib/x11/libglfw.a $(CC) $(CFLAGS) listmodes.c $(LFLAGS) -o $@ -# Rule for mthello -mthello: mthello.c +mthello: mthello.c ../lib/x11/libglfw.a $(CC) $(CFLAGS) mthello.c $(LFLAGS) -o $@ -# Rule for pong3d -pong3d: pong3d.c +pong3d: pong3d.c ../lib/x11/libglfw.a $(CC) $(CFLAGS) pong3d.c $(LFLAGS) -o $@ -# Rule for mtbench -mtbench: mtbench.c +mtbench: mtbench.c ../lib/x11/libglfw.a $(CC) $(CFLAGS) mtbench.c $(LFLAGS) -o $@ -# Rule for particles -particles: particles.c +particles: particles.c ../lib/x11/libglfw.a $(CC) $(CFLAGS) particles.c $(LFLAGS) -o $@ -# Rule for splitview -splitview: splitview.c +splitview: splitview.c ../lib/x11/libglfw.a $(CC) $(CFLAGS) splitview.c $(LFLAGS) -o $@ -# Rule for mipmaps -mipmaps: mipmaps.c +mipmaps: mipmaps.c ../lib/x11/libglfw.a $(CC) $(CFLAGS) mipmaps.c $(LFLAGS) -o $@ -# Rule for keytest -keytest: keytest.c - $(CC) $(CFLAGS) keytest.c $(LFLAGS) -o $@ - -# Rule for gears -gears: gears.c +gears: gears.c ../lib/x11/libglfw.a $(CC) $(CFLAGS) gears.c $(LFLAGS) -o $@ -# Rule for boing -boing: boing.c +boing: boing.c ../lib/x11/libglfw.a $(CC) $(CFLAGS) boing.c $(LFLAGS) -o $@ -# Rule for wave -wave: wave.c +wave: wave.c ../lib/x11/libglfw.a $(CC) $(CFLAGS) wave.c $(LFLAGS) -o $@ +heightmap: heightmap.c ../lib/x11/libglfw.a + $(CC) $(CFLAGS) heightmap.c $(LFLAGS) -o $@ + +clean: + rm -f $(BINARIES) + diff -Nru glfw-2.6/examples/mipmaps.c glfw-2.7.2/examples/mipmaps.c --- glfw-2.6/examples/mipmaps.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/mipmaps.c 2009-11-08 14:39:24.000000000 +0000 @@ -1,47 +1,56 @@ //======================================================================== -// This is a small test application for GLFW. -// The program shows texture loading with mipmap generation and trilienar -// filtering. -// Note: For OpenGL 1.0 compability, we do not use texture objects (this -// is no issue, since we only have one texture). +// This is an example program for the GLFW library +// +// It shows texture loading with mipmap generation and rendering with +// trilienar texture filtering //======================================================================== #include -#include - +#include -//======================================================================== -// main() -//======================================================================== +#include int main( void ) { - int width, height, running, frames, x, y; - double t, t0, fps; - char titlestr[ 200 ]; + int width, height, x; + double time; + GLboolean running; + GLuint textureID; + char* texturePath = "mipmaps.tga"; // Initialise GLFW - glfwInit(); + if( !glfwInit() ) + { + fprintf( stderr, "Failed to initialize GLFW\n" ); + exit( EXIT_FAILURE ); + } // Open OpenGL window if( !glfwOpenWindow( 640, 480, 0,0,0,0, 0,0, GLFW_WINDOW ) ) { + fprintf( stderr, "Failed to open GLFW window\n" ); glfwTerminate(); - return 0; + exit( EXIT_FAILURE ); } + glfwSetWindowTitle( "Trilinear interpolation" ); + // Enable sticky keys glfwEnable( GLFW_STICKY_KEYS ); - // Disable vertical sync (on cards that support it) - glfwSwapInterval( 0 ); + // Enable vertical sync (on cards that support it) + glfwSwapInterval( 1 ); + + // Generate and bind our texture ID + glGenTextures( 1, &textureID ); + glBindTexture( GL_TEXTURE_2D, textureID ); - // Load texture from file, and build all mipmap levels. The - // texture is automatically uploaded to texture memory. - if( !glfwLoadTexture2D( "mipmaps.tga", GLFW_BUILD_MIPMAPS_BIT ) ) + // Load texture from file into video memory, including mipmap levels + if( !glfwLoadTexture2D( texturePath, GLFW_BUILD_MIPMAPS_BIT ) ) { + fprintf( stderr, "Failed to load texture %s\n", texturePath ); glfwTerminate(); - return 0; + exit( EXIT_FAILURE ); } // Use trilinear interpolation (GL_LINEAR_MIPMAP_LINEAR) @@ -50,29 +59,15 @@ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - // Enable texturing + // Enable plain 2D texturing glEnable( GL_TEXTURE_2D ); - // Main loop running = GL_TRUE; - frames = 0; - t0 = glfwGetTime(); while( running ) { // Get time and mouse position - t = glfwGetTime(); - glfwGetMousePos( &x, &y ); - - // Calculate and display FPS (frames per second) - if( (t-t0) > 1.0 || frames == 0 ) - { - fps = (double)frames / (t-t0); - sprintf( titlestr, "Trilinear interpolation (%.1f FPS)", fps ); - glfwSetWindowTitle( titlestr ); - t0 = t; - frames = 0; - } - frames ++; + time = glfwGetTime(); + glfwGetMousePos( &x, NULL ); // Get window size (may be different than the requested size) glfwGetWindowSize( &width, &height ); @@ -88,7 +83,7 @@ // Select and setup the projection matrix glMatrixMode( GL_PROJECTION ); glLoadIdentity(); - gluPerspective( 65.0f, (GLfloat)width/(GLfloat)height, 1.0f, + gluPerspective( 65.0f, (GLfloat)width / (GLfloat)height, 1.0f, 50.0f ); // Select and setup the modelview matrix @@ -99,7 +94,7 @@ 0.0f, 1.0f, 0.0f ); // Up-vector // Draw a textured quad - glRotatef( 0.05*(GLfloat)x + (GLfloat)t*5.0f, 0.0f, 1.0f, 0.0f ); + glRotatef( 0.05f * (GLfloat)x + (GLfloat)time * 5.0f, 0.0f, 1.0f, 0.0f ); glBegin( GL_QUADS ); glTexCoord2f( -20.0f, 20.0f ); glVertex3f( -50.0f, 0.0f, -50.0f ); @@ -122,5 +117,6 @@ // Close OpenGL window and terminate GLFW glfwTerminate(); - return 0; + exit( EXIT_SUCCESS ); } + diff -Nru glfw-2.6/examples/particles.c glfw-2.7.2/examples/particles.c --- glfw-2.6/examples/particles.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/particles.c 2010-08-03 01:08:41.000000000 +0000 @@ -185,7 +185,7 @@ #define FOUNTAIN_RADIUS 1.6f // Minimum delta-time for particle phisics (s) -#define MIN_DELTA_T (BIRTH_INTERVAL*0.5) +#define MIN_DELTA_T (BIRTH_INTERVAL * 0.5f) //======================================================================== @@ -242,10 +242,10 @@ p->z = FOUNTAIN_HEIGHT; // Start velocity is up (Z)... - p->vz = 0.7f + (0.3/4096.0) * (float) (rand() & 4095); + p->vz = 0.7f + (0.3f/4096.f) * (float) (rand() & 4095); // ...and a randomly chosen X/Y direction - xy_angle = (2.0*M_PI/4096.0) * (float) (rand() & 4095); + xy_angle = (2.f * (float)M_PI / 4096.f) * (float) (rand() & 4095); p->vx = 0.4f * (float) cos( xy_angle ); p->vy = 0.4f * (float) sin( xy_angle ); @@ -685,8 +685,8 @@ } else { - x = fabs(x1) < fabs(x2) ? fabs(x1) : fabs(x2); - y = fabs(y1) < fabs(y2) ? fabs(y1) : fabs(y2); + x = (float) (fabs(x1) < fabs(x2) ? fabs(x1) : fabs(x2)); + y = (float) (fabs(y1) < fabs(y2) ? fabs(y1) : fabs(y2)); delta = x*x + y*y; } @@ -1021,13 +1021,18 @@ } // Initialize GLFW - glfwInit(); + if( !glfwInit() ) + { + fprintf( stderr, "Failed to initialize GLFW\n" ); + exit( EXIT_FAILURE ); + } // Open OpenGL fullscreen window - if( !glfwOpenWindow( WIDTH, HEIGHT, 5,6,5,0, 16,0, GLFW_FULLSCREEN ) ) + if( !glfwOpenWindow( WIDTH, HEIGHT, 0,0,0,0, 16,0, GLFW_FULLSCREEN ) ) { + fprintf( stderr, "Failed to open GLFW window\n" ); glfwTerminate(); - exit( 0 ); + exit( EXIT_FAILURE ); } // Set window title @@ -1065,8 +1070,6 @@ 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, floor_texture ); // Check if we have GL_EXT_separate_specular_color, and if so use it - // (This extension should ALWAYS be used when OpenGL lighting is used - // together with texturing, since it gives more realistic results) if( glfwExtensionSupported( "GL_EXT_separate_specular_color" ) ) { glLightModeli( GL_LIGHT_MODEL_COLOR_CONTROL_EXT, @@ -1144,5 +1147,6 @@ // Terminate OpenGL glfwTerminate(); - return 0; + exit( EXIT_SUCCESS ); } + diff -Nru glfw-2.6/examples/pong3d.c glfw-2.7.2/examples/pong3d.c --- glfw-2.6/examples/pong3d.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/pong3d.c 2009-11-08 14:39:24.000000000 +0000 @@ -20,23 +20,23 @@ #define HEIGHT 480 // Player size (units) -#define PLAYER_XSIZE 0.05 -#define PLAYER_YSIZE 0.15 +#define PLAYER_XSIZE 0.05f +#define PLAYER_YSIZE 0.15f // Ball size (units) -#define BALL_SIZE 0.02 +#define BALL_SIZE 0.02f // Maximum player movement speed (units / second) -#define MAX_SPEED 1.5 +#define MAX_SPEED 1.5f // Player movement acceleration (units / seconds^2) -#define ACCELERATION 4.0 +#define ACCELERATION 4.0f // Player movement deceleration (units / seconds^2) -#define DECELERATION 2.0 +#define DECELERATION 2.0f // Ball movement speed (units / second) -#define BALL_SPEED 0.4 +#define BALL_SPEED 0.4f // Menu options #define MENU_NONE 0 @@ -137,7 +137,7 @@ // LoadTextures() - Load textures from disk and upload to OpenGL card //======================================================================== -void LoadTextures( void ) +GLboolean LoadTextures( void ) { int i; @@ -157,8 +157,14 @@ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); // Upload texture from file to texture memory - glfwLoadTexture2D( tex_name[ i ], 0 ); + if( !glfwLoadTexture2D( tex_name[ i ], 0 ) ) + { + fprintf( stderr, "Failed to load texture %s\n", tex_name[ i ] ); + return GL_FALSE; + } } + + return GL_TRUE; } @@ -596,19 +602,19 @@ // Draw Player 1 glMaterialfv( GL_FRONT, GL_DIFFUSE, player1_diffuse ); glMaterialfv( GL_FRONT, GL_AMBIENT, player1_ambient ); - DrawBox( -1.0, (GLfloat)player1.ypos-PLAYER_YSIZE, 0.0, - -1.0+PLAYER_XSIZE, (GLfloat)player1.ypos+PLAYER_YSIZE, 0.1 ); + DrawBox( -1.f, (GLfloat)player1.ypos-PLAYER_YSIZE, 0.f, + -1.f+PLAYER_XSIZE, (GLfloat)player1.ypos+PLAYER_YSIZE, 0.1f ); // Draw Player 2 glMaterialfv( GL_FRONT, GL_DIFFUSE, player2_diffuse ); glMaterialfv( GL_FRONT, GL_AMBIENT, player2_ambient ); - DrawBox( 1.0-PLAYER_XSIZE, (GLfloat)player2.ypos-PLAYER_YSIZE, 0.0, - 1.0, (GLfloat)player2.ypos+PLAYER_YSIZE, 0.1 ); + DrawBox( 1.f-PLAYER_XSIZE, (GLfloat)player2.ypos-PLAYER_YSIZE, 0.f, + 1.f, (GLfloat)player2.ypos+PLAYER_YSIZE, 0.1f ); // Draw Ball glMaterialfv( GL_FRONT, GL_DIFFUSE, ball_diffuse ); glMaterialfv( GL_FRONT, GL_AMBIENT, ball_ambient ); - DrawBox( (GLfloat)ball.xpos-BALL_SIZE, (GLfloat)ball.ypos-BALL_SIZE, 0.0, + DrawBox( (GLfloat)ball.xpos-BALL_SIZE, (GLfloat)ball.ypos-BALL_SIZE, 0.f, (GLfloat)ball.xpos+BALL_SIZE, (GLfloat)ball.ypos+BALL_SIZE, BALL_SIZE*2 ); // Top game field border @@ -799,18 +805,26 @@ // Initialize GLFW if( !glfwInit() ) { - exit( 0 ); + fprintf( stderr, "Failed to initialize GLFW\n" ); + exit( EXIT_FAILURE ); } // Open OpenGL window if( !glfwOpenWindow( WIDTH, HEIGHT, 0,0,0,0, 16,0, GLFW_FULLSCREEN ) ) { + fprintf( stderr, "Failed to open GLFW window\n" ); glfwTerminate(); - exit( 0 ); + exit( EXIT_FAILURE ); } + glfwSwapInterval( 1 ); + // Load all textures - LoadTextures(); + if( !LoadTextures() ) + { + glfwTerminate(); + exit( EXIT_FAILURE ); + } // Main loop do @@ -835,5 +849,6 @@ // Terminate GLFW glfwTerminate(); - return 0; + exit( EXIT_SUCCESS ); } + diff -Nru glfw-2.6/examples/splitview.c glfw-2.7.2/examples/splitview.c --- glfw-2.6/examples/splitview.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/splitview.c 2010-08-20 18:22:25.000000000 +0000 @@ -1,5 +1,6 @@ //======================================================================== -// This is a small test application for GLFW. +// This is an example program for the GLFW library +// // The program uses a "split window" view, rendering four views of the // same scene in one window (e.g. uesful for 3D modelling software). This // demo uses scissors to separete the four different rendering areas from @@ -11,9 +12,11 @@ #include #include +#include +#include -#ifndef PI -#define PI 3.14159265358979323846 +#ifndef M_PI +#define M_PI 3.14159265358979323846 #endif @@ -22,24 +25,24 @@ //======================================================================== // Mouse position -int xpos = 0, ypos = 0; +static int xpos = 0, ypos = 0; // Window size -int width, height; +static int width, height; // Active view: 0 = none, 1 = upper left, 2 = upper right, 3 = lower left, // 4 = lower right -int active_view = 0; +static int active_view = 0; // Rotation around each axis -int rot_x = 0, rot_y = 0, rot_z = 0; +static int rot_x = 0, rot_y = 0, rot_z = 0; // Do redraw? -int do_redraw = 1; +static int do_redraw = 1; //======================================================================== -// DrawTorus() - Draw a solid torus (use a display list for the model) +// Draw a solid torus (use a display list for the model) //======================================================================== #define TORUS_MAJOR 1.5 @@ -47,7 +50,7 @@ #define TORUS_MAJOR_RES 32 #define TORUS_MINOR_RES 32 -void DrawTorus( void ) +static void drawTorus( void ) { static GLuint torus_list = 0; int i, j, k; @@ -60,7 +63,7 @@ glNewList( torus_list, GL_COMPILE_AND_EXECUTE ); // Draw torus - twopi = 2.0 * PI; + twopi = 2.0 * M_PI; for( i = 0; i < TORUS_MINOR_RES; i++ ) { glBegin( GL_QUAD_STRIP ); @@ -104,10 +107,10 @@ //======================================================================== -// DrawScene() - Draw the scene (a rotating torus) +// Draw the scene (a rotating torus) //======================================================================== -void DrawScene( void ) +static void drawScene( void ) { const GLfloat model_diffuse[4] = {1.0f, 0.8f, 0.8f, 1.0f}; const GLfloat model_specular[4] = {0.6f, 0.6f, 0.6f, 1.0f}; @@ -129,17 +132,17 @@ glMaterialf( GL_FRONT, GL_SHININESS, model_shininess ); // Draw torus - DrawTorus(); + drawTorus(); glPopMatrix(); } //======================================================================== -// DrawGrid() - Draw a 2D grid (used for orthogonal views) +// Draw a 2D grid (used for orthogonal views) //======================================================================== -void DrawGrid( float scale, int steps ) +static void drawGrid( float scale, int steps ) { int i; float x, y; @@ -194,10 +197,10 @@ //======================================================================== -// DrawAllViews() +// Draw all views //======================================================================== -void DrawAllViews( void ) +static void drawAllViews( void ) { const GLfloat light_position[4] = {0.0f, 8.0f, 8.0f, 1.0f}; const GLfloat light_diffuse[4] = {1.0f, 1.0f, 1.0f, 1.0f}; @@ -250,8 +253,8 @@ gluLookAt( 0.0f, 10.0f, 1e-3f, // Eye-position (above) 0.0f, 0.0f, 0.0f, // View-point 0.0f, 1.0f, 0.0f ); // Up-vector - DrawGrid( 0.5, 12 ); - DrawScene(); + drawGrid( 0.5, 12 ); + drawScene(); // Lower left view (FRONT VIEW) glViewport( 0, 0, width/2, height/2 ); @@ -261,8 +264,8 @@ gluLookAt( 0.0f, 0.0f, 10.0f, // Eye-position (in front of) 0.0f, 0.0f, 0.0f, // View-point 0.0f, 1.0f, 0.0f ); // Up-vector - DrawGrid( 0.5, 12 ); - DrawScene(); + drawGrid( 0.5, 12 ); + drawScene(); // Lower right view (SIDE VIEW) glViewport( width/2, 0, width/2, height/2 ); @@ -272,8 +275,8 @@ gluLookAt( 10.0f, 0.0f, 0.0f, // Eye-position (to the right) 0.0f, 0.0f, 0.0f, // View-point 0.0f, 1.0f, 0.0f ); // Up-vector - DrawGrid( 0.5, 12 ); - DrawScene(); + drawGrid( 0.5, 12 ); + drawScene(); // Disable line anti-aliasing glDisable( GL_LINE_SMOOTH ); @@ -313,7 +316,7 @@ glEnable( GL_LIGHTING ); // Draw scene - DrawScene(); + drawScene(); // Disable lighting glDisable( GL_LIGHTING ); @@ -338,7 +341,7 @@ glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glColor3f( 1.0f, 1.0f, 0.6f ); - glTranslatef( (active_view-1)&1, 1-(active_view-1)/2, 0.0f ); + glTranslatef( (GLfloat) ((active_view - 1) & 1), (GLfloat) (1 - (active_view - 1) / 2), 0.0f ); glBegin( GL_LINE_STRIP ); glVertex2i( 0, 0 ); glVertex2i( 1, 0 ); @@ -351,10 +354,10 @@ //======================================================================== -// WindowSizeFun() - Window size callback function +// Window size callback function //======================================================================== -void GLFWCALL WindowSizeFun( int w, int h ) +static void GLFWCALL windowSizeFun( int w, int h ) { width = w; height = h > 0 ? h : 1; @@ -363,20 +366,20 @@ //======================================================================== -// WindowRefreshFun() - Window refresh callback function +// Window refresh callback function //======================================================================== -void GLFWCALL WindowRefreshFun( void ) +static void GLFWCALL windowRefreshFun( void ) { do_redraw = 1; } //======================================================================== -// MousePosFun() - Mouse position callback function +// Mouse position callback function //======================================================================== -void GLFWCALL MousePosFun( int x, int y ) +static void GLFWCALL mousePosFun( int x, int y ) { // Depending on which view was selected, rotate around different axes switch( active_view ) @@ -408,10 +411,10 @@ //======================================================================== -// MouseButtonFun() - Mouse button callback function +// Mouse button callback function //======================================================================== -void GLFWCALL MouseButtonFun( int button, int action ) +static void GLFWCALL mouseButtonFun( int button, int action ) { // Button clicked? if( ( button == GLFW_MOUSE_BUTTON_LEFT ) && action == GLFW_PRESS ) @@ -445,18 +448,24 @@ int main( void ) { - int running; - // Initialise GLFW - glfwInit(); + if( !glfwInit() ) + { + fprintf( stderr, "Failed to initialize GLFW\n" ); + exit( EXIT_FAILURE ); + } // Open OpenGL window if( !glfwOpenWindow( 500, 500, 0,0,0,0, 16,0, GLFW_WINDOW ) ) { + fprintf( stderr, "Failed to open GLFW window\n" ); glfwTerminate(); - return 0; + exit( EXIT_FAILURE ); } + // Enable vsync + glfwSwapInterval( 1 ); + // Set window title glfwSetWindowTitle( "Split view demo" ); @@ -470,10 +479,10 @@ glfwDisable( GLFW_AUTO_POLL_EVENTS ); // Set callback functions - glfwSetWindowSizeCallback( WindowSizeFun ); - glfwSetWindowRefreshCallback( WindowRefreshFun ); - glfwSetMousePosCallback( MousePosFun ); - glfwSetMouseButtonCallback( MouseButtonFun ); + glfwSetWindowSizeCallback( windowSizeFun ); + glfwSetWindowRefreshCallback( windowRefreshFun ); + glfwSetMousePosCallback( mousePosFun ); + glfwSetMouseButtonCallback( mouseButtonFun ); // Main loop do @@ -482,7 +491,7 @@ if( do_redraw ) { // Draw all views - DrawAllViews(); + drawAllViews(); // Swap buffers glfwSwapBuffers(); @@ -493,14 +502,13 @@ // Wait for new events glfwWaitEvents(); - // Check if the ESC key was pressed or the window was closed - running = !glfwGetKey( GLFW_KEY_ESC ) && - glfwGetWindowParam( GLFW_OPENED ); - } - while( running ); + } // Check if the ESC key was pressed or the window was closed + while( glfwGetKey( GLFW_KEY_ESC ) != GLFW_PRESS && + glfwGetWindowParam( GLFW_OPENED ) ); // Close OpenGL window and terminate GLFW glfwTerminate(); - return 0; + exit( EXIT_SUCCESS ); } + diff -Nru glfw-2.6/examples/triangle.c glfw-2.7.2/examples/triangle.c --- glfw-2.6/examples/triangle.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/triangle.c 2010-08-17 18:01:51.000000000 +0000 @@ -1,78 +1,64 @@ //======================================================================== // This is a small test application for GLFW. // The program opens a window (640x480), and renders a spinning colored -// triangle (it is controlled with both the GLFW timer and the mouse). It -// also calculates the rendering speed (FPS), which is displayed in the -// window title bar. +// triangle (it is controlled with both the GLFW timer and the mouse). //======================================================================== #include +#include #include -//======================================================================== -// main() -//======================================================================== - int main( void ) { - int width, height, running, frames, x, y; - double t, t0, fps; - char titlestr[ 200 ]; + int width, height, x; + double t; // Initialise GLFW - glfwInit(); + if( !glfwInit() ) + { + fprintf( stderr, "Failed to initialize GLFW\n" ); + exit( EXIT_FAILURE ); + } - // Open OpenGL window + // Open a window and create its OpenGL context if( !glfwOpenWindow( 640, 480, 0,0,0,0, 0,0, GLFW_WINDOW ) ) { + fprintf( stderr, "Failed to open GLFW window\n" ); + glfwTerminate(); - return 0; + exit( EXIT_FAILURE ); } - // Enable sticky keys + glfwSetWindowTitle( "Spinning Triangle" ); + + // Ensure we can capture the escape key being pressed below glfwEnable( GLFW_STICKY_KEYS ); - // Disable vertical sync (on cards that support it) - glfwSwapInterval( 0 ); + // Enable vertical sync (on cards that support it) + glfwSwapInterval( 1 ); - // Main loop - running = GL_TRUE; - frames = 0; - t0 = glfwGetTime(); - while( running ) + do { - // Get time and mouse position t = glfwGetTime(); - glfwGetMousePos( &x, &y ); - - // Calculate and display FPS (frames per second) - if( (t-t0) > 1.0 || frames == 0 ) - { - fps = (double)frames / (t-t0); - sprintf( titlestr, "Spinning Triangle (%.1f FPS)", fps ); - glfwSetWindowTitle( titlestr ); - t0 = t; - frames = 0; - } - frames ++; + glfwGetMousePos( &x, NULL ); // Get window size (may be different than the requested size) glfwGetWindowSize( &width, &height ); + + // Special case: avoid division by zero below height = height > 0 ? height : 1; - // Set viewport glViewport( 0, 0, width, height ); - // Clear color buffer + // Clear color buffer to black glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); glClear( GL_COLOR_BUFFER_BIT ); // Select and setup the projection matrix glMatrixMode( GL_PROJECTION ); glLoadIdentity(); - gluPerspective( 65.0f, (GLfloat)width/(GLfloat)height, 1.0f, - 100.0f ); + gluPerspective( 65.0f, (GLfloat)width/(GLfloat)height, 1.0f, 100.0f ); // Select and setup the modelview matrix glMatrixMode( GL_MODELVIEW ); @@ -83,7 +69,7 @@ // Draw a rotating colorful triangle glTranslatef( 0.0f, 14.0f, 0.0f ); - glRotatef( 0.3*(GLfloat)x + (GLfloat)t*100.0f, 0.0f, 0.0f, 1.0f ); + glRotatef( 0.3f*(GLfloat)x + (GLfloat)t*100.0f, 0.0f, 0.0f, 1.0f ); glBegin( GL_TRIANGLES ); glColor3f( 1.0f, 0.0f, 0.0f ); glVertex3f( -5.0f, 0.0f, -4.0f ); @@ -96,13 +82,13 @@ // Swap buffers glfwSwapBuffers(); - // Check if the ESC key was pressed or the window was closed - running = !glfwGetKey( GLFW_KEY_ESC ) && - glfwGetWindowParam( GLFW_OPENED ); - } + } // Check if the ESC key was pressed or the window was closed + while( glfwGetKey( GLFW_KEY_ESC ) != GLFW_PRESS && + glfwGetWindowParam( GLFW_OPENED ) ); // Close OpenGL window and terminate GLFW glfwTerminate(); - return 0; + exit( EXIT_SUCCESS ); } + diff -Nru glfw-2.6/examples/wave.c glfw-2.7.2/examples/wave.c --- glfw-2.6/examples/wave.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/examples/wave.c 2009-11-08 14:39:24.000000000 +0000 @@ -84,7 +84,7 @@ } vertex[p].g = (GLfloat)y/(GLfloat)GRIDH; - vertex[p].b = 1.0-((GLfloat)x/(GLfloat)GRIDW+(GLfloat)y/(GLfloat)GRIDH)/2.0; + vertex[p].b = 1.f-((GLfloat)x/(GLfloat)GRIDW+(GLfloat)y/(GLfloat)GRIDH)/2.f; } for(y=0;y) +/* In order for extension support to be portable, we need to define an + * OpenGL function call method. We use the keyword APIENTRY, which is + * defined for Win32. (Note: Windows also needs this for ) + */ #ifndef APIENTRY #ifdef _WIN32 #define APIENTRY __stdcall @@ -74,63 +76,64 @@ #define APIENTRY #endif #define GL_APIENTRY_DEFINED -#endif // APIENTRY +#endif /* APIENTRY */ -// The following three defines are here solely to make some Windows-based -// files happy. Theoretically we could include , but -// it has the major drawback of severely polluting our namespace. +/* The following three defines are here solely to make some Windows-based + * files happy. Theoretically we could include , but + * it has the major drawback of severely polluting our namespace. + */ -// Under Windows, we need WINGDIAPI defined +/* Under Windows, we need WINGDIAPI defined */ #if !defined(WINGDIAPI) && defined(_WIN32) #if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__) - // Microsoft Visual C++, Borland C++ Builder and Pelles C + /* Microsoft Visual C++, Borland C++ Builder and Pelles C */ #define WINGDIAPI __declspec(dllimport) #elif defined(__LCC__) - // LCC-Win32 + /* LCC-Win32 */ #define WINGDIAPI __stdcall #else - // Others (e.g. MinGW, Cygwin) + /* Others (e.g. MinGW, Cygwin) */ #define WINGDIAPI extern #endif #define GL_WINGDIAPI_DEFINED -#endif // WINGDIAPI +#endif /* WINGDIAPI */ -// Some files also need CALLBACK defined +/* Some files also need CALLBACK defined */ #if !defined(CALLBACK) && defined(_WIN32) #if defined(_MSC_VER) - // Microsoft Visual C++ + /* Microsoft Visual C++ */ #if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) #define CALLBACK __stdcall #else #define CALLBACK #endif #else - // Other Windows compilers + /* Other Windows compilers */ #define CALLBACK __stdcall #endif #define GLU_CALLBACK_DEFINED -#endif // CALLBACK +#endif /* CALLBACK */ -// Microsoft Visual C++, Borland C++ and Pelles C needs wchar_t +/* Microsoft Visual C++, Borland C++ and Pelles C needs wchar_t */ #if defined(_WIN32) && (defined(_MSC_VER) || defined(__BORLANDC__) || defined(__POCC__)) && !defined(_WCHAR_T_DEFINED) typedef unsigned short wchar_t; #define _WCHAR_T_DEFINED -#endif // _WCHAR_T_DEFINED +#endif /* _WCHAR_T_DEFINED */ -// ---------------- GLFW related system specific defines ----------------- +/* ---------------- GLFW related system specific defines ----------------- */ #if defined(_WIN32) && defined(GLFW_BUILD_DLL) - // We are building a Win32 DLL + /* We are building a Win32 DLL */ #define GLFWAPI __declspec(dllexport) #define GLFWAPIENTRY __stdcall #define GLFWCALL __stdcall #elif defined(_WIN32) && defined(GLFW_DLL) - // We are calling a Win32 DLL + /* We are calling a Win32 DLL */ #if defined(__LCC__) #define GLFWAPI extern #else @@ -141,49 +144,55 @@ #else - // We are either building/calling a static lib or we are non-win32 + /* We are either building/calling a static lib or we are non-win32 */ #define GLFWAPIENTRY #define GLFWAPI #define GLFWCALL #endif -// -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- +/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ -// Include standard OpenGL headers: GLFW uses GL_FALSE/GL_TRUE, and it is -// convenient for the user to only have to include . This also -// solves the problem with Windows and needing some -// special defines which normally requires the user to include -// (which is not a nice solution for portable programs). +/* Include standard OpenGL headers: GLFW uses GL_FALSE/GL_TRUE, and it is + * convenient for the user to only have to include . This also + * solves the problem with Windows and needing some + * special defines which normally requires the user to include + * (which is not a nice solution for portable programs). + */ #if defined(__APPLE_CC__) #include - #include + #ifndef GLFW_NO_GLU + #include + #endif #else #include - #include + #ifndef GLFW_NO_GLU + #include + #endif #endif -//======================================================================== -// GLFW version -//======================================================================== +/************************************************************************* + * GLFW version + *************************************************************************/ #define GLFW_VERSION_MAJOR 2 -#define GLFW_VERSION_MINOR 6 -#define GLFW_VERSION_REVISION 0 +#define GLFW_VERSION_MINOR 7 +#define GLFW_VERSION_REVISION 2 -//======================================================================== -// Input handling definitions -//======================================================================== +/************************************************************************* + * Input handling definitions + *************************************************************************/ -// Key and button state/action definitions +/* Key and button state/action definitions */ #define GLFW_RELEASE 0 #define GLFW_PRESS 1 -// Keyboard key definitions: 8-bit ISO-8859-1 (Latin 1) encoding is used -// for printable keys (such as A-Z, 0-9 etc), and values above 256 -// represent special (non-printable) keys (e.g. F1, Page Up etc). +/* Keyboard key definitions: 8-bit ISO-8859-1 (Latin 1) encoding is used + * for printable keys (such as A-Z, 0-9 etc), and values above 256 + * represent special (non-printable) keys (e.g. F1, Page Up etc). + */ #define GLFW_KEY_UNKNOWN -1 #define GLFW_KEY_SPACE 32 #define GLFW_KEY_SPECIAL 256 @@ -249,9 +258,16 @@ #define GLFW_KEY_KP_DECIMAL (GLFW_KEY_SPECIAL+60) #define GLFW_KEY_KP_EQUAL (GLFW_KEY_SPECIAL+61) #define GLFW_KEY_KP_ENTER (GLFW_KEY_SPECIAL+62) -#define GLFW_KEY_LAST GLFW_KEY_KP_ENTER +#define GLFW_KEY_KP_NUM_LOCK (GLFW_KEY_SPECIAL+63) +#define GLFW_KEY_CAPS_LOCK (GLFW_KEY_SPECIAL+64) +#define GLFW_KEY_SCROLL_LOCK (GLFW_KEY_SPECIAL+65) +#define GLFW_KEY_PAUSE (GLFW_KEY_SPECIAL+66) +#define GLFW_KEY_LSUPER (GLFW_KEY_SPECIAL+67) +#define GLFW_KEY_RSUPER (GLFW_KEY_SPECIAL+68) +#define GLFW_KEY_MENU (GLFW_KEY_SPECIAL+69) +#define GLFW_KEY_LAST GLFW_KEY_MENU -// Mouse button definitions +/* Mouse button definitions */ #define GLFW_MOUSE_BUTTON_1 0 #define GLFW_MOUSE_BUTTON_2 1 #define GLFW_MOUSE_BUTTON_3 2 @@ -262,13 +278,13 @@ #define GLFW_MOUSE_BUTTON_8 7 #define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8 -// Mouse button aliases +/* Mouse button aliases */ #define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1 #define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2 #define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3 -// Joystick identifiers +/* Joystick identifiers */ #define GLFW_JOYSTICK_1 0 #define GLFW_JOYSTICK_2 1 #define GLFW_JOYSTICK_3 2 @@ -288,15 +304,15 @@ #define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16 -//======================================================================== -// Other definitions -//======================================================================== +/************************************************************************* + * Other definitions + *************************************************************************/ -// glfwOpenWindow modes +/* glfwOpenWindow modes */ #define GLFW_WINDOW 0x00010001 #define GLFW_FULLSCREEN 0x00010002 -// glfwGetWindowParam tokens +/* glfwGetWindowParam tokens */ #define GLFW_OPENED 0x00020001 #define GLFW_ACTIVE 0x00020002 #define GLFW_ICONIFIED 0x00020003 @@ -308,8 +324,9 @@ #define GLFW_DEPTH_BITS 0x00020009 #define GLFW_STENCIL_BITS 0x0002000A -// The following constants are used for both glfwGetWindowParam -// and glfwOpenWindowHint +/* The following constants are used for both glfwGetWindowParam + * and glfwOpenWindowHint + */ #define GLFW_REFRESH_RATE 0x0002000B #define GLFW_ACCUM_RED_BITS 0x0002000C #define GLFW_ACCUM_GREEN_BITS 0x0002000D @@ -319,8 +336,17 @@ #define GLFW_STEREO 0x00020011 #define GLFW_WINDOW_NO_RESIZE 0x00020012 #define GLFW_FSAA_SAMPLES 0x00020013 +#define GLFW_OPENGL_VERSION_MAJOR 0x00020014 +#define GLFW_OPENGL_VERSION_MINOR 0x00020015 +#define GLFW_OPENGL_FORWARD_COMPAT 0x00020016 +#define GLFW_OPENGL_DEBUG_CONTEXT 0x00020017 +#define GLFW_OPENGL_PROFILE 0x00020018 + +/* GLFW_OPENGL_PROFILE tokens */ +#define GLFW_OPENGL_CORE_PROFILE 0x00050001 +#define GLFW_OPENGL_COMPAT_PROFILE 0x00050002 -// glfwEnable/glfwDisable tokens +/* glfwEnable/glfwDisable tokens */ #define GLFW_MOUSE_CURSOR 0x00030001 #define GLFW_STICKY_KEYS 0x00030002 #define GLFW_STICKY_MOUSE_BUTTONS 0x00030003 @@ -328,36 +354,36 @@ #define GLFW_KEY_REPEAT 0x00030005 #define GLFW_AUTO_POLL_EVENTS 0x00030006 -// glfwWaitThread wait modes +/* glfwWaitThread wait modes */ #define GLFW_WAIT 0x00040001 #define GLFW_NOWAIT 0x00040002 -// glfwGetJoystickParam tokens +/* glfwGetJoystickParam tokens */ #define GLFW_PRESENT 0x00050001 #define GLFW_AXES 0x00050002 #define GLFW_BUTTONS 0x00050003 -// glfwReadImage/glfwLoadTexture2D flags -#define GLFW_NO_RESCALE_BIT 0x00000001 // Only for glfwReadImage +/* glfwReadImage/glfwLoadTexture2D flags */ +#define GLFW_NO_RESCALE_BIT 0x00000001 /* Only for glfwReadImage */ #define GLFW_ORIGIN_UL_BIT 0x00000002 -#define GLFW_BUILD_MIPMAPS_BIT 0x00000004 // Only for glfwLoadTexture2D +#define GLFW_BUILD_MIPMAPS_BIT 0x00000004 /* Only for glfwLoadTexture2D */ #define GLFW_ALPHA_MAP_BIT 0x00000008 -// Time spans longer than this (seconds) are considered to be infinity +/* Time spans longer than this (seconds) are considered to be infinity */ #define GLFW_INFINITY 100000.0 -//======================================================================== -// Typedefs -//======================================================================== +/************************************************************************* + * Typedefs + *************************************************************************/ -// The video mode structure used by glfwGetVideoModes() +/* The video mode structure used by glfwGetVideoModes() */ typedef struct { int Width, Height; int RedBits, BlueBits, GreenBits; } GLFWvidmode; -// Image/texture information +/* Image/texture information */ typedef struct { int Width, Height; int Format; @@ -365,16 +391,16 @@ unsigned char *Data; } GLFWimage; -// Thread ID +/* Thread ID */ typedef int GLFWthread; -// Mutex object +/* Mutex object */ typedef void * GLFWmutex; -// Condition variable object +/* Condition variable object */ typedef void * GLFWcond; -// Function pointer types +/* Function pointer types */ typedef void (GLFWCALL * GLFWwindowsizefun)(int,int); typedef int (GLFWCALL * GLFWwindowclosefun)(void); typedef void (GLFWCALL * GLFWwindowrefreshfun)(void); @@ -386,20 +412,16 @@ typedef void (GLFWCALL * GLFWthreadfun)(void *); -//======================================================================== -// Prototypes -//======================================================================== +/************************************************************************* + * Prototypes + *************************************************************************/ -/*! @file glfw.h - */ -// GLFW initialization, termination and version querying -/*! @fn glfwInit - */ +/* GLFW initialization, termination and version querying */ GLFWAPI int GLFWAPIENTRY glfwInit( void ); GLFWAPI void GLFWAPIENTRY glfwTerminate( void ); GLFWAPI void GLFWAPIENTRY glfwGetVersion( int *major, int *minor, int *rev ); -// Window handling +/* Window handling */ GLFWAPI int GLFWAPIENTRY glfwOpenWindow( int width, int height, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int mode ); GLFWAPI void GLFWAPIENTRY glfwOpenWindowHint( int target, int hint ); GLFWAPI void GLFWAPIENTRY glfwCloseWindow( void ); @@ -416,11 +438,11 @@ GLFWAPI void GLFWAPIENTRY glfwSetWindowCloseCallback( GLFWwindowclosefun cbfun ); GLFWAPI void GLFWAPIENTRY glfwSetWindowRefreshCallback( GLFWwindowrefreshfun cbfun ); -// Video mode functions +/* Video mode functions */ GLFWAPI int GLFWAPIENTRY glfwGetVideoModes( GLFWvidmode *list, int maxcount ); GLFWAPI void GLFWAPIENTRY glfwGetDesktopMode( GLFWvidmode *mode ); -// Input handling +/* Input handling */ GLFWAPI void GLFWAPIENTRY glfwPollEvents( void ); GLFWAPI void GLFWAPIENTRY glfwWaitEvents( void ); GLFWAPI int GLFWAPIENTRY glfwGetKey( int key ); @@ -435,22 +457,22 @@ GLFWAPI void GLFWAPIENTRY glfwSetMousePosCallback( GLFWmouseposfun cbfun ); GLFWAPI void GLFWAPIENTRY glfwSetMouseWheelCallback( GLFWmousewheelfun cbfun ); -// Joystick input +/* Joystick input */ GLFWAPI int GLFWAPIENTRY glfwGetJoystickParam( int joy, int param ); GLFWAPI int GLFWAPIENTRY glfwGetJoystickPos( int joy, float *pos, int numaxes ); GLFWAPI int GLFWAPIENTRY glfwGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons ); -// Time +/* Time */ GLFWAPI double GLFWAPIENTRY glfwGetTime( void ); GLFWAPI void GLFWAPIENTRY glfwSetTime( double time ); GLFWAPI void GLFWAPIENTRY glfwSleep( double time ); -// Extension support +/* Extension support */ GLFWAPI int GLFWAPIENTRY glfwExtensionSupported( const char *extension ); GLFWAPI void* GLFWAPIENTRY glfwGetProcAddress( const char *procname ); GLFWAPI void GLFWAPIENTRY glfwGetGLVersion( int *major, int *minor, int *rev ); -// Threading support +/* Threading support */ GLFWAPI GLFWthread GLFWAPIENTRY glfwCreateThread( GLFWthreadfun fun, void *arg ); GLFWAPI void GLFWAPIENTRY glfwDestroyThread( GLFWthread ID ); GLFWAPI int GLFWAPIENTRY glfwWaitThread( GLFWthread ID, int waitmode ); @@ -466,11 +488,11 @@ GLFWAPI void GLFWAPIENTRY glfwBroadcastCond( GLFWcond cond ); GLFWAPI int GLFWAPIENTRY glfwGetNumberOfProcessors( void ); -// Enable/disable functions +/* Enable/disable functions */ GLFWAPI void GLFWAPIENTRY glfwEnable( int token ); GLFWAPI void GLFWAPIENTRY glfwDisable( int token ); -// Image/texture I/O support +/* Image/texture I/O support */ GLFWAPI int GLFWAPIENTRY glfwReadImage( const char *name, GLFWimage *img, int flags ); GLFWAPI int GLFWAPIENTRY glfwReadMemoryImage( const void *data, long size, GLFWimage *img, int flags ); GLFWAPI void GLFWAPIENTRY glfwFreeImage( GLFWimage *img ); @@ -483,4 +505,5 @@ } #endif -#endif // __glfw_h_ +#endif /* __glfw_h_ */ + diff -Nru glfw-2.6/lib/amigaos/amigaos_enable.c glfw-2.7.2/lib/amigaos/amigaos_enable.c --- glfw-2.6/lib/amigaos/amigaos_enable.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/amigaos/amigaos_enable.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: amigaos_enable.c -// Platforms: AmigaOS, MorphOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// _glfwPlatformEnableSystemKeys() - Enable system keys -// _glfwPlatformDisableSystemKeys() - Disable system keys -//======================================================================== - -void _glfwPlatformEnableSystemKeys( void ) -{ - // Not supported under AmigaOS (yet) -} - -void _glfwPlatformDisableSystemKeys( void ) -{ - // Not supported under AmigaOS (yet) -} diff -Nru glfw-2.6/lib/amigaos/amigaos_fullscreen.c glfw-2.7.2/lib/amigaos/amigaos_fullscreen.c --- glfw-2.6/lib/amigaos/amigaos_fullscreen.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/amigaos/amigaos_fullscreen.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,319 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: amigaos_fullscreen.c -// Platforms: AmigaOS, MorphOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - -//************************************************************************ -//**** GLFW internal functions **** -//************************************************************************ - -//======================================================================== -// _glfwBPP2RGB() - Convert BPP to RGB bits (based on "best guess") -//======================================================================== - -static void _glfwBPP2RGB( int bpp, int *r, int *g, int *b ) -{ - int delta; - - // Special case: bpp = 32 - if( bpp == 32 ) bpp = 24; - - // Convert "bits per pixel" to red, green & blue sizes - *r = *g = *b = bpp / 3; - delta = bpp - (*r * 3); - if( delta >= 1 ) - { - *g = *g + 1; - } - if( delta == 2 ) - { - *r = *r + 1; - } -} - - -//======================================================================== -// _glfwGetModeIDInfo() - Return video mode information about a ModeID -//======================================================================== - -void _glfwGetModeIDInfo( ULONG ModeID, int *w, int *h, int *r, int *g, - int *b, int *refresh ) -{ - struct DimensionInfo dimsInfo; - struct DisplayInfo dispInfo; - struct MonitorInfo monInfo; - - // Get various display info - (void) GetDisplayInfoData( NULL, - (BYTE*) &dimsInfo, - sizeof(struct DimensionInfo), - DTAG_DIMS, - ModeID ); - (void) GetDisplayInfoData( NULL, - (BYTE*) &dispInfo, - sizeof(struct DisplayInfo), - DTAG_DISP, - ModeID ); - (void) GetDisplayInfoData( NULL, - (BYTE*) &monInfo, - sizeof(struct MonitorInfo), - DTAG_MNTR, - ModeID ); - - // Extract nominal width & height - if( w != NULL && h != NULL ) - { - *w = (int) (dimsInfo.Nominal.MaxX - dimsInfo.Nominal.MinX) + 1; - *h = (int) (dimsInfo.Nominal.MaxY - dimsInfo.Nominal.MinY) + 1; - } - - // Extract color bits - if( r != NULL && g != NULL && g != NULL ) - { - *r = (int) dispInfo.RedBits; - *g = (int) dispInfo.GreenBits; - *b = (int) dispInfo.BlueBits; - - // If depth < sum of RGB bits, we're probably not true color, - // which means that DisplayInfo red/green/blue bits do not refer - // to actual pixel color depth => use pixel depth info instead - if( dimsInfo.MaxDepth < (*r + *g + *b) ) - { - _glfwBPP2RGB( dimsInfo.MaxDepth, r, g, b ); - } - } - - // Extract refresh rate - if( refresh != NULL ) - { - *refresh = (int) (1.0 / ((double) monInfo.TotalRows * - (double) monInfo.TotalColorClocks * - 280.0e-9) + 0.5 ); - } -} - - -//======================================================================== -// _glfwGetClosestVideoMode() -//======================================================================== - -int _glfwGetClosestVideoMode( int *w, int *h, int *r, int *g, int *b, - int refresh ) -{ - int modeID; - - // Find best mode - modeID = BestModeID( - BIDTAG_NominalWidth, *w, - BIDTAG_NominalHeight, *h, - BIDTAG_Depth, *r + *g + *b, - BIDTAG_RedBits, *r, - BIDTAG_GreenBits, *g, - BIDTAG_BlueBits, *b, - TAG_DONE, 0 - ); - - // Did we get a proper mode? - if( !modeID ) - { - return 0; - } - - // Get actual display info - _glfwGetModeIDInfo( modeID, w, h, r, g, b, NULL ); - - return modeID; -} - - -//======================================================================== -// _glfwOpenScreen() - Open an AmigaOS screen -//======================================================================== - -int _glfwOpenScreen( int *width, int *height, int *r, int *g, int *b, - int refresh ) -{ - int bpp, modeID; - - // Calculate BPP - bpp = *r + *g + *b; - - // If colorbits < 8 (e.g. 0) or >= 24, default to 24 bpp - if( bpp < 8 || bpp >= 24 ) - { - *r = *g = *b = 8; - } - - // Find best matching video mode - modeID = _glfwGetClosestVideoMode( width, height, r, g, b, refresh ); - - // Open screen - _glfwWin.Screen = OpenScreenTags( - NULL, - SA_Width, *width, - SA_Height, *height, - SA_DisplayID, modeID, - SA_Type, CUSTOMSCREEN, - SA_SysFont, 1, - SA_ShowTitle, FALSE, - TAG_DONE, 0 - ); - - // Did we succeed? - if( !_glfwWin.Screen ) - { - printf( "Failed to open Amiga screen\n" ); - return GL_FALSE; - } - - // Remember Mode ID - _glfwWin.ModeID = modeID; - -/* - // Debugging information - printf( "Amiga Screen opened:\n" ); - printf( " ModeID: 0x%08X\n", modeID ); - printf( " Dimensions: %d x %d\n", *width, *height ); - printf( " Color bits: %d : %d : %d\n", *r, *g, *b ); -*/ - - return GL_TRUE; -} - - - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// _glfwPlatformGetVideoModes() - List available video modes -//======================================================================== - -int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount ) -{ - ULONG modeID; - int w, h, r, g, b, bpp, m1, m2, i, j, count; - - count = 0; - modeID = INVALID_ID; - do - { - // Enumarate all ModeIDs with NextDisplayInfo - modeID = NextDisplayInfo( modeID ); - if( modeID != INVALID_ID ) - { - // Get related video mode information - _glfwGetModeIDInfo( modeID, &w, &h, &r, &g, &b, NULL ); - - // Convert RGB to BPP - bpp = r + g + b; - - // We only support true-color modes, which means at least 15 - // bits per pixel (reasonable?) - Sorry, AGA users! - if( bpp >= 15 ) - { - // Mode "code" for this mode - m1 = (bpp << 25) | (w*h); - - // Insert mode in list (sorted), and avoid duplicates - for( i = 0; i < count; i ++ ) - { - // Mode "code" for already listed mode - bpp = list[i].RedBits + list[i].GreenBits + - list[i].BlueBits; - m2 = (bpp << 25) | (list[i].Width * list[i].Height); - if( m1 <= m2 ) - { - break; - } - } - - // New entry at the end of the list? - if( i >= count ) - { - list[count].Width = w; - list[count].Height = h; - list[count].RedBits = r; - list[count].GreenBits = g; - list[count].BlueBits = b; - count ++; - } - // Insert new entry in the list? - else if( m1 < m2 ) - { - for( j = count; j > i; j -- ) - { - list[j] = list[j-1]; - } - list[i].Width = w; - list[i].Height = h; - list[i].RedBits = r; - list[i].GreenBits = g; - list[i].BlueBits = b; - count ++; - } - } - } - } - while( modeID != INVALID_ID && count < maxcount ); - - return count; -} - - -//======================================================================== -// _glfwPlatformGetDesktopMode() - Get the desktop video mode -//======================================================================== - -void _glfwPlatformGetDesktopMode( GLFWvidmode *mode ) -{ - struct Screen *pubscreen; - ULONG modeID; - - // Get default public screen screen handle - pubscreen = LockPubScreen( NULL ); - - // Get screen width and height (use actual screen size rather than - // ModeID nominal size) - mode->Width = (int) pubscreen->Width; - mode->Height = (int) pubscreen->Height; - - // Get ModeID for public screen - modeID = GetVPModeID( &pubscreen->ViewPort ); - - // Release workbench screen - UnlockPubScreen( NULL, pubscreen ); - - // Get color bits information - _glfwGetModeIDInfo( modeID, NULL, NULL, &mode->RedBits, - &mode->GreenBits, &mode->BlueBits, NULL ); -} diff -Nru glfw-2.6/lib/amigaos/amigaos_glext.c glfw-2.7.2/lib/amigaos/amigaos_glext.c --- glfw-2.6/lib/amigaos/amigaos_glext.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/amigaos/amigaos_glext.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: amigaos_glext.c -// Platforms: AmigaOS, MorphOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// _glfwPlatformExtensionSupported() - Check if an OpenGL extension is -// available at runtime -//======================================================================== - -int _glfwPlatformExtensionSupported( const char *extension ) -{ - // There are no AmigaOS specific ways to check for extensions - return GL_FALSE; -} - - -//======================================================================== -// _glfwPlatformGetProcAddress() - Get the function pointer to an OpenGL -// function -//======================================================================== - -void * _glfwPlatformGetProcAddress( const char *procname ) -{ -#ifdef _GLFW_STORMMESA - // StormMesa does not support this - return NULL; -#endif -} diff -Nru glfw-2.6/lib/amigaos/amigaos_init.c glfw-2.7.2/lib/amigaos/amigaos_init.c --- glfw-2.6/lib/amigaos/amigaos_init.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/amigaos/amigaos_init.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,284 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: amigaos_init.c -// Platforms: AmigaOS, MorphOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - - -//************************************************************************ -//**** GLFW internal functions **** -//************************************************************************ - -//======================================================================== -// _glfwInitLibraries() - Load shared libraries -//======================================================================== - -static int _glfwInitLibraries( void ) -{ - // Note: exec.library & dos.library are always opened (by C startup) - - // Start by clearing all handles - GfxBase = NULL; - IntuitionBase = NULL; - KeymapBase = NULL; - UtilityBase = NULL; - - // graphics.library - GfxBase = (struct GfxBase *) OpenLibrary( "graphics.library", 40 ); - if( !GfxBase ) - { - return 0; - } - - // intuition.library - IntuitionBase = (struct IntuitionBase *) OpenLibrary( "intuition.library", 40 ); - if( !IntuitionBase ) - { - return 0; - } - - // keymap.library - KeymapBase = OpenLibrary( "keymap.library", 40 ); - if( !KeymapBase ) - { - return 0; - } - - // Utility.library - UtilityBase = (struct UtilityBase *) OpenLibrary( "utility.library", 40 ); - if( !UtilityBase ) - { - return 0; - } - - return 1; -} - - -//======================================================================== -// _glfwTerminateLibraries() - Unload shared libraries -//======================================================================== - -static void _glfwTerminateLibraries( void ) -{ - // Close graphics.library - if( GfxBase ) - { - CloseLibrary( (struct Library *) GfxBase ); - GfxBase = NULL; - } - - // Close intuition.library - if( IntuitionBase ) - { - CloseLibrary( (struct Library *) IntuitionBase ); - IntuitionBase = NULL; - } - - // Close keymap.library - if( KeymapBase ) - { - CloseLibrary( KeymapBase ); - KeymapBase = NULL; - } - - // Close utility.library - if( UtilityBase ) - { - CloseLibrary( (struct Library *) UtilityBase ); - UtilityBase = NULL; - } -} - - -//======================================================================== -// _glfwInitThreads() - Initialize GLFW thread package -//======================================================================== - -static int _glfwInitThreads( void ) -{ - int waitSig; - - // Allocate a signal to use for waiting (glfwWaitThread and - // glfwWaitCond) - waitSig = AllocSignal( -1 ); - if( waitSig == -1 ) - { - return 0; - } - - // Initialize critical section handle - memset( &_glfwThrd.CriticalSection,0,sizeof(struct SignalSemaphore) ); - InitSemaphore( &_glfwThrd.CriticalSection ); - - // The first thread (the main thread) has ID 0 - _glfwThrd.NextID = 0; - - // The first condition variable has ID 0xFFFFFFFF - _glfwThrd.NextCondID = 0xFFFFFFFF; - - // Fill out information about the main thread (this thread) - _glfwThrd.First.Previous = NULL; - _glfwThrd.First.Next = NULL; - _glfwThrd.First.ID = _glfwThrd.NextID ++; - _glfwThrd.First.Function = NULL; - _glfwThrd.First.Arg = NULL; - _glfwThrd.First.AmiTask = FindTask( NULL ); - _glfwThrd.First.AmiProc = (struct Process *) _glfwThrd.First.AmiTask; - _glfwThrd.First.WaitFor = NULL; - _glfwThrd.First.WaitSig = waitSig; - - // Store GLFW thread struct pointer in task user data - _glfwThrd.First.AmiTask->tc_UserData = (APTR) &_glfwThrd.First; - - return 1; -} - - -//======================================================================== -// _glfwTerminateThreads() - Terminate GLFW thread package -//======================================================================== - -static void _glfwTerminateThreads( void ) -{ - _GLFWthread *t, *t_next; - - // Enter critical section - ENTER_THREAD_CRITICAL_SECTION - - // Kill all threads (NOTE: THE USER SHOULD WAIT FOR ALL THREADS TO - // DIE, _BEFORE_ CALLING glfwTerminate()!!!) - t = _glfwThrd.First.Next; - while( t != NULL ) - { - // Get pointer to next thread - t_next = t->Next; - - // Simply murder the process, no mercy! - // ?? How about Process resources ?? - RemTask( t->AmiTask ); - - // Free memory allocated for this thread - free( (void *) t ); - - // Select next thread in list - t = t_next; - } - - // Free waiting signal for main thread - FreeSignal( _glfwThrd.First.WaitSig ); - - // Leave critical section - LEAVE_THREAD_CRITICAL_SECTION -} - - -//======================================================================== -// _glfwTerminate_atexit() - Terminate GLFW when exiting application -//======================================================================== - -void _glfwTerminate_atexit( void ) -{ - glfwTerminate(); -} - - - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// _glfwPlatformInit() - Initialize various GLFW state -//======================================================================== - -int _glfwPlatformInit( void ) -{ - // Load shared libraries - if( !_glfwInitLibraries() ) - { - _glfwTerminateLibraries(); - return GL_FALSE; - } - - // Initialize thread package - if( !_glfwInitThreads() ) - { - _glfwTerminateLibraries(); - return GL_FALSE; - } - - // Start the timer - if( !_glfwInitTimer() ) - { - _glfwTerminateThreads(); - _glfwTerminateLibraries(); - return GL_FALSE; - } - - // Initialize joysticks - _glfwInitJoysticks(); - - // Install atexit() routine - atexit( _glfwTerminate_atexit ); - - return GL_TRUE; -} - - -//======================================================================== -// _glfwPlatformTerminate() - Close window and kill all threads -//======================================================================== - -int _glfwPlatformTerminate( void ) -{ - // Only the main thread is allowed to do this... - if( FindTask( NULL ) != _glfwThrd.First.AmiTask ) - { - return GL_FALSE; - } - - // Close OpenGL window - glfwCloseWindow(); - - // Terminate joysticks - _glfwTerminateJoysticks(); - - // Kill timer - _glfwTerminateTimer(); - - // Kill thread package - _glfwTerminateThreads(); - - // Unload shared libraries - _glfwTerminateLibraries(); - - return GL_TRUE; -} diff -Nru glfw-2.6/lib/amigaos/amigaos_joystick.c glfw-2.7.2/lib/amigaos/amigaos_joystick.c --- glfw-2.6/lib/amigaos/amigaos_joystick.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/amigaos/amigaos_joystick.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,359 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: amigaos_joystick.c -// Platforms: AmigaOS, MorphOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - -//************************************************************************ -//**** GLFW internal functions **** -//************************************************************************ - -//======================================================================== -// _glfwSendJoyReadRequest() - Send joystick read request -//======================================================================== - -static void _glfwSendJoyReadRequest( void ) -{ - // Send read request - _glfwJoy.GameIO->io_Command = GPD_READEVENT; - _glfwJoy.GameIO->io_Flags = 0; - _glfwJoy.GameIO->io_Data = (APTR) &_glfwJoy.GameEvent; - _glfwJoy.GameIO->io_Length = sizeof(struct InputEvent); - SendIO( (struct IORequest *) _glfwJoy.GameIO ); -} - - -//======================================================================== -// _glfwInitJoysticks() - Initialize joystick interface -//======================================================================== - -void _glfwInitJoysticks( void ) -{ - unsigned char controller_type = 0; - struct GamePortTrigger game_trigger; - - // Start by clearing all handles - _glfwJoy.GameMP = NULL; - _glfwJoy.GameIO = NULL; - _glfwJoy.Present = 0; - _glfwJoy.GameDeviceOpen = 0; - - // Create gameport.device message port - if( !(_glfwJoy.GameMP = CreatePort( NULL, 0 )) ) - { - return; - } - - // Create gameport.device I/O request - if( !( _glfwJoy.GameIO = (struct IOStdReq *) - CreateExtIO(_glfwJoy.GameMP, sizeof(struct IOStdReq)) ) ) - { - _glfwTerminateJoysticks(); - return; - } - - // Open gameport.device (unit 1 = port 2) - _glfwJoy.GameIO->io_Message.mn_Node.ln_Type = NT_UNKNOWN; - if( OpenDevice( "gameport.device", 1, - (struct IORequest *)_glfwJoy.GameIO, 0 ) ) - { - _glfwTerminateJoysticks(); - return; - } - _glfwJoy.GameDeviceOpen = 1; - - // Start critical section - Forbid(); - - // Find out if anyone else is using the stick - _glfwJoy.GameIO->io_Command = GPD_ASKCTYPE; - _glfwJoy.GameIO->io_Flags = IOF_QUICK; - _glfwJoy.GameIO->io_Data = (APTR) &controller_type; - _glfwJoy.GameIO->io_Length = 1; - DoIO( (struct IORequest *) _glfwJoy.GameIO ); - - // Was it already allocated? - if( controller_type != GPCT_NOCONTROLLER ) - { - Permit(); - _glfwTerminateJoysticks(); - return; - } - - // Allocate joystick - controller_type = GPCT_ABSJOYSTICK; - _glfwJoy.GameIO->io_Command = GPD_SETCTYPE; - _glfwJoy.GameIO->io_Flags = IOF_QUICK; - _glfwJoy.GameIO->io_Data = (APTR) &controller_type; - _glfwJoy.GameIO->io_Length = 1; - DoIO( (struct IORequest *) _glfwJoy.GameIO ); - _glfwJoy.Present = 1; - - // End critical section - Permit(); - - // Set trigger conditions - game_trigger.gpt_Keys = GPTF_UPKEYS | GPTF_DOWNKEYS; - game_trigger.gpt_XDelta = 1; - game_trigger.gpt_YDelta = 1; - game_trigger.gpt_Timeout = (UWORD) 0xFFFF; // ~20 minutes - _glfwJoy.GameIO->io_Command = GPD_SETTRIGGER; - _glfwJoy.GameIO->io_Flags = IOF_QUICK; - _glfwJoy.GameIO->io_Data = (APTR) &game_trigger; - _glfwJoy.GameIO->io_Length = (LONG) sizeof(struct GamePortTrigger); - DoIO( (struct IORequest *) _glfwJoy.GameIO ); - - // Flush buffer - _glfwJoy.GameIO->io_Command = CMD_CLEAR; - _glfwJoy.GameIO->io_Flags = IOF_QUICK; - _glfwJoy.GameIO->io_Data = NULL; - _glfwJoy.GameIO->io_Length = 0; - DoIO( (struct IORequest *) _glfwJoy.GameIO ); - - // Send joystick read request (asynchronous) - _glfwSendJoyReadRequest(); -} - - -//======================================================================== -// _glfwTerminateJoysticks() - Close all opened joystick handles -//======================================================================== - -void _glfwTerminateJoysticks( void ) -{ - unsigned char controller_type; - - // Remove any remaining asynchronous messages - if( _glfwJoy.GameIO ) - { - if( !CheckIO( (struct IORequest *)_glfwJoy.GameIO ) ) - { - AbortIO( (struct IORequest *)_glfwJoy.GameIO ); - WaitIO( (struct IORequest *)_glfwJoy.GameIO ); - } - } - - // Deallocate joystick - if( _glfwJoy.Present ) - { - controller_type = GPCT_NOCONTROLLER; - _glfwJoy.GameIO->io_Command = GPD_SETCTYPE; - _glfwJoy.GameIO->io_Flags = IOF_QUICK; - _glfwJoy.GameIO->io_Data = (APTR) &controller_type; - _glfwJoy.GameIO->io_Length = 1; - DoIO( (struct IORequest *) _glfwJoy.GameIO ); - _glfwJoy.Present = 0; - } - - // Close gameport.device - if( _glfwJoy.GameDeviceOpen ) - { - CloseDevice( (struct IORequest *) _glfwJoy.GameIO ); - _glfwJoy.GameDeviceOpen = 0; - } - - // Delete I/O request - if( _glfwJoy.GameIO ) - { - DeleteExtIO( (struct IORequest *) _glfwJoy.GameIO ); - _glfwJoy.GameIO = NULL; - } - - // Delete message port - if( _glfwJoy.GameMP ) - { - DeletePort( _glfwJoy.GameMP ); - _glfwJoy.GameMP = NULL; - } -} - - -//======================================================================== -// _glfwPollJoystickEvents() - Empty joystick event queue -//======================================================================== - -static void _glfwPollJoystickEvents( void ) -{ - int got_event = 0; - - // Do we have a stick? - if( !_glfwJoy.Present ) - { - return; - } - - // Empty the message queue - while( GetMsg( _glfwJoy.GameMP ) != NULL ) - { - // Flag: we got an event - got_event = 1; - - switch( _glfwJoy.GameEvent.ie_Code ) - { - // Left button pressed - case IECODE_LBUTTON: - _glfwJoy.Button[ 0 ] = 1; - break; - - // Left button released - case (IECODE_LBUTTON | IECODE_UP_PREFIX): - _glfwJoy.Button[ 0 ] = 0; - break; - - // Right button pressed - case IECODE_RBUTTON: - _glfwJoy.Button[ 1 ] = 1; - break; - - // Right button released - case (IECODE_RBUTTON | IECODE_UP_PREFIX): - _glfwJoy.Button[ 1 ] = 0; - break; - - // Axis event - case IECODE_NOBUTTON: - _glfwJoy.Axis[ 0 ] = (float) _glfwJoy.GameEvent.ie_X; - _glfwJoy.Axis[ 1 ] = (float) -_glfwJoy.GameEvent.ie_Y; - break; - - default: - break; - } - } - - // Did we get any events? - if( got_event ) - { - // Send joystick read request (asynchronous) - _glfwSendJoyReadRequest(); - } -} - - - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// _glfwPlatformGetJoystickParam() - Determine joystick capabilities -//======================================================================== - -int _glfwPlatformGetJoystickParam( int joy, int param ) -{ - // Is joystick present? - if( joy != GLFW_JOYSTICK_1 || !_glfwJoy.Present ) - { - return 0; - } - - // We assume that the joystick is connected, and has two axes and two - // buttons (since there is no way of retrieving this information from - // AmigaOS) - switch( param ) - { - case GLFW_PRESENT: - return GL_TRUE; - - case GLFW_AXES: - return 2; - - case GLFW_BUTTONS: - return 2; - - default: - break; - } - - return 0; -} - - -//======================================================================== -// _glfwPlatformGetJoystickPos() - Get joystick axis positions -//======================================================================== - -int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes ) -{ - int k; - - // Is joystick present? - if( joy != GLFW_JOYSTICK_1 || !_glfwJoy.Present ) - { - return 0; - } - - // Update joystick state - _glfwPollJoystickEvents(); - - // Copy axis position information to output vector - if( numaxes > 2 ) - { - numaxes = 2; - } - for( k = 0; k < numaxes; ++ k ) - { - pos[ k ] = _glfwJoy.Axis[ k ]; - } - - return numaxes; -} - - -//======================================================================== -// _glfwPlatformGetJoystickButtons() - Get joystick button states -//======================================================================== - -int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, - int numbuttons ) -{ - int k; - - // Is joystick present? - if( joy != GLFW_JOYSTICK_1 || !_glfwJoy.Present ) - { - return 0; - } - - // Update joystick state - _glfwPollJoystickEvents(); - - // Copy button information to output vector - if( numbuttons > 2 ) - { - numbuttons = 2; - } - for( k = 0; k < numbuttons; ++ k ) - { - buttons[ k ] = _glfwJoy.Button[ k ]; - } - - return numbuttons; -} diff -Nru glfw-2.6/lib/amigaos/amigaos_thread.c glfw-2.7.2/lib/amigaos/amigaos_thread.c --- glfw-2.6/lib/amigaos/amigaos_thread.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/amigaos/amigaos_thread.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,494 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: amigaos_thread.c -// Platforms: AmigaOS, MorphOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - - -//************************************************************************ -//**** GLFW internal functions **** -//************************************************************************ - -//======================================================================== -// _glfwNewThread() - This is simply a "wrapper" for calling the user -// thread function. -//======================================================================== - -int _glfwNewThread( void ) -{ - GLFWthreadfun threadfun; - void *arg; - _GLFWthread *t, *t_wait; - struct Task *amiTask; - int waitSig; - - // Allocate a signal to use for waiting (glfwWaitThread and - // glfwWaitCond) - waitSig = AllocSignal( -1 ); - if( waitSig == -1 ) - { - // If we could not get a signal (VERY UNLIKELY), exit immediately - return 0; - } - - // Get current task - amiTask = FindTask( NULL ); - - // Enter critical section - ENTER_THREAD_CRITICAL_SECTION - - // The task's user data points to the GLFW thread struct - t = (_GLFWthread *) amiTask->tc_UserData; - - // Store wait signal handle - t->WaitSig = waitSig; - t->WaitFor = NULL; - - // Get user thread function pointer and argument - threadfun = t->Function; - arg = t->Arg; - - // Leave critical section - LEAVE_THREAD_CRITICAL_SECTION - - // Call the user thread function - threadfun( arg ); - - ENTER_THREAD_CRITICAL_SECTION - - // Remove thread from thread list - _glfwRemoveThread( t ); - - // Signal any waiting threads that we have died - for( t_wait = &_glfwThrd.First; t_wait; t_wait = t_wait->Next ) - { - if( t_wait->WaitFor == (void *) t ) - { - Signal( t_wait->AmiTask, 1L<WaitSig ); - t_wait->WaitFor = NULL; - } - } - - LEAVE_THREAD_CRITICAL_SECTION - - // When the process function returns, the process will die... - return 0; -} - - - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// _glfwPlatformCreateThread() - Create a new thread -//======================================================================== - -GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg ) -{ - GLFWthread ID; - _GLFWthread *t; - struct TagItem tagList[ 10 ]; - int tagNR; - - - // Enter critical section - ENTER_THREAD_CRITICAL_SECTION - - // Create a new thread information memory area - t = (_GLFWthread *) malloc( sizeof(_GLFWthread) ); - if( t == NULL ) - { - // Leave critical section - LEAVE_THREAD_CRITICAL_SECTION - return -1; - } - - // Get a new unique thread id - ID = _glfwThrd.NextID ++; - - // Store thread information in the thread list - t->ID = ID; - t->Function = fun; - t->Arg = arg; - -#ifdef _GLFW_MORPHOS - // For MorphOS, we set up a 68k -> PPC switch trap instruction. - // CreateNewProc actually creates a 68k process (emulated), so we make - // sure that the first 68k instruction that is executed is a trap - // instruction that forces the execution model to change from emulated - // 68k to native PPC (and starts execution at _glfwNewThread). - t->mosEmulLibEntry.Trap = TRAP_LIB; - t->mosEmulLibEntry.Extension = 0; - t->mosEmulLibEntry.Func = _glfwNewThread; -#endif - - // Create new process - tagNR = 0; - tagList[ tagNR ].ti_Tag = NP_Entry; -#ifdef _GLFW_MORPHOS - tagList[ tagNR++ ].ti_Data = (ULONG) &t->mosEmulLibEntry; -#else - tagList[ tagNR++ ].ti_Data = (ULONG) _glfwNewThread; -#endif - tagList[ tagNR ].ti_Tag = NP_StackSize; - tagList[ tagNR++ ].ti_Data = _GLFW_TASK_STACK_SIZE; - tagList[ tagNR ].ti_Tag = NP_Input; - tagList[ tagNR++ ].ti_Data = (ULONG) Input(); - tagList[ tagNR ].ti_Tag = NP_Output; - tagList[ tagNR++ ].ti_Data = (ULONG) Output(); - tagList[ tagNR ].ti_Tag = NP_CloseInput; - tagList[ tagNR++ ].ti_Data = FALSE; - tagList[ tagNR ].ti_Tag = NP_CloseOutput; - tagList[ tagNR++ ].ti_Data = FALSE; - tagList[ tagNR ].ti_Tag = TAG_DONE; - t->AmiProc = CreateNewProc( tagList ); - - // Did the process creation fail? - if( !t->AmiProc ) - { - free( (void *) t ); - LEAVE_THREAD_CRITICAL_SECTION - return -1; - } - - // Get pointer to task structure - t->AmiTask = &(t->AmiProc->pr_Task); - - // Store GLFW thread struct pointer in task user data - t->AmiTask->tc_UserData = (APTR) t; - - // Append thread to thread list - _glfwAppendThread( t ); - - // Leave critical section - LEAVE_THREAD_CRITICAL_SECTION - - // Return the GLFW thread ID - return ID; -} - - -//======================================================================== -// _glfwPlatformDestroyThread() - Kill a thread. NOTE: THIS IS A VERY -// DANGEROUS OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME -// SITUATIONS! -//======================================================================== - -void _glfwPlatformDestroyThread( GLFWthread ID ) -{ - _GLFWthread *t, *t_wait; - - // Enter critical section - ENTER_THREAD_CRITICAL_SECTION - - // Get thread information pointer - t = _glfwGetThreadPointer( ID ); - if( t == NULL ) - { - LEAVE_THREAD_CRITICAL_SECTION - return; - } - - // Simply murder the process, no mercy! - // ?? How about Process resources ?? - RemTask( t->AmiTask ); - - // Remove thread from thread list - _glfwRemoveThread( t ); - - // Signal any waiting threads that the thread has died - for( t_wait = &_glfwThrd.First; t_wait; t_wait = t_wait->Next ) - { - if( t_wait->WaitFor == (void *) t ) - { - Signal( t_wait->AmiTask, 1L<WaitSig ); - t_wait->WaitFor = NULL; - } - } - - // Leave critical section - LEAVE_THREAD_CRITICAL_SECTION -} - - -//======================================================================== -// _glfwPlatformWaitThread() - Wait for a thread to die -//======================================================================== - -int _glfwPlatformWaitThread( GLFWthread ID, int waitmode ) -{ - struct Task *amiTask; - _GLFWthread *t, *t_this; - int waitSig; - - // Enter critical section - ENTER_THREAD_CRITICAL_SECTION - - // Get thread information pointer - t = _glfwGetThreadPointer( ID ); - - // Is the thread already dead? - if( t == NULL ) - { - LEAVE_THREAD_CRITICAL_SECTION - return GL_TRUE; - } - - // If got this far, the thread is alive => polling returns FALSE - if( waitmode == GLFW_NOWAIT ) - { - LEAVE_THREAD_CRITICAL_SECTION - return GL_FALSE; - } - - // Find pointer to this threads structure - amiTask = FindTask( NULL ); - t_this = (_GLFWthread *) amiTask->tc_UserData; - - // Store information in our thread structure that we want to wait for - // the specified thread to die - t_this->WaitFor = (void *) t; - waitSig = t_this->WaitSig; - - // Leave critical section - LEAVE_THREAD_CRITICAL_SECTION - - // Wait for thread to die - Wait( 1L<tc_UserData; - - // Return the found GLFW thread identifier - return t->ID; -} - - -//======================================================================== -// _glfwPlatformCreateMutex() - Create a mutual exclusion object -//======================================================================== - -GLFWmutex _glfwPlatformCreateMutex( void ) -{ - struct SignalSemaphore *mutex; - - // Allocate memory for mutex - mutex = (struct SignalSemaphore *) malloc( sizeof(struct SignalSemaphore) ); - if( !mutex ) - { - return NULL; - } - - // Initialize mutex object - memset( mutex, 0, sizeof(struct SignalSemaphore) ); - InitSemaphore( mutex ); - - // Cast to GLFWmutex and return - return (GLFWmutex) mutex; -} - - -//======================================================================== -// _glfwPlatformDestroyMutex() - Destroy a mutual exclusion object -//======================================================================== - -void _glfwPlatformDestroyMutex( GLFWmutex mutex ) -{ - // Free memory for mutex object - free( (void *) mutex ); -} - - -//======================================================================== -// _glfwPlatformLockMutex() - Request access to a mutex -//======================================================================== - -void _glfwPlatformLockMutex( GLFWmutex mutex ) -{ - // Wait for mutex to be released - ObtainSemaphore( (struct SignalSemaphore *) mutex ); -} - - -//======================================================================== -// _glfwPlatformUnlockMutex() - Release a mutex -//======================================================================== - -void _glfwPlatformUnlockMutex( GLFWmutex mutex ) -{ - // Release mutex - ReleaseSemaphore( (struct SignalSemaphore *) mutex ); -} - - -//======================================================================== -// _glfwPlatformCreateCond() - Create a new condition variable object -//======================================================================== - -GLFWcond _glfwPlatformCreateCond( void ) -{ - unsigned int cond; - - // Generate a new unique cond ID - ENTER_THREAD_CRITICAL_SECTION - cond = _glfwThrd.NextCondID --; - LEAVE_THREAD_CRITICAL_SECTION - - // Cast to GLFWcond and return - return (GLFWcond) cond; -} - - -//======================================================================== -// _glfwPlatformDestroyCond() - Destroy a condition variable object -//======================================================================== - -void _glfwPlatformDestroyCond( GLFWcond cond ) -{ -} - - -//======================================================================== -// _glfwPlatformWaitCond() - Wait for a condition to be raised -//======================================================================== - -void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, - double timeout ) -{ - struct Task *amiTask; - _GLFWthread *t_this; - - // Do we need a limited timeout? - if( timeout < GLFW_INFINITY ) - { - // Oooops! Not implemented properly yet! - ReleaseSemaphore( (struct SignalSemaphore *) mutex ); - Delay( 1 ); - ObtainSemaphore( (struct SignalSemaphore *) mutex ); - return; - } - - // Find pointer to this threads structure - amiTask = FindTask( NULL ); - t_this = (_GLFWthread *) amiTask->tc_UserData; - - // Store information in our thread structure that we want to wait for - // the specified condition variable to be signaled - ENTER_THREAD_CRITICAL_SECTION - t_this->WaitFor = (void *) cond; - LEAVE_THREAD_CRITICAL_SECTION - - // Release the mutex - ReleaseSemaphore( (struct SignalSemaphore *) mutex ); - - // Wait for condition variable - Wait( 1L<<(t_this->WaitSig) ); - - // Reacquire the mutex - ObtainSemaphore( (struct SignalSemaphore *) mutex ); -} - - -//======================================================================== -// _glfwPlatformSignalCond() - Signal a condition to one waiting thread -//======================================================================== - -void _glfwPlatformSignalCond( GLFWcond cond ) -{ - _GLFWthread *t_wait; - - // Broadcast condition to one waiting thread - ENTER_THREAD_CRITICAL_SECTION - for( t_wait = &_glfwThrd.First; t_wait; t_wait = t_wait->Next ) - { - if( t_wait->WaitFor == (void *) cond ) - { - Signal( t_wait->AmiTask, 1L<WaitSig ); - t_wait->WaitFor = NULL; - break; - } - } - LEAVE_THREAD_CRITICAL_SECTION -} - - -//======================================================================== -// _glfwPlatformBroadcastCond() - Broadcast a condition to all waiting -// threads -//======================================================================== - -void _glfwPlatformBroadcastCond( GLFWcond cond ) -{ - _GLFWthread *t_wait; - - // Broadcast condition to any waiting threads - ENTER_THREAD_CRITICAL_SECTION - for( t_wait = &_glfwThrd.First; t_wait; t_wait = t_wait->Next ) - { - if( t_wait->WaitFor == (void *) cond ) - { - Signal( t_wait->AmiTask, 1L<WaitSig ); - t_wait->WaitFor = NULL; - } - } - LEAVE_THREAD_CRITICAL_SECTION -} - - -//======================================================================== -// _glfwPlatformGetNumberOfProcessors() - Return the number of processors -// in the system. -//======================================================================== - -int _glfwPlatformGetNumberOfProcessors( void ) -{ - // Return number of processors online (MorphOS has SMP support, so we - // should do something useful here...) - return 1; -} diff -Nru glfw-2.6/lib/amigaos/amigaos_time.c glfw-2.7.2/lib/amigaos/amigaos_time.c --- glfw-2.6/lib/amigaos/amigaos_time.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/amigaos/amigaos_time.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,206 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: amigaos_time.c -// Platforms: AmigaOS, MorphOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - - -//************************************************************************ -//**** GLFW internal functions **** -//************************************************************************ - -//======================================================================== -// _glfwInitTimer() - Initialize timer -//======================================================================== - -int _glfwInitTimer( void ) -{ - ULONG freq; - struct EClockVal t; - - // Start by clearing all handles - TimerBase = NULL; - _glfwTimer.TimerMP = NULL; - _glfwTimer.TimerIO = NULL; - - // Open timer.device (used as a library for ReadEClock) - if( (_glfwTimer.TimerMP = CreatePort( NULL, 0 )) ) - { - // Create the I/O request - if( (_glfwTimer.TimerIO = (struct timerequest *) - CreateExtIO(_glfwTimer.TimerMP, sizeof(struct timerequest))) ) - { - // Open the timer device - if( !( OpenDevice( "timer.device", UNIT_MICROHZ, - (struct IORequest *) _glfwTimer.TimerIO, - 0 ) ) ) - { - // Set up pointer for timer functions - TimerBase = - (struct Device *)_glfwTimer.TimerIO->tr_node.io_Device; - } - else - { - return 0; - } - } - else - { - return 0; - } - } - else - { - return 0; - } - - // Get current time - freq = ReadEClock( &t ); - - // Calculate resolution - _glfwTimer.Resolution = 1.0 / (double) freq; - - // Convert to 64-bit integer - _glfwTimer.t0 = (long long) t.ev_hi * (long long) 4294967296 + - (long long) t.ev_lo; - - return 1; -} - - -//======================================================================== -// _glfwTerminateTimer() - Terminate timer -//======================================================================== - -void _glfwTerminateTimer( void ) -{ - // Empty the timer.device message port queue - if( _glfwTimer.TimerMP ) - { - struct Message *msg; - while( NULL != (msg = GetMsg( _glfwTimer.TimerMP )) ) - { - ReplyMsg( msg ); - } - } - - // Close timer.device - if( TimerBase ) - { - CloseDevice( (struct IORequest *) _glfwTimer.TimerIO ); - TimerBase = NULL; - } - - // Delete timer.device I/O request - if( _glfwTimer.TimerIO ) - { - DeleteExtIO( (struct IORequest *) _glfwTimer.TimerIO ); - _glfwTimer.TimerIO = NULL; - } - - // Delete timer.device message port - if( _glfwTimer.TimerMP ) - { - DeletePort( _glfwTimer.TimerMP ); - _glfwTimer.TimerMP = NULL; - } -} - - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// _glfwPlatformGetTime() - Return timer value in seconds -//======================================================================== - -double _glfwPlatformGetTime( void ) -{ - struct EClockVal t; - long long t64; - - // Get current time - (void) ReadEClock( &t ); - - // Convert to 64-bit integer - t64 = (long long) t.ev_hi * (long long) 4294967296 + - (long long) t.ev_lo; - - return (double)(t64 - _glfwTimer.t0) * _glfwTimer.Resolution; -} - - -//======================================================================== -// _glfwPlatformSetTime() - Set timer value in seconds -//======================================================================== - -void _glfwPlatformSetTime( double t ) -{ - struct EClockVal t0; - long long t64; - - // Get current time - (void) ReadEClock( &t0 ); - - // Convert to 64-bit integer - t64 = (long long) t0.ev_hi * (long long) 4294967296 + - (long long) t0.ev_lo; - - // Calulate new starting time - _glfwTimer.t0 = t64 - (long long)(t/_glfwTimer.Resolution); -} - - -//======================================================================== -// _glfwPlatformSleep() - Put a thread to sleep for a specified amount of -// time -//======================================================================== - -void _glfwPlatformSleep( double time ) -{ - ULONG ticks; - - // Too short time? - if( time <= 0.0 ) - { - return; - } - - // Calculate Delay ticks (should be 50 ticks per second) - ticks = (ULONG) ((double)TICKS_PER_SECOND * time + 0.5); - if( ticks == 0 ) - { - ticks = 1; - } - - // Put process to sleep - Delay( ticks ); -} diff -Nru glfw-2.6/lib/amigaos/amigaos_window.c glfw-2.7.2/lib/amigaos/amigaos_window.c --- glfw-2.6/lib/amigaos/amigaos_window.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/amigaos/amigaos_window.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,830 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: amigaos_window.c -// Platforms: AmigaOS, MorphOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - -//************************************************************************ -//**** GLFW internal functions **** -//************************************************************************ - -//======================================================================== -// _glfwTranslateChar() - Translates an AmigaOS key to Unicode -//======================================================================== - -static int _glfwTranslateChar( struct IntuiMessage *msg ) -{ - struct InputEvent event; - unsigned char buffer[ 4 ]; - int character; - - // Create input event - event.ie_Class = IECLASS_RAWKEY; - event.ie_Code = msg->Code; - event.ie_Qualifier = msg->Qualifier; - event.ie_EventAddress = msg->IAddress; - - // Map key event to text string - if( MapRawKey( &event, buffer, 4, NULL ) > 0 ) - { - // Valid Unicode character? - character = (int) buffer[ 0 ]; - if( (character >= 32 && character <= 126) || - (character >= 160 && character <= 255) ) - { - return character; - } - } - - return -1; -} - - -//======================================================================== -// _glfwTranslateKey() - Translates an AmigaOS key to internal coding -//======================================================================== - -static int _glfwTranslateKey( struct IntuiMessage *msg ) -{ - int key = msg->Code & 0x7F; - ULONG old_qualifier; - - // Special (non printable) keys - switch( key ) - { - // Modifier keys - case 0x60: return GLFW_KEY_LSHIFT; - case 0x61: return GLFW_KEY_RSHIFT; - case 0x62: return GLFW_KEY_LCTRL; // ? - case 0x63: return GLFW_KEY_RCTRL; // ? - case 0x64: return GLFW_KEY_LALT; - case 0x65: return GLFW_KEY_RALT; - - // Function keys - case 0x50: return GLFW_KEY_F1; - case 0x51: return GLFW_KEY_F2; - case 0x52: return GLFW_KEY_F3; - case 0x53: return GLFW_KEY_F4; - case 0x54: return GLFW_KEY_F5; - case 0x55: return GLFW_KEY_F6; - case 0x56: return GLFW_KEY_F7; - case 0x57: return GLFW_KEY_F8; - case 0x58: return GLFW_KEY_F9; - case 0x59: return GLFW_KEY_F10; - - // Other control keys - case 0x45: return GLFW_KEY_ESC; - case 0x42: return GLFW_KEY_TAB; - case 0x44: return GLFW_KEY_ENTER; - case 0x46: return GLFW_KEY_DEL; - case 0x41: return GLFW_KEY_BACKSPACE; - case 0x66: return GLFW_KEY_INSERT; // ? - case 0x4F: return GLFW_KEY_LEFT; - case 0x4E: return GLFW_KEY_RIGHT; - case 0x4C: return GLFW_KEY_UP; - case 0x4D: return GLFW_KEY_DOWN; - - // Keypad keys - case 0x0F: return GLFW_KEY_KP_0; - case 0x1D: return GLFW_KEY_KP_1; - case 0x1E: return GLFW_KEY_KP_2; - case 0x1F: return GLFW_KEY_KP_3; - case 0x2D: return GLFW_KEY_KP_4; - case 0x2E: return GLFW_KEY_KP_5; - case 0x2F: return GLFW_KEY_KP_6; - case 0x3D: return GLFW_KEY_KP_7; - case 0x3E: return GLFW_KEY_KP_8; - case 0x3F: return GLFW_KEY_KP_9; - case 0x43: return GLFW_KEY_KP_ENTER; - case 0x5E: return GLFW_KEY_KP_ADD; - case 0x4A: return GLFW_KEY_KP_SUBTRACT; - case 0x5D: return GLFW_KEY_KP_MULTIPLY; - case 0x5C: return GLFW_KEY_KP_DIVIDE; - case 0x3C: return GLFW_KEY_KP_DECIMAL; - - default: break; - } - - // Printable keys (without modifiers!) - old_qualifier = msg->Qualifier; - msg->Qualifier = 0; - key = _glfwTranslateChar( msg ); - msg->Qualifier = old_qualifier; - if( key > 0 ) - { - // Make sure it is upper case - key = ToUpper( key ); - } - - return key; -} - - -//======================================================================== -// _glfwProcessEvents() - Process all pending AmigaOS events -//======================================================================== - -static int _glfwProcessEvents( void ) -{ - struct IntuiMessage message, *tmp_message = NULL; - struct MsgPort *msg_port; - int win_closed = GL_FALSE, action; - int x, y; - - // Examine pending messages - msg_port = _glfwWin.Window->UserPort; - while( (tmp_message = (struct IntuiMessage *) GetMsg( msg_port )) ) - { - // Copy contents of message structure - message = *tmp_message; - - // Now reply to the message (we don't need it anymore) - ReplyMsg( (struct Message *) tmp_message ); - - // Handle different messages - switch( message.Class ) - { - - // Was the window activated? - case IDCMP_ACTIVEWINDOW: - _glfwWin.Active = GL_TRUE; - break; - - // Was the window deactivated? - case IDCMP_INACTIVEWINDOW: - _glfwWin.Active = GL_FALSE; - _glfwInputDeactivation(); - break; - - // Did we get a keyboard press or release? - case IDCMP_RAWKEY: - action = (message.Code & 0x80) ? GLFW_RELEASE : GLFW_PRESS; - message.Code &= 0x7F; - _glfwInputKey( _glfwTranslateKey( &message ), action ); - _glfwInputChar( _glfwTranslateChar( &message ), action ); - break; - - // Was the mouse moved? - case IDCMP_MOUSEMOVE: - x = message.MouseX; - y = message.MouseY; - if( _glfwWin.PointerHidden ) - { - // When pointer is hidden, we get delta moves - x += _glfwInput.MousePosX; - y += _glfwInput.MousePosY; - } - else if( x < 0 || x >= _glfwWin.Width || - y < 0 || y >= _glfwWin.Height ) - { - // Only report mouse moves that are INSIDE client area - break; - } - if( x != _glfwInput.MousePosX || y != _glfwInput.MousePosY ) - { - _glfwInput.MousePosX = x; - _glfwInput.MousePosY = y; - if( _glfwWin.MousePosCallback ) - { - _glfwWin.MousePosCallback( x, y ); - } - } - break; - - // Did we get a mouse button event? - case IDCMP_MOUSEBUTTONS: - switch( message.Code ) - { - case SELECTUP: - _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, - GLFW_RELEASE ); - break; - case SELECTDOWN: - _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, - GLFW_PRESS ); - break; - case MENUUP: - _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, - GLFW_RELEASE ); - break; - case MENUDOWN: - _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, - GLFW_PRESS ); - break; - default: - break; - } - break; - - // Was the window size changed? - case IDCMP_NEWSIZE: - _glfwWin.Width = message.IDCMPWindow->GZZWidth; - _glfwWin.Height = message.IDCMPWindow->GZZHeight; - if( _glfwWin.WindowSizeCallback ) - { - _glfwWin.WindowSizeCallback( _glfwWin.Width, - _glfwWin.Height ); - } - break; - - // Was the window contents damaged? - case IDCMP_REFRESHWINDOW: - // Intuition wants us to do this... - BeginRefresh( _glfwWin.Window ); - EndRefresh( _glfwWin.Window, TRUE ); - - // Call user callback function - if( _glfwWin.WindowRefreshCallback ) - { - _glfwWin.WindowRefreshCallback(); - } - break; - - // Was the window closed? - case IDCMP_CLOSEWINDOW: - win_closed = GL_TRUE; - break; - - default: - break; - } - } - - // Return GL_TRUE if window was closed - return( win_closed ); -} - - - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// _glfwPlatformOpenWindow() - Here is where the window is created, and -// the OpenGL rendering context is created -//======================================================================== - -int _glfwPlatformOpenWindow( int width, int height, int redbits, - int greenbits, int bluebits, int alphabits, int depthbits, - int stencilbits, int mode, int accumredbits, int accumgreenbits, - int accumbluebits, int accumalphabits, int auxbuffers, int stereo, - int refreshrate ) -{ - struct TagItem tagList[ 25 ]; - int tagNR, accumbits; - - // Calculate sum of accumulator bits - accumbits = accumredbits + accumgreenbits + accumbluebits + - accumalphabits; - - // Clear window state - _glfwWin.Screen = NULL; - _glfwWin.Window = NULL; - _glfwWin.Context = NULL; - _glfwWin.PointerHidden = 0; - _glfwWin.PointerSprite = NULL; - _glfwWin.InputMP = NULL; - _glfwWin.InputIO = NULL; - - // Create input.device message port - if( !(_glfwWin.InputMP = CreatePort( NULL, 0 )) ) - { - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - // Create input.device I/O request - if( !(_glfwWin.InputIO = (struct IOStdReq *) - CreateExtIO( _glfwWin.InputMP, sizeof(struct IOStdReq) )) ) - { - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - // Open input.device (for pointer position manipulation) - if( OpenDevice( "input.device", 0, - (struct IORequest *)_glfwWin.InputIO, 0 ) ) - { - DeleteExtIO( (struct IORequest *) _glfwWin.InputIO ); - _glfwWin.InputIO = NULL; - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - // Do we want fullscreen? - if( _glfwWin.Fullscreen ) - { - // Open a new Amiga screen - if( !_glfwOpenScreen( &width, &height, &redbits, &greenbits, - &bluebits, refreshrate ) ) - { - _glfwWin.Fullscreen = GL_FALSE; - } - } - - // Select window properties - tagNR = 0; - tagList[ tagNR ].ti_Tag = WA_Left; - tagList[ tagNR++ ].ti_Data = 0; - tagList[ tagNR ].ti_Tag = WA_Top; - tagList[ tagNR++ ].ti_Data = 0; - tagList[ tagNR ].ti_Tag = WA_IDCMP; - tagList[ tagNR++ ].ti_Data = IDCMP_REFRESHWINDOW | - IDCMP_CLOSEWINDOW | - IDCMP_NEWSIZE | - IDCMP_ACTIVEWINDOW | - IDCMP_INACTIVEWINDOW | - IDCMP_RAWKEY | - IDCMP_MOUSEMOVE | - IDCMP_MOUSEBUTTONS; - tagList[ tagNR ].ti_Tag = WA_ReportMouse; - tagList[ tagNR++ ].ti_Data = TRUE; - tagList[ tagNR ].ti_Tag = WA_RMBTrap; - tagList[ tagNR++ ].ti_Data = TRUE; - tagList[ tagNR ].ti_Tag = WA_NoCareRefresh; - tagList[ tagNR++ ].ti_Data = FALSE; - tagList[ tagNR ].ti_Tag = WA_SimpleRefresh; - tagList[ tagNR++ ].ti_Data = TRUE; - tagList[ tagNR ].ti_Tag = WA_Activate; - tagList[ tagNR++ ].ti_Data = TRUE; - tagList[ tagNR ].ti_Tag = WA_CloseGadget; - tagList[ tagNR++ ].ti_Data = _glfwWin.Fullscreen ? FALSE : TRUE; - tagList[ tagNR ].ti_Tag = WA_SizeGadget; - tagList[ tagNR++ ].ti_Data = _glfwWin.Fullscreen ? FALSE : ( _glfwWinHints.WindowNoResize ? FALSE : TRUE ); - tagList[ tagNR ].ti_Tag = WA_DepthGadget; - tagList[ tagNR++ ].ti_Data = _glfwWin.Fullscreen ? FALSE : TRUE; - tagList[ tagNR ].ti_Tag = WA_DragBar; - tagList[ tagNR++ ].ti_Data = _glfwWin.Fullscreen ? FALSE : TRUE; - tagList[ tagNR ].ti_Tag = WA_Borderless; - tagList[ tagNR++ ].ti_Data = _glfwWin.Fullscreen ? TRUE : FALSE; - tagList[ tagNR ].ti_Tag = WA_Backdrop; - tagList[ tagNR++ ].ti_Data = _glfwWin.Fullscreen ? TRUE : FALSE; - if( _glfwWin.Fullscreen ) - { - tagList[ tagNR ].ti_Tag = WA_CustomScreen; - tagList[ tagNR++ ].ti_Data = (ULONG) _glfwWin.Screen; - tagList[ tagNR ].ti_Tag = WA_Width; - tagList[ tagNR++ ].ti_Data = width; - tagList[ tagNR ].ti_Tag = WA_Height; - tagList[ tagNR++ ].ti_Data = height; - } - else - { - tagList[ tagNR ].ti_Tag = WA_GimmeZeroZero; - tagList[ tagNR++ ].ti_Data = TRUE; - tagList[ tagNR ].ti_Tag = WA_InnerWidth; - tagList[ tagNR++ ].ti_Data = width; - tagList[ tagNR ].ti_Tag = WA_InnerHeight; - tagList[ tagNR++ ].ti_Data = height; - tagList[ tagNR ].ti_Tag = WA_MinWidth; - tagList[ tagNR++ ].ti_Data = 20; - tagList[ tagNR ].ti_Tag = WA_MinHeight; - tagList[ tagNR++ ].ti_Data = 20; - tagList[ tagNR ].ti_Tag = WA_MaxWidth; - tagList[ tagNR++ ].ti_Data = 9999; - tagList[ tagNR ].ti_Tag = WA_MaxHeight; - tagList[ tagNR++ ].ti_Data = 9999; - tagList[ tagNR ].ti_Tag = WA_Title; - tagList[ tagNR++ ].ti_Data = (ULONG) "GLFW Window"; - tagList[ tagNR ].ti_Tag = WA_ScreenTitle; - tagList[ tagNR++ ].ti_Data = (ULONG) "GLFW Application"; - } - tagList[ tagNR ].ti_Tag = TAG_DONE; - - // Open window - _glfwWin.Window = OpenWindowTagList( NULL, tagList ); - if( !_glfwWin.Window ) - { - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - // Fullscreen/windowed post fixups - if( _glfwWin.Fullscreen ) - { - // Don't show screen title - ShowTitle( _glfwWin.Screen, FALSE ); - - // Remember window size - _glfwWin.Width = _glfwWin.Window->Width; - _glfwWin.Height = _glfwWin.Window->Height; - } - else - { - // If we are not in fullscreen mode, get screen handle from window - _glfwWin.Screen = _glfwWin.Window->WScreen; - - // Get ModeID for the current video mode - _glfwWin.ModeID = GetVPModeID( &_glfwWin.Screen->ViewPort ); - - // Remember window size - _glfwWin.Width = _glfwWin.Window->GZZWidth; - _glfwWin.Height = _glfwWin.Window->GZZHeight; - } - - // Put window on top - WindowToFront( _glfwWin.Window ); - - // Create OpenGL context -#ifdef _GLFW_STORMMESA - tagNR = 0; - tagList[ tagNR ].ti_Tag = AMA_Window; - tagList[ tagNR++ ].ti_Data = (ULONG) _glfwWin.Window; - tagList[ tagNR ].ti_Tag = AMA_RastPort; - tagList[ tagNR++ ].ti_Data = (ULONG) _glfwWin.Window->RPort; - tagList[ tagNR ].ti_Tag = AMA_Screen; - tagList[ tagNR++ ].ti_Data = (ULONG) _glfwWin.Screen; - tagList[ tagNR ].ti_Tag = AMA_Left; - tagList[ tagNR++ ].ti_Data = 0; - tagList[ tagNR ].ti_Tag = AMA_Bottom; - tagList[ tagNR++ ].ti_Data = 0; - tagList[ tagNR ].ti_Tag = AMA_Width; - tagList[ tagNR++ ].ti_Data = _glfwWin.Width; - tagList[ tagNR ].ti_Tag = AMA_Height; - tagList[ tagNR++ ].ti_Data = _glfwWin.Height; - tagList[ tagNR ].ti_Tag = AMA_DoubleBuf; - tagList[ tagNR++ ].ti_Data = GL_TRUE; - tagList[ tagNR ].ti_Tag = AMA_RGBMode; - tagList[ tagNR++ ].ti_Data = GL_TRUE; - tagList[ tagNR ].ti_Tag = AMA_AlphaFlag; - tagList[ tagNR++ ].ti_Data = alphabits ? GL_TRUE : GL_FALSE; - tagList[ tagNR ].ti_Tag = AMA_NoDepth; - tagList[ tagNR++ ].ti_Data = depthbits ? GL_FALSE : GL_TRUE; - tagList[ tagNR ].ti_Tag = AMA_NoStencil; - tagList[ tagNR++ ].ti_Data = stencilbits ? GL_FALSE : GL_TRUE; - tagList[ tagNR ].ti_Tag = AMA_NoAccum; - tagList[ tagNR++ ].ti_Data = accumbits ? GL_FALSE : GL_TRUE; - tagList[ tagNR ].ti_Tag = AMA_DirectRender; - tagList[ tagNR++ ].ti_Data = GL_TRUE; - tagList[ tagNR ].ti_Tag = AMA_DrawMode; - tagList[ tagNR++ ].ti_Data = AMESA_AGA_C2P; - tagList[ tagNR ].ti_Tag = TAG_DONE; - _glfwWin.Context = AmigaMesaCreateContext( tagList ); -#endif - if( !_glfwWin.Context ) - { - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - // Make current -#ifdef _GLFW_STORMMESA - AmigaMesaMakeCurrent( _glfwWin.Context, _glfwWin.Context->buffer ); -#endif - - return GL_TRUE; -} - - -//======================================================================== -// _glfwPlatformCloseWindow() - Properly kill the window/video display -//======================================================================== - -void _glfwPlatformCloseWindow( void ) -{ - // Restore mouse pointer (if hidden) - _glfwPlatformShowMouseCursor(); - - // Destroy OpenGL context - if( _glfwWin.Context ) - { -#ifdef _GLFW_STORMMESA - AmigaMesaDestroyContext( _glfwWin.Context ); -#endif - _glfwWin.Context = NULL; - } - - // Close window - if( _glfwWin.Window ) - { - CloseWindow( _glfwWin.Window ); - _glfwWin.Window = NULL; - } - - // Close screen - if( _glfwWin.Fullscreen && _glfwWin.Screen ) - { - CloseScreen( _glfwWin.Screen ); - } - _glfwWin.Screen = NULL; - - // Close input device I/O request - if( _glfwWin.InputIO ) - { - CloseDevice( (struct IORequest *) _glfwWin.InputIO ); - DeleteExtIO( (struct IORequest *) _glfwWin.InputIO ); - _glfwWin.InputIO = NULL; - } - - // Close input device message port - if( _glfwWin.InputMP ) - { - DeletePort( _glfwWin.InputMP ); - _glfwWin.InputMP = NULL; - } - -} - - -//======================================================================== -// _glfwPlatformSetWindowTitle() - Set the window title. -//======================================================================== - -void _glfwPlatformSetWindowTitle( const char *title ) -{ - if( !_glfwWin.Fullscreen ) - { - SetWindowTitles( _glfwWin.Window, (char*) title, (char*) title ); - } -} - - -//======================================================================== -// _glfwPlatformSetWindowSize() - Set the window size. -//======================================================================== - -void _glfwPlatformSetWindowSize( int width, int height ) -{ - if( !_glfwWin.Fullscreen ) - { - SizeWindow( _glfwWin.Window, width-_glfwWin.Width, - height-_glfwWin.Height ); - } -} - - -//======================================================================== -// _glfwPlatformSetWindowPos() - Set the window position. -//======================================================================== - -void _glfwPlatformSetWindowPos( int x, int y ) -{ - if( !_glfwWin.Fullscreen ) - { - ChangeWindowBox( _glfwWin.Window, x, y, _glfwWin.Window->Width, - _glfwWin.Window->Height ); - } -} - - -//======================================================================== -// _glfwPlatformIconfyWindow() - Window iconification -//======================================================================== - -void _glfwPlatformIconifyWindow( void ) -{ - if( _glfwWin.Fullscreen ) - { - ScreenToBack( _glfwWin.Screen ); - WBenchToFront(); - _glfwWin.Iconified = GL_TRUE; - } -} - - -//======================================================================== -// _glfwPlatformRestoreWindow() - Window un-iconification -//======================================================================== - -void _glfwPlatformRestoreWindow( void ) -{ - if( _glfwWin.Fullscreen ) - { - ScreenToFront( _glfwWin.Screen ); - } - WindowToFront( _glfwWin.Window ); - ActivateWindow( _glfwWin.Window ); - _glfwWin.Iconified = GL_FALSE; -} - - -//======================================================================== -// _glfwPlatformSwapBuffers() - Swap buffers (double-buffering) and poll -// any new events. -//======================================================================== - -void _glfwPlatformSwapBuffers( void ) -{ -#ifdef _GLFW_STORMMESA - AmigaMesaSwapBuffers( _glfwWin.Context ); -#endif -} - - -//======================================================================== -// _glfwPlatformSwapInterval() - Set double buffering swap interval -//======================================================================== - -void _glfwPlatformSwapInterval( int interval ) -{ - // Not supported -} - - -//======================================================================== -// _glfwPlatformRefreshWindowParams() -//======================================================================== - -void _glfwPlatformRefreshWindowParams( void ) -{ - int refresh; - GLint x; - GLboolean b; - - // This function is not proerly implemented yet. We use OpenGL for - // getting framebuffer format information - we should use some - // alternate interface (such as glX under the X Window System), but - // StormMesa does not seem to provide this. - - // Fill out information - _glfwWin.Accelerated = GL_TRUE; - glGetIntegerv( GL_RED_BITS, &x ); - _glfwWin.RedBits = x; - glGetIntegerv( GL_GREEN_BITS, &x ); - _glfwWin.GreenBits = x; - glGetIntegerv( GL_BLUE_BITS, &x ); - _glfwWin.BlueBits = x; - glGetIntegerv( GL_ALPHA_BITS, &x ); - _glfwWin.AlphaBits = x; - glGetIntegerv( GL_DEPTH_BITS, &x ); - _glfwWin.DepthBits = x; - glGetIntegerv( GL_STENCIL_BITS, &x ); - _glfwWin.StencilBits = x; - glGetIntegerv( GL_ACCUM_RED_BITS, &x ); - _glfwWin.AccumRedBits = x; - glGetIntegerv( GL_ACCUM_GREEN_BITS, &x ); - _glfwWin.AccumGreenBits = x; - glGetIntegerv( GL_ACCUM_BLUE_BITS, &x ); - _glfwWin.AccumBlueBits = x; - glGetIntegerv( GL_ACCUM_ALPHA_BITS, &x ); - _glfwWin.AccumAlphaBits = x; - glGetIntegerv( GL_AUX_BUFFERS, &x ); - _glfwWin.AuxBuffers = x; - glGetBooleanv( GL_AUX_BUFFERS, &b ); - _glfwWin.Stereo = b ? GL_TRUE : GL_FALSE; - - // Get ModeID information (refresh rate) - _glfwGetModeIDInfo( _glfwWin.ModeID, NULL, NULL, NULL, NULL, NULL, - &refresh ); - _glfwWin.RefreshRate = refresh; -} - - -//======================================================================== -// _glfwPlatformPollEvents() - Poll for new window and input events -//======================================================================== - -void _glfwPlatformPollEvents( void ) -{ - int winclosed; - - // Process all pending window events - winclosed = GL_FALSE; - if( _glfwProcessEvents() ) - { - winclosed = GL_TRUE; - } - - // Was there a window close request? - if( winclosed && _glfwWin.WindowCloseCallback ) - { - // Check if the program wants us to close the window - winclosed = _glfwWin.WindowCloseCallback(); - } - if( winclosed ) - { - glfwCloseWindow(); - } -} - - -//======================================================================== -// _glfwPlatformWaitEvents() - Wait for new window and input events -//======================================================================== - -void _glfwPlatformWaitEvents( void ) -{ - // Wait for new events - Wait( 1L << _glfwWin.Window->UserPort->mp_SigBit ); - - // Poll new events - _glfwPlatformPollEvents(); -} - - -//======================================================================== -// _glfwPlatformHideMouseCursor() - Hide mouse cursor (lock it) -//======================================================================== - -void _glfwPlatformHideMouseCursor( void ) -{ - // We only allow this under fullscreen right now, since we can't rely - // on the pointer position in windowed mode! Perhaps it's possible to - // "steal" the mouse with input.device or something...? - if( !_glfwWin.PointerHidden && _glfwWin.Fullscreen ) - { - // Allocate chip memory for the blank mouse pointer - _glfwWin.PointerSprite = AllocVec( 128, MEMF_CHIP | MEMF_CLEAR ); - if( _glfwWin.PointerSprite ) - { - // Switch to blank/transparent pointer - SetPointer( _glfwWin.Window, (UWORD *) _glfwWin.PointerSprite, - 1, 1, 0, 0 ); - _glfwWin.PointerHidden = 1; - - // Switch to mouse delta movement - Forbid(); - _glfwWin.Window->IDCMPFlags |= IDCMP_DELTAMOVE; - Permit(); - } - } -} - - -//======================================================================== -// _glfwPlatformShowMouseCursor() - Show mouse cursor (unlock it) -//======================================================================== - -void _glfwPlatformShowMouseCursor( void ) -{ - if( _glfwWin.PointerHidden ) - { - // Switch to absolute mouse movement - Forbid(); - _glfwWin.Window->IDCMPFlags &= (0xFFFFFFFF^IDCMP_DELTAMOVE); - Permit(); - - // Change back to normal pointer - ClearPointer( _glfwWin.Window ); - if( _glfwWin.PointerSprite ) - { - FreeVec( _glfwWin.PointerSprite ); - _glfwWin.PointerSprite = NULL; - } - _glfwWin.PointerHidden = 0; - } -} - - -//======================================================================== -// _glfwPlatformSetMouseCursorPos() - Set physical mouse cursor position -//======================================================================== - -void _glfwPlatformSetMouseCursorPos( int x, int y ) -{ - struct IEPointerPixel ppxl; - struct InputEvent event; - - // Adjust coordinates to window client area upper left corner - x += _glfwWin.Window->LeftEdge; - y += _glfwWin.Window->TopEdge; - - /* Set up IEPointerPixel fields */ - ppxl.iepp_Screen = _glfwWin.Screen; - ppxl.iepp_Position.X = x; - ppxl.iepp_Position.Y = y; - - /* Set up InputEvent fields */ - event.ie_EventAddress = (APTR)&ppxl; /* IEPointerPixel */ - event.ie_NextEvent = NULL; - event.ie_Class = IECLASS_NEWPOINTERPOS; /* new mouse pos */ - event.ie_SubClass = IESUBCLASS_PIXEL; /* on pixel */ - event.ie_Code = IECODE_NOBUTTON; - event.ie_Qualifier = 0; /* absolute pos */ - - /* Set up I/O request */ - _glfwWin.InputIO->io_Data = (APTR)&event; - _glfwWin.InputIO->io_Length = sizeof(struct InputEvent); - _glfwWin.InputIO->io_Command = IND_WRITEEVENT; - - /* Perform I/O (move mouse cursor) */ - DoIO( (struct IORequest *)_glfwWin.InputIO ); -} diff -Nru glfw-2.6/lib/amigaos/Makefile.amigaos.gcc glfw-2.7.2/lib/amigaos/Makefile.amigaos.gcc --- glfw-2.6/lib/amigaos/Makefile.amigaos.gcc 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/amigaos/Makefile.amigaos.gcc 1970-01-01 00:00:00.000000000 +0000 @@ -1,128 +0,0 @@ -########################################################################## -# Makefile for GLFW on AmigaOS using GCC. -#------------------------------------------------------------------------- -# To compile GLFW using this makefile, run: -# make -f Makefile.amigaos.gcc -########################################################################## - -########################################################################## -# Default: Build static library version of GLFW -########################################################################## -default: libglfw.a - - -########################################################################## -# GLFW version -########################################################################## -VERMAJOR = 2 -VERMINOR = 4 - - -########################################################################## -# Compiler settings -########################################################################## -CC = gcc -CFLAGS = -c -I. -I.. -Wall -Os -m68020 -m68881 - -# Some modules should be optimized for speed (e.g. image decoding) -CFLAGS_SPEED = -c -I. -I.. -Wall -O3 -ffast-math -m68020 -m68881 - - -########################################################################## -# Library builder settings -########################################################################## -MKLIB = ar -LIBFLAGS = -rcs - - -########################################################################## -# Object files which are part of the GLFW library -########################################################################## -OBJS = \ - enable.o \ - fullscreen.o \ - glext.o \ - image.o \ - init.o \ - input.o \ - joystick.o \ - tga.o \ - thread.o \ - time.o \ - window.o \ - amigaos_enable.o \ - amigaos_fullscreen.o \ - amigaos_glext.o \ - amigaos_init.o \ - amigaos_joystick.o \ - amigaos_thread.o \ - amigaos_time.o \ - amigaos_window.o - - -########################################################################## -# Rule for building library -########################################################################## -libglfw.a: $(OBJS) - $(MKLIB) $(LIBFLAGS) $@ $(OBJS) - - -########################################################################## -# Rules for building library object files -########################################################################## -enable.o: ../enable.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../enable.c - -fullscreen.o: ../fullscreen.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../fullscreen.c - -glext.o: ../glext.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../glext.c - -image.o: ../image.c ../internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o $@ ../image.c - -init.o: ../init.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../init.c - -input.o: ../input.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../input.c - -joystick.o: ../joystick.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../joystick.c - -tga.o: ../tga.c ../internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o $@ ../tga.c - -thread.o: ../thread.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../thread.c - -time.o: ../time.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../time.c - -window.o: ../window.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../window.c - -amigaos_enable.o: amigaos_enable.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ amigaos_enable.c - -amigaos_fullscreen.o: amigaos_fullscreen.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ amigaos_fullscreen.c - -amigaos_glext.o: amigaos_glext.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ amigaos_glext.c - -amigaos_init.o: amigaos_init.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ amigaos_init.c - -amigaos_joystick.o: amigaos_joystick.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ amigaos_joystick.c - -amigaos_thread.o: amigaos_thread.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ amigaos_thread.c - -amigaos_time.o: amigaos_time.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ amigaos_time.c - -amigaos_window.o: amigaos_window.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ amigaos_window.c diff -Nru glfw-2.6/lib/amigaos/Makefile.amigaos.vbcc glfw-2.7.2/lib/amigaos/Makefile.amigaos.vbcc --- glfw-2.6/lib/amigaos/Makefile.amigaos.vbcc 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/amigaos/Makefile.amigaos.vbcc 1970-01-01 00:00:00.000000000 +0000 @@ -1,128 +0,0 @@ -########################################################################## -# Makefile for GLFW on AmigaOS using VBCC. -#------------------------------------------------------------------------- -# To compile GLFW using this makefile, run: -# make -f Makefile.amigaos.vbcc -########################################################################## - -########################################################################## -# Default: Build static library version of GLFW -########################################################################## -default: glfw.lib - - -########################################################################## -# GLFW version -########################################################################## -VERMAJOR = 2 -VERMINOR = 4 - - -########################################################################## -# Compiler settings -########################################################################## -CC = vc -CFLAGS = -c -I. -I/ -c99 -cpu=68020 -fpu=68881 -O1 - -# Some modules should be optimized for speed (e.g. image decoding) -CFLAGS_SPEED = -c -I. -I/ -c99 -cpu=68020 -fpu=68881 -O1 - - -########################################################################## -# Library builder settings -########################################################################## -MKLIB = join -LIBFLAGS = as - - -########################################################################## -# Object files which are part of the GLFW library -########################################################################## -OBJS = \ - enable.o \ - fullscreen.o \ - glext.o \ - image.o \ - init.o \ - input.o \ - joystick.o \ - tga.o \ - thread.o \ - time.o \ - window.o \ - amigaos_enable.o \ - amigaos_fullscreen.o \ - amigaos_glext.o \ - amigaos_init.o \ - amigaos_joystick.o \ - amigaos_thread.o \ - amigaos_time.o \ - amigaos_window.o - - -########################################################################## -# Rule for building library -########################################################################## -glfw.lib: $(OBJS) - $(MKLIB) $(OBJS) $(LIBFLAGS) $@ - - -########################################################################## -# Rules for building library object files -########################################################################## -enable.o: /enable.c /internal.h platform.h - $(CC) $(CFLAGS) -o $@ /enable.c - -fullscreen.o: /fullscreen.c /internal.h platform.h - $(CC) $(CFLAGS) -o $@ /fullscreen.c - -glext.o: /glext.c /internal.h platform.h - $(CC) $(CFLAGS) -o $@ /glext.c - -image.o: /image.c /internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o $@ /image.c - -init.o: /init.c /internal.h platform.h - $(CC) $(CFLAGS) -o $@ /init.c - -input.o: /input.c /internal.h platform.h - $(CC) $(CFLAGS) -o $@ /input.c - -joystick.o: /joystick.c /internal.h platform.h - $(CC) $(CFLAGS) -o $@ /joystick.c - -tga.o: /tga.c /internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o $@ /tga.c - -thread.o: /thread.c /internal.h platform.h - $(CC) $(CFLAGS) -o $@ /thread.c - -time.o: /time.c /internal.h platform.h - $(CC) $(CFLAGS) -o $@ /time.c - -window.o: /window.c /internal.h platform.h - $(CC) $(CFLAGS) -o $@ /window.c - -amigaos_enable.o: amigaos_enable.c /internal.h platform.h - $(CC) $(CFLAGS) -o $@ amigaos_enable.c - -amigaos_fullscreen.o: amigaos_fullscreen.c /internal.h platform.h - $(CC) $(CFLAGS) -o $@ amigaos_fullscreen.c - -amigaos_glext.o: amigaos_glext.c /internal.h platform.h - $(CC) $(CFLAGS) -o $@ amigaos_glext.c - -amigaos_init.o: amigaos_init.c /internal.h platform.h - $(CC) $(CFLAGS) -o $@ amigaos_init.c - -amigaos_joystick.o: amigaos_joystick.c /internal.h platform.h - $(CC) $(CFLAGS) -o $@ amigaos_joystick.c - -amigaos_thread.o: amigaos_thread.c /internal.h platform.h - $(CC) $(CFLAGS) -o $@ amigaos_thread.c - -amigaos_time.o: amigaos_time.c /internal.h platform.h - $(CC) $(CFLAGS) -o $@ amigaos_time.c - -amigaos_window.o: amigaos_window.c /internal.h platform.h - $(CC) $(CFLAGS) -o $@ amigaos_window.c diff -Nru glfw-2.6/lib/amigaos/platform.h glfw-2.7.2/lib/amigaos/platform.h --- glfw-2.6/lib/amigaos/platform.h 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/amigaos/platform.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,337 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: platform.h -// Platforms: AmigaOS, MorphOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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 _platform_h_ -#define _platform_h_ - -// First of all: a file that hides compiler specific stuff -#include "SDI_compiler.h" - - -// This is the AmigaOS version of GLFW -#define _GLFW_AMIGAOS - -// Are we compiling for MorphOS? -#if defined(__MORPHOS__) || defined(MORPHOS) - #define _GLFW_MORPHOS -#endif - -// Mesa/OpenGL flavour (we only support StormMesa at the moment) -#if !defined(_GLFW_STORMMESA) - #define _GLFW_STORMMESA -#endif - - - -// Include files -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - - -// Amiga Mesa/OpenGL implementation dependent include -#ifdef _GLFW_STORMMESA - #include -#endif - -// MorphOS support -#ifdef _GLFW_MORPHOS - #include -#endif - -// GLFW+GL+GLU defines -#ifdef __GNUC__ - #include "../../include/GL/glfw.h" -#else - #include "//include/GL/glfw.h" -#endif - - -// Stack size for each thread (in bytes) -#define _GLFW_TASK_STACK_SIZE 50000 - - -//======================================================================== -// Global variables (GLFW internals) -//======================================================================== - -//------------------------------------------------------------------------ -// Shared libraries -//------------------------------------------------------------------------ - -#if defined( _init_c_ ) -struct GfxBase * GfxBase; -struct IntuitionBase * IntuitionBase; -struct Library * KeymapBase; -struct UtilityBase * UtilityBase; -struct Device * TimerBase; -#endif - - -//------------------------------------------------------------------------ -// Window structure -//------------------------------------------------------------------------ -typedef struct _GLFWwin_struct _GLFWwin; - -struct _GLFWwin_struct { - -// ========= PLATFORM INDEPENDENT MANDATORY PART ========================= - - // User callback functions - GLFWwindowsizefun WindowSizeCallback; - GLFWwindowclosefun WindowCloseCallback; - GLFWwindowrefreshfun WindowRefreshCallback; - GLFWmousebuttonfun MouseButtonCallback; - GLFWmouseposfun MousePosCallback; - GLFWmousewheelfun MouseWheelCallback; - GLFWkeyfun KeyCallback; - GLFWcharfun CharCallback; - - // User selected window settings - int Fullscreen; // Fullscreen flag - int MouseLock; // Mouse-lock flag - int AutoPollEvents; // Auto polling flag - int SysKeysDisabled; // System keys disabled flag - int WindowNoResize; // Resize- and maximize gadgets disabled flag - - // Window status & parameters - int Opened; // Flag telling if window is opened or not - int Active; // Application active flag - int Iconified; // Window iconified flag - int Width, Height; // Window width and heigth - int Accelerated; // GL_TRUE if window is HW accelerated - int RedBits; - int GreenBits; - int BlueBits; - int AlphaBits; - int DepthBits; - int StencilBits; - int AccumRedBits; - int AccumGreenBits; - int AccumBlueBits; - int AccumAlphaBits; - int AuxBuffers; - int Stereo; - int RefreshRate; // Vertical monitor refresh rate - - // Extensions & OpenGL version - int Has_GL_SGIS_generate_mipmap; - int Has_GL_ARB_texture_non_power_of_two; - int GLVerMajor,GLVerMinor; - - -// ========= PLATFORM SPECIFIC PART ====================================== - - // Platform specific window resources - struct Screen *Screen; // Screen handle - struct Window *Window; // Window handle - ULONG ModeID; // ModeID - APTR PointerSprite; // Memory for blank pointer sprite - int PointerHidden; // Is pointer hidden? - struct MsgPort *InputMP; // Message port (pointer movement) - struct IOStdReq *InputIO; // I/O request (pointer movement) - - // Mesa/OpenGL flavour specific -#ifdef _GLFW_STORMMESA - struct amigamesa_context *Context; // GL context handle -#endif - - // Platform specific extensions - - // Various platform specific internal variables - -}; - -GLFWGLOBAL _GLFWwin _glfwWin; - - -//------------------------------------------------------------------------ -// User input status (most of this should go in _GLFWwin) -//------------------------------------------------------------------------ -GLFWGLOBAL struct { - -// ========= PLATFORM INDEPENDENT MANDATORY PART ========================= - - // Mouse status - int MousePosX, MousePosY; - int WheelPos; - char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ]; - - // Keyboard status - char Key[ GLFW_KEY_LAST+1 ]; - int LastChar; - - // User selected settings - int StickyKeys; - int StickyMouseButtons; - int KeyRepeat; - - -// ========= PLATFORM SPECIFIC PART ====================================== - - // Platform specific internal variables - int MouseMoved, OldMouseX, OldMouseY; - -} _glfwInput; - - -//------------------------------------------------------------------------ -// Timer status -//------------------------------------------------------------------------ -GLFWGLOBAL struct { - struct MsgPort *TimerMP; - struct timerequest *TimerIO; - double Resolution; - long long t0; -} _glfwTimer; - - -//------------------------------------------------------------------------ -// Thread record (one for each thread) -//------------------------------------------------------------------------ -typedef struct _GLFWthread_struct _GLFWthread; - -struct _GLFWthread_struct { - -// ========= PLATFORM INDEPENDENT MANDATORY PART ========================= - - // Pointer to previous and next threads in linked list - _GLFWthread *Previous, *Next; - - // GLFW user side thread information - GLFWthread ID; - -// ========= PLATFORM SPECIFIC PART ====================================== - - // System side thread information - GLFWthreadfun Function; - void *Arg; - struct Process *AmiProc; - struct Task *AmiTask; - - // "Wait for" object. Can be a thread, condition variable or NULL. - void *WaitFor; - int WaitSig; - - // MorphOS support -#ifdef _GLFW_MORPHOS - struct EmulLibEntry mosEmulLibEntry; -#endif -}; - - -//------------------------------------------------------------------------ -// General thread information -//------------------------------------------------------------------------ -GLFWGLOBAL struct { - -// ========= PLATFORM INDEPENDENT MANDATORY PART ========================= - - // Next thread ID to use (increments for every created thread) - GLFWthread NextID; - - // First thread in linked list (always the main thread) - _GLFWthread First; - -// ========= PLATFORM SPECIFIC PART ====================================== - - // Critical section lock - struct SignalSemaphore CriticalSection; - - // Next condition variable ID (decrements for every created cond) - unsigned int NextCondID; - -} _glfwThrd; - - -//------------------------------------------------------------------------ -// Joystick information & state -//------------------------------------------------------------------------ -GLFWGLOBAL struct { - int Present; - int GameDeviceOpen; - struct IOStdReq *GameIO; - struct MsgPort *GameMP; - struct InputEvent GameEvent; - float Axis[ 2 ]; - unsigned char Button[ 2 ]; -} _glfwJoy; - - -//======================================================================== -// Macros for encapsulating critical code sections (i.e. making parts -// of GLFW thread safe) -//======================================================================== - -// Thread list management -#define ENTER_THREAD_CRITICAL_SECTION ObtainSemaphore( &_glfwThrd.CriticalSection ); -#define LEAVE_THREAD_CRITICAL_SECTION ReleaseSemaphore( &_glfwThrd.CriticalSection ); - - -//======================================================================== -// Prototypes for platform specific internal functions -//======================================================================== - -// Time -int _glfwInitTimer( void ); -void _glfwTerminateTimer( void ); - -// Fullscreen -int _glfwOpenScreen( int *width, int *height, int *r, int *g, int *b, - int refresh ); -int _glfwGetClosestVideoMode( int *w, int *h, int *r, int *g, int *b, - int refresh ); -void _glfwGetModeIDInfo( ULONG ModeID, int *w, int *h, int *r, int *g, - int *b, int *refresh ); -// Joystick -void _glfwInitJoysticks( void ); -void _glfwTerminateJoysticks( void ); - - -#endif // _platform_h_ diff -Nru glfw-2.6/lib/amigaos/SDI_compiler.h glfw-2.7.2/lib/amigaos/SDI_compiler.h --- glfw-2.6/lib/amigaos/SDI_compiler.h 2003-01-31 22:52:40.000000000 +0000 +++ glfw-2.7.2/lib/amigaos/SDI_compiler.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,94 +0,0 @@ -#ifndef SDI_COMPILER_H -#define SDI_COMPILER_H - -/* Includeheader - - Name: SDI_compiler.h - Versionstring: $VER: SDI_compiler.h 1.5 (29.07.2000) - Author: SDI - Distribution: PD - Description: defines to hide compiler stuff - - 1.1 25.06.98 : created from data made by Gunter Nikl - 1.2 17.11.99 : added VBCC - 1.3 29.02.00 : fixed VBCC REG define - 1.4 30.03.00 : fixed SAVEDS for VBCC - 1.5 29.07.00 : added #undef statements (needed e.g. for AmiTCP together with vbcc) -*/ - -#ifdef ASM -#undef ASM -#endif -#ifdef REG -#undef REG -#endif -#ifdef LREG -#undef LREG -#endif -#ifdef CONST -#undef CONST -#endif -#ifdef SAVEDS -#undef SAVEDS -#endif -#ifdef INLINE -#undef INLINE -#endif -#ifdef REGARGS -#undef REGARGS -#endif -#ifdef STDARGS -#undef STDARGS -#endif - -/* first "exceptions" */ - -#if defined(__MAXON__) - #define STDARGS - #define REGARGS - #define SAVEDS - #define INLINE inline -#elif defined(__VBCC__) - #define STDARGS - #define REGARGS - #define INLINE - #define REG(reg,arg) __reg(#reg) arg -#elif defined(__STORM__) - #define STDARGS - #define REGARGS - #define INLINE inline -#elif defined(__SASC) - #define ASM(arg) arg __asm -#elif defined(__GNUC__) - #define REG(reg,arg) arg __asm(#reg) - #define LREG(reg,arg) register REG(reg,arg) -#endif - -/* then "common" ones */ - -#if !defined(ASM) - #define ASM(arg) arg -#endif -#if !defined(REG) - #define REG(reg,arg) register __##reg arg -#endif -#if !defined(LREG) - #define LREG(reg,arg) register arg -#endif -#if !defined(CONST) - #define CONST const -#endif -#if !defined(SAVEDS) - #define SAVEDS __saveds -#endif -#if !defined(INLINE) - #define INLINE __inline -#endif -#if !defined(REGARGS) - #define REGARGS __regargs -#endif -#if !defined(STDARGS) - #define STDARGS __stdargs -#endif - -#endif /* SDI_COMPILER_H */ diff -Nru glfw-2.6/lib/carbon/carbon_enable.c glfw-2.7.2/lib/carbon/carbon_enable.c --- glfw-2.6/lib/carbon/carbon_enable.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/carbon/carbon_enable.c 2011-06-20 12:36:50.000000000 +0000 @@ -0,0 +1,56 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Carbon/AGL/CGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2003 Keith Bauer +// Copyright (c) 2003-2010 Camilla Berglund +// +// 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. +// +//======================================================================== + + +//************************************************************************ +//**** Platform implementation functions **** +//************************************************************************ + +//======================================================================== +// Enable system keys +//======================================================================== + +void _glfwPlatformEnableSystemKeys( void ) +{ + // Nothing to do; event handling code checks the status of + // _glfwWin.sysKeysDisabled to ensure this behavior. +} + +//======================================================================== +// Disable system keys +//======================================================================== + +void _glfwPlatformDisableSystemKeys( void ) +{ + // Nothing to do; event handling code checks the status of + // _glfwWin.sysKeysDisabled to ensure this behavior. +} + diff -Nru glfw-2.6/lib/carbon/carbon_fullscreen.c glfw-2.7.2/lib/carbon/carbon_fullscreen.c --- glfw-2.6/lib/carbon/carbon_fullscreen.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/carbon/carbon_fullscreen.c 2011-06-20 12:36:50.000000000 +0000 @@ -0,0 +1,133 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Carbon/AGL/CGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2003 Keith Bauer +// Copyright (c) 2003-2010 Camilla Berglund +// +// 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. +// +//======================================================================== + +#include "internal.h" + +//======================================================================== +// Compares two video modes +//======================================================================== + +static int _glfwVideoModesEqual( GLFWvidmode* first, + GLFWvidmode* second ) +{ + if( first->Width != second->Width ) + return 0; + + if( first->Height != second->Height ) + return 0; + + if( first->RedBits + first->GreenBits + first->BlueBits != + second->RedBits + second->GreenBits + second->BlueBits ) + return 0; + + return 1; +} + +//======================================================================== +// Converts a CG mode to a GLFW mode +//======================================================================== + +static void _glfwCGToGLFWVideoMode( CFDictionaryRef cgMode, + GLFWvidmode* glfwMode ) +{ + int bitsPerSample; + + CFNumberGetValue( CFDictionaryGetValue( cgMode, kCGDisplayWidth ), + kCFNumberIntType, + &(glfwMode->Width) ); + CFNumberGetValue( CFDictionaryGetValue( cgMode, kCGDisplayHeight ), + kCFNumberIntType, + &(glfwMode->Height) ); + + CFNumberGetValue( CFDictionaryGetValue( cgMode, kCGDisplayBitsPerSample ), + kCFNumberIntType, + &bitsPerSample ); + + glfwMode->RedBits = bitsPerSample; + glfwMode->GreenBits = bitsPerSample; + glfwMode->BlueBits = bitsPerSample; +} + +//======================================================================== +// Get a list of available video modes +//======================================================================== + +int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount ) +{ + int i, j, maxModes, numModes; + GLFWvidmode mode; + CFArrayRef availableModes = CGDisplayAvailableModes( kCGDirectMainDisplay ); + CFIndex numberOfAvailableModes = CFArrayGetCount( availableModes ); + + numModes = 0; + maxModes = ( numberOfAvailableModes < maxcount ? + numberOfAvailableModes : + maxcount ); + + for( i = 0; i < maxModes; ++i ) + { + _glfwCGToGLFWVideoMode( CFArrayGetValueAtIndex( availableModes, i ), + &mode ); + + // Is it a valid mode? (only list depths >= 15 bpp) + if( mode.RedBits + mode.GreenBits + mode.BlueBits < 15 ) + { + continue; + } + + // Check for duplicate of current mode in target list + for( j = 0; j < numModes; ++j ) + { + if( _glfwVideoModesEqual( &mode, &(list[j]) ) ) + { + break; + } + } + + // If empty list or no match found + if( numModes == 0 || j == numModes ) + { + list[numModes++] = mode; + } + } + + return numModes; +} + +//======================================================================== +// Get the desktop video mode +//======================================================================== + +void _glfwPlatformGetDesktopMode( GLFWvidmode *mode ) +{ + _glfwCGToGLFWVideoMode( _glfwDesktopVideoMode, mode ); +} + diff -Nru glfw-2.6/lib/carbon/carbon_glext.c glfw-2.7.2/lib/carbon/carbon_glext.c --- glfw-2.6/lib/carbon/carbon_glext.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/carbon/carbon_glext.c 2011-06-20 12:36:50.000000000 +0000 @@ -0,0 +1,65 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Carbon/AGL/CGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2003 Keith Bauer +// Copyright (c) 2003-2010 Camilla Berglund +// +// 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. +// +//======================================================================== + +#include "internal.h" + +//************************************************************************ +//**** Platform implementation functions **** +//************************************************************************ + +//======================================================================== +// Check if an OpenGL extension is available at runtime +//======================================================================== + +int _glfwPlatformExtensionSupported( const char *extension ) +{ + // There are no AGL, CGL or NSGL extensions. + return GL_FALSE; +} + +//======================================================================== +// Get the function pointer to an OpenGL function +//======================================================================== + +void * _glfwPlatformGetProcAddress( const char *procname ) +{ + CFStringRef symbolName = CFStringCreateWithCString( kCFAllocatorDefault, + procname, + kCFStringEncodingASCII ); + + void *symbol = CFBundleGetFunctionPointerForName( _glfwLibrary.Libs.OpenGLFramework, + symbolName ); + + CFRelease( symbolName ); + + return symbol; +} + diff -Nru glfw-2.6/lib/carbon/carbon_init.c glfw-2.7.2/lib/carbon/carbon_init.c --- glfw-2.6/lib/carbon/carbon_init.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/carbon/carbon_init.c 2011-06-20 12:36:50.000000000 +0000 @@ -0,0 +1,198 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Carbon/AGL/CGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2003 Keith Bauer +// Copyright (c) 2003-2010 Camilla Berglund +// Copyright (c) 2006-2007 Robin Leffmann +// +// 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. +// +//======================================================================== + +#include "internal.h" + +#include + +//======================================================================== +// Global variables +//======================================================================== + +// KCHR resource pointer for keycode translation +void *KCHRPtr; + + +//======================================================================== +// Terminate GLFW when exiting application +//======================================================================== + +static void glfw_atexit( void ) +{ + glfwTerminate(); +} + + +//======================================================================== +// Initialize GLFW thread package +//======================================================================== + +static void _glfwInitThreads( void ) +{ + // Initialize critical section handle + (void) pthread_mutex_init( &_glfwThrd.CriticalSection, NULL ); + + // The first thread (the main thread) has ID 0 + _glfwThrd.NextID = 0; + + // Fill out information about the main thread (this thread) + _glfwThrd.First.ID = _glfwThrd.NextID ++; + _glfwThrd.First.Function = NULL; + _glfwThrd.First.PosixID = pthread_self(); + _glfwThrd.First.Previous = NULL; + _glfwThrd.First.Next = NULL; +} + +#define NO_BUNDLE_MESSAGE \ + "Working in unbundled mode. " \ + "You should build a .app wrapper for your Mac OS X applications.\n" + +#define UNBUNDLED \ + fprintf(stderr, NO_BUNDLE_MESSAGE); \ + _glfwLibrary.Unbundled = 1; \ + return + +//======================================================================== +// Changes the current directory to the Resources directory of the bundle +// we're in, or leaves it alone if we're not inside a bundle +//======================================================================== + +void _glfwChangeToResourcesDirectory( void ) +{ + CFBundleRef mainBundle = CFBundleGetMainBundle(); + if( mainBundle == NULL ) + { + UNBUNDLED; + } + + CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL( mainBundle ); + char resourcesPath[ _GLFW_MAX_PATH_LENGTH ]; + + CFStringRef lastComponent = CFURLCopyLastPathComponent( resourcesURL ); + if( kCFCompareEqualTo != CFStringCompare( + CFSTR( "Resources" ), + lastComponent, + 0 ) ) + { + UNBUNDLED; + } + + CFRelease( lastComponent ); + + if( !CFURLGetFileSystemRepresentation( resourcesURL, + TRUE, + (UInt8*)resourcesPath, + _GLFW_MAX_PATH_LENGTH ) ) + { + CFRelease( resourcesURL ); + UNBUNDLED; + } + + CFRelease( resourcesURL ); + + if( chdir( resourcesPath ) != 0 ) + { + UNBUNDLED; + } +} + +//************************************************************************ +//**** Platform implementation functions **** +//************************************************************************ + +//======================================================================== +// Initialize various GLFW state +//======================================================================== + +int _glfwPlatformInit( void ) +{ + struct timeval tv; + UInt32 nullDummy = 0; + + _glfwWin.window = NULL; + _glfwWin.aglContext = NULL; + _glfwWin.cglContext = NULL; + _glfwWin.windowUPP = NULL; + + _glfwInput.Modifiers = 0; + + _glfwLibrary.Unbundled = 0; + + _glfwLibrary.Libs.OpenGLFramework = + CFBundleGetBundleWithIdentifier( CFSTR( "com.apple.opengl" ) ); + if( _glfwLibrary.Libs.OpenGLFramework == NULL ) + { + fprintf( stderr, "glfwInit failing because you aren't linked to OpenGL\n" ); + return GL_FALSE; + } + + _glfwDesktopVideoMode = CGDisplayCurrentMode( kCGDirectMainDisplay ); + if( _glfwDesktopVideoMode == NULL ) + { + fprintf( stderr, "glfwInit failing because it kind find the desktop display mode\n" ); + return GL_FALSE; + } + + // Install atexit routine + atexit( glfw_atexit ); + + _glfwInitThreads(); + + _glfwChangeToResourcesDirectory(); + + // Ugly hack to reduce the nasty jump that occurs at the first non- + // sys keypress, caused by OS X loading certain meta scripts used + // for lexical- and raw keycode translation - instead of letting + // this happen while our application is running, we do some blunt + // function calls in advance just to get the script caching out of + // the way BEFORE our window/screen is opened. These calls might + // generate err return codes, but we don't care in this case. + // NOTE: KCHRPtr is declared globally, because we need it later on. + KCHRPtr = (void *)GetScriptVariable( smCurrentScript, smKCHRCache ); + KeyTranslate( KCHRPtr, 0, &nullDummy ); + UppercaseText( (char *)&nullDummy, 0, smSystemScript ); + + gettimeofday( &tv, NULL ); + _glfwLibrary.Timer.t0 = tv.tv_sec + (double) tv.tv_usec / 1000000.0; + + return GL_TRUE; +} + +//======================================================================== +// Close window and kill all threads +//======================================================================== + +int _glfwPlatformTerminate( void ) +{ + return GL_TRUE; +} + diff -Nru glfw-2.6/lib/carbon/carbon_joystick.c glfw-2.7.2/lib/carbon/carbon_joystick.c --- glfw-2.6/lib/carbon/carbon_joystick.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/carbon/carbon_joystick.c 2011-06-20 12:36:50.000000000 +0000 @@ -0,0 +1,67 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Carbon/AGL/CGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2003 Keith Bauer +// Copyright (c) 2003-2010 Camilla Berglund +// +// 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. +// +//======================================================================== + +#include "internal.h" + +// TO DO: use HID manager to implement joystick support. + +//************************************************************************ +//**** Platform implementation functions **** +//************************************************************************ + +//======================================================================== +// Determine joystick capabilities +//======================================================================== + +int _glfwPlatformGetJoystickParam( int joy, int param ) +{ + // GL_FALSE == 0 + return 0; +} + +//======================================================================== +// Get joystick axis positions +//======================================================================== + +int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes ) +{ + return 0; +} + +//======================================================================== +// Get joystick button states +//======================================================================== + +int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons ) +{ + return 0; +} + diff -Nru glfw-2.6/lib/carbon/carbon_thread.c glfw-2.7.2/lib/carbon/carbon_thread.c --- glfw-2.6/lib/carbon/carbon_thread.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/carbon/carbon_thread.c 2011-06-20 12:36:50.000000000 +0000 @@ -0,0 +1,410 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Carbon/AGL/CGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2003 Keith Bauer +// Copyright (c) 2003-2010 Camilla Berglund +// +// 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. +// +//======================================================================== + +#include "internal.h" + + + +//************************************************************************ +//**** GLFW internal functions **** +//************************************************************************ + +//======================================================================== +// This is simply a "wrapper" for calling the user thread function. +//======================================================================== + +void * _glfwNewThread( void * arg ) +{ + GLFWthreadfun threadfun; + _GLFWthread *t; + + // Get pointer to thread information for current thread + t = _glfwGetThreadPointer( glfwGetThreadID() ); + if( t == NULL ) + { + return 0; + } + + // Get user thread function pointer + threadfun = t->Function; + + // Call the user thread function + threadfun( arg ); + + // Remove thread from thread list + ENTER_THREAD_CRITICAL_SECTION + _glfwRemoveThread( t ); + LEAVE_THREAD_CRITICAL_SECTION + + // When the thread function returns, the thread will die... + return NULL; +} + + + +//************************************************************************ +//**** Platform implementation functions **** +//************************************************************************ + +//======================================================================== +// Create a new thread +//======================================================================== + +GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg ) +{ + GLFWthread ID; + _GLFWthread *t; + int result; + + // Enter critical section + ENTER_THREAD_CRITICAL_SECTION + + // Create a new thread information memory area + t = (_GLFWthread *) malloc( sizeof(_GLFWthread) ); + if( t == NULL ) + { + // Leave critical section + LEAVE_THREAD_CRITICAL_SECTION + return -1; + } + + // Get a new unique thread id + ID = _glfwThrd.NextID ++; + + // Store thread information in the thread list + t->Function = fun; + t->ID = ID; + + // Create thread + result = pthread_create( + &t->PosixID, // Thread handle + NULL, // Default thread attributes + _glfwNewThread, // Thread function (a wrapper function) + (void *)arg // Argument to thread is user argument + ); + + // Did the thread creation fail? + if( result != 0 ) + { + free( (void *) t ); + LEAVE_THREAD_CRITICAL_SECTION + return -1; + } + + // Append thread to thread list + _glfwAppendThread( t ); + + // Leave critical section + LEAVE_THREAD_CRITICAL_SECTION + + // Return the GLFW thread ID + return ID; +} + + +//======================================================================== +// Kill a thread. NOTE: THIS IS A VERY DANGEROUS OPERATION, AND SHOULD NOT +// BE USED EXCEPT IN EXTREME SITUATIONS! +//======================================================================== + +void _glfwPlatformDestroyThread( GLFWthread ID ) +{ + _GLFWthread *t; + + // Enter critical section + ENTER_THREAD_CRITICAL_SECTION + + // Get thread information pointer + t = _glfwGetThreadPointer( ID ); + if( t == NULL ) + { + LEAVE_THREAD_CRITICAL_SECTION + return; + } + + // Simply murder the process, no mercy! + pthread_kill( t->PosixID, SIGKILL ); + + // Remove thread from thread list + _glfwRemoveThread( t ); + + // Leave critical section + LEAVE_THREAD_CRITICAL_SECTION +} + + +//======================================================================== +// Wait for a thread to die +//======================================================================== + +int _glfwPlatformWaitThread( GLFWthread ID, int waitmode ) +{ + pthread_t thread; + _GLFWthread *t; + + // Enter critical section + ENTER_THREAD_CRITICAL_SECTION + + // Get thread information pointer + t = _glfwGetThreadPointer( ID ); + + // Is the thread already dead? + if( t == NULL ) + { + LEAVE_THREAD_CRITICAL_SECTION + return GL_TRUE; + } + + // If got this far, the thread is alive => polling returns FALSE + if( waitmode == GLFW_NOWAIT ) + { + LEAVE_THREAD_CRITICAL_SECTION + return GL_FALSE; + } + + // Get thread handle + thread = t->PosixID; + + // Leave critical section + LEAVE_THREAD_CRITICAL_SECTION + + // Wait for thread to die + (void) pthread_join( thread, NULL ); + + return GL_TRUE; +} + + +//======================================================================== +// Return the thread ID for the current thread +//======================================================================== + +GLFWthread _glfwPlatformGetThreadID( void ) +{ + _GLFWthread *t; + GLFWthread ID = -1; + pthread_t posixID; + + // Get current thread ID + posixID = pthread_self(); + + // Enter critical section + ENTER_THREAD_CRITICAL_SECTION + + // Loop through entire list of threads to find the matching POSIX + // thread ID + for( t = &_glfwThrd.First; t != NULL; t = t->Next ) + { + if( t->PosixID == posixID ) + { + ID = t->ID; + break; + } + } + + // Leave critical section + LEAVE_THREAD_CRITICAL_SECTION + + // Return the found GLFW thread identifier + return ID; +} + + +//======================================================================== +// Create a mutual exclusion object +//======================================================================== + +GLFWmutex _glfwPlatformCreateMutex( void ) +{ + pthread_mutex_t *mutex; + + // Allocate memory for mutex + mutex = (pthread_mutex_t *) malloc( sizeof( pthread_mutex_t ) ); + if( !mutex ) + { + return NULL; + } + + // Initialise a mutex object + (void) pthread_mutex_init( mutex, NULL ); + + // Cast to GLFWmutex and return + return (GLFWmutex) mutex; +} + + +//======================================================================== +// Destroy a mutual exclusion object +//======================================================================== + +void _glfwPlatformDestroyMutex( GLFWmutex mutex ) +{ + // Destroy the mutex object + pthread_mutex_destroy( (pthread_mutex_t *) mutex ); + + // Free memory for mutex object + free( (void *) mutex ); +} + + +//======================================================================== +// Request access to a mutex +//======================================================================== + +void _glfwPlatformLockMutex( GLFWmutex mutex ) +{ + // Wait for mutex to be released + (void) pthread_mutex_lock( (pthread_mutex_t *) mutex ); +} + + +//======================================================================== +// Release a mutex +//======================================================================== + +void _glfwPlatformUnlockMutex( GLFWmutex mutex ) +{ + // Release mutex + pthread_mutex_unlock( (pthread_mutex_t *) mutex ); +} + + +//======================================================================== +// Create a new condition variable object +//======================================================================== + +GLFWcond _glfwPlatformCreateCond( void ) +{ + pthread_cond_t *cond; + + // Allocate memory for condition variable + cond = (pthread_cond_t *) malloc( sizeof(pthread_cond_t) ); + if( !cond ) + { + return NULL; + } + + // Initialise condition variable + (void) pthread_cond_init( cond, NULL ); + + // Cast to GLFWcond and return + return (GLFWcond) cond; +} + + +//======================================================================== +// Destroy a condition variable object +//======================================================================== + +void _glfwPlatformDestroyCond( GLFWcond cond ) +{ + // Destroy the condition variable object + (void) pthread_cond_destroy( (pthread_cond_t *) cond ); + + // Free memory for condition variable object + free( (void *) cond ); +} + + +//======================================================================== +// Wait for a condition to be raised +//======================================================================== + +void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, + double timeout ) +{ + struct timeval currenttime; + struct timespec wait; + long dt_sec, dt_usec; + + // Select infinite or timed wait + if( timeout >= GLFW_INFINITY ) + { + // Wait for condition (infinite wait) + (void) pthread_cond_wait( (pthread_cond_t *) cond, + (pthread_mutex_t *) mutex ); + } + else + { + // Set timeout time, relatvie to current time + gettimeofday( ¤ttime, NULL ); + dt_sec = (long) timeout; + dt_usec = (long) ((timeout - (double)dt_sec) * 1000000.0); + wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L; + if( wait.tv_nsec > 1000000000L ) + { + wait.tv_nsec -= 1000000000L; + dt_sec ++; + } + wait.tv_sec = currenttime.tv_sec + dt_sec; + + // Wait for condition (timed wait) + (void) pthread_cond_timedwait( (pthread_cond_t *) cond, + (pthread_mutex_t *) mutex, &wait ); + } +} + + +//======================================================================== +// Signal a condition to one waiting thread +//======================================================================== + +void _glfwPlatformSignalCond( GLFWcond cond ) +{ + // Signal condition + (void) pthread_cond_signal( (pthread_cond_t *) cond ); +} + + +//======================================================================== +// Broadcast a condition to all waiting threads +//======================================================================== + +void _glfwPlatformBroadcastCond( GLFWcond cond ) +{ + // Broadcast condition + (void) pthread_cond_broadcast( (pthread_cond_t *) cond ); +} + + +//======================================================================== +// Return the number of processors in the system. +//======================================================================== + +int _glfwPlatformGetNumberOfProcessors( void ) +{ + int n; + + // Get number of processors online + _glfw_numprocessors( n ); + return n; +} + diff -Nru glfw-2.6/lib/carbon/carbon_time.c glfw-2.7.2/lib/carbon/carbon_time.c --- glfw-2.6/lib/carbon/carbon_time.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/carbon/carbon_time.c 2010-08-08 15:54:08.000000000 +0000 @@ -0,0 +1,113 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Carbon/AGL/CGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2003 Keith Bauer +// Copyright (c) 2003-2010 Camilla Berglund +// +// 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. +// +//======================================================================== + +#include "internal.h" + +//************************************************************************ +//**** Platform implementation functions **** +//************************************************************************ + +//======================================================================== +// Return timer value in seconds +//======================================================================== + +double _glfwPlatformGetTime( void ) +{ + struct timeval tv; + + gettimeofday( &tv, NULL ); + return tv.tv_sec + (double) tv.tv_usec / 1000000.0 - _glfwLibrary.Timer.t0; +} + + +//======================================================================== +// Set timer value in seconds +//======================================================================== + +void _glfwPlatformSetTime( double time ) +{ + struct timeval tv; + + gettimeofday( &tv, NULL ); + _glfwLibrary.Timer.t0 = tv.tv_sec + (double) tv.tv_usec / 1000000.0 - time; +} + + +//======================================================================== +// Put a thread to sleep for a specified amount of time +//======================================================================== + +void _glfwPlatformSleep( double time ) +{ + if( time == 0.0 ) + { + sched_yield(); + return; + } + + struct timeval currenttime; + struct timespec wait; + pthread_mutex_t mutex; + pthread_cond_t cond; + long dt_sec, dt_usec; + + // Not all pthread implementations have a pthread_sleep() function. We + // do it the portable way, using a timed wait for a condition that we + // will never signal. NOTE: The unistd functions sleep/usleep suspends + // the entire PROCESS, not a signle thread, which is why we can not + // use them to implement glfwSleep. + + // Set timeout time, relatvie to current time + gettimeofday( ¤ttime, NULL ); + dt_sec = (long) time; + dt_usec = (long) ((time - (double)dt_sec) * 1000000.0); + wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L; + if( wait.tv_nsec > 1000000000L ) + { + wait.tv_nsec -= 1000000000L; + dt_sec ++; + } + wait.tv_sec = currenttime.tv_sec + dt_sec; + + // Initialize condition and mutex objects + pthread_mutex_init( &mutex, NULL ); + pthread_cond_init( &cond, NULL ); + + // Do a timed wait + pthread_mutex_lock( &mutex ); + pthread_cond_timedwait( &cond, &mutex, &wait ); + pthread_mutex_unlock( &mutex ); + + // Destroy condition and mutex objects + pthread_mutex_destroy( &mutex ); + pthread_cond_destroy( &cond ); +} + diff -Nru glfw-2.6/lib/carbon/carbon_window.c glfw-2.7.2/lib/carbon/carbon_window.c --- glfw-2.6/lib/carbon/carbon_window.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/carbon/carbon_window.c 2011-05-07 14:31:42.000000000 +0000 @@ -0,0 +1,1285 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Carbon/AGL/CGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2003 Keith Bauer +// Copyright (c) 2003-2010 Camilla Berglund +// Copyright (c) 2006-2007 Robin Leffmann +// +// 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. +// +//======================================================================== + +#include "internal.h" + +#define _glfwTestModifier( modifierMask, glfwKey ) \ +if ( changed & modifierMask ) \ +{ \ + _glfwInputKey( glfwKey, (modifiers & modifierMask ? GLFW_PRESS : GLFW_RELEASE) ); \ +} + +//************************************************************************ +//**** GLFW internal functions **** +//************************************************************************ + +static void handleMacModifierChange( UInt32 modifiers ) +{ + UInt32 changed = modifiers ^ _glfwInput.Modifiers; + + // The right *key variants below never actually occur + // There also isn't even a broken right command key constant + _glfwTestModifier( shiftKey, GLFW_KEY_LSHIFT ); + _glfwTestModifier( rightShiftKey, GLFW_KEY_RSHIFT ); + _glfwTestModifier( controlKey, GLFW_KEY_LCTRL ); + _glfwTestModifier( rightControlKey, GLFW_KEY_RCTRL ); + _glfwTestModifier( optionKey, GLFW_KEY_LALT ); + _glfwTestModifier( rightOptionKey, GLFW_KEY_RALT ); + _glfwTestModifier( cmdKey, GLFW_KEY_LSUPER ); + + _glfwInput.Modifiers = modifiers; +} + +static void handleMacKeyChange( UInt32 keyCode, int action ) +{ + switch ( keyCode ) + { + case MAC_KEY_ENTER: _glfwInputKey( GLFW_KEY_ENTER, action); break; + case MAC_KEY_RETURN: _glfwInputKey( GLFW_KEY_KP_ENTER, action); break; + case MAC_KEY_ESC: _glfwInputKey( GLFW_KEY_ESC, action); break; + case MAC_KEY_F1: _glfwInputKey( GLFW_KEY_F1, action); break; + case MAC_KEY_F2: _glfwInputKey( GLFW_KEY_F2, action); break; + case MAC_KEY_F3: _glfwInputKey( GLFW_KEY_F3, action); break; + case MAC_KEY_F4: _glfwInputKey( GLFW_KEY_F4, action); break; + case MAC_KEY_F5: _glfwInputKey( GLFW_KEY_F5, action); break; + case MAC_KEY_F6: _glfwInputKey( GLFW_KEY_F6, action); break; + case MAC_KEY_F7: _glfwInputKey( GLFW_KEY_F7, action); break; + case MAC_KEY_F8: _glfwInputKey( GLFW_KEY_F8, action); break; + case MAC_KEY_F9: _glfwInputKey( GLFW_KEY_F9, action); break; + case MAC_KEY_F10: _glfwInputKey( GLFW_KEY_F10, action); break; + case MAC_KEY_F11: _glfwInputKey( GLFW_KEY_F11, action); break; + case MAC_KEY_F12: _glfwInputKey( GLFW_KEY_F12, action); break; + case MAC_KEY_F13: _glfwInputKey( GLFW_KEY_F13, action); break; + case MAC_KEY_F14: _glfwInputKey( GLFW_KEY_F14, action); break; + case MAC_KEY_F15: _glfwInputKey( GLFW_KEY_F15, action); break; + case MAC_KEY_UP: _glfwInputKey( GLFW_KEY_UP, action); break; + case MAC_KEY_DOWN: _glfwInputKey( GLFW_KEY_DOWN, action); break; + case MAC_KEY_LEFT: _glfwInputKey( GLFW_KEY_LEFT, action); break; + case MAC_KEY_RIGHT: _glfwInputKey( GLFW_KEY_RIGHT, action); break; + case MAC_KEY_TAB: _glfwInputKey( GLFW_KEY_TAB, action); break; + case MAC_KEY_BACKSPACE: _glfwInputKey( GLFW_KEY_BACKSPACE, action); break; + case MAC_KEY_HELP: _glfwInputKey( GLFW_KEY_INSERT, action); break; + case MAC_KEY_DEL: _glfwInputKey( GLFW_KEY_DEL, action); break; + case MAC_KEY_PAGEUP: _glfwInputKey( GLFW_KEY_PAGEUP, action); break; + case MAC_KEY_PAGEDOWN: _glfwInputKey( GLFW_KEY_PAGEDOWN, action); break; + case MAC_KEY_HOME: _glfwInputKey( GLFW_KEY_HOME, action); break; + case MAC_KEY_END: _glfwInputKey( GLFW_KEY_END, action); break; + case MAC_KEY_KP_0: _glfwInputKey( GLFW_KEY_KP_0, action); break; + case MAC_KEY_KP_1: _glfwInputKey( GLFW_KEY_KP_1, action); break; + case MAC_KEY_KP_2: _glfwInputKey( GLFW_KEY_KP_2, action); break; + case MAC_KEY_KP_3: _glfwInputKey( GLFW_KEY_KP_3, action); break; + case MAC_KEY_KP_4: _glfwInputKey( GLFW_KEY_KP_4, action); break; + case MAC_KEY_KP_5: _glfwInputKey( GLFW_KEY_KP_5, action); break; + case MAC_KEY_KP_6: _glfwInputKey( GLFW_KEY_KP_6, action); break; + case MAC_KEY_KP_7: _glfwInputKey( GLFW_KEY_KP_7, action); break; + case MAC_KEY_KP_8: _glfwInputKey( GLFW_KEY_KP_8, action); break; + case MAC_KEY_KP_9: _glfwInputKey( GLFW_KEY_KP_9, action); break; + case MAC_KEY_KP_DIVIDE: _glfwInputKey( GLFW_KEY_KP_DIVIDE, action); break; + case MAC_KEY_KP_MULTIPLY: _glfwInputKey( GLFW_KEY_KP_MULTIPLY, action); break; + case MAC_KEY_KP_SUBTRACT: _glfwInputKey( GLFW_KEY_KP_SUBTRACT, action); break; + case MAC_KEY_KP_ADD: _glfwInputKey( GLFW_KEY_KP_ADD, action); break; + case MAC_KEY_KP_DECIMAL: _glfwInputKey( GLFW_KEY_KP_DECIMAL, action); break; + case MAC_KEY_KP_EQUAL: _glfwInputKey( GLFW_KEY_KP_EQUAL, action); break; + case MAC_KEY_KP_ENTER: _glfwInputKey( GLFW_KEY_KP_ENTER, action); break; + case MAC_KEY_NUMLOCK: _glfwInputKey( GLFW_KEY_KP_NUM_LOCK, action); break; + default: + { + extern void *KCHRPtr; + UInt32 state = 0; + char charCode = (char)KeyTranslate( KCHRPtr, keyCode, &state ); + UppercaseText( &charCode, 1, smSystemScript ); + _glfwInputKey( (unsigned char)charCode, action ); + } + break; + } +} + +// The set of event class/kind combinations supported by keyEventHandler +// This is used by installEventHandlers below +static const EventTypeSpec GLFW_KEY_EVENT_TYPES[] = +{ + { kEventClassKeyboard, kEventRawKeyDown }, + { kEventClassKeyboard, kEventRawKeyUp }, + { kEventClassKeyboard, kEventRawKeyRepeat }, + { kEventClassKeyboard, kEventRawKeyModifiersChanged } +}; + +static OSStatus keyEventHandler( EventHandlerCallRef handlerCallRef, + EventRef event, + void *userData ) +{ + UInt32 keyCode; + short int keyChar; + UInt32 modifiers; + + switch( GetEventKind( event ) ) + { + case kEventRawKeyRepeat: + case kEventRawKeyDown: + { + if( GetEventParameter( event, + kEventParamKeyCode, + typeUInt32, + NULL, + sizeof( UInt32 ), + NULL, + &keyCode ) == noErr ) + { + handleMacKeyChange( keyCode, GLFW_PRESS ); + } + if( GetEventParameter( event, + kEventParamKeyUnicodes, + typeUnicodeText, + NULL, + sizeof(keyChar), + NULL, + &keyChar) == noErr ) + { + _glfwInputChar( keyChar, GLFW_PRESS ); + } + return noErr; + } + + case kEventRawKeyUp: + { + if( GetEventParameter( event, + kEventParamKeyCode, + typeUInt32, + NULL, + sizeof( UInt32 ), + NULL, + &keyCode ) == noErr ) + { + handleMacKeyChange( keyCode, GLFW_RELEASE ); + } + if( GetEventParameter( event, + kEventParamKeyUnicodes, + typeUnicodeText, + NULL, + sizeof(keyChar), + NULL, + &keyChar) == noErr ) + { + _glfwInputChar( keyChar, GLFW_RELEASE ); + } + return noErr; + } + + case kEventRawKeyModifiersChanged: + { + if( GetEventParameter( event, + kEventParamKeyModifiers, + typeUInt32, + NULL, + sizeof( UInt32 ), + NULL, + &modifiers ) == noErr ) + { + handleMacModifierChange( modifiers ); + return noErr; + } + } + break; + } + + return eventNotHandledErr; +} + +// The set of event class/kind combinations supported by mouseEventHandler +// This is used by installEventHandlers below +static const EventTypeSpec GLFW_MOUSE_EVENT_TYPES[] = +{ + { kEventClassMouse, kEventMouseDown }, + { kEventClassMouse, kEventMouseUp }, + { kEventClassMouse, kEventMouseMoved }, + { kEventClassMouse, kEventMouseDragged }, + { kEventClassMouse, kEventMouseWheelMoved }, +}; + +static OSStatus mouseEventHandler( EventHandlerCallRef handlerCallRef, + EventRef event, + void *userData ) +{ + switch( GetEventKind( event ) ) + { + case kEventMouseDown: + { + WindowRef window; + EventRecord oldStyleMacEvent; + ConvertEventRefToEventRecord( event, &oldStyleMacEvent ); + if( FindWindow ( oldStyleMacEvent.where, &window ) == inMenuBar ) + { + MenuSelect( oldStyleMacEvent.where ); + HiliteMenu(0); + return noErr; + } + else + { + EventMouseButton button; + if( GetEventParameter( event, + kEventParamMouseButton, + typeMouseButton, + NULL, + sizeof( EventMouseButton ), + NULL, + &button ) == noErr ) + { + button -= kEventMouseButtonPrimary; + if( button <= GLFW_MOUSE_BUTTON_LAST ) + { + _glfwInputMouseClick( button + GLFW_MOUSE_BUTTON_LEFT, + GLFW_PRESS ); + } + return noErr; + } + } + break; + } + + case kEventMouseUp: + { + EventMouseButton button; + if( GetEventParameter( event, + kEventParamMouseButton, + typeMouseButton, + NULL, + sizeof( EventMouseButton ), + NULL, + &button ) == noErr ) + { + button -= kEventMouseButtonPrimary; + if( button <= GLFW_MOUSE_BUTTON_LAST ) + { + _glfwInputMouseClick( button + GLFW_MOUSE_BUTTON_LEFT, + GLFW_RELEASE ); + } + return noErr; + } + break; + } + + case kEventMouseMoved: + case kEventMouseDragged: + { + HIPoint mouseLocation; + if( _glfwWin.mouseLock ) + { + if( GetEventParameter( event, + kEventParamMouseDelta, + typeHIPoint, + NULL, + sizeof( HIPoint ), + NULL, + &mouseLocation ) != noErr ) + { + break; + } + + _glfwInput.MousePosX += mouseLocation.x; + _glfwInput.MousePosY += mouseLocation.y; + } + else + { + if( GetEventParameter( event, + kEventParamMouseLocation, + typeHIPoint, + NULL, + sizeof( HIPoint ), + NULL, + &mouseLocation ) != noErr ) + { + break; + } + + _glfwInput.MousePosX = mouseLocation.x; + _glfwInput.MousePosY = mouseLocation.y; + + if( !_glfwWin.fullscreen ) + { + Rect content; + GetWindowBounds( _glfwWin.window, + kWindowContentRgn, + &content ); + + _glfwInput.MousePosX -= content.left; + _glfwInput.MousePosY -= content.top; + } + } + + if( _glfwWin.mousePosCallback ) + { + _glfwWin.mousePosCallback( _glfwInput.MousePosX, + _glfwInput.MousePosY ); + } + + break; + } + + case kEventMouseWheelMoved: + { + EventMouseWheelAxis axis; + if( GetEventParameter( event, + kEventParamMouseWheelAxis, + typeMouseWheelAxis, + NULL, + sizeof( EventMouseWheelAxis ), + NULL, + &axis) == noErr ) + { + long wheelDelta; + if( axis == kEventMouseWheelAxisY && + GetEventParameter( event, + kEventParamMouseWheelDelta, + typeLongInteger, + NULL, + sizeof( long ), + NULL, + &wheelDelta ) == noErr ) + { + _glfwInput.WheelPos += wheelDelta; + if( _glfwWin.mouseWheelCallback ) + { + _glfwWin.mouseWheelCallback( _glfwInput.WheelPos ); + } + return noErr; + } + } + break; + } + } + + return eventNotHandledErr; +} + +// The set of event class/kind combinations supported by commandHandler +// This is used by installEventHandlers below +static const EventTypeSpec GLFW_COMMAND_EVENT_TYPES[] = +{ + { kEventClassCommand, kEventCommandProcess } +}; + +static OSStatus commandHandler( EventHandlerCallRef handlerCallRef, + EventRef event, + void *userData ) +{ + if( _glfwWin.sysKeysDisabled ) + { + // TODO: Give adequate UI feedback that this is the case + return eventNotHandledErr; + } + + HICommand command; + if( GetEventParameter( event, + kEventParamDirectObject, + typeHICommand, + NULL, + sizeof( HICommand ), + NULL, + &command ) == noErr ) + { + switch( command.commandID ) + { + case kHICommandClose: + case kHICommandQuit: + { + // Check if the program wants us to close the window + if( _glfwWin.windowCloseCallback ) + { + if( _glfwWin.windowCloseCallback() ) + { + glfwCloseWindow(); + } + } + else + { + glfwCloseWindow(); + } + return noErr; + } + } + } + + return eventNotHandledErr; +} + +// The set of event class/kind combinations supported by windowEventHandler +// This is used by installEventHandlers below +static const EventTypeSpec GLFW_WINDOW_EVENT_TYPES[] = +{ + { kEventClassWindow, kEventWindowBoundsChanged }, + { kEventClassWindow, kEventWindowClose }, + { kEventClassWindow, kEventWindowDrawContent }, + { kEventClassWindow, kEventWindowActivated }, + { kEventClassWindow, kEventWindowDeactivated }, +}; + +static OSStatus windowEventHandler( EventHandlerCallRef handlerCallRef, + EventRef event, + void *userData ) +{ + switch( GetEventKind(event) ) + { + case kEventWindowBoundsChanged: + { + WindowRef window; + GetEventParameter( event, + kEventParamDirectObject, + typeWindowRef, + NULL, + sizeof(WindowRef), + NULL, + &window ); + + Rect rect; + GetWindowPortBounds( window, &rect ); + + if( _glfwWin.width != rect.right || + _glfwWin.height != rect.bottom ) + { + aglUpdateContext( _glfwWin.aglContext ); + + _glfwWin.width = rect.right; + _glfwWin.height = rect.bottom; + if( _glfwWin.windowSizeCallback ) + { + _glfwWin.windowSizeCallback( _glfwWin.width, _glfwWin.height ); + } + // Emulate (force) content invalidation + if( _glfwWin.windowRefreshCallback ) + { + _glfwWin.windowRefreshCallback(); + } + } + break; + } + + case kEventWindowClose: + { + // Check if the client wants us to close the window + if( _glfwWin.windowCloseCallback ) + { + if( _glfwWin.windowCloseCallback() ) + { + glfwCloseWindow(); + } + } + else + { + glfwCloseWindow(); + } + return noErr; + } + + case kEventWindowDrawContent: + { + if( _glfwWin.windowRefreshCallback ) + { + _glfwWin.windowRefreshCallback(); + } + break; + } + + case kEventWindowActivated: + { + _glfwWin.active = GL_TRUE; + break; + } + + case kEventWindowDeactivated: + { + _glfwWin.active = GL_FALSE; + _glfwInputDeactivation(); + break; + } + } + + return eventNotHandledErr; +} + +static int installEventHandlers( void ) +{ + OSStatus error; + + _glfwWin.mouseUPP = NewEventHandlerUPP( mouseEventHandler ); + + error = InstallEventHandler( GetApplicationEventTarget(), + _glfwWin.mouseUPP, + GetEventTypeCount( GLFW_MOUSE_EVENT_TYPES ), + GLFW_MOUSE_EVENT_TYPES, + NULL, + NULL ); + if( error != noErr ) + { + fprintf( stderr, "Failed to install Carbon application mouse event handler\n" ); + return GL_FALSE; + } + + _glfwWin.commandUPP = NewEventHandlerUPP( commandHandler ); + + error = InstallEventHandler( GetApplicationEventTarget(), + _glfwWin.commandUPP, + GetEventTypeCount( GLFW_COMMAND_EVENT_TYPES ), + GLFW_COMMAND_EVENT_TYPES, + NULL, + NULL ); + if( error != noErr ) + { + fprintf( stderr, "Failed to install Carbon application command event handler\n" ); + return GL_FALSE; + } + + _glfwWin.keyboardUPP = NewEventHandlerUPP( keyEventHandler ); + + error = InstallEventHandler( GetApplicationEventTarget(), + _glfwWin.keyboardUPP, + GetEventTypeCount( GLFW_KEY_EVENT_TYPES ), + GLFW_KEY_EVENT_TYPES, + NULL, + NULL ); + if( error != noErr ) + { + fprintf( stderr, "Failed to install Carbon application key event handler\n" ); + return GL_FALSE; + } + + return GL_TRUE; +} + +//************************************************************************ +//**** Platform implementation functions **** +//************************************************************************ + +#define _setAGLAttribute( aglAttributeName, AGLparameter ) \ +if ( AGLparameter != 0 ) \ +{ \ + AGLpixelFormatAttributes[numAGLAttrs++] = aglAttributeName; \ + AGLpixelFormatAttributes[numAGLAttrs++] = AGLparameter; \ +} + +#define _setCGLAttribute( cglAttributeName, CGLparameter ) \ +if ( CGLparameter != 0 ) \ +{ \ + CGLpixelFormatAttributes[ numCGLAttrs++ ] = cglAttributeName; \ + CGLpixelFormatAttributes[ numCGLAttrs++ ] = CGLparameter; \ +} + +//======================================================================== +// Here is where the window is created, and +// the OpenGL rendering context is created +//======================================================================== + +int _glfwPlatformOpenWindow( int width, int height, + const _GLFWwndconfig *wndconfig, + const _GLFWfbconfig *fbconfig ) +{ + OSStatus error; + unsigned int windowAttributes; + ProcessSerialNumber psn; + + // TODO: Break up this function! + + _glfwWin.windowUPP = NULL; + _glfwWin.mouseUPP = NULL; + _glfwWin.keyboardUPP = NULL; + _glfwWin.commandUPP = NULL; + _glfwWin.window = NULL; + _glfwWin.aglContext = NULL; + _glfwWin.aglPixelFormat = NULL; + _glfwWin.cglContext = NULL; + _glfwWin.cglPixelFormat = NULL; + + _glfwWin.refreshRate = wndconfig->refreshRate; + + // Fail if OpenGL 3.0 or above was requested + if( wndconfig->glMajor > 2 ) + { + fprintf( stderr, "OpenGL 3.0+ is not yet supported on Mac OS X\n" ); + return GL_FALSE; + } + + if( _glfwLibrary.Unbundled ) + { + if( GetCurrentProcess( &psn ) != noErr ) + { + fprintf( stderr, "Failed to get the process serial number\n" ); + return GL_FALSE; + } + + if( TransformProcessType( &psn, kProcessTransformToForegroundApplication ) != noErr ) + { + fprintf( stderr, "Failed to become a foreground application\n" ); + return GL_FALSE; + } + + if( wndconfig->mode == GLFW_FULLSCREEN ) + { + if( SetFrontProcess( &psn ) != noErr ) + { + fprintf( stderr, "Failed to become the front process\n" ); + return GL_FALSE; + } + } + } + + if( !installEventHandlers() ) + { + fprintf( stderr, "Failed to install Carbon application event handlers\n" ); + return GL_FALSE; + } + + // Windowed or fullscreen; AGL or CGL? Quite the mess... + // AGL appears to be the only choice for attaching OpenGL contexts to + // Carbon windows, but it leaves the user no control over fullscreen + // mode stretching. Solution: AGL for windowed, CGL for fullscreen. + if( wndconfig->mode == GLFW_WINDOW ) + { + // create AGL pixel format attribute list + GLint AGLpixelFormatAttributes[256]; + int numAGLAttrs = 0; + + AGLpixelFormatAttributes[numAGLAttrs++] = AGL_RGBA; + AGLpixelFormatAttributes[numAGLAttrs++] = AGL_DOUBLEBUFFER; + AGLpixelFormatAttributes[numAGLAttrs++] = AGL_CLOSEST_POLICY; + + if( fbconfig->stereo ) + { + AGLpixelFormatAttributes[numAGLAttrs++] = AGL_STEREO; + } + + _setAGLAttribute( AGL_AUX_BUFFERS, fbconfig->auxBuffers); + _setAGLAttribute( AGL_RED_SIZE, fbconfig->redBits ); + _setAGLAttribute( AGL_GREEN_SIZE, fbconfig->greenBits ); + _setAGLAttribute( AGL_BLUE_SIZE, fbconfig->blueBits ); + _setAGLAttribute( AGL_ALPHA_SIZE, fbconfig->alphaBits ); + _setAGLAttribute( AGL_DEPTH_SIZE, fbconfig->depthBits ); + _setAGLAttribute( AGL_STENCIL_SIZE, fbconfig->stencilBits ); + _setAGLAttribute( AGL_ACCUM_RED_SIZE, fbconfig->accumRedBits ); + _setAGLAttribute( AGL_ACCUM_GREEN_SIZE, fbconfig->accumGreenBits ); + _setAGLAttribute( AGL_ACCUM_BLUE_SIZE, fbconfig->accumBlueBits ); + _setAGLAttribute( AGL_ACCUM_ALPHA_SIZE, fbconfig->accumAlphaBits ); + + if( fbconfig->samples > 1 ) + { + _setAGLAttribute( AGL_SAMPLE_BUFFERS_ARB, 1 ); + _setAGLAttribute( AGL_SAMPLES_ARB, fbconfig->samples ); + AGLpixelFormatAttributes[numAGLAttrs++] = AGL_NO_RECOVERY; + } + + AGLpixelFormatAttributes[numAGLAttrs++] = AGL_NONE; + + // create pixel format descriptor + AGLDevice mainMonitor = GetMainDevice(); + _glfwWin.aglPixelFormat = aglChoosePixelFormat( &mainMonitor, + 1, + AGLpixelFormatAttributes ); + if( _glfwWin.aglPixelFormat == NULL ) + { + fprintf( stderr, + "Failed to choose AGL pixel format: %s\n", + aglErrorString( aglGetError() ) ); + + return GL_FALSE; + } + + // create AGL context + _glfwWin.aglContext = aglCreateContext( _glfwWin.aglPixelFormat, NULL ); + + if( _glfwWin.aglContext == NULL ) + { + fprintf( stderr, + "Failed to create AGL context: %s\n", + aglErrorString( aglGetError() ) ); + + return GL_FALSE; + } + + // create window + Rect windowContentBounds; + windowContentBounds.left = 0; + windowContentBounds.top = 0; + windowContentBounds.right = width; + windowContentBounds.bottom = height; + + windowAttributes = ( kWindowCloseBoxAttribute | + kWindowCollapseBoxAttribute | + kWindowStandardHandlerAttribute ); + + if( wndconfig->windowNoResize ) + { + windowAttributes |= kWindowLiveResizeAttribute; + } + else + { + windowAttributes |= ( kWindowFullZoomAttribute | + kWindowResizableAttribute ); + } + + error = CreateNewWindow( kDocumentWindowClass, + windowAttributes, + &windowContentBounds, + &( _glfwWin.window ) ); + if( ( error != noErr ) || ( _glfwWin.window == NULL ) ) + { + fprintf( stderr, "Failed to create Carbon window\n" ); + + return GL_FALSE; + } + + _glfwWin.windowUPP = NewEventHandlerUPP( windowEventHandler ); + + error = InstallWindowEventHandler( _glfwWin.window, + _glfwWin.windowUPP, + GetEventTypeCount( GLFW_WINDOW_EVENT_TYPES ), + GLFW_WINDOW_EVENT_TYPES, + NULL, + NULL ); + if( error != noErr ) + { + fprintf( stderr, "Failed to install Carbon window event handler\n" ); + + return GL_FALSE; + } + + // Don't care if we fail here + (void)SetWindowTitleWithCFString( _glfwWin.window, CFSTR( "GLFW Window" ) ); + (void)RepositionWindow( _glfwWin.window, + NULL, + kWindowCenterOnMainScreen ); + + if( !aglSetDrawable( _glfwWin.aglContext, + GetWindowPort( _glfwWin.window ) ) ) + { + fprintf( stderr, + "Failed to set the AGL context as the Carbon window drawable: %s\n", + aglErrorString( aglGetError() ) ); + + return GL_FALSE; + } + + // Make OpenGL context current + if( !aglSetCurrentContext( _glfwWin.aglContext ) ) + { + fprintf( stderr, + "Failed to make AGL context current: %s\n", + aglErrorString( aglGetError() ) ); + + return GL_FALSE; + } + + ShowWindow( _glfwWin.window ); + } + else + { + CGDisplayErr cgErr; + CGLError cglErr; + + CFDictionaryRef optimalMode; + + GLint numCGLvs = 0; + + CGLPixelFormatAttribute CGLpixelFormatAttributes[64]; + int numCGLAttrs = 0; + + // variables for enumerating color depths + GLint rgbColorDepth; + + // CGL pixel format attributes + _setCGLAttribute( kCGLPFADisplayMask, + CGDisplayIDToOpenGLDisplayMask( kCGDirectMainDisplay ) ); + + if( fbconfig->stereo ) + { + CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFAStereo; + } + + if( fbconfig->samples > 1 ) + { + _setCGLAttribute( kCGLPFASamples, (CGLPixelFormatAttribute)fbconfig->samples ); + _setCGLAttribute( kCGLPFASampleBuffers, (CGLPixelFormatAttribute)1 ); + CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFANoRecovery; + } + + CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFAFullScreen; + CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFADoubleBuffer; + CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFAAccelerated; + CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFANoRecovery; + CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFAMinimumPolicy; + + _setCGLAttribute( kCGLPFAAccumSize, + (CGLPixelFormatAttribute)( fbconfig->accumRedBits \ + + fbconfig->accumGreenBits \ + + fbconfig->accumBlueBits \ + + fbconfig->accumAlphaBits ) ); + + _setCGLAttribute( kCGLPFAAlphaSize, (CGLPixelFormatAttribute)fbconfig->alphaBits ); + _setCGLAttribute( kCGLPFADepthSize, (CGLPixelFormatAttribute)fbconfig->depthBits ); + _setCGLAttribute( kCGLPFAStencilSize, (CGLPixelFormatAttribute)fbconfig->stencilBits ); + _setCGLAttribute( kCGLPFAAuxBuffers, (CGLPixelFormatAttribute)fbconfig->auxBuffers ); + + CGLpixelFormatAttributes[ numCGLAttrs++ ] = (CGLPixelFormatAttribute)NULL; + + // create a suitable pixel format with above attributes.. + cglErr = CGLChoosePixelFormat( CGLpixelFormatAttributes, + &_glfwWin.cglPixelFormat, + &numCGLvs ); + if( cglErr != kCGLNoError ) + { + fprintf( stderr, + "Failed to choose CGL pixel format: %s\n", + CGLErrorString( cglErr ) ); + + return GL_FALSE; + } + + // ..and create a rendering context using that pixel format + cglErr = CGLCreateContext( _glfwWin.cglPixelFormat, NULL, &_glfwWin.cglContext ); + if( cglErr != kCGLNoError ) + { + fprintf( stderr, + "Failed to create CGL context: %s\n", + CGLErrorString( cglErr ) ); + + return GL_FALSE; + } + + // enumerate depth of RGB channels - unlike AGL, CGL works with + // a single parameter reflecting the full depth of the frame buffer + (void)CGLDescribePixelFormat( _glfwWin.cglPixelFormat, + 0, + kCGLPFAColorSize, + &rgbColorDepth ); + + // capture the display for our application + cgErr = CGCaptureAllDisplays(); + if( cgErr != kCGErrorSuccess ) + { + fprintf( stderr, + "Failed to capture Core Graphics displays\n"); + + return GL_FALSE; + } + + // find closest matching NON-STRETCHED display mode.. + optimalMode = CGDisplayBestModeForParametersAndRefreshRateWithProperty( + kCGDirectMainDisplay, + rgbColorDepth, + width, + height, + wndconfig->refreshRate, + NULL, + NULL ); + if( optimalMode == NULL ) + { + fprintf( stderr, + "Failed to retrieve Core Graphics display mode\n"); + + return GL_FALSE; + } + + // ..and switch to that mode + cgErr = CGDisplaySwitchToMode( kCGDirectMainDisplay, optimalMode ); + if( cgErr != kCGErrorSuccess ) + { + fprintf( stderr, + "Failed to switch to Core Graphics display mode\n"); + + return GL_FALSE; + } + + // switch to our OpenGL context, and bring it up fullscreen + cglErr = CGLSetCurrentContext( _glfwWin.cglContext ); + if( cglErr != kCGLNoError ) + { + fprintf( stderr, + "Failed to make CGL context current: %s\n", + CGLErrorString( cglErr ) ); + + return GL_FALSE; + } + + cglErr = CGLSetFullScreen( _glfwWin.cglContext ); + if( cglErr != kCGLNoError ) + { + fprintf( stderr, + "Failed to set CGL fullscreen mode: %s\n", + CGLErrorString( cglErr ) ); + + return GL_FALSE; + } + } + + return GL_TRUE; +} + +//======================================================================== +// Properly kill the window/video display +//======================================================================== + +void _glfwPlatformCloseWindow( void ) +{ + if( _glfwWin.mouseUPP != NULL ) + { + DisposeEventHandlerUPP( _glfwWin.mouseUPP ); + _glfwWin.mouseUPP = NULL; + } + if( _glfwWin.commandUPP != NULL ) + { + DisposeEventHandlerUPP( _glfwWin.commandUPP ); + _glfwWin.commandUPP = NULL; + } + if( _glfwWin.keyboardUPP != NULL ) + { + DisposeEventHandlerUPP( _glfwWin.keyboardUPP ); + _glfwWin.keyboardUPP = NULL; + } + if( _glfwWin.windowUPP != NULL ) + { + DisposeEventHandlerUPP( _glfwWin.windowUPP ); + _glfwWin.windowUPP = NULL; + } + + if( _glfwWin.fullscreen ) + { + if( _glfwWin.cglContext != NULL ) + { + CGLSetCurrentContext( NULL ); + CGLClearDrawable( _glfwWin.cglContext ); + CGLDestroyContext( _glfwWin.cglContext ); + CGReleaseAllDisplays(); + _glfwWin.cglContext = NULL; + } + + if( _glfwWin.cglPixelFormat != NULL ) + { + CGLDestroyPixelFormat( _glfwWin.cglPixelFormat ); + _glfwWin.cglPixelFormat = NULL; + } + } + else + { + if( _glfwWin.aglContext != NULL ) + { + aglSetCurrentContext( NULL ); + aglSetDrawable( _glfwWin.aglContext, NULL ); + aglDestroyContext( _glfwWin.aglContext ); + _glfwWin.aglContext = NULL; + } + + if( _glfwWin.aglPixelFormat != NULL ) + { + aglDestroyPixelFormat( _glfwWin.aglPixelFormat ); + _glfwWin.aglPixelFormat = NULL; + } + } + + if( _glfwWin.window != NULL ) + { + ReleaseWindow( _glfwWin.window ); + _glfwWin.window = NULL; + } +} + +//======================================================================== +// Set the window title +//======================================================================== + +void _glfwPlatformSetWindowTitle( const char *title ) +{ + CFStringRef windowTitle; + + if( !_glfwWin.fullscreen ) + { + windowTitle = CFStringCreateWithCString( kCFAllocatorDefault, + title, + kCFStringEncodingISOLatin1 ); + + (void)SetWindowTitleWithCFString( _glfwWin.window, windowTitle ); + + CFRelease( windowTitle ); + } +} + +//======================================================================== +// Set the window size +//======================================================================== + +void _glfwPlatformSetWindowSize( int width, int height ) +{ + if( !_glfwWin.fullscreen ) + { + SizeWindow( _glfwWin.window, width, height, TRUE ); + } +} + +//======================================================================== +// Set the window position +//======================================================================== + +void _glfwPlatformSetWindowPos( int x, int y ) +{ + if( !_glfwWin.fullscreen ) + { + MoveWindow( _glfwWin.window, x, y, FALSE ); + } +} + +//======================================================================== +// Window iconification +//======================================================================== + +void _glfwPlatformIconifyWindow( void ) +{ + if( !_glfwWin.fullscreen ) + { + (void)CollapseWindow( _glfwWin.window, TRUE ); + } +} + +//======================================================================== +// Window un-iconification +//======================================================================== + +void _glfwPlatformRestoreWindow( void ) +{ + if( !_glfwWin.fullscreen ) + { + (void)CollapseWindow( _glfwWin.window, FALSE ); + } +} + +//======================================================================== +// Swap buffers (double-buffering) and poll any new events +//======================================================================== + +void _glfwPlatformSwapBuffers( void ) +{ + if( _glfwWin.fullscreen ) + { + CGLFlushDrawable( _glfwWin.cglContext ); + } + else + { + aglSwapBuffers( _glfwWin.aglContext ); + } +} + +//======================================================================== +// Set double buffering swap interval +//======================================================================== + +void _glfwPlatformSwapInterval( int interval ) +{ + GLint AGLparameter = interval; + + // CGL doesn't seem to like intervals other than 0 (vsync off) or 1 (vsync on) + long CGLparameter = ( interval ? 1 : 0 ); + + if( _glfwWin.fullscreen ) + { + // Don't care if we fail here.. + (void)CGLSetParameter( _glfwWin.cglContext, + kCGLCPSwapInterval, + (GLint*) &CGLparameter ); + } + else + { + // ..or here + (void)aglSetInteger( _glfwWin.aglContext, + AGL_SWAP_INTERVAL, + &AGLparameter ); + } +} + +//======================================================================== +// Read back framebuffer parameters from the context +//======================================================================== + +#define _getAGLAttribute( aglAttributeName, variableName ) \ +{ \ + GLint aglValue; \ + (void)aglDescribePixelFormat( _glfwWin.aglPixelFormat, aglAttributeName, &aglValue ); \ + variableName = aglValue; \ +} + +#define _getCGLAttribute( cglAttributeName, variableName ) \ +{ \ + GLint cglValue; \ + (void)CGLDescribePixelFormat( _glfwWin.cglPixelFormat, 0, cglAttributeName, &cglValue ); \ + variableName = cglValue; \ +} + +void _glfwPlatformRefreshWindowParams( void ) +{ + GLint rgbColorDepth; + GLint rgbaAccumDepth = 0; + GLint rgbChannelDepth = 0; + + if( _glfwWin.fullscreen ) + { + _getCGLAttribute( kCGLPFAAccelerated, _glfwWin.accelerated ); + _getCGLAttribute( kCGLPFAAlphaSize, _glfwWin.alphaBits ); + _getCGLAttribute( kCGLPFADepthSize, _glfwWin.depthBits ); + _getCGLAttribute( kCGLPFAStencilSize, _glfwWin.stencilBits ); + _getCGLAttribute( kCGLPFAAuxBuffers, _glfwWin.auxBuffers ); + _getCGLAttribute( kCGLPFAStereo, _glfwWin.stereo ); + _getCGLAttribute( kCGLPFASamples, _glfwWin.samples ); + + // Enumerate depth of RGB channels - unlike AGL, CGL works with + // a single parameter reflecting the full depth of the frame buffer + (void)CGLDescribePixelFormat( _glfwWin.cglPixelFormat, + 0, + kCGLPFAColorSize, + &rgbColorDepth ); + + if( rgbColorDepth == 24 || rgbColorDepth == 32 ) + { + rgbChannelDepth = 8; + } + if( rgbColorDepth == 16 ) + { + rgbChannelDepth = 5; + } + + _glfwWin.redBits = rgbChannelDepth; + _glfwWin.greenBits = rgbChannelDepth; + _glfwWin.blueBits = rgbChannelDepth; + + // Get pixel depth of accumulator - I haven't got the slightest idea + // how this number conforms to any other channel depth than 8 bits, + // so this might end up giving completely knackered results... + _getCGLAttribute( kCGLPFAColorSize, rgbaAccumDepth ); + if( rgbaAccumDepth == 32 ) + { + rgbaAccumDepth = 8; + } + + _glfwWin.accumRedBits = rgbaAccumDepth; + _glfwWin.accumGreenBits = rgbaAccumDepth; + _glfwWin.accumBlueBits = rgbaAccumDepth; + _glfwWin.accumAlphaBits = rgbaAccumDepth; + } + else + { + _getAGLAttribute( AGL_ACCELERATED, _glfwWin.accelerated ); + _getAGLAttribute( AGL_RED_SIZE, _glfwWin.redBits ); + _getAGLAttribute( AGL_GREEN_SIZE, _glfwWin.greenBits ); + _getAGLAttribute( AGL_BLUE_SIZE, _glfwWin.blueBits ); + _getAGLAttribute( AGL_ALPHA_SIZE, _glfwWin.alphaBits ); + _getAGLAttribute( AGL_DEPTH_SIZE, _glfwWin.depthBits ); + _getAGLAttribute( AGL_STENCIL_SIZE, _glfwWin.stencilBits ); + _getAGLAttribute( AGL_ACCUM_RED_SIZE, _glfwWin.accumRedBits ); + _getAGLAttribute( AGL_ACCUM_GREEN_SIZE, _glfwWin.accumGreenBits ); + _getAGLAttribute( AGL_ACCUM_BLUE_SIZE, _glfwWin.accumBlueBits ); + _getAGLAttribute( AGL_ACCUM_ALPHA_SIZE, _glfwWin.accumAlphaBits ); + _getAGLAttribute( AGL_AUX_BUFFERS, _glfwWin.auxBuffers ); + _getAGLAttribute( AGL_STEREO, _glfwWin.stereo ); + _getAGLAttribute( AGL_SAMPLES_ARB, _glfwWin.samples ); + } +} + +//======================================================================== +// Poll for new window and input events +//======================================================================== + +void _glfwPlatformPollEvents( void ) +{ + EventRef event; + EventTargetRef eventDispatcher = GetEventDispatcherTarget(); + + while ( ReceiveNextEvent( 0, NULL, 0.0, TRUE, &event ) == noErr ) + { + SendEventToEventTarget( event, eventDispatcher ); + ReleaseEvent( event ); + } +} + +//======================================================================== +// Wait for new window and input events +//======================================================================== + +void _glfwPlatformWaitEvents( void ) +{ + EventRef event; + + // Wait for new events + ReceiveNextEvent( 0, NULL, kEventDurationForever, FALSE, &event ); + + // Process the new events + _glfwPlatformPollEvents(); +} + +//======================================================================== +// Hide mouse cursor (lock it) +//======================================================================== + +void _glfwPlatformHideMouseCursor( void ) +{ + CGDisplayHideCursor( kCGDirectMainDisplay ); + CGAssociateMouseAndMouseCursorPosition( false ); +} + +//======================================================================== +// Show mouse cursor (unlock it) +//======================================================================== + +void _glfwPlatformShowMouseCursor( void ) +{ + CGDisplayShowCursor( kCGDirectMainDisplay ); + CGAssociateMouseAndMouseCursorPosition( true ); +} + +//======================================================================== +// Set physical mouse cursor position +//======================================================================== + +void _glfwPlatformSetMouseCursorPos( int x, int y ) +{ + Rect content; + + if( _glfwWin.fullscreen ) + { + CGDisplayMoveCursorToPoint( kCGDirectMainDisplay, + CGPointMake( x, y ) ); + } + else + { + GetWindowBounds(_glfwWin.window, kWindowContentRgn, &content); + + _glfwInput.MousePosX = x + content.left; + _glfwInput.MousePosY = y + content.top; + + CGDisplayMoveCursorToPoint( kCGDirectMainDisplay, + CGPointMake( _glfwInput.MousePosX, + _glfwInput.MousePosY ) ); + } +} + diff -Nru glfw-2.6/lib/carbon/libglfw.pc.in glfw-2.7.2/lib/carbon/libglfw.pc.in --- glfw-2.6/lib/carbon/libglfw.pc.in 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/carbon/libglfw.pc.in 2010-08-08 14:42:20.000000000 +0000 @@ -0,0 +1,11 @@ +prefix=@PREFIX@ +exec_prefix=@PREFIX@ +libdir=@PREFIX@/lib +includedir=@PREFIX@/include + +Name: GLFW +Description: A portable framework for OpenGL development +Version: 2.7 +URL: http://www.glfw.org/ +Libs: -L${libdir} -lglfw -framework AGL -framework OpenGL -framework Carbon +Cflags: -I${includedir} diff -Nru glfw-2.6/lib/carbon/Makefile.carbon glfw-2.7.2/lib/carbon/Makefile.carbon --- glfw-2.6/lib/carbon/Makefile.carbon 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/carbon/Makefile.carbon 2009-11-08 20:16:20.000000000 +0000 @@ -0,0 +1,170 @@ +########################################################################## +# Makefile for GLFW on Mac OS X using GCC (Apple SDK). +#------------------------------------------------------------------------- +# To compile GLFW using this makefile, run: +# make -f Makefile.carbon +########################################################################## + +########################################################################## +# Installation prefix (default to /usr/local) +########################################################################## +PREFIX ?= /usr/local + + +########################################################################## +# Default: Build GLFW static and shared library +########################################################################## +all: libglfw.a libglfw.dylib + + +########################################################################## +# Compiler settings +########################################################################## +CC = gcc +CFLAGS = -c -I. -I.. -Wall -O2 -fno-common -g -m32 + + +########################################################################## +# Library builder settings +########################################################################## +AR = ar +SED = sed +INSTALL = install +ARFLAGS = -rcs +RANLIB = ranlib +DYLIBFLAGS = -framework AGL -framework Carbon -framework OpenGL \ + -dynamiclib -Wl,-single_module -compatibility_version 1 \ + -current_version 1 -install_name @executable_path/libglfw.dylib -m32 + + +########################################################################## +# Install GLFW header and static library +########################################################################## +install: libglfw.a libglfw.pc + $(INSTALL) -d $(PREFIX)/lib + $(INSTALL) -c -m 644 libglfw.a $(PREFIX)/lib/libglfw.a + $(RANLIB) $(PREFIX)/lib/libglfw.a + $(INSTALL) -d $(PREFIX)/include/GL + $(INSTALL) -c -m 644 ../../include/GL/glfw.h $(PREFIX)/include/GL/glfw.h + $(INSTALL) -d $(PREFIX)/lib/pkgconfig + $(INSTALL) -c -m 644 libglfw.pc $(PREFIX)/lib/pkgconfig/libglfw.pc + + +########################################################################## +# Object files for the GLFW library +########################################################################## +OBJS = \ + enable.o \ + fullscreen.o \ + glext.o \ + image.o \ + init.o \ + input.o \ + joystick.o \ + stream.o \ + tga.o \ + thread.o \ + time.o \ + window.o \ + carbon_enable.o \ + carbon_fullscreen.o \ + carbon_glext.o \ + carbon_init.o \ + carbon_joystick.o \ + carbon_thread.o \ + carbon_time.o \ + carbon_window.o + + +########################################################################## +# Rule for building libglfw.pc +########################################################################## +libglfw.pc: libglfw.pc.in + $(SED) -e 's,\@PREFIX\@,$(PREFIX),' libglfw.pc.in > libglfw.pc + + +########################################################################## +# Rule for building static library +########################################################################## +libglfw.a: $(OBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) + $(RANLIB) $@ + + +########################################################################## +# Rule for building shared library +########################################################################## +libglfw.dylib: $(OBJS) + $(CC) -o $@ $(DYLIBFLAGS) $(OBJS) + + +########################################################################## +# Rule for cleaning up generated files +########################################################################## +clean: + @rm -f *.o libglfw.a libglfw.dylib libglfw.pc + + +########################################################################## +# Rules for building library object files +########################################################################## +enable.o: ../enable.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../enable.c + +fullscreen.o: ../fullscreen.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../fullscreen.c + +glext.o: ../glext.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../glext.c + +image.o: ../image.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../image.c + +init.o: ../init.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../init.c + +input.o: ../input.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../input.c + +joystick.o: ../joystick.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../joystick.c + +stream.o: ../stream.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../stream.c + +tga.o: ../tga.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../tga.c + +thread.o: ../thread.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../thread.c + +time.o: ../time.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../time.c + +window.o: ../window.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../window.c + +carbon_enable.o: carbon_enable.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ carbon_enable.c + +carbon_fullscreen.o: carbon_fullscreen.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ carbon_fullscreen.c + +carbon_glext.o: carbon_glext.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ carbon_glext.c + +carbon_init.o: carbon_init.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ carbon_init.c + +carbon_joystick.o: carbon_joystick.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ carbon_joystick.c + +carbon_thread.o: carbon_thread.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ carbon_thread.c + +carbon_time.o: carbon_time.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ carbon_time.c + +carbon_window.o: carbon_window.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ carbon_window.c + diff -Nru glfw-2.6/lib/carbon/Makefile.carbon.universal glfw-2.7.2/lib/carbon/Makefile.carbon.universal --- glfw-2.6/lib/carbon/Makefile.carbon.universal 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/carbon/Makefile.carbon.universal 2010-05-29 18:23:40.000000000 +0000 @@ -0,0 +1,163 @@ +########################################################################## +# Makefile for GLFW on Mac OS X using GCC (Apple SDK). +#------------------------------------------------------------------------- +# To compile GLFW using this makefile, run: +# make -f Makefile.carbon.universal +########################################################################## + +########################################################################## +# Installation prefix (default to /usr/local) +########################################################################## +PREFIX ?= /usr/local + + +########################################################################## +# Default: Build GLFW static library +########################################################################## +all: libglfw.a + + +########################################################################## +# Compiler settings +########################################################################## +CC = gcc +FATFLAGS = -isysroot /Developer/SDKs/MacOSX10.4u.sdk \ + -mmacosx-version-min=10.4 -arch ppc -arch i386 +CFLAGS = -c -I. -I.. -Wall -O2 -fno-common $(FATFLAGS) + + +########################################################################## +# Library builder settings +########################################################################## +SED = sed +INSTALL = install +MKLIB = ar +LIBFLAGS = -rcs +RANLIB = ranlib + + +########################################################################## +# Install GLFW header and static library +########################################################################## +install: libglfw.a libglfw.pc + $(INSTALL) -d $(PREFIX)/lib + $(INSTALL) -c -m 644 libglfw.a $(PREFIX)/lib/libglfw.a + $(RANLIB) $(PREFIX)/lib/libglfw.a + $(INSTALL) -d $(PREFIX)/include/GL + $(INSTALL) -c -m 644 ../../include/GL/glfw.h $(PREFIX)/include/GL/glfw.h + $(INSTALL) -d $(PREFIX)/lib/pkgconfig + $(INSTALL) -c -m 644 libglfw.pc $(PREFIX)/lib/pkgconfig/libglfw.pc + + +########################################################################## +# Rule for cleaning up generated files +########################################################################## +clean: + rm -f *.o libglfw.a libglfw.pc + + +########################################################################## +# Object files which are part of the GLFW library +########################################################################## +OBJS = \ + enable.o \ + fullscreen.o \ + glext.o \ + image.o \ + init.o \ + input.o \ + joystick.o \ + stream.o \ + tga.o \ + thread.o \ + time.o \ + window.o \ + carbon_enable.o \ + carbon_fullscreen.o \ + carbon_glext.o \ + carbon_init.o \ + carbon_joystick.o \ + carbon_thread.o \ + carbon_time.o \ + carbon_window.o + + +########################################################################## +# Rule for building libglfw.pc +########################################################################## +libglfw.pc: libglfw.pc.in + $(SED) -e 's,\@PREFIX\@,$(PREFIX),' libglfw.pc.in > libglfw.pc + + +########################################################################## +# Rule for building library +########################################################################## +libglfw.a: $(OBJS) + rm -f $@ + $(MKLIB) $(LIBFLAGS) $@ $(OBJS) + $(RANLIB) $@ + + +########################################################################## +# Rules for building library object files +########################################################################## +enable.o: ../enable.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../enable.c + +fullscreen.o: ../fullscreen.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../fullscreen.c + +glext.o: ../glext.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../glext.c + +image.o: ../image.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../image.c + +init.o: ../init.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../init.c + +input.o: ../input.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../input.c + +joystick.o: ../joystick.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../joystick.c + +stream.o: ../stream.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../stream.c + +tga.o: ../tga.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../tga.c + +thread.o: ../thread.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../thread.c + +time.o: ../time.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../time.c + +window.o: ../window.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../window.c + +carbon_enable.o: carbon_enable.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ carbon_enable.c + +carbon_fullscreen.o: carbon_fullscreen.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ carbon_fullscreen.c + +carbon_glext.o: carbon_glext.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ carbon_glext.c + +carbon_init.o: carbon_init.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ carbon_init.c + +carbon_joystick.o: carbon_joystick.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ carbon_joystick.c + +carbon_thread.o: carbon_thread.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ carbon_thread.c + +carbon_time.o: carbon_time.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ carbon_time.c + +carbon_window.o: carbon_window.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ carbon_window.c + diff -Nru glfw-2.6/lib/carbon/platform.h glfw-2.7.2/lib/carbon/platform.h --- glfw-2.6/lib/carbon/platform.h 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/carbon/platform.h 2010-08-08 15:54:08.000000000 +0000 @@ -0,0 +1,334 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Carbon/AGL/CGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2003 Keith Bauer +// Copyright (c) 2003-2010 Camilla Berglund +// Copyright (c) 2006-2007 Robin Leffmann +// +// 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 _platform_h_ +#define _platform_h_ + + +// This is the Mac OS X version of GLFW +#define _GLFW_MAC_OS_X + +#include +#include +#include +#include +#include +#include + +#include "../../include/GL/glfw.h" + +#if MACOSX_DEPLOYMENT_TARGET < MAC_OS_X_VERSION_10_3 + +#ifndef kCGLNoError +#define kCGLNoError 0 +#endif + +#endif + + +#ifndef GL_VERSION_3_0 + +typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint); + +#endif /*GL_VERSION_3_0*/ + + +//======================================================================== +// Defines +//======================================================================== + +#define _GLFW_MAX_PATH_LENGTH (8192) + +#define MAC_KEY_ENTER 0x24 +#define MAC_KEY_RETURN 0x34 +#define MAC_KEY_ESC 0x35 +#define MAC_KEY_F1 0x7A +#define MAC_KEY_F2 0x78 +#define MAC_KEY_F3 0x63 +#define MAC_KEY_F4 0x76 +#define MAC_KEY_F5 0x60 +#define MAC_KEY_F6 0x61 +#define MAC_KEY_F7 0x62 +#define MAC_KEY_F8 0x64 +#define MAC_KEY_F9 0x65 +#define MAC_KEY_F10 0x6D +#define MAC_KEY_F11 0x67 +#define MAC_KEY_F12 0x6F +#define MAC_KEY_F13 0x69 +#define MAC_KEY_F14 0x6B +#define MAC_KEY_F15 0x71 +#define MAC_KEY_UP 0x7E +#define MAC_KEY_DOWN 0x7D +#define MAC_KEY_LEFT 0x7B +#define MAC_KEY_RIGHT 0x7C +#define MAC_KEY_TAB 0x30 +#define MAC_KEY_BACKSPACE 0x33 +#define MAC_KEY_HELP 0x72 +#define MAC_KEY_DEL 0x75 +#define MAC_KEY_PAGEUP 0x74 +#define MAC_KEY_PAGEDOWN 0x79 +#define MAC_KEY_HOME 0x73 +#define MAC_KEY_END 0x77 +#define MAC_KEY_KP_0 0x52 +#define MAC_KEY_KP_1 0x53 +#define MAC_KEY_KP_2 0x54 +#define MAC_KEY_KP_3 0x55 +#define MAC_KEY_KP_4 0x56 +#define MAC_KEY_KP_5 0x57 +#define MAC_KEY_KP_6 0x58 +#define MAC_KEY_KP_7 0x59 +#define MAC_KEY_KP_8 0x5B +#define MAC_KEY_KP_9 0x5C +#define MAC_KEY_KP_DIVIDE 0x4B +#define MAC_KEY_KP_MULTIPLY 0x43 +#define MAC_KEY_KP_SUBTRACT 0x4E +#define MAC_KEY_KP_ADD 0x45 +#define MAC_KEY_KP_DECIMAL 0x41 +#define MAC_KEY_KP_EQUAL 0x51 +#define MAC_KEY_KP_ENTER 0x4C +#define MAC_KEY_NUMLOCK 0x47 + + +//======================================================================== +// GLFW platform specific types +//======================================================================== + +//------------------------------------------------------------------------ +// Pointer length integer +//------------------------------------------------------------------------ +typedef intptr_t GLFWintptr; + + +GLFWGLOBAL CFDictionaryRef _glfwDesktopVideoMode; + +//------------------------------------------------------------------------ +// Window structure +//------------------------------------------------------------------------ +typedef struct _GLFWwin_struct _GLFWwin; + +struct _GLFWwin_struct { + +// ========= PLATFORM INDEPENDENT MANDATORY PART ========================= + + // User callback functions + GLFWwindowsizefun windowSizeCallback; + GLFWwindowclosefun windowCloseCallback; + GLFWwindowrefreshfun windowRefreshCallback; + GLFWmousebuttonfun mouseButtonCallback; + GLFWmouseposfun mousePosCallback; + GLFWmousewheelfun mouseWheelCallback; + GLFWkeyfun keyCallback; + GLFWcharfun charCallback; + + // User selected window settings + int fullscreen; // Fullscreen flag + int mouseLock; // Mouse-lock flag + int autoPollEvents; // Auto polling flag + int sysKeysDisabled; // System keys disabled flag + int windowNoResize; // Resize- and maximize gadgets disabled flag + int refreshRate; // Vertical monitor refresh rate + + // Window status & parameters + int opened; // Flag telling if window is opened or not + int active; // Application active flag + int iconified; // Window iconified flag + int width, height; // Window width and heigth + int accelerated; // GL_TRUE if window is HW accelerated + + // Framebuffer attributes + int redBits; + int greenBits; + int blueBits; + int alphaBits; + int depthBits; + int stencilBits; + int accumRedBits; + int accumGreenBits; + int accumBlueBits; + int accumAlphaBits; + int auxBuffers; + int stereo; + int samples; + + // OpenGL extensions and context attributes + int has_GL_SGIS_generate_mipmap; + int has_GL_ARB_texture_non_power_of_two; + int glMajor, glMinor, glRevision; + int glForward, glDebug, glProfile; + + PFNGLGETSTRINGIPROC GetStringi; + +// ========= PLATFORM SPECIFIC PART ====================================== + + WindowRef window; + + AGLContext aglContext; + AGLPixelFormat aglPixelFormat; + + CGLContextObj cglContext; + CGLPixelFormatObj cglPixelFormat; + + EventHandlerUPP windowUPP; + EventHandlerUPP mouseUPP; + EventHandlerUPP commandUPP; + EventHandlerUPP keyboardUPP; +}; + +GLFWGLOBAL _GLFWwin _glfwWin; + + +//------------------------------------------------------------------------ +// User input status (some of this should go in _GLFWwin) +//------------------------------------------------------------------------ +GLFWGLOBAL struct { + +// ========= PLATFORM INDEPENDENT MANDATORY PART ========================= + + // Mouse status + int MousePosX, MousePosY; + int WheelPos; + char MouseButton[ GLFW_MOUSE_BUTTON_LAST + 1 ]; + + // Keyboard status + char Key[ GLFW_KEY_LAST + 1 ]; + int LastChar; + + // User selected settings + int StickyKeys; + int StickyMouseButtons; + int KeyRepeat; + +// ========= PLATFORM SPECIFIC PART ====================================== + + UInt32 Modifiers; + +} _glfwInput; + + + +//------------------------------------------------------------------------ +// Thread information +//------------------------------------------------------------------------ +typedef struct _GLFWthread_struct _GLFWthread; + +// Thread record (one for each thread) +struct _GLFWthread_struct { + + // Pointer to previous and next threads in linked list + _GLFWthread *Previous, *Next; + + // GLFW user side thread information + GLFWthread ID; + GLFWthreadfun Function; + + // System side thread information + pthread_t PosixID; +}; + +// General thread information +GLFWGLOBAL struct { + + // Critical section lock + pthread_mutex_t CriticalSection; + + // Next thread ID to use (increments for every created thread) + GLFWthread NextID; + + // First thread in linked list (always the main thread) + _GLFWthread First; + +} _glfwThrd; + + +//------------------------------------------------------------------------ +// Library global data +//------------------------------------------------------------------------ +GLFWGLOBAL struct { + +// ========= PLATFORM INDEPENDENT MANDATORY PART ========================= + + // Window opening hints + _GLFWhints hints; + +// ========= PLATFORM SPECIFIC PART ====================================== + + // Timer data + struct { + double t0; + } Timer; + + struct { + // Bundle for dynamically-loading extension function pointers + CFBundleRef OpenGLFramework; + } Libs; + + int Unbundled; + +} _glfwLibrary; + + + +//======================================================================== +// Macros for encapsulating critical code sections (i.e. making parts +// of GLFW thread safe) +//======================================================================== + +// Define so we can use the same thread code as X11 +#define _glfw_numprocessors(n) { \ + int mib[2], ncpu; \ + size_t len = 1; \ + mib[0] = CTL_HW; \ + mib[1] = HW_NCPU; \ + n = 1; \ + if( sysctl( mib, 2, &ncpu, &len, NULL, 0 ) != -1 ) \ + { \ + if( len > 0 ) \ + { \ + n = ncpu; \ + } \ + } \ +} + +// Thread list management +#define ENTER_THREAD_CRITICAL_SECTION \ +pthread_mutex_lock( &_glfwThrd.CriticalSection ); +#define LEAVE_THREAD_CRITICAL_SECTION \ +pthread_mutex_unlock( &_glfwThrd.CriticalSection ); + + +//======================================================================== +// Prototypes for platform specific internal functions +//======================================================================== + +void _glfwChangeToResourcesDirectory( void ); + +#endif // _platform_h_ diff -Nru glfw-2.6/lib/cocoa/cocoa_enable.m glfw-2.7.2/lib/cocoa/cocoa_enable.m --- glfw-2.6/lib/cocoa/cocoa_enable.m 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/cocoa/cocoa_enable.m 2010-08-08 15:37:03.000000000 +0000 @@ -0,0 +1,51 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Cocoa/NSOpenGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2009-2010 Camilla Berglund +// +// 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. +// +//======================================================================== + +#include "internal.h" + +//************************************************************************ +//**** Platform implementation functions **** +//************************************************************************ + +//======================================================================== +// Enable and disable system keys +//======================================================================== + +void _glfwPlatformEnableSystemKeys( void ) +{ + // This is checked in macosx_window.m; we take no action here +} + +void _glfwPlatformDisableSystemKeys( void ) +{ + // This is checked in macosx_window.m; we take no action here + // I don't think it's really possible to disable stuff like Exposé + // except in full-screen mode. +} + diff -Nru glfw-2.6/lib/cocoa/cocoa_fullscreen.m glfw-2.7.2/lib/cocoa/cocoa_fullscreen.m --- glfw-2.6/lib/cocoa/cocoa_fullscreen.m 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/cocoa/cocoa_fullscreen.m 2011-03-04 20:55:29.000000000 +0000 @@ -0,0 +1,102 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Cocoa/NSOpenGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2009-2010 Camilla Berglund +// +// 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. +// +//======================================================================== + +#include "internal.h" + +//======================================================================== +// Check whether the display mode should be included in enumeration +//======================================================================== + +static BOOL modeIsGood( NSDictionary *mode ) +{ + // This is a bit controversial, if you've got something other than an + // LCD computer monitor as an output device you might not want these + // checks. You might also want to reject modes which are interlaced, + // or TV out. There is no one-size-fits-all policy that can work here. + // This seems like a decent compromise, but certain applications may + // wish to patch this... + return [[mode objectForKey:(id)kCGDisplayBitsPerPixel] intValue] >= 15 && + [mode objectForKey:(id)kCGDisplayModeIsSafeForHardware] != nil && + [mode objectForKey:(id)kCGDisplayModeIsStretched] == nil; +} + +//======================================================================== +// Convert Core Graphics display mode to GLFW video mode +//======================================================================== + +static GLFWvidmode vidmodeFromCGDisplayMode( NSDictionary *mode ) +{ + unsigned int width = [[mode objectForKey:(id)kCGDisplayWidth] unsignedIntValue]; + unsigned int height = [[mode objectForKey:(id)kCGDisplayHeight] unsignedIntValue]; + unsigned int bps = [[mode objectForKey:(id)kCGDisplayBitsPerSample] unsignedIntValue]; + + GLFWvidmode result; + result.Width = width; + result.Height = height; + result.RedBits = bps; + result.GreenBits = bps; + result.BlueBits = bps; + return result; +} + + +//************************************************************************ +//**** Platform implementation functions **** +//************************************************************************ + +//======================================================================== +// Get a list of available video modes +//======================================================================== + +int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount ) +{ + NSArray *modes = (NSArray *)CGDisplayAvailableModes( CGMainDisplayID() ); + + unsigned int i, j = 0, n = [modes count]; + for( i = 0; i < n && j < (unsigned)maxcount; i++ ) + { + NSDictionary *mode = [modes objectAtIndex:i]; + if( modeIsGood( mode ) ) + { + list[j++] = vidmodeFromCGDisplayMode( mode ); + } + } + + return j; +} + +//======================================================================== +// Get the desktop video mode +//======================================================================== + +void _glfwPlatformGetDesktopMode( GLFWvidmode *mode ) +{ + *mode = vidmodeFromCGDisplayMode( _glfwLibrary.DesktopMode ); +} + diff -Nru glfw-2.6/lib/cocoa/cocoa_glext.m glfw-2.7.2/lib/cocoa/cocoa_glext.m --- glfw-2.6/lib/cocoa/cocoa_glext.m 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/cocoa/cocoa_glext.m 2010-08-08 15:37:03.000000000 +0000 @@ -0,0 +1,63 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Cocoa/NSOpenGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2009-2010 Camilla Berglund +// +// 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. +// +//======================================================================== + +#include "internal.h" + +//************************************************************************ +//**** Platform implementation functions **** +//************************************************************************ + +//======================================================================== +// Check if an OpenGL extension is available at runtime +//======================================================================== + +int _glfwPlatformExtensionSupported( const char *extension ) +{ + // There are no AGL, CGL or NSGL extensions. + return GL_FALSE; +} + +//======================================================================== +// Get the function pointer to an OpenGL function +//======================================================================== + +void * _glfwPlatformGetProcAddress( const char *procname ) +{ + CFStringRef symbolName = CFStringCreateWithCString( kCFAllocatorDefault, + procname, + kCFStringEncodingASCII ); + + void *symbol = CFBundleGetFunctionPointerForName( _glfwLibrary.OpenGLFramework, + symbolName ); + + CFRelease( symbolName ); + + return symbol; +} + diff -Nru glfw-2.6/lib/cocoa/cocoa_init.m glfw-2.7.2/lib/cocoa/cocoa_init.m --- glfw-2.6/lib/cocoa/cocoa_init.m 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/cocoa/cocoa_init.m 2011-07-27 17:43:21.000000000 +0000 @@ -0,0 +1,297 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Cocoa/NSOpenGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2009-2010 Camilla Berglund +// +// 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. +// +//======================================================================== + +// Needed for _NSGetProgname +#include + +#include "internal.h" + +@interface GLFWThread : NSThread +@end + +@implementation GLFWThread + +- (void)main +{ +} + +@end + +@interface GLFWApplication : NSApplication +@end + +@implementation GLFWApplication + +// From http://cocoadev.com/index.pl?GameKeyboardHandlingAlmost +// This works around an AppKit bug, where key up events while holding +// down the command key don't get sent to the key window. +- (void)sendEvent:(NSEvent *)event +{ + if( [event type] == NSKeyUp && ( [event modifierFlags] & NSCommandKeyMask ) ) + { + [[self keyWindow] sendEvent:event]; + } + else + { + [super sendEvent:event]; + } +} + +@end + +// Prior to Snow Leopard, we need to use this oddly-named semi-private API +// to get the application menu working properly. Need to be careful in +// case it goes away in a future OS update. +@interface NSApplication (NSAppleMenu) +- (void)setAppleMenu:(NSMenu *)m; +@end + +// Keys to search for as potential application names +NSString *GLFWNameKeys[] = +{ + @"CFBundleDisplayName", + @"CFBundleName", + @"CFBundleExecutable", +}; + +//======================================================================== +// Try to figure out what the calling application is called +//======================================================================== +static NSString *findAppName( void ) +{ + NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; + + unsigned int i; + for( i = 0; i < sizeof(GLFWNameKeys) / sizeof(GLFWNameKeys[0]); i++ ) + { + id name = [infoDictionary objectForKey:GLFWNameKeys[i]]; + if (name && + [name isKindOfClass:[NSString class]] && + ![@"" isEqualToString:name]) + { + return name; + } + } + + // If we get here, we're unbundled + if( !_glfwLibrary.Unbundled ) + { + // Could do this only if we discover we're unbundled, but it should + // do no harm... + ProcessSerialNumber psn = { 0, kCurrentProcess }; + TransformProcessType( &psn, kProcessTransformToForegroundApplication ); + + // Having the app in front of the terminal window is also generally + // handy. There is an NSApplication API to do this, but... + SetFrontProcess( &psn ); + + _glfwLibrary.Unbundled = GL_TRUE; + } + + char **progname = _NSGetProgname(); + if( progname && *progname ) + { + // TODO: UTF8? + return [NSString stringWithUTF8String:*progname]; + } + + // Really shouldn't get here + return @"GLFW Application"; +} + +//======================================================================== +// Set up the menu bar (manually) +// This is nasty, nasty stuff -- calls to undocumented semi-private APIs that +// could go away at any moment, lots of stuff that really should be +// localize(d|able), etc. Loading a nib would save us this horror, but that +// doesn't seem like a good thing to require of GLFW's clients. +//======================================================================== +static void setUpMenuBar( void ) +{ + NSString *appName = findAppName(); + + NSMenu *bar = [[NSMenu alloc] init]; + [NSApp setMainMenu:bar]; + + NSMenuItem *appMenuItem = + [bar addItemWithTitle:@"" action:NULL keyEquivalent:@""]; + NSMenu *appMenu = [[NSMenu alloc] init]; + [appMenuItem setSubmenu:appMenu]; + + [appMenu addItemWithTitle:[NSString stringWithFormat:@"About %@", appName] + action:@selector(orderFrontStandardAboutPanel:) + keyEquivalent:@""]; + [appMenu addItem:[NSMenuItem separatorItem]]; + NSMenu *servicesMenu = [[NSMenu alloc] init]; + [NSApp setServicesMenu:servicesMenu]; + [[appMenu addItemWithTitle:@"Services" + action:NULL + keyEquivalent:@""] setSubmenu:servicesMenu]; + [appMenu addItem:[NSMenuItem separatorItem]]; + [appMenu addItemWithTitle:[NSString stringWithFormat:@"Hide %@", appName] + action:@selector(hide:) + keyEquivalent:@"h"]; + [[appMenu addItemWithTitle:@"Hide Others" + action:@selector(hideOtherApplications:) + keyEquivalent:@"h"] + setKeyEquivalentModifierMask:NSAlternateKeyMask | NSCommandKeyMask]; + [appMenu addItemWithTitle:@"Show All" + action:@selector(unhideAllApplications:) + keyEquivalent:@""]; + [appMenu addItem:[NSMenuItem separatorItem]]; + [appMenu addItemWithTitle:[NSString stringWithFormat:@"Quit %@", appName] + action:@selector(terminate:) + keyEquivalent:@"q"]; + + NSMenuItem *windowMenuItem = + [bar addItemWithTitle:@"" action:NULL keyEquivalent:@""]; + NSMenu *windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; + [NSApp setWindowsMenu:windowMenu]; + [windowMenuItem setSubmenu:windowMenu]; + + [windowMenu addItemWithTitle:@"Miniaturize" + action:@selector(performMiniaturize:) + keyEquivalent:@"m"]; + [windowMenu addItemWithTitle:@"Zoom" + action:@selector(performZoom:) + keyEquivalent:@""]; + [windowMenu addItem:[NSMenuItem separatorItem]]; + [windowMenu addItemWithTitle:@"Bring All to Front" + action:@selector(arrangeInFront:) + keyEquivalent:@""]; + + // At least guard the call to private API to avoid an exception if it + // goes away. Hopefully that means the worst we'll break in future is to + // look ugly... + if( [NSApp respondsToSelector:@selector(setAppleMenu:)] ) + { + [NSApp setAppleMenu:appMenu]; + } +} + +//======================================================================== +// Terminate GLFW when exiting application +//======================================================================== + +static void glfw_atexit( void ) +{ + glfwTerminate(); +} + + +//======================================================================== +// Initialize GLFW thread package +//======================================================================== + +static void initThreads( void ) +{ + // Initialize critical section handle + (void) pthread_mutex_init( &_glfwThrd.CriticalSection, NULL ); + + // The first thread (the main thread) has ID 0 + _glfwThrd.NextID = 0; + + // Fill out information about the main thread (this thread) + _glfwThrd.First.ID = _glfwThrd.NextID ++; + _glfwThrd.First.Function = NULL; + _glfwThrd.First.PosixID = pthread_self(); + _glfwThrd.First.Previous = NULL; + _glfwThrd.First.Next = NULL; +} + +//************************************************************************ +//**** Platform implementation functions **** +//************************************************************************ + +//======================================================================== +// Initialize the GLFW library +//======================================================================== + +int _glfwPlatformInit( void ) +{ + _glfwLibrary.AutoreleasePool = [[NSAutoreleasePool alloc] init]; + + // Implicitly create shared NSApplication instance + [GLFWApplication sharedApplication]; + + _glfwLibrary.OpenGLFramework = + CFBundleGetBundleWithIdentifier( CFSTR( "com.apple.opengl" ) ); + if( _glfwLibrary.OpenGLFramework == NULL ) + { + return GL_FALSE; + } + + GLFWThread* thread = [[GLFWThread alloc] init]; + [thread start]; + [thread release]; + + NSString* resourcePath = [[NSBundle mainBundle] resourcePath]; + + if( access( [resourcePath cStringUsingEncoding:NSUTF8StringEncoding], R_OK ) == 0 ) + { + chdir( [resourcePath cStringUsingEncoding:NSUTF8StringEncoding] ); + } + + // Setting up menu bar must go exactly here else weirdness ensues + setUpMenuBar(); + + [NSApp finishLaunching]; + + // Install atexit routine + atexit( glfw_atexit ); + + initThreads(); + + _glfwPlatformSetTime( 0.0 ); + + _glfwLibrary.DesktopMode = + (NSDictionary *)CGDisplayCurrentMode( CGMainDisplayID() ); + + return GL_TRUE; +} + +//======================================================================== +// Close window, if open, and shut down GLFW +//======================================================================== + +int _glfwPlatformTerminate( void ) +{ + // TODO: Fail unless this is the main thread + + glfwCloseWindow(); + + // TODO: Kill all non-main threads? + // TODO: Probably other cleanup + + [_glfwLibrary.AutoreleasePool release]; + _glfwLibrary.AutoreleasePool = nil; + + return GL_TRUE; +} + diff -Nru glfw-2.6/lib/cocoa/cocoa_joystick.m glfw-2.7.2/lib/cocoa/cocoa_joystick.m --- glfw-2.6/lib/cocoa/cocoa_joystick.m 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/cocoa/cocoa_joystick.m 2010-08-08 15:37:03.000000000 +0000 @@ -0,0 +1,65 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Cocoa/NSOpenGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2009-2010 Camilla Berglund +// +// 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. +// +//======================================================================== + +#include "internal.h" + +//************************************************************************ +//**** Platform implementation functions **** +//************************************************************************ + +//======================================================================== +// Determine joystick capabilities +//======================================================================== + +int _glfwPlatformGetJoystickParam( int joy, int param ) +{ + // TODO: Implement this. + return 0; +} + +//======================================================================== +// Get joystick axis positions +//======================================================================== + +int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes ) +{ + // TODO: Implement this. + return 0; +} + +//======================================================================== +// Get joystick button states +//======================================================================== + +int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons ) +{ + // TODO: Implement this. + return 0; +} + diff -Nru glfw-2.6/lib/cocoa/cocoa_thread.c glfw-2.7.2/lib/cocoa/cocoa_thread.c --- glfw-2.6/lib/cocoa/cocoa_thread.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/cocoa/cocoa_thread.c 2010-08-08 15:37:03.000000000 +0000 @@ -0,0 +1,415 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Cocoa/NSOpenGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2009-2010 Camilla Berglund +// +// 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. +// +//======================================================================== + +#include "internal.h" + +#include +#include + + +//************************************************************************ +//**** GLFW internal functions **** +//************************************************************************ + +//======================================================================== +// _glfwNewThread() - This is simply a "wrapper" for calling the user +// thread function. +//======================================================================== + +void * _glfwNewThread( void * arg ) +{ + GLFWthreadfun threadfun; + _GLFWthread *t; + + // Get pointer to thread information for current thread + t = _glfwGetThreadPointer( glfwGetThreadID() ); + if( t == NULL ) + { + return 0; + } + + // Get user thread function pointer + threadfun = t->Function; + + // Call the user thread function + threadfun( arg ); + + // Remove thread from thread list + ENTER_THREAD_CRITICAL_SECTION + _glfwRemoveThread( t ); + LEAVE_THREAD_CRITICAL_SECTION + + // When the thread function returns, the thread will die... + return NULL; +} + + + +//************************************************************************ +//**** Platform implementation functions **** +//************************************************************************ + +//======================================================================== +// _glfwPlatformCreateThread() - Create a new thread +//======================================================================== + +GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg ) +{ + GLFWthread ID; + _GLFWthread *t; + int result; + + // Enter critical section + ENTER_THREAD_CRITICAL_SECTION + + // Create a new thread information memory area + t = (_GLFWthread *) malloc( sizeof(_GLFWthread) ); + if( t == NULL ) + { + // Leave critical section + LEAVE_THREAD_CRITICAL_SECTION + return -1; + } + + // Get a new unique thread id + ID = _glfwThrd.NextID ++; + + // Store thread information in the thread list + t->Function = fun; + t->ID = ID; + + // Create thread + result = pthread_create( + &t->PosixID, // Thread handle + NULL, // Default thread attributes + _glfwNewThread, // Thread function (a wrapper function) + (void *)arg // Argument to thread is user argument + ); + + // Did the thread creation fail? + if( result != 0 ) + { + free( (void *) t ); + LEAVE_THREAD_CRITICAL_SECTION + return -1; + } + + // Append thread to thread list + _glfwAppendThread( t ); + + // Leave critical section + LEAVE_THREAD_CRITICAL_SECTION + + // Return the GLFW thread ID + return ID; +} + + +//======================================================================== +// _glfwPlatformDestroyThread() - Kill a thread. NOTE: THIS IS A VERY +// DANGEROUS OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME +// SITUATIONS! +//======================================================================== + +void _glfwPlatformDestroyThread( GLFWthread ID ) +{ + _GLFWthread *t; + + // Enter critical section + ENTER_THREAD_CRITICAL_SECTION + + // Get thread information pointer + t = _glfwGetThreadPointer( ID ); + if( t == NULL ) + { + LEAVE_THREAD_CRITICAL_SECTION + return; + } + + // Simply murder the process, no mercy! + pthread_kill( t->PosixID, SIGKILL ); + + // Remove thread from thread list + _glfwRemoveThread( t ); + + // Leave critical section + LEAVE_THREAD_CRITICAL_SECTION +} + + +//======================================================================== +// _glfwPlatformWaitThread() - Wait for a thread to die +//======================================================================== + +int _glfwPlatformWaitThread( GLFWthread ID, int waitmode ) +{ + pthread_t thread; + _GLFWthread *t; + + // Enter critical section + ENTER_THREAD_CRITICAL_SECTION + + // Get thread information pointer + t = _glfwGetThreadPointer( ID ); + + // Is the thread already dead? + if( t == NULL ) + { + LEAVE_THREAD_CRITICAL_SECTION + return GL_TRUE; + } + + // If got this far, the thread is alive => polling returns FALSE + if( waitmode == GLFW_NOWAIT ) + { + LEAVE_THREAD_CRITICAL_SECTION + return GL_FALSE; + } + + // Get thread handle + thread = t->PosixID; + + // Leave critical section + LEAVE_THREAD_CRITICAL_SECTION + + // Wait for thread to die + (void) pthread_join( thread, NULL ); + + return GL_TRUE; +} + + +//======================================================================== +// _glfwPlatformGetThreadID() - Return the thread ID for the current +// thread +//======================================================================== + +GLFWthread _glfwPlatformGetThreadID( void ) +{ + _GLFWthread *t; + GLFWthread ID = -1; + pthread_t posixID; + + // Get current thread ID + posixID = pthread_self(); + + // Enter critical section + ENTER_THREAD_CRITICAL_SECTION + + // Loop through entire list of threads to find the matching POSIX + // thread ID + for( t = &_glfwThrd.First; t != NULL; t = t->Next ) + { + if( t->PosixID == posixID ) + { + ID = t->ID; + break; + } + } + + // Leave critical section + LEAVE_THREAD_CRITICAL_SECTION + + // Return the found GLFW thread identifier + return ID; +} + + +//======================================================================== +// _glfwPlatformCreateMutex() - Create a mutual exclusion object +//======================================================================== + +GLFWmutex _glfwPlatformCreateMutex( void ) +{ + pthread_mutex_t *mutex; + + // Allocate memory for mutex + mutex = (pthread_mutex_t *) malloc( sizeof( pthread_mutex_t ) ); + if( !mutex ) + { + return NULL; + } + + // Initialise a mutex object + (void) pthread_mutex_init( mutex, NULL ); + + // Cast to GLFWmutex and return + return (GLFWmutex) mutex; +} + + +//======================================================================== +// _glfwPlatformDestroyMutex() - Destroy a mutual exclusion object +//======================================================================== + +void _glfwPlatformDestroyMutex( GLFWmutex mutex ) +{ + // Destroy the mutex object + pthread_mutex_destroy( (pthread_mutex_t *) mutex ); + + // Free memory for mutex object + free( (void *) mutex ); +} + + +//======================================================================== +// _glfwPlatformLockMutex() - Request access to a mutex +//======================================================================== + +void _glfwPlatformLockMutex( GLFWmutex mutex ) +{ + // Wait for mutex to be released + (void) pthread_mutex_lock( (pthread_mutex_t *) mutex ); +} + + +//======================================================================== +// _glfwPlatformUnlockMutex() - Release a mutex +//======================================================================== + +void _glfwPlatformUnlockMutex( GLFWmutex mutex ) +{ + // Release mutex + pthread_mutex_unlock( (pthread_mutex_t *) mutex ); +} + + +//======================================================================== +// _glfwPlatformCreateCond() - Create a new condition variable object +//======================================================================== + +GLFWcond _glfwPlatformCreateCond( void ) +{ + pthread_cond_t *cond; + + // Allocate memory for condition variable + cond = (pthread_cond_t *) malloc( sizeof(pthread_cond_t) ); + if( !cond ) + { + return NULL; + } + + // Initialise condition variable + (void) pthread_cond_init( cond, NULL ); + + // Cast to GLFWcond and return + return (GLFWcond) cond; +} + + +//======================================================================== +// _glfwPlatformDestroyCond() - Destroy a condition variable object +//======================================================================== + +void _glfwPlatformDestroyCond( GLFWcond cond ) +{ + // Destroy the condition variable object + (void) pthread_cond_destroy( (pthread_cond_t *) cond ); + + // Free memory for condition variable object + free( (void *) cond ); +} + + +//======================================================================== +// _glfwPlatformWaitCond() - Wait for a condition to be raised +//======================================================================== + +void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, + double timeout ) +{ + struct timeval currenttime; + struct timespec wait; + long dt_sec, dt_usec; + + // Select infinite or timed wait + if( timeout >= GLFW_INFINITY ) + { + // Wait for condition (infinite wait) + (void) pthread_cond_wait( (pthread_cond_t *) cond, + (pthread_mutex_t *) mutex ); + } + else + { + // Set timeout time, relatvie to current time + gettimeofday( ¤ttime, NULL ); + dt_sec = (long) timeout; + dt_usec = (long) ((timeout - (double)dt_sec) * 1000000.0); + wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L; + if( wait.tv_nsec > 1000000000L ) + { + wait.tv_nsec -= 1000000000L; + dt_sec ++; + } + wait.tv_sec = currenttime.tv_sec + dt_sec; + + // Wait for condition (timed wait) + (void) pthread_cond_timedwait( (pthread_cond_t *) cond, + (pthread_mutex_t *) mutex, &wait ); + } +} + + +//======================================================================== +// _glfwPlatformSignalCond() - Signal a condition to one waiting thread +//======================================================================== + +void _glfwPlatformSignalCond( GLFWcond cond ) +{ + // Signal condition + (void) pthread_cond_signal( (pthread_cond_t *) cond ); +} + + +//======================================================================== +// _glfwPlatformBroadcastCond() - Broadcast a condition to all waiting +// threads +//======================================================================== + +void _glfwPlatformBroadcastCond( GLFWcond cond ) +{ + // Broadcast condition + (void) pthread_cond_broadcast( (pthread_cond_t *) cond ); +} + + +//======================================================================== +// _glfwPlatformGetNumberOfProcessors() - Return the number of processors +// in the system. +//======================================================================== + +int _glfwPlatformGetNumberOfProcessors( void ) +{ + int n; + + // Get number of processors online + _glfw_numprocessors( n ); + return n; +} + diff -Nru glfw-2.6/lib/cocoa/cocoa_time.m glfw-2.7.2/lib/cocoa/cocoa_time.m --- glfw-2.6/lib/cocoa/cocoa_time.m 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/cocoa/cocoa_time.m 2010-08-08 15:37:03.000000000 +0000 @@ -0,0 +1,105 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Cocoa/NSOpenGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2009-2010 Camilla Berglund +// +// 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. +// +//======================================================================== + +#include "internal.h" + +#include + +//************************************************************************ +//**** Platform implementation functions **** +//************************************************************************ + +//======================================================================== +// Return timer value in seconds +//======================================================================== + +double _glfwPlatformGetTime( void ) +{ + return [NSDate timeIntervalSinceReferenceDate] - _glfwLibrary.Timer.t0; +} + +//======================================================================== +// Set timer value in seconds +//======================================================================== + +void _glfwPlatformSetTime( double time ) +{ + _glfwLibrary.Timer.t0 = [NSDate timeIntervalSinceReferenceDate] - time; +} + +//======================================================================== +// Put a thread to sleep for a specified amount of time +//======================================================================== + +void _glfwPlatformSleep( double time ) +{ + if( time == 0.0 ) + { + sched_yield(); + return; + } + + struct timeval currenttime; + struct timespec wait; + pthread_mutex_t mutex; + pthread_cond_t cond; + long dt_sec, dt_usec; + + // Not all pthread implementations have a pthread_sleep() function. We + // do it the portable way, using a timed wait for a condition that we + // will never signal. NOTE: The unistd functions sleep/usleep suspends + // the entire PROCESS, not a signle thread, which is why we can not + // use them to implement glfwSleep. + + // Set timeout time, relatvie to current time + gettimeofday( ¤ttime, NULL ); + dt_sec = (long) time; + dt_usec = (long) ((time - (double)dt_sec) * 1000000.0); + wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L; + if( wait.tv_nsec > 1000000000L ) + { + wait.tv_nsec -= 1000000000L; + dt_sec ++; + } + wait.tv_sec = currenttime.tv_sec + dt_sec; + + // Initialize condition and mutex objects + pthread_mutex_init( &mutex, NULL ); + pthread_cond_init( &cond, NULL ); + + // Do a timed wait + pthread_mutex_lock( &mutex ); + pthread_cond_timedwait( &cond, &mutex, &wait ); + pthread_mutex_unlock( &mutex ); + + // Destroy condition and mutex objects + pthread_mutex_destroy( &mutex ); + pthread_cond_destroy( &cond ); +} + diff -Nru glfw-2.6/lib/cocoa/cocoa_window.m glfw-2.7.2/lib/cocoa/cocoa_window.m --- glfw-2.6/lib/cocoa/cocoa_window.m 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/cocoa/cocoa_window.m 2011-07-27 13:32:57.000000000 +0000 @@ -0,0 +1,924 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Cocoa/NSOpenGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2009-2010 Camilla Berglund +// +// 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. +// +//======================================================================== + +#include "internal.h" + +#include + +//======================================================================== +// Delegate for window related notifications +// (but also used as an application delegate) +//======================================================================== + +@interface GLFWWindowDelegate : NSObject +@end + +@implementation GLFWWindowDelegate + +- (BOOL)windowShouldClose:(id)window +{ + if( _glfwWin.windowCloseCallback ) + { + if( !_glfwWin.windowCloseCallback() ) + { + return NO; + } + } + + // This is horribly ugly, but it works + glfwCloseWindow(); + return NO; +} + +- (void)windowDidResize:(NSNotification *)notification +{ + [_glfwWin.context update]; + + NSRect contentRect = + [_glfwWin.window contentRectForFrameRect:[_glfwWin.window frame]]; + _glfwWin.width = contentRect.size.width; + _glfwWin.height = contentRect.size.height; + + if( _glfwWin.windowSizeCallback ) + { + _glfwWin.windowSizeCallback( _glfwWin.width, _glfwWin.height ); + } +} + +- (void)windowDidMiniaturize:(NSNotification *)notification +{ + _glfwWin.iconified = GL_TRUE; +} + +- (void)windowDidDeminiaturize:(NSNotification *)notification +{ + _glfwWin.iconified = GL_FALSE; +} + +- (void)windowDidBecomeKey:(NSNotification *)notification +{ + _glfwWin.active = GL_TRUE; +} + +- (void)windowDidResignKey:(NSNotification *)notification +{ + _glfwWin.active = GL_FALSE; + _glfwInputDeactivation(); +} + +- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender +{ + if( _glfwWin.windowCloseCallback ) + { + if( !_glfwWin.windowCloseCallback() ) + { + return NSTerminateCancel; + } + } + + // This is horribly ugly, but it works + glfwCloseWindow(); + return NSTerminateCancel; +} + +@end + +// TODO: Need to find mappings for F13-F15, volume down/up/mute, and eject. +static const unsigned int MAC_TO_GLFW_KEYCODE_MAPPING[128] = +{ + /* 00 */ 'A', + /* 01 */ 'S', + /* 02 */ 'D', + /* 03 */ 'F', + /* 04 */ 'H', + /* 05 */ 'G', + /* 06 */ 'Z', + /* 07 */ 'X', + /* 08 */ 'C', + /* 09 */ 'V', + /* 0a */ -1, + /* 0b */ 'B', + /* 0c */ 'Q', + /* 0d */ 'W', + /* 0e */ 'E', + /* 0f */ 'R', + /* 10 */ 'Y', + /* 11 */ 'T', + /* 12 */ '1', + /* 13 */ '2', + /* 14 */ '3', + /* 15 */ '4', + /* 16 */ '6', + /* 17 */ '5', + /* 18 */ '=', + /* 19 */ '9', + /* 1a */ '7', + /* 1b */ '-', + /* 1c */ '8', + /* 1d */ '0', + /* 1e */ ']', + /* 1f */ 'O', + /* 20 */ 'U', + /* 21 */ '[', + /* 22 */ 'I', + /* 23 */ 'P', + /* 24 */ GLFW_KEY_ENTER, + /* 25 */ 'L', + /* 26 */ 'J', + /* 27 */ '\'', + /* 28 */ 'K', + /* 29 */ ';', + /* 2a */ '\\', + /* 2b */ ',', + /* 2c */ '/', + /* 2d */ 'N', + /* 2e */ 'M', + /* 2f */ '.', + /* 30 */ GLFW_KEY_TAB, + /* 31 */ GLFW_KEY_SPACE, + /* 32 */ '`', + /* 33 */ GLFW_KEY_BACKSPACE, + /* 34 */ -1, + /* 35 */ GLFW_KEY_ESC, + /* 36 */ GLFW_KEY_RSUPER, + /* 37 */ GLFW_KEY_LSUPER, + /* 38 */ GLFW_KEY_LSHIFT, + /* 39 */ GLFW_KEY_CAPS_LOCK, + /* 3a */ GLFW_KEY_LALT, + /* 3b */ GLFW_KEY_LCTRL, + /* 3c */ GLFW_KEY_RSHIFT, + /* 3d */ GLFW_KEY_RALT, + /* 3e */ GLFW_KEY_RCTRL, + /* 3f */ -1, /*Function*/ + /* 40 */ GLFW_KEY_F17, + /* 41 */ GLFW_KEY_KP_DECIMAL, + /* 42 */ -1, + /* 43 */ GLFW_KEY_KP_MULTIPLY, + /* 44 */ -1, + /* 45 */ GLFW_KEY_KP_ADD, + /* 46 */ -1, + /* 47 */ -1, /*KeypadClear*/ + /* 48 */ -1, /*VolumeUp*/ + /* 49 */ -1, /*VolumeDown*/ + /* 4a */ -1, /*Mute*/ + /* 4b */ GLFW_KEY_KP_DIVIDE, + /* 4c */ GLFW_KEY_KP_ENTER, + /* 4d */ -1, + /* 4e */ GLFW_KEY_KP_SUBTRACT, + /* 4f */ GLFW_KEY_F18, + /* 50 */ GLFW_KEY_F19, + /* 51 */ GLFW_KEY_KP_EQUAL, + /* 52 */ GLFW_KEY_KP_0, + /* 53 */ GLFW_KEY_KP_1, + /* 54 */ GLFW_KEY_KP_2, + /* 55 */ GLFW_KEY_KP_3, + /* 56 */ GLFW_KEY_KP_4, + /* 57 */ GLFW_KEY_KP_5, + /* 58 */ GLFW_KEY_KP_6, + /* 59 */ GLFW_KEY_KP_7, + /* 5a */ GLFW_KEY_F20, + /* 5b */ GLFW_KEY_KP_8, + /* 5c */ GLFW_KEY_KP_9, + /* 5d */ -1, + /* 5e */ -1, + /* 5f */ -1, + /* 60 */ GLFW_KEY_F5, + /* 61 */ GLFW_KEY_F6, + /* 62 */ GLFW_KEY_F7, + /* 63 */ GLFW_KEY_F3, + /* 64 */ GLFW_KEY_F8, + /* 65 */ GLFW_KEY_F9, + /* 66 */ -1, + /* 67 */ GLFW_KEY_F11, + /* 68 */ -1, + /* 69 */ GLFW_KEY_F13, + /* 6a */ GLFW_KEY_F16, + /* 6b */ GLFW_KEY_F14, + /* 6c */ -1, + /* 6d */ GLFW_KEY_F10, + /* 6e */ -1, + /* 6f */ GLFW_KEY_F12, + /* 70 */ -1, + /* 71 */ GLFW_KEY_F15, + /* 72 */ GLFW_KEY_INSERT, /*Help*/ + /* 73 */ GLFW_KEY_HOME, + /* 74 */ GLFW_KEY_PAGEUP, + /* 75 */ GLFW_KEY_DEL, + /* 76 */ GLFW_KEY_F4, + /* 77 */ GLFW_KEY_END, + /* 78 */ GLFW_KEY_F2, + /* 79 */ GLFW_KEY_PAGEDOWN, + /* 7a */ GLFW_KEY_F1, + /* 7b */ GLFW_KEY_LEFT, + /* 7c */ GLFW_KEY_RIGHT, + /* 7d */ GLFW_KEY_DOWN, + /* 7e */ GLFW_KEY_UP, + /* 7f */ -1, +}; + +//======================================================================== +// Converts a Mac OS X keycode to a GLFW keycode +//======================================================================== + +static int convertMacKeyCode( unsigned int macKeyCode ) +{ + if( macKeyCode >= 128 ) + { + return -1; + } + + // This treats keycodes as *positional*; that is, we'll return 'a' + // for the key left of 's', even on an AZERTY keyboard. The charInput + // function should still get 'q' though. + return MAC_TO_GLFW_KEYCODE_MAPPING[macKeyCode]; +} + +//======================================================================== +// Content view class for the GLFW window +//======================================================================== + +@interface GLFWContentView : NSView +@end + +@implementation GLFWContentView + +- (BOOL)isOpaque +{ + return YES; +} + +- (BOOL)canBecomeKeyView +{ + return YES; +} + +- (BOOL)acceptsFirstResponder +{ + return YES; +} + +- (void)mouseDown:(NSEvent *)event +{ + _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS ); +} + +- (void)mouseDragged:(NSEvent *)event +{ + [self mouseMoved:event]; +} + +- (void)mouseUp:(NSEvent *)event +{ + _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_RELEASE ); +} + +- (void)mouseMoved:(NSEvent *)event +{ + if( _glfwWin.mouseLock ) + { + _glfwInput.MousePosX += [event deltaX]; + _glfwInput.MousePosY += [event deltaY]; + } + else + { + NSPoint p = [event locationInWindow]; + + // Cocoa coordinate system has origin at lower left + _glfwInput.MousePosX = p.x; + _glfwInput.MousePosY = [[_glfwWin.window contentView] bounds].size.height - p.y; + } + + if( _glfwWin.mousePosCallback ) + { + _glfwWin.mousePosCallback( _glfwInput.MousePosX, _glfwInput.MousePosY ); + } +} + +- (void)rightMouseDown:(NSEvent *)event +{ + _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS ); +} + +- (void)rightMouseDragged:(NSEvent *)event +{ + [self mouseMoved:event]; +} + +- (void)rightMouseUp:(NSEvent *)event +{ + _glfwInputMouseClick( GLFW_MOUSE_BUTTON_RIGHT, GLFW_RELEASE ); +} + +- (void)otherMouseDown:(NSEvent *)event +{ + _glfwInputMouseClick( [event buttonNumber], GLFW_PRESS ); +} + +- (void)otherMouseDragged:(NSEvent *)event +{ + [self mouseMoved:event]; +} + +- (void)otherMouseUp:(NSEvent *)event +{ + _glfwInputMouseClick( [event buttonNumber], GLFW_RELEASE ); +} + +- (void)keyDown:(NSEvent *)event +{ + NSUInteger length; + NSString* characters; + int i, code = convertMacKeyCode( [event keyCode] ); + + if( code != -1 ) + { + _glfwInputKey( code, GLFW_PRESS ); + + if( [event modifierFlags] & NSCommandKeyMask ) + { + if( !_glfwWin.sysKeysDisabled ) + { + [super keyDown:event]; + } + } + else + { + characters = [event characters]; + length = [characters length]; + + for( i = 0; i < length; i++ ) + { + _glfwInputChar( [characters characterAtIndex:i], GLFW_PRESS ); + } + } + } +} + +- (void)flagsChanged:(NSEvent *)event +{ + unsigned int newModifierFlags = [event modifierFlags] | NSDeviceIndependentModifierFlagsMask; + int mode; + + if( newModifierFlags > _glfwWin.modifierFlags ) + { + mode = GLFW_PRESS; + } + else + { + mode = GLFW_RELEASE; + } + + _glfwWin.modifierFlags = newModifierFlags; + _glfwInputKey( MAC_TO_GLFW_KEYCODE_MAPPING[[event keyCode]], mode ); +} + +- (void)keyUp:(NSEvent *)event +{ + NSUInteger length; + NSString* characters; + int i, code = convertMacKeyCode( [event keyCode] ); + + if( code != -1 ) + { + _glfwInputKey( code, GLFW_RELEASE ); + + characters = [event characters]; + length = [characters length]; + + for( i = 0; i < length; i++ ) + { + _glfwInputChar( [characters characterAtIndex:i], GLFW_RELEASE ); + } + } +} + +- (void)scrollWheel:(NSEvent *)event +{ + _glfwInput.WheelPosFloating += [event deltaY]; + _glfwInput.WheelPos = lrint(_glfwInput.WheelPosFloating); + + if( _glfwWin.mouseWheelCallback ) + { + _glfwWin.mouseWheelCallback( _glfwInput.WheelPos ); + } +} + +@end + +//************************************************************************ +//**** Platform implementation functions **** +//************************************************************************ + +//======================================================================== +// Here is where the window is created, and the OpenGL rendering context is +// created +//======================================================================== + +int _glfwPlatformOpenWindow( int width, int height, + const _GLFWwndconfig *wndconfig, + const _GLFWfbconfig *fbconfig ) +{ + int colorBits; + + _glfwWin.pixelFormat = nil; + _glfwWin.window = nil; + _glfwWin.context = nil; + _glfwWin.delegate = nil; + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 + // Fail if OpenGL 3.3 or above was requested + if( wndconfig->glMajor > 3 || wndconfig->glMajor == 3 && wndconfig->glMinor > 2 ) + { + return GL_FALSE; + } + + if( wndconfig->glProfile ) + { + // Fail if a profile other than core was explicitly selected + if( wndconfig->glProfile != GLFW_OPENGL_CORE_PROFILE ) + { + return GL_FALSE; + } + } +#else + // Fail if OpenGL 3.0 or above was requested + if( wndconfig->glMajor > 2 ) + { + return GL_FALSE; + } +#endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/ + + _glfwWin.delegate = [[GLFWWindowDelegate alloc] init]; + if( _glfwWin.delegate == nil ) + { + return GL_FALSE; + } + + [NSApp setDelegate:_glfwWin.delegate]; + + // Mac OS X needs non-zero color size, so set resonable values + colorBits = fbconfig->redBits + fbconfig->greenBits + fbconfig->blueBits; + if( colorBits == 0 ) + { + colorBits = 24; + } + else if( colorBits < 15 ) + { + colorBits = 15; + } + + // Ignored hints: + // OpenGLDebug + // pending it meaning anything on Mac OS X + + // Don't use accumulation buffer support; it's not accelerated + // Aux buffers probably aren't accelerated either + + CFDictionaryRef fullscreenMode = NULL; + if( wndconfig->mode == GLFW_FULLSCREEN ) + { + fullscreenMode = + // I think it's safe to pass 0 to the refresh rate for this function + // rather than conditionalizing the code to call the version which + // doesn't specify refresh... + CGDisplayBestModeForParametersAndRefreshRateWithProperty( + CGMainDisplayID(), + colorBits + fbconfig->alphaBits, + width, + height, + wndconfig->refreshRate, + // Controversial, see macosx_fullscreen.m for discussion + kCGDisplayModeIsSafeForHardware, + NULL); + + width = [[(id)fullscreenMode objectForKey:(id)kCGDisplayWidth] intValue]; + height = [[(id)fullscreenMode objectForKey:(id)kCGDisplayHeight] intValue]; + } + + unsigned int styleMask = 0; + if( wndconfig->mode == GLFW_WINDOW ) + { + styleMask = NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask; + + if( !wndconfig->windowNoResize ) + { + styleMask |= NSResizableWindowMask; + } + } + else + { + styleMask = NSBorderlessWindowMask; + } + + _glfwWin.window = [[NSWindow alloc] + initWithContentRect:NSMakeRect(0, 0, width, height) + styleMask:styleMask + backing:NSBackingStoreBuffered + defer:NO]; + [_glfwWin.window setContentView:[[GLFWContentView alloc] init]]; + [_glfwWin.window setDelegate:_glfwWin.delegate]; + [_glfwWin.window setAcceptsMouseMovedEvents:YES]; + [_glfwWin.window center]; + + if( wndconfig->mode == GLFW_FULLSCREEN ) + { + CGCaptureAllDisplays(); + CGDisplaySwitchToMode( CGMainDisplayID(), fullscreenMode ); + } + + unsigned int attribute_count = 0; +#define ADD_ATTR(x) attributes[attribute_count++] = x +#define ADD_ATTR2(x, y) (void)({ ADD_ATTR(x); ADD_ATTR(y); }) +#define MAX_ATTRS 64 // urrgh + NSOpenGLPixelFormatAttribute attributes[MAX_ATTRS]; + + ADD_ATTR( NSOpenGLPFADoubleBuffer ); + + if( wndconfig->mode == GLFW_FULLSCREEN ) + { + ADD_ATTR( NSOpenGLPFAFullScreen ); + ADD_ATTR( NSOpenGLPFANoRecovery ); + ADD_ATTR2( NSOpenGLPFAScreenMask, + CGDisplayIDToOpenGLDisplayMask( CGMainDisplayID() ) ); + } + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 + if( wndconfig->glMajor > 2 ) + { + ADD_ATTR2( NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core ); + } +#endif /*MAC_OS_X_VERSION_MAX_ALLOWED*/ + + ADD_ATTR2( NSOpenGLPFAColorSize, colorBits ); + + if( fbconfig->alphaBits > 0) + { + ADD_ATTR2( NSOpenGLPFAAlphaSize, fbconfig->alphaBits ); + } + + if( fbconfig->depthBits > 0) + { + ADD_ATTR2( NSOpenGLPFADepthSize, fbconfig->depthBits ); + } + + if( fbconfig->stencilBits > 0) + { + ADD_ATTR2( NSOpenGLPFAStencilSize, fbconfig->stencilBits ); + } + + int accumBits = fbconfig->accumRedBits + fbconfig->accumGreenBits + + fbconfig->accumBlueBits + fbconfig->accumAlphaBits; + + if( accumBits > 0) + { + ADD_ATTR2( NSOpenGLPFAAccumSize, accumBits ); + } + + if( fbconfig->auxBuffers > 0) + { + ADD_ATTR2( NSOpenGLPFAAuxBuffers, fbconfig->auxBuffers ); + } + + if( fbconfig->stereo) + { + ADD_ATTR( NSOpenGLPFAStereo ); + } + + if( fbconfig->samples > 0) + { + ADD_ATTR2( NSOpenGLPFASampleBuffers, 1 ); + ADD_ATTR2( NSOpenGLPFASamples, fbconfig->samples ); + } + + ADD_ATTR(0); + + _glfwWin.pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; + if( _glfwWin.pixelFormat == nil ) + { + return GL_FALSE; + } + + _glfwWin.context = [[NSOpenGLContext alloc] initWithFormat:_glfwWin.pixelFormat + shareContext:nil]; + if( _glfwWin.context == nil ) + { + return GL_FALSE; + } + + [_glfwWin.window makeKeyAndOrderFront:nil]; + [_glfwWin.context setView:[_glfwWin.window contentView]]; + + if( wndconfig->mode == GLFW_FULLSCREEN ) + { + // TODO: Make this work on pre-Leopard systems + [[_glfwWin.window contentView] enterFullScreenMode:[NSScreen mainScreen] + withOptions:nil]; + } + + [_glfwWin.context makeCurrentContext]; + + NSPoint point = [[NSCursor currentCursor] hotSpot]; + _glfwInput.MousePosX = point.x; + _glfwInput.MousePosY = point.y; + + return GL_TRUE; +} + +//======================================================================== +// Properly kill the window / video display +//======================================================================== + +void _glfwPlatformCloseWindow( void ) +{ + [_glfwWin.window orderOut:nil]; + + if( _glfwWin.fullscreen ) + { + [[_glfwWin.window contentView] exitFullScreenModeWithOptions:nil]; + CGDisplaySwitchToMode( CGMainDisplayID(), + (CFDictionaryRef)_glfwLibrary.DesktopMode ); + CGReleaseAllDisplays(); + } + + [_glfwWin.pixelFormat release]; + _glfwWin.pixelFormat = nil; + + [NSOpenGLContext clearCurrentContext]; + [_glfwWin.context release]; + _glfwWin.context = nil; + + [_glfwWin.window setDelegate:nil]; + [NSApp setDelegate:nil]; + [_glfwWin.delegate release]; + _glfwWin.delegate = nil; + + [_glfwWin.window close]; + _glfwWin.window = nil; + + // TODO: Probably more cleanup +} + +//======================================================================== +// Set the window title +//======================================================================== + +void _glfwPlatformSetWindowTitle( const char *title ) +{ + [_glfwWin.window setTitle:[NSString stringWithCString:title + encoding:NSISOLatin1StringEncoding]]; +} + +//======================================================================== +// Set the window size +//======================================================================== + +void _glfwPlatformSetWindowSize( int width, int height ) +{ + [_glfwWin.window setContentSize:NSMakeSize(width, height)]; +} + +//======================================================================== +// Set the window position +//======================================================================== + +void _glfwPlatformSetWindowPos( int x, int y ) +{ + NSRect contentRect = [_glfwWin.window contentRectForFrameRect:[_glfwWin.window frame]]; + + // We assume here that the client code wants to position the window within the + // screen the window currently occupies + NSRect screenRect = [[_glfwWin.window screen] visibleFrame]; + contentRect.origin = NSMakePoint(screenRect.origin.x + x, + screenRect.origin.y + screenRect.size.height - + y - contentRect.size.height); + + [_glfwWin.window setFrame:[_glfwWin.window frameRectForContentRect:contentRect] + display:YES]; +} + +//======================================================================== +// Iconify the window +//======================================================================== + +void _glfwPlatformIconifyWindow( void ) +{ + [_glfwWin.window miniaturize:nil]; +} + +//======================================================================== +// Restore (un-iconify) the window +//======================================================================== + +void _glfwPlatformRestoreWindow( void ) +{ + [_glfwWin.window deminiaturize:nil]; +} + +//======================================================================== +// Swap buffers +//======================================================================== + +void _glfwPlatformSwapBuffers( void ) +{ + // ARP appears to be unnecessary, but this is future-proof + [_glfwWin.context flushBuffer]; +} + +//======================================================================== +// Set double buffering swap interval +//======================================================================== + +void _glfwPlatformSwapInterval( int interval ) +{ + GLint sync = interval; + [_glfwWin.context setValues:&sync forParameter:NSOpenGLCPSwapInterval]; +} + +//======================================================================== +// Write back window parameters into GLFW window structure +//======================================================================== + +void _glfwPlatformRefreshWindowParams( void ) +{ + GLint value; + + // Since GLFW 2.x doesn't understand screens, we use virtual screen zero + + [_glfwWin.pixelFormat getValues:&value + forAttribute:NSOpenGLPFAAccelerated + forVirtualScreen:0]; + _glfwWin.accelerated = value; + + [_glfwWin.pixelFormat getValues:&value + forAttribute:NSOpenGLPFAAlphaSize + forVirtualScreen:0]; + _glfwWin.alphaBits = value; + + // It seems that the color size includes the size of the alpha channel + [_glfwWin.pixelFormat getValues:&value + forAttribute:NSOpenGLPFAColorSize + forVirtualScreen:0]; + value -= _glfwWin.alphaBits; + _glfwWin.redBits = value / 3; + _glfwWin.greenBits = value / 3; + _glfwWin.blueBits = value / 3; + + [_glfwWin.pixelFormat getValues:&value + forAttribute:NSOpenGLPFADepthSize + forVirtualScreen:0]; + _glfwWin.depthBits = value; + + [_glfwWin.pixelFormat getValues:&value + forAttribute:NSOpenGLPFAStencilSize + forVirtualScreen:0]; + _glfwWin.stencilBits = value; + + [_glfwWin.pixelFormat getValues:&value + forAttribute:NSOpenGLPFAAccumSize + forVirtualScreen:0]; + _glfwWin.accumRedBits = value / 3; + _glfwWin.accumGreenBits = value / 3; + _glfwWin.accumBlueBits = value / 3; + + // TODO: Figure out what to set this value to + _glfwWin.accumAlphaBits = 0; + + [_glfwWin.pixelFormat getValues:&value + forAttribute:NSOpenGLPFAAuxBuffers + forVirtualScreen:0]; + _glfwWin.auxBuffers = value; + + [_glfwWin.pixelFormat getValues:&value + forAttribute:NSOpenGLPFAStereo + forVirtualScreen:0]; + _glfwWin.stereo = value; + + [_glfwWin.pixelFormat getValues:&value + forAttribute:NSOpenGLPFASamples + forVirtualScreen:0]; + _glfwWin.samples = value; + + _glfwWin.glDebug = GL_FALSE; +} + +//======================================================================== +// Poll for new window and input events +//======================================================================== + +void _glfwPlatformPollEvents( void ) +{ + NSEvent *event; + + do + { + event = [NSApp nextEventMatchingMask:NSAnyEventMask + untilDate:[NSDate distantPast] + inMode:NSDefaultRunLoopMode + dequeue:YES]; + + if (event) + { + [NSApp sendEvent:event]; + } + } + while (event); + + [_glfwLibrary.AutoreleasePool drain]; + _glfwLibrary.AutoreleasePool = [[NSAutoreleasePool alloc] init]; +} + +//======================================================================== +// Wait for new window and input events +//======================================================================== + +void _glfwPlatformWaitEvents( void ) +{ + // I wanted to pass NO to dequeue:, and rely on PollEvents to + // dequeue and send. For reasons not at all clear to me, passing + // NO to dequeue: causes this method never to return. + NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask + untilDate:[NSDate distantFuture] + inMode:NSDefaultRunLoopMode + dequeue:YES]; + [NSApp sendEvent:event]; + + _glfwPlatformPollEvents(); +} + +//======================================================================== +// Hide mouse cursor (lock it) +//======================================================================== + +void _glfwPlatformHideMouseCursor( void ) +{ + [NSCursor hide]; + CGAssociateMouseAndMouseCursorPosition( false ); +} + +//======================================================================== +// Show mouse cursor (unlock it) +//======================================================================== + +void _glfwPlatformShowMouseCursor( void ) +{ + [NSCursor unhide]; + CGAssociateMouseAndMouseCursorPosition( true ); +} + +//======================================================================== +// Set physical mouse cursor position +//======================================================================== + +void _glfwPlatformSetMouseCursorPos( int x, int y ) +{ + // The library seems to assume that after calling this the mouse won't move, + // but obviously it will, and escape the app's window, and activate other apps, + // and other badness in pain. I think the API's just silly, but maybe I'm + // misunderstanding it... + + // Also, (x, y) are window coords... + + // Also, it doesn't seem possible to write this robustly without + // calculating the maximum y coordinate of all screens, since Cocoa's + // "global coordinates" are upside down from CG's... + + // Without this (once per app run, but it's convenient to do it here) + // events will be suppressed for a default of 0.25 seconds after we + // move the cursor. + CGSetLocalEventsSuppressionInterval( 0.0 ); + + NSPoint localPoint = NSMakePoint( x, y ); + NSPoint globalPoint = [_glfwWin.window convertBaseToScreen:localPoint]; + CGPoint mainScreenOrigin = CGDisplayBounds( CGMainDisplayID() ).origin; + double mainScreenHeight = CGDisplayBounds( CGMainDisplayID() ).size.height; + CGPoint targetPoint = CGPointMake( globalPoint.x - mainScreenOrigin.x, + mainScreenHeight - globalPoint.y - mainScreenOrigin.y ); + CGDisplayMoveCursorToPoint( CGMainDisplayID(), targetPoint ); +} + diff -Nru glfw-2.6/lib/cocoa/libglfw.pc.in glfw-2.7.2/lib/cocoa/libglfw.pc.in --- glfw-2.6/lib/cocoa/libglfw.pc.in 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/cocoa/libglfw.pc.in 2010-08-08 14:42:20.000000000 +0000 @@ -0,0 +1,11 @@ +prefix=@PREFIX@ +exec_prefix=@PREFIX@ +libdir=@PREFIX@/lib +includedir=@PREFIX@/include + +Name: GLFW +Description: A portable framework for OpenGL development +Version: 2.7 +URL: http://www.glfw.org/ +Libs: -L${libdir} -lglfw -framework Cocoa -framework OpenGL +Cflags: -I${includedir} diff -Nru glfw-2.6/lib/cocoa/Makefile.cocoa glfw-2.7.2/lib/cocoa/Makefile.cocoa --- glfw-2.6/lib/cocoa/Makefile.cocoa 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/cocoa/Makefile.cocoa 2011-07-27 12:33:31.000000000 +0000 @@ -0,0 +1,172 @@ +########################################################################## +# Makefile for GLFW on Cocoa on Mac OS X using Apple GCC +#------------------------------------------------------------------------- +# To compile GLFW using this makefile, run: +# make -f Makefile.cocoa +########################################################################## + +########################################################################## +# Installation prefix (default to /usr/local) +########################################################################## +PREFIX ?= /usr/local + + +########################################################################## +# Default: Build GLFW static and shared library +########################################################################## +all: libglfw.a libglfw.dylib + + +########################################################################## +# Compiler settings +########################################################################## +CC ?= cc +CFLAGS ?= -O2 -g +CFLAGS += -c -I. -I.. -Wall -fno-common + + +########################################################################## +# Library builder settings +########################################################################## +AR = ar +SED = sed +INSTALL = install +ARFLAGS = -rcs +RANLIB = ranlib +DYLIBFLAGS = -framework Cocoa -framework OpenGL \ + -dynamiclib -Wl,-single_module -compatibility_version 1 \ + -current_version 1 -install_name @executable_path/libglfw.dylib +HEADERS = ../../include/GL/glfw.h ../internal.h platform.h + + +########################################################################## +# Install GLFW header and static library +########################################################################## +install: libglfw.a libglfw.pc + $(INSTALL) -d $(PREFIX)/lib + $(INSTALL) -c -m 644 libglfw.a $(PREFIX)/lib/libglfw.a + $(RANLIB) $(PREFIX)/lib/libglfw.a + $(INSTALL) -d $(PREFIX)/include/GL + $(INSTALL) -c -m 644 ../../include/GL/glfw.h $(PREFIX)/include/GL/glfw.h + $(INSTALL) -d $(PREFIX)/lib/pkgconfig + $(INSTALL) -c -m 644 libglfw.pc $(PREFIX)/lib/pkgconfig/libglfw.pc + + +########################################################################## +# Object files for the GLFW library +########################################################################## +OBJS = \ + enable.o \ + fullscreen.o \ + glext.o \ + image.o \ + init.o \ + input.o \ + joystick.o \ + stream.o \ + tga.o \ + thread.o \ + time.o \ + window.o \ + cocoa_enable.o \ + cocoa_fullscreen.o \ + cocoa_glext.o \ + cocoa_init.o \ + cocoa_joystick.o \ + cocoa_thread.o \ + cocoa_time.o \ + cocoa_window.o + + +########################################################################## +# Rule for building libglfw.pc +########################################################################## +libglfw.pc: libglfw.pc.in + $(SED) -e 's,\@PREFIX\@,$(PREFIX),' libglfw.pc.in > libglfw.pc + + +########################################################################## +# Rule for building static library +########################################################################## +libglfw.a: $(OBJS) + $(AR) $(ARFLAGS) $@ $(OBJS) + $(RANLIB) $@ + + +########################################################################## +# Rule for building shared library +########################################################################## +libglfw.dylib: $(OBJS) + $(CC) -o $@ $(DYLIBFLAGS) $(OBJS) + + +########################################################################## +# Rule for cleaning up generated files +########################################################################## +clean: + rm -f $(OBJS) libglfw.a libglfw.dylib libglfw.pc + + +########################################################################## +# Rules for building library object files +########################################################################## +enable.o: ../enable.c $(HEADERS) + $(CC) $(CFLAGS) -o $@ ../enable.c + +fullscreen.o: ../fullscreen.c $(HEADERS) + $(CC) $(CFLAGS) -o $@ ../fullscreen.c + +glext.o: ../glext.c $(HEADERS) + $(CC) $(CFLAGS) -o $@ ../glext.c + +image.o: ../image.c $(HEADERS) + $(CC) $(CFLAGS) -o $@ ../image.c + +init.o: ../init.c $(HEADERS) + $(CC) $(CFLAGS) -o $@ ../init.c + +input.o: ../input.c $(HEADERS) + $(CC) $(CFLAGS) -o $@ ../input.c + +joystick.o: ../joystick.c $(HEADERS) + $(CC) $(CFLAGS) -o $@ ../joystick.c + +stream.o: ../stream.c $(HEADERS) + $(CC) $(CFLAGS) -o $@ ../stream.c + +tga.o: ../tga.c $(HEADERS) + $(CC) $(CFLAGS) -o $@ ../tga.c + +thread.o: ../thread.c $(HEADERS) + $(CC) $(CFLAGS) -o $@ ../thread.c + +time.o: ../time.c $(HEADERS) + $(CC) $(CFLAGS) -o $@ ../time.c + +window.o: ../window.c $(HEADERS) + $(CC) $(CFLAGS) -o $@ ../window.c + +cocoa_enable.o: cocoa_enable.m $(HEADERS) + $(CC) $(CFLAGS) -o $@ cocoa_enable.m + +cocoa_fullscreen.o: cocoa_fullscreen.m $(HEADERS) + $(CC) $(CFLAGS) -o $@ cocoa_fullscreen.m + +cocoa_glext.o: cocoa_glext.m $(HEADERS) + $(CC) $(CFLAGS) -o $@ cocoa_glext.m + +cocoa_init.o: cocoa_init.m $(HEADERS) + $(CC) $(CFLAGS) -o $@ cocoa_init.m + +cocoa_joystick.o: cocoa_joystick.m $(HEADERS) + $(CC) $(CFLAGS) -o $@ cocoa_joystick.m + +cocoa_thread.o: cocoa_thread.c $(HEADERS) + $(CC) $(CFLAGS) -o $@ cocoa_thread.c + +cocoa_time.o: cocoa_time.m $(HEADERS) + $(CC) $(CFLAGS) -o $@ cocoa_time.m + +cocoa_window.o: cocoa_window.m $(HEADERS) + $(CC) $(CFLAGS) -o $@ cocoa_window.m + diff -Nru glfw-2.6/lib/cocoa/platform.h glfw-2.7.2/lib/cocoa/platform.h --- glfw-2.6/lib/cocoa/platform.h 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/cocoa/platform.h 2010-08-08 15:37:03.000000000 +0000 @@ -0,0 +1,252 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Cocoa/NSOpenGL +// API Version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2009-2010 Camilla Berglund +// +// 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 _platform_h_ +#define _platform_h_ + + +// This is the Mac OS X version of GLFW +#define _GLFW_MAC_OS_X + +#if defined(__OBJC__) +#import +#else +typedef void *id; +#endif + +#include + +#include "../../include/GL/glfw.h" + + +#ifndef GL_VERSION_3_0 + +typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint); + +#endif /*GL_VERSION_3_0*/ + + +//======================================================================== +// GLFW platform specific types +//======================================================================== + +//------------------------------------------------------------------------ +// Pointer length integer +//------------------------------------------------------------------------ +typedef intptr_t GLFWintptr; + +//------------------------------------------------------------------------ +// Window structure +//------------------------------------------------------------------------ +typedef struct _GLFWwin_struct _GLFWwin; + +struct _GLFWwin_struct { + +// ========= PLATFORM INDEPENDENT MANDATORY PART ========================= + + // User callback functions + GLFWwindowsizefun windowSizeCallback; + GLFWwindowclosefun windowCloseCallback; + GLFWwindowrefreshfun windowRefreshCallback; + GLFWmousebuttonfun mouseButtonCallback; + GLFWmouseposfun mousePosCallback; + GLFWmousewheelfun mouseWheelCallback; + GLFWkeyfun keyCallback; + GLFWcharfun charCallback; + + // User selected window settings + int fullscreen; // Fullscreen flag + int mouseLock; // Mouse-lock flag + int autoPollEvents; // Auto polling flag + int sysKeysDisabled; // System keys disabled flag + int windowNoResize; // Resize- and maximize gadgets disabled flag + int refreshRate; // Vertical monitor refresh rate + + // Window status & parameters + int opened; // Flag telling if window is opened or not + int active; // Application active flag + int iconified; // Window iconified flag + int width, height; // Window width and heigth + int accelerated; // GL_TRUE if window is HW accelerated + + // Framebuffer attributes + int redBits; + int greenBits; + int blueBits; + int alphaBits; + int depthBits; + int stencilBits; + int accumRedBits; + int accumGreenBits; + int accumBlueBits; + int accumAlphaBits; + int auxBuffers; + int stereo; + int samples; + + // OpenGL extensions and context attributes + int has_GL_SGIS_generate_mipmap; + int has_GL_ARB_texture_non_power_of_two; + int glMajor, glMinor, glRevision; + int glForward, glDebug, glProfile; + + PFNGLGETSTRINGIPROC GetStringi; + +// ========= PLATFORM SPECIFIC PART ====================================== + + id window; + id pixelFormat; + id context; + id delegate; + unsigned int modifierFlags; +}; + +GLFWGLOBAL _GLFWwin _glfwWin; + + +//------------------------------------------------------------------------ +// Library global data +//------------------------------------------------------------------------ +GLFWGLOBAL struct { + +// ========= PLATFORM INDEPENDENT MANDATORY PART ========================= + + // Window opening hints + _GLFWhints hints; + +// ========= PLATFORM SPECIFIC PART ====================================== + + // Timer data + struct { + double t0; + } Timer; + + // dlopen handle for dynamically-loading extension function pointers + void *OpenGLFramework; + + int Unbundled; + + id DesktopMode; + + id AutoreleasePool; + +} _glfwLibrary; + + +//------------------------------------------------------------------------ +// User input status (some of this should go in _GLFWwin) +//------------------------------------------------------------------------ +GLFWGLOBAL struct { + +// ========= PLATFORM INDEPENDENT MANDATORY PART ========================= + + // Mouse status + int MousePosX, MousePosY; + int WheelPos; + char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ]; + + // Keyboard status + char Key[ GLFW_KEY_LAST+1 ]; + int LastChar; + + // User selected settings + int StickyKeys; + int StickyMouseButtons; + int KeyRepeat; + + +// ========= PLATFORM SPECIFIC PART ====================================== + + double WheelPosFloating; + +} _glfwInput; + +//------------------------------------------------------------------------ +// Thread information +//------------------------------------------------------------------------ +typedef struct _GLFWthread_struct _GLFWthread; + +// Thread record (one for each thread) +struct _GLFWthread_struct { + + // Pointer to previous and next threads in linked list + _GLFWthread *Previous, *Next; + + // GLFW user side thread information + GLFWthread ID; + GLFWthreadfun Function; + + // System side thread information + pthread_t PosixID; +}; + +// General thread information +GLFWGLOBAL struct { + + // Critical section lock + pthread_mutex_t CriticalSection; + + // Next thread ID to use (increments for every created thread) + GLFWthread NextID; + + // First thread in linked list (always the main thread) + _GLFWthread First; + +} _glfwThrd; + + +//======================================================================== +// Macros for encapsulating critical code sections (i.e. making parts +// of GLFW thread safe) +//======================================================================== + +// Define so we can use the same thread code as X11 +#define _glfw_numprocessors(n) { \ + int mib[2], ncpu; \ + size_t len = 1; \ + mib[0] = CTL_HW; \ + mib[1] = HW_NCPU; \ + n = 1; \ + if( sysctl( mib, 2, &ncpu, &len, NULL, 0 ) != -1 ) \ + { \ + if( len > 0 ) \ + { \ + n = ncpu; \ + } \ + } \ +} + +// Thread list management +#define ENTER_THREAD_CRITICAL_SECTION \ +pthread_mutex_lock( &_glfwThrd.CriticalSection ); +#define LEAVE_THREAD_CRITICAL_SECTION \ +pthread_mutex_unlock( &_glfwThrd.CriticalSection ); + + +#endif // _platform_h_ diff -Nru glfw-2.6/lib/dos/dos_enable.c glfw-2.7.2/lib/dos/dos_enable.c --- glfw-2.6/lib/dos/dos_enable.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/dos/dos_enable.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: dos_enable.c -// Platform: DOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// _glfwPlatformEnableSystemKeys() - Enable system keys -// _glfwPlatformDisableSystemKeys() - Disable system keys -//======================================================================== - -void _glfwPlatformEnableSystemKeys( void ) -{ - // Not supported under DOS (yet) -} - -void _glfwPlatformDisableSystemKeys( void ) -{ - // Not supported under DOS (yet) -} diff -Nru glfw-2.6/lib/dos/dos_events.c glfw-2.7.2/lib/dos/dos_events.c --- glfw-2.6/lib/dos/dos_events.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/dos/dos_events.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,173 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: dos_events.c -// Platform: DOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - -//======================================================================== -// Global variables -//======================================================================== - -// Event buffer -#define _GLFW_EVENT_BUFFER_SIZE 1024 - -static volatile struct { - volatile int Start, End; - volatile _GLFWdosevent *Event; -} _glfwEventBuffer; - -static int _glfwEventsInitialized = 0; - - - -//************************************************************************ -//**** GLFW internal functions **** -//************************************************************************ - -//======================================================================== -// _glfwWaitNextEvent() - Wait for an event to appear in the event FIFO -// NOTE: Must not be called from an interrupt routine -//======================================================================== - -void _glfwWaitNextEvent( void ) -{ - int noevent = 1; - - while( noevent ) - { - DISABLE(); - noevent = ( _glfwEventBuffer.Start == _glfwEventBuffer.End ); - ENABLE(); - // Wait for an interrupt to happen?... - } -} - - -//======================================================================== -// _glfwGetNextEvent() - Get an event from the event FIFO -// NOTE: Must not be called from an interrupt routine -//======================================================================== - -int _glfwGetNextEvent( _GLFWdosevent *event ) -{ - DISABLE(); - - if( _glfwEventBuffer.Start == _glfwEventBuffer.End ) - { - ENABLE(); - return 0; - } - - *event = _glfwEventBuffer.Event[ _glfwEventBuffer.Start ++ ]; - if( _glfwEventBuffer.Start >= _GLFW_EVENT_BUFFER_SIZE ) - { - _glfwEventBuffer.Start = 0; - } - - ENABLE(); - - return 1; -} - - -//======================================================================== -// _glfwPostDOSEvent() - Put an event onto the event FIFO -// NOTE: Must only be called from an interrupt routine -//======================================================================== - -void _glfwPostDOSEvent( _GLFWdosevent *event ) -{ - // Add event - _glfwEventBuffer.Event[ _glfwEventBuffer.End ++ ] = *event; - - // End of FIFO buffer? - if( _glfwEventBuffer.End >= _GLFW_EVENT_BUFFER_SIZE ) - _glfwEventBuffer.End = 0; - - // If the buffer is full, drop the oldest event - if( _glfwEventBuffer.End == _glfwEventBuffer.Start) - { - _glfwEventBuffer.Start ++; - if( _glfwEventBuffer.Start >= _GLFW_EVENT_BUFFER_SIZE ) - _glfwEventBuffer.Start = 0; - } -} ENDOFUNC(_glfwPostDOSEvent) - - -//======================================================================== -// _glfwInitEvents() - Initialize event management functions and the FIFO -//======================================================================== - -int _glfwInitEvents( void ) -{ - int fifosize; - - // Allocate memory for the event FIFO buffer - fifosize = _GLFW_EVENT_BUFFER_SIZE * sizeof(_GLFWdosevent); - _glfwEventBuffer.Event = malloc( fifosize ); - if( !_glfwEventBuffer.Event ) - { - return 0; - } - - // Lock data & functions - LOCKBUFF( _glfwEventBuffer.Event, fifosize ); - LOCKDATA( _glfwEventBuffer ); - LOCKFUNC( _glfwPostDOSEvent ); - - // Initialize event FIFO - _glfwEventBuffer.Start = _glfwEventBuffer.End = 0; - - _glfwEventsInitialized = 1; - - return 1; -} - - -//======================================================================== -// _glfwTerminateEvents() - Terminate event management -//======================================================================== - -void _glfwTerminateEvents( void ) -{ - if( !_glfwEventsInitialized ) - { - return; - } - - _glfwEventsInitialized = 0; - - // Free memory for the event FIFO buffer - if( _glfwEventBuffer.Event ) - { - free( (void *) _glfwEventBuffer.Event ); - _glfwEventBuffer.Event = NULL; - } -} diff -Nru glfw-2.6/lib/dos/dos_fullscreen.c glfw-2.7.2/lib/dos/dos_fullscreen.c --- glfw-2.6/lib/dos/dos_fullscreen.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/dos/dos_fullscreen.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,101 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: dos_fullscreen.c -// Platform: DOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - -//************************************************************************ -//**** GLFW internal functions **** -//************************************************************************ - -//======================================================================== -// _glfwBPP2RGB() - Convert BPP to RGB bits (based on "best guess") -//======================================================================== - -static void _glfwBPP2RGB( int bpp, int *r, int *g, int *b ) -{ - int delta; - int bpp2; - - // Special case: bpp = 32 - if( bpp == 32 ) bpp = 24; - - // Convert "bits per pixel" to red, green & blue sizes - *r = *g = *b = bpp / 3; - delta = bpp - (*r * 3); - if( delta >= 1 ) - { - *g = *g + 1; - } - if( delta == 2 ) - { - *r = *r + 1; - } -} - - - - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// _glfwPlatformGetVideoModes() - List available video modes -//======================================================================== - -int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount ) -{ - if( maxcount <= 0 ) return 0; - - // Dummy... - list[0].Width = 640; - list[0].Height = 480; - list[0].RedBits = 5; - list[0].GreenBits = 6; - list[0].BlueBits = 5; - - return 1; -} - - -//======================================================================== -// _glfwPlatformGetDesktopMode() - Get the desktop video mode -//======================================================================== - -void _glfwPlatformGetDesktopMode( GLFWvidmode *mode ) -{ - // Dummy... - mode->Width = 640; - mode->Height = 480; - mode->RedBits = 5; - mode->GreenBits = 6; - mode->BlueBits = 5; -} diff -Nru glfw-2.6/lib/dos/dos_glext.c glfw-2.7.2/lib/dos/dos_glext.c --- glfw-2.6/lib/dos/dos_glext.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/dos/dos_glext.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: dos_glext.c -// Platform: DOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// _glfwPlatformExtensionSupported() - Check if an OpenGL extension is -// available at runtime -//======================================================================== - -int _glfwPlatformExtensionSupported( const char *extension ) -{ - // TODO - return GL_FALSE; -} - - -//======================================================================== -// _glfwPlatformGetProcAddress() - Get the function pointer to an OpenGL -// function -//======================================================================== - -void * _glfwPlatformGetProcAddress( const char *procname ) -{ - // TODO - return NULL; -} diff -Nru glfw-2.6/lib/dos/dos_init.c glfw-2.7.2/lib/dos/dos_init.c --- glfw-2.6/lib/dos/dos_init.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/dos/dos_init.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: dos_init.c -// Platform: DOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - - -//************************************************************************ -//**** GLFW internal functions **** -//************************************************************************ - -//======================================================================== -// _glfwTerminate_atexit() - Terminate GLFW when exiting application -//======================================================================== - -void _glfwTerminate_atexit( void ) -{ - glfwTerminate(); -} - - - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// _glfwPlatformInit() - Initialize various GLFW state -//======================================================================== - -int _glfwPlatformInit( void ) -{ - // Initialize thread package - if( !_glfwInitThreads() ) - { - return GL_FALSE; - } - - // Start the timer - if( !_glfwInitTimer() ) - { - _glfwTerminateThreads(); - return GL_FALSE; - } - - // Initialize joysticks - _glfwInitJoysticks(); - - // Install atexit() routine - atexit( _glfwTerminate_atexit ); - - return GL_TRUE; -} - - -//======================================================================== -// _glfwPlatformTerminate() - Close window and kill all threads -//======================================================================== - -int _glfwPlatformTerminate( void ) -{ - // Only the main thread is allowed to do this... - // TODO - - // Close OpenGL window - glfwCloseWindow(); - - // Terminate joysticks - _glfwTerminateJoysticks(); - - // Kill timer - _glfwTerminateTimer(); - - // Kill thread package - _glfwTerminateThreads(); - - return GL_TRUE; -} diff -Nru glfw-2.6/lib/dos/dos_irq.s glfw-2.7.2/lib/dos/dos_irq.s --- glfw-2.6/lib/dos/dos_irq.s 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/dos/dos_irq.s 1970-01-01 00:00:00.000000000 +0000 @@ -1,246 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: dos_irq.s -// Platform: DOS -// API version: 2.4 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2004 Camilla Berglund -// -// 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. -// -//======================================================================== - - .file "dos_irq.S" - - .text - - -#define IRQ_STACK_SIZE 16384 - -#define IRQ_WRAPPER_LEN (__irq_wrapper_1-__irq_wrapper_0) -#define IRQ_OLD (__irq_old_0-__irq_wrapper_0) -#define IRQ_HOOK (__irq_hook_0-__irq_wrapper_0) -#define IRQ_STACK (__irq_stack_0-__irq_wrapper_0) - - -//======================================================================== -// common -//======================================================================== - - .balign 4 -common: - movw $0x0400, %ax - int $0x31 - - movl %ss:8(%ebp), %ebx - cmpl $15, %ebx - jbe 0f -fail: - orl $-1, %eax - popl %edi - popl %ebx - leave - ret - - 0: - movl %ebx, %edi - imull $IRQ_WRAPPER_LEN, %edi - addl $__irq_wrapper_0, %edi - - cmpb $7, %bl - jbe 1f - movb %dl, %dh - subb $8, %dh - 1: - addb %dh, %bl - ret - - -//======================================================================== -// _glfwInstallDOSIrq() -//======================================================================== - - .balign 4 - .global __glfwInstallDOSIrq -__glfwInstallDOSIrq: - pushl %ebp - movl %esp, %ebp - pushl %ebx - pushl %edi - - call common - - cmpl $0, IRQ_HOOK(%edi) - jne fail - - pushl $IRQ_WRAPPER_LEN - pushl %edi - call __go32_dpmi_lock_code - addl $8, %esp - testl %eax, %eax - jnz fail - -/* OLD >> - pushl $IRQ_STACK_SIZE - call _pc_malloc - popl %edx - testl %eax, %eax - jz fail - addl %edx, %eax - movl %eax, IRQ_STACK(%edi) -<< OLD */ - -/* MG: NEW >> */ - pushl $IRQ_STACK_SIZE - call _malloc - popl %edx - testl %eax, %eax - jz fail - - pushl %edx - pushl %eax - call __go32_dpmi_lock_data - addl $8, %esp - testl %eax, %eax - jnz fail - subl $8, %esp - popl %eax - popl %edx - - addl %edx, %eax - movl %eax, IRQ_STACK(%edi) -/* << NEW */ - - movl ___djgpp_ds_alias, %eax - movl %eax, IRQ_STACK+4(%edi) - - movl %ss:12(%ebp), %eax - movl %eax, IRQ_HOOK(%edi) - - movw $0x0204, %ax - int $0x31 - movl %edx, IRQ_OLD(%edi) - movw %cx, IRQ_OLD+4(%edi) - movw $0x0205, %ax - movl %edi, %edx - movl %cs, %ecx - int $0x31 - -done: - xorl %eax, %eax - popl %edi - popl %ebx - leave - ret - - -//======================================================================== -// _glfwRemoveDOSIrq() -//======================================================================== - .balign 4 - .global __glfwRemoveDOSIrq -__glfwRemoveDOSIrq: - pushl %ebp - movl %esp, %ebp - pushl %ebx - pushl %edi - - call common - - cmpl $0, IRQ_HOOK(%edi) - je fail - - movl $0, IRQ_HOOK(%edi) - - movw $0x0205, %ax - movl IRQ_OLD(%edi), %edx - movl IRQ_OLD+4(%edi), %ecx - int $0x31 - - movl IRQ_STACK(%edi), %eax - subl $IRQ_STACK_SIZE, %eax - pushl %eax - call _free - popl %eax - - jmp done - - -//======================================================================== -// IRQ wrapper code for all 16 different IRQs -//======================================================================== - -#define WRAPPER(x) ; \ - .balign 4 ; \ -__irq_wrapper_##x: ; \ - pushal ; \ - pushl %ds ; \ - pushl %es ; \ - pushl %fs ; \ - pushl %gs ; \ - movl %ss, %ebx ; \ - movl %esp, %esi ; \ - lss %cs:__irq_stack_##x, %esp ; \ - pushl %ss ; \ - pushl %ss ; \ - popl %es ; \ - popl %ds ; \ - movl ___djgpp_dos_sel, %fs ; \ - pushl %fs ; \ - popl %gs ; \ - call *__irq_hook_##x ; \ - movl %ebx, %ss ; \ - movl %esi, %esp ; \ - testl %eax, %eax ; \ - popl %gs ; \ - popl %fs ; \ - popl %es ; \ - popl %ds ; \ - popal ; \ - jz __irq_ignore_##x ; \ -__irq_bypass_##x: ; \ - ljmp *%cs:__irq_old_##x ; \ -__irq_ignore_##x: ; \ - iret ; \ - .balign 4 ; \ -__irq_old_##x: ; \ - .long 0, 0 ; \ -__irq_hook_##x: ; \ - .long 0 ; \ -__irq_stack_##x: ; \ - .long 0, 0 - - WRAPPER(0); - WRAPPER(1); - WRAPPER(2); - WRAPPER(3); - WRAPPER(4); - WRAPPER(5); - WRAPPER(6); - WRAPPER(7); - WRAPPER(8); - WRAPPER(9); - WRAPPER(10); - WRAPPER(11); - WRAPPER(12); - WRAPPER(13); - WRAPPER(14); - WRAPPER(15); diff -Nru glfw-2.6/lib/dos/dos_joystick.c glfw-2.7.2/lib/dos/dos_joystick.c --- glfw-2.6/lib/dos/dos_joystick.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/dos/dos_joystick.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,94 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: dos_joystick.c -// Platform: DOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - -//************************************************************************ -//**** GLFW internal functions **** -//************************************************************************ - -//======================================================================== -// _glfwInitJoysticks() - Initialize joystick interface -//======================================================================== - -void _glfwInitJoysticks( void ) -{ - // TODO -} - - -//======================================================================== -// _glfwTerminateJoysticks() - Close all opened joystick handles -//======================================================================== - -void _glfwTerminateJoysticks( void ) -{ - // TODO -} - - - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// _glfwPlatformGetJoystickParam() - Determine joystick capabilities -//======================================================================== - -int _glfwPlatformGetJoystickParam( int joy, int param ) -{ - // TODO - return 0; -} - - -//======================================================================== -// _glfwPlatformGetJoystickPos() - Get joystick axis positions -//======================================================================== - -int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes ) -{ - // TODO - return 0; -} - - -//======================================================================== -// _glfwPlatformGetJoystickButtons() - Get joystick button states -//======================================================================== - -int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, - int numbuttons ) -{ - // TODO - return 0; -} diff -Nru glfw-2.6/lib/dos/dos_keyboard.c glfw-2.7.2/lib/dos/dos_keyboard.c --- glfw-2.6/lib/dos/dos_keyboard.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/dos/dos_keyboard.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,694 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: dos_keyboard.c -// Platform: DOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - -//======================================================================== -// Most of the code in this source file is based on two sources of -// information: -// 1) The Allegro DOS keyboard driver (allegro\src\dos\dkeybd.c) -// 2) The document "IBM PC KEYBOARD INFORMATION FOR SOFTWARE DEVELOPERS" -// by Chris Giese. -//======================================================================== - -//======================================================================== -// Unicode in GLFW for DOS -// ======================= -// -// Keyboard mapping tables in GLFW for DOS use Unicode encoding. The codes -// are 16-bit unsigned integers, and thus do not cover the entire Unicode -// standard (but a great deal is covered). -// -// Keys or characters that are not supported by GLFW (for instance the -// PrtScr or Windows keys that are found on most PC keyboards) are coded -// with 0xFFFF ("not a character" according to the Unicode standard). -// -// GLFW special keys, as defined in glfw.h (e.g. GLFW_KEY_LSHIFT) are -// encoded in the private area of the Unicode standard (i.e. codes in the -// range E000-F8FF). The encoding is as follows: -// -// unicode = 0xE000 + glfw_key - GLFW_KEY_SPECIAL; -// -// Every key in the keyboard matrix has a description consisting of four -// entries: Normal, Shift, Caps, and AltGr. -//======================================================================== - -//======================================================================== -// Definitions -//======================================================================== - -// Keyboard interrupt number -#define KEYB_IRQ 1 - -// Qualifier flags -#define QUAL_SCROLOCK 0x0001 // Same bits as for controller cmd 0xED -#define QUAL_NUMLOCK 0x0002 // (set leds) -#define QUAL_CAPSLOCK 0x0004 // --"-- -#define QUAL_LSHIFT 0x0008 -#define QUAL_RSHIFT 0x0010 -#define QUAL_LALT 0x0020 -#define QUAL_RALT 0x0040 -#define QUAL_LCTRL 0x0080 -#define QUAL_RCTRL 0x0100 - -// Qualifier groups -#define QUAL_MODIFIERS (QUAL_LSHIFT|QUAL_RSHIFT|QUAL_LALT|QUAL_RALT|\ - QUAL_LCTRL|QUAL_RCTRL) -#define QUAL_LEDS (QUAL_SCROLOCK|QUAL_NUMLOCK|QUAL_CAPSLOCK) - - -// Additional non-GLFW keys, defined here for internal processing only -#define GLFW_KEY_CAPSLOCK (GLFW_KEY_SPECIAL+0x0200) -#define GLFW_KEY_NUMLOCK (GLFW_KEY_SPECIAL+0x0201) -#define GLFW_KEY_SCROLOCK (GLFW_KEY_SPECIAL+0x0202) -#define GLFW_KEY_PAUSE (GLFW_KEY_SPECIAL+0x0203) - -// Keymap entry definition -struct key { - unsigned short Normal, Caps, Shift, AltGr; -}; - -// Keymap entry macros -#define NOCHAR(x) {x+0xDF00,x+0xDF00,x+0xDF00,x+0xDF00} -#define UNDEFINED {0xFFFF,0xFFFF,0xFFFF,0xFFFF} - - -//======================================================================== -// Global variables -//======================================================================== - -static struct { - int volatile KeyEnhanced, KeyPauseLoop, Qualifiers; - int LedsOK; - int Interrupt; -} _glfwKeyDrv; - -static int _glfwKeyboardInstalled = 0; - - - -//======================================================================== -// scancode_to_key_us[] - Mapping table for US keyboard layout (XT) -//======================================================================== - -static struct key scancode_to_key_us[256] = -{ -/* Standard hardware scancodes */ -/* 0x00 */ UNDEFINED, NOCHAR(GLFW_KEY_ESC), -/* 0x02 */ {'1','1','!',0xFFFF}, {'2','2','@',0xFFFF}, -/* 0x04 */ {'3','3','#',0xFFFF}, {'4','4','$',0xFFFF}, -/* 0x06 */ {'5','5','%',0xFFFF}, {'6','6','^',0xFFFF}, -/* 0x08 */ {'7','7','&',0xFFFF}, {'8','8','*',0xFFFF}, -/* 0x0A */ {'9','9','(',0xFFFF}, {'0','0',')',0xFFFF}, -/* 0x0C */ {'-','-','_',0xFFFF}, {'=','=','+',0xFFFF}, -/* 0x0E */ NOCHAR(GLFW_KEY_BACKSPACE), NOCHAR(GLFW_KEY_TAB), -/* 0x10 */ {'q','Q','Q',0xFFFF}, {'w','W','W',0xFFFF}, -/* 0x12 */ {'e','E','E',0xFFFF}, {'r','R','R',0xFFFF}, -/* 0x14 */ {'t','T','T',0xFFFF}, {'y','Y','Y',0xFFFF}, -/* 0x16 */ {'u','U','U',0xFFFF}, {'i','I','I',0xFFFF}, -/* 0x18 */ {'o','O','O',0xFFFF}, {'p','P','P',0xFFFF}, -/* 0x1A */ {'[','[','{',0xFFFF}, {']',']','}',0xFFFF}, -/* 0x1C */ NOCHAR(GLFW_KEY_ENTER), NOCHAR(GLFW_KEY_LCTRL), -/* 0x1E */ {'a','A','A',0xFFFF}, {'s','S','S',0xFFFF}, -/* 0x20 */ {'d','D','D',0xFFFF}, {'f','F','F',0xFFFF}, -/* 0x22 */ {'g','G','G',0xFFFF}, {'h','H','H',0xFFFF}, -/* 0x24 */ {'j','J','J',0xFFFF}, {'k','K','K',0xFFFF}, -/* 0x26 */ {'l','L','L',0xFFFF}, {';',';',':',0xFFFF}, -/* 0x28 */ {'\'','\'','"',0xFFFF}, {'\\','\\','|',0xFFFF}, -/* 0x2A */ NOCHAR(GLFW_KEY_LSHIFT), {'\\','\\','|',0xFFFF}, -/* 0x2C */ {'z','Z','Z',0xFFFF}, {'x','X','X',0xFFFF}, -/* 0x2E */ {'c','C','C',0xFFFF}, {'v','V','V',0xFFFF}, -/* 0x30 */ {'b','B','B',0xFFFF}, {'n','N','N',0xFFFF}, -/* 0x32 */ {'m','M','M',0xFFFF}, {',',',','<',0xFFFF}, -/* 0x34 */ {'.','.','>',0xFFFF}, {'/','/','?',0xFFFF}, -/* 0x36 */ NOCHAR(GLFW_KEY_RSHIFT), NOCHAR(GLFW_KEY_KP_MULTIPLY), -/* 0x38 */ NOCHAR(GLFW_KEY_LALT), {' ',' ',' ',0xFFFF}, -/* 0x3A */ NOCHAR(GLFW_KEY_CAPSLOCK), NOCHAR(GLFW_KEY_F1), -/* 0x3C */ NOCHAR(GLFW_KEY_F2), NOCHAR(GLFW_KEY_F3), -/* 0x3E */ NOCHAR(GLFW_KEY_F4), NOCHAR(GLFW_KEY_F5), -/* 0x40 */ NOCHAR(GLFW_KEY_F6), NOCHAR(GLFW_KEY_F7), -/* 0x42 */ NOCHAR(GLFW_KEY_F8), NOCHAR(GLFW_KEY_F9), -/* 0x44 */ NOCHAR(GLFW_KEY_F10), NOCHAR(GLFW_KEY_NUMLOCK), -/* 0x46 */ NOCHAR(GLFW_KEY_SCROLOCK), NOCHAR(GLFW_KEY_KP_7), -/* 0x48 */ NOCHAR(GLFW_KEY_KP_8), NOCHAR(GLFW_KEY_KP_9), -/* 0x4A */ NOCHAR(GLFW_KEY_KP_SUBTRACT), NOCHAR(GLFW_KEY_KP_4), -/* 0x4C */ NOCHAR(GLFW_KEY_KP_5), NOCHAR(GLFW_KEY_KP_6), -/* 0x4E */ NOCHAR(GLFW_KEY_KP_ADD), NOCHAR(GLFW_KEY_KP_1), -/* 0x50 */ NOCHAR(GLFW_KEY_KP_2), NOCHAR(GLFW_KEY_KP_3), -/* 0x52 */ NOCHAR(GLFW_KEY_KP_0), NOCHAR(GLFW_KEY_KP_DECIMAL), -/* 0x54 */ UNDEFINED, /* PRTSCR */ UNDEFINED, -/* 0x56 */ {'\\','\\','|',0xFFFF}, NOCHAR(GLFW_KEY_F11), -/* 0x58 */ NOCHAR(GLFW_KEY_F12), UNDEFINED, -/* 0x5A */ UNDEFINED, UNDEFINED, /* LWIN */ -/* 0x5C */ UNDEFINED, /* RWIN */ UNDEFINED, /* MENU */ -/* 0x5E */ UNDEFINED, UNDEFINED, -/* 0x60 */ UNDEFINED, UNDEFINED, -/* 0x62 */ UNDEFINED, UNDEFINED, -/* 0x64 */ UNDEFINED, UNDEFINED, -/* 0x66 */ UNDEFINED, UNDEFINED, -/* 0x68 */ UNDEFINED, UNDEFINED, -/* 0x6A */ UNDEFINED, UNDEFINED, -/* 0x6C */ UNDEFINED, UNDEFINED, -/* 0x6E */ UNDEFINED, UNDEFINED, -/* 0x70 */ UNDEFINED, /* KANA */ UNDEFINED, -/* 0x72 */ UNDEFINED, UNDEFINED, /* ABNT_C1 */ -/* 0x74 */ UNDEFINED, UNDEFINED, -/* 0x76 */ UNDEFINED, UNDEFINED, -/* 0x78 */ UNDEFINED, UNDEFINED, /* CONVERT */ -/* 0x7A */ UNDEFINED, UNDEFINED, /* NOCONVERT */ -/* 0x7C */ UNDEFINED, UNDEFINED, /* YEN */ -/* 0x7E */ UNDEFINED, UNDEFINED, - -/* Extended hardware scancodes (index=scancode+0x80) */ -/* 0xE000 */ UNDEFINED, NOCHAR(GLFW_KEY_ESC), -/* 0xE002 */ {'1','1','!',0xFFFF}, {'2','2','@',0xFFFF}, -/* 0xE004 */ {'3','3','#',0xFFFF}, {'4','4','$',0xFFFF}, -/* 0xE006 */ {'5','5','%',0xFFFF}, {'6','6','^',0xFFFF}, -/* 0xE008 */ {'7','7','&',0xFFFF}, {'8','8','*',0xFFFF}, -/* 0xE00A */ {'9','9','(',0xFFFF}, {'0','0',')',0xFFFF}, -/* 0xE00C */ {'-','-','_',0xFFFF}, {'=','=','+',0xFFFF}, -/* 0xE00E */ NOCHAR(GLFW_KEY_BACKSPACE), NOCHAR(GLFW_KEY_TAB), -/* 0xE010 */ UNDEFINED, /* CIRCUMFLEX */ UNDEFINED, /* AT */ -/* 0xE012 */ UNDEFINED, /* COLON2 */ {'r','R','R',0xFFFF}, -/* 0xE014 */ UNDEFINED, /* KANJI */ {'y','Y','Y',0xFFFF}, -/* 0xE016 */ {'u','U','U',0xFFFF}, {'i','I','I',0xFFFF}, -/* 0xE018 */ {'o','O','O',0xFFFF}, {'p','P','P',0xFFFF}, -/* 0xE01A */ {'[','[','{',0xFFFF}, {']',']','}',0xFFFF}, -/* 0xE01C */ NOCHAR(GLFW_KEY_KP_ENTER), NOCHAR(GLFW_KEY_RCTRL), -/* 0xE01E */ {'a','A','A',0xFFFF}, {'s','S','S',0xFFFF}, -/* 0xE020 */ {'d','D','D',0xFFFF}, {'f','F','F',0xFFFF}, -/* 0xE022 */ {'g','G','G',0xFFFF}, {'h','H','H',0xFFFF}, -/* 0xE024 */ {'j','J','J',0xFFFF}, {'k','K','K',0xFFFF}, -/* 0xE026 */ {'l','L','L',0xFFFF}, {';',';',':',0xFFFF}, -/* 0xE028 */ {'\'','\'','"',0xFFFF}, {'`','`','~',0xFFFF}, -/* 0xE02A */ UNDEFINED, {'\\','\\','|',0xFFFF}, -/* 0xE02C */ {'z','Z','Z',0xFFFF}, {'x','X','X',0xFFFF}, -/* 0xE02E */ {'c','C','C',0xFFFF}, {'v','V','V',0xFFFF}, -/* 0xE030 */ {'b','B','B',0xFFFF}, {'n','N','N',0xFFFF}, -/* 0xE032 */ {'m','M','M',0xFFFF}, {',',',','<',0xFFFF}, -/* 0xE034 */ {'.','.','>',0xFFFF}, NOCHAR(GLFW_KEY_KP_DIVIDE), -/* 0xE036 */ UNDEFINED, UNDEFINED, /* PRTSCR */ -/* 0xE038 */ NOCHAR(GLFW_KEY_RALT), {' ',' ',' ',0xFFFF}, -/* 0xE03A */ NOCHAR(GLFW_KEY_CAPSLOCK), NOCHAR(GLFW_KEY_F1), -/* 0xE03C */ NOCHAR(GLFW_KEY_F2), NOCHAR(GLFW_KEY_F3), -/* 0xE03E */ NOCHAR(GLFW_KEY_F4), NOCHAR(GLFW_KEY_F5), -/* 0xE040 */ NOCHAR(GLFW_KEY_F6), NOCHAR(GLFW_KEY_F7), -/* 0xE042 */ NOCHAR(GLFW_KEY_F8), NOCHAR(GLFW_KEY_F9), -/* 0xE044 */ NOCHAR(GLFW_KEY_F10), NOCHAR(GLFW_KEY_NUMLOCK), -/* 0xE046 */ NOCHAR(GLFW_KEY_PAUSE), NOCHAR(GLFW_KEY_HOME), -/* 0xE048 */ NOCHAR(GLFW_KEY_UP), NOCHAR(GLFW_KEY_PAGEUP), -/* 0xE04A */ NOCHAR(GLFW_KEY_KP_SUBTRACT), NOCHAR(GLFW_KEY_LEFT), -/* 0xE04C */ NOCHAR(GLFW_KEY_KP_5), NOCHAR(GLFW_KEY_RIGHT), -/* 0xE04E */ NOCHAR(GLFW_KEY_KP_ADD), NOCHAR(GLFW_KEY_END), -/* 0xE050 */ NOCHAR(GLFW_KEY_DOWN), NOCHAR(GLFW_KEY_PAGEDOWN), -/* 0xE052 */ NOCHAR(GLFW_KEY_INSERT), NOCHAR(GLFW_KEY_DEL), -/* 0xE054 */ UNDEFINED, /* PRTSCR */ UNDEFINED, -/* 0xE056 */ {'\\','\\','|',0xFFFF}, NOCHAR(GLFW_KEY_F11), -/* 0xE058 */ NOCHAR(GLFW_KEY_F12), UNDEFINED, -/* 0xE05A */ UNDEFINED, UNDEFINED, /* LWIN */ -/* 0xE05C */ UNDEFINED, /* RWIN */ UNDEFINED, /* MENU */ -/* 0xE05E */ UNDEFINED, UNDEFINED, -/* 0xE060 */ UNDEFINED, UNDEFINED, -/* 0xE062 */ UNDEFINED, UNDEFINED, -/* 0xE064 */ UNDEFINED, UNDEFINED, -/* 0xE066 */ UNDEFINED, UNDEFINED, -/* 0xE068 */ UNDEFINED, UNDEFINED, -/* 0xE06A */ UNDEFINED, UNDEFINED, -/* 0xE06C */ UNDEFINED, UNDEFINED, -/* 0xE06E */ UNDEFINED, UNDEFINED, -/* 0xE070 */ UNDEFINED, UNDEFINED, -/* 0xE072 */ UNDEFINED, UNDEFINED, -/* 0xE074 */ UNDEFINED, UNDEFINED, -/* 0xE076 */ UNDEFINED, UNDEFINED, -/* 0xE078 */ UNDEFINED, UNDEFINED, -/* 0xE07A */ UNDEFINED, UNDEFINED, -/* 0xE07C */ UNDEFINED, UNDEFINED, -/* 0xE07E */ UNDEFINED, UNDEFINED -}; - - - -//************************************************************************ -//**** Keyboard Decoding ************************************************* -//************************************************************************ - -//======================================================================== -// _glfwMapRawKey() - Map a raw scancode to a Unicode character -//======================================================================== - -static int _glfwMapRawKey( int scancode, int qualifiers ) -{ - struct key *keyvals; - int keycode; - - // Get possible key codings for this scancode - keyvals = &scancode_to_key_us[ scancode ]; - - // Select Unicode code depending on qualifiers - if( qualifiers & QUAL_RALT ) - { - keycode = keyvals->AltGr; - } - else if( qualifiers & (QUAL_LSHIFT|QUAL_RSHIFT) ) - { - if( (qualifiers & QUAL_CAPSLOCK) && - (keyvals->Normal != keyvals->Caps) ) - { - keycode = keyvals->Normal; - } - else - { - keycode = keyvals->Shift; - } - } - else if( qualifiers & QUAL_CAPSLOCK ) - { - keycode = keyvals->Caps; - } - else - { - keycode = keyvals->Normal; - } - - // Special interpretations - if( keycode >= 0xE000 && keycode <= 0xE8FF ) - { - keycode = -(keycode - 0xE000 + GLFW_KEY_SPECIAL); - } - else if( keycode == 0xFFFF ) - { - keycode = 0; - } - - return keycode; -} ENDOFUNC(_glfwMapRawKey) - - -//======================================================================== -// _glfwCreateKeyEvent() - Add a keyboard event to the event FIFO -//======================================================================== - -static void _glfwCreateKeyEvent( int scancode, int qualifiers, int action ) -{ - _GLFWdosevent event; - struct key_event *key = &event.Key; - - // Create event - key->Type = _GLFW_DOS_KEY_EVENT; - key->Key = _glfwMapRawKey( scancode, qualifiers ); - key->KeyNoMod = _glfwMapRawKey( scancode, QUAL_CAPSLOCK ); - key->Action = action; - - // Post event - _glfwPostDOSEvent( &event ); -} ENDOFUNC(_glfwCreateKeyEvent) - - - -//************************************************************************ -//**** Keyboard Communication ******************************************** -//************************************************************************ - -//======================================================================== -// _glfwWaitForReadReady() / _glfwWaitForWriteReady() -// Wait for the keyboard controller to set the ready-for-read/write bit -//======================================================================== - -static int _glfwWaitForReadReady( void ) -{ - int timeout = 16384; - while( (timeout>0) && (!(inportb(0x64)&1)) ) timeout--; - return timeout > 0; -} ENDOFUNC(_glfwWaitForReadReady) - -static int _glfwWaitForWriteReady( void ) -{ - int timeout = 4096; - while( (timeout>0) && (inportb(0x64)&2) ) timeout--; - return timeout > 0; -} ENDOFUNC(_glfwWaitForWriteReady) - - -//======================================================================== -// _glfwSendKeyboardByte() - Send a byte to the keyboard controller -//======================================================================== - -static int _glfwSendKeyboardByte( unsigned char data ) -{ - int resends = 4; - int timeout, ret; - - do - { - if( !_glfwWaitForWriteReady() ) return 0; - - outportb( 0x60, data ); - - timeout = 4096; - while( --timeout > 0 ) - { - if( !_glfwWaitForReadReady() ) return 0; - - ret = inportb( 0x60 ); - if( ret == 0xFA ) return 1; - if( ret == 0xFE ) break; - } - } - while( (resends-- > 0) && (timeout > 0) ); - - return 0; -} ENDOFUNC(_glfwSendKeyboardByte) - - -//======================================================================== -// _glfwSendKeyboardCommand() - Send a command sequence to the keyboard -//======================================================================== - -static int _glfwSendKeyboardCommand( unsigned char *cmd, int count ) -{ - int i, ok = 1; - - // Force atomic keyboard communication session - if( !_glfwKeyDrv.Interrupt ) DISABLE(); - - // Send command sequence - for( i = 0; i < count; ++ i ) - { - if( !_glfwSendKeyboardByte( cmd[i] ) ) - { - ok = 0; - break; - } - } - - // Send "clear output buffer, enable keyboard" - _glfwSendKeyboardByte( 0xF4 ); - - if( !_glfwKeyDrv.Interrupt ) ENABLE(); - - return ok; -} ENDOFUNC(_glfwSendKeyboardCommand) - - - -//************************************************************************ -//**** Miscellaneous Handling ******************************************** -//************************************************************************ - -//======================================================================== -// _glfwUpdateLeds() - Update keyboard leds -//======================================================================== - -static void _glfwUpdateLeds( int qualifiers ) -{ - unsigned char cmd[2]; - cmd[0] = 0xED; - cmd[1] = qualifiers & 7; - _glfwSendKeyboardCommand( cmd, 2 ); -} ENDOFUNC(_glfwUpdateLeds) - - - -//************************************************************************ -//**** Keyboard Interrupt Handler **************************************** -//************************************************************************ - -//======================================================================== -// _glfwHandleCode() - Handle new scancode event -//======================================================================== - -static void _glfwHandleCode( int scancode, int keypress ) -{ - if( scancode == GLFW_KEY_PAUSE && keypress ) - { - // Pause - _glfwCreateKeyEvent( GLFW_KEY_PAUSE, 0, GLFW_PRESS ); - } - else if( scancode ) - { - int tmp, qualifier; - - // Check if this is a qualifier key - tmp = scancode_to_key_us[scancode].Normal; - tmp += GLFW_KEY_SPECIAL - 0xE000; - if( tmp == GLFW_KEY_LSHIFT ) qualifier = QUAL_LSHIFT; - else if( tmp == GLFW_KEY_RSHIFT ) qualifier = QUAL_RSHIFT; - else if( tmp == GLFW_KEY_LCTRL ) qualifier = QUAL_LCTRL; - else if( tmp == GLFW_KEY_RCTRL ) qualifier = QUAL_RCTRL; - else if( tmp == GLFW_KEY_LALT ) qualifier = QUAL_LALT; - else if( tmp == GLFW_KEY_RALT ) qualifier = QUAL_RALT; - else if( tmp == GLFW_KEY_NUMLOCK ) qualifier = QUAL_NUMLOCK; - else if( tmp == GLFW_KEY_SCROLOCK ) qualifier = QUAL_SCROLOCK; - else if( tmp == GLFW_KEY_CAPSLOCK ) qualifier = QUAL_CAPSLOCK; - else qualifier = 0; - - if( keypress ) - { - // Key press - if( qualifier & QUAL_MODIFIERS ) - { - _glfwKeyDrv.Qualifiers |= qualifier; - } - if( !(qualifier & QUAL_LEDS) ) - { - _glfwCreateKeyEvent( scancode, _glfwKeyDrv.Qualifiers, - GLFW_PRESS ); - } - else - { - _glfwKeyDrv.Qualifiers ^= qualifier; - _glfwUpdateLeds( _glfwKeyDrv.Qualifiers ); - } - } - else - { - // Key release - if( qualifier & QUAL_MODIFIERS ) - { - _glfwKeyDrv.Qualifiers &= ~qualifier; - } - if( !(qualifier & QUAL_LEDS) ) - { - _glfwCreateKeyEvent( scancode, _glfwKeyDrv.Qualifiers, - GLFW_RELEASE ); - } - } - } -} ENDOFUNC(_glfwHandleCode) - - -//======================================================================== -// _glfwKeyInterrupt() - Keyboard interrupt routine -//======================================================================== - -static int _glfwKeyInterrupt( void ) -{ - unsigned char keycode, scancode; - - _glfwKeyDrv.Interrupt ++; - - keycode = inportb( 0x60 ); - - if( keycode <= 0xE1 ) - { - if( _glfwKeyDrv.KeyPauseLoop ) - { - if( ! --_glfwKeyDrv.KeyPauseLoop ) - _glfwHandleCode( GLFW_KEY_PAUSE, 1 ); - } - else - { - switch( keycode ) - { - case 0xE0: - _glfwKeyDrv.KeyEnhanced = 1; - break; - case 0xE1: - _glfwKeyDrv.KeyPauseLoop = 5; - break; - default: - scancode = keycode & 0x7F; - if( _glfwKeyDrv.KeyEnhanced ) - { - scancode |= 0x80; - _glfwKeyDrv.KeyEnhanced = 0; - } - _glfwHandleCode( scancode, !(keycode & 0x80) ); - } - } - } - - _glfwKeyDrv.Interrupt --; - - if( ((keycode==0x4F) || (keycode==0x53)) && - (_glfwKeyDrv.Qualifiers & QUAL_LCTRL) && - (_glfwKeyDrv.Qualifiers & QUAL_RALT) ) - { - // Hack alert: - // Only SIGINT (but not Ctrl-Break) calls the destructors and will - // safely clean up - asm( - "movb $0x79,%%al\n\t" - "call ___djgpp_hw_exception\n\t" - : - : - : "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory" - ); - } - - asm( - "inb $0x61,%%al\n\t" - "movb %%al,%%ah\n\t" - "orb $0x80,%%al\n\t" - "outb %%al,$0x61\n\t" - "xchgb %%al,%%ah\n\t" - "outb %%al,$0x61\n\t" - "movb $0x20,%%al\n\t" - "outb %%al,$0x20\n\t" - : - : - : "%eax" - ); - - return 0; -} ENDOFUNC(_glfwKeyInterrupt) - - - -//************************************************************************ -//**** Keyboard driver interface functions **** -//************************************************************************ - -//======================================================================== -// _glfwInitKeyboard() - Initialize keyboard driver -//======================================================================== - -int _glfwInitKeyboard( void ) -{ - int s1, s2, s3; - - if( _glfwKeyboardInstalled ) - { - return 0; - } - - // Init keyboard state - _glfwKeyDrv.LedsOK = 1; - _glfwKeyDrv.Interrupt = 0; - _glfwKeyDrv.KeyEnhanced = 0; - _glfwKeyDrv.KeyPauseLoop = 0; - - // Lock data buffers - LOCKDATA(_glfwKeyboardInstalled); - LOCKDATA(_glfwKeyDrv); - LOCKDATA(scancode_to_key_us); - - // Lock functions - LOCKFUNC(_glfwMapRawKey); - LOCKFUNC(_glfwCreateKeyEvent); - LOCKFUNC(_glfwWaitForReadReady); - LOCKFUNC(_glfwWaitForWriteReady); - LOCKFUNC(_glfwSendKeyboardByte); - LOCKFUNC(_glfwSendKeyboardCommand); - LOCKFUNC(_glfwUpdateLeds); - LOCKFUNC(_glfwHandleCode); - LOCKFUNC(_glfwKeyInterrupt); - - _farsetsel( __djgpp_dos_sel ); - _farnspokew( 0x41c, _farnspeekw(0x41a) ); - - // Get current state of key qualifiers - s1 = _farnspeekb( 0x417 ); - s2 = _farnspeekb( 0x418 ); - s3 = _farnspeekb( 0x496 ); - _glfwKeyDrv.Qualifiers = 0; - if( s1 & 1 ) _glfwKeyDrv.Qualifiers |= QUAL_RSHIFT; - if( s1 & 2 ) _glfwKeyDrv.Qualifiers |= QUAL_LSHIFT; - if( s2 & 1 ) _glfwKeyDrv.Qualifiers |= QUAL_LCTRL; - if( s2 & 2 ) _glfwKeyDrv.Qualifiers |= QUAL_LALT; - if( s3 & 4 ) _glfwKeyDrv.Qualifiers |= QUAL_RCTRL; - if( s3 & 8 ) _glfwKeyDrv.Qualifiers |= QUAL_RALT; - if( s1 & 16 ) _glfwKeyDrv.Qualifiers |= QUAL_SCROLOCK; - if( s1 & 32 ) _glfwKeyDrv.Qualifiers |= QUAL_NUMLOCK; - if( s1 & 64 ) _glfwKeyDrv.Qualifiers |= QUAL_CAPSLOCK; - _glfwUpdateLeds( _glfwKeyDrv.Qualifiers ); - - // Install keyboard interrupt handler - if( _glfwInstallDOSIrq( KEYB_IRQ, _glfwKeyInterrupt ) ) - { - return 0; - } - - _glfwKeyboardInstalled = 1; - - return 1; -} - - -//======================================================================== -// _glfwTerminateKeyboard() - Terminate keyboard driver -//======================================================================== - -void _glfwTerminateKeyboard( void ) -{ - int s1, s2, s3; - - if( !_glfwKeyboardInstalled ) - { - return; - } - - _glfwKeyboardInstalled = 0; - - // Uninstall keyboard interrupt handler - _glfwRemoveDOSIrq( KEYB_IRQ ); - - _farsetsel( __djgpp_dos_sel ); - _farnspokew( 0x41c, _farnspeekw(0x41a) ); - - // Set current state of key qualifiers - s1 = _farnspeekb( 0x417 ) & 0x80; - s2 = _farnspeekb( 0x418 ) & 0xFC; - s3 = _farnspeekb( 0x496 ) & 0xF3; - if(_glfwKeyDrv.Qualifiers & QUAL_RSHIFT) s1 |= 1; - if(_glfwKeyDrv.Qualifiers & QUAL_LSHIFT) s1 |= 2; - if(_glfwKeyDrv.Qualifiers & QUAL_LCTRL) {s2 |= 1; s1 |= 4;} - if(_glfwKeyDrv.Qualifiers & QUAL_LALT) {s2 |= 2; s1 |= 8;} - if(_glfwKeyDrv.Qualifiers & QUAL_RCTRL) {s3 |= 4; s1 |= 4;} - if(_glfwKeyDrv.Qualifiers & QUAL_RALT) {s3 |= 8; s1 |= 8;} - if(_glfwKeyDrv.Qualifiers & QUAL_SCROLOCK) s1 |= 16; - if(_glfwKeyDrv.Qualifiers & QUAL_NUMLOCK) s1 |= 32; - if(_glfwKeyDrv.Qualifiers & QUAL_CAPSLOCK) s1 |= 64; - _farnspokeb( 0x417, s1 ); - _farnspokeb( 0x418, s2 ); - _farnspokeb( 0x496, s3 ); - _glfwUpdateLeds( _glfwKeyDrv.Qualifiers ); -} diff -Nru glfw-2.6/lib/dos/dos_mouse.c glfw-2.7.2/lib/dos/dos_mouse.c --- glfw-2.6/lib/dos/dos_mouse.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/dos/dos_mouse.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,337 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: dos_mouse.c -// Platform: DOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - -//======================================================================== -// Most of the code in this source file is based on the mouse driver in -// Daniel Borca's GLUT implementation for DOS/MESA. -//======================================================================== - -//======================================================================== -// Definitions -//======================================================================== - -#define _GLFW_MOUSE_STACK_SIZE 16384 - - -// Assembler function prototypes -extern void _glfwMouseWrap( void ); -extern int _glfwMouseWrap_end[]; - - -//======================================================================== -// Global variables -//======================================================================== - -static int _glfwMouseInstalled = 0; - -static struct { - long Callback; - int Emulate3; - int OldX, OldY, OldB; - __dpmi_regs Regs; -} _glfwMouseDrv; - - - -//************************************************************************ -//**** Mouse Interrupt *************************************************** -//************************************************************************ - -//======================================================================== -// _glfwMouseInt() - Mouse interrupt handler -//======================================================================== - -static void _glfwMouseInt( __dpmi_regs *r ) -{ - int newx, newy, dx, dy, dz, buttons; - _GLFWdosevent event; - struct mousemove_event *mousemove = &event.MouseMove; - struct mousewheel_event *mousewheel = &event.MouseWheel; - struct mousebutton_event *mousebutton = &event.MouseButton; - - // Calculate mouse deltas - newx = (signed short)r->x.si; - newy = (signed short)r->x.di; - dx = newx - _glfwMouseDrv.OldX; - dy = newy - _glfwMouseDrv.OldY; - dz = (signed char)r->h.bh; - - // Get mouse buttons status - buttons = r->h.bl; - - // Emulate 3rd mouse button? - if( _glfwMouseDrv.Emulate3 ) - { - if( (buttons & 3) == 3 ) - { - buttons = 4; - } - } - - // Mouse moved? - if( dx || dy ) - { - mousemove->Type = _GLFW_DOS_MOUSE_MOVE_EVENT; - mousemove->DeltaX = dx; - mousemove->DeltaY = dy; - _glfwPostDOSEvent( &event ); - } - - // Mouse wheel moved? - if( dz ) - { - mousewheel->Type = _GLFW_DOS_MOUSE_WHEEL_EVENT; - mousewheel->WheelDelta = dz; - _glfwPostDOSEvent( &event ); - } - - // Button state changed? - if( buttons != _glfwMouseDrv.OldB ) - { - mousebutton->Type = _GLFW_DOS_MOUSE_BUTTON_EVENT; - - // Left mouse button changed? - if( (_glfwMouseDrv.OldB & 1) && !(buttons & 1) ) - { - mousebutton->Button = GLFW_MOUSE_BUTTON_LEFT; - mousebutton->Action = GLFW_RELEASE; - _glfwPostDOSEvent( &event ); - } - else if( !(_glfwMouseDrv.OldB & 1) && (buttons & 1) ) - { - mousebutton->Button = GLFW_MOUSE_BUTTON_LEFT; - mousebutton->Action = GLFW_PRESS; - _glfwPostDOSEvent( &event ); - } - - // Right mouse button changed? - if( (_glfwMouseDrv.OldB & 2) && !(buttons & 2) ) - { - mousebutton->Button = GLFW_MOUSE_BUTTON_RIGHT; - mousebutton->Action = GLFW_RELEASE; - _glfwPostDOSEvent( &event ); - } - else if( !(_glfwMouseDrv.OldB & 2) && (buttons & 2) ) - { - mousebutton->Button = GLFW_MOUSE_BUTTON_RIGHT; - mousebutton->Action = GLFW_PRESS; - _glfwPostDOSEvent( &event ); - } - - // Middle mouse button changed? - if( (_glfwMouseDrv.OldB & 4) && !(buttons & 4) ) - { - mousebutton->Button = GLFW_MOUSE_BUTTON_MIDDLE; - mousebutton->Action = GLFW_RELEASE; - _glfwPostDOSEvent( &event ); - } - else if( !(_glfwMouseDrv.OldB & 4) && (buttons & 4) ) - { - mousebutton->Button = GLFW_MOUSE_BUTTON_MIDDLE; - mousebutton->Action = GLFW_PRESS; - _glfwPostDOSEvent( &event ); - } - - } - - // Remember old mouse state - _glfwMouseDrv.OldX = newx; - _glfwMouseDrv.OldY = newy; - _glfwMouseDrv.OldB = buttons; -} ENDOFUNC(_glfwMouseInt) - - - -//************************************************************************ -//**** GLFW internal functions **** -//************************************************************************ - -//======================================================================== -// _glfwInitMouse() - Initialize mouse driver -//======================================================================== - -int _glfwInitMouse( void ) -{ - int buttons; - - // Already installed? - if( _glfwMouseInstalled ) - { - return 0; - } - - // Reset mouse and get status - __asm("\n\ - xorl %%eax, %%eax \n\ - int $0x33 \n\ - andl %%ebx, %%eax \n\ - movl %%eax, %0 \n\ - ":"=g" (buttons)::"%eax", "%ebx"); - if( !buttons ) - { - return 0; - } - - // Lock data and functions - LOCKDATA( _glfwMouseDrv ); - LOCKBUFF( _glfwMouseWrap_end, 8 ); - LOCKFUNC( _glfwMouseInt ); - LOCKFUNC( _glfwMouseWrap ); - - _glfwMouseWrap_end[1] = __djgpp_ds_alias; - - // Grab a locked stack - _glfwMouseWrap_end[0] = (int)malloc( _GLFW_MOUSE_STACK_SIZE ); - if( _glfwMouseWrap_end[0] == NULL ) - { - return 0; - } - LOCKBUFF( _glfwMouseWrap_end[0], _GLFW_MOUSE_STACK_SIZE ); - - // Try to hook a call-back - __asm("\n\ - pushl %%ds \n\ - pushl %%es \n\ - movw $0x0303, %%ax \n\ - pushl %%ds \n\ - pushl %%cs \n\ - popl %%ds \n\ - popl %%es \n\ - int $0x31 \n\ - popl %%es \n\ - popl %%ds \n\ - jc 0f \n\ - shll $16, %%ecx \n\ - movw %%dx, %%cx \n\ - movl %%ecx, %0 \n\ - 0: \n\ - ":"=g"(_glfwMouseDrv.Callback) - :"S" (_glfwMouseWrap), "D"(&_glfwMouseDrv.Regs) - :"%eax", "%ecx", "%edx"); - if( !_glfwMouseDrv.Callback ) - { - free( (void *)_glfwMouseWrap_end[0] ); - return 0; - } - - // Adjust stack - _glfwMouseWrap_end[0] += _GLFW_MOUSE_STACK_SIZE; - - // Install the handler - _glfwMouseDrv.Regs.x.ax = 0x000c; - _glfwMouseDrv.Regs.x.cx = 0x7f | 0x80; - _glfwMouseDrv.Regs.x.dx = _glfwMouseDrv.Callback & 0xffff; - _glfwMouseDrv.Regs.x.es = _glfwMouseDrv.Callback >> 16; - __dpmi_int( 0x33, &_glfwMouseDrv.Regs ); - - // Clear mickeys - __asm __volatile ("\n\ - movw $0xb, %%ax; \n\ - int $0x33 \n\ - ":::"%eax", "%ecx", "%edx"); - - _glfwMouseDrv.OldX = 0; - _glfwMouseDrv.OldY = 0; - _glfwMouseDrv.OldB = 0; - - // Emulate third mouse button? - _glfwMouseDrv.Emulate3 = buttons < 3; - - return 1; -} - - -//======================================================================== -// _glfwTerminateMouse() - Terminate mouse driver -//======================================================================== - -void _glfwTerminateMouse( void ) -{ - if( !_glfwMouseInstalled ) - { - return; - } - - __asm("\n\ - movl %%edx, %%ecx \n\ - shrl $16, %%ecx \n\ - movw $0x0304, %%ax \n\ - int $0x31 \n\ - movw $0x000c, %%ax \n\ - xorl %%ecx, %%ecx \n\ - int $0x33 \n\ - "::"d"(_glfwMouseDrv.Callback):"%eax", "%ecx"); - _glfwMouseDrv.Callback = 0; - - free( (void *)(_glfwMouseWrap_end[0] - _GLFW_MOUSE_STACK_SIZE) ); - - _glfwMouseInstalled = 0; -} - - - -//======================================================================== -// _glfwMouseWrap() -//======================================================================== - -// Hack alert: `_glfwMouseWrap_end' actually holds the address of stack in -// a safe data selector. - -__asm("\n\ - .text \n\ - .p2align 5,,31 \n\ - .global __glfwMouseWrap \n\ -__glfwMouseWrap: \n\ - cld \n\ - lodsl \n\ - movl %eax, %es:42(%edi) \n\ - addw $4, %es:46(%edi) \n\ - pushl %es \n\ - movl %ss, %ebx \n\ - movl %esp, %esi \n\ - lss %cs:__glfwMouseWrap_end, %esp\n\ - pushl %ss \n\ - pushl %ss \n\ - popl %es \n\ - popl %ds \n\ - movl ___djgpp_dos_sel, %fs \n\ - pushl %fs \n\ - popl %gs \n\ - pushl %edi \n\ - call __glfwMouseInt \n\ - popl %edi \n\ - movl %ebx, %ss \n\ - movl %esi, %esp \n\ - popl %es \n\ - iret \n\ - .global __glfwMouseWrap_end \n\ -__glfwMouseWrap_end:.long 0, 0"); diff -Nru glfw-2.6/lib/dos/dos_thread.c glfw-2.7.2/lib/dos/dos_thread.c --- glfw-2.6/lib/dos/dos_thread.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/dos/dos_thread.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,267 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: dos_thread.c -// Platform: DOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - - -//************************************************************************ -//**** GLFW internal functions **** -//************************************************************************ - -//======================================================================== -// _glfwInitThreads() - Initialize GLFW thread package -//======================================================================== - -int _glfwInitThreads( void ) -{ - // TODO - _glfwThrd.First.Previous = NULL; - _glfwThrd.First.Next = NULL; - _glfwThrd.First.ID = 0; - _glfwThrd.NextID = 1; - - return 1; -} - - -//======================================================================== -// _glfwTerminateThreads() - Terminate GLFW thread package -//======================================================================== - -void _glfwTerminateThreads( void ) -{ - _GLFWthread *t, *t_next; - - // Enter critical section - ENTER_THREAD_CRITICAL_SECTION - - // Kill all threads (NOTE: THE USER SHOULD WAIT FOR ALL THREADS TO - // DIE, _BEFORE_ CALLING glfwTerminate()!!!) - t = _glfwThrd.First.Next; - while( t != NULL ) - { - // Get pointer to next thread - t_next = t->Next; - - // Simply murder the process, no mercy! - // TODO - - // Free memory allocated for this thread - free( (void *) t ); - - // Select next thread in list - t = t_next; - } - - // Leave critical section - LEAVE_THREAD_CRITICAL_SECTION -} - - - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// _glfwPlatformCreateThread() - Create a new thread -//======================================================================== - -GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg ) -{ - // TODO - return -1; -} - - -//======================================================================== -// _glfwPlatformDestroyThread() - Kill a thread. NOTE: THIS IS A VERY -// DANGEROUS OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME -// SITUATIONS! -//======================================================================== - -void _glfwPlatformDestroyThread( GLFWthread ID ) -{ - _GLFWthread *t, *t_wait; - - // Enter critical section - ENTER_THREAD_CRITICAL_SECTION - - // Get thread information pointer - t = _glfwGetThreadPointer( ID ); - if( t == NULL ) - { - LEAVE_THREAD_CRITICAL_SECTION - return; - } - - // Simply murder the process, no mercy! - // TODO - - // Remove thread from thread list - _glfwRemoveThread( t ); - - // Signal any waiting threads that the thread has died - // TODO - - // Leave critical section - LEAVE_THREAD_CRITICAL_SECTION -} - - -//======================================================================== -// _glfwPlatformWaitThread() - Wait for a thread to die -//======================================================================== - -int _glfwPlatformWaitThread( GLFWthread ID, int waitmode ) -{ - // TODO - return GL_FALSE; -} - - -//======================================================================== -// _glfwPlatformGetThreadID() - Return the thread ID for the current -// thread -//======================================================================== - -GLFWthread _glfwPlatformGetThreadID( void ) -{ - // TODO - return 0; -} - - -//======================================================================== -// _glfwPlatformCreateMutex() - Create a mutual exclusion object -//======================================================================== - -GLFWmutex _glfwPlatformCreateMutex( void ) -{ - // TODO - return NULL; -} - - -//======================================================================== -// _glfwPlatformDestroyMutex() - Destroy a mutual exclusion object -//======================================================================== - -void _glfwPlatformDestroyMutex( GLFWmutex mutex ) -{ - // TODO -} - - -//======================================================================== -// _glfwPlatformLockMutex() - Request access to a mutex -//======================================================================== - -void _glfwPlatformLockMutex( GLFWmutex mutex ) -{ - // TODO -} - - -//======================================================================== -// _glfwPlatformUnlockMutex() - Release a mutex -//======================================================================== - -void _glfwPlatformUnlockMutex( GLFWmutex mutex ) -{ - // TODO -} - - -//======================================================================== -// _glfwPlatformCreateCond() - Create a new condition variable object -//======================================================================== - -GLFWcond _glfwPlatformCreateCond( void ) -{ - // TODO - return NULL; -} - - -//======================================================================== -// _glfwPlatformDestroyCond() - Destroy a condition variable object -//======================================================================== - -void _glfwPlatformDestroyCond( GLFWcond cond ) -{ - // TODO -} - - -//======================================================================== -// _glfwPlatformWaitCond() - Wait for a condition to be raised -//======================================================================== - -void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, - double timeout ) -{ - // TODO -} - - -//======================================================================== -// _glfwPlatformSignalCond() - Signal a condition to one waiting thread -//======================================================================== - -void _glfwPlatformSignalCond( GLFWcond cond ) -{ - // TODO -} - - -//======================================================================== -// _glfwPlatformBroadcastCond() - Broadcast a condition to all waiting -// threads -//======================================================================== - -void _glfwPlatformBroadcastCond( GLFWcond cond ) -{ - // TODO -} - - -//======================================================================== -// _glfwPlatformGetNumberOfProcessors() - Return the number of processors -// in the system. -//======================================================================== - -int _glfwPlatformGetNumberOfProcessors( void ) -{ - // Return number of processors online (DOS does not support multiple - // CPUs...) - return 1; -} diff -Nru glfw-2.6/lib/dos/dos_time.c glfw-2.7.2/lib/dos/dos_time.c --- glfw-2.6/lib/dos/dos_time.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/dos/dos_time.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,309 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: dos_time.c -// Platform: DOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - -// We use the __i386 define later in the code. Check if there are any -// other defines that hint that we are compiling for 32-bit x86. -#ifndef __i386 - #if defined(__i386__) || defined(i386) || defined(X86) || defined(_M_IX86) - #define __i386 - #endif -#endif // __i386 - -// Should we use inline x86 assembler? -#if defined(__i386) && defined(__GNUC__) - #define _USE_X86_ASM -#endif - - - -//************************************************************************ -//**** GLFW internal functions **** -//************************************************************************ - -// Functions for accessing upper and lower parts of 64-bit integers -// (Note: These are endian dependent, but ONLY used on x86 platforms!) -#define _HIGH(x) ((unsigned int*)&x)[1] -#define _LOW(x) *((unsigned int*)&x) - - -//======================================================================== -// _glfwCPUID() - Execute x86 CPUID instruction -//======================================================================== - -#ifdef _USE_X86_ASM - -static int _glfwCPUID( unsigned int ID, unsigned int *a, unsigned int *b, - unsigned int *c, unsigned int *d ) -{ - int has_cpuid; - unsigned int local_a, local_b, local_c, local_d; - - // Inline assembly - GCC version -#if defined(__i386) && defined(__GNUC__) - - // Detect CPUID support - asm( - "pushf\n\t" - "pop %%eax\n\t" - "movl %%eax,%%ebx\n\t" - "xorl $0x00200000,%%eax\n\t" - "push %%eax\n\t" - "popf\n\t" - "pushf\n\t" - "pop %%eax\n\t" - "xorl %%eax,%%ebx\n\t" - "movl %%eax,%0\n\t" - : "=m" (has_cpuid) - : - : "%eax", "%ebx" - ); - if( !has_cpuid ) - { - return GL_FALSE; - } - - // Execute CPUID - asm( - "movl %4,%%eax\n\t" - "cpuid\n\t" - "movl %%eax,%0\n\t" - "movl %%ebx,%1\n\t" - "movl %%ecx,%2\n\t" - "movl %%edx,%3\n\t" - : "=m" (local_a), "=m" (local_b), "=m" (local_c), "=m" (local_d) - : "m" (ID) - : "%eax", "%ebx", "%ecx", "%edx" - ); - -#endif - - // Common code for all compilers - *a = local_a; - *b = local_b; - *c = local_c; - *d = local_d; - return GL_TRUE; -} - -#endif // _USE_X86_ASM - - -//======================================================================== -// _glfwHasRDTSC() - Check for RDTSC availability AND usefulness -//======================================================================== - -static int _glfwHasRDTSC( void ) -{ -#ifdef _USE_X86_ASM - - unsigned int cpu_name1, cpu_name2, cpu_name3; - unsigned int cpu_signature, cpu_brandID; - unsigned int max_base, feature_flags; - unsigned int dummy; - - // Get processor vendor string (will return 0 if CPUID is not - // supported) - if( !_glfwCPUID( 0, &max_base, &cpu_name1, &cpu_name3, &cpu_name2 ) ) - { - return GL_FALSE; - } - - // Does the processor support base CPUID function 1? - if( max_base < 1 ) - { - return GL_FALSE; - } - - // Get CPU capabilities, CPU Brand ID & CPU Signature - _glfwCPUID( 1, &cpu_signature, &cpu_brandID, &dummy, &feature_flags ); - - // Is RDTSC supported? - if( !(feature_flags & 0x00000010) ) - { - return GL_FALSE; - } - - return GL_TRUE; - -#else - - // Not a supported compiler - return GL_FALSE; - -#endif -} - - -//------------------------------------------------------------------------ -// _RDTSC() - Get CPU cycle count using the RDTSC instruction -//------------------------------------------------------------------------ - -#if defined(__i386) && defined(__GNUC__) - -// Read 64-bit processor Time Stamp Counter - GCC version -#define _RDTSC( hi, lo ) \ - asm( \ - "rdtsc\n\t" \ - "movl %%edx,%0\n\t" \ - "movl %%eax,%1" \ - : "=m" (hi), "=m" (lo) \ - : \ - : "%edx", "%eax" \ - ); - -#else - -#define _RDTSC( hi, lo ) {hi=lo=0;} - -#endif - - - - -//======================================================================== -// _glfwInitTimer() - Initialize timer -//======================================================================== - -int _glfwInitTimer( void ) -{ - clock_t t, t1, t2; - long long c1, c2; - - // Do we have RDTSC? - _glfwTimer.HasRDTSC = _glfwHasRDTSC(); - if( _glfwTimer.HasRDTSC ) - { - // Measure the CPU clock with the raw DOS clock (18.2 Hz) - t = clock(); - while( (t1=clock()) == t ); - _RDTSC( _HIGH(c1), _LOW(c1) ); - t = t1+CLOCKS_PER_SEC/3; - while( (t2=clock()) < t ); - _RDTSC( _HIGH(c2), _LOW(c2) ); - - // Calculate CPU clock period - _glfwTimer.Period = (double)(t2-t1) / - (CLOCKS_PER_SEC * (double)(c2-c1)); - _RDTSC( _HIGH(_glfwTimer.t0), _LOW(_glfwTimer.t0) ); - } - else - { - // Use the raw DOS clock (18.2 Hz) - _glfwTimer.Period = 1.0 / CLOCKS_PER_SEC; - _glfwTimer.t0 = clock(); - } - - return 1; -} - - -//======================================================================== -// _glfwTerminateTimer() - Terminate timer -//======================================================================== - -void _glfwTerminateTimer( void ) -{ - // Nothing to do here -} - - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// _glfwPlatformGetTime() - Return timer value in seconds -//======================================================================== - -double _glfwPlatformGetTime( void ) -{ - long long t_now; - - // Get current clock count - if( _glfwTimer.HasRDTSC ) - { - _RDTSC( _HIGH(t_now), _LOW(t_now) ); - } - else - { - t_now = (long long) clock(); - } - - // Convert to seconds - return (t_now-_glfwTimer.t0) * _glfwTimer.Period; -} - - -//======================================================================== -// _glfwPlatformSetTime() - Set timer value in seconds -//======================================================================== - -void _glfwPlatformSetTime( double t ) -{ - long long t_now; - - // Get current clock count - if( _glfwTimer.HasRDTSC ) - { - _RDTSC( _HIGH(t_now), _LOW(t_now) ); - } - else - { - t_now = (long long) clock(); - } - - // Set timer - _glfwTimer.t0 = t_now - (long long)(t/_glfwTimer.Period); -} - - -//======================================================================== -// _glfwPlatformSleep() - Put a thread to sleep for a specified amount of -// time -//======================================================================== - -void _glfwPlatformSleep( double time ) -{ - // TODO: Proper threaded version - if( time > 0 ) - { - if( time < 0.001 ) - { - delay( 1 ); - } - else - { - delay( (unsigned int)(time*1000.0+0.5) ); - } - } -} diff -Nru glfw-2.6/lib/dos/dos_window.c glfw-2.7.2/lib/dos/dos_window.c --- glfw-2.6/lib/dos/dos_window.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/dos/dos_window.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,563 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: dos_window.c -// Platform: DOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - - -//************************************************************************ -//**** GLFW internal functions **** -//************************************************************************ - -//======================================================================== -// _glfwRedirectOutput() - Standard output redirection -//======================================================================== - -static void _glfwRedirectOutput( void ) -{ - // Generate temporary names - tmpnam( _glfwWin.OutName ); - tmpnam( _glfwWin.ErrName ); - - // Open temporary output files - _glfwWin.hOut = open( _glfwWin.OutName, O_WRONLY | O_CREAT | O_TEXT | - O_TRUNC, S_IREAD | S_IWRITE ); - _glfwWin.hErr = open( _glfwWin.ErrName, O_WRONLY | O_CREAT | O_TEXT | - O_TRUNC, S_IREAD | S_IWRITE ); - - // Redirect stdout - if( _glfwWin.hOut > 0 ) - { - _glfwWin.hOutOld = dup( STDOUT_FILENO ); - fflush( stdout ); - dup2( _glfwWin.hOut, STDOUT_FILENO ); - } - - // Redirect stderr - if( _glfwWin.hErr > 0 ) - { - _glfwWin.hErrOld = dup( STDERR_FILENO ); - fflush( stderr ); - dup2( _glfwWin.hErr, STDERR_FILENO ); - } -} - - -//======================================================================== -// _glfwRestoreOutput() - Standard output redirection -//======================================================================== - -static void _glfwRestoreOutput( void ) -{ - FILE *f; - char *str = alloca( 512 ); - - // Dump from temporary file to stdout - if( _glfwWin.hOut > 0) - { - // Restore old stdout - dup2( _glfwWin.hOutOld, STDOUT_FILENO ); - close( _glfwWin.hOut ); - close( _glfwWin.hOutOld ); - _glfwWin.hOut = 0; - - // Dump file to stdout - f = fopen( _glfwWin.OutName, "rt" ); - while( fgets( str, 512, f ) ) - { - fputs( str, stdout ); - } - fclose( f ); - - // Remove temporary file - remove( _glfwWin.OutName ); - } - - // Dump from temporary file to stderr - if( _glfwWin.hOut > 0) - { - // Restore old stderr - dup2( _glfwWin.hErrOld, STDERR_FILENO ); - close( _glfwWin.hErr ); - close( _glfwWin.hErrOld ); - _glfwWin.hErr = 0; - - // Dump file to stderr - f = fopen( _glfwWin.ErrName, "rt" ); - while( fgets( str, 512, f ) ) - { - fputs( str, stderr ); - } - fclose( f ); - - // Remove temporary file - remove( _glfwWin.ErrName ); - } -} - - -//======================================================================== -// _glfwTranslateChar() - Translates a DOS key code to Unicode -//======================================================================== - -static int _glfwTranslateChar( int keycode ) -{ - // Unicode? - if( (keycode >= 32 && keycode <= 126) || keycode >= 160 ) - { - return keycode; - } - - return -1; -} - - -//======================================================================== -// _glfwTranslateKey() - Translates a DOS key code to GLFW coding -//======================================================================== - -static int _glfwTranslateKey( int keycode ) -{ - // ISO 8859-1? - if( ((keycode>=32) && (keycode<=126)) || - ((keycode>=160) && (keycode<=254)) ) - { - return keycode; - } - - // Special keys? - if( keycode < 0 ) - { - return -keycode; - } - - return -1; -} - - - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// _glfwPlatformOpenWindow() - Here is where the window is created, and -// the OpenGL rendering context is created -//======================================================================== - -int _glfwPlatformOpenWindow( int width, int height, int redbits, - int greenbits, int bluebits, int alphabits, int depthbits, - int stencilbits, int mode, int accumredbits, int accumgreenbits, - int accumbluebits, int accumalphabits, int auxbuffers, int stereo, - int refreshrate ) -{ - GLint params[2]; - - // Clear window resources - _glfwWin.Visual = NULL; - _glfwWin.Context = NULL; - _glfwWin.Buffer = NULL; - _glfwWin.hOut = 0; - _glfwWin.hErr = 0; - - // For now, we only support 640x480, 800x600 and 1024x768 - if( (width*height) < (700*500) ) - { - width = 640; - height = 480; - } - else if( (width*height) < (900*700) ) - { - width = 800; - height = 600; - } - else - { - width = 1024; - height = 768; - } - - // For now, we only support 5,6,5 and 8,8,8 color formats - if( (redbits+greenbits+bluebits) < 20 ) - { - redbits = 5; - greenbits = 6; - bluebits = 5; - } - else - { - redbits = 8; - greenbits = 8; - bluebits = 8; - } - - // For now, we always set refresh rate = 0 (default) - refreshrate = 0; - - // stdout/stderr redirection - _glfwRedirectOutput(); - - // Create visual - _glfwWin.Visual = DMesaCreateVisual( - width, height, - redbits+greenbits+bluebits, - refreshrate, - GL_TRUE, // Double buffer - GL_TRUE, // RGB mode - alphabits?GL_TRUE:GL_FALSE, // Alpha buffer? - depthbits, - stencilbits, - (accumredbits+accumgreenbits+ - accumbluebits+accumalphabits)>>2 - ); - if( _glfwWin.Visual == NULL ) - { - printf("Unable to create visual\n"); - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - // Create context - _glfwWin.Context = DMesaCreateContext( _glfwWin.Visual, NULL ); - if( _glfwWin.Context == NULL ) - { - printf("Unable to create context\n"); - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - // Create buffer - _glfwWin.Buffer = DMesaCreateBuffer( _glfwWin.Visual, 0, 0, - width, height ); - if( _glfwWin.Buffer == NULL ) - { - printf("Unable to create buffer\n"); - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - // Make current context - if( !DMesaMakeCurrent( _glfwWin.Context, _glfwWin.Buffer ) ) - { - printf("Unable to make current context\n"); - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - // Start DOS event handler - if( !_glfwInitEvents() ) - { - printf("Unable to start event handler\n"); - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - // Start keyboard handler - if( !_glfwInitKeyboard() ) - { - printf("Unable to start keyboard driver\n"); - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - // Start mouse handler - if( !_glfwInitMouse() ) - { - printf("***Warning: Unable to start mouse driver\n"); - } - - // Remember actual screen/window size - _glfwWin.Width = width; - _glfwWin.Height = height; - - return GL_TRUE; -} - - -//======================================================================== -// _glfwPlatformCloseWindow() - Properly kill the window/video display -//======================================================================== - -void _glfwPlatformCloseWindow( void ) -{ - // Terminate mouse handler - _glfwTerminateMouse(); - - // Terminate keyboard handler - _glfwTerminateKeyboard(); - - // Terminate event handler - _glfwTerminateEvents(); - - // Destroy buffer - if( _glfwWin.Buffer != NULL ) - { - DMesaDestroyBuffer( _glfwWin.Buffer ); - _glfwWin.Buffer = NULL; - } - - // Destroy context - if( _glfwWin.Context != NULL ) - { - DMesaDestroyContext( _glfwWin.Context ); - _glfwWin.Context = NULL; - } - - // Destroy visual - if( _glfwWin.Visual != NULL ) - { - DMesaDestroyVisual( _glfwWin.Visual ); - _glfwWin.Visual = NULL; - } - - // stdout/stderr redirection - _glfwRestoreOutput(); -} - - -//======================================================================== -// _glfwPlatformSetWindowTitle() - Set the window title. -//======================================================================== - -void _glfwPlatformSetWindowTitle( const char *title ) -{ - // Nothing to do here... -} - - -//======================================================================== -// _glfwPlatformSetWindowSize() - Set the window size. -//======================================================================== - -void _glfwPlatformSetWindowSize( int width, int height ) -{ - // TODO -} - - -//======================================================================== -// _glfwPlatformSetWindowPos() - Set the window position. -//======================================================================== - -void _glfwPlatformSetWindowPos( int x, int y ) -{ - // Nothing to do here... -} - - -//======================================================================== -// _glfwPlatformIconfyWindow() - Window iconification -//======================================================================== - -void _glfwPlatformIconifyWindow( void ) -{ - // Nothing to do here... -} - - -//======================================================================== -// _glfwPlatformRestoreWindow() - Window un-iconification -//======================================================================== - -void _glfwPlatformRestoreWindow( void ) -{ - // Nothing to do here... -} - - -//======================================================================== -// _glfwPlatformSwapBuffers() - Swap buffers (double-buffering) and poll -// any new events. -//======================================================================== - -void _glfwPlatformSwapBuffers( void ) -{ - DMesaSwapBuffers( _glfwWin.Buffer ); -} - - -//======================================================================== -// _glfwPlatformSwapInterval() - Set double buffering swap interval -//======================================================================== - -void _glfwPlatformSwapInterval( int interval ) -{ - // TODO -} - - -//======================================================================== -// _glfwPlatformRefreshWindowParams() -//======================================================================== - -void _glfwPlatformRefreshWindowParams( void ) -{ - GLint x; - GLboolean b; - - // Fill out information - _glfwWin.Accelerated = GL_TRUE; - glGetIntegerv( GL_RED_BITS, &x ); - _glfwWin.RedBits = x; - glGetIntegerv( GL_GREEN_BITS, &x ); - _glfwWin.GreenBits = x; - glGetIntegerv( GL_BLUE_BITS, &x ); - _glfwWin.BlueBits = x; - glGetIntegerv( GL_ALPHA_BITS, &x ); - _glfwWin.AlphaBits = x; - glGetIntegerv( GL_DEPTH_BITS, &x ); - _glfwWin.DepthBits = x; - glGetIntegerv( GL_STENCIL_BITS, &x ); - _glfwWin.StencilBits = x; - glGetIntegerv( GL_ACCUM_RED_BITS, &x ); - _glfwWin.AccumRedBits = x; - glGetIntegerv( GL_ACCUM_GREEN_BITS, &x ); - _glfwWin.AccumGreenBits = x; - glGetIntegerv( GL_ACCUM_BLUE_BITS, &x ); - _glfwWin.AccumBlueBits = x; - glGetIntegerv( GL_ACCUM_ALPHA_BITS, &x ); - _glfwWin.AccumAlphaBits = x; - glGetIntegerv( GL_AUX_BUFFERS, &x ); - _glfwWin.AuxBuffers = x; - glGetBooleanv( GL_AUX_BUFFERS, &b ); - _glfwWin.Stereo = b ? GL_TRUE : GL_FALSE; - _glfwWin.RefreshRate = 0; -} - - -//======================================================================== -// _glfwPlatformPollEvents() - Poll for new window and input events -//======================================================================== - -void _glfwPlatformPollEvents( void ) -{ - _GLFWdosevent event; - struct key_event *key; - struct mousemove_event *mousemove; - struct mousewheel_event *mousewheel; - struct mousebutton_event *mousebutton; - - // Empty the event queue - while( _glfwGetNextEvent( &event ) ) - { - switch( event.Type ) - { - // Keyboard event? - case _GLFW_DOS_KEY_EVENT: - key = &event.Key; - _glfwInputKey( _glfwTranslateKey( key->KeyNoMod ), - key->Action ); - _glfwInputChar( _glfwTranslateChar( key->Key ), - key->Action ); - break; - - // Mouse move event? - case _GLFW_DOS_MOUSE_MOVE_EVENT: - mousemove = &event.MouseMove; - _glfwInput.MousePosX += mousemove->DeltaX; - _glfwInput.MousePosY += mousemove->DeltaY; - - // Call user callback function - if( _glfwWin.MousePosCallback ) - { - _glfwWin.MousePosCallback( _glfwInput.MousePosX, - _glfwInput.MousePosY ); - } - break; - - // Mouse wheel event? - case _GLFW_DOS_MOUSE_WHEEL_EVENT: - mousewheel = &event.MouseWheel; - _glfwInput.WheelPos += mousewheel->WheelDelta; - - // Call user callback function - if( _glfwWin.MouseWheelCallback ) - { - _glfwWin.MouseWheelCallback( _glfwInput.WheelPos ); - } - break; - - // Mouse button event? - case _GLFW_DOS_MOUSE_BUTTON_EVENT: - mousebutton = &event.MouseButton; - _glfwInputMouseClick( mousebutton->Button, - mousebutton->Action ); - break; - - default: - break; - } - - } -} - - -//======================================================================== -// _glfwPlatformWaitEvents() - Wait for new window and input events -//======================================================================== - -void _glfwPlatformWaitEvents( void ) -{ - // Wait for new events - _glfwWaitNextEvent; - - // Poll new events - _glfwPlatformPollEvents(); -} - - -//======================================================================== -// _glfwPlatformHideMouseCursor() - Hide mouse cursor (lock it) -//======================================================================== - -void _glfwPlatformHideMouseCursor( void ) -{ - // TODO -} - - -//======================================================================== -// _glfwPlatformShowMouseCursor() - Show mouse cursor (unlock it) -//======================================================================== - -void _glfwPlatformShowMouseCursor( void ) -{ - // TODO -} - - -//======================================================================== -// _glfwPlatformSetMouseCursorPos() - Set physical mouse cursor position -//======================================================================== - -void _glfwPlatformSetMouseCursorPos( int x, int y ) -{ - // TODO -} diff -Nru glfw-2.6/lib/dos/Makefile.dos.djgpp glfw-2.7.2/lib/dos/Makefile.dos.djgpp --- glfw-2.6/lib/dos/Makefile.dos.djgpp 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/dos/Makefile.dos.djgpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,146 +0,0 @@ -########################################################################## -# Makefile for GLFW on DOS using DJGPP. -#------------------------------------------------------------------------- -# To compile GLFW using this makefile, run: -# make -f Makefile.dos.djgpp -# NOTE: You need long filename support (e.g. compile under Windows9x or -# use a LFN driver such as DOSLFN) -########################################################################## - -########################################################################## -# Default: Build static library version of GLFW -########################################################################## -default: libglfw.a - - -########################################################################## -# GLFW version -########################################################################## -VERMAJOR = 2 -VERMINOR = 4 - - -########################################################################## -# Compiler settings -########################################################################## -CC = gcc -CFLAGS = -c -I. -I.. -Wall -Os - -# Some modules should be optimized for speed (e.g. image decoding) -CFLAGS_SPEED = -c -I. -I.. -Wall -O3 -ffast-math - - -########################################################################## -# Library builder settings -########################################################################## -MKLIB = ar -LIBFLAGS = -rcs - - -########################################################################## -# Object files which are part of the GLFW library -########################################################################## -OBJS = \ - enable.o \ - fullscreen.o \ - glext.o \ - image.o \ - init.o \ - input.o \ - joystick.o \ - tga.o \ - thread.o \ - time.o \ - window.o \ - dos_enable.o \ - dos_events.o \ - dos_fullscreen.o \ - dos_glext.o \ - dos_init.o \ - dos_irq.o \ - dos_joystick.o \ - dos_keyboard.o \ - dos_mouse.o \ - dos_thread.o \ - dos_time.o \ - dos_window.o - - -########################################################################## -# Rule for building library -########################################################################## -libglfw.a: $(OBJS) - $(MKLIB) $(LIBFLAGS) $@ $(OBJS) - - -########################################################################## -# Rules for building library object files -########################################################################## -enable.o: ..\\enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\enable.c - -fullscreen.o: ..\\fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\fullscreen.c - -glext.o: ..\\glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\glext.c - -image.o: ..\\image.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o $@ ..\\image.c - -init.o: ..\\init.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\init.c - -input.o: ..\\input.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\input.c - -joystick.o: ..\\joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\joystick.c - -tga.o: ..\\tga.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o $@ ..\\tga.c - -thread.o: ..\\thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\thread.c - -time.o: ..\\time.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\time.c - -window.o: ..\\window.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\window.c - -dos_enable.o: dos_enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ dos_enable.c - -dos_events.o: dos_events.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ dos_events.c - -dos_fullscreen.o: dos_fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ dos_fullscreen.c - -dos_glext.o: dos_glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ dos_glext.c - -dos_init.o: dos_init.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ dos_init.c - -dos_irq.o: dos_irq.s ..\\internal.h platform.h - $(CC) $(CFLAGS) -x assembler-with-cpp -o $@ dos_irq.s - -dos_joystick.o: dos_joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ dos_joystick.c - -dos_keyboard.o: dos_keyboard.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ dos_keyboard.c - -dos_mouse.o: dos_mouse.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ dos_mouse.c - -dos_thread.o: dos_thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ dos_thread.c - -dos_time.o: dos_time.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ dos_time.c - -dos_window.o: dos_window.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ dos_window.c diff -Nru glfw-2.6/lib/dos/platform.h glfw-2.7.2/lib/dos/platform.h --- glfw-2.6/lib/dos/platform.h 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/dos/platform.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,341 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: platform.h -// Platform: DOS -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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 _platform_h_ -#define _platform_h_ - - -// This is the DOS version of GLFW -#define _GLFW_DOS - - -// Include files -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// GLFW+GL+GLU defines -#include "../../include/GL/glfw.h" - -// DOS Mesa (include this AFTER gl.h!) -#include - - -// Stack size for each thread (in bytes) -#define _GLFW_TASK_STACK_SIZE 50000 - - - - -//======================================================================== -// Global variables (GLFW internals) -//======================================================================== - - -//------------------------------------------------------------------------ -// Window structure -//------------------------------------------------------------------------ -typedef struct _GLFWwin_struct _GLFWwin; - -struct _GLFWwin_struct { - -// ========= PLATFORM INDEPENDENT MANDATORY PART ========================= - - // User callback functions - GLFWwindowsizefun WindowSizeCallback; - GLFWwindowclosefun WindowCloseCallback; - GLFWwindowrefreshfun WindowRefreshCallback; - GLFWmousebuttonfun MouseButtonCallback; - GLFWmouseposfun MousePosCallback; - GLFWmousewheelfun MouseWheelCallback; - GLFWkeyfun KeyCallback; - GLFWcharfun CharCallback; - - // User selected window settings - int Fullscreen; // Fullscreen flag - int MouseLock; // Mouse-lock flag - int AutoPollEvents; // Auto polling flag - int SysKeysDisabled; // System keys disabled flag - int WindowNoResize; // Resize- and maximize gadgets disabled flag - - // Window status & parameters - int Opened; // Flag telling if window is opened or not - int Active; // Application active flag - int Iconified; // Window iconified flag - int Width, Height; // Window width and heigth - int Accelerated; // GL_TRUE if window is HW accelerated - int RedBits; - int GreenBits; - int BlueBits; - int AlphaBits; - int DepthBits; - int StencilBits; - int AccumRedBits; - int AccumGreenBits; - int AccumBlueBits; - int AccumAlphaBits; - int AuxBuffers; - int Stereo; - int RefreshRate; // Vertical monitor refresh rate - - // Extensions & OpenGL version - int Has_GL_SGIS_generate_mipmap; - int Has_GL_ARB_texture_non_power_of_two; - int GLVerMajor,GLVerMinor; - - -// ========= PLATFORM SPECIFIC PART ====================================== - - // Platform specific window resources - DMesaVisual Visual; - DMesaContext Context; - DMesaBuffer Buffer; - - // Standard output redirection - char OutName[L_tmpnam]; - char ErrName[L_tmpnam]; - int hOut,hOutOld,hErr,hErrOld; - - // Platform specific extensions - - // Various platform specific internal variables - -}; - -GLFWGLOBAL _GLFWwin _glfwWin; - - -//------------------------------------------------------------------------ -// User input status (most of this should go in _GLFWwin) -//------------------------------------------------------------------------ -GLFWGLOBAL struct { - -// ========= PLATFORM INDEPENDENT MANDATORY PART ========================= - - // Mouse status - int MousePosX, MousePosY; - int WheelPos; - char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ]; - - // Keyboard status - char Key[ GLFW_KEY_LAST+1 ]; - int LastChar; - - // User selected settings - int StickyKeys; - int StickyMouseButtons; - int KeyRepeat; - - -// ========= PLATFORM SPECIFIC PART ====================================== - - // Platform specific internal variables - -} _glfwInput; - - -//------------------------------------------------------------------------ -// Timer status -//------------------------------------------------------------------------ -GLFWGLOBAL struct { - double Period; - long long t0; - int HasRDTSC; -} _glfwTimer; - - -//------------------------------------------------------------------------ -// Thread record (one for each thread) -//------------------------------------------------------------------------ -typedef struct _GLFWthread_struct _GLFWthread; - -struct _GLFWthread_struct { - -// ========= PLATFORM INDEPENDENT MANDATORY PART ========================= - - // Pointer to previous and next threads in linked list - _GLFWthread *Previous, *Next; - - // GLFW user side thread information - GLFWthread ID; - -// ========= PLATFORM SPECIFIC PART ====================================== - - // System side thread information - GLFWthreadfun Function; - void *Arg; -}; - - -//------------------------------------------------------------------------ -// General thread information -//------------------------------------------------------------------------ -GLFWGLOBAL struct { - -// ========= PLATFORM INDEPENDENT MANDATORY PART ========================= - - // Next thread ID to use (increments for every created thread) - GLFWthread NextID; - - // First thread in linked list (always the main thread) - _GLFWthread First; - -// ========= PLATFORM SPECIFIC PART ====================================== - - // Critical section lock - -} _glfwThrd; - - -//------------------------------------------------------------------------ -// Joystick information & state -//------------------------------------------------------------------------ -GLFWGLOBAL struct { - int dummy; -} _glfwJoy; - - -//======================================================================== -// Macros for encapsulating critical code sections (i.e. making parts -// of GLFW thread safe) -//======================================================================== - -// Thread list management -#define ENTER_THREAD_CRITICAL_SECTION \ - ; -#define LEAVE_THREAD_CRITICAL_SECTION \ - ; - - -//======================================================================== -// DOS events -//======================================================================== - -// Valid event types -#define _GLFW_DOS_KEY_EVENT 1 -#define _GLFW_DOS_MOUSE_MOVE_EVENT 2 -#define _GLFW_DOS_MOUSE_WHEEL_EVENT 3 -#define _GLFW_DOS_MOUSE_BUTTON_EVENT 4 - -// Keyboard event structure -struct key_event { - int Type; - int Key; - int KeyNoMod; - int Action; -}; - -// Mouse move event structure -struct mousemove_event { - int Type; - int DeltaX, DeltaY; -}; - -// Mouse wheel event structure -struct mousewheel_event { - int Type; - int WheelDelta; -}; - -// Mouse button event structure -struct mousebutton_event { - int Type; - int Button; - int Action; -}; - -// DOS event structure -typedef union { - int Type; - struct key_event Key; - struct mousemove_event MouseMove; - struct mousewheel_event MouseWheel; - struct mousebutton_event MouseButton; -} _GLFWdosevent; - - - -//======================================================================== -// Prototypes for platform specific internal functions -//======================================================================== - -// Time -int _glfwInitTimer( void ); -void _glfwTerminateTimer( void ); - -// Fullscreen - -// Events -int _glfwInitEvents( void ); -void _glfwTerminateEvents( void ); -void _glfwWaitNextEvent( void ); -int _glfwGetNextEvent( _GLFWdosevent *event ); -void _glfwPostDOSEvent( _GLFWdosevent *event ); - -// Mouse -int _glfwInitMouse( void ); -void _glfwTerminateMouse( void ); - -// Keyboard -int _glfwInitKeyboard( void ); -void _glfwTerminateKeyboard( void ); - -// Joystick -void _glfwInitJoysticks( void ); -void _glfwTerminateJoysticks( void ); - -// Threads -int _glfwInitThreads( void ); -void _glfwTerminateThreads( void ); - -// Interrupt handling -int _glfwInstallDOSIrq( int i, int (*handler) () ); -int _glfwRemoveDOSIrq( int i ); - -// Interrupt macros -#define ENABLE() __asm __volatile("sti") -#define DISABLE() __asm __volatile("cli") - -// Memory macros (for locking memory) -#define ENDOFUNC(x) static void x##_end() { } -#define LOCKFUNC(x) _go32_dpmi_lock_code((void *)x, (long)x##_end - (long)x) -#define LOCKDATA(x) _go32_dpmi_lock_data((void *)&x, sizeof(x)) -#define LOCKBUFF(x, l) _go32_dpmi_lock_data((void *)x, l) - -#endif // _platform_h_ diff -Nru glfw-2.6/lib/enable.c glfw-2.7.2/lib/enable.c --- glfw-2.6/lib/enable.c 2007-07-01 22:27:21.000000000 +0000 +++ glfw-2.7.2/lib/enable.c 2010-08-08 15:37:03.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: enable.c // Platform: Any -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -39,11 +39,11 @@ // Enable (show) mouse cursor //======================================================================== -static void _glfwEnableMouseCursor( void ) +static void enableMouseCursor( void ) { - int CenterPosX, CenterPosY; + int centerPosX, centerPosY; - if( !_glfwWin.Opened || !_glfwWin.MouseLock ) + if( !_glfwWin.opened || !_glfwWin.mouseLock ) { return; } @@ -51,34 +51,34 @@ // Show mouse cursor _glfwPlatformShowMouseCursor(); - CenterPosX = _glfwWin.Width / 2; - CenterPosY = _glfwWin.Height / 2; + centerPosX = _glfwWin.width / 2; + centerPosY = _glfwWin.height / 2; - if( CenterPosX != _glfwInput.MousePosX || CenterPosY != _glfwInput.MousePosY ) + if( centerPosX != _glfwInput.MousePosX || centerPosY != _glfwInput.MousePosY ) { - _glfwPlatformSetMouseCursorPos( CenterPosX, CenterPosY ); + _glfwPlatformSetMouseCursorPos( centerPosX, centerPosY ); - _glfwInput.MousePosX = CenterPosX; - _glfwInput.MousePosY = CenterPosY; + _glfwInput.MousePosX = centerPosX; + _glfwInput.MousePosY = centerPosY; - if( _glfwWin.MousePosCallback ) - { - _glfwWin.MousePosCallback( _glfwInput.MousePosX, - _glfwInput.MousePosY ); - } + if( _glfwWin.mousePosCallback ) + { + _glfwWin.mousePosCallback( _glfwInput.MousePosX, + _glfwInput.MousePosY ); + } } // From now on the mouse is unlocked - _glfwWin.MouseLock = GL_FALSE; + _glfwWin.mouseLock = GL_FALSE; } //======================================================================== // Disable (hide) mouse cursor //======================================================================== -static void _glfwDisableMouseCursor( void ) +static void disableMouseCursor( void ) { - if( !_glfwWin.Opened || _glfwWin.MouseLock ) + if( !_glfwWin.opened || _glfwWin.mouseLock ) { return; } @@ -87,32 +87,35 @@ _glfwPlatformHideMouseCursor(); // Move cursor to the middle of the window - _glfwPlatformSetMouseCursorPos( _glfwWin.Width>>1, - _glfwWin.Height>>1 ); + _glfwPlatformSetMouseCursorPos( _glfwWin.width >> 1, + _glfwWin.height >> 1 ); // From now on the mouse is locked - _glfwWin.MouseLock = GL_TRUE; + _glfwWin.mouseLock = GL_TRUE; } //======================================================================== -// _glfwEnableStickyKeys() - Enable sticky keys -// _glfwDisableStickyKeys() - Disable sticky keys +// Enable sticky keys //======================================================================== -static void _glfwEnableStickyKeys( void ) +static void enableStickyKeys( void ) { _glfwInput.StickyKeys = 1; } -static void _glfwDisableStickyKeys( void ) +//======================================================================== +// Disable sticky keys +//======================================================================== + +static void disableStickyKeys( void ) { int i; _glfwInput.StickyKeys = 0; // Release all sticky keys - for( i = 0; i <= GLFW_KEY_LAST; i ++ ) + for( i = 0; i <= GLFW_KEY_LAST; i++ ) { if( _glfwInput.Key[ i ] == 2 ) { @@ -123,23 +126,26 @@ //======================================================================== -// _glfwEnableStickyMouseButtons() - Enable sticky mouse buttons -// _glfwDisableStickyMouseButtons() - Disable sticky mouse buttons +// Enable sticky mouse buttons //======================================================================== -static void _glfwEnableStickyMouseButtons( void ) +static void enableStickyMouseButtons( void ) { _glfwInput.StickyMouseButtons = 1; } -static void _glfwDisableStickyMouseButtons( void ) +//======================================================================== +// Disable sticky mouse buttons +//======================================================================== + +static void disableStickyMouseButtons( void ) { int i; _glfwInput.StickyMouseButtons = 0; // Release all sticky mouse buttons - for( i = 0; i <= GLFW_MOUSE_BUTTON_LAST; i ++ ) + for( i = 0; i <= GLFW_MOUSE_BUTTON_LAST; i++ ) { if( _glfwInput.MouseButton[ i ] == 2 ) { @@ -150,13 +156,12 @@ //======================================================================== -// _glfwEnableSystemKeys() - Enable system keys -// _glfwDisableSystemKeys() - Disable system keys +// Enable system keys //======================================================================== -static void _glfwEnableSystemKeys( void ) +static void enableSystemKeys( void ) { - if( !_glfwWin.SysKeysDisabled ) + if( !_glfwWin.sysKeysDisabled ) { return; } @@ -164,12 +169,16 @@ _glfwPlatformEnableSystemKeys(); // Indicate that system keys are no longer disabled - _glfwWin.SysKeysDisabled = GL_FALSE; + _glfwWin.sysKeysDisabled = GL_FALSE; } -static void _glfwDisableSystemKeys( void ) +//======================================================================== +// Disable system keys +//======================================================================== + +static void disableSystemKeys( void ) { - if( _glfwWin.SysKeysDisabled ) + if( _glfwWin.sysKeysDisabled ) { return; } @@ -177,39 +186,45 @@ _glfwPlatformDisableSystemKeys(); // Indicate that system keys are now disabled - _glfwWin.SysKeysDisabled = GL_TRUE; + _glfwWin.sysKeysDisabled = GL_TRUE; } //======================================================================== -// _glfwEnableKeyRepeat() - Enable key repeat -// _glfwDisableKeyRepeat() - Disable key repeat +// Enable key repeat //======================================================================== -static void _glfwEnableKeyRepeat( void ) +static void enableKeyRepeat( void ) { _glfwInput.KeyRepeat = 1; } -static void _glfwDisableKeyRepeat( void ) +//======================================================================== +// Disable key repeat +//======================================================================== + +static void disableKeyRepeat( void ) { _glfwInput.KeyRepeat = 0; } //======================================================================== -// _glfwEnableAutoPollEvents() - Enable automatic event polling -// _glfwDisableAutoPollEvents() - Disable automatic event polling +// Enable automatic event polling //======================================================================== -static void _glfwEnableAutoPollEvents( void ) +static void enableAutoPollEvents( void ) { - _glfwWin.AutoPollEvents = 1; + _glfwWin.autoPollEvents = 1; } -static void _glfwDisableAutoPollEvents( void ) +//======================================================================== +// Disable automatic event polling +//======================================================================== + +static void disableAutoPollEvents( void ) { - _glfwWin.AutoPollEvents = 0; + _glfwWin.autoPollEvents = 0; } @@ -219,7 +234,7 @@ //************************************************************************ //======================================================================== -// glfwEnable() - Enable certain GLFW/window/system functions. +// Enable certain GLFW/window/system functions. //======================================================================== GLFWAPI void GLFWAPIENTRY glfwEnable( int token ) @@ -232,32 +247,32 @@ switch( token ) { - case GLFW_MOUSE_CURSOR: - _glfwEnableMouseCursor(); - break; - case GLFW_STICKY_KEYS: - _glfwEnableStickyKeys(); - break; - case GLFW_STICKY_MOUSE_BUTTONS: - _glfwEnableStickyMouseButtons(); - break; - case GLFW_SYSTEM_KEYS: - _glfwEnableSystemKeys(); - break; - case GLFW_KEY_REPEAT: - _glfwEnableKeyRepeat(); - break; - case GLFW_AUTO_POLL_EVENTS: - _glfwEnableAutoPollEvents(); - break; - default: - break; + case GLFW_MOUSE_CURSOR: + enableMouseCursor(); + break; + case GLFW_STICKY_KEYS: + enableStickyKeys(); + break; + case GLFW_STICKY_MOUSE_BUTTONS: + enableStickyMouseButtons(); + break; + case GLFW_SYSTEM_KEYS: + enableSystemKeys(); + break; + case GLFW_KEY_REPEAT: + enableKeyRepeat(); + break; + case GLFW_AUTO_POLL_EVENTS: + enableAutoPollEvents(); + break; + default: + break; } } //======================================================================== -// glfwDisable() - Disable certain GLFW/window/system functions. +// Disable certain GLFW/window/system functions. //======================================================================== GLFWAPI void GLFWAPIENTRY glfwDisable( int token ) @@ -270,26 +285,26 @@ switch( token ) { - case GLFW_MOUSE_CURSOR: - _glfwDisableMouseCursor(); - break; - case GLFW_STICKY_KEYS: - _glfwDisableStickyKeys(); - break; - case GLFW_STICKY_MOUSE_BUTTONS: - _glfwDisableStickyMouseButtons(); - break; - case GLFW_SYSTEM_KEYS: - _glfwDisableSystemKeys(); - break; - case GLFW_KEY_REPEAT: - _glfwDisableKeyRepeat(); - break; - case GLFW_AUTO_POLL_EVENTS: - _glfwDisableAutoPollEvents(); - break; - default: - break; + case GLFW_MOUSE_CURSOR: + disableMouseCursor(); + break; + case GLFW_STICKY_KEYS: + disableStickyKeys(); + break; + case GLFW_STICKY_MOUSE_BUTTONS: + disableStickyMouseButtons(); + break; + case GLFW_SYSTEM_KEYS: + disableSystemKeys(); + break; + case GLFW_KEY_REPEAT: + disableKeyRepeat(); + break; + case GLFW_AUTO_POLL_EVENTS: + disableAutoPollEvents(); + break; + default: + break; } } diff -Nru glfw-2.6/lib/fullscreen.c glfw-2.7.2/lib/fullscreen.c --- glfw-2.6/lib/fullscreen.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/fullscreen.c 2011-06-20 11:43:53.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: fullscreen.c // Platform: Any -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -36,11 +36,10 @@ //************************************************************************ //======================================================================== -// glfwGetVideoModes() - Get a list of available video modes +// Get a list of available video modes //======================================================================== -GLFWAPI int GLFWAPIENTRY glfwGetVideoModes( GLFWvidmode *list, - int maxcount ) +GLFWAPI int GLFWAPIENTRY glfwGetVideoModes( GLFWvidmode *list, int maxcount ) { int count, i, swap, res1, res2, depth1, depth2; GLFWvidmode vm; @@ -80,7 +79,7 @@ //======================================================================== -// glfwGetDesktopMode() - Get the desktop video mode +// Get the desktop video mode //======================================================================== GLFWAPI void GLFWAPIENTRY glfwGetDesktopMode( GLFWvidmode *mode ) diff -Nru glfw-2.6/lib/glext.c glfw-2.7.2/lib/glext.c --- glfw-2.6/lib/glext.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/glext.c 2011-06-20 11:43:53.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: glext.c // Platform: Any -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -35,13 +35,70 @@ //**** GLFW internal functions **** //************************************************************************ +#ifndef GL_VERSION_3_0 +#define GL_NUM_EXTENSIONS 0x821D +#define GL_CONTEXT_FLAGS 0x821E +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 +#endif + +#ifndef GL_VERSION_3_2 +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_CONTEXT_PROFILE_MASK 0x9126 +#endif + +//======================================================================== +// Parses the OpenGL version string and extracts the version number +//======================================================================== + +void _glfwParseGLVersion( int *major, int *minor, int *rev ) +{ + GLuint _major, _minor = 0, _rev = 0; + const GLubyte *version; + const GLubyte *ptr; + + // Get OpenGL version string + version = glGetString( GL_VERSION ); + if( !version ) + { + return; + } + + // Parse string + ptr = version; + for( _major = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ ) + { + _major = 10*_major + (*ptr - '0'); + } + if( *ptr == '.' ) + { + ptr ++; + for( _minor = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ ) + { + _minor = 10*_minor + (*ptr - '0'); + } + if( *ptr == '.' ) + { + ptr ++; + for( _rev = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ ) + { + _rev = 10*_rev + (*ptr - '0'); + } + } + } + + // Return parsed values + *major = _major; + *minor = _minor; + *rev = _rev; +} + //======================================================================== -// _glfwStringInExtensionString() - Check if a string can be found in an -// OpenGL extension string +// Check if a string can be found in an OpenGL extension string //======================================================================== int _glfwStringInExtensionString( const char *string, - const GLubyte *extensions ) + const GLubyte *extensions ) { const GLubyte *start; GLubyte *where, *terminator; @@ -72,23 +129,65 @@ } +//======================================================================== +// Reads back OpenGL context properties from the current context +//======================================================================== + +void _glfwRefreshContextParams( void ) +{ + _glfwParseGLVersion( &_glfwWin.glMajor, &_glfwWin.glMinor, + &_glfwWin.glRevision ); + + _glfwWin.glProfile = 0; + _glfwWin.glForward = GL_FALSE; + + // Read back the context profile, if applicable + if( _glfwWin.glMajor >= 3 ) + { + GLint flags; + glGetIntegerv( GL_CONTEXT_FLAGS, &flags ); + + if( flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT ) + { + _glfwWin.glForward = GL_TRUE; + } + } + + if( _glfwWin.glMajor > 3 || + ( _glfwWin.glMajor == 3 && _glfwWin.glMinor >= 2 ) ) + { + GLint mask; + glGetIntegerv( GL_CONTEXT_PROFILE_MASK, &mask ); + + if( mask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT ) + { + _glfwWin.glProfile = GLFW_OPENGL_COMPAT_PROFILE; + } + else if( mask & GL_CONTEXT_CORE_PROFILE_BIT ) + { + _glfwWin.glProfile = GLFW_OPENGL_CORE_PROFILE; + } + } +} + //************************************************************************ //**** GLFW user functions **** //************************************************************************ //======================================================================== -// glfwExtensionSupported() - Check if an OpenGL extension is available -// at runtime +// Check if an OpenGL extension is available at runtime //======================================================================== GLFWAPI int GLFWAPIENTRY glfwExtensionSupported( const char *extension ) { const GLubyte *extensions; - GLubyte *where; + GLubyte *where; + GLint count; + int i; // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return GL_FALSE; } @@ -100,13 +199,32 @@ return GL_FALSE; } - // Check if extension is in the standard OpenGL extensions string - extensions = (GLubyte *) glGetString( GL_EXTENSIONS ); - if( extensions != NULL ) + if( _glfwWin.glMajor < 3 ) + { + // Check if extension is in the old style OpenGL extensions string + + extensions = glGetString( GL_EXTENSIONS ); + if( extensions != NULL ) + { + if( _glfwStringInExtensionString( extension, extensions ) ) + { + return GL_TRUE; + } + } + } + else { - if( _glfwStringInExtensionString( extension, extensions ) ) + // Check if extension is in the modern OpenGL extensions string list + + glGetIntegerv( GL_NUM_EXTENSIONS, &count ); + + for( i = 0; i < count; i++ ) { - return GL_TRUE; + if( strcmp( (const char*) _glfwWin.GetStringi( GL_EXTENSIONS, i ), + extension ) == 0 ) + { + return GL_TRUE; + } } } @@ -121,14 +239,14 @@ //======================================================================== -// glfwGetProcAddress() - Get the function pointer to an OpenGL function. -// This function can be used to get access to extended OpenGL functions. +// Get the function pointer to an OpenGL function. This function can be +// used to get access to extended OpenGL functions. //======================================================================== GLFWAPI void * GLFWAPIENTRY glfwGetProcAddress( const char *procname ) { // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return NULL; } @@ -138,64 +256,28 @@ //======================================================================== -// glfwGetGLVersion() - Get OpenGL version +// Returns the OpenGL version //======================================================================== -GLFWAPI void GLFWAPIENTRY glfwGetGLVersion( int *major, int *minor, - int *rev ) +GLFWAPI void GLFWAPIENTRY glfwGetGLVersion( int *major, int *minor, int *rev ) { - GLuint _major, _minor = 0, _rev = 0; - const GLubyte *version; - GLubyte *ptr; - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return; } - // Get OpenGL version string - version = glGetString( GL_VERSION ); - if( !version ) - { - return; - } - - // Parse string - ptr = (GLubyte*) version; - for( _major = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ ) - { - _major = 10*_major + (*ptr - '0'); - } - if( *ptr == '.' ) - { - ptr ++; - for( _minor = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ ) - { - _minor = 10*_minor + (*ptr - '0'); - } - if( *ptr == '.' ) - { - ptr ++; - for( _rev = 0; *ptr >= '0' && *ptr <= '9'; ptr ++ ) - { - _rev = 10*_rev + (*ptr - '0'); - } - } - } - - // Return parsed values if( major != NULL ) { - *major = _major; + *major = _glfwWin.glMajor; } if( minor != NULL ) { - *minor = _minor; + *minor = _glfwWin.glMinor; } if( rev != NULL ) { - *rev = _rev; + *rev = _glfwWin.glRevision; } } diff -Nru glfw-2.6/lib/image.c glfw-2.7.2/lib/image.c --- glfw-2.6/lib/image.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/image.c 2011-06-20 11:43:53.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: image.c // Platform: Any -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -69,10 +69,10 @@ //************************************************************************ //======================================================================== -// _glfwUpsampleImage() - Upsample image, from size w1 x h1 to w2 x h2 +// Upsample image, from size w1 x h1 to w2 x h2 //======================================================================== -static void _glfwUpsampleImage( unsigned char *src, unsigned char *dst, +static void UpsampleImage( unsigned char *src, unsigned char *dst, int w1, int h1, int w2, int h2, int bpp ) { int m, n, k, x, y, col8; @@ -141,10 +141,10 @@ //======================================================================== -// _glfwHalveImage() - Build the next mip-map level +// Build the next mip-map level //======================================================================== -static int _glfwHalveImage( GLubyte *src, int *width, int *height, +static int HalveImage( GLubyte *src, int *width, int *height, int components ) { int halfwidth, halfheight, m, n, k, idx1, idx2; @@ -208,10 +208,10 @@ //======================================================================== -// _glfwRescaleImage() - Rescales an image into power-of-two dimensions +// Rescales an image into power-of-two dimensions //======================================================================== -static int _glfwRescaleImage( GLFWimage* image ) +static int RescaleImage( GLFWimage* image ) { int width, height, log2, newsize; unsigned char *data; @@ -219,19 +219,21 @@ // Calculate next larger 2^N width for( log2 = 0, width = image->Width; width > 1; width >>= 1, log2 ++ ) ; + width = (int) 1 << log2; if( width < image->Width ) { - width <<= 1; + width <<= 1; } // Calculate next larger 2^M height for( log2 = 0, height = image->Height; height > 1; height >>= 1, log2 ++ ) ; + height = (int) 1 << log2; if( height < image->Height ) { - height <<= 1; + height <<= 1; } // Do we really need to rescale? @@ -247,8 +249,8 @@ } // Copy old image data to new image data with interpolation - _glfwUpsampleImage( image->Data, data, image->Width, image->Height, - width, height, image->BytesPerPixel ); + UpsampleImage( image->Data, data, image->Width, image->Height, + width, height, image->BytesPerPixel ); // Free memory for old image data (not needed anymore) free( image->Data ); @@ -268,7 +270,7 @@ //************************************************************************ //======================================================================== -// glfwReadImage() - Read an image from a named file +// Read an image from a named file //======================================================================== GLFWAPI int GLFWAPIENTRY glfwReadImage( const char *name, GLFWimage *img, @@ -297,7 +299,7 @@ // We only support TGA files at the moment if( !_glfwReadTGA( &stream, img, flags ) ) { - _glfwCloseStream( &stream ); + _glfwCloseStream( &stream ); return GL_FALSE; } @@ -307,10 +309,10 @@ // Should we rescale the image to closest 2^N x 2^M resolution? if( !(flags & GLFW_NO_RESCALE_BIT) ) { - if( !_glfwRescaleImage( img ) ) - { - return GL_FALSE; - } + if( !RescaleImage( img ) ) + { + return GL_FALSE; + } } // Interpret BytesPerPixel as an OpenGL format @@ -340,10 +342,10 @@ //======================================================================== -// glfwReadMemoryImage() - Read an image file from a memory buffer +// Read an image file from a memory buffer //======================================================================== -GLFWAPI int GLFWAPIENTRY glfwReadMemoryImage( const void *data, long size, GLFWimage *img, int flags ) +GLFWAPI int GLFWAPIENTRY glfwReadMemoryImage( const void *data, long size, GLFWimage *img, int flags ) { _GLFWstream stream; @@ -368,7 +370,7 @@ // We only support TGA files at the moment if( !_glfwReadTGA( &stream, img, flags ) ) { - _glfwCloseStream( &stream ); + _glfwCloseStream( &stream ); return GL_FALSE; } @@ -378,10 +380,10 @@ // Should we rescale the image to closest 2^N x 2^M resolution? if( !(flags & GLFW_NO_RESCALE_BIT) ) { - if( !_glfwRescaleImage( img ) ) - { - return GL_FALSE; - } + if( !RescaleImage( img ) ) + { + return GL_FALSE; + } } // Interpret BytesPerPixel as an OpenGL format @@ -411,7 +413,7 @@ //======================================================================== -// glfwFreeImage() - Free allocated memory for an image +// Free allocated memory for an image //======================================================================== GLFWAPI void GLFWAPIENTRY glfwFreeImage( GLFWimage *img ) @@ -438,8 +440,7 @@ //======================================================================== -// glfwLoadTexture2D() - Read an image from a file, and upload it to -// texture memory +// Read an image from a file, and upload it to texture memory //======================================================================== GLFWAPI int GLFWAPIENTRY glfwLoadTexture2D( const char *name, int flags ) @@ -447,15 +448,15 @@ GLFWimage img; // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return GL_FALSE; } // Force rescaling if necessary - if( !_glfwWin.Has_GL_ARB_texture_non_power_of_two ) + if( !_glfwWin.has_GL_ARB_texture_non_power_of_two ) { - flags &= (~GLFW_NO_RESCALE_BIT); + flags &= (~GLFW_NO_RESCALE_BIT); } // Read image from file @@ -466,7 +467,7 @@ if( !glfwLoadTextureImage2D( &img, flags ) ) { - return GL_FALSE; + return GL_FALSE; } // Data buffer is not needed anymore @@ -477,8 +478,7 @@ //======================================================================== -// glfwLoadMemoryTexture2D() - Read an image from a buffer, and upload it to -// texture memory +// Read an image from a buffer, and upload it to texture memory //======================================================================== GLFWAPI int GLFWAPIENTRY glfwLoadMemoryTexture2D( const void *data, long size, int flags ) @@ -486,15 +486,15 @@ GLFWimage img; // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return GL_FALSE; } // Force rescaling if necessary - if( !_glfwWin.Has_GL_ARB_texture_non_power_of_two ) + if( !_glfwWin.has_GL_ARB_texture_non_power_of_two ) { - flags &= (~GLFW_NO_RESCALE_BIT); + flags &= (~GLFW_NO_RESCALE_BIT); } // Read image from file @@ -505,7 +505,7 @@ if( !glfwLoadTextureImage2D( &img, flags ) ) { - return GL_FALSE; + return GL_FALSE; } // Data buffer is not needed anymore @@ -516,7 +516,7 @@ //======================================================================== -// glfwLoadTextureImage2D() - Upload an image object to texture memory +// Upload an image object to texture memory //======================================================================== GLFWAPI int GLFWAPIENTRY glfwLoadTextureImage2D( GLFWimage *img, int flags ) @@ -526,7 +526,7 @@ unsigned char *data, *dataptr; // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return GL_FALSE; } @@ -536,7 +536,7 @@ // NOTE: May require box filter downsampling routine. // Do we need to convert the alpha map to RGBA format (OpenGL 1.0)? - if( (_glfwWin.GLVerMajor == 1) && (_glfwWin.GLVerMinor == 0) && + if( (_glfwWin.glMajor == 1) && (_glfwWin.glMinor == 0) && (img->Format == GL_ALPHA) ) { // We go to RGBA representation instead @@ -574,7 +574,7 @@ // Should we use automatic mipmap generation? AutoGen = ( flags & GLFW_BUILD_MIPMAPS_BIT ) && - _glfwWin.Has_GL_SGIS_generate_mipmap; + _glfwWin.has_GL_SGIS_generate_mipmap; // Enable automatic mipmap generation if( AutoGen ) @@ -586,7 +586,7 @@ } // Format specification is different for OpenGL 1.0 - if( _glfwWin.GLVerMajor == 1 && _glfwWin.GLVerMinor == 0 ) + if( _glfwWin.glMajor == 1 && _glfwWin.glMinor == 0 ) { format = img->BytesPerPixel; } @@ -607,7 +607,7 @@ // Build next mipmap level manually, if required if( ( flags & GLFW_BUILD_MIPMAPS_BIT ) && !AutoGen ) { - level = _glfwHalveImage( img->Data, &img->Width, + level = HalveImage( img->Data, &img->Width, &img->Height, img->BytesPerPixel ) ? level + 1 : 0; } diff -Nru glfw-2.6/lib/init.c glfw-2.7.2/lib/init.c --- glfw-2.6/lib/init.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/init.c 2011-06-20 11:43:53.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: init.c // Platform: Any -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -37,7 +37,7 @@ //************************************************************************ //======================================================================== -// glfwInit() - Initialize various GLFW state +// Initialize various GLFW state //======================================================================== GLFWAPI int GLFWAPIENTRY glfwInit( void ) @@ -48,11 +48,14 @@ return GL_TRUE; } + memset( &_glfwLibrary, 0, sizeof( _glfwLibrary ) ); + memset( &_glfwWin, 0, sizeof( _glfwWin ) ); + // Window is not yet opened - _glfwWin.Opened = GL_FALSE; + _glfwWin.opened = GL_FALSE; // Default enable/disable settings - _glfwWin.SysKeysDisabled = GL_FALSE; + _glfwWin.sysKeysDisabled = GL_FALSE; // Clear window hints _glfwClearWindowHints(); @@ -72,7 +75,7 @@ //======================================================================== -// glfwTerminate() - Close window and kill all threads. +// Close window and kill all threads. //======================================================================== GLFWAPI void GLFWAPIENTRY glfwTerminate( void ) @@ -95,11 +98,10 @@ //======================================================================== -// glfwGetVersion() - Get GLFW version +// Get GLFW version //======================================================================== -GLFWAPI void GLFWAPIENTRY glfwGetVersion( int *major, int *minor, - int *rev ) +GLFWAPI void GLFWAPIENTRY glfwGetVersion( int *major, int *minor, int *rev ) { if( major != NULL ) *major = GLFW_VERSION_MAJOR; if( minor != NULL ) *minor = GLFW_VERSION_MINOR; diff -Nru glfw-2.6/lib/input.c glfw-2.7.2/lib/input.c --- glfw-2.6/lib/input.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/input.c 2011-06-20 11:43:53.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: input.c // Platform: Any -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -32,13 +32,12 @@ //======================================================================== -// glfwGetKey() +// Return key state //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetKey( int key ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return GLFW_RELEASE; } @@ -61,13 +60,12 @@ //======================================================================== -// glfwGetMouseButton() +// Return mouse button state //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetMouseButton( int button ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return GLFW_RELEASE; } @@ -90,13 +88,12 @@ //======================================================================== -// glfwGetMousePos() +// Return mouse cursor position //======================================================================== GLFWAPI void GLFWAPIENTRY glfwGetMousePos( int *xpos, int *ypos ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return; } @@ -114,13 +111,12 @@ //======================================================================== -// glfwSetMousePos() +// Sets the mouse cursor position //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetMousePos( int xpos, int ypos ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return; } @@ -136,7 +132,7 @@ _glfwInput.MousePosY = ypos; // If we have a locked mouse, do not change cursor position - if( _glfwWin.MouseLock ) + if( _glfwWin.mouseLock ) { return; } @@ -147,13 +143,12 @@ //======================================================================== -// glfwGetMouseWheel() +// Return mouse wheel position //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetMouseWheel( void ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return 0; } @@ -164,13 +159,12 @@ //======================================================================== -// glfwSetMouseWheel() +// Set mouse wheel position //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetMouseWheel( int pos ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return; } @@ -181,70 +175,66 @@ //======================================================================== -// glfwSetKeyCallback() - Set callback function for keyboard input +// Set callback function for keyboard input //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetKeyCallback( GLFWkeyfun cbfun ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set callback function - _glfwWin.KeyCallback = cbfun; + _glfwWin.keyCallback = cbfun; } //======================================================================== -// glfwSetCharCallback() - Set callback function for character input +// Set callback function for character input //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetCharCallback( GLFWcharfun cbfun ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set callback function - _glfwWin.CharCallback = cbfun; + _glfwWin.charCallback = cbfun; } //======================================================================== -// glfwSetMouseButtonCallback() - Set callback function for mouse clicks +// Set callback function for mouse clicks //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetMouseButtonCallback( GLFWmousebuttonfun cbfun ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set callback function - _glfwWin.MouseButtonCallback = cbfun; + _glfwWin.mouseButtonCallback = cbfun; } //======================================================================== -// glfwSetMousePosCallback() - Set callback function for mouse moves +// Set callback function for mouse moves //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetMousePosCallback( GLFWmouseposfun cbfun ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set callback function - _glfwWin.MousePosCallback = cbfun; + _glfwWin.mousePosCallback = cbfun; // Call the callback function to let the application know the current // mouse position @@ -256,19 +246,18 @@ //======================================================================== -// glfwSetMouseWheelCallback() - Set callback function for mouse wheel +// Set callback function for mouse wheel //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetMouseWheelCallback( GLFWmousewheelfun cbfun ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set callback function - _glfwWin.MouseWheelCallback = cbfun; + _glfwWin.mouseWheelCallback = cbfun; // Call the callback function to let the application know the current // mouse wheel position diff -Nru glfw-2.6/lib/internal.h glfw-2.7.2/lib/internal.h --- glfw-2.6/lib/internal.h 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/internal.h 2011-05-05 15:34:14.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: internal.h // Platform: Any -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -48,7 +48,7 @@ //======================================================================== // Internal key and button state/action definitions -#define GLFW_STICK 2 +#define GLFW_STICK 2 //======================================================================== @@ -61,6 +61,30 @@ //------------------------------------------------------------------------ +// Window opening hints (set by glfwOpenWindowHint) +// A bucket of semi-random stuff bunched together for historical reasons +// This is used only by the platform independent code and only to store +// parameters passed to us by glfwOpenWindowHint +//------------------------------------------------------------------------ +typedef struct { + int refreshRate; + int accumRedBits; + int accumGreenBits; + int accumBlueBits; + int accumAlphaBits; + int auxBuffers; + int stereo; + int windowNoResize; + int samples; + int glMajor; + int glMinor; + int glForward; + int glDebug; + int glProfile; +} _GLFWhints; + + +//------------------------------------------------------------------------ // Platform specific definitions goes in platform.h (which also includes // glfw.h) //------------------------------------------------------------------------ @@ -68,6 +92,49 @@ #include "platform.h" +//------------------------------------------------------------------------ +// Parameters relating to the creation of the context and window but not +// directly related to the properties of the framebuffer +// This is used to pass window and context creation parameters from the +// platform independent code to the platform specific code +//------------------------------------------------------------------------ +typedef struct { + int mode; + int refreshRate; + int windowNoResize; + int glMajor; + int glMinor; + int glForward; + int glDebug; + int glProfile; +} _GLFWwndconfig; + + +//------------------------------------------------------------------------ +// Framebuffer configuration descriptor, i.e. buffers and their sizes +// Also a platform specific ID used to map back to the actual backend APIs +// This is used to pass framebuffer parameters from the platform independent +// code to the platform specific code, and also to enumerate and select +// available framebuffer configurations +//------------------------------------------------------------------------ +typedef struct { + int redBits; + int greenBits; + int blueBits; + int alphaBits; + int depthBits; + int stencilBits; + int accumRedBits; + int accumGreenBits; + int accumBlueBits; + int accumAlphaBits; + int auxBuffers; + int stereo; + int samples; + GLFWintptr platformID; +} _GLFWfbconfig; + + //======================================================================== // System independent global variables (GLFW internals) //======================================================================== @@ -81,31 +148,13 @@ //------------------------------------------------------------------------ -// Window hints (set by glfwOpenWindowHint - will go into _GLFWthread) -//------------------------------------------------------------------------ -typedef struct { - int RefreshRate; - int AccumRedBits; - int AccumGreenBits; - int AccumBlueBits; - int AccumAlphaBits; - int AuxBuffers; - int Stereo; - int WindowNoResize; - int Samples; -} _GLFWhints; - -GLFWGLOBAL _GLFWhints _glfwWinHints; - - -//------------------------------------------------------------------------ -// Abstracted data stream (for image I/O) +// Abstract data stream (for image I/O) //------------------------------------------------------------------------ typedef struct { - FILE* File; - void* Data; - long Position; - long Size; + FILE* file; + void* data; + long position; + long size; } _GLFWstream; @@ -126,7 +175,7 @@ void _glfwPlatformGetDesktopMode( GLFWvidmode *mode ); // OpenGL extensions -int _glfwPlatformExtensionSupported( const char *extension ); +int _glfwPlatformExtensionSupported( const char *extension ); void * _glfwPlatformGetProcAddress( const char *procname ); // Joystick @@ -136,27 +185,27 @@ // Threads GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg ); -void _glfwPlatformDestroyThread( GLFWthread ID ); -int _glfwPlatformWaitThread( GLFWthread ID, int waitmode ); +void _glfwPlatformDestroyThread( GLFWthread ID ); +int _glfwPlatformWaitThread( GLFWthread ID, int waitmode ); GLFWthread _glfwPlatformGetThreadID( void ); -GLFWmutex _glfwPlatformCreateMutex( void ); -void _glfwPlatformDestroyMutex( GLFWmutex mutex ); -void _glfwPlatformLockMutex( GLFWmutex mutex ); -void _glfwPlatformUnlockMutex( GLFWmutex mutex ); -GLFWcond _glfwPlatformCreateCond( void ); -void _glfwPlatformDestroyCond( GLFWcond cond ); -void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, double timeout ); -void _glfwPlatformSignalCond( GLFWcond cond ); -void _glfwPlatformBroadcastCond( GLFWcond cond ); -int _glfwPlatformGetNumberOfProcessors( void ); +GLFWmutex _glfwPlatformCreateMutex( void ); +void _glfwPlatformDestroyMutex( GLFWmutex mutex ); +void _glfwPlatformLockMutex( GLFWmutex mutex ); +void _glfwPlatformUnlockMutex( GLFWmutex mutex ); +GLFWcond _glfwPlatformCreateCond( void ); +void _glfwPlatformDestroyCond( GLFWcond cond ); +void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, double timeout ); +void _glfwPlatformSignalCond( GLFWcond cond ); +void _glfwPlatformBroadcastCond( GLFWcond cond ); +int _glfwPlatformGetNumberOfProcessors( void ); // Time double _glfwPlatformGetTime( void ); -void _glfwPlatformSetTime( double time ); -void _glfwPlatformSleep( double time ); +void _glfwPlatformSetTime( double time ); +void _glfwPlatformSleep( double time ); // Window management -int _glfwPlatformOpenWindow( int width, int height, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int mode, _GLFWhints* hints ); +int _glfwPlatformOpenWindow( int width, int height, const _GLFWwndconfig *wndconfig, const _GLFWfbconfig *fbconfig ); void _glfwPlatformCloseWindow( void ); void _glfwPlatformSetWindowTitle( const char *title ); void _glfwPlatformSetWindowSize( int width, int height ); @@ -193,18 +242,25 @@ void _glfwRemoveThread( _GLFWthread * t ); // OpenGL extensions (glext.c) +void _glfwParseGLVersion( int *major, int *minor, int *rev ); int _glfwStringInExtensionString( const char *string, const GLubyte *extensions ); +void _glfwRefreshContextParams( void ); // Abstracted data streams (stream.c) -int _glfwOpenFileStream( _GLFWstream *stream, const char *name, const char *mode ); -int _glfwOpenBufferStream( _GLFWstream *stream, void *data, long size ); +int _glfwOpenFileStream( _GLFWstream *stream, const char *name, const char *mode ); +int _glfwOpenBufferStream( _GLFWstream *stream, void *data, long size ); long _glfwReadStream( _GLFWstream *stream, void *data, long size ); long _glfwTellStream( _GLFWstream *stream ); -int _glfwSeekStream( _GLFWstream *stream, long offset, int whence ); +int _glfwSeekStream( _GLFWstream *stream, long offset, int whence ); void _glfwCloseStream( _GLFWstream *stream ); // Targa image I/O (tga.c) -int _glfwReadTGA( _GLFWstream *s, GLFWimage *img, int flags ); +int _glfwReadTGA( _GLFWstream *s, GLFWimage *img, int flags ); + +// Framebuffer configs +const _GLFWfbconfig *_glfwChooseFBConfig( const _GLFWfbconfig *desired, + const _GLFWfbconfig *alternatives, + unsigned int count ); #endif // _internal_h_ diff -Nru glfw-2.6/lib/joystick.c glfw-2.7.2/lib/joystick.c --- glfw-2.6/lib/joystick.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/joystick.c 2011-06-20 11:43:53.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: joystick.c // Platform: Any -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -36,12 +36,11 @@ //************************************************************************ //======================================================================== -// glfwGetJoystickParam() - Determine joystick capabilities +// Determine joystick capabilities //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetJoystickParam( int joy, int param ) { - // Is GLFW initialized? if( !_glfwInitialized ) { return 0; @@ -52,15 +51,13 @@ //======================================================================== -// glfwGetJoystickPos() - Get joystick axis positions +// Get joystick axis positions //======================================================================== -GLFWAPI int GLFWAPIENTRY glfwGetJoystickPos( int joy, float *pos, - int numaxes ) +GLFWAPI int GLFWAPIENTRY glfwGetJoystickPos( int joy, float *pos, int numaxes ) { - int i; + int i; - // Is GLFW initialized? if( !_glfwInitialized ) { return 0; @@ -77,15 +74,15 @@ //======================================================================== -// glfwGetJoystickButtons() - Get joystick button states +// Get joystick button states //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetJoystickButtons( int joy, - unsigned char *buttons, int numbuttons ) + unsigned char *buttons, + int numbuttons ) { - int i; + int i; - // Is GLFW initialized? if( !_glfwInitialized ) { return 0; @@ -99,3 +96,4 @@ return _glfwPlatformGetJoystickButtons( joy, buttons, numbuttons ); } + diff -Nru glfw-2.6/lib/macosx/libglfw.pc.in glfw-2.7.2/lib/macosx/libglfw.pc.in --- glfw-2.6/lib/macosx/libglfw.pc.in 2007-03-15 03:22:43.000000000 +0000 +++ glfw-2.7.2/lib/macosx/libglfw.pc.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -prefix=@PREFIX@ -exec_prefix=@PREFIX@ -libdir=@PREFIX@/lib -includedir=@PREFIX@/include - -Name: GLFW -Description: A portable framework for OpenGL development -Version: 2.6.0 -URL: http://glfw.sourceforge.net/ -Libs: -L${libdir} -lglfw -framework AGL -framework OpenGL -framework Carbon -Cflags: -I${includedir} diff -Nru glfw-2.6/lib/macosx/macosx_enable.c glfw-2.7.2/lib/macosx/macosx_enable.c --- glfw-2.6/lib/macosx/macosx_enable.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/macosx/macosx_enable.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: macosx_enable.c -// Platform: Mac OS X -// API Version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -void _glfwPlatformEnableSystemKeys( void ) -{ - // Nothing to do; event handling code checks the status of - // _glfwWin.SysKeysDisabled to ensure this behavior. -} - -void _glfwPlatformDisableSystemKeys( void ) -{ - // Nothing to do; event handling code checks the status of - // _glfwWin.SysKeysDisabled to ensure this behavior. -} - diff -Nru glfw-2.6/lib/macosx/macosx_fullscreen.c glfw-2.7.2/lib/macosx/macosx_fullscreen.c --- glfw-2.6/lib/macosx/macosx_fullscreen.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/macosx/macosx_fullscreen.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,126 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: macosx_fullscreen.c -// Platform: Mac OS X -// API Version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - -//======================================================================== -// _glfwVideoModesEqual() - Compares two video modes -//======================================================================== - -static int _glfwVideoModesEqual( GLFWvidmode* first, - GLFWvidmode* second ) -{ - if( first->Width != second->Width ) - return 0; - - if( first->Height != second->Height ) - return 0; - - if( first->RedBits + first->GreenBits + first->BlueBits != - second->RedBits + second->GreenBits + second->BlueBits ) - return 0; - - return 1; -} - -//======================================================================== -// _glfwCGToGLFWVideoMode() - Converts a CG mode to a GLFW mode -//======================================================================== - -static void _glfwCGToGLFWVideoMode( CFDictionaryRef cgMode, - GLFWvidmode* glfwMode ) -{ - int bitsPerSample; - - CFNumberGetValue( CFDictionaryGetValue( cgMode, kCGDisplayWidth ), - kCFNumberIntType, - &(glfwMode->Width) ); - CFNumberGetValue( CFDictionaryGetValue( cgMode, kCGDisplayHeight ), - kCFNumberIntType, - &(glfwMode->Height) ); - - CFNumberGetValue( CFDictionaryGetValue( cgMode, kCGDisplayBitsPerSample ), - kCFNumberIntType, - &bitsPerSample ); - - glfwMode->RedBits = bitsPerSample; - glfwMode->GreenBits = bitsPerSample; - glfwMode->BlueBits = bitsPerSample; -} - -//======================================================================== -// _glfwPlatformGetVideoModes() - Get a list of available video modes -//======================================================================== - -int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount ) -{ - int i, j, maxModes, numModes; - GLFWvidmode mode; - CFArrayRef availableModes = CGDisplayAvailableModes( kCGDirectMainDisplay ); - CFIndex numberOfAvailableModes = CFArrayGetCount( availableModes ); - - numModes = 0; - maxModes = ( numberOfAvailableModes < maxcount ? - numberOfAvailableModes : - maxcount ); - - for( i = 0; i < maxModes; ++i ) - { - _glfwCGToGLFWVideoMode( CFArrayGetValueAtIndex( availableModes, i ), - &mode ); - - // Is it a valid mode? (only list depths >= 15 bpp) - if( mode.RedBits + mode.GreenBits + mode.BlueBits < 15 ) - continue; - - // Check for duplicate of current mode in target list - for( j = 0; j < numModes; ++j ) - { - if( _glfwVideoModesEqual( &mode, &(list[j]) ) ) - break; - } - - // If empty list or no match found - if( numModes == 0 || j == numModes ) - list[numModes++] = mode; - } - - return numModes; -} - -//======================================================================== -// glfwGetDesktopMode() - Get the desktop video mode -//======================================================================== - -void _glfwPlatformGetDesktopMode( GLFWvidmode *mode ) -{ - _glfwCGToGLFWVideoMode( _glfwDesktopVideoMode, mode ); -} - diff -Nru glfw-2.6/lib/macosx/macosx_glext.c glfw-2.7.2/lib/macosx/macosx_glext.c --- glfw-2.6/lib/macosx/macosx_glext.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/macosx/macosx_glext.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: macosx_glext.c -// Platform: Mac OS X -// API Version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - -int _glfwPlatformExtensionSupported( const char *extension ) -{ - // There are no AGL, CGL or NSGL extensions. - return GL_FALSE; -} - -void * _glfwPlatformGetProcAddress( const char *procname ) -{ - CFStringRef symbolName = CFStringCreateWithCString( kCFAllocatorDefault, - procname, - kCFStringEncodingASCII ); - - void *symbol = CFBundleGetFunctionPointerForName( _glfwLibrary.Libs.OpenGLFramework, - symbolName ); - - CFRelease( symbolName ); - - return symbol; -} - diff -Nru glfw-2.6/lib/macosx/macosx_init.c glfw-2.7.2/lib/macosx/macosx_init.c --- glfw-2.6/lib/macosx/macosx_init.c 2007-07-12 03:13:45.000000000 +0000 +++ glfw-2.7.2/lib/macosx/macosx_init.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,194 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: macosx_init.c -// Platform: Mac OS X -// API Version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - -#include - -//======================================================================== -// Global variables -//======================================================================== - -// KCHR resource pointer for keycode translation -void *KCHRPtr; - - -//======================================================================== -// _glfwInitThreads() - Initialize GLFW thread package -//======================================================================== - -static void _glfwInitThreads( void ) -{ - // Initialize critical section handle - (void) pthread_mutex_init( &_glfwThrd.CriticalSection, NULL ); - - // The first thread (the main thread) has ID 0 - _glfwThrd.NextID = 0; - - // Fill out information about the main thread (this thread) - _glfwThrd.First.ID = _glfwThrd.NextID ++; - _glfwThrd.First.Function = NULL; - _glfwThrd.First.PosixID = pthread_self(); - _glfwThrd.First.Previous = NULL; - _glfwThrd.First.Next = NULL; -} - -#define NO_BUNDLE_MESSAGE \ - "Working in unbundled mode. " \ - "You should build a .app wrapper for your Mac OS X applications.\n" - -#define UNBUNDLED \ - fprintf(stderr, NO_BUNDLE_MESSAGE); \ - _glfwLibrary.Unbundled = 1; \ - return - -void _glfwChangeToResourcesDirectory( void ) -{ - CFBundleRef mainBundle = CFBundleGetMainBundle(); - CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL( mainBundle ); - char resourcesPath[ _GLFW_MAX_PATH_LENGTH ]; - - CFStringRef lastComponent = CFURLCopyLastPathComponent( resourcesURL ); - if ( kCFCompareEqualTo != CFStringCompare( - CFSTR( "Resources" ), - lastComponent, - 0 ) ) - { - UNBUNDLED; - } - - CFRelease( lastComponent ); - - if( !CFURLGetFileSystemRepresentation( resourcesURL, - TRUE, - (UInt8*)resourcesPath, - _GLFW_MAX_PATH_LENGTH ) ) - { - CFRelease( resourcesURL ); - UNBUNDLED; - } - - CFRelease( resourcesURL ); - - if( chdir( resourcesPath ) != 0 ) - { - UNBUNDLED; - } -} - -int _glfwPlatformInit( void ) -{ - struct timeval tv; - UInt32 nullDummy = 0; - - _glfwWin.MacWindow = NULL; - _glfwWin.AGLContext = NULL; - _glfwWin.CGLContext = NULL; - _glfwWin.WindowFunctions = NULL; - _glfwWin.MouseUPP = NULL; - _glfwWin.CommandUPP = NULL; - _glfwWin.KeyboardUPP = NULL; - _glfwWin.WindowUPP = NULL; - - _glfwInput.Modifiers = 0; - - _glfwLibrary.Unbundled = 0; - - _glfwLibrary.Libs.OpenGLFramework - = CFBundleGetBundleWithIdentifier( CFSTR( "com.apple.opengl" ) ); - if( _glfwLibrary.Libs.OpenGLFramework == NULL ) - { - fprintf( - stderr, - "glfwInit failing because you aren't linked to OpenGL\n" ); - return GL_FALSE; - } - - _glfwDesktopVideoMode = CGDisplayCurrentMode( kCGDirectMainDisplay ); - if( _glfwDesktopVideoMode == NULL ) - { - fprintf( - stderr, - "glfwInit failing because it kind find the desktop display mode\n" ); - return GL_FALSE; - } - - _glfwInitThreads(); - - _glfwChangeToResourcesDirectory(); - - if( !_glfwInstallEventHandlers() ) - { - fprintf( - stderr, - "glfwInit failing because it can't install event handlers\n" ); - _glfwPlatformTerminate(); - return GL_FALSE; - } - - // Ugly hack to reduce the nasty jump that occurs at the first non- - // sys keypress, caused by OS X loading certain meta scripts used - // for lexical- and raw keycode translation - instead of letting - // this happen while our application is running, we do some blunt - // function calls in advance just to get the script caching out of - // the way BEFORE our window/screen is opened. These calls might - // generate err return codes, but we don't care in this case. - // NOTE: KCHRPtr is declared globally, because we need it later on. - KCHRPtr = (void *)GetScriptVariable( smCurrentScript, smKCHRCache ); - KeyTranslate( KCHRPtr, 0, &nullDummy ); - UppercaseText( (char *)&nullDummy, 0, smSystemScript ); - - gettimeofday( &tv, NULL ); - _glfwLibrary.Timer.t0 = tv.tv_sec + (double) tv.tv_usec / 1000000.0; - - return GL_TRUE; -} - -int _glfwPlatformTerminate( void ) -{ - if( _glfwWin.MouseUPP != NULL ) - { - DisposeEventHandlerUPP( _glfwWin.MouseUPP ); - _glfwWin.MouseUPP = NULL; - } - if( _glfwWin.CommandUPP != NULL ) - { - DisposeEventHandlerUPP( _glfwWin.CommandUPP ); - _glfwWin.CommandUPP = NULL; - } - if( _glfwWin.KeyboardUPP != NULL ) - { - DisposeEventHandlerUPP( _glfwWin.KeyboardUPP ); - _glfwWin.KeyboardUPP = NULL; - } - - return GL_TRUE; -} - diff -Nru glfw-2.6/lib/macosx/macosx_joystick.c glfw-2.7.2/lib/macosx/macosx_joystick.c --- glfw-2.6/lib/macosx/macosx_joystick.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/macosx/macosx_joystick.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: macosx_joystick.c -// Platform: Mac OS X -// API Version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - -// TO DO: use HID manager to implement joystick support. - -int _glfwPlatformGetJoystickParam( int joy, int param ) -{ - // GL_FALSE == 0 - return 0; -} - -int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes ) -{ - return 0; -} - -int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons ) -{ - return 0; -} - diff -Nru glfw-2.6/lib/macosx/macosx_thread.c glfw-2.7.2/lib/macosx/macosx_thread.c --- glfw-2.6/lib/macosx/macosx_thread.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/macosx/macosx_thread.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,414 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: macosx_thread.c -// Platform: Mac OS X -// API Version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - - - -//************************************************************************ -//**** GLFW internal functions **** -//************************************************************************ - -//======================================================================== -// _glfwNewThread() - This is simply a "wrapper" for calling the user -// thread function. -//======================================================================== - -void * _glfwNewThread( void * arg ) -{ - GLFWthreadfun threadfun; - _GLFWthread *t; - - // Get pointer to thread information for current thread - t = _glfwGetThreadPointer( glfwGetThreadID() ); - if( t == NULL ) - { - return 0; - } - - // Get user thread function pointer - threadfun = t->Function; - - // Call the user thread function - threadfun( arg ); - - // Remove thread from thread list - ENTER_THREAD_CRITICAL_SECTION - _glfwRemoveThread( t ); - LEAVE_THREAD_CRITICAL_SECTION - - // When the thread function returns, the thread will die... - return NULL; -} - - - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// _glfwPlatformCreateThread() - Create a new thread -//======================================================================== - -GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg ) -{ - GLFWthread ID; - _GLFWthread *t; - int result; - - // Enter critical section - ENTER_THREAD_CRITICAL_SECTION - - // Create a new thread information memory area - t = (_GLFWthread *) malloc( sizeof(_GLFWthread) ); - if( t == NULL ) - { - // Leave critical section - LEAVE_THREAD_CRITICAL_SECTION - return -1; - } - - // Get a new unique thread id - ID = _glfwThrd.NextID ++; - - // Store thread information in the thread list - t->Function = fun; - t->ID = ID; - - // Create thread - result = pthread_create( - &t->PosixID, // Thread handle - NULL, // Default thread attributes - _glfwNewThread, // Thread function (a wrapper function) - (void *)arg // Argument to thread is user argument - ); - - // Did the thread creation fail? - if( result != 0 ) - { - free( (void *) t ); - LEAVE_THREAD_CRITICAL_SECTION - return -1; - } - - // Append thread to thread list - _glfwAppendThread( t ); - - // Leave critical section - LEAVE_THREAD_CRITICAL_SECTION - - // Return the GLFW thread ID - return ID; -} - - -//======================================================================== -// _glfwPlatformDestroyThread() - Kill a thread. NOTE: THIS IS A VERY -// DANGEROUS OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME -// SITUATIONS! -//======================================================================== - -void _glfwPlatformDestroyThread( GLFWthread ID ) -{ - _GLFWthread *t; - - // Enter critical section - ENTER_THREAD_CRITICAL_SECTION - - // Get thread information pointer - t = _glfwGetThreadPointer( ID ); - if( t == NULL ) - { - LEAVE_THREAD_CRITICAL_SECTION - return; - } - - // Simply murder the process, no mercy! - pthread_kill( t->PosixID, SIGKILL ); - - // Remove thread from thread list - _glfwRemoveThread( t ); - - // Leave critical section - LEAVE_THREAD_CRITICAL_SECTION -} - - -//======================================================================== -// _glfwPlatformWaitThread() - Wait for a thread to die -//======================================================================== - -int _glfwPlatformWaitThread( GLFWthread ID, int waitmode ) -{ - pthread_t thread; - _GLFWthread *t; - - // Enter critical section - ENTER_THREAD_CRITICAL_SECTION - - // Get thread information pointer - t = _glfwGetThreadPointer( ID ); - - // Is the thread already dead? - if( t == NULL ) - { - LEAVE_THREAD_CRITICAL_SECTION - return GL_TRUE; - } - - // If got this far, the thread is alive => polling returns FALSE - if( waitmode == GLFW_NOWAIT ) - { - LEAVE_THREAD_CRITICAL_SECTION - return GL_FALSE; - } - - // Get thread handle - thread = t->PosixID; - - // Leave critical section - LEAVE_THREAD_CRITICAL_SECTION - - // Wait for thread to die - (void) pthread_join( thread, NULL ); - - return GL_TRUE; -} - - -//======================================================================== -// _glfwPlatformGetThreadID() - Return the thread ID for the current -// thread -//======================================================================== - -GLFWthread _glfwPlatformGetThreadID( void ) -{ - _GLFWthread *t; - GLFWthread ID = -1; - pthread_t posixID; - - // Get current thread ID - posixID = pthread_self(); - - // Enter critical section - ENTER_THREAD_CRITICAL_SECTION - - // Loop through entire list of threads to find the matching POSIX - // thread ID - for( t = &_glfwThrd.First; t != NULL; t = t->Next ) - { - if( t->PosixID == posixID ) - { - ID = t->ID; - break; - } - } - - // Leave critical section - LEAVE_THREAD_CRITICAL_SECTION - - // Return the found GLFW thread identifier - return ID; -} - - -//======================================================================== -// _glfwPlatformCreateMutex() - Create a mutual exclusion object -//======================================================================== - -GLFWmutex _glfwPlatformCreateMutex( void ) -{ - pthread_mutex_t *mutex; - - // Allocate memory for mutex - mutex = (pthread_mutex_t *) malloc( sizeof( pthread_mutex_t ) ); - if( !mutex ) - { - return NULL; - } - - // Initialise a mutex object - (void) pthread_mutex_init( mutex, NULL ); - - // Cast to GLFWmutex and return - return (GLFWmutex) mutex; -} - - -//======================================================================== -// _glfwPlatformDestroyMutex() - Destroy a mutual exclusion object -//======================================================================== - -void _glfwPlatformDestroyMutex( GLFWmutex mutex ) -{ - // Destroy the mutex object - pthread_mutex_destroy( (pthread_mutex_t *) mutex ); - - // Free memory for mutex object - free( (void *) mutex ); -} - - -//======================================================================== -// _glfwPlatformLockMutex() - Request access to a mutex -//======================================================================== - -void _glfwPlatformLockMutex( GLFWmutex mutex ) -{ - // Wait for mutex to be released - (void) pthread_mutex_lock( (pthread_mutex_t *) mutex ); -} - - -//======================================================================== -// _glfwPlatformUnlockMutex() - Release a mutex -//======================================================================== - -void _glfwPlatformUnlockMutex( GLFWmutex mutex ) -{ - // Release mutex - pthread_mutex_unlock( (pthread_mutex_t *) mutex ); -} - - -//======================================================================== -// _glfwPlatformCreateCond() - Create a new condition variable object -//======================================================================== - -GLFWcond _glfwPlatformCreateCond( void ) -{ - pthread_cond_t *cond; - - // Allocate memory for condition variable - cond = (pthread_cond_t *) malloc( sizeof(pthread_cond_t) ); - if( !cond ) - { - return NULL; - } - - // Initialise condition variable - (void) pthread_cond_init( cond, NULL ); - - // Cast to GLFWcond and return - return (GLFWcond) cond; -} - - -//======================================================================== -// _glfwPlatformDestroyCond() - Destroy a condition variable object -//======================================================================== - -void _glfwPlatformDestroyCond( GLFWcond cond ) -{ - // Destroy the condition variable object - (void) pthread_cond_destroy( (pthread_cond_t *) cond ); - - // Free memory for condition variable object - free( (void *) cond ); -} - - -//======================================================================== -// _glfwPlatformWaitCond() - Wait for a condition to be raised -//======================================================================== - -void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, - double timeout ) -{ - struct timeval currenttime; - struct timespec wait; - long dt_sec, dt_usec; - - // Select infinite or timed wait - if( timeout >= GLFW_INFINITY ) - { - // Wait for condition (infinite wait) - (void) pthread_cond_wait( (pthread_cond_t *) cond, - (pthread_mutex_t *) mutex ); - } - else - { - // Set timeout time, relatvie to current time - gettimeofday( ¤ttime, NULL ); - dt_sec = (long) timeout; - dt_usec = (long) ((timeout - (double)dt_sec) * 1000000.0); - wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L; - if( wait.tv_nsec > 1000000000L ) - { - wait.tv_nsec -= 1000000000L; - dt_sec ++; - } - wait.tv_sec = currenttime.tv_sec + dt_sec; - - // Wait for condition (timed wait) - (void) pthread_cond_timedwait( (pthread_cond_t *) cond, - (pthread_mutex_t *) mutex, &wait ); - } -} - - -//======================================================================== -// _glfwPlatformSignalCond() - Signal a condition to one waiting thread -//======================================================================== - -void _glfwPlatformSignalCond( GLFWcond cond ) -{ - // Signal condition - (void) pthread_cond_signal( (pthread_cond_t *) cond ); -} - - -//======================================================================== -// _glfwPlatformBroadcastCond() - Broadcast a condition to all waiting -// threads -//======================================================================== - -void _glfwPlatformBroadcastCond( GLFWcond cond ) -{ - // Broadcast condition - (void) pthread_cond_broadcast( (pthread_cond_t *) cond ); -} - - -//======================================================================== -// _glfwPlatformGetNumberOfProcessors() - Return the number of processors -// in the system. -//======================================================================== - -int _glfwPlatformGetNumberOfProcessors( void ) -{ - int n; - - // Get number of processors online - _glfw_numprocessors( n ); - return n; -} - diff -Nru glfw-2.6/lib/macosx/macosx_time.c glfw-2.7.2/lib/macosx/macosx_time.c --- glfw-2.6/lib/macosx/macosx_time.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/macosx/macosx_time.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,112 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: macosx_time.c -// Platform: Mac OS X -// API Version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - -//************************************************************************ -//**** Platform implementation functions **** -//************************************************************************ - -//======================================================================== -// Return timer value in seconds -//======================================================================== - -double _glfwPlatformGetTime( void ) -{ - struct timeval tv; - - gettimeofday( &tv, NULL ); - return tv.tv_sec + (double) tv.tv_usec / 1000000.0 - _glfwLibrary.Timer.t0; -} - - -//======================================================================== -// Set timer value in seconds -//======================================================================== - -void _glfwPlatformSetTime( double time ) -{ - struct timeval tv; - - gettimeofday( &tv, NULL ); - _glfwLibrary.Timer.t0 = tv.tv_sec + (double) tv.tv_usec / 1000000.0 - time; -} - - -//======================================================================== -// Put a thread to sleep for a specified amount of time -//======================================================================== - -void _glfwPlatformSleep( double time ) -{ - if( time == 0.0 ) - { - sched_yield(); - return; - } - - struct timeval currenttime; - struct timespec wait; - pthread_mutex_t mutex; - pthread_cond_t cond; - long dt_sec, dt_usec; - - // Not all pthread implementations have a pthread_sleep() function. We - // do it the portable way, using a timed wait for a condition that we - // will never signal. NOTE: The unistd functions sleep/usleep suspends - // the entire PROCESS, not a signle thread, which is why we can not - // use them to implement glfwSleep. - - // Set timeout time, relatvie to current time - gettimeofday( ¤ttime, NULL ); - dt_sec = (long) time; - dt_usec = (long) ((time - (double)dt_sec) * 1000000.0); - wait.tv_nsec = (currenttime.tv_usec + dt_usec) * 1000L; - if( wait.tv_nsec > 1000000000L ) - { - wait.tv_nsec -= 1000000000L; - dt_sec ++; - } - wait.tv_sec = currenttime.tv_sec + dt_sec; - - // Initialize condition and mutex objects - pthread_mutex_init( &mutex, NULL ); - pthread_cond_init( &cond, NULL ); - - // Do a timed wait - pthread_mutex_lock( &mutex ); - pthread_cond_timedwait( &cond, &mutex, &wait ); - pthread_mutex_unlock( &mutex ); - - // Destroy condition and mutex objects - pthread_mutex_destroy( &mutex ); - pthread_cond_destroy( &cond ); -} - diff -Nru glfw-2.6/lib/macosx/macosx_window.c glfw-2.7.2/lib/macosx/macosx_window.c --- glfw-2.6/lib/macosx/macosx_window.c 2007-07-12 03:13:45.000000000 +0000 +++ glfw-2.7.2/lib/macosx/macosx_window.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1279 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: macosx_window.c -// Platform: Mac OS X -// API Version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include "internal.h" - -static _GLFWmacwindowfunctions _glfwMacFSWindowFunctions = -{ - _glfwMacFSOpenWindow, - _glfwMacFSCloseWindow, - _glfwMacFSSetWindowTitle, - _glfwMacFSSetWindowSize, - _glfwMacFSSetWindowPos, - _glfwMacFSIconifyWindow, - _glfwMacFSRestoreWindow, - _glfwMacFSRefreshWindowParams, - _glfwMacFSSetMouseCursorPos -}; - -static _GLFWmacwindowfunctions _glfwMacDWWindowFunctions = -{ - _glfwMacDWOpenWindow, - _glfwMacDWCloseWindow, - _glfwMacDWSetWindowTitle, - _glfwMacDWSetWindowSize, - _glfwMacDWSetWindowPos, - _glfwMacDWIconifyWindow, - _glfwMacDWRestoreWindow, - _glfwMacDWRefreshWindowParams, - _glfwMacDWSetMouseCursorPos -}; - -#define _glfwTestModifier( modifierMask, glfwKey ) \ -if ( changed & modifierMask ) \ -{ \ - _glfwInputKey( glfwKey, (modifiers & modifierMask ? GLFW_PRESS : GLFW_RELEASE) ); \ -} - -void _glfwHandleMacModifierChange( UInt32 modifiers ) -{ - UInt32 changed = modifiers ^ _glfwInput.Modifiers; - - _glfwTestModifier( shiftKey, GLFW_KEY_LSHIFT ); - _glfwTestModifier( rightShiftKey, GLFW_KEY_RSHIFT ); - _glfwTestModifier( controlKey, GLFW_KEY_LCTRL ); - _glfwTestModifier( rightControlKey, GLFW_KEY_RCTRL ); - _glfwTestModifier( optionKey, GLFW_KEY_LALT ); - _glfwTestModifier( rightOptionKey, GLFW_KEY_RALT ); - - _glfwInput.Modifiers = modifiers; -} - -void _glfwHandleMacKeyChange( UInt32 keyCode, int action ) -{ - switch ( keyCode ) - { - case MAC_KEY_ENTER: _glfwInputKey( GLFW_KEY_ENTER, action); break; - case MAC_KEY_RETURN: _glfwInputKey( GLFW_KEY_KP_ENTER, action); break; - case MAC_KEY_ESC: _glfwInputKey( GLFW_KEY_ESC, action); break; - case MAC_KEY_F1: _glfwInputKey( GLFW_KEY_F1, action); break; - case MAC_KEY_F2: _glfwInputKey( GLFW_KEY_F2, action); break; - case MAC_KEY_F3: _glfwInputKey( GLFW_KEY_F3, action); break; - case MAC_KEY_F4: _glfwInputKey( GLFW_KEY_F4, action); break; - case MAC_KEY_F5: _glfwInputKey( GLFW_KEY_F5, action); break; - case MAC_KEY_F6: _glfwInputKey( GLFW_KEY_F6, action); break; - case MAC_KEY_F7: _glfwInputKey( GLFW_KEY_F7, action); break; - case MAC_KEY_F8: _glfwInputKey( GLFW_KEY_F8, action); break; - case MAC_KEY_F9: _glfwInputKey( GLFW_KEY_F9, action); break; - case MAC_KEY_F10: _glfwInputKey( GLFW_KEY_F10, action); break; - case MAC_KEY_F11: _glfwInputKey( GLFW_KEY_F11, action); break; - case MAC_KEY_F12: _glfwInputKey( GLFW_KEY_F12, action); break; - case MAC_KEY_F13: _glfwInputKey( GLFW_KEY_F13, action); break; - case MAC_KEY_F14: _glfwInputKey( GLFW_KEY_F14, action); break; - case MAC_KEY_F15: _glfwInputKey( GLFW_KEY_F15, action); break; - case MAC_KEY_UP: _glfwInputKey( GLFW_KEY_UP, action); break; - case MAC_KEY_DOWN: _glfwInputKey( GLFW_KEY_DOWN, action); break; - case MAC_KEY_LEFT: _glfwInputKey( GLFW_KEY_LEFT, action); break; - case MAC_KEY_RIGHT: _glfwInputKey( GLFW_KEY_RIGHT, action); break; - case MAC_KEY_TAB: _glfwInputKey( GLFW_KEY_TAB, action); break; - case MAC_KEY_BACKSPACE: _glfwInputKey( GLFW_KEY_BACKSPACE, action); break; - case MAC_KEY_HELP: _glfwInputKey( GLFW_KEY_INSERT, action); break; - case MAC_KEY_DEL: _glfwInputKey( GLFW_KEY_DEL, action); break; - case MAC_KEY_PAGEUP: _glfwInputKey( GLFW_KEY_PAGEUP, action); break; - case MAC_KEY_PAGEDOWN: _glfwInputKey( GLFW_KEY_PAGEDOWN, action); break; - case MAC_KEY_HOME: _glfwInputKey( GLFW_KEY_HOME, action); break; - case MAC_KEY_END: _glfwInputKey( GLFW_KEY_END, action); break; - case MAC_KEY_KP_0: _glfwInputKey( GLFW_KEY_KP_0, action); break; - case MAC_KEY_KP_1: _glfwInputKey( GLFW_KEY_KP_1, action); break; - case MAC_KEY_KP_2: _glfwInputKey( GLFW_KEY_KP_2, action); break; - case MAC_KEY_KP_3: _glfwInputKey( GLFW_KEY_KP_3, action); break; - case MAC_KEY_KP_4: _glfwInputKey( GLFW_KEY_KP_4, action); break; - case MAC_KEY_KP_5: _glfwInputKey( GLFW_KEY_KP_5, action); break; - case MAC_KEY_KP_6: _glfwInputKey( GLFW_KEY_KP_6, action); break; - case MAC_KEY_KP_7: _glfwInputKey( GLFW_KEY_KP_7, action); break; - case MAC_KEY_KP_8: _glfwInputKey( GLFW_KEY_KP_8, action); break; - case MAC_KEY_KP_9: _glfwInputKey( GLFW_KEY_KP_9, action); break; - case MAC_KEY_KP_DIVIDE: _glfwInputKey( GLFW_KEY_KP_DIVIDE, action); break; - case MAC_KEY_KP_MULTIPLY: _glfwInputKey( GLFW_KEY_KP_MULTIPLY, action); break; - case MAC_KEY_KP_SUBTRACT: _glfwInputKey( GLFW_KEY_KP_SUBTRACT, action); break; - case MAC_KEY_KP_ADD: _glfwInputKey( GLFW_KEY_KP_ADD, action); break; - case MAC_KEY_KP_DECIMAL: _glfwInputKey( GLFW_KEY_KP_DECIMAL, action); break; - case MAC_KEY_KP_EQUAL: _glfwInputKey( GLFW_KEY_KP_EQUAL, action); break; - case MAC_KEY_KP_ENTER: _glfwInputKey( GLFW_KEY_KP_ENTER, action); break; - default: - { - extern void *KCHRPtr; - UInt32 state = 0; - char charCode = (char)KeyTranslate( KCHRPtr, keyCode, &state ); - UppercaseText( &charCode, 1, smSystemScript ); - _glfwInputKey( (unsigned char)charCode, action ); - } - break; - } -} - -EventTypeSpec GLFW_KEY_EVENT_TYPES[] = -{ - { kEventClassKeyboard, kEventRawKeyDown }, - { kEventClassKeyboard, kEventRawKeyUp }, - { kEventClassKeyboard, kEventRawKeyModifiersChanged } -}; - -OSStatus _glfwKeyEventHandler( EventHandlerCallRef handlerCallRef, - EventRef event, - void *userData ) -{ - UInt32 keyCode; - short int keyChar; - UInt32 modifiers; - - switch( GetEventKind( event ) ) - { - case kEventRawKeyDown: - { - if( GetEventParameter( event, - kEventParamKeyCode, - typeUInt32, - NULL, - sizeof( UInt32 ), - NULL, - &keyCode ) == noErr ) - { - _glfwHandleMacKeyChange( keyCode, GLFW_PRESS ); - } - if( GetEventParameter( event, - kEventParamKeyUnicodes, - typeUnicodeText, - NULL, - sizeof(keyChar), - NULL, - &keyChar) == noErr ) - { - _glfwInputChar( keyChar, GLFW_PRESS ); - } - return noErr; - } - - case kEventRawKeyUp: - { - if( GetEventParameter( event, - kEventParamKeyCode, - typeUInt32, - NULL, - sizeof( UInt32 ), - NULL, - &keyCode ) == noErr ) - { - _glfwHandleMacKeyChange( keyCode, GLFW_RELEASE ); - } - if( GetEventParameter( event, - kEventParamKeyUnicodes, - typeUnicodeText, - NULL, - sizeof(keyChar), - NULL, - &keyChar) == noErr ) - { - _glfwInputChar( keyChar, GLFW_RELEASE ); - } - return noErr; - } - - case kEventRawKeyModifiersChanged: - { - if( GetEventParameter( event, - kEventParamKeyModifiers, - typeUInt32, - NULL, - sizeof( UInt32 ), - NULL, - &modifiers ) == noErr ) - { - _glfwHandleMacModifierChange( modifiers ); - return noErr; - } - } - break; - } - - return eventNotHandledErr; -} - -EventTypeSpec GLFW_MOUSE_EVENT_TYPES[] = -{ - { kEventClassMouse, kEventMouseDown }, - { kEventClassMouse, kEventMouseUp }, - { kEventClassMouse, kEventMouseMoved }, - { kEventClassMouse, kEventMouseDragged }, - { kEventClassMouse, kEventMouseWheelMoved }, -}; - -OSStatus _glfwMouseEventHandler( EventHandlerCallRef handlerCallRef, - EventRef event, - void *userData ) -{ - switch( GetEventKind( event ) ) - { - case kEventMouseDown: - { - WindowRef window; - EventRecord oldStyleMacEvent; - ConvertEventRefToEventRecord( event, &oldStyleMacEvent ); - if( FindWindow ( oldStyleMacEvent.where, &window ) == inMenuBar ) - { - MenuSelect( oldStyleMacEvent.where ); - HiliteMenu(0); - return noErr; - } - else - { - EventMouseButton button; - if( GetEventParameter( event, - kEventParamMouseButton, - typeMouseButton, - NULL, - sizeof( EventMouseButton ), - NULL, - &button ) == noErr ) - { - button -= kEventMouseButtonPrimary; - if( button <= GLFW_MOUSE_BUTTON_LAST ) - { - _glfwInputMouseClick( button - + GLFW_MOUSE_BUTTON_LEFT, - GLFW_PRESS ); - } - return noErr; - } - } - break; - } - - case kEventMouseUp: - { - EventMouseButton button; - if( GetEventParameter( event, - kEventParamMouseButton, - typeMouseButton, - NULL, - sizeof( EventMouseButton ), - NULL, - &button ) == noErr ) - { - button -= kEventMouseButtonPrimary; - if( button <= GLFW_MOUSE_BUTTON_LAST ) - { - _glfwInputMouseClick( button - + GLFW_MOUSE_BUTTON_LEFT, - GLFW_RELEASE ); - } - return noErr; - } - break; - } - - case kEventMouseMoved: - case kEventMouseDragged: - { - HIPoint mouseLocation; - if( _glfwWin.MouseLock ) - { - if( GetEventParameter( event, - kEventParamMouseDelta, - typeHIPoint, - NULL, - sizeof( HIPoint ), - NULL, - &mouseLocation ) != noErr ) - { - break; - } - - _glfwInput.MousePosX += mouseLocation.x; - _glfwInput.MousePosY += mouseLocation.y; - } - else - { - if( GetEventParameter( event, - kEventParamMouseLocation, - typeHIPoint, - NULL, - sizeof( HIPoint ), - NULL, - &mouseLocation ) != noErr ) - { - break; - } - - _glfwInput.MousePosX = mouseLocation.x; - _glfwInput.MousePosY = mouseLocation.y; - - if( !_glfwWin.Fullscreen ) - { - Rect content; - GetWindowBounds( _glfwWin.MacWindow, - kWindowContentRgn, - &content ); - - _glfwInput.MousePosX -= content.left; - _glfwInput.MousePosY -= content.top; - } - } - - if( _glfwWin.MousePosCallback ) - { - _glfwWin.MousePosCallback( _glfwInput.MousePosX, - _glfwInput.MousePosY ); - } - - break; - } - - case kEventMouseWheelMoved: - { - EventMouseWheelAxis axis; - if( GetEventParameter( event, - kEventParamMouseWheelAxis, - typeMouseWheelAxis, - NULL, - sizeof( EventMouseWheelAxis ), - NULL, - &axis) == noErr ) - { - long wheelDelta; - if( axis == kEventMouseWheelAxisY && - GetEventParameter( event, - kEventParamMouseWheelDelta, - typeLongInteger, - NULL, - sizeof( long ), - NULL, - &wheelDelta ) == noErr ) - { - _glfwInput.WheelPos += wheelDelta; - if( _glfwWin.MouseWheelCallback ) - { - _glfwWin.MouseWheelCallback( _glfwInput.WheelPos ); - } - return noErr; - } - } - break; - } - } - - return eventNotHandledErr; -} - -EventTypeSpec GLFW_COMMAND_EVENT_TYPES[] = -{ - { kEventClassCommand, kEventCommandProcess } -}; - -OSStatus _glfwCommandHandler( EventHandlerCallRef handlerCallRef, - EventRef event, - void *userData ) -{ - if( _glfwWin.SysKeysDisabled ) - { - // TO DO: give adequate UI feedback that this is the case - return eventNotHandledErr; - } - - HICommand command; - if( GetEventParameter( event, - kEventParamDirectObject, - typeHICommand, - NULL, - sizeof( HICommand ), - NULL, - &command ) == noErr ) - { - switch( command.commandID ) - { - case kHICommandClose: - case kHICommandQuit: - { - // Check if the program wants us to close the window - if( _glfwWin.WindowCloseCallback ) - { - if( _glfwWin.WindowCloseCallback() ) - { - glfwCloseWindow(); - } - } - else - { - glfwCloseWindow(); - } - return noErr; - } - } - } - - return eventNotHandledErr; -} - -EventTypeSpec GLFW_WINDOW_EVENT_TYPES[] = -{ - { kEventClassWindow, kEventWindowBoundsChanged }, - { kEventClassWindow, kEventWindowClose }, - { kEventClassWindow, kEventWindowDrawContent }, - { kEventClassWindow, kEventWindowActivated }, - { kEventClassWindow, kEventWindowDeactivated }, -}; - -OSStatus _glfwWindowEventHandler( EventHandlerCallRef handlerCallRef, - EventRef event, - void *userData ) -{ - switch( GetEventKind(event) ) - { - case kEventWindowBoundsChanged: - { - WindowRef window; - GetEventParameter( event, kEventParamDirectObject, typeWindowRef, NULL, - sizeof(WindowRef), NULL, &window ); - - Rect rect; - GetWindowPortBounds( window, &rect ); - - if( _glfwWin.Width != rect.right || - _glfwWin.Height != rect.bottom ) - { - aglUpdateContext(_glfwWin.AGLContext); - - _glfwWin.Width = rect.right; - _glfwWin.Height = rect.bottom; - if( _glfwWin.WindowSizeCallback ) - { - _glfwWin.WindowSizeCallback( _glfwWin.Width, - _glfwWin.Height ); - } - // Emulate (force) content invalidation - if( _glfwWin.WindowRefreshCallback ) - { - _glfwWin.WindowRefreshCallback(); - } - } - break; - } - - case kEventWindowClose: - { - // Check if the program wants us to close the window - if( _glfwWin.WindowCloseCallback ) - { - if( _glfwWin.WindowCloseCallback() ) - { - glfwCloseWindow(); - } - } - else - { - glfwCloseWindow(); - } - return noErr; - } - - case kEventWindowDrawContent: - { - // Call user callback function - if( _glfwWin.WindowRefreshCallback ) - { - _glfwWin.WindowRefreshCallback(); - } - break; - } - - case kEventWindowActivated: - { - _glfwWin.Active = GL_TRUE; - break; - } - - case kEventWindowDeactivated: - { - _glfwWin.Active = GL_FALSE; - _glfwInputDeactivation(); - break; - } - } - - return eventNotHandledErr; -} - -int _glfwInstallEventHandlers( void ) -{ - OSStatus error; - - _glfwWin.MouseUPP = NewEventHandlerUPP( _glfwMouseEventHandler ); - - error = InstallEventHandler( GetApplicationEventTarget(), - _glfwWin.MouseUPP, - GetEventTypeCount( GLFW_MOUSE_EVENT_TYPES ), - GLFW_MOUSE_EVENT_TYPES, - NULL, - NULL ); - if( error != noErr ) - { - fprintf( stderr, "glfwOpenWindow failing because it can't install mouse event handler\n" ); - return GL_FALSE; - } - - _glfwWin.CommandUPP = NewEventHandlerUPP( _glfwCommandHandler ); - - error = InstallEventHandler( GetApplicationEventTarget(), - _glfwWin.CommandUPP, - GetEventTypeCount( GLFW_COMMAND_EVENT_TYPES ), - GLFW_COMMAND_EVENT_TYPES, - NULL, - NULL ); - if( error != noErr ) - { - fprintf( stderr, "glfwOpenWindow failing because it can't install command event handler\n" ); - return GL_FALSE; - } - - _glfwWin.KeyboardUPP = NewEventHandlerUPP( _glfwKeyEventHandler ); - - error = InstallEventHandler( GetApplicationEventTarget(), - _glfwWin.KeyboardUPP, - GetEventTypeCount( GLFW_KEY_EVENT_TYPES ), - GLFW_KEY_EVENT_TYPES, - NULL, - NULL ); - if( error != noErr ) - { - fprintf( stderr, "glfwOpenWindow failing because it can't install key event handler\n" ); - return GL_FALSE; - } - - return GL_TRUE; -} - -#define _setAGLAttribute( aglAttributeName, AGLparameter ) \ -if ( AGLparameter != 0 ) \ -{ \ - AGLpixelFormatAttributes[numAGLAttrs++] = aglAttributeName; \ - AGLpixelFormatAttributes[numAGLAttrs++] = AGLparameter; \ -} - -#define _getAGLAttribute( aglAttributeName, variableName ) \ -{ \ - GLint aglValue; \ - (void)aglDescribePixelFormat( pixelFormat, aglAttributeName, &aglValue ); \ - variableName = aglValue; \ -} - -#define _setCGLAttribute( cglAttributeName, CGLparameter ) \ -if ( CGLparameter != 0 ) \ -{ \ - CGLpixelFormatAttributes[ numCGLAttrs++ ] = cglAttributeName; \ - CGLpixelFormatAttributes[ numCGLAttrs++ ] = CGLparameter; \ -} - -#define _getCGLAttribute( cglAttributeName, variableName ) \ -{ \ - long cglValue; \ - (void)CGLDescribePixelFormat( CGLpfObj, 0, cglAttributeName, &cglValue ); \ - variableName = cglValue; \ -} - -int _glfwPlatformOpenWindow( int width, - int height, - int redbits, - int greenbits, - int bluebits, - int alphabits, - int depthbits, - int stencilbits, - int mode, - _GLFWhints* hints ) -{ - OSStatus error; - ProcessSerialNumber psn; - - unsigned int windowAttributes; - - // TO DO: Refactor this function! - _glfwWin.WindowFunctions = ( _glfwWin.Fullscreen ? - &_glfwMacFSWindowFunctions : - &_glfwMacDWWindowFunctions ); - - // Windowed or fullscreen; AGL or CGL? Quite the mess... - // AGL appears to be the only choice for attaching OpenGL contexts to - // Carbon windows, but it leaves the user no control over fullscreen - // mode stretching. Solution: AGL for windowed, CGL for fullscreen. - if( !_glfwWin.Fullscreen ) - { - // create AGL pixel format attribute list - GLint AGLpixelFormatAttributes[256]; - int numAGLAttrs = 0; - - AGLpixelFormatAttributes[numAGLAttrs++] = AGL_RGBA; - AGLpixelFormatAttributes[numAGLAttrs++] = AGL_DOUBLEBUFFER; - - if( hints->Stereo ) - { - AGLpixelFormatAttributes[numAGLAttrs++] = AGL_STEREO; - } - - _setAGLAttribute( AGL_AUX_BUFFERS, hints->AuxBuffers); - _setAGLAttribute( AGL_RED_SIZE, redbits ); - _setAGLAttribute( AGL_GREEN_SIZE, greenbits ); - _setAGLAttribute( AGL_BLUE_SIZE, bluebits ); - _setAGLAttribute( AGL_ALPHA_SIZE, alphabits ); - _setAGLAttribute( AGL_DEPTH_SIZE, depthbits ); - _setAGLAttribute( AGL_STENCIL_SIZE, stencilbits ); - _setAGLAttribute( AGL_ACCUM_RED_SIZE, hints->AccumRedBits ); - _setAGLAttribute( AGL_ACCUM_GREEN_SIZE, hints->AccumGreenBits ); - _setAGLAttribute( AGL_ACCUM_BLUE_SIZE, hints->AccumBlueBits ); - _setAGLAttribute( AGL_ACCUM_ALPHA_SIZE, hints->AccumAlphaBits ); - - if( hints->Samples > 1 ) - { - _setAGLAttribute( AGL_SAMPLE_BUFFERS_ARB, 1 ); - _setAGLAttribute( AGL_SAMPLES_ARB, hints->Samples ); - AGLpixelFormatAttributes[numAGLAttrs++] = AGL_NO_RECOVERY; - } - - AGLpixelFormatAttributes[numAGLAttrs++] = AGL_NONE; - - // create pixel format descriptor - AGLDevice mainMonitor = GetMainDevice(); - AGLPixelFormat pixelFormat = aglChoosePixelFormat( &mainMonitor, - 1, - AGLpixelFormatAttributes ); - if( pixelFormat == NULL ) - { - fprintf( stderr, "glfwOpenWindow failing because it can't create a pixel format\n" ); - return GL_FALSE; - } - - // store pixel format's values for _glfwPlatformGetWindowParam's use - _getAGLAttribute( AGL_ACCELERATED, _glfwWin.Accelerated ); - _getAGLAttribute( AGL_RED_SIZE, _glfwWin.RedBits ); - _getAGLAttribute( AGL_GREEN_SIZE, _glfwWin.GreenBits ); - _getAGLAttribute( AGL_BLUE_SIZE, _glfwWin.BlueBits ); - _getAGLAttribute( AGL_ALPHA_SIZE, _glfwWin.AlphaBits ); - _getAGLAttribute( AGL_DEPTH_SIZE, _glfwWin.DepthBits ); - _getAGLAttribute( AGL_STENCIL_SIZE, _glfwWin.StencilBits ); - _getAGLAttribute( AGL_ACCUM_RED_SIZE, _glfwWin.AccumRedBits ); - _getAGLAttribute( AGL_ACCUM_GREEN_SIZE, _glfwWin.AccumGreenBits ); - _getAGLAttribute( AGL_ACCUM_BLUE_SIZE, _glfwWin.AccumBlueBits ); - _getAGLAttribute( AGL_ACCUM_ALPHA_SIZE, _glfwWin.AccumAlphaBits ); - _getAGLAttribute( AGL_AUX_BUFFERS, _glfwWin.AuxBuffers ); - _getAGLAttribute( AGL_STEREO, _glfwWin.Stereo ); - _getAGLAttribute( AGL_SAMPLES_ARB, _glfwWin.Samples ); - _glfwWin.RefreshRate = hints->RefreshRate; - - // create AGL context - _glfwWin.AGLContext = aglCreateContext( pixelFormat, NULL ); - - aglDestroyPixelFormat( pixelFormat ); - - if( _glfwWin.AGLContext == NULL ) - { - fprintf( stderr, "glfwOpenWindow failing because it can't create an OpenGL context\n" ); - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - if (_glfwLibrary.Unbundled) - { - if( GetCurrentProcess( &psn ) != noErr ) - { - fprintf( stderr, "glfwOpenWindow failing because it can't get its PSN\n" ); - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - if( TransformProcessType( &psn, kProcessTransformToForegroundApplication ) != noErr ) - { - fprintf( stderr, "glfwOpenWindow failing because it can't become a foreground application\n" ); - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - /* Keith Bauer 2007-07-12 - I don't believe this is desirable - if( SetFrontProcess( &psn ) != noErr ) - { - fprintf( stderr, "glfwOpenWindow failing because it can't become the front process\n" ); - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - */ - } - - // create window - Rect windowContentBounds; - windowContentBounds.left = 0; - windowContentBounds.top = 0; - windowContentBounds.right = width; - windowContentBounds.bottom = height; - - windowAttributes = ( kWindowCloseBoxAttribute \ - | kWindowCollapseBoxAttribute \ - | kWindowStandardHandlerAttribute ); - - if( hints->WindowNoResize ) - { - windowAttributes |= kWindowLiveResizeAttribute; - } - else - { - windowAttributes |= ( kWindowFullZoomAttribute | kWindowResizableAttribute ); - } - - error = CreateNewWindow( kDocumentWindowClass, - windowAttributes, - &windowContentBounds, - &( _glfwWin.MacWindow ) ); - if( ( error != noErr ) || ( _glfwWin.MacWindow == NULL ) ) - { - fprintf( stderr, "glfwOpenWindow failing because it can't create a window\n" ); - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - _glfwWin.WindowUPP = NewEventHandlerUPP( _glfwWindowEventHandler ); - - error = InstallWindowEventHandler( _glfwWin.MacWindow, - _glfwWin.WindowUPP, - GetEventTypeCount( GLFW_WINDOW_EVENT_TYPES ), - GLFW_WINDOW_EVENT_TYPES, - NULL, - NULL ); - if( error != noErr ) - { - fprintf( stderr, "glfwOpenWindow failing because it can't install window event handlers\n" ); - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - // Don't care if we fail here - (void)SetWindowTitleWithCFString( _glfwWin.MacWindow, CFSTR( "GLFW Window" ) ); - (void)RepositionWindow( _glfwWin.MacWindow, - NULL, - kWindowCenterOnMainScreen ); - - if( !aglSetDrawable( _glfwWin.AGLContext, - GetWindowPort( _glfwWin.MacWindow ) ) ) - { - fprintf( stderr, "glfwOpenWindow failing because it can't draw to the window\n" ); - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - // Make OpenGL context current - if( !aglSetCurrentContext( _glfwWin.AGLContext ) ) - { - fprintf( stderr, "glfwOpenWindow failing because it can't make the OpenGL context current\n" ); - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - // show window - ShowWindow( _glfwWin.MacWindow ); - - return GL_TRUE; - } - else - { - CGDisplayErr cgErr; - CGLError cglErr; - - CFDictionaryRef optimalMode; - - CGLPixelFormatObj CGLpfObj; - long numCGLvs = 0; - - CGLPixelFormatAttribute CGLpixelFormatAttributes[64]; - int numCGLAttrs = 0; - - // variables for enumerating color depths - long rgbColorDepth; - long rgbaAccumDepth = 0; - int rgbChannelDepth = 0; - - // CGL pixel format attributes - _setCGLAttribute( kCGLPFADisplayMask, - CGDisplayIDToOpenGLDisplayMask( kCGDirectMainDisplay ) ); - - if( hints->Stereo ) - { - CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFAStereo; - } - - if( hints->Samples > 1 ) - { - _setCGLAttribute( kCGLPFASamples, (CGLPixelFormatAttribute)hints->Samples ); - _setCGLAttribute( kCGLPFASampleBuffers, (CGLPixelFormatAttribute)1 ); - CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFANoRecovery; - } - - CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFAFullScreen; - CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFADoubleBuffer; - CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFAAccelerated; - CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFANoRecovery; - CGLpixelFormatAttributes[ numCGLAttrs++ ] = kCGLPFAMinimumPolicy; - - _setCGLAttribute( kCGLPFAAccumSize, - (CGLPixelFormatAttribute)( hints->AccumRedBits \ - + hints->AccumGreenBits \ - + hints->AccumBlueBits \ - + hints->AccumAlphaBits ) ); - - _setCGLAttribute( kCGLPFAAlphaSize, (CGLPixelFormatAttribute)alphabits ); - _setCGLAttribute( kCGLPFADepthSize, (CGLPixelFormatAttribute)depthbits ); - _setCGLAttribute( kCGLPFAStencilSize, (CGLPixelFormatAttribute)stencilbits ); - _setCGLAttribute( kCGLPFAAuxBuffers, (CGLPixelFormatAttribute)hints->AuxBuffers ); - - CGLpixelFormatAttributes[ numCGLAttrs++ ] = (CGLPixelFormatAttribute)NULL; - - // create a suitable pixel format with above attributes.. - cglErr = CGLChoosePixelFormat( CGLpixelFormatAttributes, - &CGLpfObj, - &numCGLvs ); - if( cglErr != kCGLNoError ) - { - return GL_FALSE; - } - - // ..and create a rendering context using that pixel format - cglErr = CGLCreateContext( CGLpfObj, NULL, &_glfwWin.CGLContext ); - if( cglErr != kCGLNoError ) - { - return GL_FALSE; - } - - // enumerate depth of RGB channels - unlike AGL, CGL works with - // a single parameter reflecting the full depth of the frame buffer - (void)CGLDescribePixelFormat( CGLpfObj, 0, kCGLPFAColorSize, &rgbColorDepth ); - if( rgbColorDepth == 24 || rgbColorDepth == 32 ) - { - rgbChannelDepth = 8; - } - if( rgbColorDepth == 16 ) - { - rgbChannelDepth = 5; - } - - // get pixel depth of accumulator - I haven't got the slightest idea - // how this number conforms to any other channel depth than 8 bits, - // so this might end up giving completely knackered results... - (void)CGLDescribePixelFormat( CGLpfObj, 0, kCGLPFAAccumSize, &rgbaAccumDepth ); - if( rgbaAccumDepth == 32 ) - { - rgbaAccumDepth = 8; - } - - // store values of pixel format for _glfwPlatformGetWindowParam's use - _getCGLAttribute( kCGLPFAAccelerated, _glfwWin.Accelerated ); - _getCGLAttribute( rgbChannelDepth, _glfwWin.RedBits ); - _getCGLAttribute( rgbChannelDepth, _glfwWin.GreenBits ); - _getCGLAttribute( rgbChannelDepth, _glfwWin.BlueBits ); - _getCGLAttribute( kCGLPFAAlphaSize, _glfwWin.AlphaBits ); - _getCGLAttribute( kCGLPFADepthSize, _glfwWin.DepthBits ); - _getCGLAttribute( kCGLPFAStencilSize, _glfwWin.StencilBits ); - _getCGLAttribute( rgbaAccumDepth, _glfwWin.AccumRedBits ); - _getCGLAttribute( rgbaAccumDepth, _glfwWin.AccumGreenBits ); - _getCGLAttribute( rgbaAccumDepth, _glfwWin.AccumBlueBits ); - _getCGLAttribute( rgbaAccumDepth, _glfwWin.AccumAlphaBits ); - _getCGLAttribute( kCGLPFAAuxBuffers, _glfwWin.AuxBuffers ); - _getCGLAttribute( kCGLPFAStereo, _glfwWin.Stereo ); - _glfwWin.RefreshRate = hints->RefreshRate; - - // destroy our pixel format - (void)CGLDestroyPixelFormat( CGLpfObj ); - - // capture the display for our application - cgErr = CGCaptureAllDisplays(); - if( cgErr != kCGErrorSuccess ) - { - return GL_FALSE; - } - - // find closest matching NON-STRETCHED display mode.. - optimalMode = CGDisplayBestModeForParametersAndRefreshRateWithProperty( kCGDirectMainDisplay, - rgbColorDepth, - width, - /* Check further to the right -> */ height, - hints->RefreshRate, - NULL, - NULL ); - if( optimalMode == NULL ) - { - return GL_FALSE; - } - - // ..and switch to that mode - cgErr = CGDisplaySwitchToMode( kCGDirectMainDisplay, optimalMode ); - if( cgErr != kCGErrorSuccess ) - { - return GL_FALSE; - } - - // switch to our OpenGL context, and bring it up fullscreen - cglErr = CGLSetCurrentContext( _glfwWin.CGLContext ); - if( cglErr != kCGLNoError ) - { - return GL_FALSE; - } - - cglErr = CGLSetFullScreen( _glfwWin.CGLContext ); - if( cglErr != kCGLNoError ) - { - return GL_FALSE; - } - - return GL_TRUE; - } -} - -void _glfwPlatformCloseWindow( void ) -{ - if( _glfwWin.WindowFunctions != NULL ) - { - if( _glfwWin.WindowUPP != NULL ) - { - DisposeEventHandlerUPP( _glfwWin.WindowUPP ); - _glfwWin.WindowUPP = NULL; - } - - _glfwWin.WindowFunctions->CloseWindow(); - - if( !_glfwWin.Fullscreen && _glfwWin.AGLContext != NULL ) - { - aglSetCurrentContext( NULL ); - aglSetDrawable( _glfwWin.AGLContext, NULL ); - aglDestroyContext( _glfwWin.AGLContext ); - _glfwWin.AGLContext = NULL; - } - - if( _glfwWin.Fullscreen && _glfwWin.CGLContext != NULL ) - { - CGLSetCurrentContext( NULL ); - CGLClearDrawable( _glfwWin.CGLContext ); - CGLDestroyContext( _glfwWin.CGLContext ); - CGReleaseAllDisplays(); - _glfwWin.CGLContext = NULL; - } - - if( _glfwWin.MacWindow != NULL ) - { - ReleaseWindow( _glfwWin.MacWindow ); - _glfwWin.MacWindow = NULL; - } - - _glfwWin.WindowFunctions = NULL; - } -} - -void _glfwPlatformSetWindowTitle( const char *title ) -{ - _glfwWin.WindowFunctions->SetWindowTitle( title ); -} - -void _glfwPlatformSetWindowSize( int width, int height ) -{ - _glfwWin.WindowFunctions->SetWindowSize( width, height ); -} - -void _glfwPlatformSetWindowPos( int x, int y ) -{ - _glfwWin.WindowFunctions->SetWindowPos( x, y ); -} - -void _glfwPlatformIconifyWindow( void ) -{ - _glfwWin.WindowFunctions->IconifyWindow(); -} - -void _glfwPlatformRestoreWindow( void ) -{ - _glfwWin.WindowFunctions->RestoreWindow(); -} - -void _glfwPlatformSwapBuffers( void ) -{ - if( !_glfwWin.Fullscreen ) - { - aglSwapBuffers( _glfwWin.AGLContext ); - } - else - { - CGLFlushDrawable( _glfwWin.CGLContext ); - } -} - -void _glfwPlatformSwapInterval( int interval ) -{ - GLint AGLparameter = interval; - - // CGL doesn't seem to like intervals other than 0 (vsync off) or 1 (vsync on) - long CGLparameter = ( interval == 0 ? 0 : 1 ); - - if( !_glfwWin.Fullscreen ) - { - // Don't care if we fail here.. - (void)aglSetInteger( _glfwWin.AGLContext, - AGL_SWAP_INTERVAL, - &AGLparameter ); - } - else - { - // ..or here - (void)CGLSetParameter( _glfwWin.CGLContext, - kCGLCPSwapInterval, - &CGLparameter ); - } -} - -void _glfwPlatformRefreshWindowParams( void ) -{ - _glfwWin.WindowFunctions->RefreshWindowParams(); -} - -int _glfwPlatformGetWindowParam( int param ) -{ - switch ( param ) - { - case GLFW_ACCELERATED: return _glfwWin.Accelerated; break; - case GLFW_RED_BITS: return _glfwWin.RedBits; break; - case GLFW_GREEN_BITS: return _glfwWin.GreenBits; break; - case GLFW_BLUE_BITS: return _glfwWin.BlueBits; break; - case GLFW_ALPHA_BITS: return _glfwWin.AlphaBits; break; - case GLFW_DEPTH_BITS: return _glfwWin.DepthBits; break; - case GLFW_STENCIL_BITS: return _glfwWin.StencilBits; break; - case GLFW_ACCUM_RED_BITS: return _glfwWin.AccumRedBits; break; - case GLFW_ACCUM_GREEN_BITS: return _glfwWin.AccumGreenBits; break; - case GLFW_ACCUM_BLUE_BITS: return _glfwWin.AccumBlueBits; break; - case GLFW_ACCUM_ALPHA_BITS: return _glfwWin.AccumAlphaBits; break; - case GLFW_AUX_BUFFERS: return _glfwWin.AuxBuffers; break; - case GLFW_STEREO: return _glfwWin.Stereo; break; - case GLFW_REFRESH_RATE: return _glfwWin.RefreshRate; break; - default: return GL_FALSE; - } -} - -void _glfwPlatformPollEvents( void ) -{ - EventRef event; - EventTargetRef eventDispatcher = GetEventDispatcherTarget(); - - while ( ReceiveNextEvent( 0, NULL, 0.0, TRUE, &event ) == noErr ) - { - SendEventToEventTarget( event, eventDispatcher ); - ReleaseEvent( event ); - } -} - -void _glfwPlatformWaitEvents( void ) -{ - EventRef event; - - // Wait for new events - ReceiveNextEvent( 0, NULL, kEventDurationForever, FALSE, &event ); - - // Poll new events - _glfwPlatformPollEvents(); -} - -void _glfwPlatformHideMouseCursor( void ) -{ - // TO DO: What if we fail here? - CGDisplayHideCursor( kCGDirectMainDisplay ); - CGAssociateMouseAndMouseCursorPosition( false ); -} - -void _glfwPlatformShowMouseCursor( void ) -{ - // TO DO: What if we fail here? - CGDisplayShowCursor( kCGDirectMainDisplay ); - CGAssociateMouseAndMouseCursorPosition( true ); -} - -void _glfwPlatformSetMouseCursorPos( int x, int y ) -{ - _glfwWin.WindowFunctions->SetMouseCursorPos( x, y ); -} - -int _glfwMacFSOpenWindow( int width, - int height, - int redbits, - int greenbits, - int bluebits, - int alphabits, - int depthbits, - int stencilbits, - int accumredbits, - int accumgreenbits, - int accumbluebits, - int accumalphabits, - int auxbuffers, - int stereo, - int refreshrate ) -{ - return GL_FALSE; -} - -void _glfwMacFSCloseWindow( void ) -{ - // TO DO: un-capture displays, &c. -} - -void _glfwMacFSSetWindowTitle( const char *title ) -{ - // no-op really, change "fake" mini-window title - _glfwMacDWSetWindowTitle( title ); -} - -void _glfwMacFSSetWindowSize( int width, int height ) -{ - // TO DO: something funky for full-screen - _glfwMacDWSetWindowSize( width, height ); -} - -void _glfwMacFSSetWindowPos( int x, int y ) -{ - // no-op really, change "fake" mini-window position - _glfwMacDWSetWindowPos( x, y ); -} - -void _glfwMacFSIconifyWindow( void ) -{ - // TO DO: Something funky for full-screen - _glfwMacDWIconifyWindow(); -} - -void _glfwMacFSRestoreWindow( void ) -{ - _glfwMacDWRestoreWindow(); - // TO DO: Something funky for full-screen -} - -void _glfwMacFSRefreshWindowParams( void ) -{ - // TO DO: implement this! -} - -void _glfwMacFSSetMouseCursorPos( int x, int y ) -{ - // TO DO: what if we fail here? - CGDisplayMoveCursorToPoint( kCGDirectMainDisplay, - CGPointMake( x, y ) ); -} - -int _glfwMacDWOpenWindow( int width, - int height, - int redbits, - int greenbits, - int bluebits, - int alphabits, - int depthbits, - int stencilbits, - int accumredbits, - int accumgreenbits, - int accumbluebits, - int accumalphabits, - int auxbuffers, - int stereo, - int refreshrate ) -{ - return GL_FALSE; -} - -void _glfwMacDWCloseWindow( void ) -{ -} - -void _glfwMacDWSetWindowTitle( const char *title ) -{ - CFStringRef windowTitle = CFStringCreateWithCString( kCFAllocatorDefault, - title, - kCFStringEncodingISOLatin1 ); - - // Don't care if we fail - (void)SetWindowTitleWithCFString( _glfwWin.MacWindow, windowTitle ); - - CFRelease( windowTitle ); -} - -void _glfwMacDWSetWindowSize( int width, int height ) -{ - SizeWindow( _glfwWin.MacWindow, - width, - height, - TRUE ); -} - -void _glfwMacDWSetWindowPos( int x, int y ) -{ - // TO DO: take main monitor bounds into account - MoveWindow( _glfwWin.MacWindow, - x, - y, - FALSE ); -} - -void _glfwMacDWIconifyWindow( void ) -{ - // TO DO: What if we fail here? - (void)CollapseWindow( _glfwWin.MacWindow, - TRUE ); -} - -void _glfwMacDWRestoreWindow( void ) -{ - // TO DO: What if we fail here? - (void)CollapseWindow( _glfwWin.MacWindow, - FALSE ); -} - -void _glfwMacDWRefreshWindowParams( void ) -{ - // TO DO: implement this! -} - -void _glfwMacDWSetMouseCursorPos( int x, int y ) -{ - Rect content; - GetWindowBounds(_glfwWin.MacWindow, kWindowContentRgn, &content); - - _glfwInput.MousePosX = x + content.left; - _glfwInput.MousePosY = y + content.top; - - CGDisplayMoveCursorToPoint( kCGDirectMainDisplay, - CGPointMake( _glfwInput.MousePosX, - _glfwInput.MousePosY ) ); -} - diff -Nru glfw-2.6/lib/macosx/Makefile.macosx.gcc glfw-2.7.2/lib/macosx/Makefile.macosx.gcc --- glfw-2.6/lib/macosx/Makefile.macosx.gcc 2007-07-12 03:13:45.000000000 +0000 +++ glfw-2.7.2/lib/macosx/Makefile.macosx.gcc 1970-01-01 00:00:00.000000000 +0000 @@ -1,172 +0,0 @@ -########################################################################## -# Makefile for GLFW on Mac OS X using GCC (Apple SDK). -#------------------------------------------------------------------------- -# To compile GLFW using this makefile, run: -# make -f Makefile.macosx.gcc -########################################################################## - -########################################################################## -# Installation prefix (default to /usr/local) -########################################################################## -PREFIX ?= /usr/local - - -########################################################################## -# Default: Build GLFW static and shared library -########################################################################## -default: libglfw.a libglfw.dylib - - -########################################################################## -# Compiler settings -########################################################################## -CC = gcc -CFLAGS = -c -I. -I.. -Wall -O2 -fno-common -g - -# Some modules should be optimized for speed (e.g. image decoding) -CFLAGS_SPEED = -c -I. -I.. -Wall -O3 -ffast-math -fno-common -g - - -########################################################################## -# Library builder settings -########################################################################## -AR = ar -SED = sed -INSTALL = install -ARFLAGS = -rcs -RANLIB = ranlib -DYLIBFLAGS = -framework AGL -framework Carbon -framework OpenGL \ - -dynamiclib -Wl,-single_module -compatibility_version 1 \ - -current_version 1 -install_name @executable_path/libglfw.dylib - - -########################################################################## -# Install GLFW header and static library -########################################################################## -install: libglfw.a libglfw.pc - $(INSTALL) -d $(PREFIX)/lib - $(INSTALL) -c -m 644 libglfw.a $(PREFIX)/lib/libglfw.a - $(RANLIB) $(PREFIX)/lib/libglfw.a - $(INSTALL) -d $(PREFIX)/include/GL - $(INSTALL) -c -m 644 ../../include/GL/glfw.h $(PREFIX)/include/GL/glfw.h - $(INSTALL) -d $(PREFIX)/lib/pkgconfig - $(INSTALL) -c -m 644 libglfw.pc $(PREFIX)/lib/pkgconfig/libglfw.pc - - -########################################################################## -# Object files for the GLFW library -########################################################################## -OBJS = \ - enable.o \ - fullscreen.o \ - glext.o \ - image.o \ - init.o \ - input.o \ - joystick.o \ - stream.o \ - tga.o \ - thread.o \ - time.o \ - window.o \ - macosx_enable.o \ - macosx_fullscreen.o \ - macosx_glext.o \ - macosx_init.o \ - macosx_joystick.o \ - macosx_thread.o \ - macosx_time.o \ - macosx_window.o - - -########################################################################## -# Rule for building libglfw.pc -########################################################################## -libglfw.pc: libglfw.pc.in - $(SED) -e 's,\@PREFIX\@,$(PREFIX),' libglfw.pc.in > libglfw.pc - - -########################################################################## -# Rule for building static library -########################################################################## -libglfw.a: $(OBJS) - $(AR) $(ARFLAGS) $@ $(OBJS) - $(RANLIB) $@ - - -########################################################################## -# Rule for building shared library -########################################################################## -libglfw.dylib: $(OBJS) - $(CC) -o $@ $(DYLIBFLAGS) $(OBJS) - - -########################################################################## -# Rule for cleaning up generated files -########################################################################## -clean: - @rm -f *.o libglfw.a libglfw.dylib libglfw.pc - - -########################################################################## -# Rules for building library object files -########################################################################## -enable.o: ../enable.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../enable.c - -fullscreen.o: ../fullscreen.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../fullscreen.c - -glext.o: ../glext.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../glext.c - -image.o: ../image.c ../internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o $@ ../image.c - -init.o: ../init.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../init.c - -input.o: ../input.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../input.c - -joystick.o: ../joystick.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../joystick.c - -stream.o: ../stream.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../stream.c - -tga.o: ../tga.c ../internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o $@ ../tga.c - -thread.o: ../thread.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../thread.c - -time.o: ../time.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../time.c - -window.o: ../window.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../window.c - -macosx_enable.o: macosx_enable.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ macosx_enable.c - -macosx_fullscreen.o: macosx_fullscreen.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ macosx_fullscreen.c - -macosx_glext.o: macosx_glext.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ macosx_glext.c - -macosx_init.o: macosx_init.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ macosx_init.c - -macosx_joystick.o: macosx_joystick.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ macosx_joystick.c - -macosx_thread.o: macosx_thread.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ macosx_thread.c - -macosx_time.o: macosx_time.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ macosx_time.c - -macosx_window.o: macosx_window.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ macosx_window.c diff -Nru glfw-2.6/lib/macosx/Makefile.macosx.gcc.universal glfw-2.7.2/lib/macosx/Makefile.macosx.gcc.universal --- glfw-2.6/lib/macosx/Makefile.macosx.gcc.universal 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/macosx/Makefile.macosx.gcc.universal 1970-01-01 00:00:00.000000000 +0000 @@ -1,166 +0,0 @@ -########################################################################## -# Makefile for GLFW on Mac OS X using GCC (Apple SDK). -#------------------------------------------------------------------------- -# To compile GLFW using this makefile, run: -# make -f Makefile.macosx.gcc -########################################################################## - -########################################################################## -# Installation prefix (default to /usr/local) -########################################################################## -PREFIX ?= /usr/local - - -########################################################################## -# Default: Build GLFW static library -########################################################################## -default: libglfw.a - - -########################################################################## -# Compiler settings -########################################################################## -CC = gcc -FATFLAGS = -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386 -CFLAGS = -c -I. -I.. -Wall -Os -fno-common $(FATFLAGS) - -# Some modules should be optimized for speed (e.g. image decoding) -CFLAGS_SPEED = -c -I. -I.. -Wall -O3 -ffast-math -fno-common $(FATFLAGS) - - -########################################################################## -# Library builder settings -########################################################################## -# Static library -SED = sed -INSTALL = install -MKLIB = ar -LIBFLAGS = -rcs -RANLIB = ranlib - - -########################################################################## -# Install GLFW header and static library -########################################################################## -install: libglfw.a libglfw.pc - $(INSTALL) -d $(PREFIX)/lib - $(INSTALL) -c -m 644 libglfw.a $(PREFIX)/lib/libglfw.a - $(RANLIB) $(PREFIX)/lib/libglfw.a - $(INSTALL) -d $(PREFIX)/include/GL - $(INSTALL) -c -m 644 ../../include/GL/glfw.h $(PREFIX)/include/GL/glfw.h - $(INSTALL) -d $(PREFIX)/lib/pkgconfig - $(INSTALL) -c -m 644 libglfw.pc $(PREFIX)/lib/pkgconfig/libglfw.pc - - -########################################################################## -# Rule for cleaning up generated files -########################################################################## -clean: - @rm -f *.o libglfw.a libglfw.pc - - -########################################################################## -# Object files which are part of the GLFW library -########################################################################## -OBJS = \ - enable.o \ - fullscreen.o \ - glext.o \ - image.o \ - init.o \ - input.o \ - joystick.o \ - stream.o \ - tga.o \ - thread.o \ - time.o \ - window.o \ - macosx_enable.o \ - macosx_fullscreen.o \ - macosx_glext.o \ - macosx_init.o \ - macosx_joystick.o \ - macosx_thread.o \ - macosx_time.o \ - macosx_window.o - - -########################################################################## -# Rule for building libglfw.pc -########################################################################## -libglfw.pc: libglfw.pc.in - $(SED) -e 's,\@PREFIX\@,$(PREFIX),' libglfw.pc.in > libglfw.pc - - -########################################################################## -# Rule for building library -########################################################################## -libglfw.a: $(OBJS) - rm -f $@ - $(MKLIB) $(LIBFLAGS) $@ $(OBJS) - $(RANLIB) $@ - - -########################################################################## -# Rules for building library object files -########################################################################## -enable.o: ../enable.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../enable.c - -fullscreen.o: ../fullscreen.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../fullscreen.c - -glext.o: ../glext.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../glext.c - -image.o: ../image.c ../internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o $@ ../image.c - -init.o: ../init.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../init.c - -input.o: ../input.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../input.c - -joystick.o: ../joystick.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../joystick.c - -stream.o: ../stream.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../stream.c - -tga.o: ../tga.c ../internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o $@ ../tga.c - -thread.o: ../thread.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../thread.c - -time.o: ../time.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../time.c - -window.o: ../window.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ ../window.c - -macosx_enable.o: macosx_enable.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ macosx_enable.c - -macosx_fullscreen.o: macosx_fullscreen.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ macosx_fullscreen.c - -macosx_glext.o: macosx_glext.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ macosx_glext.c - -macosx_init.o: macosx_init.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ macosx_init.c - -macosx_joystick.o: macosx_joystick.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ macosx_joystick.c - -macosx_thread.o: macosx_thread.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ macosx_thread.c - -macosx_time.o: macosx_time.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ macosx_time.c - -macosx_window.o: macosx_window.c ../internal.h platform.h - $(CC) $(CFLAGS) -o $@ macosx_window.c - diff -Nru glfw-2.6/lib/macosx/platform.h glfw-2.7.2/lib/macosx/platform.h --- glfw-2.6/lib/macosx/platform.h 2007-07-12 03:13:45.000000000 +0000 +++ glfw-2.7.2/lib/macosx/platform.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,349 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: platform.h -// Platform: Mac OS X -// API Version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// 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 _platform_h_ -#define _platform_h_ - - -// This is the Mac OS X version of GLFW -#define _GLFW_MAC_OS_X - - -// Include files -#include -#include -#include -#include -#include -#include -#include "../../include/GL/glfw.h" - - -//======================================================================== -// Defines -//======================================================================== - -#define _GLFW_MAX_PATH_LENGTH (8192) - -#define MAC_KEY_ENTER 0x24 -#define MAC_KEY_RETURN 0x34 -#define MAC_KEY_ESC 0x35 -#define MAC_KEY_F1 0x7A -#define MAC_KEY_F2 0x78 -#define MAC_KEY_F3 0x63 -#define MAC_KEY_F4 0x76 -#define MAC_KEY_F5 0x60 -#define MAC_KEY_F6 0x61 -#define MAC_KEY_F7 0x62 -#define MAC_KEY_F8 0x64 -#define MAC_KEY_F9 0x65 -#define MAC_KEY_F10 0x6D -#define MAC_KEY_F11 0x67 -#define MAC_KEY_F12 0x6F -#define MAC_KEY_F13 0x69 -#define MAC_KEY_F14 0x6B -#define MAC_KEY_F15 0x71 -#define MAC_KEY_UP 0x7E -#define MAC_KEY_DOWN 0x7D -#define MAC_KEY_LEFT 0x7B -#define MAC_KEY_RIGHT 0x7C -#define MAC_KEY_TAB 0x30 -#define MAC_KEY_BACKSPACE 0x33 -#define MAC_KEY_HELP 0x72 -#define MAC_KEY_DEL 0x75 -#define MAC_KEY_PAGEUP 0x74 -#define MAC_KEY_PAGEDOWN 0x79 -#define MAC_KEY_HOME 0x73 -#define MAC_KEY_END 0x77 -#define MAC_KEY_KP_0 0x52 -#define MAC_KEY_KP_1 0x53 -#define MAC_KEY_KP_2 0x54 -#define MAC_KEY_KP_3 0x55 -#define MAC_KEY_KP_4 0x56 -#define MAC_KEY_KP_5 0x57 -#define MAC_KEY_KP_6 0x58 -#define MAC_KEY_KP_7 0x59 -#define MAC_KEY_KP_8 0x5B -#define MAC_KEY_KP_9 0x5C -#define MAC_KEY_KP_DIVIDE 0x4B -#define MAC_KEY_KP_MULTIPLY 0x43 -#define MAC_KEY_KP_SUBTRACT 0x4E -#define MAC_KEY_KP_ADD 0x45 -#define MAC_KEY_KP_DECIMAL 0x41 -#define MAC_KEY_KP_EQUAL 0x51 -#define MAC_KEY_KP_ENTER 0x4C - -//======================================================================== -// full-screen/desktop-window "virtual" function table -//======================================================================== - -typedef int ( * GLFWmacopenwindowfun )( int, int, int, int, int, int, int, int, int, int, int, int, int, int, int ); -typedef void ( * GLFWmacclosewindowfun )( void ); -typedef void ( * GLFWmacsetwindowtitlefun )( const char * ); -typedef void ( * GLFWmacsetwindowsizefun )( int, int ); -typedef void ( * GLFWmacsetwindowposfun )( int, int ); -typedef void ( * GLFWmaciconifywindowfun )( void ); -typedef void ( * GLFWmacrestorewindowfun )( void ); -typedef void ( * GLFWmacrefreshwindowparamsfun )( void ); -typedef void ( * GLFWmacsetmousecursorposfun )( int, int ); - -typedef struct -{ - GLFWmacopenwindowfun OpenWindow; - GLFWmacclosewindowfun CloseWindow; - GLFWmacsetwindowtitlefun SetWindowTitle; - GLFWmacsetwindowsizefun SetWindowSize; - GLFWmacsetwindowposfun SetWindowPos; - GLFWmaciconifywindowfun IconifyWindow; - GLFWmacrestorewindowfun RestoreWindow; - GLFWmacrefreshwindowparamsfun RefreshWindowParams; - GLFWmacsetmousecursorposfun SetMouseCursorPos; -} -_GLFWmacwindowfunctions; - - -//======================================================================== -// Global variables (GLFW internals) -//======================================================================== - -GLFWGLOBAL CFDictionaryRef _glfwDesktopVideoMode; - -//------------------------------------------------------------------------ -// Window structure -//------------------------------------------------------------------------ -typedef struct _GLFWwin_struct _GLFWwin; - -struct _GLFWwin_struct { - - // ========= PLATFORM INDEPENDENT MANDATORY PART ========================= - - // Window states - int Opened; // Flag telling if window is opened or not - int Active; // Application active flag - int Iconified; // Window iconified flag - - // User callback functions - GLFWwindowsizefun WindowSizeCallback; - GLFWwindowclosefun WindowCloseCallback; - GLFWwindowrefreshfun WindowRefreshCallback; - GLFWmousebuttonfun MouseButtonCallback; - GLFWmouseposfun MousePosCallback; - GLFWmousewheelfun MouseWheelCallback; - GLFWkeyfun KeyCallback; - GLFWcharfun CharCallback; - - // User selected window settings - int Fullscreen; // Fullscreen flag - int MouseLock; // Mouse-lock flag - int AutoPollEvents; // Auto polling flag - int SysKeysDisabled; // System keys disabled flag - int RefreshRate; // Refresh rate (for fullscreen mode) - int WindowNoResize; // Resize- and maximize gadgets disabled flag - int Samples; - - // Window status - int Width, Height; // Window width and heigth - - // Extensions & OpenGL version - int Has_GL_SGIS_generate_mipmap; - int Has_GL_ARB_texture_non_power_of_two; - int GLVerMajor,GLVerMinor; - - - // ========= PLATFORM SPECIFIC PART ====================================== - - WindowRef MacWindow; - AGLContext AGLContext; - CGLContextObj CGLContext; - - EventHandlerUPP MouseUPP; - EventHandlerUPP CommandUPP; - EventHandlerUPP KeyboardUPP; - EventHandlerUPP WindowUPP; - - _GLFWmacwindowfunctions* WindowFunctions; - - // for easy access by _glfwPlatformGetWindowParam - int Accelerated; - int RedBits, GreenBits, BlueBits, AlphaBits; - int DepthBits; - int StencilBits; - int AccumRedBits, AccumGreenBits, AccumBlueBits, AccumAlphaBits; - int AuxBuffers; - int Stereo; -}; - -GLFWGLOBAL _GLFWwin _glfwWin; - - -//------------------------------------------------------------------------ -// User input status (some of this should go in _GLFWwin) -//------------------------------------------------------------------------ -GLFWGLOBAL struct { - - // ========= PLATFORM INDEPENDENT MANDATORY PART ========================= - - // Mouse status - int MousePosX, MousePosY; - int WheelPos; - char MouseButton[ GLFW_MOUSE_BUTTON_LAST+1 ]; - - // Keyboard status - char Key[ GLFW_KEY_LAST+1 ]; - int LastChar; - - // User selected settings - int StickyKeys; - int StickyMouseButtons; - int KeyRepeat; - - - // ========= PLATFORM SPECIFIC PART ====================================== - - UInt32 Modifiers; - -} _glfwInput; - - - - -//------------------------------------------------------------------------ -// Thread information -//------------------------------------------------------------------------ -typedef struct _GLFWthread_struct _GLFWthread; - -// Thread record (one for each thread) -struct _GLFWthread_struct { - // Pointer to previous and next threads in linked list - _GLFWthread *Previous, *Next; - - // GLFW user side thread information - GLFWthread ID; - GLFWthreadfun Function; - - // System side thread information - pthread_t PosixID; -}; - -// General thread information -GLFWGLOBAL struct { - // Critical section lock - pthread_mutex_t CriticalSection; - - // Next thread ID to use (increments for every created thread) - GLFWthread NextID; - - // First thread in linked list (always the main thread) - _GLFWthread First; -} _glfwThrd; - - -//------------------------------------------------------------------------ -// Library global data -//------------------------------------------------------------------------ -GLFWGLOBAL struct { - - // Timer data - struct { - double t0; - } Timer; - - struct { - // Bundle for dynamically-loading extension function pointers - CFBundleRef OpenGLFramework; - } Libs; - - int Unbundled; - -} _glfwLibrary; - - - -//======================================================================== -// Macros for encapsulating critical code sections (i.e. making parts -// of GLFW thread safe) -//======================================================================== - -// Define so we can use the same thread code as X11 -#define _glfw_numprocessors(n) { \ - int mib[2], ncpu; \ - size_t len = 1; \ - mib[0] = CTL_HW; \ - mib[1] = HW_NCPU; \ - n = 1; \ - if( sysctl( mib, 2, &ncpu, &len, NULL, 0 ) != -1 ) \ - { \ - if( len > 0 ) \ - { \ - n = ncpu; \ - } \ - } \ -} - -// Thread list management -#define ENTER_THREAD_CRITICAL_SECTION \ -pthread_mutex_lock( &_glfwThrd.CriticalSection ); -#define LEAVE_THREAD_CRITICAL_SECTION \ -pthread_mutex_unlock( &_glfwThrd.CriticalSection ); - - -//======================================================================== -// Prototypes for platform specific internal functions -//======================================================================== - -void _glfwChangeToResourcesDirectory( void ); - -int _glfwInstallEventHandlers( void ); - -//======================================================================== -// Prototypes for full-screen/desktop-window "virtual" functions -//======================================================================== - -int _glfwMacFSOpenWindow( int width, int height, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int accumredbits, int accumgreenbits, int accumbluebits, int accumalphabits, int auxbuffers, int stereo, int refreshrate ); -void _glfwMacFSCloseWindow( void ); -void _glfwMacFSSetWindowTitle( const char *title ); -void _glfwMacFSSetWindowSize( int width, int height ); -void _glfwMacFSSetWindowPos( int x, int y ); -void _glfwMacFSIconifyWindow( void ); -void _glfwMacFSRestoreWindow( void ); -void _glfwMacFSRefreshWindowParams( void ); -void _glfwMacFSSetMouseCursorPos( int x, int y ); - -int _glfwMacDWOpenWindow( int width, int height, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int accumredbits, int accumgreenbits, int accumbluebits, int accumalphabits, int auxbuffers, int stereo, int refreshrate ); -void _glfwMacDWCloseWindow( void ); -void _glfwMacDWSetWindowTitle( const char *title ); -void _glfwMacDWSetWindowSize( int width, int height ); -void _glfwMacDWSetWindowPos( int x, int y ); -void _glfwMacDWIconifyWindow( void ); -void _glfwMacDWRestoreWindow( void ); -void _glfwMacDWRefreshWindowParams( void ); -void _glfwMacDWSetMouseCursorPos( int x, int y ); - -#endif // _platform_h_ diff -Nru glfw-2.6/lib/stream.c glfw-2.7.2/lib/stream.c --- glfw-2.6/lib/stream.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/stream.c 2011-06-24 12:04:54.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: stream.c // Platform: Any -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -28,6 +28,7 @@ // //======================================================================== +#define _CRT_SECURE_NO_WARNINGS #include "internal.h" @@ -40,10 +41,10 @@ { memset( stream, 0, sizeof(_GLFWstream) ); - stream->File = fopen( name, mode ); - if( stream->File == NULL ) + stream->file = fopen( name, mode ); + if( stream->file == NULL ) { - return GL_FALSE; + return GL_FALSE; } return GL_TRUE; @@ -58,8 +59,8 @@ { memset( stream, 0, sizeof(_GLFWstream) ); - stream->Data = data; - stream->Size = size; + stream->data = data; + stream->size = size; return GL_TRUE; } @@ -70,29 +71,29 @@ long _glfwReadStream( _GLFWstream *stream, void *data, long size ) { - if( stream->File != NULL ) + if( stream->file != NULL ) { - return fread( data, 1, size, stream->File ); + return (long) fread( data, 1, size, stream->file ); } - if( stream->Data != NULL ) + if( stream->data != NULL ) { - // Check for EOF - if( stream->Position == stream->Size ) - { - return 0; - } - - // Clamp read size to available data - if( stream->Position + size > stream->Size ) - { - size = stream->Size - stream->Position; - } - - // Perform data read - memcpy( data, (unsigned char*) stream->Data + stream->Position, size ); - stream->Position += size; - return size; + // Check for EOF + if( stream->position == stream->size ) + { + return 0; + } + + // Clamp read size to available data + if( stream->position + size > stream->size ) + { + size = stream->size - stream->position; + } + + // Perform data read + memcpy( data, (unsigned char*) stream->data + stream->position, size ); + stream->position += size; + return size; } return 0; @@ -105,14 +106,14 @@ long _glfwTellStream( _GLFWstream *stream ) { - if( stream->File != NULL ) + if( stream->file != NULL ) { - return ftell( stream->File ); + return ftell( stream->file ); } - if( stream->Data != NULL ) + if( stream->data != NULL ) { - return stream->Position; + return stream->position; } return 0; @@ -127,49 +128,49 @@ { long position; - if( stream->File != NULL ) + if( stream->file != NULL ) { - if( fseek( stream->File, offset, whence ) != 0 ) - { - return GL_FALSE; - } - - return GL_TRUE; - } - - if( stream->Data != NULL ) - { - position = offset; - - // Handle whence parameter - if( whence == SEEK_CUR ) - { - position += stream->Position; - } - else if( whence == SEEK_END ) - { - position += stream->Size; - } - else if( whence != SEEK_SET ) - { - return GL_FALSE; - } - - // Clamp offset to buffer bounds and apply it - if( position > stream->Size ) - { - stream->Position = stream->Size; - } - else if( position < 0 ) - { - stream->Position = 0; - } - else - { - stream->Position = position; - } - - return GL_TRUE; + if( fseek( stream->file, offset, whence ) != 0 ) + { + return GL_FALSE; + } + + return GL_TRUE; + } + + if( stream->data != NULL ) + { + position = offset; + + // Handle whence parameter + if( whence == SEEK_CUR ) + { + position += stream->position; + } + else if( whence == SEEK_END ) + { + position += stream->size; + } + else if( whence != SEEK_SET ) + { + return GL_FALSE; + } + + // Clamp offset to buffer bounds and apply it + if( position > stream->size ) + { + stream->position = stream->size; + } + else if( position < 0 ) + { + stream->position = 0; + } + else + { + stream->position = position; + } + + return GL_TRUE; } return GL_FALSE; @@ -182,9 +183,9 @@ void _glfwCloseStream( _GLFWstream *stream ) { - if( stream->File != NULL ) + if( stream->file != NULL ) { - fclose( stream->File ); + fclose( stream->file ); } // Nothing to be done about (user allocated) memory blocks diff -Nru glfw-2.6/lib/tga.c glfw-2.7.2/lib/tga.c --- glfw-2.6/lib/tga.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/tga.c 2011-06-20 11:43:53.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: tga.c // Platform: Any -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -90,11 +90,10 @@ //======================================================================== -// _glfwReadTGAHeader() - Read TGA file header (and check that it is -// valid) +// Read TGA file header (and check that it is valid) //======================================================================== -static int _glfwReadTGAHeader( _GLFWstream *s, _tga_header_t *h ) +static int ReadTGAHeader( _GLFWstream *s, _tga_header_t *h ) { unsigned char buf[ 18 ]; int pos; @@ -147,11 +146,11 @@ } //======================================================================== -// _glfwReadTGA_RLE() - Read Run-Length Encoded data +// Read Run-Length Encoded data //======================================================================== -static void _glfwReadTGA_RLE( unsigned char *buf, int size, int bpp, - _GLFWstream *s ) +static void ReadTGA_RLE( unsigned char *buf, int size, int bpp, + _GLFWstream *s ) { int repcount, bytes, k, n; unsigned char pixel[ 4 ]; @@ -199,7 +198,7 @@ //======================================================================== -// _glfwReadTGA() - Read a TGA image from a file +// Read a TGA image from a file //======================================================================== int _glfwReadTGA( _GLFWstream *s, GLFWimage *img, int flags ) @@ -210,7 +209,7 @@ int bpp, bpp2, k, m, n, swapx, swapy; // Read TGA header - if( !_glfwReadTGAHeader( s, &h ) ) + if( !ReadTGAHeader( s, &h ) ) { return 0; } @@ -276,7 +275,7 @@ // Read pixel data from file if( h.imagetype >= _TGA_IMAGETYPE_CMAP_RLE ) { - _glfwReadTGA_RLE( pix, pixsize, bpp, s ); + ReadTGA_RLE( pix, pixsize, bpp, s ); } else { diff -Nru glfw-2.6/lib/thread.c glfw-2.7.2/lib/thread.c --- glfw-2.6/lib/thread.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/thread.c 2011-06-20 11:43:53.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: thread.c // Platform: Any -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -37,7 +37,7 @@ //************************************************************************ //======================================================================== -// _glfwGetThreadPointer() - Find pointer to thread with a matching ID +// Find pointer to thread with a matching ID //======================================================================== _GLFWthread * _glfwGetThreadPointer( int ID ) @@ -57,7 +57,7 @@ //======================================================================== -// _glfwAppendThread() - Append thread to thread list +// Append thread to thread list //======================================================================== void _glfwAppendThread( _GLFWthread * t ) @@ -76,7 +76,7 @@ //======================================================================== -// _glfwRemoveThread() - Remove thread from thread list +// Remove thread from thread list //======================================================================== void _glfwRemoveThread( _GLFWthread * t ) @@ -99,11 +99,11 @@ //************************************************************************ //======================================================================== -// glfwCreateThread() - Create a new thread +// Create a new thread //======================================================================== GLFWAPI GLFWthread GLFWAPIENTRY glfwCreateThread( GLFWthreadfun fun, - void *arg ) + void *arg ) { // Is GLFW initialized? if( !_glfwInitialized ) @@ -117,8 +117,8 @@ //======================================================================== -// glfwDestroyThread() - Kill a thread. NOTE: THIS IS A VERY DANGEROUS -// OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME SITUATIONS! +// Kill a thread. NOTE: THIS IS A VERY DANGEROUS OPERATION, AND SHOULD NOT +// BE USED EXCEPT IN EXTREME SITUATIONS! //======================================================================== GLFWAPI void GLFWAPIENTRY glfwDestroyThread( GLFWthread ID ) @@ -140,7 +140,7 @@ //======================================================================== -// glfwWaitThread() - Wait for a thread to die +// Wait for a thread to die //======================================================================== GLFWAPI int GLFWAPIENTRY glfwWaitThread( GLFWthread ID, int waitmode ) @@ -162,7 +162,7 @@ //======================================================================== -// glfwGetThreadID() - Return the thread ID for the current thread +// Return the thread ID for the current thread //======================================================================== GLFWAPI GLFWthread GLFWAPIENTRY glfwGetThreadID( void ) @@ -178,7 +178,7 @@ //======================================================================== -// glfwCreateMutex() - Create a mutual exclusion object +// Create a mutual exclusion object //======================================================================== GLFWAPI GLFWmutex GLFWAPIENTRY glfwCreateMutex( void ) @@ -194,7 +194,7 @@ //======================================================================== -// glfwDestroyMutex() - Destroy a mutual exclusion object +// Destroy a mutual exclusion object //======================================================================== GLFWAPI void GLFWAPIENTRY glfwDestroyMutex( GLFWmutex mutex ) @@ -210,7 +210,7 @@ //======================================================================== -// glfwLockMutex() - Request access to a mutex +// Request access to a mutex //======================================================================== GLFWAPI void GLFWAPIENTRY glfwLockMutex( GLFWmutex mutex ) @@ -226,7 +226,7 @@ //======================================================================== -// glfwUnlockMutex() - Release a mutex +// Release a mutex //======================================================================== GLFWAPI void GLFWAPIENTRY glfwUnlockMutex( GLFWmutex mutex ) @@ -242,7 +242,7 @@ //======================================================================== -// glfwCreateCond() - Create a new condition variable object +// Create a new condition variable object //======================================================================== GLFWAPI GLFWcond GLFWAPIENTRY glfwCreateCond( void ) @@ -258,7 +258,7 @@ //======================================================================== -// glfwDestroyCond() - Destroy a condition variable object +// Destroy a condition variable object //======================================================================== GLFWAPI void GLFWAPIENTRY glfwDestroyCond( GLFWcond cond ) @@ -274,11 +274,11 @@ //======================================================================== -// glfwWaitCond() - Wait for a condition to be raised +// Wait for a condition to be raised //======================================================================== GLFWAPI void GLFWAPIENTRY glfwWaitCond( GLFWcond cond, GLFWmutex mutex, - double timeout ) + double timeout ) { // Initialized & valid condition variable and mutex? if( !_glfwInitialized || !cond || !mutex ) @@ -291,7 +291,7 @@ //======================================================================== -// glfwSignalCond() - Signal a condition to one waiting thread +// Signal a condition to one waiting thread //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSignalCond( GLFWcond cond ) @@ -307,7 +307,7 @@ //======================================================================== -// glfwBroadcastCond() - Broadcast a condition to all waiting threads +// Broadcast a condition to all waiting threads //======================================================================== GLFWAPI void GLFWAPIENTRY glfwBroadcastCond( GLFWcond cond ) @@ -323,9 +323,9 @@ //======================================================================== -// glfwGetNumberOfProcessors() - Return the number of processors in the -// system. This information can be useful for determining the optimal -// number of threads to use for performing a certain task. +// Return the number of processors in the system. This information can be +// useful for determining the optimal number of threads to use for +// performing a certain task. //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetNumberOfProcessors( void ) @@ -338,3 +338,4 @@ return _glfwPlatformGetNumberOfProcessors(); } + diff -Nru glfw-2.6/lib/time.c glfw-2.7.2/lib/time.c --- glfw-2.6/lib/time.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/time.c 2011-06-20 11:43:53.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: time.c // Platform: Any -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -36,7 +36,7 @@ //************************************************************************ //======================================================================== -// glfwGetTime() - Return timer value in seconds +// Return timer value in seconds //======================================================================== GLFWAPI double GLFWAPIENTRY glfwGetTime( void ) @@ -52,7 +52,7 @@ //======================================================================== -// glfwSetTime() - Set timer value in seconds +// Set timer value in seconds //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetTime( double time ) @@ -68,7 +68,7 @@ //======================================================================== -// glfwSleep() - Put a thread to sleep for a specified amount of time +// Put a thread to sleep for a specified amount of time //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSleep( double time ) @@ -81,3 +81,4 @@ _glfwPlatformSleep( time ); } + diff -Nru glfw-2.6/lib/win32/glfwdll_pellesc.def glfw-2.7.2/lib/win32/glfwdll_pellesc.def --- glfw-2.6/lib/win32/glfwdll_pellesc.def 2007-04-15 22:54:40.000000000 +0000 +++ glfw-2.7.2/lib/win32/glfwdll_pellesc.def 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -LIBRARY GLFW - -EXPORTS -glfwBroadcastCond = glfwBroadcastCond@4 -glfwCloseWindow = glfwCloseWindow@0 -glfwCreateCond = glfwCreateCond@0 -glfwCreateMutex = glfwCreateMutex@0 -glfwCreateThread = glfwCreateThread@8 -glfwDestroyCond = glfwDestroyCond@4 -glfwDestroyMutex = glfwDestroyMutex@4 -glfwDestroyThread = glfwDestroyThread@4 -glfwDisable = glfwDisable@4 -glfwEnable = glfwEnable@4 -glfwExtensionSupported = glfwExtensionSupported@4 -glfwFreeImage = glfwFreeImage@4 -glfwGetDesktopMode = glfwGetDesktopMode@4 -glfwGetGLVersion = glfwGetGLVersion@12 -glfwGetJoystickButtons = glfwGetJoystickButtons@12 -glfwGetJoystickParam = glfwGetJoystickParam@8 -glfwGetJoystickPos = glfwGetJoystickPos@12 -glfwGetKey = glfwGetKey@4 -glfwGetMouseButton = glfwGetMouseButton@4 -glfwGetMousePos = glfwGetMousePos@8 -glfwGetMouseWheel = glfwGetMouseWheel@0 -glfwGetNumberOfProcessors = glfwGetNumberOfProcessors@0 -glfwGetProcAddress = glfwGetProcAddress@4 -glfwGetThreadID = glfwGetThreadID@0 -glfwGetTime = glfwGetTime@0 -glfwGetVersion = glfwGetVersion@12 -glfwGetVideoModes = glfwGetVideoModes@8 -glfwGetWindowParam = glfwGetWindowParam@4 -glfwGetWindowSize = glfwGetWindowSize@8 -glfwIconifyWindow = glfwIconifyWindow@0 -glfwInit = glfwInit@0 -glfwLoadTexture2D = glfwLoadTexture2D@8 -glfwLockMutex = glfwLockMutex@4 -glfwOpenWindow = glfwOpenWindow@36 -glfwOpenWindowHint = glfwOpenWindowHint@8 -glfwPollEvents = glfwPollEvents@0 -glfwReadImage = glfwReadImage@12 -glfwReadMemoryImage = glfwReadMemoryImage@16 -glfwRestoreWindow = glfwRestoreWindow@0 -glfwSetCharCallback = glfwSetCharCallback@4 -glfwSetKeyCallback = glfwSetKeyCallback@4 -glfwSetMouseButtonCallback = glfwSetMouseButtonCallback@4 -glfwSetMousePos = glfwSetMousePos@8 -glfwSetMousePosCallback = glfwSetMousePosCallback@4 -glfwSetMouseWheel = glfwSetMouseWheel@4 -glfwSetMouseWheelCallback = glfwSetMouseWheelCallback@4 -glfwSetTime = glfwSetTime@8 -glfwSetWindowCloseCallback = glfwSetWindowCloseCallback@4 -glfwSetWindowRefreshCallback = glfwSetWindowRefreshCallback@4 -glfwSetWindowPos = glfwSetWindowPos@8 -glfwSetWindowSize = glfwSetWindowSize@8 -glfwSetWindowSizeCallback = glfwSetWindowSizeCallback@4 -glfwSetWindowTitle = glfwSetWindowTitle@4 -glfwSignalCond = glfwSignalCond@4 -glfwSleep = glfwSleep@8 -glfwSwapBuffers = glfwSwapBuffers@0 -glfwSwapInterval = glfwSwapInterval@4 -glfwTerminate = glfwTerminate@0 -glfwUnlockMutex = glfwUnlockMutex@4 -glfwWaitCond = glfwWaitCond@16 -glfwWaitEvents = glfwWaitEvents@0 -glfwWaitThread = glfwWaitThread@8 diff -Nru glfw-2.6/lib/win32/libglfw.pc.in glfw-2.7.2/lib/win32/libglfw.pc.in --- glfw-2.6/lib/win32/libglfw.pc.in 2007-03-15 03:22:43.000000000 +0000 +++ glfw-2.7.2/lib/win32/libglfw.pc.in 2010-08-08 14:42:20.000000000 +0000 @@ -5,7 +5,7 @@ Name: GLFW Description: A portable framework for OpenGL development -Version: 2.6.0 -URL: http://glfw.sourceforge.net/ +Version: 2.7 +URL: http://www.glfw.org/ Libs: -L${libdir} -lglfw -lglu32 -lopengl32 -lm -s -mwindows -e _mainCRTStartup Cflags: -I${includedir} -mwin32 diff -Nru glfw-2.6/lib/win32/Makefile.win32.bcc glfw-2.7.2/lib/win32/Makefile.win32.bcc --- glfw-2.6/lib/win32/Makefile.win32.bcc 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/win32/Makefile.win32.bcc 1970-01-01 00:00:00.000000000 +0000 @@ -1,265 +0,0 @@ -########################################################################## -# Makefile for GLFW on Windows using Borland C++ Builder Compiler 5.x. -#------------------------------------------------------------------------- -# To compile GLFW using this makefile, run: -# make -f Makefile.win32.bcc -########################################################################## - -########################################################################## -# Default: Build static and dynamic versions of GLFW -########################################################################## -default: glfw.lib glfw.dll - - -########################################################################## -# GLFW version -########################################################################## -VERMAJOR = 2 -VERMINOR = 5 - - -########################################################################## -# Compiler settings -########################################################################## -CC = bcc32 -CFLAGS = -c -O1 -q -w -I. -I.. -CFLAGS_DLL = $(CFLAGS) -DGLFW_BUILD_DLL - -# Some modules should be optimized for speed (e.g. image decoding) -CFLAGS_SPEED = -c -O2 -OS -Ov -q -w -I. -I.. -CFLAGS_SPEED_DLL = $(CFLAGS_SPEED) -DGLFW_BUILD_DLL - - -########################################################################## -# Library builder settings -########################################################################## -# Static library -MKLIB = tlib -LIBFLAGS = - -# DLL -LINK = bcc32 -LINKFLAGS = -tWD -q -v- -IMPLIB = implib - - -########################################################################## -# Object files for static library -########################################################################## -OBJS = \ - enable.obj \ - fullscreen.obj \ - glext.obj \ - image.obj \ - init.obj \ - input.obj \ - joystick.obj \ - stream.obj \ - tga.obj \ - thread.obj \ - time.obj \ - window.obj \ - win32_enable.obj \ - win32_fullscreen.obj \ - win32_glext.obj \ - win32_init.obj \ - win32_joystick.obj \ - win32_thread.obj \ - win32_time.obj \ - win32_window.obj - -OBJS2 = \ - +enable.obj \ - +fullscreen.obj \ - +glext.obj \ - +image.obj \ - +init.obj \ - +input.obj \ - +joystick.obj \ - +stream.obj \ - +tga.obj \ - +thread.obj \ - +time.obj \ - +window.obj \ - +win32_enable.obj \ - +win32_fullscreen.obj \ - +win32_glext.obj \ - +win32_init.obj \ - +win32_joystick.obj \ - +win32_thread.obj \ - +win32_time.obj \ - +win32_window.obj - - -########################################################################## -# Object files for dynamic library -########################################################################## -DLLOBJS = \ - enable_dll.obj \ - fullscreen_dll.obj \ - glext_dll.obj \ - image_dll.obj \ - init_dll.obj \ - input_dll.obj \ - joystick_dll.obj \ - stream_dll.obj \ - tga_dll.obj \ - thread_dll.obj \ - time_dll.obj \ - window_dll.obj \ - win32_dllmain_dll.obj \ - win32_enable_dll.obj \ - win32_fullscreen_dll.obj \ - win32_glext_dll.obj \ - win32_init_dll.obj \ - win32_joystick_dll.obj \ - win32_thread_dll.obj \ - win32_time_dll.obj \ - win32_window_dll.obj - - - -########################################################################## -# Rule for building static library -########################################################################## -glfw.lib: $(OBJS) - $(MKLIB) $(LIBFLAGS) glfw.lib $(OBJS2) - - -########################################################################## -# Rule for building dynamic library -########################################################################## -glfw.dll: $(DLLOBJS) - $(LINK) -e$@ $(LINKFLAGS) $(DLLOBJS) - $(IMPLIB) glfwdll.lib glfwdll.def - - -########################################################################## -# Rules for building static library object files -########################################################################## -enable.obj: ..\\enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ ..\\enable.c - -fullscreen.obj: ..\\fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ ..\\fullscreen.c - -glext.obj: ..\\glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ ..\\glext.c - -image.obj: ..\\image.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o$@ ..\\image.c - -init.obj: ..\\init.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ ..\\init.c - -input.obj: ..\\input.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ ..\\input.c - -joystick.obj: ..\\joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ ..\\joystick.c - -stream.obj: ..\\stream.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ ..\\stream.c - -tga.obj: ..\\tga.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o$@ ..\\tga.c - -thread.obj: ..\\thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ ..\\thread.c - -time.obj: ..\\time.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ ..\\time.c - -window.obj: ..\\window.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ ..\\window.c - -win32_enable.obj: win32_enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ win32_enable.c - -win32_fullscreen.obj: win32_fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ win32_fullscreen.c - -win32_glext.obj: win32_glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ win32_glext.c - -win32_init.obj: win32_init.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ win32_init.c - -win32_joystick.obj: win32_joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ win32_joystick.c - -win32_thread.obj: win32_thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ win32_thread.c - -win32_time.obj: win32_time.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ win32_time.c - -win32_window.obj: win32_window.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o$@ win32_window.c - - -########################################################################## -# Rules for building dynamic library object files -########################################################################## -enable_dll.obj: ..\\enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ ..\\enable.c - -fullscreen_dll.obj: ..\\fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ ..\\fullscreen.c - -glext_dll.obj: ..\\glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ ..\\glext.c - -image_dll.obj: ..\\image.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED_DLL) -o$@ ..\\image.c - -init_dll.obj: ..\\init.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ ..\\init.c - -input_dll.obj: ..\\input.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ ..\\input.c - -joystick_dll.obj: ..\\joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ ..\\joystick.c - -stream_dll.obj: ..\\stream.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ ..\\stream.c - -tga_dll.obj: ..\\tga.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED_DLL) -o$@ ..\\tga.c - -thread_dll.obj: ..\\thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ ..\\thread.c - -time_dll.obj: ..\\time.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ ..\\time.c - -window_dll.obj: ..\\window.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ ..\\window.c - -win32_dllmain_dll.obj: win32_dllmain.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ win32_dllmain.c - -win32_enable_dll.obj: win32_enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ win32_enable.c - -win32_fullscreen_dll.obj: win32_fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ win32_fullscreen.c - -win32_glext_dll.obj: win32_glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ win32_glext.c - -win32_init_dll.obj: win32_init.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ win32_init.c - -win32_joystick_dll.obj: win32_joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ win32_joystick.c - -win32_thread_dll.obj: win32_thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ win32_thread.c - -win32_time_dll.obj: win32_time.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ win32_time.c - -win32_window_dll.obj: win32_window.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o$@ win32_window.c diff -Nru glfw-2.6/lib/win32/Makefile.win32.cross-mgw glfw-2.7.2/lib/win32/Makefile.win32.cross-mgw --- glfw-2.6/lib/win32/Makefile.win32.cross-mgw 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/win32/Makefile.win32.cross-mgw 2011-06-25 19:30:02.000000000 +0000 @@ -4,55 +4,23 @@ # To compile GLFW using this makefile, run: # make -f Makefile.win32.mgw ########################################################################## -PREFIX ?= /usr/local +PREFIX ?= /usr/i586-mingw32msvc TARGET ?= i586-mingw32msvc- -########################################################################## -# Default: Build static and dynamic versions of GLFW -########################################################################## -default: libglfw.a glfw.dll - -########################################################################## -# Install GLFW header and static library -########################################################################## -install: glfw.dll libglfw.a libglfw.pc - $(INSTALL) -d $(PREFIX)/bin - $(INSTALL) -c glfw.dll $(PREFIX)/bin/glfw.dll - $(INSTALL) -d $(PREFIX)/lib - $(INSTALL) -c -m 644 libglfw.a $(PREFIX)/lib/libglfw.a - $(INSTALL) -d $(PREFIX)/include/GL - $(INSTALL) -c -m 644 ../../include/GL/glfw.h $(PREFIX)/include/GL/glfw.h - $(INSTALL) -d $(PREFIX)/lib/pkgconfig - $(INSTALL) -c -m 644 libglfw.pc $(PREFIX)/lib/pkgconfig/libglfw.pc - -########################################################################## -# Clean up generated files -########################################################################## -clean: - @rm -f *.o - @rm -f *.obj - @rm -f *.tds - @rm -f lib*.a - @rm -f glfw.dll - @rm -f libglfw.pc ########################################################################## # GLFW version ########################################################################## VERMAJOR = 2 -VERMINOR = 6 - +VERMINOR = 7 ########################################################################## # Compiler settings ########################################################################## CC = gcc -CFLAGS = -c -I. -I.. -Wall -Os -CFLAGS_DLL = $(CFLAGS) -mdll -DGLFW_BUILD_DLL - -# Some modules should be optimized for speed (e.g. image decoding) -CFLAGS_SPEED = -c -I. -I.. -Wall -O3 -ffast-math -CFLAGS_SPEED_DLL = $(CFLAGS_SPEED) -mdll -DGLFW_BUILD_DLL +CFLAGS = -c -I. -I.. -Wall -O2 +CFLAGS_DLL = $(CFLAGS) -mdll -DGLFW_BUILD_DLL -D_GLFW_NO_DLOAD_GDI32 -D_GLFW_NO_DLOAD_WINMM +HEADERS = ../../include/GL/glfw.h ../internal.h platform.h ########################################################################## # Library builder settings @@ -64,7 +32,7 @@ # DLL LINK = dllwrap LINKFLAGS = -s -Wl,--major-image-version,$(VERMAJOR),--minor-image-version,$(VERMINOR) -LINKLIBS = -lopengl32 +LINKLIBS = -lopengl32 -lwinmm -lgdi32 DLLTOOL = dlltool @@ -124,6 +92,30 @@ win32_window_dll.o +########################################################################## +# Default: Build static and dynamic versions of GLFW +########################################################################## +all: libglfw.a glfw.dll + +########################################################################## +# Install GLFW header and static library +########################################################################## +install: glfw.dll libglfw.a libglfw.pc + $(INSTALL) -d $(PREFIX)/bin + $(INSTALL) -c glfw.dll $(PREFIX)/bin/glfw.dll + $(INSTALL) -d $(PREFIX)/lib + $(INSTALL) -c -m 644 libglfw.a $(PREFIX)/lib/libglfw.a + $(INSTALL) -d $(PREFIX)/include/GL + $(INSTALL) -c -m 644 ../../include/GL/glfw.h $(PREFIX)/include/GL/glfw.h + $(INSTALL) -d $(PREFIX)/lib/pkgconfig + $(INSTALL) -c -m 644 libglfw.pc $(PREFIX)/lib/pkgconfig/libglfw.pc + +########################################################################## +# Clean up generated files +########################################################################## +clean: + rm -f $(OBJS) $(DLLOBJS) + rm -f libglfw.a libglfwdll.a glfw.dll libglfw.pc ########################################################################## # Rule for building static library @@ -131,7 +123,6 @@ libglfw.a: $(OBJS) $(TARGET)$(MKLIB) $(LIBFLAGS) $@ $(OBJS) $(SYSOBJS) - ########################################################################## # Rule for building dynamic library ########################################################################## @@ -145,130 +136,130 @@ ########################################################################## # Rules for building static library object files ########################################################################## -enable.o: ../enable.c ../internal.h platform.h +enable.o: ../enable.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ ../enable.c -fullscreen.o: ../fullscreen.c ../internal.h platform.h +fullscreen.o: ../fullscreen.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ ../fullscreen.c -glext.o: ../glext.c ../internal.h platform.h +glext.o: ../glext.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ ../glext.c -image.o: ../image.c ../internal.h platform.h - $(TARGET)$(CC) $(CFLAGS_SPEED) -o $@ ../image.c +image.o: ../image.c $(HEADERS) + $(TARGET)$(CC) $(CFLAGS) -o $@ ../image.c -init.o: ../init.c ../internal.h platform.h +init.o: ../init.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ ../init.c -input.o: ../input.c ../internal.h platform.h +input.o: ../input.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ ../input.c -joystick.o: ../joystick.c ../internal.h platform.h +joystick.o: ../joystick.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ ../joystick.c -stream.o: ../stream.c ../internal.h platform.h +stream.o: ../stream.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ ../stream.c -tga.o: ../tga.c ../internal.h platform.h - $(TARGET)$(CC) $(CFLAGS_SPEED) -o $@ ../tga.c +tga.o: ../tga.c $(HEADERS) + $(TARGET)$(CC) $(CFLAGS) -o $@ ../tga.c -thread.o: ../thread.c ../internal.h platform.h +thread.o: ../thread.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ ../thread.c -time.o: ../time.c ../internal.h platform.h +time.o: ../time.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ ../time.c -window.o: ../window.c ../internal.h platform.h +window.o: ../window.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ ../window.c -win32_enable.o: win32_enable.c ../internal.h platform.h +win32_enable.o: win32_enable.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ win32_enable.c -win32_fullscreen.o: win32_fullscreen.c ../internal.h platform.h +win32_fullscreen.o: win32_fullscreen.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ win32_fullscreen.c -win32_glext.o: win32_glext.c ../internal.h platform.h +win32_glext.o: win32_glext.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ win32_glext.c -win32_init.o: win32_init.c ../internal.h platform.h +win32_init.o: win32_init.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ win32_init.c -win32_joystick.o: win32_joystick.c ../internal.h platform.h +win32_joystick.o: win32_joystick.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ win32_joystick.c -win32_thread.o: win32_thread.c ../internal.h platform.h +win32_thread.o: win32_thread.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ win32_thread.c -win32_time.o: win32_time.c ../internal.h platform.h +win32_time.o: win32_time.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ win32_time.c -win32_window.o: win32_window.c ../internal.h platform.h +win32_window.o: win32_window.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS) -o $@ win32_window.c ########################################################################## # Rules for building dynamic library object files ########################################################################## -enable_dll.o: ../enable.c ../internal.h platform.h +enable_dll.o: ../enable.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ ../enable.c -fullscreen_dll.o: ../fullscreen.c ../internal.h platform.h +fullscreen_dll.o: ../fullscreen.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ ../fullscreen.c -glext_dll.o: ../glext.c ../internal.h platform.h +glext_dll.o: ../glext.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ ../glext.c -image_dll.o: ../image.c ../internal.h platform.h - $(TARGET)$(CC) $(CFLAGS_SPEED_DLL) -o $@ ../image.c +image_dll.o: ../image.c $(HEADERS) + $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ ../image.c -init_dll.o: ../init.c ../internal.h platform.h +init_dll.o: ../init.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ ../init.c -input_dll.o: ../input.c ../internal.h platform.h +input_dll.o: ../input.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ ../input.c -joystick_dll.o: ../joystick.c ../internal.h platform.h +joystick_dll.o: ../joystick.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ ../joystick.c -stream_dll.o: ../stream.c ../internal.h platform.h +stream_dll.o: ../stream.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ ../stream.c -tga_dll.o: ../tga.c ../internal.h platform.h - $(TARGET)$(CC) $(CFLAGS_SPEED_DLL) -o $@ ../tga.c +tga_dll.o: ../tga.c $(HEADERS) + $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ ../tga.c -thread_dll.o: ../thread.c ../internal.h platform.h +thread_dll.o: ../thread.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ ../thread.c -time_dll.o: ../time.c ../internal.h platform.h +time_dll.o: ../time.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ ../time.c -window_dll.o: ../window.c ../internal.h platform.h +window_dll.o: ../window.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ ../window.c -win32_dllmain_dll.o: win32_dllmain.c ../internal.h platform.h +win32_dllmain_dll.o: win32_dllmain.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ win32_dllmain.c -win32_enable_dll.o: win32_enable.c ../internal.h platform.h +win32_enable_dll.o: win32_enable.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ win32_enable.c -win32_fullscreen_dll.o: win32_fullscreen.c ../internal.h platform.h +win32_fullscreen_dll.o: win32_fullscreen.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ win32_fullscreen.c -win32_glext_dll.o: win32_glext.c ../internal.h platform.h +win32_glext_dll.o: win32_glext.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ win32_glext.c -win32_init_dll.o: win32_init.c ../internal.h platform.h +win32_init_dll.o: win32_init.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ win32_init.c -win32_joystick_dll.o: win32_joystick.c ../internal.h platform.h +win32_joystick_dll.o: win32_joystick.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ win32_joystick.c -win32_thread_dll.o: win32_thread.c ../internal.h platform.h +win32_thread_dll.o: win32_thread.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ win32_thread.c -win32_time_dll.o: win32_time.c ../internal.h platform.h +win32_time_dll.o: win32_time.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ win32_time.c -win32_window_dll.o: win32_window.c ../internal.h platform.h +win32_window_dll.o: win32_window.c $(HEADERS) $(TARGET)$(CC) $(CFLAGS_DLL) -o $@ win32_window.c diff -Nru glfw-2.6/lib/win32/Makefile.win32.cygwin glfw-2.7.2/lib/win32/Makefile.win32.cygwin --- glfw-2.6/lib/win32/Makefile.win32.cygwin 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/win32/Makefile.win32.cygwin 2011-06-25 19:30:02.000000000 +0000 @@ -8,29 +8,20 @@ PREFIX ?= /usr/local ########################################################################## -# Default: Build static and dynamic versions of GLFW -########################################################################## -default: libglfw.a glfw.dll - - -########################################################################## # GLFW version ########################################################################## VERMAJOR = 2 -VERMINOR = 5 +VERMINOR = 7 ########################################################################## # Compiler settings ########################################################################## CC = gcc -CFLAGS = -c -I. -I.. -Wall -mwin32 -Os -CFLAGS_DLL = $(CFLAGS) -mdll -DGLFW_BUILD_DLL - -# Some modules should be optimized for speed (e.g. image decoding) -CFLAGS_SPEED = -c -I. -I.. -Wall -mwin32 -O3 -ffast-math -CFLAGS_SPEED_DLL = $(CFLAGS_SPEED) -mdll -DGLFW_BUILD_DLL +CFLAGS = -c -I. -I.. -Wall -mwin32 -mno-cygwin -O2 +CFLAGS_DLL = $(CFLAGS) -mdll -DGLFW_BUILD_DLL -D_GLFW_NO_DLOAD_GDI32 -D_GLFW_NO_DLOAD_WINMM +HEADERS = ../../include/GL/glfw.h ../internal.h platform.h ########################################################################## # Library builder settings @@ -41,38 +32,14 @@ # DLL LINK = gcc -LINKFLAGS = -shared -s -Wl,--kill-at,--major-image-version,$(VERMAJOR),--minor-image-version,$(VERMINOR) -LINKLIBS = -lopengl32 +LINKFLAGS = -shared -s -mno-cygwin -Wl,--kill-at,--major-image-version,$(VERMAJOR),--minor-image-version,$(VERMINOR) +LINKLIBS = -lopengl32 -lwinmm -lgdi32 SED = sed INSTALL = install ########################################################################## -# Install GLFW header and static library -########################################################################## -install: libglfw.a libglfw.pc - $(INSTALL) -d $(PREFIX)/lib - $(INSTALL) -c -m 644 libglfw.a $(PREFIX)/lib/libglfw.a - $(INSTALL) -d $(PREFIX)/include/GL - $(INSTALL) -c -m 644 ../../include/GL/glfw.h $(PREFIX)/include/GL/glfw.h - $(INSTALL) -d $(PREFIX)/lib/pkgconfig - $(INSTALL) -c -m 644 libglfw.pc $(PREFIX)/lib/pkgconfig/libglfw.pc - - -########################################################################## -# Clean up generated files -########################################################################## -clean: - @rm -f *.o - @rm -f *.obj - @rm -f *.tds - @rm -f lib*.a - @rm -f glfw.dll - @rm -f libglfw.pc - - -########################################################################## # Object files for static library ########################################################################## OBJS = \ @@ -126,6 +93,31 @@ ########################################################################## +# Default: Build static and dynamic versions of GLFW +########################################################################## +all: libglfw.a glfw.dll + +########################################################################## +# Install GLFW header and static library +########################################################################## +install: libglfw.a libglfw.pc + $(INSTALL) -d $(PREFIX)/lib + $(INSTALL) -c -m 644 libglfw.a $(PREFIX)/lib/libglfw.a + $(INSTALL) -d $(PREFIX)/include/GL + $(INSTALL) -c -m 644 ../../include/GL/glfw.h $(PREFIX)/include/GL/glfw.h + $(INSTALL) -d $(PREFIX)/lib/pkgconfig + $(INSTALL) -c -m 644 libglfw.pc $(PREFIX)/lib/pkgconfig/libglfw.pc + + +########################################################################## +# Clean up generated files +########################################################################## +clean: + rm -f $(OBJS) $(DLLOBJS) + rm -f libglfw.a glfw.dll libglfw.pc + + +########################################################################## # Rule for building libglfw.pc ########################################################################## libglfw.pc: libglfw.pc.in @@ -150,130 +142,130 @@ ########################################################################## # Rules for building static library object files ########################################################################## -enable.o: ../enable.c ../internal.h platform.h +enable.o: ../enable.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../enable.c -fullscreen.o: ../fullscreen.c ../internal.h platform.h +fullscreen.o: ../fullscreen.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../fullscreen.c -glext.o: ../glext.c ../internal.h platform.h +glext.o: ../glext.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../glext.c -image.o: ../image.c ../internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o $@ ../image.c +image.o: ../image.c $(HEADERS) + $(CC) $(CFLAGS) -o $@ ../image.c -init.o: ../init.c ../internal.h platform.h +init.o: ../init.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../init.c -input.o: ../input.c ../internal.h platform.h +input.o: ../input.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../input.c -joystick.o: ../joystick.c ../internal.h platform.h +joystick.o: ../joystick.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../joystick.c -stream.o: ../stream.c ../internal.h platform.h +stream.o: ../stream.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../stream.c -tga.o: ../tga.c ../internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o $@ ../tga.c +tga.o: ../tga.c $(HEADERS) + $(CC) $(CFLAGS) -o $@ ../tga.c -thread.o: ../thread.c ../internal.h platform.h +thread.o: ../thread.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../thread.c -time.o: ../time.c ../internal.h platform.h +time.o: ../time.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../time.c -window.o: ../window.c ../internal.h platform.h +window.o: ../window.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../window.c -win32_enable.o: win32_enable.c ../internal.h platform.h +win32_enable.o: win32_enable.c $(HEADERS) $(CC) $(CFLAGS) -o $@ win32_enable.c -win32_fullscreen.o: win32_fullscreen.c ../internal.h platform.h +win32_fullscreen.o: win32_fullscreen.c $(HEADERS) $(CC) $(CFLAGS) -o $@ win32_fullscreen.c -win32_glext.o: win32_glext.c ../internal.h platform.h +win32_glext.o: win32_glext.c $(HEADERS) $(CC) $(CFLAGS) -o $@ win32_glext.c -win32_init.o: win32_init.c ../internal.h platform.h +win32_init.o: win32_init.c $(HEADERS) $(CC) $(CFLAGS) -o $@ win32_init.c -win32_joystick.o: win32_joystick.c ../internal.h platform.h +win32_joystick.o: win32_joystick.c $(HEADERS) $(CC) $(CFLAGS) -o $@ win32_joystick.c -win32_thread.o: win32_thread.c ../internal.h platform.h +win32_thread.o: win32_thread.c $(HEADERS) $(CC) $(CFLAGS) -o $@ win32_thread.c -win32_time.o: win32_time.c ../internal.h platform.h +win32_time.o: win32_time.c $(HEADERS) $(CC) $(CFLAGS) -o $@ win32_time.c -win32_window.o: win32_window.c ../internal.h platform.h +win32_window.o: win32_window.c $(HEADERS) $(CC) $(CFLAGS) -o $@ win32_window.c ########################################################################## # Rules for building dynamic library object files ########################################################################## -enable_dll.o: ../enable.c ../internal.h platform.h +enable_dll.o: ../enable.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ ../enable.c -fullscreen_dll.o: ../fullscreen.c ../internal.h platform.h +fullscreen_dll.o: ../fullscreen.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ ../fullscreen.c -glext_dll.o: ../glext.c ../internal.h platform.h +glext_dll.o: ../glext.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ ../glext.c -image_dll.o: ../image.c ../internal.h platform.h - $(CC) $(CFLAGS_SPEED_DLL) -o $@ ../image.c +image_dll.o: ../image.c $(HEADERS) + $(CC) $(CFLAGS_DLL) -o $@ ../image.c -init_dll.o: ../init.c ../internal.h platform.h +init_dll.o: ../init.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ ../init.c -input_dll.o: ../input.c ../internal.h platform.h +input_dll.o: ../input.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ ../input.c -joystick_dll.o: ../joystick.c ../internal.h platform.h +joystick_dll.o: ../joystick.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ ../joystick.c -stream_dll.o: ../stream.c ../internal.h platform.h +stream_dll.o: ../stream.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ ../stream.c -tga_dll.o: ../tga.c ../internal.h platform.h - $(CC) $(CFLAGS_SPEED_DLL) -o $@ ../tga.c +tga_dll.o: ../tga.c $(HEADERS) + $(CC) $(CFLAGS_DLL) -o $@ ../tga.c -thread_dll.o: ../thread.c ../internal.h platform.h +thread_dll.o: ../thread.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ ../thread.c -time_dll.o: ../time.c ../internal.h platform.h +time_dll.o: ../time.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ ../time.c -window_dll.o: ../window.c ../internal.h platform.h +window_dll.o: ../window.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ ../window.c -win32_dllmain_dll.o: win32_dllmain.c ../internal.h platform.h +win32_dllmain_dll.o: win32_dllmain.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ win32_dllmain.c -win32_enable_dll.o: win32_enable.c ../internal.h platform.h +win32_enable_dll.o: win32_enable.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ win32_enable.c -win32_fullscreen_dll.o: win32_fullscreen.c ../internal.h platform.h +win32_fullscreen_dll.o: win32_fullscreen.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ win32_fullscreen.c -win32_glext_dll.o: win32_glext.c ../internal.h platform.h +win32_glext_dll.o: win32_glext.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ win32_glext.c -win32_init_dll.o: win32_init.c ../internal.h platform.h +win32_init_dll.o: win32_init.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ win32_init.c -win32_joystick_dll.o: win32_joystick.c ../internal.h platform.h +win32_joystick_dll.o: win32_joystick.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ win32_joystick.c -win32_thread_dll.o: win32_thread.c ../internal.h platform.h +win32_thread_dll.o: win32_thread.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ win32_thread.c -win32_time_dll.o: win32_time.c ../internal.h platform.h +win32_time_dll.o: win32_time.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ win32_time.c -win32_window_dll.o: win32_window.c ../internal.h platform.h +win32_window_dll.o: win32_window.c $(HEADERS) $(CC) $(CFLAGS_DLL) -o $@ win32_window.c diff -Nru glfw-2.6/lib/win32/Makefile.win32.lcc glfw-2.7.2/lib/win32/Makefile.win32.lcc --- glfw-2.6/lib/win32/Makefile.win32.lcc 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/win32/Makefile.win32.lcc 2009-10-30 01:30:57.000000000 +0000 @@ -8,14 +8,14 @@ ########################################################################## # Default: Build static and dynamic versions of GLFW ########################################################################## -default: glfw.lib glfw.dll +all: glfw.lib glfw.dll ########################################################################## # GLFW version ########################################################################## VERMAJOR = 2 -VERMINOR = 5 +VERMINOR = 7 ########################################################################## @@ -25,10 +25,6 @@ CFLAGS = -c -O -A -I. -I.. CFLAGS_DLL = $(CFLAGS) -DGLFW_BUILD_DLL -# Some modules should be optimized for speed (e.g. image decoding) -CFLAGS_SPEED = $(CFLAGS) -CFLAGS_SPEED_DLL = $(CFLAGS_DLL) - ########################################################################## # Library builder settings @@ -128,7 +124,7 @@ $(CC) $(CFLAGS) -Fo$@ ..\\glext.c image.obj: ..\\image.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED) -Fo$@ ..\\image.c + $(CC) $(CFLAGS) -Fo$@ ..\\image.c init.obj: ..\\init.c ..\\internal.h platform.h $(CC) $(CFLAGS) -Fo$@ ..\\init.c @@ -143,7 +139,7 @@ $(CC) $(CFLAGS) -Fo$@ ..\\stream.c tga.obj: ..\\tga.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED) -Fo$@ ..\\tga.c + $(CC) $(CFLAGS) -Fo$@ ..\\tga.c thread.obj: ..\\thread.c ..\\internal.h platform.h $(CC) $(CFLAGS) -Fo$@ ..\\thread.c @@ -192,7 +188,7 @@ $(CC) $(CFLAGS_DLL) -Fo$@ ..\\glext.c image_dll.obj: ..\\image.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED_DLL) -Fo$@ ..\\image.c + $(CC) $(CFLAGS_DLL) -Fo$@ ..\\image.c init_dll.obj: ..\\init.c ..\\internal.h platform.h $(CC) $(CFLAGS_DLL) -Fo$@ ..\\init.c @@ -207,7 +203,7 @@ $(CC) $(CFLAGS_DLL) -Fo$@ ..\\stream.c tga_dll.obj: ..\\tga.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED_DLL) -Fo$@ ..\\tga.c + $(CC) $(CFLAGS_DLL) -Fo$@ ..\\tga.c thread_dll.obj: ..\\thread.c ..\\internal.h platform.h $(CC) $(CFLAGS_DLL) -Fo$@ ..\\thread.c diff -Nru glfw-2.6/lib/win32/Makefile.win32.mgw glfw-2.7.2/lib/win32/Makefile.win32.mgw --- glfw-2.6/lib/win32/Makefile.win32.mgw 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/win32/Makefile.win32.mgw 1970-01-01 00:00:00.000000000 +0000 @@ -1,243 +0,0 @@ -########################################################################## -# Makefile for GLFW on Windows using MinGW32. -#------------------------------------------------------------------------- -# To compile GLFW using this makefile, run: -# make -f Makefile.win32.mgw -########################################################################## - -########################################################################## -# Default: Build static and dynamic versions of GLFW -########################################################################## -default: libglfw.a glfw.dll - - -########################################################################## -# GLFW version -########################################################################## -VERMAJOR = 2 -VERMINOR = 5 - - -########################################################################## -# Compiler settings -########################################################################## -CC = gcc -CFLAGS = -c -I. -I.. -Wall -Os -CFLAGS_DLL = $(CFLAGS) -mdll -DGLFW_BUILD_DLL - -# Some modules should be optimized for speed (e.g. image decoding) -CFLAGS_SPEED = -c -I. -I.. -Wall -O3 -ffast-math -CFLAGS_SPEED_DLL = $(CFLAGS_SPEED) -mdll -DGLFW_BUILD_DLL - - -########################################################################## -# Library builder settings -########################################################################## -# Static library -MKLIB = ar -LIBFLAGS = -rcs - -# DLL -LINK = dllwrap -LINKFLAGS = -s -Wl,--major-image-version,$(VERMAJOR),--minor-image-version,$(VERMINOR) -LINKLIBS = -lopengl32 - - -########################################################################## -# Object files for static library -########################################################################## -OBJS = \ - enable.o \ - fullscreen.o \ - glext.o \ - image.o \ - init.o \ - input.o \ - joystick.o \ - stream.o \ - tga.o \ - thread.o \ - time.o \ - window.o \ - win32_enable.o \ - win32_fullscreen.o \ - win32_glext.o \ - win32_init.o \ - win32_joystick.o \ - win32_thread.o \ - win32_time.o \ - win32_window.o - - -########################################################################## -# Object files for dynamic library -########################################################################## -DLLOBJS = \ - enable_dll.o \ - fullscreen_dll.o \ - glext_dll.o \ - image_dll.o \ - init_dll.o \ - input_dll.o \ - joystick_dll.o \ - stream_dll.o \ - tga_dll.o \ - thread_dll.o \ - time_dll.o \ - window_dll.o \ - win32_dllmain_dll.o \ - win32_enable_dll.o \ - win32_fullscreen_dll.o \ - win32_glext_dll.o \ - win32_init_dll.o \ - win32_joystick_dll.o \ - win32_thread_dll.o \ - win32_time_dll.o \ - win32_window_dll.o - - - -########################################################################## -# Rule for building static library -########################################################################## -libglfw.a: $(OBJS) - $(MKLIB) $(LIBFLAGS) $@ $(OBJS) $(SYSOBJS) - - -########################################################################## -# Rule for building dynamic library -########################################################################## -glfw.dll: $(DLLOBJS) - $(LINK) --dllname $@ --def glfwdll_mgw1.def $(DLLOBJS) $(LINKFLAGS) $(LINKLIBS) - dlltool --kill-at --output-lib libglfwdll.a --def glfwdll_mgw2.def - - -########################################################################## -# Rules for building static library object files -########################################################################## -enable.o: ..\\enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\enable.c - -fullscreen.o: ..\\fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\fullscreen.c - -glext.o: ..\\glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\glext.c - -image.o: ..\\image.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o $@ ..\\image.c - -init.o: ..\\init.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\init.c - -input.o: ..\\input.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\input.c - -joystick.o: ..\\joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\joystick.c - -stream.o: ..\\stream.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\stream.c - -tga.o: ..\\tga.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o $@ ..\\tga.c - -thread.o: ..\\thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\thread.c - -time.o: ..\\time.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\time.c - -window.o: ..\\window.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ ..\\window.c - -win32_enable.o: win32_enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ win32_enable.c - -win32_fullscreen.o: win32_fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ win32_fullscreen.c - -win32_glext.o: win32_glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ win32_glext.c - -win32_init.o: win32_init.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ win32_init.c - -win32_joystick.o: win32_joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ win32_joystick.c - -win32_thread.o: win32_thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ win32_thread.c - -win32_time.o: win32_time.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ win32_time.c - -win32_window.o: win32_window.c ..\\internal.h platform.h - $(CC) $(CFLAGS) -o $@ win32_window.c - - -########################################################################## -# Rules for building dynamic library object files -########################################################################## -enable_dll.o: ..\\enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ ..\\enable.c - -fullscreen_dll.o: ..\\fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ ..\\fullscreen.c - -glext_dll.o: ..\\glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ ..\\glext.c - -image_dll.o: ..\\image.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED_DLL) -o $@ ..\\image.c - -init_dll.o: ..\\init.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ ..\\init.c - -input_dll.o: ..\\input.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ ..\\input.c - -joystick_dll.o: ..\\joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ ..\\joystick.c - -stream_dll.o: ..\\stream.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ ..\\stream.c - -tga_dll.o: ..\\tga.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED_DLL) -o $@ ..\\tga.c - -thread_dll.o: ..\\thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ ..\\thread.c - -time_dll.o: ..\\time.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ ..\\time.c - -window_dll.o: ..\\window.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ ..\\window.c - -win32_dllmain_dll.o: win32_dllmain.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ win32_dllmain.c - -win32_enable_dll.o: win32_enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ win32_enable.c - -win32_fullscreen_dll.o: win32_fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ win32_fullscreen.c - -win32_glext_dll.o: win32_glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ win32_glext.c - -win32_init_dll.o: win32_init.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ win32_init.c - -win32_joystick_dll.o: win32_joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ win32_joystick.c - -win32_thread_dll.o: win32_thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ win32_thread.c - -win32_time_dll.o: win32_time.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ win32_time.c - -win32_window_dll.o: win32_window.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) -o $@ win32_window.c diff -Nru glfw-2.6/lib/win32/Makefile.win32.mingw glfw-2.7.2/lib/win32/Makefile.win32.mingw --- glfw-2.6/lib/win32/Makefile.win32.mingw 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/lib/win32/Makefile.win32.mingw 2011-06-25 19:39:42.000000000 +0000 @@ -0,0 +1,240 @@ +########################################################################## +# Makefile for GLFW on Windows using MinGW32. +#------------------------------------------------------------------------- +# To compile GLFW using this makefile, run: +# make -f Makefile.win32.mgw +########################################################################## + +########################################################################## +# Default: Build static and dynamic versions of GLFW +########################################################################## +all: libglfw.a glfw.dll + + +########################################################################## +# GLFW version +########################################################################## +VERMAJOR = 2 +VERMINOR = 7 + + +########################################################################## +# Compiler settings +########################################################################## +CC = gcc +CFLAGS = -c -I. -I.. -Wall -O2 +CFLAGS_DLL = $(CFLAGS) -mdll -DGLFW_BUILD_DLL -D_GLFW_NO_DLOAD_GDI32 -D_GLFW_NO_DLOAD_WINMM + + +########################################################################## +# Library builder settings +########################################################################## +# Static library +MKLIB = ar +LIBFLAGS = -rcs + +# DLL +LINK = dllwrap +LINKFLAGS = -s -Wl,--major-image-version,$(VERMAJOR),--minor-image-version,$(VERMINOR) +LINKLIBS = -lopengl32 -lwinmm -lgdi32 + + +########################################################################## +# Object files for static library +########################################################################## +OBJS = \ + enable.o \ + fullscreen.o \ + glext.o \ + image.o \ + init.o \ + input.o \ + joystick.o \ + stream.o \ + tga.o \ + thread.o \ + time.o \ + window.o \ + win32_enable.o \ + win32_fullscreen.o \ + win32_glext.o \ + win32_init.o \ + win32_joystick.o \ + win32_thread.o \ + win32_time.o \ + win32_window.o + + +########################################################################## +# Object files for dynamic library +########################################################################## +DLLOBJS = \ + enable_dll.o \ + fullscreen_dll.o \ + glext_dll.o \ + image_dll.o \ + init_dll.o \ + input_dll.o \ + joystick_dll.o \ + stream_dll.o \ + tga_dll.o \ + thread_dll.o \ + time_dll.o \ + window_dll.o \ + win32_dllmain_dll.o \ + win32_enable_dll.o \ + win32_fullscreen_dll.o \ + win32_glext_dll.o \ + win32_init_dll.o \ + win32_joystick_dll.o \ + win32_thread_dll.o \ + win32_time_dll.o \ + win32_window_dll.o + + + +########################################################################## +# Rule for building static library +########################################################################## +libglfw.a: $(OBJS) + $(MKLIB) $(LIBFLAGS) $@ $(OBJS) $(SYSOBJS) + + +########################################################################## +# Rule for building dynamic library +########################################################################## +glfw.dll: $(DLLOBJS) + $(LINK) --dllname $@ --def glfwdll_mgw1.def $(DLLOBJS) $(LINKFLAGS) $(LINKLIBS) + dlltool --kill-at --output-lib libglfwdll.a --def glfwdll_mgw2.def + + +########################################################################## +# Rules for building static library object files +########################################################################## +enable.o: ../enable.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../enable.c + +fullscreen.o: ../fullscreen.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../fullscreen.c + +glext.o: ../glext.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../glext.c + +image.o: ../image.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../image.c + +init.o: ../init.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../init.c + +input.o: ../input.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../input.c + +joystick.o: ../joystick.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../joystick.c + +stream.o: ../stream.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../stream.c + +tga.o: ../tga.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../tga.c + +thread.o: ../thread.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../thread.c + +time.o: ../time.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../time.c + +window.o: ../window.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ ../window.c + +win32_enable.o: win32_enable.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ win32_enable.c + +win32_fullscreen.o: win32_fullscreen.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ win32_fullscreen.c + +win32_glext.o: win32_glext.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ win32_glext.c + +win32_init.o: win32_init.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ win32_init.c + +win32_joystick.o: win32_joystick.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ win32_joystick.c + +win32_thread.o: win32_thread.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ win32_thread.c + +win32_time.o: win32_time.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ win32_time.c + +win32_window.o: win32_window.c ../internal.h platform.h + $(CC) $(CFLAGS) -o $@ win32_window.c + + +########################################################################## +# Rules for building dynamic library object files +########################################################################## +enable_dll.o: ../enable.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ ../enable.c + +fullscreen_dll.o: ../fullscreen.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ ../fullscreen.c + +glext_dll.o: ../glext.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ ../glext.c + +image_dll.o: ../image.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ ../image.c + +init_dll.o: ../init.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ ../init.c + +input_dll.o: ../input.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ ../input.c + +joystick_dll.o: ../joystick.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ ../joystick.c + +stream_dll.o: ../stream.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ ../stream.c + +tga_dll.o: ../tga.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ ../tga.c + +thread_dll.o: ../thread.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ ../thread.c + +time_dll.o: ../time.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ ../time.c + +window_dll.o: ../window.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ ../window.c + +win32_dllmain_dll.o: win32_dllmain.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ win32_dllmain.c + +win32_enable_dll.o: win32_enable.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ win32_enable.c + +win32_fullscreen_dll.o: win32_fullscreen.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ win32_fullscreen.c + +win32_glext_dll.o: win32_glext.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ win32_glext.c + +win32_init_dll.o: win32_init.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ win32_init.c + +win32_joystick_dll.o: win32_joystick.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ win32_joystick.c + +win32_thread_dll.o: win32_thread.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ win32_thread.c + +win32_time_dll.o: win32_time.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ win32_time.c + +win32_window_dll.o: win32_window.c ../internal.h platform.h + $(CC) $(CFLAGS_DLL) -o $@ win32_window.c + diff -Nru glfw-2.6/lib/win32/Makefile.win32.msvc glfw-2.7.2/lib/win32/Makefile.win32.msvc --- glfw-2.6/lib/win32/Makefile.win32.msvc 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/win32/Makefile.win32.msvc 1970-01-01 00:00:00.000000000 +0000 @@ -1,242 +0,0 @@ -########################################################################## -# Makefile for GLFW on Windows using MS VC++ 6.x. -#------------------------------------------------------------------------- -# To compile GLFW using this makefile, run: -# nmake -f Makefile.win32.msvc -########################################################################## - -########################################################################## -# Default: Build static and dynamic versions of GLFW -########################################################################## -default: glfw.lib glfw.dll - - -########################################################################## -# GLFW version -########################################################################## -VERMAJOR = 2 -VERMINOR = 5 - - -########################################################################## -# Compiler settings -########################################################################## -CC = cl -CFLAGS = /nologo /c /O1 /Gs /W3 /I. /I.. -CFLAGS_DLL = $(CFLAGS) /DGLFW_BUILD_DLL - -# Some modules should be optimized for speed (image decoding) -CFLAGS_SPEED = /nologo /c /O2 /Gs /W3 /I. /I.. -CFLAGS_SPEED_DLL = $(CFLAGS_SPEED) /DGLFW_BUILD_DLL - - -########################################################################## -# Library builder settings -########################################################################## -# Static library -MKLIB = lib -LIBFLAGS = /nologo - -# DLL -LINK = link -LINKFLAGS = /nologo /dll /version:$(VERMAJOR).$(VERMINOR) -LINKLIBS = opengl32.lib user32.lib - - -########################################################################## -# Object files for static library -########################################################################## -OBJS = \ - enable.obj \ - fullscreen.obj \ - glext.obj \ - image.obj \ - init.obj \ - input.obj \ - joystick.obj \ - stream.obj \ - tga.obj \ - thread.obj \ - time.obj \ - window.obj \ - win32_enable.obj \ - win32_fullscreen.obj \ - win32_glext.obj \ - win32_init.obj \ - win32_joystick.obj \ - win32_thread.obj \ - win32_time.obj \ - win32_window.obj - - -########################################################################## -# Object files for dynamic library -########################################################################## -DLLOBJS = \ - enable_dll.obj \ - fullscreen_dll.obj \ - glext_dll.obj \ - image_dll.obj \ - init_dll.obj \ - input_dll.obj \ - joystick_dll.obj \ - stream_dll.obj \ - tga_dll.obj \ - thread_dll.obj \ - time_dll.obj \ - window_dll.obj \ - win32_dllmain_dll.obj \ - win32_enable_dll.obj \ - win32_fullscreen_dll.obj \ - win32_glext_dll.obj \ - win32_init_dll.obj \ - win32_joystick_dll.obj \ - win32_thread_dll.obj \ - win32_time_dll.obj \ - win32_window_dll.obj - - - -########################################################################## -# Rule for building static library -########################################################################## -glfw.lib: $(OBJS) - $(MKLIB) $(LIBFLAGS) /OUT:glfw.lib $(OBJS) - - -########################################################################## -# Rule for building dynamic library -########################################################################## -glfw.dll: $(DLLOBJS) - $(LINK) $(LINKFLAGS) /out:glfw.dll /implib:glfwdll.lib /def:glfwdll.def $(DLLOBJS) $(LINKLIBS) - - -########################################################################## -# Rules for building static library object files -########################################################################## -enable.obj: ..\\enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\enable.c - -fullscreen.obj: ..\\fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\fullscreen.c - -glext.obj: ..\\glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\glext.c - -image.obj: ..\\image.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED) /Fo$@ ..\\image.c - -init.obj: ..\\init.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\init.c - -input.obj: ..\\input.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\input.c - -joystick.obj: ..\\joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\joystick.c - -stream.obj: ..\\stream.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\stream.c - -tga.obj: ..\\tga.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED) /Fo$@ ..\\tga.c - -thread.obj: ..\\thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\thread.c - -time.obj: ..\\time.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\time.c - -window.obj: ..\\window.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\window.c - -win32_enable.obj: win32_enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ win32_enable.c - -win32_fullscreen.obj: win32_fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ win32_fullscreen.c - -win32_glext.obj: win32_glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ win32_glext.c - -win32_init.obj: win32_init.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ win32_init.c - -win32_joystick.obj: win32_joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ win32_joystick.c - -win32_thread.obj: win32_thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ win32_thread.c - -win32_time.obj: win32_time.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ win32_time.c - -win32_window.obj: win32_window.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ win32_window.c - - -########################################################################## -# Rules for building dynamic library object files -########################################################################## -enable_dll.obj: ..\\enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\enable.c - -fullscreen_dll.obj: ..\\fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\fullscreen.c - -glext_dll.obj: ..\\glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\glext.c - -image_dll.obj: ..\\image.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED_DLL) /Fo$@ ..\\image.c - -init_dll.obj: ..\\init.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\init.c - -input_dll.obj: ..\\input.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\input.c - -joystick_dll.obj: ..\\joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\joystick.c - -stream_dll.obj: ..\\stream.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\stream.c - -tga_dll.obj: ..\\tga.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED_DLL) /Fo$@ ..\\tga.c - -thread_dll.obj: ..\\thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\thread.c - -time_dll.obj: ..\\time.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\time.c - -window_dll.obj: ..\\window.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\window.c - -win32_dllmain_dll.obj: win32_dllmain.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_dllmain.c - -win32_enable_dll.obj: win32_enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_enable.c - -win32_fullscreen_dll.obj: win32_fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_fullscreen.c - -win32_glext_dll.obj: win32_glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_glext.c - -win32_init_dll.obj: win32_init.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_init.c - -win32_joystick_dll.obj: win32_joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_joystick.c - -win32_thread_dll.obj: win32_thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_thread.c - -win32_time_dll.obj: win32_time.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_time.c - -win32_window_dll.obj: win32_window.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_window.c diff -Nru glfw-2.6/lib/win32/Makefile.win32.ow glfw-2.7.2/lib/win32/Makefile.win32.ow --- glfw-2.6/lib/win32/Makefile.win32.ow 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/win32/Makefile.win32.ow 2009-10-30 01:30:57.000000000 +0000 @@ -8,14 +8,14 @@ ########################################################################## # Default: Build static and dynamic versions of GLFW ########################################################################## -default: glfw.lib glfw.dll +all: glfw.lib glfw.dll ########################################################################## # GLFW version ########################################################################## VERMAJOR = 2 -VERMINOR = 5 +VERMINOR = 7 ########################################################################## @@ -25,10 +25,6 @@ CFLAGS = /nologo /c /O1sgiy /Gs /W3 /I. /I.. CFLAGS_DLL = $(CFLAGS) /DGLFW_BUILD_DLL -# Some modules should be optimized for speed (image decoding) -CFLAGS_SPEED = /nologo /c /O2tgiy /Gs /W3 /I. /I.. -CFLAGS_SPEED_DLL = $(CFLAGS_SPEED) /DGLFW_BUILD_DLL - ########################################################################## # Library builder settings @@ -124,7 +120,7 @@ $(CC) $(CFLAGS) /Fo$@ ..\\glext.c image.obj: ..\\image.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED) /Fo$@ ..\\image.c + $(CC) $(CFLAGS) /Fo$@ ..\\image.c init.obj: ..\\init.c ..\\internal.h platform.h $(CC) $(CFLAGS) /Fo$@ ..\\init.c @@ -139,7 +135,7 @@ $(CC) $(CFLAGS) /Fo$@ ..\\stream.c tga.obj: ..\\tga.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED) /Fo$@ ..\\tga.c + $(CC) $(CFLAGS) /Fo$@ ..\\tga.c thread.obj: ..\\thread.c ..\\internal.h platform.h $(CC) $(CFLAGS) /Fo$@ ..\\thread.c @@ -188,7 +184,7 @@ $(CC) $(CFLAGS_DLL) /Fo$@ ..\\glext.c image_dll.obj: ..\\image.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED_DLL) /Fo$@ ..\\image.c + $(CC) $(CFLAGS_DLL) /Fo$@ ..\\image.c init_dll.obj: ..\\init.c ..\\internal.h platform.h $(CC) $(CFLAGS_DLL) /Fo$@ ..\\init.c @@ -203,7 +199,7 @@ $(CC) $(CFLAGS_DLL) /Fo$@ ..\\stream.c tga_dll.obj: ..\\tga.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED_DLL) /Fo$@ ..\\tga.c + $(CC) $(CFLAGS_DLL) /Fo$@ ..\\tga.c thread_dll.obj: ..\\thread.c ..\\internal.h platform.h $(CC) $(CFLAGS_DLL) /Fo$@ ..\\thread.c diff -Nru glfw-2.6/lib/win32/Makefile.win32.pellesc glfw-2.7.2/lib/win32/Makefile.win32.pellesc --- glfw-2.6/lib/win32/Makefile.win32.pellesc 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/win32/Makefile.win32.pellesc 1970-01-01 00:00:00.000000000 +0000 @@ -1,242 +0,0 @@ -########################################################################## -# Makefile for GLFW on Windows using Pelles C. -#------------------------------------------------------------------------- -# To compile GLFW using this makefile, run: -# pomake /F Makefile.win32.pellesc -########################################################################## - -########################################################################## -# Default: Build static and dynamic versions of GLFW -########################################################################## -default: glfw.lib glfw.dll - - -########################################################################## -# GLFW version -########################################################################## -VERMAJOR = 2 -VERMINOR = 5 - - -########################################################################## -# Compiler settings -########################################################################## -CC = cc -CFLAGS = /c /Os /I. /I.. /Ze -CFLAGS_DLL = $(CFLAGS) /DGLFW_BUILD_DLL - -# Some modules should be optimized for speed (e.g. image decoding) -CFLAGS_SPEED = /c /Ot /I. /I.. /Ze -CFLAGS_SPEED_DLL = $(CFLAGS_SPEED) /DGLFW_BUILD_DLL - - -########################################################################## -# Library builder settings -########################################################################## -# Static library -MKLIB = polib -LIBFLAGS = - -# DLL -LINK = polink -LINKFLAGS = /DLL /RELEASE /DEF:glfwdll_pellesc.def /IMPLIB:glfwdll.lib -LINKLIBS = opengl32.lib user32.lib kernel32.lib - - -########################################################################## -# Object files for static library -########################################################################## -OBJS = \ - enable.obj \ - fullscreen.obj \ - glext.obj \ - image.obj \ - init.obj \ - input.obj \ - joystick.obj \ - stream.obj \ - tga.obj \ - thread.obj \ - time.obj \ - window.obj \ - win32_enable.obj \ - win32_fullscreen.obj \ - win32_glext.obj \ - win32_init.obj \ - win32_joystick.obj \ - win32_thread.obj \ - win32_time.obj \ - win32_window.obj - - -########################################################################## -# Object files for dynamic library -########################################################################## -DLLOBJS = \ - enable_dll.obj \ - fullscreen_dll.obj \ - glext_dll.obj \ - image_dll.obj \ - init_dll.obj \ - input_dll.obj \ - joystick_dll.obj \ - stream_dll.obj \ - tga_dll.obj \ - thread_dll.obj \ - time_dll.obj \ - window_dll.obj \ - win32_dllmain_dll.obj \ - win32_enable_dll.obj \ - win32_fullscreen_dll.obj \ - win32_glext_dll.obj \ - win32_init_dll.obj \ - win32_joystick_dll.obj \ - win32_thread_dll.obj \ - win32_time_dll.obj \ - win32_window_dll.obj - - - -########################################################################## -# Rule for building static library -########################################################################## -glfw.lib: $(OBJS) - $(MKLIB) $(LIBFLAGS) /OUT:glfw.lib $(OBJS) - - -########################################################################## -# Rule for building dynamic library -########################################################################## -glfw.dll: $(DLLOBJS) - $(LINK) $(LINKFLAGS) /OUT:$@ $(DLLOBJS) $(LINKLIBS) - - -########################################################################## -# Rules for building static library object files -########################################################################## -enable.obj: ..\\enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\enable.c - -fullscreen.obj: ..\\fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\fullscreen.c - -glext.obj: ..\\glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\glext.c - -image.obj: ..\\image.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED) /Fo$@ ..\\image.c - -init.obj: ..\\init.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\init.c - -input.obj: ..\\input.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\input.c - -joystick.obj: ..\\joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\joystick.c - -stream.obj: ..\\stream.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\stream.c - -tga.obj: ..\\tga.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED) /Fo$@ ..\\tga.c - -thread.obj: ..\\thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\thread.c - -time.obj: ..\\time.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\time.c - -window.obj: ..\\window.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ ..\\window.c - -win32_enable.obj: win32_enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ win32_enable.c - -win32_fullscreen.obj: win32_fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ win32_fullscreen.c - -win32_glext.obj: win32_glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ win32_glext.c - -win32_init.obj: win32_init.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ win32_init.c - -win32_joystick.obj: win32_joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ win32_joystick.c - -win32_thread.obj: win32_thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ win32_thread.c - -win32_time.obj: win32_time.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ win32_time.c - -win32_window.obj: win32_window.c ..\\internal.h platform.h - $(CC) $(CFLAGS) /Fo$@ win32_window.c - - -########################################################################## -# Rules for building dynamic library object files -########################################################################## -enable_dll.obj: ..\\enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\enable.c - -fullscreen_dll.obj: ..\\fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\fullscreen.c - -glext_dll.obj: ..\\glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\glext.c - -image_dll.obj: ..\\image.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED_DLL) /Fo$@ ..\\image.c - -init_dll.obj: ..\\init.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\init.c - -input_dll.obj: ..\\input.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\input.c - -joystick_dll.obj: ..\\joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\joystick.c - -stream_dll.obj: ..\\stream.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\stream.c - -tga_dll.obj: ..\\tga.c ..\\internal.h platform.h - $(CC) $(CFLAGS_SPEED_DLL) /Fo$@ ..\\tga.c - -thread_dll.obj: ..\\thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\thread.c - -time_dll.obj: ..\\time.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\time.c - -window_dll.obj: ..\\window.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ ..\\window.c - -win32_dllmain_dll.obj: win32_dllmain.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_dllmain.c - -win32_enable_dll.obj: win32_enable.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_enable.c - -win32_fullscreen_dll.obj: win32_fullscreen.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_fullscreen.c - -win32_glext_dll.obj: win32_glext.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_glext.c - -win32_init_dll.obj: win32_init.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_init.c - -win32_joystick_dll.obj: win32_joystick.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_joystick.c - -win32_thread_dll.obj: win32_thread.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_thread.c - -win32_time_dll.obj: win32_time.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_time.c - -win32_window_dll.obj: win32_window.c ..\\internal.h platform.h - $(CC) $(CFLAGS_DLL) /Fo$@ win32_window.c diff -Nru glfw-2.6/lib/win32/platform.h glfw-2.7.2/lib/win32/platform.h --- glfw-2.6/lib/win32/platform.h 2007-07-26 14:38:41.000000000 +0000 +++ glfw-2.7.2/lib/win32/platform.h 2011-04-23 14:22:27.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: platform.h -// Platform: Windows -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: Win32/WGL +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -35,6 +35,10 @@ // This is the Windows version of GLFW #define _GLFW_WIN32 +// We don't need all the fancy stuff +#define NOMINMAX +#define WIN32_LEAN_AND_MEAN +#define VC_EXTRALEAN // Include files #include @@ -129,38 +133,96 @@ #define XBUTTON2 2 #endif -// wglSwapIntervalEXT typedef (Win32 buffer-swap interval control) -typedef int (APIENTRY * WGLSWAPINTERVALEXT_T) (int); -// wglChoosePixelFormatARB typedef -typedef BOOL (WINAPI * WGLCHOOSEPIXELFORMATARB_T) (HDC, const int *, const FLOAT *, UINT, int *, UINT *); -// wglGetPixelFormatAttribivARB typedef -typedef BOOL (WINAPI * WGLGETPIXELFORMATATTRIBIVARB_T) (HDC, int, int, UINT, const int *, int *); -// wglGetExtensionStringEXT typedef -typedef const char *(APIENTRY * WGLGETEXTENSIONSSTRINGEXT_T)( void ); -// wglGetExtensionStringARB typedef -typedef const char *(APIENTRY * WGLGETEXTENSIONSSTRINGARB_T)( HDC ); - -#define WGL_DRAW_TO_WINDOW_ARB 0x2001 -#define WGL_SUPPORT_OPENGL_ARB 0x2010 -#define WGL_ACCELERATION_ARB 0x2003 -#define WGL_FULL_ACCELERATION_ARB 0x2027 -#define WGL_DOUBLE_BUFFER_ARB 0x2011 -#define WGL_STEREO_ARB 0x2012 -#define WGL_COLOR_BITS_ARB 0x2014 -#define WGL_RED_BITS_ARB 0x2015 -#define WGL_GREEN_BITS_ARB 0x2017 -#define WGL_BLUE_BITS_ARB 0x2019 -#define WGL_ALPHA_BITS_ARB 0x201B -#define WGL_ACCUM_BITS_ARB 0x201D -#define WGL_ACCUM_RED_BITS_ARB 0x201E -#define WGL_ACCUM_GREEN_BITS_ARB 0x201F -#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 -#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 -#define WGL_DEPTH_BITS_ARB 0x2022 -#define WGL_STENCIL_BITS_ARB 0x2023 -#define WGL_AUX_BUFFERS_ARB 0x2024 -#define WGL_SAMPLE_BUFFERS_ARB 0x2041 -#define WGL_SAMPLES_ARB 0x2042 +#ifndef WGL_EXT_swap_control + +/* Entry points */ +typedef int (APIENTRY * PFNWGLSWAPINTERVALEXTPROC) (int); + +#endif /*WGL_EXT_swap_control*/ + +#ifndef WGL_ARB_extensions_string + +/* Entry points */ +typedef const char *(APIENTRY * PFNWGLGETEXTENSIONSSTRINGARBPROC)( HDC ); + +#endif /*WGL_ARB_extensions_string*/ + +#ifndef WGL_EXT_extension_string + +/* Entry points */ +typedef const char *(APIENTRY * PFNWGLGETEXTENSIONSSTRINGEXTPROC)( void ); + +#endif /*WGL_EXT_extension_string*/ + +#ifndef WGL_ARB_pixel_format + +/* Entry points */ +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC, int, int, UINT, const int *, int *); + +/* Constants for wglGetPixelFormatAttribivARB */ +#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 +#define WGL_DRAW_TO_WINDOW_ARB 0x2001 +#define WGL_SUPPORT_OPENGL_ARB 0x2010 +#define WGL_ACCELERATION_ARB 0x2003 +#define WGL_DOUBLE_BUFFER_ARB 0x2011 +#define WGL_STEREO_ARB 0x2012 +#define WGL_PIXEL_TYPE_ARB 0x2013 +#define WGL_COLOR_BITS_ARB 0x2014 +#define WGL_RED_BITS_ARB 0x2015 +#define WGL_GREEN_BITS_ARB 0x2017 +#define WGL_BLUE_BITS_ARB 0x2019 +#define WGL_ALPHA_BITS_ARB 0x201B +#define WGL_ACCUM_BITS_ARB 0x201D +#define WGL_ACCUM_RED_BITS_ARB 0x201E +#define WGL_ACCUM_GREEN_BITS_ARB 0x201F +#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 +#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 +#define WGL_DEPTH_BITS_ARB 0x2022 +#define WGL_STENCIL_BITS_ARB 0x2023 +#define WGL_AUX_BUFFERS_ARB 0x2024 +#define WGL_SAMPLE_BUFFERS_ARB 0x2041 +#define WGL_SAMPLES_ARB 0x2042 + +/* Constants for WGL_ACCELERATION_ARB */ +#define WGL_NO_ACCELERATION_ARB 0x2025 +#define WGL_GENERIC_ACCELERATION_ARB 0x2026 +#define WGL_FULL_ACCELERATION_ARB 0x2027 + +/* Constants for WGL_PIXEL_TYPE_ARB */ +#define WGL_TYPE_RGBA_ARB 0x202B +#define WGL_TYPE_COLORINDEX_ARB 0x202C + +#endif /*WGL_ARB_pixel_format*/ + + +#ifndef WGL_ARB_create_context + +/* Entry points */ +typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC, HGLRC, const int *); + +/* Tokens for wglCreateContextAttribsARB attributes */ +#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 +#define WGL_CONTEXT_FLAGS_ARB 0x2094 +#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 + +/* Bits for WGL_CONTEXT_FLAGS_ARB */ +#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 +#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 + +/* Bits for WGL_CONTEXT_PROFILE_MASK_ARB */ +#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 +#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 + +#endif /*WGL_ARB_create_context*/ + + +#ifndef GL_VERSION_3_0 + +typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint); + +#endif /*GL_VERSION_3_0*/ //======================================================================== @@ -215,10 +277,16 @@ //======================================================================== -// Global variables (GLFW internals) +// GLFW platform specific types //======================================================================== //------------------------------------------------------------------------ +// Pointer length integer +//------------------------------------------------------------------------ +typedef INT_PTR GLFWintptr; + + +//------------------------------------------------------------------------ // Window structure //------------------------------------------------------------------------ typedef struct _GLFWwin_struct _GLFWwin; @@ -228,73 +296,83 @@ // ========= PLATFORM INDEPENDENT MANDATORY PART ========================= // User callback functions - GLFWwindowsizefun WindowSizeCallback; - GLFWwindowclosefun WindowCloseCallback; - GLFWwindowrefreshfun WindowRefreshCallback; - GLFWmousebuttonfun MouseButtonCallback; - GLFWmouseposfun MousePosCallback; - GLFWmousewheelfun MouseWheelCallback; - GLFWkeyfun KeyCallback; - GLFWcharfun CharCallback; + GLFWwindowsizefun windowSizeCallback; + GLFWwindowclosefun windowCloseCallback; + GLFWwindowrefreshfun windowRefreshCallback; + GLFWmousebuttonfun mouseButtonCallback; + GLFWmouseposfun mousePosCallback; + GLFWmousewheelfun mouseWheelCallback; + GLFWkeyfun keyCallback; + GLFWcharfun charCallback; // User selected window settings - int Fullscreen; // Fullscreen flag - int MouseLock; // Mouse-lock flag - int AutoPollEvents; // Auto polling flag - int SysKeysDisabled; // System keys disabled flag - int WindowNoResize; // Resize- and maximize gadgets disabled flag + int fullscreen; // Fullscreen flag + int mouseLock; // Mouse-lock flag + int autoPollEvents; // Auto polling flag + int sysKeysDisabled; // System keys disabled flag + int windowNoResize; // Resize- and maximize gadgets disabled flag + int refreshRate; // Vertical monitor refresh rate // Window status & parameters - int Opened; // Flag telling if window is opened or not - int Active; // Application active flag - int Iconified; // Window iconified flag - int Width, Height; // Window width and heigth - int Accelerated; // GL_TRUE if window is HW accelerated - int RedBits; - int GreenBits; - int BlueBits; - int AlphaBits; - int DepthBits; - int StencilBits; - int AccumRedBits; - int AccumGreenBits; - int AccumBlueBits; - int AccumAlphaBits; - int AuxBuffers; - int Stereo; - int RefreshRate; // Vertical monitor refresh rate - int Samples; - - // Extensions & OpenGL version - int Has_GL_SGIS_generate_mipmap; - int Has_GL_ARB_texture_non_power_of_two; - int GLVerMajor,GLVerMinor; + int opened; // Flag telling if window is opened or not + int active; // Application active flag + int iconified; // Window iconified flag + int width, height; // Window width and heigth + int accelerated; // GL_TRUE if window is HW accelerated + + // Framebuffer attributes + int redBits; + int greenBits; + int blueBits; + int alphaBits; + int depthBits; + int stencilBits; + int accumRedBits; + int accumGreenBits; + int accumBlueBits; + int accumAlphaBits; + int auxBuffers; + int stereo; + int samples; + + // OpenGL extensions and context attributes + int has_GL_SGIS_generate_mipmap; + int has_GL_ARB_texture_non_power_of_two; + int glMajor, glMinor, glRevision; + int glForward, glDebug, glProfile; + + PFNGLGETSTRINGIPROC GetStringi; // ========= PLATFORM SPECIFIC PART ====================================== // Platform specific window resources HDC DC; // Private GDI device context - HGLRC RC; // Permanent rendering context - HWND Wnd; // Window handle - ATOM ClassAtom; // Window class atom - int ModeID; // Mode ID for fullscreen mode - HHOOK KeyboardHook; // Keyboard hook handle + HGLRC context; // Permanent rendering context + HWND window; // Window handle + ATOM classAtom; // Window class atom + int modeID; // Mode ID for fullscreen mode + HHOOK keyboardHook; // Keyboard hook handle DWORD dwStyle; // Window styles used for window creation DWORD dwExStyle; // --"-- // Platform specific extensions (context specific) - WGLSWAPINTERVALEXT_T SwapInterval; - WGLCHOOSEPIXELFORMATARB_T ChoosePixelFormat; - WGLGETPIXELFORMATATTRIBIVARB_T GetPixelFormatAttribiv; - WGLGETEXTENSIONSSTRINGEXT_T GetExtensionsStringEXT; - WGLGETEXTENSIONSSTRINGARB_T GetExtensionsStringARB; + PFNWGLSWAPINTERVALEXTPROC SwapIntervalEXT; + PFNWGLGETPIXELFORMATATTRIBIVARBPROC GetPixelFormatAttribivARB; + PFNWGLGETEXTENSIONSSTRINGEXTPROC GetExtensionsStringEXT; + PFNWGLGETEXTENSIONSSTRINGARBPROC GetExtensionsStringARB; + PFNWGLCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB; + GLboolean has_WGL_EXT_swap_control; + GLboolean has_WGL_ARB_multisample; + GLboolean has_WGL_ARB_pixel_format; + GLboolean has_WGL_ARB_create_context; + GLboolean has_WGL_ARB_create_context_profile; // Various platform specific internal variables - int OldMouseLock; // Old mouse-lock flag (used for remembering + int oldMouseLock; // Old mouse-lock flag (used for remembering // mouse-lock state when iconifying) - int OldMouseLockValid; - int DesiredRefreshRate; // Desired vertical monitor refresh rate + int oldMouseLockValid; + int desiredRefreshRate; // Desired vertical monitor refresh rate }; @@ -336,9 +414,12 @@ //------------------------------------------------------------------------ GLFWGLOBAL struct { + // Window opening hints + _GLFWhints hints; + // ========= PLATFORM SPECIFIC PART ====================================== - HINSTANCE Instance; // Instance of the application + HINSTANCE instance; // Instance of the application // Timer data struct { @@ -350,9 +431,9 @@ // System information struct { - int WinVer; - int HasUnicode; - DWORD ForegroundLockTimeout; + int winVer; + int hasUnicode; + DWORD foregroundLockTimeout; } Sys; #if !defined(_GLFW_NO_DLOAD_WINMM) || !defined(_GLFW_NO_DLOAD_GDI32) diff -Nru glfw-2.6/lib/win32/win32_dllmain.c glfw-2.7.2/lib/win32/win32_dllmain.c --- glfw-2.6/lib/win32/win32_dllmain.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/win32/win32_dllmain.c 2010-08-08 15:37:03.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: win32_dllmain.c -// Platform: Windows -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: Win32/WGL +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -34,27 +34,16 @@ #if defined(GLFW_BUILD_DLL) //======================================================================== -// DllMain() +// GLFW DLL entry point //======================================================================== -int WINAPI DllMain( HINSTANCE hinst, unsigned long reason, void *x ) +BOOL WINAPI DllMain( HINSTANCE instance, DWORD reason, LPVOID reserved ) { - // NOTE: Some compilers complains about hinst and x never being used - + // NOTE: Some compilers complains about instance and x never being used - // never mind that (we don't want to use them)! - switch( reason ) - { - case DLL_PROCESS_ATTACH: - // Initializations - //glfwInit(); // We don't want to do that now! - break; - case DLL_PROCESS_DETACH: - // Do some cleanup - glfwTerminate(); - break; - }; - - return 1; + return TRUE; } #endif // GLFW_BUILD_DLL + diff -Nru glfw-2.6/lib/win32/win32_enable.c glfw-2.7.2/lib/win32/win32_enable.c --- glfw-2.6/lib/win32/win32_enable.c 2007-07-01 13:34:28.000000000 +0000 +++ glfw-2.7.2/lib/win32/win32_enable.c 2010-08-08 15:37:03.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: win32_enable.c -// Platform: Windows -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: Win32/WGL +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -36,23 +36,23 @@ //************************************************************************ //======================================================================== -// _glfwLLKeyboardProc() - Low level keyboard callback function (used to -// disable system keys under Windows NT). +// Low level keyboard hook (system callback) function +// Used to disable system keys under Windows NT //======================================================================== -LRESULT CALLBACK _glfwLLKeyboardProc( int nCode, WPARAM wParam, - LPARAM lParam ) +static LRESULT CALLBACK keyboardHook( int nCode, WPARAM wParam, LPARAM lParam ) { - BOOL syskeys = 0; + BOOL syskeys = FALSE; PKBDLLHOOKSTRUCT p; // We are only looking for keyboard events - interpret lParam as a // pointer to a KBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam; - // If nCode == HC_ACTION, then we have a keyboard event if( nCode == HC_ACTION ) { + // We have a keyboard event + switch( wParam ) { case WM_KEYDOWN: @@ -83,9 +83,9 @@ if( syskeys ) { // Pass the key event to our window message loop - if( _glfwWin.Opened ) + if( _glfwWin.opened ) { - PostMessage( _glfwWin.Wnd, (UINT) wParam, p->vkCode, 0 ); + PostMessage( _glfwWin.window, (UINT) wParam, p->vkCode, 0 ); } // We've taken care of it - don't let the system know about this @@ -95,8 +95,7 @@ else { // It's a harmless key press, let the system deal with it - return CallNextHookEx( _glfwWin.KeyboardHook, nCode, wParam, - lParam ); + return CallNextHookEx( _glfwWin.keyboardHook, nCode, wParam, lParam ); } } @@ -107,49 +106,50 @@ //************************************************************************ //======================================================================== -// _glfwPlatformEnableSystemKeys() - Enable system keys -// _glfwPlatformDisableSystemKeys() - Disable system keys +// Enable system keys //======================================================================== void _glfwPlatformEnableSystemKeys( void ) { - BOOL bOld; + BOOL dummy; // Use different methods depending on operating system version - if( _glfwLibrary.Sys.WinVer >= _GLFW_WIN_NT4 ) + if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 ) { - if( _glfwWin.KeyboardHook != NULL ) + if( _glfwWin.keyboardHook != NULL ) { - UnhookWindowsHookEx( _glfwWin.KeyboardHook ); - _glfwWin.KeyboardHook = NULL; + UnhookWindowsHookEx( _glfwWin.keyboardHook ); + _glfwWin.keyboardHook = NULL; } } else { - (void) SystemParametersInfo( SPI_SETSCREENSAVERRUNNING, FALSE, - &bOld, 0 ); + (void) SystemParametersInfo( SPI_SETSCREENSAVERRUNNING, FALSE, &dummy, 0 ); } } +//======================================================================== +// Disable system keys +//======================================================================== + void _glfwPlatformDisableSystemKeys( void ) { - BOOL bOld; + BOOL dummy; // Use different methods depending on operating system version - if( _glfwLibrary.Sys.WinVer >= _GLFW_WIN_NT4 ) + if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 ) { // Under Windows NT, install a low level keyboard hook - _glfwWin.KeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL, - _glfwLLKeyboardProc, - _glfwLibrary.Instance, - 0 ); + _glfwWin.keyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL, + keyboardHook, + _glfwLibrary.instance, + 0 ); } else { // Under Windows 95/98/ME, fool Windows that a screensaver // is running => prevents ALT+TAB, CTRL+ESC and CTRL+ALT+DEL - (void) SystemParametersInfo( SPI_SETSCREENSAVERRUNNING, TRUE, - &bOld, 0 ); + (void) SystemParametersInfo( SPI_SETSCREENSAVERRUNNING, TRUE, &dummy, 0 ); } } diff -Nru glfw-2.6/lib/win32/win32_fullscreen.c glfw-2.7.2/lib/win32/win32_fullscreen.c --- glfw-2.6/lib/win32/win32_fullscreen.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/win32/win32_fullscreen.c 2011-06-20 12:36:50.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: win32_fullscreen.c -// Platform: Windows -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: Win32/WGL +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -36,17 +36,21 @@ //************************************************************************ //======================================================================== -// _glfwBPP2RGB() - Convert BPP to RGB bits (based on "best guess") +// Convert BPP to RGB bits based on "best guess" //======================================================================== -static void _glfwBPP2RGB( int bpp, int *r, int *g, int *b ) +static void bpp2rgb( int bpp, int *r, int *g, int *b ) { int delta; - // Special case: BPP = 32 - if( bpp == 32 ) bpp = 24; + // We assume that by 32 they really meant 24 + if( bpp == 32 ) + { + bpp = 24; + } // Convert "bits per pixel" to red, green & blue sizes + *r = *g = *b = bpp / 3; delta = bpp - (*r * 3); if( delta >= 1 ) @@ -61,7 +65,7 @@ //======================================================================== -// _glfwGetClosestVideoModeBPP() +// Return closest video mode by dimensions, refresh rate and bits per pixel //======================================================================== int _glfwGetClosestVideoModeBPP( int *w, int *h, int *bpp, int *refresh ) @@ -128,13 +132,14 @@ //======================================================================== -// _glfwGetClosestVideoMode() +// Return closest video mode by dimensions, refresh rate and channel sizes //======================================================================== -int _glfwGetClosestVideoMode( int *w, int *h, int *r, int *g, int *b, - int *refresh ) +static int getClosestVideoMode( int *w, int *h, + int *r, int *g, int *b, + int *refresh ) { - int bpp, bestmode; + int bpp, bestmode; // Colorbits = sum of red/green/blue bits bpp = *r + *g + *b; @@ -149,7 +154,7 @@ bestmode = _glfwGetClosestVideoModeBPP( w, h, &bpp, refresh ); // Convert "bits per pixel" to red, green & blue sizes - _glfwBPP2RGB( bpp, r, g, b ); + bpp2rgb( bpp, r, g, b ); return bestmode; } @@ -162,7 +167,7 @@ void _glfwSetVideoModeMODE( int mode ) { DEVMODE dm; - int success; + int success; // Get the parameters for the best matching display mode dm.dmSize = sizeof( DEVMODE ); @@ -172,10 +177,10 @@ dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL; // Do we have a prefered refresh rate? - if( _glfwWin.DesiredRefreshRate > 0 ) + if( _glfwWin.desiredRefreshRate > 0 ) { dm.dmFields = dm.dmFields | DM_DISPLAYFREQUENCY; - dm.dmDisplayFrequency = _glfwWin.DesiredRefreshRate; + dm.dmDisplayFrequency = _glfwWin.desiredRefreshRate; } // Change display setting @@ -186,22 +191,22 @@ // settings (we'll use the desktop resolution for fullscreen mode) if( success == DISP_CHANGE_SUCCESSFUL ) { - _glfwWin.ModeID = mode; + _glfwWin.modeID = mode; } else { - _glfwWin.ModeID = ENUM_REGISTRY_SETTINGS; + _glfwWin.modeID = ENUM_REGISTRY_SETTINGS; EnumDisplaySettings( NULL, ENUM_REGISTRY_SETTINGS, &dm ); } // Set the window size to that of the display mode - _glfwWin.Width = dm.dmPelsWidth; - _glfwWin.Height = dm.dmPelsHeight; + _glfwWin.width = dm.dmPelsWidth; + _glfwWin.height = dm.dmPelsHeight; } //======================================================================== -// _glfwSetVideoMode() - Change the current video mode +// Change the current video mode //======================================================================== void _glfwSetVideoMode( int *w, int *h, int r, int g, int b, int refresh ) @@ -209,7 +214,7 @@ int bestmode; // Find a best match mode - bestmode = _glfwGetClosestVideoMode( w, h, &r, &g, &b, &refresh ); + bestmode = getClosestVideoMode( w, h, &r, &g, &b, &refresh ); // Change mode _glfwSetVideoModeMODE( bestmode ); @@ -221,7 +226,7 @@ //************************************************************************ //======================================================================== -// _glfwPlatformGetVideoModes() - Get a list of available video modes +// Get a list of available video modes //======================================================================== int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount ) @@ -243,7 +248,7 @@ if( success && dm.dmBitsPerPel >= 15 ) { // Convert to RGB, and back to bpp ("mask out" alpha bits etc) - _glfwBPP2RGB( dm.dmBitsPerPel, &r, &g, &b ); + bpp2rgb( dm.dmBitsPerPel, &r, &g, &b ); bpp = r + g + b; // Mode "code" for this mode @@ -296,7 +301,7 @@ //======================================================================== -// _glfwPlatformGetDesktopMode() - Get the desktop video mode +// Get the desktop video mode //======================================================================== void _glfwPlatformGetDesktopMode( GLFWvidmode *mode ) @@ -310,8 +315,6 @@ // Return desktop mode parameters mode->Width = dm.dmPelsWidth; mode->Height = dm.dmPelsHeight; - _glfwBPP2RGB( dm.dmBitsPerPel, &mode->RedBits, &mode->GreenBits, - &mode->BlueBits ); + bpp2rgb( dm.dmBitsPerPel, &mode->RedBits, &mode->GreenBits, &mode->BlueBits ); } - diff -Nru glfw-2.6/lib/win32/win32_glext.c glfw-2.7.2/lib/win32/win32_glext.c --- glfw-2.6/lib/win32/win32_glext.c 2007-07-26 14:38:41.000000000 +0000 +++ glfw-2.7.2/lib/win32/win32_glext.c 2010-08-08 15:37:03.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: win32_glext.c -// Platform: Windows -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: Win32/WGL +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -36,15 +36,13 @@ //************************************************************************ //======================================================================== -// Check if an OpenGL extension is available at runtime (Windows version checks -// for WGL extensions) +// Check if the current context supports the specified WGL extension //======================================================================== int _glfwPlatformExtensionSupported( const char *extension ) { const GLubyte *extensions; - // Try wglGetExtensionsStringEXT if( _glfwWin.GetExtensionsStringEXT != NULL ) { extensions = (GLubyte *) _glfwWin.GetExtensionsStringEXT(); @@ -57,7 +55,6 @@ } } - // Try wglGetExtensionsStringARB if( _glfwWin.GetExtensionsStringARB != NULL ) { extensions = (GLubyte *) _glfwWin.GetExtensionsStringARB( _glfwWin.DC ); @@ -78,7 +75,7 @@ // Get the function pointer to an OpenGL function //======================================================================== -void * _glfwPlatformGetProcAddress( const char *procname ) +void *_glfwPlatformGetProcAddress( const char *procname ) { return (void *) wglGetProcAddress( procname ); } diff -Nru glfw-2.6/lib/win32/win32_init.c glfw-2.7.2/lib/win32/win32_init.c --- glfw-2.6/lib/win32/win32_init.c 2007-07-01 18:37:38.000000000 +0000 +++ glfw-2.7.2/lib/win32/win32_init.c 2011-06-24 12:04:54.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: win32_init.c -// Platform: Windows -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: Win32/WGL +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -42,7 +42,7 @@ //************************************************************************ //======================================================================== -// _glfwInitLibraries() - Load necessary libraries (DLLs) +// Load necessary libraries (DLLs) //======================================================================== static int _glfwInitLibraries( void ) @@ -113,7 +113,7 @@ //======================================================================== -// _glfwFreeLibraries() - Unload used libraries (DLLs) +// Unload used libraries (DLLs) //======================================================================== static void _glfwFreeLibraries( void ) @@ -139,7 +139,7 @@ //======================================================================== -// _glfwInitThreads() - Initialize GLFW thread package +// Initialize GLFW thread package //======================================================================== static void _glfwInitThreads( void ) @@ -161,7 +161,7 @@ //======================================================================== -// _glfwTerminateThreads() - Terminate GLFW thread package +// Terminate GLFW thread package //======================================================================== static void _glfwTerminateThreads( void ) @@ -202,7 +202,7 @@ //======================================================================== -// _glfwTerminate_atexit() - Terminate GLFW when exiting application +// Terminate GLFW when exiting application //======================================================================== void _glfwTerminate_atexit( void ) @@ -217,7 +217,7 @@ //************************************************************************ //======================================================================== -// _glfwPlatformInit() - Initialize various GLFW state +// Initialize various GLFW state //======================================================================== int _glfwPlatformInit( void ) @@ -228,67 +228,67 @@ // with the FOREGROUNDLOCKTIMEOUT system setting (we do this as early // as possible in the hope of still being the foreground process) SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT, 0, - &_glfwLibrary.Sys.ForegroundLockTimeout, 0 ); + &_glfwLibrary.Sys.foregroundLockTimeout, 0 ); SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, (LPVOID)0, SPIF_SENDCHANGE ); // Check which OS version we are running osi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO ); GetVersionEx( &osi ); - _glfwLibrary.Sys.WinVer = _GLFW_WIN_UNKNOWN; + _glfwLibrary.Sys.winVer = _GLFW_WIN_UNKNOWN; if( osi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) { if( osi.dwMajorVersion == 4 && osi.dwMinorVersion < 10 ) { - _glfwLibrary.Sys.WinVer = _GLFW_WIN_95; + _glfwLibrary.Sys.winVer = _GLFW_WIN_95; } else if( osi.dwMajorVersion == 4 && osi.dwMinorVersion < 90 ) { - _glfwLibrary.Sys.WinVer = _GLFW_WIN_98; + _glfwLibrary.Sys.winVer = _GLFW_WIN_98; } else if( osi.dwMajorVersion == 4 && osi.dwMinorVersion == 90 ) { - _glfwLibrary.Sys.WinVer = _GLFW_WIN_ME; + _glfwLibrary.Sys.winVer = _GLFW_WIN_ME; } else if( osi.dwMajorVersion >= 4 ) { - _glfwLibrary.Sys.WinVer = _GLFW_WIN_UNKNOWN_9x; + _glfwLibrary.Sys.winVer = _GLFW_WIN_UNKNOWN_9x; } } else if( osi.dwPlatformId == VER_PLATFORM_WIN32_NT ) { if( osi.dwMajorVersion == 4 && osi.dwMinorVersion == 0 ) { - _glfwLibrary.Sys.WinVer = _GLFW_WIN_NT4; + _glfwLibrary.Sys.winVer = _GLFW_WIN_NT4; } else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 0 ) { - _glfwLibrary.Sys.WinVer = _GLFW_WIN_2K; + _glfwLibrary.Sys.winVer = _GLFW_WIN_2K; } else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 1 ) { - _glfwLibrary.Sys.WinVer = _GLFW_WIN_XP; + _glfwLibrary.Sys.winVer = _GLFW_WIN_XP; } else if( osi.dwMajorVersion == 5 && osi.dwMinorVersion == 2 ) { - _glfwLibrary.Sys.WinVer = _GLFW_WIN_NET_SERVER; + _glfwLibrary.Sys.winVer = _GLFW_WIN_NET_SERVER; } else if( osi.dwMajorVersion >= 5 ) { - _glfwLibrary.Sys.WinVer = _GLFW_WIN_UNKNOWN_NT; + _glfwLibrary.Sys.winVer = _GLFW_WIN_UNKNOWN_NT; } } // Do we have Unicode support? - if( _glfwLibrary.Sys.WinVer >= _GLFW_WIN_NT4 ) + if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 ) { // Windows NT/2000/XP/.NET has Unicode support - _glfwLibrary.Sys.HasUnicode = GL_TRUE; + _glfwLibrary.Sys.hasUnicode = GL_TRUE; } else { // Windows 9x/ME does not have Unicode support - _glfwLibrary.Sys.HasUnicode = GL_FALSE; + _glfwLibrary.Sys.hasUnicode = GL_FALSE; } // Load libraries (DLLs) @@ -304,10 +304,10 @@ #endif // Retrieve GLFW instance handle - _glfwLibrary.Instance = GetModuleHandle( NULL ); + _glfwLibrary.instance = GetModuleHandle( NULL ); // System keys are not disabled - _glfwWin.KeyboardHook = NULL; + _glfwWin.keyboardHook = NULL; // Initialise thread package _glfwInitThreads(); @@ -323,7 +323,7 @@ //======================================================================== -// _glfwPlatformTerminate() - Close window and kill all threads +// Close window and kill all threads //======================================================================== int _glfwPlatformTerminate( void ) @@ -348,7 +348,7 @@ // Restore FOREGROUNDLOCKTIMEOUT system setting SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT, 0, - (LPVOID)_glfwLibrary.Sys.ForegroundLockTimeout, + (LPVOID) _glfwLibrary.Sys.foregroundLockTimeout, SPIF_SENDCHANGE ); return GL_TRUE; diff -Nru glfw-2.6/lib/win32/win32_joystick.c glfw-2.7.2/lib/win32/win32_joystick.c --- glfw-2.6/lib/win32/win32_joystick.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/win32/win32_joystick.c 2011-06-20 12:36:50.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: win32_joystick.c -// Platform: Windows -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: Win32/WGL +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -36,8 +36,7 @@ //************************************************************************ //======================================================================== -// _glfwJoystickPresent() - Return GL_TRUE if joystick is present, -// else return GL_FALSE. +// Return GL_TRUE if joystick is present, else return GL_FALSE. //======================================================================== static int _glfwJoystickPresent( int joy ) @@ -46,7 +45,7 @@ // Windows NT 4.0 MMSYSTEM only supports 2 sticks (other Windows // versions support 16 sticks) - if( _glfwLibrary.Sys.WinVer == _GLFW_WIN_NT4 && joy > GLFW_JOYSTICK_2 ) + if( _glfwLibrary.Sys.winVer == _GLFW_WIN_NT4 && joy > GLFW_JOYSTICK_2 ) { return GL_FALSE; } @@ -68,7 +67,7 @@ //======================================================================== -// _glfwCalcJoystickPos() - Calculate joystick position +// Calculate joystick position //======================================================================== static float _glfwCalcJoystickPos( DWORD pos, DWORD min, DWORD max ) @@ -86,7 +85,7 @@ //************************************************************************ //======================================================================== -// _glfwPlatformGetJoystickParam() - Determine joystick capabilities +// Determine joystick capabilities //======================================================================== int _glfwPlatformGetJoystickParam( int joy, int param ) @@ -129,7 +128,7 @@ //======================================================================== -// _glfwPlatformGetJoystickPos() - Get joystick axis positions +// Get joystick axis positions //======================================================================== int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes ) @@ -194,7 +193,7 @@ //======================================================================== -// _glfwPlatformGetJoystickButtons() - Get joystick button states +// Get joystick button states //======================================================================== int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, diff -Nru glfw-2.6/lib/win32/win32_thread.c glfw-2.7.2/lib/win32/win32_thread.c --- glfw-2.6/lib/win32/win32_thread.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/win32/win32_thread.c 2011-06-20 12:36:50.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: win32_thread.c -// Platform: Windows -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: Win32/WGL +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -60,8 +60,7 @@ //************************************************************************ //======================================================================== -// _glfwNewThread() - This is simply a "wrapper" for calling the user -// thread function. +// This is simply a "wrapper" for calling the user thread function. //======================================================================== DWORD WINAPI _glfwNewThread( LPVOID lpParam ) @@ -98,7 +97,7 @@ //************************************************************************ //======================================================================== -// _glfwPlatformCreateThread() - Create a new thread +// Create a new thread //======================================================================== GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg ) @@ -168,9 +167,8 @@ //======================================================================== -// _glfwPlatformDestroyThread() - Kill a thread. NOTE: THIS IS A VERY -// DANGEROUS OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME -// SITUATIONS! +// Kill a thread. NOTE: THIS IS A VERY DANGEROUS OPERATION, AND SHOULD NOT +// BE USED EXCEPT IN EXTREME SITUATIONS! //======================================================================== void _glfwPlatformDestroyThread( GLFWthread ID ) @@ -204,7 +202,7 @@ //======================================================================== -// _glfwPlatformWaitThread() - Wait for a thread to die +// Wait for a thread to die //======================================================================== int _glfwPlatformWaitThread( GLFWthread ID, int waitmode ) @@ -256,8 +254,7 @@ //======================================================================== -// _glfwPlatformGetThreadID() - Return the thread ID for the current -// thread +// Return the thread ID for the current thread //======================================================================== GLFWthread _glfwPlatformGetThreadID( void ) @@ -292,7 +289,7 @@ //======================================================================== -// _glfwPlatformCreateMutex() - Create a mutual exclusion object +// Create a mutual exclusion object //======================================================================== GLFWmutex _glfwPlatformCreateMutex( void ) @@ -315,7 +312,7 @@ //======================================================================== -// glfwDestroyMutex() - Destroy a mutual exclusion object +// Destroy a mutual exclusion object //======================================================================== void _glfwPlatformDestroyMutex( GLFWmutex mutex ) @@ -327,7 +324,7 @@ //======================================================================== -// _glfwPlatformLockMutex() - Request access to a mutex +// Request access to a mutex //======================================================================== void _glfwPlatformLockMutex( GLFWmutex mutex ) @@ -338,7 +335,7 @@ //======================================================================== -// _glfwPlatformUnlockMutex() - Release a mutex +// Release a mutex //======================================================================== void _glfwPlatformUnlockMutex( GLFWmutex mutex ) @@ -349,7 +346,7 @@ //======================================================================== -// _glfwPlatformCreateCond() - Create a new condition variable object +// Create a new condition variable object //======================================================================== GLFWcond _glfwPlatformCreateCond( void ) @@ -377,7 +374,7 @@ //======================================================================== -// _glfwPlatformDestroyCond() - Destroy a condition variable object +// Destroy a condition variable object //======================================================================== void _glfwPlatformDestroyCond( GLFWcond cond ) @@ -395,11 +392,10 @@ //======================================================================== -// _glfwPlatformWaitCond() - Wait for a condition to be raised +// Wait for a condition to be raised //======================================================================== -void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, - double timeout ) +void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, double timeout ) { _GLFWcond *cv = (_GLFWcond *) cond; int result, last_waiter; @@ -453,7 +449,7 @@ //======================================================================== -// _glfwPlatformSignalCond() - Signal a condition to one waiting thread +// Signal a condition to one waiting thread //======================================================================== void _glfwPlatformSignalCond( GLFWcond cond ) @@ -474,8 +470,7 @@ //======================================================================== -// _glfwPlatformBroadcastCond() - Broadcast a condition to all waiting -// threads +// Broadcast a condition to all waiting threads //======================================================================== void _glfwPlatformBroadcastCond( GLFWcond cond ) @@ -496,8 +491,7 @@ //======================================================================== -// _glfwPlatformGetNumberOfProcessors() - Return the number of processors -// in the system. +// Return the number of processors in the system. //======================================================================== int _glfwPlatformGetNumberOfProcessors( void ) @@ -509,3 +503,4 @@ return (int) si.dwNumberOfProcessors; } + diff -Nru glfw-2.6/lib/win32/win32_time.c glfw-2.7.2/lib/win32/win32_time.c --- glfw-2.6/lib/win32/win32_time.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/win32/win32_time.c 2011-06-20 12:36:50.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: win32_time.c -// Platform: Windows -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: Win32/WGL +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -36,7 +36,7 @@ //************************************************************************ //======================================================================== -// _glfwInitTimer() - Initialise timer +// Initialise timer //======================================================================== void _glfwInitTimer( void ) diff -Nru glfw-2.6/lib/win32/win32_window.c glfw-2.7.2/lib/win32/win32_window.c --- glfw-2.6/lib/win32/win32_window.c 2007-09-01 21:07:10.000000000 +0000 +++ glfw-2.7.2/lib/win32/win32_window.c 2011-06-22 13:44:23.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: win32_window.c -// Platform: Windows -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: Win32/WGL +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -36,14 +36,16 @@ //**** GLFW internal functions **** //************************************************************************ -#define _GLFW_WNDCLASSNAME "GLFW26" +// We use versioned window class names in order not to cause conflicts +// between applications using different versions of GLFW +#define _GLFW_WNDCLASSNAME "GLFW27" //======================================================================== // Enable/disable minimize/restore animations //======================================================================== -static int _glfwMinMaxAnimations( int enable ) +static int setMinMaxAnimations( int enable ) { ANIMATIONINFO AI; int old_enable; @@ -66,13 +68,12 @@ //======================================================================== -// Function for bringing a window into focus and placing it on top of the -// window z stack. Due to some nastiness with how Win98/ME/2k/XP handles -// SetForegroundWindow, we have to go through some really bizarre measures to -// achieve this (thanks again, MS, for making life so much easier)! +// Focus the window and bring it to the top of the stack +// Due to some nastiness with how Win98/ME/2k/XP handles SetForegroundWindow, +// we have to go through some really bizarre measures to achieve this //======================================================================== -static void _glfwSetForegroundWindow( HWND hWnd ) +static void setForegroundWindow( HWND hWnd ) { int try_count = 0; int old_animate; @@ -98,7 +99,7 @@ // zoom animations to make it look a bit better at least). // Turn off minimize/restore animations - old_animate = _glfwMinMaxAnimations( 0 ); + old_animate = setMinMaxAnimations( 0 ); // We try this a few times, just to be on the safe side of things... do @@ -119,7 +120,7 @@ while( hWnd != GetForegroundWindow() && try_count <= 3 ); // Restore the system minimize/restore animation setting - (void) _glfwMinMaxAnimations( old_animate ); + (void) setMinMaxAnimations( old_animate ); // Try to modify the system settings (since this is now hopefully the // foreground process, we are probably allowed to do this) @@ -129,189 +130,303 @@ //======================================================================== -// Sets the device context pixel format using a PFD +// Returns the specified attribute of the specified pixel format +// NOTE: Do not call this unless we have found WGL_ARB_pixel_format //======================================================================== -static int _glfwSetPixelFormatPFD( int redbits, int greenbits, int bluebits, - int alphabits, int depthbits, int stencilbits, - int mode, _GLFWhints* hints ) +static int getPixelFormatAttrib(int pixelFormat, int attrib) { - int PixelFormat; + int value = 0; + + if( !_glfwWin.GetPixelFormatAttribivARB( _glfwWin.DC, pixelFormat, 0, 1, &attrib, &value) ) + { + // NOTE: We should probably handle this error somehow + return 0; + } + + return value; +} + + +//======================================================================== +// Return a list of available and usable framebuffer configs +//======================================================================== + +static _GLFWfbconfig *getFBConfigs( unsigned int *found ) +{ + _GLFWfbconfig *result; PIXELFORMATDESCRIPTOR pfd; + int i, count; - // Set required pixel format - pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); - pfd.nVersion = 1; - pfd.dwFlags = PFD_DRAW_TO_WINDOW | // Draw to window - PFD_SUPPORT_OPENGL | // Support OpenGL - PFD_DOUBLEBUFFER; // Double buffered window - pfd.iPixelType = PFD_TYPE_RGBA; // Request an RGBA format - pfd.cColorBits = (BYTE) (redbits + - greenbits + - bluebits); // Color bits (ex. alpha) - pfd.cRedBits = (BYTE) redbits; // Red bits - pfd.cRedShift = 0; // Red shift ignored - pfd.cGreenBits = (BYTE) greenbits; // Green bits - pfd.cGreenShift = 0; // Green shift ignored - pfd.cBlueBits = (BYTE) bluebits; // Blue bits - pfd.cBlueShift = 0; // Blue shift ignored - pfd.cAlphaBits = (BYTE) alphabits; // Alpha bits - pfd.cAlphaShift = 0; // Alpha shift ignored - pfd.cAccumBits = (BYTE) (hints->AccumRedBits + - hints->AccumGreenBits + - hints->AccumBlueBits + - hints->AccumAlphaBits); // Accum. bits - pfd.cAccumRedBits = (BYTE) hints->AccumRedBits; // Accum. red bits - pfd.cAccumGreenBits = (BYTE) hints->AccumGreenBits; // Accum. green bits - pfd.cAccumBlueBits = (BYTE) hints->AccumBlueBits; // Accum. blue bits - pfd.cAccumAlphaBits = (BYTE) hints->AccumAlphaBits; // Accum. alpha bits - pfd.cDepthBits = (BYTE) depthbits; // Depth buffer bits - pfd.cStencilBits = (BYTE) stencilbits; // Stencil buffer bits - pfd.cAuxBuffers = (BYTE) hints->AuxBuffers; // No. of aux buffers - pfd.iLayerType = PFD_MAIN_PLANE; // Drawing layer: main - pfd.bReserved = 0; // (reserved) - pfd.dwLayerMask = 0; // Ignored - pfd.dwVisibleMask = 0; // " - pfd.dwDamageMask = 0; // " - - if( depthbits <= 0 ) - { - // We do not need a depth buffer - pfd.dwFlags |= PFD_DEPTH_DONTCARE; - } - - if( hints->Stereo ) - { - // Request a stereo mode - pfd.dwFlags |= PFD_STEREO; - } - - // Find a matching pixel format - PixelFormat = _glfw_ChoosePixelFormat( _glfwWin.DC, &pfd ); - if( !PixelFormat ) + *found = 0; + + if( _glfwWin.has_WGL_ARB_pixel_format ) { - return GL_FALSE; + count = getPixelFormatAttrib( 1, WGL_NUMBER_PIXEL_FORMATS_ARB ); + } + else + { + count = _glfw_DescribePixelFormat( _glfwWin.DC, 1, sizeof( PIXELFORMATDESCRIPTOR ), NULL ); } - // Get actual pixel format description - if( !_glfw_DescribePixelFormat( _glfwWin.DC, PixelFormat, sizeof(pfd), &pfd ) ) + if( !count ) { - return GL_FALSE; + fprintf( stderr, "No Win32 pixel formats available\n" ); + return NULL; } - // "stereo" is a strict requirement - if( hints->Stereo && !(pfd.dwFlags & PFD_STEREO) ) + result = (_GLFWfbconfig*) malloc( sizeof( _GLFWfbconfig ) * count ); + if( !result ) { - return GL_FALSE; + fprintf(stderr, "Out of memory"); + return NULL; } - // Set the pixel-format - if( !_glfw_SetPixelFormat( _glfwWin.DC, PixelFormat, &pfd ) ) + for( i = 1; i <= count; i++ ) { - return GL_FALSE; + if( _glfwWin.has_WGL_ARB_pixel_format ) + { + // Get pixel format attributes through WGL_ARB_pixel_format + + if( !getPixelFormatAttrib( i, WGL_SUPPORT_OPENGL_ARB ) || + !getPixelFormatAttrib( i, WGL_DRAW_TO_WINDOW_ARB ) || + !getPixelFormatAttrib( i, WGL_DOUBLE_BUFFER_ARB ) ) + { + // Only consider doublebuffered OpenGL pixel formats for windows + continue; + } + + if( getPixelFormatAttrib( i, WGL_PIXEL_TYPE_ARB ) != WGL_TYPE_RGBA_ARB ) + { + // Only consider RGBA pixel formats + continue; + } + + // Only consider "hardware-accelerated" pixel formats + if( getPixelFormatAttrib( i, WGL_ACCELERATION_ARB ) == + WGL_NO_ACCELERATION_ARB ) + { + continue; + } + + result[*found].redBits = getPixelFormatAttrib( i, WGL_RED_BITS_ARB ); + result[*found].greenBits = getPixelFormatAttrib( i, WGL_GREEN_BITS_ARB ); + result[*found].blueBits = getPixelFormatAttrib( i, WGL_BLUE_BITS_ARB ); + result[*found].alphaBits = getPixelFormatAttrib( i, WGL_ALPHA_BITS_ARB ); + + result[*found].depthBits = getPixelFormatAttrib( i, WGL_DEPTH_BITS_ARB ); + result[*found].stencilBits = getPixelFormatAttrib( i, WGL_STENCIL_BITS_ARB ); + + result[*found].accumRedBits = getPixelFormatAttrib( i, WGL_ACCUM_RED_BITS_ARB ); + result[*found].accumGreenBits = getPixelFormatAttrib( i, WGL_ACCUM_GREEN_BITS_ARB ); + result[*found].accumBlueBits = getPixelFormatAttrib( i, WGL_ACCUM_BLUE_BITS_ARB ); + result[*found].accumAlphaBits = getPixelFormatAttrib( i, WGL_ACCUM_ALPHA_BITS_ARB ); + + result[*found].auxBuffers = getPixelFormatAttrib( i, WGL_AUX_BUFFERS_ARB ); + result[*found].stereo = getPixelFormatAttrib( i, WGL_STEREO_ARB ); + + if( _glfwWin.has_WGL_ARB_multisample ) + { + result[*found].samples = getPixelFormatAttrib( i, WGL_SAMPLES_ARB ); + } + else + { + result[*found].samples = 0; + } + } + else + { + // Get pixel format attributes through old-fashioned PFDs + + if( !_glfw_DescribePixelFormat( _glfwWin.DC, i, sizeof( PIXELFORMATDESCRIPTOR ), &pfd ) ) + { + continue; + } + + if( !( pfd.dwFlags & PFD_DRAW_TO_WINDOW ) || + !( pfd.dwFlags & PFD_SUPPORT_OPENGL ) || + !( pfd.dwFlags & PFD_DOUBLEBUFFER ) ) + { + // Only consider doublebuffered OpenGL pixel formats for windows + continue; + } + + if( !( pfd.dwFlags & PFD_GENERIC_ACCELERATED ) && + ( pfd.dwFlags & PFD_GENERIC_FORMAT ) ) + { + continue; + } + + if( pfd.iPixelType != PFD_TYPE_RGBA ) + { + // Only RGBA pixel formats considered + continue; + } + + result[*found].redBits = pfd.cRedBits; + result[*found].greenBits = pfd.cGreenBits; + result[*found].blueBits = pfd.cBlueBits; + result[*found].alphaBits = pfd.cAlphaBits; + + result[*found].depthBits = pfd.cDepthBits; + result[*found].stencilBits = pfd.cStencilBits; + + result[*found].accumRedBits = pfd.cAccumRedBits; + result[*found].accumGreenBits = pfd.cAccumGreenBits; + result[*found].accumBlueBits = pfd.cAccumBlueBits; + result[*found].accumAlphaBits = pfd.cAccumAlphaBits; + + result[*found].auxBuffers = pfd.cAuxBuffers; + result[*found].stereo = ( pfd.dwFlags & PFD_STEREO ) ? GL_TRUE : GL_FALSE; + + // PFD pixel formats do not support FSAA + result[*found].samples = 0; + } + + result[*found].platformID = i; + + (*found)++; } - return GL_TRUE; + return result; } //======================================================================== -// Sets the device context pixel format using attributes +// Creates an OpenGL context on the specified device context //======================================================================== -#define _glfwSetWGLAttribute( _glfwName, _glfwValue ) \ - attribs[ count++ ] = _glfwName; \ - attribs[ count++ ] = _glfwValue; - -static int _glfwSetPixelFormatAttrib( int redbits, int greenbits, int bluebits, - int alphabits, int depthbits, int stencilbits, - int mode, _GLFWhints* hints ) +static GLboolean createContext( HDC dc, const _GLFWwndconfig* wndconfig, int pixelFormat ) { - int PixelFormat, dummy, count = 0; - int attribs[128]; PIXELFORMATDESCRIPTOR pfd; - - int accumredbits = hints->AccumRedBits; - int accumgreenbits = hints->AccumGreenBits; - int accumbluebits = hints->AccumBlueBits; - int accumalphabits = hints->AccumAlphaBits; + int flags, i = 0, attribs[40]; - _glfwSetWGLAttribute( WGL_DRAW_TO_WINDOW_ARB, GL_TRUE ); - _glfwSetWGLAttribute( WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB ); - _glfwSetWGLAttribute( WGL_SUPPORT_OPENGL_ARB, GL_TRUE ); - _glfwSetWGLAttribute( WGL_DOUBLE_BUFFER_ARB, GL_TRUE ); - _glfwSetWGLAttribute( WGL_COLOR_BITS_ARB, redbits + greenbits + bluebits ); - _glfwSetWGLAttribute( WGL_RED_BITS_ARB, redbits ); - _glfwSetWGLAttribute( WGL_GREEN_BITS_ARB, greenbits ); - _glfwSetWGLAttribute( WGL_BLUE_BITS_ARB, bluebits ); - _glfwSetWGLAttribute( WGL_ALPHA_BITS_ARB, alphabits ); - _glfwSetWGLAttribute( WGL_DEPTH_BITS_ARB, depthbits ); - _glfwSetWGLAttribute( WGL_STENCIL_BITS_ARB, stencilbits ); - _glfwSetWGLAttribute( WGL_AUX_BUFFERS_ARB, hints->AuxBuffers ); - - if( accumredbits || accumgreenbits || accumbluebits || accumalphabits ) + if( !_glfw_DescribePixelFormat( dc, pixelFormat, sizeof(pfd), &pfd ) ) { - _glfwSetWGLAttribute( WGL_ACCUM_BITS_ARB, accumredbits + - accumgreenbits + - accumbluebits + - accumalphabits ); - - _glfwSetWGLAttribute( WGL_ACCUM_RED_BITS_ARB, accumredbits ); - _glfwSetWGLAttribute( WGL_ACCUM_GREEN_BITS_ARB, accumgreenbits ); - _glfwSetWGLAttribute( WGL_ACCUM_BLUE_BITS_ARB, accumbluebits ); - _glfwSetWGLAttribute( WGL_ACCUM_ALPHA_BITS_ARB, accumalphabits ); + return GL_FALSE; } - if( hints->Stereo ) + if( !_glfw_SetPixelFormat( dc, pixelFormat, &pfd ) ) { - _glfwSetWGLAttribute( WGL_STEREO_ARB, GL_TRUE ); + return GL_FALSE; } - if( hints->Samples > 0 ) + if( _glfwWin.has_WGL_ARB_create_context ) { - _glfwSetWGLAttribute( WGL_SAMPLE_BUFFERS_ARB, 1 ); - _glfwSetWGLAttribute( WGL_SAMPLES_ARB, hints->Samples ); - } + // Use the newer wglCreateContextAttribsARB - _glfwSetWGLAttribute( 0, 0 ); + if( wndconfig->glMajor != 1 || wndconfig->glMinor != 0 ) + { + // Request an explicitly versioned context - if( !_glfwWin.ChoosePixelFormat( _glfwWin.DC, attribs, NULL, 1, &PixelFormat, &dummy ) ) - { - return GL_FALSE; - } + attribs[i++] = WGL_CONTEXT_MAJOR_VERSION_ARB; + attribs[i++] = wndconfig->glMajor; + attribs[i++] = WGL_CONTEXT_MINOR_VERSION_ARB; + attribs[i++] = wndconfig->glMinor; + } - if( !_glfw_DescribePixelFormat( _glfwWin.DC, PixelFormat, sizeof(pfd), &pfd ) ) - { - return GL_FALSE; - } + if( wndconfig->glForward || wndconfig->glDebug ) + { + flags = 0; + + if( wndconfig->glForward ) + { + flags |= WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB; + } + + if( wndconfig->glDebug ) + { + flags |= WGL_CONTEXT_DEBUG_BIT_ARB; + } - // Set the pixel-format - if( !_glfw_SetPixelFormat( _glfwWin.DC, PixelFormat, &pfd ) ) + attribs[i++] = WGL_CONTEXT_FLAGS_ARB; + attribs[i++] = flags; + } + + if( wndconfig->glProfile ) + { + if( !_glfwWin.has_WGL_ARB_create_context_profile ) + { + return GL_FALSE; + } + + if( wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE ) + { + flags = WGL_CONTEXT_CORE_PROFILE_BIT_ARB; + } + else + { + flags = WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB; + } + + attribs[i++] = WGL_CONTEXT_PROFILE_MASK_ARB; + attribs[i++] = flags; + } + + attribs[i++] = 0; + + _glfwWin.context = _glfwWin.CreateContextAttribsARB( dc, NULL, attribs ); + if( !_glfwWin.context ) + { + return GL_FALSE; + } + } + else { - return GL_FALSE; + _glfwWin.context = wglCreateContext( dc ); + if( !_glfwWin.context ) + { + return GL_FALSE; + } } - return GL_TRUE; + return GL_TRUE; } -#undef _glfwSetWGLAttribute - //======================================================================== // Translates a Windows key to the corresponding GLFW key //======================================================================== -static int _glfwTranslateKey( WPARAM wParam, LPARAM lParam ) +static int translateKey( WPARAM wParam, LPARAM lParam ) { MSG next_msg; DWORD msg_time; DWORD scan_code; + // Check for numeric keypad keys + // Note: This way we always force "NumLock = ON", which at least + // enables GLFW users to detect numeric keypad keys + int hiFlags = HIWORD( lParam ); + + if ( !( hiFlags & 0x100 ) ) + { + switch( MapVirtualKey( hiFlags & 0xFF, 1 ) ) + { + case VK_INSERT: return GLFW_KEY_KP_0; + case VK_END: return GLFW_KEY_KP_1; + case VK_DOWN: return GLFW_KEY_KP_2; + case VK_NEXT: return GLFW_KEY_KP_3; + case VK_LEFT: return GLFW_KEY_KP_4; + case VK_CLEAR: return GLFW_KEY_KP_5; + case VK_RIGHT: return GLFW_KEY_KP_6; + case VK_HOME: return GLFW_KEY_KP_7; + case VK_UP: return GLFW_KEY_KP_8; + case VK_PRIOR: return GLFW_KEY_KP_9; + case VK_DIVIDE: return GLFW_KEY_KP_DIVIDE; + case VK_MULTIPLY: return GLFW_KEY_KP_MULTIPLY; + case VK_SUBTRACT: return GLFW_KEY_KP_SUBTRACT; + case VK_ADD: return GLFW_KEY_KP_ADD; + case VK_DELETE: return GLFW_KEY_KP_DECIMAL; + } + } + // Check which key was pressed or released switch( wParam ) { // The SHIFT keys require special handling case VK_SHIFT: + { // Compare scan code for this key with that of VK_RSHIFT in // order to determine which shift key was pressed (left or // right) @@ -320,15 +435,19 @@ { return GLFW_KEY_RSHIFT; } + return GLFW_KEY_LSHIFT; + } // The CTRL keys require special handling case VK_CONTROL: + { // Is this an extended key (i.e. right key)? if( lParam & 0x01000000 ) { return GLFW_KEY_RCTRL; } + // Here is a trick: "Alt Gr" sends LCTRL, then RALT. We only // want the RALT message, so we try to see if the next message // is a RALT message. In that case, this is a false LCTRL! @@ -348,25 +467,33 @@ } } } + return GLFW_KEY_LCTRL; + } // The ALT keys require special handling case VK_MENU: + { // Is this an extended key (i.e. right key)? if( lParam & 0x01000000 ) { return GLFW_KEY_RALT; } + return GLFW_KEY_LALT; + } // The ENTER keys require special handling case VK_RETURN: + { // Is this an extended key (i.e. right key)? if( lParam & 0x01000000 ) { return GLFW_KEY_KP_ENTER; } + return GLFW_KEY_ENTER; + } // Special keys (non character keys) case VK_ESCAPE: return GLFW_KEY_ESC; @@ -424,14 +551,24 @@ case VK_SUBTRACT: return GLFW_KEY_KP_SUBTRACT; case VK_ADD: return GLFW_KEY_KP_ADD; case VK_DECIMAL: return GLFW_KEY_KP_DECIMAL; + case VK_NUMLOCK: return GLFW_KEY_KP_NUM_LOCK; + + case VK_CAPITAL: return GLFW_KEY_CAPS_LOCK; + case VK_SCROLL: return GLFW_KEY_SCROLL_LOCK; + case VK_PAUSE: return GLFW_KEY_PAUSE; + + case VK_LWIN: return GLFW_KEY_LSUPER; + case VK_RWIN: return GLFW_KEY_RSUPER; + case VK_APPS: return GLFW_KEY_MENU; // The rest (should be printable keys) default: + { // Convert to printable character (ISO-8859-1 or Unicode) wParam = MapVirtualKey( (UINT) wParam, 2 ) & 0x0000FFFF; // Make sure that the character is uppercase - if( _glfwLibrary.Sys.HasUnicode ) + if( _glfwLibrary.Sys.hasUnicode ) { wParam = (WPARAM) CharUpperW( (LPWSTR) wParam ); } @@ -446,16 +583,18 @@ { return (int) wParam; } + return GLFW_KEY_UNKNOWN; + } } } //======================================================================== -// Translates a windows key to Unicode +// Translates a Windows key to Unicode //======================================================================== -static void _glfwTranslateChar( DWORD wParam, DWORD lParam, int action ) +static void translateChar( DWORD wParam, DWORD lParam, int action ) { BYTE keyboard_state[ 256 ]; UCHAR char_buf[ 10 ]; @@ -463,7 +602,6 @@ UINT scan_code; int i, num_chars, unicode; - // Get keyboard state GetKeyboardState( keyboard_state ); // Derive scan code from lParam and action @@ -473,10 +611,8 @@ scan_code |= 0x8000000; } - // Do we have Unicode support? - if( _glfwLibrary.Sys.HasUnicode ) + if( _glfwLibrary.Sys.hasUnicode ) { - // Convert to Unicode num_chars = ToUnicode( wParam, // virtual-key code scan_code, // scan code @@ -520,104 +656,100 @@ // Window callback function (handles window events) //======================================================================== -static LRESULT CALLBACK _glfwWindowCallback( HWND hWnd, UINT uMsg, - WPARAM wParam, LPARAM lParam ) +static LRESULT CALLBACK windowProc( HWND hWnd, UINT uMsg, + WPARAM wParam, LPARAM lParam ) { - int WheelDelta, Iconified; + int wheelDelta, iconified; - // Handle certain window messages switch( uMsg ) { // Window activate message? (iconification?) case WM_ACTIVATE: { - _glfwWin.Active = LOWORD(wParam) != WA_INACTIVE ? GL_TRUE : GL_FALSE; + _glfwWin.active = LOWORD(wParam) != WA_INACTIVE ? GL_TRUE : GL_FALSE; - Iconified = HIWORD(wParam) ? GL_TRUE : GL_FALSE; + iconified = HIWORD(wParam) ? GL_TRUE : GL_FALSE; // Were we deactivated/iconified? - if( (!_glfwWin.Active || Iconified) && !_glfwWin.Iconified ) + if( (!_glfwWin.active || iconified) && !_glfwWin.iconified ) { _glfwInputDeactivation(); // If we are in fullscreen mode we need to iconify - if( _glfwWin.Opened && _glfwWin.Fullscreen ) + if( _glfwWin.opened && _glfwWin.fullscreen ) { // Do we need to manually iconify? - if( !Iconified ) + if( !iconified ) { // Minimize window - CloseWindow( _glfwWin.Wnd ); - - // The window is now iconified - Iconified = GL_TRUE; + ShowWindow( _glfwWin.window, SW_MINIMIZE ); + iconified = GL_TRUE; } - // Change display settings to the desktop resolution + // Restore the original desktop resolution ChangeDisplaySettings( NULL, CDS_FULLSCREEN ); } - // Unlock mouse - if( !_glfwWin.OldMouseLockValid ) + // Unlock mouse if locked + if( !_glfwWin.oldMouseLockValid ) { - _glfwWin.OldMouseLock = _glfwWin.MouseLock; - _glfwWin.OldMouseLockValid = GL_TRUE; + _glfwWin.oldMouseLock = _glfwWin.mouseLock; + _glfwWin.oldMouseLockValid = GL_TRUE; glfwEnable( GLFW_MOUSE_CURSOR ); } } - else if( _glfwWin.Active || !Iconified ) + else if( _glfwWin.active || !iconified ) { // If we are in fullscreen mode we need to maximize - if( _glfwWin.Opened && _glfwWin.Fullscreen && _glfwWin.Iconified ) + if( _glfwWin.opened && _glfwWin.fullscreen && _glfwWin.iconified ) { // Change display settings to the user selected mode - _glfwSetVideoModeMODE( _glfwWin.ModeID ); + _glfwSetVideoModeMODE( _glfwWin.modeID ); // Do we need to manually restore window? - if( Iconified ) + if( iconified ) { // Restore window - OpenIcon( _glfwWin.Wnd ); - - // The window is no longer iconified - Iconified = GL_FALSE; + ShowWindow( _glfwWin.window, SW_RESTORE ); + iconified = GL_FALSE; // Activate window ShowWindow( hWnd, SW_SHOW ); - _glfwSetForegroundWindow( _glfwWin.Wnd ); - SetFocus( _glfwWin.Wnd ); + setForegroundWindow( _glfwWin.window ); + SetFocus( _glfwWin.window ); } } // Lock mouse, if necessary - if( _glfwWin.OldMouseLockValid && _glfwWin.OldMouseLock ) + if( _glfwWin.oldMouseLockValid && _glfwWin.oldMouseLock ) { glfwDisable( GLFW_MOUSE_CURSOR ); } - _glfwWin.OldMouseLockValid = GL_FALSE; + _glfwWin.oldMouseLockValid = GL_FALSE; } - _glfwWin.Iconified = Iconified; + _glfwWin.iconified = iconified; return 0; } - // Intercept system commands (forbid certain actions/events) case WM_SYSCOMMAND: { - switch( wParam ) + switch( wParam & 0xfff0 ) { - // Screensaver trying to start or monitor trying to enter - // powersave? case SC_SCREENSAVE: case SC_MONITORPOWER: - if( _glfwWin.Fullscreen ) + { + if( _glfwWin.fullscreen ) { + // Disallow screen saver and screen blanking if we are + // running in fullscreen mode return 0; } else { break; } + } // User trying to access application menu using ALT? case SC_KEYMENU: @@ -626,28 +758,26 @@ break; } - // Did we receive a close message? case WM_CLOSE: + { + // Translate this to WM_QUIT so that we can handle all cases in the + // same place PostQuitMessage( 0 ); return 0; + } - // Is a key being pressed? case WM_KEYDOWN: case WM_SYSKEYDOWN: { - // Translate and report key press - _glfwInputKey( _glfwTranslateKey( wParam, lParam ), - GLFW_PRESS ); + _glfwInputKey( translateKey( wParam, lParam ), GLFW_PRESS ); - // Translate and report character input - if( _glfwWin.CharCallback ) + if( _glfwWin.charCallback ) { - _glfwTranslateChar( (DWORD) wParam, (DWORD) lParam, GLFW_PRESS ); + translateChar( (DWORD) wParam, (DWORD) lParam, GLFW_PRESS ); } return 0; - } + } - // Is a key being released? case WM_KEYUP: case WM_SYSKEYUP: { @@ -659,21 +789,17 @@ } else { - // Translate and report key release - _glfwInputKey( _glfwTranslateKey( wParam, lParam ), - GLFW_RELEASE ); + _glfwInputKey( translateKey( wParam, lParam ), GLFW_RELEASE ); } - // Translate and report character input - if( _glfwWin.CharCallback ) + if( _glfwWin.charCallback ) { - _glfwTranslateChar( (DWORD) wParam, (DWORD) lParam, GLFW_RELEASE ); + translateChar( (DWORD) wParam, (DWORD) lParam, GLFW_RELEASE ); } return 0; } - // Were any of the mouse-buttons pressed? case WM_LBUTTONDOWN: SetCapture(hWnd); _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS ); @@ -701,7 +827,6 @@ return 1; } - // Were any of the mouse-buttons released? case WM_LBUTTONUP: ReleaseCapture(); _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_RELEASE ); @@ -729,97 +854,87 @@ return 1; } - // Did the mouse move? case WM_MOUSEMOVE: { - { - int NewMouseX, NewMouseY; + int NewMouseX, NewMouseY; - // Get signed (!) mouse position - NewMouseX = (int)((short)LOWORD(lParam)); - NewMouseY = (int)((short)HIWORD(lParam)); + // Get signed (!) mouse position + NewMouseX = (int)((short)LOWORD(lParam)); + NewMouseY = (int)((short)HIWORD(lParam)); - if( NewMouseX != _glfwInput.OldMouseX || - NewMouseY != _glfwInput.OldMouseY ) + if( NewMouseX != _glfwInput.OldMouseX || + NewMouseY != _glfwInput.OldMouseY ) + { + if( _glfwWin.mouseLock ) { - if( _glfwWin.MouseLock ) - { - _glfwInput.MousePosX += NewMouseX - - _glfwInput.OldMouseX; - _glfwInput.MousePosY += NewMouseY - - _glfwInput.OldMouseY; - } - else - { - _glfwInput.MousePosX = NewMouseX; - _glfwInput.MousePosY = NewMouseY; - } - _glfwInput.OldMouseX = NewMouseX; - _glfwInput.OldMouseY = NewMouseY; - _glfwInput.MouseMoved = GL_TRUE; - - // Call user callback function - if( _glfwWin.MousePosCallback ) - { - _glfwWin.MousePosCallback( _glfwInput.MousePosX, - _glfwInput.MousePosY ); - } + _glfwInput.MousePosX += NewMouseX - + _glfwInput.OldMouseX; + _glfwInput.MousePosY += NewMouseY - + _glfwInput.OldMouseY; + } + else + { + _glfwInput.MousePosX = NewMouseX; + _glfwInput.MousePosY = NewMouseY; + } + _glfwInput.OldMouseX = NewMouseX; + _glfwInput.OldMouseY = NewMouseY; + _glfwInput.MouseMoved = GL_TRUE; + + if( _glfwWin.mousePosCallback ) + { + _glfwWin.mousePosCallback( _glfwInput.MousePosX, + _glfwInput.MousePosY ); } } return 0; } - // Mouse wheel action? case WM_MOUSEWHEEL: { // WM_MOUSEWHEEL is not supported under Windows 95 - if( _glfwLibrary.Sys.WinVer != _GLFW_WIN_95 ) + if( _glfwLibrary.Sys.winVer != _GLFW_WIN_95 ) { - WheelDelta = (((int)wParam) >> 16) / WHEEL_DELTA; - _glfwInput.WheelPos += WheelDelta; - if( _glfwWin.MouseWheelCallback ) + wheelDelta = (((int)wParam) >> 16) / WHEEL_DELTA; + _glfwInput.WheelPos += wheelDelta; + if( _glfwWin.mouseWheelCallback ) { - _glfwWin.MouseWheelCallback( _glfwInput.WheelPos ); + _glfwWin.mouseWheelCallback( _glfwInput.WheelPos ); } return 0; } break; } - // Resize the window? case WM_SIZE: { - // get the new size - _glfwWin.Width = LOWORD(lParam); - _glfwWin.Height = HIWORD(lParam); + _glfwWin.width = LOWORD(lParam); + _glfwWin.height = HIWORD(lParam); // If the mouse is locked, update the clipping rect - if( _glfwWin.MouseLock ) + if( _glfwWin.mouseLock ) { RECT ClipWindowRect; - if( GetWindowRect( _glfwWin.Wnd, &ClipWindowRect ) ) + if( GetWindowRect( _glfwWin.window, &ClipWindowRect ) ) { ClipCursor( &ClipWindowRect ); } } - // Call the user-supplied callback, if it exists - if( _glfwWin.WindowSizeCallback ) + if( _glfwWin.windowSizeCallback ) { - _glfwWin.WindowSizeCallback( LOWORD(lParam), - HIWORD(lParam) ); + _glfwWin.windowSizeCallback( LOWORD(lParam), HIWORD(lParam) ); } return 0; } - // Move the window? case WM_MOVE: { // If the mouse is locked, update the clipping rect - if( _glfwWin.MouseLock ) + if( _glfwWin.mouseLock ) { RECT ClipWindowRect; - if( GetWindowRect( _glfwWin.Wnd, &ClipWindowRect ) ) + if( GetWindowRect( _glfwWin.window, &ClipWindowRect ) ) { ClipCursor( &ClipWindowRect ); } @@ -830,20 +945,19 @@ // Was the window contents damaged? case WM_PAINT: { - // Call user callback function - if( _glfwWin.WindowRefreshCallback ) + if( _glfwWin.windowRefreshCallback ) { - _glfwWin.WindowRefreshCallback(); + _glfwWin.windowRefreshCallback(); } break; } - case WM_DISPLAYCHANGE: - { - // TODO: Do stuff here. + case WM_DISPLAYCHANGE: + { + // TODO: Do stuff here. - break; - } + break; + } } // Pass all unhandled messages to DefWindowProc @@ -855,101 +969,163 @@ // Translate client window size to full window size (including window borders) //======================================================================== -static void _glfwGetFullWindowSize( int w, int h, int *w2, int *h2 ) +static void getFullWindowSize( int clientWidth, int clientHeight, + int *fullWidth, int *fullHeight ) { RECT rect; // Create a window rectangle rect.left = (long)0; - rect.right = (long)w-1; + rect.right = (long)clientWidth - 1; rect.top = (long)0; - rect.bottom = (long)h-1; + rect.bottom = (long)clientHeight - 1; // Adjust according to window styles - AdjustWindowRectEx( &rect, _glfwWin.dwStyle, FALSE, - _glfwWin.dwExStyle ); + AdjustWindowRectEx( &rect, _glfwWin.dwStyle, FALSE, _glfwWin.dwExStyle ); // Calculate width and height of full window - *w2 = rect.right-rect.left+1; - *h2 = rect.bottom-rect.top+1; + *fullWidth = rect.right - rect.left + 1; + *fullHeight = rect.bottom - rect.top + 1; } //======================================================================== // Initialize WGL-specific extensions -//======================================================================== - -static void _glfwInitWGLExtensions( void ) -{ - GLubyte *extensions; - int has_swap_control, has_pixel_format; +// This function is called once before initial context creation, i.e. before +// any WGL extensions could be present. This is done in order to have both +// extension variable clearing and loading in the same place, hopefully +// decreasing the possibility of forgetting to add one without the other. +//======================================================================== + +static void initWGLExtensions( void ) +{ + // This needs to include every function pointer loaded below + _glfwWin.SwapIntervalEXT = NULL; + _glfwWin.GetPixelFormatAttribivARB = NULL; + _glfwWin.GetExtensionsStringARB = NULL; + _glfwWin.GetExtensionsStringEXT = NULL; + _glfwWin.CreateContextAttribsARB = NULL; + + // This needs to include every extension used below except for + // WGL_ARB_extensions_string and WGL_EXT_extensions_string + _glfwWin.has_WGL_EXT_swap_control = GL_FALSE; + _glfwWin.has_WGL_ARB_pixel_format = GL_FALSE; + _glfwWin.has_WGL_ARB_multisample = GL_FALSE; + _glfwWin.has_WGL_ARB_create_context = GL_FALSE; + _glfwWin.has_WGL_ARB_create_context_profile = GL_FALSE; - _glfwWin.GetExtensionsStringEXT = (WGLGETEXTENSIONSSTRINGEXT_T) + _glfwWin.GetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) wglGetProcAddress( "wglGetExtensionsStringEXT" ); if( !_glfwWin.GetExtensionsStringEXT ) { - // Try wglGetExtensionsStringARB - _glfwWin.GetExtensionsStringARB = (WGLGETEXTENSIONSSTRINGARB_T) - wglGetProcAddress( "wglGetExtensionsStringARB" ); - if( !_glfwWin.GetExtensionsStringARB ) - { - return; - } + _glfwWin.GetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) + wglGetProcAddress( "wglGetExtensionsStringARB" ); + if( !_glfwWin.GetExtensionsStringARB ) + { + return; + } } - // Initialize OpenGL extension: WGL_EXT_swap_control - has_swap_control = GL_FALSE; - has_pixel_format = GL_FALSE; - extensions = (GLubyte *) glGetString( GL_EXTENSIONS ); - - if( extensions != NULL ) + if( _glfwPlatformExtensionSupported( "WGL_ARB_multisample" ) ) { - has_swap_control = _glfwStringInExtensionString( - "WGL_EXT_swap_control", - extensions - ); - has_pixel_format = _glfwStringInExtensionString( - "WGL_ARB_pixel_format", - extensions - ); + _glfwWin.has_WGL_ARB_multisample = GL_TRUE; } - if( !has_swap_control ) + if( _glfwPlatformExtensionSupported( "WGL_ARB_create_context" ) ) { - has_swap_control = _glfwPlatformExtensionSupported( - "WGL_EXT_swap_control" - ); + _glfwWin.has_WGL_ARB_create_context = GL_TRUE; + _glfwWin.CreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) + wglGetProcAddress( "wglCreateContextAttribsARB" ); } - if( !has_pixel_format ) + if( _glfwWin.has_WGL_ARB_create_context ) { - has_pixel_format = _glfwPlatformExtensionSupported( - "WGL_ARB_pixel_format" - ); + if( _glfwPlatformExtensionSupported( "WGL_ARB_create_context_profile" ) ) + { + _glfwWin.has_WGL_ARB_create_context_profile = GL_TRUE; + } } - if( has_swap_control ) + if( _glfwPlatformExtensionSupported( "WGL_EXT_swap_control" ) ) { - _glfwWin.SwapInterval = (WGLSWAPINTERVALEXT_T) + _glfwWin.has_WGL_EXT_swap_control = GL_TRUE; + _glfwWin.SwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) wglGetProcAddress( "wglSwapIntervalEXT" ); } - else + + if( _glfwPlatformExtensionSupported( "WGL_ARB_pixel_format" ) ) + { + _glfwWin.has_WGL_ARB_pixel_format = GL_TRUE; + _glfwWin.GetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC) + wglGetProcAddress( "wglGetPixelFormatAttribivARB" ); + } +} + + +//======================================================================== +// Registers the GLFW window class +//======================================================================== + +static ATOM registerWindowClass( void ) +{ + WNDCLASS wc; + + // Set window class parameters + wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw on... + wc.lpfnWndProc = (WNDPROC)windowProc; // Message handler + wc.cbClsExtra = 0; // No extra class data + wc.cbWndExtra = 0; // No extra window data + wc.hInstance = _glfwLibrary.instance; // Set instance + wc.hCursor = LoadCursor( NULL, IDC_ARROW ); // Load arrow pointer + wc.hbrBackground = NULL; // No background + wc.lpszMenuName = NULL; // No menu + wc.lpszClassName = _GLFW_WNDCLASSNAME; // Set class name + + // Load user-provided icon if available + wc.hIcon = LoadIcon( _glfwLibrary.instance, "GLFW_ICON" ); + if( !wc.hIcon ) { - _glfwWin.SwapInterval = NULL; + // Load default icon + wc.hIcon = LoadIcon( NULL, IDI_WINLOGO ); } - - if( has_pixel_format ) + + return RegisterClass( &wc ); +} + + +//======================================================================== +// Returns the closest matching pixel format, or zero on error +//======================================================================== + +static int choosePixelFormat( const _GLFWfbconfig *fbconfig ) +{ + unsigned int fbcount; + int pixelFormat; + _GLFWfbconfig *fbconfigs; + const _GLFWfbconfig *closest; + + fbconfigs = getFBConfigs( &fbcount ); + if( !fbconfigs ) { - _glfwWin.ChoosePixelFormat = (WGLCHOOSEPIXELFORMATARB_T) - wglGetProcAddress( "wglChoosePixelFormatARB" ); - _glfwWin.GetPixelFormatAttribiv = (WGLGETPIXELFORMATATTRIBIVARB_T) - wglGetProcAddress( "wglGetPixelFormatAttribivARB" ); + fprintf( stderr, "Failed to find any usable GLFWFBConfigs\n" ); + return 0; } - else + + closest = _glfwChooseFBConfig( fbconfig, fbconfigs, fbcount ); + if( !closest ) { - _glfwWin.ChoosePixelFormat = NULL; - _glfwWin.GetPixelFormatAttribiv = NULL; - } + fprintf( stderr, "Failed to select a GLFWFBConfig from the alternatives\n" ); + free( fbconfigs ); + return 0; + } + + pixelFormat = (int) closest->platformID; + + free( fbconfigs ); + fbconfigs = NULL; + closest = NULL; + + return pixelFormat; } @@ -957,26 +1133,61 @@ // Creates the GLFW window and rendering context //======================================================================== -static int _glfwCreateWindow( int redbits, int greenbits, int bluebits, - int alphabits, int depthbits, int stencilbits, - int mode, _GLFWhints* hints ) -{ - int full_width, full_height; - RECT wa; - POINT pos; +static int createWindow( const _GLFWwndconfig *wndconfig, + const _GLFWfbconfig *fbconfig ) +{ + DWORD dwStyle, dwExStyle; + int pixelFormat, fullWidth, fullHeight; + RECT wa; + POINT pos; _glfwWin.DC = NULL; - _glfwWin.RC = NULL; - _glfwWin.Wnd = NULL; + _glfwWin.context = NULL; + _glfwWin.window = NULL; - // Set window size to true requested size (adjust for window borders) - _glfwGetFullWindowSize( _glfwWin.Width, _glfwWin.Height, &full_width, - &full_height ); + // Set common window styles + dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE; + dwExStyle = WS_EX_APPWINDOW; + + // Set window style, depending on fullscreen mode + if( _glfwWin.fullscreen ) + { + dwStyle |= WS_POPUP; + + // Here's a trick for helping us getting window focus + // (SetForegroundWindow doesn't work properly under + // Win98/ME/2K/.NET/+) + /* + if( _glfwLibrary.Sys.WinVer != _GLFW_WIN_95 && + _glfwLibrary.Sys.WinVer != _GLFW_WIN_NT4 && + _glfwLibrary.Sys.WinVer != _GLFW_WIN_XP ) + { + dwStyle |= WS_MINIMIZE; + } + */ + } + else + { + dwStyle |= WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; + + if( !wndconfig->windowNoResize ) + { + dwStyle |= ( WS_MAXIMIZEBOX | WS_SIZEBOX ); + dwExStyle |= WS_EX_WINDOWEDGE; + } + } + + // Remember window styles (used by getFullWindowSize) + _glfwWin.dwStyle = dwStyle; + _glfwWin.dwExStyle = dwExStyle; + + // Adjust window size for frame and title bar + getFullWindowSize( _glfwWin.width, _glfwWin.height, &fullWidth, &fullHeight ); // Adjust window position to working area (e.g. if the task bar is at // the top of the display). Fullscreen windows are always opened in - // the upper left corner regardless of the desktop working area. - if( _glfwWin.Fullscreen ) + // the upper left corner regardless of the desktop working area. + if( _glfwWin.fullscreen ) { wa.left = wa.top = 0; } @@ -985,68 +1196,55 @@ SystemParametersInfo( SPI_GETWORKAREA, 0, &wa, 0 ); } - // Create window - _glfwWin.Wnd = CreateWindowEx( - _glfwWin.dwExStyle, // Extended style - _GLFW_WNDCLASSNAME, // Class name - "GLFW Window", // Window title - _glfwWin.dwStyle, // Defined window style - wa.left, wa.top, // Window position - full_width, // Decorated window width - full_height, // Decorated window height - NULL, // No parent window - NULL, // No menu - _glfwLibrary.Instance, // Instance - NULL ); // Nothing to WM_CREATE + _glfwWin.window = CreateWindowEx( _glfwWin.dwExStyle, // Extended style + _GLFW_WNDCLASSNAME, // Class name + "GLFW Window", // Window title + _glfwWin.dwStyle, // Defined window style + wa.left, wa.top, // Window position + fullWidth, // Decorated window width + fullHeight, // Decorated window height + NULL, // No parent window + NULL, // No menu + _glfwLibrary.instance, // Instance + NULL ); // Nothing to WM_CREATE - if( !_glfwWin.Wnd ) + if( !_glfwWin.window ) { + fprintf( stderr, "Unable to create Win32 window\n" ); return GL_FALSE; } - // Get a device context - _glfwWin.DC = GetDC( _glfwWin.Wnd ); + _glfwWin.DC = GetDC( _glfwWin.window ); if( !_glfwWin.DC ) { + fprintf( stderr, "Unable to retrieve GLFW window DC\n" ); return GL_FALSE; } - if( _glfwWin.ChoosePixelFormat ) - { - if( !_glfwSetPixelFormatAttrib( redbits, greenbits, bluebits, alphabits, - depthbits, stencilbits, mode, hints ) ) - { - return GL_FALSE; - } - } - else + pixelFormat = choosePixelFormat( fbconfig ); + if( !pixelFormat ) { - if( !_glfwSetPixelFormatPFD( redbits, greenbits, bluebits, alphabits, - depthbits, stencilbits, mode, hints ) ) - { - return GL_FALSE; - } + fprintf( stderr, "Unable to find a usable pixel format\n" ); + return GL_FALSE; } - // Get a rendering context - _glfwWin.RC = wglCreateContext( _glfwWin.DC ); - if( !_glfwWin.RC ) + if( !createContext( _glfwWin.DC, wndconfig, pixelFormat ) ) { + fprintf( stderr, "Unable to create OpenGL context\n" ); return GL_FALSE; } - // Activate the OpenGL rendering context - if( !wglMakeCurrent( _glfwWin.DC, _glfwWin.RC ) ) + if( !wglMakeCurrent( _glfwWin.DC, _glfwWin.context ) ) { + fprintf( stderr, "Unable to make OpenGL context current\n" ); return GL_FALSE; } - // Initialize WGL-specific OpenGL extensions - _glfwInitWGLExtensions(); + initWGLExtensions(); - // Initialize mouse position + // Initialize mouse position data GetCursorPos( &pos ); - ScreenToClient( _glfwWin.Wnd, &pos ); + ScreenToClient( _glfwWin.window, &pos ); _glfwInput.OldMouseX = _glfwInput.MousePosX = pos.x; _glfwInput.OldMouseY = _glfwInput.MousePosY = pos.y; @@ -1058,40 +1256,32 @@ // Destroys the GLFW window and rendering context //======================================================================== -static void _glfwDestroyWindow( void ) +static void destroyWindow( void ) { - // Do we have a rendering context? - if( _glfwWin.RC ) + if( _glfwWin.context ) { - // Release the DC and RC contexts wglMakeCurrent( NULL, NULL ); - - // Delete the rendering context - wglDeleteContext( _glfwWin.RC ); - _glfwWin.RC = NULL; + wglDeleteContext( _glfwWin.context ); + _glfwWin.context = NULL; } - // Do we have a device context? if( _glfwWin.DC ) { - // Release the device context - ReleaseDC( _glfwWin.Wnd, _glfwWin.DC ); + ReleaseDC( _glfwWin.window, _glfwWin.DC ); _glfwWin.DC = NULL; } - // Do we have a window? - if( _glfwWin.Wnd ) + if( _glfwWin.window ) { - // Destroy the window - if( _glfwLibrary.Sys.WinVer <= _GLFW_WIN_NT4 ) + if( _glfwLibrary.Sys.winVer <= _GLFW_WIN_NT4 ) { // Note: Hiding the window first fixes an annoying W98/NT4 // remaining icon bug for fullscreen displays - ShowWindow( _glfwWin.Wnd, SW_HIDE ); + ShowWindow( _glfwWin.window, SW_HIDE ); } - DestroyWindow( _glfwWin.Wnd ); - _glfwWin.Wnd = NULL; + DestroyWindow( _glfwWin.window ); + _glfwWin.window = NULL; } } @@ -1107,142 +1297,127 @@ //======================================================================== int _glfwPlatformOpenWindow( int width, int height, - int redbits, int greenbits, int bluebits, - int alphabits, int depthbits, int stencilbits, - int mode, _GLFWhints* hints ) + const _GLFWwndconfig *wndconfig, + const _GLFWfbconfig *fbconfig ) { - WNDCLASS wc; - DWORD dwStyle, dwExStyle; + GLboolean recreateContext = GL_FALSE; // Clear platform specific GLFW window state - _glfwWin.ClassAtom = 0; - _glfwWin.OldMouseLockValid = GL_FALSE; - _glfwWin.ChoosePixelFormat = NULL; - _glfwWin.GetPixelFormatAttribiv = NULL; - - // Remember desired refresh rate for this window (used only in - // fullscreen mode) - _glfwWin.DesiredRefreshRate = hints->RefreshRate; - - // Set window class parameters - wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw on... - wc.lpfnWndProc = (WNDPROC)_glfwWindowCallback; // Message handler - wc.cbClsExtra = 0; // No extra class data - wc.cbWndExtra = 0; // No extra window data - wc.hInstance = _glfwLibrary.Instance; // Set instance - wc.hCursor = LoadCursor( NULL, IDC_ARROW ); // Load arrow pointer - wc.hbrBackground = NULL; // No background - wc.lpszMenuName = NULL; // No menu - wc.lpszClassName = _GLFW_WNDCLASSNAME; // Set class name + _glfwWin.classAtom = 0; + _glfwWin.oldMouseLockValid = GL_FALSE; - // Load user-provided icon if available - wc.hIcon = LoadIcon( _glfwLibrary.Instance, "GLFW_ICON" ); - if( !wc.hIcon ) - { - // Load default icon - wc.hIcon = LoadIcon( NULL, IDI_WINLOGO ); - } + _glfwWin.desiredRefreshRate = wndconfig->refreshRate; - // Register the window class - _glfwWin.ClassAtom = RegisterClass( &wc ); - if( !_glfwWin.ClassAtom ) + _glfwWin.classAtom = registerWindowClass(); + if( !_glfwWin.classAtom ) { - _glfwPlatformCloseWindow(); + fprintf( stderr, "Failed to register GLFW window class\n" ); return GL_FALSE; } - // Do we want full-screen mode? - if( _glfwWin.Fullscreen ) + if( _glfwWin.fullscreen ) { - _glfwSetVideoMode( &_glfwWin.Width, &_glfwWin.Height, - redbits, greenbits, bluebits, - hints->RefreshRate ); + _glfwSetVideoMode( &_glfwWin.width, &_glfwWin.height, + fbconfig->redBits, fbconfig->greenBits, fbconfig->blueBits, + wndconfig->refreshRate ); } - // Set common window styles - dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE; - dwExStyle = WS_EX_APPWINDOW; + initWGLExtensions(); - // Set window style, depending on fullscreen mode - if( _glfwWin.Fullscreen ) + if( !createWindow( wndconfig, fbconfig ) ) { - dwStyle |= WS_POPUP; - - // Here's a trick for helping us getting window focus - // (SetForegroundWindow doesn't work properly under - // Win98/ME/2K/.NET/+) - /* - if( _glfwLibrary.Sys.WinVer != _GLFW_WIN_95 && - _glfwLibrary.Sys.WinVer != _GLFW_WIN_NT4 && - _glfwLibrary.Sys.WinVer != _GLFW_WIN_XP ) - { - dwStyle |= WS_MINIMIZE; - } - */ + fprintf( stderr, "Failed to create GLFW window\n" ); + return GL_FALSE; } - else + + _glfwRefreshContextParams(); + + if( fbconfig->samples > 0 ) { - dwStyle |= WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; + // We want FSAA, but can we get it? + // FSAA is not a hard constraint, so otherwise we just don't care - if( !hints->WindowNoResize ) + if( _glfwWin.has_WGL_ARB_multisample && _glfwWin.has_WGL_ARB_pixel_format ) { - dwStyle |= ( WS_MAXIMIZEBOX | WS_SIZEBOX ); - dwExStyle |= WS_EX_WINDOWEDGE; + // We appear to have both the FSAA extension and the means to ask for it + recreateContext = GL_TRUE; } } - // Remember window styles (used by _glfwGetFullWindowSize) - _glfwWin.dwStyle = dwStyle; - _glfwWin.dwExStyle = dwExStyle; - - if( !_glfwCreateWindow( redbits, greenbits, bluebits, alphabits, - depthbits, stencilbits, mode, hints ) ) - { - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - if( _glfwWin.ChoosePixelFormat && hints->Samples > 0 ) + if( wndconfig->glMajor > 2 ) { - // Iteratively try to create a context with a decreasing number of - // FSAA samples (requires window recreation). - - for (;;) + if ( wndconfig->glMajor != _glfwWin.glMajor || + wndconfig->glMinor != _glfwWin.glMinor ) { - _glfwDestroyWindow(); + // We want a different OpenGL version, but can we get it? + // Otherwise, if we got a version greater than required, that's fine, + // whereas if we got a version lesser than required, it will be dealt + // with in glfwOpenWindow - if( _glfwCreateWindow( redbits, greenbits, bluebits, alphabits, - depthbits, stencilbits, mode, hints ) ) + if( _glfwWin.has_WGL_ARB_create_context ) { - break; + recreateContext = GL_TRUE; } + } - if( hints->Samples > 0 ) + if( wndconfig->glForward ) + { + if( !_glfwWin.has_WGL_ARB_create_context ) { - hints->Samples--; + // Forward-compatibility is a hard constraint + return GL_FALSE; } - else + + recreateContext = GL_TRUE; + } + + if( wndconfig->glProfile ) + { + if( !_glfwWin.has_WGL_ARB_create_context_profile ) { - _glfwPlatformCloseWindow(); + // Context profile is a hard constraint return GL_FALSE; } + + recreateContext = GL_TRUE; } } - // Make sure that our window ends up on top of things - if( _glfwWin.Fullscreen ) + if( recreateContext ) + { + // Some window hints require us to re-create the context using WGL + // extensions retrieved through the current context, as we cannot check + // for WGL extensions or retrieve WGL entry points before we have a + // current context (actually until we have implicitly loaded the ICD) + + // Yes, this is strange, and yes, this is the proper way on Win32 + + // As Windows only allows you to set the pixel format once for a + // window, we need to destroy the current window and create a new one + // to be able to use the new pixel format + + // Technically, it may be possible to keep the old window around if + // we're just creating an OpenGL 3.0+ context with the same pixel + // format, but it's not worth the potential compatibility problems + + destroyWindow(); + + if( !createWindow( wndconfig, fbconfig ) ) + { + fprintf( stderr, "Unable to re-create GLFW window\n" ); + return GL_FALSE; + } + } + + if( _glfwWin.fullscreen ) { // Place the window above all topmost windows - SetWindowPos( _glfwWin.Wnd, HWND_TOPMOST, 0,0,0,0, + SetWindowPos( _glfwWin.window, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE ); } - _glfwSetForegroundWindow( _glfwWin.Wnd ); - SetFocus( _glfwWin.Wnd ); - // Start by clearing the front buffer to black (avoid ugly desktop - // remains in our OpenGL window) - glClear( GL_COLOR_BUFFER_BIT ); - _glfw_SwapBuffers( _glfwWin.DC ); + setForegroundWindow( _glfwWin.window ); + SetFocus( _glfwWin.window ); return GL_TRUE; } @@ -1254,20 +1429,17 @@ void _glfwPlatformCloseWindow( void ) { - _glfwDestroyWindow(); + destroyWindow(); - // Do we have an instance? - if( _glfwWin.ClassAtom ) + if( _glfwWin.classAtom ) { - // Unregister class - UnregisterClass( _GLFW_WNDCLASSNAME, _glfwLibrary.Instance ); - _glfwWin.ClassAtom = 0; + UnregisterClass( _GLFW_WNDCLASSNAME, _glfwLibrary.instance ); + _glfwWin.classAtom = 0; } - // Are we in fullscreen mode? - if( _glfwWin.Fullscreen ) + if( _glfwWin.fullscreen ) { - // Switch back to desktop resolution + // Restore original desktop resolution ChangeDisplaySettings( NULL, CDS_FULLSCREEN ); } } @@ -1279,8 +1451,7 @@ void _glfwPlatformSetWindowTitle( const char *title ) { - // Set window title - (void) SetWindowText( _glfwWin.Wnd, title ); + (void) SetWindowText( _glfwWin.window, title ); } @@ -1295,47 +1466,47 @@ GLint drawbuffer; GLfloat clearcolor[4]; - // If we are in fullscreen mode, get some info about the current mode - if( _glfwWin.Fullscreen ) + if( _glfwWin.fullscreen ) { + // Get some info about the current mode + DEVMODE dm; // Get current BPP settings dm.dmSize = sizeof( DEVMODE ); - if( EnumDisplaySettings( NULL, _glfwWin.ModeID, &dm ) ) + if( EnumDisplaySettings( NULL, _glfwWin.modeID, &dm ) ) { // Get bpp bpp = dm.dmBitsPerPel; // Get closest match for target video mode - refresh = _glfwWin.DesiredRefreshRate; + refresh = _glfwWin.desiredRefreshRate; mode = _glfwGetClosestVideoModeBPP( &width, &height, &bpp, &refresh ); } else { - mode = _glfwWin.ModeID; + mode = _glfwWin.modeID; } } else { // If we are in windowed mode, adjust the window size to // compensate for window decorations - _glfwGetFullWindowSize( width, height, &width, &height ); + getFullWindowSize( width, height, &width, &height ); } // Change window size before changing fullscreen mode? - if( _glfwWin.Fullscreen && (width > _glfwWin.Width) ) + if( _glfwWin.fullscreen && (width > _glfwWin.width) ) { - SetWindowPos( _glfwWin.Wnd, HWND_TOP, 0, 0, width, height, + SetWindowPos( _glfwWin.window, HWND_TOP, 0, 0, width, height, SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOZORDER ); sizechanged = GL_TRUE; } // Change fullscreen video mode? - if( _glfwWin.Fullscreen && mode != _glfwWin.ModeID ) + if( _glfwWin.fullscreen && mode != _glfwWin.modeID ) { - // Change video mode _glfwSetVideoModeMODE( mode ); // Clear the front buffer to black (avoid ugly desktop remains in @@ -1355,7 +1526,7 @@ // Set window size (if not already changed) if( !sizechanged ) { - SetWindowPos( _glfwWin.Wnd, HWND_TOP, 0, 0, width, height, + SetWindowPos( _glfwWin.window, HWND_TOP, 0, 0, width, height, SWP_NOOWNERZORDER | SWP_NOMOVE | SWP_NOZORDER ); } } @@ -1367,8 +1538,7 @@ void _glfwPlatformSetWindowPos( int x, int y ) { - // Set window position - (void) SetWindowPos( _glfwWin.Wnd, HWND_TOP, x, y, 0, 0, + (void) SetWindowPos( _glfwWin.window, HWND_TOP, x, y, 0, 0, SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER ); } @@ -1380,23 +1550,21 @@ void _glfwPlatformIconifyWindow( void ) { // Iconify window - CloseWindow( _glfwWin.Wnd ); - - // Window is now iconified - _glfwWin.Iconified = GL_TRUE; + ShowWindow( _glfwWin.window, SW_MINIMIZE ); + _glfwWin.iconified = GL_TRUE; // If we are in fullscreen mode we need to change video modes - if( _glfwWin.Fullscreen ) + if( _glfwWin.fullscreen ) { // Change display settings to the desktop resolution ChangeDisplaySettings( NULL, CDS_FULLSCREEN ); } // Unlock mouse - if( !_glfwWin.OldMouseLockValid ) + if( !_glfwWin.oldMouseLockValid ) { - _glfwWin.OldMouseLock = _glfwWin.MouseLock; - _glfwWin.OldMouseLockValid = GL_TRUE; + _glfwWin.oldMouseLock = _glfwWin.mouseLock; + _glfwWin.oldMouseLockValid = GL_TRUE; glfwEnable( GLFW_MOUSE_CURSOR ); } } @@ -1409,29 +1577,29 @@ void _glfwPlatformRestoreWindow( void ) { // If we are in fullscreen mode we need to change video modes - if( _glfwWin.Fullscreen ) + if( _glfwWin.fullscreen ) { // Change display settings to the user selected mode - _glfwSetVideoModeMODE( _glfwWin.ModeID ); + _glfwSetVideoModeMODE( _glfwWin.modeID ); } // Un-iconify window - OpenIcon( _glfwWin.Wnd ); + ShowWindow( _glfwWin.window, SW_RESTORE ); // Make sure that our window ends up on top of things - ShowWindow( _glfwWin.Wnd, SW_SHOW ); - _glfwSetForegroundWindow( _glfwWin.Wnd ); - SetFocus( _glfwWin.Wnd ); + ShowWindow( _glfwWin.window, SW_SHOW ); + setForegroundWindow( _glfwWin.window ); + SetFocus( _glfwWin.window ); // Window is no longer iconified - _glfwWin.Iconified = GL_FALSE; + _glfwWin.iconified = GL_FALSE; // Lock mouse, if necessary - if( _glfwWin.OldMouseLockValid && _glfwWin.OldMouseLock ) + if( _glfwWin.oldMouseLockValid && _glfwWin.oldMouseLock ) { glfwDisable( GLFW_MOUSE_CURSOR ); } - _glfwWin.OldMouseLockValid = GL_FALSE; + _glfwWin.oldMouseLockValid = GL_FALSE; } @@ -1451,9 +1619,9 @@ void _glfwPlatformSwapInterval( int interval ) { - if( _glfwWin.SwapInterval ) + if( _glfwWin.has_WGL_EXT_swap_control ) { - _glfwWin.SwapInterval( interval ); + _glfwWin.SwapIntervalEXT( interval ); } } @@ -1466,94 +1634,92 @@ { PIXELFORMATDESCRIPTOR pfd; DEVMODE dm; - int PixelFormat, mode; + int pixelFormat, mode; // Obtain a detailed description of current pixel format - PixelFormat = _glfw_GetPixelFormat( _glfwWin.DC ); + pixelFormat = _glfw_GetPixelFormat( _glfwWin.DC ); - if( !_glfwWin.GetPixelFormatAttribiv ) + if( _glfwWin.has_WGL_ARB_pixel_format ) { - _glfw_DescribePixelFormat( _glfwWin.DC, PixelFormat, - sizeof(PIXELFORMATDESCRIPTOR), &pfd ); + if( getPixelFormatAttrib( pixelFormat, WGL_ACCELERATION_ARB ) != + WGL_NO_ACCELERATION_ARB ) + { + _glfwWin.accelerated = GL_TRUE; + } + else + { + _glfwWin.accelerated = GL_FALSE; + } - // Is current OpenGL context accelerated? - _glfwWin.Accelerated = (pfd.dwFlags & PFD_GENERIC_ACCELERATED) || - !(pfd.dwFlags & PFD_GENERIC_FORMAT) ? 1 : 0; + _glfwWin.redBits = getPixelFormatAttrib( pixelFormat, WGL_RED_BITS_ARB ); + _glfwWin.greenBits = getPixelFormatAttrib( pixelFormat, WGL_GREEN_BITS_ARB ); + _glfwWin.blueBits = getPixelFormatAttrib( pixelFormat, WGL_BLUE_BITS_ARB ); - // "Standard" window parameters - _glfwWin.RedBits = pfd.cRedBits; - _glfwWin.GreenBits = pfd.cGreenBits; - _glfwWin.BlueBits = pfd.cBlueBits; - _glfwWin.AlphaBits = pfd.cAlphaBits; - _glfwWin.DepthBits = pfd.cDepthBits; - _glfwWin.StencilBits = pfd.cStencilBits; - _glfwWin.AccumRedBits = pfd.cAccumRedBits; - _glfwWin.AccumGreenBits = pfd.cAccumGreenBits; - _glfwWin.AccumBlueBits = pfd.cAccumBlueBits; - _glfwWin.AccumAlphaBits = pfd.cAccumAlphaBits; - _glfwWin.AuxBuffers = pfd.cAuxBuffers; - _glfwWin.Stereo = pfd.dwFlags & PFD_STEREO ? 1 : 0; - _glfwWin.Samples = 0; + _glfwWin.alphaBits = getPixelFormatAttrib( pixelFormat, WGL_ALPHA_BITS_ARB ); + _glfwWin.depthBits = getPixelFormatAttrib( pixelFormat, WGL_DEPTH_BITS_ARB ); + _glfwWin.stencilBits = getPixelFormatAttrib( pixelFormat, WGL_STENCIL_BITS_ARB ); + + _glfwWin.accumRedBits = getPixelFormatAttrib( pixelFormat, WGL_ACCUM_RED_BITS_ARB ); + _glfwWin.accumGreenBits = getPixelFormatAttrib( pixelFormat, WGL_ACCUM_GREEN_BITS_ARB ); + _glfwWin.accumBlueBits = getPixelFormatAttrib( pixelFormat, WGL_ACCUM_BLUE_BITS_ARB ); + _glfwWin.accumAlphaBits = getPixelFormatAttrib( pixelFormat, WGL_ACCUM_ALPHA_BITS_ARB ); + + _glfwWin.auxBuffers = getPixelFormatAttrib( pixelFormat, WGL_AUX_BUFFERS_ARB ); + _glfwWin.stereo = getPixelFormatAttrib( pixelFormat, WGL_STEREO_ARB ) ? GL_TRUE : GL_FALSE; + + if( _glfwWin.has_WGL_ARB_multisample ) + { + _glfwWin.samples = getPixelFormatAttrib( pixelFormat, WGL_SAMPLES_ARB ); + // Should we force 1 to 0 here for consistency, or keep 1 for transparency? + } + else + { + _glfwWin.samples = 0; + } } else { - const int attribs[] = { - WGL_ACCELERATION_ARB, - WGL_RED_BITS_ARB, - WGL_GREEN_BITS_ARB, - WGL_BLUE_BITS_ARB, - WGL_ALPHA_BITS_ARB, - WGL_DEPTH_BITS_ARB, - WGL_STENCIL_BITS_ARB, - WGL_ACCUM_RED_BITS_ARB, - WGL_ACCUM_GREEN_BITS_ARB, - WGL_ACCUM_BLUE_BITS_ARB, - WGL_ACCUM_ALPHA_BITS_ARB, - WGL_AUX_BUFFERS_ARB, - WGL_STEREO_ARB, - WGL_SAMPLES_ARB - }; - - int values[sizeof(attribs) / sizeof(attribs[0])]; - - _glfwWin.GetPixelFormatAttribiv( _glfwWin.DC, PixelFormat, 0, - sizeof(attribs) / sizeof(attribs[0]), - attribs, values); + _glfw_DescribePixelFormat( _glfwWin.DC, pixelFormat, + sizeof(PIXELFORMATDESCRIPTOR), &pfd ); // Is current OpenGL context accelerated? - _glfwWin.Accelerated = (values[0] == WGL_FULL_ACCELERATION_ARB); + _glfwWin.accelerated = (pfd.dwFlags & PFD_GENERIC_ACCELERATED) || + !(pfd.dwFlags & PFD_GENERIC_FORMAT) ? 1 : 0; // "Standard" window parameters - _glfwWin.RedBits = values[1]; - _glfwWin.GreenBits = values[2]; - _glfwWin.BlueBits = values[3]; - _glfwWin.AlphaBits = values[4]; - _glfwWin.DepthBits = values[5]; - _glfwWin.StencilBits = values[6]; - _glfwWin.AccumRedBits = values[7]; - _glfwWin.AccumGreenBits = values[8]; - _glfwWin.AccumBlueBits = values[9]; - _glfwWin.AccumAlphaBits = values[10]; - _glfwWin.AuxBuffers = values[11]; - _glfwWin.Stereo = values[12]; - _glfwWin.Samples = values[13]; + _glfwWin.redBits = pfd.cRedBits; + _glfwWin.greenBits = pfd.cGreenBits; + _glfwWin.blueBits = pfd.cBlueBits; + _glfwWin.alphaBits = pfd.cAlphaBits; + _glfwWin.depthBits = pfd.cDepthBits; + _glfwWin.stencilBits = pfd.cStencilBits; + _glfwWin.accumRedBits = pfd.cAccumRedBits; + _glfwWin.accumGreenBits = pfd.cAccumGreenBits; + _glfwWin.accumBlueBits = pfd.cAccumBlueBits; + _glfwWin.accumAlphaBits = pfd.cAccumAlphaBits; + _glfwWin.auxBuffers = pfd.cAuxBuffers; + _glfwWin.stereo = (pfd.dwFlags & PFD_STEREO) ? GL_TRUE : GL_FALSE; + + // If we don't have WGL_ARB_pixel_format then we can't have created a + // multisampling context, so it's safe to hardcode zero here + _glfwWin.samples = 0; } // Get refresh rate - mode = _glfwWin.Fullscreen ? _glfwWin.ModeID : ENUM_CURRENT_SETTINGS; + mode = _glfwWin.fullscreen ? _glfwWin.modeID : ENUM_CURRENT_SETTINGS; dm.dmSize = sizeof( DEVMODE ); if( EnumDisplaySettings( NULL, mode, &dm ) ) { - _glfwWin.RefreshRate = dm.dmDisplayFrequency; - if( _glfwWin.RefreshRate <= 1 ) + _glfwWin.refreshRate = dm.dmDisplayFrequency; + if( _glfwWin.refreshRate <= 1 ) { - _glfwWin.RefreshRate = 0; + _glfwWin.refreshRate = 0; } } else { - _glfwWin.RefreshRate = 0; + _glfwWin.refreshRate = 0; } } @@ -1570,10 +1736,10 @@ // Flag: mouse was not moved (will be changed by _glfwGetNextEvent if // there was a mouse move event) _glfwInput.MouseMoved = GL_FALSE; - if( _glfwWin.MouseLock ) + if( _glfwWin.mouseLock ) { - _glfwInput.OldMouseX = _glfwWin.Width/2; - _glfwInput.OldMouseY = _glfwWin.Height/2; + _glfwInput.OldMouseX = _glfwWin.width/2; + _glfwInput.OldMouseY = _glfwWin.height/2; } else { @@ -1602,7 +1768,7 @@ // This is the only async event handling in GLFW, but it solves some // nasty problems. // Caveat: Does not work under Win 9x/ME. - if( _glfwLibrary.Sys.WinVer >= _GLFW_WIN_NT4 ) + if( _glfwLibrary.Sys.winVer >= _GLFW_WIN_NT4 ) { int lshift_down, rshift_down; @@ -1623,17 +1789,17 @@ } // Did we have mouse movement in locked cursor mode? - if( _glfwInput.MouseMoved && _glfwWin.MouseLock ) + if( _glfwInput.MouseMoved && _glfwWin.mouseLock ) { - _glfwPlatformSetMouseCursorPos( _glfwWin.Width / 2, - _glfwWin.Height / 2 ); + _glfwPlatformSetMouseCursorPos( _glfwWin.width / 2, + _glfwWin.height / 2 ); } // Was there a window close request? - if( winclosed && _glfwWin.WindowCloseCallback ) + if( winclosed && _glfwWin.windowCloseCallback ) { // Check if the program wants us to close the window - winclosed = _glfwWin.WindowCloseCallback(); + winclosed = _glfwWin.windowCloseCallback(); } if( winclosed ) { @@ -1643,15 +1809,13 @@ //======================================================================== -// _glfwPlatformWaitEvents() - Wait for new window and input events +// Wait for new window and input events //======================================================================== void _glfwPlatformWaitEvents( void ) { - // Wait for new events WaitMessage(); - // Poll new events _glfwPlatformPollEvents(); } @@ -1664,17 +1828,16 @@ { RECT ClipWindowRect; - // Hide cursor ShowCursor( FALSE ); // Clip cursor to the window - if( GetWindowRect( _glfwWin.Wnd, &ClipWindowRect ) ) + if( GetWindowRect( _glfwWin.window, &ClipWindowRect ) ) { ClipCursor( &ClipWindowRect ); } // Capture cursor to user window - SetCapture( _glfwWin.Wnd ); + SetCapture( _glfwWin.window ); } @@ -1687,10 +1850,9 @@ // Un-capture cursor ReleaseCapture(); - // Disable cursor clipping + // Release the cursor from the window ClipCursor( NULL ); - // Show cursor ShowCursor( TRUE ); } @@ -1706,9 +1868,8 @@ // Convert client coordinates to screen coordinates pos.x = x; pos.y = y; - ClientToScreen( _glfwWin.Wnd, &pos ); + ClientToScreen( _glfwWin.window, &pos ); - // Change cursor position SetCursorPos( pos.x, pos.y ); } diff -Nru glfw-2.6/lib/window.c glfw-2.7.2/lib/window.c --- glfw-2.6/lib/window.c 2007-05-25 09:56:35.000000000 +0000 +++ glfw-2.7.2/lib/window.c 2011-07-05 12:17:49.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: window.c // Platform: Any -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -30,27 +30,36 @@ #include "internal.h" +#include + + +#ifndef GL_VERSION_3_2 + +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_CONTEXT_PROFILE_MASK 0x9126 + +#endif /*GL_VERSION_3_2*/ + //************************************************************************ //**** GLFW internal functions **** //************************************************************************ +static int Max(int a, int b) +{ + return (a > b) ? a : b; +} + //======================================================================== // Clear all open window hints //======================================================================== void _glfwClearWindowHints( void ) { - _glfwWinHints.RefreshRate = 0; - _glfwWinHints.AccumRedBits = 0; - _glfwWinHints.AccumGreenBits = 0; - _glfwWinHints.AccumBlueBits = 0; - _glfwWinHints.AccumAlphaBits = 0; - _glfwWinHints.AuxBuffers = 0; - _glfwWinHints.Stereo = 0; - _glfwWinHints.WindowNoResize = 0; - _glfwWinHints.Samples = 0; + memset( &_glfwLibrary.hints, 0, sizeof( _glfwLibrary.hints ) ); + _glfwLibrary.hints.glMajor = 1; } @@ -66,24 +75,24 @@ for( i = 0; i <= GLFW_KEY_LAST; i ++ ) { if( _glfwInput.Key[ i ] == GLFW_PRESS ) - { - _glfwInputKey( i, GLFW_RELEASE ); - } + { + _glfwInputKey( i, GLFW_RELEASE ); + } } // Release all mouse buttons for( i = 0; i <= GLFW_MOUSE_BUTTON_LAST; i ++ ) { if( _glfwInput.MouseButton[ i ] == GLFW_PRESS ) - { - _glfwInputMouseClick( i, GLFW_RELEASE ); - } + { + _glfwInputMouseClick( i, GLFW_RELEASE ); + } } } //======================================================================== -// _glfwClearInput() - Clear all input state +// Clear all input state //======================================================================== void _glfwClearInput( void ) @@ -122,7 +131,7 @@ //======================================================================== -// _glfwInputKey() - Register keyboard activity +// Register keyboard activity //======================================================================== void _glfwInputKey( int key, int action ) @@ -131,37 +140,37 @@ if( key < 0 || key > GLFW_KEY_LAST ) { - return; + return; } // Are we trying to release an already released key? if( action == GLFW_RELEASE && _glfwInput.Key[ key ] != GLFW_PRESS ) { - return; + return; } // Register key action if( action == GLFW_RELEASE && _glfwInput.StickyKeys ) { - _glfwInput.Key[ key ] = GLFW_STICK; + _glfwInput.Key[ key ] = GLFW_STICK; } else { - keyrepeat = (_glfwInput.Key[ key ] == GLFW_PRESS) && - (action == GLFW_PRESS); - _glfwInput.Key[ key ] = (char) action; + keyrepeat = (_glfwInput.Key[ key ] == GLFW_PRESS) && + (action == GLFW_PRESS); + _glfwInput.Key[ key ] = (char) action; } // Call user callback function - if( _glfwWin.KeyCallback && (_glfwInput.KeyRepeat || !keyrepeat) ) + if( _glfwWin.keyCallback && (_glfwInput.KeyRepeat || !keyrepeat) ) { - _glfwWin.KeyCallback( key, action ); + _glfwWin.keyCallback( key, action ); } } //======================================================================== -// _glfwInputChar() - Register (keyboard) character activity +// Register (keyboard) character activity //======================================================================== void _glfwInputChar( int character, int action ) @@ -190,16 +199,33 @@ _glfwInput.LastChar = 0; } - // Call user callback function - if( _glfwWin.CharCallback && (_glfwInput.KeyRepeat || !keyrepeat) ) + if( action != GLFW_PRESS ) + { + // This intentionally breaks release notifications for Unicode + // characters, partly to see if anyone cares but mostly because it's + // a nonsensical concept to begin with + // + // It will remain broken either until its removal in the 3.0 API or + // until someone explains, in a way that makes sense to people outside + // the US and Scandinavia, what "Unicode character up" actually means + // + // If what you want is "physical key up" then you should be using the + // key functions and/or the key callback, NOT the Unicode input + // + // However, if your particular application uses this misfeature for... + // something, you can re-enable it by removing this if-statement + return; + } + + if( _glfwWin.charCallback && (_glfwInput.KeyRepeat || !keyrepeat) ) { - _glfwWin.CharCallback( character, action ); + _glfwWin.charCallback( character, action ); } } //======================================================================== -// _glfwInputMouseClick() - Register mouse button clicks +// Register mouse button clicks //======================================================================== void _glfwInputMouseClick( int button, int action ) @@ -217,39 +243,258 @@ } // Call user callback function - if( _glfwWin.MouseButtonCallback ) + if( _glfwWin.mouseButtonCallback ) { - _glfwWin.MouseButtonCallback( button, action ); + _glfwWin.mouseButtonCallback( button, action ); } } } +//======================================================================== +// Return the available framebuffer config closest to the desired values +// This is based on the manual GLX Visual selection from 2.6 +//======================================================================== + +const _GLFWfbconfig *_glfwChooseFBConfig( const _GLFWfbconfig *desired, + const _GLFWfbconfig *alternatives, + unsigned int count ) +{ + unsigned int i; + unsigned int missing, leastMissing = UINT_MAX; + unsigned int colorDiff, leastColorDiff = UINT_MAX; + unsigned int extraDiff, leastExtraDiff = UINT_MAX; + const _GLFWfbconfig *current; + const _GLFWfbconfig *closest = NULL; + + for( i = 0; i < count; i++ ) + { + current = alternatives + i; + + if( desired->stereo > 0 && current->stereo == 0 ) + { + // Stereo is a hard constraint + continue; + } + + // Count number of missing buffers + { + missing = 0; + + if( desired->alphaBits > 0 && current->alphaBits == 0 ) + { + missing++; + } + + if( desired->depthBits > 0 && current->depthBits == 0 ) + { + missing++; + } + + if( desired->stencilBits > 0 && current->stencilBits == 0 ) + { + missing++; + } + + if( desired->auxBuffers > 0 && current->auxBuffers < desired->auxBuffers ) + { + missing += desired->auxBuffers - current->auxBuffers; + } + + if( desired->samples > 0 && current->samples == 0 ) + { + // Technically, several multisampling buffers could be + // involved, but that's a lower level implementation detail and + // not important to us here, so we count them as one + missing++; + } + } + + // These polynomials make many small channel size differences matter + // less than one large channel size difference + + // Calculate color channel size difference value + { + colorDiff = 0; + + if ( desired->redBits > 0 ) + { + colorDiff += ( desired->redBits - current->redBits ) * + ( desired->redBits - current->redBits ); + } + + if ( desired->greenBits > 0 ) + { + colorDiff += ( desired->greenBits - current->greenBits ) * + ( desired->greenBits - current->greenBits ); + } + + if ( desired->blueBits > 0 ) + { + colorDiff += ( desired->blueBits - current->blueBits ) * + ( desired->blueBits - current->blueBits ); + } + } + + // Calculate non-color channel size difference value + { + extraDiff = 0; + + if( desired->alphaBits > 0 ) + { + extraDiff += ( desired->alphaBits - current->alphaBits ) * + ( desired->alphaBits - current->alphaBits ); + } + + if( desired->depthBits > 0 ) + { + extraDiff += ( desired->depthBits - current->depthBits ) * + ( desired->depthBits - current->depthBits ); + } + + if( desired->stencilBits > 0 ) + { + extraDiff += ( desired->stencilBits - current->stencilBits ) * + ( desired->stencilBits - current->stencilBits ); + } + + if( desired->accumRedBits > 0 ) + { + extraDiff += ( desired->accumRedBits - current->accumRedBits ) * + ( desired->accumRedBits - current->accumRedBits ); + } + + if( desired->accumGreenBits > 0 ) + { + extraDiff += ( desired->accumGreenBits - current->accumGreenBits ) * + ( desired->accumGreenBits - current->accumGreenBits ); + } + + if( desired->accumBlueBits > 0 ) + { + extraDiff += ( desired->accumBlueBits - current->accumBlueBits ) * + ( desired->accumBlueBits - current->accumBlueBits ); + } + + if( desired->accumAlphaBits > 0 ) + { + extraDiff += ( desired->accumAlphaBits - current->accumAlphaBits ) * + ( desired->accumAlphaBits - current->accumAlphaBits ); + } + + if( desired->samples > 0 ) + { + extraDiff += ( desired->samples - current->samples ) * + ( desired->samples - current->samples ); + } + } + + // Figure out if the current one is better than the best one found so far + + if( missing < leastMissing ) + { + closest = current; + } + else if( missing == leastMissing ) + { + if( ( colorDiff < leastColorDiff ) || + ( colorDiff == leastColorDiff && extraDiff < leastExtraDiff ) ) + { + closest = current; + } + } + + if( current == closest ) + { + leastMissing = missing; + leastColorDiff = colorDiff; + leastExtraDiff = extraDiff; + } + } + + return closest; +} + //************************************************************************ //**** GLFW user functions **** //************************************************************************ //======================================================================== -// glfwOpenWindow() - Here is where the window is created, and the OpenGL -// rendering context is created +// Create the GLFW window and its associated context //======================================================================== GLFWAPI int GLFWAPIENTRY glfwOpenWindow( int width, int height, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int mode ) { - int x; - _GLFWhints hints; + _GLFWfbconfig fbconfig; + _GLFWwndconfig wndconfig; + + if( !_glfwInitialized || _glfwWin.opened ) + { + return GL_FALSE; + } + + // Set up desired framebuffer config + fbconfig.redBits = Max( redbits, 0 ); + fbconfig.greenBits = Max( greenbits, 0 ); + fbconfig.blueBits = Max( bluebits, 0 ); + fbconfig.alphaBits = Max( alphabits, 0 ); + fbconfig.depthBits = Max( depthbits, 0 ); + fbconfig.stencilBits = Max( stencilbits, 0 ); + fbconfig.accumRedBits = Max( _glfwLibrary.hints.accumRedBits, 0 ); + fbconfig.accumGreenBits = Max( _glfwLibrary.hints.accumGreenBits, 0 ); + fbconfig.accumBlueBits = Max( _glfwLibrary.hints.accumBlueBits, 0 ); + fbconfig.accumAlphaBits = Max( _glfwLibrary.hints.accumAlphaBits, 0 ); + fbconfig.auxBuffers = Max( _glfwLibrary.hints.auxBuffers, 0 ); + fbconfig.stereo = _glfwLibrary.hints.stereo ? GL_TRUE : GL_FALSE; + fbconfig.samples = Max( _glfwLibrary.hints.samples, 0 ); + + // Set up desired window config + wndconfig.mode = mode; + wndconfig.refreshRate = Max( _glfwLibrary.hints.refreshRate, 0 ); + wndconfig.windowNoResize = _glfwLibrary.hints.windowNoResize ? GL_TRUE : GL_FALSE; + wndconfig.glMajor = Max( _glfwLibrary.hints.glMajor, 1 ); + wndconfig.glMinor = Max( _glfwLibrary.hints.glMinor, 0 ); + wndconfig.glForward = _glfwLibrary.hints.glForward ? GL_TRUE : GL_FALSE; + wndconfig.glDebug = _glfwLibrary.hints.glDebug ? GL_TRUE : GL_FALSE; + wndconfig.glProfile = _glfwLibrary.hints.glProfile; + + if( wndconfig.glMajor == 1 && wndconfig.glMinor > 5 ) + { + // OpenGL 1.x series ended with version 1.5 + return GL_FALSE; + } + else if( wndconfig.glMajor == 2 && wndconfig.glMinor > 1 ) + { + // OpenGL 2.x series ended with version 2.1 + return GL_FALSE; + } + else if( wndconfig.glMajor == 3 && wndconfig.glMinor > 3 ) + { + // OpenGL 3.x series ended with version 3.3 + return GL_FALSE; + } + else + { + // For now, let everything else through + } + + if( wndconfig.glProfile && + ( wndconfig.glMajor < 3 || ( wndconfig.glMajor == 3 && wndconfig.glMinor < 2 ) ) ) + { + // Context profiles are only defined for OpenGL version 3.2 and above + return GL_FALSE; + } - // Is GLFW initialized? - if( !_glfwInitialized || _glfwWin.Opened ) + if( wndconfig.glForward && wndconfig.glMajor < 3 ) { + // Forward-compatible contexts are only defined for OpenGL version 3.0 and above return GL_FALSE; } - // Copy and clear window hints - hints = _glfwWinHints; + // Clear for next open call _glfwClearWindowHints(); // Check input arguments @@ -259,21 +504,21 @@ } // Clear GLFW window state - _glfwWin.Active = GL_TRUE; - _glfwWin.Iconified = GL_FALSE; - _glfwWin.MouseLock = GL_FALSE; - _glfwWin.AutoPollEvents = GL_TRUE; + _glfwWin.active = GL_TRUE; + _glfwWin.iconified = GL_FALSE; + _glfwWin.mouseLock = GL_FALSE; + _glfwWin.autoPollEvents = GL_TRUE; _glfwClearInput(); // Unregister all callback functions - _glfwWin.WindowSizeCallback = NULL; - _glfwWin.WindowCloseCallback = NULL; - _glfwWin.WindowRefreshCallback = NULL; - _glfwWin.KeyCallback = NULL; - _glfwWin.CharCallback = NULL; - _glfwWin.MousePosCallback = NULL; - _glfwWin.MouseButtonCallback = NULL; - _glfwWin.MouseWheelCallback = NULL; + _glfwWin.windowSizeCallback = NULL; + _glfwWin.windowCloseCallback = NULL; + _glfwWin.windowRefreshCallback = NULL; + _glfwWin.keyCallback = NULL; + _glfwWin.charCallback = NULL; + _glfwWin.mousePosCallback = NULL; + _glfwWin.mouseButtonCallback = NULL; + _glfwWin.mouseWheelCallback = NULL; // Check width & height if( width > 0 && height <= 0 ) @@ -294,52 +539,79 @@ } // Remember window settings - _glfwWin.Width = width; - _glfwWin.Height = height; - _glfwWin.Fullscreen = (mode == GLFW_FULLSCREEN ? 1 : 0); + _glfwWin.width = width; + _glfwWin.height = height; + _glfwWin.fullscreen = (mode == GLFW_FULLSCREEN ? GL_TRUE : GL_FALSE); // Platform specific window opening routine - if( !_glfwPlatformOpenWindow( width, height, redbits, greenbits, - bluebits, alphabits, depthbits, stencilbits, mode, &hints ) ) + if( !_glfwPlatformOpenWindow( width, height, &wndconfig, &fbconfig ) ) { + glfwCloseWindow(); return GL_FALSE; } // Flag that window is now opened - _glfwWin.Opened = GL_TRUE; + _glfwWin.opened = GL_TRUE; - // Get window parameters (such as color buffer bits etc) + // Read back window and context parameters _glfwPlatformRefreshWindowParams(); + _glfwRefreshContextParams(); - // Get OpenGL version - glfwGetGLVersion( &_glfwWin.GLVerMajor, &_glfwWin.GLVerMinor, &x ); + if( _glfwWin.glMajor < wndconfig.glMajor || + ( _glfwWin.glMajor == wndconfig.glMajor && + _glfwWin.glMinor < wndconfig.glMinor ) ) + { + glfwCloseWindow(); + return GL_FALSE; + } - // Do we have non-power-of-two textures? - _glfwWin.Has_GL_ARB_texture_non_power_of_two = + // Do we have non-power-of-two textures (added to core in version 2.0)? + _glfwWin.has_GL_ARB_texture_non_power_of_two = + ( _glfwWin.glMajor >= 2 ) || glfwExtensionSupported( "GL_ARB_texture_non_power_of_two" ); - // Do we have automatic mipmap generation? - _glfwWin.Has_GL_SGIS_generate_mipmap = - (_glfwWin.GLVerMajor >= 2) || (_glfwWin.GLVerMinor >= 4) || + // Do we have automatic mipmap generation (added to core in version 1.4)? + _glfwWin.has_GL_SGIS_generate_mipmap = + ( _glfwWin.glMajor >= 2 ) || ( _glfwWin.glMinor >= 4 ) || glfwExtensionSupported( "GL_SGIS_generate_mipmap" ); + if( _glfwWin.glMajor > 2 ) + { + _glfwWin.GetStringi = (PFNGLGETSTRINGIPROC) glfwGetProcAddress( "glGetStringi" ); + if( !_glfwWin.GetStringi ) + { + // This is a very common problem among people who compile GLFW + // on X11/GLX using custom build systems, as it needs explicit + // configuration in order to work + // + // See readme.html section 2.2 for details + + glfwCloseWindow(); + return GL_FALSE; + } + } + // If full-screen mode was requested, disable mouse cursor if( mode == GLFW_FULLSCREEN ) { glfwDisable( GLFW_MOUSE_CURSOR ); } + // Start by clearing the front buffer to black (avoid ugly desktop + // remains in our OpenGL window) + glClear( GL_COLOR_BUFFER_BIT ); + _glfwPlatformSwapBuffers(); + return GL_TRUE; } //======================================================================== -// glfwOpenWindowHint() - Set hints for opening the window +// Set hints for opening the window //======================================================================== GLFWAPI void GLFWAPIENTRY glfwOpenWindowHint( int target, int hint ) { - // Is GLFW initialized? if( !_glfwInitialized ) { return; @@ -348,31 +620,46 @@ switch( target ) { case GLFW_REFRESH_RATE: - _glfwWinHints.RefreshRate = hint; + _glfwLibrary.hints.refreshRate = hint; break; case GLFW_ACCUM_RED_BITS: - _glfwWinHints.AccumRedBits = hint; + _glfwLibrary.hints.accumRedBits = hint; break; case GLFW_ACCUM_GREEN_BITS: - _glfwWinHints.AccumGreenBits = hint; + _glfwLibrary.hints.accumGreenBits = hint; break; case GLFW_ACCUM_BLUE_BITS: - _glfwWinHints.AccumBlueBits = hint; + _glfwLibrary.hints.accumBlueBits = hint; break; case GLFW_ACCUM_ALPHA_BITS: - _glfwWinHints.AccumAlphaBits = hint; + _glfwLibrary.hints.accumAlphaBits = hint; break; case GLFW_AUX_BUFFERS: - _glfwWinHints.AuxBuffers = hint; + _glfwLibrary.hints.auxBuffers = hint; break; case GLFW_STEREO: - _glfwWinHints.Stereo = hint; + _glfwLibrary.hints.stereo = hint; break; case GLFW_WINDOW_NO_RESIZE: - _glfwWinHints.WindowNoResize = hint; + _glfwLibrary.hints.windowNoResize = hint; + break; + case GLFW_FSAA_SAMPLES: + _glfwLibrary.hints.samples = hint; break; - case GLFW_FSAA_SAMPLES: - _glfwWinHints.Samples = hint; + case GLFW_OPENGL_VERSION_MAJOR: + _glfwLibrary.hints.glMajor = hint; + break; + case GLFW_OPENGL_VERSION_MINOR: + _glfwLibrary.hints.glMinor = hint; + break; + case GLFW_OPENGL_FORWARD_COMPAT: + _glfwLibrary.hints.glForward = hint; + break; + case GLFW_OPENGL_DEBUG_CONTEXT: + _glfwLibrary.hints.glDebug = hint; + break; + case GLFW_OPENGL_PROFILE: + _glfwLibrary.hints.glProfile = hint; break; default: break; @@ -381,12 +668,11 @@ //======================================================================== -// glfwCloseWindow() - Properly kill the window / video display +// Properly kill the window / video display //======================================================================== GLFWAPI void GLFWAPIENTRY glfwCloseWindow( void ) { - // Is GLFW initialized? if( !_glfwInitialized ) { return; @@ -395,22 +681,19 @@ // Show mouse pointer again (if hidden) glfwEnable( GLFW_MOUSE_CURSOR ); - // Close window _glfwPlatformCloseWindow(); - // Window is no longer opened - _glfwWin.Opened = GL_FALSE; + memset( &_glfwWin, 0, sizeof(_glfwWin) ); } //======================================================================== -// glfwSetWindowTitle() - Set the window title +// Set the window title //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowTitle( const char *title ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return; } @@ -421,36 +704,40 @@ //======================================================================== -// glfwGetWindowSize() - Get the window size +// Get the window size //======================================================================== GLFWAPI void GLFWAPIENTRY glfwGetWindowSize( int *width, int *height ) { + if( !_glfwInitialized || !_glfwWin.opened ) + { + return; + } + if( width != NULL ) { - *width = _glfwWin.Width; + *width = _glfwWin.width; } if( height != NULL ) { - *height = _glfwWin.Height; + *height = _glfwWin.height; } } //======================================================================== -// glfwSetWindowSize() - Set the window size +// Set the window size //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowSize( int width, int height ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened || _glfwWin.Iconified ) + if( !_glfwInitialized || !_glfwWin.opened || _glfwWin.iconified ) { return; } // Don't do anything if the window size did not change - if( width == _glfwWin.Width && height == _glfwWin.Height ) + if( width == _glfwWin.width && height == _glfwWin.height ) { return; } @@ -465,14 +752,13 @@ //======================================================================== -// glfwSetWindowPos() - Set the window position +// Set the window position //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowPos( int x, int y ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened || _glfwWin.Fullscreen || - _glfwWin.Iconified ) + if( !_glfwInitialized || !_glfwWin.opened || _glfwWin.fullscreen || + _glfwWin.iconified ) { return; } @@ -483,13 +769,12 @@ //======================================================================== -// glfwIconfyWindow() - Window iconification +// Window iconification //======================================================================== GLFWAPI void GLFWAPIENTRY glfwIconifyWindow( void ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened || _glfwWin.Iconified ) + if( !_glfwInitialized || !_glfwWin.opened || _glfwWin.iconified ) { return; } @@ -500,13 +785,12 @@ //======================================================================== -// glfwRestoreWindow() - Window un-iconification +// Window un-iconification //======================================================================== GLFWAPI void GLFWAPIENTRY glfwRestoreWindow( void ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened || !_glfwWin.Iconified ) + if( !_glfwInitialized || !_glfwWin.opened || !_glfwWin.iconified ) { return; } @@ -520,40 +804,33 @@ //======================================================================== -// glfwSwapBuffers() - Swap buffers (double-buffering) and poll any new -// events +// Swap buffers (double-buffering) and poll any new events //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSwapBuffers( void ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return; } + _glfwPlatformSwapBuffers(); + // Check for window messages - if( _glfwWin.AutoPollEvents ) + if( _glfwWin.autoPollEvents ) { glfwPollEvents(); } - - // Update display-buffer - if( _glfwWin.Opened ) - { - _glfwPlatformSwapBuffers(); - } } //======================================================================== -// glfwSwapInterval() - Set double buffering swap interval (0 = vsync off) +// Set double buffering swap interval (0 = vsync off) //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSwapInterval( int interval ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return; } @@ -564,19 +841,18 @@ //======================================================================== -// glfwGetWindowParam() - Get window parameter +// Get window parameter //======================================================================== GLFWAPI int GLFWAPIENTRY glfwGetWindowParam( int param ) { - // Is GLFW initialized? if( !_glfwInitialized ) { return 0; } // Is the window opened? - if( !_glfwWin.Opened ) + if( !_glfwWin.opened ) { if( param == GLFW_OPENED ) { @@ -591,41 +867,51 @@ case GLFW_OPENED: return GL_TRUE; case GLFW_ACTIVE: - return _glfwWin.Active; + return _glfwWin.active; case GLFW_ICONIFIED: - return _glfwWin.Iconified; + return _glfwWin.iconified; case GLFW_ACCELERATED: - return _glfwWin.Accelerated; + return _glfwWin.accelerated; case GLFW_RED_BITS: - return _glfwWin.RedBits; + return _glfwWin.redBits; case GLFW_GREEN_BITS: - return _glfwWin.GreenBits; + return _glfwWin.greenBits; case GLFW_BLUE_BITS: - return _glfwWin.BlueBits; + return _glfwWin.blueBits; case GLFW_ALPHA_BITS: - return _glfwWin.AlphaBits; + return _glfwWin.alphaBits; case GLFW_DEPTH_BITS: - return _glfwWin.DepthBits; + return _glfwWin.depthBits; case GLFW_STENCIL_BITS: - return _glfwWin.StencilBits; + return _glfwWin.stencilBits; case GLFW_ACCUM_RED_BITS: - return _glfwWin.AccumRedBits; + return _glfwWin.accumRedBits; case GLFW_ACCUM_GREEN_BITS: - return _glfwWin.AccumGreenBits; + return _glfwWin.accumGreenBits; case GLFW_ACCUM_BLUE_BITS: - return _glfwWin.AccumBlueBits; + return _glfwWin.accumBlueBits; case GLFW_ACCUM_ALPHA_BITS: - return _glfwWin.AccumAlphaBits; + return _glfwWin.accumAlphaBits; case GLFW_AUX_BUFFERS: - return _glfwWin.AuxBuffers; + return _glfwWin.auxBuffers; case GLFW_STEREO: - return _glfwWin.Stereo; + return _glfwWin.stereo; case GLFW_REFRESH_RATE: - return _glfwWin.RefreshRate; + return _glfwWin.refreshRate; case GLFW_WINDOW_NO_RESIZE: - return _glfwWin.WindowNoResize; - case GLFW_FSAA_SAMPLES: - return _glfwWin.Samples; + return _glfwWin.windowNoResize; + case GLFW_FSAA_SAMPLES: + return _glfwWin.samples; + case GLFW_OPENGL_VERSION_MAJOR: + return _glfwWin.glMajor; + case GLFW_OPENGL_VERSION_MINOR: + return _glfwWin.glMinor; + case GLFW_OPENGL_FORWARD_COMPAT: + return _glfwWin.glForward; + case GLFW_OPENGL_DEBUG_CONTEXT: + return _glfwWin.glDebug; + case GLFW_OPENGL_PROFILE: + return _glfwWin.glProfile; default: return 0; } @@ -633,73 +919,66 @@ //======================================================================== -// glfwSetWindowSizeCallback() - Set callback function for window size -// changes +// Set callback function for window size changes //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowSizeCallback( GLFWwindowsizefun cbfun ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set callback function - _glfwWin.WindowSizeCallback = cbfun; + _glfwWin.windowSizeCallback = cbfun; // Call the callback function to let the application know the current // window size if( cbfun ) { - cbfun( _glfwWin.Width, _glfwWin.Height ); + cbfun( _glfwWin.width, _glfwWin.height ); } } //======================================================================== -// glfwSetWindowCloseCallback() - Set callback function for window close -// events +// Set callback function for window close events //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowCloseCallback( GLFWwindowclosefun cbfun ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set callback function - _glfwWin.WindowCloseCallback = cbfun; + _glfwWin.windowCloseCallback = cbfun; } //======================================================================== -// glfwSetWindowRefreshCallback() - Set callback function for window -// refresh events +// Set callback function for window refresh events //======================================================================== GLFWAPI void GLFWAPIENTRY glfwSetWindowRefreshCallback( GLFWwindowrefreshfun cbfun ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return; } // Set callback function - _glfwWin.WindowRefreshCallback = cbfun; + _glfwWin.windowRefreshCallback = cbfun; } //======================================================================== -// glfwPollEvents() - Poll for new window and input events +// Poll for new window and input events //======================================================================== GLFWAPI void GLFWAPIENTRY glfwPollEvents( void ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return; } @@ -710,13 +989,12 @@ //======================================================================== -// glfwWaitEvents() - Wait for new window and input events +// Wait for new window and input events //======================================================================== GLFWAPI void GLFWAPIENTRY glfwWaitEvents( void ) { - // Is GLFW initialized? - if( !_glfwInitialized || !_glfwWin.Opened ) + if( !_glfwInitialized || !_glfwWin.opened ) { return; } diff -Nru glfw-2.6/lib/x11/Makefile.x11.in glfw-2.7.2/lib/x11/Makefile.x11.in --- glfw-2.6/lib/x11/Makefile.x11.in 2007-07-01 09:46:46.000000000 +0000 +++ glfw-2.7.2/lib/x11/Makefile.x11.in 2009-11-08 19:22:48.000000000 +0000 @@ -8,7 +8,7 @@ ########################################################################## # Default: Build GLFW static library ########################################################################## -default: libglfw.a libglfw.so +all: libglfw.a libglfw.so ########################################################################## @@ -19,6 +19,7 @@ SED = sed INSTALL = install ARFLAGS = -rcs +HEADERS = ../../include/GL/glfw.h ../internal.h platform.h ########################################################################## @@ -34,6 +35,19 @@ ########################################################################## +# Install GLFW static and shared libraries +########################################################################## +dist-install: libglfw.a libglfw.so libglfw.pc + $(INSTALL) -d $(PREFIX)/lib + $(INSTALL) -c -m 644 libglfw.a $(PREFIX)/lib/libglfw.a + $(INSTALL) -c -m 644 libglfw.so $(PREFIX)/lib/libglfw.so + $(INSTALL) -d $(PREFIX)/include/GL + $(INSTALL) -c -m 644 ../../include/GL/glfw.h $(PREFIX)/include/GL/glfw.h + $(INSTALL) -d $(PREFIX)/lib/pkgconfig + $(INSTALL) -c -m 644 libglfw.pc $(PREFIX)/lib/pkgconfig/libglfw.pc + + +########################################################################## # Object files which are part of the GLFW library ########################################################################## STATIC_OBJS = \ @@ -105,139 +119,147 @@ # Rule for building shared library ########################################################################## libglfw.so: $(SHARED_OBJS) - $(CC) $(LDFLAGS) -o $@ $(SHARED_OBJS) $(LFLAGS) $(LIBS) + $(CC) $(SOFLAGS) -o $@ $(SHARED_OBJS) $(LFLAGS) $(LIBS) ########################################################################## # Rules for building static library object files ########################################################################## -enable.o: ../enable.c ../internal.h platform.h +enable.o: ../enable.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../enable.c -fullscreen.o: ../fullscreen.c ../internal.h platform.h +fullscreen.o: ../fullscreen.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../fullscreen.c -glext.o: ../glext.c ../internal.h platform.h +glext.o: ../glext.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../glext.c -image.o: ../image.c ../internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o $@ ../image.c +image.o: ../image.c $(HEADERS) + $(CC) $(CFLAGS) -o $@ ../image.c -init.o: ../init.c ../internal.h platform.h +init.o: ../init.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../init.c -input.o: ../input.c ../internal.h platform.h +input.o: ../input.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../input.c -joystick.o: ../joystick.c ../internal.h platform.h +joystick.o: ../joystick.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../joystick.c -stream.o: ../stream.c ../internal.h platform.h +stream.o: ../stream.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../stream.c -tga.o: ../tga.c ../internal.h platform.h - $(CC) $(CFLAGS_SPEED) -o $@ ../tga.c +tga.o: ../tga.c $(HEADERS) + $(CC) $(CFLAGS) -o $@ ../tga.c -thread.o: ../thread.c ../internal.h platform.h +thread.o: ../thread.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../thread.c -time.o: ../time.c ../internal.h platform.h +time.o: ../time.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../time.c -window.o: ../window.c ../internal.h platform.h +window.o: ../window.c $(HEADERS) $(CC) $(CFLAGS) -o $@ ../window.c -x11_enable.o: x11_enable.c ../internal.h platform.h +x11_enable.o: x11_enable.c $(HEADERS) $(CC) $(CFLAGS) -o $@ x11_enable.c -x11_fullscreen.o: x11_fullscreen.c ../internal.h platform.h +x11_fullscreen.o: x11_fullscreen.c $(HEADERS) $(CC) $(CFLAGS) -o $@ x11_fullscreen.c -x11_glext.o: x11_glext.c ../internal.h platform.h +x11_glext.o: x11_glext.c $(HEADERS) $(CC) $(CFLAGS) -o $@ x11_glext.c -x11_init.o: x11_init.c ../internal.h platform.h +x11_init.o: x11_init.c $(HEADERS) $(CC) $(CFLAGS) -o $@ x11_init.c -x11_joystick.o: x11_joystick.c ../internal.h platform.h +x11_joystick.o: x11_joystick.c $(HEADERS) $(CC) $(CFLAGS) -o $@ x11_joystick.c -x11_thread.o: x11_thread.c ../internal.h platform.h +x11_thread.o: x11_thread.c $(HEADERS) $(CC) $(CFLAGS) -o $@ x11_thread.c -x11_time.o: x11_time.c ../internal.h platform.h +x11_time.o: x11_time.c $(HEADERS) $(CC) $(CFLAGS) -o $@ x11_time.c -x11_window.o: x11_window.c ../internal.h platform.h +x11_window.o: x11_window.c $(HEADERS) $(CC) $(CFLAGS) -o $@ x11_window.c -x11_keysym2unicode.o: x11_keysym2unicode.c ../internal.h platform.h +x11_keysym2unicode.o: x11_keysym2unicode.c $(HEADERS) $(CC) $(CFLAGS) -o $@ x11_keysym2unicode.c ########################################################################## # Rules for building shared library object files ########################################################################## -so_enable.o: ../enable.c ../internal.h platform.h +so_enable.o: ../enable.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ ../enable.c -so_fullscreen.o: ../fullscreen.c ../internal.h platform.h +so_fullscreen.o: ../fullscreen.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ ../fullscreen.c -so_glext.o: ../glext.c ../internal.h platform.h +so_glext.o: ../glext.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ ../glext.c -so_image.o: ../image.c ../internal.h platform.h - $(CC) -fPIC $(CFLAGS_SPEED) -o $@ ../image.c +so_image.o: ../image.c $(HEADERS) + $(CC) -fPIC $(CFLAGS) -o $@ ../image.c -so_init.o: ../init.c ../internal.h platform.h +so_init.o: ../init.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ ../init.c -so_input.o: ../input.c ../internal.h platform.h +so_input.o: ../input.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ ../input.c -so_joystick.o: ../joystick.c ../internal.h platform.h +so_joystick.o: ../joystick.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ ../joystick.c -so_stream.o: ../stream.c ../internal.h platform.h +so_stream.o: ../stream.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ ../stream.c -so_tga.o: ../tga.c ../internal.h platform.h - $(CC) -fPIC $(CFLAGS_SPEED) -o $@ ../tga.c +so_tga.o: ../tga.c $(HEADERS) + $(CC) -fPIC $(CFLAGS) -o $@ ../tga.c -so_thread.o: ../thread.c ../internal.h platform.h +so_thread.o: ../thread.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ ../thread.c -so_time.o: ../time.c ../internal.h platform.h +so_time.o: ../time.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ ../time.c -so_window.o: ../window.c ../internal.h platform.h +so_window.o: ../window.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ ../window.c -so_x11_enable.o: x11_enable.c ../internal.h platform.h +so_x11_enable.o: x11_enable.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ x11_enable.c -so_x11_fullscreen.o: x11_fullscreen.c ../internal.h platform.h +so_x11_fullscreen.o: x11_fullscreen.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ x11_fullscreen.c -so_x11_glext.o: x11_glext.c ../internal.h platform.h +so_x11_glext.o: x11_glext.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ x11_glext.c -so_x11_init.o: x11_init.c ../internal.h platform.h +so_x11_init.o: x11_init.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ x11_init.c -so_x11_joystick.o: x11_joystick.c ../internal.h platform.h +so_x11_joystick.o: x11_joystick.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ x11_joystick.c -so_x11_thread.o: x11_thread.c ../internal.h platform.h +so_x11_thread.o: x11_thread.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ x11_thread.c -so_x11_time.o: x11_time.c ../internal.h platform.h +so_x11_time.o: x11_time.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ x11_time.c -so_x11_window.o: x11_window.c ../internal.h platform.h +so_x11_window.o: x11_window.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ x11_window.c -so_x11_keysym2unicode.o: x11_keysym2unicode.c ../internal.h platform.h +so_x11_keysym2unicode.o: x11_keysym2unicode.c $(HEADERS) $(CC) -fPIC $(CFLAGS) -o $@ x11_keysym2unicode.c + +########################################################################## +# Clean +########################################################################## + +clean: + rm -f $(STATIC_OBJS) $(SHARED_OBJS) libglfw.a libglfw.so libglfw.pc + diff -Nru glfw-2.6/lib/x11/platform.h glfw-2.7.2/lib/x11/platform.h --- glfw-2.6/lib/x11/platform.h 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/x11/platform.h 2011-06-28 03:02:46.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: platform.h -// Platform: X11 (Unix) -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: X11/GLX +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -52,6 +52,16 @@ #include #endif +// We need declarations for GLX version 1.3 or above even if the server doesn't +// support version 1.3 +#ifndef GLX_VERSION_1_3 + #error "GLX header version 1.3 or above is required" +#endif + +#if defined( _GLFW_HAS_XF86VIDMODE ) && defined( _GLFW_HAS_XRANDR ) + #error "Xf86VidMode and RandR extensions cannot both be enabled" +#endif + // With XFree86, we can use the XF86VidMode extension #if defined( _GLFW_HAS_XF86VIDMODE ) #include @@ -113,28 +123,82 @@ #endif -void (*glXGetProcAddress(const GLubyte *procName))(); -void (*glXGetProcAddressARB(const GLubyte *procName))(); -void (*glXGetProcAddressEXT(const GLubyte *procName))(); - -// We support four different ways for getting addresses for GL/GLX -// extension functions: glXGetProcAddress, glXGetProcAddressARB, -// glXGetProcAddressEXT, and dlsym -#if defined( _GLFW_HAS_GLXGETPROCADDRESSARB ) - #define _glfw_glXGetProcAddress(x) glXGetProcAddressARB(x) -#elif defined( _GLFW_HAS_GLXGETPROCADDRESS ) - #define _glfw_glXGetProcAddress(x) glXGetProcAddress(x) -#elif defined( _GLFW_HAS_GLXGETPROCADDRESSEXT ) - #define _glfw_glXGetProcAddress(x) glXGetProcAddressEXT(x) -#elif defined( _GLFW_HAS_DLOPEN ) - #define _glfw_glXGetProcAddress(x) dlsym(_glfwLibs.libGL,x) - #define _GLFW_DLOPEN_LIBGL -#else -#define _glfw_glXGetProcAddress(x) NULL -#endif +// Pointer length integer +// One day, this will most likely move into glfw.h +typedef intptr_t GLFWintptr; + + +#ifndef GLX_SGI_swap_control + +// Function signature for GLX_SGI_swap_control +typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); + +#endif /*GLX_SGI_swap_control*/ + + +#ifndef GLX_SGIX_fbconfig + +/* Type definitions for GLX_SGIX_fbconfig */ +typedef XID GLXFBConfigIDSGIX; +typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; + +/* Function signatures for GLX_SGIX_fbconfig */ +typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int attribute, int *value); +typedef GLXFBConfigSGIX * ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, int *attrib_list, int *nelements); +typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct); +typedef XVisualInfo * ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfigSGIX config); + +/* Tokens for GLX_SGIX_fbconfig */ +#define GLX_WINDOW_BIT_SGIX 0x00000001 +#define GLX_PIXMAP_BIT_SGIX 0x00000002 +#define GLX_RGBA_BIT_SGIX 0x00000001 +#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 +#define GLX_DRAWABLE_TYPE_SGIX 0x8010 +#define GLX_RENDER_TYPE_SGIX 0x8011 +#define GLX_X_RENDERABLE_SGIX 0x8012 +#define GLX_FBCONFIG_ID_SGIX 0x8013 +#define GLX_RGBA_TYPE_SGIX 0x8014 +#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 +#define GLX_SCREEN_EXT 0x800C + +#endif /*GLX_SGIX_fbconfig*/ + + +#ifndef GLX_ARB_create_context + +/* Tokens for glXCreateContextAttribsARB attributes */ +#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define GLX_CONTEXT_FLAGS_ARB 0x2094 + +/* Bits for WGL_CONTEXT_FLAGS_ARB */ +#define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001 +#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 + +/* Prototype for glXCreateContextAttribs */ +typedef GLXContext (*PFNGLXCREATECONTEXTATTRIBSARBPROC)( Display *display, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list); + +#endif /*GLX_ARB_create_context*/ + + +#ifndef GLX_ARB_create_context_profile + +/* Tokens for glXCreateContextAttribsARB attributes */ +#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 + +/* BIts for GLX_CONTEXT_PROFILE_MASK_ARB */ +#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 +#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 + +#endif /*GLX_ARB_create_context_profile*/ + + +#ifndef GL_VERSION_3_0 + +typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGIPROC) (GLenum, GLuint); + +#endif /*GL_VERSION_3_0*/ -// glXSwapIntervalSGI typedef (X11 buffer-swap interval control) -typedef int ( * GLXSWAPINTERVALSGI_T) (int interval); //======================================================================== @@ -151,91 +215,111 @@ // ========= PLATFORM INDEPENDENT MANDATORY PART ========================= // User callback functions - GLFWwindowsizefun WindowSizeCallback; - GLFWwindowclosefun WindowCloseCallback; - GLFWwindowrefreshfun WindowRefreshCallback; - GLFWmousebuttonfun MouseButtonCallback; - GLFWmouseposfun MousePosCallback; - GLFWmousewheelfun MouseWheelCallback; - GLFWkeyfun KeyCallback; - GLFWcharfun CharCallback; + GLFWwindowsizefun windowSizeCallback; + GLFWwindowclosefun windowCloseCallback; + GLFWwindowrefreshfun windowRefreshCallback; + GLFWmousebuttonfun mouseButtonCallback; + GLFWmouseposfun mousePosCallback; + GLFWmousewheelfun mouseWheelCallback; + GLFWkeyfun keyCallback; + GLFWcharfun charCallback; // User selected window settings - int Fullscreen; // Fullscreen flag - int MouseLock; // Mouse-lock flag - int AutoPollEvents; // Auto polling flag - int SysKeysDisabled; // System keys disabled flag - int WindowNoResize; // Resize- and maximize gadgets disabled flag + int fullscreen; // Fullscreen flag + int mouseLock; // Mouse-lock flag + int autoPollEvents; // Auto polling flag + int sysKeysDisabled; // System keys disabled flag + int windowNoResize; // Resize- and maximize gadgets disabled flag + int refreshRate; // Vertical monitor refresh rate // Window status & parameters - int Opened; // Flag telling if window is opened or not - int Active; // Application active flag - int Iconified; // Window iconified flag - int Width, Height; // Window width and heigth - int Accelerated; // GL_TRUE if window is HW accelerated - int RedBits; - int GreenBits; - int BlueBits; - int AlphaBits; - int DepthBits; - int StencilBits; - int AccumRedBits; - int AccumGreenBits; - int AccumBlueBits; - int AccumAlphaBits; - int AuxBuffers; - int Stereo; - int RefreshRate; // Vertical monitor refresh rate - int Samples; - - // Extensions & OpenGL version - int Has_GL_SGIS_generate_mipmap; - int Has_GL_ARB_texture_non_power_of_two; - int GLVerMajor,GLVerMinor; + int opened; // Flag telling if window is opened or not + int active; // Application active flag + int iconified; // Window iconified flag + int width, height; // Window width and heigth + int accelerated; // GL_TRUE if window is HW accelerated + + // Framebuffer attributes + int redBits; + int greenBits; + int blueBits; + int alphaBits; + int depthBits; + int stencilBits; + int accumRedBits; + int accumGreenBits; + int accumBlueBits; + int accumAlphaBits; + int auxBuffers; + int stereo; + int samples; + + // OpenGL extensions and context attributes + int has_GL_SGIS_generate_mipmap; + int has_GL_ARB_texture_non_power_of_two; + int glMajor, glMinor, glRevision; + int glForward, glDebug, glProfile; + + PFNGLGETSTRINGIPROC GetStringi; // ========= PLATFORM SPECIFIC PART ====================================== // Platform specific window resources - Window Win; // Window - int Scrn; // Screen ID - XVisualInfo *VI; // Visual - GLXContext CX; // OpenGL rendering context - Atom WMDeleteWindow; // For WM close detection - Atom WMPing; // For WM ping response - XSizeHints *Hints; // WM size hints - - // Platform specific extensions - GLXSWAPINTERVALSGI_T SwapInterval; + Colormap colormap; // Window colormap + Window window; // Window + Window root; // Root window for screen + int screen; // Screen ID + XVisualInfo *visual; // Visual for selected GLXFBConfig + GLXFBConfigID fbconfigID; // ID of selected GLXFBConfig + GLXContext context; // OpenGL rendering context + Atom wmDeleteWindow; // WM_DELETE_WINDOW atom + Atom wmPing; // _NET_WM_PING atom + Atom wmState; // _NET_WM_STATE atom + Atom wmStateFullscreen; // _NET_WM_STATE_FULLSCREEN atom + Atom wmActiveWindow; // _NET_ACTIVE_WINDOW atom + Cursor cursor; // Invisible cursor for hidden cursor + + // GLX extensions + PFNGLXSWAPINTERVALSGIPROC SwapIntervalSGI; + PFNGLXGETFBCONFIGATTRIBSGIXPROC GetFBConfigAttribSGIX; + PFNGLXCHOOSEFBCONFIGSGIXPROC ChooseFBConfigSGIX; + PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC CreateContextWithConfigSGIX; + PFNGLXGETVISUALFROMFBCONFIGSGIXPROC GetVisualFromFBConfigSGIX; + PFNGLXCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB; + GLboolean has_GLX_SGIX_fbconfig; + GLboolean has_GLX_SGI_swap_control; + GLboolean has_GLX_ARB_multisample; + GLboolean has_GLX_ARB_create_context; + GLboolean has_GLX_ARB_create_context_profile; // Various platform specific internal variables - int OverrideRedirect; // True if window is OverrideRedirect - int KeyboardGrabbed; // True if keyboard is currently grabbed - int PointerGrabbed; // True if pointer is currently grabbed - int PointerHidden; // True if pointer is currently hidden - int MapNotifyCount; // Used for during processing - int FocusInCount; // Used for during processing + GLboolean hasEWMH; // True if window manager supports EWMH + GLboolean overrideRedirect; // True if window is OverrideRedirect + GLboolean keyboardGrabbed; // True if keyboard is currently grabbed + GLboolean pointerGrabbed; // True if pointer is currently grabbed + GLboolean pointerHidden; // True if pointer is currently hidden // Screensaver data struct { - int Changed; - int Timeout; - int Interval; - int Blanking; - int Exposure; + int changed; + int timeout; + int interval; + int blanking; + int exposure; } Saver; // Fullscreen data struct { - int ModeChanged; + int modeChanged; #if defined( _GLFW_HAS_XF86VIDMODE ) - XF86VidModeModeInfo OldMode; + XF86VidModeModeInfo oldMode; #endif #if defined( _GLFW_HAS_XRANDR ) - SizeID OldSizeID; - int OldWidth; - int OldHeight; - Rotation OldRotation; + SizeID oldSizeID; + int oldWidth; + int oldHeight; + Rotation oldRotation; #endif } FS; }; @@ -278,33 +362,39 @@ //------------------------------------------------------------------------ GLFWGLOBAL struct { +// ========= PLATFORM INDEPENDENT MANDATORY PART ========================= + + // Window opening hints + _GLFWhints hints; + // ========= PLATFORM SPECIFIC PART ====================================== - Display *Dpy; - int NumScreens; - int DefaultScreen; + Display *display; + + // Server-side GLX version + int glxMajor, glxMinor; struct { - int Available; - int EventBase; - int ErrorBase; + int available; + int eventBase; + int errorBase; } XF86VidMode; struct { - int Available; - int EventBase; - int ErrorBase; + int available; + int eventBase; + int errorBase; } XRandR; // Timer data struct { - double Resolution; - long long t0; + double resolution; + long long t0; } Timer; -#if defined(_GLFW_DLOPEN_LIBGL) +#if defined(_GLFW_HAS_DLOPEN) struct { - void *libGL; // dlopen handle for libGL.so + void *libGL; // dlopen handle for libGL.so } Libs; #endif } _glfwLibrary; @@ -400,9 +490,7 @@ int _glfwGetClosestVideoMode( int screen, int *width, int *height, int *rate ); void _glfwSetVideoModeMODE( int screen, int mode, int rate ); void _glfwSetVideoMode( int screen, int *width, int *height, int *rate ); - -// Cursor handling -Cursor _glfwCreateNULLCursor( Display *display, Window root ); +void _glfwRestoreVideoMode( void ); // Joystick input void _glfwInitJoysticks( void ); diff -Nru glfw-2.6/lib/x11/x11_enable.c glfw-2.7.2/lib/x11/x11_enable.c --- glfw-2.6/lib/x11/x11_enable.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/x11/x11_enable.c 2010-08-29 15:23:49.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: x11_enable.c // Platform: X11 (Unix) -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -36,16 +36,29 @@ //************************************************************************ //======================================================================== -// _glfwPlatformEnableSystemKeys() - Enable system keys -// _glfwPlatformDisableSystemKeys() - Disable system keys +// Enable system keys //======================================================================== void _glfwPlatformEnableSystemKeys( void ) { - // Not supported under X11 (yet) + if( _glfwWin.keyboardGrabbed ) + { + XUngrabKeyboard( _glfwLibrary.display, CurrentTime ); + _glfwWin.keyboardGrabbed = GL_FALSE; + } } +//======================================================================== +// Disable system keys +//======================================================================== + void _glfwPlatformDisableSystemKeys( void ) { - // Not supported under X11 (yet) + if( XGrabKeyboard( _glfwLibrary.display, _glfwWin.window, True, + GrabModeAsync, GrabModeAsync, CurrentTime ) == + GrabSuccess ) + { + _glfwWin.keyboardGrabbed = GL_TRUE; + } } + diff -Nru glfw-2.6/lib/x11/x11_fullscreen.c glfw-2.7.2/lib/x11/x11_fullscreen.c --- glfw-2.6/lib/x11/x11_fullscreen.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/x11/x11_fullscreen.c 2011-05-07 14:09:42.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: x11_fullscreen.c -// Platform: X11 (Unix) -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: X11/GLX +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -30,22 +30,24 @@ #include "internal.h" +#include + //************************************************************************ //**** GLFW internal functions **** //************************************************************************ //======================================================================== -// _glfwBPP2RGB() - Convert BPP to RGB bits (based on "best guess") +// Convert BPP to RGB bits (based on "best guess") //======================================================================== -static void _glfwBPP2RGB( int bpp, int *r, int *g, int *b ) +static void BPP2RGB( int bpp, int *r, int *g, int *b ) { int delta; // Special case: BPP = 32 (I don't think this is necessary for X11??) if( bpp == 32 ) - bpp = 24; + bpp = 24; // Convert "bits per pixel" to red, green & blue sizes *r = *g = *b = bpp / 3; @@ -75,16 +77,16 @@ XRRScreenConfiguration *sc; XRRScreenSize *sizelist; - if( _glfwLibrary.XRandR.Available ) + if( _glfwLibrary.XRandR.available ) { - sc = XRRGetScreenInfo( _glfwLibrary.Dpy, - RootWindow( _glfwLibrary.Dpy, screen ) ); + sc = XRRGetScreenInfo( _glfwLibrary.display, + RootWindow( _glfwLibrary.display, screen ) ); - sizelist = XRRConfigSizes( sc, &sizecount ); + sizelist = XRRConfigSizes( sc, &sizecount ); // Find the best matching mode bestsize = -1; - bestmatch = 999999; + bestmatch = INT_MAX; for( i = 0; i < sizecount; i++ ) { match = (*width - sizelist[i].width) * @@ -98,57 +100,57 @@ } } - if( bestsize != -1 ) - { - // Report width & height of best matching mode - *width = sizelist[bestsize].width; - *height = sizelist[bestsize].height; - - if( *rate > 0 ) - { - ratelist = XRRConfigRates( sc, bestsize, &ratecount ); - - bestrate = -1; - bestmatch = 999999; - for( i = 0; i < ratecount; i++ ) - { - match = abs( ratelist[i] - *rate ); - if( match < bestmatch ) - { - bestmatch = match; - bestrate = ratelist[i]; - } - } - - if( bestrate != -1 ) - { - *rate = bestrate; - } - } - } + if( bestsize != -1 ) + { + // Report width & height of best matching mode + *width = sizelist[bestsize].width; + *height = sizelist[bestsize].height; - // Free modelist - XRRFreeScreenConfigInfo( sc ); + if( *rate > 0 ) + { + ratelist = XRRConfigRates( sc, bestsize, &ratecount ); + + bestrate = -1; + bestmatch = INT_MAX; + for( i = 0; i < ratecount; i++ ) + { + match = abs( ratelist[i] - *rate ); + if( match < bestmatch ) + { + bestmatch = match; + bestrate = ratelist[i]; + } + } + + if( bestrate != -1 ) + { + *rate = bestrate; + } + } + } + + // Free modelist + XRRFreeScreenConfigInfo( sc ); - if( bestsize != -1 ) - { - return bestsize; - } + if( bestsize != -1 ) + { + return bestsize; + } } #elif defined( _GLFW_HAS_XF86VIDMODE ) XF86VidModeModeInfo **modelist; int modecount, i, bestmode, bestmatch, match; // Use the XF86VidMode extension to control video resolution - if( _glfwLibrary.XF86VidMode.Available ) + if( _glfwLibrary.XF86VidMode.available ) { // Get a list of all available display modes - XF86VidModeGetAllModeLines( _glfwLibrary.Dpy, screen, + XF86VidModeGetAllModeLines( _glfwLibrary.display, screen, &modecount, &modelist ); // Find the best matching mode bestmode = -1; - bestmatch = 999999; + bestmatch = INT_MAX; for( i = 0; i < modecount; i++ ) { match = (*width - modelist[i]->hdisplay) * @@ -162,26 +164,26 @@ } } - if( bestmode != -1 ) - { - // Report width & height of best matching mode - *width = modelist[ bestmode ]->hdisplay; - *h = modelist[ bestmode ]->vdisplay; - } + if( bestmode != -1 ) + { + // Report width & height of best matching mode + *width = modelist[ bestmode ]->hdisplay; + *height = modelist[ bestmode ]->vdisplay; + } // Free modelist XFree( modelist ); - if( bestmode != -1 ) - { - return bestmode; - } + if( bestmode != -1 ) + { + return bestmode; + } } #endif // Default: Simply use the screen resolution - *width = DisplayWidth( _glfwLibrary.Dpy, screen ); - *height = DisplayHeight( _glfwLibrary.Dpy, screen ); + *width = DisplayWidth( _glfwLibrary.display, screen ); + *height = DisplayHeight( _glfwLibrary.display, screen ); return 0; } @@ -197,77 +199,77 @@ XRRScreenConfiguration *sc; Window root; - if( _glfwLibrary.XRandR.Available ) + if( _glfwLibrary.XRandR.available ) { - root = RootWindow( _glfwLibrary.Dpy, screen ); - sc = XRRGetScreenInfo( _glfwLibrary.Dpy, root ); + root = RootWindow( _glfwLibrary.display, screen ); + sc = XRRGetScreenInfo( _glfwLibrary.display, root ); // Remember old size and flag that we have changed the mode - if( !_glfwWin.FS.ModeChanged ) + if( !_glfwWin.FS.modeChanged ) { - _glfwWin.FS.OldSizeID = XRRConfigCurrentConfiguration( sc, &_glfwWin.FS.OldRotation ); - _glfwWin.FS.OldWidth = DisplayWidth( _glfwLibrary.Dpy, screen ); - _glfwWin.FS.OldHeight = DisplayHeight( _glfwLibrary.Dpy, screen ); - - _glfwWin.FS.ModeChanged = GL_TRUE; - } - - if( rate > 0 ) - { - // Set desired configuration - XRRSetScreenConfigAndRate( _glfwLibrary.Dpy, - sc, - root, - mode, - RR_Rotate_0, - (short) rate, - CurrentTime ); - } - else - { - // Set desired configuration - XRRSetScreenConfig( _glfwLibrary.Dpy, - sc, - root, - mode, - RR_Rotate_0, - CurrentTime ); - } + _glfwWin.FS.oldSizeID = XRRConfigCurrentConfiguration( sc, &_glfwWin.FS.oldRotation ); + _glfwWin.FS.oldWidth = DisplayWidth( _glfwLibrary.display, screen ); + _glfwWin.FS.oldHeight = DisplayHeight( _glfwLibrary.display, screen ); - XRRFreeScreenConfigInfo( sc ); + _glfwWin.FS.modeChanged = GL_TRUE; + } + + if( rate > 0 ) + { + // Set desired configuration + XRRSetScreenConfigAndRate( _glfwLibrary.display, + sc, + root, + mode, + RR_Rotate_0, + (short) rate, + CurrentTime ); + } + else + { + // Set desired configuration + XRRSetScreenConfig( _glfwLibrary.display, + sc, + root, + mode, + RR_Rotate_0, + CurrentTime ); + } + + XRRFreeScreenConfigInfo( sc ); } #elif defined( _GLFW_HAS_XF86VIDMODE ) XF86VidModeModeInfo **modelist; int modecount; // Use the XF86VidMode extension to control video resolution - if( _glfwLibrary.XF86VidMode.Available ) + if( _glfwLibrary.XF86VidMode.available ) { // Get a list of all available display modes - XF86VidModeGetAllModeLines( _glfwLibrary.Dpy, screen, + XF86VidModeGetAllModeLines( _glfwLibrary.display, screen, &modecount, &modelist ); // Unlock mode switch if necessary - if( _glfwWin.FS.ModeChanged ) + if( _glfwWin.FS.modeChanged ) { - XF86VidModeLockModeSwitch( _glfwLibrary.Dpy, screen, 0 ); + XF86VidModeLockModeSwitch( _glfwLibrary.display, screen, 0 ); } // Change the video mode to the desired mode - XF86VidModeSwitchToMode( _glfwLibrary.Dpy, screen, + XF86VidModeSwitchToMode( _glfwLibrary.display, screen, modelist[ mode ] ); // Set viewport to upper left corner (where our window will be) - XF86VidModeSetViewPort( _glfwLibrary.Dpy, screen, 0, 0 ); + XF86VidModeSetViewPort( _glfwLibrary.display, screen, 0, 0 ); // Lock mode switch - XF86VidModeLockModeSwitch( _glfwLibrary.Dpy, screen, 1 ); + XF86VidModeLockModeSwitch( _glfwLibrary.display, screen, 1 ); // Remember old mode and flag that we have changed the mode - if( !_glfwWin.FS.ModeChanged ) + if( !_glfwWin.FS.modeChanged ) { - _glfwWin.FS.OldMode = *modelist[ 0 ]; - _glfwWin.FS.ModeChanged = GL_TRUE; + _glfwWin.FS.oldMode = *modelist[ 0 ]; + _glfwWin.FS.modeChanged = GL_TRUE; } // Free mode list @@ -293,12 +295,54 @@ } +//======================================================================== +// Restore the previously saved (original) video mode +//======================================================================== + +void _glfwRestoreVideoMode( void ) +{ + if( _glfwWin.FS.modeChanged ) + { +#if defined( _GLFW_HAS_XRANDR ) + if( _glfwLibrary.XRandR.available ) + { + XRRScreenConfiguration *sc; + + sc = XRRGetScreenInfo( _glfwLibrary.display, _glfwWin.root ); + + XRRSetScreenConfig( _glfwLibrary.display, + sc, + _glfwWin.root, + _glfwWin.FS.oldSizeID, + _glfwWin.FS.oldRotation, + CurrentTime ); + + XRRFreeScreenConfigInfo( sc ); + } +#elif defined( _GLFW_HAS_XF86VIDMODE ) + if( _glfwLibrary.XF86VidMode.available ) + { + // Unlock mode switch + XF86VidModeLockModeSwitch( _glfwLibrary.display, _glfwWin.screen, 0 ); + + // Change the video mode back to the old mode + XF86VidModeSwitchToMode( _glfwLibrary.display, + _glfwWin.screen, + &_glfwWin.FS.oldMode ); + } +#endif + _glfwWin.FS.modeChanged = GL_FALSE; + } +} + + //************************************************************************ //**** Platform implementation functions **** //************************************************************************ -struct _glfwResolution { +struct _glfwResolution +{ int width; int height; }; @@ -309,31 +353,31 @@ int _glfwPlatformGetVideoModes( GLFWvidmode *list, int maxcount ) { - int count, k, l, r, g, b, rgba, gl; - int depth, screen; + int count, k, l, r, g, b, rgba, gl; + int depth, screen; Display *dpy; XVisualInfo *vislist, dummy; - int viscount, rgbcount, rescount; - int *rgbarray; + int viscount, rgbcount, rescount; + int *rgbarray; struct _glfwResolution *resarray; #if defined( _GLFW_HAS_XRANDR ) XRRScreenConfiguration *sc; XRRScreenSize *sizelist; - int sizecount; + int sizecount; #elif defined( _GLFW_HAS_XF86VIDMODE ) XF86VidModeModeInfo **modelist; - int modecount, width, height; + int modecount, width, height; #endif // Get display and screen - dpy = _glfwLibrary.Dpy; + dpy = _glfwLibrary.display; screen = DefaultScreen( dpy ); // Get list of visuals vislist = XGetVisualInfo( dpy, 0, &dummy, &viscount ); if( vislist == NULL ) { - return 0; + return 0; } rgbarray = (int*) malloc( sizeof(int) * viscount ); @@ -351,7 +395,7 @@ depth = vislist[k].depth; // Convert to RGB - _glfwBPP2RGB( depth, &r, &g, &b ); + BPP2RGB( depth, &r, &g, &b ); depth = (r<<16) | (g<<8) | b; // Is this mode unique? @@ -375,28 +419,28 @@ // Build resolution array #if defined( _GLFW_HAS_XRANDR ) - if( _glfwLibrary.XRandR.Available ) + if( _glfwLibrary.XRandR.available ) { - sc = XRRGetScreenInfo( dpy, RootWindow( dpy, screen ) ); - sizelist = XRRConfigSizes( sc, &sizecount ); + sc = XRRGetScreenInfo( dpy, RootWindow( dpy, screen ) ); + sizelist = XRRConfigSizes( sc, &sizecount ); - resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * sizecount ); + resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * sizecount ); for( k = 0; k < sizecount; k++ ) { - resarray[ rescount ].width = sizelist[ k ].width; - resarray[ rescount ].height = sizelist[ k ].height; - rescount++; + resarray[ rescount ].width = sizelist[ k ].width; + resarray[ rescount ].height = sizelist[ k ].height; + rescount++; } - XRRFreeScreenConfigInfo( sc ); + XRRFreeScreenConfigInfo( sc ); } #elif defined( _GLFW_HAS_XF86VIDMODE ) - if( _glfwLibrary.XF86VidMode.Available ) + if( _glfwLibrary.XF86VidMode.available ) { XF86VidModeGetAllModeLines( dpy, screen, &modecount, &modelist ); - resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * modecount ); + resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * modecount ); for( k = 0; k < modecount; k++ ) { @@ -411,6 +455,7 @@ break; } } + if( l >= rescount ) { resarray[ rescount ].width = width; @@ -419,17 +464,17 @@ } } - XFree( modelist ); + XFree( modelist ); } #endif if( !resarray ) { - rescount = 1; - resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * rescount ); + rescount = 1; + resarray = (struct _glfwResolution*) malloc( sizeof(struct _glfwResolution) * rescount ); - resarray[ 0 ].width = DisplayWidth( dpy, screen ); - resarray[ 0 ].height = DisplayHeight( dpy, screen ); + resarray[ 0 ].width = DisplayWidth( dpy, screen ); + resarray[ 0 ].height = DisplayHeight( dpy, screen ); } // Build permutations of colors and resolutions @@ -471,33 +516,33 @@ #endif // Get display and screen - dpy = _glfwLibrary.Dpy; + dpy = _glfwLibrary.display; screen = DefaultScreen( dpy ); // Get display depth bpp = DefaultDepth( dpy, screen ); // Convert BPP to RGB bits - _glfwBPP2RGB( bpp, &mode->RedBits, &mode->GreenBits, &mode->BlueBits ); + BPP2RGB( bpp, &mode->RedBits, &mode->GreenBits, &mode->BlueBits ); #if defined( _GLFW_HAS_XRANDR ) - if( _glfwLibrary.XRandR.Available ) + if( _glfwLibrary.XRandR.available ) { - if( _glfwWin.FS.ModeChanged ) + if( _glfwWin.FS.modeChanged ) { - mode->Width = _glfwWin.FS.OldWidth; - mode->Height = _glfwWin.FS.OldHeight; - return; - } + mode->Width = _glfwWin.FS.oldWidth; + mode->Height = _glfwWin.FS.oldHeight; + return; + } } #elif defined( _GLFW_HAS_XF86VIDMODE ) - if( _glfwLibrary.XF86VidMode.Available ) + if( _glfwLibrary.XF86VidMode.available ) { - if( _glfwWin.FS.ModeChanged ) + if( _glfwWin.FS.modeChanged ) { - // The old (desktop) mode is stored in _glfwWin.FS.OldMode - mode->Width = _glfwWin.FS.OldMode.hdisplay; - mode->Height = _glfwWin.FS.OldMode.vdisplay; + // The old (desktop) mode is stored in _glfwWin.FS.oldMode + mode->Width = _glfwWin.FS.oldMode.hdisplay; + mode->Height = _glfwWin.FS.oldMode.vdisplay; } else { @@ -513,7 +558,7 @@ XFree( modelist ); } - return; + return; } #endif diff -Nru glfw-2.6/lib/x11/x11_glext.c glfw-2.7.2/lib/x11/x11_glext.c --- glfw-2.6/lib/x11/x11_glext.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/x11/x11_glext.c 2011-06-28 03:02:46.000000000 +0000 @@ -1,11 +1,11 @@ -//======================================================================== +//================== // GLFW - An OpenGL framework -// File: x11_glext.c -// Platform: X11 (Unix) -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: X11/GLX +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -31,6 +31,26 @@ #include "internal.h" +void (*glXGetProcAddress(const GLubyte *procName))(); +void (*glXGetProcAddressARB(const GLubyte *procName))(); +void (*glXGetProcAddressEXT(const GLubyte *procName))(); + +// We support four different ways for getting addresses for GL/GLX +// extension functions: glXGetProcAddress, glXGetProcAddressARB, +// glXGetProcAddressEXT, and dlsym +#if defined( _GLFW_HAS_GLXGETPROCADDRESSARB ) + #define _glfw_glXGetProcAddress(x) glXGetProcAddressARB(x) +#elif defined( _GLFW_HAS_GLXGETPROCADDRESS ) + #define _glfw_glXGetProcAddress(x) glXGetProcAddress(x) +#elif defined( _GLFW_HAS_GLXGETPROCADDRESSEXT ) + #define _glfw_glXGetProcAddress(x) glXGetProcAddressEXT(x) +#elif defined( _GLFW_HAS_DLOPEN ) + #define _glfw_glXGetProcAddress(x) dlsym(_glfwLibrary.Libs.libGL,x) +#else +#define _glfw_glXGetProcAddress(x) NULL +#endif + + //************************************************************************ //**** Platform implementation functions **** //************************************************************************ @@ -44,8 +64,8 @@ const GLubyte *extensions; // Get list of GLX extensions - extensions = (const GLubyte*) glXQueryExtensionsString( _glfwLibrary.Dpy, - _glfwWin.Scrn ); + extensions = (const GLubyte*) glXQueryExtensionsString( _glfwLibrary.display, + _glfwWin.screen ); if( extensions != NULL ) { if( _glfwStringInExtensionString( extension, extensions ) ) diff -Nru glfw-2.6/lib/x11/x11_init.c glfw-2.7.2/lib/x11/x11_init.c --- glfw-2.6/lib/x11/x11_init.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/x11/x11_init.c 2010-08-08 15:37:03.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: x11_init.c -// Platform: X11 (Unix) -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: X11/GLX +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -40,7 +40,7 @@ // Initialize GLFW thread package //======================================================================== -static void _glfwInitThreads( void ) +static void initThreads( void ) { // Initialize critical section handle #ifdef _GLFW_HAS_PTHREAD @@ -65,7 +65,7 @@ // Terminate GLFW thread package //======================================================================== -static void _glfwTerminateThreads( void ) +static void terminateThreads( void ) { #ifdef _GLFW_HAS_PTHREAD @@ -106,29 +106,26 @@ // Dynamically load libraries //======================================================================== -#ifdef _GLFW_DLOPEN_LIBGL -static char * _glfw_libGL_name[ ] = -{ - "libGL.so", - "libGL.so.1", - "/usr/lib/libGL.so", - "/usr/lib/libGL.so.1", - NULL -}; -#endif - -static void _glfwInitLibraries( void ) +static void initLibraries( void ) { #ifdef _GLFW_DLOPEN_LIBGL int i; + char *libGL_names[ ] = + { + "libGL.so", + "libGL.so.1", + "/usr/lib/libGL.so", + "/usr/lib/libGL.so.1", + NULL + }; _glfwLibrary.Libs.libGL = NULL; - for( i = 0; !_glfw_libGL_name[ i ] != NULL; i ++ ) + for( i = 0; !libGL_names[ i ] != NULL; i ++ ) { - _glfwLibrary.Libs.libGL = dlopen( _glfw_libGL_name[ i ], + _glfwLibrary.Libs.libGL = dlopen( libGL_names[ i ], RTLD_LAZY | RTLD_GLOBAL ); - if( _glfwLibrary.Libs.libGL ) - break; + if( _glfwLibrary.Libs.libGL ) + break; } #endif } @@ -138,7 +135,7 @@ // Terminate GLFW when exiting application //======================================================================== -void _glfwTerminate_atexit( void ) +static void glfw_atexit( void ) { glfwTerminate(); } @@ -148,40 +145,54 @@ // Initialize X11 display //======================================================================== -static int _glfwInitDisplay( void ) +static int initDisplay( void ) { // Open display - _glfwLibrary.Dpy = XOpenDisplay( 0 ); - if( !_glfwLibrary.Dpy ) + _glfwLibrary.display = XOpenDisplay( 0 ); + if( !_glfwLibrary.display ) { + fprintf(stderr, "Failed to open X display\n"); return GL_FALSE; } - // Check screens - _glfwLibrary.NumScreens = ScreenCount( _glfwLibrary.Dpy ); - _glfwLibrary.DefaultScreen = DefaultScreen( _glfwLibrary.Dpy ); - // Check for XF86VidMode extension #ifdef _GLFW_HAS_XF86VIDMODE - _glfwLibrary.XF86VidMode.Available = - XF86VidModeQueryExtension( _glfwLibrary.Dpy, - &_glfwLibrary.XF86VidMode.EventBase, - &_glfwLibrary.XF86VidMode.ErrorBase); + _glfwLibrary.XF86VidMode.available = + XF86VidModeQueryExtension( _glfwLibrary.display, + &_glfwLibrary.XF86VidMode.eventBase, + &_glfwLibrary.XF86VidMode.errorBase); #else - _glfwLibrary.XF86VidMode.Available = 0; + _glfwLibrary.XF86VidMode.available = 0; #endif // Check for XRandR extension #ifdef _GLFW_HAS_XRANDR - _glfwLibrary.XRandR.Available = - XRRQueryExtension( _glfwLibrary.Dpy, - &_glfwLibrary.XRandR.EventBase, - &_glfwLibrary.XRandR.ErrorBase ); + _glfwLibrary.XRandR.available = + XRRQueryExtension( _glfwLibrary.display, + &_glfwLibrary.XRandR.eventBase, + &_glfwLibrary.XRandR.errorBase ); #else - _glfwLibrary.XRandR.Available = 0; + _glfwLibrary.XRandR.available = 0; #endif - return GL_TRUE; + // Fullscreen & screen saver settings + // Check if GLX is supported on this display + if( !glXQueryExtension( _glfwLibrary.display, NULL, NULL ) ) + { + fprintf(stderr, "GLX not supported\n"); + return GL_FALSE; + } + + // Retrieve GLX version + if( !glXQueryVersion( _glfwLibrary.display, + &_glfwLibrary.glxMajor, + &_glfwLibrary.glxMinor ) ) + { + fprintf(stderr, "Unable to query GLX version\n"); + return GL_FALSE; + } + + return GL_TRUE; } @@ -189,13 +200,13 @@ // Terminate X11 display //======================================================================== -static void _glfwTerminateDisplay( void ) +static void terminateDisplay( void ) { // Open display - if( _glfwLibrary.Dpy ) + if( _glfwLibrary.display ) { - XCloseDisplay( _glfwLibrary.Dpy ); - _glfwLibrary.Dpy = NULL; + XCloseDisplay( _glfwLibrary.display ); + _glfwLibrary.display = NULL; } } @@ -211,19 +222,19 @@ int _glfwPlatformInit( void ) { // Initialize display - if( !_glfwInitDisplay() ) + if( !initDisplay() ) { return GL_FALSE; } // Initialize thread package - _glfwInitThreads(); + initThreads(); // Try to load libGL.so if necessary - _glfwInitLibraries(); + initLibraries(); // Install atexit() routine - atexit( _glfwTerminate_atexit ); + atexit( glfw_atexit ); // Initialize joysticks _glfwInitJoysticks(); @@ -253,10 +264,10 @@ glfwCloseWindow(); // Kill thread package - _glfwTerminateThreads(); + terminateThreads(); // Terminate display - _glfwTerminateDisplay(); + terminateDisplay(); // Terminate joysticks _glfwTerminateJoysticks(); diff -Nru glfw-2.6/lib/x11/x11_joystick.c glfw-2.7.2/lib/x11/x11_joystick.c --- glfw-2.6/lib/x11/x11_joystick.c 2007-05-25 09:56:36.000000000 +0000 +++ glfw-2.7.2/lib/x11/x11_joystick.c 2011-06-20 12:36:50.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: x11_joystick.c -// Platform: X11 (Unix) -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: X11/GLX +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -36,11 +36,6 @@ // systems will behave as if there are no joysticks connected. //======================================================================== -#ifdef linux -#define _GLFW_USE_LINUX_JOYSTICKS -#endif // linux - - //************************************************************************ //**** GLFW internal functions **** @@ -79,7 +74,7 @@ //======================================================================== -// _glfwInitJoysticks() - Initialize joystick interface +// Initialize joystick interface //======================================================================== void _glfwInitJoysticks( void ) @@ -126,7 +121,7 @@ { // Remember fd _glfwJoy[ joy_count ].fd = fd; - + // Check that the joystick driver version is 1.0+ ioctl( fd, JSIOCGVERSION, &driver_version ); if( driver_version < 0x010000 ) @@ -135,15 +130,15 @@ close( fd ); continue; } - + // Get number of joystick axes ioctl( fd, JSIOCGAXES, &ret_data ); _glfwJoy[ joy_count ].NumAxes = (int) ret_data; - + // Get number of joystick buttons ioctl( fd, JSIOCGBUTTONS, &ret_data ); _glfwJoy[ joy_count ].NumButtons = (int) ret_data; - + // Allocate memory for joystick state _glfwJoy[ joy_count ].Axis = (float *) malloc( sizeof(float) * @@ -154,7 +149,7 @@ continue; } _glfwJoy[ joy_count ].Button = - (char *) malloc( sizeof(char) * + (unsigned char *) malloc( sizeof(char) * _glfwJoy[ joy_count ].NumButtons ); if( _glfwJoy[ joy_count ].Button == NULL ) { @@ -172,7 +167,7 @@ { _glfwJoy[ joy_count ].Button[ n ] = GLFW_RELEASE; } - + // The joystick is supported and connected _glfwJoy[ joy_count ].Present = GL_TRUE; joy_count ++; @@ -186,7 +181,7 @@ //======================================================================== -// _glfwTerminateJoysticks() - Close all opened joystick handles +// Close all opened joystick handles //======================================================================== void _glfwTerminateJoysticks( void ) @@ -214,16 +209,16 @@ //======================================================================== -// _glfwPollJoystickEvents() - Empty joystick event queue +// Empty joystick event queue //======================================================================== -static void _glfwPollJoystickEvents( void ) +static void pollJoystickEvents( void ) { #ifdef _GLFW_USE_LINUX_JOYSTICKS struct js_event e; - int i; + int i; // Get joystick events for all GLFW joysticks for( i = 0; i <= GLFW_JOYSTICK_LAST; ++ i ) @@ -274,7 +269,7 @@ //************************************************************************ //======================================================================== -// _glfwPlatformGetJoystickParam() - Determine joystick capabilities +// Determine joystick capabilities //======================================================================== int _glfwPlatformGetJoystickParam( int joy, int param ) @@ -305,12 +300,12 @@ //======================================================================== -// _glfwPlatformGetJoystickPos() - Get joystick axis positions +// Get joystick axis positions //======================================================================== int _glfwPlatformGetJoystickPos( int joy, float *pos, int numaxes ) { - int i; + int i; // Is joystick present? if( !_glfwJoy[ joy ].Present ) @@ -319,7 +314,7 @@ } // Update joystick state - _glfwPollJoystickEvents(); + pollJoystickEvents(); // Does the joystick support less axes than requested? if( _glfwJoy[ joy ].NumAxes < numaxes ) @@ -338,13 +333,13 @@ //======================================================================== -// _glfwPlatformGetJoystickButtons() - Get joystick button states +// Get joystick button states //======================================================================== int _glfwPlatformGetJoystickButtons( int joy, unsigned char *buttons, int numbuttons ) { - int i; + int i; // Is joystick present? if( !_glfwJoy[ joy ].Present ) @@ -353,7 +348,7 @@ } // Update joystick state - _glfwPollJoystickEvents(); + pollJoystickEvents(); // Does the joystick support less buttons than requested? if( _glfwJoy[ joy ].NumButtons < numbuttons ) @@ -369,3 +364,4 @@ return numbuttons; } + diff -Nru glfw-2.6/lib/x11/x11_keysym2unicode.c glfw-2.7.2/lib/x11/x11_keysym2unicode.c --- glfw-2.6/lib/x11/x11_keysym2unicode.c 2007-06-23 00:27:10.000000000 +0000 +++ glfw-2.7.2/lib/x11/x11_keysym2unicode.c 2011-06-20 12:36:50.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: x11_keysym2unicode.c -// Platform: X11 (Unix) -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: X11/GLX +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -828,8 +828,8 @@ { 0x13bc, 0x0152 }, { 0x13bd, 0x0153 }, { 0x13be, 0x0178 }, - { 0x20ac, 0x20ac }, - // Numeric keypad with numlock on + { 0x20ac, 0x20ac }, + // Numeric keypad with numlock on { XK_KP_Space, ' ' }, { XK_KP_Equal, '=' }, { XK_KP_Multiply, '*' }, @@ -838,16 +838,16 @@ { XK_KP_Subtract, '-' }, { XK_KP_Decimal, '.' }, { XK_KP_Divide, '/' }, - { XK_KP_0, 0x0030 }, - { XK_KP_1, 0x0031 }, - { XK_KP_2, 0x0032 }, - { XK_KP_3, 0x0033 }, - { XK_KP_4, 0x0034 }, - { XK_KP_5, 0x0035 }, - { XK_KP_6, 0x0036 }, - { XK_KP_7, 0x0037 }, - { XK_KP_8, 0x0038 }, - { XK_KP_9, 0x0039 } + { XK_KP_0, 0x0030 }, + { XK_KP_1, 0x0031 }, + { XK_KP_2, 0x0032 }, + { XK_KP_3, 0x0033 }, + { XK_KP_4, 0x0034 }, + { XK_KP_5, 0x0035 }, + { XK_KP_6, 0x0036 }, + { XK_KP_7, 0x0037 }, + { XK_KP_8, 0x0038 }, + { XK_KP_9, 0x0039 } }; @@ -856,7 +856,7 @@ //************************************************************************ //======================================================================== -// _glfwKeySym2Unicode() - Convert X11 KeySym to Unicode +// Convert X11 KeySym to Unicode //======================================================================== long _glfwKeySym2Unicode( KeySym keysym ) @@ -868,8 +868,7 @@ /* First check for Latin-1 characters (1:1 mapping) */ if( (keysym >= 0x0020 && keysym <= 0x007e) || (keysym >= 0x00a0 && keysym <= 0x00ff) ) - { - return keysym; + { return keysym; } /* Also check for directly encoded 24-bit UCS characters */ diff -Nru glfw-2.6/lib/x11/x11_thread.c glfw-2.7.2/lib/x11/x11_thread.c --- glfw-2.6/lib/x11/x11_thread.c 2007-05-25 09:56:37.000000000 +0000 +++ glfw-2.7.2/lib/x11/x11_thread.c 2011-06-20 12:36:50.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: x11_thread.c -// Platform: X11 (Unix) -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: X11/GLX +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -39,8 +39,7 @@ #ifdef _GLFW_HAS_PTHREAD //======================================================================== -// _glfwNewThread() - This is simply a "wrapper" for calling the user -// thread function. +// This is simply a "wrapper" for calling the user thread function. //======================================================================== void * _glfwNewThread( void * arg ) @@ -97,7 +96,7 @@ //************************************************************************ //======================================================================== -// _glfwPlatformCreateThread() - Create a new thread +// Create a new thread //======================================================================== GLFWthread _glfwPlatformCreateThread( GLFWthreadfun fun, void *arg ) @@ -161,9 +160,8 @@ //======================================================================== -// _glfwPlatformDestroyThread() - Kill a thread. NOTE: THIS IS A VERY -// DANGEROUS OPERATION, AND SHOULD NOT BE USED EXCEPT IN EXTREME -// SITUATIONS! +// Kill a thread. NOTE: THIS IS A VERY DANGEROUS OPERATION, AND SHOULD NOT +// BE USED EXCEPT IN EXTREME SITUATIONS! //======================================================================== void _glfwPlatformDestroyThread( GLFWthread ID ) @@ -197,7 +195,7 @@ //======================================================================== -// _glfwPlatformWaitThread() - Wait for a thread to die +// Wait for a thread to die //======================================================================== int _glfwPlatformWaitThread( GLFWthread ID, int waitmode ) @@ -247,8 +245,7 @@ //======================================================================== -// _glfwPlatformGetThreadID() - Return the thread ID for the current -// thread +// Return the thread ID for the current thread //======================================================================== GLFWthread _glfwPlatformGetThreadID( void ) @@ -291,7 +288,7 @@ //======================================================================== -// _glfwPlatformCreateMutex() - Create a mutual exclusion object +// Create a mutual exclusion object //======================================================================== GLFWmutex _glfwPlatformCreateMutex( void ) @@ -322,7 +319,7 @@ //======================================================================== -// _glfwPlatformDestroyMutex() - Destroy a mutual exclusion object +// Destroy a mutual exclusion object //======================================================================== void _glfwPlatformDestroyMutex( GLFWmutex mutex ) @@ -340,7 +337,7 @@ //======================================================================== -// _glfwPlatformLockMutex() - Request access to a mutex +// Request access to a mutex //======================================================================== void _glfwPlatformLockMutex( GLFWmutex mutex ) @@ -355,7 +352,7 @@ //======================================================================== -// _glfwPlatformUnlockMutex() - Release a mutex +// Release a mutex //======================================================================== void _glfwPlatformUnlockMutex( GLFWmutex mutex ) @@ -370,7 +367,7 @@ //======================================================================== -// _glfwPlatformCreateCond() - Create a new condition variable object +// Create a new condition variable object //======================================================================== GLFWcond _glfwPlatformCreateCond( void ) @@ -401,7 +398,7 @@ //======================================================================== -// _glfwPlatformDestroyCond() - Destroy a condition variable object +// Destroy a condition variable object //======================================================================== void _glfwPlatformDestroyCond( GLFWcond cond ) @@ -419,7 +416,7 @@ //======================================================================== -// _glfwPlatformWaitCond() - Wait for a condition to be raised +// Wait for a condition to be raised //======================================================================== void _glfwPlatformWaitCond( GLFWcond cond, GLFWmutex mutex, @@ -462,7 +459,7 @@ //======================================================================== -// _glfwPlatformSignalCond() - Signal a condition to one waiting thread +// Signal a condition to one waiting thread //======================================================================== void _glfwPlatformSignalCond( GLFWcond cond ) @@ -477,8 +474,7 @@ //======================================================================== -// _glfwPlatformBroadcastCond() - Broadcast a condition to all waiting -// threads +// Broadcast a condition to all waiting threads //======================================================================== void _glfwPlatformBroadcastCond( GLFWcond cond ) @@ -493,8 +489,7 @@ //======================================================================== -// _glfwPlatformGetNumberOfProcessors() - Return the number of processors -// in the system. +// Return the number of processors in the system. //======================================================================== int _glfwPlatformGetNumberOfProcessors( void ) @@ -505,3 +500,4 @@ _glfw_numprocessors( n ); return n; } + diff -Nru glfw-2.6/lib/x11/x11_time.c glfw-2.7.2/lib/x11/x11_time.c --- glfw-2.6/lib/x11/x11_time.c 2007-05-25 09:56:37.000000000 +0000 +++ glfw-2.7.2/lib/x11/x11_time.c 2010-08-08 15:37:03.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: x11_time.c -// Platform: X11 (Unix) -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: X11/GLX +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -40,7 +40,7 @@ struct timeval tv; // "Resolution" is 1 us - _glfwLibrary.Timer.Resolution = 1e-6; + _glfwLibrary.Timer.resolution = 1e-6; // Set start-time for timer gettimeofday( &tv, NULL ); @@ -66,7 +66,7 @@ t = (long long) tv.tv_sec * (long long) 1000000 + (long long) tv.tv_usec; - return (double)(t - _glfwLibrary.Timer.t0) * _glfwLibrary.Timer.Resolution; + return (double)(t - _glfwLibrary.Timer.t0) * _glfwLibrary.Timer.resolution; } @@ -84,7 +84,7 @@ (long long) tv.tv_usec; // Calulate new starting time - _glfwLibrary.Timer.t0 = t0 - (long long)(t/_glfwLibrary.Timer.Resolution); + _glfwLibrary.Timer.t0 = t0 - (long long)(t/_glfwLibrary.Timer.resolution); } diff -Nru glfw-2.6/lib/x11/x11_window.c glfw-2.7.2/lib/x11/x11_window.c --- glfw-2.6/lib/x11/x11_window.c 2007-05-25 09:56:37.000000000 +0000 +++ glfw-2.7.2/lib/x11/x11_window.c 2011-05-07 14:31:42.000000000 +0000 @@ -1,11 +1,11 @@ //======================================================================== // GLFW - An OpenGL framework -// File: x11_window.c -// Platform: X11 (Unix) -// API version: 2.6 -// WWW: http://glfw.sourceforge.net +// Platform: X11/GLX +// API version: 2.7 +// WWW: http://www.glfw.org/ //------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -30,26 +30,21 @@ #include "internal.h" +#include -/* Defines some GLX FSAA tokens if not yet defined */ -#ifndef GLX_SAMPLE_BUFFERS -# define GLX_SAMPLE_BUFFERS 100000 -#endif -#ifndef GLX_SAMPLES -# define GLX_SAMPLES 100001 -#endif - - -/* KDE decoration values */ -enum { - KDE_noDecoration = 0, - KDE_normalDecoration = 1, - KDE_tinyDecoration = 2, - KDE_noFocus = 256, - KDE_standaloneMenuBar = 512, - KDE_desktopIcon = 1024 , - KDE_staysOnTop = 2048 -}; + +/* Define GLX 1.4 FSAA tokens if not already defined */ +#ifndef GLX_VERSION_1_4 + +#define GLX_SAMPLE_BUFFERS 100000 +#define GLX_SAMPLES 100001 + +#endif /*GLX_VERSION_1_4*/ + +// Action for EWMH client messages +#define _NET_WM_STATE_REMOVE 0 +#define _NET_WM_STATE_ADD 1 +#define _NET_WM_STATE_TOGGLE 2 //************************************************************************ @@ -57,397 +52,190 @@ //************************************************************************ //======================================================================== -// _glfwWaitForMapNotify() +// Error handler for BadMatch errors when requesting context with +// unavailable OpenGL versions using the GLX_ARB_create_context extension //======================================================================== -Bool _glfwWaitForMapNotify( Display *d, XEvent *e, char *arg ) +static int errorHandler( Display *display, XErrorEvent *event ) { - return (e->type == MapNotify) && (e->xmap.window == (Window)arg); + return 0; } //======================================================================== -// _glfwWaitForUnmapNotify() +// Checks whether the event is a MapNotify for the specified window //======================================================================== -Bool _glfwWaitForUnmapNotify( Display *d, XEvent *e, char *arg ) +static Bool isMapNotify( Display *d, XEvent *e, char *arg ) { - return (e->type == UnmapNotify) && (e->xmap.window == (Window)arg); + return (e->type == MapNotify) && (e->xmap.window == (Window)arg); } //======================================================================== -// _glfwDisableDecorations() - Turn off window decorations -// Based on xawdecode: src/wmhooks.c +// Retrieve a single window property of the specified type +// Inspired by fghGetWindowProperty from freeglut //======================================================================== -#define MWM_HINTS_DECORATIONS (1L << 1) - -static void _glfwDisableDecorations( void ) +static unsigned long getWindowProperty( Window window, + Atom property, + Atom type, + unsigned char** value ) { - int RemovedDecorations; - Atom HintAtom; - XSetWindowAttributes attributes; - - RemovedDecorations = 0; - - // First try to set MWM hints - HintAtom = XInternAtom( _glfwLibrary.Dpy, "_MOTIF_WM_HINTS", True ); - if ( HintAtom != None ) - { - struct { - unsigned long flags; - unsigned long functions; - unsigned long decorations; - long input_mode; - unsigned long status; - } MWMHints = { MWM_HINTS_DECORATIONS, 0, 0, 0, 0 }; - - XChangeProperty( _glfwLibrary.Dpy, _glfwWin.Win, HintAtom, HintAtom, - 32, PropModeReplace, (unsigned char *)&MWMHints, - sizeof(MWMHints)/4 ); - RemovedDecorations = 1; - } - - // Now try to set KWM hints - HintAtom = XInternAtom( _glfwLibrary.Dpy, "KWM_WIN_DECORATION", True ); - if ( HintAtom != None ) - { - long KWMHints = KDE_tinyDecoration; + Atom actualType; + int actualFormat; + unsigned long itemCount, bytesAfter; - XChangeProperty( _glfwLibrary.Dpy, _glfwWin.Win, HintAtom, HintAtom, - 32, PropModeReplace, (unsigned char *)&KWMHints, - sizeof(KWMHints)/4 ); - RemovedDecorations = 1; - } + XGetWindowProperty( _glfwLibrary.display, + window, + property, + 0, + LONG_MAX, + False, + type, + &actualType, + &actualFormat, + &itemCount, + &bytesAfter, + value ); - // Now try to set GNOME hints - HintAtom = XInternAtom(_glfwLibrary.Dpy, "_WIN_HINTS", True ); - if ( HintAtom != None ) + if( actualType != type ) { - long GNOMEHints = 0; - - XChangeProperty( _glfwLibrary.Dpy, _glfwWin.Win, HintAtom, HintAtom, - 32, PropModeReplace, (unsigned char *)&GNOMEHints, - sizeof(GNOMEHints)/4 ); - RemovedDecorations = 1; + return 0; } - // Now try to set KDE NET_WM hints - HintAtom = XInternAtom( _glfwLibrary.Dpy, "_NET_WM_WINDOW_TYPE", True ); - if ( HintAtom != None ) - { - Atom NET_WMHints[2]; + return itemCount; +} - NET_WMHints[0] = XInternAtom( _glfwLibrary.Dpy, "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE", True ); - /* define a fallback... */ - NET_WMHints[1] = XInternAtom( _glfwLibrary.Dpy, "_NET_WM_WINDOW_TYPE_NORMAL", True ); - XChangeProperty( _glfwLibrary.Dpy, _glfwWin.Win, HintAtom, XA_ATOM, - 32, PropModeReplace, (unsigned char *)&NET_WMHints, - 2 ); - RemovedDecorations = 1; - } +//======================================================================== +// Check whether the specified atom is supported +//======================================================================== - // Set ICCCM fullscreen WM hint - HintAtom = XInternAtom( _glfwLibrary.Dpy, "_NET_WM_STATE", True ); - if ( HintAtom != None ) +static Atom getSupportedAtom( Atom* supportedAtoms, + unsigned long atomCount, + const char* atomName ) +{ + Atom atom = XInternAtom( _glfwLibrary.display, atomName, True ); + if( atom != None ) { - Atom NET_WMHints[1]; - - NET_WMHints[0] = XInternAtom( _glfwLibrary.Dpy, "_NET_WM_STATE_FULLSCREEN", True ); + unsigned long i; - XChangeProperty( _glfwLibrary.Dpy, _glfwWin.Win, HintAtom, XA_ATOM, - 32, PropModeReplace, (unsigned char *)&NET_WMHints, 1 ); + for( i = 0; i < atomCount; i++ ) + { + if( supportedAtoms[i] == atom ) + { + return atom; + } + } } - - // Did we sucessfully remove the window decorations? - if( RemovedDecorations ) - { - // Finally set the transient hints - XSetTransientForHint( _glfwLibrary.Dpy, _glfwWin.Win, RootWindow(_glfwLibrary.Dpy, _glfwWin.Scrn) ); - XUnmapWindow( _glfwLibrary.Dpy, _glfwWin.Win ); - XMapWindow( _glfwLibrary.Dpy, _glfwWin.Win ); - } - else - { - // The Butcher way of removing window decorations - attributes.override_redirect = True; - XChangeWindowAttributes( _glfwLibrary.Dpy, _glfwWin.Win, - CWOverrideRedirect, &attributes ); - _glfwWin.OverrideRedirect = GL_TRUE; - } + return None; } //======================================================================== -// _glfwEnableDecorations() - Turn on window decorations +// Check whether the running window manager is EWMH-compliant //======================================================================== -static void _glfwEnableDecorations( void ) +static GLboolean checkForEWMH( void ) { - int ActivatedDecorations; - Atom HintAtom; - - // If this is an override redirect window, skip it... - if( _glfwWin.OverrideRedirect ) - { - return; - } + Window *windowFromRoot = NULL; + Window *windowFromChild = NULL; - ActivatedDecorations = 0; + // Hey kids; let's see if the window manager supports EWMH! - // First try to unset MWM hints - HintAtom = XInternAtom( _glfwLibrary.Dpy, "_MOTIF_WM_HINTS", True ); - if ( HintAtom != None ) + // First we need a couple of atoms, which should already be there + Atom supportingWmCheck = XInternAtom( _glfwLibrary.display, + "_NET_SUPPORTING_WM_CHECK", + True ); + Atom wmSupported = XInternAtom( _glfwLibrary.display, + "_NET_SUPPORTED", + True ); + if( supportingWmCheck == None || wmSupported == None ) { - XDeleteProperty( _glfwLibrary.Dpy, _glfwWin.Win, HintAtom ); - ActivatedDecorations = 1; + return GL_FALSE; } - // Now try to unset KWM hints - HintAtom = XInternAtom( _glfwLibrary.Dpy, "KWM_WIN_DECORATION", True ); - if ( HintAtom != None ) + // Then we look for the _NET_SUPPORTING_WM_CHECK property of the root window + if( getWindowProperty( _glfwWin.root, + supportingWmCheck, + XA_WINDOW, + (unsigned char**) &windowFromRoot ) != 1 ) { - XDeleteProperty( _glfwLibrary.Dpy, _glfwWin.Win, HintAtom ); - ActivatedDecorations = 1; + XFree( windowFromRoot ); + return GL_FALSE; } - // Now try to unset GNOME hints - HintAtom = XInternAtom( _glfwLibrary.Dpy, "_WIN_HINTS", True ); - if ( HintAtom != None ) + // It should be the ID of a child window (of the root) + // Then we look for the same property on the child window + if( getWindowProperty( *windowFromRoot, + supportingWmCheck, + XA_WINDOW, + (unsigned char**) &windowFromChild ) != 1 ) { - XDeleteProperty( _glfwLibrary.Dpy, _glfwWin.Win, HintAtom ); - ActivatedDecorations = 1; + XFree( windowFromRoot ); + XFree( windowFromChild ); + return GL_FALSE; } - // Now try to unset NET_WM hints - HintAtom = XInternAtom( _glfwLibrary.Dpy, "_NET_WM_WINDOW_TYPE", True ); - if ( HintAtom != None ) + // It should be the ID of that same child window + if( *windowFromRoot != *windowFromChild ) { - Atom NET_WMHints = XInternAtom( _glfwLibrary.Dpy, "_NET_WM_WINDOW_TYPE_NORMAL", True); - if( NET_WMHints != None ) - { - XChangeProperty( _glfwLibrary.Dpy, _glfwWin.Win, - HintAtom, XA_ATOM, 32, PropModeReplace, - (unsigned char *)&NET_WMHints, 1 ); - ActivatedDecorations = 1; - } + XFree( windowFromRoot ); + XFree( windowFromChild ); + return GL_FALSE; } - // Finally unset the transient hints if necessary - if( ActivatedDecorations ) - { - // NOTE: Does this work? - XSetTransientForHint( _glfwLibrary.Dpy, _glfwWin.Win, None); - XUnmapWindow( _glfwLibrary.Dpy, _glfwWin.Win ); - XMapWindow( _glfwLibrary.Dpy, _glfwWin.Win ); - } -} + XFree( windowFromRoot ); + XFree( windowFromChild ); + // We are now fairly sure that an EWMH-compliant window manager is running -//======================================================================== -// _glfwChooseVisual() - We do our own function here, since -// glXChooseVisual does not behave as we want it to (not according to the -// GLFW specs) -//======================================================================== + Atom *supportedAtoms; + unsigned long atomCount; -XVisualInfo * _glfwChooseVisual( Display *Dpy, int Screen, int r, int g, - int b, int a, int d, int s, int ar, int ag, int ab, int aa, int aux, - int fsaa, int stereo) -{ - XVisualInfo *VI, *VI_list, VI_tmp; - int nitems_return, i; - int vi_gl, vi_rgba, vi_double, vi_stereo; - int vi_r, vi_g, vi_b, vi_a, vi_d, vi_s, vi_ar, vi_ag, vi_ab, vi_aa; - int vi_aux; - int color, accum, vi_accum; - int missing, color_diff, extra_diff; - int best_vis, best_missing, best_color_diff, best_extra_diff; - int samples, samplebuffers, vi_samples, vi_samplebuffers; + // Now we need to check the _NET_SUPPORTED property of the root window + atomCount = getWindowProperty( _glfwWin.root, + wmSupported, + XA_ATOM, + (unsigned char**) &supportedAtoms ); - // Get list of visuals for this screen & display - VI_tmp.screen = Screen; - VI_list = XGetVisualInfo( Dpy, VisualScreenMask, &VI_tmp, - &nitems_return ); - if( VI_list == NULL ) - { - return NULL; - } + // See which of the atoms we support that are supported by the WM - // Pick some prefered color depth if the user did not request a - // specific depth (note: if the user did not request a specific color - // depth, this will not be a driving demand, it's only here to avoid - // selection randomness) - color = (r > 0 || g > 0 || b > 0); - if( !color ) - { - r = g = b = 8; - } - - // Make sure that stereo is 1 or 0 - stereo = stereo ? 1 : 0; - - // Convenience pre-calculation - accum = (ar > 0 || ag > 0 || ab > 0 || aa > 0); - - samples = fsaa; - samplebuffers = (fsaa > 0) ? 1 : 0; - - - - // Loop through list of visuals to find best match - best_vis = -1; - best_missing = 0x7fffffff; - best_color_diff = 0x7fffffff; - best_extra_diff = 0x7fffffff; - for( i = 0; i < nitems_return; i ++ ) - { - // We want GL, RGBA & DOUBLEBUFFER, and NOT STEREO / STEREO - glXGetConfig( Dpy, &VI_list[i], GLX_USE_GL, &vi_gl ); - glXGetConfig( Dpy, &VI_list[i], GLX_RGBA, &vi_rgba ); - glXGetConfig( Dpy, &VI_list[i], GLX_DOUBLEBUFFER, &vi_double ); - glXGetConfig( Dpy, &VI_list[i], GLX_STEREO, &vi_stereo ); - vi_stereo = vi_stereo ? 1 : 0; - if( vi_gl && vi_rgba && vi_double && (vi_stereo == stereo) ) - { - // Get visual color parameters - glXGetConfig( Dpy, &VI_list[i], GLX_RED_SIZE, &vi_r ); - glXGetConfig( Dpy, &VI_list[i], GLX_GREEN_SIZE, &vi_g ); - glXGetConfig( Dpy, &VI_list[i], GLX_BLUE_SIZE, &vi_b ); - - // Get visual "extra" parameters - glXGetConfig( Dpy, &VI_list[i], GLX_ALPHA_SIZE, &vi_a ); - glXGetConfig( Dpy, &VI_list[i], GLX_DEPTH_SIZE, &vi_d ); - glXGetConfig( Dpy, &VI_list[i], GLX_STENCIL_SIZE, &vi_s ); - glXGetConfig( Dpy, &VI_list[i], GLX_ACCUM_RED_SIZE, &vi_ar ); - glXGetConfig( Dpy, &VI_list[i], GLX_ACCUM_GREEN_SIZE, &vi_ag ); - glXGetConfig( Dpy, &VI_list[i], GLX_ACCUM_BLUE_SIZE, &vi_ab ); - glXGetConfig( Dpy, &VI_list[i], GLX_ACCUM_ALPHA_SIZE, &vi_aa ); - glXGetConfig( Dpy, &VI_list[i], GLX_AUX_BUFFERS, &vi_aux ); - glXGetConfig( Dpy, &VI_list[i], GLX_SAMPLE_BUFFERS, &vi_samplebuffers ); - glXGetConfig( Dpy, &VI_list[i], GLX_SAMPLES, &vi_samples ); - - vi_accum = (vi_ar > 0 || vi_ag > 0 || vi_ab > 0 || vi_aa > 0); - - // Check how many buffers are missing - missing = 0; - if( a > 0 && vi_a == 0 ) missing ++; - if( d > 0 && vi_d == 0 ) missing ++; - if( s > 0 && vi_s == 0 ) missing ++; - if( accum && !vi_accum ) missing ++; - if( aux > 0 && vi_aux == 0 ) missing ++; - if( samplebuffers > 0 && vi_samplebuffers == 0 ) missing ++; - - - // Calculate color diff - color_diff = (r - vi_r) * (r - vi_r) + - (g - vi_g) * (g - vi_g) + - (b - vi_b) * (b - vi_b); - - // Calculate "extra" diff - extra_diff = 0; - if( a > 0 ) - { - extra_diff += (a - vi_a) * (a - vi_a); - } - if( d > 0 ) - { - extra_diff += (d - vi_d) * (d - vi_d); - } - if( s > 0 ) - { - extra_diff += (s - vi_s) * (s - vi_s); - } - if( accum ) - { - extra_diff += (ar - vi_ar) * (ar - vi_ar) + - (ag - vi_ag) * (ag - vi_ag) + - (ab - vi_ab) * (ab - vi_ab) + - (aa - vi_aa) * (aa - vi_aa); - } - if( aux > 0 ) - { - extra_diff += (aux - vi_aux) * (aux - vi_aux); - } - if( samples > 0 ) - { - extra_diff += (samples - vi_samples) * (samples - vi_samples); - - } - // Check if this is a better match. We implement some - // complicated rules, by prioritizing in this order: - // 1) Visuals with the least number of missing buffers always - // have priority - // 2a) If (r,g,b)!=(0,0,0), color depth has priority over - // other buffers - // 2b) If (r,g,b)==(0,0,0), other buffers have priority over - // color depth - if( missing < best_missing ) - { - best_vis = i; - } - else if( missing == best_missing ) - { - if( color ) - { - if( (color_diff < best_color_diff) || - (color_diff == best_color_diff && - extra_diff < best_extra_diff) ) - { - best_vis = i; - } - } - else - { - if( (extra_diff < best_extra_diff) || - (extra_diff == best_extra_diff && - color_diff < best_color_diff) ) - { - best_vis = i; - } - } - } - if( best_vis == i ) - { - best_missing = missing; - best_color_diff = color_diff; - best_extra_diff = extra_diff; - } - } - } + _glfwWin.wmState = getSupportedAtom( supportedAtoms, + atomCount, + "_NET_WM_STATE" ); - // Copy best visual to a visual to return - if( best_vis >= 0 ) - { - VI = XGetVisualInfo( Dpy, VisualIDMask, &VI_list[ best_vis ], - &nitems_return ); - } - else - { - VI = NULL; - } + _glfwWin.wmStateFullscreen = getSupportedAtom( supportedAtoms, + atomCount, + "_NET_WM_STATE_FULLSCREEN" ); - // Free visuals list - XFree( VI_list ); + _glfwWin.wmPing = getSupportedAtom( supportedAtoms, + atomCount, + "_NET_WM_PING" ); - return VI; -} + _glfwWin.wmActiveWindow = getSupportedAtom( supportedAtoms, + atomCount, + "_NET_ACTIVE_WINDOW" ); + XFree( supportedAtoms ); + + return GL_TRUE; +} //======================================================================== -// _glfwTranslateKey() - Translates an X Window key to internal coding +// Translates an X Window key to internal coding //======================================================================== -static int _glfwTranslateKey( int keycode ) +static int translateKey( int keycode ) { KeySym key, key_lc, key_uc; // Try secondary keysym, for numeric keypad keys // Note: This way we always force "NumLock = ON", which at least // enables GLFW users to detect numeric keypad keys - key = XKeycodeToKeysym( _glfwLibrary.Dpy, keycode, 1 ); + key = XKeycodeToKeysym( _glfwLibrary.display, keycode, 1 ); switch( key ) { // Numeric keypad @@ -469,7 +257,7 @@ } // Now try pimary keysym - key = XKeycodeToKeysym( _glfwLibrary.Dpy, keycode, 0 ); + key = XKeycodeToKeysym( _glfwLibrary.display, keycode, 0 ); switch( key ) { // Special keys (non character keys) @@ -483,7 +271,15 @@ case XK_Alt_L: return GLFW_KEY_LALT; case XK_Mode_switch: // Mapped to Alt_R on many keyboards case XK_Meta_R: + case XK_ISO_Level3_Shift: // AltGr on at least some machines case XK_Alt_R: return GLFW_KEY_RALT; + case XK_Super_L: return GLFW_KEY_LSUPER; + case XK_Super_R: return GLFW_KEY_RSUPER; + case XK_Menu: return GLFW_KEY_MENU; + case XK_Num_Lock: return GLFW_KEY_KP_NUM_LOCK; + case XK_Caps_Lock: return GLFW_KEY_CAPS_LOCK; + case XK_Scroll_Lock: return GLFW_KEY_SCROLL_LOCK; + case XK_Pause: return GLFW_KEY_PAUSE; case XK_KP_Delete: case XK_Delete: return GLFW_KEY_DEL; case XK_BackSpace: return GLFW_KEY_BACKSPACE; @@ -558,10 +354,10 @@ //======================================================================== -// _glfwTranslateChar() - Translates an X Window event to Unicode +// Translates an X Window event to Unicode //======================================================================== -static int _glfwTranslateChar( XKeyEvent *event ) +static int translateChar( XKeyEvent *event ) { KeySym keysym; @@ -573,69 +369,788 @@ } +//======================================================================== +// Create a blank cursor (for locked mouse mode) +//======================================================================== + +static Cursor createNULLCursor( Display *display, Window root ) +{ + Pixmap cursormask; + XGCValues xgc; + GC gc; + XColor col; + Cursor cursor; + + cursormask = XCreatePixmap( display, root, 1, 1, 1 ); + xgc.function = GXclear; + gc = XCreateGC( display, cursormask, GCFunction, &xgc ); + XFillRectangle( display, cursormask, gc, 0, 0, 1, 1 ); + col.pixel = 0; + col.red = 0; + col.flags = 4; + cursor = XCreatePixmapCursor( display, cursormask, cursormask, + &col,&col, 0,0 ); + XFreePixmap( display, cursormask ); + XFreeGC( display, gc ); + + return cursor; +} + + +//======================================================================== +// Returns the specified attribute of the specified GLXFBConfig +// NOTE: Do not call this unless we have found GLX 1.3+ or GLX_SGIX_fbconfig +//======================================================================== + +static int getFBConfigAttrib( GLXFBConfig fbconfig, int attrib ) +{ + int value; + + if( _glfwWin.has_GLX_SGIX_fbconfig ) + { + _glfwWin.GetFBConfigAttribSGIX( _glfwLibrary.display, fbconfig, attrib, &value ); + } + else + { + glXGetFBConfigAttrib( _glfwLibrary.display, fbconfig, attrib, &value ); + } + + return value; +} + + +//======================================================================== +// Return a list of available and usable framebuffer configs +//======================================================================== + +static _GLFWfbconfig *getFBConfigs( unsigned int *found ) +{ + GLXFBConfig *fbconfigs; + _GLFWfbconfig *result; + int i, count = 0; + + *found = 0; + + if( _glfwLibrary.glxMajor == 1 && _glfwLibrary.glxMinor < 3 ) + { + if( !_glfwWin.has_GLX_SGIX_fbconfig ) + { + fprintf( stderr, "GLXFBConfigs are not supported by the X server\n" ); + return NULL; + } + } + + if( _glfwWin.has_GLX_SGIX_fbconfig ) + { + fbconfigs = _glfwWin.ChooseFBConfigSGIX( _glfwLibrary.display, + _glfwWin.screen, + NULL, + &count ); + if( !count ) + { + fprintf( stderr, "No GLXFBConfigs returned\n" ); + return NULL; + } + } + else + { + fbconfigs = glXGetFBConfigs( _glfwLibrary.display, _glfwWin.screen, &count ); + if( !count ) + { + fprintf( stderr, "No GLXFBConfigs returned\n" ); + return NULL; + } + } + + result = (_GLFWfbconfig*) malloc( sizeof(_GLFWfbconfig) * count ); + if( !result ) + { + fprintf( stderr, "Out of memory\n" ); + return NULL; + } + + for( i = 0; i < count; i++ ) + { + if( !getFBConfigAttrib( fbconfigs[i], GLX_DOUBLEBUFFER ) || + !getFBConfigAttrib( fbconfigs[i], GLX_VISUAL_ID ) ) + { + // Only consider double-buffered GLXFBConfigs with associated visuals + continue; + } + + if( !( getFBConfigAttrib( fbconfigs[i], GLX_RENDER_TYPE ) & GLX_RGBA_BIT ) ) + { + // Only consider RGBA GLXFBConfigs + continue; + } + + if( !( getFBConfigAttrib( fbconfigs[i], GLX_DRAWABLE_TYPE ) & GLX_WINDOW_BIT ) ) + { + // Only consider window GLXFBConfigs + continue; + } + + result[*found].redBits = getFBConfigAttrib( fbconfigs[i], GLX_RED_SIZE ); + result[*found].greenBits = getFBConfigAttrib( fbconfigs[i], GLX_GREEN_SIZE ); + result[*found].blueBits = getFBConfigAttrib( fbconfigs[i], GLX_BLUE_SIZE ); + + result[*found].alphaBits = getFBConfigAttrib( fbconfigs[i], GLX_ALPHA_SIZE ); + result[*found].depthBits = getFBConfigAttrib( fbconfigs[i], GLX_DEPTH_SIZE ); + result[*found].stencilBits = getFBConfigAttrib( fbconfigs[i], GLX_STENCIL_SIZE ); + + result[*found].accumRedBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_RED_SIZE ); + result[*found].accumGreenBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_GREEN_SIZE ); + result[*found].accumBlueBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_BLUE_SIZE ); + result[*found].accumAlphaBits = getFBConfigAttrib( fbconfigs[i], GLX_ACCUM_ALPHA_SIZE ); + + result[*found].auxBuffers = getFBConfigAttrib( fbconfigs[i], GLX_AUX_BUFFERS ); + result[*found].stereo = getFBConfigAttrib( fbconfigs[i], GLX_STEREO ); + + if( _glfwWin.has_GLX_ARB_multisample ) + { + result[*found].samples = getFBConfigAttrib( fbconfigs[i], GLX_SAMPLES ); + } + else + { + result[*found].samples = 0; + } + + result[*found].platformID = (GLFWintptr) getFBConfigAttrib( fbconfigs[i], GLX_FBCONFIG_ID ); + + (*found)++; + } + + XFree( fbconfigs ); + + return result; +} + //======================================================================== -// Get next X event (called by glfwPollEvents) +// Create the OpenGL context //======================================================================== -static int _glfwGetNextEvent( void ) +#define setGLXattrib( attribs, index, attribName, attribValue ) \ + attribs[index++] = attribName; \ + attribs[index++] = attribValue; + +static int createContext( const _GLFWwndconfig *wndconfig, GLXFBConfigID fbconfigID ) { - XEvent event, next_event; + int attribs[40]; + int flags, dummy, index; + GLXFBConfig *fbconfig; + + // Retrieve the previously selected GLXFBConfig + { + index = 0; - // Pull next event from event queue - XNextEvent( _glfwLibrary.Dpy, &event ); + setGLXattrib( attribs, index, GLX_FBCONFIG_ID, (int) fbconfigID ); + setGLXattrib( attribs, index, None, None ); + + if( _glfwWin.has_GLX_SGIX_fbconfig ) + { + fbconfig = _glfwWin.ChooseFBConfigSGIX( _glfwLibrary.display, + _glfwWin.screen, + attribs, + &dummy ); + } + else + { + fbconfig = glXChooseFBConfig( _glfwLibrary.display, + _glfwWin.screen, + attribs, + &dummy ); + } + + if( fbconfig == NULL ) + { + fprintf(stderr, "Unable to retrieve the selected GLXFBConfig\n"); + return GL_FALSE; + } + } + + // Retrieve the corresponding visual + if( _glfwWin.has_GLX_SGIX_fbconfig ) + { + _glfwWin.visual = _glfwWin.GetVisualFromFBConfigSGIX( _glfwLibrary.display, + *fbconfig ); + } + else + { + _glfwWin.visual = glXGetVisualFromFBConfig( _glfwLibrary.display, *fbconfig ); + } + + if( _glfwWin.visual == NULL ) + { + XFree( fbconfig ); + + fprintf(stderr, "Unable to retrieve visual for GLXFBconfig\n"); + return GL_FALSE; + } + + if( _glfwWin.has_GLX_ARB_create_context ) + { + index = 0; + + if( wndconfig->glMajor != 1 || wndconfig->glMinor != 0 ) + { + // Request an explicitly versioned context + + setGLXattrib( attribs, index, GLX_CONTEXT_MAJOR_VERSION_ARB, wndconfig->glMajor ); + setGLXattrib( attribs, index, GLX_CONTEXT_MINOR_VERSION_ARB, wndconfig->glMinor ); + } + + if( wndconfig->glForward || wndconfig->glDebug ) + { + flags = 0; + + if( wndconfig->glForward ) + { + flags |= GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB; + } + + if( wndconfig->glDebug ) + { + flags |= GLX_CONTEXT_DEBUG_BIT_ARB; + } + + setGLXattrib( attribs, index, GLX_CONTEXT_FLAGS_ARB, flags ); + } + + if( wndconfig->glProfile ) + { + if( !_glfwWin.has_GLX_ARB_create_context_profile ) + { + fprintf( stderr, "OpenGL profile requested but GLX_ARB_create_context_profile " + "is unavailable\n" ); + return GL_FALSE; + } + + if( wndconfig->glProfile == GLFW_OPENGL_CORE_PROFILE ) + { + flags = GLX_CONTEXT_CORE_PROFILE_BIT_ARB; + } + else + { + flags = GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB; + } + + setGLXattrib( attribs, index, GLX_CONTEXT_PROFILE_MASK_ARB, flags ); + } + + setGLXattrib( attribs, index, None, None ); + + // This is the only place we set an Xlib error handler, and we only do + // it because glXCreateContextAttribsARB generates a BadMatch error if + // the requested OpenGL version is unavailable (instead of a civilized + // response like returning NULL) + XSetErrorHandler( errorHandler ); + + _glfwWin.context = _glfwWin.CreateContextAttribsARB( _glfwLibrary.display, + *fbconfig, + NULL, + True, + attribs ); + + // We are done, so unset the error handler again (see above) + XSetErrorHandler( NULL ); + } + else + { + if( _glfwWin.has_GLX_SGIX_fbconfig ) + { + _glfwWin.context = _glfwWin.CreateContextWithConfigSGIX( _glfwLibrary.display, + *fbconfig, + GLX_RGBA_TYPE, + NULL, + True ); + } + else + { + _glfwWin.context = glXCreateNewContext( _glfwLibrary.display, + *fbconfig, + GLX_RGBA_TYPE, + NULL, + True ); + } + } + + XFree( fbconfig ); + + if( _glfwWin.context == NULL ) + { + fprintf(stderr, "Unable to create OpenGL context\n"); + return GL_FALSE; + } + + _glfwWin.fbconfigID = fbconfigID; + + return GL_TRUE; +} + +#undef setGLXattrib + + +//======================================================================== +// Initialize GLX-specific extensions +//======================================================================== + +static void initGLXExtensions( void ) +{ + // This needs to include every function pointer loaded below + _glfwWin.SwapIntervalSGI = NULL; + _glfwWin.GetFBConfigAttribSGIX = NULL; + _glfwWin.ChooseFBConfigSGIX = NULL; + _glfwWin.CreateContextWithConfigSGIX = NULL; + _glfwWin.GetVisualFromFBConfigSGIX = NULL; + _glfwWin.CreateContextAttribsARB = NULL; + + // This needs to include every extension used below + _glfwWin.has_GLX_SGIX_fbconfig = GL_FALSE; + _glfwWin.has_GLX_SGI_swap_control = GL_FALSE; + _glfwWin.has_GLX_ARB_multisample = GL_FALSE; + _glfwWin.has_GLX_ARB_create_context = GL_FALSE; + _glfwWin.has_GLX_ARB_create_context_profile = GL_FALSE; + + if( _glfwPlatformExtensionSupported( "GLX_SGI_swap_control" ) ) + { + _glfwWin.SwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC) + _glfwPlatformGetProcAddress( "glXSwapIntervalSGI" ); + + if( _glfwWin.SwapIntervalSGI ) + { + _glfwWin.has_GLX_SGI_swap_control = GL_TRUE; + } + } + + if( _glfwPlatformExtensionSupported( "GLX_SGIX_fbconfig" ) ) + { + _glfwWin.GetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC) + _glfwPlatformGetProcAddress( "glXGetFBConfigAttribSGIX" ); + _glfwWin.ChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC) + _glfwPlatformGetProcAddress( "glXChooseFBConfigSGIX" ); + _glfwWin.CreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) + _glfwPlatformGetProcAddress( "glXCreateContextWithConfigSGIX" ); + _glfwWin.GetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) + _glfwPlatformGetProcAddress( "glXGetVisualFromFBConfigSGIX" ); + + if( _glfwWin.GetFBConfigAttribSGIX && + _glfwWin.ChooseFBConfigSGIX && + _glfwWin.CreateContextWithConfigSGIX && + _glfwWin.GetVisualFromFBConfigSGIX ) + { + _glfwWin.has_GLX_SGIX_fbconfig = GL_TRUE; + } + } + + if( _glfwPlatformExtensionSupported( "GLX_ARB_multisample" ) ) + { + _glfwWin.has_GLX_ARB_multisample = GL_TRUE; + } + + if( _glfwPlatformExtensionSupported( "GLX_ARB_create_context" ) ) + { + _glfwWin.CreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC) + _glfwPlatformGetProcAddress( "glXCreateContextAttribsARB" ); + + if( _glfwWin.CreateContextAttribsARB ) + { + _glfwWin.has_GLX_ARB_create_context = GL_TRUE; + } + } + + if( _glfwPlatformExtensionSupported( "GLX_ARB_create_context_profile" ) ) + { + _glfwWin.has_GLX_ARB_create_context_profile = GL_TRUE; + } +} + + +//======================================================================== +// Create the X11 window (and its colormap) +//======================================================================== + +static GLboolean createWindow( int width, int height, + const _GLFWwndconfig *wndconfig ) +{ + XEvent event; + unsigned long wamask; + XSetWindowAttributes wa; + + // Every window needs a colormap + // Create one based on the visual used by the current context + + _glfwWin.colormap = XCreateColormap( _glfwLibrary.display, + _glfwWin.root, + _glfwWin.visual->visual, + AllocNone ); + + // Create the actual window + { + wamask = CWBorderPixel | CWColormap | CWEventMask; + + wa.colormap = _glfwWin.colormap; + wa.border_pixel = 0; + wa.event_mask = StructureNotifyMask | KeyPressMask | KeyReleaseMask | + PointerMotionMask | ButtonPressMask | ButtonReleaseMask | + ExposureMask | FocusChangeMask | VisibilityChangeMask; + + if( wndconfig->mode == GLFW_WINDOW ) + { + // The /only/ reason we are setting the background pixel here is + // that otherwise our window wont get any decorations on systems + // using Compiz on Intel hardware + wa.background_pixel = BlackPixel( _glfwLibrary.display, _glfwWin.screen ); + wamask |= CWBackPixel; + } + + _glfwWin.window = XCreateWindow( + _glfwLibrary.display, + _glfwWin.root, + 0, 0, // Upper left corner of this window on root + _glfwWin.width, _glfwWin.height, + 0, // Border width + _glfwWin.visual->depth, // Color depth + InputOutput, + _glfwWin.visual->visual, + wamask, + &wa + ); + if( !_glfwWin.window ) + { + _glfwPlatformCloseWindow(); + return GL_FALSE; + } + } + + // Check whether an EWMH-compliant window manager is running + _glfwWin.hasEWMH = checkForEWMH(); + + if( _glfwWin.fullscreen && !_glfwWin.hasEWMH ) + { + // This is the butcher's way of removing window decorations + // Setting the override-redirect attribute on a window makes the window + // manager ignore the window completely (ICCCM, section 4) + // The good thing is that this makes undecorated fullscreen windows + // easy to do; the bad thing is that we have to do everything manually + // and some things (like iconify/restore) won't work at all, as they're + // usually performed by the window manager + + XSetWindowAttributes attributes; + attributes.override_redirect = True; + XChangeWindowAttributes( _glfwLibrary.display, + _glfwWin.window, + CWOverrideRedirect, + &attributes ); + + _glfwWin.overrideRedirect = GL_TRUE; + } + + // Find or create the protocol atom for window close notifications + _glfwWin.wmDeleteWindow = XInternAtom( _glfwLibrary.display, + "WM_DELETE_WINDOW", + False ); + + // Declare the WM protocols we support + { + int count = 0; + Atom protocols[2]; + + // The WM_DELETE_WINDOW ICCCM protocol + // Basic window close notification protocol + if( _glfwWin.wmDeleteWindow != None ) + { + protocols[count++] = _glfwWin.wmDeleteWindow; + } + + // The _NET_WM_PING EWMH protocol + // Tells the WM to ping our window and flag us as unresponsive if we + // don't reply within a few seconds + if( _glfwWin.wmPing != None ) + { + protocols[count++] = _glfwWin.wmPing; + } + + if( count > 0 ) + { + XSetWMProtocols( _glfwLibrary.display, _glfwWin.window, + protocols, count ); + } + } + + // Set ICCCM WM_HINTS property + { + XWMHints *hints = XAllocWMHints(); + if( !hints ) + { + _glfwPlatformCloseWindow(); + return GL_FALSE; + } + + hints->flags = StateHint; + hints->initial_state = NormalState; + + XSetWMHints( _glfwLibrary.display, _glfwWin.window, hints ); + XFree( hints ); + } + + // Set ICCCM WM_NORMAL_HINTS property (even if no parts are set) + { + XSizeHints *hints = XAllocSizeHints(); + if( !hints ) + { + _glfwPlatformCloseWindow(); + return GL_FALSE; + } + + hints->flags = 0; + + if( wndconfig->windowNoResize && !_glfwWin.fullscreen ) + { + hints->flags |= (PMinSize | PMaxSize); + hints->min_width = hints->max_width = _glfwWin.width; + hints->min_height = hints->max_height = _glfwWin.height; + } + + XSetWMNormalHints( _glfwLibrary.display, _glfwWin.window, hints ); + XFree( hints ); + } + + _glfwPlatformSetWindowTitle( "GLFW Window" ); + + // Make sure the window is mapped before proceeding + XMapWindow( _glfwLibrary.display, _glfwWin.window ); + XPeekIfEvent( _glfwLibrary.display, &event, isMapNotify, + (char*)_glfwWin.window ); + + return GL_TRUE; +} + + +//======================================================================== +// Enter fullscreen mode +//======================================================================== + +static void enterFullscreenMode( void ) +{ + if( !_glfwWin.Saver.changed ) + { + // Remember old screen saver settings + XGetScreenSaver( _glfwLibrary.display, + &_glfwWin.Saver.timeout, &_glfwWin.Saver.interval, + &_glfwWin.Saver.blanking, &_glfwWin.Saver.exposure ); + + // Disable screen saver + XSetScreenSaver( _glfwLibrary.display, 0, 0, DontPreferBlanking, + DefaultExposures ); + + _glfwWin.Saver.changed = GL_TRUE; + } + + _glfwSetVideoMode( _glfwWin.screen, + &_glfwWin.width, &_glfwWin.height, + &_glfwWin.refreshRate ); + + if( _glfwWin.hasEWMH && + _glfwWin.wmState != None && + _glfwWin.wmStateFullscreen != None ) + { + if( _glfwWin.wmActiveWindow != None ) + { + // Ask the window manager to raise and focus the GLFW window + // Only focused windows with the _NET_WM_STATE_FULLSCREEN state end + // up on top of all other windows ("Stacking order" in EWMH spec) + + XEvent event; + memset( &event, 0, sizeof(event) ); + + event.type = ClientMessage; + event.xclient.window = _glfwWin.window; + event.xclient.format = 32; // Data is 32-bit longs + event.xclient.message_type = _glfwWin.wmActiveWindow; + event.xclient.data.l[0] = 1; // Sender is a normal application + event.xclient.data.l[1] = 0; // We don't really know the timestamp + + XSendEvent( _glfwLibrary.display, + _glfwWin.root, + False, + SubstructureNotifyMask | SubstructureRedirectMask, + &event ); + } + + // Ask the window manager to make the GLFW window a fullscreen window + // Fullscreen windows are undecorated and, when focused, are kept + // on top of all other windows + + XEvent event; + memset( &event, 0, sizeof(event) ); + + event.type = ClientMessage; + event.xclient.window = _glfwWin.window; + event.xclient.format = 32; // Data is 32-bit longs + event.xclient.message_type = _glfwWin.wmState; + event.xclient.data.l[0] = _NET_WM_STATE_ADD; + event.xclient.data.l[1] = _glfwWin.wmStateFullscreen; + event.xclient.data.l[2] = 0; // No secondary property + event.xclient.data.l[3] = 1; // Sender is a normal application + + XSendEvent( _glfwLibrary.display, + _glfwWin.root, + False, + SubstructureNotifyMask | SubstructureRedirectMask, + &event ); + } + else if( _glfwWin.overrideRedirect ) + { + // In override-redirect mode, we have divorced ourselves from the + // window manager, so we need to do everything manually + + XRaiseWindow( _glfwLibrary.display, _glfwWin.window ); + XSetInputFocus( _glfwLibrary.display, _glfwWin.window, + RevertToParent, CurrentTime ); + XMoveWindow( _glfwLibrary.display, _glfwWin.window, 0, 0 ); + XResizeWindow( _glfwLibrary.display, _glfwWin.window, + _glfwWin.width, _glfwWin.height ); + } + + if( _glfwWin.mouseLock ) + { + _glfwPlatformHideMouseCursor(); + } + + // HACK: Try to get window inside viewport (for virtual displays) by moving + // the mouse cursor to the upper left corner (and then to the center) + // This hack should be harmless on saner systems as well + XWarpPointer( _glfwLibrary.display, None, _glfwWin.window, 0,0,0,0, 0,0 ); + XWarpPointer( _glfwLibrary.display, None, _glfwWin.window, 0,0,0,0, + _glfwWin.width / 2, _glfwWin.height / 2 ); +} + +//======================================================================== +// Leave fullscreen mode +//======================================================================== + +static void leaveFullscreenMode( void ) +{ + _glfwRestoreVideoMode(); + + // Did we change the screen saver setting? + if( _glfwWin.Saver.changed ) + { + // Restore old screen saver settings + XSetScreenSaver( _glfwLibrary.display, + _glfwWin.Saver.timeout, + _glfwWin.Saver.interval, + _glfwWin.Saver.blanking, + _glfwWin.Saver.exposure ); + + _glfwWin.Saver.changed = GL_FALSE; + } + + if( _glfwWin.hasEWMH && + _glfwWin.wmState != None && + _glfwWin.wmStateFullscreen != None ) + { + // Ask the window manager to make the GLFW window a normal window + // Normal windows usually have frames and other decorations + + XEvent event; + memset( &event, 0, sizeof(event) ); + + event.type = ClientMessage; + event.xclient.window = _glfwWin.window; + event.xclient.format = 32; // Data is 32-bit longs + event.xclient.message_type = _glfwWin.wmState; + event.xclient.data.l[0] = _NET_WM_STATE_REMOVE; + event.xclient.data.l[1] = _glfwWin.wmStateFullscreen; + event.xclient.data.l[2] = 0; // No secondary property + event.xclient.data.l[3] = 1; // Sender is a normal application + + XSendEvent( _glfwLibrary.display, + _glfwWin.root, + False, + SubstructureNotifyMask | SubstructureRedirectMask, + &event ); + } + + if( _glfwWin.mouseLock ) + { + _glfwPlatformShowMouseCursor(); + } +} + +//======================================================================== +// Get and process next X event (called by _glfwPlatformPollEvents) +// Returns GL_TRUE if a window close request was received +//======================================================================== + +static GLboolean processSingleEvent( void ) +{ + XEvent event; + XNextEvent( _glfwLibrary.display, &event ); - // Handle certain window messages switch( event.type ) { - // Is a key being pressed? case KeyPress: - { + { + // A keyboard key was pressed + // Translate and report key press - _glfwInputKey( _glfwTranslateKey( event.xkey.keycode ), GLFW_PRESS ); + _glfwInputKey( translateKey( event.xkey.keycode ), GLFW_PRESS ); // Translate and report character input - if( _glfwWin.CharCallback ) + if( _glfwWin.charCallback ) { - _glfwInputChar( _glfwTranslateChar( &event.xkey ), GLFW_PRESS ); + _glfwInputChar( translateChar( &event.xkey ), GLFW_PRESS ); } break; - } + } - // Is a key being released? case KeyRelease: - { - // Do not report key releases for key repeats. For key repeats - // we will get KeyRelease/KeyPress pairs with identical time - // stamps. User selected key repeat filtering is handled in + { + // A keyboard key was released + + // Do not report key releases for key repeats. For key repeats we + // will get KeyRelease/KeyPress pairs with similar or identical + // time stamps. User selected key repeat filtering is handled in // _glfwInputKey()/_glfwInputChar(). - if( XEventsQueued( _glfwLibrary.Dpy, QueuedAfterReading ) ) + if( XEventsQueued( _glfwLibrary.display, QueuedAfterReading ) ) { - XPeekEvent( _glfwLibrary.Dpy, &next_event ); - if( next_event.type == KeyPress && - next_event.xkey.window == event.xkey.window && - next_event.xkey.keycode == event.xkey.keycode && - next_event.xkey.time == event.xkey.time ) + XEvent nextEvent; + XPeekEvent( _glfwLibrary.display, &nextEvent ); + + if( nextEvent.type == KeyPress && + nextEvent.xkey.window == event.xkey.window && + nextEvent.xkey.keycode == event.xkey.keycode ) { - // Do not report anything for this event - break; + // This last check is a hack to work around key repeats + // leaking through due to some sort of time drift + // Toshiyuki Takahashi can press a button 16 times per + // second so it's fairly safe to assume that no human is + // pressing the key 50 times per second (value is ms) + if( ( nextEvent.xkey.time - event.xkey.time ) < 20 ) + { + // Do not report anything for this event + break; + } } } // Translate and report key release - _glfwInputKey( _glfwTranslateKey( event.xkey.keycode ), GLFW_RELEASE ); + _glfwInputKey( translateKey( event.xkey.keycode ), GLFW_RELEASE ); // Translate and report character input - if( _glfwWin.CharCallback ) + if( _glfwWin.charCallback ) { - _glfwInputChar( _glfwTranslateChar( &event.xkey ), GLFW_RELEASE ); + _glfwInputChar( translateChar( &event.xkey ), GLFW_RELEASE ); } break; - } + } - // Were any of the mouse-buttons pressed? case ButtonPress: - { + { + // A mouse button was pressed or a scrolling event occurred + if( event.xbutton.button == Button1 ) { _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS ); @@ -654,25 +1169,26 @@ else if( event.xbutton.button == Button4 ) { _glfwInput.WheelPos++; // To verify: is this up or down? - if( _glfwWin.MouseWheelCallback ) + if( _glfwWin.mouseWheelCallback ) { - _glfwWin.MouseWheelCallback( _glfwInput.WheelPos ); + _glfwWin.mouseWheelCallback( _glfwInput.WheelPos ); } } else if( event.xbutton.button == Button5 ) { _glfwInput.WheelPos--; - if( _glfwWin.MouseWheelCallback ) + if( _glfwWin.mouseWheelCallback ) { - _glfwWin.MouseWheelCallback( _glfwInput.WheelPos ); + _glfwWin.mouseWheelCallback( _glfwInput.WheelPos ); } } break; - } + } - // Were any of the mouse-buttons released? case ButtonRelease: - { + { + // A mouse button was released + if( event.xbutton.button == Button1 ) { _glfwInputMouseClick( GLFW_MOUSE_BUTTON_LEFT, @@ -689,124 +1205,165 @@ GLFW_RELEASE ); } break; - } + } - // Was the mouse moved? case MotionNotify: - { + { + // The mouse cursor was moved + if( event.xmotion.x != _glfwInput.CursorPosX || event.xmotion.y != _glfwInput.CursorPosY ) { - if( _glfwWin.MouseLock ) + // The mouse cursor was moved and we didn't do it + + if( _glfwWin.mouseLock ) { - _glfwInput.MousePosX += event.xmotion.x - - _glfwInput.CursorPosX; - _glfwInput.MousePosY += event.xmotion.y - - _glfwInput.CursorPosY; + if( _glfwWin.pointerHidden ) + { + _glfwInput.MousePosX += event.xmotion.x - + _glfwInput.CursorPosX; + _glfwInput.MousePosY += event.xmotion.y - + _glfwInput.CursorPosY; + } } else { _glfwInput.MousePosX = event.xmotion.x; _glfwInput.MousePosY = event.xmotion.y; } + _glfwInput.CursorPosX = event.xmotion.x; _glfwInput.CursorPosY = event.xmotion.y; _glfwInput.MouseMoved = GL_TRUE; - // Call user callback function - if( _glfwWin.MousePosCallback ) + if( _glfwWin.mousePosCallback ) { - _glfwWin.MousePosCallback( _glfwInput.MousePosX, + _glfwWin.mousePosCallback( _glfwInput.MousePosX, _glfwInput.MousePosY ); } } break; - } + } - // Was the window resized? case ConfigureNotify: - { - if( event.xconfigure.width != _glfwWin.Width || - event.xconfigure.height != _glfwWin.Height ) - { - _glfwWin.Width = event.xconfigure.width; - _glfwWin.Height = event.xconfigure.height; - if( _glfwWin.WindowSizeCallback ) + { + if( event.xconfigure.width != _glfwWin.width || + event.xconfigure.height != _glfwWin.height ) + { + // The window was resized + + _glfwWin.width = event.xconfigure.width; + _glfwWin.height = event.xconfigure.height; + if( _glfwWin.windowSizeCallback ) { - _glfwWin.WindowSizeCallback( _glfwWin.Width, - _glfwWin.Height ); + _glfwWin.windowSizeCallback( _glfwWin.width, + _glfwWin.height ); } } break; - } + } - // Was the window closed by the window manager? case ClientMessage: - { - if( (Atom) event.xclient.data.l[ 0 ] == _glfwWin.WMDeleteWindow ) + { + if( (Atom) event.xclient.data.l[ 0 ] == _glfwWin.wmDeleteWindow ) { + // The window manager was asked to close the window, for example by + // the user pressing a 'close' window decoration button + return GL_TRUE; } + else if( _glfwWin.wmPing != None && + (Atom) event.xclient.data.l[ 0 ] == _glfwWin.wmPing ) + { + // The window manager is pinging us to make sure we are still + // responding to events + + event.xclient.window = _glfwWin.root; + XSendEvent( _glfwLibrary.display, + event.xclient.window, + False, + SubstructureNotifyMask | SubstructureRedirectMask, + &event ); + } - if( (Atom) event.xclient.data.l[ 0 ] == _glfwWin.WMPing ) - { - XSendEvent( _glfwLibrary.Dpy, - RootWindow( _glfwLibrary.Dpy, _glfwWin.VI->screen ), - False, SubstructureNotifyMask | SubstructureRedirectMask, &event ); - } break; - } + } - // Was the window mapped (un-iconified)? case MapNotify: - _glfwWin.MapNotifyCount++; + { + // The window was mapped + + _glfwWin.iconified = GL_FALSE; break; + } - // Was the window unmapped (iconified)? case UnmapNotify: - _glfwWin.MapNotifyCount--; + { + // The window was unmapped + + _glfwWin.iconified = GL_TRUE; break; + } - // Was the window activated? case FocusIn: - _glfwWin.FocusInCount++; + { + // The window gained focus + + _glfwWin.active = GL_TRUE; + + if( _glfwWin.mouseLock ) + { + _glfwPlatformHideMouseCursor(); + } + break; + } - // Was the window de-activated? case FocusOut: - _glfwWin.FocusInCount--; + { + // The window lost focus + + _glfwWin.active = GL_FALSE; + _glfwInputDeactivation(); + + if( _glfwWin.mouseLock ) + { + _glfwPlatformShowMouseCursor(); + } + break; + } - // Was the window contents damaged? case Expose: - { - // Call user callback function - if( _glfwWin.WindowRefreshCallback ) + { + // The window's contents was damaged + + if( _glfwWin.windowRefreshCallback ) { - _glfwWin.WindowRefreshCallback(); + _glfwWin.windowRefreshCallback(); } break; - } + } // Was the window destroyed? case DestroyNotify: - return GL_TRUE; + return GL_FALSE; default: - { + { #if defined( _GLFW_HAS_XRANDR ) - switch( event.type - _glfwLibrary.XRandR.EventBase ) - { - case RRScreenChangeNotify: - { - // Show XRandR that we really care - XRRUpdateConfiguration( &event ); - break; - } - } + switch( event.type - _glfwLibrary.XRandR.eventBase ) + { + case RRScreenChangeNotify: + { + // Show XRandR that we really care + XRRUpdateConfiguration( &event ); + break; + } + } #endif break; - } + } } // The window was not destroyed @@ -814,277 +1371,124 @@ } -//======================================================================== -// _glfwCreateNULLCursor() - Create a blank cursor (for locked mouse mode) -//======================================================================== - -Cursor _glfwCreateNULLCursor( Display *display, Window root ) -{ - Pixmap cursormask; - XGCValues xgc; - GC gc; - XColor col; - Cursor cursor; - - cursormask = XCreatePixmap( display, root, 1, 1, 1 ); - xgc.function = GXclear; - gc = XCreateGC( display, cursormask, GCFunction, &xgc ); - XFillRectangle( display, cursormask, gc, 0, 0, 1, 1 ); - col.pixel = 0; - col.red = 0; - col.flags = 4; - cursor = XCreatePixmapCursor( display, cursormask, cursormask, - &col,&col, 0,0 ); - XFreePixmap( display, cursormask ); - XFreeGC( display, gc ); - - return cursor; -} - - -//======================================================================== -// _glfwInitGLXExtensions() - Initialize GLX-specific extensions -//======================================================================== - -static void _glfwInitGLXExtensions( void ) -{ - int has_swap_control; - - // Initialize OpenGL extension: GLX_SGI_swap_control - has_swap_control = _glfwPlatformExtensionSupported( - "GLX_SGI_swap_control" - ); - - if( has_swap_control ) - { - _glfwWin.SwapInterval = (GLXSWAPINTERVALSGI_T) - _glfw_glXGetProcAddress( (GLubyte*) "glXSwapIntervalSGI" ); - } - else - { - _glfwWin.SwapInterval = NULL; - } -} - - //************************************************************************ //**** Platform implementation functions **** //************************************************************************ //======================================================================== -// _glfwPlatformOpenWindow() - Here is where the window is created, and +// Here is where the window is created, and // the OpenGL rendering context is created //======================================================================== -int _glfwPlatformOpenWindow( int width, int height, int redbits, - int greenbits, int bluebits, int alphabits, int depthbits, - int stencilbits, int mode, _GLFWhints* hints ) +int _glfwPlatformOpenWindow( int width, int height, + const _GLFWwndconfig* wndconfig, + const _GLFWfbconfig* fbconfig ) { - Colormap cmap; - XSetWindowAttributes wa; - XEvent event; - Atom protocols[2]; + _GLFWfbconfig closest; // Clear platform specific GLFW window state - _glfwWin.VI = NULL; - _glfwWin.CX = (GLXContext)0; - _glfwWin.Win = (Window)0; - _glfwWin.Hints = NULL; - _glfwWin.PointerGrabbed = GL_FALSE; - _glfwWin.KeyboardGrabbed = GL_FALSE; - _glfwWin.OverrideRedirect = GL_FALSE; - _glfwWin.FS.ModeChanged = GL_FALSE; - _glfwWin.Saver.Changed = GL_FALSE; - _glfwWin.RefreshRate = hints->RefreshRate; - - // Fullscreen & screen saver settings - // Check if GLX is supported on this display - if( !glXQueryExtension( _glfwLibrary.Dpy, NULL, NULL ) ) - { - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - // Get screen ID for this window - _glfwWin.Scrn = _glfwLibrary.DefaultScreen; - - // Get an appropriate visual - _glfwWin.VI = _glfwChooseVisual( _glfwLibrary.Dpy, - _glfwWin.Scrn, - redbits, greenbits, bluebits, - alphabits, depthbits, stencilbits, - hints->AccumRedBits, hints->AccumGreenBits, - hints->AccumBlueBits, hints->AccumAlphaBits, - hints->AuxBuffers, hints->Samples, hints->Stereo ); - if( _glfwWin.VI == NULL ) - { - _glfwPlatformCloseWindow(); - return GL_FALSE; - } - - // Create a GLX context - _glfwWin.CX = glXCreateContext( _glfwLibrary.Dpy, _glfwWin.VI, 0, GL_TRUE ); - if( _glfwWin.CX == NULL ) - { - _glfwPlatformCloseWindow(); - return GL_FALSE; - } + _glfwWin.visual = (XVisualInfo*)NULL; + _glfwWin.colormap = (Colormap)0; + _glfwWin.context = (GLXContext)NULL; + _glfwWin.window = (Window)0; + _glfwWin.pointerGrabbed = GL_FALSE; + _glfwWin.pointerHidden = GL_FALSE; + _glfwWin.keyboardGrabbed = GL_FALSE; + _glfwWin.overrideRedirect = GL_FALSE; + _glfwWin.FS.modeChanged = GL_FALSE; + _glfwWin.Saver.changed = GL_FALSE; + _glfwWin.refreshRate = wndconfig->refreshRate; + _glfwWin.windowNoResize = wndconfig->windowNoResize; + + _glfwWin.wmDeleteWindow = None; + _glfwWin.wmPing = None; + _glfwWin.wmState = None; + _glfwWin.wmStateFullscreen = None; + _glfwWin.wmActiveWindow = None; + + // As the 2.x API doesn't understand multiple display devices, we hardcode + // this choice and hope for the best + _glfwWin.screen = DefaultScreen( _glfwLibrary.display ); + _glfwWin.root = RootWindow( _glfwLibrary.display, _glfwWin.screen ); + + // Create the invisible cursor for hidden cursor mode + _glfwWin.cursor = createNULLCursor( _glfwLibrary.display, _glfwWin.root ); + + initGLXExtensions(); + + // Choose the best available fbconfig + { + unsigned int fbcount; + _GLFWfbconfig *fbconfigs; + const _GLFWfbconfig *result; - // Create a colormap - cmap = XCreateColormap( _glfwLibrary.Dpy, RootWindow( _glfwLibrary.Dpy, - _glfwWin.VI->screen), _glfwWin.VI->visual, AllocNone ); - - // Do we want fullscreen? - if( mode == GLFW_FULLSCREEN ) - { - // Change video mode - _glfwSetVideoMode( _glfwWin.Scrn, &_glfwWin.Width, - &_glfwWin.Height, &_glfwWin.RefreshRate ); + fbconfigs = getFBConfigs( &fbcount ); + if( !fbconfigs ) + { + return GL_FALSE; + } - // Remember old screen saver settings - XGetScreenSaver( _glfwLibrary.Dpy, &_glfwWin.Saver.Timeout, - &_glfwWin.Saver.Interval, &_glfwWin.Saver.Blanking, - &_glfwWin.Saver.Exposure ); + result = _glfwChooseFBConfig( fbconfig, fbconfigs, fbcount ); + if( !result ) + { + free( fbconfigs ); + return GL_FALSE; + } - // Disable screen saver - XSetScreenSaver( _glfwLibrary.Dpy, 0, 0, DontPreferBlanking, - DefaultExposures ); + closest = *result; + free( fbconfigs ); } - // Attributes for window - wa.colormap = cmap; - wa.border_pixel = 0; - wa.event_mask = StructureNotifyMask | KeyPressMask | KeyReleaseMask | - PointerMotionMask | ButtonPressMask | ButtonReleaseMask | - ExposureMask | FocusChangeMask | VisibilityChangeMask; - - // Create a window - _glfwWin.Win = XCreateWindow( - _glfwLibrary.Dpy, - RootWindow( _glfwLibrary.Dpy, _glfwWin.VI->screen ), - 0, 0, // Upper left corner - _glfwWin.Width, _glfwWin.Height, // Width, height - 0, // Borderwidth - _glfwWin.VI->depth, // Depth - InputOutput, - _glfwWin.VI->visual, - CWBorderPixel | CWColormap | CWEventMask, - &wa - ); - if( !_glfwWin.Win ) + if( !createContext( wndconfig, (GLXFBConfigID) closest.platformID ) ) { - _glfwPlatformCloseWindow(); return GL_FALSE; } - // Get the delete window WM protocol atom - _glfwWin.WMDeleteWindow = XInternAtom( _glfwLibrary.Dpy, - "WM_DELETE_WINDOW", - False ); - - // Get the ping WM protocol atom - _glfwWin.WMPing = XInternAtom( _glfwLibrary.Dpy, "_NET_WM_PING", False ); - - protocols[0] = _glfwWin.WMDeleteWindow; - protocols[1] = _glfwWin.WMPing; - - // Allow us to trap the Window Close protocol - XSetWMProtocols( _glfwLibrary.Dpy, _glfwWin.Win, protocols, - sizeof(protocols) / sizeof(Atom) ); - - // Remove window decorations for fullscreen windows - if( mode == GLFW_FULLSCREEN ) - { - _glfwDisableDecorations(); - } - - _glfwWin.Hints = XAllocSizeHints(); - - if( hints->WindowNoResize ) + if( !createWindow( width, height, wndconfig ) ) { - _glfwWin.Hints->flags |= (PMinSize | PMaxSize); - _glfwWin.Hints->min_width = _glfwWin.Hints->max_width = _glfwWin.Width; - _glfwWin.Hints->min_height = _glfwWin.Hints->max_height = _glfwWin.Height; + return GL_FALSE; } - if( mode == GLFW_FULLSCREEN ) + if( wndconfig->mode == GLFW_FULLSCREEN ) { - _glfwWin.Hints->flags |= PPosition; - _glfwWin.Hints->x = 0; - _glfwWin.Hints->y = 0; +#if defined( _GLFW_HAS_XRANDR ) + // Request screen change notifications + if( _glfwLibrary.XRandR.available ) + { + XRRSelectInput( _glfwLibrary.display, + _glfwWin.window, + RRScreenChangeNotifyMask ); + } +#endif + enterFullscreenMode(); } - XSetWMNormalHints( _glfwLibrary.Dpy, _glfwWin.Win, _glfwWin.Hints ); - - // Map window - XMapWindow( _glfwLibrary.Dpy, _glfwWin.Win ); - - // Wait for map notification - XIfEvent( _glfwLibrary.Dpy, &event, _glfwWaitForMapNotify, - (char*)_glfwWin.Win ); - - // Make sure that our window ends up on top of things - XRaiseWindow( _glfwLibrary.Dpy, _glfwWin.Win ); + // Process the window map event and any other that may have arrived + _glfwPlatformPollEvents(); - // Fullscreen mode "post processing" - if( mode == GLFW_FULLSCREEN ) + // Retrieve and set initial cursor position { -#if defined( _GLFW_HAS_XRANDR ) - // Request screen change notifications - if( _glfwLibrary.XRandR.Available ) - { - XRRSelectInput( _glfwLibrary.Dpy, - _glfwWin.Win, - RRScreenChangeNotifyMask ); - } -#endif - - // Force window position/size (some WMs do their own window - // geometry, which we want to override) - XMoveWindow( _glfwLibrary.Dpy, _glfwWin.Win, 0, 0 ); - XResizeWindow( _glfwLibrary.Dpy, _glfwWin.Win, _glfwWin.Width, - _glfwWin.Height ); - - // Grab keyboard - if( XGrabKeyboard( _glfwLibrary.Dpy, _glfwWin.Win, True, - GrabModeAsync, GrabModeAsync, CurrentTime ) == - GrabSuccess ) - { - _glfwWin.KeyboardGrabbed = GL_TRUE; - } + Window window, root; + int windowX, windowY, rootX, rootY; + unsigned int mask; + + XQueryPointer( _glfwLibrary.display, + _glfwWin.window, + &root, + &window, + &rootX, &rootY, + &windowX, &windowY, + &mask ); - // Grab mouse cursor - if( XGrabPointer( _glfwLibrary.Dpy, _glfwWin.Win, True, - ButtonPressMask | ButtonReleaseMask | - PointerMotionMask, GrabModeAsync, GrabModeAsync, - _glfwWin.Win, None, CurrentTime ) == - GrabSuccess ) - { - _glfwWin.PointerGrabbed = GL_TRUE; - } + // TODO: Probably check for some corner cases here. - // Try to get window inside viewport (for virtual displays) by - // moving the mouse cursor to the upper left corner (and then to - // the center) - this works for XFree86 - XWarpPointer( _glfwLibrary.Dpy, None, _glfwWin.Win, 0,0,0,0, 0,0 ); - XWarpPointer( _glfwLibrary.Dpy, None, _glfwWin.Win, 0,0,0,0, - _glfwWin.Width/2, _glfwWin.Height/2 ); + _glfwInput.MousePosX = windowX; + _glfwInput.MousePosY = windowY; } - // Set window & icon name - _glfwPlatformSetWindowTitle( "GLFW Window" ); - // Connect the context to the window - glXMakeCurrent( _glfwLibrary.Dpy, _glfwWin.Win, _glfwWin.CX ); - - // Start by clearing the front buffer to black (avoid ugly desktop - // remains in our OpenGL window) - glClear( GL_COLOR_BUFFER_BIT ); - glXSwapBuffers( _glfwLibrary.Dpy, _glfwWin.Win ); - - // Initialize GLX-specific OpenGL extensions - _glfwInitGLXExtensions(); + glXMakeCurrent( _glfwLibrary.display, _glfwWin.window, _glfwWin.context ); return GL_TRUE; } @@ -1096,236 +1500,134 @@ void _glfwPlatformCloseWindow( void ) { -#if defined( _GLFW_HAS_XRANDR ) - XRRScreenConfiguration *sc; - Window root; -#endif - - // Free WM size hints - if( _glfwWin.Hints ) + if( _glfwWin.fullscreen ) { - XFree( _glfwWin.Hints ); - _glfwWin.Hints = NULL; + leaveFullscreenMode(); } - // Do we have a rendering context? - if( _glfwWin.CX ) + if( _glfwWin.context ) { - // Release the context - glXMakeCurrent( _glfwLibrary.Dpy, None, NULL ); - - // Delete the context - glXDestroyContext( _glfwLibrary.Dpy, _glfwWin.CX ); - _glfwWin.CX = NULL; + // Release and destroy the context + glXMakeCurrent( _glfwLibrary.display, None, NULL ); + glXDestroyContext( _glfwLibrary.display, _glfwWin.context ); + _glfwWin.context = NULL; } - // Ungrab pointer and/or keyboard? - if( _glfwWin.KeyboardGrabbed ) - { - XUngrabKeyboard( _glfwLibrary.Dpy, CurrentTime ); - _glfwWin.KeyboardGrabbed = GL_FALSE; - } - if( _glfwWin.PointerGrabbed ) + if( _glfwWin.visual ) { - XUngrabPointer( _glfwLibrary.Dpy, CurrentTime ); - _glfwWin.PointerGrabbed = GL_FALSE; + XFree( _glfwWin.visual ); + _glfwWin.visual = NULL; } - // Do we have a window? - if( _glfwWin.Win ) + if( _glfwWin.window ) { - // Unmap the window - XUnmapWindow( _glfwLibrary.Dpy, _glfwWin.Win ); - - // Destroy the window - XDestroyWindow( _glfwLibrary.Dpy, _glfwWin.Win ); - _glfwWin.Win = (Window) 0; + XUnmapWindow( _glfwLibrary.display, _glfwWin.window ); + XDestroyWindow( _glfwLibrary.display, _glfwWin.window ); + _glfwWin.window = (Window) 0; } - // Did we change the fullscreen resolution? - if( _glfwWin.FS.ModeChanged ) + if( _glfwWin.colormap ) { -#if defined( _GLFW_HAS_XRANDR ) - if( _glfwLibrary.XRandR.Available ) - { - root = RootWindow( _glfwLibrary.Dpy, _glfwWin.Scrn ); - sc = XRRGetScreenInfo( _glfwLibrary.Dpy, root ); - - XRRSetScreenConfig( _glfwLibrary.Dpy, - sc, - root, - _glfwWin.FS.OldSizeID, - _glfwWin.FS.OldRotation, - CurrentTime ); - - XRRFreeScreenConfigInfo( sc ); - } -#elif defined( _GLFW_HAS_XF86VIDMODE ) - if( _glfwLibrary.XF86VidMode.Available ) - { - // Unlock mode switch - XF86VidModeLockModeSwitch( _glfwLibrary.Dpy, - _glfwWin.Scrn, - 0 ); - - // Change the video mode back to the old mode - XF86VidModeSwitchToMode( _glfwLibrary.Dpy, - _glfwWin.Scrn, &_glfwWin.FS.OldMode ); - } -#endif - _glfwWin.FS.ModeChanged = GL_FALSE; + XFreeColormap( _glfwLibrary.display, _glfwWin.colormap ); + _glfwWin.colormap = (Colormap) 0; } - // Did we change the screen saver setting? - if( _glfwWin.Saver.Changed ) + if( _glfwWin.cursor ) { - // Restore old screen saver settings - XSetScreenSaver( _glfwLibrary.Dpy, _glfwWin.Saver.Timeout, - _glfwWin.Saver.Interval, _glfwWin.Saver.Blanking, - _glfwWin.Saver.Exposure ); - _glfwWin.Saver.Changed = GL_FALSE; + XFreeCursor( _glfwLibrary.display, _glfwWin.cursor ); + _glfwWin.cursor = (Cursor) 0; } - - XSync( _glfwLibrary.Dpy, True ); } //======================================================================== -// _glfwPlatformSetWindowTitle() - Set the window title. +// Set the window title //======================================================================== void _glfwPlatformSetWindowTitle( const char *title ) { // Set window & icon title - XStoreName( _glfwLibrary.Dpy, _glfwWin.Win, title ); - XSetIconName( _glfwLibrary.Dpy, _glfwWin.Win, title ); + XStoreName( _glfwLibrary.display, _glfwWin.window, title ); + XSetIconName( _glfwLibrary.display, _glfwWin.window, title ); } //======================================================================== -// _glfwPlatformSetWindowSize() - Set the window size. +// Set the window size //======================================================================== void _glfwPlatformSetWindowSize( int width, int height ) { - int mode = 0, rate, sizechanged = GL_FALSE; - GLint drawbuffer; - GLfloat clearcolor[4]; + int mode = 0, rate, sizeChanged = GL_FALSE; + XSizeHints *sizehints; - rate = _glfwWin.RefreshRate; + rate = _glfwWin.refreshRate; - // If we are in fullscreen mode, get some info about the current mode - if( _glfwWin.Fullscreen ) + if( _glfwWin.fullscreen ) { - // Get closest match for target video mode - mode = _glfwGetClosestVideoMode( _glfwWin.Scrn, &width, &height, &rate ); + // Get the closest matching video mode for the specified window size + mode = _glfwGetClosestVideoMode( _glfwWin.screen, &width, &height, &rate ); } - if( _glfwWin.WindowNoResize ) + if( _glfwWin.windowNoResize ) { - _glfwWin.Hints->min_width = _glfwWin.Hints->max_width = width; - _glfwWin.Hints->min_height = _glfwWin.Hints->max_height = height; - } + // Update window size restrictions to match new window size - XSetWMNormalHints( _glfwLibrary.Dpy, _glfwWin.Win, _glfwWin.Hints ); + sizehints = XAllocSizeHints(); + sizehints->flags = 0; + + sizehints->min_width = sizehints->max_width = width; + sizehints->min_height = sizehints->max_height = height; + + XSetWMNormalHints( _glfwLibrary.display, _glfwWin.window, sizehints ); + XFree( sizehints ); + } // Change window size before changing fullscreen mode? - if( _glfwWin.Fullscreen && (width > _glfwWin.Width) ) + if( _glfwWin.fullscreen && (width > _glfwWin.width) ) { - XResizeWindow( _glfwLibrary.Dpy, _glfwWin.Win, width, height ); - sizechanged = GL_TRUE; + XResizeWindow( _glfwLibrary.display, _glfwWin.window, width, height ); + sizeChanged = GL_TRUE; } - // Change fullscreen video mode? - if( _glfwWin.Fullscreen ) + if( _glfwWin.fullscreen ) { - // Change video mode (keeping current rate) - _glfwSetVideoModeMODE( _glfwWin.Scrn, mode, _glfwWin.RefreshRate ); - - // Clear the front buffer to black (avoid ugly desktop remains in - // our OpenGL window) - glGetIntegerv( GL_DRAW_BUFFER, &drawbuffer ); - glGetFloatv( GL_COLOR_CLEAR_VALUE, clearcolor ); - glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); - glClear( GL_COLOR_BUFFER_BIT ); - if( drawbuffer == GL_BACK ) - { - glXSwapBuffers( _glfwLibrary.Dpy, _glfwWin.Win ); - } - glClearColor( clearcolor[0], clearcolor[1], clearcolor[2], - clearcolor[3] ); + // Change video mode, keeping current refresh rate + _glfwSetVideoModeMODE( _glfwWin.screen, mode, _glfwWin.refreshRate ); } // Set window size (if not already changed) - if( !sizechanged ) + if( !sizeChanged ) { - XResizeWindow( _glfwLibrary.Dpy, _glfwWin.Win, width, height ); + XResizeWindow( _glfwLibrary.display, _glfwWin.window, width, height ); } } //======================================================================== -// _glfwPlatformSetWindowPos() - Set the window position. +// Set the window position. //======================================================================== void _glfwPlatformSetWindowPos( int x, int y ) { - // Set window position - XMoveWindow( _glfwLibrary.Dpy, _glfwWin.Win, x, y ); + XMoveWindow( _glfwLibrary.display, _glfwWin.window, x, y ); } //======================================================================== -// _glfwPlatformIconfyWindow() - Window iconification +// Window iconification //======================================================================== void _glfwPlatformIconifyWindow( void ) { - // We can't do this for override redirect windows - if( _glfwWin.OverrideRedirect ) + if( _glfwWin.overrideRedirect ) { + // We can't iconify/restore override-redirect windows, as that's + // performed by the window manager return; } - // In fullscreen mode, we need to restore the desktop video mode - if( _glfwWin.Fullscreen ) - { -#if defined( _GLFW_HAS_XF86VIDMODE ) - if( _glfwLibrary.XF86VidMode.Available ) - { - // Unlock mode switch - XF86VidModeLockModeSwitch( _glfwLibrary.Dpy, - _glfwWin.Scrn, - 0 ); - - // Change the video mode back to the old mode - XF86VidModeSwitchToMode( _glfwLibrary.Dpy, - _glfwWin.Scrn, &_glfwWin.FS.OldMode ); - } -#endif - _glfwWin.FS.ModeChanged = GL_FALSE; - } - - // Show mouse pointer - if( _glfwWin.PointerHidden ) - { - XUndefineCursor( _glfwLibrary.Dpy, _glfwWin.Win ); - _glfwWin.PointerHidden = GL_FALSE; - } - - // Un-grab mouse pointer - if( _glfwWin.PointerGrabbed ) - { - XUngrabPointer( _glfwLibrary.Dpy, CurrentTime ); - _glfwWin.PointerGrabbed = GL_FALSE; - } - - // Iconify window - XIconifyWindow( _glfwLibrary.Dpy, _glfwWin.Win, - _glfwWin.Scrn ); - - // Window is now iconified - _glfwWin.Iconified = GL_TRUE; + XIconifyWindow( _glfwLibrary.display, _glfwWin.window, _glfwWin.screen ); } @@ -1335,95 +1637,49 @@ void _glfwPlatformRestoreWindow( void ) { - // We can't do this for override redirect windows - if( _glfwWin.OverrideRedirect ) + if( _glfwWin.overrideRedirect ) { + // We can't iconify/restore override-redirect windows, as that's + // performed by the window manager return; } - // In fullscreen mode, change back video mode to user selected mode - if( _glfwWin.Fullscreen ) - { - _glfwSetVideoMode( _glfwWin.Scrn, - &_glfwWin.Width, &_glfwWin.Height, &_glfwWin.RefreshRate ); - } - - // Un-iconify window - XMapWindow( _glfwLibrary.Dpy, _glfwWin.Win ); - - // In fullscreen mode... - if( _glfwWin.Fullscreen ) - { - // Make sure window is in upper left corner - XMoveWindow( _glfwLibrary.Dpy, _glfwWin.Win, 0, 0 ); - - // Get input focus - XSetInputFocus( _glfwLibrary.Dpy, _glfwWin.Win, RevertToParent, - CurrentTime ); - } - - // Lock mouse, if necessary - if( _glfwWin.MouseLock ) - { - // Hide cursor - if( !_glfwWin.PointerHidden ) - { - XDefineCursor( _glfwLibrary.Dpy, _glfwWin.Win, - _glfwCreateNULLCursor( _glfwLibrary.Dpy, - _glfwWin.Win ) ); - _glfwWin.PointerHidden = GL_TRUE; - } - - // Grab cursor - if( !_glfwWin.PointerGrabbed ) - { - if( XGrabPointer( _glfwLibrary.Dpy, _glfwWin.Win, True, - ButtonPressMask | ButtonReleaseMask | - PointerMotionMask, GrabModeAsync, - GrabModeAsync, _glfwWin.Win, None, - CurrentTime ) == GrabSuccess ) - { - _glfwWin.PointerGrabbed = GL_TRUE; - } - } - } - - // Window is no longer iconified - _glfwWin.Iconified = GL_FALSE; + XMapWindow( _glfwLibrary.display, _glfwWin.window ); } //======================================================================== -// _glfwPlatformSwapBuffers() - Swap buffers (double-buffering) and poll -// any new events. +// Swap OpenGL buffers and poll any new events //======================================================================== void _glfwPlatformSwapBuffers( void ) { // Update display-buffer - glXSwapBuffers( _glfwLibrary.Dpy, _glfwWin.Win ); + glXSwapBuffers( _glfwLibrary.display, _glfwWin.window ); } //======================================================================== -// _glfwPlatformSwapInterval() - Set double buffering swap interval +// Set double buffering swap interval //======================================================================== void _glfwPlatformSwapInterval( int interval ) { - if( _glfwWin.SwapInterval ) + if( _glfwWin.has_GLX_SGI_swap_control ) { - _glfwWin.SwapInterval( interval ); + _glfwWin.SwapIntervalSGI( interval ); } } //======================================================================== -// _glfwPlatformRefreshWindowParams() +// Read back framebuffer parameters from the context //======================================================================== void _glfwPlatformRefreshWindowParams( void ) { + int dummy; + GLXFBConfig *fbconfig; #if defined( _GLFW_HAS_XRANDR ) XRRScreenConfiguration *sc; #elif defined( _GLFW_HAS_XF86VIDMODE ) @@ -1431,230 +1687,121 @@ int dotclock; float pixels_per_second, pixels_per_frame; #endif - int sample_buffers; + int attribs[] = { GLX_FBCONFIG_ID, _glfwWin.fbconfigID, None }; - // AFAIK, there is no easy/sure way of knowing if OpenGL is hardware - // accelerated - _glfwWin.Accelerated = GL_TRUE; - - // "Standard" window parameters - glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_RED_SIZE, - &_glfwWin.RedBits ); - glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_GREEN_SIZE, - &_glfwWin.GreenBits ); - glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_BLUE_SIZE, - &_glfwWin.BlueBits ); - glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_ALPHA_SIZE, - &_glfwWin.AlphaBits ); - glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_DEPTH_SIZE, - &_glfwWin.DepthBits ); - glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_STENCIL_SIZE, - &_glfwWin.StencilBits ); - glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_ACCUM_RED_SIZE, - &_glfwWin.AccumRedBits ); - glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_ACCUM_GREEN_SIZE, - &_glfwWin.AccumGreenBits ); - glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_ACCUM_BLUE_SIZE, - &_glfwWin.AccumBlueBits ); - glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_ACCUM_ALPHA_SIZE, - &_glfwWin.AccumAlphaBits ); - glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_AUX_BUFFERS, - &_glfwWin.AuxBuffers ); - - // Get stereo rendering setting - glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_STEREO, - &_glfwWin.Stereo ); - _glfwWin.Stereo = _glfwWin.Stereo ? 1 : 0; - - // Get multisample buffer samples - glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_SAMPLES, - &_glfwWin.Samples ); - glXGetConfig( _glfwLibrary.Dpy, _glfwWin.VI, GLX_SAMPLE_BUFFERS, - &sample_buffers ); - if( sample_buffers == 0 ) - _glfwWin.Samples = 0; - - // Default to refresh rate unknown (=0 according to GLFW spec) - _glfwWin.RefreshRate = 0; - - // Retrieve refresh rate, if possible -#if defined( _GLFW_HAS_XRANDR ) - if( _glfwLibrary.XRandR.Available ) + if( _glfwWin.has_GLX_SGIX_fbconfig ) { - sc = XRRGetScreenInfo( _glfwLibrary.Dpy, - RootWindow( _glfwLibrary.Dpy, _glfwWin.Scrn ) ); - _glfwWin.RefreshRate = XRRConfigCurrentRate( sc ); - XRRFreeScreenConfigInfo( sc ); + fbconfig = _glfwWin.ChooseFBConfigSGIX( _glfwLibrary.display, + _glfwWin.screen, + attribs, + &dummy ); } -#elif defined( _GLFW_HAS_XF86VIDMODE ) - if( _glfwLibrary.XF86VidMode.Available ) + else { - // Use the XF86VidMode extension to get current video mode - XF86VidModeGetModeLine( _glfwLibrary.Dpy, _glfwWin.Scrn, - &dotclock, &modeline ); - pixels_per_second = 1000.0f * (float) dotclock; - pixels_per_frame = (float) modeline.htotal * modeline.vtotal; - _glfwWin.RefreshRate = (int)(pixels_per_second/pixels_per_frame+0.5); + fbconfig = glXChooseFBConfig( _glfwLibrary.display, + _glfwWin.screen, + attribs, + &dummy ); } -#endif -} + if( fbconfig == NULL ) + { + // This should never ever happen + // TODO: Figure out what to do when this happens + fprintf( stderr, "Cannot find known GLXFBConfig by ID. " + "This cannot happen. Have a nice day.\n"); + abort(); + } -//======================================================================== -// _glfwPlatformPollEvents() - Poll for new window and input events -//======================================================================== + // There is no clear definition of an "accelerated" context on X11/GLX, and + // true sounds better than false, so we hardcode true here + _glfwWin.accelerated = GL_TRUE; -void _glfwPlatformPollEvents( void ) -{ - int winclosed = GL_FALSE; + _glfwWin.redBits = getFBConfigAttrib( *fbconfig, GLX_RED_SIZE ); + _glfwWin.greenBits = getFBConfigAttrib( *fbconfig, GLX_GREEN_SIZE ); + _glfwWin.blueBits = getFBConfigAttrib( *fbconfig, GLX_BLUE_SIZE ); - // Flag that the cursor has not moved - _glfwInput.MouseMoved = GL_FALSE; + _glfwWin.alphaBits = getFBConfigAttrib( *fbconfig, GLX_ALPHA_SIZE ); + _glfwWin.depthBits = getFBConfigAttrib( *fbconfig, GLX_DEPTH_SIZE ); + _glfwWin.stencilBits = getFBConfigAttrib( *fbconfig, GLX_STENCIL_SIZE ); - // Clear MapNotify and FocusIn counts - _glfwWin.MapNotifyCount = 0; - _glfwWin.FocusInCount = 0; + _glfwWin.accumRedBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_RED_SIZE ); + _glfwWin.accumGreenBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_GREEN_SIZE ); + _glfwWin.accumBlueBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_BLUE_SIZE ); + _glfwWin.accumAlphaBits = getFBConfigAttrib( *fbconfig, GLX_ACCUM_ALPHA_SIZE ); - // Use XSync to synchronise events to the X display. - // I don't know if this can have a serious performance impact. My - // benchmarks with a GeForce card under Linux shows no difference with - // or without XSync, but when the GL window is rendered over a slow - // network I have noticed bad event syncronisation problems when XSync - // is not used, so I decided to use it. - XSync( _glfwLibrary.Dpy, False ); + _glfwWin.auxBuffers = getFBConfigAttrib( *fbconfig, GLX_AUX_BUFFERS ); + _glfwWin.stereo = getFBConfigAttrib( *fbconfig, GLX_STEREO ) ? 1 : 0; - // Empty the window event queue - while( XPending( _glfwLibrary.Dpy ) ) + // Get FSAA buffer sample count + if( _glfwWin.has_GLX_ARB_multisample ) { - if( _glfwGetNextEvent() ) - { - winclosed = GL_TRUE; - } + _glfwWin.samples = getFBConfigAttrib( *fbconfig, GLX_SAMPLES ); } - - // Did we get mouse movement in locked cursor mode? - if( _glfwInput.MouseMoved && _glfwWin.MouseLock ) + else { - int maxx, minx, maxy, miny; - - // Calculate movement threshold - minx = _glfwWin.Width / 4; - maxx = (_glfwWin.Width * 3) / 4; - miny = _glfwWin.Height / 4; - maxy = (_glfwWin.Height * 3) / 4; - - // Did the mouse cursor move beyond our movement threshold - if(_glfwInput.CursorPosX < minx || _glfwInput.CursorPosX > maxx || - _glfwInput.CursorPosY < miny || _glfwInput.CursorPosY > maxy) - { - // Move the mouse pointer back to the window center so that it - // does not wander off... - _glfwPlatformSetMouseCursorPos( _glfwWin.Width/2, - _glfwWin.Height/2 ); - XSync( _glfwLibrary.Dpy, False ); - } + _glfwWin.samples = 0; } - // Was the window (un)iconified? - if( _glfwWin.MapNotifyCount < 0 && !_glfwWin.Iconified ) - { - // Show mouse pointer - if( _glfwWin.PointerHidden ) - { - XUndefineCursor( _glfwLibrary.Dpy, _glfwWin.Win ); - _glfwWin.PointerHidden = GL_FALSE; - } - - // Un-grab mouse pointer - if( _glfwWin.PointerGrabbed ) - { - XUngrabPointer( _glfwLibrary.Dpy, CurrentTime ); - _glfwWin.PointerGrabbed = GL_FALSE; - } + // Default to refresh rate unknown (=0 according to GLFW spec) + _glfwWin.refreshRate = 0; - _glfwWin.Iconified = GL_TRUE; + // Retrieve refresh rate if possible +#if defined( _GLFW_HAS_XRANDR ) + if( _glfwLibrary.XRandR.available ) + { + sc = XRRGetScreenInfo( _glfwLibrary.display, _glfwWin.root ); + _glfwWin.refreshRate = XRRConfigCurrentRate( sc ); + XRRFreeScreenConfigInfo( sc ); } - else if( _glfwWin.MapNotifyCount > 0 && _glfwWin.Iconified ) +#elif defined( _GLFW_HAS_XF86VIDMODE ) + if( _glfwLibrary.XF86VidMode.available ) { - // Restore fullscreen mode properties - if( _glfwWin.Fullscreen ) - { - // Change back video mode to user selected mode - _glfwSetVideoMode( _glfwWin.Scrn, &_glfwWin.Width, - &_glfwWin.Height, &_glfwWin.RefreshRate ); - - // Disable window manager decorations - _glfwEnableDecorations(); + // Use the XF86VidMode extension to get current video mode + XF86VidModeGetModeLine( _glfwLibrary.display, _glfwWin.screen, + &dotclock, &modeline ); + pixels_per_second = 1000.0f * (float) dotclock; + pixels_per_frame = (float) modeline.htotal * modeline.vtotal; + _glfwWin.refreshRate = (int)(pixels_per_second/pixels_per_frame+0.5); + } +#endif - // Make sure window is in upper left corner - XMoveWindow( _glfwLibrary.Dpy, _glfwWin.Win, 0, 0 ); + XFree( fbconfig ); +} - // Get input focus - XSetInputFocus( _glfwLibrary.Dpy, _glfwWin.Win, - RevertToParent, CurrentTime ); - } - // Hide cursor if necessary - if( _glfwWin.MouseLock && !_glfwWin.PointerHidden ) - { - if( !_glfwWin.PointerHidden ) - { - XDefineCursor( _glfwLibrary.Dpy, _glfwWin.Win, - _glfwCreateNULLCursor( _glfwLibrary.Dpy, - _glfwWin.Win ) ); - _glfwWin.PointerHidden = GL_TRUE; - } - } +//======================================================================== +// Poll for new window and input events +//======================================================================== - // Grab cursor if necessary - if( (_glfwWin.MouseLock || _glfwWin.Fullscreen) && - !_glfwWin.PointerGrabbed ) - { - if( XGrabPointer( _glfwLibrary.Dpy, _glfwWin.Win, True, - ButtonPressMask | ButtonReleaseMask | - PointerMotionMask, GrabModeAsync, - GrabModeAsync, _glfwWin.Win, None, - CurrentTime ) == GrabSuccess ) - { - _glfwWin.PointerGrabbed = GL_TRUE; - } - } +void _glfwPlatformPollEvents( void ) +{ + GLboolean closeRequested = GL_FALSE; - _glfwWin.Iconified = GL_FALSE; - } + // Flag that the cursor has not moved + _glfwInput.MouseMoved = GL_FALSE; - // Did the window get/lose focus - if( _glfwWin.FocusInCount > 0 && !_glfwWin.Active ) + // Process all pending events + while( XPending( _glfwLibrary.display ) ) { - // If we are in fullscreen mode, restore window - if( _glfwWin.Fullscreen && _glfwWin.Iconified ) + if( processSingleEvent() ) { - _glfwPlatformRestoreWindow(); + closeRequested = GL_TRUE; } - - // Window is now active - _glfwWin.Active = GL_TRUE; } - else if( _glfwWin.FocusInCount < 0 && _glfwWin.Active ) - { - // If we are in fullscreen mode, iconfify window - if( _glfwWin.Fullscreen ) - { - _glfwPlatformIconifyWindow(); - } - // Window is not active - _glfwWin.Active = GL_FALSE; - _glfwInputDeactivation(); + // Did we get mouse movement in fully enabled hidden cursor mode? + if( _glfwInput.MouseMoved && _glfwWin.pointerHidden ) + { + _glfwPlatformSetMouseCursorPos( _glfwWin.width/2, + _glfwWin.height/2 ); } - // Was there a window close request? - if( winclosed && _glfwWin.WindowCloseCallback ) + if( closeRequested && _glfwWin.windowCloseCallback ) { - // Check if the program wants us to close the window - winclosed = _glfwWin.WindowCloseCallback(); + closeRequested = _glfwWin.windowCloseCallback(); } - if( winclosed ) + if( closeRequested ) { glfwCloseWindow(); } @@ -1662,54 +1809,51 @@ //======================================================================== -// _glfwPlatformWaitEvents() - Wait for new window and input events +// Wait for new window and input events //======================================================================== void _glfwPlatformWaitEvents( void ) { XEvent event; - // Wait for new events (blocking) - XNextEvent( _glfwLibrary.Dpy, &event ); - XPutBackEvent( _glfwLibrary.Dpy, &event ); + // Block waiting for an event to arrive + XNextEvent( _glfwLibrary.display, &event ); + XPutBackEvent( _glfwLibrary.display, &event ); - // Poll events from queue _glfwPlatformPollEvents(); } //======================================================================== -// _glfwPlatformHideMouseCursor() - Hide mouse cursor (lock it) +// Hide mouse cursor (lock it) //======================================================================== void _glfwPlatformHideMouseCursor( void ) { // Hide cursor - if( !_glfwWin.PointerHidden ) + if( !_glfwWin.pointerHidden ) { - XDefineCursor( _glfwLibrary.Dpy, _glfwWin.Win, - _glfwCreateNULLCursor( _glfwLibrary.Dpy, - _glfwWin.Win ) ); - _glfwWin.PointerHidden = GL_TRUE; + XDefineCursor( _glfwLibrary.display, _glfwWin.window, _glfwWin.cursor ); + _glfwWin.pointerHidden = GL_TRUE; } // Grab cursor to user window - if( !_glfwWin.PointerGrabbed ) + if( !_glfwWin.pointerGrabbed ) { - if( XGrabPointer( _glfwLibrary.Dpy, _glfwWin.Win, True, + if( XGrabPointer( _glfwLibrary.display, _glfwWin.window, True, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, GrabModeAsync, GrabModeAsync, - _glfwWin.Win, None, CurrentTime ) == + _glfwWin.window, None, CurrentTime ) == GrabSuccess ) { - _glfwWin.PointerGrabbed = GL_TRUE; + _glfwWin.pointerGrabbed = GL_TRUE; } } } //======================================================================== -// _glfwPlatformShowMouseCursor() - Show mouse cursor (unlock it) +// Show mouse cursor (unlock it) //======================================================================== void _glfwPlatformShowMouseCursor( void ) @@ -1717,30 +1861,31 @@ // Un-grab cursor (only in windowed mode: in fullscreen mode we still // want the mouse grabbed in order to confine the cursor to the window // area) - if( _glfwWin.PointerGrabbed && !_glfwWin.Fullscreen ) + if( _glfwWin.pointerGrabbed ) { - XUngrabPointer( _glfwLibrary.Dpy, CurrentTime ); - _glfwWin.PointerGrabbed = GL_FALSE; + XUngrabPointer( _glfwLibrary.display, CurrentTime ); + _glfwWin.pointerGrabbed = GL_FALSE; } // Show cursor - if( _glfwWin.PointerHidden ) + if( _glfwWin.pointerHidden ) { - XUndefineCursor( _glfwLibrary.Dpy, _glfwWin.Win ); - _glfwWin.PointerHidden = GL_FALSE; + XUndefineCursor( _glfwLibrary.display, _glfwWin.window ); + _glfwWin.pointerHidden = GL_FALSE; } } //======================================================================== -// _glfwPlatformSetMouseCursorPos() - Set physical mouse cursor position +// Set physical mouse cursor position //======================================================================== void _glfwPlatformSetMouseCursorPos( int x, int y ) { - // Change cursor position + // Store the new position so we can recognise it later _glfwInput.CursorPosX = x; _glfwInput.CursorPosY = y; - XWarpPointer( _glfwLibrary.Dpy, None, _glfwWin.Win, 0,0,0,0, x, y ); + + XWarpPointer( _glfwLibrary.display, None, _glfwWin.window, 0,0,0,0, x, y ); } diff -Nru glfw-2.6/license.txt glfw-2.7.2/license.txt --- glfw-2.6/license.txt 2007-03-15 03:20:18.000000000 +0000 +++ glfw-2.7.2/license.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -Copyright (c) 2002-2007 Camilla Berglund - -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. - diff -Nru glfw-2.6/Makefile glfw-2.7.2/Makefile --- glfw-2.6/Makefile 2007-03-30 20:17:42.000000000 +0000 +++ glfw-2.7.2/Makefile 2010-06-03 14:22:15.000000000 +0000 @@ -1,7 +1,7 @@ ########################################################################### # GLFW top level Makefile -# $Date: 2007/03/30 20:17:42 $ -# $Revision: 1.10 $ +# $Date: 2007-10-26 14:33:43 $ +# $Revision: 1.11 $ # # This file works as a top level makefile for all supported systems and # compilers. It builds both the GLFW link library and the supplied example @@ -23,131 +23,118 @@ @echo "This is the makefile for the GLFW link library and example programs." @echo "Type one of the following:" @echo "-----------------------------------------------------------------------------" - @echo " $(MAKE) win32-mgw for MinGW32 for Windows" - @echo " $(MAKE) cross-mgw for MinGW32 for Windows on a Unix machine" + @echo " $(MAKE) win32-mingw to compile GLFW on MinGW on Windows" + @echo " $(MAKE) mingw-clean to remove any files generated by MinGW on Windows" + @echo "-----------------------------------------------------------------------------" + @echo " $(MAKE) win32-cygwin to compile GLFW on Windows native on Cygwin/MSYS" + @echo " $(MAKE) cygwin-clean to remove any files generated by Cygwin/MSYS" + @echo " $(MAKE) cygwin-install to install the GLFW library and header" + @echo "-----------------------------------------------------------------------------" + @echo " $(MAKE) win32-lcc to compile GLFW on LCC-Win32 for Windows" + @echo " $(MAKE) win32-ow to compile GLFW on OpenWatcom for Windows" + @echo " $(MAKE) win32-clean to remove any files generated by above compilers" + @echo "-----------------------------------------------------------------------------" + @echo " $(MAKE) cross-mgw for Unix-hosted MinGW cross-compile to Windows" + @echo " $(MAKE) cross-mgw-clean to remove any files generated by MinGW for Unix" @echo " $(MAKE) cross-mgw-install to install the GLFW library and header" - @echo " $(MAKE) cross-mgw-clean fo clean the GLFW library and header" - @echo " $(MAKE) win32-cygwin for Cygwin for Windows" - @echo " $(MAKE) win32-lcc for LCC-Win32 for Windows" - @echo " $(MAKE) win32-bcc for Borland C++ Builder 5.x for Windows" - @echo " $(MAKE) win32-msvc for MS Visual C++ 6.x for Windows" - @echo " $(MAKE) win32-ow for OpenWatcom for Windows" - @echo " $(MAKE) win32-pellesc for Pelles C for Windows" - @echo " $(MAKE) win32-clean to remove any compiled files for Windows" - @echo " $(MAKE) cygwin-clean to remove any compiled files for Cygwin/Windows" - @echo " $(MAKE) cygwin-install to install the GLFW library and header into Cygwin" @echo "-----------------------------------------------------------------------------" - @echo " $(MAKE) x11 for Unix/X11 (auto-configuring)" - @echo " $(MAKE) x11-clean to remove any compiled files for Unix/X11" + @echo " $(MAKE) x11 to compile GLFW for X11 on Unix-like systems" + @echo " $(MAKE) x11-clean to remove any files generated for Unix/X11" + @echo " $(MAKE) x11-dist-clean to also removed the generated build files" @echo " $(MAKE) x11-install to install the GLFW library and header" + @echo " $(MAKE) x11-dist-install to also install the GLFW shared library" @echo "-----------------------------------------------------------------------------" - @echo " $(MAKE) macosx-gcc for GCC for Mac OS X (free Apple SDK)" - @echo " $(MAKE) macosx-clean to remove any compiled files for Mac OS X" - @echo " $(MAKE) macosx-install to install the GLFW library and header" - @echo "-----------------------------------------------------------------------------" - @echo " $(MAKE) amigaos-gcc for AmigaOS for GCC (Geek Gadgets)" - @echo " $(MAKE) amigaos-vbcc for AmigaOS for VBCC" - @echo " $(MAKE) amigaos-clean to remove any compiled files for AmigaOS" + @echo " $(MAKE) cocoa to compile GLFW with GCC for Cocoa on Mac OS X" + @echo " $(MAKE) cocoa-clean to remove any files generated for Cocoa on Mac OS X" + @echo " $(MAKE) cocoa-install to install the GLFW library and header" @echo "-----------------------------------------------------------------------------" - @echo " $(MAKE) dos-djgpp for DOS for DJGPP" - @echo " $(MAKE) dos-clean to remove any compiled files for DOS" + @echo " There are also Visual Studio 2008 project files available in support/msvc80" @echo "-----------------------------------------------------------------------------" ########################################################################### -# List of example programs (used for cleanup) +# Bare MinGW on Windows ########################################################################### -EXAMPLES = boing \ - gears \ - keytest \ - listmodes \ - mipmaps \ - mtbench \ - mthello \ - particles \ - pong3d \ - splitview \ - triangle \ - wave +win32-mingw: + @.\\compile.bat $(MAKE) mingw -########################################################################### -# Windows -########################################################################### - -# Cleanup for Windows -win32-clean: +mingw-clean: @.\\compile.bat CLEAN -# Cleanup for Cygwin (Cygwin Make does not support local BAT-files) -cygwin-clean: - cd lib/win32 && $(MAKE) -f Makefile.win32.cygwin clean - cd examples && $(MAKE) -f Makefile.win32.cygwin clean + +########################################################################### +# Cygwin on Windows +########################################################################### cygwin-install: win32-cygwin cd lib/win32 && $(MAKE) -f Makefile.win32.cygwin install -# Cleanup for MinGW32 Cross compilation from Unix -cross-mgw-install: cross-mgw - cd lib/win32 && $(MAKE) -f Makefile.win32.cross-mgw install - -cross-mgw-clean: - cd lib/win32 && $(MAKE) -f Makefile.win32.cross-mgw clean - cd examples && $(MAKE) -f Makefile.win32.cross-mgw clean - - -# Windows, MinGW32 -win32-mgw: - @./compile.bat $(MAKE) mgw - -# Cross compilation from unix to win32 -cross-mgw: - cd lib/win32 && $(MAKE) -f Makefile.win32.cross-mgw - cd examples && $(MAKE) -f Makefile.win32.cross-mgw - -# Windows, Cygwin (Cygwin Make does not support local BAT-files) win32-cygwin: cd lib/win32 && $(MAKE) -f Makefile.win32.cygwin cd examples && $(MAKE) -f Makefile.win32.cygwin + cd tests && $(MAKE) -f Makefile.win32.cygwin + +cygwin-clean: + cd lib/win32 && $(MAKE) -f Makefile.win32.cygwin clean + cd examples && $(MAKE) -f Makefile.win32.cygwin clean + cd tests && $(MAKE) -f Makefile.win32.cygwin clean + + +########################################################################### +# Various compilers on Windows +########################################################################### # Windows, LCC-Win32 win32-lcc: @.\\compile.bat $(MAKE) lcc -# Windows, Borland C++ Builder Compiler 5.x -win32-bcc: - @.\\compile.bat $(MAKE) bcc - -# Windows, Microsoft Visual C++ -win32-msvc: - @.\\compile.bat $(MAKE) msvc - # Windows, OpenWatcom win32-ow: @.\\compile.bat $(MAKE) ow -# Windows, Pelles C -win32-pellesc: - @.\\compile.bat $(MAKE) pellesc +# Cleanup for Windows +win32-clean: + @.\\compile.bat CLEAN + + +########################################################################### +# MinGW cross-compile to Windows from Unix +########################################################################### + +cross-mgw-install: cross-mgw + cd lib/win32 && $(MAKE) -f Makefile.win32.cross-mgw install + +cross-mgw: + cd lib/win32 && $(MAKE) -f Makefile.win32.cross-mgw + cd examples && $(MAKE) -f Makefile.win32.cross-mgw + cd tests && $(MAKE) -f Makefile.win32.cross-mgw + +cross-mgw-clean: + cd lib/win32 && $(MAKE) -f Makefile.win32.cross-mgw clean + cd examples && $(MAKE) -f Makefile.win32.cross-mgw clean + cd tests && $(MAKE) -f Makefile.win32.cross-mgw clean ########################################################################### -# X11 (Unix and Unix-like systems) +# X11 on Unix-like systems ########################################################################### -MAKEFILES_X11_IN = lib/x11/Makefile.x11.in examples/Makefile.x11.in -MAKEFILES_X11 = lib/x11/Makefile.x11 examples/Makefile.x11 +MAKEFILES_X11_IN = lib/x11/Makefile.x11.in examples/Makefile.x11.in \ + tests/Makefile.x11.in + +MAKEFILES_X11 = lib/x11/Makefile.x11 examples/Makefile.x11 tests/Makefile.x11 # Cleanup for X11 (must be here due to generated makefile) -x11-clean: - rm -f $(MAKEFILES_X11) +x11-clean: $(MAKEFILES_X11) + cd lib/x11; $(MAKE) -f Makefile.x11 clean + cd examples; $(MAKE) -f Makefile.x11 clean + cd tests; $(MAKE) -f Makefile.x11 clean + +x11-dist-clean: x11-clean rm -f config.log - rm -f lib/x11/*.o - rm -f lib/x11/libglfw.a - rm -f lib/x11/libglfw.so - rm -f lib/x11/libglfw.pc + rm -f $(MAKEFILES_X11) rm -f lib/x11/libglfw.pc.in - cd examples; rm -f $(EXAMPLES) # Auto configuration for X11 $(MAKEFILES_X11) : compile.sh $(MAKEFILES_X11_IN) @@ -157,64 +144,31 @@ x11: $(MAKEFILES_X11) cd lib/x11; $(MAKE) -f Makefile.x11 cd examples; $(MAKE) -f Makefile.x11 + cd tests; $(MAKE) -f Makefile.x11 # X11 install x11-install: x11 cd lib/x11; $(MAKE) -f Makefile.x11 install - -########################################################################### -# Mac OS X -########################################################################### - -# Cleanup for Mac OS X -macosx-clean: - cd lib/macosx; $(MAKE) -f Makefile.macosx.gcc clean - cd examples; $(MAKE) -f Makefile.macosx.gcc clean - -# Mac OS X, GCC -macosx-gcc: macosx-gcc-library macosx-gcc-examples - -macosx-gcc-library: - cd lib/macosx; $(MAKE) -f Makefile.macosx.gcc - -macosx-gcc-examples: - cd examples; $(MAKE) -f Makefile.macosx.gcc - -# Mac OS X, GCC install -macosx-install: macosx-gcc-library - cd lib/macosx; $(MAKE) -f Makefile.macosx.gcc install +# X11 dist install +x11-dist-install: x11 + cd lib/x11; $(MAKE) -f Makefile.x11 dist-install ########################################################################### -# AmigaOS +# Cocoa on Mac OS X ########################################################################### -# Cleanup for AmigaOS -amigaos-clean: - @execute compile.ami CLEAN - -# AmigaOS, VBCC -amigaos-vbcc: - @execute compile.ami $(MAKE) vbcc - -# AmigaOS, GCC -amigaos-gcc: - @execute compile.ami $(MAKE) gcc - - -########################################################################### -# DOS -########################################################################### +cocoa: + cd lib/cocoa; $(MAKE) -f Makefile.cocoa + cd examples; $(MAKE) -f Makefile.cocoa + cd tests; $(MAKE) -f Makefile.cocoa -# Cleanup for DOS -dos-clean: - @rm -f lib/dos/*.o - @rm -f lib/dos/libglfw.a - @rm -f examples/*.exe +cocoa-clean: + cd lib/cocoa; $(MAKE) -f Makefile.cocoa clean + cd examples; $(MAKE) -f Makefile.cocoa clean + cd tests; $(MAKE) -f Makefile.cocoa clean -# DOS, DJGPP (GCC) -dos-djgpp: - @cd lib\dos; $(MAKE) -f Makefile.dos.djgpp - @cd examples; $(MAKE) -f Makefile.dos.djgpp +cocoa-install: + cd lib/cocoa; $(MAKE) -f Makefile.cocoa install diff -Nru glfw-2.6/readme.html glfw-2.7.2/readme.html --- glfw-2.6/readme.html 2007-07-01 22:26:25.000000000 +0000 +++ glfw-2.7.2/readme.html 2011-07-27 17:48:21.000000000 +0000 @@ -1,437 +1,665 @@ + - + GLFW Readme File - - - - - - - -
-
- -
- GLFW v2.6
- source distribution -
-   -
- +

GLFW 2.7.2 source distribution

-

-

-
-
    -
  1. Introduction
  2. -
  3. Compiling GLFW and the example programs
  4. -
  5. Installing GLFW
  6. -
  7. Using GLFW
  8. -
  9. Version history
  10. -
  11. Directory structure of the GLFW distribution
  12. -
  13. Contacting the project
  14. -
  15. Acknowledgements
  16. +
  17. Introduction
  18. +
  19. Compiling GLFW and the example programs
  20. +
  21. Installing GLFW
  22. +
  23. Using GLFW
  24. +
  25. Version history
  26. +
  27. Directory structure of the GLFW distribution
  28. +
  29. Contacting the project
  30. +
  31. Acknowledgements
-
-
-
- -


-
+

1. Introduction

-

Welcome to version 2.6 of the GLFW OpenGL framework. GLFW is a free, open -source, portable framework for OpenGL application development. In short, it is -a library that constitutes a powerful API for handling operating system -specific tasks, such as opening an OpenGL window, reading keyboard and mouse -input, creating threads, and much more.

+

Welcome to version 2.7.2 of the GLFW library. GLFW is a free, Open Source, +multi-platform library for OpenGL application development that provides a +powerful API for handling operating system specific tasks such as opening an +OpenGL window, reading keyboard, mouse, joystick and time input, creating +threads, and more.

-


+

GLFW 2.7 is expected to be the last major release of the 2.x series, with +most development now being done on what will become version 3.0.

-
+

This release brings support for OpenGL 3.2 on OS X Lion and adds a number of +bug fixes for minor issues in 2.7.1.

+ + +

2. Compiling GLFW and the example programs

A top level makefile can be found in the root directory of the GLFW distribution that has been designed to work with several compilers. If you -simply enter the GLFW root directory in a shell and type make (or -nmake or gmake, depending on the name of your make tool), and a -list should appear with the currently supported options for systems and -compilers.

+simply enter the GLFW root directory in a shell and type make (or +nmake or gmake, depending on the name of your make +tool), and a list should appear with the currently supported options for +systems and compilers.

For example, one of the options is to compile GLFW for Windows with the -LCC-Win32 C compiler. To do that, type make win32-lcc in the shell (as -specified in the previously mentioned list). That will compile the GLFW static -link library and the supplied example programs. For Windows compilers, a Win32 -DLL will also be compiled.

+LCC-Win32 C compiler, i.e.:

-

Currently supported compilers and systems are: +

make win32-lcc
-
    -
  1. Borland C++ Builder compiler 5.x for Windows
  2. -
  3. Cygwin (GCC) for Windows
  4. +

    That will compile the GLFW static link library and the supplied example +programs. For Windows compilers, a Win32 DLL will also be compiled.

    + +

    Currently supported compilers and systems are:

    + +
      +
    • Microsoft Visual C++ 2008 and later
    • +
    • MSYS or Cygwin for Windows
    • +
    • Bare MinGW for Windows
    • LCC-Win32 for Windows
    • -
    • Microsoft Visual C++ 6.x for Windows
    • -
    • MinGW32 (GCC) for Windows
    • OpenWatcom for Windows
    • -
    • Pelles C for Windows
    • -
    • Unix or Unix-like systems running the X Window System (auto detect - compiler, or force GCC)
    • -
    • Apple Developer Tools (GCC) for Mac OS X
    • -
+
  • MinGW cross-compilation for Unix or Unix-like systems
  • +
  • Unix or Unix-like systems running the X Window System
  • +
  • Apple GCC or Clang on Mac OS X
  • + -

    If your compiler/system is not in the list, you will have to create new -makefiles in the lib\win32, lib/x11 or lib/macosx -directory, and in the examples directory. If you have any problems, -please use our support forum and bug tracker on SourceForge.net. We would like -to add support for more compilers and verify that GLFW compiles under as many -systems as possible, so if you had to make any modifications or additions to -the source and/or makefiles in order to make GLFW compile successfully, we -would like to know what you had to do.

    - - -

    2.1 Note for Microsoft Visual C++ users

    - -

    When MSVC is installed, you are asked if it should be possible to access the -compiler from the command line. For some strange reason, the default answer to -this question is NO. If you answered no to this question you will have to run a -file named VCVARS32.BAT, which is located in the bin directory of -your Visual C++ folder, before you can use the compiler from the command -line.

    - -

    Note that VCVARS32.BAT must be run from the same shell as you intend -to use for compiling GLFW (simply clicking on the file from the explorer will -not work).

    - -

    After that is done, it is possible to compile GLFW by entering the GLFW root -directory and issuing nmake win32-msvc.

    - -

    For instance, if MSVC is installed in the directory 'C:\Program -Files\Microsoft Developer Studio\VC98', then you should be able to compile GLFW -with this procedure:

    +

    There are also project files available for Microsoft Visual C++ 2008 and +2010 in the support/msvc90 and support/msvc100 +directories.

    -
      -
    1. Start a command prompt (MS-DOS prompt)
    2. -
    3. "CD" to the directory where you unzipped the GLFW source - distribution (where this readme file is located)
    4. -
    5. Type "C:\Program Files\Microsoft Developer - Studio\VC98\BIN\VCVARS32" (with quotation marks)
    6. -
    7. Type nmake win32-msvc
    8. -
    +

    If your compiler/system is not in the list, you may have to create new +makefiles in the lib\win32, lib/x11 or +lib/cocoa directory, and in the examples directory. +If you have any problems, please use our +support forum +and +bug tracker +on SourceForge.net. We would like to support as many systems as possible, so if +you had to make any modifications or additions to the source and/or makefiles +in order to make GLFW compile successfully, we would very much like to know +what you had to do.

    + + +

    2.1 Microsoft Windows

    + +

    When building GLFW as a DLL (dynamic link library), all compilation units +need to have the GLFW_BUILD_DLL macro defined. All build methods +listed below already does this, but you need to do it yourself if you are +making a custom build. Without this macro, the GLFW DLL will not export +functions correctly and code calling the DLL will be incorrectly generated.

    + +

    2.1.1 Microsoft Visual C++ 2008 and later

    +

    Project files for both the static and dynamic versions of the GLFW library +are provided in the support/msvc90 and +support/msvc100 directories.

    -

    2.2 Note for MinGW/DevC++ users

    -

    Do not use the MSYS shell for compiling GLFW, because the supplied batch -file "compile.bat" will only work under a Windows command prompt (or MS-DOS -prompt).

    +

    2.1.2 MSYS or Cygwin on Windows

    -

    Under Windows 98, the MinGW make program may set the $(MAKE) variable -incorrectly. To remedy this, uncomment the line at the beginning of the top -level Makefile that says MAKE = make (possibly replacing make with some other -name, e.g. mingw32-make).

    +

    GLFW can be cross-compiled to native Win32 code using the Cygwin +environment. The Cygwin build path will also work on MinGW with MSYS.

    +

    Open a Cygwin or MSYS shell, enter the GLFW root directory and run make with +the win32-cygwin target.

    -

    2.3 Note for Cygwin users

    -

    The Cygwin makefile was designed to run from a Cygwin bash shell. You -can not use an MS-DOS prompt (or NT cmd prompt) to compile GLFW with the -win32-cygwin option. Similarly, the win32-clean option will not work from a -Cygwin shell, which is why there is a special cygwin-clean option.

    +

    2.1.3 Bare MinGW on Windows

    +

    GLFW can be compiled using only bare bone MinGW, using the Windows +command-line environment for file management. Open a regular command prompt, +enter the GLFW root directory and run the MinGW make program +mingw32-make with the win32-mingw target.

    -

    2.4 Note for OpenWatcom users

    -

    In order to compile GLFW successfully with OpenWatcom (for Windows), -execute "nmake MAKE=nmake win32-ow" in the GLFW root directory. Also make -sure that you have all your environment variables set up correctly. It is -the default option when installing OpenWatcom to permanently set up all -the required environment variables. If nmake does not work, you probably -have to run "WATCOM\setvars.bat" from the command prompt before executing -nmake, where WATCOM is the directory in which you installed OpenWatcom -(e.g. C:\Watcom).

    +

    2.1.4 OpenWatcom on Windows

    +

    GLFW can be compiled using OpenWatcom +for Windows by running the following in the GLFW root directory:

    -

    2.5 Note for Pelles C users

    +
    nmake MAKE=nmake win32-ow
    -

    To build GLFW with Pelles C, you need at lest version 2.80.3 of Pelles C -(POCC and POLINK).

    +

    Also make sure that you have all your environment variables set up +correctly. It is the default option when installing OpenWatcom to permanently +set up all the required environment variables. If nmake is +unavailable, you probably have to run WATCOM\setvars.bat from the +command prompt first, where WATCOM is the directory in which you +installed OpenWatcom (e.g. C:\Watcom).

    -

    Type 'pomake win32-pellesc' to build GLFW.

    +

    2.1.5 MinGW cross-compilation for Unix or Unix-like systems

    -

    2.6 Note for Unix/X11 users

    +

    Some Unix-like systems have a MinGW cross-compilation package for compiling +native Win32 binaries, for example the mingw32 package on Debian +GNU/Linux and its derivatives. You can use this to build Win32 binaries of +GLFW and all examples without having to run Microsoft Windows. Use the regular +make program with the cross-mgw target. These binaries are also +regularly tested with Wine.

    + + +

    2.2 X11 on Unix-like systems

    Compiler and link library capabilities are auto-detected with a script -called compile.sh. It has been tested under Linux Mandrake 10.1, Mac OS -X 10.2, SunOS 5.6 (GCC), IRIX 5.3, FreeBSD 5.0 and QNX, but should hopefully -run on the majority of available Unix/Unix-like systems and generate functional -Makefiles. You do not have to run the script manually, since it is called from -the top level Makefile.

    +called compile.sh. Note that you don't need to run this script +yourself, as it is run automatically when necessary. It has been tested under +Ubuntu Linux, Slackware Linux, Debian GNU/Linux and others and should +hopefully run on the majority of available Unix-like systems and generate +functional Makefiles. You do not have to run the script manually, since it is +called from the top-level makefile.

    + +

    If you wish to customize the compilation or link flags for GLFW, set the +CFLAGS or LFLAGS environment variables as needed +before building the library. These flags will be picked up and added to the +generated Makefile.x11 files.

    + +

    If you wish to use a certain compiler, set the CC environment +variable before building the library. This will also be stored in the +generated Makefile.x11 files.

    + +

    If you have already configured your source tree, you can reset it to an +un-configured state by running make with the x11-dist-clean +target.

    + +

    If you are making your own build setup for GLFW, you need to be aware of the +various preprocessor symbols that the bundled makefiles use to enable various +features and code paths. They need to be defined either on the command-line or +at the very beginning for each GLFW source file with an x11_ +prefix.

    + +

    Note that the X11 port of GLFW compiles on Mac OS X, but is currently unable +to open a window when running against X11.app, due to Apple's incomplete +implementation of GLXFBConfigs.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    _GLFW_USE_LINUX_JOYSTICKSUse the Linux joystick API. This is the only supported API for the X11 + port. Without it, joystick input will be unavailable.
    _GLFW_HAS_XRANDRUse the X Resize and Rotate extension for display mode changes. This is + the preferred method.
    _GLFW_HAS_XF86VIDMODEUse the Xf86VidMode extension for display mode changes. This is a + fall-back method.
    _GLFW_HAS_PTHREADUse the POSIX Threads API for threading. This is the only supported API + for the X11 port. Without it, threading will be disabled.
    _GLFW_HAS_SCHED_YIELDCall the sched_yield function inside glfwPlatformSleep.
    _GLFW_HAS_GLXGETPROCADDRESSUse the glXGetProcAddress function to retrieve OpenGL + entry point addresses.
    _GLFW_HAS_GLXGETPROCADDRESSARBUse the glXGetProcAddressARB function to retrieve OpenGL + entry point addresses.
    _GLFW_HAS_GLXGETPROCADDRESSEXTUse the glXGetProcAddressEXT function to retrieve OpenGL + entry point addresses.
    _GLFW_HAS_DLOPENUse dlopen on the OpenGL shared library to retrieve OpenGL + entry point addresses. This is a fall-back method.
    _GLFW_HAS_SYSCONFUse the sysconf API to find the number of processors.
    _GLFW_HAS_SYSCTLUse the sysctl API to find the number of processors.
    + + +

    2.3 Apple GCC or Clang on Mac OS X

    +

    To compile GLFW for Mac OS X, you will need to have installed the Developer +Tools. A version of these tools can be found on your Mac OS X disc, with newer +versions available from the Apple Developer Connection site. When they are +installed, simply open Terminal and go to the root GLFW directory. From there, +you can build the library and all the examples by running make with the +appropriate target, i.e.:

    -

    2.8 Note for Mac OS X users

    +
    make cocoa
    -

    To compile GLFW for Mac OS X, you will need to have installed the BSD -subsystem and the Developer Tools, which can be found on your Mac OS X CD:s. -When they are installed, simply open Terminal and go to the root GLFW -directory. From there, you can build the library and all the examples by -running make, i.e. make macosx-gcc.

    +

    The default compiler for the Cocoa port of GLFW is cc, which as +of Mac OS X 10.6 still defaults to GCC, but you can override this using the +CC environment variable. For example, to build GLFW using Clang, +use:

    +
    env CC=clang make cocoa
    +

    There is also a deprecated Carbon port of GLFW, which is limited to +32-bit code and only runs well on Mac OS X 10.3 and 10.4. However, if you +need to build applications for those systems, it is a better choice than +the Cocoa port, which uses APIs unavailable on systems older than 10.5.

    -


    - +

    3. Installing GLFW

    3.1 Windows

    After compiling GLFW with MinGW or Cygwin, three files of interest should -have appeared in the lib\win32 directory. They are: libglfw.a -(the static link version of GLFW), glfw.dll (the DLL version of GLFW) -and libglfwdll.a (the DLL import library).

    +have appeared in the lib\win32 directory. They are: +libglfw.a (the static link version of GLFW), glfw.dll +(the DLL version of GLFW) and libglfwdll.a (the DLL import +library).

    To install GLFW on Cygwin (and possibly MinGW), run make with the -cygwin-install target. This will generate the pkgconfig file and copy -it, the header file and the library to the correct locations of your Cygwin -installation. If you wish to change the installation location from its default, -set the desired prefix path with the environment variable PREFIX.

    +cygwin-install target. This will generate the pkg-config file and +copy it, the header file and the library to the correct locations of your +Cygwin installation. If you wish to change the installation location from its +default, set the desired prefix path with the environment variable +PREFIX.

    If you used Borland C++ Builder, LCC-Win32, Microsoft Visual C++ or -OpenWatcom, the files are named glfw.lib (the static link version of -GLFW), glfw.dll (the DLL version of GLFW) and glfwdll.lib (the -DLL import library).

    +OpenWatcom, the files are named glfw.lib (the static link version +of GLFW), glfw.dll (the DLL version of GLFW) and +glfwdll.lib (the DLL import library).

    The static link library and the DLL import library should be copied to your -compiler's LIB directory (where all other link libraries are located). -The DLL can be copied either to your Windows system directory (where +compiler's LIB directory (where all other link libraries are +located). The DLL can be copied either to your Windows system directory (where opengl32.dll is located), or to the project directory of your GLFW-based -projects (where you place your compiled EXEs).

    +projects (where you place your executable files).

    -

    You should also copy the GLFW include file, include\GL\glfw.h, to the -GL directory of your compiler's include directory (where gl.h, glu.h -etc. are located).

    +

    You should also copy the GLFW include file, include\GL\glfw.h, +to the GL directory of your compiler's include directory (i.e. +where gl.h, glu.h etc. are located).

    3.2 Unix

    -

    After compiling GLFW, three files named libglfw.pc.in, -libglfw.a and libglfw.so should have appeared in the -lib/x11 directory. This is the pkgconfig template file, the GLFW static -link library and the GLFW shared library, respectively.

    +

    After compiling GLFW, three files named libglfw.pc.in, +libglfw.a and libglfw.so should have appeared in the +lib/x11 directory. This is the pkg-config template file, the GLFW +static link library and the GLFW shared library, respectively.

    To install GLFW onto your system, run make as root with the -x11-install build target. This will install the pkgconfig file, the +x11-install make target. This will install the pkg-config file, the static library and the header. By default, the files will be installed under -/usr/local. If you wish to install to a different location, set the -environment variable PREFIX appropriately when running make.

    +/usr/local. If you wish to install to a different location, set the +PREFIX environment variable appropriately when running make.

    Note that the shared library is not installed by default, as you really should think twice before using it. GLFW is very small and shared library distribution on Unix outside of packaging systems is quite tricky. The GLFW -license also allows static linking without requiring your to share your +license also allows static linking without requiring you to share your code.

    +

    However, if you're a *nix distribution packager, use a language binding or +for some other reason wish to install the shared library along with the rest, +run make with the x11-distro-install target.

    +

    3.4 Mac OS X

    -

    After compiling GLFW, three files named libglfw.pc.in, -libglfw.a and libglfw.dylib should appear in the -lib/macosx directory. This is the pkgconfig template file, the GLFW +

    After compiling GLFW, three files named libglfw.pc.in, +libglfw.a and libglfw.dylib should appear in the +lib/cocoa directory. This is the pkg-config template file, the GLFW static link library and the GLFW dynamic library, respectively.

    To install GLFW onto your system, run make with sudo and the -macosx-install build target, i.e.:

    +cocoa-install build target, i.e.:

    -

      sudo make macosx-install +

    sudo make cocoa-install
    -

    This will install the pkgconfig file, the -static library and the header. By default, the files will be installed under -/usr/local. If you wish to install to a different location, set -the environment variable PREFIX appropriately when running make.

    +

    This will install the pkg-config file, the static library and the header. By +default, the files will be installed under /usr/local. If you wish +to install to a different location, set the environment variable +PREFIX appropriately when running make.

    Note that the shared library is not installed by default, as you really -should think twice before using it. GLFW is very small and very sutable for +should think twice before using it. GLFW is very small and very suitable for static linking. The GLFW license also allows static linking without requiring your to share your code.

    +
    +

    4. Using GLFW

    -
    -

    4. Using GLFW

    +

    There are two aspects to using GLFW:

    -

    There are two aspects to using GLFW: - -

    1. How does the GLFW API work
    2. How to compile programs that use GLFW
    -

    The first point is covered in the GLFW -Users Guide and the GLFW Reference -Manual, and we suggest that you read at least the Users Guide, since -it's a good introduction to the GLFW API.

    +

    The first point is covered in the +GLFW Users Guide and the +GLFW Reference Manual, and we suggest that you +read at least the Users Guide, since it's a good introduction to the GLFW +API.

    Designing and compiling programs that use GLFW is not very difficult. A few rules for successfully designing GLFW-based programs are presented in the following sections.

    -


    4.1 Include <GL/glfw.h>

    +

    4.1 Include the GLFW header file

    -

    In your program, you should include <GL/glfw.h>. This include -file defines all the necessary constants, types and prototypes that are -used to interact with the GLFW API. It also includes <GL/gl.h> and -<GL/glu.h>, and - this is very important - it defines -all the necessary constants and types that are necessary for OpenGL to -work on different platforms.

    - -

    For instance, under Windows you are normally required to include -<windows.h> before you include <GL/gl.h>. If you write such a -program, it would not compile under e.g. Linux since <windows.h> -does not exist under Linux. <GL/glfw.h> takes care of these things -for you. Note however that it does not actually include <windows.h>, -it merely mimics the parts of it that are needed for <GL/gl.h> and -<GL/glu.h> (this way we do not get the thousands of constants, -types and prototypes that could otherwise possibly interfere with our own -declarations).

    +

    In the files of your program where you use OpenGL or GLFW, you should +include the GL/glfw.h header file, i.e.:

    + +
    #include <GL/glfw.h>
    + +

    This defines all the constants, types and function prototypes of the GLFW +API. It also includes the gl.h and GL/glu.h header +files, and - this is very important - it defines all the necessary +constants and types that are necessary for the OpenGL headers to work on +different platforms.

    + +

    For example, under Microsoft Windows you are normally required to include +windows.h before you include GL/gl.h. This would +however make your code dependent on the Windows platform, or at least require +your program to check which platform it is being compiled on. + +The GLFW header file takes care of this for you, not by including +windows.h, but rather by itself duplicating the necessary parts of +it. This way, the namespace won't be cluttered by the entire Windows API.

    In other words:

      -
    • Do not include <GL/gl.h> or <GL/glu.h>! (GLFW - does it for you)
    • -
    • Do not include <windows.h>! (unless you really need - it)
    • +
    • Do not include GL/gl.h or GL/glu.h + yourself, as GLFW does this for you
    • +
    • Do not include windows.h unless you actually need + direct access to the Windows API
    • +
    • If you do need to include windows.h, do it + before including GL/glfw.h and the GLFW header will + detect this.

    -

    Note: If you do need to include <windows.h>, do it -before including <GL/glfw.h>.

    +

    Also note that if you are using an OpenGL extension loading library such as +GLEW, you should include the GLEW +header before the GLFW one. The GLEW header defines macros that +disable any gl.h that the GLFW header includes and GLEW will work +as expected.

    + -


    4.2 Link with the right libraries

    +

    4.2 Link with the right libraries

    -

    4.2.1 Windows static library

    +

    4.2.1 Windows static library

    If you link with the static version of GLFW, it is also necessary to link with some system libraries that GLFW uses.

    -

    When linking a program under Windows that uses the static version of -GLFW, you must also link with the following libraries: opengl32, -user32 and kernel32. Some of these libraries may be linked -with by default by your compiler. In the table below you can see the -minimum required link options for each supported Windows compiler (you may -want to add other libraries as well, such as glu32):

    - -

    - - - - - - - - +

    When linking a program under Windows that uses the static version of GLFW, +you must also link with the following libraries: opengl32, +user32 and kernel32. Some of these libraries may be +linked with by default by your compiler. In the table below you can see the +minimum required link options for each supported Windows compiler (you may want +to add other libraries as well, such as glu32):

    + +
    CompilerLink options
    Borland C++ Builderglfw.lib opengl32.lib
    CygwinSee Unix static library below
    LCC-Win32glfw.lib opengl32.lib
    Microsoft Visual C++glfw.lib opengl32.lib user32.lib
    MinGW32-lglfw -lopengl32
    OpenWatcomglfw.lib opengl32.lib user32.lib
    Pelles Cglfw.lib opengl32.lib user32.lib kernel32.lib
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CompilerLink options
    Borland C++ Builderglfw.lib opengl32.lib
    CygwinSee Unix static library below
    LCC-Win32glfw.lib opengl32.lib
    Microsoft Visual C++glfw.lib opengl32.lib user32.lib
    MinGW32-lglfw -lopengl32
    OpenWatcomglfw.lib opengl32.lib user32.lib
    -


    4.2.2 Windows DLL

    +

    4.2.2 Windows DLL

    To compile a program that uses the DLL version of GLFW, you need to -define the GLFW_DLL constant. This can either be done with a -compiler switch, typically by adding -DGLFW_DLL to the list of -compiler options. You can also do it by adding the line:

    +define the GLFW_DLL constant. This can either be done with a +compiler switch, typically by adding -DGLFW_DLL to the list of +compiler options. You can also do it by adding the following line to all your +source files before including the GLFW header file:

    -

    #define GLFW_DLL - -

    ...to all your source files that include glfw.h, before -including it.

    +
    #define GLFW_DLL

    When linking a program under Windows that uses the DLL version of GLFW, -the only library you need to link with for GLFW to work is glfwdll. +the only library you need to link with for GLFW to work is glfwdll. In the table below you can see the minimum required link options for each supported Windows compiler (you may want to add other libraries as well, -such as opengl32 and glu32):

    +such as opengl32 and glu32):

    -

    - - - - - - - - +
    CompilerLink options
    Borland C++ Builderglfwdll.lib
    Cygwin-lglfwdll
    LCC-Win32glfwdll.lib
    Microsoft Visual C++glfwdll.lib
    MinGW32-lglfwdll
    OpenWatcomglfwdll.lib
    Pelles Cglfwdll.lib
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CompilerLink options
    Borland C++ Builderglfwdll.lib
    Cygwin-lglfwdll
    LCC-Win32glfwdll.lib
    Microsoft Visual C++glfwdll.lib
    MinGW32-lglfwdll
    OpenWatcomglfwdll.lib
    -


    4.2.3 Unix static library

    +

    4.2.3 Unix static library

    -

    GLFW now supports pkgconfig, and a libglfw.pc file is generated and -installed when you install the library. For systems that do not provide -pkgconfig, you should look in this file for the proper compile and link -flags for your system, as determined by compile.sh at compile time.

    +

    GLFW supports +pkg-config, +and a libglfw.pc file is generated and installed when you install +the library. For systems that do not provide pkg-config, you should look in +this file for the proper compile and link flags for your system, as determined +by compile.sh at compile time.

    -

    A typical compile and link command line may look like this (using GCC):

    +

    A typical compile and link command-line may look like this:

    -

      gcc `pkg-config --cflags libglfw` -o myprog myprog.c `pkg-config --libs libglfw` +

    cc `pkg-config --cflags libglfw` -o myprog myprog.c `pkg-config --libs libglfw`

    If you use GLU functions in your program you should also add --lGLU.

    +-lGLU to your link flags.

    -


    4.2.5 Mac OS X static library

    +

    4.2.5 Mac OS X static library

    When compiling and linking a program under Mac OS X that uses GLFW, you -must also link with the following frameworks: Carbon.framework, -AGL.framework and OpenGL.framework. +must also link with Cocoa and OpenGL frameworks. -

    If you are using Xcode, you simply add the GLFW library libglfw.a and +

    If you are using Xcode, you simply add the GLFW library libglfw.a and these frameworks to your project. If, however, you are building your program -from the command line, there are two methods for correctly linking your GLFW +from the command-line, there are two methods for correctly linking your GLFW program.

    -

    GLFW now supports pkgconfig, and a libglfw.pc -file is generated and installed when you install the library. You can find -pkgconfig in most packaging systems, such as Fink and DarwinPorts, so if you have one -of them installed, simply install pkgconfig. Once you have pkgconfig available, -the command line for compiling and linking your program is:

    - -

      gcc `pkg-config --cflags libglfw` -o myprog myprog.c `pkg-config --libs libglfw` - -

    If you do not wish to use pkgconfig, you will need to add the required -frameworks and libraries to your command line using the -l and --framework switches, i.e.:

    +

    GLFW supports +pkg-config, and a +libglfw.pc file is generated and installed when you install the library. You +can find pkg-config in most packaging systems, such as +Fink and +MacPorts, so if you have one of them +installed, simply install pkg-config. Once you have pkg-config available, the +command-line for compiling and linking your program is:

    + +
    cc `pkg-config --cflags libglfw` -o myprog myprog.c `pkg-config --libs libglfw`
    + +

    If you do not wish to use pkg-config, you will need to add the required +frameworks and libraries to your command-line using the -l and +-framework switches, i.e.:

    -

      gcc -o myprog myprog.c -lglfw -framework Carbon -framework AGL -framework OpenGL +

    cc -o myprog myprog.c -lglfw -framework Cocoa -framework OpenGL

    Note that you do not add the .framework extension to a framework when adding -it from the command line.

    +it from the command-line.

    -

    These frameworks contain all GL and GLU functions, so there is no need to +

    These frameworks contain all OpenGL and GLU functions, so there is no need to add additional libraries or frameworks when using GLU functionality. Also note -that even though your machine may have Unix-style GL libraries, they are for -use with the X Window System, and will not work with the Mac OS X native +that even though your machine may have Unix-style OpenGL libraries, they are for +use with the X Window System, and will not work with the Mac OS X native version of GLFW.

    + +

    5. Version history

    -
    -

    5. Version history

    +

    v2.7.2

    +
      +
    • Added library version check to dynamic linking test
    • +
    • [Cocoa] Added support for OpenGL 3.2 core profile in 10.7 Lion and above
    • +
    • [Cocoa] Made relevant CFLAGS overridable
    • +
    • [Cocoa] Bugfix: The OpenGL framework pointer was not retrieved, making glfwGetProcAddress fail
    • +
    • [Cocoa] Bugfix: The Cocoa layer was not notified that the application may be multithreaded
    • +
    + +

    v2.7.1

    +
      +
    • Clarified language in the Reference Manual concerning window hint resetting
    • +
    • Bugfix: The OpenGL profile and forward-compatibility window parameters were not set
    • +
    • Bugfix: The default OpenGL version in the version test was set to 1.1
    • +
    • Bugfix: The FSAA test did not check for the availability of GL_ARB_multisample
    • +
    • Bugfix: The window could be left in a closed state but still be flagged as open
    • +
    • Bugfix: glfwGetWindowSize did not check whether GLFW was initialized or whether the window was open
    • +
    • [Cocoa] Bugfix: The loop condition for saving video modes used the wrong index variable
    • +
    • [Cocoa] Bugfix: The iconified and active window states were not tracked
    • +
    • [X11] Cleaned up depdendencies for libglfw.pc file
    • +
    • [X11] Bugfix: The dlopen fallback method for glfwGetProcAddress had been broken by unrelated edits
    • +
    • [X11] Bugfix: Calling glXCreateContextAttribsARB with an unavailable OpenGL version caused the application to terminate with a BadMatch Xlib error
    • +
    • [X11] Bugfix: GLFW_WINDOW_NO_RESIZE was honored in fullscreen mode
    • +
    • [Win32] Added Visual C++ 2010 project files for the GLFW DLL and static library to the support/msvc100 directory
    • +
    • [Win32] Enabled _GLFW_NO_DLOAD_GDI32 and _GLFW_NO_DLOAD_WINMM for the DLL build
    • +
    • [Win32] Bugfix: compile.bat used Unix-style line endings
    • +
    • [Win32] Bugfix: The WGLSWAPINTERVALEXT_T, WGLGETEXTENSIONSSTRINGARB_T and WGLGETEXTENSIONSSTRINGEXT_T typedefs were declared under WGL_ARB_pixel_format
    • +
    • [Win32] Bugfix: The array for WGL context attributes was too small and could overflow
    • +
    • [Win32] Bugfix: Context creation using profiles did not check for the availability of WGL_ARB_create_context_profile
    • +
    • [Win32] Bugfix: Context recreation logic was overly conservative, leading to unnecessary recreations
    • +
    • [Win32] Bugfix: Window focus was not handled correctly when using glfwInconifyWindow
    • +
    + +

    v2.7

    +
      +
    • Added GLFW_OPENGL_VERSION_MAJOR and GLFW_OPENGL_VERSION_MINOR + hints for versioned context creation
    • +
    • Added GLFW_OPENGL_FORWARD_COMPAT hint for forward compatible context creation
    • +
    • Added GLFW_OPENGL_DEBUG_CONTEXT hint for debug context creation
    • +
    • Added GLFW_OPENL_PROFILE hint for context creation using profiles
    • +
    • Added GLFW_NO_GLU macro for disabling the inclusion of the GLU header by the GLFW header
    • +
    • Added platform-independent pixel format selection (not used on Mac OS X)
    • +
    • Added support and symbols for several additional keys, including Windows/Command keys, Pause, Caps Lock and Menu
    • +
    • Added conservative value clamping to glfwOpenWindowHint
    • +
    • Added a number of test programs mostly useful to developers of GLFW
    • +
    • Added error messages and graceful failure to example programs
    • +
    • Added Cocoa port for Mac OS X 10.5 Leopard and later
    • +
    • Added vsync to all relevant example programs
    • +
    • Added a rudimentary OpenGL 3.2+ core profile example program
    • +
    • Updated Pascal (formerly Delphi) bindings to support more compilers
    • +
    • Clarified and expanded the User's Guide and Reference Manual
    • +
    • Fixed a number of compiler warnings in the example programs
    • +
    • OpenGL version is now only parsed once, at window creation time
    • +
    • Changed glfwSwapBuffers to call glfwPollEvents after buffer swap
    • +
    • Changed all comments in public header file to plain C style
    • +
    • Removed the keytest example program, as it was superseded by the events test
    • +
    • Removed deprecated AmigaOS and DOS ports
    • +
    • Removed all FPS counters from example programs
    • +
    • Removed all unmaintained language bindings
    • +
    • Removed support for Pelles C
    • +
    • Removed broken Microsoft Visual C++ 6.0 build path
    • +
    • [X11] Added x11-dist-install install target, intended for packagers of GLFW
    • +
    • [X11] Added x11-dist-clean build target, intended for developers of GLFW
    • +
    • [X11] Added support for GLX_SGIX_fbconfig
    • +
    • [X11] Added support for user-specified compilation flags via CFLAGS
    • +
    • [X11] Added documentation of configuration macros
    • +
    • [X11] Implemented support for GLFW_SYSTEM_KEYS
    • +
    • [X11] Improved configuration and makefile creation logic
    • +
    • [X11] Removed support for GLX version 1.2 and below
    • +
    • [X11] Removed unnecessary calls to XSync
    • +
    • [X11] Removed use of legacy window style atoms
    • +
    • [X11] Bugfix: Repeated keys would sometimes leak through despite key repeat being disabled
    • +
    • [X11] Bugfix: Fullscreen window resizing would cause color buffer clearing without taking framebuffer objects into account
    • +
    • [X11] Bugfix: AltGr was not reported as right Alt
    • +
    • [X11] Bugfix: Window colormap was not freed
    • +
    • [X11] Bugfix: Close callback was called for glfwCloseWindow
    • +
    • [X11] Bugfix: Misspelt struct member in XF86VidMode code path
    • +
    • [X11] Bugfix: Window decorations would not appear using certain versions of Compiz on Intel hardware
    • +
    • [X11] Bugfix: Numeric keypad key symbols would change depending on Num Lock state
    • +
    • [X11] Bugfix: Hidden cursor position snapped back when halfway from window center to edge
    • +
    • [X11] Bugfix: Not properly verifying that the window was mapped before making certain calls caused a BadMatch error
    • +
    • [X11] Bugfix: The response to _NET_WM_PING events was malformed
    • +
    • [X11] Bugfix: Hidden cursor mode interfered with other applications when GLFW window was unfocused
    • +
    • [X11] Bugfix: The invisible cursor objects used for hidden cursor mode were not freed
    • +
    • [X11] Bugfix: EWMH-compliant window managers were incorrectly detected
    • +
    • [X11] Bugfix: The EWMH code path for fullscreen windows did not present the window using _NET_ACTIVE_WINDOW
    • +
    • [X11] Bugfix: The EWMH code path for fullscreen windows did not send a _NET_WM_STATE client message
    • +
    • [Carbon] Added Universal Binary build targets for all examples
    • +
    • [Carbon] Renamed MacOSX port to Carbon
    • +
    • [Carbon] Removed support for 10.2 Jaguar
    • +
    • [Carbon] Deprecated Carbon port
    • +
    • [Carbon] Bugfix: Using the Dock or menu Quit command did not call the close callback
    • +
    • [Carbon] Bugfix: Key repeat events were not caught on 10.5 Leopard
    • +
    • [Carbon] Bugfix: Certain keys were not reported
    • +
    • [Carbon] Bugfix: Missing -m32 flag caused build failure on 10.6 Snow Leopard
    • +
    • [Carbon] Bugfix: Missing -mmacosx-version-min flag caused build failure on 10.5 Leopard
    • +
    • [Carbon] Bugfix: glfwOpenWindow did not call glClear
    • +
    • [Win32] Added Visual C++ project files for all examples and test programs
    • +
    • [Win32] Removed iterative context re-creation attempts for FSAA sample count
    • +
    • [Win32] Bugfix: The Visual C++ GLFW DLL project file did not use the correct DEF file
    • +
    • [Win32] Bugfix: WGL extensions were not detected and/or used correctly
    • +
    • [Win32] Bugfix: Improper use of wParam for WM_SYSCOMMAND
    • +
    • [Win32] Bugfix: Derivatives of stream.c were not cleaned up by compile.bat
    • +
    • [Win32] Bugfix: Pointer for GetExtensionsStringARB was not initialized
    • +
    • [Win32] Bugfix: Makefiles contained the wrong GLFW API version
    • +
    • [Win32] Bugfix: Numeric keypad key symbols would change depending on Num Lock state
    • +
    • [Win32] Bugfix: DllMain performed a number of forbidden actions (by calling glfwTerminate)
    • +
    -

    v2.6

    +

    v2.6

    -

    v2.5

    +

    v2.5

    • Added the function glfwWaitEvents
    • Added window close callback, which enables a program to prevent a user @@ -509,7 +737,7 @@ timing on Centrino systems)
    -

    v2.4.2

    +

    v2.4.2

    • Preliminary native Mac OS X support (via the Carbon interface)
    • Preliminary DOS support (DJGPP + Mesa)
    • @@ -517,7 +745,7 @@ GLFW license), so now GLFW is OSI Certified
    • Rewrote the GLFW documentation in LaTeX, meaning several improvements (both visual and practical)
    • -
    • Added the support folder to the distribution, which includes +
    • Added the support folder to the distribution, which includes support for various languages
    • [Win32] Added OpenWatcom compiler support (thanks Sebastian Schuberth!)
    • @@ -542,7 +770,7 @@
    • [X11] Bugfix: Iconification of fullscreen windows should now work properly
    • [x86 CPUs] Improved RDTSC timing (e.g. RDTSC support on single-CPU - Intel Hyper-Threading enabled systmes)
    • + Intel Hyper-Threading enabled systems)
    • [AmigaOS] Added joystick support
    • [AmigaOS] Mouse cursor positioning is now implemented
    • [AmigaOS] Added support for Geek Gadgets GCC
    • @@ -550,7 +778,7 @@ all parameters (except for GLFW_ACCELERATED)
    -

    v2.4.1

    +

    v2.4.1

    • Added AmigaOS support (preliminary)
    • GLFW for the X Window System now works under Mac OS X
    • @@ -560,7 +788,7 @@
    • [X11] Bugfix: GLFW should now compile with Kylix
    -

    v2.4

    +

    v2.4

    • Major source code rearrangement - much code is now shared between different platforms, and it should be easier to port GLFW to new @@ -585,7 +813,7 @@ compilers (e.g. .NET) - Thanks Tim Little!
    -

    v2.3.2

    +

    v2.3.2

    • Removed the silly limitation of 100 threads (the thread information is now kept in a linked list)
    • @@ -597,7 +825,7 @@ and 'make x11-gcc' should now really force GCC)
    -

    v2.3.1

    +

    v2.3.1

    • [X11] A minimalist configuration script was added that solves the issue with glXGetProcAddressARB, and unifies all Unix/X11 Makefiles @@ -605,7 +833,7 @@ examples)
    -

    v2.3

    +

    v2.3

    • Added OpenGL stereo rendering support
    • Added a function for parsing the OpenGL version string @@ -622,7 +850,7 @@ know if you have any related problems).
    -

    v2.2.3

    +

    v2.2.3

    • Bugfix: Checking for GL_SGIS_generate_mipmap is more robust
    • Bugfix: glfwLoadTexture2D will now fail if no window is opened
    • @@ -631,11 +859,11 @@ shifts)
    • [X11] Bugfix: Visuals are now selected more accurately. For instance, glfwOpenWindow will no longer fail if you request a 24-bit color - buffer if only 16-bit color visuals are avilable (which means that + buffer if only 16-bit color visuals are available (which means that pong3d should work on 16-bit displays).
    -

    v2.2.2

    +

    v2.2.2

    • [Win32] Bugfix: Windows did not always get focus (this was a tough one!)
    • @@ -644,12 +872,12 @@
    • [X11] Bugfix: Linux joystick Y axis positions were reversed
    -

    v2.2.1

    +

    v2.2.1

    • [X11] Added joystick support for Linux
    -

    v2.2

    +

    v2.2

    • Added joystick support (only supported under Windows so far)
    • Added joystick controls to pong3d.c (only 3 more lines of code)
    • @@ -677,7 +905,7 @@ segmentation faults if no X server is available
    -

    v2.1

    +

    v2.1

    • Added image and texture loading capabilities (support for the TGA file format at the moment)
    • @@ -720,7 +948,7 @@
    • [XFree86] Bugfix: Undesired video mode changes are now prevented
    -

    v2.0.3

    +

    v2.0.3

    • Added precise CPU cycle based timing support (RDTSC) for x86 CPUs (under both Windows and Unix)
    • @@ -729,7 +957,7 @@ supported flag for CC, so it was removed from the CFLAGS list)
    -

    v2.0.2

    +

    v2.0.2

    • Added a makefile option for building for X11 with 'cc' rather than 'gcc' (useful for IRIX users for instance).
    • @@ -742,7 +970,7 @@ versions of GLFW would not compile under IRIX).
    -

    v2.0.1

    +

    v2.0.1

    • glfwTerminate() will now be called automatically upon normal program termination (using atexit())
    • @@ -765,162 +993,192 @@
    • Some bugfixes.
    -

    v1.0.2

    +

    v1.0.2

    • Improved fullscreen functionality.
    • Added fullscreen support for X11.
    -

    v1.0.1

    +

    v1.0.1

    • Added support for the X Window System.
    • Fixed bugs.
    -

    v1.0.0

    +

    v1.0.0

    • First release.
    • Only supported Windows.
    -


    - - -

    6. Directory structure of the GLFW distribution

    +
    +

    6. Directory structure of the GLFW distribution

    Here is an overview of the directory structure of the GLFW distribution:

    - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + +
    docs GLFW manuals in PDF format
    examples Several example programs in C
    images Images for this HTML document
    include  
       GL Here is the GLFW C/C++ include file
    lib The source code for GLFW
       amigaos AmigaOS specific implementation (obsoleted)
       dos DOS specific implementation (obsoleted)
       macosx Mac OS X specific implementation
       win32 Windows specific implementation
       x11 Unix/X11 specific implementation
    support  
       d D support
       delphi Delphi support
       lua Lua support
       masm MASM32 support
       visualbasic Visual Basic support
    docs GLFW manuals in PDF format
    examples Several example programs in C
    include  
       GL Here is the GLFW C/C++ include file
    lib The source code for GLFW
       cocoa Mac OS X/Cocoa specific implementation
       win32 Windows specific implementation
       x11 Unix/X11 specific implementation
    support  
       d D support
       msvc90 Project files for Visual C++ 2008
       msvc100 Project files for Visual C++ 2010
       pascal Pascal support
    tests Several test programs in C
    -

    -


    +
    +

    7. Contacting the project

    -
    -

    7. Contacting the project

    - -

    The official GLFW web site can be found here: -http://glfw.sourceforge.net/. It contains the latest version of GLFW, news and other information that is +

    The official website for GLFW is glfw.org. +It contains the latest version of GLFW, news and other information that is useful for OpenGL development.

    -

    If you have questions related to the use of GLFW, we have a user's web forum, and a user's mailing list on SF.net, and the IRC channel -#glfw on Freenode.

    - -

    If you have a bug to report or a feature you'd like to request, please file -it in the SF.net trackers.

    +

    If you have questions related to the use of GLFW, we have a +user's web forum, +and a +user's mailing list +on SF.net, and the registered IRC channel #glfw on +Freenode.

    + +

    If you have a bug to report, a patch to submit or a feature you'd like to +request, please file it in one of the +GLFW trackers on SF.net.

    Finally, if you're interested in helping out with the development of -GLFW or porting it to your favorite platform, we have a developer's mailing list, or you could join us on -#glfw. - +GLFW or porting it to your favorite platform, we have a +developer's mailing list, +or you could join us on #glfw. -


    - +

    8. Acknowledgements

    -

    GLFW would not be what it is today without the help from: +

    GLFW exists because people around the world donated their time and lent +their skills. Special thanks go out to:

    +
      -
    • Marcus Geelnard, the orignal author and long-time maintainer of GLFW, - without whose brilliant work none of this would have happened.

    • +
    • Bobyshev Alexander and Martins Mozeiko, for the original proposal of + an FSAA hint and their work on the Win32 implementation of FSAA
    • + +
    • Keith Bauer, for his invaluable help with porting and maintaining GLFW on + Mac OS X, and for his many ideas
    • + +
    • Jarrod Davis, for the Delphi port of GLFW
    • + +
    • Olivier Delannoy, for the initial implementation of FSAA support on + X11, cross-compiling support for MinGW and general extreme usefulness
    • + +
    • Paul R. Deppe, who helped with Cygwin support, and made an + adaption of PLIB + so that it can use GLFW (instead of GLUT)
    • + +
    • Jonathan Dummer, for submitting a patch fixing an input bug on Win32 and + adding logic for the GLFW_ICON resource
    • + +
    • Gerald Franz, who made GLFW compile under IRIX, and supplied patches + for the X11 keyboard translation routine
    • + +
    • Marcus Geelnard, the original author and long-time maintainer of GLFW, + without whose brilliant work none of this would have happened
    • + +
    • Stefan Gustavson, for quick and thorough testing of GLFW on many and + varied operating systems and hardware configurations
    • + +
    • Sylvain Hellegouarch, for support, bug reports and testing
    • + +
    • Alex Holkner, for writing the code from which the Compiz/Intel fix was + stolen
    • + +
    • Toni Jovanoski, for helping with the MASM32 port of GLFW, and + supplying the example program and fixed OpenGL and GLU bindings for + MASM32
    • + +
    • Cameron King, for reporting a hidden cursor mouse bug on X11
    • + +
    • Peter Knut, for his many and detailed reports of difficult to find input + bugs
    • Robin Leffmann, for his work on Mac OS X and other platforms, and his - invaluable support.

    • + invaluable support -
    • Keith Bauer, for his invaluable help with porting and maintaining GLFW on - Mac OS X, and for his many ideas.

    • +
    • Glenn Lewis, for helping out with support for the D programming + language
    • -
    • Ozzy @ Orkysquad, - for his dedication to GLFW, for debugging my source, and for his - valuable experience with game development.

    • +
    • Tristam MacDonald, for his bug reports and feedback on the Cocoa port
    • + +
    • David Medlock, for doing the initial Lua port
    • + +
    • Kenneth Miller, for his many and detailed bug reports on Win32
    • Jeff Molofee, the author of the excellent OpenGL tutorials at NeHe Productions. + href="http://nehe.gamedev.net/">NeHe Productions. Much of the Windows code of GLFW was originally based on Jeff's - code.

    • + code -
    • Douglas C. Schmidt and Irfan Pyarali, for their excellent article Strategies for Implementing POSIX Condition Variables on - Win32, which is the basis for the Win32 condition variable - implementation in GLFW.

    • +
    • Douglas C. Schmidt and Irfan Pyarali, for their excellent article + Strategies for Implementing POSIX Condition Variables on Win32
    • -
    • Bobyshev Alexander and Martins Mozeiko, for the original proposal of - an FSAA hint and their work on the Win32 implementation of FSAA.

    • +
    • Sebastian Schuberth, for the OpenWatcom makefiles
    • -
    • Gerald Franz, who made GLFW compile under IRIX, and supplied patches - for the X11 keyboard translation routine.

    • +
    • Matt Sealey, for helping with the MorphOS port
    • + +
    • Steve Sexton, for reporting an input bug in the Carbon port
    • + +
    • Dmitri Shuralyov, for support, bug reports and testing
    • + +
    • Daniel Skorupski, for reporting a bug in the Win32 DEF file
    • Bradley Smith, for his updates of the D support and his ports of the - remaining examples to the D language.

    • + remaining examples to the D language -
    • Olivier Delannoy, for the initial implementation of FSAA support on - X11, cross-compiling support for MinGW and general extreme usefulness.
    • +
    • Julian Squires, for submitting a patch for a bug in the key repeat logic on X11
    • -
    • Glenn Lewis, for helping out with support for the D programming - language.

    • +
    • Johannes Stein, for maintaining the Pascal bindings
    • -
    • David Medlock, for doing the initial Lua port.

    • +
    • Samuli Tuomola, for support, bug reports and testing
    • -
    • Frank Wille, for helping me with the AmigaOS port and making GLFW - compile under IRIX 5.3.

    • +
    • Frank Wille, for helping with the AmigaOS port and making GLFW + compile under IRIX 5.3
    • -
    • Matt Sealey, for helping me with the MorphOS port.

    • +
    • Santi Zupancic, for support, bug reports and testing
    • -
    • Paul R. Deppe, who helped me with Cygwin support, and made an - adaption of PLIB - so that it can use GLFW (instead of GLUT).

    • +
    • Lasse Öörni, for submitting patches for the input code of the Win32 and X11 ports
    • -
    • Jarrod Davis, for the Delphi port of GLFW.

    • +
    • Дмитри Малышев, for the idea of a GLFW_NO_GLU macro
    • -
    • Toni Jovanoski, for helping me with the MASM32 port of GLFW, and - supplying the example program and fixed OpenGL and GLU bindings for - MASM32.

    • +
    • blanco, for submitting a patch for a deprecation bug in the Cocoa port
    • + +
    • heromyth, for reporting a bug in the D bindings
    • + +
    • Ozzy @ Orkysquad, + for his dedication to GLFW, for debugging my source, and for his + valuable experience with game development
    • + +
    • Peoro, for reporting a bug in the _NET_WM_PING response
    • -
    • Sebastian Schuberth, for the OpenWatcom makefiles.

    • +
    • TTK-Bandit, for submitting a number of input patches adding many missing + keys to the Win32 and X11 ports
    • -
    • Dmitri Shuralyov, Samuli Tuomola, Santi Zupancic, Sylvain - Hellegouarch, and many others for support, bug reports and - testing.

    • +
    • yuriks, for reporting a bug in Win32 context creation
    • -
    • www.opengl.org, - and all the people on the discussion forums there that have provided - help during the development of GLFW.

    • +
    • All the unmentioned and anonymous contributors in the GLFW community, for + bug reports, patches, feedback and encouragement
    • -
    • The MSDN Online Linrary, which was used extensively for - Windows development.

    • +
    • OpenGL.org, and all the people on + the discussion forums there that have provided help during the development of + GLFW
    • -
    • All the feedback from the GLFW community - thank you!

    diff -Nru glfw-2.6/support/d/examples/Makefile glfw-2.7.2/support/d/examples/Makefile --- glfw-2.6/support/d/examples/Makefile 2007-05-25 09:56:37.000000000 +0000 +++ glfw-2.7.2/support/d/examples/Makefile 2009-10-16 20:38:22.000000000 +0000 @@ -12,9 +12,8 @@ LIBS = $(LIBDIR)\glfwdll.lib $(LIBDIR)\glu32.lib $(LIBDIR)\opengl32.lib -all: boing.exe keytest.exe gears.exe listmodes.exe mipmaps.exe \ - mthello.exe mtbench.exe particles.exe pong3d.exe splitview.exe \ - triangle.exe wave.exe +all: boing.exe gears.exe listmodes.exe mipmaps.exe mthello.exe mtbench.exe \ + particles.exe pong3d.exe splitview.exe triangle.exe wave.exe clean: @@ -24,9 +23,6 @@ boing.exe: boing.d $(DC) $(DFLAGS) -of$@ $ // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages @@ -30,10 +30,7 @@ public import gl, glu; -version(Win32) - extern(Windows): -else - extern(C): +extern(System): //======================================================================== @@ -41,7 +38,7 @@ //======================================================================== const int GLFW_VERSION_MAJOR = 2; -const int GLFW_VERSION_MINOR = 5; +const int GLFW_VERSION_MINOR = 7; const int GLFW_VERSION_REVISION = 0; @@ -121,7 +118,14 @@ const int GLFW_KEY_KP_DECIMAL = (GLFW_KEY_SPECIAL+60); const int GLFW_KEY_KP_EQUAL = (GLFW_KEY_SPECIAL+61); const int GLFW_KEY_KP_ENTER = (GLFW_KEY_SPECIAL+62); -const int GLFW_KEY_LAST = GLFW_KEY_KP_ENTER; +const int GLFW_KEY_KP_NUM_LOCK = (GLFW_KEY_SPECIAL+63); +const int GLFW_KEY_CAPS_LOCK = (GLFW_KEY_SPECIAL+64); +const int GLFW_KEY_SCROLL_LOCK = (GLFW_KEY_SPECIAL+65); +const int GLFW_KEY_PAUSE = (GLFW_KEY_SPECIAL+66); +const int GLFW_KEY_LSUPER = (GLFW_KEY_SPECIAL+67); +const int GLFW_KEY_RSUPER = (GLFW_KEY_SPECIAL+68); +const int GLFW_KEY_MENU = (GLFW_KEY_SPECIAL+69); +const int GLFW_KEY_LAST = GLFW_KEY_MENU; // Mouse button definitions const int GLFW_MOUSE_BUTTON_1 = 0; @@ -190,6 +194,15 @@ const int GLFW_STEREO = 0x00020011; const int GLFW_WINDOW_NO_RESIZE = 0x00020012; const int GLFW_FSAA_SAMPLES = 0x00020013; +const int GLFW_OPENGL_VERSION_MAJOR = 0x00020014; +const int GLFW_OPENGL_VERSION_MINOR = 0x00020015; +const int GLFW_OPENGL_FORWARD_COMPAT = 0x00020016; +const int GLFW_OPENGL_DEBUG_CONTEXT = 0x00020017; +const int GLFW_OPENGL_PROFILE = 0x00020018; + +// GLFW_OPENGL_PROFILE tokens +const int GLFW_OPENGL_CORE_PROFILE = 0x00050001; +const int GLFW_OPENGL_COMPAT_PROFILE = 0x00050002; // glfwEnable/glfwDisable tokens const int GLFW_MOUSE_CURSOR = 0x00030001; @@ -341,9 +354,9 @@ // Image/texture I/O support int glfwReadImage( char *name, GLFWimage *img, int flags ); -int glfwReadMemoryImage( const void *data, long size, GLFWimage *img, int flags ); +int glfwReadMemoryImage( void *data, long size, GLFWimage *img, int flags ); void glfwFreeImage( GLFWimage *img ); int glfwLoadTexture2D( char *name, int flags ); -int glfwLoadMemoryTexture2D( const void *data, long size, int flags ); +int glfwLoadMemoryTexture2D( void *data, long size, int flags ); int glfwLoadTextureImage2D( GLFWimage *img, int flags ); diff -Nru glfw-2.6/support/d/readme.html glfw-2.7.2/support/d/readme.html --- glfw-2.6/support/d/readme.html 2007-05-25 09:56:37.000000000 +0000 +++ glfw-2.7.2/support/d/readme.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,83 +0,0 @@ - - - - GLFW Readme file for the D programming language - - - - -
    -GLFW v2.5
    -for D -
    - - -

    -

    -
    - -
      -
    1. Introduction
    2. -
    3. Using GLFW from D
    4. -
    5. The author
    6. -
    -
    -
    -
    - - - -


    - - - -

    1. Introduction

    - -

    This directory contains D bindings for the GLFW v2.5.x Windows DLL, -and D example programs. For further information on how to use GLFW you -should read the GLFW documentation. - - -


    - - -
    -

    2. Using GLFW from D

    - -

    First you have to install GLFW under your Digital Mars environment. - -

      -
    1. Build the OpenGL, GLU and GLFW import libraries in the support\d\lib - directory by running 'make'.
    2. -
    3. Copy the resulting .lib files to your dm\lib folder.
    4. -
    5. ...
    6. -
    - -

    More TODO... - - - -


    - - -
    -

    3. The maintainer

    - -

    My name is Camilla Berglund, -elmindreda@users.sourceforge.net. -Please visit our -support forums -if you have any problems with GLFW or any questions concerning GLFW. - -

    The GLFW web site can be found here: -http://glfw.sourceforge.net/. -It contains the latest version of GLFW, news and other information that is -useful for OpenGL development. - - -


    - - - - - diff -Nru glfw-2.6/support/delphi/examples/Triangle.dpr glfw-2.7.2/support/delphi/examples/Triangle.dpr --- glfw-2.6/support/delphi/examples/Triangle.dpr 2004-02-14 19:55:38.000000000 +0000 +++ glfw-2.7.2/support/delphi/examples/Triangle.dpr 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -program Triangle; - -//======================================================================== -// This is a small test application for GLFW. -// The program opens a window (640x480), and renders a spinning colored -// triangle (it is controlled with both the GLFW timer and the mouse). It -// also calculates the rendering speed (FPS), which is displayed in the -// window title bar. -// -// Delphi conversion by Jarrod Davis (http://ww.jdsgames.com) -//======================================================================== - -uses - SysUtils, OpenGL, glfw; - -var - width, height, running, frames, x, y: Integer; - t, t0, fps: Double; - titlestr: string; - -begin - // Initialize GLFW - glfwInit; - - // Open OpenGL window - if glfwOpenWindow( 640, 480, 0,0,0,0, 0,0, GLFW_WINDOW ) <> 1 then - begin - glfwTerminate; - Exit; - end; - - // Enable sticky keys - glfwEnable( GLFW_STICKY_KEYS ); - - // Disable vertical sync (on cards that support it) - glfwSwapInterval( 0 ); - - // Main loop - running := 1; - frames := 0; - t0 := glfwGetTime; - while running <> 0 do - begin - // Get time and mouse position - t := glfwGetTime; - glfwGetMousePos(x, y ); - - // Calculate and display FPS (frames per second) - if ((t-t0) > 1.0) or (frames = 0) then - begin - fps := frames / (t-t0); - titlestr := Format('Spinning Triangle (%.1f FPS)', [fps]); - glfwSetWindowTitle( PChar(titlestr) ); - t0 := t; - frames := 0; - end; - inc(frames); - - // Get window size (may be different than the requested size) - glfwGetWindowSize( width, height ); - if height < 1 then height := 1; - - // Set viewport - glViewport( 0, 0, width, height ); - - // Clear color buffer - glClearColor( 0.0, 0.0, 0.0, 0.0 ); - glClear( GL_COLOR_BUFFER_BIT ); - - // Select and setup the projection matrix - glMatrixMode( GL_PROJECTION ); - glLoadIdentity; - gluPerspective( 65.0, width/height, 1.0, 100.0 ); - - // Select and setup the modelview matrix - glMatrixMode( GL_MODELVIEW ); - glLoadIdentity; - gluLookAt( 0.0, 1.0, 0.0, // Eye-position - 0.0, 20.0, 0.0, // View-point - 0.0, 0.0, 1.0 ); // Up-vector - - // Draw a rotating colorful triangle - glTranslatef( 0.0, 14.0, 0.0 ); - glRotatef( 0.3*x + t*100.0, 0.0, 0.0, 1.0 ); - glBegin( GL_TRIANGLES ); - glColor3f( 1.0, 0.0, 0.0 ); - glVertex3f( -5.0, 0.0, -4.0 ); - glColor3f( 0.0, 1.0, 0.0 ); - glVertex3f( 5.0, 0.0, -4.0 ); - glColor3f( 0.0, 0.0, 1.0 ); - glVertex3f( 0.0, 0.0, 6.0 ); - glEnd; - - // Swap buffers - glfwSwapBuffers; - - // Check if the ESC key was pressed or the window was closed - running := (not glfwGetKey( GLFW_KEY_ESC )) and - glfwGetWindowParam( GLFW_OPENED ); - end; - - // Close OpenGL window and terminate GLFW - glfwTerminate; - -end. diff -Nru glfw-2.6/support/delphi/lib/glfw.pas glfw-2.7.2/support/delphi/lib/glfw.pas --- glfw-2.6/support/delphi/lib/glfw.pas 2007-05-26 06:43:25.000000000 +0000 +++ glfw-2.7.2/support/delphi/lib/glfw.pas 1970-01-01 00:00:00.000000000 +0000 @@ -1,437 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: glfw.pas -// Platform: Delphi/Windows -// API version: 2.5 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2005 Camilla Berglund -// -// 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. -// -//======================================================================== - -unit glfw; - -interface - -const - - //======================================================================== - // GLFW version - //======================================================================== - GLFW_VERSION_MAJOR = 2; - GLFW_VERSION_MINOR = 5; - GLFW_VERSION_REVISION = 0; - - //======================================================================== - // Input handling definitions - //======================================================================== - - // Key and button state/action definitions - GLFW_RELEASE = 0; - GLFW_PRESS = 1; - - // Keyboard key definitions: 8-bit ISO-8859-1 (Latin 1) encoding is used - // for printable keys (such as A-Z, 0-9 etc), and values above 256 - // represent special (non-printable) keys (e.g. F1, Page Up etc). - GLFW_KEY_UNKNOWN = -1; - GLFW_KEY_SPACE = 32; - GLFW_KEY_SPECIAL = 256; - GLFW_KEY_ESC = (GLFW_KEY_SPECIAL+1); - GLFW_KEY_F1 = (GLFW_KEY_SPECIAL+2); - GLFW_KEY_F2 = (GLFW_KEY_SPECIAL+3); - GLFW_KEY_F3 = (GLFW_KEY_SPECIAL+4); - GLFW_KEY_F4 = (GLFW_KEY_SPECIAL+5); - GLFW_KEY_F5 = (GLFW_KEY_SPECIAL+6); - GLFW_KEY_F6 = (GLFW_KEY_SPECIAL+7); - GLFW_KEY_F7 = (GLFW_KEY_SPECIAL+8); - GLFW_KEY_F8 = (GLFW_KEY_SPECIAL+9); - GLFW_KEY_F9 = (GLFW_KEY_SPECIAL+10); - GLFW_KEY_F10 = (GLFW_KEY_SPECIAL+11); - GLFW_KEY_F11 = (GLFW_KEY_SPECIAL+12); - GLFW_KEY_F12 = (GLFW_KEY_SPECIAL+13); - GLFW_KEY_F13 = (GLFW_KEY_SPECIAL+14); - GLFW_KEY_F14 = (GLFW_KEY_SPECIAL+15); - GLFW_KEY_F15 = (GLFW_KEY_SPECIAL+16); - GLFW_KEY_F16 = (GLFW_KEY_SPECIAL+17); - GLFW_KEY_F17 = (GLFW_KEY_SPECIAL+18); - GLFW_KEY_F18 = (GLFW_KEY_SPECIAL+19); - GLFW_KEY_F19 = (GLFW_KEY_SPECIAL+20); - GLFW_KEY_F20 = (GLFW_KEY_SPECIAL+21); - GLFW_KEY_F21 = (GLFW_KEY_SPECIAL+22); - GLFW_KEY_F22 = (GLFW_KEY_SPECIAL+23); - GLFW_KEY_F23 = (GLFW_KEY_SPECIAL+24); - GLFW_KEY_F24 = (GLFW_KEY_SPECIAL+25); - GLFW_KEY_F25 = (GLFW_KEY_SPECIAL+26); - GLFW_KEY_UP = (GLFW_KEY_SPECIAL+27); - GLFW_KEY_DOWN = (GLFW_KEY_SPECIAL+28); - GLFW_KEY_LEFT = (GLFW_KEY_SPECIAL+29); - GLFW_KEY_RIGHT = (GLFW_KEY_SPECIAL+30); - GLFW_KEY_LSHIFT = (GLFW_KEY_SPECIAL+31); - GLFW_KEY_RSHIFT = (GLFW_KEY_SPECIAL+32); - GLFW_KEY_LCTRL = (GLFW_KEY_SPECIAL+33); - GLFW_KEY_RCTRL = (GLFW_KEY_SPECIAL+34); - GLFW_KEY_LALT = (GLFW_KEY_SPECIAL+35); - GLFW_KEY_RALT = (GLFW_KEY_SPECIAL+36); - GLFW_KEY_TAB = (GLFW_KEY_SPECIAL+37); - GLFW_KEY_ENTER = (GLFW_KEY_SPECIAL+38); - GLFW_KEY_BACKSPACE = (GLFW_KEY_SPECIAL+39); - GLFW_KEY_INSERT = (GLFW_KEY_SPECIAL+40); - GLFW_KEY_DEL = (GLFW_KEY_SPECIAL+41); - GLFW_KEY_PAGEUP = (GLFW_KEY_SPECIAL+42); - GLFW_KEY_PAGEDOWN = (GLFW_KEY_SPECIAL+43); - GLFW_KEY_HOME = (GLFW_KEY_SPECIAL+44); - GLFW_KEY_END = (GLFW_KEY_SPECIAL+45); - GLFW_KEY_KP_0 = (GLFW_KEY_SPECIAL+46); - GLFW_KEY_KP_1 = (GLFW_KEY_SPECIAL+47); - GLFW_KEY_KP_2 = (GLFW_KEY_SPECIAL+48); - GLFW_KEY_KP_3 = (GLFW_KEY_SPECIAL+49); - GLFW_KEY_KP_4 = (GLFW_KEY_SPECIAL+50); - GLFW_KEY_KP_5 = (GLFW_KEY_SPECIAL+51); - GLFW_KEY_KP_6 = (GLFW_KEY_SPECIAL+52); - GLFW_KEY_KP_7 = (GLFW_KEY_SPECIAL+53); - GLFW_KEY_KP_8 = (GLFW_KEY_SPECIAL+54); - GLFW_KEY_KP_9 = (GLFW_KEY_SPECIAL+55); - GLFW_KEY_KP_DIVIDE = (GLFW_KEY_SPECIAL+56); - GLFW_KEY_KP_MULTIPLY = (GLFW_KEY_SPECIAL+57); - GLFW_KEY_KP_SUBTRACT = (GLFW_KEY_SPECIAL+58); - GLFW_KEY_KP_ADD = (GLFW_KEY_SPECIAL+59); - GLFW_KEY_KP_DECIMAL = (GLFW_KEY_SPECIAL+60); - GLFW_KEY_KP_EQUAL = (GLFW_KEY_SPECIAL+61); - GLFW_KEY_KP_ENTER = (GLFW_KEY_SPECIAL+62); - GLFW_KEY_LAST = GLFW_KEY_KP_ENTER; - - // Mouse button definitions - GLFW_MOUSE_BUTTON_1 = 0; - GLFW_MOUSE_BUTTON_2 = 1; - GLFW_MOUSE_BUTTON_3 = 2; - GLFW_MOUSE_BUTTON_4 = 3; - GLFW_MOUSE_BUTTON_5 = 4; - GLFW_MOUSE_BUTTON_6 = 5; - GLFW_MOUSE_BUTTON_7 = 6; - GLFW_MOUSE_BUTTON_8 = 7; - GLFW_MOUSE_BUTTON_LAST = GLFW_MOUSE_BUTTON_8; - - // Mouse button aliases - GLFW_MOUSE_BUTTON_LEFT = GLFW_MOUSE_BUTTON_1; - GLFW_MOUSE_BUTTON_RIGHT = GLFW_MOUSE_BUTTON_2; - GLFW_MOUSE_BUTTON_MIDDLE = GLFW_MOUSE_BUTTON_3; - - // Joystick identifiers - GLFW_JOYSTICK_1 = 0; - GLFW_JOYSTICK_2 = 1; - GLFW_JOYSTICK_3 = 2; - GLFW_JOYSTICK_4 = 3; - GLFW_JOYSTICK_5 = 4; - GLFW_JOYSTICK_6 = 5; - GLFW_JOYSTICK_7 = 6; - GLFW_JOYSTICK_8 = 7; - GLFW_JOYSTICK_9 = 8; - GLFW_JOYSTICK_10 = 9; - GLFW_JOYSTICK_11 = 10; - GLFW_JOYSTICK_12 = 11; - GLFW_JOYSTICK_13 = 12; - GLFW_JOYSTICK_14 = 13; - GLFW_JOYSTICK_15 = 14; - GLFW_JOYSTICK_16 = 15; - GLFW_JOYSTICK_LAST = GLFW_JOYSTICK_16; - - - //======================================================================== - // Other definitions - //======================================================================== - - // glfwOpenWindow modes - GLFW_WINDOW = $00010001; - GLFW_FULLSCREEN = $00010002; - - // glfwGetWindowParam tokens - GLFW_OPENED = $00020001; - GLFW_ACTIVE = $00020002; - GLFW_ICONIFIED = $00020003; - GLFW_ACCELERATED = $00020004; - GLFW_RED_BITS = $00020005; - GLFW_GREEN_BITS = $00020006; - GLFW_BLUE_BITS = $00020007; - GLFW_ALPHA_BITS = $00020008; - GLFW_DEPTH_BITS = $00020009; - GLFW_STENCIL_BITS = $0002000A; - - // The following constants are used for both glfwGetWindowParam - // and glfwOpenWindowHint - GLFW_REFRESH_RATE = $0002000B; - GLFW_ACCUM_RED_BITS = $0002000C; - GLFW_ACCUM_GREEN_BITS = $0002000D; - GLFW_ACCUM_BLUE_BITS = $0002000E; - GLFW_ACCUM_ALPHA_BITS = $0002000F; - GLFW_AUX_BUFFERS = $00020010; - GLFW_STEREO = $00020011; - GLFW_WINDOW_NO_RESIZE = $00020012; - GLFW_FSAA_SAMPLES = $00020013; - - // glfwEnable/glfwDisable tokens - GLFW_MOUSE_CURSOR = $00030001; - GLFW_STICKY_KEYS = $00030002; - GLFW_STICKY_MOUSE_BUTTONS = $00030003; - GLFW_SYSTEM_KEYS = $00030004; - GLFW_KEY_REPEAT = $00030005; - GLFW_AUTO_POLL_EVENTS = $00030006; - - // glfwWaitThread wait modes - GLFW_WAIT = $00040001; - GLFW_NOWAIT = $00040002; - - // glfwGetJoystickParam tokens - GLFW_PRESENT = $00050001; - GLFW_AXES = $00050002; - GLFW_BUTTONS = $00050003; - - // glfwReadImage/glfwLoadTexture2D flags - GLFW_NO_RESCALE_BIT = $00000001; // Only for glfwReadImage - GLFW_ORIGIN_UL_BIT = $00000002; - GLFW_BUILD_MIPMAPS_BIT = $00000004; // Only for glfwLoadTexture2D - GLFW_ALPHA_MAP_BIT = $00000008; - - // Time spans longer than this (seconds) are considered to be infinity - GLFW_INFINITY = 100000.0; - - - //======================================================================== - // Typedefs - //======================================================================== - -type - - // The video mode structure used by glfwGetVideoModes() - GLFWvidmode = packed record - Width, Height : Integer; - RedBits, BlueBits, GreenBits: Integer; - end; - PGLFWvidmode = ^GLFWvidmode; - - // Image/texture information - GLFWimage = packed record - Width, Height: Integer; - Format : Integer; - BytesPerPixel: Integer; - Data : PChar; - end; - PGLFWimage = ^GLFWimage; - - // Thread ID - GLFWthread = Integer; - - // Mutex object - GLFWmutex = Pointer; - - // Condition variable object - GLFWcond = Pointer; - - // Function pointer types - GLFWwindowsizefun = procedure(Width, Height: Integer); stdcall; - GLFWwindowclosefun = function: Integer; stdcall; - GLFWwindowrefreshfun = procedure; stdcall; - GLFWmousebuttonfun = procedure(Button, Action: Integer); stdcall; - GLFWmouseposfun = procedure(X, Y: Integer); stdcall; - GLFWmousewheelfun = procedure(Pos: Integer); stdcall; - GLFWkeyfun = procedure(Key, Action: Integer); stdcall; - GLFWcharfun = procedure(Character, Action: Integer); stdcall; - GLFWthreadfun = procedure(Arg: Pointer); stdcall; - - -//======================================================================== -// Prototypes -//======================================================================== - -// GLFW initialization, termination and version querying -function glfwInit: Integer; stdcall; -procedure glfwTerminate; stdcall; -procedure glfwGetVersion(var major: Integer; var minor: Integer; var Rev: Integer); stdcall; - -// Window handling -function glfwOpenWindow(width, height, redbits, greenbits, bluebits, alphabits, depthbits, stencilbits, mode: Integer): Integer; stdcall; -procedure glfwOpenWindowHint(target, hint: Integer); stdcall; -procedure glfwCloseWindow; stdcall; -procedure glfwSetWindowTitle(title: PChar); stdcall; -procedure glfwGetWindowSize(var width: Integer; var height: Integer); stdcall; -procedure glfwSetWindowSize(width, height: Integer); stdcall; -procedure glfwSetWindowPos(x, y: Integer); stdcall; -procedure glfwIconifyWindow; stdcall; -procedure glfwRestoreWindow; stdcall; -procedure glfwSwapBuffers; stdcall; -procedure glfwSwapInterval(interval: Integer); stdcall; -function glfwGetWindowParam(Param: Integer): Integer; stdcall; -procedure glfwSetWindowSizeCallback(cbfun: GLFWwindowsizefun); stdcall; -procedure glfwSetWindowCloseCallback(cbfun: GLFWwindowclosefun); stdcall; -procedure glfwSetWindowRefreshCallback(cbfun: GLFWwindowrefreshfun); stdcall; - -// Video mode functions -function glfwGetVideoModes(list: PGLFWvidmode; maxcount: Integer): Integer; stdcall; -procedure glfwGetDesktopMode(mode: PGLFWvidmode); stdcall; - -// Input handling -procedure glfwPollEvents; stdcall; -procedure glfwWaitEvents; stdcall; -function glfwGetKey(key: Integer): Integer; stdcall; -function glfwGetMouseButton(button: Integer): Integer; stdcall; -procedure glfwGetMousePos(var xpos: Integer; var ypos: Integer); stdcall; -procedure glfwSetMousePos(xpos, ypos: Integer); stdcall; -function glfwGetMouseWheel: Integer; stdcall; -procedure glfwSetMouseWheel(pos: Integer); stdcall; -procedure glfwSetKeyCallback( cbfun: GLFWkeyfun); stdcall; -procedure glfwSetCharCallback( cbfun: GLFWcharfun); stdcall; -procedure glfwSetMouseButtonCallback( cbfun: GLFWmousebuttonfun); stdcall; -procedure glfwSetMousePosCallback( cbfun: GLFWmouseposfun); stdcall; -procedure glfwSetMouseWheelCallback( cbfun: GLFWmousewheelfun); stdcall; - -// Joystick input -function glfwGetJoystickParam(joy, param: Integer): Integer; stdcall; -function glfwGetJoystickPos(joy: Integer; var pos: Single; numaxes: Integer): Integer; stdcall; -function glfwGetJoystickButtons(joy: Integer; buttons: PChar; numbuttons: Integer): Integer; stdcall; - -// Time -function glfwGetTime: Double; stdcall; -procedure glfwSetTime(time: Double); stdcall; -procedure glfwSleep(time: Double); stdcall; - -// Extension support -function glfwExtensionSupported(extension: PChar): Integer; stdcall; -function glfwGetProcAddress(procname: PChar): Pointer; stdcall; -procedure glfwGetGLVersion(var major: Integer; var minor: Integer; var Rev: Integer); stdcall; - -// Threading support -function glfwCreateThread(fun: GLFWthreadfun; arg: Pointer): GLFWthread; stdcall; -procedure glfwDestroyThread(Id: GLFWthread); stdcall; -function glfwWaitThread(Id: GLFWthread; waitmode: Integer): Integer; stdcall; -function glfwGetThreadID: GLFWthread; stdcall; -function glfwCreateMutex: GLFWmutex; stdcall; -procedure glfwDestroyMutex( mutex: GLFWmutex); stdcall; -procedure glfwLockMutex(mutex: GLFWmutex); stdcall; -procedure glfwUnlockMutex(mutex: GLFWmutex); stdcall; -function glfwCreateCond: GLFWcond; stdcall; -procedure glfwDestroyCond(cond: GLFWcond); stdcall; -procedure glfwWaitCond(cond: GLFWcond; mutex: GLFWmutex; timeout: Double); stdcall; -procedure glfwSignalCond(cond: GLFWcond); stdcall; -procedure glfwBroadcastCond(cond: GLFWcond); stdcall; -function glfwGetNumberOfProcessors: Integer; stdcall; - -// Enable/disable functions -procedure glfwEnable(token: Integer); stdcall; -procedure glfwDisable(token: Integer); stdcall; - -// Image/texture I/O support -function glfwReadImage(name: PChar; image: PGLFWimage; flags: Integer): Integer; stdcall; -function glfwReadMemoryImage(data: PChar; size: LongInt; img: PGLFWimage; flags: Integer): Integer; stdcall; -procedure glfwFreeImage(img: PGLFWimage); -function glfwLoadTexture2D(name: PChar; flags: Integer): Integer; stdcall; -function glfwLoadMemoryTexture2D(data: PChar; size: LongInt; flags: Integer): Integer; stdcall; -function glfwLoadTextureImage2D(img: PGLFWimage; flags: Integer): Integer; stdcall; - -implementation - -const - DLLNAME = 'glfw.dll'; - -// GLFW initialization, termination and version querying -function glfwInit; external DLLNAME; -procedure glfwTerminate; external DLLNAME; -procedure glfwGetVersion; external DLLNAME; - -// Window handling -function glfwOpenWindow; external DLLNAME; -procedure glfwOpenWindowHint; external DLLNAME; -procedure glfwCloseWindow; external DLLNAME; -procedure glfwSetWindowTitle; external DLLNAME; -procedure glfwGetWindowSize; external DLLNAME; -procedure glfwSetWindowSize; external DLLNAME; -procedure glfwSetWindowPos; external DLLNAME; -procedure glfwIconifyWindow; external DLLNAME; -procedure glfwRestoreWindow; external DLLNAME; -procedure glfwSwapBuffers; external DLLNAME; -procedure glfwSwapInterval; external DLLNAME; -function glfwGetWindowParam; external DLLNAME; -procedure glfwSetWindowSizeCallback; external DLLNAME; -procedure glfwSetWindowCloseCallback; external DLLNAME; -procedure glfwSetWindowRefreshCallback; external DLLNAME; - -// Video mode functions -function glfwGetVideoModes; external DLLNAME; -procedure glfwGetDesktopMode; external DLLNAME; - -// Input handling -procedure glfwPollEvents; external DLLNAME; -procedure glfwWaitEvents; external DLLNAME; -function glfwGetKey; external DLLNAME; -function glfwGetMouseButton; external DLLNAME; -procedure glfwGetMousePos; external DLLNAME; -procedure glfwSetMousePos; external DLLNAME; -function glfwGetMouseWheel; external DLLNAME; -procedure glfwSetMouseWheel; external DLLNAME; -procedure glfwSetKeyCallback; external DLLNAME; -procedure glfwSetCharCallback; external DLLNAME; -procedure glfwSetMouseButtonCallback; external DLLNAME; -procedure glfwSetMousePosCallback; external DLLNAME; -procedure glfwSetMouseWheelCallback; external DLLNAME; - -// Joystick input -function glfwGetJoystickParam; external DLLNAME; -function glfwGetJoystickPos; external DLLNAME; -function glfwGetJoystickButtons; external DLLNAME; - -// Time -function glfwGetTime: Double; external DLLNAME; -procedure glfwSetTime; external DLLNAME; -procedure glfwSleep; external DLLNAME; - -// Extension support -function glfwExtensionSupported; external DLLNAME; -function glfwGetProcAddress; external DLLNAME; -procedure glfwGetGLVersion; external DLLNAME; - -// Threading support -function glfwCreateThread; external DLLNAME; -procedure glfwDestroyThread; external DLLNAME; -function glfwWaitThread; external DLLNAME; -function glfwGetThreadID; external DLLNAME; -function glfwCreateMutex; external DLLNAME; -procedure glfwDestroyMutex; external DLLNAME; -procedure glfwLockMutex; external DLLNAME; -procedure glfwUnlockMutex; external DLLNAME; -function glfwCreateCond; external DLLNAME; -procedure glfwDestroyCond; external DLLNAME; -procedure glfwWaitCond; external DLLNAME; -procedure glfwSignalCond; external DLLNAME; -procedure glfwBroadcastCond; external DLLNAME; -function glfwGetNumberOfProcessors; external DLLNAME; - -// Enable/disable functions -procedure glfwEnable; external DLLNAME; -procedure glfwDisable; external DLLNAME; - -// Image/texture I/O support -function glfwReadImage; external DLLNAME; -function glfwReadMemoryImage; external DLLNAME; -procedure glfwFreeImage; external DLLNAME; -function glfwLoadTexture2D; external DLLNAME; -function glfwLoadMemoryTexture2D; external DLLNAME; -function glfwLoadTextureImage2D; external DLLNAME; - -end. diff -Nru glfw-2.6/support/delphi/readme.html glfw-2.7.2/support/delphi/readme.html --- glfw-2.6/support/delphi/readme.html 2007-05-25 09:56:37.000000000 +0000 +++ glfw-2.7.2/support/delphi/readme.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,97 +0,0 @@ - - - - GLFW Readme file for Delphi - - - - -
    -GLFW v2.5
    -for Delphi -
    - - -

    -

    -
    - -
      -
    1. Introduction
    2. -
    3. Using GLFW from Delphi
    4. -
    5. The author
    6. -
    7. Acknowledgements
    8. -
    -
    -
    -
    - - - -


    - - - -

    1. Introduction

    - -

    This folder contains Delphi bindings for the GLFW v2.5.x Windows DLL, -and Delphi example programs. For further information on how to use GLFW -you should read the GLFW documentation. - - -


    - - -
    -

    2. Using GLFW from Delphi

    - -

    Since the general syntax of Pascal does not differ much from the C -language syntax, using GLFW from Delphi is very similar to using GLFW from -C/C++. This should make it easy to follow the GLFW documentation, which -was primarily written for C/C++ users. - -

    On the more practical side, you will need to copy the GLFW DLL file -(support\win32dll\glfw.dll) to your Windows system folder (e.g. -C:\Windows\system for Windows 9x/ME, or C:\WinNT\system32 for Windows NT), -and/or to the same directory as you keep the executable for your GLFW -based program. - -

    You also have to copy the GLFW binding file for Delphi -(support\delphi\lib\glfw.pas) to your Delphi\Lib directory. - - - -


    - - -
    -

    3. The maintainer

    - -

    My name is Camilla Berglund, -elmindreda@users.sourceforge.net. -Please visit our -support forums -if you have any problems with GLFW or any questions concerning GLFW. - -

    The GLFW web site can be found here: -http://glfw.sourceforge.net/. -It contains the latest version of GLFW, news and other information that is -useful for OpenGL development. - - -


    - - - -

    4. Acknowledgements

    - -

    Many thanks to Jarrod Davis, who contributed the original -Delphi binding file (glfw.pas) and the conversion of the Triangle example -program! - - -


    - - - - diff -Nru glfw-2.6/support/lua/examples/gears.lua glfw-2.7.2/support/lua/examples/gears.lua --- glfw-2.6/support/lua/examples/gears.lua 2007-05-25 09:56:37.000000000 +0000 +++ glfw-2.7.2/support/lua/examples/gears.lua 1970-01-01 00:00:00.000000000 +0000 @@ -1,383 +0,0 @@ --------------------------------------------------------------------------- --- 3-D gear wheels. This program is in the public domain. --- --- Command line options: --- -info print GL implementation information --- -exit automatically exit after 30 seconds --- --- --- Brian Paul --- --- --- Marcus Geelnard: --- - Conversion to GLFW --- - Time based rendering (frame rate independent) --- - Slightly modified camera that should work better for stereo viewing --- - Ported to Lua (thanks to David Medlock for the original Lua port) --------------------------------------------------------------------------- - -local t0 = 0.0 -local t = 0 -local dt = 0 - -local Frames = 0 -local autoexit = 0 - - --------------------------------------------------------------------------- --- Draw a gear wheel. You'll probably want to call this function when --- building a display list since we do a lot of trig here. --- --- Input: inner_radius - radius of hole at center --- outer_radius - radius at center of teeth --- width - width of gear --- teeth - number of teeth --- tooth_depth - depth of tooth --------------------------------------------------------------------------- -local function gear(inner_radius, outer_radius, width, teeth, tooth_depth) - - local PI = 3.141592654 - local r0 = inner_radius - local r1 = outer_radius - ( tooth_depth / 2.0 ) - local r2 = outer_radius + ( tooth_depth / 2.0 ) - local da = 2.0 * PI / teeth / 4.0 - - gl.ShadeModel("FLAT") - - gl.Normal(0.0, 0.0, 1.0) - - local cos = math.cos; - local sin = math.sin; - local sqrt = math.sqrt; - - -- draw front face - gl.Begin("QUAD_STRIP"); - for i = 0, teeth do - angle = i * 2.0 * PI / teeth - gl.Vertex(r0 * cos(angle), r0 * sin(angle), width * 0.5) - gl.Vertex(r1 * cos(angle), r1 * sin(angle), width * 0.5) - if (i < teeth) then - gl.Vertex(r0 * cos(angle), r0 * sin(angle), width * 0.5) - gl.Vertex(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5) - end - end - gl.End() - - -- draw front sides of teeth - gl.Begin("QUADS") - da = 2.0 * PI / teeth / 4.0; - for i = 0,teeth-1 do - angle = i * 2.0 * PI / teeth - - gl.Vertex(r1 * cos(angle), r1 * sin(angle), width * 0.5) - gl.Vertex(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5) - gl.Vertex(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5) - gl.Vertex(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5) - end - gl.End() - - gl.Normal(0.0, 0.0, -1.0) - - -- draw back face - gl.Begin("QUAD_STRIP") - for i = 0,teeth do - angle = i * 2.0 * PI / teeth - gl.Vertex(r1 * cos(angle), r1 * sin(angle), -width * 0.5) - gl.Vertex(r0 * cos(angle), r0 * sin(angle), -width * 0.5) - if (i < teeth) then - gl.Vertex(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5) - gl.Vertex(r0 * cos(angle), r0 * sin(angle), -width * 0.5) - end - end - gl.End() - - -- draw back sides of teeth - gl.Begin("QUADS") - da = 2.0 * PI / teeth / 4.0 - for i = 0, teeth-1 do - angle = i * 2.0 * PI / teeth - - gl.Vertex(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5) - gl.Vertex(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5) - gl.Vertex(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5) - gl.Vertex(r1 * cos(angle), r1 * sin(angle), -width * 0.5) - end - gl.End() - - - -- draw outward faces of teeth - gl.Begin("QUAD_STRIP") - for i = 0, teeth-1 do - angle = i * 2.0 * PI / teeth - - gl.Vertex(r1 * cos(angle), r1 * sin(angle), width * 0.5) - gl.Vertex(r1 * cos(angle), r1 * sin(angle), -width * 0.5) - u = r2 * cos(angle + da) - r1 * cos(angle) - v = r2 * sin(angle + da) - r1 * sin(angle) - len = sqrt(u * u + v * v) - u = u / len - v = v / len - gl.Normal(v, -u, 0.0) - gl.Vertex(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5) - gl.Vertex(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5) - gl.Normal(cos(angle), sin(angle), 0.0) - gl.Vertex(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5) - gl.Vertex(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5) - u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da) - v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da) - gl.Normal(v, -u, 0.0) - gl.Vertex(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5) - gl.Vertex(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5) - gl.Normal(cos(angle), sin(angle), 0.0) - end - - gl.Vertex(r1 * cos(0), r1 * sin(0), width * 0.5) - gl.Vertex(r1 * cos(0), r1 * sin(0), -width * 0.5) - - gl.End() - - gl.ShadeModel("SMOOTH"); - - -- draw inside radius cylinder - gl.Begin("QUAD_STRIP") - for i = 0,teeth do - angle = i * 2.0 * PI / teeth - gl.Normal(-cos(angle), -sin(angle), 0.0) - gl.Vertex(r0 * cos(angle), r0 * sin(angle), -width * 0.5) - gl.Vertex(r0 * cos(angle), r0 * sin(angle), width * 0.5) - end - gl.End() - -end - -local running = true -local view = { rotx = 20.0 ; roty = 30.0 ; rotz = 0.0 } -local gear1, gear2, gear3 -local angle = 0.0 - - --------------------------------------------------------------------------- --- OpenGL draw function & timing --------------------------------------------------------------------------- -local function draw() - gl.Clear("DEPTH_BUFFER_BIT,COLOR_BUFFER_BIT") - - gl.MatrixMode( "MODELVIEW" ); - - gl.PushMatrix() - gl.Rotate(view.rotx, 1.0, 0.0, 0.0) - gl.Rotate(view.roty, 0.0, 1.0, 0.0) - gl.Rotate(view.rotz, 0.0, 0.0, 1.0) - - gl.PushMatrix() - gl.Translate(-3.0, -2.0, 0.0) - gl.Rotate(angle, 0.0, 0.0, 1.0) - gl.CallList(gear1) - gl.PopMatrix() - - gl.PushMatrix() - gl.Translate(3.1, -2.0, 0.0) - gl.Rotate(-2.0 * angle - 9.0, 0.0, 0.0, 1.0) - gl.CallList(gear2) - gl.PopMatrix() - - gl.PushMatrix() - gl.Translate(-3.1, 4.2, 0.0) - gl.Rotate(-2.0 * angle - 25.0, 0.0, 0.0, 1.0) - gl.CallList(gear3) - gl.PopMatrix() - - gl.PopMatrix() - - Frames = Frames + 1; - - do - t_new = glfw.GetTime() - dt = t_new - t; - t = t_new; - - if (t - t0 >= 5.0) then - seconds = t - t0; - fps = Frames / seconds; - print(Frames, " frames in ", seconds, " seconds = ", fps, " FPS") - t0 = t; - Frames = 0; - if (t >= 0.999 * autoexit) and autoexit then running = 0 end - end - end -end - - --------------------------------------------------------------------------- --- Initialize OpenGL --------------------------------------------------------------------------- -local function init(args) - pos = {5.0, 5.0, 10.0, 0.0} - red = {0.8, 0.1, 0.0, 1.0} - green = {0.0, 0.8, 0.2, 1.0} - blue = {0.2, 0.2, 1.0, 1.0} - - gl.Light("LIGHT0", "POSITION", pos) - gl.Enable("CULL_FACE") - gl.Enable("LIGHTING") - gl.Enable("LIGHT0") - gl.Enable("DEPTH_TEST") - gl.DepthFunc("LEQUAL") - - -- make the gears - gear1 = gl.GenLists(1) - gl.NewList(gear1, "COMPILE"); - gl.Material("FRONT", "AMBIENT_AND_DIFFUSE", red); - gear(1.0, 4.0, 1.0, 20, 0.7); - gl.EndList() - - gear2 = gl.GenLists(1) - gl.NewList(gear2, "COMPILE") - gl.Material("FRONT", "AMBIENT_AND_DIFFUSE", green) - gear(0.5, 2.0, 2.0, 10, 0.7) - gl.EndList() - - gear3 = gl.GenLists(1); - gl.NewList(gear3, "COMPILE") - gl.Material("FRONT", "AMBIENT_AND_DIFFUSE", blue) - gear(1.3, 2.0, 0.5, 10, 0.7) - gl.EndList() - - gl.Enable("NORMALIZE") - - if args then - for parm in args do - if parm == "-exit" then - autoexit = 30 - print("Auto Exit after ", autoexit ," seconds." ); - end - end - end -end - - --------------------------------------------------------------------------- --- update animation parameters --------------------------------------------------------------------------- -local function animate() - angle = angle + 100.0*dt -end - - --------------------------------------------------------------------------- --- new window size --------------------------------------------------------------------------- -function reshape( width, height ) - local h = height / width - - local znear = 5.0 - local zfar = 30.0 - local xmax = znear * 0.5 - - gl.Viewport( 0, 0, width, height ) - gl.MatrixMode( "PROJECTION" ); - gl.LoadIdentity() - gl.Frustum( -xmax, xmax, -xmax*h, xmax*h, znear, zfar ) - gl.MatrixMode( "MODELVIEW" ); - gl.LoadIdentity() - gl.Translate( 0.0, 0.0, -20.0 ) - gl.Enable( "DEPTH_TEST" ); -end - - --------------------------------------------------------------------------- --- change view angle, exit upon ESC --------------------------------------------------------------------------- -function key( k, action ) - if action ~= glfw.PRESS then return end - - -- 'Z'? - if k == 90 then - if glfw.GetKey( glfw.KEY_LSHIFT ) == glfw.PRESS then - view.rotz = view.rotz - 5.0 - else - view.rotz = view.rotz + 5.0 - end - return - end - - if k == glfw.KEY_ESC then - running = false - return - end - - if k == glfw.KEY_UP then - view.rotx = view.rotx + 5.0 - return - end - - if k == glfw.KEY_DOWN then - view.rotx = view.rotx - 5.0 - return - end - - if k == glfw.KEY_LEFT then - view.roty = view.roty + 5.0 - return - end - - if k == glfw.KEY_RIGHT then - view.roty = view.roty - 5.0 - return - end -end - - --------------------------------------------------------------------------- --- main() --------------------------------------------------------------------------- -local function main() - -- Init GLFW - if glfw.Init() ~= glfw.TRUE then - return - end - - -- Open window - if glfw.OpenWindow( 640,480,0,0,0,0,24,0,glfw.WINDOW ) ~= glfw.TRUE then - glfw.Terminate() - return - end - - glfw.SetWindowTitle( "Gears" ); - glfw.Enable( glfw.KEY_REPEAT ); - glfw.SwapInterval( 0 ); - - -- Special args? - init(args); - - -- Set callback functions - glfw.SetWindowSizeCallback( "reshape" ); - glfw.SetKeyCallback( "key" ); - - while running do - -- Draw gears - draw() - - -- Update animation - animate() - - -- Swap buffers - glfw.SwapBuffers() - - -- Was the window closed? - if glfw.GetWindowParam( glfw.OPENED ) ~= glfw.TRUE then - running = false - end - - end - - -- Terminate GLFW - glfw.Terminate() - - -- Exit program - return -end - - --- execute! -main() diff -Nru glfw-2.6/support/lua/examples/test1.lua glfw-2.7.2/support/lua/examples/test1.lua --- glfw-2.6/support/lua/examples/test1.lua 2007-05-25 09:56:37.000000000 +0000 +++ glfw-2.7.2/support/lua/examples/test1.lua 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ --------------------------------------------------------------------------- --- Simple test program testing GLFW and OpenGL from Lua --------------------------------------------------------------------------- - - -local running = true - - --- Key callback function -function keyfun( key, action ) - if action == glfw.RELEASE then - return - end - - if key == glfw.KEY_ESC then - running = false - end -end - - --- Window close callback function -function closefun() - running = false - return glfw.TRUE -end - - --- Main program and event loop -function main() - -- Init GLFW - if glfw.Init() ~= glfw.TRUE then - return - end - - -- Open window - if glfw.OpenWindow( 640,480,0,0,0,0,24,0,glfw.WINDOW ) ~= glfw.TRUE then - glfw.Terminate() - return - end - - -- Set window properties - glfw.SetWindowTitle( "Hello world!" ) - glfw.Enable( glfw.KEY_REPEAT ) - glfw.SwapInterval( 0 ) - - -- Set callback functions - glfw.SetKeyCallback( "keyfun" ); - glfw.SetWindowCloseCallback( "closefun" ); - - while running do - -- Draw - gl.ClearColor(0,1,0,0) - gl.Clear("COLOR_BUFFER_BIT,DEPTH_BUFFER_BIT") - - -- Swap buffers - glfw.SwapBuffers() - end - - -- Terminate GLFW - glfw.Terminate() - - -- Exit program - return -end - - --- Execute! -main() diff -Nru glfw-2.6/support/lua/readme.html glfw-2.7.2/support/lua/readme.html --- glfw-2.6/support/lua/readme.html 2007-05-25 09:56:37.000000000 +0000 +++ glfw-2.7.2/support/lua/readme.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,128 +0,0 @@ - - - - GLFW Readme file for Lua - - - - -
    -GLFW v2.5
    -for Lua -
    - - -

    -

    -
    - -
      -
    1. Introduction
    2. -
    3. Compiling the luaglfw library
    4. -
    5. Using GLFW from Lua
    6. -
    7. The author
    8. -
    -
    -
    -
    - - - -


    - - -
    -

    1. Introduction

    - -

    This directory contains a Lua library that exposes most of the GLFW API -functionality to the Lua programming language. - -

    For further information on how to use GLFW you should read the GLFW -documentation. - - - -


    - - -
    -

    2. Compiling the luaglfw library

    - -

    The GLFW interface library for Lua that you can find in the src -directory is a stand alone component, without any dependencies on other -Lua extensions. However it is fairly useless without Lua itself and some -kind of Lua library for OpenGL. - -

    You will most likely want to build a stand alone Lua interpreter that -is linked with the luaglfw library and some OpenGL library for Lua. If -you are doing something more advanced, such as integrating Lua into your -own C/C++ application, you probably know how to do it, so I will not go -into all the details. - -

    There is a very simple Lua interpreter included in the src -directory. To build it you need the following software compiled and -installed: - -

      -
    • GLFW (of course)
    • -
    • Lua - A free light-weight - programming language.
    • -
    • LuaGL - A free library - that provides access to OpenGL.
    • -
    - -

    With the compiled interpreter, you should be able to run the example -programs in the examples directory. - - - -


    - - - -

    3. Using GLFW from Lua

    - -

    The luaglfw library has been designed to work as similar to the -original GLFW library as possible. There are a few differences though: - -

      -
    • All function names begin with glfw. rather than glfw - (for instance glfwInit is called glfw.Init)
    • -
    • All constant names begin with glfw. rather than GLFW_ - (for instance GLFW_KEY_ESC is called glfw.KEY_ESC)
    • -
    • Functions that return multiple results do so the Lua way rather - than the C way (for instance glfwGetMousePos returns two numbers - instead of taking two variable arguments)
    • -
    • Functions that deal with boolean values do not use Lua - booleans, but rather glfw.TURE/glfw.FALSE
    • -
    • Some functions are unsupported under Lua: glfwReadImage, - glfwFreeImage and all threading functions
    • -
    - - - - -


    - - -
    -

    3. The maintainer

    - -

    My name is Camilla Berglund, -elmindreda@users.sourceforge.net. -Please visit our -support forums -if you have any problems with GLFW or any questions concerning GLFW. - -

    The GLFW web site can be found here: -http://glfw.sourceforge.net/. -It contains the latest version of GLFW, news and other information that is -useful for OpenGL development. - - -


    - - - - - diff -Nru glfw-2.6/support/lua/src/luaglfw.c glfw-2.7.2/support/lua/src/luaglfw.c --- glfw-2.6/support/lua/src/luaglfw.c 2007-05-25 09:56:38.000000000 +0000 +++ glfw-2.7.2/support/lua/src/luaglfw.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1179 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: luaglfw.c -// Platform: Lua 5.0 -// API version: 2.5 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2005 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include -#include -#include "luaglfw.h" - - -//************************************************************************ -//**** Internal type definitions **** -//************************************************************************ - -struct lua_constant -{ - char *str; - int value; -}; - - -//************************************************************************ -//**** Handy functions **** -//************************************************************************ - -// Check the number of arguments on the Lua stack -static int badArgs( lua_State *L, int n, char const *name ) -{ - if( lua_gettop(L) != n ) - { - lua_settop( L, 0 ); - lua_pushstring( L, "Bad arguments passed to function: " ); - lua_pushstring( L, name ); - lua_concat( L, 2 ); - lua_error( L ); - return 1; - } - return 0; -} - -// Get a numeric value from a Lua table -static void getNumber( lua_State *L, int index, char *key, lua_Number *num ) -{ - lua_pushstring( L, key ); - if( index < 0 ) index --; - lua_rawget( L, index ); - if( !lua_isnil( L, -1 ) ) - { - *num = lua_tonumber( L, -1 ); - } - lua_remove( L, -1 ); -} - -// Add constants to the table on top of the stack -static void addConstants( lua_State *L, struct lua_constant *cn ) -{ - while( cn->str ) - { - lua_pushstring( L, cn->str ); - lua_pushnumber( L, cn->value ); - lua_rawset( L, -3 ); - ++ cn; - } -} - -// Report error for unsupported functions -static void unsupportedFunction( lua_State *L, char const *name ) -{ - lua_settop( L, 0 ); - lua_pushstring( L, "Unsupported function: " ); - lua_pushstring( L, name ); - lua_concat( L, 2 ); - lua_error( L ); -} - - - -//************************************************************************ -//*** Callback wrapper functions **** -//************************************************************************ - -static lua_State * callback_lua_state = (lua_State *) 0; - -static const char * windowsize_name; -static const char * windowclose_name; -static const char * windowrefresh_name; -static const char * mousebutton_name; -static const char * mousepos_name; -static const char * mousewheel_name; -static const char * key_name; -static const char * char_name; - - -void GLFWCALL luaglfw_windowsizefun( int w, int h ) -{ - lua_State *L = callback_lua_state; - if( L == NULL ) return; - - lua_getglobal( L, windowsize_name ); - if( lua_isfunction( L, -1 ) ) - { - lua_pushnumber( L, (lua_Number)w ); - lua_pushnumber( L, (lua_Number)h ); - lua_pcall( L, 2, 0, 0 ); - } -} - -int GLFWCALL luaglfw_windowclosefun( void ) -{ - lua_State *L = callback_lua_state; - int do_close = 1; - if( L == NULL ) return 1; - - lua_getglobal( L, windowclose_name ); - if( lua_isfunction( L, -1 ) ) - { - lua_pcall( L, 0, 1, 0 ); - do_close = (int) lua_tonumber( L, -1 ); - lua_pop( L, 1 ); - } - return do_close; -} - -void GLFWCALL luaglfw_windowrefreshfun( void ) -{ - lua_State *L = callback_lua_state; - if( L == NULL ) return; - - lua_getglobal( L, windowrefresh_name ); - if( lua_isfunction( L, -1 ) ) - { - lua_pcall( L, 0, 0, 0 ); - } -} - -void GLFWCALL luaglfw_mousebuttonfun( int button, int action ) -{ - lua_State *L = callback_lua_state; - if( L == NULL ) return; - - lua_getglobal( L, mousebutton_name ); - if( lua_isfunction( L, -1 ) ) - { - lua_pushnumber( L, (lua_Number)button ); - lua_pushnumber( L, (lua_Number)action ); - lua_pcall( L, 2, 0, 0 ); - } -} - -void GLFWCALL luaglfw_mouseposfun( int x, int y ) -{ - lua_State *L = callback_lua_state; - if( L == NULL ) return; - - lua_getglobal( L, mousepos_name ); - if( lua_isfunction( L, -1 ) ) - { - lua_pushnumber( L, (lua_Number)x ); - lua_pushnumber( L, (lua_Number)y ); - lua_pcall( L, 2, 0, 0 ); - } -} - -void GLFWCALL luaglfw_mousewheelfun( int wheelpos ) -{ - lua_State *L = callback_lua_state; - if( L == NULL ) return; - - lua_getglobal( L, mousewheel_name ); - if( lua_isfunction( L, -1 ) ) - { - lua_pushnumber( L, (lua_Number)wheelpos ); - lua_pcall( L, 1, 0, 0 ); - } -} - -void GLFWCALL luaglfw_keyfun( int key, int action ) -{ - lua_State *L = callback_lua_state; - if( L == NULL ) return; - - lua_getglobal( L, key_name ); - if( lua_isfunction( L, -1 ) ) - { - lua_pushnumber( L, (lua_Number)key ); - lua_pushnumber( L, (lua_Number)action ); - lua_pcall( L, 2, 0, 0 ); - } -} - -void GLFWCALL luaglfw_charfun( int key, int action ) -{ - lua_State *L = callback_lua_state; - if( L == NULL ) return; - - lua_getglobal( L, char_name ); - if( lua_isfunction( L, -1 ) ) - { - lua_pushnumber( L, (lua_Number)key ); - lua_pushnumber( L, (lua_Number)action ); - lua_pcall( L, 2, 0, 0 ); - } -} - - - -//************************************************************************ -//**** GLFW proxy functions **** -//************************************************************************ - - -//======================================================================== -// Init/termination & version info -//======================================================================== - -static int glfw_Init( lua_State *L ) -{ - int res; - lua_settop( L, 0 ); - res = glfwInit(); - lua_pushnumber( L, (lua_Number)res ); - return 1; -} - -static int glfw_Terminate( lua_State *L ) -{ - glfwTerminate(); - return 0; -} - -static int glfw_GetVersion( lua_State *L ) -{ - int major, minor, rev; - glfwGetVersion( &major, &minor, &rev ); - lua_pushnumber( L, major ); - lua_pushnumber( L, minor ); - lua_pushnumber( L, rev ); - return 3; -} - - -//======================================================================== -// Window handling -//======================================================================== - -static int glfw_OpenWindow( lua_State *L ) -{ - lua_Number w, h, r, g, b, a, depth, stencil, mode; - int argc, res; - - // Check arguments - if( badArgs( L, 9, "OpenWindow" ) ) return 0; - - // Get all arguments to glfwOpenWindow - w = lua_tonumber( L, 1 ); - h = lua_tonumber( L, 2 ); - r = lua_tonumber( L, 3 ); - g = lua_tonumber( L, 4 ); - b = lua_tonumber( L, 5 ); - a = lua_tonumber( L, 6 ); - depth = lua_tonumber( L, 7 ); - stencil = lua_tonumber( L, 8 ); - mode = lua_tonumber( L, 9 ); - - // Call glfwOpenWindow - lua_settop( L,0 ); - res = glfwOpenWindow( (int)w, (int)h, (int)r, (int)g, (int)b, - (int)a, (int)depth, (int)stencil, - (int)mode ); - - // Return result - lua_pushnumber( L, (lua_Number)res ); - return 1; -} - -static int glfw_OpenWindowHint( lua_State *L ) -{ - lua_Number target, hint; - if( badArgs( L, 2, "OpenWindowHint" ) ) return 0; - target = lua_tonumber( L, 1 ); - hint = lua_tonumber( L, 2 ); - lua_settop( L, 0 ); - glfwOpenWindowHint( (int)target, (int)hint ); - return 0; -} - -static int glfw_CloseWindow( lua_State *L ) -{ - glfwCloseWindow(); - return 0; -} - -static int glfw_SetWindowTitle( lua_State *L ) -{ - const char *str; - if( badArgs( L, 1, "SetWindowTitle" ) ) return 0; - str = lua_tostring( L, 1 ); - lua_remove( L, 1 ); - glfwSetWindowTitle( str ); - return 0; -} - -static int glfw_SetWindowSize( lua_State *L ) -{ - lua_Number w, h; - if( badArgs( L, 2, "SetWindowSize" ) ) return 0; - w = lua_tonumber( L, 1 ); - h = lua_tonumber( L, 2 ); - lua_settop( L, 0 ); - glfwSetWindowSize( (int)w, (int)h ); - return 0; -} - -static int glfw_GetWindowSize( lua_State *L ) -{ - int w, h; - glfwGetWindowSize( &w, &h ); - lua_settop( L, 0 ); - lua_pushnumber( L, (lua_Number)w ); - lua_pushnumber( L, (lua_Number)h ); - return 2; -} - -static int glfw_SetWindowPos( lua_State *L ) -{ - lua_Number x, y; - if( badArgs( L, 2, "SetWindowPos" ) ) return 0; - x = lua_tonumber( L, 1 ); - y = lua_tonumber( L, 2 ); - lua_settop( L, 0 ); - glfwSetWindowPos( (int)x, (int)y ); - return 0; -} - -static int glfw_IconifyWindow( lua_State *L ) -{ - glfwIconifyWindow(); - return 0; -} - -static int glfw_RestoreWindow( lua_State *L ) -{ - glfwRestoreWindow(); - return 0; -} - -static int glfw_GetWindowParam( lua_State *L ) -{ - lua_Number n; - if( badArgs( L, 1, "GetWindowParam" ) ) return 0; - n = lua_tonumber( L, 1 ); - lua_settop( L, 0 ); - n = glfwGetWindowParam( (int)n ); - lua_pushnumber( L, n ); - return 1; -} - - - -//======================================================================== -// Buffer swapping -//======================================================================== - -static int glfw_SwapBuffers( lua_State *L ) -{ - glfwSwapBuffers(); - return 0; -} - -static int glfw_SwapInterval( lua_State *L ) -{ - lua_Number interval; - if( badArgs( L, 1, "SwapInterval" ) ) return 0; - interval = lua_tonumber( L, 1 ); - lua_remove( L, 1 ); - glfwSwapInterval( (int)interval ); - return 0; -} - - -//======================================================================== -// Video modes -//======================================================================== - -static int glfw_GetVideoModes( lua_State *L ) -{ - // !!TODO!! - unsupportedFunction( L, "GetVideoModes" ); - return 0; -} - -static int glfw_GetDesktopMode( lua_State *L ) -{ - GLFWvidmode mode; - glfwGetDesktopMode( &mode ); - - lua_newtable( L ); - lua_pushstring( L, "Width" ); - lua_pushnumber( L, mode.Width ); - lua_rawset( L, -3 ); - lua_pushstring( L, "Height" ); - lua_pushnumber( L, mode.Height ); - lua_rawset( L, -3 ); - - return 1; -} - - -//======================================================================== -// Event polling/waiting -//======================================================================== - -static int glfw_PollEvents( lua_State *L ) -{ - glfwPollEvents(); - return 0; -} - -static int glfw_WaitEvents( lua_State *L ) -{ - glfwWaitEvents(); - return 0; -} - - -//======================================================================== -// Key and mouse input -//======================================================================== - -static int glfw_GetKey( lua_State *L ) -{ - int n = 0; - - if( badArgs( L, 1, "GetKey" ) ) return 0; - - switch( lua_type( L, 1 ) ) - { - case LUA_TSTRING: - n = (lua_tostring(L,1)[0]); - break; - - case LUA_TNUMBER: - n = lua_tonumber(L,1); - break; - } - - lua_settop( L, 0 ); - n = glfwGetKey( n ); - lua_pushnumber( L, n ); - return 1; -} - -static int glfw_GetMouseButton( lua_State *L ) -{ - lua_Number n; - if( badArgs( L, 1, "GetMouseButton" ) ) return 0; - n = lua_tonumber( L, 1 ); - lua_settop( L, 0 ); - lua_pushnumber( L, glfwGetMouseButton( (int)n ) ); - return 1; -} - -static int glfw_GetMousePos( lua_State *L ) -{ - int x, y; - glfwGetMousePos( &x, &y ); - lua_settop( L, 0 ); - lua_pushnumber( L, (lua_Number)x ); - lua_pushnumber( L, (lua_Number)y ); - return 2; -} - -static int glfw_SetMousePos( lua_State *L ) -{ - lua_Number x, y; - if( badArgs( L, 2, "SetMousePos" ) ) return 0; - x = lua_tonumber( L, 1 ); - y = lua_tonumber( L, 2 ); - lua_settop( L, 0 ); - glfwSetMousePos( (int)x, (int)y ); - return 0; -} - -static int glfw_GetMouseWheel( lua_State *L ) -{ - int pos; - pos = glfwGetMouseWheel(); - lua_settop( L, 0 ); - lua_pushnumber( L, (lua_Number)pos ); - return 1; -} - -static int glfw_SetMouseWheel( lua_State *L ) -{ - lua_Number pos; - if( badArgs( L, 1, "SetMouseWheel" ) ) return 0; - pos = lua_tonumber( L, 1 ); - lua_settop( L, 0 ); - glfwSetMouseWheel( (int)pos ); - return 0; -} - - -//======================================================================== -// Joystick input -//======================================================================== - -static int glfw_GetJoystickParam( lua_State *L ) -{ - lua_Number joy, param; - int res; - if( badArgs( L, 2, "GetJoystickParam" ) ) return 0; - joy = lua_tonumber( L, 1 ); - param = lua_tonumber( L, 2 ); - lua_settop( L, 0 ); - res = glfwGetJoystickParam( (int)joy, (int)param ); - lua_pushnumber( L, (lua_Number)res ); - return 1; -} - -#define LUAGLFW_MAX_JOY_AXES 256 - -static int glfw_GetJoystickPos( lua_State *L ) -{ - int joy, numaxes, res, i; - float pos[ LUAGLFW_MAX_JOY_AXES ]; - - // Get arguments - if( badArgs( L, 2, "GetJoystickPos" ) ) return 0; - joy = (int)lua_tonumber( L, 1 ); - numaxes = (int)lua_tonumber( L, 2 ); - lua_settop( L, 0 ); - if( numaxes < 1 ) return 0; - if( numaxes > LUAGLFW_MAX_JOY_AXES ) numaxes = LUAGLFW_MAX_JOY_AXES; - - // Call GLFW funciton - res = glfwGetJoystickPos( joy, pos, numaxes ); - - // Create result array - lua_newtable( L ); - for( i = 0; i < res; ++ i ) - { - lua_pushnumber( L, (lua_Number)(i+1) ); - lua_pushnumber( L, pos[ i ] ); - lua_rawset( L, -3 ); - } - - return 1; -} - -#define LUAGLFW_MAX_JOY_BUTTONS 256 - -static int glfw_GetJoystickButtons( lua_State *L ) -{ - int joy, numbuttons, res, i; - unsigned char buttons[ LUAGLFW_MAX_JOY_AXES ]; - - // Get arguments - if( badArgs( L, 2, "GetJoystickButtons" ) ) return 0; - joy = (int)lua_tonumber( L, 1 ); - numbuttons = (int)lua_tonumber( L, 2 ); - lua_settop( L, 0 ); - if( numbuttons < 1 ) return 0; - if( numbuttons > LUAGLFW_MAX_JOY_BUTTONS ) - numbuttons = LUAGLFW_MAX_JOY_BUTTONS; - - // Call GLFW funciton - res = glfwGetJoystickButtons( joy, buttons, numbuttons ); - - // Create result array - lua_newtable( L ); - for( i = 0; i < res; ++ i ) - { - lua_pushnumber( L, (lua_Number)(i+1) ); - lua_pushnumber( L, (lua_Number)buttons[ i ] ); - lua_rawset( L, -3 ); - } - - return 1; -} - - -//======================================================================== -// Timing -//======================================================================== - -static int glfw_GetTime( lua_State *L ) -{ - lua_Number t; - t = glfwGetTime(); - lua_settop( L, 0 ); - lua_pushnumber( L, t ); - return 1; -} - -static int glfw_SetTime( lua_State *L ) -{ - lua_Number t; - if ( badArgs( L, 1, "SetTime" ) ) return 0; - t = lua_tonumber( L, 1 ); - lua_settop( L, 0 ); - glfwSetTime( (double)t ); - return 0; -} - -static int glfw_Sleep( lua_State *L ) -{ - lua_Number t; - if ( badArgs( L, 1, "Sleep" ) ) return 0; - t = lua_tonumber( L, 1 ); - lua_settop( L, 0 ); - glfwSleep( (double)t ); - return 0; -} - - -//======================================================================== -// Threading support (not possible in Lua) -//======================================================================== - -static int glfw_CreateThread( lua_State *L ) -{ - unsupportedFunction( L, "CreateThread" ); - return 0; -} - -static int glfw_DestroyThread( lua_State *L ) -{ - unsupportedFunction( L, "DestroyThread" ); - return 0; -} - -static int glfw_WaitThread( lua_State *L ) -{ - unsupportedFunction( L, "WaitThread" ); - return 0; -} - -static int glfw_GetThreadID( lua_State *L ) -{ - unsupportedFunction( L, "GetThreadID" ); - return 0; -} - -static int glfw_CreateMutex( lua_State *L ) -{ - unsupportedFunction( L, "CreateMutex" ); - return 0; -} - -static int glfw_DestroyMutex( lua_State *L ) -{ - unsupportedFunction( L, "DestroyMutex" ); - return 0; -} - -static int glfw_LockMutex( lua_State *L ) -{ - unsupportedFunction( L, "LockMutex" ); - return 0; -} - -static int glfw_UnlockMutex( lua_State *L ) -{ - unsupportedFunction( L, "UnlockMutex" ); - return 0; -} - -static int glfw_CreateCond( lua_State *L ) -{ - unsupportedFunction( L, "CreateCond" ); - return 0; -} - -static int glfw_DestroyCond( lua_State *L ) -{ - unsupportedFunction( L, "DestroyCond" ); - return 0; -} - -static int glfw_WaitCond( lua_State *L ) -{ - unsupportedFunction( L, "WaitCond" ); - return 0; -} - -static int glfw_SignalCond( lua_State *L ) -{ - unsupportedFunction( L, "SignalCond" ); - return 0; -} - -static int glfw_BroadcastCond( lua_State *L ) -{ - unsupportedFunction( L, "BroadcastCond" ); - return 0; -} - -static int glfw_GetNumberOfProcessors( lua_State *L ) -{ - int n; - n = glfwGetNumberOfProcessors(); - lua_settop( L,0 ); - lua_pushnumber( L, (lua_Number)n ); - return 1; -} - - -//======================================================================== -// Extension handling -//======================================================================== - -static int glfw_GetGLVersion( lua_State *L ) -{ - int major, minor, rev; - glfwGetGLVersion( &major, &minor, &rev ); - lua_settop( L,0 ); - lua_pushnumber( L, (lua_Number)major ); - lua_pushnumber( L, (lua_Number)minor ); - lua_pushnumber( L, (lua_Number)rev ); - return 3; -} - -static int glfw_ExtensionSupported( lua_State *L ) -{ - const char *str; - int res; - if( badArgs( L, 1, "ExtensionSupported" ) ) return 0; - str = lua_tostring( L, 1 ); - lua_settop( L, 0 ); - res = glfwExtensionSupported( str ); - lua_pushnumber( L, (lua_Number)res ); - return 1; -} - - -//======================================================================== -// Enable/Disable -//======================================================================== - -static int glfw_Enable( lua_State *L ) -{ - lua_Number param; - if ( badArgs( L, 1, "Enable" ) ) return 0; - param = lua_tonumber( L, 1 ); - lua_settop( L, 0 ); - glfwEnable( (int)param ); - return 0; -} - -static int glfw_Disable( lua_State *L ) -{ - lua_Number param; - if ( badArgs( L, 1, "Disable" ) ) return 0; - param = lua_tonumber( L, 1 ); - lua_settop( L, 0 ); - glfwDisable( (int)param ); - return 0; -} - - -//======================================================================== -// Image/texture I/O support -//======================================================================== - -static int glfw_ReadImage( lua_State *L ) -{ - unsupportedFunction( L, "ReadImage" ); - return 0; -} - -static int glfw_FreeImage( lua_State *L ) -{ - unsupportedFunction( L, "FreeImage" ); - return 0; -} - -static int glfw_LoadTexture2D( lua_State *L ) -{ - const char *name; - lua_Number flags; - int res; - if( badArgs( L, 2, "LoadTexture2D" ) ) return 0; - name = lua_tostring( L, 1 ); - flags = lua_tonumber( L, 2 ); - lua_settop( L, 0 ); - res = glfwLoadTexture2D( name, (int)flags ); - lua_pushnumber( L, (lua_Number)res ); - return 1; -} - - -//======================================================================== -// Callback function management -//======================================================================== - -static int glfw_SetWindowSizeCallback( lua_State *L ) -{ - GLFWwindowsizefun fun = NULL; - if( lua_isstring( L, 1 ) ) - { - windowsize_name = lua_tostring( L, 1 ); - fun = luaglfw_windowsizefun; - } - glfwSetWindowSizeCallback( fun ); - return 0; -} - -static int glfw_SetWindowCloseCallback( lua_State *L ) -{ - GLFWwindowclosefun fun = NULL; - if( lua_isstring( L, 1 ) ) - { - windowclose_name = lua_tostring( L, 1 ); - fun = luaglfw_windowclosefun; - } - glfwSetWindowCloseCallback( fun ); - return 0; -} - -static int glfw_SetWindowRefreshCallback( lua_State *L ) -{ - GLFWwindowrefreshfun fun = NULL; - if( lua_isstring( L, 1 ) ) - { - windowrefresh_name = lua_tostring( L, 1 ); - fun = luaglfw_windowrefreshfun; - } - glfwSetWindowRefreshCallback( fun ); - return 0; -} - -static int glfw_SetMouseButtonCallback( lua_State *L ) -{ - GLFWmousebuttonfun fun = NULL; - if( lua_isstring( L, 1 ) ) - { - mousebutton_name = lua_tostring( L, 1 ); - fun = luaglfw_mousebuttonfun; - } - glfwSetMouseButtonCallback( fun ); - return 0; -} - -static int glfw_SetMousePosCallback( lua_State *L ) -{ - GLFWmouseposfun fun = NULL; - if( lua_isstring( L, 1 ) ) - { - mousepos_name = lua_tostring( L, 1 ); - fun = luaglfw_mouseposfun; - } - glfwSetMousePosCallback( fun ); - return 0; -} - -static int glfw_SetMouseWheelCallback( lua_State *L ) -{ - GLFWmousewheelfun fun = NULL; - if( lua_isstring( L, 1 ) ) - { - mousewheel_name = lua_tostring( L, 1 ); - fun = luaglfw_mousewheelfun; - } - glfwSetMouseWheelCallback( fun ); - return 0; -} - -static int glfw_SetKeyCallback( lua_State *L ) -{ - GLFWkeyfun fun = NULL; - if( lua_isstring( L, 1 ) ) - { - key_name = lua_tostring( L, 1 ); - fun = luaglfw_keyfun; - } - glfwSetKeyCallback( fun ); - return 0; -} - -static int glfw_SetCharCallback( lua_State *L ) -{ - GLFWcharfun fun = NULL; - if( lua_isstring( L, 1 ) ) - { - char_name = lua_tostring( L, 1 ); - fun = luaglfw_charfun; - } - glfwSetCharCallback( fun ); - return 0; -} - - - -//************************************************************************ -//**** LUA Library Registration **** -//************************************************************************ - -// GLFW constants are stored in the global Lua table "glfw" -static struct lua_constant glfw_constants[] = -{ - // GL constants (GL_TRUE/GL_FALSE) - { "TRUE", GL_TRUE }, - { "FALSE", GL_FALSE }, - - // GLFW version - { "VERSION_MAJOR", GLFW_VERSION_MAJOR }, - { "VERSION_MINOR", GLFW_VERSION_MINOR }, - { "VERSION_REVISION", GLFW_VERSION_REVISION }, - - // Key and button state/action definitions - { "PRESS", GLFW_PRESS }, - { "RELEASE", GLFW_RELEASE }, - - // Keyboard key definitions - { "KEY_SPACE", GLFW_KEY_SPACE }, - { "KEY_SPECIAL", GLFW_KEY_SPECIAL }, - { "KEY_ESC", GLFW_KEY_ESC }, - { "KEY_F1", GLFW_KEY_F1 }, - { "KEY_F2", GLFW_KEY_F2 }, - { "KEY_F3", GLFW_KEY_F3 }, - { "KEY_F4", GLFW_KEY_F4 }, - { "KEY_F5", GLFW_KEY_F5 }, - { "KEY_F6", GLFW_KEY_F6 }, - { "KEY_F7", GLFW_KEY_F7 }, - { "KEY_F8", GLFW_KEY_F8 }, - { "KEY_F9", GLFW_KEY_F9 }, - { "KEY_F10", GLFW_KEY_F10 }, - { "KEY_F11", GLFW_KEY_F11 }, - { "KEY_F12", GLFW_KEY_F12 }, - { "KEY_F13", GLFW_KEY_F13 }, - { "KEY_F14", GLFW_KEY_F14 }, - { "KEY_F15", GLFW_KEY_F15 }, - { "KEY_F16", GLFW_KEY_F16 }, - { "KEY_F17", GLFW_KEY_F17 }, - { "KEY_F18", GLFW_KEY_F18 }, - { "KEY_F19", GLFW_KEY_F19 }, - { "KEY_F20", GLFW_KEY_F20 }, - { "KEY_F21", GLFW_KEY_F21 }, - { "KEY_F22", GLFW_KEY_F22 }, - { "KEY_F23", GLFW_KEY_F23 }, - { "KEY_F24", GLFW_KEY_F24 }, - { "KEY_F25", GLFW_KEY_F25 }, - { "KEY_UP", GLFW_KEY_UP }, - { "KEY_DOWN", GLFW_KEY_DOWN }, - { "KEY_LEFT", GLFW_KEY_LEFT }, - { "KEY_RIGHT", GLFW_KEY_RIGHT }, - { "KEY_LSHIFT", GLFW_KEY_LSHIFT }, - { "KEY_RSHIFT", GLFW_KEY_RSHIFT }, - { "KEY_LCTRL", GLFW_KEY_LCTRL }, - { "KEY_RCTRL", GLFW_KEY_RCTRL }, - { "KEY_LALT", GLFW_KEY_LALT }, - { "KEY_RALT", GLFW_KEY_RALT }, - { "KEY_TAB", GLFW_KEY_TAB }, - { "KEY_ENTER", GLFW_KEY_ENTER }, - { "KEY_BACKSPACE", GLFW_KEY_BACKSPACE }, - { "KEY_INSERT", GLFW_KEY_INSERT }, - { "KEY_DEL", GLFW_KEY_DEL }, - { "KEY_PAGEUP", GLFW_KEY_PAGEUP }, - { "KEY_PAGEDOWN", GLFW_KEY_PAGEDOWN }, - { "KEY_HOME", GLFW_KEY_HOME }, - { "KEY_END", GLFW_KEY_END }, - { "KEY_KP_0", GLFW_KEY_KP_0 }, - { "KEY_KP_1", GLFW_KEY_KP_1 }, - { "KEY_KP_2", GLFW_KEY_KP_2 }, - { "KEY_KP_3", GLFW_KEY_KP_3 }, - { "KEY_KP_4", GLFW_KEY_KP_4 }, - { "KEY_KP_5", GLFW_KEY_KP_5 }, - { "KEY_KP_6", GLFW_KEY_KP_6 }, - { "KEY_KP_7", GLFW_KEY_KP_7 }, - { "KEY_KP_8", GLFW_KEY_KP_8 }, - { "KEY_KP_9", GLFW_KEY_KP_9 }, - { "KEY_KP_DIVIDE", GLFW_KEY_KP_DIVIDE }, - { "KEY_KP_MULTIPLY", GLFW_KEY_KP_MULTIPLY }, - { "KEY_KP_SUBTRACT", GLFW_KEY_KP_SUBTRACT }, - { "KEY_KP_ADD", GLFW_KEY_KP_ADD }, - { "KEY_KP_DECIMAL", GLFW_KEY_KP_DECIMAL }, - { "KEY_KP_EQUAL", GLFW_KEY_KP_EQUAL }, - { "KEY_KP_ENTER", GLFW_KEY_KP_ENTER }, - { "KEY_LAST", GLFW_KEY_LAST }, - - // Mouse button definitions - { "MOUSE_BUTTON_1", GLFW_MOUSE_BUTTON_1 }, - { "MOUSE_BUTTON_2", GLFW_MOUSE_BUTTON_2 }, - { "MOUSE_BUTTON_3", GLFW_MOUSE_BUTTON_3 }, - { "MOUSE_BUTTON_4", GLFW_MOUSE_BUTTON_4 }, - { "MOUSE_BUTTON_5", GLFW_MOUSE_BUTTON_5 }, - { "MOUSE_BUTTON_6", GLFW_MOUSE_BUTTON_6 }, - { "MOUSE_BUTTON_7", GLFW_MOUSE_BUTTON_7 }, - { "MOUSE_BUTTON_8", GLFW_MOUSE_BUTTON_8 }, - { "MOUSE_BUTTON_LAST", GLFW_MOUSE_BUTTON_LAST }, - - // Mouse button aliases - { "MOUSE_BUTTON_LEFT", GLFW_MOUSE_BUTTON_LEFT }, - { "MOUSE_BUTTON_RIGHT", GLFW_MOUSE_BUTTON_RIGHT }, - { "MOUSE_BUTTON_MIDDLE", GLFW_MOUSE_BUTTON_MIDDLE }, - - // Joystick identifiers - { "JOYSTICK_1", GLFW_JOYSTICK_1 }, - { "JOYSTICK_2", GLFW_JOYSTICK_2 }, - { "JOYSTICK_3", GLFW_JOYSTICK_3 }, - { "JOYSTICK_4", GLFW_JOYSTICK_4 }, - { "JOYSTICK_5", GLFW_JOYSTICK_5 }, - { "JOYSTICK_6", GLFW_JOYSTICK_6 }, - { "JOYSTICK_7", GLFW_JOYSTICK_7 }, - { "JOYSTICK_8", GLFW_JOYSTICK_8 }, - { "JOYSTICK_9", GLFW_JOYSTICK_9 }, - { "JOYSTICK_10", GLFW_JOYSTICK_10 }, - { "JOYSTICK_11", GLFW_JOYSTICK_11 }, - { "JOYSTICK_12", GLFW_JOYSTICK_12 }, - { "JOYSTICK_13", GLFW_JOYSTICK_13 }, - { "JOYSTICK_14", GLFW_JOYSTICK_14 }, - { "JOYSTICK_15", GLFW_JOYSTICK_15 }, - { "JOYSTICK_16", GLFW_JOYSTICK_16 }, - { "JOYSTICK_LAST", GLFW_JOYSTICK_LAST }, - - // glfwOpenWindow modes - { "WINDOW", GLFW_WINDOW }, - { "FULLSCREEN", GLFW_FULLSCREEN }, - - // glfwGetWindowParam tokens - { "OPENED", GLFW_OPENED }, - { "ACTIVE", GLFW_ACTIVE }, - { "ICONIFIED", GLFW_ICONIFIED }, - { "ACCELERATED", GLFW_ACCELERATED }, - { "RED_BITS", GLFW_RED_BITS }, - { "GREEN_BITS", GLFW_GREEN_BITS }, - { "BLUE_BITS", GLFW_BLUE_BITS }, - { "ALPHA_BITS", GLFW_ALPHA_BITS }, - { "DEPTH_BITS", GLFW_DEPTH_BITS }, - { "STENCIL_BITS", GLFW_STENCIL_BITS }, - - // Constants for glfwGetWindowParam and glfwOpenWindowHint - { "REFRESH_RATE", GLFW_REFRESH_RATE }, - { "ACCUM_RED_BITS", GLFW_ACCUM_RED_BITS }, - { "ACCUM_GREEN_BITS", GLFW_ACCUM_GREEN_BITS }, - { "ACCUM_BLUE_BITS", GLFW_ACCUM_BLUE_BITS }, - { "ACCUM_ALPHA_BITS", GLFW_ACCUM_ALPHA_BITS }, - { "AUX_BUFFERS", GLFW_AUX_BUFFERS }, - { "STEREO", GLFW_STEREO }, - - // glfwEnable/glfwDisable tokens - { "MOUSE_CURSOR", GLFW_MOUSE_CURSOR }, - { "STICKY_KEYS", GLFW_STICKY_KEYS }, - { "STICKY_MOUSE_BUTTONS", GLFW_STICKY_MOUSE_BUTTONS }, - { "SYSTEM_KEYS", GLFW_SYSTEM_KEYS }, - { "KEY_REPEAT", GLFW_KEY_REPEAT }, - { "AUTO_POLL_EVENTS", GLFW_AUTO_POLL_EVENTS }, - - // glfwWaitThread wait modes - { "WAIT", GLFW_WAIT }, - { "NOWAIT", GLFW_NOWAIT }, - - // glfwGetJoystickParam tokens - { "PRESENT", GLFW_PRESENT }, - { "AXES", GLFW_AXES }, - { "BUTTONS", GLFW_BUTTONS }, - - // glfwReadImage/glfwLoadTexture2D flags - { "NO_RESCALE_BIT", GLFW_NO_RESCALE_BIT }, - { "ORIGIN_UL_BIT", GLFW_ORIGIN_UL_BIT }, - { "BUILD_MIPMAPS_BIT", GLFW_BUILD_MIPMAPS_BIT }, - { "ALPHA_MAP_BIT", GLFW_ALPHA_MAP_BIT }, - - // Time spans longer than this (seconds) are considered to be infinity - { "INFINITY", GLFW_INFINITY }, - - { NULL, 0 } -}; - - -// Library functions to register -static const luaL_reg glfwlib[] = { - { "Init", glfw_Init }, - { "Terminate", glfw_Terminate }, - { "GetVersion", glfw_GetVersion }, - { "OpenWindow", glfw_OpenWindow }, - { "OpenWindowHint", glfw_OpenWindowHint }, - { "CloseWindow", glfw_CloseWindow }, - { "SetWindowTitle", glfw_SetWindowTitle }, - { "SetWindowSize", glfw_SetWindowSize }, - { "GetWindowSize", glfw_GetWindowSize }, - { "SetWindowPos", glfw_SetWindowPos }, - { "IconifyWindow", glfw_IconifyWindow }, - { "RestoreWindow", glfw_RestoreWindow }, - { "GetWindowParam", glfw_GetWindowParam }, - { "SwapBuffers", glfw_SwapBuffers }, - { "SwapInterval", glfw_SwapInterval }, - { "GetVideoModes", glfw_GetVideoModes }, - { "GetDesktopMode", glfw_GetDesktopMode }, - { "PollEvents", glfw_PollEvents }, - { "WaitEvents", glfw_WaitEvents }, - { "GetKey", glfw_GetKey }, - { "GetMouseButton", glfw_GetMouseButton }, - { "GetMousePos", glfw_GetMousePos }, - { "SetMousePos", glfw_SetMousePos }, - { "GetMouseWheel", glfw_GetMouseWheel }, - { "SetMouseWheel", glfw_SetMouseWheel }, - { "GetJoystickParam", glfw_GetJoystickParam }, - { "GetJoystickPos", glfw_GetJoystickPos }, - { "GetJoystickButtons", glfw_GetJoystickButtons }, - { "GetTime", glfw_GetTime }, - { "SetTime", glfw_SetTime }, - { "Sleep", glfw_Sleep }, - { "GetGLVersion", glfw_GetGLVersion }, - { "ExtensionSupported", glfw_ExtensionSupported }, - { "CreateThread", glfw_CreateThread }, - { "DestroyThread", glfw_DestroyThread }, - { "WaitThread", glfw_WaitThread }, - { "GetThreadID", glfw_GetThreadID }, - { "CreateMutex", glfw_CreateMutex }, - { "DestroyMutex", glfw_DestroyMutex }, - { "LockMutex", glfw_LockMutex }, - { "UnlockMutex", glfw_UnlockMutex }, - { "CreateCond", glfw_CreateCond }, - { "DestroyCond", glfw_DestroyCond }, - { "WaitCond", glfw_WaitCond }, - { "SignalCond", glfw_SignalCond }, - { "BroadcastCond", glfw_BroadcastCond }, - { "GetNumberOfProcessors", glfw_GetNumberOfProcessors }, - { "Enable", glfw_Enable }, - { "Disable", glfw_Disable }, - { "ReadImage", glfw_ReadImage }, - { "FreeImage", glfw_FreeImage }, - { "LoadTexture2D", glfw_LoadTexture2D }, - { "SetWindowSizeCallback", glfw_SetWindowSizeCallback }, - { "SetWindowCloseCallback", glfw_SetWindowCloseCallback }, - { "SetWindowRefreshCallback", glfw_SetWindowRefreshCallback }, - { "SetMouseButtonCallback", glfw_SetMouseButtonCallback }, - { "SetMousePosCallback", glfw_SetMousePosCallback }, - { "SetMouseWheelCallback", glfw_SetMouseWheelCallback }, - { "SetKeyCallback", glfw_SetKeyCallback }, - { "SetCharCallback", glfw_SetCharCallback }, - { NULL, NULL } -}; - - - -int luaopen_glfw( lua_State *L ) -{ - // Store GLFW functions in "glfw" table - luaL_openlib( L, "glfw", glfwlib, 0 ); - - // Store GLFW constants in "glfw" table - lua_pushstring( L, "glfw" ); - lua_gettable( L, LUA_GLOBALSINDEX ); - addConstants( L, glfw_constants ); - lua_settop( L, 0 ); - - // Remember Lua state for callback functions - callback_lua_state = L; - - return 0; -} diff -Nru glfw-2.6/support/lua/src/luaglfw.h glfw-2.7.2/support/lua/src/luaglfw.h --- glfw-2.6/support/lua/src/luaglfw.h 2007-05-25 09:56:38.000000000 +0000 +++ glfw-2.7.2/support/lua/src/luaglfw.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: luaglfw.h -// Platform: Lua 5.0 -// API version: 2.5 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2005 Camilla Berglund -// -// 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 __luaglfw_h_ -#define __luaglfw_h_ - -#ifdef __cplusplus -extern "C" { -#endif - - -#include - -int luaopen_glfw( lua_State * L ); - - -#ifdef __cplusplus -} -#endif - -#endif // __luaglfw_h_ diff -Nru glfw-2.6/support/lua/src/runlua.c glfw-2.7.2/support/lua/src/runlua.c --- glfw-2.6/support/lua/src/runlua.c 2007-05-25 09:56:38.000000000 +0000 +++ glfw-2.7.2/support/lua/src/runlua.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ -//======================================================================== -// A simple Lua interpreter with support for GLFW and OpenGL -// File: runlua.c -// Platform: Lua 5.0 + LuaGL + luaglfw -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2005 Camilla Berglund -// -// 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. -// -//======================================================================== - -#include -#include -#include -#include - -#include -#include "luaglfw.h" - - -//======================================================================== -// main() - Program entry point -//======================================================================== - -int main( int argc, char **argv ) -{ - lua_State *L; - - // Check arguments - if( argc != 2 ) - { - printf( "Usage: %s filename.lua\n", argv[0] ); - return -1; - } - - // Init Lua - L = lua_open(); - if( !L ) - { - printf("Unable to start Lua\n"); - return -1; - } - - // Open all Lua standard libraries - luaopen_base( L ); - luaopen_table( L ); - luaopen_io( L ); - luaopen_string( L ); - luaopen_math( L ); - - // Open LuaGL and luaglfw libraries - luaopen_opengl( L ); - luaopen_glfw( L ); - - // Load and run the selected Lua program - if( luaL_loadfile( L, argv[1] ) || lua_pcall( L, 0, 0, 0 ) ) - { - printf("Error running Lua program: %s\n", lua_tostring( L, -1 ) ); - lua_pop( L, 1 ); - return -1; - } - - return 0; -} diff -Nru glfw-2.6/support/masm/examples/fpc.mac glfw-2.7.2/support/masm/examples/fpc.mac --- glfw-2.6/support/masm/examples/fpc.mac 2004-02-14 20:06:30.000000000 +0000 +++ glfw-2.7.2/support/masm/examples/fpc.mac 1970-01-01 00:00:00.000000000 +0000 @@ -1,47 +0,0 @@ -;######################################################################### -;# FPC - Floating Point Constant # -;# Macro by BitRake # -;######################################################################### - -fpc MACRO val:REQ - LOCAL w,x,y,z,zz,ww - - ;; split type and value, defaulting to REAL4 - z INSTR 1,<&val>, - IF z EQ 0 - y TEXTEQU - x TEXTEQU <&val> - ELSE - y TEXTEQU @SubStr(<&val>,1,z-1) ;; Type - x TEXTEQU @SubStr(<&val>,z+1,) ;; Value - ENDIF - - ;; replace . with _ - z INSTR 1,x, - IF z EQ 0 - w TEXTEQU x - x CATSTR x,<.0> ;; prevent error message - ELSE - w CATSTR @SubStr(%x,1,z-1),<_>,@SubStr(%x,z+1,) - ENDIF - - ;; replace - with _ - zz INSTR 1,w, - IF zz EQ 0 - ww TEXTEQU w - ELSE - ww CATSTR @SubStr(%w,1,zz-1),<_>,@SubStr(%w,zz+1,) - ENDIF - - ;; figure out global name for constant - z SIZESTR y ;; use last char for size distiction - ww CATSTR <__>,ww,,@SubStr(%y,z,1) - - IF (OPATTR(ww)) EQ 0 ;; not defined - CONST SEGMENT - ww y x - CONST ENDS - ENDIF - EXITM ww -ENDM - diff -Nru glfw-2.6/support/masm/examples/makeit.bat glfw-2.7.2/support/masm/examples/makeit.bat --- glfw-2.6/support/masm/examples/makeit.bat 2004-02-14 20:06:30.000000000 +0000 +++ glfw-2.7.2/support/masm/examples/makeit.bat 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -@ECHO OFF - -REM ********************************************************************** -REM * This is the build script for the GLFW example programs for MASM32. * -REM * * -REM * Unlike the MASM32 recommendations, I like to keep my MASM32 * -REM * installation on one partition, and my GLFW/MASM32 projects on * -REM * another partition, which is why the script begins by finding which * -REM * drive MASM32 is installed on. Thus, all MASM32 related paths (BIN, * -REM * INCLUDE and LIB) are absolute rather than drive relative. * -REM * * -REM * Feel free to use this build file for your own MASM32 projects (it * -REM * is only necessary to make minor changes in the Compile section). * -REM ********************************************************************** - -REM ********************************************************************** -REM * MASM32 is drive sensitive. Figure out where it is installed. * -REM ********************************************************************** -SET masmdrv= -IF EXIST C:\masm32\bin\ml.exe SET masmdrv=C: -IF EXIST D:\masm32\bin\ml.exe SET masmdrv=D: -IF EXIST E:\masm32\bin\ml.exe SET masmdrv=E: -IF EXIST F:\masm32\bin\ml.exe SET masmdrv=F: -IF EXIST G:\masm32\bin\ml.exe SET masmdrv=G: -IF EXIST H:\masm32\bin\ml.exe SET masmdrv=H: -IF NOT "%masmdrv%" == "" GOTO Compile - - -REM ********************************************************************** -REM * Could not find MASM32 installation * -REM ********************************************************************** - -ECHO ERROR: Could not find MASM32 installation - Aborting. -GOTO Exit - - -REM ********************************************************************** -REM * Compile programs * -REM ********************************************************************** -:Compile - -REM *** ASSEMBLER AND LINKER FLAGS (for all examples) *** -SET aflags=/nologo /c /coff /I%masmdrv%\masm32\include -SET lflags=/NOLOGO /SUBSYSTEM:WINDOWS /LIBPATH:%masmdrv%\masm32\lib - -REM *** TRIANGLE *** -SET prgname=triangle -%masmdrv%\masm32\bin\ml %aflags% %prgname%.asm -%masmdrv%\masm32\bin\link %lflags% %prgname%.obj /OUT:%prgname%.exe - - -REM ********************************************************************** -REM * Remove internal working variables * -REM ********************************************************************** -:Done - -SET masmdrv= -SET aflags= -SET lflags= -SET prgname= - - -REM ********************************************************************** -REM * End of batch file * -REM ********************************************************************** -:Exit diff -Nru glfw-2.6/support/masm/examples/triangle.asm glfw-2.7.2/support/masm/examples/triangle.asm --- glfw-2.6/support/masm/examples/triangle.asm 2004-02-14 20:06:30.000000000 +0000 +++ glfw-2.7.2/support/masm/examples/triangle.asm 1970-01-01 00:00:00.000000000 +0000 @@ -1,232 +0,0 @@ -;========================================================================= -; This is a small test application for GLFW. -; The program opens a window (640x480), and renders a spinning colored -; triangle (it is controlled with both the GLFW timer and the mouse). It -; also calculates the rendering speed (FPS), which is displayed in the -; window title bar. -; -; This program was converted from C to x86 assembler by Toni Jovanoski. -;========================================================================= - -.686 -.MODEL FLAT, STDCALL -OPTION CASEMAP:NONE - - -;######################################################################### -;# INCLUDES # -;######################################################################### - -; Standard Windows includes -INCLUDE windows.inc -INCLUDE kernel32.inc -INCLUDE masm32.inc - -; OpenGL includes -INCLUDE opengl32.inc -INCLUDE glu32.inc -INCLUDE glfw.inc - -; Macros -INCLUDE fpc.mac ; floating point constant macro - - -;######################################################################### -;# INCLUDE LIBS # -;######################################################################### - -; Standard Windows libs -INCLUDELIB kernel32.lib -INCLUDELIB masm32.lib - -; OpenGL libs -INCLUDELIB opengl32.lib -INCLUDELIB glu32.lib -INCLUDELIB glfwdll.lib - - -;######################################################################### -;# INIT DATA # -;######################################################################### - -.DATA - - -;######################################################################### -;# UNINIT DATA # -;######################################################################### - -.DATA? - -ALIGN 8 - -t REAL8 ? -t0 REAL8 ? -fps REAL8 ? -ratio REAL8 ? - -temp REAL4 ? - -windowwidth DWORD ? -windowheight DWORD ? -cursorx DWORD ? -cursory DWORD ? -frames DWORD ? - -windowtitle BYTE 64 DUP (?) - - -;######################################################################### -;# CODE # -;######################################################################### - -.CODE - -start: - - push ebx - - ;We init GLFW - INVOKE glfwInit - - ;We open window - INVOKE glfwOpenWindow, 640, 480, 0, 0, 0, 0, 0, 0, GLFW_WINDOW - - ;If there is a problem with opening window, get out - .IF (!eax) - INVOKE glfwTerminate - INVOKE ExitProcess, NULL - .ENDIF - - ;Enabling sticky keys - INVOKE glfwEnable, GLFW_STICKY_KEYS - - ;we don't want vsync on - INVOKE glfwSwapInterval, 0 - - ;in frames we keep how much frames are rendered - and frames, 0 - - ;get a first "reference" time - INVOKE glfwGetTime - fstp t0 - - ;repeat until ESC is pressed or window is closed - .REPEAT - - - INVOKE glfwGetTime - fst t ;don't pop we gonna use him again - - ;we find how much time had been elapsed - fsub t0 ;st(0)=t-t0 - fld1 ;1, t-t0 - - ;we test if elapsed time is above or below 1 second - fcomip st(0), st(1) ;compare 1 with t-t0 (PPro upward instruction!!!) - - ja @F - - ;if elapsed time is above 1 second calculate fps - fild frames ;frames, t-t0 - fdivrp st(1), st(0) ;frames/t-t0 - fstp fps ;calculate fps - - ;convert to string - INVOKE FloatToStr, fps, ADDR windowtitle ;float to string - INVOKE glfwSetWindowTitle, ADDR windowtitle - - ;update t0, or t is now new "reference" time and reset frames - mov eax, DWORD PTR [t] ;using integer move instead FPU move - mov ecx, DWORD PTR [t+4] - mov DWORD PTR [t0], eax - mov DWORD PTR [t0+4], ecx - and frames, 0 ;reset frames - - @@: - - fstp st(0) ;free st(0) because st(0)=t-t0 - inc frames - - ;we need mouse position for rotating - INVOKE glfwGetMousePos, ADDR cursorx, ADDR cursory - - ;we need size of window to setup the viewport and perspective - INVOKE glfwGetWindowSize, ADDR windowwidth, ADDR windowheight - - .IF (windowheight==0) - mov windowheight, 1 ;avoid divide with zero - .ENDIF - - ;setting viewport - INVOKE glViewport, 0, 0, windowwidth, windowheight - - ;clearing color for framebuffer, pure black - INVOKE glClearColor, fpc(0), fpc(0), fpc(0), fpc(0) - - ;clear framebuffer - INVOKE glClear, GL_COLOR_BUFFER_BIT - - ;setting up perspective, first we "reset" projection matrix and - ;then we set the perspective - INVOKE glMatrixMode, GL_PROJECTION - INVOKE glLoadIdentity - - ;calculate ratio (ratio = windowwidth / windowheight) - fild windowwidth - fild windowheight - fdivp st(1), st(0) - fstp ratio - - ;FOV=65, znear=1, zfar=100 - INVOKE gluPerspective, fpc(REAL8 65), ratio, fpc(REAL8 1), fpc(REAL8 100) - - ;we "reset" the modelview matrix and we place the camera - INVOKE glMatrixMode, GL_MODELVIEW - INVOKE glLoadIdentity - - INVOKE gluLookAt, fpc(REAL8 0), fpc(REAL8 1), fpc(REAL8 0),\ ;set camera - fpc(REAL8 0), fpc(REAL8 20), fpc(REAL8 0),\ - fpc(REAL8 0), fpc(REAL8 0), fpc(REAL8 1) - - INVOKE glTranslatef, fpc(0), fpc(14), fpc(0) - - ;calculate the angle of rotation - fild cursorx - fmul fpc(0.3) ;0.3*x - fld t ;t, 0.3*x - fmul fpc(100) ;100*t, 0.3*x - faddp st(1), st(0) ;100*t+0.3*x - fstp temp - - INVOKE glRotatef, temp, fpc(0), fpc(0), fpc(1) - - ;draw a triagle - INVOKE glBegin, GL_TRIANGLES - INVOKE glColor3f, fpc(1), fpc(0), fpc(0) - INVOKE glVertex3f, fpc(-5), fpc(0), fpc(-4) - INVOKE glColor3f, fpc(0), fpc(1), fpc(0) - INVOKE glVertex3f, fpc(5), fpc(0), fpc(-4) - INVOKE glColor3f, fpc(0), fpc(0), fpc(1) - INVOKE glVertex3f, fpc(0), fpc(0), fpc(6) - INVOKE glEnd - - ;swap buffers - INVOKE glfwSwapBuffers - - ;get state of ESC key - INVOKE glfwGetKey, GLFW_KEY_ESC - mov ebx, eax - - ;get state of window (opened or closed) - INVOKE glfwGetWindowParam, GLFW_OPENED - - .UNTIL (ebx) || (!eax) ;if is pressed ESC or window is closed get out - - INVOKE glfwTerminate - - pop ebx - - INVOKE ExitProcess, NULL - -END start diff -Nru glfw-2.6/support/masm/include/glfw.inc glfw-2.7.2/support/masm/include/glfw.inc --- glfw-2.6/support/masm/include/glfw.inc 2007-05-25 09:56:38.000000000 +0000 +++ glfw-2.7.2/support/masm/include/glfw.inc 1970-01-01 00:00:00.000000000 +0000 @@ -1,326 +0,0 @@ -;======================================================================== -; GLFW - An OpenGL framework -; File: glfw.inc -; Platform: MASM/Windows -; API version: 2.5 -; WWW: http://glfw.sourceforge.net -;------------------------------------------------------------------------ -; Copyright (c) 2002-2005 Camilla Berglund -; -; 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. -; -;======================================================================== - -;######################################################################### -;# GLFW VERSION # -;######################################################################### - -GLFW_VERSION_MAJOR equ 2 -GLFW_VERSION_MINOR equ 5 -GLFW_VERSION_REVISION equ 0 - - -;######################################################################### -;# INPUT HANDLING EQUATES # -;######################################################################### - -; Key and button state/action definitions -GLFW_RELEASE equ 0 -GLFW_PRESS equ 1 - -; Keyboard key definitions: 8-bit ISO-8859-1 (Latin 1) encoding is used -; for printable keys (such as A-Z, 0-9 etc), and values above 256 -; represent special (non-printable) keys (e.g. F1, Page Up etc). -GLFW_KEY_UNKNOWN equ -1 -GLFW_KEY_SPACE equ 32 -GLFW_KEY_SPECIAL equ 256 -GLFW_KEY_ESC equ (GLFW_KEY_SPECIAL+1) -GLFW_KEY_F1 equ (GLFW_KEY_SPECIAL+2) -GLFW_KEY_F2 equ (GLFW_KEY_SPECIAL+3) -GLFW_KEY_F3 equ (GLFW_KEY_SPECIAL+4) -GLFW_KEY_F4 equ (GLFW_KEY_SPECIAL+5) -GLFW_KEY_F5 equ (GLFW_KEY_SPECIAL+6) -GLFW_KEY_F6 equ (GLFW_KEY_SPECIAL+7) -GLFW_KEY_F7 equ (GLFW_KEY_SPECIAL+8) -GLFW_KEY_F8 equ (GLFW_KEY_SPECIAL+9) -GLFW_KEY_F9 equ (GLFW_KEY_SPECIAL+10) -GLFW_KEY_F10 equ (GLFW_KEY_SPECIAL+11) -GLFW_KEY_F11 equ (GLFW_KEY_SPECIAL+12) -GLFW_KEY_F12 equ (GLFW_KEY_SPECIAL+13) -GLFW_KEY_F13 equ (GLFW_KEY_SPECIAL+14) -GLFW_KEY_F14 equ (GLFW_KEY_SPECIAL+15) -GLFW_KEY_F15 equ (GLFW_KEY_SPECIAL+16) -GLFW_KEY_F16 equ (GLFW_KEY_SPECIAL+17) -GLFW_KEY_F17 equ (GLFW_KEY_SPECIAL+18) -GLFW_KEY_F18 equ (GLFW_KEY_SPECIAL+19) -GLFW_KEY_F19 equ (GLFW_KEY_SPECIAL+20) -GLFW_KEY_F20 equ (GLFW_KEY_SPECIAL+21) -GLFW_KEY_F21 equ (GLFW_KEY_SPECIAL+22) -GLFW_KEY_F22 equ (GLFW_KEY_SPECIAL+23) -GLFW_KEY_F23 equ (GLFW_KEY_SPECIAL+24) -GLFW_KEY_F24 equ (GLFW_KEY_SPECIAL+25) -GLFW_KEY_F25 equ (GLFW_KEY_SPECIAL+26) -GLFW_KEY_UP equ (GLFW_KEY_SPECIAL+27) -GLFW_KEY_DOWN equ (GLFW_KEY_SPECIAL+28) -GLFW_KEY_LEFT equ (GLFW_KEY_SPECIAL+29) -GLFW_KEY_RIGHT equ (GLFW_KEY_SPECIAL+30) -GLFW_KEY_LSHIFT equ (GLFW_KEY_SPECIAL+31) -GLFW_KEY_RSHIFT equ (GLFW_KEY_SPECIAL+32) -GLFW_KEY_LCTRL equ (GLFW_KEY_SPECIAL+33) -GLFW_KEY_RCTRL equ (GLFW_KEY_SPECIAL+34) -GLFW_KEY_LALT equ (GLFW_KEY_SPECIAL+35) -GLFW_KEY_RALT equ (GLFW_KEY_SPECIAL+36) -GLFW_KEY_TAB equ (GLFW_KEY_SPECIAL+37) -GLFW_KEY_ENTER equ (GLFW_KEY_SPECIAL+38) -GLFW_KEY_BACKSPACE equ (GLFW_KEY_SPECIAL+39) -GLFW_KEY_INSERT equ (GLFW_KEY_SPECIAL+40) -GLFW_KEY_DEL equ (GLFW_KEY_SPECIAL+41) -GLFW_KEY_PAGEUP equ (GLFW_KEY_SPECIAL+42) -GLFW_KEY_PAGEDOWN equ (GLFW_KEY_SPECIAL+43) -GLFW_KEY_HOME equ (GLFW_KEY_SPECIAL+44) -GLFW_KEY_END equ (GLFW_KEY_SPECIAL+45) -GLFW_KEY_KP_0 equ (GLFW_KEY_SPECIAL+46) -GLFW_KEY_KP_1 equ (GLFW_KEY_SPECIAL+47) -GLFW_KEY_KP_2 equ (GLFW_KEY_SPECIAL+48) -GLFW_KEY_KP_3 equ (GLFW_KEY_SPECIAL+49) -GLFW_KEY_KP_4 equ (GLFW_KEY_SPECIAL+50) -GLFW_KEY_KP_5 equ (GLFW_KEY_SPECIAL+51) -GLFW_KEY_KP_6 equ (GLFW_KEY_SPECIAL+52) -GLFW_KEY_KP_7 equ (GLFW_KEY_SPECIAL+53) -GLFW_KEY_KP_8 equ (GLFW_KEY_SPECIAL+54) -GLFW_KEY_KP_9 equ (GLFW_KEY_SPECIAL+55) -GLFW_KEY_KP_DIVIDE equ (GLFW_KEY_SPECIAL+56) -GLFW_KEY_KP_MULTIPLY equ (GLFW_KEY_SPECIAL+57) -GLFW_KEY_KP_SUBTRACT equ (GLFW_KEY_SPECIAL+58) -GLFW_KEY_KP_ADD equ (GLFW_KEY_SPECIAL+59) -GLFW_KEY_KP_DECIMAL equ (GLFW_KEY_SPECIAL+60) -GLFW_KEY_KP_EQUAL equ (GLFW_KEY_SPECIAL+61) -GLFW_KEY_KP_ENTER equ (GLFW_KEY_SPECIAL+62) -GLFW_KEY_LAST equ GLFW_KEY_KP_ENTER - -; Mouse button definitions -GLFW_MOUSE_BUTTON_1 equ 0 -GLFW_MOUSE_BUTTON_2 equ 1 -GLFW_MOUSE_BUTTON_3 equ 2 -GLFW_MOUSE_BUTTON_4 equ 3 -GLFW_MOUSE_BUTTON_5 equ 4 -GLFW_MOUSE_BUTTON_6 equ 5 -GLFW_MOUSE_BUTTON_7 equ 6 -GLFW_MOUSE_BUTTON_8 equ 7 -GLFW_MOUSE_BUTTON_LAST equ GLFW_MOUSE_BUTTON_8 - -; Mouse button aliases -GLFW_MOUSE_BUTTON_LEFT equ GLFW_MOUSE_BUTTON_1 -GLFW_MOUSE_BUTTON_RIGHT equ GLFW_MOUSE_BUTTON_2 -GLFW_MOUSE_BUTTON_MIDDLE equ GLFW_MOUSE_BUTTON_3 - -; Joystick identifiers -GLFW_JOYSTICK_1 equ 0 -GLFW_JOYSTICK_2 equ 1 -GLFW_JOYSTICK_3 equ 2 -GLFW_JOYSTICK_4 equ 3 -GLFW_JOYSTICK_5 equ 4 -GLFW_JOYSTICK_6 equ 5 -GLFW_JOYSTICK_7 equ 6 -GLFW_JOYSTICK_8 equ 7 -GLFW_JOYSTICK_9 equ 8 -GLFW_JOYSTICK_10 equ 9 -GLFW_JOYSTICK_11 equ 10 -GLFW_JOYSTICK_12 equ 11 -GLFW_JOYSTICK_13 equ 12 -GLFW_JOYSTICK_14 equ 13 -GLFW_JOYSTICK_15 equ 14 -GLFW_JOYSTICK_16 equ 15 -GLFW_JOYSTICK_LAST equ GLFW_JOYSTICK_16 - - -;######################################################################### -;# OTHER EQUATES # -;######################################################################### - -; glfwOpenWindow modes -GLFW_WINDOW equ 00010001h -GLFW_FULLSCREEN equ 00010002h - -; glfwGetWindowParam tokens -GLFW_OPENED equ 00020001h -GLFW_ACTIVE equ 00020002h -GLFW_ICONIFIED equ 00020003h -GLFW_ACCELERATED equ 00020004h -GLFW_RED_BITS equ 00020005h -GLFW_GREEN_BITS equ 00020006h -GLFW_BLUE_BITS equ 00020007h -GLFW_ALPHA_BITS equ 00020008h -GLFW_DEPTH_BITS equ 00020009h -GLFW_STENCIL_BITS equ 0002000Ah - -; The following constants are used for both glfwGetWindowParam -; and glfwOpenWindowHint -GLFW_REFRESH_RATE equ 0002000Bh -GLFW_ACCUM_RED_BITS equ 0002000Ch -GLFW_ACCUM_GREEN_BITS equ 0002000Dh -GLFW_ACCUM_BLUE_BITS equ 0002000Eh -GLFW_ACCUM_ALPHA_BITS equ 0002000Fh -GLFW_AUX_BUFFERS equ 00020010h -GLFW_STEREO equ 00020011h - -; glfwEnable/glfwDisable tokens -GLFW_MOUSE_CURSOR equ 00030001h -GLFW_STICKY_KEYS equ 00030002h -GLFW_STICKY_MOUSE_BUTTONS equ 00030003h -GLFW_SYSTEM_KEYS equ 00030004h -GLFW_KEY_REPEAT equ 00030005h -GLFW_AUTO_POLL_EVENTS equ 00030006h - -; glfwWaitThread wait modes -GLFW_WAIT equ 00040001h -GLFW_NOWAIT equ 00040002h - -; glfwGetJoystickParam tokens -GLFW_PRESENT equ 00050001h -GLFW_AXES equ 00050002h -GLFW_BUTTONS equ 00050003h - -; glfwReadImage/glfwLoadTexture2D flags -GLFW_NO_RESCALE_BIT equ 00000001h ; Only for glfwReadImage -GLFW_ORIGIN_UL_BIT equ 00000002h -GLFW_BUILD_MIPMAPS_BIT equ 00000004h ; Only for glfwLoadTexture2D -GLFW_ALPHA_MAP_BIT equ 00000008h - -; Time spans longer than this (seconds) are considered to be infinity -GLFW_INFINITY equ 100000.0 - - -;######################################################################### -;# TYPEDEFS # -;######################################################################### - -; The video mode structure used by glfwGetVideoModes() -GLFWvidmode STRUCT - _Width DWORD ? - Height DWORD ? - RedBits DWORD ? - GreenBits DWORD ? - BlueBits DWORD ? -GLFWvidmode ENDS - -; Image/texture information -GLFWimage STRUCT - _Width DWORD ? - Height DWORD ? - Format DWORD ? - BytesPerPixel DWORD ? - Data DWORD ? -GLFWimage ENDS - -; Thread ID -GLFWThread TYPEDEF DWORD - -; Mutex object -GLFWMutex TYPEDEF DWORD - -; Condition variable object -GLFWCond TYPEDEF DWORD - - -;######################################################################### -;# PROTOTYPES # -;######################################################################### - -; GLFW initialization, termination and version querying -glfwInit PROTO STDCALL -glfwTerminate PROTO STDCALL -glfwGetVersion PROTO STDCALL :DWORD, :DWORD, :DWORD - -; Window handling -glfwOpenWindow PROTO STDCALL :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD -glfwOpenWindowHint PROTO STDCALL :DWORD, :DWORD -glfwCloseWindow PROTO STDCALL -glfwSetWindowTitle PROTO STDCALL :DWORD -glfwGetWindowSize PROTO STDCALL :DWORD, :DWORD -glfwSetWindowSize PROTO STDCALL :DWORD, :DWORD -glfwSetWindowPos PROTO STDCALL :DWORD, :DWORD -glfwIconifyWindow PROTO STDCALL -glfwRestoreWindow PROTO STDCALL -glfwSwapBuffers PROTO STDCALL -glfwSwapInterval PROTO STDCALL :DWORD -glfwGetWindowParam PROTO STDCALL :DWORD -glfwSetWindowSizeCallback PROTO STDCALL :DWORD -glfwSetWindowCloseCallback PROTO STDCALL :DWORD -glfwSetWindowRefreshCallback PROTO STDCALL :DWORD - -; Video mode functions -glfwGetVideoModes PROTO STDCALL :DWORD, :DWORD -glfwGetDesktopMode PROTO STDCALL :DWORD - -; Input handling -glfwPollEvents PROTO STDCALL -glfwWaitEvents PROTO STDCALL -glfwGetKey PROTO STDCALL :DWORD -glfwGetMouseButton PROTO STDCALL :DWORD -glfwGetMousePos PROTO STDCALL :DWORD, :DWORD -glfwSetMousePos PROTO STDCALL :DWORD, :DWORD -glfwGetMouseWheel PROTO STDCALL -glfwSetMouseWheel PROTO STDCALL :DWORD -glfwSetKeyCallback PROTO STDCALL :DWORD -glfwSetCharCallback PROTO STDCALL :DWORD -glfwSetMouseButtonCallback PROTO STDCALL :DWORD -glfwSetMousePosCallback PROTO STDCALL :DWORD -glfwSetMouseWheelCallback PROTO STDCALL :DWORD - -; Joystick input -glfwGetJoystickParam PROTO STDCALL :DWORD, :DWORD -glfwGetJoystickPos PROTO STDCALL :DWORD, :DWORD, :DWORD -glfwGetJoystickButtons PROTO STDCALL :DWORD, :DWORD, :DWORD - -; Time -glfwGetTime PROTO STDCALL -glfwSetTime PROTO STDCALL :QWORD -glfwSleep PROTO STDCALL :QWORD - -; Extension support -glfwExtensionSupported PROTO STDCALL :DWORD -glfwGetProcAddress PROTO STDCALL :DWORD -glfwGetGLVersion PROTO STDCALL :DWORD, :DWORD, :DWORD - -; Threading support -glfwCreateThread PROTO STDCALL :DWORD, :DWORD -glfwDestroyThread PROTO STDCALL :DWORD -glfwWaitThread PROTO STDCALL :DWORD, :DWORD -glfwGetThreadID PROTO STDCALL -glfwCreateMutex PROTO STDCALL -glfwDestroyMutex PROTO STDCALL :DWORD -glfwLockMutex PROTO STDCALL :DWORD -glfwUnlockMutex PROTO STDCALL :DWORD -glfwCreateCond PROTO STDCALL -glfwDestroyCond PROTO STDCALL :DWORD -glfwWaitCond PROTO STDCALL :DWORD, :DWORD, :QWORD -glfwSignalCond PROTO STDCALL :DWORD -glfwBroadcastCond PROTO STDCALL :DWORD -glfwGetNumberOfProcessors PROTO STDCALL - -; Enable/disable functions -glfwEnable PROTO STDCALL :DWORD -glfwDisable PROTO STDCALL :DWORD - -; Image/texture I/O support -glfwReadImage PROTO STDCALL :DWORD, :DWORD, :DWORD -glfwFreeImage PROTO STDCALL :DWORD -glfwLoadTexture2D PROTO STDCALL :DWORD, :DWORD diff -Nru glfw-2.6/support/masm/include/glu32.inc glfw-2.7.2/support/masm/include/glu32.inc --- glfw-2.6/support/masm/include/glu32.inc 2004-02-14 20:08:12.000000000 +0000 +++ glfw-2.7.2/support/masm/include/glu32.inc 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ -; ..\LIB\GLU32.LIB PROTOTYPES -; ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -gluBeginCurve PROTO :DWORD -gluBeginPolygon PROTO :DWORD -gluBeginSurface PROTO :DWORD -gluBeginTrim PROTO :DWORD -gluBuild1DMipmaps PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -gluBuild2DMipmaps PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -gluCylinder PROTO :DWORD,:QWORD,:QWORD,:QWORD,:DWORD,:DWORD -gluDeleteNurbsRenderer PROTO :DWORD -gluDeleteQuadric PROTO :DWORD -gluDeleteTess PROTO :DWORD -gluDisk PROTO :DWORD,:QWORD,:QWORD,:DWORD,:DWORD -gluEndCurve PROTO :DWORD -gluEndPolygon PROTO :DWORD -gluEndSurface PROTO :DWORD -gluEndTrim PROTO :DWORD -gluErrorString PROTO :DWORD -gluErrorUnicodeStringEXT PROTO :DWORD -gluGetNurbsProperty PROTO :DWORD,:DWORD,:DWORD -gluGetString PROTO :DWORD -gluGetTessProperty PROTO :DWORD,:DWORD,:DWORD -gluLoadSamplingMatrices PROTO :DWORD,:DWORD,:DWORD,:DWORD -gluLookAt PROTO :QWORD,:QWORD,:QWORD,:QWORD,:QWORD,:QWORD,:QWORD,:QWORD,:QWORD -gluNewNurbsRenderer PROTO -gluNewQuadric PROTO -gluNewTess PROTO -gluNextContour PROTO :DWORD,:DWORD -gluNurbsCallback PROTO :DWORD,:DWORD,:DWORD -gluNurbsCurve PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -gluNurbsProperty PROTO :DWORD,:DWORD,:DWORD -gluNurbsSurface PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -gluOrtho2D PROTO :QWORD,:QWORD,:QWORD,:QWORD -gluPartialDisk PROTO :DWORD,:QWORD,:QWORD,:DWORD,:DWORD,:QWORD,:QWORD -gluPerspective PROTO :QWORD,:QWORD,:QWORD,:QWORD -gluPickMatrix PROTO :QWORD,:QWORD,:QWORD,:QWORD,:DWORD -gluProject PROTO :QWORD,:QWORD,:QWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -gluPwlCurve PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD -gluQuadricCallback PROTO :DWORD,:DWORD,:DWORD -gluQuadricDrawStyle PROTO :DWORD,:DWORD -gluQuadricNormals PROTO :DWORD,:DWORD -gluQuadricOrientation PROTO :DWORD,:DWORD -gluQuadricTexture PROTO :DWORD,:DWORD -gluScaleImage PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -gluSphere PROTO :DWORD,:QWORD,:DWORD,:DWORD -gluTessBeginContour PROTO :DWORD -gluTessBeginPolygon PROTO :DWORD,:DWORD -gluTessCallback PROTO :DWORD,:DWORD,:DWORD -gluTessEndContour PROTO :DWORD -gluTessEndPolygon PROTO :DWORD -gluTessNormal PROTO :DWORD,:QWORD,:QWORD,:QWORD -gluTessProperty PROTO :DWORD,:DWORD,:QWORD -gluTessVertex PROTO :DWORD,:DWORD,:DWORD -gluUnProject PROTO :QWORD,:QWORD,:QWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD diff -Nru glfw-2.6/support/masm/include/opengl32.inc glfw-2.7.2/support/masm/include/opengl32.inc --- glfw-2.6/support/masm/include/opengl32.inc 2004-02-14 20:08:12.000000000 +0000 +++ glfw-2.7.2/support/masm/include/opengl32.inc 1970-01-01 00:00:00.000000000 +0000 @@ -1,372 +0,0 @@ -; ..\LIB\OPENGL32.LIB PROTOTYPES -; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -DllInitialize PROTO :DWORD,:DWORD,:DWORD -GlmfBeginGlsBlock PROTO :DWORD -GlmfCloseMetaFile PROTO :DWORD -GlmfEndGlsBlock PROTO :DWORD -GlmfEndPlayback PROTO :DWORD -GlmfInitPlayback PROTO :DWORD,:DWORD,:DWORD -GlmfPlayGlsRecord PROTO :DWORD,:DWORD,:DWORD,:DWORD -glAccum PROTO :DWORD,:DWORD -glAlphaFunc PROTO :DWORD,:DWORD -glAreTexturesResident PROTO :DWORD,:DWORD,:DWORD -glArrayElement PROTO :DWORD -glBegin PROTO :DWORD -glBindTexture PROTO :DWORD,:DWORD -glBitmap PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -glBlendFunc PROTO :DWORD,:DWORD -glCallList PROTO :DWORD -glCallLists PROTO :DWORD,:DWORD,:DWORD -glClear PROTO :DWORD -glClearAccum PROTO :DWORD,:DWORD,:DWORD,:DWORD -glClearColor PROTO :DWORD,:DWORD,:DWORD,:DWORD -glClearDepth PROTO :QWORD -glClearIndex PROTO :DWORD -glClearStencil PROTO :DWORD -glClipPlane PROTO :DWORD,:DWORD -glColor3b PROTO :DWORD,:DWORD,:DWORD -glColor3bv PROTO :DWORD -glColor3d PROTO :QWORD,:QWORD,:QWORD -glColor3dv PROTO :DWORD -glColor3f PROTO :DWORD,:DWORD,:DWORD -glColor3fv PROTO :DWORD -glColor3i PROTO :DWORD,:DWORD,:DWORD -glColor3iv PROTO :DWORD -glColor3s PROTO :DWORD,:DWORD,:DWORD -glColor3sv PROTO :DWORD -glColor3ub PROTO :DWORD,:DWORD,:DWORD -glColor3ubv PROTO :DWORD -glColor3ui PROTO :DWORD,:DWORD,:DWORD -glColor3uiv PROTO :DWORD -glColor3us PROTO :DWORD,:DWORD,:DWORD -glColor3usv PROTO :DWORD -glColor4b PROTO :DWORD,:DWORD,:DWORD,:DWORD -glColor4bv PROTO :DWORD -glColor4d PROTO :QWORD,:QWORD,:QWORD,:QWORD -glColor4dv PROTO :DWORD -glColor4f PROTO :DWORD,:DWORD,:DWORD,:DWORD -glColor4fv PROTO :DWORD -glColor4i PROTO :DWORD,:DWORD,:DWORD,:DWORD -glColor4iv PROTO :DWORD -glColor4s PROTO :DWORD,:DWORD,:DWORD,:DWORD -glColor4sv PROTO :DWORD -glColor4ub PROTO :DWORD,:DWORD,:DWORD,:DWORD -glColor4ubv PROTO :DWORD -glColor4ui PROTO :DWORD,:DWORD,:DWORD,:DWORD -glColor4uiv PROTO :DWORD -glColor4us PROTO :DWORD,:DWORD,:DWORD,:DWORD -glColor4usv PROTO :DWORD -glColorMask PROTO :DWORD,:DWORD,:DWORD,:DWORD -glColorMaterial PROTO :DWORD,:DWORD -glColorPointer PROTO :DWORD,:DWORD,:DWORD,:DWORD -glCopyPixels PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD -glCopyTexImage1D PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -glCopyTexImage2D PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -glCopyTexSubImage1D PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -glCopyTexSubImage2D PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -glCullFace PROTO :DWORD -glDebugEntry PROTO :DWORD,:DWORD -glDeleteLists PROTO :DWORD,:DWORD -glDeleteTextures PROTO :DWORD,:DWORD -glDepthFunc PROTO :DWORD -glDepthMask PROTO :DWORD -glDepthRange PROTO :QWORD,:QWORD -glDisable PROTO :DWORD -glDisableClientState PROTO :DWORD -glDrawArrays PROTO :DWORD,:DWORD,:DWORD -glDrawBuffer PROTO :DWORD -glDrawElements PROTO :DWORD,:DWORD,:DWORD,:DWORD -glDrawPixels PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD -glEdgeFlag PROTO :DWORD -glEdgeFlagPointer PROTO :DWORD,:DWORD -glEdgeFlagv PROTO :DWORD -glEnable PROTO :DWORD -glEnableClientState PROTO :DWORD -glEnd PROTO -glEndList PROTO -glEvalCoord1d PROTO :QWORD -glEvalCoord1dv PROTO :DWORD -glEvalCoord1f PROTO :DWORD -glEvalCoord1fv PROTO :DWORD -glEvalCoord2d PROTO :QWORD,:QWORD -glEvalCoord2dv PROTO :DWORD -glEvalCoord2f PROTO :DWORD,:DWORD -glEvalCoord2fv PROTO :DWORD -glEvalMesh1 PROTO :DWORD,:DWORD,:DWORD -glEvalMesh2 PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD -glEvalPoint1 PROTO :DWORD -glEvalPoint2 PROTO :DWORD,:DWORD -glFeedbackBuffer PROTO :DWORD,:DWORD,:DWORD -glFinish PROTO -glFlush PROTO -glFogf PROTO :DWORD,:DWORD -glFogfv PROTO :DWORD,:DWORD -glFogi PROTO :DWORD,:DWORD -glFogiv PROTO :DWORD,:DWORD -glFrontFace PROTO :DWORD -glFrustum PROTO :QWORD,:QWORD,:QWORD,:QWORD,:QWORD,:QWORD -glGenLists PROTO :DWORD -glGenTextures PROTO :DWORD,:DWORD -glGetBooleanv PROTO :DWORD,:DWORD -glGetClipPlane PROTO :DWORD,:DWORD -glGetDoublev PROTO :DWORD,:DWORD -glGetError PROTO -glGetFloatv PROTO :DWORD,:DWORD -glGetIntegerv PROTO :DWORD,:DWORD -glGetLightfv PROTO :DWORD,:DWORD,:DWORD -glGetLightiv PROTO :DWORD,:DWORD,:DWORD -glGetMapdv PROTO :DWORD,:DWORD,:DWORD -glGetMapfv PROTO :DWORD,:DWORD,:DWORD -glGetMapiv PROTO :DWORD,:DWORD,:DWORD -glGetMaterialfv PROTO :DWORD,:DWORD,:DWORD -glGetMaterialiv PROTO :DWORD,:DWORD,:DWORD -glGetPixelMapfv PROTO :DWORD,:DWORD -glGetPixelMapuiv PROTO :DWORD,:DWORD -glGetPixelMapusv PROTO :DWORD,:DWORD -glGetPointerv PROTO :DWORD,:DWORD -glGetPolygonStipple PROTO :DWORD -glGetString PROTO :DWORD -glGetTexEnvfv PROTO :DWORD,:DWORD,:DWORD -glGetTexEnviv PROTO :DWORD,:DWORD,:DWORD -glGetTexGendv PROTO :DWORD,:DWORD,:DWORD -glGetTexGenfv PROTO :DWORD,:DWORD,:DWORD -glGetTexGeniv PROTO :DWORD,:DWORD,:DWORD -glGetTexImage PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD -glGetTexLevelParameterfv PROTO :DWORD,:DWORD,:DWORD,:DWORD -glGetTexLevelParameteriv PROTO :DWORD,:DWORD,:DWORD,:DWORD -glGetTexParameterfv PROTO :DWORD,:DWORD,:DWORD -glGetTexParameteriv PROTO :DWORD,:DWORD,:DWORD -glHint PROTO :DWORD,:DWORD -glIndexMask PROTO :DWORD -glIndexPointer PROTO :DWORD,:DWORD,:DWORD -glIndexd PROTO :QWORD -glIndexdv PROTO :DWORD -glIndexf PROTO :DWORD -glIndexfv PROTO :DWORD -glIndexi PROTO :DWORD -glIndexiv PROTO :DWORD -glIndexs PROTO :DWORD -glIndexsv PROTO :DWORD -glIndexub PROTO :DWORD -glIndexubv PROTO :DWORD -glInitNames PROTO -glInterleavedArrays PROTO :DWORD,:DWORD,:DWORD -glIsEnabled PROTO :DWORD -glIsList PROTO :DWORD -glIsTexture PROTO :DWORD -glLightModelf PROTO :DWORD,:DWORD -glLightModelfv PROTO :DWORD,:DWORD -glLightModeli PROTO :DWORD,:DWORD -glLightModeliv PROTO :DWORD,:DWORD -glLightf PROTO :DWORD,:DWORD,:DWORD -glLightfv PROTO :DWORD,:DWORD,:DWORD -glLighti PROTO :DWORD,:DWORD,:DWORD -glLightiv PROTO :DWORD,:DWORD,:DWORD -glLineStipple PROTO :DWORD,:DWORD -glLineWidth PROTO :DWORD -glListBase PROTO :DWORD -glLoadIdentity PROTO -glLoadMatrixd PROTO :DWORD -glLoadMatrixf PROTO :DWORD -glLoadName PROTO :DWORD -glLogicOp PROTO :DWORD -glMap1d PROTO :DWORD,:QWORD,:QWORD,:DWORD,:DWORD,:DWORD -glMap1f PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -glMap2d PROTO :DWORD,:QWORD,:QWORD,:DWORD,:DWORD,:QWORD,:QWORD,:DWORD,:DWORD,:DWORD -glMap2f PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -glMapGrid1d PROTO :DWORD,:QWORD,:QWORD -glMapGrid1f PROTO :DWORD,:DWORD,:DWORD -glMapGrid2d PROTO :DWORD,:QWORD,:QWORD,:DWORD,:QWORD,:QWORD -glMapGrid2f PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -glMaterialf PROTO :DWORD,:DWORD,:DWORD -glMaterialfv PROTO :DWORD,:DWORD,:DWORD -glMateriali PROTO :DWORD,:DWORD,:DWORD -glMaterialiv PROTO :DWORD,:DWORD,:DWORD -glMatrixMode PROTO :DWORD -glMultMatrixd PROTO :DWORD -glMultMatrixf PROTO :DWORD -glNewList PROTO :DWORD,:DWORD -glNormal3b PROTO :DWORD,:DWORD,:DWORD -glNormal3bv PROTO :DWORD -glNormal3d PROTO :QWORD,:QWORD,:QWORD -glNormal3dv PROTO :DWORD -glNormal3f PROTO :DWORD,:DWORD,:DWORD -glNormal3fv PROTO :DWORD -glNormal3i PROTO :DWORD,:DWORD,:DWORD -glNormal3iv PROTO :DWORD -glNormal3s PROTO :DWORD,:DWORD,:DWORD -glNormal3sv PROTO :DWORD -glNormalPointer PROTO :DWORD,:DWORD,:DWORD -glOrtho PROTO :QWORD,:QWORD,:QWORD,:QWORD,:QWORD,:QWORD -glPassThrough PROTO :DWORD -glPixelMapfv PROTO :DWORD,:DWORD,:DWORD -glPixelMapuiv PROTO :DWORD,:DWORD,:DWORD -glPixelMapusv PROTO :DWORD,:DWORD,:DWORD -glPixelStoref PROTO :DWORD,:DWORD -glPixelStorei PROTO :DWORD,:DWORD -glPixelTransferf PROTO :DWORD,:DWORD -glPixelTransferi PROTO :DWORD,:DWORD -glPixelZoom PROTO :DWORD,:DWORD -glPointSize PROTO :DWORD -glPolygonMode PROTO :DWORD,:DWORD -glPolygonOffset PROTO :DWORD,:DWORD -glPolygonStipple PROTO :DWORD -glPopAttrib PROTO -glPopClientAttrib PROTO -glPopMatrix PROTO -glPopName PROTO -glPrioritizeTextures PROTO :DWORD,:DWORD,:DWORD -glPushAttrib PROTO :DWORD -glPushClientAttrib PROTO :DWORD -glPushMatrix PROTO -glPushName PROTO :DWORD -glRasterPos2d PROTO :QWORD, :QWORD -glRasterPos2dv PROTO :DWORD -glRasterPos2f PROTO :DWORD,:DWORD -glRasterPos2fv PROTO :DWORD -glRasterPos2i PROTO :DWORD,:DWORD -glRasterPos2iv PROTO :DWORD -glRasterPos2s PROTO :DWORD,:DWORD -glRasterPos2sv PROTO :DWORD -glRasterPos3d PROTO :QWORD,:QWORD,:QWORD -glRasterPos3dv PROTO :DWORD -glRasterPos3f PROTO :DWORD,:DWORD,:DWORD -glRasterPos3fv PROTO :DWORD -glRasterPos3i PROTO :DWORD,:DWORD,:DWORD -glRasterPos3iv PROTO :DWORD -glRasterPos3s PROTO :DWORD,:DWORD,:DWORD -glRasterPos3sv PROTO :DWORD -glRasterPos4d PROTO :QWORD,:QWORD,:QWORD,:QWORD -glRasterPos4dv PROTO :DWORD -glRasterPos4f PROTO :DWORD,:DWORD,:DWORD,:DWORD -glRasterPos4fv PROTO :DWORD -glRasterPos4i PROTO :DWORD,:DWORD,:DWORD,:DWORD -glRasterPos4iv PROTO :DWORD -glRasterPos4s PROTO :DWORD,:DWORD,:DWORD,:DWORD -glRasterPos4sv PROTO :DWORD -glReadBuffer PROTO :DWORD -glReadPixels PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -glRectd PROTO :QWORD,:QWORD,:QWORD,:QWORD -glRectdv PROTO :DWORD,:DWORD -glRectf PROTO :DWORD,:DWORD,:DWORD,:DWORD -glRectfv PROTO :DWORD,:DWORD -glRecti PROTO :DWORD,:DWORD,:DWORD,:DWORD -glRectiv PROTO :DWORD,:DWORD -glRects PROTO :DWORD,:DWORD,:DWORD,:DWORD -glRectsv PROTO :DWORD,:DWORD -glRenderMode PROTO :DWORD -glRotated PROTO :QWORD,:QWORD,:QWORD,:QWORD -glRotatef PROTO :DWORD,:DWORD,:DWORD,:DWORD -glScaled PROTO :QWORD,:QWORD,:QWORD -glScalef PROTO :DWORD,:DWORD,:DWORD -glScissor PROTO :DWORD,:DWORD,:DWORD,:DWORD -glSelectBuffer PROTO :DWORD,:DWORD -glShadeModel PROTO :DWORD -glStencilFunc PROTO :DWORD,:DWORD,:DWORD -glStencilMask PROTO :DWORD -glStencilOp PROTO :DWORD,:DWORD,:DWORD -glTexCoord1d PROTO :QWORD -glTexCoord1dv PROTO :DWORD -glTexCoord1f PROTO :DWORD -glTexCoord1fv PROTO :DWORD -glTexCoord1i PROTO :DWORD -glTexCoord1iv PROTO :DWORD -glTexCoord1s PROTO :DWORD -glTexCoord1sv PROTO :DWORD -glTexCoord2d PROTO :QWORD,:QWORD -glTexCoord2dv PROTO :DWORD -glTexCoord2f PROTO :DWORD,:DWORD -glTexCoord2fv PROTO :DWORD -glTexCoord2i PROTO :DWORD,:DWORD -glTexCoord2iv PROTO :DWORD -glTexCoord2s PROTO :DWORD,:DWORD -glTexCoord2sv PROTO :DWORD -glTexCoord3d PROTO :QWORD,:QWORD,:QWORD -glTexCoord3dv PROTO :DWORD -glTexCoord3f PROTO :DWORD,:DWORD,:DWORD -glTexCoord3fv PROTO :DWORD -glTexCoord3i PROTO :DWORD,:DWORD,:DWORD -glTexCoord3iv PROTO :DWORD -glTexCoord3s PROTO :DWORD,:DWORD,:DWORD -glTexCoord3sv PROTO :DWORD -glTexCoord4d PROTO :QWORD,:QWORD,:QWORD,:QWORD -glTexCoord4dv PROTO :DWORD -glTexCoord4f PROTO :DWORD,:DWORD,:DWORD,:DWORD -glTexCoord4fv PROTO :DWORD -glTexCoord4i PROTO :DWORD,:DWORD,:DWORD,:DWORD -glTexCoord4iv PROTO :DWORD -glTexCoord4s PROTO :DWORD,:DWORD,:DWORD,:DWORD -glTexCoord4sv PROTO :DWORD -glTexCoordPointer PROTO :DWORD,:DWORD,:DWORD,:DWORD -glTexEnvf PROTO :DWORD,:DWORD,:DWORD -glTexEnvfv PROTO :DWORD,:DWORD,:DWORD -glTexEnvi PROTO :DWORD,:DWORD,:DWORD -glTexEnviv PROTO :DWORD,:DWORD,:DWORD -glTexGend PROTO :DWORD,:DWORD,:QWORD -glTexGendv PROTO :DWORD,:DWORD,:DWORD -glTexGenf PROTO :DWORD,:DWORD,:DWORD -glTexGenfv PROTO :DWORD,:DWORD,:DWORD -glTexGeni PROTO :DWORD,:DWORD,:DWORD -glTexGeniv PROTO :DWORD,:DWORD,:DWORD -glTexImage1D PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -glTexImage2D PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -glTexParameterf PROTO :DWORD,:DWORD,:DWORD -glTexParameterfv PROTO :DWORD,:DWORD,:DWORD -glTexParameteri PROTO :DWORD,:DWORD,:DWORD -glTexParameteriv PROTO :DWORD,:DWORD,:DWORD -glTexSubImage1D PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -glTexSubImage2D PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -glTranslated PROTO :QWORD,:QWORD,:QWORD -glTranslatef PROTO :DWORD,:DWORD,:DWORD -glVertex2d PROTO :QWORD,:QWORD -glVertex2dv PROTO :DWORD -glVertex2f PROTO :DWORD,:DWORD -glVertex2fv PROTO :DWORD -glVertex2i PROTO :DWORD,:DWORD -glVertex2iv PROTO :DWORD -glVertex2s PROTO :DWORD,:DWORD -glVertex2sv PROTO :DWORD -glVertex3d PROTO :QWORD,:QWORD,:QWORD -glVertex3dv PROTO :DWORD -glVertex3f PROTO :DWORD,:DWORD,:DWORD -glVertex3fv PROTO :DWORD -glVertex3i PROTO :DWORD,:DWORD,:DWORD -glVertex3iv PROTO :DWORD -glVertex3s PROTO :DWORD,:DWORD,:DWORD -glVertex3sv PROTO :DWORD -glVertex4d PROTO :QWORD,:QWORD,:QWORD,:QWORD -glVertex4dv PROTO :DWORD -glVertex4f PROTO :DWORD,:DWORD,:DWORD,:DWORD -glVertex4fv PROTO :DWORD -glVertex4i PROTO :DWORD,:DWORD,:DWORD,:DWORD -glVertex4iv PROTO :DWORD -glVertex4s PROTO :DWORD,:DWORD,:DWORD,:DWORD -glVertex4sv PROTO :DWORD -glVertexPointer PROTO :DWORD,:DWORD,:DWORD,:DWORD -glViewport PROTO :DWORD,:DWORD,:DWORD,:DWORD -wglChoosePixelFormat PROTO :DWORD,:DWORD -wglCopyContext PROTO :DWORD,:DWORD,:DWORD -wglCreateContext PROTO :DWORD -wglCreateLayerContext PROTO :DWORD,:DWORD -wglDeleteContext PROTO :DWORD -wglDescribeLayerPlane PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD -wglDescribePixelFormat PROTO :DWORD,:DWORD,:DWORD,:DWORD -wglGetCurrentContext PROTO -wglGetCurrentDC PROTO -wglGetDefaultProcAddress PROTO :DWORD -wglGetLayerPaletteEntries PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD -wglGetPixelFormat PROTO :DWORD -wglGetProcAddress PROTO :DWORD -wglMakeCurrent PROTO :DWORD,:DWORD -wglRealizeLayerPalette PROTO :DWORD,:DWORD,:DWORD -wglSetLayerPaletteEntries PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD -wglSetPixelFormat PROTO :DWORD,:DWORD,:DWORD -wglShareLists PROTO :DWORD,:DWORD -wglSwapBuffers PROTO :DWORD -wglSwapLayerBuffers PROTO :DWORD,:DWORD -wglSwapMultipleBuffers PROTO :DWORD,:DWORD -wglUseFontBitmapsA PROTO :DWORD,:DWORD,:DWORD,:DWORD -wglUseFontBitmaps equ -wglUseFontOutlinesA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD -wglUseFontOutlines equ Binary files /tmp/H80o5yShiE/glfw-2.6/support/masm/lib/glfwdll.lib and /tmp/E5T3poEWbQ/glfw-2.7.2/support/masm/lib/glfwdll.lib differ diff -Nru glfw-2.6/support/masm/readme.html glfw-2.7.2/support/masm/readme.html --- glfw-2.6/support/masm/readme.html 2007-05-25 09:56:38.000000000 +0000 +++ glfw-2.7.2/support/masm/readme.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,170 +0,0 @@ - - - - GLFW Readme file for MASM32 - - - - -
    -GLFW v2.5
    -for MASM32 -
    - - -

    -

    -
    - -
      -
    1. Introduction
    2. -
    3. Installing GLFW for MASM32
    4. -
    5. Compiling the example programs
    6. -
    7. Using GLFW from MASM32
    8. -
    9. The author
    10. -
    11. Acknowledgements
    12. -
    -
    -
    -
    - - - -


    - - - -

    1. Introduction

    - -

    This distribution contains MASM32 bindings for the GLFW v2.5.x Windows -DLL, and MASM32 example programs. For further information on how to use -GLFW you should read the GLFW documentation. - -

    For those of you who are unfamiliar with MASM32, it is a free 32-bit -x86 assembler for Windows, with excellent support for win32 API calls etc. -You can download MASM32 from its homepage, www.masm32.com. - -

    I assume that the reader of this document is at least somewhat familiar -with x86 assembly language, and knows how to use MASM32. - - - -


    - - - -

    2. Installing GLFW for MASM32

    - -

    To install GLFW for MASM32, you should copy support\masm\include\glfw.inc -to your MASM32 include directory, and support\masm\lib\glfwdll.lib -to your MASM32 lib directory. - -

    The file support\win32dll\glfw.dll can either be copied to your -Windows system folder (e.g. C:\WINNT\system32\ for Windows NT or -C:\WINDOWS\SYSTEM for Windows 9x/ME), or to your project directory (where -you keep your compiled EXE). - -

    IMPORTANT Since there is a problem with how the MASM32 include -files are generated (64-bit arguments are interpreted as two 32-bit -arguments), it is necessary to replace the opengl32.inc and -glu32.inc files in your MASM32 include directory with the ones -in this distribution (support\masm\include\opengl32.inc and -support\masm\include\glu32.inc). Otherwise you will not be able to -compile the example programs, and programming OpenGL with MASM32 will not -be easy. - - - -


    - - -
    -

    3. Compiling the example programs

    - -

    Assuming that you have installed GLFW as described in section 2, you should be able to compile the example -programs by simply running support\masm\examples\makeit.bat (double -clicking the icon works just fine). - - - - -


    - - - -

    4. Using GLFW from MASM32

    - -

    4.1 General

    - -

    MASM32 has very nice DLL calling support, so using GLFW should be -straight forward. - -

    In your program, you should INCLUDE \masm32\include\glfw.inc and -INCLUDELIB \masm32\lib\glfwdll.lib (paths according to the MASM32 -recommendations). - -

    As you can see in the example programs, they do not specify the full -MASM32 path when including the .inc and .lib files. This is because I keep -my MASM32 installation and my project files on different drives, and I -have solved it with a (more or less) clever batch file -(support\masm\examples\makeit.bat). Feel free to use this batch -file as a template for building your own projects. Otherwise you should -make sure that you specify the correct include and library paths. - - -


    4.2 Calling GLFW functions

    - -

    To call GLFW functions you use the INVOKE macro, which correctly -places the function arguments on the stack, and calls the GLFW function. -The syntax is: INVOKE function[, arg1[, arg2[, -...]]]. For instance, calling glfwOpenWindow could look like -this: - -

      INVOKE glfwOpenWindow, 640, 480, 0, 0, 0, 0, 0, 0, -GLFW_WINDOW - - -


    4.3 Using GLFW callback functions

    - -

    In order to use GLFW callback functions, you have to make sure that -your functions are using the STDCALL calling convention. - - - -


    - - -
    -

    3. The maintainer

    - -

    My name is Camilla Berglund, -elmindreda@users.sourceforge.net. -Please visit our -support forums -if you have any problems with GLFW or any questions concerning GLFW. - -

    The GLFW web site can be found here: -http://glfw.sourceforge.net/. -It contains the latest version of GLFW, news and other information that is -useful for OpenGL development. - - - -


    - - - -

    6. Acknowledgements

    - -

    Many thanks to Toni Jovanoski, whose dedicated work made MASM32 -support possible! He also supplied the modified opengl32.inc and glu32.inc -files. - - -


    - - - - diff -Nru glfw-2.6/support/msvc100/GLFWDLL.vcxproj glfw-2.7.2/support/msvc100/GLFWDLL.vcxproj --- glfw-2.6/support/msvc100/GLFWDLL.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc100/GLFWDLL.vcxproj 2011-06-24 23:01:54.000000000 +0000 @@ -0,0 +1,125 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {BC8E963C-BA35-4A32-B53A-CCD9C83E32FC} + Win32Proj + GLFWDLL + + + + DynamicLibrary + true + MultiByte + false + + + DynamicLibrary + false + false + MultiByte + + + + + + + + + + + + + true + GLFW + + + false + GLFW + + + + NotUsing + Level3 + Disabled + _GLFW_NO_DLOAD_WINMM;_GLFW_NO_DLOAD_GDI32;GLFW_BUILD_DLL;WIN32;_DEBUG;_WINDOWS;_USRDLL;GLFWDLL_EXPORTS;%(PreprocessorDefinitions) + false + $(SolutionDir)\..\..\lib;$(SolutionDir)\..\..\lib\win32;%(AdditionalIncludeDirectories) + false + + + + + Windows + true + $(TargetDir)$(TargetName)DLL.lib + winmm.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + $(SolutionDir)\..\..\lib\win32\glfwdll.def + + + + + Level3 + NotUsing + MaxSpeed + false + true + _GLFW_NO_DLOAD_WINMM;_GLFW_NO_DLOAD_GDI32;GLFW_BUILD_DLL;WIN32;NDEBUG;_WINDOWS;_USRDLL;GLFWDLL_EXPORTS;%(PreprocessorDefinitions) + false + $(SolutionDir)\..\..\lib;$(SolutionDir)\..\..\lib\win32;%(AdditionalIncludeDirectories) + + + + + Windows + false + true + true + $(TargetDir)$(TargetName)DLL.lib + winmm.lib;opengl32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + $(OutDir)$(TargetName)$(TargetExt) + $(SolutionDir)\..\..\lib\win32\glfwdll.def + + + + + + \ No newline at end of file diff -Nru glfw-2.6/support/msvc100/GLFW.sln glfw-2.7.2/support/msvc100/GLFW.sln --- glfw-2.6/support/msvc100/GLFW.sln 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc100/GLFW.sln 2011-06-24 23:01:54.000000000 +0000 @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual C++ Express 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GLFW", "GLFW.vcxproj", "{4DA03747-F505-4A98-9124-03B3B73B9B3B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GLFWDLL", "GLFWDLL.vcxproj", "{BC8E963C-BA35-4A32-B53A-CCD9C83E32FC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4DA03747-F505-4A98-9124-03B3B73B9B3B}.Debug|Win32.ActiveCfg = Debug|Win32 + {4DA03747-F505-4A98-9124-03B3B73B9B3B}.Debug|Win32.Build.0 = Debug|Win32 + {4DA03747-F505-4A98-9124-03B3B73B9B3B}.Release|Win32.ActiveCfg = Release|Win32 + {4DA03747-F505-4A98-9124-03B3B73B9B3B}.Release|Win32.Build.0 = Release|Win32 + {BC8E963C-BA35-4A32-B53A-CCD9C83E32FC}.Debug|Win32.ActiveCfg = Debug|Win32 + {BC8E963C-BA35-4A32-B53A-CCD9C83E32FC}.Debug|Win32.Build.0 = Debug|Win32 + {BC8E963C-BA35-4A32-B53A-CCD9C83E32FC}.Release|Win32.ActiveCfg = Release|Win32 + {BC8E963C-BA35-4A32-B53A-CCD9C83E32FC}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff -Nru glfw-2.6/support/msvc100/GLFW.vcxproj glfw-2.7.2/support/msvc100/GLFW.vcxproj --- glfw-2.6/support/msvc100/GLFW.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc100/GLFW.vcxproj 2011-06-24 23:31:18.000000000 +0000 @@ -0,0 +1,118 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {4DA03747-F505-4A98-9124-03B3B73B9B3B} + Win32Proj + GLFW + + + + StaticLibrary + true + MultiByte + false + + + StaticLibrary + false + false + MultiByte + + + + + + + + + + + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + false + false + + + $(SolutionDir)\..\..\lib;$(SolutionDir)\..\..\lib\win32;%(AdditionalIncludeDirectories)$(SolutionDir)\..\..\lib;$(SolutionDir)\..\..\lib\win32;%(AdditionalIncludeDirectories) + + + Windows + true + + + false + + + + + Level3 + + + MaxSpeed + false + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + false + + + $(SolutionDir)\..\..\lib;$(SolutionDir)\..\..\lib\win32;%(AdditionalIncludeDirectories)$(SolutionDir)\..\..\lib;$(SolutionDir)\..\..\lib\win32;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + + + false + + + + + + \ No newline at end of file diff -Nru glfw-2.6/support/msvc80/GLFWDLL.vcproj glfw-2.7.2/support/msvc80/GLFWDLL.vcproj --- glfw-2.6/support/msvc80/GLFWDLL.vcproj 2007-09-01 21:01:42.000000000 +0000 +++ glfw-2.7.2/support/msvc80/GLFWDLL.vcproj 1970-01-01 00:00:00.000000000 +0000 @@ -1,287 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru glfw-2.6/support/msvc80/GLFW.sln glfw-2.7.2/support/msvc80/GLFW.sln --- glfw-2.6/support/msvc80/GLFW.sln 2007-09-01 21:01:42.000000000 +0000 +++ glfw-2.7.2/support/msvc80/GLFW.sln 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GLFW", "GLFW.vcproj", "{BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GLFWDLL", "GLFWDLL.vcproj", "{EE39B12C-97CF-4172-81FD-6ADE6B7F7B7B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9}.Debug|Win32.ActiveCfg = Debug|Win32 - {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9}.Debug|Win32.Build.0 = Debug|Win32 - {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9}.Release|Win32.ActiveCfg = Release|Win32 - {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9}.Release|Win32.Build.0 = Release|Win32 - {EE39B12C-97CF-4172-81FD-6ADE6B7F7B7B}.Debug|Win32.ActiveCfg = Debug|Win32 - {EE39B12C-97CF-4172-81FD-6ADE6B7F7B7B}.Debug|Win32.Build.0 = Debug|Win32 - {EE39B12C-97CF-4172-81FD-6ADE6B7F7B7B}.Release|Win32.ActiveCfg = Release|Win32 - {EE39B12C-97CF-4172-81FD-6ADE6B7F7B7B}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff -Nru glfw-2.6/support/msvc80/GLFW.vcproj glfw-2.7.2/support/msvc80/GLFW.vcproj --- glfw-2.6/support/msvc80/GLFW.vcproj 2007-09-01 21:01:42.000000000 +0000 +++ glfw-2.7.2/support/msvc80/GLFW.vcproj 1970-01-01 00:00:00.000000000 +0000 @@ -1,257 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru glfw-2.6/support/msvc90/accuracy.vcproj glfw-2.7.2/support/msvc90/accuracy.vcproj --- glfw-2.6/support/msvc90/accuracy.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/accuracy.vcproj 2009-11-08 14:38:30.000000000 +0000 @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/boing.vcproj glfw-2.7.2/support/msvc90/boing.vcproj --- glfw-2.6/support/msvc90/boing.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/boing.vcproj 2011-07-26 17:38:20.000000000 +0000 @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/defaults.vcproj glfw-2.7.2/support/msvc90/defaults.vcproj --- glfw-2.6/support/msvc90/defaults.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/defaults.vcproj 2009-11-08 14:38:30.000000000 +0000 @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/events.vcproj glfw-2.7.2/support/msvc90/events.vcproj --- glfw-2.6/support/msvc90/events.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/events.vcproj 2009-11-08 18:12:24.000000000 +0000 @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/fsaa.vcproj glfw-2.7.2/support/msvc90/fsaa.vcproj --- glfw-2.6/support/msvc90/fsaa.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/fsaa.vcproj 2009-11-08 18:12:24.000000000 +0000 @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/fsinput.vcproj glfw-2.7.2/support/msvc90/fsinput.vcproj --- glfw-2.6/support/msvc90/fsinput.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/fsinput.vcproj 2009-11-08 19:12:39.000000000 +0000 @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/gears.vcproj glfw-2.7.2/support/msvc90/gears.vcproj --- glfw-2.6/support/msvc90/gears.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/gears.vcproj 2009-11-08 15:16:43.000000000 +0000 @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/GLFWDLL.vcproj glfw-2.7.2/support/msvc90/GLFWDLL.vcproj --- glfw-2.6/support/msvc90/GLFWDLL.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/GLFWDLL.vcproj 2011-07-26 19:55:35.000000000 +0000 @@ -0,0 +1,295 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/GLFW.sln glfw-2.7.2/support/msvc90/GLFW.sln --- glfw-2.6/support/msvc90/GLFW.sln 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/GLFW.sln 2009-11-08 19:12:39.000000000 +0000 @@ -0,0 +1,215 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GLFW", "GLFW.vcproj", "{BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GLFWDLL", "GLFWDLL.vcproj", "{EE39B12C-97CF-4172-81FD-6ADE6B7F7B7B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "joysticks", "joysticks.vcproj", "{EE473E21-BCE8-44F1-AC1B-86B7AEF9937F}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gears", "gears.vcproj", "{7B66C263-B2A7-45EE-A309-8831A036CD3A}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "listmodes", "listmodes.vcproj", "{236D76D6-11EE-4A7A-9866-5F54D167F0BB}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mthello", "mthello.vcproj", "{5663B66C-02B6-4BAD-BD8D-43522B1B8102}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mtbench", "mtbench.vcproj", "{95EC0C16-2E1F-4A9C-AE91-CF139A02E24B}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "boing", "boing.vcproj", "{2DE61CE4-FFFA-4352-BAD1-4F938FFDF5AE}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mipmaps", "mipmaps.vcproj", "{E740C25F-5BDE-46CA-8531-21E979833D2D}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "particles", "particles.vcproj", "{21B213C8-728F-4A63-89D6-53C12AC296E8}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pong3d", "pong3d.vcproj", "{4D4A34A1-5174-499C-BA1F-DBA9DFFA20A9}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "splitview", "splitview.vcproj", "{959B9D47-29D7-49AB-A016-17E8E14B9836}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "triangle", "triangle.vcproj", "{577B0316-8AF6-4785-AB1D-B24959859E02}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wave", "wave.vcproj", "{38522E5A-AC8F-48BA-9BBB-0AEE3389B6A5}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "accuracy", "accuracy.vcproj", "{588AFBF8-66B7-40C1-A8F8-0441074CB8FD}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "defaults", "defaults.vcproj", "{1BE57407-5E23-4B92-99A5-824373D34041}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "events", "events.vcproj", "{C0288A9D-6997-45DA-87E1-D3FC3D0A5CD4}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fsaa", "fsaa.vcproj", "{157A45EF-2089-45C5-A1FA-D2D0C29AF8E7}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fsinput", "fsinput.vcproj", "{1D71F54A-26A9-4BE8-9B1A-E6027252D8FF}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "peter", "peter.vcproj", "{637F0D11-2FAD-41EF-8EE3-9B7D21261105}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "reopen", "reopen.vcproj", "{E2A77601-A969-4178-AE56-EFC8023FE12D}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tearing", "tearing.vcproj", "{D397257E-F80A-49B0-9C42-9EE4271463D7}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "version", "version.vcproj", "{6D17B61F-E539-4FD1-9B04-266467FF5417}" + ProjectSection(ProjectDependencies) = postProject + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} = {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9}.Debug|Win32.ActiveCfg = Debug|Win32 + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9}.Debug|Win32.Build.0 = Debug|Win32 + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9}.Release|Win32.ActiveCfg = Release|Win32 + {BAA85EB9-BE33-45FB-B552-0AB3AC4D9CA9}.Release|Win32.Build.0 = Release|Win32 + {EE39B12C-97CF-4172-81FD-6ADE6B7F7B7B}.Debug|Win32.ActiveCfg = Debug|Win32 + {EE39B12C-97CF-4172-81FD-6ADE6B7F7B7B}.Debug|Win32.Build.0 = Debug|Win32 + {EE39B12C-97CF-4172-81FD-6ADE6B7F7B7B}.Release|Win32.ActiveCfg = Release|Win32 + {EE39B12C-97CF-4172-81FD-6ADE6B7F7B7B}.Release|Win32.Build.0 = Release|Win32 + {EE473E21-BCE8-44F1-AC1B-86B7AEF9937F}.Debug|Win32.ActiveCfg = Debug|Win32 + {EE473E21-BCE8-44F1-AC1B-86B7AEF9937F}.Debug|Win32.Build.0 = Debug|Win32 + {EE473E21-BCE8-44F1-AC1B-86B7AEF9937F}.Release|Win32.ActiveCfg = Release|Win32 + {EE473E21-BCE8-44F1-AC1B-86B7AEF9937F}.Release|Win32.Build.0 = Release|Win32 + {7B66C263-B2A7-45EE-A309-8831A036CD3A}.Debug|Win32.ActiveCfg = Debug|Win32 + {7B66C263-B2A7-45EE-A309-8831A036CD3A}.Debug|Win32.Build.0 = Debug|Win32 + {7B66C263-B2A7-45EE-A309-8831A036CD3A}.Release|Win32.ActiveCfg = Release|Win32 + {7B66C263-B2A7-45EE-A309-8831A036CD3A}.Release|Win32.Build.0 = Release|Win32 + {236D76D6-11EE-4A7A-9866-5F54D167F0BB}.Debug|Win32.ActiveCfg = Debug|Win32 + {236D76D6-11EE-4A7A-9866-5F54D167F0BB}.Debug|Win32.Build.0 = Debug|Win32 + {236D76D6-11EE-4A7A-9866-5F54D167F0BB}.Release|Win32.ActiveCfg = Release|Win32 + {236D76D6-11EE-4A7A-9866-5F54D167F0BB}.Release|Win32.Build.0 = Release|Win32 + {5663B66C-02B6-4BAD-BD8D-43522B1B8102}.Debug|Win32.ActiveCfg = Debug|Win32 + {5663B66C-02B6-4BAD-BD8D-43522B1B8102}.Debug|Win32.Build.0 = Debug|Win32 + {5663B66C-02B6-4BAD-BD8D-43522B1B8102}.Release|Win32.ActiveCfg = Release|Win32 + {5663B66C-02B6-4BAD-BD8D-43522B1B8102}.Release|Win32.Build.0 = Release|Win32 + {95EC0C16-2E1F-4A9C-AE91-CF139A02E24B}.Debug|Win32.ActiveCfg = Debug|Win32 + {95EC0C16-2E1F-4A9C-AE91-CF139A02E24B}.Debug|Win32.Build.0 = Debug|Win32 + {95EC0C16-2E1F-4A9C-AE91-CF139A02E24B}.Release|Win32.ActiveCfg = Release|Win32 + {95EC0C16-2E1F-4A9C-AE91-CF139A02E24B}.Release|Win32.Build.0 = Release|Win32 + {2DE61CE4-FFFA-4352-BAD1-4F938FFDF5AE}.Debug|Win32.ActiveCfg = Debug|Win32 + {2DE61CE4-FFFA-4352-BAD1-4F938FFDF5AE}.Debug|Win32.Build.0 = Debug|Win32 + {2DE61CE4-FFFA-4352-BAD1-4F938FFDF5AE}.Release|Win32.ActiveCfg = Release|Win32 + {2DE61CE4-FFFA-4352-BAD1-4F938FFDF5AE}.Release|Win32.Build.0 = Release|Win32 + {E740C25F-5BDE-46CA-8531-21E979833D2D}.Debug|Win32.ActiveCfg = Debug|Win32 + {E740C25F-5BDE-46CA-8531-21E979833D2D}.Debug|Win32.Build.0 = Debug|Win32 + {E740C25F-5BDE-46CA-8531-21E979833D2D}.Release|Win32.ActiveCfg = Release|Win32 + {E740C25F-5BDE-46CA-8531-21E979833D2D}.Release|Win32.Build.0 = Release|Win32 + {21B213C8-728F-4A63-89D6-53C12AC296E8}.Debug|Win32.ActiveCfg = Debug|Win32 + {21B213C8-728F-4A63-89D6-53C12AC296E8}.Debug|Win32.Build.0 = Debug|Win32 + {21B213C8-728F-4A63-89D6-53C12AC296E8}.Release|Win32.ActiveCfg = Release|Win32 + {21B213C8-728F-4A63-89D6-53C12AC296E8}.Release|Win32.Build.0 = Release|Win32 + {4D4A34A1-5174-499C-BA1F-DBA9DFFA20A9}.Debug|Win32.ActiveCfg = Debug|Win32 + {4D4A34A1-5174-499C-BA1F-DBA9DFFA20A9}.Debug|Win32.Build.0 = Debug|Win32 + {4D4A34A1-5174-499C-BA1F-DBA9DFFA20A9}.Release|Win32.ActiveCfg = Release|Win32 + {4D4A34A1-5174-499C-BA1F-DBA9DFFA20A9}.Release|Win32.Build.0 = Release|Win32 + {959B9D47-29D7-49AB-A016-17E8E14B9836}.Debug|Win32.ActiveCfg = Debug|Win32 + {959B9D47-29D7-49AB-A016-17E8E14B9836}.Debug|Win32.Build.0 = Debug|Win32 + {959B9D47-29D7-49AB-A016-17E8E14B9836}.Release|Win32.ActiveCfg = Release|Win32 + {959B9D47-29D7-49AB-A016-17E8E14B9836}.Release|Win32.Build.0 = Release|Win32 + {577B0316-8AF6-4785-AB1D-B24959859E02}.Debug|Win32.ActiveCfg = Debug|Win32 + {577B0316-8AF6-4785-AB1D-B24959859E02}.Debug|Win32.Build.0 = Debug|Win32 + {577B0316-8AF6-4785-AB1D-B24959859E02}.Release|Win32.ActiveCfg = Release|Win32 + {577B0316-8AF6-4785-AB1D-B24959859E02}.Release|Win32.Build.0 = Release|Win32 + {38522E5A-AC8F-48BA-9BBB-0AEE3389B6A5}.Debug|Win32.ActiveCfg = Debug|Win32 + {38522E5A-AC8F-48BA-9BBB-0AEE3389B6A5}.Debug|Win32.Build.0 = Debug|Win32 + {38522E5A-AC8F-48BA-9BBB-0AEE3389B6A5}.Release|Win32.ActiveCfg = Release|Win32 + {38522E5A-AC8F-48BA-9BBB-0AEE3389B6A5}.Release|Win32.Build.0 = Release|Win32 + {588AFBF8-66B7-40C1-A8F8-0441074CB8FD}.Debug|Win32.ActiveCfg = Debug|Win32 + {588AFBF8-66B7-40C1-A8F8-0441074CB8FD}.Debug|Win32.Build.0 = Debug|Win32 + {588AFBF8-66B7-40C1-A8F8-0441074CB8FD}.Release|Win32.ActiveCfg = Release|Win32 + {588AFBF8-66B7-40C1-A8F8-0441074CB8FD}.Release|Win32.Build.0 = Release|Win32 + {1BE57407-5E23-4B92-99A5-824373D34041}.Debug|Win32.ActiveCfg = Debug|Win32 + {1BE57407-5E23-4B92-99A5-824373D34041}.Debug|Win32.Build.0 = Debug|Win32 + {1BE57407-5E23-4B92-99A5-824373D34041}.Release|Win32.ActiveCfg = Release|Win32 + {1BE57407-5E23-4B92-99A5-824373D34041}.Release|Win32.Build.0 = Release|Win32 + {C0288A9D-6997-45DA-87E1-D3FC3D0A5CD4}.Debug|Win32.ActiveCfg = Debug|Win32 + {C0288A9D-6997-45DA-87E1-D3FC3D0A5CD4}.Debug|Win32.Build.0 = Debug|Win32 + {C0288A9D-6997-45DA-87E1-D3FC3D0A5CD4}.Release|Win32.ActiveCfg = Release|Win32 + {C0288A9D-6997-45DA-87E1-D3FC3D0A5CD4}.Release|Win32.Build.0 = Release|Win32 + {157A45EF-2089-45C5-A1FA-D2D0C29AF8E7}.Debug|Win32.ActiveCfg = Debug|Win32 + {157A45EF-2089-45C5-A1FA-D2D0C29AF8E7}.Debug|Win32.Build.0 = Debug|Win32 + {157A45EF-2089-45C5-A1FA-D2D0C29AF8E7}.Release|Win32.ActiveCfg = Release|Win32 + {157A45EF-2089-45C5-A1FA-D2D0C29AF8E7}.Release|Win32.Build.0 = Release|Win32 + {1D71F54A-26A9-4BE8-9B1A-E6027252D8FF}.Debug|Win32.ActiveCfg = Debug|Win32 + {1D71F54A-26A9-4BE8-9B1A-E6027252D8FF}.Debug|Win32.Build.0 = Debug|Win32 + {1D71F54A-26A9-4BE8-9B1A-E6027252D8FF}.Release|Win32.ActiveCfg = Release|Win32 + {1D71F54A-26A9-4BE8-9B1A-E6027252D8FF}.Release|Win32.Build.0 = Release|Win32 + {637F0D11-2FAD-41EF-8EE3-9B7D21261105}.Debug|Win32.ActiveCfg = Debug|Win32 + {637F0D11-2FAD-41EF-8EE3-9B7D21261105}.Debug|Win32.Build.0 = Debug|Win32 + {637F0D11-2FAD-41EF-8EE3-9B7D21261105}.Release|Win32.ActiveCfg = Release|Win32 + {637F0D11-2FAD-41EF-8EE3-9B7D21261105}.Release|Win32.Build.0 = Release|Win32 + {E2A77601-A969-4178-AE56-EFC8023FE12D}.Debug|Win32.ActiveCfg = Debug|Win32 + {E2A77601-A969-4178-AE56-EFC8023FE12D}.Debug|Win32.Build.0 = Debug|Win32 + {E2A77601-A969-4178-AE56-EFC8023FE12D}.Release|Win32.ActiveCfg = Release|Win32 + {E2A77601-A969-4178-AE56-EFC8023FE12D}.Release|Win32.Build.0 = Release|Win32 + {D397257E-F80A-49B0-9C42-9EE4271463D7}.Debug|Win32.ActiveCfg = Debug|Win32 + {D397257E-F80A-49B0-9C42-9EE4271463D7}.Debug|Win32.Build.0 = Debug|Win32 + {D397257E-F80A-49B0-9C42-9EE4271463D7}.Release|Win32.ActiveCfg = Release|Win32 + {D397257E-F80A-49B0-9C42-9EE4271463D7}.Release|Win32.Build.0 = Release|Win32 + {6D17B61F-E539-4FD1-9B04-266467FF5417}.Debug|Win32.ActiveCfg = Debug|Win32 + {6D17B61F-E539-4FD1-9B04-266467FF5417}.Debug|Win32.Build.0 = Debug|Win32 + {6D17B61F-E539-4FD1-9B04-266467FF5417}.Release|Win32.ActiveCfg = Release|Win32 + {6D17B61F-E539-4FD1-9B04-266467FF5417}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff -Nru glfw-2.6/support/msvc90/GLFW.vcproj glfw-2.7.2/support/msvc90/GLFW.vcproj --- glfw-2.6/support/msvc90/GLFW.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/GLFW.vcproj 2011-06-24 12:04:54.000000000 +0000 @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/joysticks.vcproj glfw-2.7.2/support/msvc90/joysticks.vcproj --- glfw-2.6/support/msvc90/joysticks.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/joysticks.vcproj 2009-10-29 21:54:14.000000000 +0000 @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/listmodes.vcproj glfw-2.7.2/support/msvc90/listmodes.vcproj --- glfw-2.6/support/msvc90/listmodes.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/listmodes.vcproj 2009-03-08 21:38:37.000000000 +0000 @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/mipmaps.vcproj glfw-2.7.2/support/msvc90/mipmaps.vcproj --- glfw-2.6/support/msvc90/mipmaps.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/mipmaps.vcproj 2009-03-08 21:38:37.000000000 +0000 @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/mtbench.vcproj glfw-2.7.2/support/msvc90/mtbench.vcproj --- glfw-2.6/support/msvc90/mtbench.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/mtbench.vcproj 2009-03-08 21:38:37.000000000 +0000 @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/mthello.vcproj glfw-2.7.2/support/msvc90/mthello.vcproj --- glfw-2.6/support/msvc90/mthello.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/mthello.vcproj 2009-03-08 21:38:37.000000000 +0000 @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/particles.vcproj glfw-2.7.2/support/msvc90/particles.vcproj --- glfw-2.6/support/msvc90/particles.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/particles.vcproj 2009-03-08 21:38:37.000000000 +0000 @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/peter.vcproj glfw-2.7.2/support/msvc90/peter.vcproj --- glfw-2.6/support/msvc90/peter.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/peter.vcproj 2009-11-08 18:12:24.000000000 +0000 @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/pong3d.vcproj glfw-2.7.2/support/msvc90/pong3d.vcproj --- glfw-2.6/support/msvc90/pong3d.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/pong3d.vcproj 2009-03-08 21:38:37.000000000 +0000 @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/reopen.vcproj glfw-2.7.2/support/msvc90/reopen.vcproj --- glfw-2.6/support/msvc90/reopen.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/reopen.vcproj 2009-11-08 18:12:24.000000000 +0000 @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/splitview.vcproj glfw-2.7.2/support/msvc90/splitview.vcproj --- glfw-2.6/support/msvc90/splitview.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/splitview.vcproj 2009-03-08 21:38:37.000000000 +0000 @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/tearing.vcproj glfw-2.7.2/support/msvc90/tearing.vcproj --- glfw-2.6/support/msvc90/tearing.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/tearing.vcproj 2009-11-08 18:12:24.000000000 +0000 @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/triangle.vcproj glfw-2.7.2/support/msvc90/triangle.vcproj --- glfw-2.6/support/msvc90/triangle.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/triangle.vcproj 2009-03-08 21:38:37.000000000 +0000 @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/version.vcproj glfw-2.7.2/support/msvc90/version.vcproj --- glfw-2.6/support/msvc90/version.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/version.vcproj 2009-11-08 18:41:49.000000000 +0000 @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/msvc90/wave.vcproj glfw-2.7.2/support/msvc90/wave.vcproj --- glfw-2.6/support/msvc90/wave.vcproj 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/msvc90/wave.vcproj 2009-03-08 21:38:37.000000000 +0000 @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru glfw-2.6/support/pascal/glfw.pas glfw-2.7.2/support/pascal/glfw.pas --- glfw-2.6/support/pascal/glfw.pas 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/pascal/glfw.pas 2010-08-08 15:37:03.000000000 +0000 @@ -0,0 +1,398 @@ +//======================================================================== +// GLFW - An OpenGL framework +// Platform: Delphi/FPC + Windows/Linux/Mac OS +// API version: 2.7 +// WWW: http://www.glfw.org/ +//------------------------------------------------------------------------ +// Copyright (c) 2002-2006 Marcus Geelnard +// Copyright (c) 2006-2010 Camilla Berglund +// +// 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. +// +//======================================================================== + +unit glfw; + +// Use standard linking method +// This means links dynamically to glfw.dll on Windows, glfw.so on Linux +// and statically on Mac OS X +// +// If you don't like that, comment this define +{$DEFINE LINK_STANDARD} + +// If the define above is commented, remove the dot on your favorite option +{.$DEFINE LINK_DYNAMIC} +{.$DEFINE LINK_STATIC} + + +{$IFDEF FPC} + {$MODE DELPHI} +{$ENDIF} + +interface + +const + + //======================================================================== + // GLFW version + //======================================================================== + GLFW_VERSION_MAJOR = 2; + GLFW_VERSION_MINOR = 7; + GLFW_VERSION_REVISION = 0; + + //======================================================================== + // Input handling definitions + //======================================================================== + + // Key and button state/action definitions + GLFW_RELEASE = 0; + GLFW_PRESS = 1; + + // Keyboard key definitions: 8-bit ISO-8859-1 (Latin 1) encoding is used + // for printable keys (such as A-Z, 0-9 etc), and values above 256 + // represent special (non-printable) keys (e.g. F1, Page Up etc). + GLFW_KEY_UNKNOWN = -1; + GLFW_KEY_SPACE = 32; + GLFW_KEY_SPECIAL = 256; + GLFW_KEY_ESC = (GLFW_KEY_SPECIAL+1); + GLFW_KEY_F1 = (GLFW_KEY_SPECIAL+2); + GLFW_KEY_F2 = (GLFW_KEY_SPECIAL+3); + GLFW_KEY_F3 = (GLFW_KEY_SPECIAL+4); + GLFW_KEY_F4 = (GLFW_KEY_SPECIAL+5); + GLFW_KEY_F5 = (GLFW_KEY_SPECIAL+6); + GLFW_KEY_F6 = (GLFW_KEY_SPECIAL+7); + GLFW_KEY_F7 = (GLFW_KEY_SPECIAL+8); + GLFW_KEY_F8 = (GLFW_KEY_SPECIAL+9); + GLFW_KEY_F9 = (GLFW_KEY_SPECIAL+10); + GLFW_KEY_F10 = (GLFW_KEY_SPECIAL+11); + GLFW_KEY_F11 = (GLFW_KEY_SPECIAL+12); + GLFW_KEY_F12 = (GLFW_KEY_SPECIAL+13); + GLFW_KEY_F13 = (GLFW_KEY_SPECIAL+14); + GLFW_KEY_F14 = (GLFW_KEY_SPECIAL+15); + GLFW_KEY_F15 = (GLFW_KEY_SPECIAL+16); + GLFW_KEY_F16 = (GLFW_KEY_SPECIAL+17); + GLFW_KEY_F17 = (GLFW_KEY_SPECIAL+18); + GLFW_KEY_F18 = (GLFW_KEY_SPECIAL+19); + GLFW_KEY_F19 = (GLFW_KEY_SPECIAL+20); + GLFW_KEY_F20 = (GLFW_KEY_SPECIAL+21); + GLFW_KEY_F21 = (GLFW_KEY_SPECIAL+22); + GLFW_KEY_F22 = (GLFW_KEY_SPECIAL+23); + GLFW_KEY_F23 = (GLFW_KEY_SPECIAL+24); + GLFW_KEY_F24 = (GLFW_KEY_SPECIAL+25); + GLFW_KEY_F25 = (GLFW_KEY_SPECIAL+26); + GLFW_KEY_UP = (GLFW_KEY_SPECIAL+27); + GLFW_KEY_DOWN = (GLFW_KEY_SPECIAL+28); + GLFW_KEY_LEFT = (GLFW_KEY_SPECIAL+29); + GLFW_KEY_RIGHT = (GLFW_KEY_SPECIAL+30); + GLFW_KEY_LSHIFT = (GLFW_KEY_SPECIAL+31); + GLFW_KEY_RSHIFT = (GLFW_KEY_SPECIAL+32); + GLFW_KEY_LCTRL = (GLFW_KEY_SPECIAL+33); + GLFW_KEY_RCTRL = (GLFW_KEY_SPECIAL+34); + GLFW_KEY_LALT = (GLFW_KEY_SPECIAL+35); + GLFW_KEY_RALT = (GLFW_KEY_SPECIAL+36); + GLFW_KEY_TAB = (GLFW_KEY_SPECIAL+37); + GLFW_KEY_ENTER = (GLFW_KEY_SPECIAL+38); + GLFW_KEY_BACKSPACE = (GLFW_KEY_SPECIAL+39); + GLFW_KEY_INSERT = (GLFW_KEY_SPECIAL+40); + GLFW_KEY_DEL = (GLFW_KEY_SPECIAL+41); + GLFW_KEY_PAGEUP = (GLFW_KEY_SPECIAL+42); + GLFW_KEY_PAGEDOWN = (GLFW_KEY_SPECIAL+43); + GLFW_KEY_HOME = (GLFW_KEY_SPECIAL+44); + GLFW_KEY_END = (GLFW_KEY_SPECIAL+45); + GLFW_KEY_KP_0 = (GLFW_KEY_SPECIAL+46); + GLFW_KEY_KP_1 = (GLFW_KEY_SPECIAL+47); + GLFW_KEY_KP_2 = (GLFW_KEY_SPECIAL+48); + GLFW_KEY_KP_3 = (GLFW_KEY_SPECIAL+49); + GLFW_KEY_KP_4 = (GLFW_KEY_SPECIAL+50); + GLFW_KEY_KP_5 = (GLFW_KEY_SPECIAL+51); + GLFW_KEY_KP_6 = (GLFW_KEY_SPECIAL+52); + GLFW_KEY_KP_7 = (GLFW_KEY_SPECIAL+53); + GLFW_KEY_KP_8 = (GLFW_KEY_SPECIAL+54); + GLFW_KEY_KP_9 = (GLFW_KEY_SPECIAL+55); + GLFW_KEY_KP_DIVIDE = (GLFW_KEY_SPECIAL+56); + GLFW_KEY_KP_MULTIPLY = (GLFW_KEY_SPECIAL+57); + GLFW_KEY_KP_SUBTRACT = (GLFW_KEY_SPECIAL+58); + GLFW_KEY_KP_ADD = (GLFW_KEY_SPECIAL+59); + GLFW_KEY_KP_DECIMAL = (GLFW_KEY_SPECIAL+60); + GLFW_KEY_KP_EQUAL = (GLFW_KEY_SPECIAL+61); + GLFW_KEY_KP_ENTER = (GLFW_KEY_SPECIAL+62); + GLFW_KEY_KP_NUM_LOCK = (GLFW_KEY_SPECIAL+63); + GLFW_KEY_CAPS_LOCK = (GLFW_KEY_SPECIAL+64); + GLFW_KEY_SCROLL_LOCK = (GLFW_KEY_SPECIAL+65); + GLFW_KEY_PAUSE = (GLFW_KEY_SPECIAL+66); + GLFW_KEY_LSUPER = (GLFW_KEY_SPECIAL+67); + GLFW_KEY_RSUPER = (GLFW_KEY_SPECIAL+68); + GLFW_KEY_MENU = (GLFW_KEY_SPECIAL+69); + GLFW_KEY_LAST = GLFW_KEY_MENU; + + // Mouse button definitions + GLFW_MOUSE_BUTTON_1 = 0; + GLFW_MOUSE_BUTTON_2 = 1; + GLFW_MOUSE_BUTTON_3 = 2; + GLFW_MOUSE_BUTTON_4 = 3; + GLFW_MOUSE_BUTTON_5 = 4; + GLFW_MOUSE_BUTTON_6 = 5; + GLFW_MOUSE_BUTTON_7 = 6; + GLFW_MOUSE_BUTTON_8 = 7; + GLFW_MOUSE_BUTTON_LAST = GLFW_MOUSE_BUTTON_8; + + // Mouse button aliases + GLFW_MOUSE_BUTTON_LEFT = GLFW_MOUSE_BUTTON_1; + GLFW_MOUSE_BUTTON_RIGHT = GLFW_MOUSE_BUTTON_2; + GLFW_MOUSE_BUTTON_MIDDLE = GLFW_MOUSE_BUTTON_3; + + // Joystick identifiers + GLFW_JOYSTICK_1 = 0; + GLFW_JOYSTICK_2 = 1; + GLFW_JOYSTICK_3 = 2; + GLFW_JOYSTICK_4 = 3; + GLFW_JOYSTICK_5 = 4; + GLFW_JOYSTICK_6 = 5; + GLFW_JOYSTICK_7 = 6; + GLFW_JOYSTICK_8 = 7; + GLFW_JOYSTICK_9 = 8; + GLFW_JOYSTICK_10 = 9; + GLFW_JOYSTICK_11 = 10; + GLFW_JOYSTICK_12 = 11; + GLFW_JOYSTICK_13 = 12; + GLFW_JOYSTICK_14 = 13; + GLFW_JOYSTICK_15 = 14; + GLFW_JOYSTICK_16 = 15; + GLFW_JOYSTICK_LAST = GLFW_JOYSTICK_16; + + + //======================================================================== + // Other definitions + //======================================================================== + + // glfwOpenWindow modes + GLFW_WINDOW = $00010001; + GLFW_FULLSCREEN = $00010002; + + // glfwGetWindowParam tokens + GLFW_OPENED = $00020001; + GLFW_ACTIVE = $00020002; + GLFW_ICONIFIED = $00020003; + GLFW_ACCELERATED = $00020004; + GLFW_RED_BITS = $00020005; + GLFW_GREEN_BITS = $00020006; + GLFW_BLUE_BITS = $00020007; + GLFW_ALPHA_BITS = $00020008; + GLFW_DEPTH_BITS = $00020009; + GLFW_STENCIL_BITS = $0002000A; + + // The following constants are used for both glfwGetWindowParam + // and glfwOpenWindowHint + GLFW_REFRESH_RATE = $0002000B; + GLFW_ACCUM_RED_BITS = $0002000C; + GLFW_ACCUM_GREEN_BITS = $0002000D; + GLFW_ACCUM_BLUE_BITS = $0002000E; + GLFW_ACCUM_ALPHA_BITS = $0002000F; + GLFW_AUX_BUFFERS = $00020010; + GLFW_STEREO = $00020011; + GLFW_WINDOW_NO_RESIZE = $00020012; + GLFW_FSAA_SAMPLES = $00020013; + GLFW_OPENGL_VERSION_MAJOR = $00020014; + GLFW_OPENGL_VERSION_MINOR = $00020015; + GLFW_OPENGL_FORWARD_COMPAT= $00020016; + GLFW_DEBUG_CONTEXT = $00020017; + GLFW_OPENGL_PROFILE = $00020018; + + // GLFW_OPENGL_PROFILE tokens + GLFW_OPENGL_CORE_PROFILE = $00050001; + GLFW_OPENGL_COMPAT_PROFILE = $00050002; + + // glfwEnable/glfwDisable tokens + GLFW_MOUSE_CURSOR = $00030001; + GLFW_STICKY_KEYS = $00030002; + GLFW_STICKY_MOUSE_BUTTONS = $00030003; + GLFW_SYSTEM_KEYS = $00030004; + GLFW_KEY_REPEAT = $00030005; + GLFW_AUTO_POLL_EVENTS = $00030006; + + // glfwWaitThread wait modes + GLFW_WAIT = $00040001; + GLFW_NOWAIT = $00040002; + + // glfwGetJoystickParam tokens + GLFW_PRESENT = $00050001; + GLFW_AXES = $00050002; + GLFW_BUTTONS = $00050003; + + // glfwReadImage/glfwLoadTexture2D flags + GLFW_NO_RESCALE_BIT = $00000001; // Only for glfwReadImage + GLFW_ORIGIN_UL_BIT = $00000002; + GLFW_BUILD_MIPMAPS_BIT = $00000004; // Only for glfwLoadTexture2D + GLFW_ALPHA_MAP_BIT = $00000008; + + // Time spans longer than this (seconds) are considered to be infinity + GLFW_INFINITY = 100000.0; + + + //======================================================================== + // Typedefs + //======================================================================== + +type + + // The video mode structure used by glfwGetVideoModes() + GLFWvidmode = packed record + Width, Height : Integer; + RedBits, BlueBits, GreenBits: Integer; + end; + PGLFWvidmode = ^GLFWvidmode; + + // Image/texture information + GLFWimage = packed record + Width, Height: Integer; + Format : Integer; + BytesPerPixel: Integer; + Data : PChar; + end; + PGLFWimage = ^GLFWimage; + + // Thread ID + GLFWthread = Integer; + + // Mutex object + GLFWmutex = Pointer; + + // Condition variable object + GLFWcond = Pointer; + + // Function pointer types + GLFWwindowsizefun = procedure(Width, Height: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} + GLFWwindowclosefun = function: Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} + GLFWwindowrefreshfun = procedure; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} + GLFWmousebuttonfun = procedure(Button, Action: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} + GLFWmouseposfun = procedure(X, Y: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} + GLFWmousewheelfun = procedure(Pos: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} + GLFWkeyfun = procedure(Key, Action: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} + GLFWcharfun = procedure(Character, Action: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} + GLFWthreadfun = procedure(Arg: Pointer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} + + +//======================================================================== +// Prototypes +//======================================================================== + +{$IFDEF LINK_DYNAMIC} +const + {$IFDEF WIN32} + DLLNAME = 'glfw.dll'; + {$ELSE} + {$IFDEF DARWIN} + DLLNAME = 'libglfw.dylib'; + {$ELSE} + DLLNAME = 'libglfw.so'; + {$ENDIF} + {$ENDIF} +{$ENDIF} + + +// GLFW initialization, termination and version querying +function glfwInit: Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwTerminate; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwGetVersion(var major: Integer; var minor: Integer; var Rev: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; + +// Window handling +function glfwOpenWindow(width, height, redbits, greenbits, bluebits, alphabits, depthbits, stencilbits, mode: Integer): Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwOpenWindowHint(target, hint: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwCloseWindow; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSetWindowTitle(title: PChar); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwGetWindowSize(var width: Integer; var height: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSetWindowSize(width, height: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSetWindowPos(x, y: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwIconifyWindow; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwRestoreWindow; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSwapBuffers; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSwapInterval(interval: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +function glfwGetWindowParam(Param: Integer): Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSetWindowSizeCallback(cbfun: GLFWwindowsizefun); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSetWindowCloseCallback(cbfun: GLFWwindowclosefun); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSetWindowRefreshCallback(cbfun: GLFWwindowrefreshfun); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; + +// Video mode functions +function glfwGetVideoModes(list: PGLFWvidmode; maxcount: Integer): Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwGetDesktopMode(mode: PGLFWvidmode); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; + +// Input handling +procedure glfwPollEvents; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwWaitEvents; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +function glfwGetKey(key: Integer): Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +function glfwGetMouseButton(button: Integer): Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwGetMousePos(var xpos: Integer; var ypos: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSetMousePos(xpos, ypos: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +function glfwGetMouseWheel: Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSetMouseWheel(pos: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSetKeyCallback( cbfun: GLFWkeyfun); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSetCharCallback( cbfun: GLFWcharfun); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSetMouseButtonCallback( cbfun: GLFWmousebuttonfun); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSetMousePosCallback( cbfun: GLFWmouseposfun); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSetMouseWheelCallback( cbfun: GLFWmousewheelfun); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; + +// Joystick input +function glfwGetJoystickParam(joy, param: Integer): Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +function glfwGetJoystickPos(joy: Integer; var pos: Single; numaxes: Integer): Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +function glfwGetJoystickButtons(joy: Integer; buttons: PChar; numbuttons: Integer): Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; + +// Time +function glfwGetTime: Double; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSetTime(time: Double); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSleep(time: Double); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; + +// Extension support +function glfwExtensionSupported(extension: PChar): Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +function glfwGetProcAddress(procname: PChar): Pointer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwGetGLVersion(var major: Integer; var minor: Integer; var Rev: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; + +// Threading support +function glfwCreateThread(fun: GLFWthreadfun; arg: Pointer): GLFWthread; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwDestroyThread(Id: GLFWthread); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +function glfwWaitThread(Id: GLFWthread; waitmode: Integer): Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +function glfwGetThreadID: GLFWthread; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +function glfwCreateMutex: GLFWmutex; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwDestroyMutex( mutex: GLFWmutex); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwLockMutex(mutex: GLFWmutex); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwUnlockMutex(mutex: GLFWmutex); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +function glfwCreateCond: GLFWcond; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwDestroyCond(cond: GLFWcond); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwWaitCond(cond: GLFWcond; mutex: GLFWmutex; timeout: Double); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwSignalCond(cond: GLFWcond); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwBroadcastCond(cond: GLFWcond); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +function glfwGetNumberOfProcessors: Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; + +// Enable/disable functions +procedure glfwEnable(token: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwDisable(token: Integer); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; + +// Image/texture I/O support +function glfwReadImage(name: PChar; image: PGLFWimage; flags: Integer): Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +function glfwReadMemoryImage(data: Pointer; size: LongInt; img: PGLFWimage; flags: Integer): Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +procedure glfwFreeImage(img: PGLFWimage); {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +function glfwLoadTexture2D(name: PChar; flags: Integer): Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +function glfwLoadMemoryTexture2D(data: Pointer; size: LongInt; flags: Integer): Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; +function glfwLoadTextureImage2D(img: PGLFWimage; flags: Integer): Integer; {$IFDEF WIN32} stdcall; {$ELSE} cdecl; {$ENDIF} external {$IFDEF LINK_DYNAMIC} DLLNAME {$ENDIF}; + +implementation + + + +end. diff -Nru glfw-2.6/support/pascal/mipmaps.dpr glfw-2.7.2/support/pascal/mipmaps.dpr --- glfw-2.6/support/pascal/mipmaps.dpr 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/pascal/mipmaps.dpr 2009-10-22 08:40:22.000000000 +0000 @@ -0,0 +1,130 @@ +program mipmaps; + +{$IFDEF FPC} + {$IFDEF WIN32} + {$APPTYPE GUI} + {$ENDIF} + +{$ENDIF} + +//======================================================================== +// This is a small test application for GLFW. +// The program shows texture loading with mipmap generation and trilienar +// filtering. +// Note: For OpenGL 1.0 compability, we do not use texture objects (this +// is no issue, since we only have one texture). +// +// Object Pascal conversion by Johannes Stein (http://www.freeze-dev.de) +//======================================================================== + +uses + SysUtils, + gl, glu, + glfw; + +var + width, height, running, frames, x, y: Integer; + t, t0, fps: Double; + titlestr: string; + Directory: String; + +begin + + // Initialize GLFW + glfwInit; + + // Open OpenGL window + if glfwOpenWindow( 640, 480, 0,0,0,0, 0,0, GLFW_WINDOW ) <> 1 then + begin + glfwTerminate; + Exit; + end; + + // Enable sticky keys + glfwEnable( GLFW_STICKY_KEYS ); + + // Disable vertical sync (on cards that support it) + glfwSwapInterval( 0 ); + + Directory := ExtractFilePath(ParamStr(0)); + if glfwLoadTexture2D(PChar(Directory + 'mipmaps.tga'), GLFW_BUILD_MIPMAPS_BIT) <> 1 then + begin + glfwTerminate; + Exit; + end; + + // Use trilinear interpolation (GL_LINEAR_MIPMAP_LINEAR) + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + GL_LINEAR_MIPMAP_LINEAR ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, + GL_LINEAR ); + + // Enable texturing + glEnable( GL_TEXTURE_2D ); + + // Main loop + running := 1; + frames := 0; + t0 := glfwGetTime; + while running <> 0 do + begin + // Get time and mouse position + t := glfwGetTime; + glfwGetMousePos(x, y ); + + // Calculate and display FPS (frames per second) + if ((t-t0) > 1.0) or (frames = 0) then + begin + fps := frames / (t-t0); + titlestr := Format('Trilinear interpolation (%.1f FPS)', [fps]); + glfwSetWindowTitle( PChar(titlestr) ); + t0 := t; + frames := 0; + end; + inc(frames); + + // Get window size (may be different than the requested size) + glfwGetWindowSize( width, height ); + if height < 1 then height := 1; + + // Set viewport + glViewport( 0, 0, width, height ); + + // Clear color buffer + glClearColor( 0.0, 0.0, 0.0, 0.0 ); + glClear( GL_COLOR_BUFFER_BIT ); + + // Select and setup the projection matrix + glMatrixMode( GL_PROJECTION ); + glLoadIdentity; + gluPerspective( 65.0, width/height, 1.0, 50.0 ); + + // Select and setup the modelview matrix + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity; + gluLookAt( 0.0, 3.0, -20.0, // Eye-position + 0.0, -4.0, -11.0, // View-point + 0.0, 1.0, 1.0 ); // Up-vector + + // Draw a textured quad + glRotatef(0.05*x + t*5.0, 0.0, 1.0, 0.0); + glBegin( GL_QUADS ); + glTexCoord2f( -20.0, 20.0 ); + glVertex3f( -50.0, 0.0, -50.0 ); + glTexCoord2f( 20.0, 20.0 ); + glVertex3f( 50.0, 0.0, -50.0 ); + glTexCoord2f( 20.0, -20.0 ); + glVertex3f( 50.0, 0.0, 50.0 ); + glTexCoord2f( -20.0, -20.0 ); + glVertex3f( -50.0, 0.0, 50.0 ); + glEnd(); + + // Swap buffers + glfwSwapBuffers; + + // Check if the ESC key was pressed or the window was closed + running := (not glfwGetKey( GLFW_KEY_ESC )) and + glfwGetWindowParam( GLFW_OPENED ); + end; + +end. diff -Nru glfw-2.6/support/pascal/Triangle.dpr glfw-2.7.2/support/pascal/Triangle.dpr --- glfw-2.6/support/pascal/Triangle.dpr 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/support/pascal/Triangle.dpr 2009-10-22 08:40:22.000000000 +0000 @@ -0,0 +1,114 @@ +program Triangle; + +{$IFDEF FPC} + {$IFDEF WIN32} + {$APPTYPE GUI} + {$ENDIF} +{$ENDIF} + +//======================================================================== +// This is a small test application for GLFW. +// The program opens a window (640x480), and renders a spinning colored +// triangle (it is controlled with both the GLFW timer and the mouse). It +// also calculates the rendering speed (FPS), which is displayed in the +// window title bar. +// +// Delphi conversion by Jarrod Davis (http://ww.jdsgames.com) +//======================================================================== + +uses + SysUtils, + gl, glu, + glfw; + +var + width, height, running, frames, x, y: Integer; + t, t0, fps: Double; + titlestr: string; + +begin + + // Initialize GLFW + glfwInit; + + // Open OpenGL window + if glfwOpenWindow( 640, 480, 0,0,0,0, 0,0, GLFW_WINDOW ) <> 1 then + begin + glfwTerminate; + Exit; + end; + + // Enable sticky keys + glfwEnable( GLFW_STICKY_KEYS ); + + // Disable vertical sync (on cards that support it) + glfwSwapInterval( 0 ); + + // Main loop + running := 1; + frames := 0; + t0 := glfwGetTime; + while running <> 0 do + begin + // Get time and mouse position + t := glfwGetTime; + glfwGetMousePos(x, y ); + + // Calculate and display FPS (frames per second) + if ((t-t0) > 1.0) or (frames = 0) then + begin + fps := frames / (t-t0); + titlestr := Format('Spinning Triangle (%.1f FPS)', [fps]); + glfwSetWindowTitle( PChar(titlestr) ); + t0 := t; + frames := 0; + end; + inc(frames); + + // Get window size (may be different than the requested size) + glfwGetWindowSize( width, height ); + if height < 1 then height := 1; + + // Set viewport + glViewport( 0, 0, width, height ); + + // Clear color buffer + glClearColor( 0.0, 0.0, 0.0, 0.0 ); + glClear( GL_COLOR_BUFFER_BIT ); + + // Select and setup the projection matrix + glMatrixMode( GL_PROJECTION ); + glLoadIdentity; + gluPerspective( 65.0, width/height, 1.0, 100.0 ); + + // Select and setup the modelview matrix + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity; + gluLookAt( 0.0, 1.0, 0.0, // Eye-position + 0.0, 20.0, 0.0, // View-point + 0.0, 0.0, 1.0 ); // Up-vector + + // Draw a rotating colorful triangle + glTranslatef( 0.0, 14.0, 0.0 ); + glRotatef( 0.3*x + t*100.0, 0.0, 0.0, 1.0 ); + glBegin( GL_TRIANGLES ); + glColor3f( 1.0, 0.0, 0.0 ); + glVertex3f( -5.0, 0.0, -4.0 ); + glColor3f( 0.0, 1.0, 0.0 ); + glVertex3f( 5.0, 0.0, -4.0 ); + glColor3f( 0.0, 0.0, 1.0 ); + glVertex3f( 0.0, 0.0, 6.0 ); + glEnd; + + // Swap buffers + glfwSwapBuffers; + + // Check if the ESC key was pressed or the window was closed + running := (not glfwGetKey( GLFW_KEY_ESC )) and + glfwGetWindowParam( GLFW_OPENED ); + end; + + // Close OpenGL window and terminate GLFW + glfwTerminate; + +end. diff -Nru glfw-2.6/support/visualbasic/bindings/glfw.bas glfw-2.7.2/support/visualbasic/bindings/glfw.bas --- glfw-2.6/support/visualbasic/bindings/glfw.bas 2007-05-25 09:56:38.000000000 +0000 +++ glfw-2.7.2/support/visualbasic/bindings/glfw.bas 1970-01-01 00:00:00.000000000 +0000 @@ -1,320 +0,0 @@ -Attribute VB_Name = "GLFW" -'======================================================================== -' GLFW - An OpenGL framework -' File: glfw.bas -' Platform: Visual Basic/Windows -' API version: 2.5 -' WWW: http://glfw.sourceforge.net -'------------------------------------------------------------------------ -' Copyright (c) 2002-2005 Camilla Berglund -' -' 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. -' -'======================================================================== - -'======================================================================== -' GLFW version -'======================================================================== - -Public Const GLFW_VERSION_MAJOR = 2 -Public Const GLFW_VERSION_MINOR = 5 -Public Const GLFW_VERSION_REVISION = 0 - - -'======================================================================== -' Input handling definitions -'======================================================================== - -' Key and button state/action definitions -Public Const GLFW_RELEASE = 0 -Public Const GLFW_PRESS = 1 - -' Keyboard key definitions: 8-bit ISO-8859-1 (Latin 1) encoding is used -' for printable keys (such as A-Z, 0-9 etc), and values above 256 -' represent special (non-printable) keys (e.g. F1, Page Up etc). -Public Const GLFW_KEY_UNKNOWN = -1 -Public Const GLFW_KEY_SPACE = 32 -Public Const GLFW_KEY_SPECIAL = 256 -Public Const GLFW_KEY_ESC = (GLFW_KEY_SPECIAL + 1) -Public Const GLFW_KEY_F1 = (GLFW_KEY_SPECIAL + 2) -Public Const GLFW_KEY_F2 = (GLFW_KEY_SPECIAL + 3) -Public Const GLFW_KEY_F3 = (GLFW_KEY_SPECIAL + 4) -Public Const GLFW_KEY_F4 = (GLFW_KEY_SPECIAL + 5) -Public Const GLFW_KEY_F5 = (GLFW_KEY_SPECIAL + 6) -Public Const GLFW_KEY_F6 = (GLFW_KEY_SPECIAL + 7) -Public Const GLFW_KEY_F7 = (GLFW_KEY_SPECIAL + 8) -Public Const GLFW_KEY_F8 = (GLFW_KEY_SPECIAL + 9) -Public Const GLFW_KEY_F9 = (GLFW_KEY_SPECIAL + 10) -Public Const GLFW_KEY_F10 = (GLFW_KEY_SPECIAL + 11) -Public Const GLFW_KEY_F11 = (GLFW_KEY_SPECIAL + 12) -Public Const GLFW_KEY_F12 = (GLFW_KEY_SPECIAL + 13) -Public Const GLFW_KEY_F13 = (GLFW_KEY_SPECIAL + 14) -Public Const GLFW_KEY_F14 = (GLFW_KEY_SPECIAL + 15) -Public Const GLFW_KEY_F15 = (GLFW_KEY_SPECIAL + 16) -Public Const GLFW_KEY_F16 = (GLFW_KEY_SPECIAL + 17) -Public Const GLFW_KEY_F17 = (GLFW_KEY_SPECIAL + 18) -Public Const GLFW_KEY_F18 = (GLFW_KEY_SPECIAL + 19) -Public Const GLFW_KEY_F19 = (GLFW_KEY_SPECIAL + 20) -Public Const GLFW_KEY_F20 = (GLFW_KEY_SPECIAL + 21) -Public Const GLFW_KEY_F21 = (GLFW_KEY_SPECIAL + 22) -Public Const GLFW_KEY_F22 = (GLFW_KEY_SPECIAL + 23) -Public Const GLFW_KEY_F23 = (GLFW_KEY_SPECIAL + 24) -Public Const GLFW_KEY_F24 = (GLFW_KEY_SPECIAL + 25) -Public Const GLFW_KEY_F25 = (GLFW_KEY_SPECIAL + 26) -Public Const GLFW_KEY_UP = (GLFW_KEY_SPECIAL + 27) -Public Const GLFW_KEY_DOWN = (GLFW_KEY_SPECIAL + 28) -Public Const GLFW_KEY_LEFT = (GLFW_KEY_SPECIAL + 29) -Public Const GLFW_KEY_RIGHT = (GLFW_KEY_SPECIAL + 30) -Public Const GLFW_KEY_LSHIFT = (GLFW_KEY_SPECIAL + 31) -Public Const GLFW_KEY_RSHIFT = (GLFW_KEY_SPECIAL + 32) -Public Const GLFW_KEY_LCTRL = (GLFW_KEY_SPECIAL + 33) -Public Const GLFW_KEY_RCTRL = (GLFW_KEY_SPECIAL + 34) -Public Const GLFW_KEY_LALT = (GLFW_KEY_SPECIAL + 35) -Public Const GLFW_KEY_RALT = (GLFW_KEY_SPECIAL + 36) -Public Const GLFW_KEY_TAB = (GLFW_KEY_SPECIAL + 37) -Public Const GLFW_KEY_ENTER = (GLFW_KEY_SPECIAL + 38) -Public Const GLFW_KEY_BACKSPACE = (GLFW_KEY_SPECIAL + 39) -Public Const GLFW_KEY_INSERT = (GLFW_KEY_SPECIAL + 40) -Public Const GLFW_KEY_DEL = (GLFW_KEY_SPECIAL + 41) -Public Const GLFW_KEY_PAGEUP = (GLFW_KEY_SPECIAL + 42) -Public Const GLFW_KEY_PAGEDOWN = (GLFW_KEY_SPECIAL + 43) -Public Const GLFW_KEY_HOME = (GLFW_KEY_SPECIAL + 44) -Public Const GLFW_KEY_END = (GLFW_KEY_SPECIAL + 45) -Public Const GLFW_KEY_KP_0 = (GLFW_KEY_SPECIAL + 46) -Public Const GLFW_KEY_KP_1 = (GLFW_KEY_SPECIAL + 47) -Public Const GLFW_KEY_KP_2 = (GLFW_KEY_SPECIAL + 48) -Public Const GLFW_KEY_KP_3 = (GLFW_KEY_SPECIAL + 49) -Public Const GLFW_KEY_KP_4 = (GLFW_KEY_SPECIAL + 50) -Public Const GLFW_KEY_KP_5 = (GLFW_KEY_SPECIAL + 51) -Public Const GLFW_KEY_KP_6 = (GLFW_KEY_SPECIAL + 52) -Public Const GLFW_KEY_KP_7 = (GLFW_KEY_SPECIAL + 53) -Public Const GLFW_KEY_KP_8 = (GLFW_KEY_SPECIAL + 54) -Public Const GLFW_KEY_KP_9 = (GLFW_KEY_SPECIAL + 55) -Public Const GLFW_KEY_KP_DIVIDE = (GLFW_KEY_SPECIAL + 56) -Public Const GLFW_KEY_KP_MULTIPLY = (GLFW_KEY_SPECIAL + 57) -Public Const GLFW_KEY_KP_SUBTRACT = (GLFW_KEY_SPECIAL + 58) -Public Const GLFW_KEY_KP_ADD = (GLFW_KEY_SPECIAL + 59) -Public Const GLFW_KEY_KP_DECIMAL = (GLFW_KEY_SPECIAL + 60) -Public Const GLFW_KEY_KP_EQUAL = (GLFW_KEY_SPECIAL + 61) -Public Const GLFW_KEY_KP_ENTER = (GLFW_KEY_SPECIAL + 62) -Public Const GLFW_KEY_LAST = GLFW_KEY_KP_ENTER - -' Mouse button definitions -Public Const GLFW_MOUSE_BUTTON_1 = 0 -Public Const GLFW_MOUSE_BUTTON_2 = 1 -Public Const GLFW_MOUSE_BUTTON_3 = 2 -Public Const GLFW_MOUSE_BUTTON_4 = 3 -Public Const GLFW_MOUSE_BUTTON_5 = 4 -Public Const GLFW_MOUSE_BUTTON_6 = 5 -Public Const GLFW_MOUSE_BUTTON_7 = 6 -Public Const GLFW_MOUSE_BUTTON_8 = 7 -Public Const GLFW_MOUSE_BUTTON_LAST = GLFW_MOUSE_BUTTON_8 - -' Mouse button aliases -Public Const GLFW_MOUSE_BUTTON_LEFT = GLFW_MOUSE_BUTTON_1 -Public Const GLFW_MOUSE_BUTTON_RIGHT = GLFW_MOUSE_BUTTON_2 -Public Const GLFW_MOUSE_BUTTON_MIDDLE = GLFW_MOUSE_BUTTON_3 - -' Joystick identifiers -Public Const GLFW_JOYSTICK_1 = 0 -Public Const GLFW_JOYSTICK_2 = 1 -Public Const GLFW_JOYSTICK_3 = 2 -Public Const GLFW_JOYSTICK_4 = 3 -Public Const GLFW_JOYSTICK_5 = 4 -Public Const GLFW_JOYSTICK_6 = 5 -Public Const GLFW_JOYSTICK_7 = 6 -Public Const GLFW_JOYSTICK_8 = 7 -Public Const GLFW_JOYSTICK_9 = 8 -Public Const GLFW_JOYSTICK_10 = 9 -Public Const GLFW_JOYSTICK_11 = 10 -Public Const GLFW_JOYSTICK_12 = 11 -Public Const GLFW_JOYSTICK_13 = 12 -Public Const GLFW_JOYSTICK_14 = 13 -Public Const GLFW_JOYSTICK_15 = 14 -Public Const GLFW_JOYSTICK_16 = 15 -Public Const GLFW_JOYSTICK_LAST = GLFW_JOYSTICK_16 - - -'======================================================================== -' Other definitions -'======================================================================== - -' glfwOpenWindow modes -Public Const GLFW_WINDOW = &H10001 -Public Const GLFW_FULLSCREEN = &H10002 - -' glfwGetWindowParam tokens -Public Const GLFW_OPENED = &H20001 -Public Const GLFW_ACTIVE = &H20002 -Public Const GLFW_ICONIFIED = &H20003 -Public Const GLFW_ACCELERATED = &H20004 -Public Const GLFW_RED_BITS = &H20005 -Public Const GLFW_GREEN_BITS = &H20006 -Public Const GLFW_BLUE_BITS = &H20007 -Public Const GLFW_ALPHA_BITS = &H20008 -Public Const GLFW_DEPTH_BITS = &H20009 -Public Const GLFW_STENCIL_BITS = &H2000A - -' The following constants are used for both glfwGetWindowParam -' and glfwOpenWindowHint -Public Const GLFW_REFRESH_RATE = &H2000B -Public Const GLFW_ACCUM_RED_BITS = &H2000C -Public Const GLFW_ACCUM_GREEN_BITS = &H2000D -Public Const GLFW_ACCUM_BLUE_BITS = &H2000E -Public Const GLFW_ACCUM_ALPHA_BITS = &H2000F -Public Const GLFW_AUX_BUFFERS = &H20010 -Public Const GLFW_STEREO = &H20011 - -' glfwEnable/glfwDisable tokens -Public Const GLFW_MOUSE_CURSOR = &H30001 -Public Const GLFW_STICKY_KEYS = &H30002 -Public Const GLFW_STICKY_MOUSE_BUTTONS = &H30003 -Public Const GLFW_SYSTEM_KEYS = &H30004 -Public Const GLFW_KEY_REPEAT = &H30005 -Public Const GLFW_AUTO_POLL_EVENTS = &H30006 - -' glfwWaitThread wait modes -Public Const GLFW_WAIT = &H40001 -Public Const GLFW_NOWAIT = &H40002 - -' glfwGetJoystickParam tokens -Public Const GLFW_PRESENT = &H50001 -Public Const GLFW_AXES = &H50002 -Public Const GLFW_BUTTONS = &H50003 - -' glfwReadImage/glfwLoadTexture2D flags -Public Const GLFW_NO_RESCALE_BIT = &H1 -Public Const GLFW_ORIGIN_UL_BIT = &H2 -Public Const GLFW_BUILD_MIPMAPS_BIT = &H4 -Public Const GLFW_ALPHA_MAP_BIT = &H8 - -' Time spans longer than this (seconds) are considered to be infinity -Public Const GLFW_INFINITY = 100000# - - -'======================================================================== -' Typedefs -'======================================================================== - -' The video mode structure used by glfwGetVideoModes() -Public Type GLFWvidmode - width As Long - height As Long - redbits As Long - greenbits As Long - bluebits As Long -End Type - - -' Image/texture information -Public Type GLFWimage - width As Long - height As Long - format As Long - BytesPerPixel As Long - data() As Byte -End Type - - - -'======================================================================== -' Prototypes -'======================================================================== - -' GLFW initialization, termination and version querying -Public Declare Function glfwInit Lib "glfw.dll" () As Long -Public Declare Sub glfwTerminate Lib "glfw.dll" () -Public Declare Sub glfwGetVersion Lib "glfw.dll" (major As Long, minor As Long, rev As Long) - -' Window handling -Public Declare Function glfwOpenWindow Lib "glfw.dll" (ByVal width As Long, ByVal height As Long, ByVal redbits As Long, ByVal greenbits As Long, ByVal bluebits As Long, ByVal alphabits As Long, ByVal depthbits As Long, ByVal stencilbits As Long, ByVal mode As Long) As Long -Public Declare Sub glfwOpenWindowHint Lib "glfw.dll" (ByVal target As Long, ByVal hint As Long) -Public Declare Sub glfwCloseWindow Lib "glfw.dll" () -Public Declare Sub glfwSetWindowTitle Lib "glfw.dll" (ByVal title As String) -Public Declare Sub glfwGetWindowSize Lib "glfw.dll" (width As Long, height As Long) -Public Declare Sub glfwSetWindowSize Lib "glfw.dll" (ByVal width As Long, ByVal height As Long) -Public Declare Sub glfwSetWindowPos Lib "glfw.dll" (ByVal x As Long, ByVal y As Long) -Public Declare Sub glfwIconifyWindow Lib "glfw.dll" () -Public Declare Sub glfwUnIconifyWindow Lib "glfw.dll" () -Public Declare Sub glfwSwapBuffers Lib "glfw.dll" () -Public Declare Sub glfwSwapInterval Lib "glfw.dll" (ByVal interval As Long) -Public Declare Function glfwGetWindowParam Lib "glfw.dll" (ByVal param As Long) As Long -Public Declare Sub glfwSetWindowSizeCallback Lib "glfw.dll" (ByVal cbfun As Long) -Public Declare Sub glfwSetWindowCloseCallback Lib "glfw.dll" (ByVal cbfun As Long) -Public Declare Sub glfwSetWindowRefreshCallback Lib "glfw.dll" (ByVal cbfun As Long) - -' Video mode functions -Public Declare Function glfwGetVideoModes Lib "glfw.dll" (list() As GLFWvidmode, ByVal maxcount As Long) As Long -Public Declare Sub glfwGetDesktopMode Lib "glfw.dll" (mode As GLFWvidmode) - -' Input handling -Public Declare Sub glfwPollEvents Lib "glfw.dll" () -Public Declare Sub glfwWaitEvents Lib "glfw.dll" () -Public Declare Function glfwGetKey Lib "glfw.dll" (ByVal key As Long) As Long -Public Declare Function glfwGetMouseButton Lib "glfw.dll" (ByVal button As Long) As Long -Public Declare Sub glfwGetMousePos Lib "glfw.dll" (xpos As Long, ypos As Long) -Public Declare Sub glfwSetMousePos Lib "glfw.dll" (ByVal xpos As Long, ByVal ypos As Long) -Public Declare Function glfwGetMouseWheel Lib "glfw.dll" () As Long -Public Declare Sub glfwSetMouseWheel Lib "glfw.dll" (ByVal pos As Long) -Public Declare Sub glfwSetKeyCallback Lib "glfw.dll" (ByVal cbfun As Long) -Public Declare Sub glfwSetCharCallback Lib "glfw.dll" (ByVal cbfun As Long) -Public Declare Sub glfwSetMouseButtonCallback Lib "glfw.dll" (ByVal cbfun As Long) -Public Declare Sub glfwSetMousePosCallback Lib "glfw.dll" (ByVal cbfun As Long) -Public Declare Sub glfwSetMouseWheelCallback Lib "glfw.dll" (ByVal cbfun As Long) - -' Joystick input -Public Declare Function glfwGetJoystickParam Lib "glfw.dll" (ByVal joy As Long, ByVal param As Long) As Long -Public Declare Function glfwGetJoystickPos Lib "glfw.dll" (ByVal joy As Long, pos As Single, ByVal numaxes As Long) As Long -Public Declare Function glfwGetJoystickButtons Lib "glfw.dll" (ByVal joy As Long, buttons As Byte, ByVal numbuttons As Long) As Long - -' Time -Public Declare Function glfwGetTime Lib "glfw.dll" () As Double -Public Declare Sub glfwSetTime Lib "glfw.dll" (ByVal time As Double) -Public Declare Sub glfwSleep Lib "glfw.dll" (ByVal time As Double) - -' Extension support -Public Declare Function glfwExtensionSupported Lib "glfw.dll" (ByVal extension As String) As Long -Public Declare Function glfwGetProcAddress Lib "glfw.dll" (ByVal procname As String) As Long -Public Declare Sub glfwGetGLVersion Lib "glfw.dll" (major As Long, minor As Long, rev As Long) - -' Threading support -Public Declare Function glfwCreateThread Lib "glfw.dll" (ByVal cbfun As Long, ByVal arg As Long) As Long -Public Declare Sub glfwDestroyThread Lib "glfw.dll" (ByVal id As Long) -Public Declare Function glfwWaitThread Lib "glfw.dll" (ByVal id As Long, ByVal waitmode As Long) As Long -Public Declare Function glfwGetThreadID Lib "glfw.dll" () As Long -Public Declare Function glfwCreateMutex Lib "glfw.dll" () As Long -Public Declare Sub glfwDestroyMutex Lib "glfw.dll" (ByVal mutex As Long) -Public Declare Sub glfwLockMutex Lib "glfw.dll" (ByVal mutex As Long) -Public Declare Sub glfwUnlockMutex Lib "glfw.dll" (ByVal mutex As Long) -Public Declare Function glfwCreateCond Lib "glfw.dll" () As Long -Public Declare Sub glfwDestroyCond Lib "glfw.dll" (ByVal cond As Long) -Public Declare Sub glfwWaitCond Lib "glfw.dll" (ByVal cond As Long, ByVal mutex As Long, ByVal timeout As Double) -Public Declare Sub glfwSignalCond Lib "glfw.dll" (ByVal cond As Long) -Public Declare Sub glfwBroadcastCond Lib "glfw.dll" (ByVal cond As Long) -Public Declare Function glfwGetNumberOfProcessors Lib "glfw.dll" () As Long - -' Enable/disable functions -Public Declare Sub glfwEnable Lib "glfw.dll" (ByVal token As Long) -Public Declare Sub glfwDisable Lib "glfw.dll" (ByVal token As Long) - -' Image/texture I/O support -Public Declare Function glfwReadImage Lib "glfw.dll" (ByVal name As String, img As GLFWimage, ByVal flags As Long) As Long -Public Declare Sub glfwFreeImage Lib "glfw.dll" (img As GLFWimage) -Public Declare Function glfwLoadTexture2D Lib "glfw.dll" (ByVal name As String, ByVal flags As Long) As Long diff -Nru glfw-2.6/support/visualbasic/bindings/glu32.bas glfw-2.7.2/support/visualbasic/bindings/glu32.bas --- glfw-2.6/support/visualbasic/bindings/glu32.bas 2007-05-25 09:56:38.000000000 +0000 +++ glfw-2.7.2/support/visualbasic/bindings/glu32.bas 1970-01-01 00:00:00.000000000 +0000 @@ -1,284 +0,0 @@ -Attribute VB_Name = "GLU" - -'************************************************************************* -'* GLU 1.3 (glu32.dll) bindings for Visual Basic -'* Copyright (c) 2002 Camilla Berglund -'* -'* This file was converted from the MinGW32 GL/glu.h include file (using a -'* custom C parser / Visual Basic writer), which in turn is based on the -'* SGI OpenGL sample implementation glu.h include file. -'************************************************************************* - - -'************************************************************************* -'* This bindings file is for GLU 1.3 -'************************************************************************* - -Public Const GLU_VERSION_1_1 = 1 -Public Const GLU_VERSION_1_2 = 1 -Public Const GLU_VERSION_1_3 = 1 - - - -'************************************************************************* -'* Constants -'************************************************************************* - -' Extensions -Public Const GLU_EXT_object_space_tess = 1 -Public Const GLU_EXT_nurbs_tessellator = 1 - -' Boolean -Public Const GLU_FALSE = 0 -Public Const GLU_TRUE = 1 - -' StringName -Public Const GLU_VERSION = 100800 -Public Const GLU_EXTENSIONS = 100801 - -' ErrorCode -Public Const GLU_INVALID_ENUM = 100900 -Public Const GLU_INVALID_VALUE = 100901 -Public Const GLU_OUT_OF_MEMORY = 100902 -Public Const GLU_INVALID_OPERATION = 100904 - -' NurbsDisplay -' Public Const GLU_FILL = 100012 -Public Const GLU_OUTLINE_POLYGON = 100240 -Public Const GLU_OUTLINE_PATCH = 100241 - -' NurbsCallback -Public Const GLU_NURBS_ERROR = 100103 -Public Const GLU_ERROR = 100103 -Public Const GLU_NURBS_BEGIN = 100164 -Public Const GLU_NURBS_BEGIN_EXT = 100164 -Public Const GLU_NURBS_VERTEX = 100165 -Public Const GLU_NURBS_VERTEX_EXT = 100165 -Public Const GLU_NURBS_NORMAL = 100166 -Public Const GLU_NURBS_NORMAL_EXT = 100166 -Public Const GLU_NURBS_COLOR = 100167 -Public Const GLU_NURBS_COLOR_EXT = 100167 -Public Const GLU_NURBS_TEXTURE_COORD = 100168 -Public Const GLU_NURBS_TEX_COORD_EXT = 100168 -Public Const GLU_NURBS_END = 100169 -Public Const GLU_NURBS_END_EXT = 100169 -Public Const GLU_NURBS_BEGIN_DATA = 100170 -Public Const GLU_NURBS_BEGIN_DATA_EXT = 100170 -Public Const GLU_NURBS_VERTEX_DATA = 100171 -Public Const GLU_NURBS_VERTEX_DATA_EXT = 100171 -Public Const GLU_NURBS_NORMAL_DATA = 100172 -Public Const GLU_NURBS_NORMAL_DATA_EXT = 100172 -Public Const GLU_NURBS_COLOR_DATA = 100173 -Public Const GLU_NURBS_COLOR_DATA_EXT = 100173 -Public Const GLU_NURBS_TEXTURE_COORD_DATA = 100174 -Public Const GLU_NURBS_TEX_COORD_DATA_EXT = 100174 -Public Const GLU_NURBS_END_DATA = 100175 -Public Const GLU_NURBS_END_DATA_EXT = 100175 - -' NurbsError -Public Const GLU_NURBS_ERROR1 = 100251 -Public Const GLU_NURBS_ERROR2 = 100252 -Public Const GLU_NURBS_ERROR3 = 100253 -Public Const GLU_NURBS_ERROR4 = 100254 -Public Const GLU_NURBS_ERROR5 = 100255 -Public Const GLU_NURBS_ERROR6 = 100256 -Public Const GLU_NURBS_ERROR7 = 100257 -Public Const GLU_NURBS_ERROR8 = 100258 -Public Const GLU_NURBS_ERROR9 = 100259 -Public Const GLU_NURBS_ERROR10 = 100260 -Public Const GLU_NURBS_ERROR11 = 100261 -Public Const GLU_NURBS_ERROR12 = 100262 -Public Const GLU_NURBS_ERROR13 = 100263 -Public Const GLU_NURBS_ERROR14 = 100264 -Public Const GLU_NURBS_ERROR15 = 100265 -Public Const GLU_NURBS_ERROR16 = 100266 -Public Const GLU_NURBS_ERROR17 = 100267 -Public Const GLU_NURBS_ERROR18 = 100268 -Public Const GLU_NURBS_ERROR19 = 100269 -Public Const GLU_NURBS_ERROR20 = 100270 -Public Const GLU_NURBS_ERROR21 = 100271 -Public Const GLU_NURBS_ERROR22 = 100272 -Public Const GLU_NURBS_ERROR23 = 100273 -Public Const GLU_NURBS_ERROR24 = 100274 -Public Const GLU_NURBS_ERROR25 = 100275 -Public Const GLU_NURBS_ERROR26 = 100276 -Public Const GLU_NURBS_ERROR27 = 100277 -Public Const GLU_NURBS_ERROR28 = 100278 -Public Const GLU_NURBS_ERROR29 = 100279 -Public Const GLU_NURBS_ERROR30 = 100280 -Public Const GLU_NURBS_ERROR31 = 100281 -Public Const GLU_NURBS_ERROR32 = 100282 -Public Const GLU_NURBS_ERROR33 = 100283 -Public Const GLU_NURBS_ERROR34 = 100284 -Public Const GLU_NURBS_ERROR35 = 100285 -Public Const GLU_NURBS_ERROR36 = 100286 -Public Const GLU_NURBS_ERROR37 = 100287 - -' NurbsProperty -Public Const GLU_AUTO_LOAD_MATRIX = 100200 -Public Const GLU_CULLING = 100201 -Public Const GLU_SAMPLING_TOLERANCE = 100203 -Public Const GLU_DISPLAY_MODE = 100204 -Public Const GLU_PARAMETRIC_TOLERANCE = 100202 -Public Const GLU_SAMPLING_METHOD = 100205 -Public Const GLU_U_STEP = 100206 -Public Const GLU_V_STEP = 100207 -Public Const GLU_NURBS_MODE = 100160 -Public Const GLU_NURBS_MODE_EXT = 100160 -Public Const GLU_NURBS_TESSELLATOR = 100161 -Public Const GLU_NURBS_TESSELLATOR_EXT = 100161 -Public Const GLU_NURBS_RENDERER = 100162 -Public Const GLU_NURBS_RENDERER_EXT = 100162 - -' NurbsSampling -Public Const GLU_OBJECT_PARAMETRIC_ERROR = 100208 -Public Const GLU_OBJECT_PARAMETRIC_ERROR_EXT = 100208 -Public Const GLU_OBJECT_PATH_LENGTH = 100209 -Public Const GLU_OBJECT_PATH_LENGTH_EXT = 100209 -Public Const GLU_PATH_LENGTH = 100215 -Public Const GLU_PARAMETRIC_ERROR = 100216 -Public Const GLU_DOMAIN_DISTANCE = 100217 - -' NurbsTrim -Public Const GLU_MAP1_TRIM_2 = 100210 -Public Const GLU_MAP1_TRIM_3 = 100211 - -' QuadricDrawStyle -Public Const GLU_POINT = 100010 -Public Const GLU_LINE = 100011 -Public Const GLU_FILL = 100012 -Public Const GLU_SILHOUETTE = 100013 - -' QuadricCallback -' Public Const GLU_ERROR = 100103 - -' QuadricNormal -Public Const GLU_SMOOTH = 100000 -Public Const GLU_FLAT = 100001 -Public Const GLU_NONE = 100002 - -' QuadricOrientation -Public Const GLU_OUTSIDE = 100020 -Public Const GLU_INSIDE = 100021 - -' TessCallback -Public Const GLU_TESS_BEGIN = 100100 -Public Const GLU_BEGIN = 100100 -Public Const GLU_TESS_VERTEX = 100101 -Public Const GLU_VERTEX = 100101 -Public Const GLU_TESS_END = 100102 -Public Const GLU_END = 100102 -Public Const GLU_TESS_ERROR = 100103 -Public Const GLU_TESS_EDGE_FLAG = 100104 -Public Const GLU_EDGE_FLAG = 100104 -Public Const GLU_TESS_COMBINE = 100105 -Public Const GLU_TESS_BEGIN_DATA = 100106 -Public Const GLU_TESS_VERTEX_DATA = 100107 -Public Const GLU_TESS_END_DATA = 100108 -Public Const GLU_TESS_ERROR_DATA = 100109 -Public Const GLU_TESS_EDGE_FLAG_DATA = 100110 -Public Const GLU_TESS_COMBINE_DATA = 100111 - -' TessContour -Public Const GLU_CW = 100120 -Public Const GLU_CCW = 100121 -Public Const GLU_INTERIOR = 100122 -Public Const GLU_EXTERIOR = 100123 -Public Const GLU_UNKNOWN = 100124 - -' TessProperty -Public Const GLU_TESS_WINDING_RULE = 100140 -Public Const GLU_TESS_BOUNDARY_ONLY = 100141 -Public Const GLU_TESS_TOLERANCE = 100142 - -' TessError -Public Const GLU_TESS_ERROR1 = 100151 -Public Const GLU_TESS_ERROR2 = 100152 -Public Const GLU_TESS_ERROR3 = 100153 -Public Const GLU_TESS_ERROR4 = 100154 -Public Const GLU_TESS_ERROR5 = 100155 -Public Const GLU_TESS_ERROR6 = 100156 -Public Const GLU_TESS_ERROR7 = 100157 -Public Const GLU_TESS_ERROR8 = 100158 -Public Const GLU_TESS_MISSING_BEGIN_POLYGON = 100151 -Public Const GLU_TESS_MISSING_BEGIN_CONTOUR = 100152 -Public Const GLU_TESS_MISSING_END_POLYGON = 100153 -Public Const GLU_TESS_MISSING_END_CONTOUR = 100154 -Public Const GLU_TESS_COORD_TOO_LARGE = 100155 -Public Const GLU_TESS_NEED_COMBINE_CALLBACK = 100156 - -' TessWinding -Public Const GLU_TESS_WINDING_ODD = 100130 -Public Const GLU_TESS_WINDING_NONZERO = 100131 -Public Const GLU_TESS_WINDING_POSITIVE = 100132 -Public Const GLU_TESS_WINDING_NEGATIVE = 100133 -Public Const GLU_TESS_WINDING_ABS_GEQ_TWO = 100134 - -' Tesselation (misc) -Public Const GLU_TESS_MAX_COORD = 1E+150 - - - -'************************************************************************* -'* Function Definitions -'************************************************************************* - -Public Declare Sub gluBeginCurve Lib "glu32.dll" (nurb As Any) -Public Declare Sub gluBeginPolygon Lib "glu32.dll" (tess As Any) -Public Declare Sub gluBeginSurface Lib "glu32.dll" (nurb As Any) -Public Declare Sub gluBeginTrim Lib "glu32.dll" (nurb As Any) -Public Declare Function gluBuild1DMipmapLevels Lib "glu32.dll" (ByVal target As Long, ByVal internalFormat As Long, ByVal width As Long, ByVal format As Long, ByVal typ As Long, ByVal level As Long, ByVal base As Long, ByVal max As Long, data As Any) As Long -Public Declare Function gluBuild1DMipmaps Lib "glu32.dll" (ByVal target As Long, ByVal internalFormat As Long, ByVal width As Long, ByVal format As Long, ByVal typ As Long, data As Any) As Long -Public Declare Function gluBuild2DMipmapLevels Lib "glu32.dll" (ByVal target As Long, ByVal internalFormat As Long, ByVal width As Long, ByVal height As Long, ByVal format As Long, ByVal typ As Long, ByVal level As Long, ByVal base As Long, ByVal max As Long, data As Any) As Long -Public Declare Function gluBuild2DMipmaps Lib "glu32.dll" (ByVal target As Long, ByVal internalFormat As Long, ByVal width As Long, ByVal height As Long, ByVal format As Long, ByVal typ As Long, data As Any) As Long -Public Declare Function gluBuild3DMipmapLevels Lib "glu32.dll" (ByVal target As Long, ByVal internalFormat As Long, ByVal width As Long, ByVal height As Long, ByVal depth As Long, ByVal format As Long, ByVal typ As Long, ByVal level As Long, ByVal base As Long, ByVal max As Long, data As Any) As Long -Public Declare Function gluBuild3DMipmaps Lib "glu32.dll" (ByVal target As Long, ByVal internalFormat As Long, ByVal width As Long, ByVal height As Long, ByVal depth As Long, ByVal format As Long, ByVal typ As Long, data As Any) As Long -Public Declare Function gluCheckExtension Lib "glu32.dll" (extName As Byte, extString As Byte) As Byte -Public Declare Sub gluCylinder Lib "glu32.dll" (quad As Any, ByVal base As Double, ByVal top As Double, ByVal height As Double, ByVal slices As Long, ByVal stacks As Long) -Public Declare Sub gluDeleteNurbsRenderer Lib "glu32.dll" (nurb As Any) -Public Declare Sub gluDeleteQuadric Lib "glu32.dll" (quad As Any) -Public Declare Sub gluDeleteTess Lib "glu32.dll" (tess As Any) -Public Declare Sub gluDisk Lib "glu32.dll" (quad As Any, ByVal inner As Double, ByVal outer As Double, ByVal slices As Long, ByVal loops As Long) -Public Declare Sub gluEndCurve Lib "glu32.dll" (nurb As Any) -Public Declare Sub gluEndPolygon Lib "glu32.dll" (tess As Any) -Public Declare Sub gluEndSurface Lib "glu32.dll" (nurb As Any) -Public Declare Sub gluEndTrim Lib "glu32.dll" (nurb As Any) -Public Declare Function gluErrorString Lib "glu32.dll" (ByVal error As Long) As String -Public Declare Sub gluGetNurbsProperty Lib "glu32.dll" (nurb As Any, ByVal property As Long, data As Single) -Public Declare Function gluGetString Lib "glu32.dll" (ByVal name As Long) As String -Public Declare Sub gluGetTessProperty Lib "glu32.dll" (tess As Any, ByVal which As Long, data As Double) -Public Declare Sub gluLoadSamplingMatrices Lib "glu32.dll" (nurb As Any, model As Single, perspective As Single, view As Long) -Public Declare Sub gluLookAt Lib "glu32.dll" (ByVal eyeX As Double, ByVal eyeY As Double, ByVal eyeZ As Double, ByVal centerX As Double, ByVal centerY As Double, ByVal centerZ As Double, ByVal upX As Double, ByVal upY As Double, ByVal upZ As Double) -Public Declare Function gluNewNurbsRenderer Lib "glu32.dll" () As Long -Public Declare Function gluNewQuadric Lib "glu32.dll" () As Long -Public Declare Function gluNewTess Lib "glu32.dll" () As Long -Public Declare Sub gluNextContour Lib "glu32.dll" (tess As Any, ByVal typ As Long) -Public Declare Sub gluNurbsCallback Lib "glu32.dll" (nurb As Any, ByVal which As Long, ByVal CallBackFunc As Any) -Public Declare Sub gluNurbsCallbackData Lib "glu32.dll" (nurb As Any, userData As Any) -Public Declare Sub gluNurbsCallbackDataEXT Lib "glu32.dll" (nurb As Any, userData As Any) -Public Declare Sub gluNurbsCurve Lib "glu32.dll" (nurb As Any, ByVal knotCount As Long, knots As Single, ByVal stride As Long, control As Single, ByVal order As Long, ByVal typ As Long) -Public Declare Sub gluNurbsProperty Lib "glu32.dll" (nurb As Any, ByVal property As Long, ByVal value As Single) -Public Declare Sub gluNurbsSurface Lib "glu32.dll" (nurb As Any, ByVal sKnotCount As Long, sKnots As Single, ByVal tKnotCount As Long, tKnots As Single, ByVal sStride As Long, ByVal tStride As Long, control As Single, ByVal sOrder As Long, ByVal tOrder As Long, ByVal typ As Long) -Public Declare Sub gluOrtho2D Lib "glu32.dll" (ByVal left As Double, ByVal right As Double, ByVal bottom As Double, ByVal top As Double) -Public Declare Sub gluPartialDisk Lib "glu32.dll" (quad As Any, ByVal inner As Double, ByVal outer As Double, ByVal slices As Long, ByVal loops As Long, ByVal start As Double, ByVal sweep As Double) -Public Declare Sub gluPerspective Lib "glu32.dll" (ByVal fovy As Double, ByVal aspect As Double, ByVal zNear As Double, ByVal zFar As Double) -Public Declare Sub gluPickMatrix Lib "glu32.dll" (ByVal x As Double, ByVal y As Double, ByVal delX As Double, ByVal delY As Double, viewport As Long) -Public Declare Function gluProject Lib "glu32.dll" (ByVal objX As Double, ByVal objY As Double, ByVal objZ As Double, model As Double, proj As Double, view As Long, winX As Double, winY As Double, winZ As Double) As Long -Public Declare Sub gluPwlCurve Lib "glu32.dll" (nurb As Any, ByVal count As Long, data As Single, ByVal stride As Long, ByVal typ As Long) -Public Declare Sub gluQuadricCallback Lib "glu32.dll" (quad As Any, ByVal which As Long, ByVal CallBackFunc As Any) -Public Declare Sub gluQuadricDrawStyle Lib "glu32.dll" (quad As Any, ByVal draw As Long) -Public Declare Sub gluQuadricNormals Lib "glu32.dll" (quad As Any, ByVal normal As Long) -Public Declare Sub gluQuadricOrientation Lib "glu32.dll" (quad As Any, ByVal orientation As Long) -Public Declare Sub gluQuadricTexture Lib "glu32.dll" (quad As Any, ByVal texture As Byte) -Public Declare Function gluScaleImage Lib "glu32.dll" (ByVal format As Long, ByVal wIn As Long, ByVal hIn As Long, ByVal typeIn As Long, dataIn As Any, ByVal wOut As Long, ByVal hOut As Long, ByVal typeOut As Long, dataOut As Any) As Long -Public Declare Sub gluSphere Lib "glu32.dll" (quad As Any, ByVal radius As Double, ByVal slices As Long, ByVal stacks As Long) -Public Declare Sub gluTessBeginContour Lib "glu32.dll" (tess As Any) -Public Declare Sub gluTessBeginPolygon Lib "glu32.dll" (tess As Any, data As Any) -Public Declare Sub gluTessCallback Lib "glu32.dll" (tess As Any, ByVal which As Long, ByVal CallBackFunc As Any) -Public Declare Sub gluTessEndContour Lib "glu32.dll" (tess As Any) -Public Declare Sub gluTessEndPolygon Lib "glu32.dll" (tess As Any) -Public Declare Sub gluTessNormal Lib "glu32.dll" (tess As Any, ByVal valueX As Double, ByVal valueY As Double, ByVal valueZ As Double) -Public Declare Sub gluTessProperty Lib "glu32.dll" (tess As Any, ByVal which As Long, ByVal data As Double) -Public Declare Sub gluTessVertex Lib "glu32.dll" (tess As Any, location As Double, data As Any) -Public Declare Function gluUnProject Lib "glu32.dll" (ByVal winX As Double, ByVal winY As Double, ByVal winZ As Double, model As Double, proj As Double, view As Long, objX As Double, objY As Double, objZ As Double) As Long -Public Declare Function gluUnProject4 Lib "glu32.dll" (ByVal winX As Double, ByVal winY As Double, ByVal winZ As Double, ByVal clipW As Double, model As Double, proj As Double, view As Long, ByVal nearVal As Double, ByVal farVal As Double, objX As Double, objY As Double, objZ As Double, objW As Double) As Long diff -Nru glfw-2.6/support/visualbasic/bindings/opengl32.bas glfw-2.7.2/support/visualbasic/bindings/opengl32.bas --- glfw-2.6/support/visualbasic/bindings/opengl32.bas 2007-05-25 09:56:38.000000000 +0000 +++ glfw-2.7.2/support/visualbasic/bindings/opengl32.bas 1970-01-01 00:00:00.000000000 +0000 @@ -1,999 +0,0 @@ -Attribute VB_Name = "OpenGL" - -'************************************************************************* -'* OpenGL 1.1 (opengl32.dll) bindings for Visual Basic -'* Copyright (c) 2002 Camilla Berglund -'* -'* This file was converted from the MinGW32 GL/gl.h include file (using a -'* custom C parser / Visual Basic writer), which in turn is based on the -'* Mesa3D 4.0 gl.h include file by Brian Paul. -'************************************************************************* - - -'************************************************************************* -'* This bindings file is for OpenGL 1.1 -'************************************************************************* - -Public Const GL_VERSION_1_1 = 1 - - - -'************************************************************************* -'* Constants -'************************************************************************* - -' Boolean values -Public Const GL_FALSE = 0 -Public Const GL_TRUE = 1 - -' Data types -Public Const GL_BYTE = &H1400 -Public Const GL_UNSIGNED_BYTE = &H1401 -Public Const GL_SHORT = &H1402 -Public Const GL_UNSIGNED_SHORT = &H1403 -Public Const GL_INT = &H1404 -Public Const GL_UNSIGNED_INT = &H1405 -Public Const GL_FLOAT = &H1406 -Public Const GL_DOUBLE = &H140A -Public Const GL_2_BYTES = &H1407 -Public Const GL_3_BYTES = &H1408 -Public Const GL_4_BYTES = &H1409 - -' Primitives -Public Const GL_POINTS = &H0 -Public Const GL_LINES = &H1 -Public Const GL_LINE_LOOP = &H2 -Public Const GL_LINE_STRIP = &H3 -Public Const GL_TRIANGLES = &H4 -Public Const GL_TRIANGLE_STRIP = &H5 -Public Const GL_TRIANGLE_FAN = &H6 -Public Const GL_QUADS = &H7 -Public Const GL_QUAD_STRIP = &H8 -Public Const GL_POLYGON = &H9 - -' Vertex Arrays -Public Const GL_VERTEX_ARRAY = &H8074 -Public Const GL_NORMAL_ARRAY = &H8075 -Public Const GL_COLOR_ARRAY = &H8076 -Public Const GL_INDEX_ARRAY = &H8077 -Public Const GL_TEXTURE_COORD_ARRAY = &H8078 -Public Const GL_EDGE_FLAG_ARRAY = &H8079 -Public Const GL_VERTEX_ARRAY_SIZE = &H807A -Public Const GL_VERTEX_ARRAY_TYPE = &H807B -Public Const GL_VERTEX_ARRAY_STRIDE = &H807C -Public Const GL_NORMAL_ARRAY_TYPE = &H807E -Public Const GL_NORMAL_ARRAY_STRIDE = &H807F -Public Const GL_COLOR_ARRAY_SIZE = &H8081 -Public Const GL_COLOR_ARRAY_TYPE = &H8082 -Public Const GL_COLOR_ARRAY_STRIDE = &H8083 -Public Const GL_INDEX_ARRAY_TYPE = &H8085 -Public Const GL_INDEX_ARRAY_STRIDE = &H8086 -Public Const GL_TEXTURE_COORD_ARRAY_SIZE = &H8088 -Public Const GL_TEXTURE_COORD_ARRAY_TYPE = &H8089 -Public Const GL_TEXTURE_COORD_ARRAY_STRIDE = &H808A -Public Const GL_EDGE_FLAG_ARRAY_STRIDE = &H808C -Public Const GL_VERTEX_ARRAY_POINTER = &H808E -Public Const GL_NORMAL_ARRAY_POINTER = &H808F -Public Const GL_COLOR_ARRAY_POINTER = &H8090 -Public Const GL_INDEX_ARRAY_POINTER = &H8091 -Public Const GL_TEXTURE_COORD_ARRAY_POINTER = &H8092 -Public Const GL_EDGE_FLAG_ARRAY_POINTER = &H8093 -Public Const GL_V2F = &H2A20 -Public Const GL_V3F = &H2A21 -Public Const GL_C4UB_V2F = &H2A22 -Public Const GL_C4UB_V3F = &H2A23 -Public Const GL_C3F_V3F = &H2A24 -Public Const GL_N3F_V3F = &H2A25 -Public Const GL_C4F_N3F_V3F = &H2A26 -Public Const GL_T2F_V3F = &H2A27 -Public Const GL_T4F_V4F = &H2A28 -Public Const GL_T2F_C4UB_V3F = &H2A29 -Public Const GL_T2F_C3F_V3F = &H2A2A -Public Const GL_T2F_N3F_V3F = &H2A2B -Public Const GL_T2F_C4F_N3F_V3F = &H2A2C -Public Const GL_T4F_C4F_N3F_V4F = &H2A2D - -' Matrix Mode -Public Const GL_MATRIX_MODE = &HBA0 -Public Const GL_MODELVIEW = &H1700 -Public Const GL_PROJECTION = &H1701 -Public Const GL_TEXTURE = &H1702 - -' Points -Public Const GL_POINT_SMOOTH = &HB10 -Public Const GL_POINT_SIZE = &HB11 -Public Const GL_POINT_SIZE_GRANULARITY = &HB13 -Public Const GL_POINT_SIZE_RANGE = &HB12 - -' Lines -Public Const GL_LINE_SMOOTH = &HB20 -Public Const GL_LINE_STIPPLE = &HB24 -Public Const GL_LINE_STIPPLE_PATTERN = &HB25 -Public Const GL_LINE_STIPPLE_REPEAT = &HB26 -Public Const GL_LINE_WIDTH = &HB21 -Public Const GL_LINE_WIDTH_GRANULARITY = &HB23 -Public Const GL_LINE_WIDTH_RANGE = &HB22 - -' Polygons -Public Const GL_POINT = &H1B00 -Public Const GL_LINE = &H1B01 -Public Const GL_FILL = &H1B02 -Public Const GL_CW = &H900 -Public Const GL_CCW = &H901 -Public Const GL_FRONT = &H404 -Public Const GL_BACK = &H405 -Public Const GL_POLYGON_MODE = &HB40 -Public Const GL_POLYGON_SMOOTH = &HB41 -Public Const GL_POLYGON_STIPPLE = &HB42 -Public Const GL_EDGE_FLAG = &HB43 -Public Const GL_CULL_FACE = &HB44 -Public Const GL_CULL_FACE_MODE = &HB45 -Public Const GL_FRONT_FACE = &HB46 -Public Const GL_POLYGON_OFFSET_FACTOR = &H8038 -Public Const GL_POLYGON_OFFSET_UNITS = &H2A00 -Public Const GL_POLYGON_OFFSET_POINT = &H2A01 -Public Const GL_POLYGON_OFFSET_LINE = &H2A02 -Public Const GL_POLYGON_OFFSET_FILL = &H8037 - -' Display Lists -Public Const GL_COMPILE = &H1300 -Public Const GL_COMPILE_AND_EXECUTE = &H1301 -Public Const GL_LIST_BASE = &HB32 -Public Const GL_LIST_INDEX = &HB33 -Public Const GL_LIST_MODE = &HB30 - -' Depth buffer -Public Const GL_NEVER = &H200 -Public Const GL_LESS = &H201 -Public Const GL_EQUAL = &H202 -Public Const GL_LEQUAL = &H203 -Public Const GL_GREATER = &H204 -Public Const GL_NOTEQUAL = &H205 -Public Const GL_GEQUAL = &H206 -Public Const GL_ALWAYS = &H207 -Public Const GL_DEPTH_TEST = &HB71 -Public Const GL_DEPTH_BITS = &HD56 -Public Const GL_DEPTH_CLEAR_VALUE = &HB73 -Public Const GL_DEPTH_FUNC = &HB74 -Public Const GL_DEPTH_RANGE = &HB70 -Public Const GL_DEPTH_WRITEMASK = &HB72 -Public Const GL_DEPTH_COMPONENT = &H1902 - -' Lighting -Public Const GL_LIGHTING = &HB50 -Public Const GL_LIGHT0 = &H4000 -Public Const GL_LIGHT1 = &H4001 -Public Const GL_LIGHT2 = &H4002 -Public Const GL_LIGHT3 = &H4003 -Public Const GL_LIGHT4 = &H4004 -Public Const GL_LIGHT5 = &H4005 -Public Const GL_LIGHT6 = &H4006 -Public Const GL_LIGHT7 = &H4007 -Public Const GL_SPOT_EXPONENT = &H1205 -Public Const GL_SPOT_CUTOFF = &H1206 -Public Const GL_CONSTANT_ATTENUATION = &H1207 -Public Const GL_LINEAR_ATTENUATION = &H1208 -Public Const GL_QUADRATIC_ATTENUATION = &H1209 -Public Const GL_AMBIENT = &H1200 -Public Const GL_DIFFUSE = &H1201 -Public Const GL_SPECULAR = &H1202 -Public Const GL_SHININESS = &H1601 -Public Const GL_EMISSION = &H1600 -Public Const GL_POSITION = &H1203 -Public Const GL_SPOT_DIRECTION = &H1204 -Public Const GL_AMBIENT_AND_DIFFUSE = &H1602 -Public Const GL_COLOR_INDEXES = &H1603 -Public Const GL_LIGHT_MODEL_TWO_SIDE = &HB52 -Public Const GL_LIGHT_MODEL_LOCAL_VIEWER = &HB51 -Public Const GL_LIGHT_MODEL_AMBIENT = &HB53 -Public Const GL_FRONT_AND_BACK = &H408 -Public Const GL_SHADE_MODEL = &HB54 -Public Const GL_FLAT = &H1D00 -Public Const GL_SMOOTH = &H1D01 -Public Const GL_COLOR_MATERIAL = &HB57 -Public Const GL_COLOR_MATERIAL_FACE = &HB55 -Public Const GL_COLOR_MATERIAL_PARAMETER = &HB56 -Public Const GL_NORMALIZE = &HBA1 - -' User clipping planes -Public Const GL_CLIP_PLANE0 = &H3000 -Public Const GL_CLIP_PLANE1 = &H3001 -Public Const GL_CLIP_PLANE2 = &H3002 -Public Const GL_CLIP_PLANE3 = &H3003 -Public Const GL_CLIP_PLANE4 = &H3004 -Public Const GL_CLIP_PLANE5 = &H3005 - -' Accumulation buffer -Public Const GL_ACCUM_RED_BITS = &HD58 -Public Const GL_ACCUM_GREEN_BITS = &HD59 -Public Const GL_ACCUM_BLUE_BITS = &HD5A -Public Const GL_ACCUM_ALPHA_BITS = &HD5B -Public Const GL_ACCUM_CLEAR_VALUE = &HB80 -Public Const GL_ACCUM = &H100 -Public Const GL_ADD = &H104 -Public Const GL_LOAD = &H101 -Public Const GL_MULT = &H103 -Public Const GL_RETURN = &H102 - -' Alpha testing -Public Const GL_ALPHA_TEST = &HBC0 -Public Const GL_ALPHA_TEST_REF = &HBC2 -Public Const GL_ALPHA_TEST_FUNC = &HBC1 - -' Blending -Public Const GL_BLEND = &HBE2 -Public Const GL_BLEND_SRC = &HBE1 -Public Const GL_BLEND_DST = &HBE0 -Public Const GL_ZERO = &H0 -Public Const GL_ONE = &H1 -Public Const GL_SRC_COLOR = &H300 -Public Const GL_ONE_MINUS_SRC_COLOR = &H301 -Public Const GL_SRC_ALPHA = &H302 -Public Const GL_ONE_MINUS_SRC_ALPHA = &H303 -Public Const GL_DST_ALPHA = &H304 -Public Const GL_ONE_MINUS_DST_ALPHA = &H305 -Public Const GL_DST_COLOR = &H306 -Public Const GL_ONE_MINUS_DST_COLOR = &H307 -Public Const GL_SRC_ALPHA_SATURATE = &H308 -Public Const GL_CONSTANT_COLOR = &H8001 -Public Const GL_ONE_MINUS_CONSTANT_COLOR = &H8002 -Public Const GL_CONSTANT_ALPHA = &H8003 -Public Const GL_ONE_MINUS_CONSTANT_ALPHA = &H8004 - -' Render Mode -Public Const GL_FEEDBACK = &H1C01 -Public Const GL_RENDER = &H1C00 -Public Const GL_SELECT = &H1C02 - -' Feedback -Public Const GL_2D = &H600 -Public Const GL_3D = &H601 -Public Const GL_3D_COLOR = &H602 -Public Const GL_3D_COLOR_TEXTURE = &H603 -Public Const GL_4D_COLOR_TEXTURE = &H604 -Public Const GL_POINT_TOKEN = &H701 -Public Const GL_LINE_TOKEN = &H702 -Public Const GL_LINE_RESET_TOKEN = &H707 -Public Const GL_POLYGON_TOKEN = &H703 -Public Const GL_BITMAP_TOKEN = &H704 -Public Const GL_DRAW_PIXEL_TOKEN = &H705 -Public Const GL_COPY_PIXEL_TOKEN = &H706 -Public Const GL_PASS_THROUGH_TOKEN = &H700 -Public Const GL_FEEDBACK_BUFFER_POINTER = &HDF0 -Public Const GL_FEEDBACK_BUFFER_SIZE = &HDF1 -Public Const GL_FEEDBACK_BUFFER_TYPE = &HDF2 - -' Selection -Public Const GL_SELECTION_BUFFER_POINTER = &HDF3 -Public Const GL_SELECTION_BUFFER_SIZE = &HDF4 - -' Fog -Public Const GL_FOG = &HB60 -Public Const GL_FOG_MODE = &HB65 -Public Const GL_FOG_DENSITY = &HB62 -Public Const GL_FOG_COLOR = &HB66 -Public Const GL_FOG_INDEX = &HB61 -Public Const GL_FOG_START = &HB63 -Public Const GL_FOG_END = &HB64 -Public Const GL_LINEAR = &H2601 -Public Const GL_EXP = &H800 -Public Const GL_EXP2 = &H801 - -' Logic Ops -Public Const GL_LOGIC_OP = &HBF1 -Public Const GL_INDEX_LOGIC_OP = &HBF1 -Public Const GL_COLOR_LOGIC_OP = &HBF2 -Public Const GL_LOGIC_OP_MODE = &HBF0 -Public Const GL_CLEAR = &H1500 -Public Const GL_SET = &H150F -Public Const GL_COPY = &H1503 -Public Const GL_COPY_INVERTED = &H150C -Public Const GL_NOOP = &H1505 -Public Const GL_INVERT = &H150A -Public Const GL_AND = &H1501 -Public Const GL_NAND = &H150E -Public Const GL_OR = &H1507 -Public Const GL_NOR = &H1508 -Public Const GL_XOR = &H1506 -Public Const GL_EQUIV = &H1509 -Public Const GL_AND_REVERSE = &H1502 -Public Const GL_AND_INVERTED = &H1504 -Public Const GL_OR_REVERSE = &H150B -Public Const GL_OR_INVERTED = &H150D - -' Stencil -Public Const GL_STENCIL_TEST = &HB90 -Public Const GL_STENCIL_WRITEMASK = &HB98 -Public Const GL_STENCIL_BITS = &HD57 -Public Const GL_STENCIL_FUNC = &HB92 -Public Const GL_STENCIL_VALUE_MASK = &HB93 -Public Const GL_STENCIL_REF = &HB97 -Public Const GL_STENCIL_FAIL = &HB94 -Public Const GL_STENCIL_PASS_DEPTH_PASS = &HB96 -Public Const GL_STENCIL_PASS_DEPTH_FAIL = &HB95 -Public Const GL_STENCIL_CLEAR_VALUE = &HB91 -Public Const GL_STENCIL_INDEX = &H1901 -Public Const GL_KEEP = &H1E00 -Public Const GL_REPLACE = &H1E01 -Public Const GL_INCR = &H1E02 -Public Const GL_DECR = &H1E03 - -' Buffers, Pixel Drawing/Reading -Public Const GL_NONE = &H0 -Public Const GL_LEFT = &H406 -Public Const GL_RIGHT = &H407 -' Public Const GL_FRONT = &H0404 -' Public Const GL_BACK = &H0405 -' Public Const GL_FRONT_AND_BACK = &H0408 -Public Const GL_FRONT_LEFT = &H400 -Public Const GL_FRONT_RIGHT = &H401 -Public Const GL_BACK_LEFT = &H402 -Public Const GL_BACK_RIGHT = &H403 -Public Const GL_AUX0 = &H409 -Public Const GL_AUX1 = &H40A -Public Const GL_AUX2 = &H40B -Public Const GL_AUX3 = &H40C -Public Const GL_COLOR_INDEX = &H1900 -Public Const GL_RED = &H1903 -Public Const GL_GREEN = &H1904 -Public Const GL_BLUE = &H1905 -Public Const GL_ALPHA = &H1906 -Public Const GL_LUMINANCE = &H1909 -Public Const GL_LUMINANCE_ALPHA = &H190A -Public Const GL_ALPHA_BITS = &HD55 -Public Const GL_RED_BITS = &HD52 -Public Const GL_GREEN_BITS = &HD53 -Public Const GL_BLUE_BITS = &HD54 -Public Const GL_INDEX_BITS = &HD51 -Public Const GL_SUBPIXEL_BITS = &HD50 -Public Const GL_AUX_BUFFERS = &HC00 -Public Const GL_READ_BUFFER = &HC02 -Public Const GL_DRAW_BUFFER = &HC01 -Public Const GL_DOUBLEBUFFER = &HC32 -Public Const GL_STEREO = &HC33 -Public Const GL_BITMAP = &H1A00 -Public Const GL_COLOR = &H1800 -Public Const GL_DEPTH = &H1801 -Public Const GL_STENCIL = &H1802 -Public Const GL_DITHER = &HBD0 -Public Const GL_RGB = &H1907 -Public Const GL_RGBA = &H1908 - -' Implementation limits -Public Const GL_MAX_LIST_NESTING = &HB31 -Public Const GL_MAX_ATTRIB_STACK_DEPTH = &HD35 -Public Const GL_MAX_MODELVIEW_STACK_DEPTH = &HD36 -Public Const GL_MAX_NAME_STACK_DEPTH = &HD37 -Public Const GL_MAX_PROJECTION_STACK_DEPTH = &HD38 -Public Const GL_MAX_TEXTURE_STACK_DEPTH = &HD39 -Public Const GL_MAX_EVAL_ORDER = &HD30 -Public Const GL_MAX_LIGHTS = &HD31 -Public Const GL_MAX_CLIP_PLANES = &HD32 -Public Const GL_MAX_TEXTURE_SIZE = &HD33 -Public Const GL_MAX_PIXEL_MAP_TABLE = &HD34 -Public Const GL_MAX_VIEWPORT_DIMS = &HD3A -Public Const GL_MAX_CLIENT_ATTRIB_STACK_DEPTH = &HD3B - -' Gets -Public Const GL_ATTRIB_STACK_DEPTH = &HBB0 -Public Const GL_CLIENT_ATTRIB_STACK_DEPTH = &HBB1 -Public Const GL_COLOR_CLEAR_VALUE = &HC22 -Public Const GL_COLOR_WRITEMASK = &HC23 -Public Const GL_CURRENT_INDEX = &HB01 -Public Const GL_CURRENT_COLOR = &HB00 -Public Const GL_CURRENT_NORMAL = &HB02 -Public Const GL_CURRENT_RASTER_COLOR = &HB04 -Public Const GL_CURRENT_RASTER_DISTANCE = &HB09 -Public Const GL_CURRENT_RASTER_INDEX = &HB05 -Public Const GL_CURRENT_RASTER_POSITION = &HB07 -Public Const GL_CURRENT_RASTER_TEXTURE_COORDS = &HB06 -Public Const GL_CURRENT_RASTER_POSITION_VALID = &HB08 -Public Const GL_CURRENT_TEXTURE_COORDS = &HB03 -Public Const GL_INDEX_CLEAR_VALUE = &HC20 -Public Const GL_INDEX_MODE = &HC30 -Public Const GL_INDEX_WRITEMASK = &HC21 -Public Const GL_MODELVIEW_MATRIX = &HBA6 -Public Const GL_MODELVIEW_STACK_DEPTH = &HBA3 -Public Const GL_NAME_STACK_DEPTH = &HD70 -Public Const GL_PROJECTION_MATRIX = &HBA7 -Public Const GL_PROJECTION_STACK_DEPTH = &HBA4 -Public Const GL_RENDER_MODE = &HC40 -Public Const GL_RGBA_MODE = &HC31 -Public Const GL_TEXTURE_MATRIX = &HBA8 -Public Const GL_TEXTURE_STACK_DEPTH = &HBA5 -Public Const GL_VIEWPORT = &HBA2 - -' Evaluators -Public Const GL_AUTO_NORMAL = &HD80 -Public Const GL_MAP1_COLOR_4 = &HD90 -Public Const GL_MAP1_GRID_DOMAIN = &HDD0 -Public Const GL_MAP1_GRID_SEGMENTS = &HDD1 -Public Const GL_MAP1_INDEX = &HD91 -Public Const GL_MAP1_NORMAL = &HD92 -Public Const GL_MAP1_TEXTURE_COORD_1 = &HD93 -Public Const GL_MAP1_TEXTURE_COORD_2 = &HD94 -Public Const GL_MAP1_TEXTURE_COORD_3 = &HD95 -Public Const GL_MAP1_TEXTURE_COORD_4 = &HD96 -Public Const GL_MAP1_VERTEX_3 = &HD97 -Public Const GL_MAP1_VERTEX_4 = &HD98 -Public Const GL_MAP2_COLOR_4 = &HDB0 -Public Const GL_MAP2_GRID_DOMAIN = &HDD2 -Public Const GL_MAP2_GRID_SEGMENTS = &HDD3 -Public Const GL_MAP2_INDEX = &HDB1 -Public Const GL_MAP2_NORMAL = &HDB2 -Public Const GL_MAP2_TEXTURE_COORD_1 = &HDB3 -Public Const GL_MAP2_TEXTURE_COORD_2 = &HDB4 -Public Const GL_MAP2_TEXTURE_COORD_3 = &HDB5 -Public Const GL_MAP2_TEXTURE_COORD_4 = &HDB6 -Public Const GL_MAP2_VERTEX_3 = &HDB7 -Public Const GL_MAP2_VERTEX_4 = &HDB8 -Public Const GL_COEFF = &HA00 -Public Const GL_DOMAIN = &HA02 -Public Const GL_ORDER = &HA01 - -' Hints -Public Const GL_FOG_HINT = &HC54 -Public Const GL_LINE_SMOOTH_HINT = &HC52 -Public Const GL_PERSPECTIVE_CORRECTION_HINT = &HC50 -Public Const GL_POINT_SMOOTH_HINT = &HC51 -Public Const GL_POLYGON_SMOOTH_HINT = &HC53 -Public Const GL_DONT_CARE = &H1100 -Public Const GL_FASTEST = &H1101 -Public Const GL_NICEST = &H1102 - -' Scissor box -Public Const GL_SCISSOR_TEST = &HC11 -Public Const GL_SCISSOR_BOX = &HC10 - -' Pixel Mode / Transfer -Public Const GL_MAP_COLOR = &HD10 -Public Const GL_MAP_STENCIL = &HD11 -Public Const GL_INDEX_SHIFT = &HD12 -Public Const GL_INDEX_OFFSET = &HD13 -Public Const GL_RED_SCALE = &HD14 -Public Const GL_RED_BIAS = &HD15 -Public Const GL_GREEN_SCALE = &HD18 -Public Const GL_GREEN_BIAS = &HD19 -Public Const GL_BLUE_SCALE = &HD1A -Public Const GL_BLUE_BIAS = &HD1B -Public Const GL_ALPHA_SCALE = &HD1C -Public Const GL_ALPHA_BIAS = &HD1D -Public Const GL_DEPTH_SCALE = &HD1E -Public Const GL_DEPTH_BIAS = &HD1F -Public Const GL_PIXEL_MAP_S_TO_S_SIZE = &HCB1 -Public Const GL_PIXEL_MAP_I_TO_I_SIZE = &HCB0 -Public Const GL_PIXEL_MAP_I_TO_R_SIZE = &HCB2 -Public Const GL_PIXEL_MAP_I_TO_G_SIZE = &HCB3 -Public Const GL_PIXEL_MAP_I_TO_B_SIZE = &HCB4 -Public Const GL_PIXEL_MAP_I_TO_A_SIZE = &HCB5 -Public Const GL_PIXEL_MAP_R_TO_R_SIZE = &HCB6 -Public Const GL_PIXEL_MAP_G_TO_G_SIZE = &HCB7 -Public Const GL_PIXEL_MAP_B_TO_B_SIZE = &HCB8 -Public Const GL_PIXEL_MAP_A_TO_A_SIZE = &HCB9 -Public Const GL_PIXEL_MAP_S_TO_S = &HC71 -Public Const GL_PIXEL_MAP_I_TO_I = &HC70 -Public Const GL_PIXEL_MAP_I_TO_R = &HC72 -Public Const GL_PIXEL_MAP_I_TO_G = &HC73 -Public Const GL_PIXEL_MAP_I_TO_B = &HC74 -Public Const GL_PIXEL_MAP_I_TO_A = &HC75 -Public Const GL_PIXEL_MAP_R_TO_R = &HC76 -Public Const GL_PIXEL_MAP_G_TO_G = &HC77 -Public Const GL_PIXEL_MAP_B_TO_B = &HC78 -Public Const GL_PIXEL_MAP_A_TO_A = &HC79 -Public Const GL_PACK_ALIGNMENT = &HD05 -Public Const GL_PACK_LSB_FIRST = &HD01 -Public Const GL_PACK_ROW_LENGTH = &HD02 -Public Const GL_PACK_SKIP_PIXELS = &HD04 -Public Const GL_PACK_SKIP_ROWS = &HD03 -Public Const GL_PACK_SWAP_BYTES = &HD00 -Public Const GL_UNPACK_ALIGNMENT = &HCF5 -Public Const GL_UNPACK_LSB_FIRST = &HCF1 -Public Const GL_UNPACK_ROW_LENGTH = &HCF2 -Public Const GL_UNPACK_SKIP_PIXELS = &HCF4 -Public Const GL_UNPACK_SKIP_ROWS = &HCF3 -Public Const GL_UNPACK_SWAP_BYTES = &HCF0 -Public Const GL_ZOOM_X = &HD16 -Public Const GL_ZOOM_Y = &HD17 - -' Texture mapping -Public Const GL_TEXTURE_ENV = &H2300 -Public Const GL_TEXTURE_ENV_MODE = &H2200 -Public Const GL_TEXTURE_1D = &HDE0 -Public Const GL_TEXTURE_2D = &HDE1 -Public Const GL_TEXTURE_WRAP_S = &H2802 -Public Const GL_TEXTURE_WRAP_T = &H2803 -Public Const GL_TEXTURE_MAG_FILTER = &H2800 -Public Const GL_TEXTURE_MIN_FILTER = &H2801 -Public Const GL_TEXTURE_ENV_COLOR = &H2201 -Public Const GL_TEXTURE_GEN_S = &HC60 -Public Const GL_TEXTURE_GEN_T = &HC61 -Public Const GL_TEXTURE_GEN_MODE = &H2500 -Public Const GL_TEXTURE_BORDER_COLOR = &H1004 -Public Const GL_TEXTURE_WIDTH = &H1000 -Public Const GL_TEXTURE_HEIGHT = &H1001 -Public Const GL_TEXTURE_BORDER = &H1005 -Public Const GL_TEXTURE_COMPONENTS = &H1003 -Public Const GL_TEXTURE_RED_SIZE = &H805C -Public Const GL_TEXTURE_GREEN_SIZE = &H805D -Public Const GL_TEXTURE_BLUE_SIZE = &H805E -Public Const GL_TEXTURE_ALPHA_SIZE = &H805F -Public Const GL_TEXTURE_LUMINANCE_SIZE = &H8060 -Public Const GL_TEXTURE_INTENSITY_SIZE = &H8061 -Public Const GL_NEAREST_MIPMAP_NEAREST = &H2700 -Public Const GL_NEAREST_MIPMAP_LINEAR = &H2702 -Public Const GL_LINEAR_MIPMAP_NEAREST = &H2701 -Public Const GL_LINEAR_MIPMAP_LINEAR = &H2703 -Public Const GL_OBJECT_LINEAR = &H2401 -Public Const GL_OBJECT_PLANE = &H2501 -Public Const GL_EYE_LINEAR = &H2400 -Public Const GL_EYE_PLANE = &H2502 -Public Const GL_SPHERE_MAP = &H2402 -Public Const GL_DECAL = &H2101 -Public Const GL_MODULATE = &H2100 -Public Const GL_NEAREST = &H2600 -Public Const GL_REPEAT = &H2901 -Public Const GL_CLAMP = &H2900 -Public Const GL_S = &H2000 -Public Const GL_T = &H2001 -Public Const GL_R = &H2002 -Public Const GL_Q = &H2003 -Public Const GL_TEXTURE_GEN_R = &HC62 -Public Const GL_TEXTURE_GEN_Q = &HC63 - -' Utility -Public Const GL_VENDOR = &H1F00 -Public Const GL_RENDERER = &H1F01 -Public Const GL_VERSION = &H1F02 -Public Const GL_EXTENSIONS = &H1F03 - -' Errors -Public Const GL_NO_ERROR = &H0 -Public Const GL_INVALID_VALUE = &H501 -Public Const GL_INVALID_ENUM = &H500 -Public Const GL_INVALID_OPERATION = &H502 -Public Const GL_STACK_OVERFLOW = &H503 -Public Const GL_STACK_UNDERFLOW = &H504 -Public Const GL_OUT_OF_MEMORY = &H505 - -' glPush/PopAttrib bits -Public Const GL_CURRENT_BIT = &H1 -Public Const GL_POINT_BIT = &H2 -Public Const GL_LINE_BIT = &H4 -Public Const GL_POLYGON_BIT = &H8 -Public Const GL_POLYGON_STIPPLE_BIT = &H10 -Public Const GL_PIXEL_MODE_BIT = &H20 -Public Const GL_LIGHTING_BIT = &H40 -Public Const GL_FOG_BIT = &H80 -Public Const GL_DEPTH_BUFFER_BIT = &H100 -Public Const GL_ACCUM_BUFFER_BIT = &H200 -Public Const GL_STENCIL_BUFFER_BIT = &H400 -Public Const GL_VIEWPORT_BIT = &H800 -Public Const GL_TRANSFORM_BIT = &H1000 -Public Const GL_ENABLE_BIT = &H2000 -Public Const GL_COLOR_BUFFER_BIT = &H4000 -Public Const GL_HINT_BIT = &H8000 -Public Const GL_EVAL_BIT = &H10000 -Public Const GL_LIST_BIT = &H20000 -Public Const GL_TEXTURE_BIT = &H40000 -Public Const GL_SCISSOR_BIT = &H80000 -Public Const GL_ALL_ATTRIB_BITS = &HFFFFF - - -' OpenGL 1.1 -Public Const GL_PROXY_TEXTURE_1D = &H8063 -Public Const GL_PROXY_TEXTURE_2D = &H8064 -Public Const GL_TEXTURE_PRIORITY = &H8066 -Public Const GL_TEXTURE_RESIDENT = &H8067 -Public Const GL_TEXTURE_BINDING_1D = &H8068 -Public Const GL_TEXTURE_BINDING_2D = &H8069 -Public Const GL_TEXTURE_INTERNAL_FORMAT = &H1003 -Public Const GL_ALPHA4 = &H803B -Public Const GL_ALPHA8 = &H803C -Public Const GL_ALPHA12 = &H803D -Public Const GL_ALPHA16 = &H803E -Public Const GL_LUMINANCE4 = &H803F -Public Const GL_LUMINANCE8 = &H8040 -Public Const GL_LUMINANCE12 = &H8041 -Public Const GL_LUMINANCE16 = &H8042 -Public Const GL_LUMINANCE4_ALPHA4 = &H8043 -Public Const GL_LUMINANCE6_ALPHA2 = &H8044 -Public Const GL_LUMINANCE8_ALPHA8 = &H8045 -Public Const GL_LUMINANCE12_ALPHA4 = &H8046 -Public Const GL_LUMINANCE12_ALPHA12 = &H8047 -Public Const GL_LUMINANCE16_ALPHA16 = &H8048 -Public Const GL_INTENSITY = &H8049 -Public Const GL_INTENSITY4 = &H804A -Public Const GL_INTENSITY8 = &H804B -Public Const GL_INTENSITY12 = &H804C -Public Const GL_INTENSITY16 = &H804D -Public Const GL_R3_G3_B2 = &H2A10 -Public Const GL_RGB4 = &H804F -Public Const GL_RGB5 = &H8050 -Public Const GL_RGB8 = &H8051 -Public Const GL_RGB10 = &H8052 -Public Const GL_RGB12 = &H8053 -Public Const GL_RGB16 = &H8054 -Public Const GL_RGBA2 = &H8055 -Public Const GL_RGBA4 = &H8056 -Public Const GL_RGB5_A1 = &H8057 -Public Const GL_RGBA8 = &H8058 -Public Const GL_RGB10_A2 = &H8059 -Public Const GL_RGBA12 = &H805A -Public Const GL_RGBA16 = &H805B -Public Const GL_CLIENT_PIXEL_STORE_BIT = &H1 -Public Const GL_CLIENT_VERTEX_ARRAY_BIT = &H2 -Public Const GL_ALL_CLIENT_ATTRIB_BITS = &HFFFFFFFF -Public Const GL_CLIENT_ALL_ATTRIB_BITS = &HFFFFFFFF - - - - -'************************************************************************* -'* Function Definitions -'************************************************************************* - -' Miscellaneous -Public Declare Sub glClearIndex Lib "opengl32.dll" (ByVal c As Single) -Public Declare Sub glClearColor Lib "opengl32.dll" (ByVal red As Single, ByVal green As Single, ByVal blue As Single, ByVal alpha As Single) -Public Declare Sub glClear Lib "opengl32.dll" (ByVal mask As Long) -Public Declare Sub glIndexMask Lib "opengl32.dll" (ByVal mask As Long) -Public Declare Sub glColorMask Lib "opengl32.dll" (ByVal red As Byte, ByVal green As Byte, ByVal blue As Byte, ByVal alpha As Byte) -Public Declare Sub glAlphaFunc Lib "opengl32.dll" (ByVal func As Long, ByVal ref As Single) -Public Declare Sub glBlendFunc Lib "opengl32.dll" (ByVal sfactor As Long, ByVal dfactor As Long) -Public Declare Sub glLogicOp Lib "opengl32.dll" (ByVal opcode As Long) -Public Declare Sub glCullFace Lib "opengl32.dll" (ByVal mode As Long) -Public Declare Sub glFrontFace Lib "opengl32.dll" (ByVal mode As Long) -Public Declare Sub glPointSize Lib "opengl32.dll" (ByVal size As Single) -Public Declare Sub glLineWidth Lib "opengl32.dll" (ByVal width As Single) -Public Declare Sub glLineStipple Lib "opengl32.dll" (ByVal factor As Long, ByVal pattern As Integer) -Public Declare Sub glPolygonMode Lib "opengl32.dll" (ByVal face As Long, ByVal mode As Long) -Public Declare Sub glPolygonOffset Lib "opengl32.dll" (ByVal factor As Single, ByVal units As Single) -Public Declare Sub glPolygonStipple Lib "opengl32.dll" (mask As Byte) -Public Declare Sub glGetPolygonStipple Lib "opengl32.dll" (mask As Byte) -Public Declare Sub glEdgeFlag Lib "opengl32.dll" (ByVal flag As Byte) -Public Declare Sub glEdgeFlagv Lib "opengl32.dll" (flag As Byte) -Public Declare Sub glScissor Lib "opengl32.dll" (ByVal x As Long, ByVal y As Long, ByVal width As Long, ByVal height As Long) -Public Declare Sub glClipPlane Lib "opengl32.dll" (ByVal plane As Long, equation As Double) -Public Declare Sub glGetClipPlane Lib "opengl32.dll" (ByVal plane As Long, equation As Double) -Public Declare Sub glDrawBuffer Lib "opengl32.dll" (ByVal mode As Long) -Public Declare Sub glReadBuffer Lib "opengl32.dll" (ByVal mode As Long) -Public Declare Sub glEnable Lib "opengl32.dll" (ByVal cap As Long) -Public Declare Sub glDisable Lib "opengl32.dll" (ByVal cap As Long) -Public Declare Function glIsEnabled Lib "opengl32.dll" (ByVal cap As Long) As Byte - -Public Declare Sub glGetBooleanv Lib "opengl32.dll" (ByVal pname As Long, params As Byte) -Public Declare Sub glGetDoublev Lib "opengl32.dll" (ByVal pname As Long, params As Double) -Public Declare Sub glGetFloatv Lib "opengl32.dll" (ByVal pname As Long, params As Single) -Public Declare Sub glGetIntegerv Lib "opengl32.dll" (ByVal pname As Long, params As Long) -Public Declare Sub glPushAttrib Lib "opengl32.dll" (ByVal mask As Long) -Public Declare Sub glPopAttrib Lib "opengl32.dll" () - -Public Declare Function glRenderMode Lib "opengl32.dll" (ByVal mode As Long) As Long -Public Declare Function glGetError Lib "opengl32.dll" () As Long -Public Declare Function glGetString Lib "opengl32.dll" (ByVal name As Long) As String -Public Declare Sub glFinish Lib "opengl32.dll" () -Public Declare Sub glFlush Lib "opengl32.dll" () -Public Declare Sub glHint Lib "opengl32.dll" (ByVal target As Long, ByVal mode As Long) - -' Depth Buffer -Public Declare Sub glClearDepth Lib "opengl32.dll" (ByVal depth As Double) -Public Declare Sub glDepthFunc Lib "opengl32.dll" (ByVal func As Long) -Public Declare Sub glDepthMask Lib "opengl32.dll" (ByVal flag As Byte) -Public Declare Sub glDepthRange Lib "opengl32.dll" (ByVal near_val As Double, ByVal far_val As Double) - -' Accumulation Buffer -Public Declare Sub glClearAccum Lib "opengl32.dll" (ByVal red As Single, ByVal green As Single, ByVal blue As Single, ByVal alpha As Single) -Public Declare Sub glAccum Lib "opengl32.dll" (ByVal op As Long, ByVal value As Single) - -' Transformation -Public Declare Sub glMatrixMode Lib "opengl32.dll" (ByVal mode As Long) -Public Declare Sub glOrtho Lib "opengl32.dll" (ByVal left As Double, ByVal right As Double, ByVal bottom As Double, ByVal top As Double, ByVal near_val As Double, ByVal far_val As Double) -Public Declare Sub glFrustum Lib "opengl32.dll" (ByVal left As Double, ByVal right As Double, ByVal bottom As Double, ByVal top As Double, ByVal near_val As Double, ByVal far_val As Double) -Public Declare Sub glViewport Lib "opengl32.dll" (ByVal x As Long, ByVal y As Long, ByVal width As Long, ByVal height As Long) -Public Declare Sub glPushMatrix Lib "opengl32.dll" () -Public Declare Sub glPopMatrix Lib "opengl32.dll" () -Public Declare Sub glLoadIdentity Lib "opengl32.dll" () -Public Declare Sub glLoadMatrixd Lib "opengl32.dll" (m As Double) -Public Declare Sub glLoadMatrixf Lib "opengl32.dll" (m As Single) -Public Declare Sub glMultMatrixd Lib "opengl32.dll" (m As Double) -Public Declare Sub glMultMatrixf Lib "opengl32.dll" (m As Single) -Public Declare Sub glRotated Lib "opengl32.dll" (ByVal angle As Double, ByVal x As Double, ByVal y As Double, ByVal z As Double) -Public Declare Sub glRotatef Lib "opengl32.dll" (ByVal angle As Single, ByVal x As Single, ByVal y As Single, ByVal z As Single) -Public Declare Sub glScaled Lib "opengl32.dll" (ByVal x As Double, ByVal y As Double, ByVal z As Double) -Public Declare Sub glScalef Lib "opengl32.dll" (ByVal x As Single, ByVal y As Single, ByVal z As Single) -Public Declare Sub glTranslated Lib "opengl32.dll" (ByVal x As Double, ByVal y As Double, ByVal z As Double) -Public Declare Sub glTranslatef Lib "opengl32.dll" (ByVal x As Single, ByVal y As Single, ByVal z As Single) - -' Display Lists -Public Declare Function glIsList Lib "opengl32.dll" (ByVal list As Long) As Byte -Public Declare Sub glDeleteLists Lib "opengl32.dll" (ByVal list As Long, ByVal range As Long) -Public Declare Function glGenLists Lib "opengl32.dll" (ByVal range As Long) As Long -Public Declare Sub glNewList Lib "opengl32.dll" (ByVal list As Long, ByVal mode As Long) -Public Declare Sub glEndList Lib "opengl32.dll" () -Public Declare Sub glCallList Lib "opengl32.dll" (ByVal list As Long) -Public Declare Sub glCallLists Lib "opengl32.dll" (ByVal n As Long, ByVal t As Long, lists As Any) -Public Declare Sub glListBase Lib "opengl32.dll" (ByVal base As Long) - -' Drawing Functions -Public Declare Sub glBegin Lib "opengl32.dll" (ByVal mode As Long) -Public Declare Sub glEnd Lib "opengl32.dll" () -Public Declare Sub glVertex2d Lib "opengl32.dll" (ByVal x As Double, ByVal y As Double) -Public Declare Sub glVertex2f Lib "opengl32.dll" (ByVal x As Single, ByVal y As Single) -Public Declare Sub glVertex2i Lib "opengl32.dll" (ByVal x As Long, ByVal y As Long) -Public Declare Sub glVertex2s Lib "opengl32.dll" (ByVal x As Integer, ByVal y As Integer) -Public Declare Sub glVertex3d Lib "opengl32.dll" (ByVal x As Double, ByVal y As Double, ByVal z As Double) -Public Declare Sub glVertex3f Lib "opengl32.dll" (ByVal x As Single, ByVal y As Single, ByVal z As Single) -Public Declare Sub glVertex3i Lib "opengl32.dll" (ByVal x As Long, ByVal y As Long, ByVal z As Long) -Public Declare Sub glVertex3s Lib "opengl32.dll" (ByVal x As Integer, ByVal y As Integer, ByVal z As Integer) -Public Declare Sub glVertex4d Lib "opengl32.dll" (ByVal x As Double, ByVal y As Double, ByVal z As Double, ByVal w As Double) -Public Declare Sub glVertex4f Lib "opengl32.dll" (ByVal x As Single, ByVal y As Single, ByVal z As Single, ByVal w As Single) -Public Declare Sub glVertex4i Lib "opengl32.dll" (ByVal x As Long, ByVal y As Long, ByVal z As Long, ByVal w As Long) -Public Declare Sub glVertex4s Lib "opengl32.dll" (ByVal x As Integer, ByVal y As Integer, ByVal z As Integer, ByVal w As Integer) -Public Declare Sub glVertex2dv Lib "opengl32.dll" (v As Double) -Public Declare Sub glVertex2fv Lib "opengl32.dll" (v As Single) -Public Declare Sub glVertex2iv Lib "opengl32.dll" (v As Long) -Public Declare Sub glVertex2sv Lib "opengl32.dll" (v As Integer) -Public Declare Sub glVertex3dv Lib "opengl32.dll" (v As Double) -Public Declare Sub glVertex3fv Lib "opengl32.dll" (v As Single) -Public Declare Sub glVertex3iv Lib "opengl32.dll" (v As Long) -Public Declare Sub glVertex3sv Lib "opengl32.dll" (v As Integer) -Public Declare Sub glVertex4dv Lib "opengl32.dll" (v As Double) -Public Declare Sub glVertex4fv Lib "opengl32.dll" (v As Single) -Public Declare Sub glVertex4iv Lib "opengl32.dll" (v As Long) -Public Declare Sub glVertex4sv Lib "opengl32.dll" (v As Integer) -Public Declare Sub glNormal3b Lib "opengl32.dll" (ByVal nx As Byte, ByVal ny As Byte, ByVal nz As Byte) -Public Declare Sub glNormal3d Lib "opengl32.dll" (ByVal nx As Double, ByVal ny As Double, ByVal nz As Double) -Public Declare Sub glNormal3f Lib "opengl32.dll" (ByVal nx As Single, ByVal ny As Single, ByVal nz As Single) -Public Declare Sub glNormal3i Lib "opengl32.dll" (ByVal nx As Long, ByVal ny As Long, ByVal nz As Long) -Public Declare Sub glNormal3s Lib "opengl32.dll" (ByVal nx As Integer, ByVal ny As Integer, ByVal nz As Integer) -Public Declare Sub glNormal3bv Lib "opengl32.dll" (v As Byte) -Public Declare Sub glNormal3dv Lib "opengl32.dll" (v As Double) -Public Declare Sub glNormal3fv Lib "opengl32.dll" (v As Single) -Public Declare Sub glNormal3iv Lib "opengl32.dll" (v As Long) -Public Declare Sub glNormal3sv Lib "opengl32.dll" (v As Integer) -Public Declare Sub glIndexd Lib "opengl32.dll" (ByVal c As Double) -Public Declare Sub glIndexf Lib "opengl32.dll" (ByVal c As Single) -Public Declare Sub glIndexi Lib "opengl32.dll" (ByVal c As Long) -Public Declare Sub glIndexs Lib "opengl32.dll" (ByVal c As Integer) - -Public Declare Sub glIndexdv Lib "opengl32.dll" (c As Double) -Public Declare Sub glIndexfv Lib "opengl32.dll" (c As Single) -Public Declare Sub glIndexiv Lib "opengl32.dll" (c As Long) -Public Declare Sub glIndexsv Lib "opengl32.dll" (c As Integer) - -Public Declare Sub glColor3b Lib "opengl32.dll" (ByVal red As Byte, ByVal green As Byte, ByVal blue As Byte) -Public Declare Sub glColor3d Lib "opengl32.dll" (ByVal red As Double, ByVal green As Double, ByVal blue As Double) -Public Declare Sub glColor3f Lib "opengl32.dll" (ByVal red As Single, ByVal green As Single, ByVal blue As Single) -Public Declare Sub glColor3i Lib "opengl32.dll" (ByVal red As Long, ByVal green As Long, ByVal blue As Long) -Public Declare Sub glColor3s Lib "opengl32.dll" (ByVal red As Integer, ByVal green As Integer, ByVal blue As Integer) -Public Declare Sub glColor3ub Lib "opengl32.dll" (ByVal red As Byte, ByVal green As Byte, ByVal blue As Byte) -Public Declare Sub glColor3ui Lib "opengl32.dll" (ByVal red As Long, ByVal green As Long, ByVal blue As Long) -Public Declare Sub glColor3us Lib "opengl32.dll" (ByVal red As Integer, ByVal green As Integer, ByVal blue As Integer) -Public Declare Sub glColor4b Lib "opengl32.dll" (ByVal red As Byte, ByVal green As Byte, ByVal blue As Byte, ByVal alpha As Byte) -Public Declare Sub glColor4d Lib "opengl32.dll" (ByVal red As Double, ByVal green As Double, ByVal blue As Double, ByVal alpha As Double) -Public Declare Sub glColor4f Lib "opengl32.dll" (ByVal red As Single, ByVal green As Single, ByVal blue As Single, ByVal alpha As Single) -Public Declare Sub glColor4i Lib "opengl32.dll" (ByVal red As Long, ByVal green As Long, ByVal blue As Long, ByVal alpha As Long) -Public Declare Sub glColor4s Lib "opengl32.dll" (ByVal red As Integer, ByVal green As Integer, ByVal blue As Integer, ByVal alpha As Integer) -Public Declare Sub glColor4ub Lib "opengl32.dll" (ByVal red As Byte, ByVal green As Byte, ByVal blue As Byte, ByVal alpha As Byte) -Public Declare Sub glColor4ui Lib "opengl32.dll" (ByVal red As Long, ByVal green As Long, ByVal blue As Long, ByVal alpha As Long) -Public Declare Sub glColor4us Lib "opengl32.dll" (ByVal red As Integer, ByVal green As Integer, ByVal blue As Integer, ByVal alpha As Integer) -Public Declare Sub glColor3bv Lib "opengl32.dll" (v As Byte) -Public Declare Sub glColor3dv Lib "opengl32.dll" (v As Double) -Public Declare Sub glColor3fv Lib "opengl32.dll" (v As Single) -Public Declare Sub glColor3iv Lib "opengl32.dll" (v As Long) -Public Declare Sub glColor3sv Lib "opengl32.dll" (v As Integer) -Public Declare Sub glColor3ubv Lib "opengl32.dll" (v As Byte) -Public Declare Sub glColor3uiv Lib "opengl32.dll" (v As Long) -Public Declare Sub glColor3usv Lib "opengl32.dll" (v As Integer) -Public Declare Sub glColor4bv Lib "opengl32.dll" (v As Byte) -Public Declare Sub glColor4dv Lib "opengl32.dll" (v As Double) -Public Declare Sub glColor4fv Lib "opengl32.dll" (v As Single) -Public Declare Sub glColor4iv Lib "opengl32.dll" (v As Long) -Public Declare Sub glColor4sv Lib "opengl32.dll" (v As Integer) -Public Declare Sub glColor4ubv Lib "opengl32.dll" (v As Byte) -Public Declare Sub glColor4uiv Lib "opengl32.dll" (v As Long) -Public Declare Sub glColor4usv Lib "opengl32.dll" (v As Integer) -Public Declare Sub glTexCoord1d Lib "opengl32.dll" (ByVal s As Double) -Public Declare Sub glTexCoord1f Lib "opengl32.dll" (ByVal s As Single) -Public Declare Sub glTexCoord1i Lib "opengl32.dll" (ByVal s As Long) -Public Declare Sub glTexCoord1s Lib "opengl32.dll" (ByVal s As Integer) -Public Declare Sub glTexCoord2d Lib "opengl32.dll" (ByVal s As Double, ByVal t As Double) -Public Declare Sub glTexCoord2f Lib "opengl32.dll" (ByVal s As Single, ByVal t As Single) -Public Declare Sub glTexCoord2i Lib "opengl32.dll" (ByVal s As Long, ByVal t As Long) -Public Declare Sub glTexCoord2s Lib "opengl32.dll" (ByVal s As Integer, ByVal t As Integer) -Public Declare Sub glTexCoord3d Lib "opengl32.dll" (ByVal s As Double, ByVal t As Double, ByVal r As Double) -Public Declare Sub glTexCoord3f Lib "opengl32.dll" (ByVal s As Single, ByVal t As Single, ByVal r As Single) -Public Declare Sub glTexCoord3i Lib "opengl32.dll" (ByVal s As Long, ByVal t As Long, ByVal r As Long) -Public Declare Sub glTexCoord3s Lib "opengl32.dll" (ByVal s As Integer, ByVal t As Integer, ByVal r As Integer) -Public Declare Sub glTexCoord4d Lib "opengl32.dll" (ByVal s As Double, ByVal t As Double, ByVal r As Double, ByVal q As Double) -Public Declare Sub glTexCoord4f Lib "opengl32.dll" (ByVal s As Single, ByVal t As Single, ByVal r As Single, ByVal q As Single) -Public Declare Sub glTexCoord4i Lib "opengl32.dll" (ByVal s As Long, ByVal t As Long, ByVal r As Long, ByVal q As Long) -Public Declare Sub glTexCoord4s Lib "opengl32.dll" (ByVal s As Integer, ByVal t As Integer, ByVal r As Integer, ByVal q As Integer) -Public Declare Sub glTexCoord1dv Lib "opengl32.dll" (v As Double) -Public Declare Sub glTexCoord1fv Lib "opengl32.dll" (v As Single) -Public Declare Sub glTexCoord1iv Lib "opengl32.dll" (v As Long) -Public Declare Sub glTexCoord1sv Lib "opengl32.dll" (v As Integer) -Public Declare Sub glTexCoord2dv Lib "opengl32.dll" (v As Double) -Public Declare Sub glTexCoord2fv Lib "opengl32.dll" (v As Single) -Public Declare Sub glTexCoord2iv Lib "opengl32.dll" (v As Long) -Public Declare Sub glTexCoord2sv Lib "opengl32.dll" (v As Integer) -Public Declare Sub glTexCoord3dv Lib "opengl32.dll" (v As Double) -Public Declare Sub glTexCoord3fv Lib "opengl32.dll" (v As Single) -Public Declare Sub glTexCoord3iv Lib "opengl32.dll" (v As Long) -Public Declare Sub glTexCoord3sv Lib "opengl32.dll" (v As Integer) -Public Declare Sub glTexCoord4dv Lib "opengl32.dll" (v As Double) -Public Declare Sub glTexCoord4fv Lib "opengl32.dll" (v As Single) -Public Declare Sub glTexCoord4iv Lib "opengl32.dll" (v As Long) -Public Declare Sub glTexCoord4sv Lib "opengl32.dll" (v As Integer) -Public Declare Sub glRasterPos2d Lib "opengl32.dll" (ByVal x As Double, ByVal y As Double) -Public Declare Sub glRasterPos2f Lib "opengl32.dll" (ByVal x As Single, ByVal y As Single) -Public Declare Sub glRasterPos2i Lib "opengl32.dll" (ByVal x As Long, ByVal y As Long) -Public Declare Sub glRasterPos2s Lib "opengl32.dll" (ByVal x As Integer, ByVal y As Integer) -Public Declare Sub glRasterPos3d Lib "opengl32.dll" (ByVal x As Double, ByVal y As Double, ByVal z As Double) -Public Declare Sub glRasterPos3f Lib "opengl32.dll" (ByVal x As Single, ByVal y As Single, ByVal z As Single) -Public Declare Sub glRasterPos3i Lib "opengl32.dll" (ByVal x As Long, ByVal y As Long, ByVal z As Long) -Public Declare Sub glRasterPos3s Lib "opengl32.dll" (ByVal x As Integer, ByVal y As Integer, ByVal z As Integer) -Public Declare Sub glRasterPos4d Lib "opengl32.dll" (ByVal x As Double, ByVal y As Double, ByVal z As Double, ByVal w As Double) -Public Declare Sub glRasterPos4f Lib "opengl32.dll" (ByVal x As Single, ByVal y As Single, ByVal z As Single, ByVal w As Single) -Public Declare Sub glRasterPos4i Lib "opengl32.dll" (ByVal x As Long, ByVal y As Long, ByVal z As Long, ByVal w As Long) -Public Declare Sub glRasterPos4s Lib "opengl32.dll" (ByVal x As Integer, ByVal y As Integer, ByVal z As Integer, ByVal w As Integer) -Public Declare Sub glRasterPos2dv Lib "opengl32.dll" (v As Double) -Public Declare Sub glRasterPos2fv Lib "opengl32.dll" (v As Single) -Public Declare Sub glRasterPos2iv Lib "opengl32.dll" (v As Long) -Public Declare Sub glRasterPos2sv Lib "opengl32.dll" (v As Integer) -Public Declare Sub glRasterPos3dv Lib "opengl32.dll" (v As Double) -Public Declare Sub glRasterPos3fv Lib "opengl32.dll" (v As Single) -Public Declare Sub glRasterPos3iv Lib "opengl32.dll" (v As Long) -Public Declare Sub glRasterPos3sv Lib "opengl32.dll" (v As Integer) -Public Declare Sub glRasterPos4dv Lib "opengl32.dll" (v As Double) -Public Declare Sub glRasterPos4fv Lib "opengl32.dll" (v As Single) -Public Declare Sub glRasterPos4iv Lib "opengl32.dll" (v As Long) -Public Declare Sub glRasterPos4sv Lib "opengl32.dll" (v As Integer) -Public Declare Sub glRectd Lib "opengl32.dll" (ByVal x1 As Double, ByVal y1 As Double, ByVal x2 As Double, ByVal y2 As Double) -Public Declare Sub glRectf Lib "opengl32.dll" (ByVal x1 As Single, ByVal y1 As Single, ByVal x2 As Single, ByVal y2 As Single) -Public Declare Sub glRecti Lib "opengl32.dll" (ByVal x1 As Long, ByVal y1 As Long, ByVal x2 As Long, ByVal y2 As Long) -Public Declare Sub glRects Lib "opengl32.dll" (ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer) -Public Declare Sub glRectdv Lib "opengl32.dll" (v1 As Double, v2 As Double) -Public Declare Sub glRectfv Lib "opengl32.dll" (v1 As Single, v2 As Single) -Public Declare Sub glRectiv Lib "opengl32.dll" (v1 As Long, v2 As Long) -Public Declare Sub glRectsv Lib "opengl32.dll" (v1 As Integer, v2 As Integer) - -' Lighting -Public Declare Sub glShadeModel Lib "opengl32.dll" (ByVal mode As Long) -Public Declare Sub glLightf Lib "opengl32.dll" (ByVal light As Long, ByVal pname As Long, ByVal param As Single) -Public Declare Sub glLighti Lib "opengl32.dll" (ByVal light As Long, ByVal pname As Long, ByVal param As Long) -Public Declare Sub glLightfv Lib "opengl32.dll" (ByVal light As Long, ByVal pname As Long, params As Single) -Public Declare Sub glLightiv Lib "opengl32.dll" (ByVal light As Long, ByVal pname As Long, params As Long) -Public Declare Sub glGetLightfv Lib "opengl32.dll" (ByVal light As Long, ByVal pname As Long, params As Single) -Public Declare Sub glGetLightiv Lib "opengl32.dll" (ByVal light As Long, ByVal pname As Long, params As Long) -Public Declare Sub glLightModelf Lib "opengl32.dll" (ByVal pname As Long, ByVal param As Single) -Public Declare Sub glLightModeli Lib "opengl32.dll" (ByVal pname As Long, ByVal param As Long) -Public Declare Sub glLightModelfv Lib "opengl32.dll" (ByVal pname As Long, params As Single) -Public Declare Sub glLightModeliv Lib "opengl32.dll" (ByVal pname As Long, params As Long) -Public Declare Sub glMaterialf Lib "opengl32.dll" (ByVal face As Long, ByVal pname As Long, ByVal param As Single) -Public Declare Sub glMateriali Lib "opengl32.dll" (ByVal face As Long, ByVal pname As Long, ByVal param As Long) -Public Declare Sub glMaterialfv Lib "opengl32.dll" (ByVal face As Long, ByVal pname As Long, params As Single) -Public Declare Sub glMaterialiv Lib "opengl32.dll" (ByVal face As Long, ByVal pname As Long, params As Long) -Public Declare Sub glGetMaterialfv Lib "opengl32.dll" (ByVal face As Long, ByVal pname As Long, params As Single) -Public Declare Sub glGetMaterialiv Lib "opengl32.dll" (ByVal face As Long, ByVal pname As Long, params As Long) -Public Declare Sub glColorMaterial Lib "opengl32.dll" (ByVal face As Long, ByVal mode As Long) - -' Raster functions -Public Declare Sub glPixelZoom Lib "opengl32.dll" (ByVal xfactor As Single, ByVal yfactor As Single) -Public Declare Sub glPixelStoref Lib "opengl32.dll" (ByVal pname As Long, ByVal param As Single) -Public Declare Sub glPixelStorei Lib "opengl32.dll" (ByVal pname As Long, ByVal param As Long) -Public Declare Sub glPixelTransferf Lib "opengl32.dll" (ByVal pname As Long, ByVal param As Single) -Public Declare Sub glPixelTransferi Lib "opengl32.dll" (ByVal pname As Long, ByVal param As Long) -Public Declare Sub glPixelMapfv Lib "opengl32.dll" (ByVal map As Long, ByVal mapsize As Long, values As Single) -Public Declare Sub glPixelMapuiv Lib "opengl32.dll" (ByVal map As Long, ByVal mapsize As Long, values As Long) -Public Declare Sub glPixelMapusv Lib "opengl32.dll" (ByVal map As Long, ByVal mapsize As Long, values As Integer) -Public Declare Sub glGetPixelMapfv Lib "opengl32.dll" (ByVal map As Long, values As Single) -Public Declare Sub glGetPixelMapuiv Lib "opengl32.dll" (ByVal map As Long, values As Long) -Public Declare Sub glGetPixelMapusv Lib "opengl32.dll" (ByVal map As Long, values As Integer) -Public Declare Sub glBitmap Lib "opengl32.dll" (ByVal width As Long, ByVal height As Long, ByVal xorig As Single, ByVal yorig As Single, ByVal xmove As Single, ByVal ymove As Single, bitmap As Byte) -Public Declare Sub glReadPixels Lib "opengl32.dll" (ByVal x As Long, ByVal y As Long, ByVal width As Long, ByVal height As Long, ByVal format As Long, ByVal t As Long, pixels As Any) -Public Declare Sub glDrawPixels Lib "opengl32.dll" (ByVal width As Long, ByVal height As Long, ByVal format As Long, ByVal t As Long, pixels As Any) -Public Declare Sub glCopyPixels Lib "opengl32.dll" (ByVal x As Long, ByVal y As Long, ByVal width As Long, ByVal height As Long, ByVal t As Long) - -' Stenciling -Public Declare Sub glStencilFunc Lib "opengl32.dll" (ByVal func As Long, ByVal ref As Long, ByVal mask As Long) -Public Declare Sub glStencilMask Lib "opengl32.dll" (ByVal mask As Long) -Public Declare Sub glStencilOp Lib "opengl32.dll" (ByVal fail As Long, ByVal zfail As Long, ByVal zpass As Long) -Public Declare Sub glClearStencil Lib "opengl32.dll" (ByVal s As Long) - -' Texture mapping -Public Declare Sub glTexGend Lib "opengl32.dll" (ByVal coord As Long, ByVal pname As Long, ByVal param As Double) -Public Declare Sub glTexGenf Lib "opengl32.dll" (ByVal coord As Long, ByVal pname As Long, ByVal param As Single) -Public Declare Sub glTexGeni Lib "opengl32.dll" (ByVal coord As Long, ByVal pname As Long, ByVal param As Long) -Public Declare Sub glTexGendv Lib "opengl32.dll" (ByVal coord As Long, ByVal pname As Long, params As Double) -Public Declare Sub glTexGenfv Lib "opengl32.dll" (ByVal coord As Long, ByVal pname As Long, params As Single) -Public Declare Sub glTexGeniv Lib "opengl32.dll" (ByVal coord As Long, ByVal pname As Long, params As Long) -Public Declare Sub glGetTexGendv Lib "opengl32.dll" (ByVal coord As Long, ByVal pname As Long, params As Double) -Public Declare Sub glGetTexGenfv Lib "opengl32.dll" (ByVal coord As Long, ByVal pname As Long, params As Single) -Public Declare Sub glGetTexGeniv Lib "opengl32.dll" (ByVal coord As Long, ByVal pname As Long, params As Long) -Public Declare Sub glTexEnvf Lib "opengl32.dll" (ByVal target As Long, ByVal pname As Long, ByVal param As Single) -Public Declare Sub glTexEnvi Lib "opengl32.dll" (ByVal target As Long, ByVal pname As Long, ByVal param As Long) -Public Declare Sub glTexEnvfv Lib "opengl32.dll" (ByVal target As Long, ByVal pname As Long, params As Single) -Public Declare Sub glTexEnviv Lib "opengl32.dll" (ByVal target As Long, ByVal pname As Long, params As Long) -Public Declare Sub glGetTexEnvfv Lib "opengl32.dll" (ByVal target As Long, ByVal pname As Long, params As Single) -Public Declare Sub glGetTexEnviv Lib "opengl32.dll" (ByVal target As Long, ByVal pname As Long, params As Long) -Public Declare Sub glTexParameterf Lib "opengl32.dll" (ByVal target As Long, ByVal pname As Long, ByVal param As Single) -Public Declare Sub glTexParameteri Lib "opengl32.dll" (ByVal target As Long, ByVal pname As Long, ByVal param As Long) -Public Declare Sub glTexParameterfv Lib "opengl32.dll" (ByVal target As Long, ByVal pname As Long, params As Single) -Public Declare Sub glTexParameteriv Lib "opengl32.dll" (ByVal target As Long, ByVal pname As Long, params As Long) -Public Declare Sub glGetTexParameterfv Lib "opengl32.dll" (ByVal target As Long, ByVal pname As Long, params As Single) -Public Declare Sub glGetTexParameteriv Lib "opengl32.dll" (ByVal target As Long, ByVal pname As Long, params As Long) -Public Declare Sub glGetTexLevelParameterfv Lib "opengl32.dll" (ByVal target As Long, ByVal level As Long, ByVal pname As Long, params As Single) -Public Declare Sub glGetTexLevelParameteriv Lib "opengl32.dll" (ByVal target As Long, ByVal level As Long, ByVal pname As Long, params As Long) -Public Declare Sub glTexImage1D Lib "opengl32.dll" (ByVal target As Long, ByVal level As Long, ByVal internalFormat As Long, ByVal width As Long, ByVal border As Long, ByVal format As Long, ByVal t As Long, pixels As Any) -Public Declare Sub glTexImage2D Lib "opengl32.dll" (ByVal target As Long, ByVal level As Long, ByVal internalFormat As Long, ByVal width As Long, ByVal height As Long, ByVal border As Long, ByVal format As Long, ByVal t As Long, pixels As Any) -Public Declare Sub glGetTexImage Lib "opengl32.dll" (ByVal target As Long, ByVal level As Long, ByVal format As Long, ByVal t As Long, pixels As Any) - -' Evaluators -Public Declare Sub glMap1d Lib "opengl32.dll" (ByVal target As Long, ByVal u1 As Double, ByVal u2 As Double, ByVal stride As Long, ByVal order As Long, points As Double) -Public Declare Sub glMap1f Lib "opengl32.dll" (ByVal target As Long, ByVal u1 As Single, ByVal u2 As Single, ByVal stride As Long, ByVal order As Long, points As Single) -Public Declare Sub glMap2d Lib "opengl32.dll" (ByVal target As Long, ByVal u1 As Double, ByVal u2 As Double, ByVal ustride As Long, ByVal uorder As Long, ByVal v1 As Double, ByVal v2 As Double, ByVal vstride As Long, ByVal vorder As Long, points As Double) -Public Declare Sub glMap2f Lib "opengl32.dll" (ByVal target As Long, ByVal u1 As Single, ByVal u2 As Single, ByVal ustride As Long, ByVal uorder As Long, ByVal v1 As Single, ByVal v2 As Single, ByVal vstride As Long, ByVal vorder As Long, points As Single) -Public Declare Sub glGetMapdv Lib "opengl32.dll" (ByVal target As Long, ByVal query As Long, v As Double) -Public Declare Sub glGetMapfv Lib "opengl32.dll" (ByVal target As Long, ByVal query As Long, v As Single) -Public Declare Sub glGetMapiv Lib "opengl32.dll" (ByVal target As Long, ByVal query As Long, v As Long) -Public Declare Sub glEvalCoord1d Lib "opengl32.dll" (ByVal u As Double) -Public Declare Sub glEvalCoord1f Lib "opengl32.dll" (ByVal u As Single) -Public Declare Sub glEvalCoord1dv Lib "opengl32.dll" (u As Double) -Public Declare Sub glEvalCoord1fv Lib "opengl32.dll" (u As Single) -Public Declare Sub glEvalCoord2d Lib "opengl32.dll" (ByVal u As Double, ByVal v As Double) -Public Declare Sub glEvalCoord2f Lib "opengl32.dll" (ByVal u As Single, ByVal v As Single) -Public Declare Sub glEvalCoord2dv Lib "opengl32.dll" (u As Double) -Public Declare Sub glEvalCoord2fv Lib "opengl32.dll" (u As Single) -Public Declare Sub glMapGrid1d Lib "opengl32.dll" (ByVal un As Long, ByVal u1 As Double, ByVal u2 As Double) -Public Declare Sub glMapGrid1f Lib "opengl32.dll" (ByVal un As Long, ByVal u1 As Single, ByVal u2 As Single) -Public Declare Sub glMapGrid2d Lib "opengl32.dll" (ByVal un As Long, ByVal u1 As Double, ByVal u2 As Double, ByVal vn As Long, ByVal v1 As Double, ByVal v2 As Double) -Public Declare Sub glMapGrid2f Lib "opengl32.dll" (ByVal un As Long, ByVal u1 As Single, ByVal u2 As Single, ByVal vn As Long, ByVal v1 As Single, ByVal v2 As Single) -Public Declare Sub glEvalPoint1 Lib "opengl32.dll" (ByVal i As Long) -Public Declare Sub glEvalPoint2 Lib "opengl32.dll" (ByVal i As Long, ByVal j As Long) -Public Declare Sub glEvalMesh1 Lib "opengl32.dll" (ByVal mode As Long, ByVal i1 As Long, ByVal i2 As Long) -Public Declare Sub glEvalMesh2 Lib "opengl32.dll" (ByVal mode As Long, ByVal i1 As Long, ByVal i2 As Long, ByVal j1 As Long, ByVal j2 As Long) - -' Fog -Public Declare Sub glFogf Lib "opengl32.dll" (ByVal pname As Long, ByVal param As Single) -Public Declare Sub glFogi Lib "opengl32.dll" (ByVal pname As Long, ByVal param As Long) -Public Declare Sub glFogfv Lib "opengl32.dll" (ByVal pname As Long, params As Single) -Public Declare Sub glFogiv Lib "opengl32.dll" (ByVal pname As Long, params As Long) - -' Selection and Feedback -Public Declare Sub glFeedbackBuffer Lib "opengl32.dll" (ByVal size As Long, ByVal t As Long, buffer As Single) -Public Declare Sub glPassThrough Lib "opengl32.dll" (ByVal token As Single) -Public Declare Sub glSelectBuffer Lib "opengl32.dll" (ByVal size As Long, buffer As Long) -Public Declare Sub glInitNames Lib "opengl32.dll" () -Public Declare Sub glLoadName Lib "opengl32.dll" (ByVal name As Long) -Public Declare Sub glPushName Lib "opengl32.dll" (ByVal name As Long) -Public Declare Sub glPopName Lib "opengl32.dll" () - - -' 1.1 functions -' texture objects -Public Declare Sub glGenTextures Lib "opengl32.dll" (ByVal n As Long, textures As Long) -Public Declare Sub glDeleteTextures Lib "opengl32.dll" (ByVal n As Long, textures As Long) -Public Declare Sub glBindTexture Lib "opengl32.dll" (ByVal target As Long, ByVal texture As Long) -Public Declare Sub glPrioritizeTextures Lib "opengl32.dll" (ByVal n As Long, textures As Long, priorities As Single) -Public Declare Function glAreTexturesResident Lib "opengl32.dll" (ByVal n As Long, textures As Long, residences As Byte) As Byte -Public Declare Function glIsTexture Lib "opengl32.dll" (ByVal texture As Long) As Byte -' texture mapping -Public Declare Sub glTexSubImage1D Lib "opengl32.dll" (ByVal target As Long, ByVal level As Long, ByVal xoffset As Long, ByVal width As Long, ByVal format As Long, ByVal t As Long, pixels As Any) -Public Declare Sub glTexSubImage2D Lib "opengl32.dll" (ByVal target As Long, ByVal level As Long, ByVal xoffset As Long, ByVal yoffset As Long, ByVal width As Long, ByVal height As Long, ByVal format As Long, ByVal t As Long, pixels As Any) -Public Declare Sub glCopyTexImage1D Lib "opengl32.dll" (ByVal target As Long, ByVal level As Long, ByVal internalFormat As Long, ByVal x As Long, ByVal y As Long, ByVal width As Long, ByVal border As Long) -Public Declare Sub glCopyTexImage2D Lib "opengl32.dll" (ByVal target As Long, ByVal level As Long, ByVal internalFormat As Long, ByVal x As Long, ByVal y As Long, ByVal width As Long, ByVal height As Long, ByVal border As Long) -Public Declare Sub glCopyTexSubImage1D Lib "opengl32.dll" (ByVal target As Long, ByVal level As Long, ByVal xoffset As Long, ByVal x As Long, ByVal y As Long, ByVal width As Long) -Public Declare Sub glCopyTexSubImage2D Lib "opengl32.dll" (ByVal target As Long, ByVal level As Long, ByVal xoffset As Long, ByVal yoffset As Long, ByVal x As Long, ByVal y As Long, ByVal width As Long, ByVal height As Long) -' vertex arrays -Public Declare Sub glVertexPointer Lib "opengl32.dll" (ByVal size As Long, ByVal t As Long, ByVal stride As Long, ptr As Any) -Public Declare Sub glNormalPointer Lib "opengl32.dll" (ByVal t As Long, ByVal stride As Long, ptr As Any) -Public Declare Sub glColorPointer Lib "opengl32.dll" (ByVal size As Long, ByVal t As Long, ByVal stride As Long, ptr As Any) -Public Declare Sub glIndexPointer Lib "opengl32.dll" (ByVal t As Long, ByVal stride As Long, ptr As Any) -Public Declare Sub glTexCoordPointer Lib "opengl32.dll" (ByVal size As Long, ByVal t As Long, ByVal stride As Long, ptr As Any) -Public Declare Sub glEdgeFlagPointer Lib "opengl32.dll" (ByVal stride As Long, ptr As Any) -Public Declare Sub glGetPointerv Lib "opengl32.dll" (ByVal pname As Long, params As Any) -Public Declare Sub glArrayElement Lib "opengl32.dll" (ByVal i As Long) -Public Declare Sub glDrawArrays Lib "opengl32.dll" (ByVal mode As Long, ByVal first As Long, ByVal count As Long) -Public Declare Sub glDrawElements Lib "opengl32.dll" (ByVal mode As Long, ByVal count As Long, ByVal t As Long, indices As Any) -Public Declare Sub glInterleavedArrays Lib "opengl32.dll" (ByVal format As Long, ByVal stride As Long, pointer As Any) diff -Nru glfw-2.6/support/visualbasic/examples/Triangle.bas glfw-2.7.2/support/visualbasic/examples/Triangle.bas --- glfw-2.6/support/visualbasic/examples/Triangle.bas 2004-02-14 20:36:24.000000000 +0000 +++ glfw-2.7.2/support/visualbasic/examples/Triangle.bas 1970-01-01 00:00:00.000000000 +0000 @@ -1,101 +0,0 @@ -Attribute VB_Name = "Program" -'======================================================================== -' This is a small test application for GLFW. -' The program opens a window (640x480), and renders a spinning colored -' triangle (it is controlled with both the GLFW timer and the mouse). It -' also calculates the rendering speed (FPS), which is displayed in the -' window title bar. -'======================================================================== - -Private Sub Main() - - Dim running, frames, Ok As Long - Dim x, y, width, height As Long - Dim t0, t, fps As Double - Dim titlestr As String - - ' Initialize GLFW - Ok = glfwInit - - ' Open OpenGL window - Ok = glfwOpenWindow(640, 480, 0, 0, 0, 0, 0, 0, GLFW_WINDOW) - If Ok = 0 Then - glfwTerminate - End - End If - - ' Enable sticky keys - glfwEnable (GLFW_STICKY_KEYS) - - ' Disable vertical sync (on cards that support it) - glfwSwapInterval 0 - - ' Main loop - running = 1 - frames = 0 - t0 = glfwGetTime - While running = 1 - ' Get time and mouse position - t = glfwGetTime - glfwGetMousePos x, y - - ' Calculate and display FPS (frames per second) - If (t - t0) > 1# Or frames = 0 Then - fps = frames / (t - t0) - titlestr = "Spinning Triangle (" + Str(Round(fps, 1)) + " FPS)" - glfwSetWindowTitle titlestr - t0 = t - frames = 0 - End If - frames = frames + 1 - - ' Get window size (may be different than the requested size) - glfwGetWindowSize width, height - If height <= 0 Then height = 1 - - ' Set viewport - glViewport 0, 0, width, height - - ' Clear color buffer - glClearColor 0#, 0#, 0#, 0# - glClear GL_COLOR_BUFFER_BIT - - ' Select and setup the projection matrix - glMatrixMode GL_PROJECTION - glLoadIdentity - gluPerspective 65#, width / height, 1#, 100# - - ' Select and setup the modelview matrix - glMatrixMode GL_MODELVIEW - glLoadIdentity - gluLookAt 0#, 1#, 0#, 0#, 20#, 0#, 0#, 0#, 1# - - ' Draw a rotating colorful triangle - glTranslatef 0#, 14#, 0# - glRotatef 0.3 * x + t * 100#, 0#, 0#, 1# - glBegin GL_TRIANGLES - glColor3f 1#, 0#, 0# - glVertex3f -5#, 0#, -4# - glColor3f 0#, 1#, 0# - glVertex3f 5#, 0#, -4# - glColor3f 0#, 0#, 1# - glVertex3f 0#, 0#, 6# - glEnd - - ' Swap buffers - glfwSwapBuffers - - ' Check if the ESC key was pressed or the window was closed - If glfwGetKey(GLFW_KEY_ESC) = 1 Or glfwGetWindowParam(GLFW_OPENED) = 0 Then - running = 0 - End If - Wend - - ' Close OpenGL window and terminate GLFW - glfwTerminate - - ' Exit program - End - -End Sub - diff -Nru glfw-2.6/support/visualbasic/readme.html glfw-2.7.2/support/visualbasic/readme.html --- glfw-2.6/support/visualbasic/readme.html 2007-05-25 09:56:38.000000000 +0000 +++ glfw-2.7.2/support/visualbasic/readme.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,164 +0,0 @@ - - - - GLFW Readme file for Visual Basic - - - - -
    -GLFW v2.5
    -for Visual Basic -
    - - -

    -

    -
    - -
      -
    1. Introduction
    2. -
    3. Using GLFW from Visual Basic
    4. -
    5. The author
    6. -
    -
    -
    -
    - - - -


    - - -
    -

    1. Introduction

    - -

    This directory contains Visual Basic bindings for the GLFW v2.5.x -Windows DLL, and Visual Basic example programs. For further information -on how to use GLFW you should read the GLFW documentation. - - -


    - - -
    -

    2. Using GLFW from Visual Basic

    - -

    2.1 General

    - -

    Using GLFW is slightly different from what Visual Basic users may be -used to, since GLFW replaces much of the functionality already built in to -Visual Basic. For instance, mouse clicks and key presses that occur in a -GLFW window are handled completely by GLFW, and in order to handle such -events you have to rely on GLFW functionality. While this may feel odd at -first, it does not necessarily have to be a disadvantage. - -

    The most important thing to comprehend is the way a GLFW "main loop" -works. Unlike ordinary Visual Basic programs, which are largely event -based, GLFW programs usually have a core loop that runs "forever" (until -aborted for some reason). To understand how it works, please look at the -supplied example programs. You should also read the GLFW Users Guide, -which explains how to use GLFW (regardless of programming language). - - -


    2.2 About the Visual Basic project

    - -

    In order to use GLFW from a Visual Basic project, you need to add the -file glfw.bas to your project (add existing module). It contains -all the necessary constant, structure and function definitions. You also -have to copy the file glfw.dll to your project directory. - -

    Typically you want to call OpenGL functions from your Visual Basic -program too. Threfore there are also bindings for opengl32.dll and -glu32.dll included in this distribution, namely opengl32.bas and -glu32.bas. Note that these files have not been tested fully, so -there may be bugs in them (please report them if you find them). - -

    If you wish to make a "pure" GLFW project (no forms), you can create a -a new module, in which you place a procedure named 'Main': - -

    Private Sub Main()
    End Sub
    - -

    Then select Project Properties, and under the General -tab, in the Startup Object field, select Sub Main. This is -how the example programs are meant to be used. - -

    It is of course possible to mix Visual Basic forms and GLFW code. For -instance you can have a form button that starts your OpenGL program by -initializing GLFW, opening a GLFW window and entering a GLFW main loop -etc. - - -


    2.3 Calling GLFW functions

    - -

    In principle, the GLFW functions can be called with the same syntax as -described in the GLFW Reference Manual. The primary difference is that -some GLFW functions are treated as Visual Basic subroutines ("Sub"), which -means that you should not use parentheses around the argument list. The -functions that are treated as subroutines are functions that, in 'C' -terms, return "void" (in other words, nothing). An example is -the glfwGetMousePos function, which should be called like this: - -

      glfwGetMousePos xpos, ypos - -

    To be honest, my knowledge in Visual Basic is quite limited, so there -may be other options and other things to consider. Have a look at the -example programs for examples of how to call GLFW functions. - - -


    2.4 Using callback functions

    - -

    GLFW callback functions are very similar to Visual Basic event -subroutines (e.g. Private Sub Command1_Click()). The primary -difference is that you have to specify the functions manually, using GLFW -functions (such as glfwSetMousePosCallback). GLFW callback -functions, once registered, are called only when glfwSwapBuffers or -glfwPollEvents are called (if there are any corresponding events -pending). - -

    Creating callback functions is pretty simple. All you need to do is to -declare a subroutine as specified in the GLFW Reference Manual, but of -course translated to Visual Basic. For instance a mouse position callback -function should, in 'C' language, be: - -

    void GLFWCALL MyFun( int xpos, int ypos) - -

    Never mind the GLFWCALL thing (it has to do with 'C' language calling -conventions). In Visual Basic, this translates into: - -

    Private Sub MyFun(ByVal xpos As Long, ByVal ypos As Long) - -

    To register the callback function you should use the AddressOf -operator, like this: - -

      glfwSetMousePosCallback AddressOf MyFun - -

    Done! - - - - -


    - - -
    -

    3. The maintainer

    - -

    My name is Camilla Berglund, -elmindreda@users.sourceforge.net. -Please visit our -support forums -if you have any problems with GLFW or any questions concerning GLFW. - -

    The GLFW web site can be found here: -http://glfw.sourceforge.net/. -It contains the latest version of GLFW, news and other information that is -useful for OpenGL development. - - -


    - - - - - diff -Nru glfw-2.6/tests/accuracy.c glfw-2.7.2/tests/accuracy.c --- glfw-2.6/tests/accuracy.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/accuracy.c 2010-08-08 14:58:36.000000000 +0000 @@ -0,0 +1,103 @@ +//======================================================================== +// Mouse cursor accuracy test +// Copyright (c) Camilla Berglund +// +// 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. +// +//======================================================================== +// +// This test came about as the result of bug #1867804 +// +// No sign of said bug has so far been detected +// +//======================================================================== + +#include + +#include +#include + +static int cursor_x = 0, cursor_y = 0; +static int window_width = 640, window_height = 480; + +static void GLFWCALL window_size_callback(int width, int height) +{ + window_width = width; + window_height = height; + + glViewport(0, 0, window_width, window_height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0.f, window_width, 0.f, window_height); +} + +static void GLFWCALL mouse_position_callback(int x, int y) +{ + cursor_x = x; + cursor_y = y; +} + +int main(void) +{ + if (!glfwInit()) + { + fprintf(stderr, "Failed to initialize GLFW\n"); + exit(EXIT_FAILURE); + } + + if (!glfwOpenWindow(window_width, window_height, 0, 0, 0, 0, 0, 0, GLFW_WINDOW)) + { + glfwTerminate(); + + fprintf(stderr, "Failed to open GLFW window\n"); + exit(EXIT_FAILURE); + } + + glfwSetWindowTitle("Cursor Inaccuracy Detector"); + glfwSetMousePosCallback(mouse_position_callback); + glfwSetWindowSizeCallback(window_size_callback); + glfwSwapInterval(1); + + glClearColor(0, 0, 0, 0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + while (glfwGetWindowParam(GLFW_OPENED)) + { + glClear(GL_COLOR_BUFFER_BIT); + + glColor3f(1.f, 1.f, 1.f); + + glBegin(GL_LINES); + glVertex2f(0.f, (GLfloat) window_height - cursor_y); + glVertex2f((GLfloat) window_width, (GLfloat) window_height - cursor_y); + glVertex2f((GLfloat) cursor_x, 0.f); + glVertex2f((GLfloat) cursor_x, (GLfloat) window_height); + glEnd(); + + glfwSwapBuffers(); + } + + glfwTerminate(); + exit(EXIT_SUCCESS); +} + diff -Nru glfw-2.6/tests/bundle.sh glfw-2.7.2/tests/bundle.sh --- glfw-2.6/tests/bundle.sh 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/bundle.sh 2009-10-18 10:30:13.000000000 +0000 @@ -0,0 +1,46 @@ +#!/bin/sh + +# Creates application bundles for use on Mac OS X. + +if [ -z "$1" ]; then + echo "usage: `basename $0` BUNDLE-NAME" + exit 1 +fi + +bundle_name="$1" + +if [ ! -d "${bundle_name}.app/Contents/MacOS" ]; then + mkdir -p "${bundle_name}.app/Contents/MacOS" +fi + +if [ ! -d "${bundle_name}.app/Contents/Resources" ]; then + mkdir -p "${bundle_name}.app/Contents/Resources" +fi + +if [ ! -f "${bundle_name}.app/Contents/PkgInfo" ]; then + echo -n "APPL????" > "${bundle_name}.app/Contents/PkgInfo" +fi + +if [ ! -f "${bundle_name}.app/Contents/Info.plist" ]; then + cat > "${bundle_name}.app/Contents/Info.plist" < + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${bundle_name} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 0.1 + + +EOF +fi + diff -Nru glfw-2.6/tests/defaults.c glfw-2.7.2/tests/defaults.c --- glfw-2.6/tests/defaults.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/defaults.c 2010-08-08 14:58:36.000000000 +0000 @@ -0,0 +1,98 @@ +//======================================================================== +// Default window/context test +// Copyright (c) Camilla Berglund +// +// 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. +// +//======================================================================== +// +// This test creates a windowed mode window with all parameters set to +// default values and then reports the actual parameters of the created +// window and context +// +//======================================================================== + +#include + +#include +#include + +typedef struct +{ + int param; + char* name; +} Param; + +static Param parameters[] = +{ + { GLFW_ACCELERATED, "accelerated" }, + { GLFW_RED_BITS, "red bits" }, + { GLFW_GREEN_BITS, "green bits" }, + { GLFW_BLUE_BITS, "blue bits" }, + { GLFW_ALPHA_BITS, "alpha bits" }, + { GLFW_DEPTH_BITS, "depth bits" }, + { GLFW_STENCIL_BITS, "stencil bits" }, + { GLFW_REFRESH_RATE, "refresh rate" }, + { GLFW_ACCUM_RED_BITS, "accum red bits" }, + { GLFW_ACCUM_GREEN_BITS, "accum green bits" }, + { GLFW_ACCUM_BLUE_BITS, "accum blue bits" }, + { GLFW_ACCUM_ALPHA_BITS, "accum alpha bits" }, + { GLFW_AUX_BUFFERS, "aux buffers" }, + { GLFW_STEREO, "stereo" }, + { GLFW_FSAA_SAMPLES, "FSAA samples" }, + { GLFW_OPENGL_VERSION_MAJOR, "OpenGL major" }, + { GLFW_OPENGL_VERSION_MINOR, "OpenGL minor" }, + { GLFW_OPENGL_FORWARD_COMPAT, "OpenGL forward compatible" }, + { GLFW_OPENGL_DEBUG_CONTEXT, "OpenGL debug context" }, + { GLFW_OPENGL_PROFILE, "OpenGL profile" }, +}; + +int main(void) +{ + int i, width, height; + + if (!glfwInit()) + { + fprintf(stderr, "Failed to initialize GLFW\n"); + exit(1); + } + + if (!glfwOpenWindow(0, 0, 0, 0, 0, 0, 0, 0, GLFW_WINDOW)) + { + glfwTerminate(); + + fprintf(stderr, "Failed to open GLFW default window\n"); + exit(1); + } + + glfwGetWindowSize(&width, &height); + + printf("window size: %ix%i\n", width, height); + + for (i = 0; (size_t) i < sizeof(parameters) / sizeof(parameters[0]); i++) + { + printf("%s: %i\n", parameters[i].name, glfwGetWindowParam(parameters[i].param)); + } + + glfwCloseWindow(); + glfwTerminate(); + exit(0); +} + diff -Nru glfw-2.6/tests/dynamic.c glfw-2.7.2/tests/dynamic.c --- glfw-2.6/tests/dynamic.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/dynamic.c 2011-07-26 23:59:52.000000000 +0000 @@ -0,0 +1,85 @@ +//======================================================================== +// Dynamic linking test +// Copyright (c) Camilla Berglund +// +// 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. +// +//======================================================================== +// +// This test came about as the result of bug #3060461 +// +//======================================================================== + +#define GLFW_DLL +#include + +#include +#include + +static void GLFWCALL window_size_callback(int width, int height) +{ + glViewport(0, 0, width, height); +} + +int main(void) +{ + int major, minor, rev; + glfwGetVersion(&major, &minor, &rev); + + if (major != GLFW_VERSION_MAJOR || + minor != GLFW_VERSION_MINOR || + rev != GLFW_VERSION_REVISION) + { + fprintf(stderr, "GLFW library version mismatch\n"); + exit(EXIT_FAILURE); + } + + if (!glfwInit()) + { + fprintf(stderr, "Failed to initialize GLFW\n"); + exit(EXIT_FAILURE); + } + + if (!glfwOpenWindow(0, 0, 0, 0, 0, 0, 0, 0, GLFW_WINDOW)) + { + fprintf(stderr, "Failed to open GLFW window\n"); + exit(EXIT_FAILURE); + } + + glfwSetWindowTitle("Dynamic Linking Test"); + glfwSetWindowSizeCallback(window_size_callback); + glfwSwapInterval(1); + + glClearColor(0, 0, 0, 0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + while (glfwGetWindowParam(GLFW_OPENED)) + { + glClear(GL_COLOR_BUFFER_BIT); + + glfwSwapBuffers(); + } + + glfwTerminate(); + exit(EXIT_SUCCESS); +} + diff -Nru glfw-2.6/tests/events.c glfw-2.7.2/tests/events.c --- glfw-2.6/tests/events.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/events.c 2011-06-24 12:04:54.000000000 +0000 @@ -0,0 +1,311 @@ +//======================================================================== +// Event linter (event spewer) +// Copyright (c) Camilla Berglund +// +// 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. +// +//======================================================================== +// +// This test hooks every available callback and outputs their arguments +// +// Log messages go to stdout, error messages to stderr +// +// Every event also gets a (sequential) number to aid discussion of logs +// +//======================================================================== + +#include + +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +#include +#include + +static GLboolean keyrepeat = 0; +static GLboolean systemkeys = 1; +static unsigned int counter = 0; + +static const char* get_key_name(int key) +{ + switch (key) + { + case GLFW_KEY_UNKNOWN: return "unknown"; + case GLFW_KEY_SPACE: return "space"; + case GLFW_KEY_ESC: return "escape"; + case GLFW_KEY_F1: return "F1"; + case GLFW_KEY_F2: return "F2"; + case GLFW_KEY_F3: return "F3"; + case GLFW_KEY_F4: return "F4"; + case GLFW_KEY_F5: return "F5"; + case GLFW_KEY_F6: return "F6"; + case GLFW_KEY_F7: return "F7"; + case GLFW_KEY_F8: return "F8"; + case GLFW_KEY_F9: return "F9"; + case GLFW_KEY_F10: return "F10"; + case GLFW_KEY_F11: return "F11"; + case GLFW_KEY_F12: return "F12"; + case GLFW_KEY_F13: return "F13"; + case GLFW_KEY_F14: return "F14"; + case GLFW_KEY_F15: return "F15"; + case GLFW_KEY_F16: return "F16"; + case GLFW_KEY_F17: return "F17"; + case GLFW_KEY_F18: return "F18"; + case GLFW_KEY_F19: return "F19"; + case GLFW_KEY_F20: return "F20"; + case GLFW_KEY_F21: return "F21"; + case GLFW_KEY_F22: return "F22"; + case GLFW_KEY_F23: return "F23"; + case GLFW_KEY_F24: return "F24"; + case GLFW_KEY_F25: return "F25"; + case GLFW_KEY_UP: return "up"; + case GLFW_KEY_DOWN: return "down"; + case GLFW_KEY_LEFT: return "left"; + case GLFW_KEY_RIGHT: return "right"; + case GLFW_KEY_LSHIFT: return "left shift"; + case GLFW_KEY_RSHIFT: return "right shift"; + case GLFW_KEY_LCTRL: return "left control"; + case GLFW_KEY_RCTRL: return "right control"; + case GLFW_KEY_LALT: return "left alt"; + case GLFW_KEY_RALT: return "right alt"; + case GLFW_KEY_TAB: return "tab"; + case GLFW_KEY_ENTER: return "enter"; + case GLFW_KEY_BACKSPACE: return "backspace"; + case GLFW_KEY_INSERT: return "insert"; + case GLFW_KEY_DEL: return "delete"; + case GLFW_KEY_PAGEUP: return "page up"; + case GLFW_KEY_PAGEDOWN: return "page down"; + case GLFW_KEY_HOME: return "home"; + case GLFW_KEY_END: return "end"; + case GLFW_KEY_KP_0: return "keypad 0"; + case GLFW_KEY_KP_1: return "keypad 1"; + case GLFW_KEY_KP_2: return "keypad 2"; + case GLFW_KEY_KP_3: return "keypad 3"; + case GLFW_KEY_KP_4: return "keypad 4"; + case GLFW_KEY_KP_5: return "keypad 5"; + case GLFW_KEY_KP_6: return "keypad 6"; + case GLFW_KEY_KP_7: return "keypad 7"; + case GLFW_KEY_KP_8: return "keypad 8"; + case GLFW_KEY_KP_9: return "keypad 9"; + case GLFW_KEY_KP_DIVIDE: return "keypad divide"; + case GLFW_KEY_KP_MULTIPLY: return "keypad multiply"; + case GLFW_KEY_KP_SUBTRACT: return "keypad subtract"; + case GLFW_KEY_KP_ADD: return "keypad add"; + case GLFW_KEY_KP_DECIMAL: return "keypad decimal"; + case GLFW_KEY_KP_EQUAL: return "keypad equal"; + case GLFW_KEY_KP_ENTER: return "keypad enter"; + case GLFW_KEY_KP_NUM_LOCK: return "keypad num lock"; + case GLFW_KEY_CAPS_LOCK: return "caps lock"; + case GLFW_KEY_SCROLL_LOCK: return "scroll lock"; + case GLFW_KEY_PAUSE: return "pause"; + case GLFW_KEY_LSUPER: return "left super"; + case GLFW_KEY_RSUPER: return "right super"; + case GLFW_KEY_MENU: return "menu"; + } + + return NULL; +} + +static const char* get_action_name(int action) +{ + switch (action) + { + case GLFW_PRESS: + return "was pressed"; + case GLFW_RELEASE: + return "was released"; + } + + return "caused unknown action"; +} + +static const char* get_button_name(int button) +{ + switch (button) + { + case GLFW_MOUSE_BUTTON_LEFT: + return "left"; + case GLFW_MOUSE_BUTTON_RIGHT: + return "right"; + case GLFW_MOUSE_BUTTON_MIDDLE: + return "middle"; + } + + return NULL; +} + +static const char* get_character_string(int character) +{ + static char result[6 + 1]; + + int length = wctomb(result, character); + if (length == -1) + length = 0; + + result[length] = '\0'; + return result; +} + +static void GLFWCALL window_size_callback(int width, int height) +{ + printf("%08x at %0.3f: Window size: %i %i\n", + counter++, + glfwGetTime(), + width, + height); + + glViewport(0, 0, width, height); +} + +static int GLFWCALL window_close_callback(void) +{ + printf("%08x at %0.3f: Window close\n", counter++, glfwGetTime()); + return 1; +} + +static void GLFWCALL window_refresh_callback(void) +{ + printf("%08x at %0.3f: Window refresh\n", counter++, glfwGetTime()); +} + +static void GLFWCALL mouse_button_callback(int button, int action) +{ + const char* name = get_button_name(button); + + printf("%08x at %0.3f: Mouse button %i", counter++, glfwGetTime(), button); + + if (name) + printf(" (%s) was %s\n", name, get_action_name(action)); + else + printf(" was %s\n", get_action_name(action)); +} + +static void GLFWCALL mouse_position_callback(int x, int y) +{ + printf("%08x at %0.3f: Mouse position: %i %i\n", counter++, glfwGetTime(), x, y); +} + +static void GLFWCALL mouse_wheel_callback(int position) +{ + printf("%08x at %0.3f: Mouse wheel: %i\n", counter++, glfwGetTime(), position); +} + +static void GLFWCALL key_callback(int key, int action) +{ + const char* name = get_key_name(key); + + printf("%08x at %0.3f: Key 0x%04x", counter++, glfwGetTime(), key); + + if (name) + printf(" (%s) was %s\n", name, get_action_name(action)); + else if (isgraph(key)) + printf(" (%c) was %s\n", key, get_action_name(action)); + else + printf(" was %s\n", get_action_name(action)); + + if (action != GLFW_PRESS) + return; + + switch (key) + { + case 'R': + { + keyrepeat = !keyrepeat; + if (keyrepeat) + glfwEnable(GLFW_KEY_REPEAT); + else + glfwDisable(GLFW_KEY_REPEAT); + + printf("(( key repeat %s ))\n", keyrepeat ? "enabled" : "disabled"); + break; + } + + case 'S': + { + systemkeys = !systemkeys; + if( systemkeys ) + glfwEnable(GLFW_SYSTEM_KEYS); + else + glfwDisable(GLFW_SYSTEM_KEYS); + + printf("(( system keys %s ))\n", systemkeys ? "enabled" : "disabled"); + break; + } + } +} + +static void GLFWCALL char_callback(int character, int action) +{ + printf("%08x at %0.3f: Character 0x%04x", counter++, glfwGetTime(), character); + + printf(" (%s) %s\n", get_character_string(character), get_action_name(action)); +} + +int main(void) +{ + setlocale(LC_ALL, ""); + + if (!glfwInit()) + { + fprintf(stderr, "Failed to initialize GLFW\n"); + exit(1); + } + + printf("Library initialized\n"); + + if (!glfwOpenWindow(0, 0, 0, 0, 0, 0, 0, 0, GLFW_WINDOW)) + { + glfwTerminate(); + + fprintf(stderr, "Failed to create GLFW window"); + exit(1); + } + + printf("Window opened\n"); + + glfwSetWindowTitle("Event Linter"); + glfwSwapInterval(1); + + glfwSetWindowSizeCallback(window_size_callback); + glfwSetWindowCloseCallback(window_close_callback); + glfwSetWindowRefreshCallback(window_refresh_callback); + glfwSetMouseButtonCallback(mouse_button_callback); + glfwSetMousePosCallback(mouse_position_callback); + glfwSetMouseWheelCallback(mouse_wheel_callback); + glfwSetKeyCallback(key_callback); + glfwSetCharCallback(char_callback); + + printf("Key repeat should be %s\n", keyrepeat ? "enabled" : "disabled"); + printf("System keys should be %s\n", systemkeys ? "enabled" : "disabled"); + + printf("Main loop starting\n"); + + while (glfwGetWindowParam(GLFW_OPENED) == GL_TRUE) + { + glfwWaitEvents(); + glClear(GL_COLOR_BUFFER_BIT); + glfwSwapBuffers(); + } + + glfwTerminate(); + exit(0); +} + diff -Nru glfw-2.6/tests/fsaa.c glfw-2.7.2/tests/fsaa.c --- glfw-2.6/tests/fsaa.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/fsaa.c 2011-06-24 12:04:54.000000000 +0000 @@ -0,0 +1,115 @@ +//======================================================================== +// Fullscreen multisampling anti-aliasing test +// Copyright (c) Camilla Berglund +// +// 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. +// +//======================================================================== +// +// This test renders two high contrast, slowly rotating quads, one aliased +// and one (hopefully) anti-aliased, thus allowing for visual verification +// of whether FSAA is indeed enabled +// +//======================================================================== + +#include + +#include +#include + +#ifndef GL_ARB_multisample +#define GL_MULTISAMPLE_ARB 0x809D +#endif + +static void GLFWCALL window_size_callback(int width, int height) +{ + glViewport(0, 0, width, height); +} + +int main(void) +{ + int samples; + + if (!glfwInit()) + { + fprintf(stderr, "Failed to initialize GLFW\n"); + exit(EXIT_FAILURE); + } + + glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4); + + if (!glfwOpenWindow(400, 400, 0, 0, 0, 0, 0, 0, GLFW_WINDOW)) + { + glfwTerminate(); + + fprintf(stderr, "Failed to open GLFW window\n"); + exit(EXIT_FAILURE); + } + + if (!glfwExtensionSupported("GL_ARB_multisample")) + { + glfwTerminate(); + + fprintf(stderr, "Context reports GL_ARB_multisample is not supported\n"); + exit(EXIT_FAILURE); + } + + glfwSetWindowTitle("Aliasing Detector"); + glfwSetWindowSizeCallback(window_size_callback); + glfwSwapInterval(1); + + samples = glfwGetWindowParam(GLFW_FSAA_SAMPLES); + if (samples) + printf("Context reports FSAA is supported with %i samples\n", samples); + else + printf("Context reports FSAA is unsupported\n"); + + glMatrixMode(GL_PROJECTION); + gluOrtho2D(0.f, 1.f, 0.f, 1.f); + + while (glfwGetWindowParam(GLFW_OPENED)) + { + GLfloat time = (GLfloat) glfwGetTime(); + + glClear(GL_COLOR_BUFFER_BIT); + + glLoadIdentity(); + glTranslatef(0.5f, 0.f, 0.f); + glRotatef(time, 0.f, 0.f, 1.f); + + glEnable(GL_MULTISAMPLE_ARB); + glColor3f(1.f, 1.f, 1.f); + glRectf(-0.25f, -0.25f, 0.25f, 0.25f); + + glLoadIdentity(); + glTranslatef(-0.5f, 0.f, 0.f); + glRotatef(time, 0.f, 0.f, 1.f); + + glDisable(GL_MULTISAMPLE_ARB); + glColor3f(1.f, 1.f, 1.f); + glRectf(-0.25f, -0.25f, 0.25f, 0.25f); + + glfwSwapBuffers(); + } + + glfwTerminate(); + exit(EXIT_SUCCESS); +} + diff -Nru glfw-2.6/tests/fsinput.c glfw-2.7.2/tests/fsinput.c --- glfw-2.6/tests/fsinput.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/fsinput.c 2010-08-08 14:58:36.000000000 +0000 @@ -0,0 +1,126 @@ +//======================================================================== +// Fullscreen mode input test +// Copyright (c) Camilla Berglund +// +// 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. +// +//======================================================================== +// +// This test came about as the result of bug #2121835 +// +//======================================================================== + +#include + +#include +#include +#include + +static GLboolean running; +static int window_width = 640, window_height = 480; + +static void GLFWCALL window_size_callback(int width, int height) +{ + window_width = width; + window_height = height; + + glViewport(0, 0, window_width, window_height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0.f, window_width, 0.f, window_height); +} + +static void GLFWCALL key_callback(int key, int action) +{ + if (key == GLFW_KEY_ESC) + running = GL_FALSE; +} + +static void GLFWCALL char_callback(int character, int action) +{ +} + +static void GLFWCALL mouse_button_callback(int button, int action) +{ +} + +static void GLFWCALL mouse_position_callback(int x, int y) +{ +} + +static void GLFWCALL mouse_wheel_callback(int position) +{ +} + +int main(void) +{ + GLFWvidmode mode; + + if (!glfwInit()) + { + fprintf(stderr, "Failed to initialize GLFW\n"); + exit(1); + } + + glfwGetDesktopMode(&mode); + + if (!glfwOpenWindow(mode.Width, mode.Height, 0, 0, 0, 0, 0, 0, GLFW_FULLSCREEN)) + { + glfwTerminate(); + + fprintf(stderr, "Failed to open GLFW window\n"); + exit(1); + } + + glfwSetWindowTitle("Fullscreen Input Detector"); + glfwSetKeyCallback(key_callback); + glfwSetCharCallback(char_callback); + glfwSetMousePosCallback(mouse_position_callback); + glfwSetMouseButtonCallback(mouse_button_callback); + glfwSetMouseWheelCallback(mouse_wheel_callback); + glfwSetWindowSizeCallback(window_size_callback); + glfwSwapInterval(1); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glfwSetTime(0.0); + + running = GL_TRUE; + + while (running) + { + glClearColor((GLclampf) fabs(cos(glfwGetTime() * 4.f)), 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); + + glfwSwapBuffers(); + + if (!glfwGetWindowParam(GLFW_OPENED)) + running = GL_FALSE; + + if (glfwGetTime() > 10.0) + running = GL_FALSE; + } + + glfwTerminate(); + exit(0); +} + diff -Nru glfw-2.6/tests/getopt.c glfw-2.7.2/tests/getopt.c --- glfw-2.6/tests/getopt.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/getopt.c 2010-08-08 14:58:36.000000000 +0000 @@ -0,0 +1,253 @@ +/***************************************************************************** +* getopt.c - competent and free getopt library. +* $Header: /cvsroot/freegetopt/freegetopt/getopt.c,v 1.2 2003/10/26 03:10:20 vindaci Exp $ +* +* Copyright (c)2002-2003 Mark K. Kim +* 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. +* +* * Neither the original author of this software nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "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 THE +* COPYRIGHT OWNER OR CONTRIBUTORS 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 "getopt.h" + + +/* 2009-10-12 Camilla Berglund + * + * Removed unused global static variable 'ID'. + */ + + +char* optarg = NULL; +int optind = 0; +int opterr = 1; +int optopt = '?'; + + +static char** prev_argv = NULL; /* Keep a copy of argv and argc to */ +static int prev_argc = 0; /* tell if getopt params change */ +static int argv_index = 0; /* Option we're checking */ +static int argv_index2 = 0; /* Option argument we're checking */ +static int opt_offset = 0; /* Index into compounded "-option" */ +static int dashdash = 0; /* True if "--" option reached */ +static int nonopt = 0; /* How many nonopts we've found */ + +static void increment_index() +{ + /* Move onto the next option */ + if(argv_index < argv_index2) + { + while(prev_argv[++argv_index] && prev_argv[argv_index][0] != '-' + && argv_index < argv_index2+1); + } + else argv_index++; + opt_offset = 1; +} + + +/* +* Permutes argv[] so that the argument currently being processed is moved +* to the end. +*/ +static int permute_argv_once() +{ + /* Movability check */ + if(argv_index + nonopt >= prev_argc) return 1; + /* Move the current option to the end, bring the others to front */ + else + { + char* tmp = prev_argv[argv_index]; + + /* Move the data */ + memmove(&prev_argv[argv_index], &prev_argv[argv_index+1], + sizeof(char**) * (prev_argc - argv_index - 1)); + prev_argv[prev_argc - 1] = tmp; + + nonopt++; + return 0; + } +} + + +int getopt(int argc, char** argv, char* optstr) +{ + int c = 0; + + /* If we have new argv, reinitialize */ + if(prev_argv != argv || prev_argc != argc) + { + /* Initialize variables */ + prev_argv = argv; + prev_argc = argc; + argv_index = 1; + argv_index2 = 1; + opt_offset = 1; + dashdash = 0; + nonopt = 0; + } + + /* Jump point in case we want to ignore the current argv_index */ + getopt_top: + + /* Misc. initializations */ + optarg = NULL; + + /* Dash-dash check */ + if(argv[argv_index] && !strcmp(argv[argv_index], "--")) + { + dashdash = 1; + increment_index(); + } + + /* If we're at the end of argv, that's it. */ + if(argv[argv_index] == NULL) + { + c = -1; + } + /* Are we looking at a string? Single dash is also a string */ + else if(dashdash || argv[argv_index][0] != '-' || !strcmp(argv[argv_index], "-")) + { + /* If we want a string... */ + if(optstr[0] == '-') + { + c = 1; + optarg = argv[argv_index]; + increment_index(); + } + /* If we really don't want it (we're in POSIX mode), we're done */ + else if(optstr[0] == '+' || getenv("POSIXLY_CORRECT")) + { + c = -1; + + /* Everything else is a non-opt argument */ + nonopt = argc - argv_index; + } + /* If we mildly don't want it, then move it back */ + else + { + if(!permute_argv_once()) goto getopt_top; + else c = -1; + } + } + /* Otherwise we're looking at an option */ + else + { + char* opt_ptr = NULL; + + /* Grab the option */ + c = argv[argv_index][opt_offset++]; + + /* Is the option in the optstr? */ + if(optstr[0] == '-') opt_ptr = strchr(optstr+1, c); + else opt_ptr = strchr(optstr, c); + /* Invalid argument */ + if(!opt_ptr) + { + if(opterr) + { + fprintf(stderr, "%s: invalid option -- %c\n", argv[0], c); + } + + optopt = c; + c = '?'; + + /* Move onto the next option */ + increment_index(); + } + /* Option takes argument */ + else if(opt_ptr[1] == ':') + { + /* ie, -oARGUMENT, -xxxoARGUMENT, etc. */ + if(argv[argv_index][opt_offset] != '\0') + { + optarg = &argv[argv_index][opt_offset]; + increment_index(); + } + /* ie, -o ARGUMENT (only if it's a required argument) */ + else if(opt_ptr[2] != ':') + { + /* One of those "you're not expected to understand this" moment */ + if(argv_index2 < argv_index) argv_index2 = argv_index; + while(argv[++argv_index2] && argv[argv_index2][0] == '-'); + optarg = argv[argv_index2]; + + /* Don't cross into the non-option argument list */ + if(argv_index2 + nonopt >= prev_argc) optarg = NULL; + + /* Move onto the next option */ + increment_index(); + } + else + { + /* Move onto the next option */ + increment_index(); + } + + /* In case we got no argument for an option with required argument */ + if(optarg == NULL && opt_ptr[2] != ':') + { + optopt = c; + c = '?'; + + if(opterr) + { + fprintf(stderr,"%s: option requires an argument -- %c\n", + argv[0], optopt); + } + } + } + /* Option does not take argument */ + else + { + /* Next argv_index */ + if(argv[argv_index][opt_offset] == '\0') + { + increment_index(); + } + } + } + + /* Calculate optind */ + if(c == -1) + { + optind = argc - nonopt; + } + else + { + optind = argv_index; + } + + return c; +} + + +/* vim:ts=3 +*/ diff -Nru glfw-2.6/tests/getopt.h glfw-2.7.2/tests/getopt.h --- glfw-2.6/tests/getopt.h 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/getopt.h 2009-10-12 19:23:26.000000000 +0000 @@ -0,0 +1,63 @@ +/***************************************************************************** +* getopt.h - competent and free getopt library. +* $Header: /cvsroot/freegetopt/freegetopt/getopt.h,v 1.2 2003/10/26 03:10:20 vindaci Exp $ +* +* Copyright (c)2002-2003 Mark K. Kim +* 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. +* +* * Neither the original author of this software nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "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 THE +* COPYRIGHT OWNER OR CONTRIBUTORS 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 GETOPT_H_ +#define GETOPT_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + + +extern char* optarg; +extern int optind; +extern int opterr; +extern int optopt; + +int getopt(int argc, char** argv, char* optstr); + + +#ifdef __cplusplus +} +#endif + + +#endif /* GETOPT_H_ */ + + +/* vim:ts=3 +*/ diff -Nru glfw-2.6/tests/iconify.c glfw-2.7.2/tests/iconify.c --- glfw-2.6/tests/iconify.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/iconify.c 2010-08-24 22:35:11.000000000 +0000 @@ -0,0 +1,158 @@ +//======================================================================== +// Iconify/restore test program +// Copyright (c) Camilla Berglund +// +// 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. +// +//======================================================================== +// +// This program is used to test the iconify/restore functionality for +// both fullscreen and windowed mode windows +// +//======================================================================== + +#include + +#include +#include + +#include "getopt.h" + +static void usage(void) +{ + printf("iconify [-h] [-f]\n"); +} + +static void GLFWCALL key_callback(int key, int action) +{ + printf("%0.2f Key %s\n", + glfwGetTime(), + action == GLFW_PRESS ? "pressed" : "released"); + + if (action != GLFW_PRESS) + return; + + switch (key) + { + case GLFW_KEY_SPACE: + glfwIconifyWindow(); + break; + case GLFW_KEY_ESC: + glfwCloseWindow(); + break; + } +} + +static void GLFWCALL size_callback(int width, int height) +{ + glViewport(0, 0, width, height); +} + +int main(int argc, char** argv) +{ + int width, height, ch; + int mode = GLFW_WINDOW; + GLboolean active = -1, iconified = -1; + + while ((ch = getopt(argc, argv, "fh")) != -1) + { + switch (ch) + { + case 'h': + usage(); + exit(EXIT_SUCCESS); + + case 'f': + mode = GLFW_FULLSCREEN; + break; + + default: + usage(); + exit(EXIT_FAILURE); + } + } + + if (!glfwInit()) + { + fprintf(stderr, "Failed to initialize GLFW\n"); + exit(EXIT_FAILURE); + } + + if (mode == GLFW_FULLSCREEN) + { + GLFWvidmode mode; + glfwGetDesktopMode(&mode); + width = mode.Width; + height = mode.Height; + } + else + { + width = 0; + height = 0; + } + + if (!glfwOpenWindow(width, height, 0, 0, 0, 0, 0, 0, mode)) + { + glfwTerminate(); + + fprintf(stderr, "Failed to open GLFW window\n"); + exit(EXIT_FAILURE); + } + + glfwSetWindowTitle("Iconify"); + glfwSwapInterval(1); + glfwSetKeyCallback(key_callback); + glfwSetWindowSizeCallback(size_callback); + + glEnable(GL_SCISSOR_TEST); + + while (glfwGetWindowParam(GLFW_OPENED)) + { + int width, height; + + if (iconified != glfwGetWindowParam(GLFW_ICONIFIED) || + active != glfwGetWindowParam(GLFW_ACTIVE)) + { + iconified = glfwGetWindowParam(GLFW_ICONIFIED); + active = glfwGetWindowParam(GLFW_ACTIVE); + + printf("%0.2f %s %s\n", + glfwGetTime(), + iconified ? "Iconified" : "Restored", + active ? "Active" : "Inactive"); + } + + glfwGetWindowSize(&width, &height); + + glScissor(0, 0, width, height); + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); + + glScissor(0, 0, 640, 480); + glClearColor(1, 1, 1, 0); + glClear(GL_COLOR_BUFFER_BIT); + + glfwSwapBuffers(); + } + + glfwTerminate(); + exit(EXIT_SUCCESS); +} + diff -Nru glfw-2.6/tests/joysticks.c glfw-2.7.2/tests/joysticks.c --- glfw-2.6/tests/joysticks.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/joysticks.c 2009-10-19 23:41:30.000000000 +0000 @@ -0,0 +1,136 @@ +/*======================================================================== + * This is a small test application for GLFW. + * joystick input test. + *========================================================================*/ + +#include + +#include +#include + +#define MAX_AXES 10 +#define MAX_BUTTONS 30 + +struct JoystickState +{ + int present; + int num_axes; + int num_buttons; + float axes[MAX_AXES]; + unsigned char buttons[MAX_BUTTONS]; +}; + +static struct JoystickState states[GLFW_JOYSTICK_LAST + 1]; + +int running; +int keyrepeat = 0; +int systemkeys = 1; + + +/*======================================================================== + * Retrieve joystick states + *========================================================================*/ +static void updateJoysticksState(void) +{ + int joy; + + for (joy = GLFW_JOYSTICK_1; joy < GLFW_JOYSTICK_LAST + 1; joy++) + { + printf("Updating information for joystick %d\n", joy); + states[joy].present = glfwGetJoystickParam(joy, GLFW_PRESENT); + if (states[joy].present == GL_TRUE) + { + states[joy].num_axes = glfwGetJoystickPos(joy, states[joy].axes, MAX_AXES); + states[joy].num_buttons = glfwGetJoystickButtons(joy, states[joy].buttons, MAX_BUTTONS); + } + } +} + +/*======================================================================== + * Print out the state of all joysticks on the standard output + *========================================================================*/ +static void displayJoysticksState(void) +{ + int joy; + int i; + + for (joy = GLFW_JOYSTICK_1; joy < GLFW_JOYSTICK_LAST + 1; joy++) + { + printf("Joystick %d: %s\n", joy, (states[joy].present == GL_TRUE ? "present" : "not connected")); + + if (states[joy].present == GL_TRUE) + { + if (states[joy].num_axes > 0) + { + printf(" axes: %.3f", states[joy].axes[0]); + for (i = 1; i < states[joy].num_axes; i++) + printf(", %.3f", states[joy].axes[i]); + + printf("\n"); + } + else + printf(" axes: none\n"); + + if (states[joy].num_buttons > 0) + { + printf(" buttons: 00 => %c", ((states[joy].buttons[0] == GLFW_PRESS) ? 'P' : 'R')); + + for (i = 1; i < states[joy].num_buttons; i++) + printf(", %02d => %c", i, ((states[joy].buttons[i] == GLFW_PRESS) ? 'P' : 'R')); + + printf("\n"); + } + else + printf(" buttons: none\n"); + } + } +} + +int main(void) +{ + double start; + double t; + double update; + + /* Initialise GLFW */ + glfwInit(); + printf("The program will work for 20 seconds and display every seconds the state of the joysticks\n"); + printf("Your computer is going to be very slow as the program is doing an active loop .....\n"); + + start = glfwGetTime(); + update = start; + + /* print the initial state of all joysticks */ + updateJoysticksState(); + printf("\n"); + displayJoysticksState(); + + running = GL_TRUE; + + /* Main loop */ + while (running) + { + /* Get time */ + t = glfwGetTime(); + + /* Display the state of all connected joysticks every secons */ + if ((t - update) > 1.0) + { + update = t; + printf("\n"); + updateJoysticksState(); + printf("\n"); + displayJoysticksState(); + } + + /* Check if the window was closed */ + if ((t - start) > 20.0) + running = GL_FALSE; + } + + /* Close OpenGL window and terminate GLFW */ + glfwTerminate(); + + return 0; +} + diff -Nru glfw-2.6/tests/Makefile.carbon glfw-2.7.2/tests/Makefile.carbon --- glfw-2.6/tests/Makefile.carbon 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/Makefile.carbon 2011-07-24 22:50:00.000000000 +0000 @@ -0,0 +1,81 @@ +########################################################################## +# Makefile for GLFW test programs on Mac OS X using Apple GCC. +#------------------------------------------------------------------------- +# To compile the test files using this makefile, run: +# make -f Makefile.carbon +########################################################################## + +# Compiler settings +CC = gcc +CFLAGS = -I../include -m32 + +# Linker settings +LIB = ../lib/carbon/libglfw.a +SOLIB = ../lib/carbon/libglfw.dylib +LFLAGS = $(LIB) -framework AGL -framework OpenGL -framework Carbon -m32 +SO_LFLAGS = $(SOLIB) -framework OpenGL -m32 + +# Default: Build all tests +all: Accuracy.app/Contents/MacOS/Accuracy \ + defaults \ + Dynamic.app/Contents/MacOS/Dynamic \ + Events.app/Contents/MacOS/Events \ + FSAA.app/Contents/MacOS/FSAA \ + FSInput.app/Contents/MacOS/FSInput \ + Iconify.app/Contents/MacOS/Iconify \ + joysticks \ + Peter.app/Contents/MacOS/Peter \ + ReOpen.app/Contents/MacOS/ReOpen \ + Tearing.app/Contents/MacOS/Tearing \ + version + +Accuracy.app/Contents/MacOS/Accuracy: accuracy.c $(LIB) + /bin/sh bundle.sh Accuracy + $(CC) $(CFLAGS) accuracy.c $(LFLAGS) -o Accuracy.app/Contents/MacOS/Accuracy + +defaults: defaults.c $(LIB) + $(CC) $(CFLAGS) defaults.c $(LFLAGS) -o defaults + +Dynamic.app/Contents/MacOS/Dynamic: dynamic.c $(SOLIB) + /bin/sh bundle.sh Dynamic + cp $(SOLIB) Dynamic.app/Contents/MacOS/ + $(CC) $(CFLAGS) dynamic.c $(SO_LFLAGS) -o Dynamic.app/Contents/MacOS/Dynamic + +Events.app/Contents/MacOS/Events: events.c $(LIB) + /bin/sh bundle.sh Events + $(CC) $(CFLAGS) events.c $(LFLAGS) -o Events.app/Contents/MacOS/Events + +FSAA.app/Contents/MacOS/FSAA: fsaa.c $(LIB) + /bin/sh bundle.sh FSAA + $(CC) $(CFLAGS) fsaa.c $(LFLAGS) -o FSAA.app/Contents/MacOS/FSAA + +FSInput.app/Contents/MacOS/FSInput: fsinput.c $(LIB) + /bin/sh bundle.sh FSInput + $(CC) $(CFLAGS) fsinput.c $(LFLAGS) -o FSInput.app/Contents/MacOS/FSInput + +Iconify.app/Contents/MacOS/Iconify: iconify.c $(LIB) + /bin/sh bundle.sh Iconify + $(CC) $(CFLAGS) iconify.c $(LFLAGS) -o Iconify.app/Contents/MacOS/Iconify + +joysticks: joysticks.c $(LIB) + $(CC) $(CFLAGS) joysticks.c $(LFLAGS) -o joysticks + +Peter.app/Contents/MacOS/Peter: peter.c $(LIB) + /bin/sh bundle.sh Peter + $(CC) $(CFLAGS) peter.c $(LFLAGS) -o Peter.app/Contents/MacOS/Peter + +ReOpen.app/Contents/MacOS/ReOpen: reopen.c $(LIB) + /bin/sh bundle.sh ReOpen + $(CC) $(CFLAGS) reopen.c $(LFLAGS) -o ReOpen.app/Contents/MacOS/ReOpen + +Tearing.app/Contents/MacOS/Tearing: tearing.c $(LIB) + /bin/sh bundle.sh Tearing + $(CC) $(CFLAGS) tearing.c $(LFLAGS) -o Tearing.app/Contents/MacOS/Tearing + +version: version.c $(LIB) + $(CC) $(CFLAGS) version.c $(LFLAGS) -o version + +clean: + rm -rf Accuracy.app defaults Dynamic.app Events.app FSAA.app FSInput.app \ + Iconify.app joysticks Peter.app ReOpen.app Tearing.app version + diff -Nru glfw-2.6/tests/Makefile.carbon.universal glfw-2.7.2/tests/Makefile.carbon.universal --- glfw-2.6/tests/Makefile.carbon.universal 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/Makefile.carbon.universal 2011-07-24 22:50:00.000000000 +0000 @@ -0,0 +1,83 @@ +########################################################################## +# Makefile for GLFW test programs on Mac OS X using Apple GCC. +#------------------------------------------------------------------------- +# To compile the test files using this makefile, run: +# make -f Makefile.carbon.universal +########################################################################## + +# Compiler settings +CC = gcc +FATFLAGS = -isysroot /Developer/SDKs/MacOSX10.4u.sdk \ + -mmacosx-version-min=10.4 -arch ppc -arch i386 +CFLAGS = -I../include $(FATFLAGS) + +# Linker settings +LIB = ../lib/carbon/libglfw.a +SOLIB = ../lib/carbon/libglfw.dylib +LFLAGS = $(LIB) -framework AGL -framework OpenGL -framework Carbon -m32 +SO_LFLAGS = $(SOLIB) -framework OpenGL -m32 + +# Default: Build all tests +all: Accuracy.app/Contents/MacOS/Accuracy \ + defaults \ + Dynamic.app/Contents/MacOS/Dynamic \ + Events.app/Contents/MacOS/Events \ + FSAA.app/Contents/MacOS/FSAA \ + FSInput.app/Contents/MacOS/FSInput \ + Iconify.app/Contents/MacOS/Iconify \ + joysticks \ + Peter.app/Contents/MacOS/Peter \ + ReOpen.app/Contents/MacOS/ReOpen \ + Tearing.app/Contents/MacOS/Tearing \ + version + +Accuracy.app/Contents/MacOS/Accuracy: accuracy.c $(LIB) + /bin/sh bundle.sh Accuracy + $(CC) $(CFLAGS) accuracy.c $(LFLAGS) -o Accuracy.app/Contents/MacOS/Accuracy + +defaults: defaults.c $(LIB) + $(CC) $(CFLAGS) defaults.c $(LFLAGS) -o defaults + +Dynamic.app/Contents/MacOS/Dynamic: dynamic.c $(SOLIB) + /bin/sh bundle.sh Dynamic + cp $(SOLIB) Dynamics.app/Contents/MacOS/ + $(CC) $(CFLAGS) dynamic.c $(SO_LFLAGS) -o Dynamic.app/Contents/MacOS/Dynamic + +Events.app/Contents/MacOS/Events: events.c $(LIB) + /bin/sh bundle.sh Events + $(CC) $(CFLAGS) events.c $(LFLAGS) -o Events.app/Contents/MacOS/Events + +FSAA.app/Contents/MacOS/FSAA: fsaa.c $(LIB) + /bin/sh bundle.sh FSAA + $(CC) $(CFLAGS) fsaa.c $(LFLAGS) -o FSAA.app/Contents/MacOS/FSAA + +FSInput.app/Contents/MacOS/FSInput: fsinput.c $(LIB) + /bin/sh bundle.sh FSInput + $(CC) $(CFLAGS) fsinput.c $(LFLAGS) -o FSInput.app/Contents/MacOS/FSInput + +Iconify.app/Contents/MacOS/Iconify: iconify.c $(LIB) + /bin/sh bundle.sh Iconify + $(CC) $(CFLAGS) iconify.c $(LFLAGS) -o Iconify.app/Contents/MacOS/Iconify + +joysticks: joysticks.c $(LIB) + $(CC) $(CFLAGS) joysticks.c $(LFLAGS) -o joysticks + +Peter.app/Contents/MacOS/Peter: peter.c $(LIB) + /bin/sh bundle.sh Peter + $(CC) $(CFLAGS) peter.c $(LFLAGS) -o Peter.app/Contents/MacOS/Peter + +ReOpen.app/Contents/MacOS/ReOpen: reopen.c $(LIB) + /bin/sh bundle.sh ReOpen + $(CC) $(CFLAGS) reopen.c $(LFLAGS) -o ReOpen.app/Contents/MacOS/ReOpen + +Tearing.app/Contents/MacOS/Tearing: tearing.c $(LIB) + /bin/sh bundle.sh Tearing + $(CC) $(CFLAGS) tearing.c $(LFLAGS) -o Tearing.app/Contents/MacOS/Tearing + +version: version.c $(LIB) + $(CC) $(CFLAGS) version.c $(LFLAGS) -o version + +clean: + rm -rf Accuracy.app defaults Dynamic.app Events.app FSAA.app FSInput.app \ + Iconify.app joysticks Peter.app ReOpen.app Tearing.app version + diff -Nru glfw-2.6/tests/Makefile.cocoa glfw-2.7.2/tests/Makefile.cocoa --- glfw-2.6/tests/Makefile.cocoa 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/Makefile.cocoa 2011-07-27 12:33:31.000000000 +0000 @@ -0,0 +1,84 @@ +########################################################################## +# Makefile for GLFW test programs on Mac OS X on Cocoa using Apple GCC +#------------------------------------------------------------------------- +# To compile the test files using this makefile, run: +# make -f Makefile.cocoa +########################################################################## + +# Compiler settings +CC ?= cc +CFLAGS ?= -O2 -g +CFLAGS += -I../include + +# Linker settings +LIB = ../lib/cocoa/libglfw.a +SOLIB = ../lib/cocoa/libglfw.dylib +LFLAGS = $(LIB) -framework Cocoa -framework OpenGL +SO_LFLAGS = $(SOLIB) -framework OpenGL + +HEADER = ../include/GL/glfw.h + +# Default: Build all tests +all: Accuracy.app/Contents/MacOS/Accuracy \ + defaults \ + Dynamic.app/Contents/MacOS/Dynamic \ + Events.app/Contents/MacOS/Events \ + FSAA.app/Contents/MacOS/FSAA \ + FSInput.app/Contents/MacOS/FSInput \ + Iconify.app/Contents/MacOS/Iconify \ + joysticks \ + Peter.app/Contents/MacOS/Peter \ + ReOpen.app/Contents/MacOS/ReOpen \ + Tearing.app/Contents/MacOS/Tearing \ + version + +Accuracy.app/Contents/MacOS/Accuracy: accuracy.c $(LIB) $(HEADER) + /bin/sh bundle.sh Accuracy + $(CC) $(CFLAGS) accuracy.c $(LFLAGS) -o Accuracy.app/Contents/MacOS/Accuracy + +defaults: defaults.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) defaults.c $(LFLAGS) -o defaults + +Dynamic.app/Contents/MacOS/Dynamic: dynamic.c $(SOLIB) $(HEADER) + /bin/sh bundle.sh Dynamic + cp $(SOLIB) Dynamic.app/Contents/MacOS/ + $(CC) $(CFLAGS) dynamic.c $(SO_LFLAGS) -o Dynamic.app/Contents/MacOS/Dynamic + +Events.app/Contents/MacOS/Events: events.c $(LIB) $(HEADER) + /bin/sh bundle.sh Events + $(CC) $(CFLAGS) events.c $(LFLAGS) -o Events.app/Contents/MacOS/Events + +FSAA.app/Contents/MacOS/FSAA: fsaa.c $(LIB) $(HEADER) + /bin/sh bundle.sh FSAA + $(CC) $(CFLAGS) fsaa.c $(LFLAGS) -o FSAA.app/Contents/MacOS/FSAA + +FSInput.app/Contents/MacOS/FSInput: fsinput.c $(LIB) $(HEADER) + /bin/sh bundle.sh FSInput + $(CC) $(CFLAGS) fsinput.c $(LFLAGS) -o FSInput.app/Contents/MacOS/FSInput + +Iconify.app/Contents/MacOS/Iconify: iconify.c $(LIB) $(HEADER) + /bin/sh bundle.sh Iconify + $(CC) $(CFLAGS) iconify.c $(LFLAGS) -o Iconify.app/Contents/MacOS/Iconify + +joysticks: joysticks.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) joysticks.c $(LFLAGS) -o joysticks + +Peter.app/Contents/MacOS/Peter: peter.c $(LIB) $(HEADER) + /bin/sh bundle.sh Peter + $(CC) $(CFLAGS) peter.c $(LFLAGS) -o Peter.app/Contents/MacOS/Peter + +ReOpen.app/Contents/MacOS/ReOpen: reopen.c $(LIB) $(HEADER) + /bin/sh bundle.sh ReOpen + $(CC) $(CFLAGS) reopen.c $(LFLAGS) -o ReOpen.app/Contents/MacOS/ReOpen + +Tearing.app/Contents/MacOS/Tearing: tearing.c $(LIB) $(HEADER) + /bin/sh bundle.sh Tearing + $(CC) $(CFLAGS) tearing.c $(LFLAGS) -o Tearing.app/Contents/MacOS/Tearing + +version: version.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) version.c $(LFLAGS) -o version + +clean: + rm -rf Accuracy.app defaults Dynamic.app Events.app FSAA.app FSInput.app \ + Iconify.app joysticks Peter.app ReOpen.app Tearing.app version + diff -Nru glfw-2.6/tests/Makefile.win32.cross-mgw glfw-2.7.2/tests/Makefile.win32.cross-mgw --- glfw-2.6/tests/Makefile.win32.cross-mgw 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/Makefile.win32.cross-mgw 2011-06-28 03:31:55.000000000 +0000 @@ -0,0 +1,67 @@ +########################################################################## +# Makefile for GLFW test programs on *nix using MinGW32 +#------------------------------------------------------------------------- +# To compile the test files using this makefile, run: +# make -f Makefile.win32.cross-mgw +########################################################################## + +TARGET ?= i586-mingw32msvc- + +CC = gcc +CFLAGS = -I../include -Wall -O2 + +LIB = ../lib/win32/libglfw.a +SOLIB = ../lib/win32/libglfwdll.a +LFLAGS = $(LIB) -lglu32 -lopengl32 +SO_LFLAGS = $(SOLIB) -lglu32 -lopengl32 + +WINDOWS = -mwindows -e _mainCRTStartup +CONSOLE = -mconsole + +BINARIES = accuracy.exe defaults.exe dynamic.exe events.exe fsaa.exe \ + fsinput.exe iconify.exe joysticks.exe peter.exe reopen.exe \ + tearing.exe version.exe + +HEADER = ../include/GL/glfw.h + +all: $(BINARIES) + +accuracy.exe: accuracy.c $(LIB) $(HEADER) + $(TARGET)$(CC) $(CFLAGS) $(WINDOWS) accuracy.c $(LFLAGS) -o $@ + +defaults.exe: defaults.c $(LIB) $(HEADER) + $(TARGET)$(CC) $(CFLAGS) $(CONSOLE) defaults.c $(LFLAGS) -o $@ + +dynamic.exe: dynamic.c $(SOLIB) $(HEADER) + $(TARGET)$(CC) $(CFLAGS) $(WINDOWS) dynamic.c $(SO_LFLAGS) -o $@ + +events.exe: events.c $(LIB) $(HEADER) + $(TARGET)$(CC) $(CFLAGS) $(CONSOLE) events.c $(LFLAGS) -o $@ + +fsaa.exe: fsaa.c $(LIB) $(HEADER) + $(TARGET)$(CC) $(CFLAGS) $(CONSOLE) fsaa.c $(LFLAGS) -o $@ + +fsinput.exe: fsinput.c $(LIB) $(HEADER) + $(TARGET)$(CC) $(CFLAGS) $(WINDOWS) fsinput.c $(LFLAGS) -o $@ + +iconify.exe: iconify.c getopt.c $(LIB) $(HEADER) + $(TARGET)$(CC) $(CFLAGS) $(CONSOLE) iconify.c getopt.c $(LFLAGS) -o $@ + +joysticks.exe: joysticks.c $(LIB) $(HEADER) + $(TARGET)$(CC) $(CFLAGS) $(CONSOLE) joysticks.c $(LFLAGS) -o $@ + +peter.exe: peter.c $(LIB) $(HEADER) + $(TARGET)$(CC) $(CFLAGS) $(CONSOLE) peter.c $(LFLAGS) -o $@ + +reopen.exe: reopen.c $(LIB) $(HEADER) + $(TARGET)$(CC) $(CFLAGS) $(CONSOLE) reopen.c $(LFLAGS) -o $@ + +tearing.exe: tearing.c $(LIB) $(HEADER) + $(TARGET)$(CC) $(CFLAGS) $(WINDOWS) tearing.c $(LFLAGS) -o $@ + +version.exe: version.c getopt.c $(LIB) $(HEADER) + $(TARGET)$(CC) $(CFLAGS) $(CONSOLE) version.c getopt.c $(LFLAGS) -o $@ + +clean: + rm -f $(BINARIES) + diff -Nru glfw-2.6/tests/Makefile.win32.cygwin glfw-2.7.2/tests/Makefile.win32.cygwin --- glfw-2.6/tests/Makefile.win32.cygwin 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/Makefile.win32.cygwin 2011-06-28 03:31:55.000000000 +0000 @@ -0,0 +1,65 @@ +########################################################################## +# Makefile for GLFW test programs on Windows using Cygwin +#------------------------------------------------------------------------- +# To compile the test files using this makefile, run: +# make -f Makefile.win32.cygwin +########################################################################## + +CC = gcc +CFLAGS = -I../include -Wall -O2 -mwin32 -mno-cygwin + +LIB = ../lib/win32/libglfw.a +SOLIB = ../lib/win32/libglfwdll.a +LFLAGS = -mno-cygwin $(LIB) -lglu32 -lopengl32 +SO_LFLAGS = -mno-cygwin $(SOLIB) -lglu32 -lopengl32 + +WINDOWS = -mwindows -e _mainCRTStartup +CONSOLE = -mconsole + +BINARIES = accuracy.exe defaults.exe dynamic.exe events.exe fsaa.exe \ + fsinput.exe iconify.exe joysticks.exe peter.exe reopen.exe \ + tearing.exe version.exe + +HEADER = ../include/GL/glfw.h + +all: $(BINARIES) + +accuracy.exe: accuracy.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(WINDOWS) accuracy.c $(LFLAGS) -o $@ + +defaults.exe: defaults.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) defaults.c $(LFLAGS) -o $@ + +dynamic.exe: dynamic.c $(SOLIB) $(HEADER) + $(TARGET)$(CC) $(CFLAGS) $(WINDOWS) dynamic.c $(SO_LFLAGS) -o $@ + +events.exe: events.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) events.c $(LFLAGS) -o $@ + +fsaa.exe: fsaa.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) fsaa.c $(LFLAGS) -lm -o $@ + +fsinput.exe: fsinput.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(WINDOWS) fsinput.c $(LFLAGS) -lm -o $@ + +iconify.exe: iconify.c getopt.c $(LIB) $(HEADER) + $(TARGET)$(CC) $(CFLAGS) $(CONSOLE) iconify.c getopt.c $(LFLAGS) -o $@ + +joysticks.exe: joysticks.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) joysticks.c $(LFLAGS) -lm -o $@ + +peter.exe: peter.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) peter.c $(LFLAGS) -o $@ + +reopen.exe: reopen.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) reopen.c $(LFLAGS) -lm -o $@ + +tearing.exe: tearing.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(WINDOWS) tearing.c $(LFLAGS) -lm -o $@ + +version.exe: version.c getopt.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) version.c getopt.c $(LFLAGS) -lm -o $@ + +clean: + rm -f $(BINARIES) + diff -Nru glfw-2.6/tests/Makefile.win32.mingw glfw-2.7.2/tests/Makefile.win32.mingw --- glfw-2.6/tests/Makefile.win32.mingw 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/Makefile.win32.mingw 2011-06-28 03:31:55.000000000 +0000 @@ -0,0 +1,62 @@ +########################################################################## +# Makefile for GLFW test programs on Windows using bare MinGW +#------------------------------------------------------------------------- +# To compile the test files using this makefile, run: +# make -f Makefile.win32.mingw +########################################################################## + +CC = gcc +CFLAGS = -I../include -Wall -O2 + +LIB = ../lib/win32/libglfw.a +SOLIB = ../lib/win32/libglfwdll.a +LFLAGS = $(LIB) -lglu32 -lopengl32 +SO_LFLAGS = $(SOLIB) -lglu32 -lopengl32 + +WINDOWS = -mwindows +CONSOLE = -mconsole + +BINARIES = accuracy.exe defaults.exe dynamic.exe events.exe fsaa.exe \ + fsinput.exe iconify.exe joysticks.exe peter.exe reopen.exe \ + tearing.exe version.exe + +HEADER = ../include/GL/glfw.h + +all: $(BINARIES) + +accuracy.exe: accuracy.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(WINDOWS) accuracy.c $(LFLAGS) -o $@ + +defaults.exe: defaults.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) defaults.c $(LFLAGS) -o $@ + +dynamic.exe: dynamic.c $(SOLIB) $(HEADER) + $(TARGET)$(CC) $(CFLAGS) $(WINDOWS) dynamic.c $(SO_LFLAGS) -o $@ + +events.exe: events.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) events.c $(LFLAGS) -o $@ + +fsaa.exe: fsaa.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) fsaa.c $(LFLAGS) -o $@ + +fsinput.exe: fsinput.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(WINDOWS) fsinput.c $(LFLAGS) -o $@ + +iconify.exe: iconify.c getopt.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) iconify.c getopt.c $(LFLAGS) -o $@ + +joysticks.exe: joysticks.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) joysticks.c $(LFLAGS) -o $@ + +peter.exe: peter.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) peter.c $(LFLAGS) -o $@ + +reopen.exe: reopen.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) reopen.c $(LFLAGS) -o $@ + +tearing.exe: tearing.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(WINDOWS) tearing.c $(LFLAGS) -o $@ + +version.exe: version.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) $(CONSOLE) version.c $(LFLAGS) -o $@ + diff -Nru glfw-2.6/tests/Makefile.x11.in glfw-2.7.2/tests/Makefile.x11.in --- glfw-2.6/tests/Makefile.x11.in 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/Makefile.x11.in 2011-06-28 02:32:34.000000000 +0000 @@ -0,0 +1,46 @@ +BINARIES = accuracy defaults dynamic events fsaa fsinput \ + iconify joysticks peter reopen tearing version + +HEADER = ../include/GL/glfw.h + +all: $(BINARIES) + +accuracy: accuracy.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) accuracy.c $(LFLAGS) -o $@ + +defaults: defaults.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) defaults.c $(LFLAGS) -o $@ + +dynamic: dynamic.c $(SOLIB) $(HEADER) + $(CC) $(CFLAGS) dynamic.c $(SO_LFLAGS) -o $@ + +events: events.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) events.c $(LFLAGS) -o $@ + +fsaa: fsaa.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) fsaa.c $(LFLAGS) -o $@ + +fsinput: fsinput.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) fsinput.c $(LFLAGS) -o $@ + +iconify: iconify.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) iconify.c $(LFLAGS) -o $@ + +joysticks: joysticks.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) joysticks.c $(LFLAGS) -o $@ + +peter: peter.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) peter.c $(LFLAGS) -o $@ + +reopen: reopen.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) reopen.c $(LFLAGS) -o $@ + +tearing: tearing.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) tearing.c $(LFLAGS) -o $@ + +version: version.c $(LIB) $(HEADER) + $(CC) $(CFLAGS) version.c $(LFLAGS) -o $@ + +clean: + rm -f $(BINARIES) + diff -Nru glfw-2.6/tests/peter.c glfw-2.7.2/tests/peter.c --- glfw-2.6/tests/peter.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/peter.c 2010-08-29 15:23:24.000000000 +0000 @@ -0,0 +1,137 @@ +//======================================================================== +// Mouse cursor bug test +// Copyright (c) Camilla Berglund +// +// 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. +// +//======================================================================== +// +// This test came about as the result of bugs #1262764, #1726540 and +// #1726592, all reported by the user peterpp, hence the name +// +// The utility of this test outside of these bugs is uncertain +// +//======================================================================== + +#include + +#include +#include + +static GLboolean cursor_enabled = GL_TRUE; + +static GLboolean open_window(void); + +static void toggle_mouse_cursor(void) +{ + if (cursor_enabled) + glfwDisable(GLFW_MOUSE_CURSOR); + else + glfwEnable(GLFW_MOUSE_CURSOR); + + cursor_enabled = !cursor_enabled; +} + +static void GLFWCALL mouse_position_callback(int x, int y) +{ + printf("Mouse moved to: %i %i\n", x, y); +} + +static void GLFWCALL key_callback(int key, int action) +{ + switch (key) + { + case GLFW_KEY_SPACE: + { + if (action == GLFW_PRESS) + toggle_mouse_cursor(); + + break; + } + + case 'R': + { + if (action == GLFW_PRESS) + { + glfwCloseWindow(); + open_window(); + } + + break; + } + } +} + +static void GLFWCALL window_size_callback(int width, int height) +{ + glViewport(0, 0, width, height); +} + +static GLboolean open_window(void) +{ + int x, y; + + if (!glfwOpenWindow(0, 0, 0, 0, 0, 0, 0, 0, GLFW_WINDOW)) + return GL_FALSE; + + glfwSetWindowTitle("Peter Detector"); + + glfwGetMousePos(&x, &y); + printf("Mouse position: %i %i\n", x, y); + + glfwDisable(GLFW_AUTO_POLL_EVENTS); + glfwSetWindowSizeCallback(window_size_callback); + glfwSetMousePosCallback(mouse_position_callback); + glfwSetKeyCallback(key_callback); + glfwSwapInterval(1); + + return GL_TRUE; +} + +int main(void) +{ + if (!glfwInit()) + { + fprintf(stderr, "Failed to initialize GLFW\n"); + exit(1); + } + + if (!open_window()) + { + glfwTerminate(); + + fprintf(stderr, "Failed to open GLFW window\n"); + exit(1); + } + + glClearColor(0.f, 0.f, 0.f, 0.f); + + while (glfwGetWindowParam(GLFW_OPENED)) + { + glClear(GL_COLOR_BUFFER_BIT); + + glfwSwapBuffers(); + glfwWaitEvents(); + } + + glfwTerminate(); + exit(0); +} + diff -Nru glfw-2.6/tests/reopen.c glfw-2.7.2/tests/reopen.c --- glfw-2.6/tests/reopen.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/reopen.c 2010-08-08 14:58:36.000000000 +0000 @@ -0,0 +1,170 @@ +//======================================================================== +// Window re-opener (open/close stress test) +// Copyright (c) Camilla Berglund +// +// 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. +// +//======================================================================== +// +// This test came about as the result of bug #1262773 +// +// It closes and re-opens the GLFW window every five seconds, alternating +// between windowed and fullscreen mode +// +// It also times and logs opening and closing actions and attempts to separate +// user initiated window closing from its own +// +//======================================================================== + +#include + +#include +#include + +static GLboolean closed = GL_FALSE; + +static const char* get_mode_name(int mode) +{ + switch (mode) + { + case GLFW_WINDOW: + return "windowed"; + case GLFW_FULLSCREEN: + return "fullscreen"; + default: + return "unknown"; + } +} + +static void GLFWCALL window_size_callback(int width, int height) +{ + glViewport(0, 0, width, height); +} + +static int GLFWCALL window_close_callback(void) +{ + printf("Close callback triggered\n"); + closed = GL_TRUE; + return 0; +} + +static void GLFWCALL key_callback(int key, int action) +{ + if (action != GLFW_PRESS) + return; + + switch (key) + { + case 'Q': + case GLFW_KEY_ESC: + closed = GL_TRUE; + break; + } +} + +static int open_window(int width, int height, int mode) +{ + double base = glfwGetTime(); + + if (!glfwOpenWindow(width, height, 0, 0, 0, 0, 16, 0, mode)) + { + fprintf(stderr, "Failed to create %s mode GLFW window\n", get_mode_name(mode)); + return 0; + } + + glfwSetWindowTitle("Window Re-opener"); + glfwSetWindowSizeCallback(window_size_callback); + glfwSetWindowCloseCallback(window_close_callback); + glfwSetKeyCallback(key_callback); + glfwSwapInterval(1); + + printf("Opening %s mode window took %0.3f seconds\n", + get_mode_name(mode), + glfwGetTime() - base); + + return 1; +} + +static void close_window(void) +{ + double base = glfwGetTime(); + + glfwCloseWindow(); + + printf("Closing window took %0.3f seconds\n", glfwGetTime() - base); +} + +int main(int argc, char** argv) +{ + int count = 0; + + if (!glfwInit()) + { + fprintf(stderr, "Failed to initialize GLFW\n"); + exit(1); + } + + for (;;) + { + if (!open_window(640, 480, (count & 1) ? GLFW_FULLSCREEN : GLFW_WINDOW)) + { + glfwTerminate(); + exit(1); + } + + glMatrixMode(GL_PROJECTION); + glOrtho(-1.f, 1.f, -1.f, 1.f, 1.f, -1.f); + glMatrixMode(GL_MODELVIEW); + + glClearColor(0.f, 0.f, 0.f, 0.f); + glColor3f(1.f, 1.f, 1.f); + + glfwSetTime(0.0); + + while (glfwGetTime() < 5.0) + { + glClear(GL_COLOR_BUFFER_BIT); + + glPushMatrix(); + glRotatef((GLfloat) glfwGetTime() * 100.f, 0.f, 0.f, 1.f); + glRectf(-0.5f, -0.5f, 1.f, 1.f); + glPopMatrix(); + + glfwSwapBuffers(); + + if (closed) + close_window(); + + if (!glfwGetWindowParam(GLFW_OPENED)) + { + printf("User closed window\n"); + + glfwTerminate(); + exit(0); + } + } + + printf("Closing window\n"); + close_window(); + + count++; + } +} + diff -Nru glfw-2.6/tests/tearing.c glfw-2.7.2/tests/tearing.c --- glfw-2.6/tests/tearing.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/tearing.c 2010-08-08 14:58:36.000000000 +0000 @@ -0,0 +1,84 @@ +//======================================================================== +// Vsync enabling test +// Copyright (c) Camilla Berglund +// +// 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. +// +//======================================================================== +// +// This test renders a high contrast, horizontally moving bar, allowing for +// visual verification of whether the set swap interval is indeed obeyed +// +//======================================================================== + +#include + +#include +#include +#include + +static void GLFWCALL window_size_callback(int width, int height) +{ + glViewport(0, 0, width, height); +} + +int main(void) +{ + float position; + + if (!glfwInit()) + { + fprintf(stderr, "Failed to initialize GLFW\n"); + exit(1); + } + + if (!glfwOpenWindow(0, 0, 0, 0, 0, 0, 0, 0, GLFW_WINDOW)) + { + glfwTerminate(); + + fprintf(stderr, "Failed to open GLFW window\n"); + exit(1); + } + + glfwSetWindowTitle("Tearing Detector"); + glfwSetWindowSizeCallback(window_size_callback); + glfwSwapInterval(1); + + glClearColor(0.f, 0.f, 0.f, 0.f); + glColor3f(1.f, 1.f, 1.f); + + glMatrixMode(GL_PROJECTION); + glOrtho(-1.f, 1.f, -1.f, 1.f, 1.f, -1.f); + glMatrixMode(GL_MODELVIEW); + + while (glfwGetWindowParam(GLFW_OPENED) == GL_TRUE) + { + glClear(GL_COLOR_BUFFER_BIT); + + position = cosf(glfwGetTime() * 4.f) * 0.75f; + glRectf(position - 0.25f, -1.f, position + 0.25f, 1.f); + + glfwSwapBuffers(); + } + + glfwTerminate(); + exit(0); +} + diff -Nru glfw-2.6/tests/version.c glfw-2.7.2/tests/version.c --- glfw-2.6/tests/version.c 1970-01-01 00:00:00.000000000 +0000 +++ glfw-2.7.2/tests/version.c 2010-09-27 16:42:18.000000000 +0000 @@ -0,0 +1,253 @@ +//======================================================================== +// Version information dumper +// Copyright (c) Camilla Berglund +// +// 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. +// +//======================================================================== +// +// This test is a pale imitation of glxinfo(1), except not really +// +// It dumps GLFW and OpenGL version information +// +//======================================================================== + +#include + +#ifndef GL_VERSION_3_2 +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_CONTEXT_PROFILE_MASK 0x9126 +#define GL_NUM_EXTENSIONS 0x821D +#define GL_CONTEXT_FLAGS 0x821E +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 +#endif + +typedef const GLubyte * (APIENTRY *PFNGLGETSTRINGI) (GLenum, GLuint); + +#ifndef GL_VERSION_2_0 +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#endif + +#ifdef _MSC_VER +#define strcasecmp(x, y) _stricmp(x, y) +#endif + +#include +#include +#include + +#include "getopt.h" + +static void usage(void) +{ + printf("version [-h] [-m MAJOR] [-n MINOR] [-d] [-l] [-f] [-p PROFILE]\n"); + printf("available profiles: core compat\n"); +} + +static const char* get_profile_name(GLint mask) +{ + if (mask & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT) + return "compatibility"; + if (mask & GL_CONTEXT_CORE_PROFILE_BIT) + return "core"; + + return "unknown"; +} + +static void list_extensions(int major, int minor) +{ + int i; + GLint count; + const GLubyte* extensions; + + printf("OpenGL context supported extensions:\n"); + + if (major > 2) + { + PFNGLGETSTRINGI glGetStringi = (PFNGLGETSTRINGI) glfwGetProcAddress("glGetStringi"); + if (!glGetStringi) + { + fprintf(stderr, "Failed to retrieve glGetStringi entry point"); + exit(EXIT_FAILURE); + } + + glGetIntegerv(GL_NUM_EXTENSIONS, &count); + + for (i = 0; i < count; i++) + puts((const char*) glGetStringi(GL_EXTENSIONS, i)); + } + else + { + extensions = glGetString(GL_EXTENSIONS); + while (*extensions != '\0') + { + if (*extensions == ' ') + putchar('\n'); + else + putchar(*extensions); + + extensions++; + } + } + + putchar('\n'); +} + +int main(int argc, char** argv) +{ + int ch, profile = 0, major = 1, minor = 0, revision; + GLboolean debug = GL_FALSE, forward = GL_FALSE, list = GL_FALSE; + GLint flags, mask; + + while ((ch = getopt(argc, argv, "dfhlm:n:p:")) != -1) + { + switch (ch) + { + case 'd': + debug = GL_TRUE; + break; + case 'f': + forward = GL_TRUE; + break; + case 'h': + usage(); + exit(0); + case 'l': + list = GL_TRUE; + break; + case 'm': + major = atoi(optarg); + break; + case 'n': + minor = atoi(optarg); + break; + case 'p': + if (strcasecmp(optarg, "core") == 0) + profile = GLFW_OPENGL_CORE_PROFILE; + else if (strcasecmp(optarg, "compat") == 0) + profile = GLFW_OPENGL_COMPAT_PROFILE; + else + { + usage(); + exit(EXIT_FAILURE); + } + break; + default: + usage(); + exit(EXIT_FAILURE); + } + } + + argc -= optind; + argv += optind; + + if (!glfwInit()) + { + fprintf(stderr, "Failed to initialize GLFW\n"); + exit(EXIT_FAILURE); + } + + if (major != 1 || minor != 1) + { + glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, major); + glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, minor); + } + + if (debug) + glfwOpenWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); + + if (forward) + glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); + + if (profile != 0) + glfwOpenWindowHint(GLFW_OPENGL_PROFILE, profile); + + // We assume here that we stand a better chance of success by leaving all + // possible details of pixel format selection to GLFW + + if (!glfwOpenWindow(0, 0, 0, 0, 0, 0, 0, 0, GLFW_WINDOW)) + { + glfwTerminate(); + + fprintf(stderr, "Failed to open GLFW window\n"); + exit(EXIT_FAILURE); + } + + // Report GLFW version + + glfwGetVersion(&major, &minor, &revision); + + printf("GLFW header version: %u.%u.%u\n", + GLFW_VERSION_MAJOR, + GLFW_VERSION_MINOR, + GLFW_VERSION_REVISION); + + printf("GLFW library version: %u.%u.%u\n", major, minor, revision); + + if (major != GLFW_VERSION_MAJOR || + minor != GLFW_VERSION_MINOR || + revision != GLFW_VERSION_REVISION) + printf("*** WARNING: GLFW version mismatch! ***\n"); + + // Report OpenGL version + + printf("OpenGL context version string: \"%s\"\n", glGetString(GL_VERSION)); + + glfwGetGLVersion(&major, &minor, &revision); + + printf("OpenGL context version parsed by GLFW: %u.%u.%u\n", major, minor, revision); + + // Report OpenGL context properties + + if (major >= 3) + { + glGetIntegerv(GL_CONTEXT_FLAGS, &flags); + printf("OpenGL context flags:"); + + if (flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT) + puts(" forward-compatible"); + else + puts(" none"); + } + + if (major > 3 || (major == 3 && minor >= 2)) + { + glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask); + printf("OpenGL profile mask: 0x%08x (%s)\n", mask, get_profile_name(mask)); + } + + printf("OpenGL context renderer string: \"%s\"\n", glGetString(GL_RENDERER)); + printf("OpenGL context vendor string: \"%s\"\n", glGetString(GL_VENDOR)); + + if (major > 1) + { + printf("OpenGL context shading language version: \"%s\"\n", + glGetString(GL_SHADING_LANGUAGE_VERSION)); + } + + // Report OpenGL extensions + if (list) + list_extensions(major, minor); + + glfwTerminate(); + exit(EXIT_SUCCESS); +} +