Setting the line endings and keywords on a bunch of new text files
authorJohn F. Fay <johnffay@nettally.com>
Wed, 8 Feb 2012 02:39:29 +0000 (02:39 +0000)
committerJohn F. Fay <johnffay@nettally.com>
Wed, 8 Feb 2012 02:39:29 +0000 (02:39 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1076 7f0cb862-5218-0410-a997-914c9d46530a

62 files changed:
CMakeLists.txt
LISEZMOI.cygwin_mingw
LISEZ_MOI [changed mode: 0755->0644]
Makefile.wat
README.cygwin_mingw
README.mingw_cross
README.win32 [changed mode: 0755->0644]
src/Common/freeglut_callbacks.c
src/Common/freeglut_cursor.c
src/Common/freeglut_display.c
src/Common/freeglut_ext.c
src/Common/freeglut_font.c
src/Common/freeglut_font_data.c
src/Common/freeglut_gamemode.c
src/Common/freeglut_geometry.c
src/Common/freeglut_init.c
src/Common/freeglut_input_devices.c
src/Common/freeglut_internal.h
src/Common/freeglut_joystick.c
src/Common/freeglut_main.c
src/Common/freeglut_menu.c
src/Common/freeglut_misc.c
src/Common/freeglut_overlay.c
src/Common/freeglut_spaceball.c
src/Common/freeglut_state.c
src/Common/freeglut_stroke_mono_roman.c
src/Common/freeglut_stroke_roman.c
src/Common/freeglut_structure.c
src/Common/freeglut_teapot.c
src/Common/freeglut_teapot_data.h
src/Common/freeglut_videoresize.c
src/Common/freeglut_window.c
src/Common/freeglutdll.def
src/mswin/freeglut_cursor_mswin.c
src/mswin/freeglut_display_mswin.c
src/mswin/freeglut_ext_mswin.c
src/mswin/freeglut_gamemode_mswin.c
src/mswin/freeglut_init_mswin.c
src/mswin/freeglut_input_devices_mswin.c
src/mswin/freeglut_internal_mswin.h
src/mswin/freeglut_joystick_mswin.c
src/mswin/freeglut_main_mswin.c
src/mswin/freeglut_menu_mswin.c
src/mswin/freeglut_spaceball_mswin.c
src/mswin/freeglut_state_mswin.c
src/mswin/freeglut_structure_mswin.c
src/mswin/freeglut_window_mswin.c
src/x11/freeglut_cursor_x11.c
src/x11/freeglut_display_x11.c
src/x11/freeglut_ext_x11.c
src/x11/freeglut_gamemode_x11.c
src/x11/freeglut_glutfont_definitions_x11.c
src/x11/freeglut_init_x11.c
src/x11/freeglut_input_devices_x11.c
src/x11/freeglut_internal_x11.h
src/x11/freeglut_joystick_x11.c
src/x11/freeglut_main_x11.c
src/x11/freeglut_menu_x11.c
src/x11/freeglut_spaceball_x11.c
src/x11/freeglut_state_x11.c
src/x11/freeglut_structure_x11.c
src/x11/freeglut_window_x11.c

index 21d0439..2c80756 100644 (file)
-PROJECT(freeglut)\r
-CMAKE_MINIMUM_REQUIRED(VERSION 2.6)\r
-\r
-SET(FREEGLUT_HEADERS\r
-       include/GL/freeglut.h\r
-       include/GL/freeglut_ext.h\r
-       include/GL/freeglut_std.h\r
-       include/GL/glut.h\r
-)\r
-SET(FREEGLUT_SRCS\r
-       ${FREEGLUT_HEADERS}\r
-       src/Common/freeglut_callbacks.c\r
-       src/Common/freeglut_cursor.c\r
-       src/Common/freeglut_display.c\r
-       src/Common/freeglut_ext.c\r
-       src/Common/freeglut_font.c\r
-       src/Common/freeglut_font_data.c\r
-       src/Common/freeglut_gamemode.c\r
-       src/Common/freeglut_geometry.c\r
-       src/Common/freeglut_init.c\r
-       src/Common/freeglut_internal.h\r
-       src/Common/freeglut_input_devices.c\r
-       src/Common/freeglut_joystick.c\r
-       src/Common/freeglut_main.c\r
-       src/Common/freeglut_menu.c\r
-       src/Common/freeglut_misc.c\r
-       src/Common/freeglut_overlay.c\r
-       src/Common/freeglut_spaceball.c\r
-       src/Common/freeglut_state.c\r
-       src/Common/freeglut_stroke_mono_roman.c\r
-       src/Common/freeglut_stroke_roman.c\r
-       src/Common/freeglut_structure.c\r
-       src/Common/freeglut_teapot.c\r
-       src/Common/freeglut_videoresize.c\r
-       src/Common/freeglut_window.c\r
-)\r
-\r
-IF(WIN32)\r
-       LIST(APPEND FREEGLUT_SRCS\r
-               src/mswin/freeglut_cursor_mswin.c\r
-               src/mswin/freeglut_display_mswin.c\r
-               src/mswin/freeglut_ext_mswin.c\r
-               src/mswin/freeglut_gamemode_mswin.c\r
-               src/mswin/freeglut_init_mswin.c\r
-               src/mswin/freeglut_internal_mswin.h\r
-               src/mswin/freeglut_input_devices_mswin.c\r
-               src/mswin/freeglut_joystick_mswin.c\r
-               src/mswin/freeglut_main_mswin.c\r
-               src/mswin/freeglut_menu_mswin.c\r
-               src/mswin/freeglut_spaceball_mswin.c\r
-               src/mswin/freeglut_state_mswin.c\r
-               src/mswin/freeglut_structure_mswin.c\r
-               src/mswin/freeglut_window_mswin.c\r
-)\r
-ELSE()\r
-       LIST(APPEND FREEGLUT_SRCS\r
-               src/x11/freeglut_cursor_x11.c\r
-               src/x11/freeglut_display_x11.c\r
-               src/x11/freeglut_ext_x11.c\r
-               src/x11/freeglut_gamemode_x11.c\r
-               src/x11/freeglut_glutfont_definitions_x11.c\r
-               src/x11/freeglut_init_x11.c\r
-               src/x11/freeglut_internal_x11.h\r
-               src/x11/freeglut_input_devices_x11.c\r
-               src/x11/freeglut_joystick_x11.c\r
-               src/x11/freeglut_main_x11.c\r
-               src/x11/freeglut_menu_x11.c\r
-               src/x11/freeglut_spaceball_x11.c\r
-               src/x11/freeglut_state_x11.c\r
-               src/x11/freeglut_structure_x11.c\r
-               src/x11/freeglut_window_x11.c\r
-               src/x11/freeglut_xinput_x11.c\r
-)\r
-\r
-\r
-ENDIF()\r
-\r
-# Neatly organize all of the output files in the build directory\r
-SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)\r
-SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)\r
-\r
-# BUILD_SHARED_LIBS is already a standard CMake variable, but we need to\r
-# re-declare it here so it will show up in the GUI.\r
-OPTION(BUILD_SHARED_LIBS "Build FreeGLUT shared library." ON)\r
-OPTION(BUILD_STATIC_LIBS "Build FreeGLUT static library." ON)\r
-\r
-FIND_PACKAGE(OpenGL REQUIRED)\r
-\r
-INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${OPENGL_INCLUDE_DIR})\r
-\r
-IF(WIN32)\r
-       MESSAGE(WARNING "Insecure CRT warnings hidden (might want to fix these)")\r
-       ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)\r
-ENDIF()\r
-\r
-if(UNIX)\r
-       FIND_PACKAGE(X11 REQUIRED)\r
-       LIST(APPEND LIBS ${X11_LIBRARIES})\r
-       IF(X11_Xrandr_FOUND)\r
-               SET(HAVE_X11_EXTENSIONS_XRANDR_H TRUE)\r
-               LIST(APPEND LIBS ${X11_Xrandr_LIB})\r
-       ENDIF()\r
-       IF(X11_xf86vmode_FOUND)\r
-               SET(HAVE_X11_EXTENSIONS_XF86VMODE_H TRUE)\r
-               LIST(APPEND LIBS ${X11_xf86vmode_LIB})\r
-       ENDIF()\r
-ENDIF()\r
-\r
-INCLUDE(CheckIncludeFiles)\r
-CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H)\r
-CHECK_INCLUDE_FILES(unistd.h   HAVE_UNISTD_H)\r
-CHECK_INCLUDE_FILES(sys/time.h         HAVE_SYS_TIME_H)\r
-CHECK_INCLUDE_FILES(stdbool.h  HAVE_STDBOOL_H)\r
-CHECK_INCLUDE_FILES(sys/param.h HAVE_SYS_PARAM_H)\r
-CHECK_INCLUDE_FILES(sys/ioctl.h HAVE_SYS_IOCTL_H)\r
-CHECK_INCLUDE_FILES(fcntl.h    HAVE_FCNTL_H)\r
-CHECK_INCLUDE_FILES(errno.h    HAVE_ERRNO_H)\r
-CHECK_INCLUDE_FILES(usbhid.h   HAVE_USBHID_H)\r
-\r
-# The generated config.h is placed in the project's build directory, just to\r
-# ensure that all CMake-generated files are kept away from the main source tree.\r
-# As a result, the build directory must to be added to the include path list.\r
-CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/config.h.in ${CMAKE_BINARY_DIR}/config.h)\r
-INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR})\r
-ADD_DEFINITIONS(-DHAVE_CONFIG_H)\r
-\r
-# by default, at least on UNIX, we want to build both\r
-IF(BUILD_SHARED_LIBS)\r
-       ADD_LIBRARY(freeglut SHARED ${FREEGLUT_SRCS})\r
-ENDIF()\r
-IF(BUILD_STATIC_LIBS)\r
-       ADD_LIBRARY(freeglut_static STATIC ${FREEGLUT_SRCS})\r
-ENDIF()\r
-\r
-\r
-IF(WIN32)\r
-       IF(BUILD_SHARED_LIBS)\r
-               LIST(APPEND FREEGLUT_SRCS src/Common/freeglutdll.def freeglut.rc)\r
-               # XXX I assume that if we want both shared and static this one is appropriate\r
-               ADD_DEFINITIONS(-DFREEGLUT_EXPORTS)\r
-       ELSE()\r
-               ADD_DEFINITIONS(-DFREEGLUT_STATIC)\r
-       ENDIF()\r
-ELSE()\r
-       # on UNIX we need to make sure:\r
-       # - all shared libraries must have a soname/version\r
-       # - the output library should be named glut so it'll be linkable with -lglut\r
-       # - the shared library should link to the dependency libraries so that the user\r
-       #   won't have to link them explicitly (they shouldn't have to know that we depend\r
-       #   on Xrandr or Xxf86vm)\r
-       SET_TARGET_PROPERTIES(freeglut PROPERTIES VERSION 3.9.0 SOVERSION 3 OUTPUT_NAME glut)\r
-       SET_TARGET_PROPERTIES(freeglut_static PROPERTIES OUTPUT_NAME glut)\r
-       TARGET_LINK_LIBRARIES(freeglut ${LIBS})\r
-ENDIF()\r
-\r
-IF(BUILD_SHARED_LIBS)\r
-       INSTALL(TARGETS freeglut DESTINATION lib)\r
-ENDIF()\r
-IF(BUILD_STATIC_LIBS)\r
-       INSTALL(TARGETS freeglut_static DESTINATION lib)\r
-ENDIF()\r
-INSTALL(FILES ${FREEGLUT_HEADERS} DESTINATION include/GL)\r
-\r
-\r
-\r
-# Optionally build demos, on by default.\r
-option( FREEGLUT_BUILD_DEMOS "Build FreeGLUT demos." ON )\r
-\r
-SET(DEMO_LIBS ${OPENGL_LIBRARY} ${LIBS})\r
-MACRO(ADD_DEMO name)\r
-       if( FREEGLUT_BUILD_DEMOS )\r
-               ADD_EXECUTABLE(${name} ${ARGN})\r
-               IF(BUILD_SHARED_LIBS)\r
-                       TARGET_LINK_LIBRARIES(${name} ${DEMO_LIBS} freeglut)\r
-               ELSE()\r
-                       TARGET_LINK_LIBRARIES(${name} ${DEMO_LIBS} freeglut_static)\r
-               ENDIF()\r
-       endif()\r
-ENDMACRO()\r
-\r
-ADD_DEMO(CallbackMaker   progs/demos/CallbackMaker/CallbackMaker.c)\r
-ADD_DEMO(Fractals        progs/demos/Fractals/fractals.c)\r
-ADD_DEMO(Fractals_random progs/demos/Fractals_random/fractals_random.c)\r
-ADD_DEMO(Lorenz          progs/demos/Lorenz/lorenz.c)\r
-ADD_DEMO(One             progs/demos/One/one.c)\r
-ADD_DEMO(Resizer         progs/demos/Resizer/Resizer.cpp)\r
-ADD_DEMO(shapes          progs/demos/shapes/shapes.c)\r
-ADD_DEMO(smooth_opengl3  progs/demos/smooth_opengl3/smooth_opengl3.c)\r
-ADD_DEMO(spaceball       progs/demos/spaceball/spaceball.c\r
-                         progs/demos/spaceball/vmath.c\r
-                         progs/demos/spaceball/vmath.h)\r
-ADD_DEMO(subwin          progs/demos/subwin/subwin.c)\r
-\r
-\r
+PROJECT(freeglut)
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+
+SET(FREEGLUT_HEADERS
+       include/GL/freeglut.h
+       include/GL/freeglut_ext.h
+       include/GL/freeglut_std.h
+       include/GL/glut.h
+)
+SET(FREEGLUT_SRCS
+       ${FREEGLUT_HEADERS}
+       src/Common/freeglut_callbacks.c
+       src/Common/freeglut_cursor.c
+       src/Common/freeglut_display.c
+       src/Common/freeglut_ext.c
+       src/Common/freeglut_font.c
+       src/Common/freeglut_font_data.c
+       src/Common/freeglut_gamemode.c
+       src/Common/freeglut_geometry.c
+       src/Common/freeglut_init.c
+       src/Common/freeglut_internal.h
+       src/Common/freeglut_input_devices.c
+       src/Common/freeglut_joystick.c
+       src/Common/freeglut_main.c
+       src/Common/freeglut_menu.c
+       src/Common/freeglut_misc.c
+       src/Common/freeglut_overlay.c
+       src/Common/freeglut_spaceball.c
+       src/Common/freeglut_state.c
+       src/Common/freeglut_stroke_mono_roman.c
+       src/Common/freeglut_stroke_roman.c
+       src/Common/freeglut_structure.c
+       src/Common/freeglut_teapot.c
+       src/Common/freeglut_videoresize.c
+       src/Common/freeglut_window.c
+)
+
+IF(WIN32)
+       LIST(APPEND FREEGLUT_SRCS
+               src/mswin/freeglut_cursor_mswin.c
+               src/mswin/freeglut_display_mswin.c
+               src/mswin/freeglut_ext_mswin.c
+               src/mswin/freeglut_gamemode_mswin.c
+               src/mswin/freeglut_init_mswin.c
+               src/mswin/freeglut_internal_mswin.h
+               src/mswin/freeglut_input_devices_mswin.c
+               src/mswin/freeglut_joystick_mswin.c
+               src/mswin/freeglut_main_mswin.c
+               src/mswin/freeglut_menu_mswin.c
+               src/mswin/freeglut_spaceball_mswin.c
+               src/mswin/freeglut_state_mswin.c
+               src/mswin/freeglut_structure_mswin.c
+               src/mswin/freeglut_window_mswin.c
+)
+ELSE()
+       LIST(APPEND FREEGLUT_SRCS
+               src/x11/freeglut_cursor_x11.c
+               src/x11/freeglut_display_x11.c
+               src/x11/freeglut_ext_x11.c
+               src/x11/freeglut_gamemode_x11.c
+               src/x11/freeglut_glutfont_definitions_x11.c
+               src/x11/freeglut_init_x11.c
+               src/x11/freeglut_internal_x11.h
+               src/x11/freeglut_input_devices_x11.c
+               src/x11/freeglut_joystick_x11.c
+               src/x11/freeglut_main_x11.c
+               src/x11/freeglut_menu_x11.c
+               src/x11/freeglut_spaceball_x11.c
+               src/x11/freeglut_state_x11.c
+               src/x11/freeglut_structure_x11.c
+               src/x11/freeglut_window_x11.c
+               src/x11/freeglut_xinput_x11.c
+)
+
+
+ENDIF()
+
+# Neatly organize all of the output files in the build directory
+SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
+SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
+
+# BUILD_SHARED_LIBS is already a standard CMake variable, but we need to
+# re-declare it here so it will show up in the GUI.
+OPTION(BUILD_SHARED_LIBS "Build FreeGLUT shared library." ON)
+OPTION(BUILD_STATIC_LIBS "Build FreeGLUT static library." ON)
+
+FIND_PACKAGE(OpenGL REQUIRED)
+
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${OPENGL_INCLUDE_DIR})
+
+IF(WIN32)
+       MESSAGE(WARNING "Insecure CRT warnings hidden (might want to fix these)")
+       ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
+ENDIF()
+
+if(UNIX)
+       FIND_PACKAGE(X11 REQUIRED)
+       LIST(APPEND LIBS ${X11_LIBRARIES})
+       IF(X11_Xrandr_FOUND)
+               SET(HAVE_X11_EXTENSIONS_XRANDR_H TRUE)
+               LIST(APPEND LIBS ${X11_Xrandr_LIB})
+       ENDIF()
+       IF(X11_xf86vmode_FOUND)
+               SET(HAVE_X11_EXTENSIONS_XF86VMODE_H TRUE)
+               LIST(APPEND LIBS ${X11_xf86vmode_LIB})
+       ENDIF()
+ENDIF()
+
+INCLUDE(CheckIncludeFiles)
+CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H)
+CHECK_INCLUDE_FILES(unistd.h   HAVE_UNISTD_H)
+CHECK_INCLUDE_FILES(sys/time.h         HAVE_SYS_TIME_H)
+CHECK_INCLUDE_FILES(stdbool.h  HAVE_STDBOOL_H)
+CHECK_INCLUDE_FILES(sys/param.h HAVE_SYS_PARAM_H)
+CHECK_INCLUDE_FILES(sys/ioctl.h HAVE_SYS_IOCTL_H)
+CHECK_INCLUDE_FILES(fcntl.h    HAVE_FCNTL_H)
+CHECK_INCLUDE_FILES(errno.h    HAVE_ERRNO_H)
+CHECK_INCLUDE_FILES(usbhid.h   HAVE_USBHID_H)
+
+# The generated config.h is placed in the project's build directory, just to
+# ensure that all CMake-generated files are kept away from the main source tree.
+# As a result, the build directory must to be added to the include path list.
+CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/config.h.in ${CMAKE_BINARY_DIR}/config.h)
+INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR})
+ADD_DEFINITIONS(-DHAVE_CONFIG_H)
+
+# by default, at least on UNIX, we want to build both
+IF(BUILD_SHARED_LIBS)
+       ADD_LIBRARY(freeglut SHARED ${FREEGLUT_SRCS})
+ENDIF()
+IF(BUILD_STATIC_LIBS)
+       ADD_LIBRARY(freeglut_static STATIC ${FREEGLUT_SRCS})
+ENDIF()
+
+
+IF(WIN32)
+       IF(BUILD_SHARED_LIBS)
+               LIST(APPEND FREEGLUT_SRCS src/Common/freeglutdll.def freeglut.rc)
+               # XXX I assume that if we want both shared and static this one is appropriate
+               ADD_DEFINITIONS(-DFREEGLUT_EXPORTS)
+       ELSE()
+               ADD_DEFINITIONS(-DFREEGLUT_STATIC)
+       ENDIF()
+ELSE()
+       # on UNIX we need to make sure:
+       # - all shared libraries must have a soname/version
+       # - the output library should be named glut so it'll be linkable with -lglut
+       # - the shared library should link to the dependency libraries so that the user
+       #   won't have to link them explicitly (they shouldn't have to know that we depend
+       #   on Xrandr or Xxf86vm)
+       SET_TARGET_PROPERTIES(freeglut PROPERTIES VERSION 3.9.0 SOVERSION 3 OUTPUT_NAME glut)
+       SET_TARGET_PROPERTIES(freeglut_static PROPERTIES OUTPUT_NAME glut)
+       TARGET_LINK_LIBRARIES(freeglut ${LIBS})
+ENDIF()
+
+IF(BUILD_SHARED_LIBS)
+       INSTALL(TARGETS freeglut DESTINATION lib)
+ENDIF()
+IF(BUILD_STATIC_LIBS)
+       INSTALL(TARGETS freeglut_static DESTINATION lib)
+ENDIF()
+INSTALL(FILES ${FREEGLUT_HEADERS} DESTINATION include/GL)
+
+
+
+# Optionally build demos, on by default.
+option( FREEGLUT_BUILD_DEMOS "Build FreeGLUT demos." ON )
+
+SET(DEMO_LIBS ${OPENGL_LIBRARY} ${LIBS})
+MACRO(ADD_DEMO name)
+       if( FREEGLUT_BUILD_DEMOS )
+               ADD_EXECUTABLE(${name} ${ARGN})
+               IF(BUILD_SHARED_LIBS)
+                       TARGET_LINK_LIBRARIES(${name} ${DEMO_LIBS} freeglut)
+               ELSE()
+                       TARGET_LINK_LIBRARIES(${name} ${DEMO_LIBS} freeglut_static)
+               ENDIF()
+       endif()
+ENDMACRO()
+
+ADD_DEMO(CallbackMaker   progs/demos/CallbackMaker/CallbackMaker.c)
+ADD_DEMO(Fractals        progs/demos/Fractals/fractals.c)
+ADD_DEMO(Fractals_random progs/demos/Fractals_random/fractals_random.c)
+ADD_DEMO(Lorenz          progs/demos/Lorenz/lorenz.c)
+ADD_DEMO(One             progs/demos/One/one.c)
+ADD_DEMO(Resizer         progs/demos/Resizer/Resizer.cpp)
+ADD_DEMO(shapes          progs/demos/shapes/shapes.c)
+ADD_DEMO(smooth_opengl3  progs/demos/smooth_opengl3/smooth_opengl3.c)
+ADD_DEMO(spaceball       progs/demos/spaceball/spaceball.c
+                         progs/demos/spaceball/vmath.c
+                         progs/demos/spaceball/vmath.h)
+ADD_DEMO(subwin          progs/demos/subwin/subwin.c)
+
+
index 957f7bb..0890ada 100644 (file)
-Glut alors!\r
-\r
-Par Jean-Seb le vendredi 10 juillet 2009, 00:18\r
-\r
-\r
-Freeglut est une Ã©volution open-source de Glut.\r
-Sous Windows, on peut l'utiliser avec Cygwin.\r
-Facile ? Oui, si on accepte de distribuer "cygwin1.dll"\r
-Aidons Freeglut Ã  conquérir son indépendance !\r
-m.à.j 10/7/2009 : génération d'une librairie pour linker depuis la dll.\r
-\r
-\r
-Récupération des sources\r
-\r
-    * Reprenez les sources de la version 2.6.0 qui intègre les changements\r
-      récents.\r
-    * Pour l'instant, il s'agit d'une RC (Release Candidate), mais la version\r
-      finale ne saurait tarder.\r
-    * L'utilisation de la 2.6 est préférable Ã  la branche 2.4-stable, de\r
-      nombreux bugs Ã©tant corrigés.\r
-    * Vous trouverez les sources sur le site de Freeglut:\r
-          o http://freeglut.sourceforge.net/\r
-\r
-\r
-Principe\r
-Objectif\r
-\r
-    * Nous allons créer une dll liée Ã  Cygwin, et une bibliothèque statique\r
-      indépendante\r
-    * Nous créerons Ã©galement une librairie dynamique, permettant de linker avec\r
-      la dll.\r
-\r
-Liste des fichiers générés\r
-\r
-    * freeglut.dll : une dll classique pour le linkage dynamique.\r
-    * libfreeglut.a : la bibliothèque statique. Le programme final est autonome\r
-      (du moins pour OpenGL).\r
-    * libfreeglutdll.a : la bibliothèque dynamique. Le programme final a besoin\r
-      de freeglut.dll.\r
-\r
-\r
-Préparation\r
-\r
-    * Dépliez l'archive freeglut.\r
-    * Allez dans le répertoire src (situé Ã  la racine du répertoire Freeglut),\r
-      et créez un sous-répertoire "Gl"\r
-          o Dans ce sous-répertoire, copiez les fichiers du répertoire\r
-            "include/Gl"\r
-\r
-    * Pourquoi faut-il créer un répertoire "Gl" pour la compilation ?\r
-          o C'était juste pour simplifier les choses lors de mes essais.\r
-          o Sinon vous pouvez créer directement les répertoires, et copier les\r
-            fichiers comme indiqué au point installation (lire plus loin).\r
-\r
-    * Faites un peu de ménage dans /lib :\r
-          o Effacez toutes les références Ã  la glut, pour ne pas avoir de\r
-            conflit au linkage.\r
-          o Cette Ã©tape est facultative, vous pouvez Ã©galement choisir de ne\r
-            faire le ménage qu' après une compilation réussie de Freeglut.\r
-          o Attention Ã  ne pas effacer, dans un enthousiasme rédempteur, la\r
-            bibliothèque glu32.lib (à ne pas confondre avec glut32.lib).\r
-\r
-\r
-Compilation\r
-\r
-    * Oubliez le triptyque ./configure , make , make install.\r
-          o Ca ne marche pas du tout avec Cygwin.\r
-\r
-    * Voici un Makefile qui fera l'affaire:\r
-\r
-#Makefile pour Freeglut 2.6.0-rc et Cygwin\r
-#A placer dans le répertoire "src/Common"\r
-\r
-sources=$(wildcard *.c)\r
-objs=$(sources:.c=.o)\r
-libname=freeglut\r
-\r
-\r
-CFLAGS=-O2 -DTARGET_HOST_MS_WINDOWS -DX_DISPLAY_MISSING -DFREEGLUT_STATIC -I./\r
-LDFLAGS=-lopengl32 -lgdi32 -lwinmm\r
-\r
-nocyg=-mno-cygwin -mwindows\r
-\r
-all: $(objs)\r
-        #construction dll liée Ã  cygwin1.dll\r
-        gcc $(nocyg) $(objs) -shared $(LDFLAGS) -o $(libname).dll\r
-        nm $(libname).dll  | awk 'BEGIN { print "EXPORTS" } /T _glut/ {sub( /^.*T _/, "\t"); print}' > $(libname).def\r
-        dlltool --dllname $(libname).dll --input-def $(libname).def --output-lib lib$(libname)dll.a\r
-\r
-        #construction bibliothèque statique indépendante de cygwin\r
-        ar cr lib$(libname).a $(objs)\r
-        #pas forcément obligatoire (création d'un index pour accélérer les accès)\r
-        ranlib lib$(libname).a\r
-\r
-%.o: %.c\r
-        gcc $(nocyg) -c $(CFLAGS) $<\r
-\r
-clean:\r
-        rm -f *.o $(libname).dll $(libname).def lib$(libname)dll.a lib$(libname).a\r
-\r
-\r
-\r
-\r
-Quelques remarques sur le makefile\r
-\r
-    * Ce makefile crée une dll, une bibliothèque statique (une archive, en\r
-      d'autres termes) et la bibliothèque dynamique qui permettra l'utilisation\r
-      de la dll.\r
-\r
-    * Ne cherchez pas Ã  stripper la bibliothèque statique! Vous ne pourriez plus\r
-      compiler en statique.\r
-          o Par contre, vous pouvez stripper l'exécutable final obtenu lors de\r
-            la compilation de votre application.\r
-\r
-    * J'ai choisi d'appeller la dll et les bibliothèques par leurs "vrais noms":\r
-      freeglut.dll libfreeglutdll.a et libfreeglut.a.\r
-          o Le script configure recréait (pour des raisons de compatibilité avec\r
-            l'ancienne bibliothèque Glut) glut.dll et libglut.a.\r
-          o Lors des mes essais, j'ai eu des conflits avec une authentique\r
-            "glut" qui trainait dans mon "/lib". J'ai décidé d'appeller les\r
-            choses par leur nom, afin d'éviter les confusions.\r
-          o Rien ne vous empêche de renommer la dll, si vous avez besoin\r
-            d'utiliser des programmes Glut que vous ne pouvez pas recompiler.\r
-\r
-    * La bibliothèque dynamique est générée Ã  partir de la dll.\r
-          o Par souci de concision, j'ai utilisé awk. Il génère le fichier\r
-            d'exports utilisé par dlltool.\r
-          o La seule chose notable est la sélection des fonctions dont le nom\r
-            commence par _glut, afin d'éviter d'inclure dans la librairie\r
-            dynamique des fonctions sans rapport avec freeglut.\r
-          o ensuite, on utilise dlltool de façon très classique.\r
-\r
-nm $(libname).dll  | awk 'BEGIN { print "EXPORTS" } /T _glut/ {sub( /^.*T _/, "\t"); print}' > $(libname).def\r
-dlltool --dllname $(libname).dll --input-def $(libname).def --output-lib lib$(libname)dll.a\r
-\r
-\r
-\r
-\r
-Installation\r
-\r
-    * Copiez libfreeglut.a, libfreeglutdll.a dans le répertoire /lib de Cygwin.\r
-    * Copiez freglut.dll dans le system32 de Windows (ce qui est pratique, mais\r
-      pas propre!).\r
-    * Copiez les fichiers headers de Freeglut (/include/gl) dans /usr/include/Gl\r
-      de Cygwin.\r
-    * Copiez les fichiers headers (toujours /include/gl) dans\r
-      /usr/include/mingw/Gl : ceci sert aux compilations avec le flag\r
-      -mno-cygwin, qui utilise alors les includes de mingw.\r
-          o Vous aurez Ã©ventuellement besoin d'écraser d'anciens fichiers\r
-            include, correspondants Ã  Glut, si vous l'avez installé avec Cygwin.\r
-\r
-\r
-Utilisation de la librairie\r
-\r
-    * Nous allons tester avec le programme shapes, présent dans\r
-      progs/demos/shapes\r
-          o -mno-cygwin sert Ã  forcer l'utilisation de Mingw sans la grosse\r
-            dépendance cygwin1.dll.\r
-          o -mwindows sert uniquement Ã  enlever l'horrible fenêtre shell (très\r
-            utile pour la mise au point, par contre).\r
-          o -L. (notez le point après le "L") : j'ai laissé libfreeglut.a,\r
-            libfreeglutdll.a et freeglut.dll dans le répertoire de test, le\r
-            temps des tests justement.\r
-\r
-\r
-Compilation en librairie statique freeglut, sans cygwin\r
-\r
-    * Toute l'astuce réside dans le define : -DFREEGLUT_STATIC\r
-          o Il sert Ã  obtenir la bonne décoration des noms de fonctions dans les \r
-            imports de la lib Freeglut.\r
-          o Vous pouvez essayer sans et prendre un Ã©diteur hexa pour voir les\r
-            différences dans l'objet.\r
-    * attention Ã  l'ordre des bibliothèques : -lfreeglut (statique) doit se\r
-      trouver avant la déclaration des bibliothèques dynamiques.\r
-\r
-    * gcc shapes.c -L. -lfreeglut -lopengl32 -lwinmm -lgdi32 -mno-cygwin\r
-      -mwindows -DFREEGLUT_STATIC\r
-\r
-\r
-Compilation avec dll freeglut, sans cygwin\r
-\r
-    * Pour le define, même remarque que ci-dessus\r
-    * L'ordre des bibliothèques n'a plus d'importance.\r
-\r
-    * gcc shapes.c -L. -lopengl32 -lwinmm -lgdi32 -lfreeglut -mno-cygwin\r
-      -DFREEGLUT_STATIC\r
-\r
-\r
-Compilation avec dll freeglut, avec Cygwin\r
-\r
-    * Cet exemple est donné uniquement pour référence, le thème de ce billet Ã©tant de se débarrasser de Cygwin.\r
-          o Disons que Ã§a peut servir pendant la mise au point (et encore).\r
-\r
-    * gcc shapes.c -L. -lopengl32 -lwinmm -lgdi32 -lfreeglut\r
-\r
-\r
-\r
-Où sont les dooooocs ?\r
-\r
-    * Freeglut est livré avec sa documentation, plus très Ã  jour.\r
-          o Il semble qu'il y ait un problème avec la doc Glut originale. Non\r
-            seulement elle ne correspond pas forcément au fonctionnement de\r
-            Freeglut, mais de plus, son auteur (Mark Kilgard) l'a copyrighté. Sa\r
-            distribution est donc difficile.\r
-\r
-    * Jocelyn Fréchot a entrepris une mise Ã  niveau des docs pour la version\r
-      2.6.0. On peut les trouver sur son site pour l'instant:\r
-          o http://jocelyn.frechot.free.fr/freeglut/\r
-\r
-\r
-Quelque chose a survécu ...\r
-\r
-    * J'ai Ã©galement testé la recompilation des démos de la lib Glut originelle\r
-      (paix Ã  ses cendres).\r
-          o Rien de particulier Ã  signaler.\r
-\r
-    * Merci Ã  tous les mainteneurs courageux de Freeglut, qu'on croyait mort,\r
-      mais qui bouge encore.\r
+Glut alors!
+
+Par Jean-Seb le vendredi 10 juillet 2009, 00:18
+
+
+Freeglut est une Ã©volution open-source de Glut.
+Sous Windows, on peut l'utiliser avec Cygwin.
+Facile ? Oui, si on accepte de distribuer "cygwin1.dll"
+Aidons Freeglut Ã  conquérir son indépendance !
+m.à.j 10/7/2009 : génération d'une librairie pour linker depuis la dll.
+
+
+Récupération des sources
+
+    * Reprenez les sources de la version 2.6.0 qui intègre les changements
+      récents.
+    * Pour l'instant, il s'agit d'une RC (Release Candidate), mais la version
+      finale ne saurait tarder.
+    * L'utilisation de la 2.6 est préférable Ã  la branche 2.4-stable, de
+      nombreux bugs Ã©tant corrigés.
+    * Vous trouverez les sources sur le site de Freeglut:
+          o http://freeglut.sourceforge.net/
+
+
+Principe
+Objectif
+
+    * Nous allons créer une dll liée Ã  Cygwin, et une bibliothèque statique
+      indépendante
+    * Nous créerons Ã©galement une librairie dynamique, permettant de linker avec
+      la dll.
+
+Liste des fichiers générés
+
+    * freeglut.dll : une dll classique pour le linkage dynamique.
+    * libfreeglut.a : la bibliothèque statique. Le programme final est autonome
+      (du moins pour OpenGL).
+    * libfreeglutdll.a : la bibliothèque dynamique. Le programme final a besoin
+      de freeglut.dll.
+
+
+Préparation
+
+    * Dépliez l'archive freeglut.
+    * Allez dans le répertoire src (situé Ã  la racine du répertoire Freeglut),
+      et créez un sous-répertoire "Gl"
+          o Dans ce sous-répertoire, copiez les fichiers du répertoire
+            "include/Gl"
+
+    * Pourquoi faut-il créer un répertoire "Gl" pour la compilation ?
+          o C'était juste pour simplifier les choses lors de mes essais.
+          o Sinon vous pouvez créer directement les répertoires, et copier les
+            fichiers comme indiqué au point installation (lire plus loin).
+
+    * Faites un peu de ménage dans /lib :
+          o Effacez toutes les références Ã  la glut, pour ne pas avoir de
+            conflit au linkage.
+          o Cette Ã©tape est facultative, vous pouvez Ã©galement choisir de ne
+            faire le ménage qu' après une compilation réussie de Freeglut.
+          o Attention Ã  ne pas effacer, dans un enthousiasme rédempteur, la
+            bibliothèque glu32.lib (à ne pas confondre avec glut32.lib).
+
+
+Compilation
+
+    * Oubliez le triptyque ./configure , make , make install.
+          o Ca ne marche pas du tout avec Cygwin.
+
+    * Voici un Makefile qui fera l'affaire:
+
+#Makefile pour Freeglut 2.6.0-rc et Cygwin
+#A placer dans le répertoire "src/Common"
+
+sources=$(wildcard *.c)
+objs=$(sources:.c=.o)
+libname=freeglut
+
+
+CFLAGS=-O2 -DTARGET_HOST_MS_WINDOWS -DX_DISPLAY_MISSING -DFREEGLUT_STATIC -I./
+LDFLAGS=-lopengl32 -lgdi32 -lwinmm
+
+nocyg=-mno-cygwin -mwindows
+
+all: $(objs)
+        #construction dll liée Ã  cygwin1.dll
+        gcc $(nocyg) $(objs) -shared $(LDFLAGS) -o $(libname).dll
+        nm $(libname).dll  | awk 'BEGIN { print "EXPORTS" } /T _glut/ {sub( /^.*T _/, "\t"); print}' > $(libname).def
+        dlltool --dllname $(libname).dll --input-def $(libname).def --output-lib lib$(libname)dll.a
+
+        #construction bibliothèque statique indépendante de cygwin
+        ar cr lib$(libname).a $(objs)
+        #pas forcément obligatoire (création d'un index pour accélérer les accès)
+        ranlib lib$(libname).a
+
+%.o: %.c
+        gcc $(nocyg) -c $(CFLAGS) $<
+
+clean:
+        rm -f *.o $(libname).dll $(libname).def lib$(libname)dll.a lib$(libname).a
+
+
+
+
+Quelques remarques sur le makefile
+
+    * Ce makefile crée une dll, une bibliothèque statique (une archive, en
+      d'autres termes) et la bibliothèque dynamique qui permettra l'utilisation
+      de la dll.
+
+    * Ne cherchez pas Ã  stripper la bibliothèque statique! Vous ne pourriez plus
+      compiler en statique.
+          o Par contre, vous pouvez stripper l'exécutable final obtenu lors de
+            la compilation de votre application.
+
+    * J'ai choisi d'appeller la dll et les bibliothèques par leurs "vrais noms":
+      freeglut.dll libfreeglutdll.a et libfreeglut.a.
+          o Le script configure recréait (pour des raisons de compatibilité avec
+            l'ancienne bibliothèque Glut) glut.dll et libglut.a.
+          o Lors des mes essais, j'ai eu des conflits avec une authentique
+            "glut" qui trainait dans mon "/lib". J'ai décidé d'appeller les
+            choses par leur nom, afin d'éviter les confusions.
+          o Rien ne vous empêche de renommer la dll, si vous avez besoin
+            d'utiliser des programmes Glut que vous ne pouvez pas recompiler.
+
+    * La bibliothèque dynamique est générée Ã  partir de la dll.
+          o Par souci de concision, j'ai utilisé awk. Il génère le fichier
+            d'exports utilisé par dlltool.
+          o La seule chose notable est la sélection des fonctions dont le nom
+            commence par _glut, afin d'éviter d'inclure dans la librairie
+            dynamique des fonctions sans rapport avec freeglut.
+          o ensuite, on utilise dlltool de façon très classique.
+
+nm $(libname).dll  | awk 'BEGIN { print "EXPORTS" } /T _glut/ {sub( /^.*T _/, "\t"); print}' > $(libname).def
+dlltool --dllname $(libname).dll --input-def $(libname).def --output-lib lib$(libname)dll.a
+
+
+
+
+Installation
+
+    * Copiez libfreeglut.a, libfreeglutdll.a dans le répertoire /lib de Cygwin.
+    * Copiez freglut.dll dans le system32 de Windows (ce qui est pratique, mais
+      pas propre!).
+    * Copiez les fichiers headers de Freeglut (/include/gl) dans /usr/include/Gl
+      de Cygwin.
+    * Copiez les fichiers headers (toujours /include/gl) dans
+      /usr/include/mingw/Gl : ceci sert aux compilations avec le flag
+      -mno-cygwin, qui utilise alors les includes de mingw.
+          o Vous aurez Ã©ventuellement besoin d'écraser d'anciens fichiers
+            include, correspondants Ã  Glut, si vous l'avez installé avec Cygwin.
+
+
+Utilisation de la librairie
+
+    * Nous allons tester avec le programme shapes, présent dans
+      progs/demos/shapes
+          o -mno-cygwin sert Ã  forcer l'utilisation de Mingw sans la grosse
+            dépendance cygwin1.dll.
+          o -mwindows sert uniquement Ã  enlever l'horrible fenêtre shell (très
+            utile pour la mise au point, par contre).
+          o -L. (notez le point après le "L") : j'ai laissé libfreeglut.a,
+            libfreeglutdll.a et freeglut.dll dans le répertoire de test, le
+            temps des tests justement.
+
+
+Compilation en librairie statique freeglut, sans cygwin
+
+    * Toute l'astuce réside dans le define : -DFREEGLUT_STATIC
+          o Il sert Ã  obtenir la bonne décoration des noms de fonctions dans les 
+            imports de la lib Freeglut.
+          o Vous pouvez essayer sans et prendre un Ã©diteur hexa pour voir les
+            différences dans l'objet.
+    * attention Ã  l'ordre des bibliothèques : -lfreeglut (statique) doit se
+      trouver avant la déclaration des bibliothèques dynamiques.
+
+    * gcc shapes.c -L. -lfreeglut -lopengl32 -lwinmm -lgdi32 -mno-cygwin
+      -mwindows -DFREEGLUT_STATIC
+
+
+Compilation avec dll freeglut, sans cygwin
+
+    * Pour le define, même remarque que ci-dessus
+    * L'ordre des bibliothèques n'a plus d'importance.
+
+    * gcc shapes.c -L. -lopengl32 -lwinmm -lgdi32 -lfreeglut -mno-cygwin
+      -DFREEGLUT_STATIC
+
+
+Compilation avec dll freeglut, avec Cygwin
+
+    * Cet exemple est donné uniquement pour référence, le thème de ce billet Ã©tant de se débarrasser de Cygwin.
+          o Disons que Ã§a peut servir pendant la mise au point (et encore).
+
+    * gcc shapes.c -L. -lopengl32 -lwinmm -lgdi32 -lfreeglut
+
+
+
+Où sont les dooooocs ?
+
+    * Freeglut est livré avec sa documentation, plus très Ã  jour.
+          o Il semble qu'il y ait un problème avec la doc Glut originale. Non
+            seulement elle ne correspond pas forcément au fonctionnement de
+            Freeglut, mais de plus, son auteur (Mark Kilgard) l'a copyrighté. Sa
+            distribution est donc difficile.
+
+    * Jocelyn Fréchot a entrepris une mise Ã  niveau des docs pour la version
+      2.6.0. On peut les trouver sur son site pour l'instant:
+          o http://jocelyn.frechot.free.fr/freeglut/
+
+
+Quelque chose a survécu ...
+
+    * J'ai Ã©galement testé la recompilation des démos de la lib Glut originelle
+      (paix Ã  ses cendres).
+          o Rien de particulier Ã  signaler.
+
+    * Merci Ã  tous les mainteneurs courageux de Freeglut, qu'on croyait mort,
+      mais qui bouge encore.
old mode 100755 (executable)
new mode 100644 (file)
index 77dc447..aebf92b 100644 (file)
-#\r
-# Makefile.wat\r
-# Open Watcom makefile for Freeglut\r
-# Usage:\r
-#    wmake -f Makefile.wat {target}\r
-# Where target is one of:\r
-#    debug-static\r
-#    debug-dynamic\r
-#    release-static\r
-#    release-dynamic\r
-#    debug\r
-#    release\r
-#    all\r
-#    clean\r
-# Assumes:\r
-#    WATCOM enviroment variable points to your Watcom installation directory\r
-#    %WATCOM%\BINNT and %WATCOM%\BINW are in your path\r
-#\r
-RELEASE_STATIC_DIR = release-static\r
-RELEASE_DYNAMIC_DIR = release-dynamic\r
-DEBUG_STATIC_DIR = debug-static\r
-DEBUG_DYNAMIC_DIR = debug-dynamic\r
-\r
-INCLUDE_DIR = ..\include\r
-SRC_DIR = ..\src\Common\r
-COMPILER = wcc386\r
-COMPILE_COMMON_OPTIONS = -i$(INCLUDE_DIR);$(%WATCOM)\h;$(%WATCOM)\h\nt -fp6 -w4 -e25 -wcd202 -bt=nt -mf -zq\r
-COMPILE_DEBUG_OPTIONS = -d3 -od -DDEBUG -D_DEBUG\r
-COMPILE_RELEASE_OPTIONS = -d0 -otexanh\r
-COMPILE_STATIC_OPTIONS = -DFREEGLUT_STATIC -6r\r
-COMPILE_DYNAMIC_OPTIONS = -DFREEGLUT_EXPORTS -6s -bd -bm\r
-COMPILE_OPTIONS = $(COMPILE_COMMON_OPTIONS) $(COMPILE_$(MODE)_OPTIONS) $(COMPILE_$(TYPE)_OPTIONS)\r
-\r
-LINKER = wlink\r
-LINK_OPTIONS = SYS nt_dll op m op maxe=25 op q op symf FIL\r
-\r
-LIB_TOOL = wlib\r
-LIB_COMMON_OPTIONS = -q -n -b\r
-LIB_DYNAMIC_OPTIONS =\r
-LIB_STATIC_OPTIONS = -c -p=512\r
-LIB_OPTIONS = $(LIB_COMMON_OPTIONS) $(LIB_$(TYPE)_OPTIONS)\r
-\r
-MAKE = wmake -h -f ..\Makefile.wat \r
-\r
-OBJ_FILES = &\r
-       freeglut_callbacks.obj &\r
-       freeglut_cursor.obj &\r
-       freeglut_display.obj &\r
-       freeglut_ext.obj &\r
-       freeglut_font.obj &\r
-       freeglut_font_data.obj &\r
-       freeglut_gamemode.obj &\r
-       freeglut_geometry.obj &\r
-       freeglut_glutfont_definitions.obj &\r
-       freeglut_init.obj &\r
-       freeglut_input_devices.obj &\r
-       freeglut_joystick.obj &\r
-       freeglut_main.obj &\r
-       freeglut_menu.obj &\r
-       freeglut_misc.obj &\r
-       freeglut_overlay.obj &\r
-       freeglut_spaceball.obj &\r
-       freeglut_state.obj &\r
-       freeglut_stroke_mono_roman.obj &\r
-       freeglut_stroke_roman.obj &\r
-       freeglut_structure.obj &\r
-       freeglut_teapot.obj &\r
-       freeglut_videoresize.obj &\r
-       freeglut_window.obj\r
-\r
-default : .SYMBOLIC\r
-       @echo Usage:\r
-       @echo   wmake -f Makefile.wat {target}\r
-       @echo Where target is one of:\r
-       @echo   debug-static\r
-       @echo   debug-dynamic\r
-       @echo   release-static\r
-       @echo   release-dynamic\r
-       @echo   debug\r
-       @echo   release\r
-       @echo   all\r
-       @echo   clean\r
-\r
-# static library\r
-freeglut_static.lib : $(OBJ_FILES)\r
-       $(LIB_TOOL) $(LIB_OPTIONS) $^* $(OBJ_FILES)\r
-\r
-# dynamic link library\r
-freeglut.dll : $(OBJ_FILES)\r
-       $(LINKER) name $^* $(LINK_OPTIONS) $(OBJ_FILES: =,)\r
-\r
-freeglut.lib : freeglut.dll\r
-       $(LIB_TOOL) $(LIB_OPTIONS) $^. +$[.\r
-\r
-\r
-freeglut_callbacks.obj : $(SRC_DIR)\freeglut_callbacks.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-       \r
-freeglut_cursor.obj : $(SRC_DIR)\freeglut_cursor.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_display.obj : $(SRC_DIR)\freeglut_display.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_ext.obj : $(SRC_DIR)\freeglut_ext.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_font.obj : $(SRC_DIR)\freeglut_font.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_font_data.obj : $(SRC_DIR)\freeglut_font_data.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_gamemode.obj : $(SRC_DIR)\freeglut_gamemode.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_geometry.obj : $(SRC_DIR)\freeglut_geometry.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_glutfont_definitions.obj : $(SRC_DIR)\freeglut_glutfont_definitions.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_init.obj : $(SRC_DIR)\freeglut_init.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_input_devices.obj : $(SRC_DIR)\freeglut_input_devices.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_joystick.obj : $(SRC_DIR)\freeglut_joystick.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_main.obj : $(SRC_DIR)\freeglut_main.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_menu.obj : $(SRC_DIR)\freeglut_menu.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_misc.obj : $(SRC_DIR)\freeglut_misc.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_overlay.obj : $(SRC_DIR)\freeglut_overlay.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_spaceball.obj : $(SRC_DIR)\freeglut_spaceball.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_state.obj : $(SRC_DIR)\freeglut_state.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_stroke_mono_roman.obj : $(SRC_DIR)\freeglut_stroke_mono_roman.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_stroke_roman.obj : $(SRC_DIR)\freeglut_stroke_roman.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_structure.obj : $(SRC_DIR)\freeglut_structure.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_teapot.obj : $(SRC_DIR)\freeglut_teapot.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_videoresize.obj : $(SRC_DIR)\freeglut_videoresize.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-freeglut_window.obj : $(SRC_DIR)\freeglut_window.c\r
-       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)\r
-\r
-clean : .SYMBOLIC\r
-       @-del $(DEBUG_STATIC_DIR)\*.obj\r
-       @-del $(DEBUG_DYNAMIC_DIR)\*.obj\r
-       @-del $(RELEASE_STATIC_DIR)\*.obj\r
-       @-del $(RELEASE_DYNAMIC_DIR)\*.obj\r
-       @echo All object files removed\r
-       \r
-debug-static : .SYMBOLIC\r
-       @-if not exist $(DEBUG_STATIC_DIR)\. mkdir $(DEBUG_STATIC_DIR)\r
-       @-cd $(DEBUG_STATIC_DIR)\r
-       @$(MAKE) MODE=DEBUG TYPE=STATIC freeglut_static.lib\r
-       @-cd ..\r
-       @echo Debug static library up to date\r
-\r
-debug-dynamic : .SYMBOLIC\r
-       @-if not exist $(DEBUG_DYNAMIC_DIR)\. mkdir $(DEBUG_DYNAMIC_DIR)\r
-       @-cd $(DEBUG_DYNAMIC_DIR)\r
-       @$(MAKE) MODE=DEBUG TYPE=DYNAMIC freeglut.lib\r
-       @-cd ..\r
-       @echo Debug dynamic link library up to date\r
-\r
-release-static : .SYMBOLIC\r
-       @-if not exist $(RELEASE_STATIC_DIR)\. mkdir $(RELEASE_STATIC_DIR)\r
-       @-cd $(RELEASE_STATIC_DIR)\r
-       @$(MAKE) MODE=RELEASE TYPE=STATIC freeglut_static.lib\r
-       @-cd ..\r
-       @echo Release static library up to date\r
-\r
-release-dynamic : .SYMBOLIC\r
-       @-if not exist $(RELEASE_DYNAMIC_DIR)\. mkdir $(RELEASE_DYNAMIC_DIR)\r
-       @-cd $(RELEASE_DYNAMIC_DIR)\r
-       @$(MAKE) MODE=RELEASE TYPE=DYNAMIC freeglut.lib\r
-       @-cd ..\r
-       @echo Release dynamic link library up to date\r
-\r
-debug : debug-static debug-dynamic .SYMBOLIC\r
-       @echo Debug targets up to date\r
-\r
-release : release-static release-dynamic .SYMBOLIC\r
-       @echo Release targets up to date\r
-\r
-all : debug release .SYMBOLIC\r
-       @echo All targets up to date\r
+#
+# Makefile.wat
+# Open Watcom makefile for Freeglut
+# Usage:
+#    wmake -f Makefile.wat {target}
+# Where target is one of:
+#    debug-static
+#    debug-dynamic
+#    release-static
+#    release-dynamic
+#    debug
+#    release
+#    all
+#    clean
+# Assumes:
+#    WATCOM enviroment variable points to your Watcom installation directory
+#    %WATCOM%\BINNT and %WATCOM%\BINW are in your path
+#
+RELEASE_STATIC_DIR = release-static
+RELEASE_DYNAMIC_DIR = release-dynamic
+DEBUG_STATIC_DIR = debug-static
+DEBUG_DYNAMIC_DIR = debug-dynamic
+
+INCLUDE_DIR = ..\include
+SRC_DIR = ..\src\Common
+COMPILER = wcc386
+COMPILE_COMMON_OPTIONS = -i$(INCLUDE_DIR);$(%WATCOM)\h;$(%WATCOM)\h\nt -fp6 -w4 -e25 -wcd202 -bt=nt -mf -zq
+COMPILE_DEBUG_OPTIONS = -d3 -od -DDEBUG -D_DEBUG
+COMPILE_RELEASE_OPTIONS = -d0 -otexanh
+COMPILE_STATIC_OPTIONS = -DFREEGLUT_STATIC -6r
+COMPILE_DYNAMIC_OPTIONS = -DFREEGLUT_EXPORTS -6s -bd -bm
+COMPILE_OPTIONS = $(COMPILE_COMMON_OPTIONS) $(COMPILE_$(MODE)_OPTIONS) $(COMPILE_$(TYPE)_OPTIONS)
+
+LINKER = wlink
+LINK_OPTIONS = SYS nt_dll op m op maxe=25 op q op symf FIL
+
+LIB_TOOL = wlib
+LIB_COMMON_OPTIONS = -q -n -b
+LIB_DYNAMIC_OPTIONS =
+LIB_STATIC_OPTIONS = -c -p=512
+LIB_OPTIONS = $(LIB_COMMON_OPTIONS) $(LIB_$(TYPE)_OPTIONS)
+
+MAKE = wmake -h -f ..\Makefile.wat 
+
+OBJ_FILES = &
+       freeglut_callbacks.obj &
+       freeglut_cursor.obj &
+       freeglut_display.obj &
+       freeglut_ext.obj &
+       freeglut_font.obj &
+       freeglut_font_data.obj &
+       freeglut_gamemode.obj &
+       freeglut_geometry.obj &
+       freeglut_glutfont_definitions.obj &
+       freeglut_init.obj &
+       freeglut_input_devices.obj &
+       freeglut_joystick.obj &
+       freeglut_main.obj &
+       freeglut_menu.obj &
+       freeglut_misc.obj &
+       freeglut_overlay.obj &
+       freeglut_spaceball.obj &
+       freeglut_state.obj &
+       freeglut_stroke_mono_roman.obj &
+       freeglut_stroke_roman.obj &
+       freeglut_structure.obj &
+       freeglut_teapot.obj &
+       freeglut_videoresize.obj &
+       freeglut_window.obj
+
+default : .SYMBOLIC
+       @echo Usage:
+       @echo   wmake -f Makefile.wat {target}
+       @echo Where target is one of:
+       @echo   debug-static
+       @echo   debug-dynamic
+       @echo   release-static
+       @echo   release-dynamic
+       @echo   debug
+       @echo   release
+       @echo   all
+       @echo   clean
+
+# static library
+freeglut_static.lib : $(OBJ_FILES)
+       $(LIB_TOOL) $(LIB_OPTIONS) $^* $(OBJ_FILES)
+
+# dynamic link library
+freeglut.dll : $(OBJ_FILES)
+       $(LINKER) name $^* $(LINK_OPTIONS) $(OBJ_FILES: =,)
+
+freeglut.lib : freeglut.dll
+       $(LIB_TOOL) $(LIB_OPTIONS) $^. +$[.
+
+
+freeglut_callbacks.obj : $(SRC_DIR)\freeglut_callbacks.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+       
+freeglut_cursor.obj : $(SRC_DIR)\freeglut_cursor.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_display.obj : $(SRC_DIR)\freeglut_display.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_ext.obj : $(SRC_DIR)\freeglut_ext.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_font.obj : $(SRC_DIR)\freeglut_font.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_font_data.obj : $(SRC_DIR)\freeglut_font_data.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_gamemode.obj : $(SRC_DIR)\freeglut_gamemode.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_geometry.obj : $(SRC_DIR)\freeglut_geometry.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_glutfont_definitions.obj : $(SRC_DIR)\freeglut_glutfont_definitions.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_init.obj : $(SRC_DIR)\freeglut_init.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_input_devices.obj : $(SRC_DIR)\freeglut_input_devices.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_joystick.obj : $(SRC_DIR)\freeglut_joystick.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_main.obj : $(SRC_DIR)\freeglut_main.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_menu.obj : $(SRC_DIR)\freeglut_menu.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_misc.obj : $(SRC_DIR)\freeglut_misc.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_overlay.obj : $(SRC_DIR)\freeglut_overlay.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_spaceball.obj : $(SRC_DIR)\freeglut_spaceball.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_state.obj : $(SRC_DIR)\freeglut_state.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_stroke_mono_roman.obj : $(SRC_DIR)\freeglut_stroke_mono_roman.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_stroke_roman.obj : $(SRC_DIR)\freeglut_stroke_roman.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_structure.obj : $(SRC_DIR)\freeglut_structure.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_teapot.obj : $(SRC_DIR)\freeglut_teapot.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_videoresize.obj : $(SRC_DIR)\freeglut_videoresize.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+freeglut_window.obj : $(SRC_DIR)\freeglut_window.c
+       $(COMPILER) $(SRC_DIR)\$[. $(COMPILE_OPTIONS)
+
+clean : .SYMBOLIC
+       @-del $(DEBUG_STATIC_DIR)\*.obj
+       @-del $(DEBUG_DYNAMIC_DIR)\*.obj
+       @-del $(RELEASE_STATIC_DIR)\*.obj
+       @-del $(RELEASE_DYNAMIC_DIR)\*.obj
+       @echo All object files removed
+       
+debug-static : .SYMBOLIC
+       @-if not exist $(DEBUG_STATIC_DIR)\. mkdir $(DEBUG_STATIC_DIR)
+       @-cd $(DEBUG_STATIC_DIR)
+       @$(MAKE) MODE=DEBUG TYPE=STATIC freeglut_static.lib
+       @-cd ..
+       @echo Debug static library up to date
+
+debug-dynamic : .SYMBOLIC
+       @-if not exist $(DEBUG_DYNAMIC_DIR)\. mkdir $(DEBUG_DYNAMIC_DIR)
+       @-cd $(DEBUG_DYNAMIC_DIR)
+       @$(MAKE) MODE=DEBUG TYPE=DYNAMIC freeglut.lib
+       @-cd ..
+       @echo Debug dynamic link library up to date
+
+release-static : .SYMBOLIC
+       @-if not exist $(RELEASE_STATIC_DIR)\. mkdir $(RELEASE_STATIC_DIR)
+       @-cd $(RELEASE_STATIC_DIR)
+       @$(MAKE) MODE=RELEASE TYPE=STATIC freeglut_static.lib
+       @-cd ..
+       @echo Release static library up to date
+
+release-dynamic : .SYMBOLIC
+       @-if not exist $(RELEASE_DYNAMIC_DIR)\. mkdir $(RELEASE_DYNAMIC_DIR)
+       @-cd $(RELEASE_DYNAMIC_DIR)
+       @$(MAKE) MODE=RELEASE TYPE=DYNAMIC freeglut.lib
+       @-cd ..
+       @echo Release dynamic link library up to date
+
+debug : debug-static debug-dynamic .SYMBOLIC
+       @echo Debug targets up to date
+
+release : release-static release-dynamic .SYMBOLIC
+       @echo Release targets up to date
+
+all : debug release .SYMBOLIC
+       @echo All targets up to date
index f91a73c..06fd333 100644 (file)
-Glut then!\r
-\r
-By Jean-Seb on Friday July 10, 2009, 00:18\r
-Translated by Babelfish with a scrub from John F. Fay.  For points of confusion\r
-please refer to the original French version.\r
-\r
-Freeglut is an open-source evolution of GLUT.\r
-Under Windows, one can use it with Cygwin.\r
-Easy? Yes, if one agrees to distribute "cygwin1.dll".\r
-Let us help freeglut gain its independence !\r
-m.à.j 10/7/2009: generation of a library for linking without the DLL.\r
-\r
-\r
-Recovery of the sources\r
-\r
-    * Download the sources of version 2.6.0 which integrates recent changes.\r
-    * For the moment, it is a RC (Release Candidate), but the final version\r
-      should not delay.\r
-    * The use of the 2.6 is preferable with the 2.4-stable branch because many\r
-      bugs have been corrected.\r
-    * You will find the sources on the site of Freeglut:\r
-          o http://freeglut.sourceforge.net/\r
-\r
-\r
-Objectives and preparation\r
-Objectives\r
-\r
-    * We will create a DLL related to Cygwin, and an independent static library\r
-    * We will also create a dynamic library, allowing linking with the DLL.\r
-\r
-\r
-List of generated files\r
-\r
-    * freeglut.dll: a traditional DLL for the dynamic linkage.\r
-    * libfreeglut.a: the static library. The final program is autonomous (at\r
-      least for OpenGL).\r
-    * libfreeglutdll.a: the dynamic library. The final program needs\r
-      freeglut.dll.\r
-\r
-\r
-Preparation\r
-\r
-    * Extract the files from the freeglut archive.\r
-    * Go in the directory src (located at the root of the Freeglut directory),\r
-      and create a "Gl" sub-directory\r
-          o In this sub-directory, copy the files of the directory "include/Gl"\r
-\r
-    * Why is it necessary to create a "Gl" directory for compilation?\r
-          o I needed it to simplify things during my tests.\r
-          o If not you can create the repertories directly, and copy the files\r
-            as indicated in the point installation (see below).\r
-\r
-    * Do a little housekeeping in /lib:\r
-          o Erase all the references to the glut, so as not to conflict with the\r
-            linking.\r
-          o This stage is optional, you can also choose to do the housekeeping\r
-            only after a successful compilation of Freeglut.\r
-          o In your enthusiasm to clean things up, be careful not to erase the\r
-            library glu32.lib (not to be confused with glut32.lib).\r
-\r
-\r
-Compilation\r
-\r
-    * Forget the "./configure, make, make install" triptych.\r
-          o It does not go at all with Cygwin.\r
-\r
-    * Here Makefile which will make the deal:\r
-\r
-#Makefile for Freeglut 2.6.0-rc and Cygwin\r
-#To place in the directory \93src/Common\94\r
-\r
-sources=$ (wildcard *.c)\r
-objs=$ (sources: .c=.o)\r
-libname=freeglut\r
-\r
-\r
-CFLAGS=-O2 - DTARGET_HOST_MS_WINDOWS - DX_DISPLAY_MISSING - DFREEGLUT_STATIC - I./\r
-LDFLAGS=-lopengl32 - lgdi32 - lwinmm\r
-\r
-nocyg=-mno-cygwin - mwindows\r
-\r
-all: $ (objs)\r
-        #construction DLL related to cygwin1.dll\r
-        GCC $ (nocyg) $ (objs) - shared $ (LDFLAGS) - O $ (libname) .dll\r
-        Nm $ (libname) .dll  | awk \93BEGIN {print \93EXPORTS\94} /T _glut/{sub (/^.*T _/,\94 \ T "); print}\94 > $ (libname) .def\r
-        dlltool --dllname $ (libname) .dll --input-def $ (libname) .def --output-lib lib$ (libname) dll.a\r
-\r
-        #construction static library independent of cygwin\r
-        rear Cr lib$ (libname) .a $ (objs)\r
-        #pas inevitably obligatory (creation of an index to accelerate the accesses)\r
-        ranlib lib$ (libname) .a\r
-\r
-%.o: %.c\r
-        GCC $ (nocyg) - C $ (CFLAGS) $<\r
-\r
-clean:\r
-        rm - F *.o $ (libname) .dll $ (libname) .def lib$ (libname) dll.a lib$ (libname) .a\r
-\r
-\r
-\r
-\r
-Some remarks on the makefile\r
-\r
-    * This makefile creates a DLL, a static library (a file, in other words) and\r
-      the dynamic library which will allow the use of the DLL.\r
-\r
-    * Do not try to strip the static library! You may not be able to compile\r
-      applications with static library any more.\r
-          o On the other hand, you can strip the final executable obtained after\r
-            compiling your application.\r
-\r
-    * I chose to call the DLL and the libraries by their "true names":\r
-      freeglut.dll libfreeglutdll.a and libfreeglut.a.\r
-          o Script configures recreated (for reasons of compatibility with the\r
-            old GLUT library) glut.dll and libglut.a.\r
-          o During the my tests, I had conflicts with an authentic "glut" which\r
-            trailed in my "/lib". I decided to call the things by their name, in\r
-            order to avoid confusions.\r
-          o Nothing prevents you from renaming the DLL, if you need to use GLUT\r
-            programs which you cannot recompile.\r
-\r
-    * The dynamic library is generated starting from the DLL.\r
-          o For reasons of brevity, I used awk. It generates the export file\r
-            used by dlltool.\r
-          o The only notable thing is the selection of the functions whose name\r
-            starts with _glut, in order to avoid including in the dynamic\r
-            library the functions that are not related to freeglut.\r
-          o then, one uses dlltool in a very traditional way.\r
-\r
-Nm $ (libname) .dll  | awk \93BEGIN {print \93EXPORTS\94} /T _glut/{sub (/^.*T _/,\94 \ T "); print}\94 > $ (libname) .def\r
-dlltool --dllname $ (libname) .dll --input-def $ (libname) .def --output-lib lib$ (libname) dll.a\r
-\r
-\r
-\r
-\r
-Installation\r
-\r
-    * Copy libfreeglut.a, libfreeglutdll.a into the Cygwin directory /lib.\r
-    * Copy freglut.dll in the system32 of Windows (this is practical, but not\r
-      clean!).\r
-    * Copy the files headers of Freeglut (/include/gl) into the Cygwin directory\r
-      /usr/include/Gl.\r
-    * Copy the files headers (always /include/gl) into /usr/include/mingw/Gl:\r
-      this is used for compilations with the flag - mno-cygwin, which uses the\r
-      includes in mingw.\r
-          o You may need to erase the old GLUT include files if you installed it\r
-            with Cygwin.\r
-\r
-\r
-Use of the library\r
-\r
-    * We will test with the program shapes, found in progs/demonstrations/shapes\r
-          o -mno-cygwin is used to force the use of Mingw without the large\r
-            dependence cygwin1.dll.\r
-          o -mwindows is only used to remove the horrible Shell window (very\r
-            useful for the settling, on the other hand).\r
-          o -L. (note the period after the "L"): I left libfreeglut.a,\r
-            libfreeglutdll.a and freeglut.dll in the test directory, at the time \r
-            of the tests.\r
-\r
-\r
-Compilation of the static freeglut library, without cygwin\r
-\r
-    * All the simplicity lies in the define: -DFREEGLUT_STATIC\r
-          o It serves to obtain good decoration of the function names in the\r
-            imports of the lib Freeglut.\r
-          o You can test without and use a hex editor to see the differences\r
-            in the objects.\r
-    * attention with the order of the libraries: -lfreeglut (static) must be\r
-      before the declaration of the dynamic libraries.\r
-\r
-    * gcc shapes.c -L. -lfreeglut -lopengl32 -lwinmm -lgdi32 -mno-cygwin -mwindows -DFREEGLUT_STATIC\r
-\r
-\r
-Compilation with DLL freeglut, without cygwin\r
-\r
-    * For the define, see the notices above\r
-    * The order of the libraries is no longer important.\r
-\r
-    * gcc shapes.c -L. -lopengl32 -lwinmm -lgdi32 -lfreeglut -mno-cygwin -DFREEGLUT_STATIC\r
-\r
-\r
-Compilation with DLL freeglut, Cygwin\r
-\r
-    * This example is given only for reference, the topic of this ticket being\r
-      to get rid of Cygwin.\r
-          o Let us say that can be used to make the point (and later).\r
-\r
-    * gcc shapes.c -L. -lopengl32 -lwinmm -lgdi32 -lfreeglut\r
-\r
-\r
-\r
-Where are the dooooocs?\r
-\r
-    * Freeglut is delivered with its documentation, more very up to date.\r
-          o It seems that there is a problem with the original GLUT\r
-            documentation. Not only it does not correspond completely to the\r
-            operation of Freeglut, but moreover, its author (Mark Kilgard)\r
-            copyrighted it. Its distribution is thus difficult.\r
-\r
-    * Jocelyn Fréchot undertook a levelling of the docs for version 2.6.0. One can find them on his site for the moment:\r
-          o http://jocelyn.frechot.free.fr/freeglut/\r
-\r
-\r
-Something survived\85\r
-\r
-    * I also tested the recompiling of the demonstrations of the original lib\r
-      GLUT (peace with its ashes).\r
-          o Nothing in particular to be announced.\r
-\r
-    * Thank you with all the courageous maintainers for Freeglut, that one\r
-      believed dead, but which still move.\r
+Glut then!
+
+By Jean-Seb on Friday July 10, 2009, 00:18
+Translated by Babelfish with a scrub from John F. Fay.  For points of confusion
+please refer to the original French version.
+
+Freeglut is an open-source evolution of GLUT.
+Under Windows, one can use it with Cygwin.
+Easy? Yes, if one agrees to distribute "cygwin1.dll".
+Let us help freeglut gain its independence !
+m.à.j 10/7/2009: generation of a library for linking without the DLL.
+
+
+Recovery of the sources
+
+    * Download the sources of version 2.6.0 which integrates recent changes.
+    * For the moment, it is a RC (Release Candidate), but the final version
+      should not delay.
+    * The use of the 2.6 is preferable with the 2.4-stable branch because many
+      bugs have been corrected.
+    * You will find the sources on the site of Freeglut:
+          o http://freeglut.sourceforge.net/
+
+
+Objectives and preparation
+Objectives
+
+    * We will create a DLL related to Cygwin, and an independent static library
+    * We will also create a dynamic library, allowing linking with the DLL.
+
+
+List of generated files
+
+    * freeglut.dll: a traditional DLL for the dynamic linkage.
+    * libfreeglut.a: the static library. The final program is autonomous (at
+      least for OpenGL).
+    * libfreeglutdll.a: the dynamic library. The final program needs
+      freeglut.dll.
+
+
+Preparation
+
+    * Extract the files from the freeglut archive.
+    * Go in the directory src (located at the root of the Freeglut directory),
+      and create a "Gl" sub-directory
+          o In this sub-directory, copy the files of the directory "include/Gl"
+
+    * Why is it necessary to create a "Gl" directory for compilation?
+          o I needed it to simplify things during my tests.
+          o If not you can create the repertories directly, and copy the files
+            as indicated in the point installation (see below).
+
+    * Do a little housekeeping in /lib:
+          o Erase all the references to the glut, so as not to conflict with the
+            linking.
+          o This stage is optional, you can also choose to do the housekeeping
+            only after a successful compilation of Freeglut.
+          o In your enthusiasm to clean things up, be careful not to erase the
+            library glu32.lib (not to be confused with glut32.lib).
+
+
+Compilation
+
+    * Forget the "./configure, make, make install" triptych.
+          o It does not go at all with Cygwin.
+
+    * Here Makefile which will make the deal:
+
+#Makefile for Freeglut 2.6.0-rc and Cygwin
+#To place in the directory \93src/Common\94
+
+sources=$ (wildcard *.c)
+objs=$ (sources: .c=.o)
+libname=freeglut
+
+
+CFLAGS=-O2 - DTARGET_HOST_MS_WINDOWS - DX_DISPLAY_MISSING - DFREEGLUT_STATIC - I./
+LDFLAGS=-lopengl32 - lgdi32 - lwinmm
+
+nocyg=-mno-cygwin - mwindows
+
+all: $ (objs)
+        #construction DLL related to cygwin1.dll
+        GCC $ (nocyg) $ (objs) - shared $ (LDFLAGS) - O $ (libname) .dll
+        Nm $ (libname) .dll  | awk \93BEGIN {print \93EXPORTS\94} /T _glut/{sub (/^.*T _/,\94 \ T "); print}\94 > $ (libname) .def
+        dlltool --dllname $ (libname) .dll --input-def $ (libname) .def --output-lib lib$ (libname) dll.a
+
+        #construction static library independent of cygwin
+        rear Cr lib$ (libname) .a $ (objs)
+        #pas inevitably obligatory (creation of an index to accelerate the accesses)
+        ranlib lib$ (libname) .a
+
+%.o: %.c
+        GCC $ (nocyg) - C $ (CFLAGS) $<
+
+clean:
+        rm - F *.o $ (libname) .dll $ (libname) .def lib$ (libname) dll.a lib$ (libname) .a
+
+
+
+
+Some remarks on the makefile
+
+    * This makefile creates a DLL, a static library (a file, in other words) and
+      the dynamic library which will allow the use of the DLL.
+
+    * Do not try to strip the static library! You may not be able to compile
+      applications with static library any more.
+          o On the other hand, you can strip the final executable obtained after
+            compiling your application.
+
+    * I chose to call the DLL and the libraries by their "true names":
+      freeglut.dll libfreeglutdll.a and libfreeglut.a.
+          o Script configures recreated (for reasons of compatibility with the
+            old GLUT library) glut.dll and libglut.a.
+          o During the my tests, I had conflicts with an authentic "glut" which
+            trailed in my "/lib". I decided to call the things by their name, in
+            order to avoid confusions.
+          o Nothing prevents you from renaming the DLL, if you need to use GLUT
+            programs which you cannot recompile.
+
+    * The dynamic library is generated starting from the DLL.
+          o For reasons of brevity, I used awk. It generates the export file
+            used by dlltool.
+          o The only notable thing is the selection of the functions whose name
+            starts with _glut, in order to avoid including in the dynamic
+            library the functions that are not related to freeglut.
+          o then, one uses dlltool in a very traditional way.
+
+Nm $ (libname) .dll  | awk \93BEGIN {print \93EXPORTS\94} /T _glut/{sub (/^.*T _/,\94 \ T "); print}\94 > $ (libname) .def
+dlltool --dllname $ (libname) .dll --input-def $ (libname) .def --output-lib lib$ (libname) dll.a
+
+
+
+
+Installation
+
+    * Copy libfreeglut.a, libfreeglutdll.a into the Cygwin directory /lib.
+    * Copy freglut.dll in the system32 of Windows (this is practical, but not
+      clean!).
+    * Copy the files headers of Freeglut (/include/gl) into the Cygwin directory
+      /usr/include/Gl.
+    * Copy the files headers (always /include/gl) into /usr/include/mingw/Gl:
+      this is used for compilations with the flag - mno-cygwin, which uses the
+      includes in mingw.
+          o You may need to erase the old GLUT include files if you installed it
+            with Cygwin.
+
+
+Use of the library
+
+    * We will test with the program shapes, found in progs/demonstrations/shapes
+          o -mno-cygwin is used to force the use of Mingw without the large
+            dependence cygwin1.dll.
+          o -mwindows is only used to remove the horrible Shell window (very
+            useful for the settling, on the other hand).
+          o -L. (note the period after the "L"): I left libfreeglut.a,
+            libfreeglutdll.a and freeglut.dll in the test directory, at the time 
+            of the tests.
+
+
+Compilation of the static freeglut library, without cygwin
+
+    * All the simplicity lies in the define: -DFREEGLUT_STATIC
+          o It serves to obtain good decoration of the function names in the
+            imports of the lib Freeglut.
+          o You can test without and use a hex editor to see the differences
+            in the objects.
+    * attention with the order of the libraries: -lfreeglut (static) must be
+      before the declaration of the dynamic libraries.
+
+    * gcc shapes.c -L. -lfreeglut -lopengl32 -lwinmm -lgdi32 -mno-cygwin -mwindows -DFREEGLUT_STATIC
+
+
+Compilation with DLL freeglut, without cygwin
+
+    * For the define, see the notices above
+    * The order of the libraries is no longer important.
+
+    * gcc shapes.c -L. -lopengl32 -lwinmm -lgdi32 -lfreeglut -mno-cygwin -DFREEGLUT_STATIC
+
+
+Compilation with DLL freeglut, Cygwin
+
+    * This example is given only for reference, the topic of this ticket being
+      to get rid of Cygwin.
+          o Let us say that can be used to make the point (and later).
+
+    * gcc shapes.c -L. -lopengl32 -lwinmm -lgdi32 -lfreeglut
+
+
+
+Where are the dooooocs?
+
+    * Freeglut is delivered with its documentation, more very up to date.
+          o It seems that there is a problem with the original GLUT
+            documentation. Not only it does not correspond completely to the
+            operation of Freeglut, but moreover, its author (Mark Kilgard)
+            copyrighted it. Its distribution is thus difficult.
+
+    * Jocelyn Fréchot undertook a levelling of the docs for version 2.6.0. One can find them on his site for the moment:
+          o http://jocelyn.frechot.free.fr/freeglut/
+
+
+Something survived\85
+
+    * I also tested the recompiling of the demonstrations of the original lib
+      GLUT (peace with its ashes).
+          o Nothing in particular to be announced.
+
+    * Thank you with all the courageous maintainers for Freeglut, that one
+      believed dead, but which still move.
index 63eb435..65d5c3f 100644 (file)
@@ -1,24 +1,24 @@
-Cross-compilation from GNU/Linux (static and shared DLL)\r
-========================================================\r
-\r
-Install MinGW32 and prepare FreeGLUT on Debian/Ubuntu:\r
-\r
-  apt-get install mingw32\r
-  ./configure --host=i586-mingw32msvc --prefix=/freeglut\r
-\r
-Install MinGW32 and prepare FreeGLUT on Fedora:\r
-\r
-  yum install mingw32-gcc\r
-  ./configure --host=i686-pc-mingw32 --prefix=/freeglut\r
-\r
-Cross-compile!\r
-\r
-  make\r
-  make install DESTDIR=$(pwd)\r
-\r
-Everything is in the new freeglut/ directory.\r
-The .dll is in the freeglut/bin/.\r
-\r
-\r
-Compilation of your own programs is done as usual.\r
-See README.cygwin_mingw for details.\r
+Cross-compilation from GNU/Linux (static and shared DLL)
+========================================================
+
+Install MinGW32 and prepare FreeGLUT on Debian/Ubuntu:
+
+  apt-get install mingw32
+  ./configure --host=i586-mingw32msvc --prefix=/freeglut
+
+Install MinGW32 and prepare FreeGLUT on Fedora:
+
+  yum install mingw32-gcc
+  ./configure --host=i686-pc-mingw32 --prefix=/freeglut
+
+Cross-compile!
+
+  make
+  make install DESTDIR=$(pwd)
+
+Everything is in the new freeglut/ directory.
+The .dll is in the freeglut/bin/.
+
+
+Compilation of your own programs is done as usual.
+See README.cygwin_mingw for details.
old mode 100755 (executable)
new mode 100644 (file)
index d536326..a40f7da 100644 (file)
-/*\r
- * freeglut_callbacks.c\r
- *\r
- * The callbacks setting methods.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Fri Dec 3 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */\r
-\r
-/*\r
- * All of the callbacks setting methods can be generalized to this:\r
- */\r
-#define SET_CALLBACK(a)                                         \\r
-do                                                              \\r
-{                                                               \\r
-    if( fgStructure.CurrentWindow == NULL )                     \\r
-        return;                                                 \\r
-    SET_WCB( ( *( fgStructure.CurrentWindow ) ), a, callback ); \\r
-} while( 0 )\r
-\r
-/*\r
- * Sets the Display callback for the current window\r
- */\r
-void FGAPIENTRY glutDisplayFunc( void (* callback)( void ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDisplayFunc" );\r
-    if( !callback )\r
-        fgError( "Fatal error in program.  NULL display callback not "\r
-                 "permitted in GLUT 3.0+ or freeglut 2.0.1+" );\r
-    SET_CALLBACK( Display );\r
-}\r
-\r
-/*\r
- * Sets the Reshape callback for the current window\r
- */\r
-void FGAPIENTRY glutReshapeFunc( void (* callback)( int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutReshapeFunc" );\r
-    SET_CALLBACK( Reshape );\r
-}\r
-\r
-/*\r
- * Sets the Keyboard callback for the current window\r
- */\r
-void FGAPIENTRY glutKeyboardFunc( void (* callback)\r
-                                  ( unsigned char, int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutKeyboardFunc" );\r
-    SET_CALLBACK( Keyboard );\r
-}\r
-\r
-/*\r
- * Sets the Special callback for the current window\r
- */\r
-void FGAPIENTRY glutSpecialFunc( void (* callback)( int, int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpecialFunc" );\r
-    SET_CALLBACK( Special );\r
-}\r
-\r
-/*\r
- * Sets the global idle callback\r
- */\r
-void FGAPIENTRY glutIdleFunc( void (* callback)( void ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutIdleFunc" );\r
-    fgState.IdleCallback = callback;\r
-}\r
-\r
-/*\r
- * Sets the Timer callback for the current window\r
- */\r
-void FGAPIENTRY glutTimerFunc( unsigned int timeOut, void (* callback)( int ),\r
-                               int timerID )\r
-{\r
-    SFG_Timer *timer, *node;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutTimerFunc" );\r
-\r
-    if( (timer = fgState.FreeTimers.Last) )\r
-    {\r
-        fgListRemove( &fgState.FreeTimers, &timer->Node );\r
-    }\r
-    else\r
-    {\r
-        if( ! (timer = malloc(sizeof(SFG_Timer))) )\r
-            fgError( "Fatal error: "\r
-                     "Memory allocation failure in glutTimerFunc()" );\r
-    }\r
-\r
-    timer->Callback  = callback;\r
-    timer->ID        = timerID;\r
-    timer->TriggerTime = fgElapsedTime() + timeOut;\r
-\r
-    for( node = fgState.Timers.First; node; node = node->Node.Next )\r
-    {\r
-        if( node->TriggerTime > timer->TriggerTime )\r
-            break;\r
-    }\r
-\r
-    fgListInsert( &fgState.Timers, &node->Node, &timer->Node );\r
-}\r
-\r
-/*\r
- * Sets the Visibility callback for the current window.\r
- */\r
-static void fghVisibility( int status )\r
-{\r
-    int glut_status = GLUT_VISIBLE;\r
-\r
-    FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Visibility Callback" );\r
-    freeglut_return_if_fail( fgStructure.CurrentWindow );\r
-\r
-    if( ( GLUT_HIDDEN == status )  || ( GLUT_FULLY_COVERED == status ) )\r
-        glut_status = GLUT_NOT_VISIBLE;\r
-    INVOKE_WCB( *( fgStructure.CurrentWindow ), Visibility, ( glut_status ) );\r
-}\r
-\r
-void FGAPIENTRY glutVisibilityFunc( void (* callback)( int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutVisibilityFunc" );\r
-    SET_CALLBACK( Visibility );\r
-\r
-    if( callback )\r
-        glutWindowStatusFunc( fghVisibility );\r
-    else\r
-        glutWindowStatusFunc( NULL );\r
-}\r
-\r
-/*\r
- * Sets the keyboard key release callback for the current window\r
- */\r
-void FGAPIENTRY glutKeyboardUpFunc( void (* callback)\r
-                                    ( unsigned char, int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutKeyboardUpFunc" );\r
-    SET_CALLBACK( KeyboardUp );\r
-}\r
-\r
-/*\r
- * Sets the special key release callback for the current window\r
- */\r
-void FGAPIENTRY glutSpecialUpFunc( void (* callback)( int, int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpecialUpFunc" );\r
-    SET_CALLBACK( SpecialUp );\r
-}\r
-\r
-/*\r
- * Sets the joystick callback and polling rate for the current window\r
- */\r
-void FGAPIENTRY glutJoystickFunc( void (* callback)\r
-                                  ( unsigned int, int, int, int ),\r
-                                  int pollInterval )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickFunc" );\r
-    fgInitialiseJoysticks ();\r
-\r
-    if ( ( ( fgStructure.CurrentWindow->State.JoystickPollRate < 0 ) ||\r
-           !FETCH_WCB(*fgStructure.CurrentWindow,Joystick) ) &&  /* Joystick callback was disabled */\r
-         ( callback && ( pollInterval >= 0 ) ) )               /* but is now enabled */\r
-        ++fgState.NumActiveJoysticks;\r
-    else if ( ( ( fgStructure.CurrentWindow->State.JoystickPollRate >= 0 ) &&\r
-                FETCH_WCB(*fgStructure.CurrentWindow,Joystick) ) &&  /* Joystick callback was enabled */\r
-              ( !callback || ( pollInterval < 0 ) ) )              /* but is now disabled */\r
-        --fgState.NumActiveJoysticks;\r
-\r
-    SET_CALLBACK( Joystick );\r
-    fgStructure.CurrentWindow->State.JoystickPollRate = pollInterval;\r
-\r
-    fgStructure.CurrentWindow->State.JoystickLastPoll =\r
-        fgElapsedTime() - fgStructure.CurrentWindow->State.JoystickPollRate;\r
-\r
-    if( fgStructure.CurrentWindow->State.JoystickLastPoll < 0 )\r
-        fgStructure.CurrentWindow->State.JoystickLastPoll = 0;\r
-}\r
-\r
-/*\r
- * Sets the mouse callback for the current window\r
- */\r
-void FGAPIENTRY glutMouseFunc( void (* callback)( int, int, int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMouseFunc" );\r
-    SET_CALLBACK( Mouse );\r
-}\r
-\r
-/*\r
- * Sets the mouse wheel callback for the current window\r
- */\r
-void FGAPIENTRY glutMouseWheelFunc( void (* callback)( int, int, int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMouseWheelFunc" );\r
-    SET_CALLBACK( MouseWheel );\r
-}\r
-\r
-/*\r
- * Sets the mouse motion callback for the current window (one or more buttons\r
- * are pressed)\r
- */\r
-void FGAPIENTRY glutMotionFunc( void (* callback)( int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMotionFunc" );\r
-    SET_CALLBACK( Motion );\r
-}\r
-\r
-/*\r
- * Sets the passive mouse motion callback for the current window (no mouse\r
- * buttons are pressed)\r
- */\r
-void FGAPIENTRY glutPassiveMotionFunc( void (* callback)( int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPassiveMotionFunc" );\r
-    SET_CALLBACK( Passive );\r
-}\r
-\r
-/*\r
- * Window mouse entry/leave callback\r
- */\r
-void FGAPIENTRY glutEntryFunc( void (* callback)( int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutEntryFunc" );\r
-    SET_CALLBACK( Entry );\r
-}\r
-\r
-/*\r
- * Window destruction callbacks\r
- */\r
-void FGAPIENTRY glutCloseFunc( void (* callback)( void ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCloseFunc" );\r
-    SET_CALLBACK( Destroy );\r
-}\r
-\r
-void FGAPIENTRY glutWMCloseFunc( void (* callback)( void ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWMCloseFunc" );\r
-    glutCloseFunc( callback );\r
-}\r
-\r
-/* A. Donev: Destruction callback for menus */\r
-void FGAPIENTRY glutMenuDestroyFunc( void (* callback)( void ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuDestroyFunc" );\r
-    if( fgStructure.CurrentMenu )\r
-        fgStructure.CurrentMenu->Destroy = callback;\r
-}\r
-\r
-/*\r
- * Deprecated version of glutMenuStatusFunc callback setting method\r
- */\r
-void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuStateFunc" );\r
-    fgState.MenuStateCallback = callback;\r
-}\r
-\r
-/*\r
- * Sets the global menu status callback for the current window\r
- */\r
-void FGAPIENTRY glutMenuStatusFunc( void (* callback)( int, int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuStatusFunc" );\r
-    fgState.MenuStatusCallback = callback;\r
-}\r
-\r
-/*\r
- * Sets the overlay display callback for the current window\r
- */\r
-void FGAPIENTRY glutOverlayDisplayFunc( void (* callback)( void ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutOverlayDisplayFunc" );\r
-    SET_CALLBACK( OverlayDisplay );\r
-}\r
-\r
-/*\r
- * Sets the window status callback for the current window\r
- */\r
-void FGAPIENTRY glutWindowStatusFunc( void (* callback)( int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWindowStatusFunc" );\r
-    SET_CALLBACK( WindowStatus );\r
-}\r
-\r
-/*\r
- * Sets the spaceball motion callback for the current window\r
- */\r
-void FGAPIENTRY glutSpaceballMotionFunc( void (* callback)( int, int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpaceballMotionFunc" );\r
-    fgInitialiseSpaceball();\r
-\r
-    SET_CALLBACK( SpaceMotion );\r
-}\r
-\r
-/*\r
- * Sets the spaceball rotate callback for the current window\r
- */\r
-void FGAPIENTRY glutSpaceballRotateFunc( void (* callback)( int, int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpaceballRotateFunc" );\r
-    fgInitialiseSpaceball();\r
-\r
-    SET_CALLBACK( SpaceRotation );\r
-}\r
-\r
-/*\r
- * Sets the spaceball button callback for the current window\r
- */\r
-void FGAPIENTRY glutSpaceballButtonFunc( void (* callback)( int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpaceballButtonFunc" );\r
-    fgInitialiseSpaceball();\r
-\r
-    SET_CALLBACK( SpaceButton );\r
-}\r
-\r
-/*\r
- * Sets the button box callback for the current window\r
- */\r
-void FGAPIENTRY glutButtonBoxFunc( void (* callback)( int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutButtonBoxFunc" );\r
-    SET_CALLBACK( ButtonBox );\r
-}\r
-\r
-/*\r
- * Sets the dials box callback for the current window\r
- */\r
-void FGAPIENTRY glutDialsFunc( void (* callback)( int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDialsFunc" );\r
-    SET_CALLBACK( Dials );\r
-}\r
-\r
-/*\r
- * Sets the tablet motion callback for the current window\r
- */\r
-void FGAPIENTRY glutTabletMotionFunc( void (* callback)( int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutTabletMotionFunc" );\r
-    SET_CALLBACK( TabletMotion );\r
-}\r
-\r
-/*\r
- * Sets the tablet buttons callback for the current window\r
- */\r
-void FGAPIENTRY glutTabletButtonFunc( void (* callback)( int, int, int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutTabletButtonFunc" );\r
-    SET_CALLBACK( TabletButton );\r
-}\r
-\r
-/*\r
- * Sets the multi-pointer entry callback for the current window\r
- */\r
-void FGAPIENTRY glutMultiEntryFunc( void (* callback)(int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMultiEntryFunc" );\r
-    SET_CALLBACK( MultiEntry );\r
-}\r
-\r
-/*\r
- * Sets the multi-pointer button callback for the current window\r
- */\r
-void FGAPIENTRY glutMultiButtonFunc( void (* callback)(int, int, int, int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMultiButtonFunc" );\r
-    SET_CALLBACK( MultiButton );\r
-}\r
-\r
-/*\r
- * Sets the multi-pointer motion callback for the current window\r
- */\r
-void FGAPIENTRY glutMultiMotionFunc( void (* callback)(int, int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMultiMotionFunc" );\r
-    SET_CALLBACK( MultiMotion );\r
-}\r
-\r
-/*\r
- * Sets the multi-pointer passive motion callback for the current window\r
- */\r
-void FGAPIENTRY glutMultiPassiveFunc( void (* callback)(int, int, int ) )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMultiPassiveFunc" );\r
-    SET_CALLBACK( MultiPassive );\r
-}\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_callbacks.c
+ *
+ * The callbacks setting methods.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Fri Dec 3 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * All of the callbacks setting methods can be generalized to this:
+ */
+#define SET_CALLBACK(a)                                         \
+do                                                              \
+{                                                               \
+    if( fgStructure.CurrentWindow == NULL )                     \
+        return;                                                 \
+    SET_WCB( ( *( fgStructure.CurrentWindow ) ), a, callback ); \
+} while( 0 )
+
+/*
+ * Sets the Display callback for the current window
+ */
+void FGAPIENTRY glutDisplayFunc( void (* callback)( void ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDisplayFunc" );
+    if( !callback )
+        fgError( "Fatal error in program.  NULL display callback not "
+                 "permitted in GLUT 3.0+ or freeglut 2.0.1+" );
+    SET_CALLBACK( Display );
+}
+
+/*
+ * Sets the Reshape callback for the current window
+ */
+void FGAPIENTRY glutReshapeFunc( void (* callback)( int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutReshapeFunc" );
+    SET_CALLBACK( Reshape );
+}
+
+/*
+ * Sets the Keyboard callback for the current window
+ */
+void FGAPIENTRY glutKeyboardFunc( void (* callback)
+                                  ( unsigned char, int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutKeyboardFunc" );
+    SET_CALLBACK( Keyboard );
+}
+
+/*
+ * Sets the Special callback for the current window
+ */
+void FGAPIENTRY glutSpecialFunc( void (* callback)( int, int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpecialFunc" );
+    SET_CALLBACK( Special );
+}
+
+/*
+ * Sets the global idle callback
+ */
+void FGAPIENTRY glutIdleFunc( void (* callback)( void ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutIdleFunc" );
+    fgState.IdleCallback = callback;
+}
+
+/*
+ * Sets the Timer callback for the current window
+ */
+void FGAPIENTRY glutTimerFunc( unsigned int timeOut, void (* callback)( int ),
+                               int timerID )
+{
+    SFG_Timer *timer, *node;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutTimerFunc" );
+
+    if( (timer = fgState.FreeTimers.Last) )
+    {
+        fgListRemove( &fgState.FreeTimers, &timer->Node );
+    }
+    else
+    {
+        if( ! (timer = malloc(sizeof(SFG_Timer))) )
+            fgError( "Fatal error: "
+                     "Memory allocation failure in glutTimerFunc()" );
+    }
+
+    timer->Callback  = callback;
+    timer->ID        = timerID;
+    timer->TriggerTime = fgElapsedTime() + timeOut;
+
+    for( node = fgState.Timers.First; node; node = node->Node.Next )
+    {
+        if( node->TriggerTime > timer->TriggerTime )
+            break;
+    }
+
+    fgListInsert( &fgState.Timers, &node->Node, &timer->Node );
+}
+
+/*
+ * Sets the Visibility callback for the current window.
+ */
+static void fghVisibility( int status )
+{
+    int glut_status = GLUT_VISIBLE;
+
+    FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Visibility Callback" );
+    freeglut_return_if_fail( fgStructure.CurrentWindow );
+
+    if( ( GLUT_HIDDEN == status )  || ( GLUT_FULLY_COVERED == status ) )
+        glut_status = GLUT_NOT_VISIBLE;
+    INVOKE_WCB( *( fgStructure.CurrentWindow ), Visibility, ( glut_status ) );
+}
+
+void FGAPIENTRY glutVisibilityFunc( void (* callback)( int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutVisibilityFunc" );
+    SET_CALLBACK( Visibility );
+
+    if( callback )
+        glutWindowStatusFunc( fghVisibility );
+    else
+        glutWindowStatusFunc( NULL );
+}
+
+/*
+ * Sets the keyboard key release callback for the current window
+ */
+void FGAPIENTRY glutKeyboardUpFunc( void (* callback)
+                                    ( unsigned char, int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutKeyboardUpFunc" );
+    SET_CALLBACK( KeyboardUp );
+}
+
+/*
+ * Sets the special key release callback for the current window
+ */
+void FGAPIENTRY glutSpecialUpFunc( void (* callback)( int, int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpecialUpFunc" );
+    SET_CALLBACK( SpecialUp );
+}
+
+/*
+ * Sets the joystick callback and polling rate for the current window
+ */
+void FGAPIENTRY glutJoystickFunc( void (* callback)
+                                  ( unsigned int, int, int, int ),
+                                  int pollInterval )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickFunc" );
+    fgInitialiseJoysticks ();
+
+    if ( ( ( fgStructure.CurrentWindow->State.JoystickPollRate < 0 ) ||
+           !FETCH_WCB(*fgStructure.CurrentWindow,Joystick) ) &&  /* Joystick callback was disabled */
+         ( callback && ( pollInterval >= 0 ) ) )               /* but is now enabled */
+        ++fgState.NumActiveJoysticks;
+    else if ( ( ( fgStructure.CurrentWindow->State.JoystickPollRate >= 0 ) &&
+                FETCH_WCB(*fgStructure.CurrentWindow,Joystick) ) &&  /* Joystick callback was enabled */
+              ( !callback || ( pollInterval < 0 ) ) )              /* but is now disabled */
+        --fgState.NumActiveJoysticks;
+
+    SET_CALLBACK( Joystick );
+    fgStructure.CurrentWindow->State.JoystickPollRate = pollInterval;
+
+    fgStructure.CurrentWindow->State.JoystickLastPoll =
+        fgElapsedTime() - fgStructure.CurrentWindow->State.JoystickPollRate;
+
+    if( fgStructure.CurrentWindow->State.JoystickLastPoll < 0 )
+        fgStructure.CurrentWindow->State.JoystickLastPoll = 0;
+}
+
+/*
+ * Sets the mouse callback for the current window
+ */
+void FGAPIENTRY glutMouseFunc( void (* callback)( int, int, int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMouseFunc" );
+    SET_CALLBACK( Mouse );
+}
+
+/*
+ * Sets the mouse wheel callback for the current window
+ */
+void FGAPIENTRY glutMouseWheelFunc( void (* callback)( int, int, int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMouseWheelFunc" );
+    SET_CALLBACK( MouseWheel );
+}
+
+/*
+ * Sets the mouse motion callback for the current window (one or more buttons
+ * are pressed)
+ */
+void FGAPIENTRY glutMotionFunc( void (* callback)( int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMotionFunc" );
+    SET_CALLBACK( Motion );
+}
+
+/*
+ * Sets the passive mouse motion callback for the current window (no mouse
+ * buttons are pressed)
+ */
+void FGAPIENTRY glutPassiveMotionFunc( void (* callback)( int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPassiveMotionFunc" );
+    SET_CALLBACK( Passive );
+}
+
+/*
+ * Window mouse entry/leave callback
+ */
+void FGAPIENTRY glutEntryFunc( void (* callback)( int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutEntryFunc" );
+    SET_CALLBACK( Entry );
+}
+
+/*
+ * Window destruction callbacks
+ */
+void FGAPIENTRY glutCloseFunc( void (* callback)( void ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCloseFunc" );
+    SET_CALLBACK( Destroy );
+}
+
+void FGAPIENTRY glutWMCloseFunc( void (* callback)( void ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWMCloseFunc" );
+    glutCloseFunc( callback );
+}
+
+/* A. Donev: Destruction callback for menus */
+void FGAPIENTRY glutMenuDestroyFunc( void (* callback)( void ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuDestroyFunc" );
+    if( fgStructure.CurrentMenu )
+        fgStructure.CurrentMenu->Destroy = callback;
+}
+
+/*
+ * Deprecated version of glutMenuStatusFunc callback setting method
+ */
+void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuStateFunc" );
+    fgState.MenuStateCallback = callback;
+}
+
+/*
+ * Sets the global menu status callback for the current window
+ */
+void FGAPIENTRY glutMenuStatusFunc( void (* callback)( int, int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMenuStatusFunc" );
+    fgState.MenuStatusCallback = callback;
+}
+
+/*
+ * Sets the overlay display callback for the current window
+ */
+void FGAPIENTRY glutOverlayDisplayFunc( void (* callback)( void ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutOverlayDisplayFunc" );
+    SET_CALLBACK( OverlayDisplay );
+}
+
+/*
+ * Sets the window status callback for the current window
+ */
+void FGAPIENTRY glutWindowStatusFunc( void (* callback)( int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWindowStatusFunc" );
+    SET_CALLBACK( WindowStatus );
+}
+
+/*
+ * Sets the spaceball motion callback for the current window
+ */
+void FGAPIENTRY glutSpaceballMotionFunc( void (* callback)( int, int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpaceballMotionFunc" );
+    fgInitialiseSpaceball();
+
+    SET_CALLBACK( SpaceMotion );
+}
+
+/*
+ * Sets the spaceball rotate callback for the current window
+ */
+void FGAPIENTRY glutSpaceballRotateFunc( void (* callback)( int, int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpaceballRotateFunc" );
+    fgInitialiseSpaceball();
+
+    SET_CALLBACK( SpaceRotation );
+}
+
+/*
+ * Sets the spaceball button callback for the current window
+ */
+void FGAPIENTRY glutSpaceballButtonFunc( void (* callback)( int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSpaceballButtonFunc" );
+    fgInitialiseSpaceball();
+
+    SET_CALLBACK( SpaceButton );
+}
+
+/*
+ * Sets the button box callback for the current window
+ */
+void FGAPIENTRY glutButtonBoxFunc( void (* callback)( int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutButtonBoxFunc" );
+    SET_CALLBACK( ButtonBox );
+}
+
+/*
+ * Sets the dials box callback for the current window
+ */
+void FGAPIENTRY glutDialsFunc( void (* callback)( int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDialsFunc" );
+    SET_CALLBACK( Dials );
+}
+
+/*
+ * Sets the tablet motion callback for the current window
+ */
+void FGAPIENTRY glutTabletMotionFunc( void (* callback)( int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutTabletMotionFunc" );
+    SET_CALLBACK( TabletMotion );
+}
+
+/*
+ * Sets the tablet buttons callback for the current window
+ */
+void FGAPIENTRY glutTabletButtonFunc( void (* callback)( int, int, int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutTabletButtonFunc" );
+    SET_CALLBACK( TabletButton );
+}
+
+/*
+ * Sets the multi-pointer entry callback for the current window
+ */
+void FGAPIENTRY glutMultiEntryFunc( void (* callback)(int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMultiEntryFunc" );
+    SET_CALLBACK( MultiEntry );
+}
+
+/*
+ * Sets the multi-pointer button callback for the current window
+ */
+void FGAPIENTRY glutMultiButtonFunc( void (* callback)(int, int, int, int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMultiButtonFunc" );
+    SET_CALLBACK( MultiButton );
+}
+
+/*
+ * Sets the multi-pointer motion callback for the current window
+ */
+void FGAPIENTRY glutMultiMotionFunc( void (* callback)(int, int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMultiMotionFunc" );
+    SET_CALLBACK( MultiMotion );
+}
+
+/*
+ * Sets the multi-pointer passive motion callback for the current window
+ */
+void FGAPIENTRY glutMultiPassiveFunc( void (* callback)(int, int, int ) )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMultiPassiveFunc" );
+    SET_CALLBACK( MultiPassive );
+}
+
+/*** END OF FILE ***/
index 3b144f3..b9254c1 100644 (file)
@@ -1,79 +1,79 @@
-/*\r
- * freeglut_cursor.c\r
- *\r
- * The mouse cursor related stuff.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Thu Dec 16 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-/*\r
- * TODO BEFORE THE STABLE RELEASE:\r
- *  glutSetCursor()     -- Win32 mappings are incomplete.\r
- *\r
- * It would be good to use custom mouse cursor shapes, and introduce\r
- * an option to display them using glBitmap() and/or texture mapping,\r
- * apart from the windowing system version.\r
- */\r
-\r
-/* -- PRIVATE FUNCTIONS --------------------------------------------------- */\r
-\r
-extern void fgPlatformSetCursor ( SFG_Window *window, int cursorID );\r
-extern void fgPlatformWarpPointer ( int x, int y );\r
-\r
-\r
-\r
-/* -- INTERNAL FUNCTIONS ---------------------------------------------------- */\r
-void fgSetCursor ( SFG_Window *window, int cursorID )\r
-{\r
-    fgPlatformSetCursor ( window, cursorID );\r
-}\r
-\r
-\r
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */\r
-\r
-/*\r
- * Set the cursor image to be used for the current window\r
- */\r
-void FGAPIENTRY glutSetCursor( int cursorID )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetCursor" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetCursor" );\r
-\r
-    fgPlatformSetCursor ( fgStructure.CurrentWindow, cursorID );\r
-    fgStructure.CurrentWindow->State.Cursor = cursorID;\r
-}\r
-\r
-/*\r
- * Moves the mouse pointer to given window coordinates\r
- */\r
-void FGAPIENTRY glutWarpPointer( int x, int y )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWarpPointer" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutWarpPointer" );\r
-\r
-    fgPlatformWarpPointer ( x, y );\r
-}\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_cursor.c
+ *
+ * The mouse cursor related stuff.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Thu Dec 16 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ *  glutSetCursor()     -- Win32 mappings are incomplete.
+ *
+ * It would be good to use custom mouse cursor shapes, and introduce
+ * an option to display them using glBitmap() and/or texture mapping,
+ * apart from the windowing system version.
+ */
+
+/* -- PRIVATE FUNCTIONS --------------------------------------------------- */
+
+extern void fgPlatformSetCursor ( SFG_Window *window, int cursorID );
+extern void fgPlatformWarpPointer ( int x, int y );
+
+
+
+/* -- INTERNAL FUNCTIONS ---------------------------------------------------- */
+void fgSetCursor ( SFG_Window *window, int cursorID )
+{
+    fgPlatformSetCursor ( window, cursorID );
+}
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Set the cursor image to be used for the current window
+ */
+void FGAPIENTRY glutSetCursor( int cursorID )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetCursor" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetCursor" );
+
+    fgPlatformSetCursor ( fgStructure.CurrentWindow, cursorID );
+    fgStructure.CurrentWindow->State.Cursor = cursorID;
+}
+
+/*
+ * Moves the mouse pointer to given window coordinates
+ */
+void FGAPIENTRY glutWarpPointer( int x, int y )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWarpPointer" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutWarpPointer" );
+
+    fgPlatformWarpPointer ( x, y );
+}
+
+/*** END OF FILE ***/
index 8264949..6421be4 100644 (file)
-/*\r
- * freeglut_display.c\r
- *\r
- * Display message posting, context buffer swapping.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Fri Dec 3 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-\r
-/* Function prototypes */\r
-extern void fgPlatformGlutSwapBuffers( SFG_PlatformDisplay *pDisplayPtr, SFG_Window* CurrentWindow );\r
-\r
-\r
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */\r
-\r
-/*\r
- * Marks the current window to have the redisplay performed when possible...\r
- */\r
-void FGAPIENTRY glutPostRedisplay( void )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPostRedisplay" );\r
-    if ( ! fgStructure.CurrentWindow )\r
-       {\r
-      fgError ( " ERROR:  Function <%s> called"\r
-                " with no current window defined.", "glutPostRedisplay" ) ;\r
-       }\r
-\r
-    fgStructure.CurrentWindow->State.Redisplay = GL_TRUE;\r
-}\r
-\r
-/*\r
- * Swaps the buffers for the current window (if any)\r
- */\r
-void FGAPIENTRY glutSwapBuffers( void )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSwapBuffers" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSwapBuffers" );\r
-\r
-    /*\r
-     * "glXSwapBuffers" already performs an implicit call to "glFlush". What\r
-     * about "SwapBuffers"?\r
-     */\r
-    glFlush( );\r
-    if( ! fgStructure.CurrentWindow->Window.DoubleBuffered )\r
-        return;\r
-\r
-    fgPlatformGlutSwapBuffers( &fgDisplay.pDisplay, fgStructure.CurrentWindow );\r
-\r
-    /* GLUT_FPS env var support */\r
-    if( fgState.FPSInterval )\r
-    {\r
-        GLint t = glutGet( GLUT_ELAPSED_TIME );\r
-        fgState.SwapCount++;\r
-        if( fgState.SwapTime == 0 )\r
-            fgState.SwapTime = t;\r
-        else if( t - fgState.SwapTime > fgState.FPSInterval )\r
-        {\r
-            float time = 0.001f * ( t - fgState.SwapTime );\r
-            float fps = ( float )fgState.SwapCount / time;\r
-            fprintf( stderr,\r
-                     "freeglut: %d frames in %.2f seconds = %.2f FPS\n",\r
-                     fgState.SwapCount, time, fps );\r
-            fgState.SwapTime = t;\r
-            fgState.SwapCount = 0;\r
-        }\r
-    }\r
-}\r
-\r
-/*\r
- * Mark appropriate window to be displayed\r
- */\r
-void FGAPIENTRY glutPostWindowRedisplay( int windowID )\r
-{\r
-    SFG_Window* window;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPostWindowRedisplay" );\r
-    window = fgWindowByID( windowID );\r
-    freeglut_return_if_fail( window );\r
-    window->State.Redisplay = GL_TRUE;\r
-}\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_display.c
+ *
+ * Display message posting, context buffer swapping.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Fri Dec 3 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+
+/* Function prototypes */
+extern void fgPlatformGlutSwapBuffers( SFG_PlatformDisplay *pDisplayPtr, SFG_Window* CurrentWindow );
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Marks the current window to have the redisplay performed when possible...
+ */
+void FGAPIENTRY glutPostRedisplay( void )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPostRedisplay" );
+    if ( ! fgStructure.CurrentWindow )
+       {
+      fgError ( " ERROR:  Function <%s> called"
+                " with no current window defined.", "glutPostRedisplay" ) ;
+       }
+
+    fgStructure.CurrentWindow->State.Redisplay = GL_TRUE;
+}
+
+/*
+ * Swaps the buffers for the current window (if any)
+ */
+void FGAPIENTRY glutSwapBuffers( void )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSwapBuffers" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSwapBuffers" );
+
+    /*
+     * "glXSwapBuffers" already performs an implicit call to "glFlush". What
+     * about "SwapBuffers"?
+     */
+    glFlush( );
+    if( ! fgStructure.CurrentWindow->Window.DoubleBuffered )
+        return;
+
+    fgPlatformGlutSwapBuffers( &fgDisplay.pDisplay, fgStructure.CurrentWindow );
+
+    /* GLUT_FPS env var support */
+    if( fgState.FPSInterval )
+    {
+        GLint t = glutGet( GLUT_ELAPSED_TIME );
+        fgState.SwapCount++;
+        if( fgState.SwapTime == 0 )
+            fgState.SwapTime = t;
+        else if( t - fgState.SwapTime > fgState.FPSInterval )
+        {
+            float time = 0.001f * ( t - fgState.SwapTime );
+            float fps = ( float )fgState.SwapCount / time;
+            fprintf( stderr,
+                     "freeglut: %d frames in %.2f seconds = %.2f FPS\n",
+                     fgState.SwapCount, time, fps );
+            fgState.SwapTime = t;
+            fgState.SwapCount = 0;
+        }
+    }
+}
+
+/*
+ * Mark appropriate window to be displayed
+ */
+void FGAPIENTRY glutPostWindowRedisplay( int windowID )
+{
+    SFG_Window* window;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPostWindowRedisplay" );
+    window = fgWindowByID( windowID );
+    freeglut_return_if_fail( window );
+    window->State.Redisplay = GL_TRUE;
+}
+
+/*** END OF FILE ***/
index 3c3c127..f7b4f2e 100644 (file)
-/*\r
- * freeglut_ext.c\r
- *\r
- * Functions related to OpenGL extensions.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Thu Dec 9 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#define GLX_GLXEXT_PROTOTYPES\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-extern SFG_Proc fgPlatformGetProcAddress( const char *procName );\r
-extern GLUTproc fgPlatformGetGLUTProcAddress( const char *procName );\r
-\r
-static GLUTproc fghGetGLUTProcAddress( const char* procName )\r
-{\r
-    /* optimization: quick initial check */\r
-    if( strncmp( procName, "glut", 4 ) != 0 )\r
-        return NULL;\r
-\r
-#define CHECK_NAME(x) if( strcmp( procName, #x ) == 0) return (GLUTproc)x;\r
-    CHECK_NAME(glutInit);\r
-    CHECK_NAME(glutInitDisplayMode);\r
-    CHECK_NAME(glutInitDisplayString);\r
-    CHECK_NAME(glutInitWindowPosition);\r
-    CHECK_NAME(glutInitWindowSize);\r
-    CHECK_NAME(glutMainLoop);\r
-    CHECK_NAME(glutExit);\r
-    CHECK_NAME(glutCreateWindow);\r
-    CHECK_NAME(glutCreateSubWindow);\r
-    CHECK_NAME(glutDestroyWindow);\r
-    CHECK_NAME(glutPostRedisplay);\r
-    CHECK_NAME(glutPostWindowRedisplay);\r
-    CHECK_NAME(glutSwapBuffers);\r
-    CHECK_NAME(glutGetWindow);\r
-    CHECK_NAME(glutSetWindow);\r
-    CHECK_NAME(glutSetWindowTitle);\r
-    CHECK_NAME(glutSetIconTitle);\r
-    CHECK_NAME(glutPositionWindow);\r
-    CHECK_NAME(glutReshapeWindow);\r
-    CHECK_NAME(glutPopWindow);\r
-    CHECK_NAME(glutPushWindow);\r
-    CHECK_NAME(glutIconifyWindow);\r
-    CHECK_NAME(glutShowWindow);\r
-    CHECK_NAME(glutHideWindow);\r
-    CHECK_NAME(glutFullScreen);\r
-    CHECK_NAME(glutSetCursor);\r
-    CHECK_NAME(glutWarpPointer);\r
-    CHECK_NAME(glutEstablishOverlay);\r
-    CHECK_NAME(glutRemoveOverlay);\r
-    CHECK_NAME(glutUseLayer);\r
-    CHECK_NAME(glutPostOverlayRedisplay);\r
-    CHECK_NAME(glutPostWindowOverlayRedisplay);\r
-    CHECK_NAME(glutShowOverlay);\r
-    CHECK_NAME(glutHideOverlay);\r
-    CHECK_NAME(glutCreateMenu);\r
-    CHECK_NAME(glutDestroyMenu);\r
-    CHECK_NAME(glutGetMenu);\r
-    CHECK_NAME(glutSetMenu);\r
-    CHECK_NAME(glutAddMenuEntry);\r
-    CHECK_NAME(glutAddSubMenu);\r
-    CHECK_NAME(glutChangeToMenuEntry);\r
-    CHECK_NAME(glutChangeToSubMenu);\r
-    CHECK_NAME(glutRemoveMenuItem);\r
-    CHECK_NAME(glutAttachMenu);\r
-    CHECK_NAME(glutDetachMenu);\r
-    CHECK_NAME(glutDisplayFunc);\r
-    CHECK_NAME(glutReshapeFunc);\r
-    CHECK_NAME(glutKeyboardFunc);\r
-    CHECK_NAME(glutMouseFunc);\r
-    CHECK_NAME(glutMultiEntryFunc);\r
-    CHECK_NAME(glutMultiMotionFunc);\r
-    CHECK_NAME(glutMultiButtonFunc);\r
-    CHECK_NAME(glutMultiPassiveFunc);\r
-    CHECK_NAME(glutMotionFunc);\r
-    CHECK_NAME(glutPassiveMotionFunc);\r
-    CHECK_NAME(glutEntryFunc);\r
-    CHECK_NAME(glutVisibilityFunc);\r
-    CHECK_NAME(glutIdleFunc);\r
-    CHECK_NAME(glutTimerFunc);\r
-    CHECK_NAME(glutMenuStateFunc);\r
-    CHECK_NAME(glutSpecialFunc);\r
-    CHECK_NAME(glutSpaceballMotionFunc);\r
-    CHECK_NAME(glutSpaceballRotateFunc);\r
-    CHECK_NAME(glutSpaceballButtonFunc);\r
-    CHECK_NAME(glutButtonBoxFunc);\r
-    CHECK_NAME(glutDialsFunc);\r
-    CHECK_NAME(glutTabletMotionFunc);\r
-    CHECK_NAME(glutTabletButtonFunc);\r
-    CHECK_NAME(glutMenuStatusFunc);\r
-    CHECK_NAME(glutOverlayDisplayFunc);\r
-    CHECK_NAME(glutWindowStatusFunc);\r
-    CHECK_NAME(glutKeyboardUpFunc);\r
-    CHECK_NAME(glutSpecialUpFunc);\r
-    CHECK_NAME(glutSetColor);\r
-    CHECK_NAME(glutGetColor);\r
-    CHECK_NAME(glutCopyColormap);\r
-    CHECK_NAME(glutGet);\r
-    CHECK_NAME(glutDeviceGet);\r
-    CHECK_NAME(glutExtensionSupported);\r
-    CHECK_NAME(glutGetModifiers);\r
-    CHECK_NAME(glutLayerGet);\r
-    CHECK_NAME(glutBitmapCharacter);\r
-    CHECK_NAME(glutBitmapWidth);\r
-    CHECK_NAME(glutStrokeCharacter);\r
-    CHECK_NAME(glutStrokeWidth);\r
-    CHECK_NAME(glutBitmapLength);\r
-    CHECK_NAME(glutStrokeLength);\r
-    CHECK_NAME(glutWireSphere);\r
-    CHECK_NAME(glutSolidSphere);\r
-    CHECK_NAME(glutWireCone);\r
-    CHECK_NAME(glutSolidCone);\r
-    CHECK_NAME(glutWireCube);\r
-    CHECK_NAME(glutSolidCube);\r
-    CHECK_NAME(glutWireTorus);\r
-    CHECK_NAME(glutSolidTorus);\r
-    CHECK_NAME(glutWireDodecahedron);\r
-    CHECK_NAME(glutSolidDodecahedron);\r
-    CHECK_NAME(glutWireTeapot);\r
-    CHECK_NAME(glutSolidTeapot);\r
-    CHECK_NAME(glutWireOctahedron);\r
-    CHECK_NAME(glutSolidOctahedron);\r
-    CHECK_NAME(glutWireTetrahedron);\r
-    CHECK_NAME(glutSolidTetrahedron);\r
-    CHECK_NAME(glutWireIcosahedron);\r
-    CHECK_NAME(glutSolidIcosahedron);\r
-    CHECK_NAME(glutVideoResizeGet);\r
-    CHECK_NAME(glutSetupVideoResizing);\r
-    CHECK_NAME(glutStopVideoResizing);\r
-    CHECK_NAME(glutVideoResize);\r
-    CHECK_NAME(glutVideoPan);\r
-    CHECK_NAME(glutReportErrors);\r
-    CHECK_NAME(glutIgnoreKeyRepeat);\r
-    CHECK_NAME(glutSetKeyRepeat);\r
-\r
-    /* freeglut extensions */\r
-    CHECK_NAME(glutMainLoopEvent);\r
-    CHECK_NAME(glutLeaveMainLoop);\r
-    CHECK_NAME(glutCloseFunc);\r
-    CHECK_NAME(glutWMCloseFunc);\r
-    CHECK_NAME(glutMenuDestroyFunc);\r
-    CHECK_NAME(glutFullScreenToggle);\r
-    CHECK_NAME(glutLeaveFullScreen);\r
-    CHECK_NAME(glutSetOption);\r
-    CHECK_NAME(glutGetModeValues);\r
-    CHECK_NAME(glutSetWindowData);\r
-    CHECK_NAME(glutGetWindowData);\r
-    CHECK_NAME(glutSetMenuData);\r
-    CHECK_NAME(glutGetMenuData);\r
-    CHECK_NAME(glutBitmapHeight);\r
-    CHECK_NAME(glutStrokeHeight);\r
-    CHECK_NAME(glutBitmapString);\r
-    CHECK_NAME(glutStrokeString);\r
-    CHECK_NAME(glutWireRhombicDodecahedron);\r
-    CHECK_NAME(glutSolidRhombicDodecahedron);\r
-    CHECK_NAME(glutWireSierpinskiSponge);\r
-    CHECK_NAME(glutSolidSierpinskiSponge);\r
-    CHECK_NAME(glutWireCylinder);\r
-    CHECK_NAME(glutSolidCylinder);\r
-    CHECK_NAME(glutGetProcAddress);\r
-    CHECK_NAME(glutMouseWheelFunc);\r
-    CHECK_NAME(glutJoystickGetNumAxes);\r
-    CHECK_NAME(glutJoystickGetNumButtons);\r
-    CHECK_NAME(glutJoystickNotWorking);\r
-    CHECK_NAME(glutJoystickGetDeadBand);\r
-    CHECK_NAME(glutJoystickSetDeadBand);\r
-    CHECK_NAME(glutJoystickGetSaturation);\r
-    CHECK_NAME(glutJoystickSetSaturation);\r
-    CHECK_NAME(glutJoystickSetMinRange);\r
-    CHECK_NAME(glutJoystickSetMaxRange);\r
-    CHECK_NAME(glutJoystickSetCenter);\r
-    CHECK_NAME(glutJoystickGetMinRange);\r
-    CHECK_NAME(glutJoystickGetMaxRange);\r
-    CHECK_NAME(glutJoystickGetCenter);\r
-    CHECK_NAME(glutInitContextVersion);\r
-    CHECK_NAME(glutInitContextFlags);\r
-    CHECK_NAME(glutInitContextProfile);\r
-    CHECK_NAME(glutInitErrorFunc);\r
-    CHECK_NAME(glutInitWarningFunc);\r
-#undef CHECK_NAME\r
-\r
-    return NULL;\r
-}\r
-\r
-\r
-\r
-GLUTproc FGAPIENTRY\r
-glutGetProcAddress( const char *procName )\r
-{\r
-    GLUTproc p;\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetProcAddress" );\r
-\r
-    /* Try GLUT functions first, then core GL functions */\r
-    p = fghGetGLUTProcAddress( procName );\r
-\r
-       /* Some GLUT functions are platform-specific: */\r
-       if ( !p )\r
-      p = fgPlatformGetGLUTProcAddress( procName );\r
-\r
-    return ( p != NULL ) ? p : fgPlatformGetProcAddress( procName );\r
-}\r
+/*
+ * freeglut_ext.c
+ *
+ * Functions related to OpenGL extensions.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Thu Dec 9 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#define GLX_GLXEXT_PROTOTYPES
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+extern SFG_Proc fgPlatformGetProcAddress( const char *procName );
+extern GLUTproc fgPlatformGetGLUTProcAddress( const char *procName );
+
+static GLUTproc fghGetGLUTProcAddress( const char* procName )
+{
+    /* optimization: quick initial check */
+    if( strncmp( procName, "glut", 4 ) != 0 )
+        return NULL;
+
+#define CHECK_NAME(x) if( strcmp( procName, #x ) == 0) return (GLUTproc)x;
+    CHECK_NAME(glutInit);
+    CHECK_NAME(glutInitDisplayMode);
+    CHECK_NAME(glutInitDisplayString);
+    CHECK_NAME(glutInitWindowPosition);
+    CHECK_NAME(glutInitWindowSize);
+    CHECK_NAME(glutMainLoop);
+    CHECK_NAME(glutExit);
+    CHECK_NAME(glutCreateWindow);
+    CHECK_NAME(glutCreateSubWindow);
+    CHECK_NAME(glutDestroyWindow);
+    CHECK_NAME(glutPostRedisplay);
+    CHECK_NAME(glutPostWindowRedisplay);
+    CHECK_NAME(glutSwapBuffers);
+    CHECK_NAME(glutGetWindow);
+    CHECK_NAME(glutSetWindow);
+    CHECK_NAME(glutSetWindowTitle);
+    CHECK_NAME(glutSetIconTitle);
+    CHECK_NAME(glutPositionWindow);
+    CHECK_NAME(glutReshapeWindow);
+    CHECK_NAME(glutPopWindow);
+    CHECK_NAME(glutPushWindow);
+    CHECK_NAME(glutIconifyWindow);
+    CHECK_NAME(glutShowWindow);
+    CHECK_NAME(glutHideWindow);
+    CHECK_NAME(glutFullScreen);
+    CHECK_NAME(glutSetCursor);
+    CHECK_NAME(glutWarpPointer);
+    CHECK_NAME(glutEstablishOverlay);
+    CHECK_NAME(glutRemoveOverlay);
+    CHECK_NAME(glutUseLayer);
+    CHECK_NAME(glutPostOverlayRedisplay);
+    CHECK_NAME(glutPostWindowOverlayRedisplay);
+    CHECK_NAME(glutShowOverlay);
+    CHECK_NAME(glutHideOverlay);
+    CHECK_NAME(glutCreateMenu);
+    CHECK_NAME(glutDestroyMenu);
+    CHECK_NAME(glutGetMenu);
+    CHECK_NAME(glutSetMenu);
+    CHECK_NAME(glutAddMenuEntry);
+    CHECK_NAME(glutAddSubMenu);
+    CHECK_NAME(glutChangeToMenuEntry);
+    CHECK_NAME(glutChangeToSubMenu);
+    CHECK_NAME(glutRemoveMenuItem);
+    CHECK_NAME(glutAttachMenu);
+    CHECK_NAME(glutDetachMenu);
+    CHECK_NAME(glutDisplayFunc);
+    CHECK_NAME(glutReshapeFunc);
+    CHECK_NAME(glutKeyboardFunc);
+    CHECK_NAME(glutMouseFunc);
+    CHECK_NAME(glutMultiEntryFunc);
+    CHECK_NAME(glutMultiMotionFunc);
+    CHECK_NAME(glutMultiButtonFunc);
+    CHECK_NAME(glutMultiPassiveFunc);
+    CHECK_NAME(glutMotionFunc);
+    CHECK_NAME(glutPassiveMotionFunc);
+    CHECK_NAME(glutEntryFunc);
+    CHECK_NAME(glutVisibilityFunc);
+    CHECK_NAME(glutIdleFunc);
+    CHECK_NAME(glutTimerFunc);
+    CHECK_NAME(glutMenuStateFunc);
+    CHECK_NAME(glutSpecialFunc);
+    CHECK_NAME(glutSpaceballMotionFunc);
+    CHECK_NAME(glutSpaceballRotateFunc);
+    CHECK_NAME(glutSpaceballButtonFunc);
+    CHECK_NAME(glutButtonBoxFunc);
+    CHECK_NAME(glutDialsFunc);
+    CHECK_NAME(glutTabletMotionFunc);
+    CHECK_NAME(glutTabletButtonFunc);
+    CHECK_NAME(glutMenuStatusFunc);
+    CHECK_NAME(glutOverlayDisplayFunc);
+    CHECK_NAME(glutWindowStatusFunc);
+    CHECK_NAME(glutKeyboardUpFunc);
+    CHECK_NAME(glutSpecialUpFunc);
+    CHECK_NAME(glutSetColor);
+    CHECK_NAME(glutGetColor);
+    CHECK_NAME(glutCopyColormap);
+    CHECK_NAME(glutGet);
+    CHECK_NAME(glutDeviceGet);
+    CHECK_NAME(glutExtensionSupported);
+    CHECK_NAME(glutGetModifiers);
+    CHECK_NAME(glutLayerGet);
+    CHECK_NAME(glutBitmapCharacter);
+    CHECK_NAME(glutBitmapWidth);
+    CHECK_NAME(glutStrokeCharacter);
+    CHECK_NAME(glutStrokeWidth);
+    CHECK_NAME(glutBitmapLength);
+    CHECK_NAME(glutStrokeLength);
+    CHECK_NAME(glutWireSphere);
+    CHECK_NAME(glutSolidSphere);
+    CHECK_NAME(glutWireCone);
+    CHECK_NAME(glutSolidCone);
+    CHECK_NAME(glutWireCube);
+    CHECK_NAME(glutSolidCube);
+    CHECK_NAME(glutWireTorus);
+    CHECK_NAME(glutSolidTorus);
+    CHECK_NAME(glutWireDodecahedron);
+    CHECK_NAME(glutSolidDodecahedron);
+    CHECK_NAME(glutWireTeapot);
+    CHECK_NAME(glutSolidTeapot);
+    CHECK_NAME(glutWireOctahedron);
+    CHECK_NAME(glutSolidOctahedron);
+    CHECK_NAME(glutWireTetrahedron);
+    CHECK_NAME(glutSolidTetrahedron);
+    CHECK_NAME(glutWireIcosahedron);
+    CHECK_NAME(glutSolidIcosahedron);
+    CHECK_NAME(glutVideoResizeGet);
+    CHECK_NAME(glutSetupVideoResizing);
+    CHECK_NAME(glutStopVideoResizing);
+    CHECK_NAME(glutVideoResize);
+    CHECK_NAME(glutVideoPan);
+    CHECK_NAME(glutReportErrors);
+    CHECK_NAME(glutIgnoreKeyRepeat);
+    CHECK_NAME(glutSetKeyRepeat);
+
+    /* freeglut extensions */
+    CHECK_NAME(glutMainLoopEvent);
+    CHECK_NAME(glutLeaveMainLoop);
+    CHECK_NAME(glutCloseFunc);
+    CHECK_NAME(glutWMCloseFunc);
+    CHECK_NAME(glutMenuDestroyFunc);
+    CHECK_NAME(glutFullScreenToggle);
+    CHECK_NAME(glutLeaveFullScreen);
+    CHECK_NAME(glutSetOption);
+    CHECK_NAME(glutGetModeValues);
+    CHECK_NAME(glutSetWindowData);
+    CHECK_NAME(glutGetWindowData);
+    CHECK_NAME(glutSetMenuData);
+    CHECK_NAME(glutGetMenuData);
+    CHECK_NAME(glutBitmapHeight);
+    CHECK_NAME(glutStrokeHeight);
+    CHECK_NAME(glutBitmapString);
+    CHECK_NAME(glutStrokeString);
+    CHECK_NAME(glutWireRhombicDodecahedron);
+    CHECK_NAME(glutSolidRhombicDodecahedron);
+    CHECK_NAME(glutWireSierpinskiSponge);
+    CHECK_NAME(glutSolidSierpinskiSponge);
+    CHECK_NAME(glutWireCylinder);
+    CHECK_NAME(glutSolidCylinder);
+    CHECK_NAME(glutGetProcAddress);
+    CHECK_NAME(glutMouseWheelFunc);
+    CHECK_NAME(glutJoystickGetNumAxes);
+    CHECK_NAME(glutJoystickGetNumButtons);
+    CHECK_NAME(glutJoystickNotWorking);
+    CHECK_NAME(glutJoystickGetDeadBand);
+    CHECK_NAME(glutJoystickSetDeadBand);
+    CHECK_NAME(glutJoystickGetSaturation);
+    CHECK_NAME(glutJoystickSetSaturation);
+    CHECK_NAME(glutJoystickSetMinRange);
+    CHECK_NAME(glutJoystickSetMaxRange);
+    CHECK_NAME(glutJoystickSetCenter);
+    CHECK_NAME(glutJoystickGetMinRange);
+    CHECK_NAME(glutJoystickGetMaxRange);
+    CHECK_NAME(glutJoystickGetCenter);
+    CHECK_NAME(glutInitContextVersion);
+    CHECK_NAME(glutInitContextFlags);
+    CHECK_NAME(glutInitContextProfile);
+    CHECK_NAME(glutInitErrorFunc);
+    CHECK_NAME(glutInitWarningFunc);
+#undef CHECK_NAME
+
+    return NULL;
+}
+
+
+
+GLUTproc FGAPIENTRY
+glutGetProcAddress( const char *procName )
+{
+    GLUTproc p;
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetProcAddress" );
+
+    /* Try GLUT functions first, then core GL functions */
+    p = fghGetGLUTProcAddress( procName );
+
+       /* Some GLUT functions are platform-specific: */
+       if ( !p )
+      p = fgPlatformGetGLUTProcAddress( procName );
+
+    return ( p != NULL ) ? p : fgPlatformGetProcAddress( procName );
+}
index 576a724..e956d5b 100644 (file)
-/*\r
- * freeglut_font.c\r
- *\r
- * Bitmap and stroke fonts displaying.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Thu Dec 16 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-/*\r
- * TODO BEFORE THE STABLE RELEASE:\r
- *\r
- *  Test things out ...\r
- */\r
-\r
-/* -- IMPORT DECLARATIONS -------------------------------------------------- */\r
-\r
-/*\r
- * These are the font faces defined in freeglut_font_data.c file:\r
- */\r
-extern SFG_Font fgFontFixed8x13;\r
-extern SFG_Font fgFontFixed9x15;\r
-extern SFG_Font fgFontHelvetica10;\r
-extern SFG_Font fgFontHelvetica12;\r
-extern SFG_Font fgFontHelvetica18;\r
-extern SFG_Font fgFontTimesRoman10;\r
-extern SFG_Font fgFontTimesRoman24;\r
-extern SFG_StrokeFont fgStrokeRoman;\r
-extern SFG_StrokeFont fgStrokeMonoRoman;\r
-\r
-\r
-/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */\r
-\r
-/*\r
- * Matches a font ID with a SFG_Font structure pointer.\r
- * This was changed to match the GLUT header style.\r
- */\r
-static SFG_Font* fghFontByID( void* font )\r
-{\r
-    if( font == GLUT_BITMAP_8_BY_13        )\r
-        return &fgFontFixed8x13;\r
-    if( font == GLUT_BITMAP_9_BY_15        )\r
-        return &fgFontFixed9x15;\r
-    if( font == GLUT_BITMAP_HELVETICA_10   )\r
-        return &fgFontHelvetica10;\r
-    if( font == GLUT_BITMAP_HELVETICA_12   )\r
-        return &fgFontHelvetica12;\r
-    if( font == GLUT_BITMAP_HELVETICA_18   )\r
-        return &fgFontHelvetica18;\r
-    if( font == GLUT_BITMAP_TIMES_ROMAN_10 )\r
-        return &fgFontTimesRoman10;\r
-    if( font == GLUT_BITMAP_TIMES_ROMAN_24 )\r
-        return &fgFontTimesRoman24;\r
-\r
-    fgWarning( "font 0x%08x not found", font );\r
-    return 0;\r
-}\r
-\r
-/*\r
- * Matches a font ID with a SFG_StrokeFont structure pointer.\r
- * This was changed to match the GLUT header style.\r
- */\r
-static SFG_StrokeFont* fghStrokeByID( void* font )\r
-{\r
-    if( font == GLUT_STROKE_ROMAN      )\r
-        return &fgStrokeRoman;\r
-    if( font == GLUT_STROKE_MONO_ROMAN )\r
-        return &fgStrokeMonoRoman;\r
-\r
-    fgWarning( "stroke font 0x%08x not found", font );\r
-    return 0;\r
-}\r
-\r
-\r
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */\r
-\r
-/*\r
- * Draw a bitmap character\r
- */\r
-void FGAPIENTRY glutBitmapCharacter( void* fontID, int character )\r
-{\r
-    const GLubyte* face;\r
-    SFG_Font* font;\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapCharacter" );\r
-    font = fghFontByID( fontID );\r
-    freeglut_return_if_fail( ( character >= 1 )&&( character < 256 ) );\r
-    freeglut_return_if_fail( font );\r
-\r
-    /*\r
-     * Find the character we want to draw (???)\r
-     */\r
-    face = font->Characters[ character ];\r
-\r
-    glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT );\r
-    glPixelStorei( GL_UNPACK_SWAP_BYTES,  GL_FALSE );\r
-    glPixelStorei( GL_UNPACK_LSB_FIRST,   GL_FALSE );\r
-    glPixelStorei( GL_UNPACK_ROW_LENGTH,  0        );\r
-    glPixelStorei( GL_UNPACK_SKIP_ROWS,   0        );\r
-    glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0        );\r
-    glPixelStorei( GL_UNPACK_ALIGNMENT,   1        );\r
-    glBitmap(\r
-        face[ 0 ], font->Height,      /* The bitmap's width and height  */\r
-        font->xorig, font->yorig,     /* The origin in the font glyph   */\r
-        ( float )( face[ 0 ] ), 0.0,  /* The raster advance -- inc. x,y */\r
-        ( face + 1 )                  /* The packed bitmap data...      */\r
-    );\r
-    glPopClientAttrib( );\r
-}\r
-\r
-void FGAPIENTRY glutBitmapString( void* fontID, const unsigned char *string )\r
-{\r
-    unsigned char c;\r
-    float x = 0.0f ;\r
-    SFG_Font* font;\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapString" );\r
-    font = fghFontByID( fontID );\r
-    freeglut_return_if_fail( font );\r
-    if ( !string || ! *string )\r
-        return;\r
-\r
-    glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT );\r
-    glPixelStorei( GL_UNPACK_SWAP_BYTES,  GL_FALSE );\r
-    glPixelStorei( GL_UNPACK_LSB_FIRST,   GL_FALSE );\r
-    glPixelStorei( GL_UNPACK_ROW_LENGTH,  0        );\r
-    glPixelStorei( GL_UNPACK_SKIP_ROWS,   0        );\r
-    glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0        );\r
-    glPixelStorei( GL_UNPACK_ALIGNMENT,   1        );\r
-\r
-    /*\r
-     * Step through the string, drawing each character.\r
-     * A newline will simply translate the next character's insertion\r
-     * point back to the start of the line and down one line.\r
-     */\r
-    while( ( c = *string++) )\r
-        if( c == '\n' )\r
-        {\r
-            glBitmap ( 0, 0, 0, 0, -x, (float) -font->Height, NULL );\r
-            x = 0.0f;\r
-        }\r
-        else  /* Not an EOL, draw the bitmap character */\r
-        {\r
-            const GLubyte* face = font->Characters[ c ];\r
-\r
-            glBitmap(\r
-                face[ 0 ], font->Height,     /* Bitmap's width and height    */\r
-                font->xorig, font->yorig,    /* The origin in the font glyph */\r
-                ( float )( face[ 0 ] ), 0.0, /* The raster advance; inc. x,y */\r
-                ( face + 1 )                 /* The packed bitmap data...    */\r
-            );\r
-\r
-            x += ( float )( face[ 0 ] );\r
-        }\r
-\r
-    glPopClientAttrib( );\r
-}\r
-\r
-/*\r
- * Returns the width in pixels of a font's character\r
- */\r
-int FGAPIENTRY glutBitmapWidth( void* fontID, int character )\r
-{\r
-    SFG_Font* font;\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapWidth" );\r
-    font = fghFontByID( fontID );\r
-    freeglut_return_val_if_fail( character > 0 && character < 256, 0 );\r
-    freeglut_return_val_if_fail( font, 0 );\r
-    return *( font->Characters[ character ] );\r
-}\r
-\r
-/*\r
- * Return the width of a string drawn using a bitmap font\r
- */\r
-int FGAPIENTRY glutBitmapLength( void* fontID, const unsigned char* string )\r
-{\r
-    unsigned char c;\r
-    int length = 0, this_line_length = 0;\r
-    SFG_Font* font;\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapLength" );\r
-    font = fghFontByID( fontID );\r
-    freeglut_return_val_if_fail( font, 0 );\r
-    if ( !string || ! *string )\r
-        return 0;\r
-\r
-    while( ( c = *string++) )\r
-    {\r
-        if( c != '\n' )/* Not an EOL, increment length of line */\r
-            this_line_length += *( font->Characters[ c ]);\r
-        else  /* EOL; reset the length of this line */\r
-        {\r
-            if( length < this_line_length )\r
-                length = this_line_length;\r
-            this_line_length = 0;\r
-        }\r
-    }\r
-    if ( length < this_line_length )\r
-        length = this_line_length;\r
-\r
-    return length;\r
-}\r
-\r
-/*\r
- * Returns the height of a bitmap font\r
- */\r
-int FGAPIENTRY glutBitmapHeight( void* fontID )\r
-{\r
-    SFG_Font* font;\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapHeight" );\r
-    font = fghFontByID( fontID );\r
-    freeglut_return_val_if_fail( font, 0 );\r
-    return font->Height;\r
-}\r
-\r
-/*\r
- * Draw a stroke character\r
- */\r
-void FGAPIENTRY glutStrokeCharacter( void* fontID, int character )\r
-{\r
-    const SFG_StrokeChar *schar;\r
-    const SFG_StrokeStrip *strip;\r
-    int i, j;\r
-    SFG_StrokeFont* font;\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeCharacter" );\r
-    font = fghStrokeByID( fontID );\r
-    freeglut_return_if_fail( character >= 0 );\r
-    freeglut_return_if_fail( character < font->Quantity );\r
-    freeglut_return_if_fail( font );\r
-\r
-    schar = font->Characters[ character ];\r
-    freeglut_return_if_fail( schar );\r
-    strip = schar->Strips;\r
-\r
-    for( i = 0; i < schar->Number; i++, strip++ )\r
-    {\r
-        glBegin( GL_LINE_STRIP );\r
-        for( j = 0; j < strip->Number; j++ )\r
-            glVertex2f( strip->Vertices[ j ].X, strip->Vertices[ j ].Y );\r
-        glEnd( );\r
-                               glBegin( GL_POINTS );\r
-        for( j = 0; j < strip->Number; j++ )\r
-            glVertex2f( strip->Vertices[ j ].X, strip->Vertices[ j ].Y );\r
-                               glEnd( );\r
-    }\r
-    glTranslatef( schar->Right, 0.0, 0.0 );\r
-}\r
-\r
-void FGAPIENTRY glutStrokeString( void* fontID, const unsigned char *string )\r
-{\r
-    unsigned char c;\r
-    int i, j;\r
-    float length = 0.0;\r
-    SFG_StrokeFont* font;\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeString" );\r
-    font = fghStrokeByID( fontID );\r
-    freeglut_return_if_fail( font );\r
-    if ( !string || ! *string )\r
-        return;\r
-\r
-    /*\r
-     * Step through the string, drawing each character.\r
-     * A newline will simply translate the next character's insertion\r
-     * point back to the start of the line and down one line.\r
-     */\r
-    while( ( c = *string++) )\r
-        if( c < font->Quantity )\r
-        {\r
-            if( c == '\n' )\r
-            {\r
-                glTranslatef ( -length, -( float )( font->Height ), 0.0 );\r
-                length = 0.0;\r
-            }\r
-            else  /* Not an EOL, draw the bitmap character */\r
-            {\r
-                const SFG_StrokeChar *schar = font->Characters[ c ];\r
-                if( schar )\r
-                {\r
-                    const SFG_StrokeStrip *strip = schar->Strips;\r
-\r
-                    for( i = 0; i < schar->Number; i++, strip++ )\r
-                    {\r
-                        glBegin( GL_LINE_STRIP );\r
-                        for( j = 0; j < strip->Number; j++ )\r
-                            glVertex2f( strip->Vertices[ j ].X,\r
-                                        strip->Vertices[ j ].Y);\r
-\r
-                        glEnd( );\r
-                    }\r
-\r
-                    length += schar->Right;\r
-                    glTranslatef( schar->Right, 0.0, 0.0 );\r
-                }\r
-            }\r
-        }\r
-}\r
-\r
-/*\r
- * Return the width in pixels of a stroke character\r
- */\r
-int FGAPIENTRY glutStrokeWidth( void* fontID, int character )\r
-{\r
-    const SFG_StrokeChar *schar;\r
-    SFG_StrokeFont* font;\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeWidth" );\r
-    font = fghStrokeByID( fontID );\r
-    freeglut_return_val_if_fail( ( character >= 0 ) &&\r
-                                 ( character < font->Quantity ),\r
-                                 0\r
-    );\r
-    freeglut_return_val_if_fail( font, 0 );\r
-    schar = font->Characters[ character ];\r
-    freeglut_return_val_if_fail( schar, 0 );\r
-\r
-    return ( int )( schar->Right + 0.5 );\r
-}\r
-\r
-/*\r
- * Return the width of a string drawn using a stroke font\r
- */\r
-int FGAPIENTRY glutStrokeLength( void* fontID, const unsigned char* string )\r
-{\r
-    unsigned char c;\r
-    float length = 0.0;\r
-    float this_line_length = 0.0;\r
-    SFG_StrokeFont* font;\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeLength" );\r
-    font = fghStrokeByID( fontID );\r
-    freeglut_return_val_if_fail( font, 0 );\r
-    if ( !string || ! *string )\r
-        return 0;\r
-\r
-    while( ( c = *string++) )\r
-        if( c < font->Quantity )\r
-        {\r
-            if( c == '\n' ) /* EOL; reset the length of this line */\r
-            {\r
-                if( length < this_line_length )\r
-                    length = this_line_length;\r
-                this_line_length = 0.0;\r
-            }\r
-            else  /* Not an EOL, increment the length of this line */\r
-            {\r
-                const SFG_StrokeChar *schar = font->Characters[ c ];\r
-                if( schar )\r
-                    this_line_length += schar->Right;\r
-            }\r
-        }\r
-    if( length < this_line_length )\r
-        length = this_line_length;\r
-    return( int )( length + 0.5 );\r
-}\r
-\r
-/*\r
- * Returns the height of a stroke font\r
- */\r
-GLfloat FGAPIENTRY glutStrokeHeight( void* fontID )\r
-{\r
-    SFG_StrokeFont* font;\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeHeight" );\r
-    font = fghStrokeByID( fontID );\r
-    freeglut_return_val_if_fail( font, 0.0 );\r
-    return font->Height;\r
-}\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_font.c
+ *
+ * Bitmap and stroke fonts displaying.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Thu Dec 16 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ *
+ *  Test things out ...
+ */
+
+/* -- IMPORT DECLARATIONS -------------------------------------------------- */
+
+/*
+ * These are the font faces defined in freeglut_font_data.c file:
+ */
+extern SFG_Font fgFontFixed8x13;
+extern SFG_Font fgFontFixed9x15;
+extern SFG_Font fgFontHelvetica10;
+extern SFG_Font fgFontHelvetica12;
+extern SFG_Font fgFontHelvetica18;
+extern SFG_Font fgFontTimesRoman10;
+extern SFG_Font fgFontTimesRoman24;
+extern SFG_StrokeFont fgStrokeRoman;
+extern SFG_StrokeFont fgStrokeMonoRoman;
+
+
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
+
+/*
+ * Matches a font ID with a SFG_Font structure pointer.
+ * This was changed to match the GLUT header style.
+ */
+static SFG_Font* fghFontByID( void* font )
+{
+    if( font == GLUT_BITMAP_8_BY_13        )
+        return &fgFontFixed8x13;
+    if( font == GLUT_BITMAP_9_BY_15        )
+        return &fgFontFixed9x15;
+    if( font == GLUT_BITMAP_HELVETICA_10   )
+        return &fgFontHelvetica10;
+    if( font == GLUT_BITMAP_HELVETICA_12   )
+        return &fgFontHelvetica12;
+    if( font == GLUT_BITMAP_HELVETICA_18   )
+        return &fgFontHelvetica18;
+    if( font == GLUT_BITMAP_TIMES_ROMAN_10 )
+        return &fgFontTimesRoman10;
+    if( font == GLUT_BITMAP_TIMES_ROMAN_24 )
+        return &fgFontTimesRoman24;
+
+    fgWarning( "font 0x%08x not found", font );
+    return 0;
+}
+
+/*
+ * Matches a font ID with a SFG_StrokeFont structure pointer.
+ * This was changed to match the GLUT header style.
+ */
+static SFG_StrokeFont* fghStrokeByID( void* font )
+{
+    if( font == GLUT_STROKE_ROMAN      )
+        return &fgStrokeRoman;
+    if( font == GLUT_STROKE_MONO_ROMAN )
+        return &fgStrokeMonoRoman;
+
+    fgWarning( "stroke font 0x%08x not found", font );
+    return 0;
+}
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Draw a bitmap character
+ */
+void FGAPIENTRY glutBitmapCharacter( void* fontID, int character )
+{
+    const GLubyte* face;
+    SFG_Font* font;
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapCharacter" );
+    font = fghFontByID( fontID );
+    freeglut_return_if_fail( ( character >= 1 )&&( character < 256 ) );
+    freeglut_return_if_fail( font );
+
+    /*
+     * Find the character we want to draw (???)
+     */
+    face = font->Characters[ character ];
+
+    glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT );
+    glPixelStorei( GL_UNPACK_SWAP_BYTES,  GL_FALSE );
+    glPixelStorei( GL_UNPACK_LSB_FIRST,   GL_FALSE );
+    glPixelStorei( GL_UNPACK_ROW_LENGTH,  0        );
+    glPixelStorei( GL_UNPACK_SKIP_ROWS,   0        );
+    glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0        );
+    glPixelStorei( GL_UNPACK_ALIGNMENT,   1        );
+    glBitmap(
+        face[ 0 ], font->Height,      /* The bitmap's width and height  */
+        font->xorig, font->yorig,     /* The origin in the font glyph   */
+        ( float )( face[ 0 ] ), 0.0,  /* The raster advance -- inc. x,y */
+        ( face + 1 )                  /* The packed bitmap data...      */
+    );
+    glPopClientAttrib( );
+}
+
+void FGAPIENTRY glutBitmapString( void* fontID, const unsigned char *string )
+{
+    unsigned char c;
+    float x = 0.0f ;
+    SFG_Font* font;
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapString" );
+    font = fghFontByID( fontID );
+    freeglut_return_if_fail( font );
+    if ( !string || ! *string )
+        return;
+
+    glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT );
+    glPixelStorei( GL_UNPACK_SWAP_BYTES,  GL_FALSE );
+    glPixelStorei( GL_UNPACK_LSB_FIRST,   GL_FALSE );
+    glPixelStorei( GL_UNPACK_ROW_LENGTH,  0        );
+    glPixelStorei( GL_UNPACK_SKIP_ROWS,   0        );
+    glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0        );
+    glPixelStorei( GL_UNPACK_ALIGNMENT,   1        );
+
+    /*
+     * Step through the string, drawing each character.
+     * A newline will simply translate the next character's insertion
+     * point back to the start of the line and down one line.
+     */
+    while( ( c = *string++) )
+        if( c == '\n' )
+        {
+            glBitmap ( 0, 0, 0, 0, -x, (float) -font->Height, NULL );
+            x = 0.0f;
+        }
+        else  /* Not an EOL, draw the bitmap character */
+        {
+            const GLubyte* face = font->Characters[ c ];
+
+            glBitmap(
+                face[ 0 ], font->Height,     /* Bitmap's width and height    */
+                font->xorig, font->yorig,    /* The origin in the font glyph */
+                ( float )( face[ 0 ] ), 0.0, /* The raster advance; inc. x,y */
+                ( face + 1 )                 /* The packed bitmap data...    */
+            );
+
+            x += ( float )( face[ 0 ] );
+        }
+
+    glPopClientAttrib( );
+}
+
+/*
+ * Returns the width in pixels of a font's character
+ */
+int FGAPIENTRY glutBitmapWidth( void* fontID, int character )
+{
+    SFG_Font* font;
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapWidth" );
+    font = fghFontByID( fontID );
+    freeglut_return_val_if_fail( character > 0 && character < 256, 0 );
+    freeglut_return_val_if_fail( font, 0 );
+    return *( font->Characters[ character ] );
+}
+
+/*
+ * Return the width of a string drawn using a bitmap font
+ */
+int FGAPIENTRY glutBitmapLength( void* fontID, const unsigned char* string )
+{
+    unsigned char c;
+    int length = 0, this_line_length = 0;
+    SFG_Font* font;
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapLength" );
+    font = fghFontByID( fontID );
+    freeglut_return_val_if_fail( font, 0 );
+    if ( !string || ! *string )
+        return 0;
+
+    while( ( c = *string++) )
+    {
+        if( c != '\n' )/* Not an EOL, increment length of line */
+            this_line_length += *( font->Characters[ c ]);
+        else  /* EOL; reset the length of this line */
+        {
+            if( length < this_line_length )
+                length = this_line_length;
+            this_line_length = 0;
+        }
+    }
+    if ( length < this_line_length )
+        length = this_line_length;
+
+    return length;
+}
+
+/*
+ * Returns the height of a bitmap font
+ */
+int FGAPIENTRY glutBitmapHeight( void* fontID )
+{
+    SFG_Font* font;
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutBitmapHeight" );
+    font = fghFontByID( fontID );
+    freeglut_return_val_if_fail( font, 0 );
+    return font->Height;
+}
+
+/*
+ * Draw a stroke character
+ */
+void FGAPIENTRY glutStrokeCharacter( void* fontID, int character )
+{
+    const SFG_StrokeChar *schar;
+    const SFG_StrokeStrip *strip;
+    int i, j;
+    SFG_StrokeFont* font;
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeCharacter" );
+    font = fghStrokeByID( fontID );
+    freeglut_return_if_fail( character >= 0 );
+    freeglut_return_if_fail( character < font->Quantity );
+    freeglut_return_if_fail( font );
+
+    schar = font->Characters[ character ];
+    freeglut_return_if_fail( schar );
+    strip = schar->Strips;
+
+    for( i = 0; i < schar->Number; i++, strip++ )
+    {
+        glBegin( GL_LINE_STRIP );
+        for( j = 0; j < strip->Number; j++ )
+            glVertex2f( strip->Vertices[ j ].X, strip->Vertices[ j ].Y );
+        glEnd( );
+                               glBegin( GL_POINTS );
+        for( j = 0; j < strip->Number; j++ )
+            glVertex2f( strip->Vertices[ j ].X, strip->Vertices[ j ].Y );
+                               glEnd( );
+    }
+    glTranslatef( schar->Right, 0.0, 0.0 );
+}
+
+void FGAPIENTRY glutStrokeString( void* fontID, const unsigned char *string )
+{
+    unsigned char c;
+    int i, j;
+    float length = 0.0;
+    SFG_StrokeFont* font;
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeString" );
+    font = fghStrokeByID( fontID );
+    freeglut_return_if_fail( font );
+    if ( !string || ! *string )
+        return;
+
+    /*
+     * Step through the string, drawing each character.
+     * A newline will simply translate the next character's insertion
+     * point back to the start of the line and down one line.
+     */
+    while( ( c = *string++) )
+        if( c < font->Quantity )
+        {
+            if( c == '\n' )
+            {
+                glTranslatef ( -length, -( float )( font->Height ), 0.0 );
+                length = 0.0;
+            }
+            else  /* Not an EOL, draw the bitmap character */
+            {
+                const SFG_StrokeChar *schar = font->Characters[ c ];
+                if( schar )
+                {
+                    const SFG_StrokeStrip *strip = schar->Strips;
+
+                    for( i = 0; i < schar->Number; i++, strip++ )
+                    {
+                        glBegin( GL_LINE_STRIP );
+                        for( j = 0; j < strip->Number; j++ )
+                            glVertex2f( strip->Vertices[ j ].X,
+                                        strip->Vertices[ j ].Y);
+
+                        glEnd( );
+                    }
+
+                    length += schar->Right;
+                    glTranslatef( schar->Right, 0.0, 0.0 );
+                }
+            }
+        }
+}
+
+/*
+ * Return the width in pixels of a stroke character
+ */
+int FGAPIENTRY glutStrokeWidth( void* fontID, int character )
+{
+    const SFG_StrokeChar *schar;
+    SFG_StrokeFont* font;
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeWidth" );
+    font = fghStrokeByID( fontID );
+    freeglut_return_val_if_fail( ( character >= 0 ) &&
+                                 ( character < font->Quantity ),
+                                 0
+    );
+    freeglut_return_val_if_fail( font, 0 );
+    schar = font->Characters[ character ];
+    freeglut_return_val_if_fail( schar, 0 );
+
+    return ( int )( schar->Right + 0.5 );
+}
+
+/*
+ * Return the width of a string drawn using a stroke font
+ */
+int FGAPIENTRY glutStrokeLength( void* fontID, const unsigned char* string )
+{
+    unsigned char c;
+    float length = 0.0;
+    float this_line_length = 0.0;
+    SFG_StrokeFont* font;
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeLength" );
+    font = fghStrokeByID( fontID );
+    freeglut_return_val_if_fail( font, 0 );
+    if ( !string || ! *string )
+        return 0;
+
+    while( ( c = *string++) )
+        if( c < font->Quantity )
+        {
+            if( c == '\n' ) /* EOL; reset the length of this line */
+            {
+                if( length < this_line_length )
+                    length = this_line_length;
+                this_line_length = 0.0;
+            }
+            else  /* Not an EOL, increment the length of this line */
+            {
+                const SFG_StrokeChar *schar = font->Characters[ c ];
+                if( schar )
+                    this_line_length += schar->Right;
+            }
+        }
+    if( length < this_line_length )
+        length = this_line_length;
+    return( int )( length + 0.5 );
+}
+
+/*
+ * Returns the height of a stroke font
+ */
+GLfloat FGAPIENTRY glutStrokeHeight( void* fontID )
+{
+    SFG_StrokeFont* font;
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutStrokeHeight" );
+    font = fghStrokeByID( fontID );
+    freeglut_return_val_if_fail( font, 0.0 );
+    return font->Height;
+}
+
+/*** END OF FILE ***/
index ad9455e..35dfc79 100644 (file)
-/*\r
-    \file  og_font_data.c\r
-    \brief Bitmapped font data for OpenGLUT fonts.\r
-*/\r
-\r
-/*\r
- * This file has been automatically generated by the \r
- * genfonts utility.\r
- *\r
- * The legal status of this file is a bit vague.  The font glyphs\r
- * themselves come from XFree86 v4.3.0 (as of this writing), and as\r
- * part of the X server may be subject to the XFree86 copyrights.\r
- * The original freeglut fonts were extracted by a utility written\r
- * by Pawel W. Olszta (see below) and the generated fonts contained\r
- * his copyright exclusively.  Steve Baker asserts that Pawel\r
- * assigned intellectual property rights to Steve Baker.  Steve\r
- * Baker also asserts that fonts cannot be copyrighted.  He has\r
- * neither stripped the copyright from the freeglut fonts nor\r
- * formally retitled anything in his name.  Since that time, the\r
- * OpenGLUT project has branched from freeglut, and has made\r
- * necessary modifications to Pawel's ``genfonts'' utility.\r
- * To that extent, OpenGLUT may have some title to this file.\r
- * What is fairly clear is that the font data is licensed under\r
- * the XFree86 license (which is variously termed ``XFree'' and\r
- * ``MIT'' by the freeglut project).  It is believed that all\r
- * title holders wish this file to be as useful as possible, and\r
- * that either the ``XFree'' or ``MIT'' license works.\r
- *\r
- * Portions copyright (c) 2004, the OpenGLUT project contributors.\r
- * OpenGLUT branched from freeglut in February, 2004.\r
- *\r
- * Copyright (c) 1999-2000 by Pawel W. Olszta\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * \r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Sotware.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-/*\r
- * The following bitmapped fonts are defined in this file:\r
- * \r
- * 1. fgFontFixed8x13\r
- *       -misc-fixed-medium-r-normal--13-120-75-75-C-80-iso8859-1\r
- * 2. fgFontFixed9x15\r
- *       -misc-fixed-medium-r-normal--15-140-75-75-C-90-iso8859-1\r
- * 3. fgFontHelvetica10\r
- *       -adobe-helvetica-medium-r-normal--10-100-75-75-p-56-iso8859-1\r
- * 4. fgFontHelvetica12\r
- *       -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1\r
- * 5. fgFontHelvetica18\r
- *       -adobe-helvetica-medium-r-normal--18-180-75-75-p-98-iso8859-1\r
- * 6. fgFontTimesRoman10\r
- *       -adobe-times-medium-r-normal--10-100-75-75-p-54-iso8859-1\r
- * 7. fgFontTimesRoman24\r
- *       -adobe-times-medium-r-normal--24-240-75-75-p-124-iso8859-1\r
- */\r
-\r
-static const GLubyte Fixed8x13_Character_000[] = {  8,  0,  0,  0,170,  0,130,  0,130,  0,130,  0,170,  0,  0};\r
-static const GLubyte Fixed8x13_Character_001[] = {  8,  0,  0,  0,  0, 16, 56,124,254,124, 56, 16,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_002[] = {  8,  0,170, 85,170, 85,170, 85,170, 85,170, 85,170, 85,170};\r
-static const GLubyte Fixed8x13_Character_003[] = {  8,  0,  0,  0,  4,  4,  4,  4,174,160,224,160,160,  0,  0};\r
-static const GLubyte Fixed8x13_Character_004[] = {  8,  0,  0,  0,  8,  8, 12,  8,142,128,192,128,224,  0,  0};\r
-static const GLubyte Fixed8x13_Character_005[] = {  8,  0,  0,  0, 10, 10, 12, 10,108,128,128,128, 96,  0,  0};\r
-static const GLubyte Fixed8x13_Character_006[] = {  8,  0,  0,  0,  8,  8, 12,  8,238,128,128,128,128,  0,  0};\r
-static const GLubyte Fixed8x13_Character_007[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0, 24, 36, 36, 24,  0,  0};\r
-static const GLubyte Fixed8x13_Character_008[] = {  8,  0,  0,  0,  0,124,  0, 16, 16,124, 16, 16,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_009[] = {  8,  0,  0,  0, 14,  8,  8,  8,168,160,160,160,192,  0,  0};\r
-static const GLubyte Fixed8x13_Character_010[] = {  8,  0,  0,  0,  4,  4,  4,  4, 46, 80, 80,136,136,  0,  0};\r
-static const GLubyte Fixed8x13_Character_011[] = {  8,  0,  0,  0,  0,  0,  0,  0,240, 16, 16, 16, 16, 16, 16};\r
-static const GLubyte Fixed8x13_Character_012[] = {  8,  0, 16, 16, 16, 16, 16, 16,240,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_013[] = {  8,  0, 16, 16, 16, 16, 16, 16, 31,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_014[] = {  8,  0,  0,  0,  0,  0,  0,  0, 31, 16, 16, 16, 16, 16, 16};\r
-static const GLubyte Fixed8x13_Character_015[] = {  8,  0, 16, 16, 16, 16, 16, 16,255, 16, 16, 16, 16, 16, 16};\r
-static const GLubyte Fixed8x13_Character_016[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255};\r
-static const GLubyte Fixed8x13_Character_017[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_018[] = {  8,  0,  0,  0,  0,  0,  0,  0,255,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_019[] = {  8,  0,  0,  0,  0,255,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_020[] = {  8,  0,255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_021[] = {  8,  0, 16, 16, 16, 16, 16, 16, 31, 16, 16, 16, 16, 16, 16};\r
-static const GLubyte Fixed8x13_Character_022[] = {  8,  0, 16, 16, 16, 16, 16, 16,240, 16, 16, 16, 16, 16, 16};\r
-static const GLubyte Fixed8x13_Character_023[] = {  8,  0,  0,  0,  0,  0,  0,  0,255, 16, 16, 16, 16, 16, 16};\r
-static const GLubyte Fixed8x13_Character_024[] = {  8,  0, 16, 16, 16, 16, 16, 16,255,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_025[] = {  8,  0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16};\r
-static const GLubyte Fixed8x13_Character_026[] = {  8,  0,  0,  0,254,  0, 14, 48,192, 48, 14,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_027[] = {  8,  0,  0,  0,254,  0,224, 24,  6, 24,224,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_028[] = {  8,  0,  0,  0, 68, 68, 68, 68, 68,254,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_029[] = {  8,  0,  0,  0, 32, 32,126, 16,  8,126,  4,  4,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_030[] = {  8,  0,  0,  0,220, 98, 32, 32, 32,112, 32, 34, 28,  0,  0};\r
-static const GLubyte Fixed8x13_Character_031[] = {  8,  0,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_032[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_033[] = {  8,  0,  0,  0, 16,  0, 16, 16, 16, 16, 16, 16, 16,  0,  0};\r
-static const GLubyte Fixed8x13_Character_034[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0, 36, 36, 36,  0,  0};\r
-static const GLubyte Fixed8x13_Character_035[] = {  8,  0,  0,  0,  0, 36, 36,126, 36,126, 36, 36,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_036[] = {  8,  0,  0,  0, 16,120, 20, 20, 56, 80, 80, 60, 16,  0,  0};\r
-static const GLubyte Fixed8x13_Character_037[] = {  8,  0,  0,  0, 68, 42, 36, 16,  8,  8, 36, 82, 34,  0,  0};\r
-static const GLubyte Fixed8x13_Character_038[] = {  8,  0,  0,  0, 58, 68, 74, 48, 72, 72, 48,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_039[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0, 64, 48, 56,  0,  0};\r
-static const GLubyte Fixed8x13_Character_040[] = {  8,  0,  0,  0,  4,  8,  8, 16, 16, 16,  8,  8,  4,  0,  0};\r
-static const GLubyte Fixed8x13_Character_041[] = {  8,  0,  0,  0, 32, 16, 16,  8,  8,  8, 16, 16, 32,  0,  0};\r
-static const GLubyte Fixed8x13_Character_042[] = {  8,  0,  0,  0,  0,  0, 36, 24,126, 24, 36,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_043[] = {  8,  0,  0,  0,  0,  0, 16, 16,124, 16, 16,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_044[] = {  8,  0,  0, 64, 48, 56,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_045[] = {  8,  0,  0,  0,  0,  0,  0,  0,126,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_046[] = {  8,  0,  0, 16, 56, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_047[] = {  8,  0,  0,  0,128,128, 64, 32, 16,  8,  4,  2,  2,  0,  0};\r
-static const GLubyte Fixed8x13_Character_048[] = {  8,  0,  0,  0, 24, 36, 66, 66, 66, 66, 66, 36, 24,  0,  0};\r
-static const GLubyte Fixed8x13_Character_049[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 16, 80, 48, 16,  0,  0};\r
-static const GLubyte Fixed8x13_Character_050[] = {  8,  0,  0,  0,126, 64, 32, 24,  4,  2, 66, 66, 60,  0,  0};\r
-static const GLubyte Fixed8x13_Character_051[] = {  8,  0,  0,  0, 60, 66,  2,  2, 28,  8,  4,  2,126,  0,  0};\r
-static const GLubyte Fixed8x13_Character_052[] = {  8,  0,  0,  0,  4,  4,126, 68, 68, 36, 20, 12,  4,  0,  0};\r
-static const GLubyte Fixed8x13_Character_053[] = {  8,  0,  0,  0, 60, 66,  2,  2, 98, 92, 64, 64,126,  0,  0};\r
-static const GLubyte Fixed8x13_Character_054[] = {  8,  0,  0,  0, 60, 66, 66, 98, 92, 64, 64, 32, 28,  0,  0};\r
-static const GLubyte Fixed8x13_Character_055[] = {  8,  0,  0,  0, 32, 32, 16, 16,  8,  8,  4,  2,126,  0,  0};\r
-static const GLubyte Fixed8x13_Character_056[] = {  8,  0,  0,  0, 60, 66, 66, 66, 60, 66, 66, 66, 60,  0,  0};\r
-static const GLubyte Fixed8x13_Character_057[] = {  8,  0,  0,  0, 56,  4,  2,  2, 58, 70, 66, 66, 60,  0,  0};\r
-static const GLubyte Fixed8x13_Character_058[] = {  8,  0,  0, 16, 56, 16,  0,  0, 16, 56, 16,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_059[] = {  8,  0,  0, 64, 48, 56,  0,  0, 16, 56, 16,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_060[] = {  8,  0,  0,  0,  2,  4,  8, 16, 32, 16,  8,  4,  2,  0,  0};\r
-static const GLubyte Fixed8x13_Character_061[] = {  8,  0,  0,  0,  0,  0,126,  0,  0,126,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_062[] = {  8,  0,  0,  0, 64, 32, 16,  8,  4,  8, 16, 32, 64,  0,  0};\r
-static const GLubyte Fixed8x13_Character_063[] = {  8,  0,  0,  0,  8,  0,  8,  8,  4,  2, 66, 66, 60,  0,  0};\r
-static const GLubyte Fixed8x13_Character_064[] = {  8,  0,  0,  0, 60, 64, 74, 86, 82, 78, 66, 66, 60,  0,  0};\r
-static const GLubyte Fixed8x13_Character_065[] = {  8,  0,  0,  0, 66, 66, 66,126, 66, 66, 66, 36, 24,  0,  0};\r
-static const GLubyte Fixed8x13_Character_066[] = {  8,  0,  0,  0,252, 66, 66, 66,124, 66, 66, 66,252,  0,  0};\r
-static const GLubyte Fixed8x13_Character_067[] = {  8,  0,  0,  0, 60, 66, 64, 64, 64, 64, 64, 66, 60,  0,  0};\r
-static const GLubyte Fixed8x13_Character_068[] = {  8,  0,  0,  0,252, 66, 66, 66, 66, 66, 66, 66,252,  0,  0};\r
-static const GLubyte Fixed8x13_Character_069[] = {  8,  0,  0,  0,126, 64, 64, 64,120, 64, 64, 64,126,  0,  0};\r
-static const GLubyte Fixed8x13_Character_070[] = {  8,  0,  0,  0, 64, 64, 64, 64,120, 64, 64, 64,126,  0,  0};\r
-static const GLubyte Fixed8x13_Character_071[] = {  8,  0,  0,  0, 58, 70, 66, 78, 64, 64, 64, 66, 60,  0,  0};\r
-static const GLubyte Fixed8x13_Character_072[] = {  8,  0,  0,  0, 66, 66, 66, 66,126, 66, 66, 66, 66,  0,  0};\r
-static const GLubyte Fixed8x13_Character_073[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 16, 16, 16,124,  0,  0};\r
-static const GLubyte Fixed8x13_Character_074[] = {  8,  0,  0,  0, 56, 68,  4,  4,  4,  4,  4,  4, 31,  0,  0};\r
-static const GLubyte Fixed8x13_Character_075[] = {  8,  0,  0,  0, 66, 68, 72, 80, 96, 80, 72, 68, 66,  0,  0};\r
-static const GLubyte Fixed8x13_Character_076[] = {  8,  0,  0,  0,126, 64, 64, 64, 64, 64, 64, 64, 64,  0,  0};\r
-static const GLubyte Fixed8x13_Character_077[] = {  8,  0,  0,  0,130,130,130,146,146,170,198,130,130,  0,  0};\r
-static const GLubyte Fixed8x13_Character_078[] = {  8,  0,  0,  0, 66, 66, 66, 70, 74, 82, 98, 66, 66,  0,  0};\r
-static const GLubyte Fixed8x13_Character_079[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66, 60,  0,  0};\r
-static const GLubyte Fixed8x13_Character_080[] = {  8,  0,  0,  0, 64, 64, 64, 64,124, 66, 66, 66,124,  0,  0};\r
-static const GLubyte Fixed8x13_Character_081[] = {  8,  0,  0,  2, 60, 74, 82, 66, 66, 66, 66, 66, 60,  0,  0};\r
-static const GLubyte Fixed8x13_Character_082[] = {  8,  0,  0,  0, 66, 68, 72, 80,124, 66, 66, 66,124,  0,  0};\r
-static const GLubyte Fixed8x13_Character_083[] = {  8,  0,  0,  0, 60, 66,  2,  2, 60, 64, 64, 66, 60,  0,  0};\r
-static const GLubyte Fixed8x13_Character_084[] = {  8,  0,  0,  0, 16, 16, 16, 16, 16, 16, 16, 16,254,  0,  0};\r
-static const GLubyte Fixed8x13_Character_085[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66, 66,  0,  0};\r
-static const GLubyte Fixed8x13_Character_086[] = {  8,  0,  0,  0, 16, 40, 40, 40, 68, 68, 68,130,130,  0,  0};\r
-static const GLubyte Fixed8x13_Character_087[] = {  8,  0,  0,  0, 68,170,146,146,146,130,130,130,130,  0,  0};\r
-static const GLubyte Fixed8x13_Character_088[] = {  8,  0,  0,  0,130,130, 68, 40, 16, 40, 68,130,130,  0,  0};\r
-static const GLubyte Fixed8x13_Character_089[] = {  8,  0,  0,  0, 16, 16, 16, 16, 16, 40, 68,130,130,  0,  0};\r
-static const GLubyte Fixed8x13_Character_090[] = {  8,  0,  0,  0,126, 64, 64, 32, 16,  8,  4,  2,126,  0,  0};\r
-static const GLubyte Fixed8x13_Character_091[] = {  8,  0,  0,  0, 60, 32, 32, 32, 32, 32, 32, 32, 60,  0,  0};\r
-static const GLubyte Fixed8x13_Character_092[] = {  8,  0,  0,  0,  2,  2,  4,  8, 16, 32, 64,128,128,  0,  0};\r
-static const GLubyte Fixed8x13_Character_093[] = {  8,  0,  0,  0,120,  8,  8,  8,  8,  8,  8,  8,120,  0,  0};\r
-static const GLubyte Fixed8x13_Character_094[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0, 68, 40, 16,  0,  0};\r
-static const GLubyte Fixed8x13_Character_095[] = {  8,  0,  0,254,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_096[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4, 24, 56,  0,  0};\r
-static const GLubyte Fixed8x13_Character_097[] = {  8,  0,  0,  0, 58, 70, 66, 62,  2, 60,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_098[] = {  8,  0,  0,  0, 92, 98, 66, 66, 98, 92, 64, 64, 64,  0,  0};\r
-static const GLubyte Fixed8x13_Character_099[] = {  8,  0,  0,  0, 60, 66, 64, 64, 66, 60,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_100[] = {  8,  0,  0,  0, 58, 70, 66, 66, 70, 58,  2,  2,  2,  0,  0};\r
-static const GLubyte Fixed8x13_Character_101[] = {  8,  0,  0,  0, 60, 66, 64,126, 66, 60,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_102[] = {  8,  0,  0,  0, 32, 32, 32, 32,124, 32, 32, 34, 28,  0,  0};\r
-static const GLubyte Fixed8x13_Character_103[] = {  8,  0, 60, 66, 60, 64, 56, 68, 68, 58,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_104[] = {  8,  0,  0,  0, 66, 66, 66, 66, 98, 92, 64, 64, 64,  0,  0};\r
-static const GLubyte Fixed8x13_Character_105[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 48,  0, 16,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_106[] = {  8,  0, 56, 68, 68,  4,  4,  4,  4, 12,  0,  4,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_107[] = {  8,  0,  0,  0, 66, 68, 72,112, 72, 68, 64, 64, 64,  0,  0};\r
-static const GLubyte Fixed8x13_Character_108[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 16, 16, 16, 48,  0,  0};\r
-static const GLubyte Fixed8x13_Character_109[] = {  8,  0,  0,  0,130,146,146,146,146,236,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_110[] = {  8,  0,  0,  0, 66, 66, 66, 66, 98, 92,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_111[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 60,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_112[] = {  8,  0, 64, 64, 64, 92, 98, 66, 98, 92,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_113[] = {  8,  0,  2,  2,  2, 58, 70, 66, 70, 58,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_114[] = {  8,  0,  0,  0, 32, 32, 32, 32, 34, 92,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_115[] = {  8,  0,  0,  0, 60, 66, 12, 48, 66, 60,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_116[] = {  8,  0,  0,  0, 28, 34, 32, 32, 32,124, 32, 32,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_117[] = {  8,  0,  0,  0, 58, 68, 68, 68, 68, 68,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_118[] = {  8,  0,  0,  0, 16, 40, 40, 68, 68, 68,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_119[] = {  8,  0,  0,  0, 68,170,146,146,130,130,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_120[] = {  8,  0,  0,  0, 66, 36, 24, 24, 36, 66,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_121[] = {  8,  0, 60, 66,  2, 58, 70, 66, 66, 66,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_122[] = {  8,  0,  0,  0,126, 32, 16,  8,  4,126,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_123[] = {  8,  0,  0,  0, 14, 16, 16,  8, 48,  8, 16, 16, 14,  0,  0};\r
-static const GLubyte Fixed8x13_Character_124[] = {  8,  0,  0,  0, 16, 16, 16, 16, 16, 16, 16, 16, 16,  0,  0};\r
-static const GLubyte Fixed8x13_Character_125[] = {  8,  0,  0,  0,112,  8,  8, 16, 12, 16,  8,  8,112,  0,  0};\r
-static const GLubyte Fixed8x13_Character_126[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0, 72, 84, 36,  0,  0};\r
-static const GLubyte Fixed8x13_Character_127[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_128[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_129[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_130[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_131[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_132[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_133[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_134[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_135[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_136[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_137[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_138[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_139[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_140[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_141[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_142[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_143[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_144[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_145[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_146[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_147[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_148[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_149[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_150[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_151[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_152[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_153[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_154[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_155[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_156[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_157[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_158[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_159[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_160[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_161[] = {  8,  0,  0,  0, 16, 16, 16, 16, 16, 16, 16,  0, 16,  0,  0};\r
-static const GLubyte Fixed8x13_Character_162[] = {  8,  0,  0,  0,  0, 16, 56, 84, 80, 80, 84, 56, 16,  0,  0};\r
-static const GLubyte Fixed8x13_Character_163[] = {  8,  0,  0,  0,220, 98, 32, 32, 32,112, 32, 34, 28,  0,  0};\r
-static const GLubyte Fixed8x13_Character_164[] = {  8,  0,  0,  0,  0, 66, 60, 36, 36, 60, 66,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_165[] = {  8,  0,  0,  0, 16, 16,124, 16,124, 40, 68,130,130,  0,  0};\r
-static const GLubyte Fixed8x13_Character_166[] = {  8,  0,  0,  0, 16, 16, 16, 16,  0, 16, 16, 16, 16,  0,  0};\r
-static const GLubyte Fixed8x13_Character_167[] = {  8,  0,  0,  0, 24, 36,  4, 24, 36, 36, 24, 32, 36, 24,  0};\r
-static const GLubyte Fixed8x13_Character_168[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,108,  0,  0};\r
-static const GLubyte Fixed8x13_Character_169[] = {  8,  0,  0,  0,  0, 56, 68,146,170,162,170,146, 68, 56,  0};\r
-static const GLubyte Fixed8x13_Character_170[] = {  8,  0,  0,  0,  0,  0,124,  0, 60, 68, 60,  4, 56,  0,  0};\r
-static const GLubyte Fixed8x13_Character_171[] = {  8,  0,  0,  0,  0, 18, 36, 72,144, 72, 36, 18,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_172[] = {  8,  0,  0,  0,  0,  2,  2,  2,126,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_173[] = {  8,  0,  0,  0,  0,  0,  0,  0, 60,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_174[] = {  8,  0,  0,  0,  0, 56, 68,170,178,170,170,146, 68, 56,  0};\r
-static const GLubyte Fixed8x13_Character_175[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,  0,  0};\r
-static const GLubyte Fixed8x13_Character_176[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0, 24, 36, 36, 24,  0,  0};\r
-static const GLubyte Fixed8x13_Character_177[] = {  8,  0,  0,  0,  0,124,  0, 16, 16,124, 16, 16,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_178[] = {  8,  0,  0,  0,  0,  0,  0,  0,120, 64, 48,  8, 72, 48,  0};\r
-static const GLubyte Fixed8x13_Character_179[] = {  8,  0,  0,  0,  0,  0,  0,  0, 48, 72,  8, 16, 72, 48,  0};\r
-static const GLubyte Fixed8x13_Character_180[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16,  8,  0};\r
-static const GLubyte Fixed8x13_Character_181[] = {  8,  0,  0, 64, 90,102, 66, 66, 66, 66,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_182[] = {  8,  0,  0,  0, 20, 20, 20, 20, 52,116,116,116, 62,  0,  0};\r
-static const GLubyte Fixed8x13_Character_183[] = {  8,  0,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_184[] = {  8,  0, 24,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_185[] = {  8,  0,  0,  0,  0,  0,  0,  0,112, 32, 32, 32, 96, 32,  0};\r
-static const GLubyte Fixed8x13_Character_186[] = {  8,  0,  0,  0,  0,  0,  0,120,  0, 48, 72, 72, 48,  0,  0};\r
-static const GLubyte Fixed8x13_Character_187[] = {  8,  0,  0,  0,  0,144, 72, 36, 18, 36, 72,144,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_188[] = {  8,  0,  0,  0,  6, 26, 18, 10,230, 66, 64, 64,192, 64,  0};\r
-static const GLubyte Fixed8x13_Character_189[] = {  8,  0,  0,  0, 30, 16, 12,  2,242, 76, 64, 64,192, 64,  0};\r
-static const GLubyte Fixed8x13_Character_190[] = {  8,  0,  0,  0,  6, 26, 18, 10,102,146, 16, 32,144, 96,  0};\r
-static const GLubyte Fixed8x13_Character_191[] = {  8,  0,  0,  0, 60, 66, 66, 64, 32, 16, 16,  0, 16,  0,  0};\r
-static const GLubyte Fixed8x13_Character_192[] = {  8,  0,  0,  0, 66, 66,126, 66, 66, 36, 24,  0,  8, 16,  0};\r
-static const GLubyte Fixed8x13_Character_193[] = {  8,  0,  0,  0, 66, 66,126, 66, 66, 36, 24,  0, 16,  8,  0};\r
-static const GLubyte Fixed8x13_Character_194[] = {  8,  0,  0,  0, 66, 66,126, 66, 66, 36, 24,  0, 36, 24,  0};\r
-static const GLubyte Fixed8x13_Character_195[] = {  8,  0,  0,  0, 66, 66,126, 66, 66, 36, 24,  0, 76, 50,  0};\r
-static const GLubyte Fixed8x13_Character_196[] = {  8,  0,  0,  0, 66, 66,126, 66, 66, 36, 24,  0, 36, 36,  0};\r
-static const GLubyte Fixed8x13_Character_197[] = {  8,  0,  0,  0, 66, 66,126, 66, 66, 36, 24, 24, 36, 24,  0};\r
-static const GLubyte Fixed8x13_Character_198[] = {  8,  0,  0,  0,158,144,144,240,156,144,144,144,110,  0,  0};\r
-static const GLubyte Fixed8x13_Character_199[] = {  8,  0, 16,  8, 60, 66, 64, 64, 64, 64, 64, 66, 60,  0,  0};\r
-static const GLubyte Fixed8x13_Character_200[] = {  8,  0,  0,  0,126, 64, 64,120, 64, 64,126,  0,  8, 16,  0};\r
-static const GLubyte Fixed8x13_Character_201[] = {  8,  0,  0,  0,126, 64, 64,120, 64, 64,126,  0, 16,  8,  0};\r
-static const GLubyte Fixed8x13_Character_202[] = {  8,  0,  0,  0,126, 64, 64,120, 64, 64,126,  0, 36, 24,  0};\r
-static const GLubyte Fixed8x13_Character_203[] = {  8,  0,  0,  0,126, 64, 64,120, 64, 64,126,  0, 36, 36,  0};\r
-static const GLubyte Fixed8x13_Character_204[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 16,124,  0, 16, 32,  0};\r
-static const GLubyte Fixed8x13_Character_205[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 16,124,  0, 16,  8,  0};\r
-static const GLubyte Fixed8x13_Character_206[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 16,124,  0, 36, 24,  0};\r
-static const GLubyte Fixed8x13_Character_207[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 16,124,  0, 40, 40,  0};\r
-static const GLubyte Fixed8x13_Character_208[] = {  8,  0,  0,  0,120, 68, 66, 66,226, 66, 66, 68,120,  0,  0};\r
-static const GLubyte Fixed8x13_Character_209[] = {  8,  0,  0,  0,130,134,138,146,162,194,130,  0,152,100,  0};\r
-static const GLubyte Fixed8x13_Character_210[] = {  8,  0,  0,  0,124,130,130,130,130,130,124,  0, 16, 32,  0};\r
-static const GLubyte Fixed8x13_Character_211[] = {  8,  0,  0,  0,124,130,130,130,130,130,124,  0, 16,  8,  0};\r
-static const GLubyte Fixed8x13_Character_212[] = {  8,  0,  0,  0,124,130,130,130,130,130,124,  0, 36, 24,  0};\r
-static const GLubyte Fixed8x13_Character_213[] = {  8,  0,  0,  0,124,130,130,130,130,130,124,  0,152,100,  0};\r
-static const GLubyte Fixed8x13_Character_214[] = {  8,  0,  0,  0,124,130,130,130,130,130,124,  0, 40, 40,  0};\r
-static const GLubyte Fixed8x13_Character_215[] = {  8,  0,  0,  0,  0, 66, 36, 24, 24, 36, 66,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_216[] = {  8,  0,  0, 64, 60, 98, 82, 82, 82, 74, 74, 70, 60,  2,  0};\r
-static const GLubyte Fixed8x13_Character_217[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66,  0,  8, 16,  0};\r
-static const GLubyte Fixed8x13_Character_218[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66,  0, 16,  8,  0};\r
-static const GLubyte Fixed8x13_Character_219[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66,  0, 36, 24,  0};\r
-static const GLubyte Fixed8x13_Character_220[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66,  0, 36, 36,  0};\r
-static const GLubyte Fixed8x13_Character_221[] = {  8,  0,  0,  0, 16, 16, 16, 16, 40, 68, 68,  0, 16,  8,  0};\r
-static const GLubyte Fixed8x13_Character_222[] = {  8,  0,  0,  0, 64, 64, 64,124, 66, 66, 66,124, 64,  0,  0};\r
-static const GLubyte Fixed8x13_Character_223[] = {  8,  0,  0,  0, 92, 66, 66, 76, 80, 72, 68, 68, 56,  0,  0};\r
-static const GLubyte Fixed8x13_Character_224[] = {  8,  0,  0,  0, 58, 70, 66, 62,  2, 60,  0,  0,  8, 16,  0};\r
-static const GLubyte Fixed8x13_Character_225[] = {  8,  0,  0,  0, 58, 70, 66, 62,  2, 60,  0,  0,  8,  4,  0};\r
-static const GLubyte Fixed8x13_Character_226[] = {  8,  0,  0,  0, 58, 70, 66, 62,  2, 60,  0,  0, 36, 24,  0};\r
-static const GLubyte Fixed8x13_Character_227[] = {  8,  0,  0,  0, 58, 70, 66, 62,  2, 60,  0,  0, 76, 50,  0};\r
-static const GLubyte Fixed8x13_Character_228[] = {  8,  0,  0,  0, 58, 70, 66, 62,  2, 60,  0,  0, 36, 36,  0};\r
-static const GLubyte Fixed8x13_Character_229[] = {  8,  0,  0,  0, 58, 70, 66, 62,  2, 60,  0, 24, 36, 24,  0};\r
-static const GLubyte Fixed8x13_Character_230[] = {  8,  0,  0,  0,108,146,144,124, 18,108,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_231[] = {  8,  0, 16,  8, 60, 66, 64, 64, 66, 60,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_232[] = {  8,  0,  0,  0, 60, 66, 64,126, 66, 60,  0,  0,  8, 16,  0};\r
-static const GLubyte Fixed8x13_Character_233[] = {  8,  0,  0,  0, 60, 66, 64,126, 66, 60,  0,  0, 16,  8,  0};\r
-static const GLubyte Fixed8x13_Character_234[] = {  8,  0,  0,  0, 60, 66, 64,126, 66, 60,  0,  0, 36, 24,  0};\r
-static const GLubyte Fixed8x13_Character_235[] = {  8,  0,  0,  0, 60, 66, 64,126, 66, 60,  0,  0, 36, 36,  0};\r
-static const GLubyte Fixed8x13_Character_236[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 48,  0,  0, 16, 32,  0};\r
-static const GLubyte Fixed8x13_Character_237[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 48,  0,  0, 32, 16,  0};\r
-static const GLubyte Fixed8x13_Character_238[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 48,  0,  0, 72, 48,  0};\r
-static const GLubyte Fixed8x13_Character_239[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 48,  0,  0, 40, 40,  0};\r
-static const GLubyte Fixed8x13_Character_240[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 60,  4, 40, 24, 36,  0};\r
-static const GLubyte Fixed8x13_Character_241[] = {  8,  0,  0,  0, 66, 66, 66, 66, 98, 92,  0,  0, 76, 50,  0};\r
-static const GLubyte Fixed8x13_Character_242[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 60,  0,  0, 16, 32,  0};\r
-static const GLubyte Fixed8x13_Character_243[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 60,  0,  0, 16,  8,  0};\r
-static const GLubyte Fixed8x13_Character_244[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 60,  0,  0, 36, 24,  0};\r
-static const GLubyte Fixed8x13_Character_245[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 60,  0,  0, 76, 50,  0};\r
-static const GLubyte Fixed8x13_Character_246[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 60,  0,  0, 36, 36,  0};\r
-static const GLubyte Fixed8x13_Character_247[] = {  8,  0,  0,  0,  0, 16, 16,  0,124,  0, 16, 16,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_248[] = {  8,  0,  0, 64, 60, 98, 82, 74, 70, 60,  2,  0,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_249[] = {  8,  0,  0,  0, 58, 68, 68, 68, 68, 68,  0,  0, 16, 32,  0};\r
-static const GLubyte Fixed8x13_Character_250[] = {  8,  0,  0,  0, 58, 68, 68, 68, 68, 68,  0,  0, 16,  8,  0};\r
-static const GLubyte Fixed8x13_Character_251[] = {  8,  0,  0,  0, 58, 68, 68, 68, 68, 68,  0,  0, 36, 24,  0};\r
-static const GLubyte Fixed8x13_Character_252[] = {  8,  0,  0,  0, 58, 68, 68, 68, 68, 68,  0,  0, 40, 40,  0};\r
-static const GLubyte Fixed8x13_Character_253[] = {  8,  0, 60, 66,  2, 58, 70, 66, 66, 66,  0,  0, 16,  8,  0};\r
-static const GLubyte Fixed8x13_Character_254[] = {  8,  0, 64, 64, 92, 98, 66, 66, 98, 92, 64, 64,  0,  0,  0};\r
-static const GLubyte Fixed8x13_Character_255[] = {  8,  0, 60, 66,  2, 58, 70, 66, 66, 66,  0,  0, 36, 36,  0};\r
-\r
-/* The font characters mapping: */\r
-static const GLubyte* Fixed8x13_Character_Map[] = {Fixed8x13_Character_000,Fixed8x13_Character_001,Fixed8x13_Character_002,Fixed8x13_Character_003,Fixed8x13_Character_004,Fixed8x13_Character_005,Fixed8x13_Character_006,Fixed8x13_Character_007,Fixed8x13_Character_008,Fixed8x13_Character_009,Fixed8x13_Character_010,Fixed8x13_Character_011,Fixed8x13_Character_012,Fixed8x13_Character_013,Fixed8x13_Character_014,Fixed8x13_Character_015,\r
-                                                   Fixed8x13_Character_016,Fixed8x13_Character_017,Fixed8x13_Character_018,Fixed8x13_Character_019,Fixed8x13_Character_020,Fixed8x13_Character_021,Fixed8x13_Character_022,Fixed8x13_Character_023,Fixed8x13_Character_024,Fixed8x13_Character_025,Fixed8x13_Character_026,Fixed8x13_Character_027,Fixed8x13_Character_028,Fixed8x13_Character_029,Fixed8x13_Character_030,Fixed8x13_Character_031,\r
-                                                   Fixed8x13_Character_032,Fixed8x13_Character_033,Fixed8x13_Character_034,Fixed8x13_Character_035,Fixed8x13_Character_036,Fixed8x13_Character_037,Fixed8x13_Character_038,Fixed8x13_Character_039,Fixed8x13_Character_040,Fixed8x13_Character_041,Fixed8x13_Character_042,Fixed8x13_Character_043,Fixed8x13_Character_044,Fixed8x13_Character_045,Fixed8x13_Character_046,Fixed8x13_Character_047,\r
-                                                   Fixed8x13_Character_048,Fixed8x13_Character_049,Fixed8x13_Character_050,Fixed8x13_Character_051,Fixed8x13_Character_052,Fixed8x13_Character_053,Fixed8x13_Character_054,Fixed8x13_Character_055,Fixed8x13_Character_056,Fixed8x13_Character_057,Fixed8x13_Character_058,Fixed8x13_Character_059,Fixed8x13_Character_060,Fixed8x13_Character_061,Fixed8x13_Character_062,Fixed8x13_Character_063,\r
-                                                   Fixed8x13_Character_064,Fixed8x13_Character_065,Fixed8x13_Character_066,Fixed8x13_Character_067,Fixed8x13_Character_068,Fixed8x13_Character_069,Fixed8x13_Character_070,Fixed8x13_Character_071,Fixed8x13_Character_072,Fixed8x13_Character_073,Fixed8x13_Character_074,Fixed8x13_Character_075,Fixed8x13_Character_076,Fixed8x13_Character_077,Fixed8x13_Character_078,Fixed8x13_Character_079,\r
-                                                   Fixed8x13_Character_080,Fixed8x13_Character_081,Fixed8x13_Character_082,Fixed8x13_Character_083,Fixed8x13_Character_084,Fixed8x13_Character_085,Fixed8x13_Character_086,Fixed8x13_Character_087,Fixed8x13_Character_088,Fixed8x13_Character_089,Fixed8x13_Character_090,Fixed8x13_Character_091,Fixed8x13_Character_092,Fixed8x13_Character_093,Fixed8x13_Character_094,Fixed8x13_Character_095,\r
-                                                   Fixed8x13_Character_096,Fixed8x13_Character_097,Fixed8x13_Character_098,Fixed8x13_Character_099,Fixed8x13_Character_100,Fixed8x13_Character_101,Fixed8x13_Character_102,Fixed8x13_Character_103,Fixed8x13_Character_104,Fixed8x13_Character_105,Fixed8x13_Character_106,Fixed8x13_Character_107,Fixed8x13_Character_108,Fixed8x13_Character_109,Fixed8x13_Character_110,Fixed8x13_Character_111,\r
-                                                   Fixed8x13_Character_112,Fixed8x13_Character_113,Fixed8x13_Character_114,Fixed8x13_Character_115,Fixed8x13_Character_116,Fixed8x13_Character_117,Fixed8x13_Character_118,Fixed8x13_Character_119,Fixed8x13_Character_120,Fixed8x13_Character_121,Fixed8x13_Character_122,Fixed8x13_Character_123,Fixed8x13_Character_124,Fixed8x13_Character_125,Fixed8x13_Character_126,Fixed8x13_Character_032,\r
-                                                   Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,\r
-                                                   Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,\r
-                                                   Fixed8x13_Character_160,Fixed8x13_Character_161,Fixed8x13_Character_162,Fixed8x13_Character_163,Fixed8x13_Character_164,Fixed8x13_Character_165,Fixed8x13_Character_166,Fixed8x13_Character_167,Fixed8x13_Character_168,Fixed8x13_Character_169,Fixed8x13_Character_170,Fixed8x13_Character_171,Fixed8x13_Character_172,Fixed8x13_Character_173,Fixed8x13_Character_174,Fixed8x13_Character_175,\r
-                                                   Fixed8x13_Character_176,Fixed8x13_Character_177,Fixed8x13_Character_178,Fixed8x13_Character_179,Fixed8x13_Character_180,Fixed8x13_Character_181,Fixed8x13_Character_182,Fixed8x13_Character_183,Fixed8x13_Character_184,Fixed8x13_Character_185,Fixed8x13_Character_186,Fixed8x13_Character_187,Fixed8x13_Character_188,Fixed8x13_Character_189,Fixed8x13_Character_190,Fixed8x13_Character_191,\r
-                                                   Fixed8x13_Character_192,Fixed8x13_Character_193,Fixed8x13_Character_194,Fixed8x13_Character_195,Fixed8x13_Character_196,Fixed8x13_Character_197,Fixed8x13_Character_198,Fixed8x13_Character_199,Fixed8x13_Character_200,Fixed8x13_Character_201,Fixed8x13_Character_202,Fixed8x13_Character_203,Fixed8x13_Character_204,Fixed8x13_Character_205,Fixed8x13_Character_206,Fixed8x13_Character_207,\r
-                                                   Fixed8x13_Character_208,Fixed8x13_Character_209,Fixed8x13_Character_210,Fixed8x13_Character_211,Fixed8x13_Character_212,Fixed8x13_Character_213,Fixed8x13_Character_214,Fixed8x13_Character_215,Fixed8x13_Character_216,Fixed8x13_Character_217,Fixed8x13_Character_218,Fixed8x13_Character_219,Fixed8x13_Character_220,Fixed8x13_Character_221,Fixed8x13_Character_222,Fixed8x13_Character_223,\r
-                                                   Fixed8x13_Character_224,Fixed8x13_Character_225,Fixed8x13_Character_226,Fixed8x13_Character_227,Fixed8x13_Character_228,Fixed8x13_Character_229,Fixed8x13_Character_230,Fixed8x13_Character_231,Fixed8x13_Character_232,Fixed8x13_Character_233,Fixed8x13_Character_234,Fixed8x13_Character_235,Fixed8x13_Character_236,Fixed8x13_Character_237,Fixed8x13_Character_238,Fixed8x13_Character_239,\r
-                                                   Fixed8x13_Character_240,Fixed8x13_Character_241,Fixed8x13_Character_242,Fixed8x13_Character_243,Fixed8x13_Character_244,Fixed8x13_Character_245,Fixed8x13_Character_246,Fixed8x13_Character_247,Fixed8x13_Character_248,Fixed8x13_Character_249,Fixed8x13_Character_250,Fixed8x13_Character_251,Fixed8x13_Character_252,Fixed8x13_Character_253,Fixed8x13_Character_254,Fixed8x13_Character_255,NULL};\r
-\r
-/* The font structure: */\r
-const SFG_Font fgFontFixed8x13 = { "-misc-fixed-medium-r-normal--13-120-75-75-C-80-iso8859-1", 256, 14, Fixed8x13_Character_Map, 0, 3 };\r
-\r
-static const GLubyte Fixed9x15_Character_000[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_001[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0, 28,  0, 62,  0,127,  0,255,128,127,  0, 62,  0, 28,  0,  8,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_002[] = {  9,  0,  0,170,128, 85,  0,170,128, 85,  0,170,128, 85,  0,170,128, 85,  0,170,128, 85,  0,170,128, 85,  0,170,128, 85,  0,170,128};\r
-static const GLubyte Fixed9x15_Character_003[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  4,  0,  4,  0,  4,  0, 31,  0,  0,  0, 72,  0, 72,  0,120,  0, 72,  0, 72,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_004[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0, 14,  0, 72,  0, 79,  0, 64,  0,112,  0, 64,  0,120,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_005[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  9,  0,  9,  0, 14,  0,  9,  0, 14,  0,  0,  0, 56,  0, 64,  0, 64,  0, 64,  0, 56,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_006[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0, 14,  0,  8,  0, 15,  0,  0,  0,120,  0, 64,  0, 64,  0, 64,  0, 64,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_007[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 18,  0, 18,  0, 12,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_008[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,  0,  0,  8,  0,  8,  0,  8,  0,127,  0,  8,  0,  8,  0,  8,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_009[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0,  8,  0,  8,  0,  8,  0,  8,  0,  0,  0, 68,  0, 76,  0, 84,  0,100,  0, 68,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_010[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  4,  0,  4,  0,  4,  0, 31,  0,  0,  0, 16,  0, 40,  0, 40,  0, 68,  0, 68,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_011[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,248,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0};\r
-static const GLubyte Fixed9x15_Character_012[] = {  9,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_013[] = {  9,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 15,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_014[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,128,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0};\r
-static const GLubyte Fixed9x15_Character_015[] = {  9,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,255,128,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0};\r
-static const GLubyte Fixed9x15_Character_016[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,128};\r
-static const GLubyte Fixed9x15_Character_017[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,128,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_018[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_019[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,255,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_020[] = {  9,  0,  0,255,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_021[] = {  9,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 15,128,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0};\r
-static const GLubyte Fixed9x15_Character_022[] = {  9,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,248,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0};\r
-static const GLubyte Fixed9x15_Character_023[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,128,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0};\r
-static const GLubyte Fixed9x15_Character_024[] = {  9,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,255,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_025[] = {  9,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0};\r
-static const GLubyte Fixed9x15_Character_026[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,  0,  0,  3,  0, 28,  0, 96,  0, 28,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_027[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,  0,  0, 96,  0, 28,  0,  3,  0, 28,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_028[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0, 34,  0, 34,  0, 34,  0, 34,  0, 34,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_029[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16,  0, 16,  0,127,  0,  8,  0,127,  0,  4,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_030[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 46,  0, 81,  0, 48,  0, 16,  0, 16,  0,124,  0, 16,  0, 16,  0, 17,  0, 14,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_031[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_032[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_033[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_034[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 18,  0, 18,  0, 18,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_035[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 36,  0, 36,  0,126,  0, 36,  0, 36,  0,126,  0, 36,  0, 36,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_036[] = {  9,  0,  0,  0,  0,  0,  0,  8,  0, 62,  0, 73,  0,  9,  0,  9,  0, 10,  0, 28,  0, 40,  0, 72,  0, 73,  0, 62,  0,  8,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_037[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 66,  0, 37,  0, 37,  0, 18,  0,  8,  0,  8,  0, 36,  0, 82,  0, 82,  0, 33,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_038[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 49,  0, 74,  0, 68,  0, 74,  0, 49,  0, 48,  0, 72,  0, 72,  0, 72,  0, 48,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_039[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16,  0,  8,  0,  4,  0,  6,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_040[] = {  9,  0,  0,  0,  0,  0,  0,  4,  0,  8,  0,  8,  0, 16,  0, 16,  0, 16,  0, 16,  0, 16,  0, 16,  0,  8,  0,  8,  0,  4,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_041[] = {  9,  0,  0,  0,  0,  0,  0, 16,  0,  8,  0,  8,  0,  4,  0,  4,  0,  4,  0,  4,  0,  4,  0,  4,  0,  8,  0,  8,  0, 16,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_042[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0, 73,  0, 42,  0, 28,  0, 42,  0, 73,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_043[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,127,  0,  8,  0,  8,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_044[] = {  9,  0,  0,  8,  0,  4,  0,  4,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_045[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_046[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_047[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 64,  0, 32,  0, 32,  0, 16,  0,  8,  0,  8,  0,  4,  0,  2,  0,  2,  0,  1,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_048[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 28,  0, 34,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 34,  0, 28,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_049[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 72,  0, 40,  0, 24,  0,  8,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_050[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 64,  0, 32,  0, 16,  0,  8,  0,  4,  0,  2,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_051[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0,  1,  0,  1,  0,  1,  0, 14,  0,  4,  0,  2,  0,  1,  0,127,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_052[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  2,  0,  2,  0,127,  0, 66,  0, 34,  0, 18,  0, 10,  0,  6,  0,  2,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_053[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0,  1,  0,  1,  0,  1,  0, 97,  0, 94,  0, 64,  0, 64,  0,127,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_054[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 97,  0, 94,  0, 64,  0, 64,  0, 32,  0, 30,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_055[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0, 32,  0, 16,  0, 16,  0,  8,  0,  4,  0,  2,  0,  1,  0,  1,  0,127,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_056[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 28,  0, 34,  0, 65,  0, 65,  0, 34,  0, 28,  0, 34,  0, 65,  0, 34,  0, 28,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_057[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 60,  0,  2,  0,  1,  0,  1,  0, 61,  0, 67,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_058[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_059[] = {  9,  0,  0,  8,  0,  4,  0,  4,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_060[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  4,  0,  8,  0, 16,  0, 32,  0, 32,  0, 16,  0,  8,  0,  4,  0,  2,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_061[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,  0,  0,  0,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_062[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0, 16,  0,  8,  0,  4,  0,  2,  0,  2,  0,  4,  0,  8,  0, 16,  0, 32,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_063[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  8,  0,  8,  0,  4,  0,  2,  0,  1,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_064[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 64,  0, 64,  0, 77,  0, 83,  0, 81,  0, 79,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_065[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 65,  0, 34,  0, 20,  0,  8,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_066[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,126,  0, 33,  0, 33,  0, 33,  0, 33,  0,126,  0, 33,  0, 33,  0, 33,  0,126,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_067[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 65,  0, 62,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_068[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,126,  0, 33,  0, 33,  0, 33,  0, 33,  0, 33,  0, 33,  0, 33,  0, 33,  0,126,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_069[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 32,  0, 32,  0, 32,  0, 32,  0, 60,  0, 32,  0, 32,  0, 32,  0,127,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_070[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0, 32,  0, 32,  0, 32,  0, 32,  0, 60,  0, 32,  0, 32,  0, 32,  0,127,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_071[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 71,  0, 64,  0, 64,  0, 64,  0, 65,  0, 62,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_072[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_073[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 62,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_074[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 60,  0, 66,  0,  2,  0,  2,  0,  2,  0,  2,  0,  2,  0,  2,  0,  2,  0, 15,128,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_075[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 66,  0, 68,  0, 72,  0, 80,  0,112,  0, 72,  0, 68,  0, 66,  0, 65,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_076[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_077[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 73,  0, 73,  0, 85,  0, 85,  0, 99,  0, 65,  0, 65,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_078[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 67,  0, 69,  0, 73,  0, 81,  0, 97,  0, 65,  0, 65,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_079[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_080[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0,126,  0, 65,  0, 65,  0, 65,  0,126,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_081[] = {  9,  0,  0,  0,  0,  3,  0,  4,  0, 62,  0, 73,  0, 81,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_082[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 66,  0, 68,  0, 72,  0,126,  0, 65,  0, 65,  0, 65,  0,126,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_083[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0,  1,  0,  6,  0, 56,  0, 64,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_084[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,127,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_085[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_086[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0, 20,  0, 20,  0, 20,  0, 34,  0, 34,  0, 34,  0, 65,  0, 65,  0, 65,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_087[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0, 85,  0, 73,  0, 73,  0, 73,  0, 73,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_088[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 34,  0, 20,  0,  8,  0,  8,  0, 20,  0, 34,  0, 65,  0, 65,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_089[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 20,  0, 34,  0, 65,  0, 65,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_090[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 64,  0, 64,  0, 32,  0, 16,  0,  8,  0,  4,  0,  2,  0,  1,  0,127,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_091[] = {  9,  0,  0,  0,  0,  0,  0, 30,  0, 16,  0, 16,  0, 16,  0, 16,  0, 16,  0, 16,  0, 16,  0, 16,  0, 16,  0, 16,  0, 30,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_092[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  2,  0,  2,  0,  4,  0,  8,  0,  8,  0, 16,  0, 32,  0, 32,  0, 64,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_093[] = {  9,  0,  0,  0,  0,  0,  0, 60,  0,  4,  0,  4,  0,  4,  0,  4,  0,  4,  0,  4,  0,  4,  0,  4,  0,  4,  0,  4,  0, 60,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_094[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 34,  0, 20,  0,  8,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_095[] = {  9,  0,  0,  0,  0,  0,  0,255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_096[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  8,  0, 16,  0, 48,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_097[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 67,  0, 65,  0, 63,  0,  1,  0,  1,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_098[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 94,  0, 97,  0, 65,  0, 65,  0, 65,  0, 97,  0, 94,  0, 64,  0, 64,  0, 64,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_099[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 64,  0, 64,  0, 64,  0, 65,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_100[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 67,  0, 65,  0, 65,  0, 65,  0, 67,  0, 61,  0,  1,  0,  1,  0,  1,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_101[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 64,  0, 64,  0,127,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_102[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 16,  0, 16,  0, 16,  0, 16,  0,124,  0, 16,  0, 16,  0, 17,  0, 17,  0, 14,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_103[] = {  9,  0,  0, 62,  0, 65,  0, 65,  0, 62,  0, 64,  0, 60,  0, 66,  0, 66,  0, 66,  0, 61,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_104[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 97,  0, 94,  0, 64,  0, 64,  0, 64,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_105[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 56,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_106[] = {  9,  0,  0, 60,  0, 66,  0, 66,  0, 66,  0,  2,  0,  2,  0,  2,  0,  2,  0,  2,  0, 14,  0,  0,  0,  0,  0,  6,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_107[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 70,  0, 88,  0, 96,  0, 88,  0, 70,  0, 65,  0, 64,  0, 64,  0, 64,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_108[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 56,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_109[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 73,  0, 73,  0, 73,  0, 73,  0, 73,  0,118,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_110[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 97,  0, 94,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_111[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_112[] = {  9,  0,  0, 64,  0, 64,  0, 64,  0, 94,  0, 97,  0, 65,  0, 65,  0, 65,  0, 97,  0, 94,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_113[] = {  9,  0,  0,  1,  0,  1,  0,  1,  0, 61,  0, 67,  0, 65,  0, 65,  0, 65,  0, 67,  0, 61,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_114[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0, 32,  0, 32,  0, 32,  0, 33,  0, 49,  0, 78,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_115[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0,  1,  0, 62,  0, 64,  0, 65,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_116[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 14,  0, 17,  0, 16,  0, 16,  0, 16,  0, 16,  0,126,  0, 16,  0, 16,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_117[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_118[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0, 20,  0, 20,  0, 34,  0, 34,  0, 65,  0, 65,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_119[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0, 85,  0, 73,  0, 73,  0, 73,  0, 65,  0, 65,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_120[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 34,  0, 20,  0,  8,  0, 20,  0, 34,  0, 65,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_121[] = {  9,  0,  0, 60,  0, 66,  0,  2,  0, 58,  0, 70,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_122[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 32,  0, 16,  0,  8,  0,  4,  0,  2,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_123[] = {  9,  0,  0,  0,  0,  0,  0,  7,  0,  8,  0,  8,  0,  8,  0,  4,  0, 24,  0, 24,  0,  4,  0,  8,  0,  8,  0,  8,  0,  7,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_124[] = {  9,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_125[] = {  9,  0,  0,  0,  0,  0,  0,112,  0,  8,  0,  8,  0,  8,  0, 16,  0, 12,  0, 12,  0, 16,  0,  8,  0,  8,  0,  8,  0,112,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_126[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 70,  0, 73,  0, 49,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_127[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_128[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_129[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_130[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_131[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_132[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_133[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_134[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_135[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_136[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_137[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_138[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_139[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_140[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_141[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_142[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_143[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_144[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_145[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_146[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_147[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_148[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_149[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_150[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_151[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_152[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_153[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_154[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_155[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_156[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_157[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_158[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_159[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_160[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_161[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  0,  0,  0,  0,  8,  0,  8,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_162[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0, 60,  0, 82,  0, 80,  0, 72,  0, 74,  0, 60,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_163[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 46,  0, 81,  0, 48,  0, 16,  0, 16,  0,124,  0, 16,  0, 16,  0, 17,  0, 14,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_164[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 62,  0, 34,  0, 34,  0, 62,  0, 65,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_165[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0, 62,  0,  8,  0, 62,  0, 20,  0, 34,  0, 65,  0, 65,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_166[] = {  9,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_167[] = {  9,  0,  0,  0,  0,  0,  0, 24,  0, 36,  0,  4,  0, 24,  0, 36,  0, 36,  0, 36,  0, 24,  0, 32,  0, 36,  0, 24,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_168[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0, 34,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_169[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 60,  0, 66,  0,153,  0,165,  0,161,  0,165,  0,153,  0, 66,  0, 60,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_170[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,  0,  0,  0, 60,  0, 72,  0, 56,  0, 72,  0, 48,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_171[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  0, 18,  0, 36,  0, 72,  0, 72,  0, 36,  0, 18,  0,  9,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_172[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  2,  0,  2,  0,126,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_173[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_174[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 60,  0, 66,  0,165,  0,169,  0,185,  0,165,  0,185,  0, 66,  0, 60,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_175[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_176[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 18,  0, 18,  0, 12,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_177[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,  0,  0,  8,  0,  8,  0,  8,  0,127,  0,  8,  0,  8,  0,  8,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_178[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,120,  0, 64,  0, 48,  0,  8,  0, 72,  0, 48,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_179[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48,  0, 72,  0,  8,  0, 16,  0, 72,  0, 48,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_180[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16,  0,  8,  0,  4,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_181[] = {  9,  0,  0,  0,  0, 64,  0, 64,  0, 93,  0, 99,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_182[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  5,  0,  5,  0,  5,  0,  5,  0, 61,  0, 69,  0, 69,  0, 69,  0, 63,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_183[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_184[] = {  9,  0,  0, 24,  0, 36,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_185[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,112,  0, 32,  0, 32,  0, 32,  0, 96,  0, 32,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_186[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,  0,  0,  0, 56,  0, 68,  0, 68,  0, 56,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_187[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 72,  0, 36,  0, 18,  0,  9,  0,  9,  0, 18,  0, 36,  0, 72,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_188[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0, 13,  0,  9,  0,  5,  0,115,  0, 33,  0, 32,  0, 32,  0, 96,  0, 32,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_189[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0,  8,  0,  6,  0,  1,  0,121,  0, 38,  0, 32,  0, 32,  0, 96,  0, 32,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_190[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0, 13,  0,  9,  0,  5,  0, 51,  0, 73,  0,  8,  0, 16,  0, 72,  0, 48,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_191[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 64,  0, 32,  0, 16,  0,  8,  0,  8,  0,  0,  0,  8,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_192[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 34,  0, 28,  0,  0,  0,  8,  0, 16,  0, 32,  0};\r
-static const GLubyte Fixed9x15_Character_193[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 34,  0, 28,  0,  0,  0,  8,  0,  4,  0,  2,  0};\r
-static const GLubyte Fixed9x15_Character_194[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 34,  0, 28,  0,  0,  0, 34,  0, 20,  0,  8,  0};\r
-static const GLubyte Fixed9x15_Character_195[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 34,  0, 28,  0,  0,  0, 78,  0, 49,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_196[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 34,  0, 28,  0,  0,  0, 34,  0, 34,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_197[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 34,  0, 20,  0, 28,  0, 34,  0, 28,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_198[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 79,  0, 72,  0, 72,  0, 72,  0,126,  0, 72,  0, 72,  0, 72,  0, 72,  0, 55,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_199[] = {  9,  0,  0, 24,  0, 36,  0, 12,  0, 62,  0, 65,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 65,  0, 62,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_200[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 32,  0, 32,  0, 32,  0, 60,  0, 32,  0, 32,  0,127,  0,  0,  0,  8,  0, 16,  0, 32,  0};\r
-static const GLubyte Fixed9x15_Character_201[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 32,  0, 32,  0, 32,  0, 60,  0, 32,  0, 32,  0,127,  0,  0,  0,  8,  0,  4,  0,  2,  0};\r
-static const GLubyte Fixed9x15_Character_202[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 32,  0, 32,  0, 32,  0, 60,  0, 32,  0, 32,  0,127,  0,  0,  0, 34,  0, 20,  0,  8,  0};\r
-static const GLubyte Fixed9x15_Character_203[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 32,  0, 32,  0, 32,  0, 60,  0, 32,  0, 32,  0,127,  0,  0,  0, 34,  0, 34,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_204[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 62,  0,  0,  0,  8,  0, 16,  0, 32,  0};\r
-static const GLubyte Fixed9x15_Character_205[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 62,  0,  0,  0,  8,  0,  4,  0,  2,  0};\r
-static const GLubyte Fixed9x15_Character_206[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 62,  0,  0,  0, 34,  0, 20,  0,  8,  0};\r
-static const GLubyte Fixed9x15_Character_207[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 62,  0,  0,  0, 34,  0, 34,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_208[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,124,  0, 33,  0, 33,  0, 33,  0, 33,  0,225,  0, 33,  0, 33,  0, 33,  0,124,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_209[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 67,  0, 69,  0, 73,  0, 73,  0, 81,  0, 97,  0, 65,  0,  0,  0, 78,  0, 49,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_210[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0,  8,  0, 16,  0, 32,  0};\r
-static const GLubyte Fixed9x15_Character_211[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0,  8,  0,  4,  0,  2,  0};\r
-static const GLubyte Fixed9x15_Character_212[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0, 34,  0, 20,  0,  8,  0};\r
-static const GLubyte Fixed9x15_Character_213[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0, 78,  0, 49,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_214[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0, 34,  0, 34,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_215[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 34,  0, 20,  0,  8,  0, 20,  0, 34,  0, 65,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_216[] = {  9,  0,  0,  0,  0,  0,  0, 64,  0, 62,  0, 97,  0, 81,  0, 81,  0, 73,  0, 73,  0, 69,  0, 69,  0, 67,  0, 62,  0,  1,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_217[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0,  8,  0, 16,  0, 32,  0};\r
-static const GLubyte Fixed9x15_Character_218[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0,  8,  0,  4,  0,  2,  0};\r
-static const GLubyte Fixed9x15_Character_219[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0, 34,  0, 20,  0,  8,  0};\r
-static const GLubyte Fixed9x15_Character_220[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0, 34,  0, 34,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_221[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0, 20,  0, 34,  0, 65,  0, 65,  0,  0,  0,  8,  0,  4,  0,  2,  0};\r
-static const GLubyte Fixed9x15_Character_222[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 64,  0, 64,  0, 64,  0,126,  0, 65,  0, 65,  0, 65,  0,126,  0, 64,  0, 64,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_223[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 44,  0, 34,  0, 34,  0, 34,  0, 36,  0,104,  0, 36,  0, 34,  0, 34,  0, 28,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_224[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 67,  0, 65,  0, 63,  0,  1,  0,  1,  0, 62,  0,  0,  0,  4,  0,  8,  0, 16,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_225[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 67,  0, 65,  0, 63,  0,  1,  0,  1,  0, 62,  0,  0,  0,  8,  0,  4,  0,  2,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_226[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 67,  0, 65,  0, 63,  0,  1,  0,  1,  0, 62,  0,  0,  0, 34,  0, 20,  0,  8,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_227[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 67,  0, 65,  0, 63,  0,  1,  0,  1,  0, 62,  0,  0,  0, 38,  0, 25,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_228[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 67,  0, 65,  0, 63,  0,  1,  0,  1,  0, 62,  0,  0,  0, 34,  0, 34,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_229[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 67,  0, 65,  0, 63,  0,  1,  0,  1,  0, 62,  0,  0,  0, 12,  0, 18,  0, 12,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_230[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 55,  0, 73,  0, 72,  0, 62,  0,  9,  0, 73,  0, 54,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_231[] = {  9,  0,  0, 24,  0, 36,  0, 12,  0, 62,  0, 65,  0, 64,  0, 64,  0, 64,  0, 65,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_232[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 64,  0, 64,  0,127,  0, 65,  0, 65,  0, 62,  0,  0,  0,  8,  0, 16,  0, 32,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_233[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 64,  0, 64,  0,127,  0, 65,  0, 65,  0, 62,  0,  0,  0,  8,  0,  4,  0,  2,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_234[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 64,  0, 64,  0,127,  0, 65,  0, 65,  0, 62,  0,  0,  0, 34,  0, 20,  0,  8,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_235[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 64,  0, 64,  0,127,  0, 65,  0, 65,  0, 62,  0,  0,  0, 34,  0, 34,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_236[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 56,  0,  0,  0,  8,  0, 16,  0, 32,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_237[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 56,  0,  0,  0, 16,  0,  8,  0,  4,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_238[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 56,  0,  0,  0, 68,  0, 40,  0, 16,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_239[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 56,  0,  0,  0, 36,  0, 36,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_240[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  4,  0, 40,  0, 24,  0, 36,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_241[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 97,  0, 94,  0,  0,  0, 78,  0, 49,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_242[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0,  8,  0, 16,  0, 32,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_243[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0,  8,  0,  4,  0,  2,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_244[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0, 34,  0, 20,  0,  8,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_245[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0, 78,  0, 49,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_246[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0, 34,  0, 34,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_247[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0, 28,  0,  8,  0,  0,  0,127,  0,  0,  0,  8,  0, 28,  0,  8,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_248[] = {  9,  0,  0,  0,  0,  0,  0, 64,  0, 62,  0, 81,  0, 81,  0, 73,  0, 69,  0, 69,  0, 62,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_249[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0,  0,  0,  8,  0, 16,  0, 32,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_250[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0,  0,  0,  8,  0,  4,  0,  2,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_251[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0,  0,  0, 34,  0, 20,  0,  8,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_252[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0,  0,  0, 36,  0, 36,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_253[] = {  9,  0,  0, 60,  0, 66,  0,  2,  0, 58,  0, 70,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0,  0,  0, 16,  0,  8,  0,  4,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_254[] = {  9,  0,  0, 64,  0, 64,  0, 64,  0, 94,  0, 97,  0, 65,  0, 65,  0, 97,  0, 94,  0, 64,  0, 64,  0, 64,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Fixed9x15_Character_255[] = {  9,  0,  0, 60,  0, 66,  0,  2,  0, 58,  0, 70,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0,  0,  0, 36,  0, 36,  0,  0,  0,  0,  0};\r
-\r
-/* The font characters mapping: */\r
-static const GLubyte* Fixed9x15_Character_Map[] = {Fixed9x15_Character_000,Fixed9x15_Character_001,Fixed9x15_Character_002,Fixed9x15_Character_003,Fixed9x15_Character_004,Fixed9x15_Character_005,Fixed9x15_Character_006,Fixed9x15_Character_007,Fixed9x15_Character_008,Fixed9x15_Character_009,Fixed9x15_Character_010,Fixed9x15_Character_011,Fixed9x15_Character_012,Fixed9x15_Character_013,Fixed9x15_Character_014,Fixed9x15_Character_015,\r
-                                                   Fixed9x15_Character_016,Fixed9x15_Character_017,Fixed9x15_Character_018,Fixed9x15_Character_019,Fixed9x15_Character_020,Fixed9x15_Character_021,Fixed9x15_Character_022,Fixed9x15_Character_023,Fixed9x15_Character_024,Fixed9x15_Character_025,Fixed9x15_Character_026,Fixed9x15_Character_027,Fixed9x15_Character_028,Fixed9x15_Character_029,Fixed9x15_Character_030,Fixed9x15_Character_031,\r
-                                                   Fixed9x15_Character_032,Fixed9x15_Character_033,Fixed9x15_Character_034,Fixed9x15_Character_035,Fixed9x15_Character_036,Fixed9x15_Character_037,Fixed9x15_Character_038,Fixed9x15_Character_039,Fixed9x15_Character_040,Fixed9x15_Character_041,Fixed9x15_Character_042,Fixed9x15_Character_043,Fixed9x15_Character_044,Fixed9x15_Character_045,Fixed9x15_Character_046,Fixed9x15_Character_047,\r
-                                                   Fixed9x15_Character_048,Fixed9x15_Character_049,Fixed9x15_Character_050,Fixed9x15_Character_051,Fixed9x15_Character_052,Fixed9x15_Character_053,Fixed9x15_Character_054,Fixed9x15_Character_055,Fixed9x15_Character_056,Fixed9x15_Character_057,Fixed9x15_Character_058,Fixed9x15_Character_059,Fixed9x15_Character_060,Fixed9x15_Character_061,Fixed9x15_Character_062,Fixed9x15_Character_063,\r
-                                                   Fixed9x15_Character_064,Fixed9x15_Character_065,Fixed9x15_Character_066,Fixed9x15_Character_067,Fixed9x15_Character_068,Fixed9x15_Character_069,Fixed9x15_Character_070,Fixed9x15_Character_071,Fixed9x15_Character_072,Fixed9x15_Character_073,Fixed9x15_Character_074,Fixed9x15_Character_075,Fixed9x15_Character_076,Fixed9x15_Character_077,Fixed9x15_Character_078,Fixed9x15_Character_079,\r
-                                                   Fixed9x15_Character_080,Fixed9x15_Character_081,Fixed9x15_Character_082,Fixed9x15_Character_083,Fixed9x15_Character_084,Fixed9x15_Character_085,Fixed9x15_Character_086,Fixed9x15_Character_087,Fixed9x15_Character_088,Fixed9x15_Character_089,Fixed9x15_Character_090,Fixed9x15_Character_091,Fixed9x15_Character_092,Fixed9x15_Character_093,Fixed9x15_Character_094,Fixed9x15_Character_095,\r
-                                                   Fixed9x15_Character_096,Fixed9x15_Character_097,Fixed9x15_Character_098,Fixed9x15_Character_099,Fixed9x15_Character_100,Fixed9x15_Character_101,Fixed9x15_Character_102,Fixed9x15_Character_103,Fixed9x15_Character_104,Fixed9x15_Character_105,Fixed9x15_Character_106,Fixed9x15_Character_107,Fixed9x15_Character_108,Fixed9x15_Character_109,Fixed9x15_Character_110,Fixed9x15_Character_111,\r
-                                                   Fixed9x15_Character_112,Fixed9x15_Character_113,Fixed9x15_Character_114,Fixed9x15_Character_115,Fixed9x15_Character_116,Fixed9x15_Character_117,Fixed9x15_Character_118,Fixed9x15_Character_119,Fixed9x15_Character_120,Fixed9x15_Character_121,Fixed9x15_Character_122,Fixed9x15_Character_123,Fixed9x15_Character_124,Fixed9x15_Character_125,Fixed9x15_Character_126,Fixed9x15_Character_032,\r
-                                                   Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,\r
-                                                   Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,\r
-                                                   Fixed9x15_Character_160,Fixed9x15_Character_161,Fixed9x15_Character_162,Fixed9x15_Character_163,Fixed9x15_Character_164,Fixed9x15_Character_165,Fixed9x15_Character_166,Fixed9x15_Character_167,Fixed9x15_Character_168,Fixed9x15_Character_169,Fixed9x15_Character_170,Fixed9x15_Character_171,Fixed9x15_Character_172,Fixed9x15_Character_173,Fixed9x15_Character_174,Fixed9x15_Character_175,\r
-                                                   Fixed9x15_Character_176,Fixed9x15_Character_177,Fixed9x15_Character_178,Fixed9x15_Character_179,Fixed9x15_Character_180,Fixed9x15_Character_181,Fixed9x15_Character_182,Fixed9x15_Character_183,Fixed9x15_Character_184,Fixed9x15_Character_185,Fixed9x15_Character_186,Fixed9x15_Character_187,Fixed9x15_Character_188,Fixed9x15_Character_189,Fixed9x15_Character_190,Fixed9x15_Character_191,\r
-                                                   Fixed9x15_Character_192,Fixed9x15_Character_193,Fixed9x15_Character_194,Fixed9x15_Character_195,Fixed9x15_Character_196,Fixed9x15_Character_197,Fixed9x15_Character_198,Fixed9x15_Character_199,Fixed9x15_Character_200,Fixed9x15_Character_201,Fixed9x15_Character_202,Fixed9x15_Character_203,Fixed9x15_Character_204,Fixed9x15_Character_205,Fixed9x15_Character_206,Fixed9x15_Character_207,\r
-                                                   Fixed9x15_Character_208,Fixed9x15_Character_209,Fixed9x15_Character_210,Fixed9x15_Character_211,Fixed9x15_Character_212,Fixed9x15_Character_213,Fixed9x15_Character_214,Fixed9x15_Character_215,Fixed9x15_Character_216,Fixed9x15_Character_217,Fixed9x15_Character_218,Fixed9x15_Character_219,Fixed9x15_Character_220,Fixed9x15_Character_221,Fixed9x15_Character_222,Fixed9x15_Character_223,\r
-                                                   Fixed9x15_Character_224,Fixed9x15_Character_225,Fixed9x15_Character_226,Fixed9x15_Character_227,Fixed9x15_Character_228,Fixed9x15_Character_229,Fixed9x15_Character_230,Fixed9x15_Character_231,Fixed9x15_Character_232,Fixed9x15_Character_233,Fixed9x15_Character_234,Fixed9x15_Character_235,Fixed9x15_Character_236,Fixed9x15_Character_237,Fixed9x15_Character_238,Fixed9x15_Character_239,\r
-                                                   Fixed9x15_Character_240,Fixed9x15_Character_241,Fixed9x15_Character_242,Fixed9x15_Character_243,Fixed9x15_Character_244,Fixed9x15_Character_245,Fixed9x15_Character_246,Fixed9x15_Character_247,Fixed9x15_Character_248,Fixed9x15_Character_249,Fixed9x15_Character_250,Fixed9x15_Character_251,Fixed9x15_Character_252,Fixed9x15_Character_253,Fixed9x15_Character_254,Fixed9x15_Character_255,NULL};\r
-\r
-/* The font structure: */\r
-const SFG_Font fgFontFixed9x15 = { "-misc-fixed-medium-r-normal--15-140-75-75-C-90-iso8859-1", 256, 16, Fixed9x15_Character_Map, 0, 4 };\r
-\r
-static const GLubyte Helvetica10_Character_000[] = {  8,  0,  0,  0, 84,  0, 68,  0, 68,  0, 84,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_001[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_002[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_003[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_004[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_005[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_006[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_007[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_008[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_009[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_010[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_011[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_012[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_013[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_014[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_015[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_016[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_017[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_018[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_019[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_020[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_021[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_022[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_023[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_024[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_025[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_026[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_027[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_028[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_029[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_030[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_031[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_032[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_033[] = {  3,  0,  0,  0, 64,  0, 64, 64, 64, 64, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_034[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0, 80, 80,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_035[] = {  6,  0,  0,  0, 80, 80,248, 40,124, 40, 40,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_036[] = {  6,  0,  0, 32,112,168, 40,112,160,168,112, 32,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_037[] = {  9,  0,  0,  0,  0,  0,  0, 38,  0, 41,  0, 22,  0, 16,  0,  8,  0,104,  0,148,  0,100,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_038[] = {  8,  0,  0,  0, 50, 76, 76, 82, 48, 40, 40, 16,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_039[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0, 64, 32, 32,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_040[] = {  4,  0, 32, 64, 64,128,128,128,128, 64, 64, 32,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_041[] = {  4,  0, 64, 32, 32, 16, 16, 16, 16, 32, 32, 64,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_042[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,160, 64,160,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_043[] = {  6,  0,  0,  0,  0, 32, 32,248, 32, 32,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_044[] = {  3,  0,128, 64, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_045[] = {  7,  0,  0,  0,  0,  0,  0,124,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_046[] = {  3,  0,  0,  0, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_047[] = {  3,  0,  0,  0,128,128, 64, 64, 64, 64, 32, 32,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_048[] = {  6,  0,  0,  0,112,136,136,136,136,136,136,112,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_049[] = {  6,  0,  0,  0, 32, 32, 32, 32, 32, 32, 96, 32,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_050[] = {  6,  0,  0,  0,248,128, 64, 48,  8,  8,136,112,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_051[] = {  6,  0,  0,  0,112,136,  8,  8, 48,  8,136,112,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_052[] = {  6,  0,  0,  0, 16, 16,248,144, 80, 80, 48, 16,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_053[] = {  6,  0,  0,  0,112,136,  8,  8,240,128,128,248,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_054[] = {  6,  0,  0,  0,112,136,136,200,176,128,136,112,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_055[] = {  6,  0,  0,  0, 64, 64, 32, 32, 16, 16,  8,248,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_056[] = {  6,  0,  0,  0,112,136,136,136,112,136,136,112,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_057[] = {  6,  0,  0,  0,112,136,  8,104,152,136,136,112,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_058[] = {  3,  0,  0,  0, 64,  0,  0,  0,  0, 64,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_059[] = {  3,  0,128, 64, 64,  0,  0,  0,  0, 64,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_060[] = {  6,  0,  0,  0,  0, 16, 32, 64, 32, 16,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_061[] = {  5,  0,  0,  0,  0,  0,240,  0,240,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_062[] = {  6,  0,  0,  0,  0, 64, 32, 16, 32, 64,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_063[] = {  6,  0,  0,  0, 32,  0, 32, 32, 16,  8, 72, 48,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_064[] = { 11,  0,  0, 62,  0, 64,  0,155,  0,164,128,164,128,162, 64,146, 64, 77, 64, 32,128, 31,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_065[] = {  7,  0,  0,  0,130,130,124, 68, 40, 40, 16, 16,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_066[] = {  7,  0,  0,  0,120, 68, 68, 68,120, 68, 68,120,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_067[] = {  8,  0,  0,  0, 60, 66, 64, 64, 64, 64, 66, 60,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_068[] = {  8,  0,  0,  0,120, 68, 66, 66, 66, 66, 68,120,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_069[] = {  7,  0,  0,  0,124, 64, 64, 64,124, 64, 64,124,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_070[] = {  6,  0,  0,  0, 64, 64, 64, 64,120, 64, 64,124,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_071[] = {  8,  0,  0,  0, 58, 70, 66, 70, 64, 64, 66, 60,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_072[] = {  8,  0,  0,  0, 66, 66, 66, 66,126, 66, 66, 66,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_073[] = {  3,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_074[] = {  5,  0,  0,  0, 96,144, 16, 16, 16, 16, 16, 16,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_075[] = {  7,  0,  0,  0, 68, 68, 72, 72,112, 80, 72, 68,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_076[] = {  6,  0,  0,  0,120, 64, 64, 64, 64, 64, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_077[] = {  9,  0,  0,  0,  0,  0,  0, 73,  0, 73,  0, 73,  0, 85,  0, 85,  0, 99,  0, 99,  0, 65,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_078[] = {  8,  0,  0,  0, 70, 70, 74, 74, 82, 82, 98, 98,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_079[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 60,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_080[] = {  7,  0,  0,  0, 64, 64, 64, 64,120, 68, 68,120,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_081[] = {  8,  0,  0,  1, 62, 70, 74, 66, 66, 66, 66, 60,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_082[] = {  7,  0,  0,  0, 68, 68, 68, 68,120, 68, 68,120,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_083[] = {  7,  0,  0,  0, 56, 68, 68,  4, 56, 64, 68, 56,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_084[] = {  5,  0,  0,  0, 32, 32, 32, 32, 32, 32, 32,248,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_085[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_086[] = {  7,  0,  0,  0, 16, 40, 40, 68, 68, 68,130,130,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_087[] = {  9,  0,  0,  0,  0,  0,  0, 34,  0, 34,  0, 34,  0, 85,  0, 73,  0, 73,  0,136,128,136,128,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_088[] = {  7,  0,  0,  0, 68, 68, 40, 40, 16, 40, 68, 68,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_089[] = {  7,  0,  0,  0, 16, 16, 16, 40, 40, 68, 68,130,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_090[] = {  7,  0,  0,  0,124, 64, 32, 16, 16,  8,  4,124,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_091[] = {  3,  0, 96, 64, 64, 64, 64, 64, 64, 64, 64, 96,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_092[] = {  3,  0,  0,  0, 32, 32, 64, 64, 64, 64,128,128,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_093[] = {  3,  0,192, 64, 64, 64, 64, 64, 64, 64, 64,192,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_094[] = {  6,  0,  0,  0,  0,  0,  0,136, 80, 80, 32, 32,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_095[] = {  6,  0,252,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_096[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0, 63, 64, 32,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_097[] = {  5,  0,  0,  0,104,144,144,112, 16,224,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_098[] = {  6,  0,  0,  0,176,200,136,136,200,176,128,128,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_099[] = {  5,  0,  0,  0, 96,144,128,128,144, 96,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_100[] = {  6,  0,  0,  0,104,152,136,136,152,104,  8,  8,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_101[] = {  5,  0,  0,  0, 96,144,128,240,144, 96,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_102[] = {  4,  0,  0,  0, 64, 64, 64, 64, 64,224, 64, 48,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_103[] = {  6,  0,112,  8,104,152,136,136,152,104,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_104[] = {  6,  0,  0,  0,136,136,136,136,200,176,128,128,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_105[] = {  2,  0,  0,  0,128,128,128,128,128,128,  0,128,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_106[] = {  2,  0,  0,128,128,128,128,128,128,128,  0,128,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_107[] = {  5,  0,  0,  0,144,144,160,192,160,144,128,128,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_108[] = {  2,  0,  0,  0,128,128,128,128,128,128,128,128,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_109[] = {  8,  0,  0,  0,146,146,146,146,146,236,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_110[] = {  6,  0,  0,  0,136,136,136,136,200,176,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_111[] = {  6,  0,  0,  0,112,136,136,136,136,112,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_112[] = {  6,  0,128,128,176,200,136,136,200,176,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_113[] = {  6,  0,  8,  8,104,152,136,136,152,104,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_114[] = {  4,  0,  0,  0,128,128,128,128,192,160,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_115[] = {  5,  0,  0,  0, 96,144, 16, 96,144, 96,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_116[] = {  4,  0,  0,  0, 96, 64, 64, 64, 64,224, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_117[] = {  5,  0,  0,  0,112,144,144,144,144,144,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_118[] = {  6,  0,  0,  0, 32, 32, 80, 80,136,136,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_119[] = {  8,  0,  0,  0, 40, 40, 84, 84,146,146,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_120[] = {  6,  0,  0,  0,136,136, 80, 32, 80,136,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_121[] = {  5,  0,128, 64, 64, 96,160,160,144,144,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_122[] = {  5,  0,  0,  0,240,128, 64, 32, 16,240,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_123[] = {  3,  0, 32, 64, 64, 64, 64,128, 64, 64, 64, 32,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_124[] = {  3,  0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_125[] = {  3,  0,128, 64, 64, 64, 64, 32, 64, 64, 64,128,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_126[] = {  7,  0,  0,  0,  0,  0,  0,152,100,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_127[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_128[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_129[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_130[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_131[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_132[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_133[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_134[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_135[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_136[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_137[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_138[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_139[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_140[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_141[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_142[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_143[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_144[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_145[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_146[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_147[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_148[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_149[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_150[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_151[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_152[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_153[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_154[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_155[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_156[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_157[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_158[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_159[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_160[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_161[] = {  3,  0, 64, 64, 64, 64, 64, 64,  0, 64,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_162[] = {  6,  0,  0, 64,112,168,160,160,168,112, 16,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_163[] = {  6,  0,  0,  0,176, 72, 64, 64,224, 64, 72, 48,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_164[] = {  5,  0,  0,  0,  0,144, 96,144,144, 96,144,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_165[] = {  6,  0,  0,  0, 32,248, 32,248, 80, 80,136,136,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_166[] = {  3,  0, 64, 64, 64, 64,  0,  0, 64, 64, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_167[] = {  6,  0,112,136, 24,112,200,152,112,192,136,112,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_168[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,160,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_169[] = {  9,  0,  0,  0,  0,  0,  0, 28,  0, 34,  0, 77,  0, 81,  0, 77,  0, 34,  0, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_170[] = {  4,  0,  0,  0,  0,  0,  0,224,  0,160, 32,224,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_171[] = {  6,  0,  0,  0, 40, 80,160, 80, 40,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_172[] = {  7,  0,  0,  0,  0,  0,  4,  4,124,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_173[] = {  4,  0,  0,  0,  0,  0,  0,224,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_174[] = {  9,  0,  0,  0,  0,  0,  0, 28,  0, 34,  0, 85,  0, 89,  0, 93,  0, 34,  0, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_175[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,224,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_176[] = {  4,  0,  0,  0,  0,  0,  0, 96,144,144, 96,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_177[] = {  6,  0,  0,  0,248,  0, 32, 32,248, 32, 32,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_178[] = {  3,  0,  0,  0,  0,  0,  0,224, 64,160, 96,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_179[] = {  3,  0,  0,  0,  0,  0,  0,192, 32, 64,224,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_180[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,128, 64,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_181[] = {  5,  0,128,128,240,144,144,144,144,144,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_182[] = {  6,  0, 40, 40, 40, 40, 40,104,232,232,232,124,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_183[] = {  3,  0,  0,  0,  0,  0,  0,192,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_184[] = {  3,  0,192, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_185[] = {  3,  0,  0,  0,  0,  0,  0, 64, 64,192, 64,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_186[] = {  4,  0,  0,  0,  0,  0,  0,224,  0,224,160,224,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_187[] = {  6,  0,  0,  0,160, 80, 40, 80,160,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_188[] = {  9,  0,  0,  0,  0,  0,  0, 33,  0, 23,128, 19,  0,  9,  0, 72,  0, 68,  0,196,  0, 66,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_189[] = {  9,  0,  0,  0,  0,  0,  0, 39,  0, 18,  0, 21,  0, 11,  0, 72,  0, 68,  0,196,  0, 66,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_190[] = {  9,  0,  0,  0,  0,  0,  0, 33,  0, 23,128, 19,  0,  9,  0,200,  0, 36,  0, 68,  0,226,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_191[] = {  6,  0, 48, 72, 64, 32, 16, 16,  0, 16,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_192[] = {  7,  0,  0,  0,130,130,124, 68, 40, 40, 16, 16,  0, 16, 32};\r
-static const GLubyte Helvetica10_Character_193[] = {  7,  0,  0,  0,130,130,124, 68, 40, 40, 16, 16,  0, 16,  8};\r
-static const GLubyte Helvetica10_Character_194[] = {  7,  0,  0,  0,130,130,124, 68, 40, 40, 16, 16,  0, 40, 16};\r
-static const GLubyte Helvetica10_Character_195[] = {  7,  0,  0,  0,130,130,124, 68, 40, 40, 16, 16,  0, 40, 20};\r
-static const GLubyte Helvetica10_Character_196[] = {  7,  0,  0,  0,130,130,124, 68, 40, 40, 16, 16,  0, 40,  0};\r
-static const GLubyte Helvetica10_Character_197[] = {  7,  0,  0,  0,130,130,124, 68, 40, 40, 16, 16, 16, 40, 16};\r
-static const GLubyte Helvetica10_Character_198[] = { 10,  0,  0,  0,  0,  0,  0,143,128,136,  0,120,  0, 72,  0, 47,128, 40,  0, 24,  0, 31,128,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_199[] = {  8,  0, 24,  8, 60, 66, 64, 64, 64, 64, 66, 60,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_200[] = {  7,  0,  0,  0,124, 64, 64, 64,124, 64, 64,124,  0, 16, 32};\r
-static const GLubyte Helvetica10_Character_201[] = {  7,  0,  0,  0,124, 64, 64, 64,124, 64, 64,124,  0, 16,  8};\r
-static const GLubyte Helvetica10_Character_202[] = {  7,  0,  0,  0,124, 64, 64,124, 64, 64, 64,124,  0, 40, 16};\r
-static const GLubyte Helvetica10_Character_203[] = {  7,  0,  0,  0,124, 64, 64, 64,124, 64, 64,124,  0, 40,  0};\r
-static const GLubyte Helvetica10_Character_204[] = {  3,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64,  0, 64,128};\r
-static const GLubyte Helvetica10_Character_205[] = {  3,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64,  0, 64, 32};\r
-static const GLubyte Helvetica10_Character_206[] = {  3,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64,  0,160, 64};\r
-static const GLubyte Helvetica10_Character_207[] = {  3,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64,  0,160,  0};\r
-static const GLubyte Helvetica10_Character_208[] = {  8,  0,  0,  0,120, 68, 66, 66,242, 66, 68,120,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_209[] = {  8,  0,  0,  0, 70, 70, 74, 74, 82, 82, 98, 98,  0, 40, 20};\r
-static const GLubyte Helvetica10_Character_210[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 60,  0,  8, 16};\r
-static const GLubyte Helvetica10_Character_211[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 60,  0,  8,  4};\r
-static const GLubyte Helvetica10_Character_212[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 60,  0, 20,  8};\r
-static const GLubyte Helvetica10_Character_213[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 60,  0, 40, 20};\r
-static const GLubyte Helvetica10_Character_214[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 60,  0, 36,  0};\r
-static const GLubyte Helvetica10_Character_215[] = {  6,  0,  0,  0,  0,136, 80, 32, 80,136,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_216[] = {  8,  0,  0, 64, 60, 98, 82, 82, 74, 74, 70, 60,  2,  0,  0};\r
-static const GLubyte Helvetica10_Character_217[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66,  0,  8, 16};\r
-static const GLubyte Helvetica10_Character_218[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66,  0, 16,  8};\r
-static const GLubyte Helvetica10_Character_219[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66,  0, 20,  8};\r
-static const GLubyte Helvetica10_Character_220[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66,  0, 36,  0};\r
-static const GLubyte Helvetica10_Character_221[] = {  7,  0,  0,  0, 16, 16, 16, 40, 40, 68, 68,130,  0, 16,  8};\r
-static const GLubyte Helvetica10_Character_222[] = {  7,  0,  0,  0, 64, 64,120, 68, 68,120, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_223[] = {  5,  0,  0,  0,160,144,144,144,160,144,144, 96,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_224[] = {  5,  0,  0,  0,104,144,144,112, 16,224,  0, 32, 64,  0,  0};\r
-static const GLubyte Helvetica10_Character_225[] = {  5,  0,  0,  0,104,144,144,112, 16,224,  0, 32, 16,  0,  0};\r
-static const GLubyte Helvetica10_Character_226[] = {  5,  0,  0,  0,104,144,144,112, 16,224,  0, 80, 32,  0,  0};\r
-static const GLubyte Helvetica10_Character_227[] = {  5,  0,  0,  0,104,144,144,112, 16,224,  0,160, 80,  0,  0};\r
-static const GLubyte Helvetica10_Character_228[] = {  5,  0,  0,  0,104,144,144,112, 16,224,  0, 80,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_229[] = {  5,  0,  0,  0,104,144,144,112, 16,224, 32, 80, 32,  0,  0};\r
-static const GLubyte Helvetica10_Character_230[] = {  8,  0,  0,  0,108,146,144,126, 18,236,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_231[] = {  5,  0, 96, 32, 96,144,128,128,144, 96,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_232[] = {  5,  0,  0,  0, 96,144,128,240,144, 96,  0, 32, 64,  0,  0};\r
-static const GLubyte Helvetica10_Character_233[] = {  5,  0,  0,  0, 96,144,128,240,144, 96,  0, 64, 32,  0,  0};\r
-static const GLubyte Helvetica10_Character_234[] = {  5,  0,  0,  0, 96,144,128,240,144, 96,  0, 80, 32,  0,  0};\r
-static const GLubyte Helvetica10_Character_235[] = {  5,  0,  0,  0, 96,144,128,240,144, 96,  0, 80,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_236[] = {  2,  0,  0,  0,128,128,128,128,128,128,  0,128,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_237[] = {  2,  0,  0,  0,128,128,128,128,128,128,  0,128, 64,  0,  0};\r
-static const GLubyte Helvetica10_Character_238[] = {  2,  0,  0,  0,128,128,128,128,128,128,  0, 64,128,  0,  0};\r
-static const GLubyte Helvetica10_Character_239[] = {  2,  0,  0,  0, 64, 64, 64, 64, 64, 64,  0,160,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_240[] = {  6,  0,  0,  0,112,136,136,136,136,120,144, 96, 80,  0,  0};\r
-static const GLubyte Helvetica10_Character_241[] = {  5,  0,  0,  0,144,144,144,144,144,224,  0,160, 80,  0,  0};\r
-static const GLubyte Helvetica10_Character_242[] = {  6,  0,  0,  0,112,136,136,136,136,112,  0, 32, 64,  0,  0};\r
-static const GLubyte Helvetica10_Character_243[] = {  6,  0,  0,  0,112,136,136,136,136,112,  0, 32, 16,  0,  0};\r
-static const GLubyte Helvetica10_Character_244[] = {  6,  0,  0,  0,112,136,136,136,136,112,  0, 80, 32,  0,  0};\r
-static const GLubyte Helvetica10_Character_245[] = {  6,  0,  0,  0,112,136,136,136,136,112,  0, 80, 40,  0,  0};\r
-static const GLubyte Helvetica10_Character_246[] = {  6,  0,  0,  0,112,136,136,136,136,112,  0, 80,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_247[] = {  6,  0,  0,  0,  0, 32,  0,248,  0, 32,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_248[] = {  6,  0,  0,  0,112,136,200,168,152,116,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_249[] = {  5,  0,  0,  0,112,144,144,144,144,144,  0, 32, 64,  0,  0};\r
-static const GLubyte Helvetica10_Character_250[] = {  5,  0,  0,  0,112,144,144,144,144,144,  0, 64, 32,  0,  0};\r
-static const GLubyte Helvetica10_Character_251[] = {  5,  0,  0,  0,112,144,144,144,144,144,  0, 80, 32,  0,  0};\r
-static const GLubyte Helvetica10_Character_252[] = {  5,  0,  0,  0,112,144,144,144,144,144,  0, 80,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_253[] = {  5,  0,128, 64, 64, 96,160,160,144,144,  0, 32, 16,  0,  0};\r
-static const GLubyte Helvetica10_Character_254[] = {  6,  0,128,128,176,200,136,136,200,176,128,128,  0,  0,  0};\r
-static const GLubyte Helvetica10_Character_255[] = {  5,  0,128, 64, 64, 96,160,160,144,144,  0, 80,  0,  0,  0};\r
-\r
-/* The font characters mapping: */\r
-static const GLubyte* Helvetica10_Character_Map[] = {Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,\r
-                                                     Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,\r
-                                                     Helvetica10_Character_032,Helvetica10_Character_033,Helvetica10_Character_034,Helvetica10_Character_035,Helvetica10_Character_036,Helvetica10_Character_037,Helvetica10_Character_038,Helvetica10_Character_039,Helvetica10_Character_040,Helvetica10_Character_041,Helvetica10_Character_042,Helvetica10_Character_043,Helvetica10_Character_044,Helvetica10_Character_045,Helvetica10_Character_046,Helvetica10_Character_047,\r
-                                                     Helvetica10_Character_048,Helvetica10_Character_049,Helvetica10_Character_050,Helvetica10_Character_051,Helvetica10_Character_052,Helvetica10_Character_053,Helvetica10_Character_054,Helvetica10_Character_055,Helvetica10_Character_056,Helvetica10_Character_057,Helvetica10_Character_058,Helvetica10_Character_059,Helvetica10_Character_060,Helvetica10_Character_061,Helvetica10_Character_062,Helvetica10_Character_063,\r
-                                                     Helvetica10_Character_064,Helvetica10_Character_065,Helvetica10_Character_066,Helvetica10_Character_067,Helvetica10_Character_068,Helvetica10_Character_069,Helvetica10_Character_070,Helvetica10_Character_071,Helvetica10_Character_072,Helvetica10_Character_073,Helvetica10_Character_074,Helvetica10_Character_075,Helvetica10_Character_076,Helvetica10_Character_077,Helvetica10_Character_078,Helvetica10_Character_079,\r
-                                                     Helvetica10_Character_080,Helvetica10_Character_081,Helvetica10_Character_082,Helvetica10_Character_083,Helvetica10_Character_084,Helvetica10_Character_085,Helvetica10_Character_086,Helvetica10_Character_087,Helvetica10_Character_088,Helvetica10_Character_089,Helvetica10_Character_090,Helvetica10_Character_091,Helvetica10_Character_092,Helvetica10_Character_093,Helvetica10_Character_094,Helvetica10_Character_095,\r
-                                                     Helvetica10_Character_096,Helvetica10_Character_097,Helvetica10_Character_098,Helvetica10_Character_099,Helvetica10_Character_100,Helvetica10_Character_101,Helvetica10_Character_102,Helvetica10_Character_103,Helvetica10_Character_104,Helvetica10_Character_105,Helvetica10_Character_106,Helvetica10_Character_107,Helvetica10_Character_108,Helvetica10_Character_109,Helvetica10_Character_110,Helvetica10_Character_111,\r
-                                                     Helvetica10_Character_112,Helvetica10_Character_113,Helvetica10_Character_114,Helvetica10_Character_115,Helvetica10_Character_116,Helvetica10_Character_117,Helvetica10_Character_118,Helvetica10_Character_119,Helvetica10_Character_120,Helvetica10_Character_121,Helvetica10_Character_122,Helvetica10_Character_123,Helvetica10_Character_124,Helvetica10_Character_125,Helvetica10_Character_126,Helvetica10_Character_032,\r
-                                                     Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,\r
-                                                     Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,\r
-                                                     Helvetica10_Character_160,Helvetica10_Character_161,Helvetica10_Character_162,Helvetica10_Character_163,Helvetica10_Character_164,Helvetica10_Character_165,Helvetica10_Character_166,Helvetica10_Character_167,Helvetica10_Character_168,Helvetica10_Character_169,Helvetica10_Character_170,Helvetica10_Character_171,Helvetica10_Character_172,Helvetica10_Character_173,Helvetica10_Character_174,Helvetica10_Character_175,\r
-                                                     Helvetica10_Character_176,Helvetica10_Character_177,Helvetica10_Character_178,Helvetica10_Character_179,Helvetica10_Character_180,Helvetica10_Character_181,Helvetica10_Character_182,Helvetica10_Character_183,Helvetica10_Character_184,Helvetica10_Character_185,Helvetica10_Character_186,Helvetica10_Character_187,Helvetica10_Character_188,Helvetica10_Character_189,Helvetica10_Character_190,Helvetica10_Character_191,\r
-                                                     Helvetica10_Character_192,Helvetica10_Character_193,Helvetica10_Character_194,Helvetica10_Character_195,Helvetica10_Character_196,Helvetica10_Character_197,Helvetica10_Character_198,Helvetica10_Character_199,Helvetica10_Character_200,Helvetica10_Character_201,Helvetica10_Character_202,Helvetica10_Character_203,Helvetica10_Character_204,Helvetica10_Character_205,Helvetica10_Character_206,Helvetica10_Character_207,\r
-                                                     Helvetica10_Character_208,Helvetica10_Character_209,Helvetica10_Character_210,Helvetica10_Character_211,Helvetica10_Character_212,Helvetica10_Character_213,Helvetica10_Character_214,Helvetica10_Character_215,Helvetica10_Character_216,Helvetica10_Character_217,Helvetica10_Character_218,Helvetica10_Character_219,Helvetica10_Character_220,Helvetica10_Character_221,Helvetica10_Character_222,Helvetica10_Character_223,\r
-                                                     Helvetica10_Character_224,Helvetica10_Character_225,Helvetica10_Character_226,Helvetica10_Character_227,Helvetica10_Character_228,Helvetica10_Character_229,Helvetica10_Character_230,Helvetica10_Character_231,Helvetica10_Character_232,Helvetica10_Character_233,Helvetica10_Character_234,Helvetica10_Character_235,Helvetica10_Character_236,Helvetica10_Character_237,Helvetica10_Character_238,Helvetica10_Character_239,\r
-                                                     Helvetica10_Character_240,Helvetica10_Character_241,Helvetica10_Character_242,Helvetica10_Character_243,Helvetica10_Character_244,Helvetica10_Character_245,Helvetica10_Character_246,Helvetica10_Character_247,Helvetica10_Character_248,Helvetica10_Character_249,Helvetica10_Character_250,Helvetica10_Character_251,Helvetica10_Character_252,Helvetica10_Character_253,Helvetica10_Character_254,Helvetica10_Character_255,NULL};\r
-\r
-/* The font structure: */\r
-const SFG_Font fgFontHelvetica10 = { "-adobe-helvetica-medium-r-normal--10-100-75-75-p-56-iso8859-1", 256, 14, Helvetica10_Character_Map, 0, 3 };\r
-\r
-static const GLubyte Helvetica12_Character_000[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_001[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_002[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_003[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_004[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_005[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_006[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_007[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_008[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_009[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_010[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_011[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_012[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_013[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_014[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_015[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_016[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_017[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_018[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_019[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_020[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_021[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_022[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_023[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_024[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_025[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_026[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_027[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_028[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_029[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_030[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_031[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_032[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_033[] = {  3,  0,  0,  0,  0, 64,  0, 64, 64, 64, 64, 64, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_034[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 80, 80, 80,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_035[] = {  7,  0,  0,  0,  0, 80, 80, 80,252, 40,252, 40, 40,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_036[] = {  7,  0,  0,  0, 16, 56, 84, 84, 20, 56, 80, 84, 56, 16,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_037[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0, 17,128, 10, 64, 10, 64,  9,128,  4,  0, 52,  0, 74,  0, 74,  0, 49,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_038[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 57,  0, 70,  0, 66,  0, 69,  0, 40,  0, 24,  0, 36,  0, 36,  0, 24,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_039[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 64, 32, 96,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_040[] = {  4,  0, 16, 32, 32, 64, 64, 64, 64, 64, 64, 32, 32, 16,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_041[] = {  4,  0,128, 64, 64, 32, 32, 32, 32, 32, 32, 64, 64,128,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_042[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 80, 32, 80,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_043[] = {  7,  0,  0,  0,  0,  0, 16, 16,124, 16, 16,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_044[] = {  4,  0,  0, 64, 32, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_045[] = {  8,  0,  0,  0,  0,  0,  0,  0,124,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_046[] = {  3,  0,  0,  0,  0, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_047[] = {  4,  0,  0,  0,  0,128,128, 64, 64, 64, 32, 32, 16, 16,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_048[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 68, 68, 68, 56,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_049[] = {  7,  0,  0,  0,  0, 16, 16, 16, 16, 16, 16, 16,112, 16,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_050[] = {  7,  0,  0,  0,  0,124, 64, 64, 32, 16,  8,  4, 68, 56,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_051[] = {  7,  0,  0,  0,  0, 56, 68, 68,  4,  4, 24,  4, 68, 56,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_052[] = {  7,  0,  0,  0,  0,  8,  8,252,136, 72, 40, 40, 24,  8,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_053[] = {  7,  0,  0,  0,  0, 56, 68, 68,  4,  4,120, 64, 64,124,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_054[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68,100, 88, 64, 68, 56,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_055[] = {  7,  0,  0,  0,  0, 32, 32, 16, 16, 16,  8,  8,  4,124,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_056[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 56, 68, 68, 56,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_057[] = {  7,  0,  0,  0,  0, 56, 68,  4,  4, 60, 68, 68, 68, 56,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_058[] = {  3,  0,  0,  0,  0, 64,  0,  0,  0,  0, 64,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_059[] = {  3,  0,  0,128, 64, 64,  0,  0,  0,  0, 64,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_060[] = {  7,  0,  0,  0,  0,  0, 12, 48,192, 48, 12,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_061[] = {  7,  0,  0,  0,  0,  0,  0,124,  0,124,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_062[] = {  7,  0,  0,  0,  0,  0, 96, 24,  6, 24, 96,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_063[] = {  7,  0,  0,  0,  0, 16,  0, 16, 16,  8,  8, 68, 68, 56,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_064[] = { 12,  0,  0,  0,  0,  0,  0, 31,  0, 32,  0, 77,128, 83, 64, 81, 32, 81, 32, 73, 32, 38,160, 48, 64, 15,128,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_065[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 62,  0, 34,  0, 34,  0, 20,  0, 20,  0,  8,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_066[] = {  8,  0,  0,  0,  0,124, 66, 66, 66,124, 66, 66, 66,124,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_067[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 33,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 33,  0, 30,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_068[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,124,  0, 66,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 66,  0,124,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_069[] = {  8,  0,  0,  0,  0,126, 64, 64, 64,126, 64, 64, 64,126,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_070[] = {  8,  0,  0,  0,  0, 64, 64, 64, 64,124, 64, 64, 64,126,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_071[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 29,  0, 35,  0, 65,  0, 65,  0, 71,  0, 64,  0, 64,  0, 33,  0, 30,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_072[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_073[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_074[] = {  7,  0,  0,  0,  0, 56, 68, 68,  4,  4,  4,  4,  4,  4,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_075[] = {  8,  0,  0,  0,  0, 65, 66, 68, 72,112, 80, 72, 68, 66,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_076[] = {  7,  0,  0,  0,  0,124, 64, 64, 64, 64, 64, 64, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_077[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0, 68, 64, 68, 64, 74, 64, 74, 64, 81, 64, 81, 64, 96,192, 96,192, 64, 64,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_078[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 67,  0, 69,  0, 69,  0, 73,  0, 81,  0, 81,  0, 97,  0, 65,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_079[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 33,  0, 64,128, 64,128, 64,128, 64,128, 64,128, 33,  0, 30,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_080[] = {  8,  0,  0,  0,  0, 64, 64, 64, 64,124, 66, 66, 66,124,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_081[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 30,128, 33,  0, 66,128, 68,128, 64,128, 64,128, 64,128, 33,  0, 30,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_082[] = {  8,  0,  0,  0,  0, 66, 66, 66, 68,124, 66, 66, 66,124,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_083[] = {  8,  0,  0,  0,  0, 60, 66, 66,  2, 12, 48, 64, 66, 60,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_084[] = {  7,  0,  0,  0,  0, 16, 16, 16, 16, 16, 16, 16, 16,254,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_085[] = {  8,  0,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66, 66,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_086[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0, 20,  0, 20,  0, 34,  0, 34,  0, 34,  0, 65,  0, 65,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_087[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0, 17,  0, 17,  0, 17,  0, 42,128, 42,128, 36,128, 68, 64, 68, 64, 68, 64,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_088[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 34,  0, 34,  0, 20,  0,  8,  0, 20,  0, 34,  0, 34,  0, 65,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_089[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0, 20,  0, 34,  0, 34,  0, 65,  0, 65,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_090[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 64,  0, 32,  0, 16,  0,  8,  0,  4,  0,  2,  0,  1,  0,127,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_091[] = {  3,  0, 96, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 96,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_092[] = {  4,  0,  0,  0,  0, 16, 16, 32, 32, 32, 64, 64,128,128,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_093[] = {  3,  0,192, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,192,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_094[] = {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,136, 80, 32,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_095[] = {  7,  0,  0,254,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_096[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192,128, 64,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_097[] = {  7,  0,  0,  0,  0, 58, 68, 68, 60,  4, 68, 56,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_098[] = {  7,  0,  0,  0,  0, 88,100, 68, 68, 68,100, 88, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_099[] = {  7,  0,  0,  0,  0, 56, 68, 64, 64, 64, 68, 56,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_100[] = {  7,  0,  0,  0,  0, 52, 76, 68, 68, 68, 76, 52,  4,  4,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_101[] = {  7,  0,  0,  0,  0, 56, 68, 64,124, 68, 68, 56,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_102[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64,224, 64, 48,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_103[] = {  7,  0, 56, 68,  4, 52, 76, 68, 68, 68, 76, 52,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_104[] = {  7,  0,  0,  0,  0, 68, 68, 68, 68, 68,100, 88, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_105[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64,  0, 64,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_106[] = {  3,  0,128, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0, 64,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_107[] = {  6,  0,  0,  0,  0, 68, 72, 80, 96, 96, 80, 72, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_108[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_109[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 73,  0, 73,  0, 73,  0, 73,  0, 73,  0,109,  0, 82,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_110[] = {  7,  0,  0,  0,  0, 68, 68, 68, 68, 68,100, 88,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_111[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 68, 56,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_112[] = {  7,  0, 64, 64, 64, 88,100, 68, 68, 68,100, 88,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_113[] = {  7,  0,  4,  4,  4, 52, 76, 68, 68, 68, 76, 52,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_114[] = {  4,  0,  0,  0,  0, 64, 64, 64, 64, 64, 96, 80,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_115[] = {  6,  0,  0,  0,  0, 48, 72,  8, 48, 64, 72, 48,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_116[] = {  3,  0,  0,  0,  0, 96, 64, 64, 64, 64, 64,224, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_117[] = {  7,  0,  0,  0,  0, 52, 76, 68, 68, 68, 68, 68,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_118[] = {  7,  0,  0,  0,  0, 16, 16, 40, 40, 68, 68, 68,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_119[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0, 34,  0, 85,  0, 73,  0, 73,  0,136,128,136,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_120[] = {  6,  0,  0,  0,  0,132,132, 72, 48, 48, 72,132,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_121[] = {  7,  0, 64, 32, 16, 16, 40, 40, 72, 68, 68, 68,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_122[] = {  6,  0,  0,  0,  0,120, 64, 32, 32, 16,  8,120,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_123[] = {  4,  0, 48, 64, 64, 64, 64, 64,128, 64, 64, 64, 64, 48,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_124[] = {  3,  0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_125[] = {  4,  0,192, 32, 32, 32, 32, 32, 16, 32, 32, 32, 32,192,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_126[] = {  7,  0,  0,  0,  0,  0,  0,  0,152,100,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_127[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_128[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_129[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_130[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_131[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_132[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_133[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_134[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_135[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_136[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_137[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_138[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_139[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_140[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_141[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_142[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_143[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_144[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_145[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_146[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_147[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_148[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_149[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_150[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_151[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_152[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_153[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_154[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_155[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_156[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_157[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_158[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_159[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_160[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_161[] = {  3,  0, 64, 64, 64, 64, 64, 64, 64, 64,  0, 64,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_162[] = {  7,  0,  0,  0, 32, 56,100, 80, 80, 80, 84, 56,  8,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_163[] = {  7,  0,  0,  0,  0, 88, 36, 16, 16,120, 32, 32, 36, 24,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_164[] = {  7,  0,  0,  0,  0,  0,132,120, 72, 72,120,132,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_165[] = {  7,  0,  0,  0,  0, 16, 16,124, 16,124, 16, 40, 68, 68,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_166[] = {  3,  0,  0, 64, 64, 64, 64,  0,  0,  0, 64, 64, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_167[] = {  6,  0,112,136,  8, 48, 72,136,136,144, 96,128,136,112,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_168[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,160,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_169[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 32,128, 78, 64, 81, 64, 80, 64, 81, 64, 78, 64, 32,128, 31,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_170[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,112,  0, 80, 16,112,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_171[] = {  7,  0,  0,  0,  0,  0, 20, 40, 80, 40, 20,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_172[] = {  8,  0,  0,  0,  0,  0,  0,  2,  2,  2,126,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_173[] = {  5,  0,  0,  0,  0,  0,  0,  0,240,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_174[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 32,128, 74, 64, 74, 64, 76, 64, 74, 64, 78, 64, 32,128, 31,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_175[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,240,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_176[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0, 96,144,144, 96,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_177[] = {  7,  0,  0,  0,  0,124,  0, 16, 16,124, 16, 16,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_178[] = {  4,  0,  0,  0,  0,  0,  0,  0,240, 64, 32,144, 96,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_179[] = {  4,  0,  0,  0,  0,  0,  0,  0,192, 32, 64, 32,224,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_180[] = {  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128, 64,  0,  0};\r
-static const GLubyte Helvetica12_Character_181[] = {  7,  0, 64, 64, 64,116, 76, 68, 68, 68, 68, 68,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_182[] = {  7,  0, 40, 40, 40, 40, 40, 40,104,232,232,232,104, 60,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_183[] = {  3,  0,  0,  0,  0,  0,  0,  0, 64,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_184[] = {  3,  0,192, 32, 32, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_185[] = {  4,  0,  0,  0,  0,  0,  0,  0, 32, 32, 32, 96, 32,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_186[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,112,  0,112, 80,112,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_187[] = {  7,  0,  0,  0,  0,  0, 80, 40, 20, 40, 80,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_188[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 39,128, 21,  0, 19,  0, 73,  0, 68,  0, 68,  0,194,  0, 65,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_189[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 71,128, 34,  0, 17,  0, 20,128, 75,  0, 72,  0, 68,  0,194,  0, 65,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_190[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 33,  0, 23,128, 21,  0, 11,  0,201,  0, 36,  0, 68,  0, 34,  0,225,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_191[] = {  7,  0, 56, 68, 68, 32, 32, 16, 16,  0, 16,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_192[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 62,  0, 34,  0, 34,  0, 20,  0,  8,  0,  8,  0,  0,  0,  8,  0, 16,  0};\r
-static const GLubyte Helvetica12_Character_193[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 62,  0, 34,  0, 34,  0, 20,  0,  8,  0,  8,  0,  0,  0,  8,  0,  4,  0};\r
-static const GLubyte Helvetica12_Character_194[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 62,  0, 34,  0, 34,  0, 20,  0,  8,  0,  8,  0,  0,  0, 20,  0,  8,  0};\r
-static const GLubyte Helvetica12_Character_195[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 62,  0, 34,  0, 34,  0, 20,  0,  8,  0,  8,  0,  0,  0, 20,  0, 10,  0};\r
-static const GLubyte Helvetica12_Character_196[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 62,  0, 34,  0, 34,  0, 20,  0,  8,  0,  8,  0,  0,  0, 20,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_197[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 62,  0, 34,  0, 34,  0, 20,  0,  8,  0,  8,  0,  8,  0, 20,  0,  8,  0};\r
-static const GLubyte Helvetica12_Character_198[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0, 71,192, 68,  0, 68,  0, 60,  0, 39,192, 36,  0, 20,  0, 20,  0, 15,192,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_199[] = {  9,  0,  0, 24,  0,  4,  0,  4,  0, 30,  0, 33,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 33,  0, 30,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_200[] = {  8,  0,  0,  0,  0,126, 64, 64, 64,126, 64, 64, 64,126,  0,  8, 16};\r
-static const GLubyte Helvetica12_Character_201[] = {  8,  0,  0,  0,  0,126, 64, 64, 64,126, 64, 64, 64,126,  0,  8,  4};\r
-static const GLubyte Helvetica12_Character_202[] = {  8,  0,  0,  0,  0,126, 64, 64, 64,126, 64, 64, 64,126,  0, 20,  8};\r
-static const GLubyte Helvetica12_Character_203[] = {  8,  0,  0,  0,  0,126, 64, 64, 64,126, 64, 64, 64,126,  0, 20,  0};\r
-static const GLubyte Helvetica12_Character_204[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0, 64,128};\r
-static const GLubyte Helvetica12_Character_205[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0, 64, 32};\r
-static const GLubyte Helvetica12_Character_206[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0,160, 64};\r
-static const GLubyte Helvetica12_Character_207[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0,160,  0};\r
-static const GLubyte Helvetica12_Character_208[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,124,  0, 66,  0, 65,  0, 65,  0,241,  0, 65,  0, 65,  0, 66,  0,124,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_209[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 67,  0, 69,  0, 69,  0, 73,  0, 81,  0, 81,  0, 97,  0, 65,  0,  0,  0, 20,  0, 10,  0};\r
-static const GLubyte Helvetica12_Character_210[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 33,  0, 64,128, 64,128, 64,128, 64,128, 64,128, 33,  0, 30,  0,  0,  0,  4,  0,  8,  0};\r
-static const GLubyte Helvetica12_Character_211[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 33,  0, 64,128, 64,128, 64,128, 64,128, 64,128, 33,  0, 30,  0,  0,  0,  4,  0,  2,  0};\r
-static const GLubyte Helvetica12_Character_212[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 33,  0, 64,128, 64,128, 64,128, 64,128, 64,128, 33,  0, 30,  0,  0,  0, 10,  0,  4,  0};\r
-static const GLubyte Helvetica12_Character_213[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 33,  0, 64,128, 64,128, 64,128, 64,128, 64,128, 33,  0, 30,  0,  0,  0, 20,  0, 10,  0};\r
-static const GLubyte Helvetica12_Character_214[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 33,  0, 64,128, 64,128, 64,128, 64,128, 64,128, 33,  0, 30,  0,  0,  0, 18,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_215[] = {  7,  0,  0,  0,  0,  0, 68, 40, 16, 40, 68,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_216[] = { 10,  0,  0,  0,  0,  0,  0,128,  0, 94,  0, 33,  0, 80,128, 72,128, 68,128, 68,128, 66,128, 33,  0, 30,128,  0, 64,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_217[] = {  8,  0,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66, 66,  0,  8, 16};\r
-static const GLubyte Helvetica12_Character_218[] = {  8,  0,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66, 66,  0,  8,  4};\r
-static const GLubyte Helvetica12_Character_219[] = {  8,  0,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66, 66,  0, 20,  8};\r
-static const GLubyte Helvetica12_Character_220[] = {  8,  0,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66, 66,  0, 36,  0};\r
-static const GLubyte Helvetica12_Character_221[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0, 20,  0, 34,  0, 34,  0, 65,  0, 65,  0,  0,  0,  8,  0,  4,  0};\r
-static const GLubyte Helvetica12_Character_222[] = {  8,  0,  0,  0,  0, 64, 64,124, 66, 66, 66,124, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_223[] = {  7,  0,  0,  0,  0, 88, 68, 68, 68, 88, 68, 68, 68, 56,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_224[] = {  7,  0,  0,  0,  0, 58, 68, 68, 60,  4, 68, 56,  0,  8, 16,  0,  0};\r
-static const GLubyte Helvetica12_Character_225[] = {  7,  0,  0,  0,  0, 58, 68, 68, 60,  4, 68, 56,  0, 16,  8,  0,  0};\r
-static const GLubyte Helvetica12_Character_226[] = {  7,  0,  0,  0,  0, 58, 68, 68, 60,  4, 68, 56,  0, 40, 16,  0,  0};\r
-static const GLubyte Helvetica12_Character_227[] = {  7,  0,  0,  0,  0, 58, 68, 68, 60,  4, 68, 56,  0, 40, 20,  0,  0};\r
-static const GLubyte Helvetica12_Character_228[] = {  7,  0,  0,  0,  0, 58, 68, 68, 60,  4, 68, 56,  0, 40,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_229[] = {  7,  0,  0,  0,  0, 58, 68, 68, 60,  4, 68, 56, 24, 36, 24,  0,  0};\r
-static const GLubyte Helvetica12_Character_230[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0, 59,128, 68, 64, 68,  0, 63,192,  4, 64, 68, 64, 59,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_231[] = {  7,  0, 48,  8, 16, 56, 68, 64, 64, 64, 68, 56,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_232[] = {  7,  0,  0,  0,  0, 56, 68, 64,124, 68, 68, 56,  0, 16, 32,  0,  0};\r
-static const GLubyte Helvetica12_Character_233[] = {  7,  0,  0,  0,  0, 56, 68, 64,124, 68, 68, 56,  0, 16,  8,  0,  0};\r
-static const GLubyte Helvetica12_Character_234[] = {  7,  0,  0,  0,  0, 56, 68, 64,124, 68, 68, 56,  0, 40, 16,  0,  0};\r
-static const GLubyte Helvetica12_Character_235[] = {  7,  0,  0,  0,  0, 56, 68, 64,124, 68, 68, 56,  0, 40,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_236[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64,  0, 64,128,  0,  0};\r
-static const GLubyte Helvetica12_Character_237[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64,  0, 64, 32,  0,  0};\r
-static const GLubyte Helvetica12_Character_238[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64,  0,160, 64,  0,  0};\r
-static const GLubyte Helvetica12_Character_239[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64,  0,160,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_240[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 60,  4, 40, 24, 52,  0,  0};\r
-static const GLubyte Helvetica12_Character_241[] = {  7,  0,  0,  0,  0, 68, 68, 68, 68, 68,100, 88,  0, 40, 20,  0,  0};\r
-static const GLubyte Helvetica12_Character_242[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 68, 56,  0, 16, 32,  0,  0};\r
-static const GLubyte Helvetica12_Character_243[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 68, 56,  0, 16,  8,  0,  0};\r
-static const GLubyte Helvetica12_Character_244[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 68, 56,  0, 40, 16,  0,  0};\r
-static const GLubyte Helvetica12_Character_245[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 68, 56,  0, 40, 20,  0,  0};\r
-static const GLubyte Helvetica12_Character_246[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 68, 56,  0, 40,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_247[] = {  7,  0,  0,  0,  0,  0, 16,  0,124,  0, 16,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_248[] = {  7,  0,  0,  0,  0,184, 68,100, 84, 76, 68, 58,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_249[] = {  7,  0,  0,  0,  0, 52, 76, 68, 68, 68, 68, 68,  0, 16, 32,  0,  0};\r
-static const GLubyte Helvetica12_Character_250[] = {  7,  0,  0,  0,  0, 52, 76, 68, 68, 68, 68, 68,  0, 16,  8,  0,  0};\r
-static const GLubyte Helvetica12_Character_251[] = {  7,  0,  0,  0,  0, 52, 76, 68, 68, 68, 68, 68,  0, 40, 16,  0,  0};\r
-static const GLubyte Helvetica12_Character_252[] = {  7,  0,  0,  0,  0, 52, 76, 68, 68, 68, 68, 68,  0, 40,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_253[] = {  7,  0, 64, 32, 16, 16, 40, 40, 72, 68, 68, 68,  0, 16,  8,  0,  0};\r
-static const GLubyte Helvetica12_Character_254[] = {  7,  0, 64, 64, 64, 88,100, 68, 68, 68,100, 88, 64, 64,  0,  0,  0};\r
-static const GLubyte Helvetica12_Character_255[] = {  7,  0, 96, 16, 16, 16, 24, 40, 40, 36, 68, 68,  0, 40,  0,  0,  0};\r
-\r
-/* The font characters mapping: */\r
-static const GLubyte* Helvetica12_Character_Map[] = {Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,\r
-                                                     Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,\r
-                                                     Helvetica12_Character_032,Helvetica12_Character_033,Helvetica12_Character_034,Helvetica12_Character_035,Helvetica12_Character_036,Helvetica12_Character_037,Helvetica12_Character_038,Helvetica12_Character_039,Helvetica12_Character_040,Helvetica12_Character_041,Helvetica12_Character_042,Helvetica12_Character_043,Helvetica12_Character_044,Helvetica12_Character_045,Helvetica12_Character_046,Helvetica12_Character_047,\r
-                                                     Helvetica12_Character_048,Helvetica12_Character_049,Helvetica12_Character_050,Helvetica12_Character_051,Helvetica12_Character_052,Helvetica12_Character_053,Helvetica12_Character_054,Helvetica12_Character_055,Helvetica12_Character_056,Helvetica12_Character_057,Helvetica12_Character_058,Helvetica12_Character_059,Helvetica12_Character_060,Helvetica12_Character_061,Helvetica12_Character_062,Helvetica12_Character_063,\r
-                                                     Helvetica12_Character_064,Helvetica12_Character_065,Helvetica12_Character_066,Helvetica12_Character_067,Helvetica12_Character_068,Helvetica12_Character_069,Helvetica12_Character_070,Helvetica12_Character_071,Helvetica12_Character_072,Helvetica12_Character_073,Helvetica12_Character_074,Helvetica12_Character_075,Helvetica12_Character_076,Helvetica12_Character_077,Helvetica12_Character_078,Helvetica12_Character_079,\r
-                                                     Helvetica12_Character_080,Helvetica12_Character_081,Helvetica12_Character_082,Helvetica12_Character_083,Helvetica12_Character_084,Helvetica12_Character_085,Helvetica12_Character_086,Helvetica12_Character_087,Helvetica12_Character_088,Helvetica12_Character_089,Helvetica12_Character_090,Helvetica12_Character_091,Helvetica12_Character_092,Helvetica12_Character_093,Helvetica12_Character_094,Helvetica12_Character_095,\r
-                                                     Helvetica12_Character_096,Helvetica12_Character_097,Helvetica12_Character_098,Helvetica12_Character_099,Helvetica12_Character_100,Helvetica12_Character_101,Helvetica12_Character_102,Helvetica12_Character_103,Helvetica12_Character_104,Helvetica12_Character_105,Helvetica12_Character_106,Helvetica12_Character_107,Helvetica12_Character_108,Helvetica12_Character_109,Helvetica12_Character_110,Helvetica12_Character_111,\r
-                                                     Helvetica12_Character_112,Helvetica12_Character_113,Helvetica12_Character_114,Helvetica12_Character_115,Helvetica12_Character_116,Helvetica12_Character_117,Helvetica12_Character_118,Helvetica12_Character_119,Helvetica12_Character_120,Helvetica12_Character_121,Helvetica12_Character_122,Helvetica12_Character_123,Helvetica12_Character_124,Helvetica12_Character_125,Helvetica12_Character_126,Helvetica12_Character_032,\r
-                                                     Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,\r
-                                                     Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,\r
-                                                     Helvetica12_Character_160,Helvetica12_Character_161,Helvetica12_Character_162,Helvetica12_Character_163,Helvetica12_Character_164,Helvetica12_Character_165,Helvetica12_Character_166,Helvetica12_Character_167,Helvetica12_Character_168,Helvetica12_Character_169,Helvetica12_Character_170,Helvetica12_Character_171,Helvetica12_Character_172,Helvetica12_Character_173,Helvetica12_Character_174,Helvetica12_Character_175,\r
-                                                     Helvetica12_Character_176,Helvetica12_Character_177,Helvetica12_Character_178,Helvetica12_Character_179,Helvetica12_Character_180,Helvetica12_Character_181,Helvetica12_Character_182,Helvetica12_Character_183,Helvetica12_Character_184,Helvetica12_Character_185,Helvetica12_Character_186,Helvetica12_Character_187,Helvetica12_Character_188,Helvetica12_Character_189,Helvetica12_Character_190,Helvetica12_Character_191,\r
-                                                     Helvetica12_Character_192,Helvetica12_Character_193,Helvetica12_Character_194,Helvetica12_Character_195,Helvetica12_Character_196,Helvetica12_Character_197,Helvetica12_Character_198,Helvetica12_Character_199,Helvetica12_Character_200,Helvetica12_Character_201,Helvetica12_Character_202,Helvetica12_Character_203,Helvetica12_Character_204,Helvetica12_Character_205,Helvetica12_Character_206,Helvetica12_Character_207,\r
-                                                     Helvetica12_Character_208,Helvetica12_Character_209,Helvetica12_Character_210,Helvetica12_Character_211,Helvetica12_Character_212,Helvetica12_Character_213,Helvetica12_Character_214,Helvetica12_Character_215,Helvetica12_Character_216,Helvetica12_Character_217,Helvetica12_Character_218,Helvetica12_Character_219,Helvetica12_Character_220,Helvetica12_Character_221,Helvetica12_Character_222,Helvetica12_Character_223,\r
-                                                     Helvetica12_Character_224,Helvetica12_Character_225,Helvetica12_Character_226,Helvetica12_Character_227,Helvetica12_Character_228,Helvetica12_Character_229,Helvetica12_Character_230,Helvetica12_Character_231,Helvetica12_Character_232,Helvetica12_Character_233,Helvetica12_Character_234,Helvetica12_Character_235,Helvetica12_Character_236,Helvetica12_Character_237,Helvetica12_Character_238,Helvetica12_Character_239,\r
-                                                     Helvetica12_Character_240,Helvetica12_Character_241,Helvetica12_Character_242,Helvetica12_Character_243,Helvetica12_Character_244,Helvetica12_Character_245,Helvetica12_Character_246,Helvetica12_Character_247,Helvetica12_Character_248,Helvetica12_Character_249,Helvetica12_Character_250,Helvetica12_Character_251,Helvetica12_Character_252,Helvetica12_Character_253,Helvetica12_Character_254,Helvetica12_Character_255,NULL};\r
-\r
-/* The font structure: */\r
-const SFG_Font fgFontHelvetica12 = { "-adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1", 256, 16, Helvetica12_Character_Map, 0, 4 };\r
-\r
-static const GLubyte Helvetica18_Character_000[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0, 64, 16,  0,  0, 64, 16,  0,  0, 64, 16,  0,  0, 64, 16,  0,  0, 64, 16,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_001[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_002[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_003[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_004[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_005[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_006[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_007[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_008[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_009[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_010[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_011[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_012[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_013[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_014[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_015[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_016[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_017[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_018[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_019[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_020[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_021[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_022[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_023[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_024[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_025[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_026[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_027[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_028[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_029[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_030[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_031[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_032[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_033[] = {  6,  0,  0,  0,  0,  0, 48, 48,  0,  0, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_034[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,144,144,216,216,216,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_035[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 36,  0, 36,  0, 36,  0,255,128,255,128, 18,  0, 18,  0, 18,  0,127,192,127,192,  9,  0,  9,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_036[] = { 10,  0,  0,  0,  0,  0,  0,  4,  0,  4,  0, 31,  0, 63,128,117,192,100,192,  4,192,  7,128, 31,  0, 60,  0,116,  0,100,  0,101,128, 63,128, 31,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_037[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12, 60, 12,126,  6,102,  6,102,  3,126,  3, 60,  1,128, 61,128,126,192,102,192,102, 96,126, 96, 60, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_038[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30, 56, 63,112,115,224, 97,192, 97,224, 99, 96,119, 96, 62,  0, 30,  0, 51,  0, 51,  0, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_039[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 64, 32, 32, 96, 96,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_040[] = {  6,  0,  8, 24, 48, 48, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48, 48, 24,  8,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_041[] = {  6,  0, 64, 96, 48, 48, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 48, 48, 96, 64,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_042[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 68, 56, 56,124, 16, 16,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_043[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0, 12,  0, 12,  0,127,128,127,128, 12,  0, 12,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_044[] = {  5,  0,  0, 64, 32, 32, 96, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_045[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,128,127,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_046[] = {  5,  0,  0,  0,  0,  0, 96, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_047[] = {  5,  0,  0,  0,  0,  0,192,192, 64, 64, 96, 96, 32, 32, 48, 48, 16, 16, 24, 24,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_048[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,  0, 51,  0, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 51,  0, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_049[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0, 62,  0, 62,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_050[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,128,127,128, 96,  0,112,  0, 56,  0, 28,  0, 14,  0,  7,  0,  3,128,  1,128, 97,128,127,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_051[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,  0, 99,128, 97,128,  1,128,  3,128, 15,  0, 14,  0,  3,  0, 97,128, 97,128, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_052[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,128,  1,128,  1,128,127,192,127,192, 97,128, 49,128, 25,128, 25,128, 13,128,  7,128,  3,128,  1,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_053[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,127,  0, 99,128, 97,128,  1,128,  1,128, 99,128,127,  0,126,  0, 96,  0, 96,  0,127,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_054[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,  0,113,128, 97,128, 97,128, 97,128,127,  0,110,  0, 96,  0, 96,  0, 49,128, 63,128, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_055[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48,  0, 48,  0, 24,  0, 24,  0, 24,  0, 12,  0, 12,  0,  6,  0,  6,  0,  3,  0,  1,128,127,128,127,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_056[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,  0,115,128, 97,128, 97,128, 51,  0, 63,  0, 51,  0, 97,128, 97,128,115,128, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_057[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,127,  0, 99,  0,  1,128,  1,128, 29,128, 63,128, 97,128, 97,128, 97,128, 99,128, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_058[] = {  5,  0,  0,  0,  0,  0, 96, 96,  0,  0,  0,  0,  0,  0, 96, 96,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_059[] = {  5,  0,  0, 64, 32, 32, 96, 96,  0,  0,  0,  0,  0,  0, 96, 96,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_060[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,128,  7,128, 30,  0, 56,  0, 96,  0, 56,  0, 30,  0,  7,128,  1,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_061[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 63,128, 63,128,  0,  0,  0,  0, 63,128, 63,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_062[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96,  0,120,  0, 30,  0,  7,  0,  1,128,  7,  0, 30,  0,120,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_063[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24,  0, 24,  0,  0,  0,  0,  0, 24,  0, 24,  0, 24,  0, 28,  0, 14,  0,  7,  0, 99,  0, 99,  0,127,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_064[] = { 18,  0,  0,  0,  0,  0,  0,  3,240,  0, 15,248,  0, 28,  0,  0, 56,  0,  0, 51,184,  0,103,252,  0,102,102,  0,102, 51,  0,102, 51,  0,102, 49,128, 99, 25,128, 51,185,128, 49,217,128, 24,  3,  0, 14,  7,  0,  7,254,  0,  1,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_065[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15,  0, 15,  0,  6,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_066[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,192,127,224, 96,112, 96, 48, 96, 48, 96,112,127,224,127,192, 96,192, 96, 96, 96, 96, 96,224,127,192,127,128,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_067[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 31,240, 56, 56, 48, 24,112,  0, 96,  0, 96,  0, 96,  0, 96,  0,112,  0, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_068[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,128,127,192, 96,224, 96, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 96, 96,224,127,192,127,128,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_069[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,192,127,192, 96,  0, 96,  0, 96,  0, 96,  0,127,128,127,128, 96,  0, 96,  0, 96,  0, 96,  0,127,192,127,192,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_070[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0,127,128,127,128, 96,  0, 96,  0, 96,  0, 96,  0,127,192,127,192,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_071[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,216, 31,248, 56, 56, 48, 24,112, 24, 96,248, 96,248, 96,  0, 96,  0,112, 24, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_072[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,127,240,127,240, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_073[] = {  6,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_074[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,  0,115,128, 97,128, 97,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_075[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 56, 96,112, 96,224, 97,192, 99,128,103,  0,126,  0,124,  0,110,  0,103,  0, 99,128, 97,192, 96,224, 96,112,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_076[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,128,127,128, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_077[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 97,134, 97,134, 99,198, 98, 70,102,102,102,102,108, 54,108, 54,120, 30,120, 30,112, 14,112, 14, 96,  6, 96,  6,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_078[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 48, 96,112, 96,240, 96,240, 97,176, 99, 48, 99, 48,102, 48,102, 48,108, 48,120, 48,120, 48,112, 48, 96, 48,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_079[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_080[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0,127,128,127,192, 96,224, 96, 96, 96, 96, 96,224,127,192,127,128,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_081[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24,  7,216, 31,240, 56,120, 48,216,112,220, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_082[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96, 96, 96,192, 96,192,127,128,127,192, 96,224, 96, 96, 96, 96, 96,224,127,192,127,128,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_083[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,128, 63,224,112,112, 96, 48,  0, 48,  0,112,  1,224, 15,128, 62,  0,112,  0, 96, 48,112,112, 63,224, 15,128,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_084[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,127,224,127,224,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_085[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,128, 63,224, 48, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_086[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  7,128,  7,128, 12,192, 12,192, 12,192, 24, 96, 24, 96, 24, 96, 48, 48, 48, 48, 48, 48, 96, 24, 96, 24,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_087[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12,  0, 12, 12,  0, 14, 28,  0, 26, 22,  0, 27, 54,  0, 27, 54,  0, 51, 51,  0, 51, 51,  0, 49, 35,  0, 49,227,  0, 97,225,128, 96,193,128, 96,193,128, 96,193,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_088[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 48,112,112, 48, 96, 56,224, 24,192, 13,128,  7,  0,  7,  0, 13,128, 24,192, 56,224, 48, 96,112,112, 96, 48,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_089[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  7,128, 12,192, 24, 96, 24, 96, 48, 48, 48, 48, 96, 24, 96, 24,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_090[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,224,127,224, 96,  0, 48,  0, 24,  0, 12,  0, 14,  0,  6,  0,  3,  0,  1,128,  0,192,  0, 96,127,224,127,224,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_091[] = {  5,  0,120,120, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,120,120,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_092[] = {  5,  0,  0,  0,  0,  0, 24, 24, 16, 16, 48, 48, 32, 32, 96, 96, 64, 64,192,192,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_093[] = {  5,  0,240,240, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,240,240,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_094[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 99,  0, 54,  0, 28,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_095[] = { 10,  0,  0,255,192,255,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_096[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 96, 64, 64, 32,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_097[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,119,  0, 99,  0, 99,  0,115,  0, 63,  0,  7,  0, 99,  0,119,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_098[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,111,  0,127,128,113,128, 96,192, 96,192, 96,192, 96,192,113,128,127,128,111,  0, 96,  0, 96,  0, 96,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_099[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 63,128, 49,128, 96,  0, 96,  0, 96,  0, 96,  0, 49,128, 63,128, 31,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_100[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,192, 63,192, 49,192, 96,192, 96,192, 96,192, 96,192, 49,192, 63,192, 30,192,  0,192,  0,192,  0,192,  0,192,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_101[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,128,113,128, 96,  0, 96,  0,127,128, 97,128, 97,128, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_102[] = {  6,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48, 48,252,252, 48, 48, 60, 28,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_103[] = { 11,  0,  0, 14,  0, 63,128, 49,128,  0,192, 30,192, 63,192, 49,192, 96,192, 96,192, 96,192, 96,192, 48,192, 63,192, 30,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_104[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,113,128,111,128,103,  0, 96,  0, 96,  0, 96,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_105[] = {  4,  0,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0,  0, 96, 96,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_106[] = {  4,  0,192,224, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0,  0, 96, 96,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_107[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 99,128, 99,  0,103,  0,102,  0,108,  0,124,  0,120,  0,108,  0,102,  0, 99,  0, 96,  0, 96,  0, 96,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_108[] = {  4,  0,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_109[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 99, 24, 99, 24, 99, 24, 99, 24, 99, 24, 99, 24, 99, 24,115,152,111,120,102, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_110[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,113,128,111,128,103,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_111[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_112[] = { 11,  0,  0, 96,  0, 96,  0, 96,  0, 96,  0,111,  0,127,128,113,128, 96,192, 96,192, 96,192, 96,192,113,128,127,128,111,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_113[] = { 11,  0,  0,  0,192,  0,192,  0,192,  0,192, 30,192, 63,192, 49,192, 96,192, 96,192, 96,192, 96,192, 49,192, 63,192, 30,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_114[] = {  6,  0,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96,112,108,108,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_115[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 60,  0,126,  0, 99,  0,  3,  0, 31,  0,126,  0, 96,  0, 99,  0, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_116[] = {  6,  0,  0,  0,  0,  0, 24, 56, 48, 48, 48, 48, 48, 48,252,252, 48, 48, 48,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_117[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 57,128,125,128, 99,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_118[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0, 30,  0, 18,  0, 51,  0, 51,  0, 51,  0, 97,128, 97,128, 97,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_119[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,192, 12,192, 28,224, 20,160, 52,176, 51, 48, 51, 48, 99, 24, 99, 24, 99, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_120[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 97,128,115,128, 51,  0, 30,  0, 12,  0, 12,  0, 30,  0, 51,  0,115,128, 97,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_121[] = { 10,  0,  0, 56,  0, 56,  0, 12,  0, 12,  0, 12,  0, 12,  0, 30,  0, 18,  0, 51,  0, 51,  0, 51,  0, 97,128, 97,128, 97,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_122[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,127,  0, 96,  0, 48,  0, 24,  0, 12,  0,  6,  0,  3,  0,127,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_123[] = {  6,  0, 12, 24, 48, 48, 48, 48, 48, 48, 96,192, 96, 48, 48, 48, 48, 48, 24, 12,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_124[] = {  4,  0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_125[] = {  6,  0,192, 96, 48, 48, 48, 48, 48, 48, 24, 12, 24, 48, 48, 48, 48, 48, 96,192,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_126[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,102,  0, 63,  0, 25,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_127[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_128[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_129[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_130[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_131[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_132[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_133[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_134[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_135[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_136[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_137[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_138[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_139[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_140[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_141[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_142[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_143[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_144[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_145[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_146[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_147[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_148[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_149[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_150[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_151[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_152[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_153[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_154[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_155[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_156[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_157[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_158[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_159[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_160[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_161[] = {  6,  0, 48, 48, 48, 48, 48, 48, 48, 48, 16, 16,  0,  0, 48, 48,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_162[] = { 10,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0, 31,  0, 63,128, 53,128,100,  0,100,  0,100,  0,100,  0, 53,128, 63,128, 31,  0,  2,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_163[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,223,  0,255,128, 96,128, 48,  0, 24,  0, 24,  0,126,  0, 48,  0, 96,  0, 97,128, 97,128, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_164[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 97,128,127,128, 51,  0, 51,  0, 51,  0,127,128, 97,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_165[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0, 12,  0, 12,  0,127,128, 12,  0,127,128, 30,  0, 51,  0, 51,  0, 51,  0, 97,128, 97,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_166[] = {  4,  0,  0, 96, 96, 96, 96, 96, 96,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_167[] = { 10,  0,  0, 30,  0, 63,  0, 97,128, 97,128,  3,128,  7,  0, 31,  0, 57,128,113,128, 97,128, 99,128, 55,  0, 62,  0,120,  0, 97,128, 97,128, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_168[] = {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,216,216,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_169[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 24, 48, 32,  8, 35,136, 68, 68, 72,  4, 72,  4, 72,  4, 68, 68, 35,136, 32,  8, 24, 48,  7,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_170[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,  0, 52,108, 36, 28,100, 56,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_171[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  0, 27,  0, 54,  0,108,  0,108,  0, 54,  0, 27,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_172[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192,  0,192,  0,192,127,192,127,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_173[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,124,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_174[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 24, 48, 32,  8, 36, 40, 68, 68, 68,132, 71,196, 68, 36, 68, 36, 39,200, 32,  8, 24, 48,  7,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_175[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,248,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_176[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,108, 68,108, 56,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_177[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,128,127,128,  0,  0, 12,  0, 12,  0, 12,  0,127,128,127,128, 12,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_178[] = {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,248,248, 96, 48, 24,152,248,112,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_179[] = {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,112,248,152, 48, 48,152,248,112,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_180[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 96, 48,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_181[] = { 10,  0,  0, 96,  0, 96,  0, 96,  0, 96,  0,109,128,127,128,115,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_182[] = { 10,  0,  0,  9,  0,  9,  0,  9,  0,  9,  0,  9,  0,  9,  0,  9,  0,  9,  0,  9,  0,  9,  0, 25,  0, 57,  0,121,  0,121,  0,121,  0,121,  0, 57,  0, 31,128,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_183[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_184[] = {  5,  0,240,216, 24,112, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_185[] = {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48,112,112, 48,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_186[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,  0, 56,108, 68, 68,108, 56,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_187[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 72,  0,108,  0, 54,  0, 27,  0, 27,  0, 54,  0,108,  0, 72,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_188[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 24, 24, 24, 12,252,  6,216,  6,120, 51, 56, 49, 24, 49,136, 48,192, 48,192,112, 96,112, 48, 48, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_189[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24,124, 24,124, 12, 48,  6, 24,  6, 12, 51, 76, 49,124, 49,184, 48,192, 48,192,112, 96,112, 48, 48, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_190[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 24, 24, 24, 12,252,  6,216,  6,120,115, 56,249, 24,153,136, 48,192, 48,192,152, 96,248, 48,112, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_191[] = { 10,  0,  0, 62,  0,127,  0, 99,  0, 99,  0,112,  0, 56,  0, 28,  0, 12,  0, 12,  0, 12,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_192[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15,  0, 15,  0,  6,  0,  6,  0,  0,  0,  6,  0, 12,  0, 24,  0};\r
-static const GLubyte Helvetica18_Character_193[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15,  0, 15,  0,  6,  0,  6,  0,  0,  0,  6,  0,  3,  0,  1,128};\r
-static const GLubyte Helvetica18_Character_194[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15,  0, 15,  0,  6,  0,  6,  0,  0,  0, 25,128, 15,  0,  6,  0};\r
-static const GLubyte Helvetica18_Character_195[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15,  0, 15,  0,  6,  0,  6,  0,  0,  0, 19,  0, 22,128, 12,128};\r
-static const GLubyte Helvetica18_Character_196[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15,  0, 15,  0,  6,  0,  6,  0,  0,  0, 25,128, 25,128,  0,  0};\r
-static const GLubyte Helvetica18_Character_197[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15,  0, 15,  0,  6,  0,  6,  0, 15,  0, 25,128, 25,128, 15,  0};\r
-static const GLubyte Helvetica18_Character_198[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96,255,128, 96,255,128, 48,192,  0, 48,192,  0, 63,192,  0, 31,192,  0, 24,255,  0, 24,255,  0, 12,192,  0, 12,192,  0,  6,192,  0,  6,192,  0,  3,255,128,  3,255,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_199[] = { 14,  0,  0, 15,  0, 13,128,  1,128,  7,  0,  7,192, 31,240, 56, 56, 48, 24,112,  0, 96,  0, 96,  0, 96,  0, 96,  0,112,  0, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_200[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,192,127,192, 96,  0, 96,  0, 96,  0, 96,  0,127,128,127,128, 96,  0, 96,  0, 96,  0, 96,  0,127,192,127,192,  0,  0,  6,  0, 12,  0, 24,  0};\r
-static const GLubyte Helvetica18_Character_201[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,192,127,192, 96,  0, 96,  0, 96,  0, 96,  0,127,128,127,128, 96,  0, 96,  0, 96,  0, 96,  0,127,192,127,192,  0,  0,  6,  0,  3,  0,  1,128};\r
-static const GLubyte Helvetica18_Character_202[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,192,127,192, 96,  0, 96,  0, 96,  0, 96,  0,127,128,127,128, 96,  0, 96,  0, 96,  0, 96,  0,127,192,127,192,  0,  0, 25,128, 15,  0,  6,  0};\r
-static const GLubyte Helvetica18_Character_203[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,192,127,192, 96,  0, 96,  0, 96,  0, 96,  0,127,128,127,128, 96,  0, 96,  0, 96,  0, 96,  0,127,192,127,192,  0,  0, 25,128, 25,128,  0,  0};\r
-static const GLubyte Helvetica18_Character_204[] = {  6,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,  0, 48, 96,192};\r
-static const GLubyte Helvetica18_Character_205[] = {  6,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,  0, 48, 24, 12};\r
-static const GLubyte Helvetica18_Character_206[] = {  6,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,  0,204,120, 48};\r
-static const GLubyte Helvetica18_Character_207[] = {  6,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,  0,204,204,  0};\r
-static const GLubyte Helvetica18_Character_208[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,128,127,192, 96,224, 96, 96, 96, 48, 96, 48,252, 48,252, 48, 96, 48, 96, 48, 96, 96, 96,224,127,192,127,128,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_209[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 48, 96,112, 96,240, 96,240, 97,176, 99, 48, 99, 48,102, 48,102, 48,108, 48,108, 48,120, 48,112, 48,112, 48,  0,  0,  9,128, 11, 64,  6, 64};\r
-static const GLubyte Helvetica18_Character_210[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  1,128,  3,  0,  6,  0};\r
-static const GLubyte Helvetica18_Character_211[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  1,128,  0,192,  0, 96};\r
-static const GLubyte Helvetica18_Character_212[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  6, 96,  3,192,  1,128};\r
-static const GLubyte Helvetica18_Character_213[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  4,192,  5,160,  3, 32};\r
-static const GLubyte Helvetica18_Character_214[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  6,192,  6,192,  0,  0};\r
-static const GLubyte Helvetica18_Character_215[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192,192, 97,128, 51,  0, 30,  0, 12,  0, 30,  0, 51,  0, 97,128,192,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_216[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,199,192,255,240,120, 56, 56, 24,108, 28,110, 12,103, 12, 99,140, 97,204,112,220, 48,120, 56, 56, 31,252,  7,204,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_217[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,128, 63,224, 48, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,  0,  0,  3,  0,  6,  0, 12,  0};\r
-static const GLubyte Helvetica18_Character_218[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,128, 63,224, 48, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,  0,  0,  6,  0,  3,  0,  1,128};\r
-static const GLubyte Helvetica18_Character_219[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,128, 63,224, 48, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,  0,  0, 12,192,  7,128,  3,  0};\r
-static const GLubyte Helvetica18_Character_220[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,128, 63,224, 48, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,  0,  0, 12,192, 12,192,  0,  0};\r
-static const GLubyte Helvetica18_Character_221[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  7,128, 12,192, 24, 96, 24, 96, 48, 48, 48, 48, 96, 24, 96, 24,  0,  0,  3,  0,  1,128,  0,192};\r
-static const GLubyte Helvetica18_Character_222[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96,  0, 96,  0, 96,  0,127,128,127,192, 96,224, 96, 96, 96, 96, 96,224,127,192,127,128, 96,  0, 96,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_223[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,110,  0,111,  0, 99,  0, 99,  0, 99,  0, 99,  0,110,  0,110,  0, 99,  0, 99,  0, 99,  0, 99,  0, 62,  0, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_224[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,119,  0, 99,  0, 99,  0,115,  0, 63,  0,  7,  0, 99,  0,119,  0, 62,  0,  0,  0, 12,  0, 24,  0, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_225[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,119,  0, 99,  0, 99,  0,115,  0, 63,  0,  7,  0, 99,  0,119,  0, 62,  0,  0,  0, 24,  0, 12,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_226[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,119,  0, 99,  0, 99,  0,115,  0, 63,  0,  7,  0, 99,  0,119,  0, 62,  0,  0,  0, 51,  0, 30,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_227[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,119,  0, 99,  0, 99,  0,115,  0, 63,  0,  7,  0, 99,  0,119,  0, 62,  0,  0,  0, 38,  0, 45,  0, 25,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_228[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,119,  0, 99,  0, 99,  0,115,  0, 63,  0,  7,  0, 99,  0,119,  0, 62,  0,  0,  0, 54,  0, 54,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_229[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,119,  0, 99,  0, 99,  0,115,  0, 63,  0,  7,  0, 99,  0,119,  0, 62,  0, 28,  0, 54,  0, 54,  0, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_230[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 58,240,119,252, 99,140, 99,  0,115,  0, 63,252,  7, 12, 99, 12,119,248, 62,240,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_231[] = { 10,  0,  0, 60,  0, 54,  0,  6,  0, 28,  0, 31,  0, 63,128, 49,128, 96,  0, 96,  0, 96,  0, 96,  0, 49,128, 63,128, 31,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_232[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,128,113,128, 96,  0, 96,  0,127,128, 97,128, 97,128, 63,  0, 30,  0,  0,  0, 12,  0, 24,  0, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_233[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,128,113,128, 96,  0, 96,  0,127,128, 97,128, 97,128, 63,  0, 30,  0,  0,  0, 12,  0,  6,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_234[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,128,113,128, 96,  0, 96,  0,127,128, 97,128, 97,128, 63,  0, 30,  0,  0,  0, 51,  0, 30,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_235[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,128,113,128, 96,  0, 96,  0,127,128, 97,128, 97,128, 63,  0, 30,  0,  0,  0, 27,  0, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_236[] = {  4,  0,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0, 48, 96,192,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_237[] = {  4,  0,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0,192, 96, 48,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_238[] = {  4,  0,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0,144,240, 96,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_239[] = {  4,  0,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0,216,216,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_240[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31,  0, 38,  0, 28,  0, 27,  0, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_241[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,113,128,111,128,103,  0,  0,  0, 38,  0, 45,  0, 25,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_242[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31,  0,  0,  0,  6,  0, 12,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_243[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31,  0,  0,  0, 12,  0,  6,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_244[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31,  0,  0,  0, 25,128, 15,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_245[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31,  0,  0,  0, 19,  0, 22,128, 12,128,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_246[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31,  0,  0,  0, 27,  0, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_247[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,127,128,127,128,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_248[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,206,  0,127,128, 49,128,120,192,108,192,102,192, 99,192, 49,128, 63,192, 14, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_249[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 57,128,125,128, 99,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,  0,  0,  6,  0, 12,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_250[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 57,128,125,128, 99,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,  0,  0, 12,  0,  6,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_251[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 57,128,125,128, 99,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,  0,  0, 51,  0, 30,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_252[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 57,128,125,128, 99,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,  0,  0, 51,  0, 51,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_253[] = { 10,  0,  0, 56,  0, 56,  0, 12,  0, 12,  0, 12,  0, 12,  0, 30,  0, 18,  0, 51,  0, 51,  0, 51,  0, 97,128, 97,128, 97,128,  0,  0, 12,  0,  6,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_254[] = { 11,  0,  0, 96,  0, 96,  0, 96,  0, 96,  0,111,  0,127,128,113,128, 96,192, 96,192, 96,192, 96,192,113,128,127,128,111,  0, 96,  0, 96,  0, 96,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte Helvetica18_Character_255[] = { 10,  0,  0, 56,  0, 56,  0, 12,  0, 12,  0, 12,  0, 12,  0, 30,  0, 18,  0, 51,  0, 51,  0, 51,  0, 97,128, 97,128, 97,128,  0,  0, 51,  0, 51,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-\r
-/* The font characters mapping: */\r
-static const GLubyte* Helvetica18_Character_Map[] = {Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,\r
-                                                     Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,\r
-                                                     Helvetica18_Character_032,Helvetica18_Character_033,Helvetica18_Character_034,Helvetica18_Character_035,Helvetica18_Character_036,Helvetica18_Character_037,Helvetica18_Character_038,Helvetica18_Character_039,Helvetica18_Character_040,Helvetica18_Character_041,Helvetica18_Character_042,Helvetica18_Character_043,Helvetica18_Character_044,Helvetica18_Character_045,Helvetica18_Character_046,Helvetica18_Character_047,\r
-                                                     Helvetica18_Character_048,Helvetica18_Character_049,Helvetica18_Character_050,Helvetica18_Character_051,Helvetica18_Character_052,Helvetica18_Character_053,Helvetica18_Character_054,Helvetica18_Character_055,Helvetica18_Character_056,Helvetica18_Character_057,Helvetica18_Character_058,Helvetica18_Character_059,Helvetica18_Character_060,Helvetica18_Character_061,Helvetica18_Character_062,Helvetica18_Character_063,\r
-                                                     Helvetica18_Character_064,Helvetica18_Character_065,Helvetica18_Character_066,Helvetica18_Character_067,Helvetica18_Character_068,Helvetica18_Character_069,Helvetica18_Character_070,Helvetica18_Character_071,Helvetica18_Character_072,Helvetica18_Character_073,Helvetica18_Character_074,Helvetica18_Character_075,Helvetica18_Character_076,Helvetica18_Character_077,Helvetica18_Character_078,Helvetica18_Character_079,\r
-                                                     Helvetica18_Character_080,Helvetica18_Character_081,Helvetica18_Character_082,Helvetica18_Character_083,Helvetica18_Character_084,Helvetica18_Character_085,Helvetica18_Character_086,Helvetica18_Character_087,Helvetica18_Character_088,Helvetica18_Character_089,Helvetica18_Character_090,Helvetica18_Character_091,Helvetica18_Character_092,Helvetica18_Character_093,Helvetica18_Character_094,Helvetica18_Character_095,\r
-                                                     Helvetica18_Character_096,Helvetica18_Character_097,Helvetica18_Character_098,Helvetica18_Character_099,Helvetica18_Character_100,Helvetica18_Character_101,Helvetica18_Character_102,Helvetica18_Character_103,Helvetica18_Character_104,Helvetica18_Character_105,Helvetica18_Character_106,Helvetica18_Character_107,Helvetica18_Character_108,Helvetica18_Character_109,Helvetica18_Character_110,Helvetica18_Character_111,\r
-                                                     Helvetica18_Character_112,Helvetica18_Character_113,Helvetica18_Character_114,Helvetica18_Character_115,Helvetica18_Character_116,Helvetica18_Character_117,Helvetica18_Character_118,Helvetica18_Character_119,Helvetica18_Character_120,Helvetica18_Character_121,Helvetica18_Character_122,Helvetica18_Character_123,Helvetica18_Character_124,Helvetica18_Character_125,Helvetica18_Character_126,Helvetica18_Character_032,\r
-                                                     Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,\r
-                                                     Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,\r
-                                                     Helvetica18_Character_160,Helvetica18_Character_161,Helvetica18_Character_162,Helvetica18_Character_163,Helvetica18_Character_164,Helvetica18_Character_165,Helvetica18_Character_166,Helvetica18_Character_167,Helvetica18_Character_168,Helvetica18_Character_169,Helvetica18_Character_170,Helvetica18_Character_171,Helvetica18_Character_172,Helvetica18_Character_173,Helvetica18_Character_174,Helvetica18_Character_175,\r
-                                                     Helvetica18_Character_176,Helvetica18_Character_177,Helvetica18_Character_178,Helvetica18_Character_179,Helvetica18_Character_180,Helvetica18_Character_181,Helvetica18_Character_182,Helvetica18_Character_183,Helvetica18_Character_184,Helvetica18_Character_185,Helvetica18_Character_186,Helvetica18_Character_187,Helvetica18_Character_188,Helvetica18_Character_189,Helvetica18_Character_190,Helvetica18_Character_191,\r
-                                                     Helvetica18_Character_192,Helvetica18_Character_193,Helvetica18_Character_194,Helvetica18_Character_195,Helvetica18_Character_196,Helvetica18_Character_197,Helvetica18_Character_198,Helvetica18_Character_199,Helvetica18_Character_200,Helvetica18_Character_201,Helvetica18_Character_202,Helvetica18_Character_203,Helvetica18_Character_204,Helvetica18_Character_205,Helvetica18_Character_206,Helvetica18_Character_207,\r
-                                                     Helvetica18_Character_208,Helvetica18_Character_209,Helvetica18_Character_210,Helvetica18_Character_211,Helvetica18_Character_212,Helvetica18_Character_213,Helvetica18_Character_214,Helvetica18_Character_215,Helvetica18_Character_216,Helvetica18_Character_217,Helvetica18_Character_218,Helvetica18_Character_219,Helvetica18_Character_220,Helvetica18_Character_221,Helvetica18_Character_222,Helvetica18_Character_223,\r
-                                                     Helvetica18_Character_224,Helvetica18_Character_225,Helvetica18_Character_226,Helvetica18_Character_227,Helvetica18_Character_228,Helvetica18_Character_229,Helvetica18_Character_230,Helvetica18_Character_231,Helvetica18_Character_232,Helvetica18_Character_233,Helvetica18_Character_234,Helvetica18_Character_235,Helvetica18_Character_236,Helvetica18_Character_237,Helvetica18_Character_238,Helvetica18_Character_239,\r
-                                                     Helvetica18_Character_240,Helvetica18_Character_241,Helvetica18_Character_242,Helvetica18_Character_243,Helvetica18_Character_244,Helvetica18_Character_245,Helvetica18_Character_246,Helvetica18_Character_247,Helvetica18_Character_248,Helvetica18_Character_249,Helvetica18_Character_250,Helvetica18_Character_251,Helvetica18_Character_252,Helvetica18_Character_253,Helvetica18_Character_254,Helvetica18_Character_255,NULL};\r
-\r
-/* The font structure: */\r
-const SFG_Font fgFontHelvetica18 = { "-adobe-helvetica-medium-r-normal--18-180-75-75-p-98-iso8859-1", 256, 23, Helvetica18_Character_Map, 0, 5 };\r
-\r
-static const GLubyte TimesRoman10_Character_000[] = {  8,  0,  0,  0,  0,170,  0,130,  0,130,  0,170,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_001[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_002[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_003[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_004[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_005[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_006[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_007[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_008[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_009[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_010[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_011[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_012[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_013[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_014[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_015[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_016[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_017[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_018[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_019[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_020[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_021[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_022[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_023[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_024[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_025[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_026[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_027[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_028[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_029[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_030[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_031[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_032[] = {  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_033[] = {  3,  0,  0,  0,  0, 64,  0, 64, 64, 64, 64, 64,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_034[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,160,160,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_035[] = {  5,  0,  0,  0,  0, 80, 80,248, 80,248, 80, 80,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_036[] = {  5,  0,  0,  0, 32,224,144, 16, 96,128,144,112, 32,  0,  0};\r
-static const GLubyte TimesRoman10_Character_037[] = {  8,  0,  0,  0,  0, 68, 42, 42, 86,168,164,126,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_038[] = {  8,  0,  0,  0,  0,118,141,152,116,110, 80, 48,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_039[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0, 64,192,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_040[] = {  4,  0,  0, 32, 64, 64,128,128,128, 64, 64, 32,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_041[] = {  4,  0,  0,128, 64, 64, 32, 32, 32, 64, 64,128,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_042[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,160, 64,160,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_043[] = {  6,  0,  0,  0,  0, 32, 32,248, 32, 32,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_044[] = {  3,  0,  0, 64, 64, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_045[] = {  7,  0,  0,  0,  0,  0,  0,120,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_046[] = {  3,  0,  0,  0,  0, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_047[] = {  3,  0,  0,  0,  0,128,128, 64, 64, 64, 32, 32,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_048[] = {  5,  0,  0,  0,  0, 96,144,144,144,144,144, 96,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_049[] = {  5,  0,  0,  0,  0,112, 32, 32, 32, 32, 96, 32,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_050[] = {  5,  0,  0,  0,  0,240, 64, 32, 32, 16,144, 96,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_051[] = {  5,  0,  0,  0,  0,224, 16, 16, 96, 16,144, 96,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_052[] = {  5,  0,  0,  0,  0, 16, 16,248,144, 80, 48, 16,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_053[] = {  5,  0,  0,  0,  0,224,144, 16, 16,224, 64,112,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_054[] = {  5,  0,  0,  0,  0, 96,144,144,144,224, 64, 48,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_055[] = {  5,  0,  0,  0,  0, 64, 64, 64, 32, 32,144,240,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_056[] = {  5,  0,  0,  0,  0, 96,144,144, 96,144,144, 96,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_057[] = {  5,  0,  0,  0,  0,192, 32,112,144,144,144, 96,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_058[] = {  3,  0,  0,  0,  0, 64,  0,  0,  0, 64,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_059[] = {  3,  0,  0, 64, 64, 64,  0,  0,  0, 64,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_060[] = {  5,  0,  0,  0,  0, 16, 32, 64, 32, 16,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_061[] = {  6,  0,  0,  0,  0,  0,248,  0,248,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_062[] = {  5,  0,  0,  0,  0,128, 64, 32, 64,128,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_063[] = {  4,  0,  0,  0,  0, 64,  0, 64, 64, 32,160,224,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_064[] = {  9,  0,  0,  0,  0, 62,  0, 64,  0,146,  0,173,  0,165,  0,165,  0,157,  0, 66,  0, 60,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_065[] = {  8,  0,  0,  0,  0,238, 68,124, 40, 40, 56, 16,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_066[] = {  6,  0,  0,  0,  0,240, 72, 72,112, 72, 72,240,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_067[] = {  7,  0,  0,  0,  0,120,196,128,128,128,196,124,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_068[] = {  7,  0,  0,  0,  0,248, 76, 68, 68, 68, 76,248,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_069[] = {  6,  0,  0,  0,  0,248, 72, 64,112, 64, 72,248,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_070[] = {  6,  0,  0,  0,  0,224, 64, 64,112, 64, 72,248,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_071[] = {  7,  0,  0,  0,  0,120,196,132,156,128,196,124,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_072[] = {  8,  0,  0,  0,  0,238, 68, 68,124, 68, 68,238,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_073[] = {  4,  0,  0,  0,  0,224, 64, 64, 64, 64, 64,224,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_074[] = {  4,  0,  0,  0,  0,192,160, 32, 32, 32, 32,112,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_075[] = {  7,  0,  0,  0,  0,236, 72, 80, 96, 80, 72,236,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_076[] = {  6,  0,  0,  0,  0,248, 72, 64, 64, 64, 64,224,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_077[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,235,128, 73,  0, 85,  0, 85,  0, 99,  0, 99,  0,227,128,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_078[] = {  8,  0,  0,  0,  0,228, 76, 76, 84, 84,100,238,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_079[] = {  7,  0,  0,  0,  0,120,204,132,132,132,204,120,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_080[] = {  6,  0,  0,  0,  0,224, 64, 64,112, 72, 72,240,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_081[] = {  7,  0,  0, 12, 24,112,204,132,132,132,204,120,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_082[] = {  7,  0,  0,  0,  0,236, 72, 80,112, 72, 72,240,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_083[] = {  5,  0,  0,  0,  0,224,144, 16, 96,192,144,112,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_084[] = {  6,  0,  0,  0,  0,112, 32, 32, 32, 32,168,248,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_085[] = {  8,  0,  0,  0,  0, 56,108, 68, 68, 68, 68,238,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_086[] = {  8,  0,  0,  0,  0, 16, 16, 40, 40,108, 68,238,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_087[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0, 34,  0, 85,  0, 85,  0,201,128,136,128,221,192,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_088[] = {  8,  0,  0,  0,  0,238, 68, 40, 16, 40, 68,238,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_089[] = {  8,  0,  0,  0,  0, 56, 16, 16, 40, 40, 68,238,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_090[] = {  6,  0,  0,  0,  0,248,136, 64, 32, 16,136,248,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_091[] = {  3,  0,  0,192,128,128,128,128,128,128,128,192,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_092[] = {  3,  0,  0,  0,  0, 32, 32, 64, 64, 64,128,128,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_093[] = {  3,  0,  0,192, 64, 64, 64, 64, 64, 64, 64,192,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_094[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0, 80, 80, 32,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_095[] = {  5,  0,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_096[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192,128,  0,  0};\r
-static const GLubyte TimesRoman10_Character_097[] = {  4,  0,  0,  0,  0,224,160, 96, 32,192,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_098[] = {  5,  0,  0,  0,  0,224,144,144,144,224,128,128,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_099[] = {  4,  0,  0,  0,  0, 96,128,128,128, 96,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_100[] = {  5,  0,  0,  0,  0,104,144,144,144,112, 16, 48,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_101[] = {  4,  0,  0,  0,  0, 96,128,192,160, 96,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_102[] = {  4,  0,  0,  0,  0,224, 64, 64, 64,224, 64, 48,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_103[] = {  5,  0,  0,224,144, 96, 64,160,160,112,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_104[] = {  5,  0,  0,  0,  0,216,144,144,144,224,128,128,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_105[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64,192,  0, 64,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_106[] = {  3,  0,  0,128, 64, 64, 64, 64, 64,192,  0, 64,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_107[] = {  5,  0,  0,  0,  0,152,144,224,160,144,128,128,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_108[] = {  4,  0,  0,  0,  0,224, 64, 64, 64, 64, 64,192,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_109[] = {  8,  0,  0,  0,  0,219,146,146,146,236,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_110[] = {  5,  0,  0,  0,  0,216,144,144,144,224,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_111[] = {  5,  0,  0,  0,  0, 96,144,144,144, 96,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_112[] = {  5,  0,  0,192,128,224,144,144,144,224,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_113[] = {  5,  0,  0, 56, 16,112,144,144,144,112,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_114[] = {  4,  0,  0,  0,  0,224, 64, 64, 96,160,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_115[] = {  4,  0,  0,  0,  0,224, 32, 96,128,224,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_116[] = {  4,  0,  0,  0,  0, 48, 64, 64, 64,224, 64,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_117[] = {  5,  0,  0,  0,  0,104,144,144,144,144,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_118[] = {  5,  0,  0,  0,  0, 32, 96, 80,144,216,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_119[] = {  8,  0,  0,  0,  0, 40,108, 84,146,219,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_120[] = {  6,  0,  0,  0,  0,216, 80, 32, 80,216,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_121[] = {  5,  0,  0,128,128, 64, 96,160,144,184,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_122[] = {  5,  0,  0,  0,  0,240,144, 64, 32,240,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_123[] = {  4,  0,  0, 32, 64, 64, 64,128, 64, 64, 64, 32,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_124[] = {  2,  0,  0,128,128,128,128,128,128,128,128,128,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_125[] = {  4,  0,  0,128, 64, 64, 64, 32, 64, 64, 64,128,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_126[] = {  7,  0,  0,  0,  0,  0,  0,152,100,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_127[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_128[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_129[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_130[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_131[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_132[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_133[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_134[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_135[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_136[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_137[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_138[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_139[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_140[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_141[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_142[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_143[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_144[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_145[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_146[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_147[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_148[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_149[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_150[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_151[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_152[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_153[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_154[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_155[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_156[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_157[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_158[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_159[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_160[] = {  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_161[] = {  3,  0,  0, 64, 64, 64, 64, 64,  0, 64,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_162[] = {  5,  0,  0,  0,128,224,144,128,144,112, 16,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_163[] = {  5,  0,  0,  0,  0,240,200, 64,224, 64, 80, 48,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_164[] = {  5,  0,  0,  0,  0,  0,136,112, 80, 80,112,136,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_165[] = {  5,  0,  0,  0,  0,112, 32,248, 32,216, 80,136,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_166[] = {  2,  0,  0,  0,  0,128,128,128,  0,128,128,128,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_167[] = {  5,  0,  0,  0,224,144, 32, 80,144,160, 64,144,112,  0,  0};\r
-static const GLubyte TimesRoman10_Character_168[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 80,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_169[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 28,  0, 34,  0, 77,  0, 81,  0, 77,  0, 34,  0, 28,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_170[] = {  4,  0,  0,  0,  0,  0,  0,224,  0,160, 32,192,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_171[] = {  5,  0,  0,  0,  0,  0, 80,160,160, 80,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_172[] = {  7,  0,  0,  0,  0,  0,  4,  4,124,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_173[] = {  4,  0,  0,  0,  0,  0,  0,224,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_174[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 28,  0, 34,  0, 85,  0, 89,  0, 93,  0, 34,  0, 28,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_175[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,224,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_176[] = {  4,  0,  0,  0,  0,  0,  0,  0, 96,144,144, 96,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_177[] = {  6,  0,  0,  0,  0,248,  0, 32, 32,248, 32, 32,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_178[] = {  3,  0,  0,  0,  0,  0,  0,  0,224, 64,160, 96,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_179[] = {  3,  0,  0,  0,  0,  0,  0,  0,192, 32, 64,224,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_180[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,128, 64,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_181[] = {  5,  0,  0,128,128,232,144,144,144,144,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_182[] = {  6,  0,  0, 40, 40, 40, 40,104,232,232,232,124,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_183[] = {  2,  0,  0,  0,  0,  0,  0,128,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_184[] = {  4,  0,192, 32, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_185[] = {  3,  0,  0,  0,  0,  0,  0,  0,224, 64,192, 64,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_186[] = {  4,  0,  0,  0,  0,  0,  0,224,  0, 64,160, 64,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_187[] = {  5,  0,  0,  0,  0,  0,160, 80, 80,160,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_188[] = {  8,  0,  0,  0,  0, 68, 62, 44,244, 72,200, 68,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_189[] = {  8,  0,  0,  0,  0, 78, 36, 42,246, 72,200, 68,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_190[] = {  8,  0,  0,  0,  0, 68, 62, 44,212, 40, 72,228,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_191[] = {  4,  0,  0,224,160,128, 64, 64,  0, 64,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_192[] = {  8,  0,  0,  0,  0,238, 68,124, 40, 40, 56, 16,  0, 16, 32};\r
-static const GLubyte TimesRoman10_Character_193[] = {  8,  0,  0,  0,  0,238, 68,124, 40, 40, 56, 16,  0, 16,  8};\r
-static const GLubyte TimesRoman10_Character_194[] = {  8,  0,  0,  0,  0,238, 68,124, 40, 40, 56, 16,  0, 40, 16};\r
-static const GLubyte TimesRoman10_Character_195[] = {  8,  0,  0,  0,  0,238, 68,124, 40, 40, 56, 16,  0, 40, 20};\r
-static const GLubyte TimesRoman10_Character_196[] = {  8,  0,  0,  0,  0,238, 68,124, 40, 40, 56, 16,  0, 40,  0};\r
-static const GLubyte TimesRoman10_Character_197[] = {  8,  0,  0,  0,  0,238, 68,124, 40, 40, 56, 16, 16, 40, 16};\r
-static const GLubyte TimesRoman10_Character_198[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,239,  0, 73,  0,120,  0, 46,  0, 40,  0, 57,  0, 31,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_199[] = {  7,  0, 96, 16, 32,120,196,128,128,128,196,124,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_200[] = {  6,  0,  0,  0,  0,248, 72, 64,112, 64, 72,248,  0, 32, 64};\r
-static const GLubyte TimesRoman10_Character_201[] = {  6,  0,  0,  0,  0,248, 72, 64,112, 64, 72,248,  0, 32, 16};\r
-static const GLubyte TimesRoman10_Character_202[] = {  6,  0,  0,  0,  0,248, 72, 64,112, 64, 72,248,  0, 80, 32};\r
-static const GLubyte TimesRoman10_Character_203[] = {  6,  0,  0,  0,  0,248, 72, 64,112, 64, 72,248,  0, 80,  0};\r
-static const GLubyte TimesRoman10_Character_204[] = {  4,  0,  0,  0,  0,224, 64, 64, 64, 64, 64,224,  0, 64,128};\r
-static const GLubyte TimesRoman10_Character_205[] = {  4,  0,  0,  0,  0,224, 64, 64, 64, 64, 64,224,  0, 64, 32};\r
-static const GLubyte TimesRoman10_Character_206[] = {  4,  0,  0,  0,  0,224, 64, 64, 64, 64, 64,224,  0,160, 64};\r
-static const GLubyte TimesRoman10_Character_207[] = {  4,  0,  0,  0,  0,224, 64, 64, 64, 64, 64,224,  0,160,  0};\r
-static const GLubyte TimesRoman10_Character_208[] = {  7,  0,  0,  0,  0,248, 76, 68,228, 68, 76,248,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_209[] = {  8,  0,  0,  0,  0,228, 76, 76, 84, 84,100,238,  0, 80, 40};\r
-static const GLubyte TimesRoman10_Character_210[] = {  7,  0,  0,  0,  0,120,204,132,132,132,204,120,  0, 32, 64};\r
-static const GLubyte TimesRoman10_Character_211[] = {  7,  0,  0,  0,  0,120,204,132,132,132,204,120,  0, 16,  8};\r
-static const GLubyte TimesRoman10_Character_212[] = {  7,  0,  0,  0,  0,120,204,132,132,132,204,120,  0, 80, 32};\r
-static const GLubyte TimesRoman10_Character_213[] = {  7,  0,  0,  0,  0,120,204,132,132,132,204,120,  0, 80, 40};\r
-static const GLubyte TimesRoman10_Character_214[] = {  7,  0,  0,  0,  0,120,204,132,132,132,204,120,  0, 80,  0};\r
-static const GLubyte TimesRoman10_Character_215[] = {  6,  0,  0,  0,  0,136, 80, 32, 80,136,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_216[] = {  8,  0,  0,  0,128,124,102, 82, 82, 74,102, 62,  1,  0,  0};\r
-static const GLubyte TimesRoman10_Character_217[] = {  8,  0,  0,  0,  0, 56,108, 68, 68, 68, 68,238,  0, 16, 32};\r
-static const GLubyte TimesRoman10_Character_218[] = {  8,  0,  0,  0,  0, 56,108, 68, 68, 68, 68,238,  0, 16,  8};\r
-static const GLubyte TimesRoman10_Character_219[] = {  8,  0,  0,  0,  0, 56,108, 68, 68, 68, 68,238,  0, 40, 16};\r
-static const GLubyte TimesRoman10_Character_220[] = {  8,  0,  0,  0,  0, 56,108, 68, 68, 68, 68,238,  0, 40,  0};\r
-static const GLubyte TimesRoman10_Character_221[] = {  8,  0,  0,  0,  0, 56, 16, 16, 40, 40, 68,238,  0, 16,  8};\r
-static const GLubyte TimesRoman10_Character_222[] = {  6,  0,  0,  0,  0,224, 64,112, 72,112, 64,224,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_223[] = {  5,  0,  0,  0,  0,224, 80, 80, 96, 80, 80, 32,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_224[] = {  4,  0,  0,  0,  0,224,160, 96, 32,192,  0, 64,128,  0,  0};\r
-static const GLubyte TimesRoman10_Character_225[] = {  4,  0,  0,  0,  0,224,160, 96, 32,192,  0, 64, 32,  0,  0};\r
-static const GLubyte TimesRoman10_Character_226[] = {  4,  0,  0,  0,  0,224,160, 96, 32,192,  0,160, 64,  0,  0};\r
-static const GLubyte TimesRoman10_Character_227[] = {  4,  0,  0,  0,  0,224,160, 96, 32,192,  0,160, 80,  0,  0};\r
-static const GLubyte TimesRoman10_Character_228[] = {  4,  0,  0,  0,  0,224,160, 96, 32,192,  0,160,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_229[] = {  4,  0,  0,  0,  0,224,160, 96, 32,192, 64,160, 64,  0,  0};\r
-static const GLubyte TimesRoman10_Character_230[] = {  6,  0,  0,  0,  0,216,160,112, 40,216,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_231[] = {  4,  0,192, 32, 64, 96,128,128,128, 96,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_232[] = {  4,  0,  0,  0,  0, 96,128,192,160, 96,  0, 64,128,  0,  0};\r
-static const GLubyte TimesRoman10_Character_233[] = {  4,  0,  0,  0,  0, 96,128,192,160, 96,  0, 64, 32,  0,  0};\r
-static const GLubyte TimesRoman10_Character_234[] = {  4,  0,  0,  0,  0, 96,128,192,160, 96,  0,160, 64,  0,  0};\r
-static const GLubyte TimesRoman10_Character_235[] = {  4,  0,  0,  0,  0, 96,128,192,160, 96,  0,160,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_236[] = {  4,  0,  0,  0,  0,224, 64, 64, 64,192,  0, 64,128,  0,  0};\r
-static const GLubyte TimesRoman10_Character_237[] = {  4,  0,  0,  0,  0,224, 64, 64, 64,192,  0, 64, 32,  0,  0};\r
-static const GLubyte TimesRoman10_Character_238[] = {  4,  0,  0,  0,  0,224, 64, 64, 64,192,  0,160, 64,  0,  0};\r
-static const GLubyte TimesRoman10_Character_239[] = {  4,  0,  0,  0,  0,224, 64, 64, 64,192,  0,160,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_240[] = {  5,  0,  0,  0,  0, 96,144,144,144,112,160,112, 64,  0,  0};\r
-static const GLubyte TimesRoman10_Character_241[] = {  5,  0,  0,  0,  0,216,144,144,144,224,  0,160, 80,  0,  0};\r
-static const GLubyte TimesRoman10_Character_242[] = {  5,  0,  0,  0,  0, 96,144,144,144, 96,  0, 32, 64,  0,  0};\r
-static const GLubyte TimesRoman10_Character_243[] = {  5,  0,  0,  0,  0, 96,144,144,144, 96,  0, 64, 32,  0,  0};\r
-static const GLubyte TimesRoman10_Character_244[] = {  5,  0,  0,  0,  0, 96,144,144,144, 96,  0,160, 64,  0,  0};\r
-static const GLubyte TimesRoman10_Character_245[] = {  5,  0,  0,  0,  0, 96,144,144,144, 96,  0,160, 80,  0,  0};\r
-static const GLubyte TimesRoman10_Character_246[] = {  5,  0,  0,  0,  0, 96,144,144,144, 96,  0,160,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_247[] = {  6,  0,  0,  0,  0, 32,  0,248,  0, 32,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_248[] = {  5,  0,  0,  0,  0,224,144,144,144,112,  8,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_249[] = {  5,  0,  0,  0,  0,104,144,144,144,144,  0, 32, 64,  0,  0};\r
-static const GLubyte TimesRoman10_Character_250[] = {  5,  0,  0,  0,  0,104,144,144,144,144,  0, 64, 32,  0,  0};\r
-static const GLubyte TimesRoman10_Character_251[] = {  5,  0,  0,  0,  0,104,144,144,144,144,  0, 80, 32,  0,  0};\r
-static const GLubyte TimesRoman10_Character_252[] = {  5,  0,  0,  0,  0,104,144,144,144,144,  0, 80,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_253[] = {  5,  0,  0,128,192, 64, 96,160,144,184,  0, 32, 16,  0,  0};\r
-static const GLubyte TimesRoman10_Character_254[] = {  5,  0,  0,192,128,224,144,144,144,224,128,128,  0,  0,  0};\r
-static const GLubyte TimesRoman10_Character_255[] = {  5,  0,  0,128,192, 64, 96,160,144,184,  0,160,  0,  0,  0};\r
-\r
-/* The font characters mapping: */\r
-static const GLubyte* TimesRoman10_Character_Map[] = {TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,\r
-                                                      TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,\r
-                                                      TimesRoman10_Character_032,TimesRoman10_Character_033,TimesRoman10_Character_034,TimesRoman10_Character_035,TimesRoman10_Character_036,TimesRoman10_Character_037,TimesRoman10_Character_038,TimesRoman10_Character_039,TimesRoman10_Character_040,TimesRoman10_Character_041,TimesRoman10_Character_042,TimesRoman10_Character_043,TimesRoman10_Character_044,TimesRoman10_Character_045,TimesRoman10_Character_046,TimesRoman10_Character_047,\r
-                                                      TimesRoman10_Character_048,TimesRoman10_Character_049,TimesRoman10_Character_050,TimesRoman10_Character_051,TimesRoman10_Character_052,TimesRoman10_Character_053,TimesRoman10_Character_054,TimesRoman10_Character_055,TimesRoman10_Character_056,TimesRoman10_Character_057,TimesRoman10_Character_058,TimesRoman10_Character_059,TimesRoman10_Character_060,TimesRoman10_Character_061,TimesRoman10_Character_062,TimesRoman10_Character_063,\r
-                                                      TimesRoman10_Character_064,TimesRoman10_Character_065,TimesRoman10_Character_066,TimesRoman10_Character_067,TimesRoman10_Character_068,TimesRoman10_Character_069,TimesRoman10_Character_070,TimesRoman10_Character_071,TimesRoman10_Character_072,TimesRoman10_Character_073,TimesRoman10_Character_074,TimesRoman10_Character_075,TimesRoman10_Character_076,TimesRoman10_Character_077,TimesRoman10_Character_078,TimesRoman10_Character_079,\r
-                                                      TimesRoman10_Character_080,TimesRoman10_Character_081,TimesRoman10_Character_082,TimesRoman10_Character_083,TimesRoman10_Character_084,TimesRoman10_Character_085,TimesRoman10_Character_086,TimesRoman10_Character_087,TimesRoman10_Character_088,TimesRoman10_Character_089,TimesRoman10_Character_090,TimesRoman10_Character_091,TimesRoman10_Character_092,TimesRoman10_Character_093,TimesRoman10_Character_094,TimesRoman10_Character_095,\r
-                                                      TimesRoman10_Character_096,TimesRoman10_Character_097,TimesRoman10_Character_098,TimesRoman10_Character_099,TimesRoman10_Character_100,TimesRoman10_Character_101,TimesRoman10_Character_102,TimesRoman10_Character_103,TimesRoman10_Character_104,TimesRoman10_Character_105,TimesRoman10_Character_106,TimesRoman10_Character_107,TimesRoman10_Character_108,TimesRoman10_Character_109,TimesRoman10_Character_110,TimesRoman10_Character_111,\r
-                                                      TimesRoman10_Character_112,TimesRoman10_Character_113,TimesRoman10_Character_114,TimesRoman10_Character_115,TimesRoman10_Character_116,TimesRoman10_Character_117,TimesRoman10_Character_118,TimesRoman10_Character_119,TimesRoman10_Character_120,TimesRoman10_Character_121,TimesRoman10_Character_122,TimesRoman10_Character_123,TimesRoman10_Character_124,TimesRoman10_Character_125,TimesRoman10_Character_126,TimesRoman10_Character_032,\r
-                                                      TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,\r
-                                                      TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,\r
-                                                      TimesRoman10_Character_160,TimesRoman10_Character_161,TimesRoman10_Character_162,TimesRoman10_Character_163,TimesRoman10_Character_164,TimesRoman10_Character_165,TimesRoman10_Character_166,TimesRoman10_Character_167,TimesRoman10_Character_168,TimesRoman10_Character_169,TimesRoman10_Character_170,TimesRoman10_Character_171,TimesRoman10_Character_172,TimesRoman10_Character_173,TimesRoman10_Character_174,TimesRoman10_Character_175,\r
-                                                      TimesRoman10_Character_176,TimesRoman10_Character_177,TimesRoman10_Character_178,TimesRoman10_Character_179,TimesRoman10_Character_180,TimesRoman10_Character_181,TimesRoman10_Character_182,TimesRoman10_Character_183,TimesRoman10_Character_184,TimesRoman10_Character_185,TimesRoman10_Character_186,TimesRoman10_Character_187,TimesRoman10_Character_188,TimesRoman10_Character_189,TimesRoman10_Character_190,TimesRoman10_Character_191,\r
-                                                      TimesRoman10_Character_192,TimesRoman10_Character_193,TimesRoman10_Character_194,TimesRoman10_Character_195,TimesRoman10_Character_196,TimesRoman10_Character_197,TimesRoman10_Character_198,TimesRoman10_Character_199,TimesRoman10_Character_200,TimesRoman10_Character_201,TimesRoman10_Character_202,TimesRoman10_Character_203,TimesRoman10_Character_204,TimesRoman10_Character_205,TimesRoman10_Character_206,TimesRoman10_Character_207,\r
-                                                      TimesRoman10_Character_208,TimesRoman10_Character_209,TimesRoman10_Character_210,TimesRoman10_Character_211,TimesRoman10_Character_212,TimesRoman10_Character_213,TimesRoman10_Character_214,TimesRoman10_Character_215,TimesRoman10_Character_216,TimesRoman10_Character_217,TimesRoman10_Character_218,TimesRoman10_Character_219,TimesRoman10_Character_220,TimesRoman10_Character_221,TimesRoman10_Character_222,TimesRoman10_Character_223,\r
-                                                      TimesRoman10_Character_224,TimesRoman10_Character_225,TimesRoman10_Character_226,TimesRoman10_Character_227,TimesRoman10_Character_228,TimesRoman10_Character_229,TimesRoman10_Character_230,TimesRoman10_Character_231,TimesRoman10_Character_232,TimesRoman10_Character_233,TimesRoman10_Character_234,TimesRoman10_Character_235,TimesRoman10_Character_236,TimesRoman10_Character_237,TimesRoman10_Character_238,TimesRoman10_Character_239,\r
-                                                      TimesRoman10_Character_240,TimesRoman10_Character_241,TimesRoman10_Character_242,TimesRoman10_Character_243,TimesRoman10_Character_244,TimesRoman10_Character_245,TimesRoman10_Character_246,TimesRoman10_Character_247,TimesRoman10_Character_248,TimesRoman10_Character_249,TimesRoman10_Character_250,TimesRoman10_Character_251,TimesRoman10_Character_252,TimesRoman10_Character_253,TimesRoman10_Character_254,TimesRoman10_Character_255,NULL};\r
-\r
-/* The font structure: */\r
-const SFG_Font fgFontTimesRoman10 = { "-adobe-times-medium-r-normal--10-100-75-75-p-54-iso8859-1", 256, 14, TimesRoman10_Character_Map, 0, 4 };\r
-\r
-static const GLubyte TimesRoman24_Character_000[] = { 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0, 64,  0, 64,  0,  0,  0, 64,  0, 64,  0,  0,  0, 64,  0, 64,  0,  0,  0, 64,  0, 64,  0,  0,  0, 64,  0, 64,  0,  0,  0, 64,  0, 64,  0,  0,  0, 64,  0, 64,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_001[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_002[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_003[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_004[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_005[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_006[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_007[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_008[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_009[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_010[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_011[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_012[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_013[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_014[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_015[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_016[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_017[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_018[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_019[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_020[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_021[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_022[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_023[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_024[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_025[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_026[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_027[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_028[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_029[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_030[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_031[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_032[] = {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_033[] = {  8,  0,  0,  0,  0,  0,  0,  0, 24, 24,  0,  0,  0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_034[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 68,  0,102,  0,102,  0,102,  0,102,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_035[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 17,  0, 17,  0, 17,  0, 17,  0, 17,  0,127,224,127,224,  8,128,  8,128,  8,128, 63,240, 63,240,  4, 64,  4, 64,  4, 64,  4, 64,  4, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_036[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  4,  0, 63,  0,229,192,196,192,132, 96,132, 96,  4, 96,  4,224,  7,192,  7,128, 30,  0, 60,  0,116,  0,100,  0,100, 32,100, 96, 52,224, 31,128,  4,  0,  4,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_037[] = { 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 30,  0, 12, 57,  0,  6, 48,128,  2, 48, 64,  3, 48, 64,  1,152, 64,  0,140,192,  0,199,128, 60, 96,  0,114, 32,  0, 97, 48,  0, 96,152,  0, 96,136,  0, 48,140,  0, 25,254,  0, 15,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_038[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30, 30,  0, 63,191,  0,112,240,128, 96, 96,  0, 96,224,  0, 96,208,  0, 49,144,  0, 27,136,  0, 15, 12,  0,  7, 31,  0,  7,128,  0, 14,192,  0, 12, 96,  0, 12, 32,  0, 12, 32,  0,  6, 96,  0,  3,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_039[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 12,  4, 28, 24,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_040[] = {  8,  0,  0,  2,  4,  8, 24, 16, 48, 48, 96, 96, 96, 96, 96, 96, 96, 96, 48, 48, 16, 24,  8,  4,  2,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_041[] = {  8,  0,  0, 64, 32, 16, 24,  8, 12, 12,  6,  6,  6,  6,  6,  6,  6,  6, 12, 12,  8, 24, 16, 32, 64,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_042[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  7,  0, 50, 96, 58,224,  7,  0, 58,224, 50, 96,  7,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_043[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,127,248,127,248,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_044[] = {  7,  0,  0,  0,  0, 48, 24,  8, 56, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_045[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,248,127,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_046[] = {  6,  0,  0,  0,  0,  0,  0,  0, 48, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_047[] = {  7,  0,  0,  0,  0,192,192,192, 64, 96, 96, 32, 48, 48, 16, 24, 24,  8, 12, 12,  4,  6,  6,  6,  6,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_048[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 25,128, 48,192, 48,192,112,224, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 48,192, 25,128, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_049[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 63,192,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0, 30,  0,  6,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_050[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,192,127,224, 48, 32, 24,  0, 12,  0,  6,  0,  2,  0,  3,  0,  1,128,  1,128,  0,192,  0,192, 64,192, 64,192, 33,192, 63,128, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_051[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 60,  0,115,  0, 97,128,  0,128,  0,192,  0,192,  0,192,  1,192,  3,128, 15,  0,  6,  0,  3,  0, 65,128, 65,128, 35,128, 63,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_052[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,128,  1,128,  1,128,  1,128,127,224,127,224, 97,128, 33,128, 49,128, 17,128, 25,128,  9,128, 13,128,  5,128,  3,128,  3,128,  1,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_053[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 63,  0,113,192, 96,192,  0, 96,  0, 96,  0, 96,  0, 96,  0,224,  1,192,  7,192, 63,  0, 60,  0, 48,  0, 16,  0, 16,  0, 15,192, 15,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_054[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 61,192, 48,192,112, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,192,121,192,119,  0, 48,  0, 56,  0, 24,  0, 12,  0,  7,  0,  1,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_055[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  6,  0,  6,  0,  6,  0,  2,  0,  3,  0,  3,  0,  1,  0,  1,128,  1,128,  0,128,  0,192, 64,192, 96, 96,127,224, 63,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_056[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 57,192,112,192, 96, 96, 96, 96, 96, 96, 32,224, 48,192, 27,128, 15,  0, 15,  0, 25,128, 48,192, 48,192, 48,192, 25,128, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_057[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,120,  0, 14,  0,  3,  0,  1,128,  1,192,  0,192, 14,192, 57,224, 48,224, 96, 96, 96, 96, 96, 96, 96, 96, 96,224, 48,192, 59,192, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_058[] = {  6,  0,  0,  0,  0,  0,  0,  0, 48, 48,  0,  0,  0,  0,  0,  0,  0, 48, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_059[] = {  7,  0,  0,  0,  0, 48, 24,  8, 56, 48,  0,  0,  0,  0,  0,  0,  0, 48, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_060[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48,  0,224,  3,128, 14,  0, 56,  0, 96,  0, 56,  0, 14,  0,  3,128,  0,224,  0, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_061[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,248,127,248,  0,  0,  0,  0,127,248,127,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_062[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96,  0, 56,  0, 14,  0,  3,128,  0,224,  0, 48,  0,224,  3,128, 14,  0, 56,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_063[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  4,  0,  4,  0,  4,  0,  6,  0,  6,  0,  3,  0,  3,128,  1,192, 48,192, 48,192, 32,192, 49,128, 31,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_064[] = { 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252,  0,  3,131,  0,  6,  0,  0, 12,  0,  0, 24,119,128, 24,222,192, 49,142, 96, 49,134, 32, 49,134, 48, 49,134, 16, 49,131, 16, 48,195, 16, 48,227, 16, 56,127, 16, 24, 59, 48, 28,  0, 32, 14,  0, 96,  7,  0,192,  3,195,128,  0,254,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_065[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 31,128, 48,  6,  0, 16,  6,  0, 16, 12,  0, 24, 12,  0,  8, 12,  0, 15,248,  0, 12, 24,  0,  4, 24,  0,  4, 48,  0,  6, 48,  0,  2, 48,  0,  2, 96,  0,  1, 96,  0,  1,192,  0,  1,192,  0,  0,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_066[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,240, 24, 60, 24, 12, 24,  6, 24,  6, 24,  6, 24, 12, 24, 28, 31,240, 24, 32, 24, 24, 24, 12, 24, 12, 24, 12, 24, 24, 24, 56,127,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_067[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240, 15, 28, 28,  4, 48,  2, 48,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 48,  2, 48,  2, 28,  6, 14, 30,  3,242,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_068[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,224,  0, 24, 56,  0, 24, 28,  0, 24,  6,  0, 24,  6,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  6,  0, 24,  6,  0, 24, 28,  0, 24, 56,  0,127,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_069[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,252, 24, 12, 24,  4, 24,  4, 24,  0, 24,  0, 24, 32, 24, 32, 31,224, 24, 32, 24, 32, 24,  0, 24,  0, 24,  8, 24,  8, 24, 24,127,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_070[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24, 16, 24, 16, 31,240, 24, 16, 24, 16, 24,  0, 24,  0, 24,  8, 24,  8, 24, 24,127,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_071[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 15, 28,  0, 28, 14,  0, 48,  6,  0, 48,  6,  0, 96,  6,  0, 96,  6,  0, 96, 31,128, 96,  0,  0, 96,  0,  0, 96,  0,  0, 96,  0,  0, 48,  2,  0, 48,  2,  0, 28,  6,  0, 14, 30,  0,  3,242,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_072[] = { 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126, 15,192, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 31,255,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0,126, 15,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_073[] = {  8,  0,  0,  0,  0,  0,  0,  0,126, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,126,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_074[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 60,  0,102,  0, 99,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0, 15,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_075[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126, 15,128, 24,  7,  0, 24, 14,  0, 24, 28,  0, 24, 56,  0, 24,112,  0, 24,224,  0, 25,192,  0, 31,128,  0, 31,  0,  0, 25,128,  0, 24,192,  0, 24, 96,  0, 24, 48,  0, 24, 24,  0, 24, 12,  0,126, 63,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_076[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,252, 24, 12, 24,  4, 24,  4, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0,126,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_077[] = { 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124, 16,252, 16, 48, 48, 16, 48, 48, 16,104, 48, 16,104, 48, 16,196, 48, 16,196, 48, 17,132, 48, 17,130, 48, 19,  2, 48, 19,  1, 48, 22,  1, 48, 22,  1, 48, 28,  0,176, 28,  0,176, 24,  0,112,120,  0,124,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_078[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,  6,  0, 16, 14,  0, 16, 14,  0, 16, 26,  0, 16, 50,  0, 16, 50,  0, 16, 98,  0, 16,194,  0, 16,194,  0, 17,130,  0, 19,  2,  0, 19,  2,  0, 22,  2,  0, 28,  2,  0, 28,  2,  0, 24,  2,  0,120, 15,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_079[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 28,  0, 28, 14,  0, 48,  3,  0, 48,  3,  0, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 48,  3,  0, 48,  3,  0, 28, 14,  0, 14, 28,  0,  3,240,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_080[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 31,224, 24, 56, 24, 24, 24, 12, 24, 12, 24, 12, 24, 24, 24, 56,127,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_081[] = { 18,  0,  0,  0,  0,  0,  0,  0,  7,128,  0, 28,  0,  0, 56,  0,  0,112,  0,  0,224,  0,  3,240,  0, 14, 28,  0, 28, 14,  0, 48,  3,  0, 48,  3,  0, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 48,  3,  0, 48,  3,  0, 28, 14,  0, 14, 28,  0,  3,240,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_082[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126, 15, 24, 14, 24, 28, 24, 56, 24, 48, 24, 96, 24,224, 25,192, 31,224, 24, 56, 24, 24, 24, 28, 24, 12, 24, 28, 24, 24, 24, 56,127,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_083[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 79,  0,120,192, 96, 96, 64, 48, 64, 48,  0, 48,  0,112,  1,224,  7,192, 15,  0, 60,  0,112,  0, 96, 32, 96, 32, 96, 96, 49,224, 15, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_084[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,224,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128, 65,130, 65,130, 97,134,127,254,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_085[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 24,  0, 12,  4,  0, 24,  4,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0,126, 15,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_086[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,128,  0,  1,128,  0,  1,128,  0,  3,192,  0,  3, 64,  0,  3, 96,  0,  6, 32,  0,  6, 32,  0,  6, 48,  0, 12, 16,  0, 12, 24,  0, 24,  8,  0, 24,  8,  0, 24, 12,  0, 48,  4,  0, 48,  6,  0,252, 31,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_087[] = { 23,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,131,  0,  1,131,  0,  1,131,128,  3,135,128,  3, 70,128,  3, 70,192,  6, 70, 64,  6, 76, 64,  6, 76, 96, 12, 44, 96, 12, 44, 32, 24, 44, 32, 24, 24, 48, 24, 24, 16, 48, 24, 16, 48, 24, 24,252,126,126,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_088[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 15,192, 48,  3,128, 24,  7,  0,  8, 14,  0,  4, 12,  0,  6, 24,  0,  2, 56,  0,  1,112,  0,  0,224,  0,  0,192,  0,  1,192,  0,  3,160,  0,  3, 16,  0,  6,  8,  0, 14, 12,  0, 28,  6,  0,126, 15,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_089[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,224,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  3,192,  3, 64,  6, 96,  6, 32, 12, 48, 28, 16, 24, 24, 56,  8, 48, 12,252, 63,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_090[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,252,112, 12, 56,  4, 24,  4, 28,  0, 12,  0, 14,  0,  7,  0,  3,  0,  3,128,  1,128,  1,192,  0,224, 64, 96, 64,112, 96, 56,127,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_091[] = {  8,  0,  0,  0, 62, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 62,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_092[] = {  7,  0,  0,  0,  0,  0,  0,  0,  6,  6,  4, 12, 12,  8, 24, 24, 16, 48, 48, 32, 96, 96, 64,192,192,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_093[] = {  8,  0,  0,  0,124, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,124,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_094[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 64, 64, 96,192, 32,128, 49,128, 17,  0, 27,  0, 10,  0, 14,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_095[] = { 13,  0,  0,  0,  0,255,248,255,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_096[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48,112, 64, 96, 48,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_097[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128,  7,128,  1,128, 49,128, 51,128, 31,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_098[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 47,  0, 57,192, 48,192, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,192, 57,192, 55,  0, 48,  0, 48,  0, 48,  0, 48,  0,112,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_099[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 63,128, 56, 64,112,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 32,192, 49,192, 15,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_100[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15, 96, 57,192, 48,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 48,192, 57,192, 14,192,  0,192,  0,192,  0,192,  0,192,  1,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_101[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 63,128, 56, 64,112,  0, 96,  0, 96,  0, 96,  0,127,192, 96,192, 32,192, 49,128, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_102[] = {  7,  0,  0,  0,  0,  0,  0,  0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,254, 48, 48, 48, 22, 14,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_103[] = { 12,  0,  0,  0,  0, 31,128,120,224, 96, 48, 96, 16, 48, 48, 31,224, 63,128, 48,  0, 24,  0, 31,  0, 25,128, 48,192, 48,192, 48,192, 48,192, 25,128, 15,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_104[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,120,240, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 56,224, 55,192, 51,128, 48,  0, 48,  0, 48,  0, 48,  0,112,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_105[] = {  6,  0,  0,  0,  0,  0,  0,  0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112,  0,  0,  0, 48, 48,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_106[] = {  6,  0,  0,192,224, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112,  0,  0,  0, 48, 48,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_107[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,121,240, 48,224, 49,192, 51,128, 55,  0, 54,  0, 60,  0, 52,  0, 50,  0, 51,  0, 49,128, 51,224, 48,  0, 48,  0, 48,  0, 48,  0,112,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_108[] = {  6,  0,  0,  0,  0,  0,  0,  0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_109[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,120,241,224, 48, 96,192, 48, 96,192, 48, 96,192, 48, 96,192, 48, 96,192, 48, 96,192, 48, 96,192, 48, 96,192, 56,241,192, 55,207,128,115,135,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_110[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,120,240, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 56,224, 55,192,115,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_111[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_112[] = { 12,  0,  0,  0,  0,120,  0, 48,  0, 48,  0, 48,  0, 48,  0, 55,  0, 57,192, 48,192, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,192, 57,192,119,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_113[] = { 12,  0,  0,  0,  0,  1,224,  0,192,  0,192,  0,192,  0,192, 14,192, 57,192, 48,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 48,192, 57,192, 14,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_114[] = {  8,  0,  0,  0,  0,  0,  0,  0,120, 48, 48, 48, 48, 48, 48, 48, 48, 59, 55,115,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_115[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,  0, 99,  0, 65,128,  1,128,  3,128, 15,  0, 62,  0, 56,  0,112,  0, 97,  0, 51,  0, 31,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_116[] = {  7,  0,  0,  0,  0,  0,  0,  0, 28, 50, 48, 48, 48, 48, 48, 48, 48, 48, 48,254,112, 48, 16,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_117[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,112, 31, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_118[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0, 14,  0, 14,  0, 26,  0, 25,  0, 25,  0, 49,  0, 48,128, 48,128, 96,128, 96,192,241,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_119[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4, 16,  0, 14, 56,  0, 14, 56,  0, 26, 40,  0, 26,100,  0, 25,100,  0, 49,100,  0, 48,194,  0, 48,194,  0, 96,194,  0, 96,195,  0,241,231,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_120[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,120,240, 48, 96, 16,192, 25,192, 13,128,  7,  0,  6,  0, 13,  0, 28,128, 24,192, 48, 96,120,240,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_121[] = { 11,  0,  0,  0,  0,224,  0,240,  0, 24,  0,  8,  0, 12,  0,  4,  0, 14,  0, 14,  0, 26,  0, 25,  0, 25,  0, 49,  0, 48,128, 48,128, 96,128, 96,192,241,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_122[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,128, 97,128, 48,128, 56,  0, 24,  0, 28,  0, 12,  0, 14,  0,  7,  0, 67,  0, 97,128,127,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_123[] = { 10,  0,  0,  0,  0,  3,128,  6,  0, 12,  0, 12,  0, 12,  0, 12,  0, 12,  0, 12,  0,  8,  0, 24,  0, 16,  0, 96,  0, 16,  0, 24,  0,  8,  0, 12,  0, 12,  0, 12,  0, 12,  0, 12,  0,  6,  0,  3,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_124[] = {  6,  0,  0,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_125[] = { 10,  0,  0,  0,  0,112,  0, 24,  0, 12,  0, 12,  0, 12,  0, 12,  0, 12,  0, 12,  0,  4,  0,  6,  0,  2,  0,  1,128,  2,  0,  6,  0,  4,  0, 12,  0, 12,  0, 12,  0, 12,  0, 12,  0, 24,  0,112,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_126[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 65,192, 99,224, 62, 48, 28, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_127[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_128[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_129[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_130[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_131[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_132[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_133[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_134[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_135[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_136[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_137[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_138[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_139[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_140[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_141[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_142[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_143[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_144[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_145[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_146[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_147[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_148[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_149[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_150[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_151[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_152[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_153[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_154[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_155[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_156[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_157[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_158[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_159[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_160[] = {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_161[] = {  8,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_162[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0, 32,  0, 31,  0, 63,128, 56, 64,104,  0,100,  0,100,  0,100,  0, 98,  0, 98,  0, 33,192, 49,192, 15,128,  0,128,  0,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_163[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,115,192, 95, 96, 60, 32, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0,126,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,192, 12,192,  7,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_164[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 48,119,112, 63,224, 24,192, 48, 96, 48, 96, 48, 96, 48, 96, 24,192, 63,224,119,112, 96, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_165[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,192,  3,  0,  3,  0,  3,  0,  3,  0, 31,224,  3,  0, 31,224,  3,  0,  7,128, 12,128, 12,192, 24, 64, 24, 96, 48, 32,112, 48,248,124,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_166[] = {  6,  0,  0,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_167[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,  0, 25,  0, 24,128,  1,128,  3,128,  7,  0, 14,  0, 29,  0, 56,128, 48,192, 32,192, 33,192, 19,128, 15,  0, 14,  0, 28,  0, 24,  0, 17,128,  9,128,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_168[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,102,102,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_169[] = { 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,248,  0, 14, 14,  0, 24,  3,  0, 48,225,128, 35,184,128, 98, 12,192, 70,  0, 64, 68,  0, 64, 68,  0, 64, 68,  0, 64, 70,  0, 64, 98, 12,192, 35,152,128, 48,241,128, 24,  3,  0, 14, 14,  0,  3,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_170[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,  0,118,204,204,124, 12,204,120,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_171[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2, 32,  6, 96, 12,192, 25,128, 51,  0, 51,  0, 25,128, 12,192,  6, 96,  2, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_172[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,127,248,127,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_173[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_174[] = { 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,248,  0, 14, 14,  0, 24,  3,  0, 48,  1,128, 35,140,128, 97, 24,192, 65, 16, 64, 65, 32, 64, 65,240, 64, 65, 24, 64, 65,  8, 64, 97,  8,192, 33, 24,128, 51,241,128, 24,  3,  0, 14, 14,  0,  3,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_175[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,126,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_176[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 28,  0, 34,  0, 65,  0, 65,  0, 65,  0, 34,  0, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_177[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,248,127,248,  0,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,127,248,127,248,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_178[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 68, 32, 48, 16,  8, 12,140, 76, 56,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_179[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,112,136,140, 12,  8, 48,  8,140, 76, 56,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_180[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32, 24, 14,  6,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_181[] = { 13,  0,  0,  0,  0, 32,  0,112,  0, 96,  0, 32,  0, 32,  0, 46,112, 63, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_182[] = { 11,  0,  0,  0,  0,  4,128,  4,128,  4,128,  4,128,  4,128,  4,128,  4,128,  4,128,  4,128,  4,128,  4,128, 12,128, 28,128, 60,128, 60,128,124,128,124,128,124,128, 60,128, 60,128, 28,128, 15,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_183[] = {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_184[] = {  8,  0, 60,102,  6, 30, 24,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_185[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124, 16, 16, 16, 16, 16, 16, 80, 48, 16,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_186[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,  0, 60,102,102,102,102,102, 60,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_187[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0, 51,  0, 25,128, 12,192,  6, 96,  6, 96, 12,192, 25,128, 51,  0, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_188[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24,  2,  0,  8,  2,  0, 12,127,128,  4, 34,  0,  6, 50,  0,  3, 18,  0,  1, 10,  0,125,142,  0, 16,134,  0, 16,194,  0, 16, 96,  0, 16, 32,  0, 16, 48,  0, 16, 16,  0, 80, 24,  0, 48, 12,  0, 16,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_189[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 63,  0,  8, 17,  0, 12,  8,  0,  4, 12,  0,  6,  4,  0,  3,  2,  0,  1,  3,  0,125,163,  0, 16,147,  0, 16,206,  0, 16, 96,  0, 16, 32,  0, 16, 48,  0, 16, 16,  0, 80, 24,  0, 48, 12,  0, 16,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_190[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24,  2,  0,  8,  2,  0, 12,127,128,  4, 34,  0,  6, 50,  0,  3, 18,  0,  1, 10,  0,113,142,  0,136,134,  0,140,194,  0, 12, 96,  0,  8, 32,  0, 48, 48,  0,  8, 16,  0,140, 24,  0, 76, 12,  0, 56,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_191[] = { 11,  0,  0,  0,  0, 31,  0, 49,128, 96,128, 97,128, 97,128,112,  0, 56,  0, 24,  0, 28,  0, 12,  0, 12,  0,  4,  0,  4,  0,  0,  0,  0,  0,  6,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_192[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 31,128, 48,  6,  0, 16,  6,  0, 16, 12,  0, 24, 12,  0,  8, 12,  0, 15,248,  0, 12, 24,  0,  4, 24,  0,  4, 48,  0,  6, 48,  0,  2, 48,  0,  2, 96,  0,  1, 96,  0,  1,192,  0,  1,192,  0,  0,128,  0,  0,  0,  0,  0, 32,  0,  0,192,  0,  3,128,  0,  3,  0,  0};\r
-static const GLubyte TimesRoman24_Character_193[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 31,128, 48,  6,  0, 16,  6,  0, 16, 12,  0, 24, 12,  0,  8, 12,  0, 15,248,  0, 12, 24,  0,  4, 24,  0,  4, 48,  0,  6, 48,  0,  2, 48,  0,  2, 96,  0,  1, 96,  0,  1,192,  0,  1,192,  0,  0,128,  0,  0,  0,  0,  1,  0,  0,  0,192,  0,  0,112,  0,  0, 48,  0};\r
-static const GLubyte TimesRoman24_Character_194[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 31,128, 48,  6,  0, 16,  6,  0, 16, 12,  0, 24, 12,  0,  8, 12,  0, 15,248,  0, 12, 24,  0,  4, 24,  0,  4, 48,  0,  6, 48,  0,  2, 48,  0,  2, 96,  0,  1, 96,  0,  1,192,  0,  1,192,  0,  0,128,  0,  0,  0,  0,  8, 16,  0,  6, 96,  0,  3,192,  0,  1,128,  0};\r
-static const GLubyte TimesRoman24_Character_195[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 31,128, 48,  7,  0, 16,  6,  0, 16, 12,  0, 24, 12,  0,  8, 12,  0, 15,248,  0, 12, 24,  0,  4, 24,  0,  4, 48,  0,  6, 48,  0,  2, 48,  0,  2, 96,  0,  1, 96,  0,  1,192,  0,  1,192,  0,  0,128,  0,  0,  0,  0,  0,  0,  0,  4,224,  0,  3,144,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_196[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 31,128, 48,  6,  0, 16,  6,  0, 16, 12,  0, 24, 12,  0,  8, 12,  0, 15,248,  0, 12, 24,  0,  4, 24,  0,  4, 48,  0,  6, 48,  0,  2, 48,  0,  2, 96,  0,  1, 96,  0,  1,192,  0,  1,192,  0,  0,128,  0,  0,  0,  0,  0,  0,  0,  6, 48,  0,  6, 48,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_197[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 31,128, 48,  6,  0, 16,  6,  0, 16, 12,  0, 24, 12,  0,  8, 12,  0, 15,248,  0, 12, 24,  0,  4, 24,  0,  4, 48,  0,  6, 48,  0,  2, 48,  0,  2, 96,  0,  1, 96,  0,  1,192,  0,  1,192,  0,  0,128,  0,  1,192,  0,  2, 32,  0,  2, 32,  0,  1,192,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_198[] = { 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,249,255,240, 48, 96, 48, 16, 96, 16, 16, 96, 16, 24, 96,  0,  8, 96,  0, 15,224,128, 12, 96,128,  4,127,128,  4, 96,128,  6, 96,128,  2, 96,  0,  2, 96,  0,  1, 96, 32,  1, 96, 32,  1,224, 96,  3,255,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_199[] = { 16,  0,  0,  3,192,  6, 96,  0, 96,  1,224,  1,128,  0,128,  3,240, 15, 28, 28,  4, 48,  2, 48,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 48,  2, 48,  2, 28,  6, 14, 30,  3,242,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_200[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,252, 24, 12, 24,  4, 24,  4, 24,  0, 24,  0, 24, 32, 24, 32, 31,224, 24, 32, 24, 32, 24,  0, 24,  0, 24,  8, 24,  8, 24, 24,127,248,  0,  0,  0,128,  3,  0, 14,  0, 12,  0};\r
-static const GLubyte TimesRoman24_Character_201[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,252, 24, 12, 24,  4, 24,  4, 24,  0, 24,  0, 24, 32, 24, 32, 31,224, 24, 32, 24, 32, 24,  0, 24,  0, 24,  8, 24,  8, 24, 24,127,248,  0,  0,  2,  0,  1,128,  0,224,  0, 96};\r
-static const GLubyte TimesRoman24_Character_202[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,252, 24, 12, 24,  4, 24,  4, 24,  0, 24,  0, 24, 32, 24, 32, 31,224, 24, 32, 24, 32, 24,  0, 24,  0, 24,  8, 24,  8, 24, 24,127,248,  0,  0,  8, 16,  6, 96,  3,192,  1,128};\r
-static const GLubyte TimesRoman24_Character_203[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,252, 24, 12, 24,  4, 24,  4, 24,  0, 24,  0, 24, 32, 24, 32, 31,224, 24, 32, 24, 32, 24,  0, 24,  0, 24,  8, 24,  8, 24, 24,127,248,  0,  0,  0,  0, 12,192, 12,192,  0,  0};\r
-static const GLubyte TimesRoman24_Character_204[] = {  8,  0,  0,  0,  0,  0,  0,  0,126, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,126,  0,  4, 24,112, 96};\r
-static const GLubyte TimesRoman24_Character_205[] = {  8,  0,  0,  0,  0,  0,  0,  0,126, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,126,  0, 32, 24, 14,  6};\r
-static const GLubyte TimesRoman24_Character_206[] = {  8,  0,  0,  0,  0,  0,  0,  0, 63, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 63,  0, 64, 51, 30, 12};\r
-static const GLubyte TimesRoman24_Character_207[] = {  8,  0,  0,  0,  0,  0,  0,  0,126, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,126,  0,  0,102,102,  0};\r
-static const GLubyte TimesRoman24_Character_208[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,224,  0, 24, 56,  0, 24, 28,  0, 24,  6,  0, 24,  6,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0,255,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  6,  0, 24,  6,  0, 24, 28,  0, 24, 56,  0,127,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_209[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,  6,  0, 16, 14,  0, 16, 14,  0, 16, 26,  0, 16, 50,  0, 16, 50,  0, 16, 98,  0, 16,194,  0, 16,194,  0, 17,130,  0, 19,  2,  0, 19,  2,  0, 22,  2,  0, 28,  2,  0, 28,  2,  0, 24,  2,  0,120, 15,128,  0,  0,  0,  0,  0,  0,  2,112,  0,  1,200,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_210[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 28,  0, 28, 14,  0, 48,  3,  0, 48,  3,  0, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 48,  3,  0, 48,  3,  0, 28, 14,  0, 14, 28,  0,  3,240,  0,  0,  0,  0,  0, 32,  0,  0,192,  0,  3,128,  0,  3,  0,  0};\r
-static const GLubyte TimesRoman24_Character_211[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 28,  0, 28, 14,  0, 48,  3,  0, 48,  3,  0, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 48,  3,  0, 48,  3,  0, 28, 14,  0, 14, 28,  0,  3,240,  0,  0,  0,  0,  0,128,  0,  0, 96,  0,  0, 56,  0,  0, 24,  0};\r
-static const GLubyte TimesRoman24_Character_212[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 28,  0, 28, 14,  0, 48,  3,  0, 48,  3,  0, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 48,  3,  0, 48,  3,  0, 28, 14,  0, 14, 28,  0,  3,240,  0,  0,  0,  0,  4,  8,  0,  3, 48,  0,  1,224,  0,  0,192,  0};\r
-static const GLubyte TimesRoman24_Character_213[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 28,  0, 28, 14,  0, 48,  3,  0, 48,  3,  0, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 48,  3,  0, 48,  3,  0, 28, 14,  0, 14, 28,  0,  3,240,  0,  0,  0,  0,  0,  0,  0,  2,112,  0,  1,200,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_214[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 28,  0, 28, 14,  0, 48,  3,  0, 48,  3,  0, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 48,  3,  0, 48,  3,  0, 28, 14,  0, 14, 28,  0,  3,240,  0,  0,  0,  0,  0,  0,  0,  3, 48,  0,  3, 48,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_215[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32, 16, 48, 48, 24, 96, 12,192,  7,128,  3,  0,  7,128, 12,192, 24, 96, 48, 48, 32, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_216[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16,  0,  0, 19,240,  0, 14, 28,  0, 28, 14,  0, 52,  3,  0, 50,  3,  0, 97,  1,128, 97,  1,128, 96,129,128, 96,129,128, 96, 65,128, 96, 65,128, 96, 33,128, 48, 35,  0, 48, 19,  0, 28, 14,  0, 14, 28,  0,  3,242,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_217[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 24,  0, 12,  4,  0, 24,  4,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0,126, 15,128,  0,  0,  0,  0, 32,  0,  0,192,  0,  3,128,  0,  3,  0,  0};\r
-static const GLubyte TimesRoman24_Character_218[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 24,  0, 12,  4,  0, 24,  4,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0,126, 15,128,  0,  0,  0,  0,128,  0,  0, 96,  0,  0, 56,  0,  0, 24,  0};\r
-static const GLubyte TimesRoman24_Character_219[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 24,  0, 12,  4,  0, 24,  4,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0,126, 15,128,  0,  0,  0,  4,  8,  0,  3, 48,  0,  1,224,  0,  0,192,  0};\r
-static const GLubyte TimesRoman24_Character_220[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 24,  0, 12,  4,  0, 24,  4,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0,126, 15,128,  0,  0,  0,  0,  0,  0,  3, 24,  0,  3, 24,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_221[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,224,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  3,192,  3, 64,  6, 96,  6, 32, 12, 48, 28, 16, 24, 24, 56,  8, 48, 12,252, 63,  0,  0,  1,  0,  0,192,  0,112,  0, 48};\r
-static const GLubyte TimesRoman24_Character_222[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,  0, 24,  0, 24,  0, 24,  0, 31,224, 24, 56, 24, 24, 24, 12, 24, 12, 24, 12, 24, 24, 24, 56, 31,224, 24,  0, 24,  0, 24,  0,126,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_223[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,115,128, 54, 64, 54, 96, 48, 96, 48, 96, 48,224, 48,192, 49,192, 51,128, 54,  0, 49,128, 48,192, 48,192, 48,192, 48,192, 25,128, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_224[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128,  7,128,  1,128, 49,128, 51,128, 31,  0,  0,  0,  2,  0, 12,  0, 56,  0, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_225[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128,  7,128,  1,128, 49,128, 51,128, 31,  0,  0,  0,  8,  0,  6,  0,  3,128,  1,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_226[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128,  7,128,  1,128, 49,128, 51,128, 31,  0,  0,  0, 33,  0, 18,  0, 30,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_227[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128,  7,128,  1,128, 49,128, 51,128, 31,  0,  0,  0,  0,  0, 46,  0, 29,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_228[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128,  7,128,  1,128, 49,128, 51,128, 31,  0,  0,  0,  0,  0, 51,  0, 51,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_229[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128,  7,128,  1,128, 49,128, 51,128, 31,  0,  0,  0, 14,  0, 17,  0, 17,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_230[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,120,125,252, 99,194, 97,128, 97,128, 49,128, 29,128,  7,254,  1,134, 49,134, 51,204, 30,120,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_231[] = { 11,  0,  0, 30,  0, 51,  0,  3,  0, 15,  0, 12,  0,  4,  0, 15,  0, 63,128, 56, 64,112,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 32,192, 49,192, 15,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_232[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 63,128, 56, 64,112,  0, 96,  0, 96,  0, 96,  0,127,192, 96,192, 32,192, 49,128, 15,  0,  0,  0,  2,  0, 12,  0, 56,  0, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_233[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 63,128, 56, 64,112,  0, 96,  0, 96,  0, 96,  0,127,192, 96,192, 32,192, 49,128, 15,  0,  0,  0,  8,  0,  6,  0,  3,128,  1,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_234[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 63,128, 56, 64,112,  0, 96,  0, 96,  0, 96,  0,127,192, 96,192, 32,192, 49,128, 15,  0,  0,  0, 16,128,  9,  0, 15,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_235[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 63,128, 56, 64,112,  0, 96,  0, 96,  0, 96,  0,127,192, 96,192, 32,192, 49,128, 15,  0,  0,  0,  0,  0, 25,128, 25,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_236[] = {  6,  0,  0,  0,  0,  0,  0,  0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112,  0,  8, 48,224,192,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_237[] = {  6,  0,  0,  0,  0,  0,  0,  0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112,  0, 64, 48, 28, 12,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_238[] = {  6,  0,  0,  0,  0,  0,  0,  0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112,  0,132, 72,120, 48,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_239[] = {  6,  0,  0,  0,  0,  0,  0,  0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112,  0,  0,204,204,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_240[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15,128, 99,  0, 30,  0, 15,  0, 56,192, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_241[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,120,240, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 56,224, 55,192,115,128,  0,  0,  0,  0, 19,128, 14, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_242[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15,  0,  0,  0,  1,  0,  6,  0, 28,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_243[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15,  0,  0,  0,  4,  0,  3,  0,  1,192,  0,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_244[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15,  0,  0,  0, 16,128,  9,  0, 15,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_245[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15,  0,  0,  0,  0,  0, 19,128, 14, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_246[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15,  0,  0,  0,  0,  0, 25,128, 25,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_247[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  3,  0,  0,  0,  0,  0,127,248,127,248,  0,  0,  0,  0,  3,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_248[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96,  0,111,  0, 57,192, 56,192,104, 96,108, 96,100, 96,102, 96, 98, 96, 99, 96, 49,192, 57,192, 15, 96,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_249[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,112, 31, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224,  0,  0,  1,  0,  6,  0, 28,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_250[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,112, 31, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224,  0,  0,  4,  0,  3,  0,  1,192,  0,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_251[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,112, 31, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224,  0,  0, 16,128,  9,  0, 15,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_252[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,112, 31, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224,  0,  0,  0,  0, 25,128, 25,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_253[] = { 11,  0,  0,  0,  0,224,  0,240,  0, 24,  0,  8,  0, 12,  0,  4,  0, 14,  0, 14,  0, 26,  0, 25,  0, 25,  0, 49,  0, 48,128, 48,128, 96,128, 96,192,241,224,  0,  0,  8,  0,  6,  0,  3,128,  1,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_254[] = { 12,  0,  0,  0,  0,120,  0, 48,  0, 48,  0, 48,  0, 48,  0, 55,  0, 57,192, 48,192, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,192, 57,192, 55,  0, 48,  0, 48,  0, 48,  0, 48,  0,112,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-static const GLubyte TimesRoman24_Character_255[] = { 11,  0,  0,  0,  0,224,  0,240,  0, 24,  0,  8,  0, 12,  0,  4,  0, 14,  0, 14,  0, 26,  0, 25,  0, 25,  0, 49,  0, 48,128, 48,128, 96,128, 96,192,241,224,  0,  0,  0,  0, 51,  0, 51,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};\r
-\r
-/* The font characters mapping: */\r
-static const GLubyte* TimesRoman24_Character_Map[] = {TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,\r
-                                                      TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,\r
-                                                      TimesRoman24_Character_032,TimesRoman24_Character_033,TimesRoman24_Character_034,TimesRoman24_Character_035,TimesRoman24_Character_036,TimesRoman24_Character_037,TimesRoman24_Character_038,TimesRoman24_Character_039,TimesRoman24_Character_040,TimesRoman24_Character_041,TimesRoman24_Character_042,TimesRoman24_Character_043,TimesRoman24_Character_044,TimesRoman24_Character_045,TimesRoman24_Character_046,TimesRoman24_Character_047,\r
-                                                      TimesRoman24_Character_048,TimesRoman24_Character_049,TimesRoman24_Character_050,TimesRoman24_Character_051,TimesRoman24_Character_052,TimesRoman24_Character_053,TimesRoman24_Character_054,TimesRoman24_Character_055,TimesRoman24_Character_056,TimesRoman24_Character_057,TimesRoman24_Character_058,TimesRoman24_Character_059,TimesRoman24_Character_060,TimesRoman24_Character_061,TimesRoman24_Character_062,TimesRoman24_Character_063,\r
-                                                      TimesRoman24_Character_064,TimesRoman24_Character_065,TimesRoman24_Character_066,TimesRoman24_Character_067,TimesRoman24_Character_068,TimesRoman24_Character_069,TimesRoman24_Character_070,TimesRoman24_Character_071,TimesRoman24_Character_072,TimesRoman24_Character_073,TimesRoman24_Character_074,TimesRoman24_Character_075,TimesRoman24_Character_076,TimesRoman24_Character_077,TimesRoman24_Character_078,TimesRoman24_Character_079,\r
-                                                      TimesRoman24_Character_080,TimesRoman24_Character_081,TimesRoman24_Character_082,TimesRoman24_Character_083,TimesRoman24_Character_084,TimesRoman24_Character_085,TimesRoman24_Character_086,TimesRoman24_Character_087,TimesRoman24_Character_088,TimesRoman24_Character_089,TimesRoman24_Character_090,TimesRoman24_Character_091,TimesRoman24_Character_092,TimesRoman24_Character_093,TimesRoman24_Character_094,TimesRoman24_Character_095,\r
-                                                      TimesRoman24_Character_096,TimesRoman24_Character_097,TimesRoman24_Character_098,TimesRoman24_Character_099,TimesRoman24_Character_100,TimesRoman24_Character_101,TimesRoman24_Character_102,TimesRoman24_Character_103,TimesRoman24_Character_104,TimesRoman24_Character_105,TimesRoman24_Character_106,TimesRoman24_Character_107,TimesRoman24_Character_108,TimesRoman24_Character_109,TimesRoman24_Character_110,TimesRoman24_Character_111,\r
-                                                      TimesRoman24_Character_112,TimesRoman24_Character_113,TimesRoman24_Character_114,TimesRoman24_Character_115,TimesRoman24_Character_116,TimesRoman24_Character_117,TimesRoman24_Character_118,TimesRoman24_Character_119,TimesRoman24_Character_120,TimesRoman24_Character_121,TimesRoman24_Character_122,TimesRoman24_Character_123,TimesRoman24_Character_124,TimesRoman24_Character_125,TimesRoman24_Character_126,TimesRoman24_Character_032,\r
-                                                      TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,\r
-                                                      TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,\r
-                                                      TimesRoman24_Character_160,TimesRoman24_Character_161,TimesRoman24_Character_162,TimesRoman24_Character_163,TimesRoman24_Character_164,TimesRoman24_Character_165,TimesRoman24_Character_166,TimesRoman24_Character_167,TimesRoman24_Character_168,TimesRoman24_Character_169,TimesRoman24_Character_170,TimesRoman24_Character_171,TimesRoman24_Character_172,TimesRoman24_Character_173,TimesRoman24_Character_174,TimesRoman24_Character_175,\r
-                                                      TimesRoman24_Character_176,TimesRoman24_Character_177,TimesRoman24_Character_178,TimesRoman24_Character_179,TimesRoman24_Character_180,TimesRoman24_Character_181,TimesRoman24_Character_182,TimesRoman24_Character_183,TimesRoman24_Character_184,TimesRoman24_Character_185,TimesRoman24_Character_186,TimesRoman24_Character_187,TimesRoman24_Character_188,TimesRoman24_Character_189,TimesRoman24_Character_190,TimesRoman24_Character_191,\r
-                                                      TimesRoman24_Character_192,TimesRoman24_Character_193,TimesRoman24_Character_194,TimesRoman24_Character_195,TimesRoman24_Character_196,TimesRoman24_Character_197,TimesRoman24_Character_198,TimesRoman24_Character_199,TimesRoman24_Character_200,TimesRoman24_Character_201,TimesRoman24_Character_202,TimesRoman24_Character_203,TimesRoman24_Character_204,TimesRoman24_Character_205,TimesRoman24_Character_206,TimesRoman24_Character_207,\r
-                                                      TimesRoman24_Character_208,TimesRoman24_Character_209,TimesRoman24_Character_210,TimesRoman24_Character_211,TimesRoman24_Character_212,TimesRoman24_Character_213,TimesRoman24_Character_214,TimesRoman24_Character_215,TimesRoman24_Character_216,TimesRoman24_Character_217,TimesRoman24_Character_218,TimesRoman24_Character_219,TimesRoman24_Character_220,TimesRoman24_Character_221,TimesRoman24_Character_222,TimesRoman24_Character_223,\r
-                                                      TimesRoman24_Character_224,TimesRoman24_Character_225,TimesRoman24_Character_226,TimesRoman24_Character_227,TimesRoman24_Character_228,TimesRoman24_Character_229,TimesRoman24_Character_230,TimesRoman24_Character_231,TimesRoman24_Character_232,TimesRoman24_Character_233,TimesRoman24_Character_234,TimesRoman24_Character_235,TimesRoman24_Character_236,TimesRoman24_Character_237,TimesRoman24_Character_238,TimesRoman24_Character_239,\r
-                                                      TimesRoman24_Character_240,TimesRoman24_Character_241,TimesRoman24_Character_242,TimesRoman24_Character_243,TimesRoman24_Character_244,TimesRoman24_Character_245,TimesRoman24_Character_246,TimesRoman24_Character_247,TimesRoman24_Character_248,TimesRoman24_Character_249,TimesRoman24_Character_250,TimesRoman24_Character_251,TimesRoman24_Character_252,TimesRoman24_Character_253,TimesRoman24_Character_254,TimesRoman24_Character_255,NULL};\r
-\r
-/* The font structure: */\r
-const SFG_Font fgFontTimesRoman24 = { "-adobe-times-medium-r-normal--24-240-75-75-p-124-iso8859-1", 256, 29, TimesRoman24_Character_Map, 0, 7 };\r
-\r
+/*
+    \file  og_font_data.c
+    \brief Bitmapped font data for OpenGLUT fonts.
+*/
+
+/*
+ * This file has been automatically generated by the 
+ * genfonts utility.
+ *
+ * The legal status of this file is a bit vague.  The font glyphs
+ * themselves come from XFree86 v4.3.0 (as of this writing), and as
+ * part of the X server may be subject to the XFree86 copyrights.
+ * The original freeglut fonts were extracted by a utility written
+ * by Pawel W. Olszta (see below) and the generated fonts contained
+ * his copyright exclusively.  Steve Baker asserts that Pawel
+ * assigned intellectual property rights to Steve Baker.  Steve
+ * Baker also asserts that fonts cannot be copyrighted.  He has
+ * neither stripped the copyright from the freeglut fonts nor
+ * formally retitled anything in his name.  Since that time, the
+ * OpenGLUT project has branched from freeglut, and has made
+ * necessary modifications to Pawel's ``genfonts'' utility.
+ * To that extent, OpenGLUT may have some title to this file.
+ * What is fairly clear is that the font data is licensed under
+ * the XFree86 license (which is variously termed ``XFree'' and
+ * ``MIT'' by the freeglut project).  It is believed that all
+ * title holders wish this file to be as useful as possible, and
+ * that either the ``XFree'' or ``MIT'' license works.
+ *
+ * Portions copyright (c) 2004, the OpenGLUT project contributors.
+ * OpenGLUT branched from freeglut in February, 2004.
+ *
+ * Copyright (c) 1999-2000 by Pawel W. Olszta
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Sotware.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+/*
+ * The following bitmapped fonts are defined in this file:
+ * 
+ * 1. fgFontFixed8x13
+ *       -misc-fixed-medium-r-normal--13-120-75-75-C-80-iso8859-1
+ * 2. fgFontFixed9x15
+ *       -misc-fixed-medium-r-normal--15-140-75-75-C-90-iso8859-1
+ * 3. fgFontHelvetica10
+ *       -adobe-helvetica-medium-r-normal--10-100-75-75-p-56-iso8859-1
+ * 4. fgFontHelvetica12
+ *       -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1
+ * 5. fgFontHelvetica18
+ *       -adobe-helvetica-medium-r-normal--18-180-75-75-p-98-iso8859-1
+ * 6. fgFontTimesRoman10
+ *       -adobe-times-medium-r-normal--10-100-75-75-p-54-iso8859-1
+ * 7. fgFontTimesRoman24
+ *       -adobe-times-medium-r-normal--24-240-75-75-p-124-iso8859-1
+ */
+
+static const GLubyte Fixed8x13_Character_000[] = {  8,  0,  0,  0,170,  0,130,  0,130,  0,130,  0,170,  0,  0};
+static const GLubyte Fixed8x13_Character_001[] = {  8,  0,  0,  0,  0, 16, 56,124,254,124, 56, 16,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_002[] = {  8,  0,170, 85,170, 85,170, 85,170, 85,170, 85,170, 85,170};
+static const GLubyte Fixed8x13_Character_003[] = {  8,  0,  0,  0,  4,  4,  4,  4,174,160,224,160,160,  0,  0};
+static const GLubyte Fixed8x13_Character_004[] = {  8,  0,  0,  0,  8,  8, 12,  8,142,128,192,128,224,  0,  0};
+static const GLubyte Fixed8x13_Character_005[] = {  8,  0,  0,  0, 10, 10, 12, 10,108,128,128,128, 96,  0,  0};
+static const GLubyte Fixed8x13_Character_006[] = {  8,  0,  0,  0,  8,  8, 12,  8,238,128,128,128,128,  0,  0};
+static const GLubyte Fixed8x13_Character_007[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0, 24, 36, 36, 24,  0,  0};
+static const GLubyte Fixed8x13_Character_008[] = {  8,  0,  0,  0,  0,124,  0, 16, 16,124, 16, 16,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_009[] = {  8,  0,  0,  0, 14,  8,  8,  8,168,160,160,160,192,  0,  0};
+static const GLubyte Fixed8x13_Character_010[] = {  8,  0,  0,  0,  4,  4,  4,  4, 46, 80, 80,136,136,  0,  0};
+static const GLubyte Fixed8x13_Character_011[] = {  8,  0,  0,  0,  0,  0,  0,  0,240, 16, 16, 16, 16, 16, 16};
+static const GLubyte Fixed8x13_Character_012[] = {  8,  0, 16, 16, 16, 16, 16, 16,240,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_013[] = {  8,  0, 16, 16, 16, 16, 16, 16, 31,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_014[] = {  8,  0,  0,  0,  0,  0,  0,  0, 31, 16, 16, 16, 16, 16, 16};
+static const GLubyte Fixed8x13_Character_015[] = {  8,  0, 16, 16, 16, 16, 16, 16,255, 16, 16, 16, 16, 16, 16};
+static const GLubyte Fixed8x13_Character_016[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255};
+static const GLubyte Fixed8x13_Character_017[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_018[] = {  8,  0,  0,  0,  0,  0,  0,  0,255,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_019[] = {  8,  0,  0,  0,  0,255,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_020[] = {  8,  0,255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_021[] = {  8,  0, 16, 16, 16, 16, 16, 16, 31, 16, 16, 16, 16, 16, 16};
+static const GLubyte Fixed8x13_Character_022[] = {  8,  0, 16, 16, 16, 16, 16, 16,240, 16, 16, 16, 16, 16, 16};
+static const GLubyte Fixed8x13_Character_023[] = {  8,  0,  0,  0,  0,  0,  0,  0,255, 16, 16, 16, 16, 16, 16};
+static const GLubyte Fixed8x13_Character_024[] = {  8,  0, 16, 16, 16, 16, 16, 16,255,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_025[] = {  8,  0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16};
+static const GLubyte Fixed8x13_Character_026[] = {  8,  0,  0,  0,254,  0, 14, 48,192, 48, 14,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_027[] = {  8,  0,  0,  0,254,  0,224, 24,  6, 24,224,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_028[] = {  8,  0,  0,  0, 68, 68, 68, 68, 68,254,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_029[] = {  8,  0,  0,  0, 32, 32,126, 16,  8,126,  4,  4,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_030[] = {  8,  0,  0,  0,220, 98, 32, 32, 32,112, 32, 34, 28,  0,  0};
+static const GLubyte Fixed8x13_Character_031[] = {  8,  0,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_032[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_033[] = {  8,  0,  0,  0, 16,  0, 16, 16, 16, 16, 16, 16, 16,  0,  0};
+static const GLubyte Fixed8x13_Character_034[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0, 36, 36, 36,  0,  0};
+static const GLubyte Fixed8x13_Character_035[] = {  8,  0,  0,  0,  0, 36, 36,126, 36,126, 36, 36,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_036[] = {  8,  0,  0,  0, 16,120, 20, 20, 56, 80, 80, 60, 16,  0,  0};
+static const GLubyte Fixed8x13_Character_037[] = {  8,  0,  0,  0, 68, 42, 36, 16,  8,  8, 36, 82, 34,  0,  0};
+static const GLubyte Fixed8x13_Character_038[] = {  8,  0,  0,  0, 58, 68, 74, 48, 72, 72, 48,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_039[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0, 64, 48, 56,  0,  0};
+static const GLubyte Fixed8x13_Character_040[] = {  8,  0,  0,  0,  4,  8,  8, 16, 16, 16,  8,  8,  4,  0,  0};
+static const GLubyte Fixed8x13_Character_041[] = {  8,  0,  0,  0, 32, 16, 16,  8,  8,  8, 16, 16, 32,  0,  0};
+static const GLubyte Fixed8x13_Character_042[] = {  8,  0,  0,  0,  0,  0, 36, 24,126, 24, 36,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_043[] = {  8,  0,  0,  0,  0,  0, 16, 16,124, 16, 16,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_044[] = {  8,  0,  0, 64, 48, 56,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_045[] = {  8,  0,  0,  0,  0,  0,  0,  0,126,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_046[] = {  8,  0,  0, 16, 56, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_047[] = {  8,  0,  0,  0,128,128, 64, 32, 16,  8,  4,  2,  2,  0,  0};
+static const GLubyte Fixed8x13_Character_048[] = {  8,  0,  0,  0, 24, 36, 66, 66, 66, 66, 66, 36, 24,  0,  0};
+static const GLubyte Fixed8x13_Character_049[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 16, 80, 48, 16,  0,  0};
+static const GLubyte Fixed8x13_Character_050[] = {  8,  0,  0,  0,126, 64, 32, 24,  4,  2, 66, 66, 60,  0,  0};
+static const GLubyte Fixed8x13_Character_051[] = {  8,  0,  0,  0, 60, 66,  2,  2, 28,  8,  4,  2,126,  0,  0};
+static const GLubyte Fixed8x13_Character_052[] = {  8,  0,  0,  0,  4,  4,126, 68, 68, 36, 20, 12,  4,  0,  0};
+static const GLubyte Fixed8x13_Character_053[] = {  8,  0,  0,  0, 60, 66,  2,  2, 98, 92, 64, 64,126,  0,  0};
+static const GLubyte Fixed8x13_Character_054[] = {  8,  0,  0,  0, 60, 66, 66, 98, 92, 64, 64, 32, 28,  0,  0};
+static const GLubyte Fixed8x13_Character_055[] = {  8,  0,  0,  0, 32, 32, 16, 16,  8,  8,  4,  2,126,  0,  0};
+static const GLubyte Fixed8x13_Character_056[] = {  8,  0,  0,  0, 60, 66, 66, 66, 60, 66, 66, 66, 60,  0,  0};
+static const GLubyte Fixed8x13_Character_057[] = {  8,  0,  0,  0, 56,  4,  2,  2, 58, 70, 66, 66, 60,  0,  0};
+static const GLubyte Fixed8x13_Character_058[] = {  8,  0,  0, 16, 56, 16,  0,  0, 16, 56, 16,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_059[] = {  8,  0,  0, 64, 48, 56,  0,  0, 16, 56, 16,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_060[] = {  8,  0,  0,  0,  2,  4,  8, 16, 32, 16,  8,  4,  2,  0,  0};
+static const GLubyte Fixed8x13_Character_061[] = {  8,  0,  0,  0,  0,  0,126,  0,  0,126,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_062[] = {  8,  0,  0,  0, 64, 32, 16,  8,  4,  8, 16, 32, 64,  0,  0};
+static const GLubyte Fixed8x13_Character_063[] = {  8,  0,  0,  0,  8,  0,  8,  8,  4,  2, 66, 66, 60,  0,  0};
+static const GLubyte Fixed8x13_Character_064[] = {  8,  0,  0,  0, 60, 64, 74, 86, 82, 78, 66, 66, 60,  0,  0};
+static const GLubyte Fixed8x13_Character_065[] = {  8,  0,  0,  0, 66, 66, 66,126, 66, 66, 66, 36, 24,  0,  0};
+static const GLubyte Fixed8x13_Character_066[] = {  8,  0,  0,  0,252, 66, 66, 66,124, 66, 66, 66,252,  0,  0};
+static const GLubyte Fixed8x13_Character_067[] = {  8,  0,  0,  0, 60, 66, 64, 64, 64, 64, 64, 66, 60,  0,  0};
+static const GLubyte Fixed8x13_Character_068[] = {  8,  0,  0,  0,252, 66, 66, 66, 66, 66, 66, 66,252,  0,  0};
+static const GLubyte Fixed8x13_Character_069[] = {  8,  0,  0,  0,126, 64, 64, 64,120, 64, 64, 64,126,  0,  0};
+static const GLubyte Fixed8x13_Character_070[] = {  8,  0,  0,  0, 64, 64, 64, 64,120, 64, 64, 64,126,  0,  0};
+static const GLubyte Fixed8x13_Character_071[] = {  8,  0,  0,  0, 58, 70, 66, 78, 64, 64, 64, 66, 60,  0,  0};
+static const GLubyte Fixed8x13_Character_072[] = {  8,  0,  0,  0, 66, 66, 66, 66,126, 66, 66, 66, 66,  0,  0};
+static const GLubyte Fixed8x13_Character_073[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 16, 16, 16,124,  0,  0};
+static const GLubyte Fixed8x13_Character_074[] = {  8,  0,  0,  0, 56, 68,  4,  4,  4,  4,  4,  4, 31,  0,  0};
+static const GLubyte Fixed8x13_Character_075[] = {  8,  0,  0,  0, 66, 68, 72, 80, 96, 80, 72, 68, 66,  0,  0};
+static const GLubyte Fixed8x13_Character_076[] = {  8,  0,  0,  0,126, 64, 64, 64, 64, 64, 64, 64, 64,  0,  0};
+static const GLubyte Fixed8x13_Character_077[] = {  8,  0,  0,  0,130,130,130,146,146,170,198,130,130,  0,  0};
+static const GLubyte Fixed8x13_Character_078[] = {  8,  0,  0,  0, 66, 66, 66, 70, 74, 82, 98, 66, 66,  0,  0};
+static const GLubyte Fixed8x13_Character_079[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66, 60,  0,  0};
+static const GLubyte Fixed8x13_Character_080[] = {  8,  0,  0,  0, 64, 64, 64, 64,124, 66, 66, 66,124,  0,  0};
+static const GLubyte Fixed8x13_Character_081[] = {  8,  0,  0,  2, 60, 74, 82, 66, 66, 66, 66, 66, 60,  0,  0};
+static const GLubyte Fixed8x13_Character_082[] = {  8,  0,  0,  0, 66, 68, 72, 80,124, 66, 66, 66,124,  0,  0};
+static const GLubyte Fixed8x13_Character_083[] = {  8,  0,  0,  0, 60, 66,  2,  2, 60, 64, 64, 66, 60,  0,  0};
+static const GLubyte Fixed8x13_Character_084[] = {  8,  0,  0,  0, 16, 16, 16, 16, 16, 16, 16, 16,254,  0,  0};
+static const GLubyte Fixed8x13_Character_085[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66, 66,  0,  0};
+static const GLubyte Fixed8x13_Character_086[] = {  8,  0,  0,  0, 16, 40, 40, 40, 68, 68, 68,130,130,  0,  0};
+static const GLubyte Fixed8x13_Character_087[] = {  8,  0,  0,  0, 68,170,146,146,146,130,130,130,130,  0,  0};
+static const GLubyte Fixed8x13_Character_088[] = {  8,  0,  0,  0,130,130, 68, 40, 16, 40, 68,130,130,  0,  0};
+static const GLubyte Fixed8x13_Character_089[] = {  8,  0,  0,  0, 16, 16, 16, 16, 16, 40, 68,130,130,  0,  0};
+static const GLubyte Fixed8x13_Character_090[] = {  8,  0,  0,  0,126, 64, 64, 32, 16,  8,  4,  2,126,  0,  0};
+static const GLubyte Fixed8x13_Character_091[] = {  8,  0,  0,  0, 60, 32, 32, 32, 32, 32, 32, 32, 60,  0,  0};
+static const GLubyte Fixed8x13_Character_092[] = {  8,  0,  0,  0,  2,  2,  4,  8, 16, 32, 64,128,128,  0,  0};
+static const GLubyte Fixed8x13_Character_093[] = {  8,  0,  0,  0,120,  8,  8,  8,  8,  8,  8,  8,120,  0,  0};
+static const GLubyte Fixed8x13_Character_094[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0, 68, 40, 16,  0,  0};
+static const GLubyte Fixed8x13_Character_095[] = {  8,  0,  0,254,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_096[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4, 24, 56,  0,  0};
+static const GLubyte Fixed8x13_Character_097[] = {  8,  0,  0,  0, 58, 70, 66, 62,  2, 60,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_098[] = {  8,  0,  0,  0, 92, 98, 66, 66, 98, 92, 64, 64, 64,  0,  0};
+static const GLubyte Fixed8x13_Character_099[] = {  8,  0,  0,  0, 60, 66, 64, 64, 66, 60,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_100[] = {  8,  0,  0,  0, 58, 70, 66, 66, 70, 58,  2,  2,  2,  0,  0};
+static const GLubyte Fixed8x13_Character_101[] = {  8,  0,  0,  0, 60, 66, 64,126, 66, 60,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_102[] = {  8,  0,  0,  0, 32, 32, 32, 32,124, 32, 32, 34, 28,  0,  0};
+static const GLubyte Fixed8x13_Character_103[] = {  8,  0, 60, 66, 60, 64, 56, 68, 68, 58,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_104[] = {  8,  0,  0,  0, 66, 66, 66, 66, 98, 92, 64, 64, 64,  0,  0};
+static const GLubyte Fixed8x13_Character_105[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 48,  0, 16,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_106[] = {  8,  0, 56, 68, 68,  4,  4,  4,  4, 12,  0,  4,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_107[] = {  8,  0,  0,  0, 66, 68, 72,112, 72, 68, 64, 64, 64,  0,  0};
+static const GLubyte Fixed8x13_Character_108[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 16, 16, 16, 48,  0,  0};
+static const GLubyte Fixed8x13_Character_109[] = {  8,  0,  0,  0,130,146,146,146,146,236,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_110[] = {  8,  0,  0,  0, 66, 66, 66, 66, 98, 92,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_111[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 60,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_112[] = {  8,  0, 64, 64, 64, 92, 98, 66, 98, 92,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_113[] = {  8,  0,  2,  2,  2, 58, 70, 66, 70, 58,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_114[] = {  8,  0,  0,  0, 32, 32, 32, 32, 34, 92,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_115[] = {  8,  0,  0,  0, 60, 66, 12, 48, 66, 60,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_116[] = {  8,  0,  0,  0, 28, 34, 32, 32, 32,124, 32, 32,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_117[] = {  8,  0,  0,  0, 58, 68, 68, 68, 68, 68,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_118[] = {  8,  0,  0,  0, 16, 40, 40, 68, 68, 68,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_119[] = {  8,  0,  0,  0, 68,170,146,146,130,130,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_120[] = {  8,  0,  0,  0, 66, 36, 24, 24, 36, 66,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_121[] = {  8,  0, 60, 66,  2, 58, 70, 66, 66, 66,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_122[] = {  8,  0,  0,  0,126, 32, 16,  8,  4,126,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_123[] = {  8,  0,  0,  0, 14, 16, 16,  8, 48,  8, 16, 16, 14,  0,  0};
+static const GLubyte Fixed8x13_Character_124[] = {  8,  0,  0,  0, 16, 16, 16, 16, 16, 16, 16, 16, 16,  0,  0};
+static const GLubyte Fixed8x13_Character_125[] = {  8,  0,  0,  0,112,  8,  8, 16, 12, 16,  8,  8,112,  0,  0};
+static const GLubyte Fixed8x13_Character_126[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0, 72, 84, 36,  0,  0};
+static const GLubyte Fixed8x13_Character_127[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_128[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_129[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_130[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_131[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_132[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_133[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_134[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_135[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_136[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_137[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_138[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_139[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_140[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_141[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_142[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_143[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_144[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_145[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_146[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_147[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_148[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_149[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_150[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_151[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_152[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_153[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_154[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_155[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_156[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_157[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_158[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_159[] = {  9,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_160[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_161[] = {  8,  0,  0,  0, 16, 16, 16, 16, 16, 16, 16,  0, 16,  0,  0};
+static const GLubyte Fixed8x13_Character_162[] = {  8,  0,  0,  0,  0, 16, 56, 84, 80, 80, 84, 56, 16,  0,  0};
+static const GLubyte Fixed8x13_Character_163[] = {  8,  0,  0,  0,220, 98, 32, 32, 32,112, 32, 34, 28,  0,  0};
+static const GLubyte Fixed8x13_Character_164[] = {  8,  0,  0,  0,  0, 66, 60, 36, 36, 60, 66,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_165[] = {  8,  0,  0,  0, 16, 16,124, 16,124, 40, 68,130,130,  0,  0};
+static const GLubyte Fixed8x13_Character_166[] = {  8,  0,  0,  0, 16, 16, 16, 16,  0, 16, 16, 16, 16,  0,  0};
+static const GLubyte Fixed8x13_Character_167[] = {  8,  0,  0,  0, 24, 36,  4, 24, 36, 36, 24, 32, 36, 24,  0};
+static const GLubyte Fixed8x13_Character_168[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,108,  0,  0};
+static const GLubyte Fixed8x13_Character_169[] = {  8,  0,  0,  0,  0, 56, 68,146,170,162,170,146, 68, 56,  0};
+static const GLubyte Fixed8x13_Character_170[] = {  8,  0,  0,  0,  0,  0,124,  0, 60, 68, 60,  4, 56,  0,  0};
+static const GLubyte Fixed8x13_Character_171[] = {  8,  0,  0,  0,  0, 18, 36, 72,144, 72, 36, 18,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_172[] = {  8,  0,  0,  0,  0,  2,  2,  2,126,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_173[] = {  8,  0,  0,  0,  0,  0,  0,  0, 60,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_174[] = {  8,  0,  0,  0,  0, 56, 68,170,178,170,170,146, 68, 56,  0};
+static const GLubyte Fixed8x13_Character_175[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,  0,  0};
+static const GLubyte Fixed8x13_Character_176[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0, 24, 36, 36, 24,  0,  0};
+static const GLubyte Fixed8x13_Character_177[] = {  8,  0,  0,  0,  0,124,  0, 16, 16,124, 16, 16,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_178[] = {  8,  0,  0,  0,  0,  0,  0,  0,120, 64, 48,  8, 72, 48,  0};
+static const GLubyte Fixed8x13_Character_179[] = {  8,  0,  0,  0,  0,  0,  0,  0, 48, 72,  8, 16, 72, 48,  0};
+static const GLubyte Fixed8x13_Character_180[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16,  8,  0};
+static const GLubyte Fixed8x13_Character_181[] = {  8,  0,  0, 64, 90,102, 66, 66, 66, 66,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_182[] = {  8,  0,  0,  0, 20, 20, 20, 20, 52,116,116,116, 62,  0,  0};
+static const GLubyte Fixed8x13_Character_183[] = {  8,  0,  0,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_184[] = {  8,  0, 24,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_185[] = {  8,  0,  0,  0,  0,  0,  0,  0,112, 32, 32, 32, 96, 32,  0};
+static const GLubyte Fixed8x13_Character_186[] = {  8,  0,  0,  0,  0,  0,  0,120,  0, 48, 72, 72, 48,  0,  0};
+static const GLubyte Fixed8x13_Character_187[] = {  8,  0,  0,  0,  0,144, 72, 36, 18, 36, 72,144,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_188[] = {  8,  0,  0,  0,  6, 26, 18, 10,230, 66, 64, 64,192, 64,  0};
+static const GLubyte Fixed8x13_Character_189[] = {  8,  0,  0,  0, 30, 16, 12,  2,242, 76, 64, 64,192, 64,  0};
+static const GLubyte Fixed8x13_Character_190[] = {  8,  0,  0,  0,  6, 26, 18, 10,102,146, 16, 32,144, 96,  0};
+static const GLubyte Fixed8x13_Character_191[] = {  8,  0,  0,  0, 60, 66, 66, 64, 32, 16, 16,  0, 16,  0,  0};
+static const GLubyte Fixed8x13_Character_192[] = {  8,  0,  0,  0, 66, 66,126, 66, 66, 36, 24,  0,  8, 16,  0};
+static const GLubyte Fixed8x13_Character_193[] = {  8,  0,  0,  0, 66, 66,126, 66, 66, 36, 24,  0, 16,  8,  0};
+static const GLubyte Fixed8x13_Character_194[] = {  8,  0,  0,  0, 66, 66,126, 66, 66, 36, 24,  0, 36, 24,  0};
+static const GLubyte Fixed8x13_Character_195[] = {  8,  0,  0,  0, 66, 66,126, 66, 66, 36, 24,  0, 76, 50,  0};
+static const GLubyte Fixed8x13_Character_196[] = {  8,  0,  0,  0, 66, 66,126, 66, 66, 36, 24,  0, 36, 36,  0};
+static const GLubyte Fixed8x13_Character_197[] = {  8,  0,  0,  0, 66, 66,126, 66, 66, 36, 24, 24, 36, 24,  0};
+static const GLubyte Fixed8x13_Character_198[] = {  8,  0,  0,  0,158,144,144,240,156,144,144,144,110,  0,  0};
+static const GLubyte Fixed8x13_Character_199[] = {  8,  0, 16,  8, 60, 66, 64, 64, 64, 64, 64, 66, 60,  0,  0};
+static const GLubyte Fixed8x13_Character_200[] = {  8,  0,  0,  0,126, 64, 64,120, 64, 64,126,  0,  8, 16,  0};
+static const GLubyte Fixed8x13_Character_201[] = {  8,  0,  0,  0,126, 64, 64,120, 64, 64,126,  0, 16,  8,  0};
+static const GLubyte Fixed8x13_Character_202[] = {  8,  0,  0,  0,126, 64, 64,120, 64, 64,126,  0, 36, 24,  0};
+static const GLubyte Fixed8x13_Character_203[] = {  8,  0,  0,  0,126, 64, 64,120, 64, 64,126,  0, 36, 36,  0};
+static const GLubyte Fixed8x13_Character_204[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 16,124,  0, 16, 32,  0};
+static const GLubyte Fixed8x13_Character_205[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 16,124,  0, 16,  8,  0};
+static const GLubyte Fixed8x13_Character_206[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 16,124,  0, 36, 24,  0};
+static const GLubyte Fixed8x13_Character_207[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 16,124,  0, 40, 40,  0};
+static const GLubyte Fixed8x13_Character_208[] = {  8,  0,  0,  0,120, 68, 66, 66,226, 66, 66, 68,120,  0,  0};
+static const GLubyte Fixed8x13_Character_209[] = {  8,  0,  0,  0,130,134,138,146,162,194,130,  0,152,100,  0};
+static const GLubyte Fixed8x13_Character_210[] = {  8,  0,  0,  0,124,130,130,130,130,130,124,  0, 16, 32,  0};
+static const GLubyte Fixed8x13_Character_211[] = {  8,  0,  0,  0,124,130,130,130,130,130,124,  0, 16,  8,  0};
+static const GLubyte Fixed8x13_Character_212[] = {  8,  0,  0,  0,124,130,130,130,130,130,124,  0, 36, 24,  0};
+static const GLubyte Fixed8x13_Character_213[] = {  8,  0,  0,  0,124,130,130,130,130,130,124,  0,152,100,  0};
+static const GLubyte Fixed8x13_Character_214[] = {  8,  0,  0,  0,124,130,130,130,130,130,124,  0, 40, 40,  0};
+static const GLubyte Fixed8x13_Character_215[] = {  8,  0,  0,  0,  0, 66, 36, 24, 24, 36, 66,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_216[] = {  8,  0,  0, 64, 60, 98, 82, 82, 82, 74, 74, 70, 60,  2,  0};
+static const GLubyte Fixed8x13_Character_217[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66,  0,  8, 16,  0};
+static const GLubyte Fixed8x13_Character_218[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66,  0, 16,  8,  0};
+static const GLubyte Fixed8x13_Character_219[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66,  0, 36, 24,  0};
+static const GLubyte Fixed8x13_Character_220[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66,  0, 36, 36,  0};
+static const GLubyte Fixed8x13_Character_221[] = {  8,  0,  0,  0, 16, 16, 16, 16, 40, 68, 68,  0, 16,  8,  0};
+static const GLubyte Fixed8x13_Character_222[] = {  8,  0,  0,  0, 64, 64, 64,124, 66, 66, 66,124, 64,  0,  0};
+static const GLubyte Fixed8x13_Character_223[] = {  8,  0,  0,  0, 92, 66, 66, 76, 80, 72, 68, 68, 56,  0,  0};
+static const GLubyte Fixed8x13_Character_224[] = {  8,  0,  0,  0, 58, 70, 66, 62,  2, 60,  0,  0,  8, 16,  0};
+static const GLubyte Fixed8x13_Character_225[] = {  8,  0,  0,  0, 58, 70, 66, 62,  2, 60,  0,  0,  8,  4,  0};
+static const GLubyte Fixed8x13_Character_226[] = {  8,  0,  0,  0, 58, 70, 66, 62,  2, 60,  0,  0, 36, 24,  0};
+static const GLubyte Fixed8x13_Character_227[] = {  8,  0,  0,  0, 58, 70, 66, 62,  2, 60,  0,  0, 76, 50,  0};
+static const GLubyte Fixed8x13_Character_228[] = {  8,  0,  0,  0, 58, 70, 66, 62,  2, 60,  0,  0, 36, 36,  0};
+static const GLubyte Fixed8x13_Character_229[] = {  8,  0,  0,  0, 58, 70, 66, 62,  2, 60,  0, 24, 36, 24,  0};
+static const GLubyte Fixed8x13_Character_230[] = {  8,  0,  0,  0,108,146,144,124, 18,108,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_231[] = {  8,  0, 16,  8, 60, 66, 64, 64, 66, 60,  0,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_232[] = {  8,  0,  0,  0, 60, 66, 64,126, 66, 60,  0,  0,  8, 16,  0};
+static const GLubyte Fixed8x13_Character_233[] = {  8,  0,  0,  0, 60, 66, 64,126, 66, 60,  0,  0, 16,  8,  0};
+static const GLubyte Fixed8x13_Character_234[] = {  8,  0,  0,  0, 60, 66, 64,126, 66, 60,  0,  0, 36, 24,  0};
+static const GLubyte Fixed8x13_Character_235[] = {  8,  0,  0,  0, 60, 66, 64,126, 66, 60,  0,  0, 36, 36,  0};
+static const GLubyte Fixed8x13_Character_236[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 48,  0,  0, 16, 32,  0};
+static const GLubyte Fixed8x13_Character_237[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 48,  0,  0, 32, 16,  0};
+static const GLubyte Fixed8x13_Character_238[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 48,  0,  0, 72, 48,  0};
+static const GLubyte Fixed8x13_Character_239[] = {  8,  0,  0,  0,124, 16, 16, 16, 16, 48,  0,  0, 40, 40,  0};
+static const GLubyte Fixed8x13_Character_240[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 60,  4, 40, 24, 36,  0};
+static const GLubyte Fixed8x13_Character_241[] = {  8,  0,  0,  0, 66, 66, 66, 66, 98, 92,  0,  0, 76, 50,  0};
+static const GLubyte Fixed8x13_Character_242[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 60,  0,  0, 16, 32,  0};
+static const GLubyte Fixed8x13_Character_243[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 60,  0,  0, 16,  8,  0};
+static const GLubyte Fixed8x13_Character_244[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 60,  0,  0, 36, 24,  0};
+static const GLubyte Fixed8x13_Character_245[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 60,  0,  0, 76, 50,  0};
+static const GLubyte Fixed8x13_Character_246[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 60,  0,  0, 36, 36,  0};
+static const GLubyte Fixed8x13_Character_247[] = {  8,  0,  0,  0,  0, 16, 16,  0,124,  0, 16, 16,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_248[] = {  8,  0,  0, 64, 60, 98, 82, 74, 70, 60,  2,  0,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_249[] = {  8,  0,  0,  0, 58, 68, 68, 68, 68, 68,  0,  0, 16, 32,  0};
+static const GLubyte Fixed8x13_Character_250[] = {  8,  0,  0,  0, 58, 68, 68, 68, 68, 68,  0,  0, 16,  8,  0};
+static const GLubyte Fixed8x13_Character_251[] = {  8,  0,  0,  0, 58, 68, 68, 68, 68, 68,  0,  0, 36, 24,  0};
+static const GLubyte Fixed8x13_Character_252[] = {  8,  0,  0,  0, 58, 68, 68, 68, 68, 68,  0,  0, 40, 40,  0};
+static const GLubyte Fixed8x13_Character_253[] = {  8,  0, 60, 66,  2, 58, 70, 66, 66, 66,  0,  0, 16,  8,  0};
+static const GLubyte Fixed8x13_Character_254[] = {  8,  0, 64, 64, 92, 98, 66, 66, 98, 92, 64, 64,  0,  0,  0};
+static const GLubyte Fixed8x13_Character_255[] = {  8,  0, 60, 66,  2, 58, 70, 66, 66, 66,  0,  0, 36, 36,  0};
+
+/* The font characters mapping: */
+static const GLubyte* Fixed8x13_Character_Map[] = {Fixed8x13_Character_000,Fixed8x13_Character_001,Fixed8x13_Character_002,Fixed8x13_Character_003,Fixed8x13_Character_004,Fixed8x13_Character_005,Fixed8x13_Character_006,Fixed8x13_Character_007,Fixed8x13_Character_008,Fixed8x13_Character_009,Fixed8x13_Character_010,Fixed8x13_Character_011,Fixed8x13_Character_012,Fixed8x13_Character_013,Fixed8x13_Character_014,Fixed8x13_Character_015,
+                                                   Fixed8x13_Character_016,Fixed8x13_Character_017,Fixed8x13_Character_018,Fixed8x13_Character_019,Fixed8x13_Character_020,Fixed8x13_Character_021,Fixed8x13_Character_022,Fixed8x13_Character_023,Fixed8x13_Character_024,Fixed8x13_Character_025,Fixed8x13_Character_026,Fixed8x13_Character_027,Fixed8x13_Character_028,Fixed8x13_Character_029,Fixed8x13_Character_030,Fixed8x13_Character_031,
+                                                   Fixed8x13_Character_032,Fixed8x13_Character_033,Fixed8x13_Character_034,Fixed8x13_Character_035,Fixed8x13_Character_036,Fixed8x13_Character_037,Fixed8x13_Character_038,Fixed8x13_Character_039,Fixed8x13_Character_040,Fixed8x13_Character_041,Fixed8x13_Character_042,Fixed8x13_Character_043,Fixed8x13_Character_044,Fixed8x13_Character_045,Fixed8x13_Character_046,Fixed8x13_Character_047,
+                                                   Fixed8x13_Character_048,Fixed8x13_Character_049,Fixed8x13_Character_050,Fixed8x13_Character_051,Fixed8x13_Character_052,Fixed8x13_Character_053,Fixed8x13_Character_054,Fixed8x13_Character_055,Fixed8x13_Character_056,Fixed8x13_Character_057,Fixed8x13_Character_058,Fixed8x13_Character_059,Fixed8x13_Character_060,Fixed8x13_Character_061,Fixed8x13_Character_062,Fixed8x13_Character_063,
+                                                   Fixed8x13_Character_064,Fixed8x13_Character_065,Fixed8x13_Character_066,Fixed8x13_Character_067,Fixed8x13_Character_068,Fixed8x13_Character_069,Fixed8x13_Character_070,Fixed8x13_Character_071,Fixed8x13_Character_072,Fixed8x13_Character_073,Fixed8x13_Character_074,Fixed8x13_Character_075,Fixed8x13_Character_076,Fixed8x13_Character_077,Fixed8x13_Character_078,Fixed8x13_Character_079,
+                                                   Fixed8x13_Character_080,Fixed8x13_Character_081,Fixed8x13_Character_082,Fixed8x13_Character_083,Fixed8x13_Character_084,Fixed8x13_Character_085,Fixed8x13_Character_086,Fixed8x13_Character_087,Fixed8x13_Character_088,Fixed8x13_Character_089,Fixed8x13_Character_090,Fixed8x13_Character_091,Fixed8x13_Character_092,Fixed8x13_Character_093,Fixed8x13_Character_094,Fixed8x13_Character_095,
+                                                   Fixed8x13_Character_096,Fixed8x13_Character_097,Fixed8x13_Character_098,Fixed8x13_Character_099,Fixed8x13_Character_100,Fixed8x13_Character_101,Fixed8x13_Character_102,Fixed8x13_Character_103,Fixed8x13_Character_104,Fixed8x13_Character_105,Fixed8x13_Character_106,Fixed8x13_Character_107,Fixed8x13_Character_108,Fixed8x13_Character_109,Fixed8x13_Character_110,Fixed8x13_Character_111,
+                                                   Fixed8x13_Character_112,Fixed8x13_Character_113,Fixed8x13_Character_114,Fixed8x13_Character_115,Fixed8x13_Character_116,Fixed8x13_Character_117,Fixed8x13_Character_118,Fixed8x13_Character_119,Fixed8x13_Character_120,Fixed8x13_Character_121,Fixed8x13_Character_122,Fixed8x13_Character_123,Fixed8x13_Character_124,Fixed8x13_Character_125,Fixed8x13_Character_126,Fixed8x13_Character_032,
+                                                   Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,
+                                                   Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,Fixed8x13_Character_032,
+                                                   Fixed8x13_Character_160,Fixed8x13_Character_161,Fixed8x13_Character_162,Fixed8x13_Character_163,Fixed8x13_Character_164,Fixed8x13_Character_165,Fixed8x13_Character_166,Fixed8x13_Character_167,Fixed8x13_Character_168,Fixed8x13_Character_169,Fixed8x13_Character_170,Fixed8x13_Character_171,Fixed8x13_Character_172,Fixed8x13_Character_173,Fixed8x13_Character_174,Fixed8x13_Character_175,
+                                                   Fixed8x13_Character_176,Fixed8x13_Character_177,Fixed8x13_Character_178,Fixed8x13_Character_179,Fixed8x13_Character_180,Fixed8x13_Character_181,Fixed8x13_Character_182,Fixed8x13_Character_183,Fixed8x13_Character_184,Fixed8x13_Character_185,Fixed8x13_Character_186,Fixed8x13_Character_187,Fixed8x13_Character_188,Fixed8x13_Character_189,Fixed8x13_Character_190,Fixed8x13_Character_191,
+                                                   Fixed8x13_Character_192,Fixed8x13_Character_193,Fixed8x13_Character_194,Fixed8x13_Character_195,Fixed8x13_Character_196,Fixed8x13_Character_197,Fixed8x13_Character_198,Fixed8x13_Character_199,Fixed8x13_Character_200,Fixed8x13_Character_201,Fixed8x13_Character_202,Fixed8x13_Character_203,Fixed8x13_Character_204,Fixed8x13_Character_205,Fixed8x13_Character_206,Fixed8x13_Character_207,
+                                                   Fixed8x13_Character_208,Fixed8x13_Character_209,Fixed8x13_Character_210,Fixed8x13_Character_211,Fixed8x13_Character_212,Fixed8x13_Character_213,Fixed8x13_Character_214,Fixed8x13_Character_215,Fixed8x13_Character_216,Fixed8x13_Character_217,Fixed8x13_Character_218,Fixed8x13_Character_219,Fixed8x13_Character_220,Fixed8x13_Character_221,Fixed8x13_Character_222,Fixed8x13_Character_223,
+                                                   Fixed8x13_Character_224,Fixed8x13_Character_225,Fixed8x13_Character_226,Fixed8x13_Character_227,Fixed8x13_Character_228,Fixed8x13_Character_229,Fixed8x13_Character_230,Fixed8x13_Character_231,Fixed8x13_Character_232,Fixed8x13_Character_233,Fixed8x13_Character_234,Fixed8x13_Character_235,Fixed8x13_Character_236,Fixed8x13_Character_237,Fixed8x13_Character_238,Fixed8x13_Character_239,
+                                                   Fixed8x13_Character_240,Fixed8x13_Character_241,Fixed8x13_Character_242,Fixed8x13_Character_243,Fixed8x13_Character_244,Fixed8x13_Character_245,Fixed8x13_Character_246,Fixed8x13_Character_247,Fixed8x13_Character_248,Fixed8x13_Character_249,Fixed8x13_Character_250,Fixed8x13_Character_251,Fixed8x13_Character_252,Fixed8x13_Character_253,Fixed8x13_Character_254,Fixed8x13_Character_255,NULL};
+
+/* The font structure: */
+const SFG_Font fgFontFixed8x13 = { "-misc-fixed-medium-r-normal--13-120-75-75-C-80-iso8859-1", 256, 14, Fixed8x13_Character_Map, 0, 3 };
+
+static const GLubyte Fixed9x15_Character_000[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_001[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0, 28,  0, 62,  0,127,  0,255,128,127,  0, 62,  0, 28,  0,  8,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_002[] = {  9,  0,  0,170,128, 85,  0,170,128, 85,  0,170,128, 85,  0,170,128, 85,  0,170,128, 85,  0,170,128, 85,  0,170,128, 85,  0,170,128};
+static const GLubyte Fixed9x15_Character_003[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  4,  0,  4,  0,  4,  0, 31,  0,  0,  0, 72,  0, 72,  0,120,  0, 72,  0, 72,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_004[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0, 14,  0, 72,  0, 79,  0, 64,  0,112,  0, 64,  0,120,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_005[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  9,  0,  9,  0, 14,  0,  9,  0, 14,  0,  0,  0, 56,  0, 64,  0, 64,  0, 64,  0, 56,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_006[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0, 14,  0,  8,  0, 15,  0,  0,  0,120,  0, 64,  0, 64,  0, 64,  0, 64,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_007[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 18,  0, 18,  0, 12,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_008[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,  0,  0,  8,  0,  8,  0,  8,  0,127,  0,  8,  0,  8,  0,  8,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_009[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0,  8,  0,  8,  0,  8,  0,  8,  0,  0,  0, 68,  0, 76,  0, 84,  0,100,  0, 68,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_010[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  4,  0,  4,  0,  4,  0, 31,  0,  0,  0, 16,  0, 40,  0, 40,  0, 68,  0, 68,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_011[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,248,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0};
+static const GLubyte Fixed9x15_Character_012[] = {  9,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_013[] = {  9,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 15,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_014[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,128,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0};
+static const GLubyte Fixed9x15_Character_015[] = {  9,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,255,128,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0};
+static const GLubyte Fixed9x15_Character_016[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,128};
+static const GLubyte Fixed9x15_Character_017[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,128,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_018[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_019[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,255,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_020[] = {  9,  0,  0,255,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_021[] = {  9,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 15,128,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0};
+static const GLubyte Fixed9x15_Character_022[] = {  9,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,248,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0};
+static const GLubyte Fixed9x15_Character_023[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,255,128,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0};
+static const GLubyte Fixed9x15_Character_024[] = {  9,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,255,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_025[] = {  9,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0};
+static const GLubyte Fixed9x15_Character_026[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,  0,  0,  3,  0, 28,  0, 96,  0, 28,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_027[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,  0,  0, 96,  0, 28,  0,  3,  0, 28,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_028[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0, 34,  0, 34,  0, 34,  0, 34,  0, 34,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_029[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16,  0, 16,  0,127,  0,  8,  0,127,  0,  4,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_030[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 46,  0, 81,  0, 48,  0, 16,  0, 16,  0,124,  0, 16,  0, 16,  0, 17,  0, 14,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_031[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_032[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_033[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_034[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 18,  0, 18,  0, 18,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_035[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 36,  0, 36,  0,126,  0, 36,  0, 36,  0,126,  0, 36,  0, 36,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_036[] = {  9,  0,  0,  0,  0,  0,  0,  8,  0, 62,  0, 73,  0,  9,  0,  9,  0, 10,  0, 28,  0, 40,  0, 72,  0, 73,  0, 62,  0,  8,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_037[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 66,  0, 37,  0, 37,  0, 18,  0,  8,  0,  8,  0, 36,  0, 82,  0, 82,  0, 33,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_038[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 49,  0, 74,  0, 68,  0, 74,  0, 49,  0, 48,  0, 72,  0, 72,  0, 72,  0, 48,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_039[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16,  0,  8,  0,  4,  0,  6,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_040[] = {  9,  0,  0,  0,  0,  0,  0,  4,  0,  8,  0,  8,  0, 16,  0, 16,  0, 16,  0, 16,  0, 16,  0, 16,  0,  8,  0,  8,  0,  4,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_041[] = {  9,  0,  0,  0,  0,  0,  0, 16,  0,  8,  0,  8,  0,  4,  0,  4,  0,  4,  0,  4,  0,  4,  0,  4,  0,  8,  0,  8,  0, 16,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_042[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0, 73,  0, 42,  0, 28,  0, 42,  0, 73,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_043[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,127,  0,  8,  0,  8,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_044[] = {  9,  0,  0,  8,  0,  4,  0,  4,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_045[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_046[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_047[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 64,  0, 32,  0, 32,  0, 16,  0,  8,  0,  8,  0,  4,  0,  2,  0,  2,  0,  1,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_048[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 28,  0, 34,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 34,  0, 28,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_049[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 72,  0, 40,  0, 24,  0,  8,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_050[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 64,  0, 32,  0, 16,  0,  8,  0,  4,  0,  2,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_051[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0,  1,  0,  1,  0,  1,  0, 14,  0,  4,  0,  2,  0,  1,  0,127,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_052[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  2,  0,  2,  0,127,  0, 66,  0, 34,  0, 18,  0, 10,  0,  6,  0,  2,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_053[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0,  1,  0,  1,  0,  1,  0, 97,  0, 94,  0, 64,  0, 64,  0,127,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_054[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 97,  0, 94,  0, 64,  0, 64,  0, 32,  0, 30,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_055[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0, 32,  0, 16,  0, 16,  0,  8,  0,  4,  0,  2,  0,  1,  0,  1,  0,127,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_056[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 28,  0, 34,  0, 65,  0, 65,  0, 34,  0, 28,  0, 34,  0, 65,  0, 34,  0, 28,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_057[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 60,  0,  2,  0,  1,  0,  1,  0, 61,  0, 67,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_058[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_059[] = {  9,  0,  0,  8,  0,  4,  0,  4,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_060[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  4,  0,  8,  0, 16,  0, 32,  0, 32,  0, 16,  0,  8,  0,  4,  0,  2,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_061[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,  0,  0,  0,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_062[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0, 16,  0,  8,  0,  4,  0,  2,  0,  2,  0,  4,  0,  8,  0, 16,  0, 32,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_063[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  0,  0,  8,  0,  8,  0,  4,  0,  2,  0,  1,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_064[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 64,  0, 64,  0, 77,  0, 83,  0, 81,  0, 79,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_065[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 65,  0, 34,  0, 20,  0,  8,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_066[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,126,  0, 33,  0, 33,  0, 33,  0, 33,  0,126,  0, 33,  0, 33,  0, 33,  0,126,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_067[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 65,  0, 62,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_068[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,126,  0, 33,  0, 33,  0, 33,  0, 33,  0, 33,  0, 33,  0, 33,  0, 33,  0,126,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_069[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 32,  0, 32,  0, 32,  0, 32,  0, 60,  0, 32,  0, 32,  0, 32,  0,127,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_070[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0, 32,  0, 32,  0, 32,  0, 32,  0, 60,  0, 32,  0, 32,  0, 32,  0,127,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_071[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 71,  0, 64,  0, 64,  0, 64,  0, 65,  0, 62,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_072[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_073[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 62,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_074[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 60,  0, 66,  0,  2,  0,  2,  0,  2,  0,  2,  0,  2,  0,  2,  0,  2,  0, 15,128,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_075[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 66,  0, 68,  0, 72,  0, 80,  0,112,  0, 72,  0, 68,  0, 66,  0, 65,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_076[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_077[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 73,  0, 73,  0, 85,  0, 85,  0, 99,  0, 65,  0, 65,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_078[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 67,  0, 69,  0, 73,  0, 81,  0, 97,  0, 65,  0, 65,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_079[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_080[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0,126,  0, 65,  0, 65,  0, 65,  0,126,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_081[] = {  9,  0,  0,  0,  0,  3,  0,  4,  0, 62,  0, 73,  0, 81,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_082[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 66,  0, 68,  0, 72,  0,126,  0, 65,  0, 65,  0, 65,  0,126,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_083[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0,  1,  0,  6,  0, 56,  0, 64,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_084[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,127,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_085[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_086[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0, 20,  0, 20,  0, 20,  0, 34,  0, 34,  0, 34,  0, 65,  0, 65,  0, 65,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_087[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0, 85,  0, 73,  0, 73,  0, 73,  0, 73,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_088[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 34,  0, 20,  0,  8,  0,  8,  0, 20,  0, 34,  0, 65,  0, 65,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_089[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 20,  0, 34,  0, 65,  0, 65,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_090[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 64,  0, 64,  0, 32,  0, 16,  0,  8,  0,  4,  0,  2,  0,  1,  0,127,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_091[] = {  9,  0,  0,  0,  0,  0,  0, 30,  0, 16,  0, 16,  0, 16,  0, 16,  0, 16,  0, 16,  0, 16,  0, 16,  0, 16,  0, 16,  0, 30,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_092[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  1,  0,  2,  0,  2,  0,  4,  0,  8,  0,  8,  0, 16,  0, 32,  0, 32,  0, 64,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_093[] = {  9,  0,  0,  0,  0,  0,  0, 60,  0,  4,  0,  4,  0,  4,  0,  4,  0,  4,  0,  4,  0,  4,  0,  4,  0,  4,  0,  4,  0, 60,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_094[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 34,  0, 20,  0,  8,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_095[] = {  9,  0,  0,  0,  0,  0,  0,255,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_096[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  8,  0, 16,  0, 48,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_097[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 67,  0, 65,  0, 63,  0,  1,  0,  1,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_098[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 94,  0, 97,  0, 65,  0, 65,  0, 65,  0, 97,  0, 94,  0, 64,  0, 64,  0, 64,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_099[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 64,  0, 64,  0, 64,  0, 65,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_100[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 67,  0, 65,  0, 65,  0, 65,  0, 67,  0, 61,  0,  1,  0,  1,  0,  1,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_101[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 64,  0, 64,  0,127,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_102[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 16,  0, 16,  0, 16,  0, 16,  0,124,  0, 16,  0, 16,  0, 17,  0, 17,  0, 14,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_103[] = {  9,  0,  0, 62,  0, 65,  0, 65,  0, 62,  0, 64,  0, 60,  0, 66,  0, 66,  0, 66,  0, 61,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_104[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 97,  0, 94,  0, 64,  0, 64,  0, 64,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_105[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 56,  0,  0,  0,  0,  0, 24,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_106[] = {  9,  0,  0, 60,  0, 66,  0, 66,  0, 66,  0,  2,  0,  2,  0,  2,  0,  2,  0,  2,  0, 14,  0,  0,  0,  0,  0,  6,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_107[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 70,  0, 88,  0, 96,  0, 88,  0, 70,  0, 65,  0, 64,  0, 64,  0, 64,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_108[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 56,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_109[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 73,  0, 73,  0, 73,  0, 73,  0, 73,  0,118,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_110[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 97,  0, 94,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_111[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_112[] = {  9,  0,  0, 64,  0, 64,  0, 64,  0, 94,  0, 97,  0, 65,  0, 65,  0, 65,  0, 97,  0, 94,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_113[] = {  9,  0,  0,  1,  0,  1,  0,  1,  0, 61,  0, 67,  0, 65,  0, 65,  0, 65,  0, 67,  0, 61,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_114[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0, 32,  0, 32,  0, 32,  0, 33,  0, 49,  0, 78,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_115[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0,  1,  0, 62,  0, 64,  0, 65,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_116[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 14,  0, 17,  0, 16,  0, 16,  0, 16,  0, 16,  0,126,  0, 16,  0, 16,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_117[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_118[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0, 20,  0, 20,  0, 34,  0, 34,  0, 65,  0, 65,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_119[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0, 85,  0, 73,  0, 73,  0, 73,  0, 65,  0, 65,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_120[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 34,  0, 20,  0,  8,  0, 20,  0, 34,  0, 65,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_121[] = {  9,  0,  0, 60,  0, 66,  0,  2,  0, 58,  0, 70,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_122[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 32,  0, 16,  0,  8,  0,  4,  0,  2,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_123[] = {  9,  0,  0,  0,  0,  0,  0,  7,  0,  8,  0,  8,  0,  8,  0,  4,  0, 24,  0, 24,  0,  4,  0,  8,  0,  8,  0,  8,  0,  7,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_124[] = {  9,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_125[] = {  9,  0,  0,  0,  0,  0,  0,112,  0,  8,  0,  8,  0,  8,  0, 16,  0, 12,  0, 12,  0, 16,  0,  8,  0,  8,  0,  8,  0,112,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_126[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 70,  0, 73,  0, 49,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_127[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_128[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_129[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_130[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_131[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_132[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_133[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_134[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_135[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_136[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_137[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_138[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_139[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_140[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_141[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_142[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_143[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_144[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_145[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_146[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_147[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_148[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_149[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_150[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_151[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_152[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_153[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_154[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_155[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_156[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_157[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_158[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_159[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 91,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0, 65,  0, 64,  0,  1,  0,109,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_160[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_161[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  0,  0,  0,  0,  8,  0,  8,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_162[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0, 60,  0, 82,  0, 80,  0, 72,  0, 74,  0, 60,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_163[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 46,  0, 81,  0, 48,  0, 16,  0, 16,  0,124,  0, 16,  0, 16,  0, 17,  0, 14,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_164[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 62,  0, 34,  0, 34,  0, 62,  0, 65,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_165[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0, 62,  0,  8,  0, 62,  0, 20,  0, 34,  0, 65,  0, 65,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_166[] = {  9,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_167[] = {  9,  0,  0,  0,  0,  0,  0, 24,  0, 36,  0,  4,  0, 24,  0, 36,  0, 36,  0, 36,  0, 24,  0, 32,  0, 36,  0, 24,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_168[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0, 34,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_169[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 60,  0, 66,  0,153,  0,165,  0,161,  0,165,  0,153,  0, 66,  0, 60,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_170[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,  0,  0,  0, 60,  0, 72,  0, 56,  0, 72,  0, 48,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_171[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  0, 18,  0, 36,  0, 72,  0, 72,  0, 36,  0, 18,  0,  9,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_172[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  2,  0,  2,  0,126,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_173[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_174[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 60,  0, 66,  0,165,  0,169,  0,185,  0,165,  0,185,  0, 66,  0, 60,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_175[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_176[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 18,  0, 18,  0, 12,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_177[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,  0,  0,  8,  0,  8,  0,  8,  0,127,  0,  8,  0,  8,  0,  8,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_178[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,120,  0, 64,  0, 48,  0,  8,  0, 72,  0, 48,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_179[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48,  0, 72,  0,  8,  0, 16,  0, 72,  0, 48,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_180[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16,  0,  8,  0,  4,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_181[] = {  9,  0,  0,  0,  0, 64,  0, 64,  0, 93,  0, 99,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_182[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  5,  0,  5,  0,  5,  0,  5,  0, 61,  0, 69,  0, 69,  0, 69,  0, 63,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_183[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_184[] = {  9,  0,  0, 24,  0, 36,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_185[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,112,  0, 32,  0, 32,  0, 32,  0, 96,  0, 32,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_186[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,  0,  0,  0, 56,  0, 68,  0, 68,  0, 56,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_187[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 72,  0, 36,  0, 18,  0,  9,  0,  9,  0, 18,  0, 36,  0, 72,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_188[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0, 13,  0,  9,  0,  5,  0,115,  0, 33,  0, 32,  0, 32,  0, 96,  0, 32,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_189[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0,  8,  0,  6,  0,  1,  0,121,  0, 38,  0, 32,  0, 32,  0, 96,  0, 32,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_190[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0, 13,  0,  9,  0,  5,  0, 51,  0, 73,  0,  8,  0, 16,  0, 72,  0, 48,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_191[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 64,  0, 32,  0, 16,  0,  8,  0,  8,  0,  0,  0,  8,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_192[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 34,  0, 28,  0,  0,  0,  8,  0, 16,  0, 32,  0};
+static const GLubyte Fixed9x15_Character_193[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 34,  0, 28,  0,  0,  0,  8,  0,  4,  0,  2,  0};
+static const GLubyte Fixed9x15_Character_194[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 34,  0, 28,  0,  0,  0, 34,  0, 20,  0,  8,  0};
+static const GLubyte Fixed9x15_Character_195[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 34,  0, 28,  0,  0,  0, 78,  0, 49,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_196[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 34,  0, 28,  0,  0,  0, 34,  0, 34,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_197[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 34,  0, 20,  0, 28,  0, 34,  0, 28,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_198[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 79,  0, 72,  0, 72,  0, 72,  0,126,  0, 72,  0, 72,  0, 72,  0, 72,  0, 55,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_199[] = {  9,  0,  0, 24,  0, 36,  0, 12,  0, 62,  0, 65,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 65,  0, 62,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_200[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 32,  0, 32,  0, 32,  0, 60,  0, 32,  0, 32,  0,127,  0,  0,  0,  8,  0, 16,  0, 32,  0};
+static const GLubyte Fixed9x15_Character_201[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 32,  0, 32,  0, 32,  0, 60,  0, 32,  0, 32,  0,127,  0,  0,  0,  8,  0,  4,  0,  2,  0};
+static const GLubyte Fixed9x15_Character_202[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 32,  0, 32,  0, 32,  0, 60,  0, 32,  0, 32,  0,127,  0,  0,  0, 34,  0, 20,  0,  8,  0};
+static const GLubyte Fixed9x15_Character_203[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 32,  0, 32,  0, 32,  0, 60,  0, 32,  0, 32,  0,127,  0,  0,  0, 34,  0, 34,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_204[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 62,  0,  0,  0,  8,  0, 16,  0, 32,  0};
+static const GLubyte Fixed9x15_Character_205[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 62,  0,  0,  0,  8,  0,  4,  0,  2,  0};
+static const GLubyte Fixed9x15_Character_206[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 62,  0,  0,  0, 34,  0, 20,  0,  8,  0};
+static const GLubyte Fixed9x15_Character_207[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 62,  0,  0,  0, 34,  0, 34,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_208[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,124,  0, 33,  0, 33,  0, 33,  0, 33,  0,225,  0, 33,  0, 33,  0, 33,  0,124,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_209[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 67,  0, 69,  0, 73,  0, 73,  0, 81,  0, 97,  0, 65,  0,  0,  0, 78,  0, 49,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_210[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0,  8,  0, 16,  0, 32,  0};
+static const GLubyte Fixed9x15_Character_211[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0,  8,  0,  4,  0,  2,  0};
+static const GLubyte Fixed9x15_Character_212[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0, 34,  0, 20,  0,  8,  0};
+static const GLubyte Fixed9x15_Character_213[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0, 78,  0, 49,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_214[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0, 34,  0, 34,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_215[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 34,  0, 20,  0,  8,  0, 20,  0, 34,  0, 65,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_216[] = {  9,  0,  0,  0,  0,  0,  0, 64,  0, 62,  0, 97,  0, 81,  0, 81,  0, 73,  0, 73,  0, 69,  0, 69,  0, 67,  0, 62,  0,  1,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_217[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0,  8,  0, 16,  0, 32,  0};
+static const GLubyte Fixed9x15_Character_218[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0,  8,  0,  4,  0,  2,  0};
+static const GLubyte Fixed9x15_Character_219[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0, 34,  0, 20,  0,  8,  0};
+static const GLubyte Fixed9x15_Character_220[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0, 34,  0, 34,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_221[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0, 20,  0, 34,  0, 65,  0, 65,  0,  0,  0,  8,  0,  4,  0,  2,  0};
+static const GLubyte Fixed9x15_Character_222[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 64,  0, 64,  0, 64,  0,126,  0, 65,  0, 65,  0, 65,  0,126,  0, 64,  0, 64,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_223[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 44,  0, 34,  0, 34,  0, 34,  0, 36,  0,104,  0, 36,  0, 34,  0, 34,  0, 28,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_224[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 67,  0, 65,  0, 63,  0,  1,  0,  1,  0, 62,  0,  0,  0,  4,  0,  8,  0, 16,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_225[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 67,  0, 65,  0, 63,  0,  1,  0,  1,  0, 62,  0,  0,  0,  8,  0,  4,  0,  2,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_226[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 67,  0, 65,  0, 63,  0,  1,  0,  1,  0, 62,  0,  0,  0, 34,  0, 20,  0,  8,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_227[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 67,  0, 65,  0, 63,  0,  1,  0,  1,  0, 62,  0,  0,  0, 38,  0, 25,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_228[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 67,  0, 65,  0, 63,  0,  1,  0,  1,  0, 62,  0,  0,  0, 34,  0, 34,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_229[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 67,  0, 65,  0, 63,  0,  1,  0,  1,  0, 62,  0,  0,  0, 12,  0, 18,  0, 12,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_230[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 55,  0, 73,  0, 72,  0, 62,  0,  9,  0, 73,  0, 54,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_231[] = {  9,  0,  0, 24,  0, 36,  0, 12,  0, 62,  0, 65,  0, 64,  0, 64,  0, 64,  0, 65,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_232[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 64,  0, 64,  0,127,  0, 65,  0, 65,  0, 62,  0,  0,  0,  8,  0, 16,  0, 32,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_233[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 64,  0, 64,  0,127,  0, 65,  0, 65,  0, 62,  0,  0,  0,  8,  0,  4,  0,  2,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_234[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 64,  0, 64,  0,127,  0, 65,  0, 65,  0, 62,  0,  0,  0, 34,  0, 20,  0,  8,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_235[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 64,  0, 64,  0,127,  0, 65,  0, 65,  0, 62,  0,  0,  0, 34,  0, 34,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_236[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 56,  0,  0,  0,  8,  0, 16,  0, 32,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_237[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 56,  0,  0,  0, 16,  0,  8,  0,  4,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_238[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 56,  0,  0,  0, 68,  0, 40,  0, 16,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_239[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,  8,  0,  8,  0,  8,  0,  8,  0,  8,  0, 56,  0,  0,  0, 36,  0, 36,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_240[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  4,  0, 40,  0, 24,  0, 36,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_241[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 97,  0, 94,  0,  0,  0, 78,  0, 49,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_242[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0,  8,  0, 16,  0, 32,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_243[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0,  8,  0,  4,  0,  2,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_244[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0, 34,  0, 20,  0,  8,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_245[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0, 78,  0, 49,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_246[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 62,  0,  0,  0, 34,  0, 34,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_247[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0, 28,  0,  8,  0,  0,  0,127,  0,  0,  0,  8,  0, 28,  0,  8,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_248[] = {  9,  0,  0,  0,  0,  0,  0, 64,  0, 62,  0, 81,  0, 81,  0, 73,  0, 69,  0, 69,  0, 62,  0,  1,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_249[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0,  0,  0,  8,  0, 16,  0, 32,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_250[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0,  0,  0,  8,  0,  4,  0,  2,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_251[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0,  0,  0, 34,  0, 20,  0,  8,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_252[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 61,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0,  0,  0, 36,  0, 36,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_253[] = {  9,  0,  0, 60,  0, 66,  0,  2,  0, 58,  0, 70,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0,  0,  0, 16,  0,  8,  0,  4,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_254[] = {  9,  0,  0, 64,  0, 64,  0, 64,  0, 94,  0, 97,  0, 65,  0, 65,  0, 97,  0, 94,  0, 64,  0, 64,  0, 64,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Fixed9x15_Character_255[] = {  9,  0,  0, 60,  0, 66,  0,  2,  0, 58,  0, 70,  0, 66,  0, 66,  0, 66,  0, 66,  0, 66,  0,  0,  0, 36,  0, 36,  0,  0,  0,  0,  0};
+
+/* The font characters mapping: */
+static const GLubyte* Fixed9x15_Character_Map[] = {Fixed9x15_Character_000,Fixed9x15_Character_001,Fixed9x15_Character_002,Fixed9x15_Character_003,Fixed9x15_Character_004,Fixed9x15_Character_005,Fixed9x15_Character_006,Fixed9x15_Character_007,Fixed9x15_Character_008,Fixed9x15_Character_009,Fixed9x15_Character_010,Fixed9x15_Character_011,Fixed9x15_Character_012,Fixed9x15_Character_013,Fixed9x15_Character_014,Fixed9x15_Character_015,
+                                                   Fixed9x15_Character_016,Fixed9x15_Character_017,Fixed9x15_Character_018,Fixed9x15_Character_019,Fixed9x15_Character_020,Fixed9x15_Character_021,Fixed9x15_Character_022,Fixed9x15_Character_023,Fixed9x15_Character_024,Fixed9x15_Character_025,Fixed9x15_Character_026,Fixed9x15_Character_027,Fixed9x15_Character_028,Fixed9x15_Character_029,Fixed9x15_Character_030,Fixed9x15_Character_031,
+                                                   Fixed9x15_Character_032,Fixed9x15_Character_033,Fixed9x15_Character_034,Fixed9x15_Character_035,Fixed9x15_Character_036,Fixed9x15_Character_037,Fixed9x15_Character_038,Fixed9x15_Character_039,Fixed9x15_Character_040,Fixed9x15_Character_041,Fixed9x15_Character_042,Fixed9x15_Character_043,Fixed9x15_Character_044,Fixed9x15_Character_045,Fixed9x15_Character_046,Fixed9x15_Character_047,
+                                                   Fixed9x15_Character_048,Fixed9x15_Character_049,Fixed9x15_Character_050,Fixed9x15_Character_051,Fixed9x15_Character_052,Fixed9x15_Character_053,Fixed9x15_Character_054,Fixed9x15_Character_055,Fixed9x15_Character_056,Fixed9x15_Character_057,Fixed9x15_Character_058,Fixed9x15_Character_059,Fixed9x15_Character_060,Fixed9x15_Character_061,Fixed9x15_Character_062,Fixed9x15_Character_063,
+                                                   Fixed9x15_Character_064,Fixed9x15_Character_065,Fixed9x15_Character_066,Fixed9x15_Character_067,Fixed9x15_Character_068,Fixed9x15_Character_069,Fixed9x15_Character_070,Fixed9x15_Character_071,Fixed9x15_Character_072,Fixed9x15_Character_073,Fixed9x15_Character_074,Fixed9x15_Character_075,Fixed9x15_Character_076,Fixed9x15_Character_077,Fixed9x15_Character_078,Fixed9x15_Character_079,
+                                                   Fixed9x15_Character_080,Fixed9x15_Character_081,Fixed9x15_Character_082,Fixed9x15_Character_083,Fixed9x15_Character_084,Fixed9x15_Character_085,Fixed9x15_Character_086,Fixed9x15_Character_087,Fixed9x15_Character_088,Fixed9x15_Character_089,Fixed9x15_Character_090,Fixed9x15_Character_091,Fixed9x15_Character_092,Fixed9x15_Character_093,Fixed9x15_Character_094,Fixed9x15_Character_095,
+                                                   Fixed9x15_Character_096,Fixed9x15_Character_097,Fixed9x15_Character_098,Fixed9x15_Character_099,Fixed9x15_Character_100,Fixed9x15_Character_101,Fixed9x15_Character_102,Fixed9x15_Character_103,Fixed9x15_Character_104,Fixed9x15_Character_105,Fixed9x15_Character_106,Fixed9x15_Character_107,Fixed9x15_Character_108,Fixed9x15_Character_109,Fixed9x15_Character_110,Fixed9x15_Character_111,
+                                                   Fixed9x15_Character_112,Fixed9x15_Character_113,Fixed9x15_Character_114,Fixed9x15_Character_115,Fixed9x15_Character_116,Fixed9x15_Character_117,Fixed9x15_Character_118,Fixed9x15_Character_119,Fixed9x15_Character_120,Fixed9x15_Character_121,Fixed9x15_Character_122,Fixed9x15_Character_123,Fixed9x15_Character_124,Fixed9x15_Character_125,Fixed9x15_Character_126,Fixed9x15_Character_032,
+                                                   Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,
+                                                   Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,Fixed9x15_Character_032,
+                                                   Fixed9x15_Character_160,Fixed9x15_Character_161,Fixed9x15_Character_162,Fixed9x15_Character_163,Fixed9x15_Character_164,Fixed9x15_Character_165,Fixed9x15_Character_166,Fixed9x15_Character_167,Fixed9x15_Character_168,Fixed9x15_Character_169,Fixed9x15_Character_170,Fixed9x15_Character_171,Fixed9x15_Character_172,Fixed9x15_Character_173,Fixed9x15_Character_174,Fixed9x15_Character_175,
+                                                   Fixed9x15_Character_176,Fixed9x15_Character_177,Fixed9x15_Character_178,Fixed9x15_Character_179,Fixed9x15_Character_180,Fixed9x15_Character_181,Fixed9x15_Character_182,Fixed9x15_Character_183,Fixed9x15_Character_184,Fixed9x15_Character_185,Fixed9x15_Character_186,Fixed9x15_Character_187,Fixed9x15_Character_188,Fixed9x15_Character_189,Fixed9x15_Character_190,Fixed9x15_Character_191,
+                                                   Fixed9x15_Character_192,Fixed9x15_Character_193,Fixed9x15_Character_194,Fixed9x15_Character_195,Fixed9x15_Character_196,Fixed9x15_Character_197,Fixed9x15_Character_198,Fixed9x15_Character_199,Fixed9x15_Character_200,Fixed9x15_Character_201,Fixed9x15_Character_202,Fixed9x15_Character_203,Fixed9x15_Character_204,Fixed9x15_Character_205,Fixed9x15_Character_206,Fixed9x15_Character_207,
+                                                   Fixed9x15_Character_208,Fixed9x15_Character_209,Fixed9x15_Character_210,Fixed9x15_Character_211,Fixed9x15_Character_212,Fixed9x15_Character_213,Fixed9x15_Character_214,Fixed9x15_Character_215,Fixed9x15_Character_216,Fixed9x15_Character_217,Fixed9x15_Character_218,Fixed9x15_Character_219,Fixed9x15_Character_220,Fixed9x15_Character_221,Fixed9x15_Character_222,Fixed9x15_Character_223,
+                                                   Fixed9x15_Character_224,Fixed9x15_Character_225,Fixed9x15_Character_226,Fixed9x15_Character_227,Fixed9x15_Character_228,Fixed9x15_Character_229,Fixed9x15_Character_230,Fixed9x15_Character_231,Fixed9x15_Character_232,Fixed9x15_Character_233,Fixed9x15_Character_234,Fixed9x15_Character_235,Fixed9x15_Character_236,Fixed9x15_Character_237,Fixed9x15_Character_238,Fixed9x15_Character_239,
+                                                   Fixed9x15_Character_240,Fixed9x15_Character_241,Fixed9x15_Character_242,Fixed9x15_Character_243,Fixed9x15_Character_244,Fixed9x15_Character_245,Fixed9x15_Character_246,Fixed9x15_Character_247,Fixed9x15_Character_248,Fixed9x15_Character_249,Fixed9x15_Character_250,Fixed9x15_Character_251,Fixed9x15_Character_252,Fixed9x15_Character_253,Fixed9x15_Character_254,Fixed9x15_Character_255,NULL};
+
+/* The font structure: */
+const SFG_Font fgFontFixed9x15 = { "-misc-fixed-medium-r-normal--15-140-75-75-C-90-iso8859-1", 256, 16, Fixed9x15_Character_Map, 0, 4 };
+
+static const GLubyte Helvetica10_Character_000[] = {  8,  0,  0,  0, 84,  0, 68,  0, 68,  0, 84,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_001[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_002[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_003[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_004[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_005[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_006[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_007[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_008[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_009[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_010[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_011[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_012[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_013[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_014[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_015[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_016[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_017[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_018[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_019[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_020[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_021[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_022[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_023[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_024[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_025[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_026[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_027[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_028[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_029[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_030[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_031[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_032[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_033[] = {  3,  0,  0,  0, 64,  0, 64, 64, 64, 64, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica10_Character_034[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0, 80, 80,  0,  0,  0};
+static const GLubyte Helvetica10_Character_035[] = {  6,  0,  0,  0, 80, 80,248, 40,124, 40, 40,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_036[] = {  6,  0,  0, 32,112,168, 40,112,160,168,112, 32,  0,  0,  0};
+static const GLubyte Helvetica10_Character_037[] = {  9,  0,  0,  0,  0,  0,  0, 38,  0, 41,  0, 22,  0, 16,  0,  8,  0,104,  0,148,  0,100,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_038[] = {  8,  0,  0,  0, 50, 76, 76, 82, 48, 40, 40, 16,  0,  0,  0};
+static const GLubyte Helvetica10_Character_039[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0, 64, 32, 32,  0,  0,  0};
+static const GLubyte Helvetica10_Character_040[] = {  4,  0, 32, 64, 64,128,128,128,128, 64, 64, 32,  0,  0,  0};
+static const GLubyte Helvetica10_Character_041[] = {  4,  0, 64, 32, 32, 16, 16, 16, 16, 32, 32, 64,  0,  0,  0};
+static const GLubyte Helvetica10_Character_042[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,160, 64,160,  0,  0,  0};
+static const GLubyte Helvetica10_Character_043[] = {  6,  0,  0,  0,  0, 32, 32,248, 32, 32,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_044[] = {  3,  0,128, 64, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_045[] = {  7,  0,  0,  0,  0,  0,  0,124,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_046[] = {  3,  0,  0,  0, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_047[] = {  3,  0,  0,  0,128,128, 64, 64, 64, 64, 32, 32,  0,  0,  0};
+static const GLubyte Helvetica10_Character_048[] = {  6,  0,  0,  0,112,136,136,136,136,136,136,112,  0,  0,  0};
+static const GLubyte Helvetica10_Character_049[] = {  6,  0,  0,  0, 32, 32, 32, 32, 32, 32, 96, 32,  0,  0,  0};
+static const GLubyte Helvetica10_Character_050[] = {  6,  0,  0,  0,248,128, 64, 48,  8,  8,136,112,  0,  0,  0};
+static const GLubyte Helvetica10_Character_051[] = {  6,  0,  0,  0,112,136,  8,  8, 48,  8,136,112,  0,  0,  0};
+static const GLubyte Helvetica10_Character_052[] = {  6,  0,  0,  0, 16, 16,248,144, 80, 80, 48, 16,  0,  0,  0};
+static const GLubyte Helvetica10_Character_053[] = {  6,  0,  0,  0,112,136,  8,  8,240,128,128,248,  0,  0,  0};
+static const GLubyte Helvetica10_Character_054[] = {  6,  0,  0,  0,112,136,136,200,176,128,136,112,  0,  0,  0};
+static const GLubyte Helvetica10_Character_055[] = {  6,  0,  0,  0, 64, 64, 32, 32, 16, 16,  8,248,  0,  0,  0};
+static const GLubyte Helvetica10_Character_056[] = {  6,  0,  0,  0,112,136,136,136,112,136,136,112,  0,  0,  0};
+static const GLubyte Helvetica10_Character_057[] = {  6,  0,  0,  0,112,136,  8,104,152,136,136,112,  0,  0,  0};
+static const GLubyte Helvetica10_Character_058[] = {  3,  0,  0,  0, 64,  0,  0,  0,  0, 64,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_059[] = {  3,  0,128, 64, 64,  0,  0,  0,  0, 64,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_060[] = {  6,  0,  0,  0,  0, 16, 32, 64, 32, 16,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_061[] = {  5,  0,  0,  0,  0,  0,240,  0,240,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_062[] = {  6,  0,  0,  0,  0, 64, 32, 16, 32, 64,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_063[] = {  6,  0,  0,  0, 32,  0, 32, 32, 16,  8, 72, 48,  0,  0,  0};
+static const GLubyte Helvetica10_Character_064[] = { 11,  0,  0, 62,  0, 64,  0,155,  0,164,128,164,128,162, 64,146, 64, 77, 64, 32,128, 31,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_065[] = {  7,  0,  0,  0,130,130,124, 68, 40, 40, 16, 16,  0,  0,  0};
+static const GLubyte Helvetica10_Character_066[] = {  7,  0,  0,  0,120, 68, 68, 68,120, 68, 68,120,  0,  0,  0};
+static const GLubyte Helvetica10_Character_067[] = {  8,  0,  0,  0, 60, 66, 64, 64, 64, 64, 66, 60,  0,  0,  0};
+static const GLubyte Helvetica10_Character_068[] = {  8,  0,  0,  0,120, 68, 66, 66, 66, 66, 68,120,  0,  0,  0};
+static const GLubyte Helvetica10_Character_069[] = {  7,  0,  0,  0,124, 64, 64, 64,124, 64, 64,124,  0,  0,  0};
+static const GLubyte Helvetica10_Character_070[] = {  6,  0,  0,  0, 64, 64, 64, 64,120, 64, 64,124,  0,  0,  0};
+static const GLubyte Helvetica10_Character_071[] = {  8,  0,  0,  0, 58, 70, 66, 70, 64, 64, 66, 60,  0,  0,  0};
+static const GLubyte Helvetica10_Character_072[] = {  8,  0,  0,  0, 66, 66, 66, 66,126, 66, 66, 66,  0,  0,  0};
+static const GLubyte Helvetica10_Character_073[] = {  3,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica10_Character_074[] = {  5,  0,  0,  0, 96,144, 16, 16, 16, 16, 16, 16,  0,  0,  0};
+static const GLubyte Helvetica10_Character_075[] = {  7,  0,  0,  0, 68, 68, 72, 72,112, 80, 72, 68,  0,  0,  0};
+static const GLubyte Helvetica10_Character_076[] = {  6,  0,  0,  0,120, 64, 64, 64, 64, 64, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica10_Character_077[] = {  9,  0,  0,  0,  0,  0,  0, 73,  0, 73,  0, 73,  0, 85,  0, 85,  0, 99,  0, 99,  0, 65,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_078[] = {  8,  0,  0,  0, 70, 70, 74, 74, 82, 82, 98, 98,  0,  0,  0};
+static const GLubyte Helvetica10_Character_079[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 60,  0,  0,  0};
+static const GLubyte Helvetica10_Character_080[] = {  7,  0,  0,  0, 64, 64, 64, 64,120, 68, 68,120,  0,  0,  0};
+static const GLubyte Helvetica10_Character_081[] = {  8,  0,  0,  1, 62, 70, 74, 66, 66, 66, 66, 60,  0,  0,  0};
+static const GLubyte Helvetica10_Character_082[] = {  7,  0,  0,  0, 68, 68, 68, 68,120, 68, 68,120,  0,  0,  0};
+static const GLubyte Helvetica10_Character_083[] = {  7,  0,  0,  0, 56, 68, 68,  4, 56, 64, 68, 56,  0,  0,  0};
+static const GLubyte Helvetica10_Character_084[] = {  5,  0,  0,  0, 32, 32, 32, 32, 32, 32, 32,248,  0,  0,  0};
+static const GLubyte Helvetica10_Character_085[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66,  0,  0,  0};
+static const GLubyte Helvetica10_Character_086[] = {  7,  0,  0,  0, 16, 40, 40, 68, 68, 68,130,130,  0,  0,  0};
+static const GLubyte Helvetica10_Character_087[] = {  9,  0,  0,  0,  0,  0,  0, 34,  0, 34,  0, 34,  0, 85,  0, 73,  0, 73,  0,136,128,136,128,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_088[] = {  7,  0,  0,  0, 68, 68, 40, 40, 16, 40, 68, 68,  0,  0,  0};
+static const GLubyte Helvetica10_Character_089[] = {  7,  0,  0,  0, 16, 16, 16, 40, 40, 68, 68,130,  0,  0,  0};
+static const GLubyte Helvetica10_Character_090[] = {  7,  0,  0,  0,124, 64, 32, 16, 16,  8,  4,124,  0,  0,  0};
+static const GLubyte Helvetica10_Character_091[] = {  3,  0, 96, 64, 64, 64, 64, 64, 64, 64, 64, 96,  0,  0,  0};
+static const GLubyte Helvetica10_Character_092[] = {  3,  0,  0,  0, 32, 32, 64, 64, 64, 64,128,128,  0,  0,  0};
+static const GLubyte Helvetica10_Character_093[] = {  3,  0,192, 64, 64, 64, 64, 64, 64, 64, 64,192,  0,  0,  0};
+static const GLubyte Helvetica10_Character_094[] = {  6,  0,  0,  0,  0,  0,  0,136, 80, 80, 32, 32,  0,  0,  0};
+static const GLubyte Helvetica10_Character_095[] = {  6,  0,252,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_096[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0, 63, 64, 32,  0,  0,  0};
+static const GLubyte Helvetica10_Character_097[] = {  5,  0,  0,  0,104,144,144,112, 16,224,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_098[] = {  6,  0,  0,  0,176,200,136,136,200,176,128,128,  0,  0,  0};
+static const GLubyte Helvetica10_Character_099[] = {  5,  0,  0,  0, 96,144,128,128,144, 96,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_100[] = {  6,  0,  0,  0,104,152,136,136,152,104,  8,  8,  0,  0,  0};
+static const GLubyte Helvetica10_Character_101[] = {  5,  0,  0,  0, 96,144,128,240,144, 96,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_102[] = {  4,  0,  0,  0, 64, 64, 64, 64, 64,224, 64, 48,  0,  0,  0};
+static const GLubyte Helvetica10_Character_103[] = {  6,  0,112,  8,104,152,136,136,152,104,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_104[] = {  6,  0,  0,  0,136,136,136,136,200,176,128,128,  0,  0,  0};
+static const GLubyte Helvetica10_Character_105[] = {  2,  0,  0,  0,128,128,128,128,128,128,  0,128,  0,  0,  0};
+static const GLubyte Helvetica10_Character_106[] = {  2,  0,  0,128,128,128,128,128,128,128,  0,128,  0,  0,  0};
+static const GLubyte Helvetica10_Character_107[] = {  5,  0,  0,  0,144,144,160,192,160,144,128,128,  0,  0,  0};
+static const GLubyte Helvetica10_Character_108[] = {  2,  0,  0,  0,128,128,128,128,128,128,128,128,  0,  0,  0};
+static const GLubyte Helvetica10_Character_109[] = {  8,  0,  0,  0,146,146,146,146,146,236,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_110[] = {  6,  0,  0,  0,136,136,136,136,200,176,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_111[] = {  6,  0,  0,  0,112,136,136,136,136,112,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_112[] = {  6,  0,128,128,176,200,136,136,200,176,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_113[] = {  6,  0,  8,  8,104,152,136,136,152,104,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_114[] = {  4,  0,  0,  0,128,128,128,128,192,160,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_115[] = {  5,  0,  0,  0, 96,144, 16, 96,144, 96,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_116[] = {  4,  0,  0,  0, 96, 64, 64, 64, 64,224, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica10_Character_117[] = {  5,  0,  0,  0,112,144,144,144,144,144,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_118[] = {  6,  0,  0,  0, 32, 32, 80, 80,136,136,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_119[] = {  8,  0,  0,  0, 40, 40, 84, 84,146,146,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_120[] = {  6,  0,  0,  0,136,136, 80, 32, 80,136,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_121[] = {  5,  0,128, 64, 64, 96,160,160,144,144,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_122[] = {  5,  0,  0,  0,240,128, 64, 32, 16,240,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_123[] = {  3,  0, 32, 64, 64, 64, 64,128, 64, 64, 64, 32,  0,  0,  0};
+static const GLubyte Helvetica10_Character_124[] = {  3,  0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica10_Character_125[] = {  3,  0,128, 64, 64, 64, 64, 32, 64, 64, 64,128,  0,  0,  0};
+static const GLubyte Helvetica10_Character_126[] = {  7,  0,  0,  0,  0,  0,  0,152,100,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_127[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_128[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_129[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_130[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_131[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_132[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_133[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_134[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_135[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_136[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_137[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_138[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_139[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_140[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_141[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_142[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_143[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_144[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_145[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_146[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_147[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_148[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_149[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_150[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_151[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_152[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_153[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_154[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_155[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_156[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_157[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_158[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_159[] = { 13,  0,  0,  0,  0,  0,  0, 84,  0,  0,  0, 68,  0,  0,  0, 68,  0,  0,  0, 84,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_160[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_161[] = {  3,  0, 64, 64, 64, 64, 64, 64,  0, 64,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_162[] = {  6,  0,  0, 64,112,168,160,160,168,112, 16,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_163[] = {  6,  0,  0,  0,176, 72, 64, 64,224, 64, 72, 48,  0,  0,  0};
+static const GLubyte Helvetica10_Character_164[] = {  5,  0,  0,  0,  0,144, 96,144,144, 96,144,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_165[] = {  6,  0,  0,  0, 32,248, 32,248, 80, 80,136,136,  0,  0,  0};
+static const GLubyte Helvetica10_Character_166[] = {  3,  0, 64, 64, 64, 64,  0,  0, 64, 64, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica10_Character_167[] = {  6,  0,112,136, 24,112,200,152,112,192,136,112,  0,  0,  0};
+static const GLubyte Helvetica10_Character_168[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,160,  0,  0,  0};
+static const GLubyte Helvetica10_Character_169[] = {  9,  0,  0,  0,  0,  0,  0, 28,  0, 34,  0, 77,  0, 81,  0, 77,  0, 34,  0, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_170[] = {  4,  0,  0,  0,  0,  0,  0,224,  0,160, 32,224,  0,  0,  0};
+static const GLubyte Helvetica10_Character_171[] = {  6,  0,  0,  0, 40, 80,160, 80, 40,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_172[] = {  7,  0,  0,  0,  0,  0,  4,  4,124,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_173[] = {  4,  0,  0,  0,  0,  0,  0,224,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_174[] = {  9,  0,  0,  0,  0,  0,  0, 28,  0, 34,  0, 85,  0, 89,  0, 93,  0, 34,  0, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_175[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,224,  0,  0,  0};
+static const GLubyte Helvetica10_Character_176[] = {  4,  0,  0,  0,  0,  0,  0, 96,144,144, 96,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_177[] = {  6,  0,  0,  0,248,  0, 32, 32,248, 32, 32,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_178[] = {  3,  0,  0,  0,  0,  0,  0,224, 64,160, 96,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_179[] = {  3,  0,  0,  0,  0,  0,  0,192, 32, 64,224,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_180[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,128, 64,  0,  0,  0};
+static const GLubyte Helvetica10_Character_181[] = {  5,  0,128,128,240,144,144,144,144,144,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_182[] = {  6,  0, 40, 40, 40, 40, 40,104,232,232,232,124,  0,  0,  0};
+static const GLubyte Helvetica10_Character_183[] = {  3,  0,  0,  0,  0,  0,  0,192,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_184[] = {  3,  0,192, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_185[] = {  3,  0,  0,  0,  0,  0,  0, 64, 64,192, 64,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_186[] = {  4,  0,  0,  0,  0,  0,  0,224,  0,224,160,224,  0,  0,  0};
+static const GLubyte Helvetica10_Character_187[] = {  6,  0,  0,  0,160, 80, 40, 80,160,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_188[] = {  9,  0,  0,  0,  0,  0,  0, 33,  0, 23,128, 19,  0,  9,  0, 72,  0, 68,  0,196,  0, 66,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_189[] = {  9,  0,  0,  0,  0,  0,  0, 39,  0, 18,  0, 21,  0, 11,  0, 72,  0, 68,  0,196,  0, 66,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_190[] = {  9,  0,  0,  0,  0,  0,  0, 33,  0, 23,128, 19,  0,  9,  0,200,  0, 36,  0, 68,  0,226,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_191[] = {  6,  0, 48, 72, 64, 32, 16, 16,  0, 16,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_192[] = {  7,  0,  0,  0,130,130,124, 68, 40, 40, 16, 16,  0, 16, 32};
+static const GLubyte Helvetica10_Character_193[] = {  7,  0,  0,  0,130,130,124, 68, 40, 40, 16, 16,  0, 16,  8};
+static const GLubyte Helvetica10_Character_194[] = {  7,  0,  0,  0,130,130,124, 68, 40, 40, 16, 16,  0, 40, 16};
+static const GLubyte Helvetica10_Character_195[] = {  7,  0,  0,  0,130,130,124, 68, 40, 40, 16, 16,  0, 40, 20};
+static const GLubyte Helvetica10_Character_196[] = {  7,  0,  0,  0,130,130,124, 68, 40, 40, 16, 16,  0, 40,  0};
+static const GLubyte Helvetica10_Character_197[] = {  7,  0,  0,  0,130,130,124, 68, 40, 40, 16, 16, 16, 40, 16};
+static const GLubyte Helvetica10_Character_198[] = { 10,  0,  0,  0,  0,  0,  0,143,128,136,  0,120,  0, 72,  0, 47,128, 40,  0, 24,  0, 31,128,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_199[] = {  8,  0, 24,  8, 60, 66, 64, 64, 64, 64, 66, 60,  0,  0,  0};
+static const GLubyte Helvetica10_Character_200[] = {  7,  0,  0,  0,124, 64, 64, 64,124, 64, 64,124,  0, 16, 32};
+static const GLubyte Helvetica10_Character_201[] = {  7,  0,  0,  0,124, 64, 64, 64,124, 64, 64,124,  0, 16,  8};
+static const GLubyte Helvetica10_Character_202[] = {  7,  0,  0,  0,124, 64, 64,124, 64, 64, 64,124,  0, 40, 16};
+static const GLubyte Helvetica10_Character_203[] = {  7,  0,  0,  0,124, 64, 64, 64,124, 64, 64,124,  0, 40,  0};
+static const GLubyte Helvetica10_Character_204[] = {  3,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64,  0, 64,128};
+static const GLubyte Helvetica10_Character_205[] = {  3,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64,  0, 64, 32};
+static const GLubyte Helvetica10_Character_206[] = {  3,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64,  0,160, 64};
+static const GLubyte Helvetica10_Character_207[] = {  3,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64,  0,160,  0};
+static const GLubyte Helvetica10_Character_208[] = {  8,  0,  0,  0,120, 68, 66, 66,242, 66, 68,120,  0,  0,  0};
+static const GLubyte Helvetica10_Character_209[] = {  8,  0,  0,  0, 70, 70, 74, 74, 82, 82, 98, 98,  0, 40, 20};
+static const GLubyte Helvetica10_Character_210[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 60,  0,  8, 16};
+static const GLubyte Helvetica10_Character_211[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 60,  0,  8,  4};
+static const GLubyte Helvetica10_Character_212[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 60,  0, 20,  8};
+static const GLubyte Helvetica10_Character_213[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 60,  0, 40, 20};
+static const GLubyte Helvetica10_Character_214[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 60,  0, 36,  0};
+static const GLubyte Helvetica10_Character_215[] = {  6,  0,  0,  0,  0,136, 80, 32, 80,136,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_216[] = {  8,  0,  0, 64, 60, 98, 82, 82, 74, 74, 70, 60,  2,  0,  0};
+static const GLubyte Helvetica10_Character_217[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66,  0,  8, 16};
+static const GLubyte Helvetica10_Character_218[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66,  0, 16,  8};
+static const GLubyte Helvetica10_Character_219[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66,  0, 20,  8};
+static const GLubyte Helvetica10_Character_220[] = {  8,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66,  0, 36,  0};
+static const GLubyte Helvetica10_Character_221[] = {  7,  0,  0,  0, 16, 16, 16, 40, 40, 68, 68,130,  0, 16,  8};
+static const GLubyte Helvetica10_Character_222[] = {  7,  0,  0,  0, 64, 64,120, 68, 68,120, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica10_Character_223[] = {  5,  0,  0,  0,160,144,144,144,160,144,144, 96,  0,  0,  0};
+static const GLubyte Helvetica10_Character_224[] = {  5,  0,  0,  0,104,144,144,112, 16,224,  0, 32, 64,  0,  0};
+static const GLubyte Helvetica10_Character_225[] = {  5,  0,  0,  0,104,144,144,112, 16,224,  0, 32, 16,  0,  0};
+static const GLubyte Helvetica10_Character_226[] = {  5,  0,  0,  0,104,144,144,112, 16,224,  0, 80, 32,  0,  0};
+static const GLubyte Helvetica10_Character_227[] = {  5,  0,  0,  0,104,144,144,112, 16,224,  0,160, 80,  0,  0};
+static const GLubyte Helvetica10_Character_228[] = {  5,  0,  0,  0,104,144,144,112, 16,224,  0, 80,  0,  0,  0};
+static const GLubyte Helvetica10_Character_229[] = {  5,  0,  0,  0,104,144,144,112, 16,224, 32, 80, 32,  0,  0};
+static const GLubyte Helvetica10_Character_230[] = {  8,  0,  0,  0,108,146,144,126, 18,236,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_231[] = {  5,  0, 96, 32, 96,144,128,128,144, 96,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_232[] = {  5,  0,  0,  0, 96,144,128,240,144, 96,  0, 32, 64,  0,  0};
+static const GLubyte Helvetica10_Character_233[] = {  5,  0,  0,  0, 96,144,128,240,144, 96,  0, 64, 32,  0,  0};
+static const GLubyte Helvetica10_Character_234[] = {  5,  0,  0,  0, 96,144,128,240,144, 96,  0, 80, 32,  0,  0};
+static const GLubyte Helvetica10_Character_235[] = {  5,  0,  0,  0, 96,144,128,240,144, 96,  0, 80,  0,  0,  0};
+static const GLubyte Helvetica10_Character_236[] = {  2,  0,  0,  0,128,128,128,128,128,128,  0,128,  0,  0,  0};
+static const GLubyte Helvetica10_Character_237[] = {  2,  0,  0,  0,128,128,128,128,128,128,  0,128, 64,  0,  0};
+static const GLubyte Helvetica10_Character_238[] = {  2,  0,  0,  0,128,128,128,128,128,128,  0, 64,128,  0,  0};
+static const GLubyte Helvetica10_Character_239[] = {  2,  0,  0,  0, 64, 64, 64, 64, 64, 64,  0,160,  0,  0,  0};
+static const GLubyte Helvetica10_Character_240[] = {  6,  0,  0,  0,112,136,136,136,136,120,144, 96, 80,  0,  0};
+static const GLubyte Helvetica10_Character_241[] = {  5,  0,  0,  0,144,144,144,144,144,224,  0,160, 80,  0,  0};
+static const GLubyte Helvetica10_Character_242[] = {  6,  0,  0,  0,112,136,136,136,136,112,  0, 32, 64,  0,  0};
+static const GLubyte Helvetica10_Character_243[] = {  6,  0,  0,  0,112,136,136,136,136,112,  0, 32, 16,  0,  0};
+static const GLubyte Helvetica10_Character_244[] = {  6,  0,  0,  0,112,136,136,136,136,112,  0, 80, 32,  0,  0};
+static const GLubyte Helvetica10_Character_245[] = {  6,  0,  0,  0,112,136,136,136,136,112,  0, 80, 40,  0,  0};
+static const GLubyte Helvetica10_Character_246[] = {  6,  0,  0,  0,112,136,136,136,136,112,  0, 80,  0,  0,  0};
+static const GLubyte Helvetica10_Character_247[] = {  6,  0,  0,  0,  0, 32,  0,248,  0, 32,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_248[] = {  6,  0,  0,  0,112,136,200,168,152,116,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica10_Character_249[] = {  5,  0,  0,  0,112,144,144,144,144,144,  0, 32, 64,  0,  0};
+static const GLubyte Helvetica10_Character_250[] = {  5,  0,  0,  0,112,144,144,144,144,144,  0, 64, 32,  0,  0};
+static const GLubyte Helvetica10_Character_251[] = {  5,  0,  0,  0,112,144,144,144,144,144,  0, 80, 32,  0,  0};
+static const GLubyte Helvetica10_Character_252[] = {  5,  0,  0,  0,112,144,144,144,144,144,  0, 80,  0,  0,  0};
+static const GLubyte Helvetica10_Character_253[] = {  5,  0,128, 64, 64, 96,160,160,144,144,  0, 32, 16,  0,  0};
+static const GLubyte Helvetica10_Character_254[] = {  6,  0,128,128,176,200,136,136,200,176,128,128,  0,  0,  0};
+static const GLubyte Helvetica10_Character_255[] = {  5,  0,128, 64, 64, 96,160,160,144,144,  0, 80,  0,  0,  0};
+
+/* The font characters mapping: */
+static const GLubyte* Helvetica10_Character_Map[] = {Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,
+                                                     Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,
+                                                     Helvetica10_Character_032,Helvetica10_Character_033,Helvetica10_Character_034,Helvetica10_Character_035,Helvetica10_Character_036,Helvetica10_Character_037,Helvetica10_Character_038,Helvetica10_Character_039,Helvetica10_Character_040,Helvetica10_Character_041,Helvetica10_Character_042,Helvetica10_Character_043,Helvetica10_Character_044,Helvetica10_Character_045,Helvetica10_Character_046,Helvetica10_Character_047,
+                                                     Helvetica10_Character_048,Helvetica10_Character_049,Helvetica10_Character_050,Helvetica10_Character_051,Helvetica10_Character_052,Helvetica10_Character_053,Helvetica10_Character_054,Helvetica10_Character_055,Helvetica10_Character_056,Helvetica10_Character_057,Helvetica10_Character_058,Helvetica10_Character_059,Helvetica10_Character_060,Helvetica10_Character_061,Helvetica10_Character_062,Helvetica10_Character_063,
+                                                     Helvetica10_Character_064,Helvetica10_Character_065,Helvetica10_Character_066,Helvetica10_Character_067,Helvetica10_Character_068,Helvetica10_Character_069,Helvetica10_Character_070,Helvetica10_Character_071,Helvetica10_Character_072,Helvetica10_Character_073,Helvetica10_Character_074,Helvetica10_Character_075,Helvetica10_Character_076,Helvetica10_Character_077,Helvetica10_Character_078,Helvetica10_Character_079,
+                                                     Helvetica10_Character_080,Helvetica10_Character_081,Helvetica10_Character_082,Helvetica10_Character_083,Helvetica10_Character_084,Helvetica10_Character_085,Helvetica10_Character_086,Helvetica10_Character_087,Helvetica10_Character_088,Helvetica10_Character_089,Helvetica10_Character_090,Helvetica10_Character_091,Helvetica10_Character_092,Helvetica10_Character_093,Helvetica10_Character_094,Helvetica10_Character_095,
+                                                     Helvetica10_Character_096,Helvetica10_Character_097,Helvetica10_Character_098,Helvetica10_Character_099,Helvetica10_Character_100,Helvetica10_Character_101,Helvetica10_Character_102,Helvetica10_Character_103,Helvetica10_Character_104,Helvetica10_Character_105,Helvetica10_Character_106,Helvetica10_Character_107,Helvetica10_Character_108,Helvetica10_Character_109,Helvetica10_Character_110,Helvetica10_Character_111,
+                                                     Helvetica10_Character_112,Helvetica10_Character_113,Helvetica10_Character_114,Helvetica10_Character_115,Helvetica10_Character_116,Helvetica10_Character_117,Helvetica10_Character_118,Helvetica10_Character_119,Helvetica10_Character_120,Helvetica10_Character_121,Helvetica10_Character_122,Helvetica10_Character_123,Helvetica10_Character_124,Helvetica10_Character_125,Helvetica10_Character_126,Helvetica10_Character_032,
+                                                     Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,
+                                                     Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,Helvetica10_Character_032,
+                                                     Helvetica10_Character_160,Helvetica10_Character_161,Helvetica10_Character_162,Helvetica10_Character_163,Helvetica10_Character_164,Helvetica10_Character_165,Helvetica10_Character_166,Helvetica10_Character_167,Helvetica10_Character_168,Helvetica10_Character_169,Helvetica10_Character_170,Helvetica10_Character_171,Helvetica10_Character_172,Helvetica10_Character_173,Helvetica10_Character_174,Helvetica10_Character_175,
+                                                     Helvetica10_Character_176,Helvetica10_Character_177,Helvetica10_Character_178,Helvetica10_Character_179,Helvetica10_Character_180,Helvetica10_Character_181,Helvetica10_Character_182,Helvetica10_Character_183,Helvetica10_Character_184,Helvetica10_Character_185,Helvetica10_Character_186,Helvetica10_Character_187,Helvetica10_Character_188,Helvetica10_Character_189,Helvetica10_Character_190,Helvetica10_Character_191,
+                                                     Helvetica10_Character_192,Helvetica10_Character_193,Helvetica10_Character_194,Helvetica10_Character_195,Helvetica10_Character_196,Helvetica10_Character_197,Helvetica10_Character_198,Helvetica10_Character_199,Helvetica10_Character_200,Helvetica10_Character_201,Helvetica10_Character_202,Helvetica10_Character_203,Helvetica10_Character_204,Helvetica10_Character_205,Helvetica10_Character_206,Helvetica10_Character_207,
+                                                     Helvetica10_Character_208,Helvetica10_Character_209,Helvetica10_Character_210,Helvetica10_Character_211,Helvetica10_Character_212,Helvetica10_Character_213,Helvetica10_Character_214,Helvetica10_Character_215,Helvetica10_Character_216,Helvetica10_Character_217,Helvetica10_Character_218,Helvetica10_Character_219,Helvetica10_Character_220,Helvetica10_Character_221,Helvetica10_Character_222,Helvetica10_Character_223,
+                                                     Helvetica10_Character_224,Helvetica10_Character_225,Helvetica10_Character_226,Helvetica10_Character_227,Helvetica10_Character_228,Helvetica10_Character_229,Helvetica10_Character_230,Helvetica10_Character_231,Helvetica10_Character_232,Helvetica10_Character_233,Helvetica10_Character_234,Helvetica10_Character_235,Helvetica10_Character_236,Helvetica10_Character_237,Helvetica10_Character_238,Helvetica10_Character_239,
+                                                     Helvetica10_Character_240,Helvetica10_Character_241,Helvetica10_Character_242,Helvetica10_Character_243,Helvetica10_Character_244,Helvetica10_Character_245,Helvetica10_Character_246,Helvetica10_Character_247,Helvetica10_Character_248,Helvetica10_Character_249,Helvetica10_Character_250,Helvetica10_Character_251,Helvetica10_Character_252,Helvetica10_Character_253,Helvetica10_Character_254,Helvetica10_Character_255,NULL};
+
+/* The font structure: */
+const SFG_Font fgFontHelvetica10 = { "-adobe-helvetica-medium-r-normal--10-100-75-75-p-56-iso8859-1", 256, 14, Helvetica10_Character_Map, 0, 3 };
+
+static const GLubyte Helvetica12_Character_000[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_001[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_002[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_003[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_004[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_005[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_006[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_007[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_008[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_009[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_010[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_011[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_012[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_013[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_014[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_015[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_016[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_017[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_018[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_019[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_020[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_021[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_022[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_023[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_024[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_025[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_026[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_027[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_028[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_029[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_030[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_031[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_032[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_033[] = {  3,  0,  0,  0,  0, 64,  0, 64, 64, 64, 64, 64, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica12_Character_034[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 80, 80, 80,  0,  0,  0};
+static const GLubyte Helvetica12_Character_035[] = {  7,  0,  0,  0,  0, 80, 80, 80,252, 40,252, 40, 40,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_036[] = {  7,  0,  0,  0, 16, 56, 84, 84, 20, 56, 80, 84, 56, 16,  0,  0,  0};
+static const GLubyte Helvetica12_Character_037[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0, 17,128, 10, 64, 10, 64,  9,128,  4,  0, 52,  0, 74,  0, 74,  0, 49,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_038[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 57,  0, 70,  0, 66,  0, 69,  0, 40,  0, 24,  0, 36,  0, 36,  0, 24,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_039[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 64, 32, 96,  0,  0,  0};
+static const GLubyte Helvetica12_Character_040[] = {  4,  0, 16, 32, 32, 64, 64, 64, 64, 64, 64, 32, 32, 16,  0,  0,  0};
+static const GLubyte Helvetica12_Character_041[] = {  4,  0,128, 64, 64, 32, 32, 32, 32, 32, 32, 64, 64,128,  0,  0,  0};
+static const GLubyte Helvetica12_Character_042[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 80, 32, 80,  0,  0,  0};
+static const GLubyte Helvetica12_Character_043[] = {  7,  0,  0,  0,  0,  0, 16, 16,124, 16, 16,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_044[] = {  4,  0,  0, 64, 32, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_045[] = {  8,  0,  0,  0,  0,  0,  0,  0,124,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_046[] = {  3,  0,  0,  0,  0, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_047[] = {  4,  0,  0,  0,  0,128,128, 64, 64, 64, 32, 32, 16, 16,  0,  0,  0};
+static const GLubyte Helvetica12_Character_048[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 68, 68, 68, 56,  0,  0,  0};
+static const GLubyte Helvetica12_Character_049[] = {  7,  0,  0,  0,  0, 16, 16, 16, 16, 16, 16, 16,112, 16,  0,  0,  0};
+static const GLubyte Helvetica12_Character_050[] = {  7,  0,  0,  0,  0,124, 64, 64, 32, 16,  8,  4, 68, 56,  0,  0,  0};
+static const GLubyte Helvetica12_Character_051[] = {  7,  0,  0,  0,  0, 56, 68, 68,  4,  4, 24,  4, 68, 56,  0,  0,  0};
+static const GLubyte Helvetica12_Character_052[] = {  7,  0,  0,  0,  0,  8,  8,252,136, 72, 40, 40, 24,  8,  0,  0,  0};
+static const GLubyte Helvetica12_Character_053[] = {  7,  0,  0,  0,  0, 56, 68, 68,  4,  4,120, 64, 64,124,  0,  0,  0};
+static const GLubyte Helvetica12_Character_054[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68,100, 88, 64, 68, 56,  0,  0,  0};
+static const GLubyte Helvetica12_Character_055[] = {  7,  0,  0,  0,  0, 32, 32, 16, 16, 16,  8,  8,  4,124,  0,  0,  0};
+static const GLubyte Helvetica12_Character_056[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 56, 68, 68, 56,  0,  0,  0};
+static const GLubyte Helvetica12_Character_057[] = {  7,  0,  0,  0,  0, 56, 68,  4,  4, 60, 68, 68, 68, 56,  0,  0,  0};
+static const GLubyte Helvetica12_Character_058[] = {  3,  0,  0,  0,  0, 64,  0,  0,  0,  0, 64,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_059[] = {  3,  0,  0,128, 64, 64,  0,  0,  0,  0, 64,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_060[] = {  7,  0,  0,  0,  0,  0, 12, 48,192, 48, 12,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_061[] = {  7,  0,  0,  0,  0,  0,  0,124,  0,124,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_062[] = {  7,  0,  0,  0,  0,  0, 96, 24,  6, 24, 96,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_063[] = {  7,  0,  0,  0,  0, 16,  0, 16, 16,  8,  8, 68, 68, 56,  0,  0,  0};
+static const GLubyte Helvetica12_Character_064[] = { 12,  0,  0,  0,  0,  0,  0, 31,  0, 32,  0, 77,128, 83, 64, 81, 32, 81, 32, 73, 32, 38,160, 48, 64, 15,128,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_065[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 62,  0, 34,  0, 34,  0, 20,  0, 20,  0,  8,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_066[] = {  8,  0,  0,  0,  0,124, 66, 66, 66,124, 66, 66, 66,124,  0,  0,  0};
+static const GLubyte Helvetica12_Character_067[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 33,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 33,  0, 30,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_068[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,124,  0, 66,  0, 65,  0, 65,  0, 65,  0, 65,  0, 65,  0, 66,  0,124,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_069[] = {  8,  0,  0,  0,  0,126, 64, 64, 64,126, 64, 64, 64,126,  0,  0,  0};
+static const GLubyte Helvetica12_Character_070[] = {  8,  0,  0,  0,  0, 64, 64, 64, 64,124, 64, 64, 64,126,  0,  0,  0};
+static const GLubyte Helvetica12_Character_071[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 29,  0, 35,  0, 65,  0, 65,  0, 71,  0, 64,  0, 64,  0, 33,  0, 30,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_072[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 65,  0,127,  0, 65,  0, 65,  0, 65,  0, 65,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_073[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica12_Character_074[] = {  7,  0,  0,  0,  0, 56, 68, 68,  4,  4,  4,  4,  4,  4,  0,  0,  0};
+static const GLubyte Helvetica12_Character_075[] = {  8,  0,  0,  0,  0, 65, 66, 68, 72,112, 80, 72, 68, 66,  0,  0,  0};
+static const GLubyte Helvetica12_Character_076[] = {  7,  0,  0,  0,  0,124, 64, 64, 64, 64, 64, 64, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica12_Character_077[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0, 68, 64, 68, 64, 74, 64, 74, 64, 81, 64, 81, 64, 96,192, 96,192, 64, 64,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_078[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 67,  0, 69,  0, 69,  0, 73,  0, 81,  0, 81,  0, 97,  0, 65,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_079[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 33,  0, 64,128, 64,128, 64,128, 64,128, 64,128, 33,  0, 30,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_080[] = {  8,  0,  0,  0,  0, 64, 64, 64, 64,124, 66, 66, 66,124,  0,  0,  0};
+static const GLubyte Helvetica12_Character_081[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 30,128, 33,  0, 66,128, 68,128, 64,128, 64,128, 64,128, 33,  0, 30,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_082[] = {  8,  0,  0,  0,  0, 66, 66, 66, 68,124, 66, 66, 66,124,  0,  0,  0};
+static const GLubyte Helvetica12_Character_083[] = {  8,  0,  0,  0,  0, 60, 66, 66,  2, 12, 48, 64, 66, 60,  0,  0,  0};
+static const GLubyte Helvetica12_Character_084[] = {  7,  0,  0,  0,  0, 16, 16, 16, 16, 16, 16, 16, 16,254,  0,  0,  0};
+static const GLubyte Helvetica12_Character_085[] = {  8,  0,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66, 66,  0,  0,  0};
+static const GLubyte Helvetica12_Character_086[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0, 20,  0, 20,  0, 34,  0, 34,  0, 34,  0, 65,  0, 65,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_087[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0, 17,  0, 17,  0, 17,  0, 42,128, 42,128, 36,128, 68, 64, 68, 64, 68, 64,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_088[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 34,  0, 34,  0, 20,  0,  8,  0, 20,  0, 34,  0, 34,  0, 65,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_089[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0, 20,  0, 34,  0, 34,  0, 65,  0, 65,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_090[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,127,  0, 64,  0, 32,  0, 16,  0,  8,  0,  4,  0,  2,  0,  1,  0,127,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_091[] = {  3,  0, 96, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 96,  0,  0,  0};
+static const GLubyte Helvetica12_Character_092[] = {  4,  0,  0,  0,  0, 16, 16, 32, 32, 32, 64, 64,128,128,  0,  0,  0};
+static const GLubyte Helvetica12_Character_093[] = {  3,  0,192, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,192,  0,  0,  0};
+static const GLubyte Helvetica12_Character_094[] = {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,136, 80, 32,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_095[] = {  7,  0,  0,254,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_096[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192,128, 64,  0,  0,  0};
+static const GLubyte Helvetica12_Character_097[] = {  7,  0,  0,  0,  0, 58, 68, 68, 60,  4, 68, 56,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_098[] = {  7,  0,  0,  0,  0, 88,100, 68, 68, 68,100, 88, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica12_Character_099[] = {  7,  0,  0,  0,  0, 56, 68, 64, 64, 64, 68, 56,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_100[] = {  7,  0,  0,  0,  0, 52, 76, 68, 68, 68, 76, 52,  4,  4,  0,  0,  0};
+static const GLubyte Helvetica12_Character_101[] = {  7,  0,  0,  0,  0, 56, 68, 64,124, 68, 68, 56,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_102[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64,224, 64, 48,  0,  0,  0};
+static const GLubyte Helvetica12_Character_103[] = {  7,  0, 56, 68,  4, 52, 76, 68, 68, 68, 76, 52,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_104[] = {  7,  0,  0,  0,  0, 68, 68, 68, 68, 68,100, 88, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica12_Character_105[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64,  0, 64,  0,  0,  0};
+static const GLubyte Helvetica12_Character_106[] = {  3,  0,128, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0, 64,  0,  0,  0};
+static const GLubyte Helvetica12_Character_107[] = {  6,  0,  0,  0,  0, 68, 72, 80, 96, 96, 80, 72, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica12_Character_108[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica12_Character_109[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 73,  0, 73,  0, 73,  0, 73,  0, 73,  0,109,  0, 82,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_110[] = {  7,  0,  0,  0,  0, 68, 68, 68, 68, 68,100, 88,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_111[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 68, 56,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_112[] = {  7,  0, 64, 64, 64, 88,100, 68, 68, 68,100, 88,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_113[] = {  7,  0,  4,  4,  4, 52, 76, 68, 68, 68, 76, 52,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_114[] = {  4,  0,  0,  0,  0, 64, 64, 64, 64, 64, 96, 80,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_115[] = {  6,  0,  0,  0,  0, 48, 72,  8, 48, 64, 72, 48,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_116[] = {  3,  0,  0,  0,  0, 96, 64, 64, 64, 64, 64,224, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica12_Character_117[] = {  7,  0,  0,  0,  0, 52, 76, 68, 68, 68, 68, 68,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_118[] = {  7,  0,  0,  0,  0, 16, 16, 40, 40, 68, 68, 68,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_119[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0, 34,  0, 85,  0, 73,  0, 73,  0,136,128,136,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_120[] = {  6,  0,  0,  0,  0,132,132, 72, 48, 48, 72,132,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_121[] = {  7,  0, 64, 32, 16, 16, 40, 40, 72, 68, 68, 68,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_122[] = {  6,  0,  0,  0,  0,120, 64, 32, 32, 16,  8,120,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_123[] = {  4,  0, 48, 64, 64, 64, 64, 64,128, 64, 64, 64, 64, 48,  0,  0,  0};
+static const GLubyte Helvetica12_Character_124[] = {  3,  0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica12_Character_125[] = {  4,  0,192, 32, 32, 32, 32, 32, 16, 32, 32, 32, 32,192,  0,  0,  0};
+static const GLubyte Helvetica12_Character_126[] = {  7,  0,  0,  0,  0,  0,  0,  0,152,100,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_127[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_128[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_129[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_130[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_131[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_132[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_133[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_134[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_135[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_136[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_137[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_138[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_139[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_140[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_141[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_142[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_143[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_144[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_145[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_146[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_147[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_148[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_149[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_150[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_151[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_152[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_153[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_154[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_155[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_156[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_157[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_158[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_159[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0, 85,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 65,  0,  0,  0, 85,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_160[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_161[] = {  3,  0, 64, 64, 64, 64, 64, 64, 64, 64,  0, 64,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_162[] = {  7,  0,  0,  0, 32, 56,100, 80, 80, 80, 84, 56,  8,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_163[] = {  7,  0,  0,  0,  0, 88, 36, 16, 16,120, 32, 32, 36, 24,  0,  0,  0};
+static const GLubyte Helvetica12_Character_164[] = {  7,  0,  0,  0,  0,  0,132,120, 72, 72,120,132,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_165[] = {  7,  0,  0,  0,  0, 16, 16,124, 16,124, 16, 40, 68, 68,  0,  0,  0};
+static const GLubyte Helvetica12_Character_166[] = {  3,  0,  0, 64, 64, 64, 64,  0,  0,  0, 64, 64, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica12_Character_167[] = {  6,  0,112,136,  8, 48, 72,136,136,144, 96,128,136,112,  0,  0,  0};
+static const GLubyte Helvetica12_Character_168[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,160,  0,  0,  0};
+static const GLubyte Helvetica12_Character_169[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 32,128, 78, 64, 81, 64, 80, 64, 81, 64, 78, 64, 32,128, 31,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_170[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,112,  0, 80, 16,112,  0,  0,  0};
+static const GLubyte Helvetica12_Character_171[] = {  7,  0,  0,  0,  0,  0, 20, 40, 80, 40, 20,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_172[] = {  8,  0,  0,  0,  0,  0,  0,  2,  2,  2,126,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_173[] = {  5,  0,  0,  0,  0,  0,  0,  0,240,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_174[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 32,128, 74, 64, 74, 64, 76, 64, 74, 64, 78, 64, 32,128, 31,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_175[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,240,  0,  0,  0};
+static const GLubyte Helvetica12_Character_176[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0, 96,144,144, 96,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_177[] = {  7,  0,  0,  0,  0,124,  0, 16, 16,124, 16, 16,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_178[] = {  4,  0,  0,  0,  0,  0,  0,  0,240, 64, 32,144, 96,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_179[] = {  4,  0,  0,  0,  0,  0,  0,  0,192, 32, 64, 32,224,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_180[] = {  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128, 64,  0,  0};
+static const GLubyte Helvetica12_Character_181[] = {  7,  0, 64, 64, 64,116, 76, 68, 68, 68, 68, 68,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_182[] = {  7,  0, 40, 40, 40, 40, 40, 40,104,232,232,232,104, 60,  0,  0,  0};
+static const GLubyte Helvetica12_Character_183[] = {  3,  0,  0,  0,  0,  0,  0,  0, 64,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_184[] = {  3,  0,192, 32, 32, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_185[] = {  4,  0,  0,  0,  0,  0,  0,  0, 32, 32, 32, 96, 32,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_186[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,112,  0,112, 80,112,  0,  0,  0};
+static const GLubyte Helvetica12_Character_187[] = {  7,  0,  0,  0,  0,  0, 80, 40, 20, 40, 80,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_188[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 39,128, 21,  0, 19,  0, 73,  0, 68,  0, 68,  0,194,  0, 65,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_189[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 71,128, 34,  0, 17,  0, 20,128, 75,  0, 72,  0, 68,  0,194,  0, 65,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_190[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 33,  0, 23,128, 21,  0, 11,  0,201,  0, 36,  0, 68,  0, 34,  0,225,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_191[] = {  7,  0, 56, 68, 68, 32, 32, 16, 16,  0, 16,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_192[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 62,  0, 34,  0, 34,  0, 20,  0,  8,  0,  8,  0,  0,  0,  8,  0, 16,  0};
+static const GLubyte Helvetica12_Character_193[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 62,  0, 34,  0, 34,  0, 20,  0,  8,  0,  8,  0,  0,  0,  8,  0,  4,  0};
+static const GLubyte Helvetica12_Character_194[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 62,  0, 34,  0, 34,  0, 20,  0,  8,  0,  8,  0,  0,  0, 20,  0,  8,  0};
+static const GLubyte Helvetica12_Character_195[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 62,  0, 34,  0, 34,  0, 20,  0,  8,  0,  8,  0,  0,  0, 20,  0, 10,  0};
+static const GLubyte Helvetica12_Character_196[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 62,  0, 34,  0, 34,  0, 20,  0,  8,  0,  8,  0,  0,  0, 20,  0,  0,  0};
+static const GLubyte Helvetica12_Character_197[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 65,  0, 65,  0, 62,  0, 34,  0, 34,  0, 20,  0,  8,  0,  8,  0,  8,  0, 20,  0,  8,  0};
+static const GLubyte Helvetica12_Character_198[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0, 71,192, 68,  0, 68,  0, 60,  0, 39,192, 36,  0, 20,  0, 20,  0, 15,192,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_199[] = {  9,  0,  0, 24,  0,  4,  0,  4,  0, 30,  0, 33,  0, 64,  0, 64,  0, 64,  0, 64,  0, 64,  0, 33,  0, 30,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_200[] = {  8,  0,  0,  0,  0,126, 64, 64, 64,126, 64, 64, 64,126,  0,  8, 16};
+static const GLubyte Helvetica12_Character_201[] = {  8,  0,  0,  0,  0,126, 64, 64, 64,126, 64, 64, 64,126,  0,  8,  4};
+static const GLubyte Helvetica12_Character_202[] = {  8,  0,  0,  0,  0,126, 64, 64, 64,126, 64, 64, 64,126,  0, 20,  8};
+static const GLubyte Helvetica12_Character_203[] = {  8,  0,  0,  0,  0,126, 64, 64, 64,126, 64, 64, 64,126,  0, 20,  0};
+static const GLubyte Helvetica12_Character_204[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0, 64,128};
+static const GLubyte Helvetica12_Character_205[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0, 64, 32};
+static const GLubyte Helvetica12_Character_206[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0,160, 64};
+static const GLubyte Helvetica12_Character_207[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64, 64, 64,  0,160,  0};
+static const GLubyte Helvetica12_Character_208[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,124,  0, 66,  0, 65,  0, 65,  0,241,  0, 65,  0, 65,  0, 66,  0,124,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_209[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 67,  0, 69,  0, 69,  0, 73,  0, 81,  0, 81,  0, 97,  0, 65,  0,  0,  0, 20,  0, 10,  0};
+static const GLubyte Helvetica12_Character_210[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 33,  0, 64,128, 64,128, 64,128, 64,128, 64,128, 33,  0, 30,  0,  0,  0,  4,  0,  8,  0};
+static const GLubyte Helvetica12_Character_211[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 33,  0, 64,128, 64,128, 64,128, 64,128, 64,128, 33,  0, 30,  0,  0,  0,  4,  0,  2,  0};
+static const GLubyte Helvetica12_Character_212[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 33,  0, 64,128, 64,128, 64,128, 64,128, 64,128, 33,  0, 30,  0,  0,  0, 10,  0,  4,  0};
+static const GLubyte Helvetica12_Character_213[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 33,  0, 64,128, 64,128, 64,128, 64,128, 64,128, 33,  0, 30,  0,  0,  0, 20,  0, 10,  0};
+static const GLubyte Helvetica12_Character_214[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 33,  0, 64,128, 64,128, 64,128, 64,128, 64,128, 33,  0, 30,  0,  0,  0, 18,  0,  0,  0};
+static const GLubyte Helvetica12_Character_215[] = {  7,  0,  0,  0,  0,  0, 68, 40, 16, 40, 68,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_216[] = { 10,  0,  0,  0,  0,  0,  0,128,  0, 94,  0, 33,  0, 80,128, 72,128, 68,128, 68,128, 66,128, 33,  0, 30,128,  0, 64,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_217[] = {  8,  0,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66, 66,  0,  8, 16};
+static const GLubyte Helvetica12_Character_218[] = {  8,  0,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66, 66,  0,  8,  4};
+static const GLubyte Helvetica12_Character_219[] = {  8,  0,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66, 66,  0, 20,  8};
+static const GLubyte Helvetica12_Character_220[] = {  8,  0,  0,  0,  0, 60, 66, 66, 66, 66, 66, 66, 66, 66,  0, 36,  0};
+static const GLubyte Helvetica12_Character_221[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0,  8,  0,  8,  0, 20,  0, 34,  0, 34,  0, 65,  0, 65,  0,  0,  0,  8,  0,  4,  0};
+static const GLubyte Helvetica12_Character_222[] = {  8,  0,  0,  0,  0, 64, 64,124, 66, 66, 66,124, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica12_Character_223[] = {  7,  0,  0,  0,  0, 88, 68, 68, 68, 88, 68, 68, 68, 56,  0,  0,  0};
+static const GLubyte Helvetica12_Character_224[] = {  7,  0,  0,  0,  0, 58, 68, 68, 60,  4, 68, 56,  0,  8, 16,  0,  0};
+static const GLubyte Helvetica12_Character_225[] = {  7,  0,  0,  0,  0, 58, 68, 68, 60,  4, 68, 56,  0, 16,  8,  0,  0};
+static const GLubyte Helvetica12_Character_226[] = {  7,  0,  0,  0,  0, 58, 68, 68, 60,  4, 68, 56,  0, 40, 16,  0,  0};
+static const GLubyte Helvetica12_Character_227[] = {  7,  0,  0,  0,  0, 58, 68, 68, 60,  4, 68, 56,  0, 40, 20,  0,  0};
+static const GLubyte Helvetica12_Character_228[] = {  7,  0,  0,  0,  0, 58, 68, 68, 60,  4, 68, 56,  0, 40,  0,  0,  0};
+static const GLubyte Helvetica12_Character_229[] = {  7,  0,  0,  0,  0, 58, 68, 68, 60,  4, 68, 56, 24, 36, 24,  0,  0};
+static const GLubyte Helvetica12_Character_230[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0, 59,128, 68, 64, 68,  0, 63,192,  4, 64, 68, 64, 59,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_231[] = {  7,  0, 48,  8, 16, 56, 68, 64, 64, 64, 68, 56,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_232[] = {  7,  0,  0,  0,  0, 56, 68, 64,124, 68, 68, 56,  0, 16, 32,  0,  0};
+static const GLubyte Helvetica12_Character_233[] = {  7,  0,  0,  0,  0, 56, 68, 64,124, 68, 68, 56,  0, 16,  8,  0,  0};
+static const GLubyte Helvetica12_Character_234[] = {  7,  0,  0,  0,  0, 56, 68, 64,124, 68, 68, 56,  0, 40, 16,  0,  0};
+static const GLubyte Helvetica12_Character_235[] = {  7,  0,  0,  0,  0, 56, 68, 64,124, 68, 68, 56,  0, 40,  0,  0,  0};
+static const GLubyte Helvetica12_Character_236[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64,  0, 64,128,  0,  0};
+static const GLubyte Helvetica12_Character_237[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64,  0, 64, 32,  0,  0};
+static const GLubyte Helvetica12_Character_238[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64,  0,160, 64,  0,  0};
+static const GLubyte Helvetica12_Character_239[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64, 64, 64, 64,  0,160,  0,  0,  0};
+static const GLubyte Helvetica12_Character_240[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 60,  4, 40, 24, 52,  0,  0};
+static const GLubyte Helvetica12_Character_241[] = {  7,  0,  0,  0,  0, 68, 68, 68, 68, 68,100, 88,  0, 40, 20,  0,  0};
+static const GLubyte Helvetica12_Character_242[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 68, 56,  0, 16, 32,  0,  0};
+static const GLubyte Helvetica12_Character_243[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 68, 56,  0, 16,  8,  0,  0};
+static const GLubyte Helvetica12_Character_244[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 68, 56,  0, 40, 16,  0,  0};
+static const GLubyte Helvetica12_Character_245[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 68, 56,  0, 40, 20,  0,  0};
+static const GLubyte Helvetica12_Character_246[] = {  7,  0,  0,  0,  0, 56, 68, 68, 68, 68, 68, 56,  0, 40,  0,  0,  0};
+static const GLubyte Helvetica12_Character_247[] = {  7,  0,  0,  0,  0,  0, 16,  0,124,  0, 16,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_248[] = {  7,  0,  0,  0,  0,184, 68,100, 84, 76, 68, 58,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica12_Character_249[] = {  7,  0,  0,  0,  0, 52, 76, 68, 68, 68, 68, 68,  0, 16, 32,  0,  0};
+static const GLubyte Helvetica12_Character_250[] = {  7,  0,  0,  0,  0, 52, 76, 68, 68, 68, 68, 68,  0, 16,  8,  0,  0};
+static const GLubyte Helvetica12_Character_251[] = {  7,  0,  0,  0,  0, 52, 76, 68, 68, 68, 68, 68,  0, 40, 16,  0,  0};
+static const GLubyte Helvetica12_Character_252[] = {  7,  0,  0,  0,  0, 52, 76, 68, 68, 68, 68, 68,  0, 40,  0,  0,  0};
+static const GLubyte Helvetica12_Character_253[] = {  7,  0, 64, 32, 16, 16, 40, 40, 72, 68, 68, 68,  0, 16,  8,  0,  0};
+static const GLubyte Helvetica12_Character_254[] = {  7,  0, 64, 64, 64, 88,100, 68, 68, 68,100, 88, 64, 64,  0,  0,  0};
+static const GLubyte Helvetica12_Character_255[] = {  7,  0, 96, 16, 16, 16, 24, 40, 40, 36, 68, 68,  0, 40,  0,  0,  0};
+
+/* The font characters mapping: */
+static const GLubyte* Helvetica12_Character_Map[] = {Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,
+                                                     Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,
+                                                     Helvetica12_Character_032,Helvetica12_Character_033,Helvetica12_Character_034,Helvetica12_Character_035,Helvetica12_Character_036,Helvetica12_Character_037,Helvetica12_Character_038,Helvetica12_Character_039,Helvetica12_Character_040,Helvetica12_Character_041,Helvetica12_Character_042,Helvetica12_Character_043,Helvetica12_Character_044,Helvetica12_Character_045,Helvetica12_Character_046,Helvetica12_Character_047,
+                                                     Helvetica12_Character_048,Helvetica12_Character_049,Helvetica12_Character_050,Helvetica12_Character_051,Helvetica12_Character_052,Helvetica12_Character_053,Helvetica12_Character_054,Helvetica12_Character_055,Helvetica12_Character_056,Helvetica12_Character_057,Helvetica12_Character_058,Helvetica12_Character_059,Helvetica12_Character_060,Helvetica12_Character_061,Helvetica12_Character_062,Helvetica12_Character_063,
+                                                     Helvetica12_Character_064,Helvetica12_Character_065,Helvetica12_Character_066,Helvetica12_Character_067,Helvetica12_Character_068,Helvetica12_Character_069,Helvetica12_Character_070,Helvetica12_Character_071,Helvetica12_Character_072,Helvetica12_Character_073,Helvetica12_Character_074,Helvetica12_Character_075,Helvetica12_Character_076,Helvetica12_Character_077,Helvetica12_Character_078,Helvetica12_Character_079,
+                                                     Helvetica12_Character_080,Helvetica12_Character_081,Helvetica12_Character_082,Helvetica12_Character_083,Helvetica12_Character_084,Helvetica12_Character_085,Helvetica12_Character_086,Helvetica12_Character_087,Helvetica12_Character_088,Helvetica12_Character_089,Helvetica12_Character_090,Helvetica12_Character_091,Helvetica12_Character_092,Helvetica12_Character_093,Helvetica12_Character_094,Helvetica12_Character_095,
+                                                     Helvetica12_Character_096,Helvetica12_Character_097,Helvetica12_Character_098,Helvetica12_Character_099,Helvetica12_Character_100,Helvetica12_Character_101,Helvetica12_Character_102,Helvetica12_Character_103,Helvetica12_Character_104,Helvetica12_Character_105,Helvetica12_Character_106,Helvetica12_Character_107,Helvetica12_Character_108,Helvetica12_Character_109,Helvetica12_Character_110,Helvetica12_Character_111,
+                                                     Helvetica12_Character_112,Helvetica12_Character_113,Helvetica12_Character_114,Helvetica12_Character_115,Helvetica12_Character_116,Helvetica12_Character_117,Helvetica12_Character_118,Helvetica12_Character_119,Helvetica12_Character_120,Helvetica12_Character_121,Helvetica12_Character_122,Helvetica12_Character_123,Helvetica12_Character_124,Helvetica12_Character_125,Helvetica12_Character_126,Helvetica12_Character_032,
+                                                     Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,
+                                                     Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,Helvetica12_Character_032,
+                                                     Helvetica12_Character_160,Helvetica12_Character_161,Helvetica12_Character_162,Helvetica12_Character_163,Helvetica12_Character_164,Helvetica12_Character_165,Helvetica12_Character_166,Helvetica12_Character_167,Helvetica12_Character_168,Helvetica12_Character_169,Helvetica12_Character_170,Helvetica12_Character_171,Helvetica12_Character_172,Helvetica12_Character_173,Helvetica12_Character_174,Helvetica12_Character_175,
+                                                     Helvetica12_Character_176,Helvetica12_Character_177,Helvetica12_Character_178,Helvetica12_Character_179,Helvetica12_Character_180,Helvetica12_Character_181,Helvetica12_Character_182,Helvetica12_Character_183,Helvetica12_Character_184,Helvetica12_Character_185,Helvetica12_Character_186,Helvetica12_Character_187,Helvetica12_Character_188,Helvetica12_Character_189,Helvetica12_Character_190,Helvetica12_Character_191,
+                                                     Helvetica12_Character_192,Helvetica12_Character_193,Helvetica12_Character_194,Helvetica12_Character_195,Helvetica12_Character_196,Helvetica12_Character_197,Helvetica12_Character_198,Helvetica12_Character_199,Helvetica12_Character_200,Helvetica12_Character_201,Helvetica12_Character_202,Helvetica12_Character_203,Helvetica12_Character_204,Helvetica12_Character_205,Helvetica12_Character_206,Helvetica12_Character_207,
+                                                     Helvetica12_Character_208,Helvetica12_Character_209,Helvetica12_Character_210,Helvetica12_Character_211,Helvetica12_Character_212,Helvetica12_Character_213,Helvetica12_Character_214,Helvetica12_Character_215,Helvetica12_Character_216,Helvetica12_Character_217,Helvetica12_Character_218,Helvetica12_Character_219,Helvetica12_Character_220,Helvetica12_Character_221,Helvetica12_Character_222,Helvetica12_Character_223,
+                                                     Helvetica12_Character_224,Helvetica12_Character_225,Helvetica12_Character_226,Helvetica12_Character_227,Helvetica12_Character_228,Helvetica12_Character_229,Helvetica12_Character_230,Helvetica12_Character_231,Helvetica12_Character_232,Helvetica12_Character_233,Helvetica12_Character_234,Helvetica12_Character_235,Helvetica12_Character_236,Helvetica12_Character_237,Helvetica12_Character_238,Helvetica12_Character_239,
+                                                     Helvetica12_Character_240,Helvetica12_Character_241,Helvetica12_Character_242,Helvetica12_Character_243,Helvetica12_Character_244,Helvetica12_Character_245,Helvetica12_Character_246,Helvetica12_Character_247,Helvetica12_Character_248,Helvetica12_Character_249,Helvetica12_Character_250,Helvetica12_Character_251,Helvetica12_Character_252,Helvetica12_Character_253,Helvetica12_Character_254,Helvetica12_Character_255,NULL};
+
+/* The font structure: */
+const SFG_Font fgFontHelvetica12 = { "-adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1", 256, 16, Helvetica12_Character_Map, 0, 4 };
+
+static const GLubyte Helvetica18_Character_000[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0, 64, 16,  0,  0, 64, 16,  0,  0, 64, 16,  0,  0, 64, 16,  0,  0, 64, 16,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_001[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_002[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_003[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_004[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_005[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_006[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_007[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_008[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_009[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_010[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_011[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_012[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_013[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_014[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_015[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_016[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_017[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_018[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_019[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_020[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_021[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_022[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_023[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_024[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_025[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_026[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_027[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_028[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_029[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_030[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_031[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_032[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_033[] = {  6,  0,  0,  0,  0,  0, 48, 48,  0,  0, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_034[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,144,144,216,216,216,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_035[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 36,  0, 36,  0, 36,  0,255,128,255,128, 18,  0, 18,  0, 18,  0,127,192,127,192,  9,  0,  9,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_036[] = { 10,  0,  0,  0,  0,  0,  0,  4,  0,  4,  0, 31,  0, 63,128,117,192,100,192,  4,192,  7,128, 31,  0, 60,  0,116,  0,100,  0,101,128, 63,128, 31,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_037[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12, 60, 12,126,  6,102,  6,102,  3,126,  3, 60,  1,128, 61,128,126,192,102,192,102, 96,126, 96, 60, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_038[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30, 56, 63,112,115,224, 97,192, 97,224, 99, 96,119, 96, 62,  0, 30,  0, 51,  0, 51,  0, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_039[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 64, 32, 32, 96, 96,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_040[] = {  6,  0,  8, 24, 48, 48, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48, 48, 24,  8,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_041[] = {  6,  0, 64, 96, 48, 48, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 48, 48, 96, 64,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_042[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 68, 56, 56,124, 16, 16,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_043[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0, 12,  0, 12,  0,127,128,127,128, 12,  0, 12,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_044[] = {  5,  0,  0, 64, 32, 32, 96, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_045[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,128,127,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_046[] = {  5,  0,  0,  0,  0,  0, 96, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_047[] = {  5,  0,  0,  0,  0,  0,192,192, 64, 64, 96, 96, 32, 32, 48, 48, 16, 16, 24, 24,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_048[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,  0, 51,  0, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 51,  0, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_049[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0, 62,  0, 62,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_050[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,128,127,128, 96,  0,112,  0, 56,  0, 28,  0, 14,  0,  7,  0,  3,128,  1,128, 97,128,127,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_051[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,  0, 99,128, 97,128,  1,128,  3,128, 15,  0, 14,  0,  3,  0, 97,128, 97,128, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_052[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,128,  1,128,  1,128,127,192,127,192, 97,128, 49,128, 25,128, 25,128, 13,128,  7,128,  3,128,  1,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_053[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,127,  0, 99,128, 97,128,  1,128,  1,128, 99,128,127,  0,126,  0, 96,  0, 96,  0,127,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_054[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,  0,113,128, 97,128, 97,128, 97,128,127,  0,110,  0, 96,  0, 96,  0, 49,128, 63,128, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_055[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48,  0, 48,  0, 24,  0, 24,  0, 24,  0, 12,  0, 12,  0,  6,  0,  6,  0,  3,  0,  1,128,127,128,127,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_056[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,  0,115,128, 97,128, 97,128, 51,  0, 63,  0, 51,  0, 97,128, 97,128,115,128, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_057[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 62,  0,127,  0, 99,  0,  1,128,  1,128, 29,128, 63,128, 97,128, 97,128, 97,128, 99,128, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_058[] = {  5,  0,  0,  0,  0,  0, 96, 96,  0,  0,  0,  0,  0,  0, 96, 96,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_059[] = {  5,  0,  0, 64, 32, 32, 96, 96,  0,  0,  0,  0,  0,  0, 96, 96,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_060[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,128,  7,128, 30,  0, 56,  0, 96,  0, 56,  0, 30,  0,  7,128,  1,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_061[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 63,128, 63,128,  0,  0,  0,  0, 63,128, 63,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_062[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96,  0,120,  0, 30,  0,  7,  0,  1,128,  7,  0, 30,  0,120,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_063[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24,  0, 24,  0,  0,  0,  0,  0, 24,  0, 24,  0, 24,  0, 28,  0, 14,  0,  7,  0, 99,  0, 99,  0,127,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_064[] = { 18,  0,  0,  0,  0,  0,  0,  3,240,  0, 15,248,  0, 28,  0,  0, 56,  0,  0, 51,184,  0,103,252,  0,102,102,  0,102, 51,  0,102, 51,  0,102, 49,128, 99, 25,128, 51,185,128, 49,217,128, 24,  3,  0, 14,  7,  0,  7,254,  0,  1,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_065[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15,  0, 15,  0,  6,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_066[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,192,127,224, 96,112, 96, 48, 96, 48, 96,112,127,224,127,192, 96,192, 96, 96, 96, 96, 96,224,127,192,127,128,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_067[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 31,240, 56, 56, 48, 24,112,  0, 96,  0, 96,  0, 96,  0, 96,  0,112,  0, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_068[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,128,127,192, 96,224, 96, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 96, 96,224,127,192,127,128,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_069[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,192,127,192, 96,  0, 96,  0, 96,  0, 96,  0,127,128,127,128, 96,  0, 96,  0, 96,  0, 96,  0,127,192,127,192,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_070[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0,127,128,127,128, 96,  0, 96,  0, 96,  0, 96,  0,127,192,127,192,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_071[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,216, 31,248, 56, 56, 48, 24,112, 24, 96,248, 96,248, 96,  0, 96,  0,112, 24, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_072[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,127,240,127,240, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_073[] = {  6,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_074[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,  0,115,128, 97,128, 97,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_075[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 56, 96,112, 96,224, 97,192, 99,128,103,  0,126,  0,124,  0,110,  0,103,  0, 99,128, 97,192, 96,224, 96,112,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_076[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,128,127,128, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_077[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 97,134, 97,134, 99,198, 98, 70,102,102,102,102,108, 54,108, 54,120, 30,120, 30,112, 14,112, 14, 96,  6, 96,  6,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_078[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 48, 96,112, 96,240, 96,240, 97,176, 99, 48, 99, 48,102, 48,102, 48,108, 48,120, 48,120, 48,112, 48, 96, 48,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_079[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_080[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0,127,128,127,192, 96,224, 96, 96, 96, 96, 96,224,127,192,127,128,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_081[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24,  7,216, 31,240, 56,120, 48,216,112,220, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_082[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96, 96, 96,192, 96,192,127,128,127,192, 96,224, 96, 96, 96, 96, 96,224,127,192,127,128,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_083[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,128, 63,224,112,112, 96, 48,  0, 48,  0,112,  1,224, 15,128, 62,  0,112,  0, 96, 48,112,112, 63,224, 15,128,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_084[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,127,224,127,224,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_085[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,128, 63,224, 48, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_086[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  7,128,  7,128, 12,192, 12,192, 12,192, 24, 96, 24, 96, 24, 96, 48, 48, 48, 48, 48, 48, 96, 24, 96, 24,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_087[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12, 12,  0, 12, 12,  0, 14, 28,  0, 26, 22,  0, 27, 54,  0, 27, 54,  0, 51, 51,  0, 51, 51,  0, 49, 35,  0, 49,227,  0, 97,225,128, 96,193,128, 96,193,128, 96,193,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_088[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 48,112,112, 48, 96, 56,224, 24,192, 13,128,  7,  0,  7,  0, 13,128, 24,192, 56,224, 48, 96,112,112, 96, 48,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_089[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  7,128, 12,192, 24, 96, 24, 96, 48, 48, 48, 48, 96, 24, 96, 24,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_090[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,224,127,224, 96,  0, 48,  0, 24,  0, 12,  0, 14,  0,  6,  0,  3,  0,  1,128,  0,192,  0, 96,127,224,127,224,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_091[] = {  5,  0,120,120, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,120,120,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_092[] = {  5,  0,  0,  0,  0,  0, 24, 24, 16, 16, 48, 48, 32, 32, 96, 96, 64, 64,192,192,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_093[] = {  5,  0,240,240, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,240,240,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_094[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 65,  0, 99,  0, 54,  0, 28,  0,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_095[] = { 10,  0,  0,255,192,255,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_096[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 96, 64, 64, 32,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_097[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,119,  0, 99,  0, 99,  0,115,  0, 63,  0,  7,  0, 99,  0,119,  0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_098[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,111,  0,127,128,113,128, 96,192, 96,192, 96,192, 96,192,113,128,127,128,111,  0, 96,  0, 96,  0, 96,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_099[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 63,128, 49,128, 96,  0, 96,  0, 96,  0, 96,  0, 49,128, 63,128, 31,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_100[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,192, 63,192, 49,192, 96,192, 96,192, 96,192, 96,192, 49,192, 63,192, 30,192,  0,192,  0,192,  0,192,  0,192,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_101[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,128,113,128, 96,  0, 96,  0,127,128, 97,128, 97,128, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_102[] = {  6,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48, 48,252,252, 48, 48, 60, 28,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_103[] = { 11,  0,  0, 14,  0, 63,128, 49,128,  0,192, 30,192, 63,192, 49,192, 96,192, 96,192, 96,192, 96,192, 48,192, 63,192, 30,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_104[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,113,128,111,128,103,  0, 96,  0, 96,  0, 96,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_105[] = {  4,  0,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0,  0, 96, 96,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_106[] = {  4,  0,192,224, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0,  0, 96, 96,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_107[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 99,128, 99,  0,103,  0,102,  0,108,  0,124,  0,120,  0,108,  0,102,  0, 99,  0, 96,  0, 96,  0, 96,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_108[] = {  4,  0,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_109[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 99, 24, 99, 24, 99, 24, 99, 24, 99, 24, 99, 24, 99, 24,115,152,111,120,102, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_110[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,113,128,111,128,103,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_111[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_112[] = { 11,  0,  0, 96,  0, 96,  0, 96,  0, 96,  0,111,  0,127,128,113,128, 96,192, 96,192, 96,192, 96,192,113,128,127,128,111,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_113[] = { 11,  0,  0,  0,192,  0,192,  0,192,  0,192, 30,192, 63,192, 49,192, 96,192, 96,192, 96,192, 96,192, 49,192, 63,192, 30,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_114[] = {  6,  0,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96,112,108,108,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_115[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 60,  0,126,  0, 99,  0,  3,  0, 31,  0,126,  0, 96,  0, 99,  0, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_116[] = {  6,  0,  0,  0,  0,  0, 24, 56, 48, 48, 48, 48, 48, 48,252,252, 48, 48, 48,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_117[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 57,128,125,128, 99,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_118[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0, 30,  0, 18,  0, 51,  0, 51,  0, 51,  0, 97,128, 97,128, 97,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_119[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,192, 12,192, 28,224, 20,160, 52,176, 51, 48, 51, 48, 99, 24, 99, 24, 99, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_120[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 97,128,115,128, 51,  0, 30,  0, 12,  0, 12,  0, 30,  0, 51,  0,115,128, 97,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_121[] = { 10,  0,  0, 56,  0, 56,  0, 12,  0, 12,  0, 12,  0, 12,  0, 30,  0, 18,  0, 51,  0, 51,  0, 51,  0, 97,128, 97,128, 97,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_122[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,127,  0, 96,  0, 48,  0, 24,  0, 12,  0,  6,  0,  3,  0,127,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_123[] = {  6,  0, 12, 24, 48, 48, 48, 48, 48, 48, 96,192, 96, 48, 48, 48, 48, 48, 24, 12,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_124[] = {  4,  0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_125[] = {  6,  0,192, 96, 48, 48, 48, 48, 48, 48, 24, 12, 24, 48, 48, 48, 48, 48, 96,192,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_126[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,102,  0, 63,  0, 25,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_127[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_128[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_129[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_130[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_131[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_132[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_133[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_134[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_135[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_136[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_137[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_138[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_139[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_140[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_141[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_142[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_143[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_144[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_145[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_146[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_147[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_148[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_149[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_150[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_151[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_152[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_153[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_154[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_155[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_156[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_157[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_158[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_159[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 64, 16,  0,  0,  0,  0, 85, 80,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_160[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_161[] = {  6,  0, 48, 48, 48, 48, 48, 48, 48, 48, 16, 16,  0,  0, 48, 48,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_162[] = { 10,  0,  0,  0,  0,  0,  0,  8,  0,  8,  0, 31,  0, 63,128, 53,128,100,  0,100,  0,100,  0,100,  0, 53,128, 63,128, 31,  0,  2,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_163[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,223,  0,255,128, 96,128, 48,  0, 24,  0, 24,  0,126,  0, 48,  0, 96,  0, 97,128, 97,128, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_164[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 97,128,127,128, 51,  0, 51,  0, 51,  0,127,128, 97,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_165[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0, 12,  0, 12,  0,127,128, 12,  0,127,128, 30,  0, 51,  0, 51,  0, 51,  0, 97,128, 97,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_166[] = {  4,  0,  0, 96, 96, 96, 96, 96, 96,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_167[] = { 10,  0,  0, 30,  0, 63,  0, 97,128, 97,128,  3,128,  7,  0, 31,  0, 57,128,113,128, 97,128, 99,128, 55,  0, 62,  0,120,  0, 97,128, 97,128, 63,  0, 30,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_168[] = {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,216,216,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_169[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 24, 48, 32,  8, 35,136, 68, 68, 72,  4, 72,  4, 72,  4, 68, 68, 35,136, 32,  8, 24, 48,  7,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_170[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,  0, 52,108, 36, 28,100, 56,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_171[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  9,  0, 27,  0, 54,  0,108,  0,108,  0, 54,  0, 27,  0,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_172[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192,  0,192,  0,192,127,192,127,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_173[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,124,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_174[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 24, 48, 32,  8, 36, 40, 68, 68, 68,132, 71,196, 68, 36, 68, 36, 39,200, 32,  8, 24, 48,  7,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_175[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,248,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_176[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,108, 68,108, 56,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_177[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,128,127,128,  0,  0, 12,  0, 12,  0, 12,  0,127,128,127,128, 12,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_178[] = {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,248,248, 96, 48, 24,152,248,112,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_179[] = {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,112,248,152, 48, 48,152,248,112,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_180[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 96, 48,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_181[] = { 10,  0,  0, 96,  0, 96,  0, 96,  0, 96,  0,109,128,127,128,115,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_182[] = { 10,  0,  0,  9,  0,  9,  0,  9,  0,  9,  0,  9,  0,  9,  0,  9,  0,  9,  0,  9,  0,  9,  0, 25,  0, 57,  0,121,  0,121,  0,121,  0,121,  0, 57,  0, 31,128,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_183[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_184[] = {  5,  0,240,216, 24,112, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_185[] = {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48,112,112, 48,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_186[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,  0, 56,108, 68, 68,108, 56,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_187[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 72,  0,108,  0, 54,  0, 27,  0, 27,  0, 54,  0,108,  0, 72,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_188[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 24, 24, 24, 12,252,  6,216,  6,120, 51, 56, 49, 24, 49,136, 48,192, 48,192,112, 96,112, 48, 48, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_189[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24,124, 24,124, 12, 48,  6, 24,  6, 12, 51, 76, 49,124, 49,184, 48,192, 48,192,112, 96,112, 48, 48, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_190[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 24, 24, 24, 12,252,  6,216,  6,120,115, 56,249, 24,153,136, 48,192, 48,192,152, 96,248, 48,112, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_191[] = { 10,  0,  0, 62,  0,127,  0, 99,  0, 99,  0,112,  0, 56,  0, 28,  0, 12,  0, 12,  0, 12,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_192[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15,  0, 15,  0,  6,  0,  6,  0,  0,  0,  6,  0, 12,  0, 24,  0};
+static const GLubyte Helvetica18_Character_193[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15,  0, 15,  0,  6,  0,  6,  0,  0,  0,  6,  0,  3,  0,  1,128};
+static const GLubyte Helvetica18_Character_194[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15,  0, 15,  0,  6,  0,  6,  0,  0,  0, 25,128, 15,  0,  6,  0};
+static const GLubyte Helvetica18_Character_195[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15,  0, 15,  0,  6,  0,  6,  0,  0,  0, 19,  0, 22,128, 12,128};
+static const GLubyte Helvetica18_Character_196[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15,  0, 15,  0,  6,  0,  6,  0,  0,  0, 25,128, 25,128,  0,  0};
+static const GLubyte Helvetica18_Character_197[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192, 48,192, 48, 96, 96, 96, 96,127,224, 63,192, 48,192, 48,192, 25,128, 25,128, 15,  0, 15,  0,  6,  0,  6,  0, 15,  0, 25,128, 25,128, 15,  0};
+static const GLubyte Helvetica18_Character_198[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96,255,128, 96,255,128, 48,192,  0, 48,192,  0, 63,192,  0, 31,192,  0, 24,255,  0, 24,255,  0, 12,192,  0, 12,192,  0,  6,192,  0,  6,192,  0,  3,255,128,  3,255,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_199[] = { 14,  0,  0, 15,  0, 13,128,  1,128,  7,  0,  7,192, 31,240, 56, 56, 48, 24,112,  0, 96,  0, 96,  0, 96,  0, 96,  0,112,  0, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_200[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,192,127,192, 96,  0, 96,  0, 96,  0, 96,  0,127,128,127,128, 96,  0, 96,  0, 96,  0, 96,  0,127,192,127,192,  0,  0,  6,  0, 12,  0, 24,  0};
+static const GLubyte Helvetica18_Character_201[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,192,127,192, 96,  0, 96,  0, 96,  0, 96,  0,127,128,127,128, 96,  0, 96,  0, 96,  0, 96,  0,127,192,127,192,  0,  0,  6,  0,  3,  0,  1,128};
+static const GLubyte Helvetica18_Character_202[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,192,127,192, 96,  0, 96,  0, 96,  0, 96,  0,127,128,127,128, 96,  0, 96,  0, 96,  0, 96,  0,127,192,127,192,  0,  0, 25,128, 15,  0,  6,  0};
+static const GLubyte Helvetica18_Character_203[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,192,127,192, 96,  0, 96,  0, 96,  0, 96,  0,127,128,127,128, 96,  0, 96,  0, 96,  0, 96,  0,127,192,127,192,  0,  0, 25,128, 25,128,  0,  0};
+static const GLubyte Helvetica18_Character_204[] = {  6,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,  0, 48, 96,192};
+static const GLubyte Helvetica18_Character_205[] = {  6,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,  0, 48, 24, 12};
+static const GLubyte Helvetica18_Character_206[] = {  6,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,  0,204,120, 48};
+static const GLubyte Helvetica18_Character_207[] = {  6,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,  0,204,204,  0};
+static const GLubyte Helvetica18_Character_208[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,128,127,192, 96,224, 96, 96, 96, 48, 96, 48,252, 48,252, 48, 96, 48, 96, 48, 96, 96, 96,224,127,192,127,128,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_209[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 48, 96,112, 96,240, 96,240, 97,176, 99, 48, 99, 48,102, 48,102, 48,108, 48,108, 48,120, 48,112, 48,112, 48,  0,  0,  9,128, 11, 64,  6, 64};
+static const GLubyte Helvetica18_Character_210[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  1,128,  3,  0,  6,  0};
+static const GLubyte Helvetica18_Character_211[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  1,128,  0,192,  0, 96};
+static const GLubyte Helvetica18_Character_212[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  6, 96,  3,192,  1,128};
+static const GLubyte Helvetica18_Character_213[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  4,192,  5,160,  3, 32};
+static const GLubyte Helvetica18_Character_214[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,192, 31,240, 56, 56, 48, 24,112, 28, 96, 12, 96, 12, 96, 12, 96, 12,112, 28, 48, 24, 56, 56, 31,240,  7,192,  0,  0,  6,192,  6,192,  0,  0};
+static const GLubyte Helvetica18_Character_215[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192,192, 97,128, 51,  0, 30,  0, 12,  0, 30,  0, 51,  0, 97,128,192,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_216[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,199,192,255,240,120, 56, 56, 24,108, 28,110, 12,103, 12, 99,140, 97,204,112,220, 48,120, 56, 56, 31,252,  7,204,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_217[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,128, 63,224, 48, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,  0,  0,  3,  0,  6,  0, 12,  0};
+static const GLubyte Helvetica18_Character_218[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,128, 63,224, 48, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,  0,  0,  6,  0,  3,  0,  1,128};
+static const GLubyte Helvetica18_Character_219[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,128, 63,224, 48, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,  0,  0, 12,192,  7,128,  3,  0};
+static const GLubyte Helvetica18_Character_220[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,128, 63,224, 48, 96, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,  0,  0, 12,192, 12,192,  0,  0};
+static const GLubyte Helvetica18_Character_221[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  7,128, 12,192, 24, 96, 24, 96, 48, 48, 48, 48, 96, 24, 96, 24,  0,  0,  3,  0,  1,128,  0,192};
+static const GLubyte Helvetica18_Character_222[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96,  0, 96,  0, 96,  0,127,128,127,192, 96,224, 96, 96, 96, 96, 96,224,127,192,127,128, 96,  0, 96,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_223[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,110,  0,111,  0, 99,  0, 99,  0, 99,  0, 99,  0,110,  0,110,  0, 99,  0, 99,  0, 99,  0, 99,  0, 62,  0, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_224[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,119,  0, 99,  0, 99,  0,115,  0, 63,  0,  7,  0, 99,  0,119,  0, 62,  0,  0,  0, 12,  0, 24,  0, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_225[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,119,  0, 99,  0, 99,  0,115,  0, 63,  0,  7,  0, 99,  0,119,  0, 62,  0,  0,  0, 24,  0, 12,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_226[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,119,  0, 99,  0, 99,  0,115,  0, 63,  0,  7,  0, 99,  0,119,  0, 62,  0,  0,  0, 51,  0, 30,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_227[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,119,  0, 99,  0, 99,  0,115,  0, 63,  0,  7,  0, 99,  0,119,  0, 62,  0,  0,  0, 38,  0, 45,  0, 25,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_228[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,119,  0, 99,  0, 99,  0,115,  0, 63,  0,  7,  0, 99,  0,119,  0, 62,  0,  0,  0, 54,  0, 54,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_229[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 59,  0,119,  0, 99,  0, 99,  0,115,  0, 63,  0,  7,  0, 99,  0,119,  0, 62,  0, 28,  0, 54,  0, 54,  0, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_230[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 58,240,119,252, 99,140, 99,  0,115,  0, 63,252,  7, 12, 99, 12,119,248, 62,240,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_231[] = { 10,  0,  0, 60,  0, 54,  0,  6,  0, 28,  0, 31,  0, 63,128, 49,128, 96,  0, 96,  0, 96,  0, 96,  0, 49,128, 63,128, 31,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_232[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,128,113,128, 96,  0, 96,  0,127,128, 97,128, 97,128, 63,  0, 30,  0,  0,  0, 12,  0, 24,  0, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_233[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,128,113,128, 96,  0, 96,  0,127,128, 97,128, 97,128, 63,  0, 30,  0,  0,  0, 12,  0,  6,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_234[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,128,113,128, 96,  0, 96,  0,127,128, 97,128, 97,128, 63,  0, 30,  0,  0,  0, 51,  0, 30,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_235[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30,  0, 63,128,113,128, 96,  0, 96,  0,127,128, 97,128, 97,128, 63,  0, 30,  0,  0,  0, 27,  0, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_236[] = {  4,  0,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0, 48, 96,192,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_237[] = {  4,  0,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0,192, 96, 48,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_238[] = {  4,  0,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0,144,240, 96,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_239[] = {  4,  0,  0,  0,  0,  0, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,  0,216,216,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_240[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31,  0, 38,  0, 28,  0, 27,  0, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_241[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,113,128,111,128,103,  0,  0,  0, 38,  0, 45,  0, 25,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_242[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31,  0,  0,  0,  6,  0, 12,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_243[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31,  0,  0,  0, 12,  0,  6,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_244[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31,  0,  0,  0, 25,128, 15,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_245[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31,  0,  0,  0, 19,  0, 22,128, 12,128,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_246[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 31,  0, 63,128, 49,128, 96,192, 96,192, 96,192, 96,192, 49,128, 63,128, 31,  0,  0,  0, 27,  0, 27,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_247[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,127,128,127,128,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_248[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,206,  0,127,128, 49,128,120,192,108,192,102,192, 99,192, 49,128, 63,192, 14, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_249[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 57,128,125,128, 99,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,  0,  0,  6,  0, 12,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_250[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 57,128,125,128, 99,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,  0,  0, 12,  0,  6,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_251[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 57,128,125,128, 99,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,  0,  0, 51,  0, 30,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_252[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 57,128,125,128, 99,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128, 97,128,  0,  0, 51,  0, 51,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_253[] = { 10,  0,  0, 56,  0, 56,  0, 12,  0, 12,  0, 12,  0, 12,  0, 30,  0, 18,  0, 51,  0, 51,  0, 51,  0, 97,128, 97,128, 97,128,  0,  0, 12,  0,  6,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_254[] = { 11,  0,  0, 96,  0, 96,  0, 96,  0, 96,  0,111,  0,127,128,113,128, 96,192, 96,192, 96,192, 96,192,113,128,127,128,111,  0, 96,  0, 96,  0, 96,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte Helvetica18_Character_255[] = { 10,  0,  0, 56,  0, 56,  0, 12,  0, 12,  0, 12,  0, 12,  0, 30,  0, 18,  0, 51,  0, 51,  0, 51,  0, 97,128, 97,128, 97,128,  0,  0, 51,  0, 51,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+
+/* The font characters mapping: */
+static const GLubyte* Helvetica18_Character_Map[] = {Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,
+                                                     Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,
+                                                     Helvetica18_Character_032,Helvetica18_Character_033,Helvetica18_Character_034,Helvetica18_Character_035,Helvetica18_Character_036,Helvetica18_Character_037,Helvetica18_Character_038,Helvetica18_Character_039,Helvetica18_Character_040,Helvetica18_Character_041,Helvetica18_Character_042,Helvetica18_Character_043,Helvetica18_Character_044,Helvetica18_Character_045,Helvetica18_Character_046,Helvetica18_Character_047,
+                                                     Helvetica18_Character_048,Helvetica18_Character_049,Helvetica18_Character_050,Helvetica18_Character_051,Helvetica18_Character_052,Helvetica18_Character_053,Helvetica18_Character_054,Helvetica18_Character_055,Helvetica18_Character_056,Helvetica18_Character_057,Helvetica18_Character_058,Helvetica18_Character_059,Helvetica18_Character_060,Helvetica18_Character_061,Helvetica18_Character_062,Helvetica18_Character_063,
+                                                     Helvetica18_Character_064,Helvetica18_Character_065,Helvetica18_Character_066,Helvetica18_Character_067,Helvetica18_Character_068,Helvetica18_Character_069,Helvetica18_Character_070,Helvetica18_Character_071,Helvetica18_Character_072,Helvetica18_Character_073,Helvetica18_Character_074,Helvetica18_Character_075,Helvetica18_Character_076,Helvetica18_Character_077,Helvetica18_Character_078,Helvetica18_Character_079,
+                                                     Helvetica18_Character_080,Helvetica18_Character_081,Helvetica18_Character_082,Helvetica18_Character_083,Helvetica18_Character_084,Helvetica18_Character_085,Helvetica18_Character_086,Helvetica18_Character_087,Helvetica18_Character_088,Helvetica18_Character_089,Helvetica18_Character_090,Helvetica18_Character_091,Helvetica18_Character_092,Helvetica18_Character_093,Helvetica18_Character_094,Helvetica18_Character_095,
+                                                     Helvetica18_Character_096,Helvetica18_Character_097,Helvetica18_Character_098,Helvetica18_Character_099,Helvetica18_Character_100,Helvetica18_Character_101,Helvetica18_Character_102,Helvetica18_Character_103,Helvetica18_Character_104,Helvetica18_Character_105,Helvetica18_Character_106,Helvetica18_Character_107,Helvetica18_Character_108,Helvetica18_Character_109,Helvetica18_Character_110,Helvetica18_Character_111,
+                                                     Helvetica18_Character_112,Helvetica18_Character_113,Helvetica18_Character_114,Helvetica18_Character_115,Helvetica18_Character_116,Helvetica18_Character_117,Helvetica18_Character_118,Helvetica18_Character_119,Helvetica18_Character_120,Helvetica18_Character_121,Helvetica18_Character_122,Helvetica18_Character_123,Helvetica18_Character_124,Helvetica18_Character_125,Helvetica18_Character_126,Helvetica18_Character_032,
+                                                     Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,
+                                                     Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,Helvetica18_Character_032,
+                                                     Helvetica18_Character_160,Helvetica18_Character_161,Helvetica18_Character_162,Helvetica18_Character_163,Helvetica18_Character_164,Helvetica18_Character_165,Helvetica18_Character_166,Helvetica18_Character_167,Helvetica18_Character_168,Helvetica18_Character_169,Helvetica18_Character_170,Helvetica18_Character_171,Helvetica18_Character_172,Helvetica18_Character_173,Helvetica18_Character_174,Helvetica18_Character_175,
+                                                     Helvetica18_Character_176,Helvetica18_Character_177,Helvetica18_Character_178,Helvetica18_Character_179,Helvetica18_Character_180,Helvetica18_Character_181,Helvetica18_Character_182,Helvetica18_Character_183,Helvetica18_Character_184,Helvetica18_Character_185,Helvetica18_Character_186,Helvetica18_Character_187,Helvetica18_Character_188,Helvetica18_Character_189,Helvetica18_Character_190,Helvetica18_Character_191,
+                                                     Helvetica18_Character_192,Helvetica18_Character_193,Helvetica18_Character_194,Helvetica18_Character_195,Helvetica18_Character_196,Helvetica18_Character_197,Helvetica18_Character_198,Helvetica18_Character_199,Helvetica18_Character_200,Helvetica18_Character_201,Helvetica18_Character_202,Helvetica18_Character_203,Helvetica18_Character_204,Helvetica18_Character_205,Helvetica18_Character_206,Helvetica18_Character_207,
+                                                     Helvetica18_Character_208,Helvetica18_Character_209,Helvetica18_Character_210,Helvetica18_Character_211,Helvetica18_Character_212,Helvetica18_Character_213,Helvetica18_Character_214,Helvetica18_Character_215,Helvetica18_Character_216,Helvetica18_Character_217,Helvetica18_Character_218,Helvetica18_Character_219,Helvetica18_Character_220,Helvetica18_Character_221,Helvetica18_Character_222,Helvetica18_Character_223,
+                                                     Helvetica18_Character_224,Helvetica18_Character_225,Helvetica18_Character_226,Helvetica18_Character_227,Helvetica18_Character_228,Helvetica18_Character_229,Helvetica18_Character_230,Helvetica18_Character_231,Helvetica18_Character_232,Helvetica18_Character_233,Helvetica18_Character_234,Helvetica18_Character_235,Helvetica18_Character_236,Helvetica18_Character_237,Helvetica18_Character_238,Helvetica18_Character_239,
+                                                     Helvetica18_Character_240,Helvetica18_Character_241,Helvetica18_Character_242,Helvetica18_Character_243,Helvetica18_Character_244,Helvetica18_Character_245,Helvetica18_Character_246,Helvetica18_Character_247,Helvetica18_Character_248,Helvetica18_Character_249,Helvetica18_Character_250,Helvetica18_Character_251,Helvetica18_Character_252,Helvetica18_Character_253,Helvetica18_Character_254,Helvetica18_Character_255,NULL};
+
+/* The font structure: */
+const SFG_Font fgFontHelvetica18 = { "-adobe-helvetica-medium-r-normal--18-180-75-75-p-98-iso8859-1", 256, 23, Helvetica18_Character_Map, 0, 5 };
+
+static const GLubyte TimesRoman10_Character_000[] = {  8,  0,  0,  0,  0,170,  0,130,  0,130,  0,170,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_001[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_002[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_003[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_004[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_005[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_006[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_007[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_008[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_009[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_010[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_011[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_012[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_013[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_014[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_015[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_016[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_017[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_018[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_019[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_020[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_021[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_022[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_023[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_024[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_025[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_026[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_027[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_028[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_029[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_030[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_031[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_032[] = {  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_033[] = {  3,  0,  0,  0,  0, 64,  0, 64, 64, 64, 64, 64,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_034[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,160,160,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_035[] = {  5,  0,  0,  0,  0, 80, 80,248, 80,248, 80, 80,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_036[] = {  5,  0,  0,  0, 32,224,144, 16, 96,128,144,112, 32,  0,  0};
+static const GLubyte TimesRoman10_Character_037[] = {  8,  0,  0,  0,  0, 68, 42, 42, 86,168,164,126,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_038[] = {  8,  0,  0,  0,  0,118,141,152,116,110, 80, 48,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_039[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0, 64,192,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_040[] = {  4,  0,  0, 32, 64, 64,128,128,128, 64, 64, 32,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_041[] = {  4,  0,  0,128, 64, 64, 32, 32, 32, 64, 64,128,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_042[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,160, 64,160,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_043[] = {  6,  0,  0,  0,  0, 32, 32,248, 32, 32,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_044[] = {  3,  0,  0, 64, 64, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_045[] = {  7,  0,  0,  0,  0,  0,  0,120,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_046[] = {  3,  0,  0,  0,  0, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_047[] = {  3,  0,  0,  0,  0,128,128, 64, 64, 64, 32, 32,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_048[] = {  5,  0,  0,  0,  0, 96,144,144,144,144,144, 96,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_049[] = {  5,  0,  0,  0,  0,112, 32, 32, 32, 32, 96, 32,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_050[] = {  5,  0,  0,  0,  0,240, 64, 32, 32, 16,144, 96,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_051[] = {  5,  0,  0,  0,  0,224, 16, 16, 96, 16,144, 96,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_052[] = {  5,  0,  0,  0,  0, 16, 16,248,144, 80, 48, 16,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_053[] = {  5,  0,  0,  0,  0,224,144, 16, 16,224, 64,112,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_054[] = {  5,  0,  0,  0,  0, 96,144,144,144,224, 64, 48,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_055[] = {  5,  0,  0,  0,  0, 64, 64, 64, 32, 32,144,240,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_056[] = {  5,  0,  0,  0,  0, 96,144,144, 96,144,144, 96,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_057[] = {  5,  0,  0,  0,  0,192, 32,112,144,144,144, 96,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_058[] = {  3,  0,  0,  0,  0, 64,  0,  0,  0, 64,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_059[] = {  3,  0,  0, 64, 64, 64,  0,  0,  0, 64,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_060[] = {  5,  0,  0,  0,  0, 16, 32, 64, 32, 16,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_061[] = {  6,  0,  0,  0,  0,  0,248,  0,248,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_062[] = {  5,  0,  0,  0,  0,128, 64, 32, 64,128,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_063[] = {  4,  0,  0,  0,  0, 64,  0, 64, 64, 32,160,224,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_064[] = {  9,  0,  0,  0,  0, 62,  0, 64,  0,146,  0,173,  0,165,  0,165,  0,157,  0, 66,  0, 60,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_065[] = {  8,  0,  0,  0,  0,238, 68,124, 40, 40, 56, 16,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_066[] = {  6,  0,  0,  0,  0,240, 72, 72,112, 72, 72,240,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_067[] = {  7,  0,  0,  0,  0,120,196,128,128,128,196,124,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_068[] = {  7,  0,  0,  0,  0,248, 76, 68, 68, 68, 76,248,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_069[] = {  6,  0,  0,  0,  0,248, 72, 64,112, 64, 72,248,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_070[] = {  6,  0,  0,  0,  0,224, 64, 64,112, 64, 72,248,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_071[] = {  7,  0,  0,  0,  0,120,196,132,156,128,196,124,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_072[] = {  8,  0,  0,  0,  0,238, 68, 68,124, 68, 68,238,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_073[] = {  4,  0,  0,  0,  0,224, 64, 64, 64, 64, 64,224,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_074[] = {  4,  0,  0,  0,  0,192,160, 32, 32, 32, 32,112,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_075[] = {  7,  0,  0,  0,  0,236, 72, 80, 96, 80, 72,236,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_076[] = {  6,  0,  0,  0,  0,248, 72, 64, 64, 64, 64,224,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_077[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,235,128, 73,  0, 85,  0, 85,  0, 99,  0, 99,  0,227,128,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_078[] = {  8,  0,  0,  0,  0,228, 76, 76, 84, 84,100,238,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_079[] = {  7,  0,  0,  0,  0,120,204,132,132,132,204,120,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_080[] = {  6,  0,  0,  0,  0,224, 64, 64,112, 72, 72,240,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_081[] = {  7,  0,  0, 12, 24,112,204,132,132,132,204,120,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_082[] = {  7,  0,  0,  0,  0,236, 72, 80,112, 72, 72,240,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_083[] = {  5,  0,  0,  0,  0,224,144, 16, 96,192,144,112,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_084[] = {  6,  0,  0,  0,  0,112, 32, 32, 32, 32,168,248,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_085[] = {  8,  0,  0,  0,  0, 56,108, 68, 68, 68, 68,238,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_086[] = {  8,  0,  0,  0,  0, 16, 16, 40, 40,108, 68,238,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_087[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0, 34,  0, 85,  0, 85,  0,201,128,136,128,221,192,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_088[] = {  8,  0,  0,  0,  0,238, 68, 40, 16, 40, 68,238,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_089[] = {  8,  0,  0,  0,  0, 56, 16, 16, 40, 40, 68,238,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_090[] = {  6,  0,  0,  0,  0,248,136, 64, 32, 16,136,248,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_091[] = {  3,  0,  0,192,128,128,128,128,128,128,128,192,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_092[] = {  3,  0,  0,  0,  0, 32, 32, 64, 64, 64,128,128,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_093[] = {  3,  0,  0,192, 64, 64, 64, 64, 64, 64, 64,192,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_094[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0, 80, 80, 32,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_095[] = {  5,  0,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_096[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192,128,  0,  0};
+static const GLubyte TimesRoman10_Character_097[] = {  4,  0,  0,  0,  0,224,160, 96, 32,192,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_098[] = {  5,  0,  0,  0,  0,224,144,144,144,224,128,128,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_099[] = {  4,  0,  0,  0,  0, 96,128,128,128, 96,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_100[] = {  5,  0,  0,  0,  0,104,144,144,144,112, 16, 48,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_101[] = {  4,  0,  0,  0,  0, 96,128,192,160, 96,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_102[] = {  4,  0,  0,  0,  0,224, 64, 64, 64,224, 64, 48,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_103[] = {  5,  0,  0,224,144, 96, 64,160,160,112,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_104[] = {  5,  0,  0,  0,  0,216,144,144,144,224,128,128,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_105[] = {  3,  0,  0,  0,  0, 64, 64, 64, 64,192,  0, 64,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_106[] = {  3,  0,  0,128, 64, 64, 64, 64, 64,192,  0, 64,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_107[] = {  5,  0,  0,  0,  0,152,144,224,160,144,128,128,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_108[] = {  4,  0,  0,  0,  0,224, 64, 64, 64, 64, 64,192,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_109[] = {  8,  0,  0,  0,  0,219,146,146,146,236,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_110[] = {  5,  0,  0,  0,  0,216,144,144,144,224,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_111[] = {  5,  0,  0,  0,  0, 96,144,144,144, 96,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_112[] = {  5,  0,  0,192,128,224,144,144,144,224,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_113[] = {  5,  0,  0, 56, 16,112,144,144,144,112,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_114[] = {  4,  0,  0,  0,  0,224, 64, 64, 96,160,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_115[] = {  4,  0,  0,  0,  0,224, 32, 96,128,224,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_116[] = {  4,  0,  0,  0,  0, 48, 64, 64, 64,224, 64,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_117[] = {  5,  0,  0,  0,  0,104,144,144,144,144,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_118[] = {  5,  0,  0,  0,  0, 32, 96, 80,144,216,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_119[] = {  8,  0,  0,  0,  0, 40,108, 84,146,219,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_120[] = {  6,  0,  0,  0,  0,216, 80, 32, 80,216,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_121[] = {  5,  0,  0,128,128, 64, 96,160,144,184,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_122[] = {  5,  0,  0,  0,  0,240,144, 64, 32,240,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_123[] = {  4,  0,  0, 32, 64, 64, 64,128, 64, 64, 64, 32,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_124[] = {  2,  0,  0,128,128,128,128,128,128,128,128,128,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_125[] = {  4,  0,  0,128, 64, 64, 64, 32, 64, 64, 64,128,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_126[] = {  7,  0,  0,  0,  0,  0,  0,152,100,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_127[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_128[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_129[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_130[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_131[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_132[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_133[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_134[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_135[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_136[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_137[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_138[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_139[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_140[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_141[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_142[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_143[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_144[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_145[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_146[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_147[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_148[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_149[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_150[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_151[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_152[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_153[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_154[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_155[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_156[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_157[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_158[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_159[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,170,  0,  0,  0,130,  0,  0,  0,130,  0,  0,  0,170,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_160[] = {  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_161[] = {  3,  0,  0, 64, 64, 64, 64, 64,  0, 64,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_162[] = {  5,  0,  0,  0,128,224,144,128,144,112, 16,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_163[] = {  5,  0,  0,  0,  0,240,200, 64,224, 64, 80, 48,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_164[] = {  5,  0,  0,  0,  0,  0,136,112, 80, 80,112,136,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_165[] = {  5,  0,  0,  0,  0,112, 32,248, 32,216, 80,136,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_166[] = {  2,  0,  0,  0,  0,128,128,128,  0,128,128,128,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_167[] = {  5,  0,  0,  0,224,144, 32, 80,144,160, 64,144,112,  0,  0};
+static const GLubyte TimesRoman10_Character_168[] = {  5,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 80,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_169[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 28,  0, 34,  0, 77,  0, 81,  0, 77,  0, 34,  0, 28,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_170[] = {  4,  0,  0,  0,  0,  0,  0,224,  0,160, 32,192,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_171[] = {  5,  0,  0,  0,  0,  0, 80,160,160, 80,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_172[] = {  7,  0,  0,  0,  0,  0,  4,  4,124,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_173[] = {  4,  0,  0,  0,  0,  0,  0,224,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_174[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0, 28,  0, 34,  0, 85,  0, 89,  0, 93,  0, 34,  0, 28,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_175[] = {  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,224,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_176[] = {  4,  0,  0,  0,  0,  0,  0,  0, 96,144,144, 96,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_177[] = {  6,  0,  0,  0,  0,248,  0, 32, 32,248, 32, 32,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_178[] = {  3,  0,  0,  0,  0,  0,  0,  0,224, 64,160, 96,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_179[] = {  3,  0,  0,  0,  0,  0,  0,  0,192, 32, 64,224,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_180[] = {  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,128, 64,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_181[] = {  5,  0,  0,128,128,232,144,144,144,144,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_182[] = {  6,  0,  0, 40, 40, 40, 40,104,232,232,232,124,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_183[] = {  2,  0,  0,  0,  0,  0,  0,128,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_184[] = {  4,  0,192, 32, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_185[] = {  3,  0,  0,  0,  0,  0,  0,  0,224, 64,192, 64,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_186[] = {  4,  0,  0,  0,  0,  0,  0,224,  0, 64,160, 64,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_187[] = {  5,  0,  0,  0,  0,  0,160, 80, 80,160,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_188[] = {  8,  0,  0,  0,  0, 68, 62, 44,244, 72,200, 68,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_189[] = {  8,  0,  0,  0,  0, 78, 36, 42,246, 72,200, 68,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_190[] = {  8,  0,  0,  0,  0, 68, 62, 44,212, 40, 72,228,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_191[] = {  4,  0,  0,224,160,128, 64, 64,  0, 64,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_192[] = {  8,  0,  0,  0,  0,238, 68,124, 40, 40, 56, 16,  0, 16, 32};
+static const GLubyte TimesRoman10_Character_193[] = {  8,  0,  0,  0,  0,238, 68,124, 40, 40, 56, 16,  0, 16,  8};
+static const GLubyte TimesRoman10_Character_194[] = {  8,  0,  0,  0,  0,238, 68,124, 40, 40, 56, 16,  0, 40, 16};
+static const GLubyte TimesRoman10_Character_195[] = {  8,  0,  0,  0,  0,238, 68,124, 40, 40, 56, 16,  0, 40, 20};
+static const GLubyte TimesRoman10_Character_196[] = {  8,  0,  0,  0,  0,238, 68,124, 40, 40, 56, 16,  0, 40,  0};
+static const GLubyte TimesRoman10_Character_197[] = {  8,  0,  0,  0,  0,238, 68,124, 40, 40, 56, 16, 16, 40, 16};
+static const GLubyte TimesRoman10_Character_198[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,239,  0, 73,  0,120,  0, 46,  0, 40,  0, 57,  0, 31,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_199[] = {  7,  0, 96, 16, 32,120,196,128,128,128,196,124,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_200[] = {  6,  0,  0,  0,  0,248, 72, 64,112, 64, 72,248,  0, 32, 64};
+static const GLubyte TimesRoman10_Character_201[] = {  6,  0,  0,  0,  0,248, 72, 64,112, 64, 72,248,  0, 32, 16};
+static const GLubyte TimesRoman10_Character_202[] = {  6,  0,  0,  0,  0,248, 72, 64,112, 64, 72,248,  0, 80, 32};
+static const GLubyte TimesRoman10_Character_203[] = {  6,  0,  0,  0,  0,248, 72, 64,112, 64, 72,248,  0, 80,  0};
+static const GLubyte TimesRoman10_Character_204[] = {  4,  0,  0,  0,  0,224, 64, 64, 64, 64, 64,224,  0, 64,128};
+static const GLubyte TimesRoman10_Character_205[] = {  4,  0,  0,  0,  0,224, 64, 64, 64, 64, 64,224,  0, 64, 32};
+static const GLubyte TimesRoman10_Character_206[] = {  4,  0,  0,  0,  0,224, 64, 64, 64, 64, 64,224,  0,160, 64};
+static const GLubyte TimesRoman10_Character_207[] = {  4,  0,  0,  0,  0,224, 64, 64, 64, 64, 64,224,  0,160,  0};
+static const GLubyte TimesRoman10_Character_208[] = {  7,  0,  0,  0,  0,248, 76, 68,228, 68, 76,248,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_209[] = {  8,  0,  0,  0,  0,228, 76, 76, 84, 84,100,238,  0, 80, 40};
+static const GLubyte TimesRoman10_Character_210[] = {  7,  0,  0,  0,  0,120,204,132,132,132,204,120,  0, 32, 64};
+static const GLubyte TimesRoman10_Character_211[] = {  7,  0,  0,  0,  0,120,204,132,132,132,204,120,  0, 16,  8};
+static const GLubyte TimesRoman10_Character_212[] = {  7,  0,  0,  0,  0,120,204,132,132,132,204,120,  0, 80, 32};
+static const GLubyte TimesRoman10_Character_213[] = {  7,  0,  0,  0,  0,120,204,132,132,132,204,120,  0, 80, 40};
+static const GLubyte TimesRoman10_Character_214[] = {  7,  0,  0,  0,  0,120,204,132,132,132,204,120,  0, 80,  0};
+static const GLubyte TimesRoman10_Character_215[] = {  6,  0,  0,  0,  0,136, 80, 32, 80,136,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_216[] = {  8,  0,  0,  0,128,124,102, 82, 82, 74,102, 62,  1,  0,  0};
+static const GLubyte TimesRoman10_Character_217[] = {  8,  0,  0,  0,  0, 56,108, 68, 68, 68, 68,238,  0, 16, 32};
+static const GLubyte TimesRoman10_Character_218[] = {  8,  0,  0,  0,  0, 56,108, 68, 68, 68, 68,238,  0, 16,  8};
+static const GLubyte TimesRoman10_Character_219[] = {  8,  0,  0,  0,  0, 56,108, 68, 68, 68, 68,238,  0, 40, 16};
+static const GLubyte TimesRoman10_Character_220[] = {  8,  0,  0,  0,  0, 56,108, 68, 68, 68, 68,238,  0, 40,  0};
+static const GLubyte TimesRoman10_Character_221[] = {  8,  0,  0,  0,  0, 56, 16, 16, 40, 40, 68,238,  0, 16,  8};
+static const GLubyte TimesRoman10_Character_222[] = {  6,  0,  0,  0,  0,224, 64,112, 72,112, 64,224,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_223[] = {  5,  0,  0,  0,  0,224, 80, 80, 96, 80, 80, 32,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_224[] = {  4,  0,  0,  0,  0,224,160, 96, 32,192,  0, 64,128,  0,  0};
+static const GLubyte TimesRoman10_Character_225[] = {  4,  0,  0,  0,  0,224,160, 96, 32,192,  0, 64, 32,  0,  0};
+static const GLubyte TimesRoman10_Character_226[] = {  4,  0,  0,  0,  0,224,160, 96, 32,192,  0,160, 64,  0,  0};
+static const GLubyte TimesRoman10_Character_227[] = {  4,  0,  0,  0,  0,224,160, 96, 32,192,  0,160, 80,  0,  0};
+static const GLubyte TimesRoman10_Character_228[] = {  4,  0,  0,  0,  0,224,160, 96, 32,192,  0,160,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_229[] = {  4,  0,  0,  0,  0,224,160, 96, 32,192, 64,160, 64,  0,  0};
+static const GLubyte TimesRoman10_Character_230[] = {  6,  0,  0,  0,  0,216,160,112, 40,216,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_231[] = {  4,  0,192, 32, 64, 96,128,128,128, 96,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_232[] = {  4,  0,  0,  0,  0, 96,128,192,160, 96,  0, 64,128,  0,  0};
+static const GLubyte TimesRoman10_Character_233[] = {  4,  0,  0,  0,  0, 96,128,192,160, 96,  0, 64, 32,  0,  0};
+static const GLubyte TimesRoman10_Character_234[] = {  4,  0,  0,  0,  0, 96,128,192,160, 96,  0,160, 64,  0,  0};
+static const GLubyte TimesRoman10_Character_235[] = {  4,  0,  0,  0,  0, 96,128,192,160, 96,  0,160,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_236[] = {  4,  0,  0,  0,  0,224, 64, 64, 64,192,  0, 64,128,  0,  0};
+static const GLubyte TimesRoman10_Character_237[] = {  4,  0,  0,  0,  0,224, 64, 64, 64,192,  0, 64, 32,  0,  0};
+static const GLubyte TimesRoman10_Character_238[] = {  4,  0,  0,  0,  0,224, 64, 64, 64,192,  0,160, 64,  0,  0};
+static const GLubyte TimesRoman10_Character_239[] = {  4,  0,  0,  0,  0,224, 64, 64, 64,192,  0,160,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_240[] = {  5,  0,  0,  0,  0, 96,144,144,144,112,160,112, 64,  0,  0};
+static const GLubyte TimesRoman10_Character_241[] = {  5,  0,  0,  0,  0,216,144,144,144,224,  0,160, 80,  0,  0};
+static const GLubyte TimesRoman10_Character_242[] = {  5,  0,  0,  0,  0, 96,144,144,144, 96,  0, 32, 64,  0,  0};
+static const GLubyte TimesRoman10_Character_243[] = {  5,  0,  0,  0,  0, 96,144,144,144, 96,  0, 64, 32,  0,  0};
+static const GLubyte TimesRoman10_Character_244[] = {  5,  0,  0,  0,  0, 96,144,144,144, 96,  0,160, 64,  0,  0};
+static const GLubyte TimesRoman10_Character_245[] = {  5,  0,  0,  0,  0, 96,144,144,144, 96,  0,160, 80,  0,  0};
+static const GLubyte TimesRoman10_Character_246[] = {  5,  0,  0,  0,  0, 96,144,144,144, 96,  0,160,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_247[] = {  6,  0,  0,  0,  0, 32,  0,248,  0, 32,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_248[] = {  5,  0,  0,  0,  0,224,144,144,144,112,  8,  0,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_249[] = {  5,  0,  0,  0,  0,104,144,144,144,144,  0, 32, 64,  0,  0};
+static const GLubyte TimesRoman10_Character_250[] = {  5,  0,  0,  0,  0,104,144,144,144,144,  0, 64, 32,  0,  0};
+static const GLubyte TimesRoman10_Character_251[] = {  5,  0,  0,  0,  0,104,144,144,144,144,  0, 80, 32,  0,  0};
+static const GLubyte TimesRoman10_Character_252[] = {  5,  0,  0,  0,  0,104,144,144,144,144,  0, 80,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_253[] = {  5,  0,  0,128,192, 64, 96,160,144,184,  0, 32, 16,  0,  0};
+static const GLubyte TimesRoman10_Character_254[] = {  5,  0,  0,192,128,224,144,144,144,224,128,128,  0,  0,  0};
+static const GLubyte TimesRoman10_Character_255[] = {  5,  0,  0,128,192, 64, 96,160,144,184,  0,160,  0,  0,  0};
+
+/* The font characters mapping: */
+static const GLubyte* TimesRoman10_Character_Map[] = {TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,
+                                                      TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,
+                                                      TimesRoman10_Character_032,TimesRoman10_Character_033,TimesRoman10_Character_034,TimesRoman10_Character_035,TimesRoman10_Character_036,TimesRoman10_Character_037,TimesRoman10_Character_038,TimesRoman10_Character_039,TimesRoman10_Character_040,TimesRoman10_Character_041,TimesRoman10_Character_042,TimesRoman10_Character_043,TimesRoman10_Character_044,TimesRoman10_Character_045,TimesRoman10_Character_046,TimesRoman10_Character_047,
+                                                      TimesRoman10_Character_048,TimesRoman10_Character_049,TimesRoman10_Character_050,TimesRoman10_Character_051,TimesRoman10_Character_052,TimesRoman10_Character_053,TimesRoman10_Character_054,TimesRoman10_Character_055,TimesRoman10_Character_056,TimesRoman10_Character_057,TimesRoman10_Character_058,TimesRoman10_Character_059,TimesRoman10_Character_060,TimesRoman10_Character_061,TimesRoman10_Character_062,TimesRoman10_Character_063,
+                                                      TimesRoman10_Character_064,TimesRoman10_Character_065,TimesRoman10_Character_066,TimesRoman10_Character_067,TimesRoman10_Character_068,TimesRoman10_Character_069,TimesRoman10_Character_070,TimesRoman10_Character_071,TimesRoman10_Character_072,TimesRoman10_Character_073,TimesRoman10_Character_074,TimesRoman10_Character_075,TimesRoman10_Character_076,TimesRoman10_Character_077,TimesRoman10_Character_078,TimesRoman10_Character_079,
+                                                      TimesRoman10_Character_080,TimesRoman10_Character_081,TimesRoman10_Character_082,TimesRoman10_Character_083,TimesRoman10_Character_084,TimesRoman10_Character_085,TimesRoman10_Character_086,TimesRoman10_Character_087,TimesRoman10_Character_088,TimesRoman10_Character_089,TimesRoman10_Character_090,TimesRoman10_Character_091,TimesRoman10_Character_092,TimesRoman10_Character_093,TimesRoman10_Character_094,TimesRoman10_Character_095,
+                                                      TimesRoman10_Character_096,TimesRoman10_Character_097,TimesRoman10_Character_098,TimesRoman10_Character_099,TimesRoman10_Character_100,TimesRoman10_Character_101,TimesRoman10_Character_102,TimesRoman10_Character_103,TimesRoman10_Character_104,TimesRoman10_Character_105,TimesRoman10_Character_106,TimesRoman10_Character_107,TimesRoman10_Character_108,TimesRoman10_Character_109,TimesRoman10_Character_110,TimesRoman10_Character_111,
+                                                      TimesRoman10_Character_112,TimesRoman10_Character_113,TimesRoman10_Character_114,TimesRoman10_Character_115,TimesRoman10_Character_116,TimesRoman10_Character_117,TimesRoman10_Character_118,TimesRoman10_Character_119,TimesRoman10_Character_120,TimesRoman10_Character_121,TimesRoman10_Character_122,TimesRoman10_Character_123,TimesRoman10_Character_124,TimesRoman10_Character_125,TimesRoman10_Character_126,TimesRoman10_Character_032,
+                                                      TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,
+                                                      TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,TimesRoman10_Character_032,
+                                                      TimesRoman10_Character_160,TimesRoman10_Character_161,TimesRoman10_Character_162,TimesRoman10_Character_163,TimesRoman10_Character_164,TimesRoman10_Character_165,TimesRoman10_Character_166,TimesRoman10_Character_167,TimesRoman10_Character_168,TimesRoman10_Character_169,TimesRoman10_Character_170,TimesRoman10_Character_171,TimesRoman10_Character_172,TimesRoman10_Character_173,TimesRoman10_Character_174,TimesRoman10_Character_175,
+                                                      TimesRoman10_Character_176,TimesRoman10_Character_177,TimesRoman10_Character_178,TimesRoman10_Character_179,TimesRoman10_Character_180,TimesRoman10_Character_181,TimesRoman10_Character_182,TimesRoman10_Character_183,TimesRoman10_Character_184,TimesRoman10_Character_185,TimesRoman10_Character_186,TimesRoman10_Character_187,TimesRoman10_Character_188,TimesRoman10_Character_189,TimesRoman10_Character_190,TimesRoman10_Character_191,
+                                                      TimesRoman10_Character_192,TimesRoman10_Character_193,TimesRoman10_Character_194,TimesRoman10_Character_195,TimesRoman10_Character_196,TimesRoman10_Character_197,TimesRoman10_Character_198,TimesRoman10_Character_199,TimesRoman10_Character_200,TimesRoman10_Character_201,TimesRoman10_Character_202,TimesRoman10_Character_203,TimesRoman10_Character_204,TimesRoman10_Character_205,TimesRoman10_Character_206,TimesRoman10_Character_207,
+                                                      TimesRoman10_Character_208,TimesRoman10_Character_209,TimesRoman10_Character_210,TimesRoman10_Character_211,TimesRoman10_Character_212,TimesRoman10_Character_213,TimesRoman10_Character_214,TimesRoman10_Character_215,TimesRoman10_Character_216,TimesRoman10_Character_217,TimesRoman10_Character_218,TimesRoman10_Character_219,TimesRoman10_Character_220,TimesRoman10_Character_221,TimesRoman10_Character_222,TimesRoman10_Character_223,
+                                                      TimesRoman10_Character_224,TimesRoman10_Character_225,TimesRoman10_Character_226,TimesRoman10_Character_227,TimesRoman10_Character_228,TimesRoman10_Character_229,TimesRoman10_Character_230,TimesRoman10_Character_231,TimesRoman10_Character_232,TimesRoman10_Character_233,TimesRoman10_Character_234,TimesRoman10_Character_235,TimesRoman10_Character_236,TimesRoman10_Character_237,TimesRoman10_Character_238,TimesRoman10_Character_239,
+                                                      TimesRoman10_Character_240,TimesRoman10_Character_241,TimesRoman10_Character_242,TimesRoman10_Character_243,TimesRoman10_Character_244,TimesRoman10_Character_245,TimesRoman10_Character_246,TimesRoman10_Character_247,TimesRoman10_Character_248,TimesRoman10_Character_249,TimesRoman10_Character_250,TimesRoman10_Character_251,TimesRoman10_Character_252,TimesRoman10_Character_253,TimesRoman10_Character_254,TimesRoman10_Character_255,NULL};
+
+/* The font structure: */
+const SFG_Font fgFontTimesRoman10 = { "-adobe-times-medium-r-normal--10-100-75-75-p-54-iso8859-1", 256, 14, TimesRoman10_Character_Map, 0, 4 };
+
+static const GLubyte TimesRoman24_Character_000[] = { 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0, 64,  0, 64,  0,  0,  0, 64,  0, 64,  0,  0,  0, 64,  0, 64,  0,  0,  0, 64,  0, 64,  0,  0,  0, 64,  0, 64,  0,  0,  0, 64,  0, 64,  0,  0,  0, 64,  0, 64,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_001[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_002[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_003[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_004[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_005[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_006[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_007[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_008[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_009[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_010[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_011[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_012[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_013[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_014[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_015[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_016[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_017[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_018[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_019[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_020[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_021[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_022[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_023[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_024[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_025[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_026[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_027[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_028[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_029[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_030[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_031[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_032[] = {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_033[] = {  8,  0,  0,  0,  0,  0,  0,  0, 24, 24,  0,  0,  0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_034[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 68,  0,102,  0,102,  0,102,  0,102,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_035[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 17,  0, 17,  0, 17,  0, 17,  0, 17,  0,127,224,127,224,  8,128,  8,128,  8,128, 63,240, 63,240,  4, 64,  4, 64,  4, 64,  4, 64,  4, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_036[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0,  4,  0, 63,  0,229,192,196,192,132, 96,132, 96,  4, 96,  4,224,  7,192,  7,128, 30,  0, 60,  0,116,  0,100,  0,100, 32,100, 96, 52,224, 31,128,  4,  0,  4,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_037[] = { 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 30,  0, 12, 57,  0,  6, 48,128,  2, 48, 64,  3, 48, 64,  1,152, 64,  0,140,192,  0,199,128, 60, 96,  0,114, 32,  0, 97, 48,  0, 96,152,  0, 96,136,  0, 48,140,  0, 25,254,  0, 15,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_038[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 30, 30,  0, 63,191,  0,112,240,128, 96, 96,  0, 96,224,  0, 96,208,  0, 49,144,  0, 27,136,  0, 15, 12,  0,  7, 31,  0,  7,128,  0, 14,192,  0, 12, 96,  0, 12, 32,  0, 12, 32,  0,  6, 96,  0,  3,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_039[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 12,  4, 28, 24,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_040[] = {  8,  0,  0,  2,  4,  8, 24, 16, 48, 48, 96, 96, 96, 96, 96, 96, 96, 96, 48, 48, 16, 24,  8,  4,  2,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_041[] = {  8,  0,  0, 64, 32, 16, 24,  8, 12, 12,  6,  6,  6,  6,  6,  6,  6,  6, 12, 12,  8, 24, 16, 32, 64,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_042[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0,  7,  0, 50, 96, 58,224,  7,  0, 58,224, 50, 96,  7,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_043[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,127,248,127,248,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_044[] = {  7,  0,  0,  0,  0, 48, 24,  8, 56, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_045[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,248,127,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_046[] = {  6,  0,  0,  0,  0,  0,  0,  0, 48, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_047[] = {  7,  0,  0,  0,  0,192,192,192, 64, 96, 96, 32, 48, 48, 16, 24, 24,  8, 12, 12,  4,  6,  6,  6,  6,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_048[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 25,128, 48,192, 48,192,112,224, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 48,192, 25,128, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_049[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 63,192,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0,  6,  0, 30,  0,  6,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_050[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,192,127,224, 48, 32, 24,  0, 12,  0,  6,  0,  2,  0,  3,  0,  1,128,  1,128,  0,192,  0,192, 64,192, 64,192, 33,192, 63,128, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_051[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 60,  0,115,  0, 97,128,  0,128,  0,192,  0,192,  0,192,  1,192,  3,128, 15,  0,  6,  0,  3,  0, 65,128, 65,128, 35,128, 63,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_052[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,128,  1,128,  1,128,  1,128,127,224,127,224, 97,128, 33,128, 49,128, 17,128, 25,128,  9,128, 13,128,  5,128,  3,128,  3,128,  1,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_053[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 63,  0,113,192, 96,192,  0, 96,  0, 96,  0, 96,  0, 96,  0,224,  1,192,  7,192, 63,  0, 60,  0, 48,  0, 16,  0, 16,  0, 15,192, 15,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_054[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 61,192, 48,192,112, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,192,121,192,119,  0, 48,  0, 56,  0, 24,  0, 12,  0,  7,  0,  1,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_055[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  6,  0,  6,  0,  6,  0,  2,  0,  3,  0,  3,  0,  1,  0,  1,128,  1,128,  0,128,  0,192, 64,192, 96, 96,127,224, 63,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_056[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 57,192,112,192, 96, 96, 96, 96, 96, 96, 32,224, 48,192, 27,128, 15,  0, 15,  0, 25,128, 48,192, 48,192, 48,192, 25,128, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_057[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,120,  0, 14,  0,  3,  0,  1,128,  1,192,  0,192, 14,192, 57,224, 48,224, 96, 96, 96, 96, 96, 96, 96, 96, 96,224, 48,192, 59,192, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_058[] = {  6,  0,  0,  0,  0,  0,  0,  0, 48, 48,  0,  0,  0,  0,  0,  0,  0, 48, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_059[] = {  7,  0,  0,  0,  0, 48, 24,  8, 56, 48,  0,  0,  0,  0,  0,  0,  0, 48, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_060[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48,  0,224,  3,128, 14,  0, 56,  0, 96,  0, 56,  0, 14,  0,  3,128,  0,224,  0, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_061[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,248,127,248,  0,  0,  0,  0,127,248,127,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_062[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96,  0, 56,  0, 14,  0,  3,128,  0,224,  0, 48,  0,224,  3,128, 14,  0, 56,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_063[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12,  0, 12,  0,  0,  0,  0,  0,  4,  0,  4,  0,  4,  0,  6,  0,  6,  0,  3,  0,  3,128,  1,192, 48,192, 48,192, 32,192, 49,128, 31,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_064[] = { 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252,  0,  3,131,  0,  6,  0,  0, 12,  0,  0, 24,119,128, 24,222,192, 49,142, 96, 49,134, 32, 49,134, 48, 49,134, 16, 49,131, 16, 48,195, 16, 48,227, 16, 56,127, 16, 24, 59, 48, 28,  0, 32, 14,  0, 96,  7,  0,192,  3,195,128,  0,254,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_065[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 31,128, 48,  6,  0, 16,  6,  0, 16, 12,  0, 24, 12,  0,  8, 12,  0, 15,248,  0, 12, 24,  0,  4, 24,  0,  4, 48,  0,  6, 48,  0,  2, 48,  0,  2, 96,  0,  1, 96,  0,  1,192,  0,  1,192,  0,  0,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_066[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,240, 24, 60, 24, 12, 24,  6, 24,  6, 24,  6, 24, 12, 24, 28, 31,240, 24, 32, 24, 24, 24, 12, 24, 12, 24, 12, 24, 24, 24, 56,127,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_067[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240, 15, 28, 28,  4, 48,  2, 48,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 48,  2, 48,  2, 28,  6, 14, 30,  3,242,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_068[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,224,  0, 24, 56,  0, 24, 28,  0, 24,  6,  0, 24,  6,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  6,  0, 24,  6,  0, 24, 28,  0, 24, 56,  0,127,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_069[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,252, 24, 12, 24,  4, 24,  4, 24,  0, 24,  0, 24, 32, 24, 32, 31,224, 24, 32, 24, 32, 24,  0, 24,  0, 24,  8, 24,  8, 24, 24,127,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_070[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24, 16, 24, 16, 31,240, 24, 16, 24, 16, 24,  0, 24,  0, 24,  8, 24,  8, 24, 24,127,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_071[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 15, 28,  0, 28, 14,  0, 48,  6,  0, 48,  6,  0, 96,  6,  0, 96,  6,  0, 96, 31,128, 96,  0,  0, 96,  0,  0, 96,  0,  0, 96,  0,  0, 48,  2,  0, 48,  2,  0, 28,  6,  0, 14, 30,  0,  3,242,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_072[] = { 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126, 15,192, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 31,255,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0,126, 15,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_073[] = {  8,  0,  0,  0,  0,  0,  0,  0,126, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,126,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_074[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 60,  0,102,  0, 99,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0, 15,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_075[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126, 15,128, 24,  7,  0, 24, 14,  0, 24, 28,  0, 24, 56,  0, 24,112,  0, 24,224,  0, 25,192,  0, 31,128,  0, 31,  0,  0, 25,128,  0, 24,192,  0, 24, 96,  0, 24, 48,  0, 24, 24,  0, 24, 12,  0,126, 63,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_076[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,252, 24, 12, 24,  4, 24,  4, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0,126,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_077[] = { 22,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124, 16,252, 16, 48, 48, 16, 48, 48, 16,104, 48, 16,104, 48, 16,196, 48, 16,196, 48, 17,132, 48, 17,130, 48, 19,  2, 48, 19,  1, 48, 22,  1, 48, 22,  1, 48, 28,  0,176, 28,  0,176, 24,  0,112,120,  0,124,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_078[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,  6,  0, 16, 14,  0, 16, 14,  0, 16, 26,  0, 16, 50,  0, 16, 50,  0, 16, 98,  0, 16,194,  0, 16,194,  0, 17,130,  0, 19,  2,  0, 19,  2,  0, 22,  2,  0, 28,  2,  0, 28,  2,  0, 24,  2,  0,120, 15,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_079[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 28,  0, 28, 14,  0, 48,  3,  0, 48,  3,  0, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 48,  3,  0, 48,  3,  0, 28, 14,  0, 14, 28,  0,  3,240,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_080[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 31,224, 24, 56, 24, 24, 24, 12, 24, 12, 24, 12, 24, 24, 24, 56,127,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_081[] = { 18,  0,  0,  0,  0,  0,  0,  0,  7,128,  0, 28,  0,  0, 56,  0,  0,112,  0,  0,224,  0,  3,240,  0, 14, 28,  0, 28, 14,  0, 48,  3,  0, 48,  3,  0, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 48,  3,  0, 48,  3,  0, 28, 14,  0, 14, 28,  0,  3,240,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_082[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126, 15, 24, 14, 24, 28, 24, 56, 24, 48, 24, 96, 24,224, 25,192, 31,224, 24, 56, 24, 24, 24, 28, 24, 12, 24, 28, 24, 24, 24, 56,127,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_083[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 79,  0,120,192, 96, 96, 64, 48, 64, 48,  0, 48,  0,112,  1,224,  7,192, 15,  0, 60,  0,112,  0, 96, 32, 96, 32, 96, 96, 49,224, 15, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_084[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,224,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128, 65,130, 65,130, 97,134,127,254,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_085[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 24,  0, 12,  4,  0, 24,  4,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0,126, 15,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_086[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,128,  0,  1,128,  0,  1,128,  0,  3,192,  0,  3, 64,  0,  3, 96,  0,  6, 32,  0,  6, 32,  0,  6, 48,  0, 12, 16,  0, 12, 24,  0, 24,  8,  0, 24,  8,  0, 24, 12,  0, 48,  4,  0, 48,  6,  0,252, 31,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_087[] = { 23,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,131,  0,  1,131,  0,  1,131,128,  3,135,128,  3, 70,128,  3, 70,192,  6, 70, 64,  6, 76, 64,  6, 76, 96, 12, 44, 96, 12, 44, 32, 24, 44, 32, 24, 24, 48, 24, 24, 16, 48, 24, 16, 48, 24, 24,252,126,126,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_088[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 15,192, 48,  3,128, 24,  7,  0,  8, 14,  0,  4, 12,  0,  6, 24,  0,  2, 56,  0,  1,112,  0,  0,224,  0,  0,192,  0,  1,192,  0,  3,160,  0,  3, 16,  0,  6,  8,  0, 14, 12,  0, 28,  6,  0,126, 15,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_089[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,224,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  3,192,  3, 64,  6, 96,  6, 32, 12, 48, 28, 16, 24, 24, 56,  8, 48, 12,252, 63,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_090[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,252,112, 12, 56,  4, 24,  4, 28,  0, 12,  0, 14,  0,  7,  0,  3,  0,  3,128,  1,128,  1,192,  0,224, 64, 96, 64,112, 96, 56,127,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_091[] = {  8,  0,  0,  0, 62, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 62,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_092[] = {  7,  0,  0,  0,  0,  0,  0,  0,  6,  6,  4, 12, 12,  8, 24, 24, 16, 48, 48, 32, 96, 96, 64,192,192,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_093[] = {  8,  0,  0,  0,124, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,124,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_094[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 64, 64, 96,192, 32,128, 49,128, 17,  0, 27,  0, 10,  0, 14,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_095[] = { 13,  0,  0,  0,  0,255,248,255,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_096[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48,112, 64, 96, 48,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_097[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128,  7,128,  1,128, 49,128, 51,128, 31,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_098[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 47,  0, 57,192, 48,192, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,192, 57,192, 55,  0, 48,  0, 48,  0, 48,  0, 48,  0,112,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_099[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 63,128, 56, 64,112,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 32,192, 49,192, 15,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_100[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15, 96, 57,192, 48,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 48,192, 57,192, 14,192,  0,192,  0,192,  0,192,  0,192,  1,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_101[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 63,128, 56, 64,112,  0, 96,  0, 96,  0, 96,  0,127,192, 96,192, 32,192, 49,128, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_102[] = {  7,  0,  0,  0,  0,  0,  0,  0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,254, 48, 48, 48, 22, 14,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_103[] = { 12,  0,  0,  0,  0, 31,128,120,224, 96, 48, 96, 16, 48, 48, 31,224, 63,128, 48,  0, 24,  0, 31,  0, 25,128, 48,192, 48,192, 48,192, 48,192, 25,128, 15,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_104[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,120,240, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 56,224, 55,192, 51,128, 48,  0, 48,  0, 48,  0, 48,  0,112,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_105[] = {  6,  0,  0,  0,  0,  0,  0,  0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112,  0,  0,  0, 48, 48,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_106[] = {  6,  0,  0,192,224, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112,  0,  0,  0, 48, 48,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_107[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,121,240, 48,224, 49,192, 51,128, 55,  0, 54,  0, 60,  0, 52,  0, 50,  0, 51,  0, 49,128, 51,224, 48,  0, 48,  0, 48,  0, 48,  0,112,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_108[] = {  6,  0,  0,  0,  0,  0,  0,  0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_109[] = { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,120,241,224, 48, 96,192, 48, 96,192, 48, 96,192, 48, 96,192, 48, 96,192, 48, 96,192, 48, 96,192, 48, 96,192, 56,241,192, 55,207,128,115,135,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_110[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,120,240, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 56,224, 55,192,115,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_111[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_112[] = { 12,  0,  0,  0,  0,120,  0, 48,  0, 48,  0, 48,  0, 48,  0, 55,  0, 57,192, 48,192, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,192, 57,192,119,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_113[] = { 12,  0,  0,  0,  0,  1,224,  0,192,  0,192,  0,192,  0,192, 14,192, 57,192, 48,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 48,192, 57,192, 14,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_114[] = {  8,  0,  0,  0,  0,  0,  0,  0,120, 48, 48, 48, 48, 48, 48, 48, 48, 59, 55,115,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_115[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,  0, 99,  0, 65,128,  1,128,  3,128, 15,  0, 62,  0, 56,  0,112,  0, 97,  0, 51,  0, 31,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_116[] = {  7,  0,  0,  0,  0,  0,  0,  0, 28, 50, 48, 48, 48, 48, 48, 48, 48, 48, 48,254,112, 48, 16,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_117[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,112, 31, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_118[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,  0, 14,  0, 14,  0, 26,  0, 25,  0, 25,  0, 49,  0, 48,128, 48,128, 96,128, 96,192,241,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_119[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4, 16,  0, 14, 56,  0, 14, 56,  0, 26, 40,  0, 26,100,  0, 25,100,  0, 49,100,  0, 48,194,  0, 48,194,  0, 96,194,  0, 96,195,  0,241,231,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_120[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,120,240, 48, 96, 16,192, 25,192, 13,128,  7,  0,  6,  0, 13,  0, 28,128, 24,192, 48, 96,120,240,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_121[] = { 11,  0,  0,  0,  0,224,  0,240,  0, 24,  0,  8,  0, 12,  0,  4,  0, 14,  0, 14,  0, 26,  0, 25,  0, 25,  0, 49,  0, 48,128, 48,128, 96,128, 96,192,241,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_122[] = { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,128, 97,128, 48,128, 56,  0, 24,  0, 28,  0, 12,  0, 14,  0,  7,  0, 67,  0, 97,128,127,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_123[] = { 10,  0,  0,  0,  0,  3,128,  6,  0, 12,  0, 12,  0, 12,  0, 12,  0, 12,  0, 12,  0,  8,  0, 24,  0, 16,  0, 96,  0, 16,  0, 24,  0,  8,  0, 12,  0, 12,  0, 12,  0, 12,  0, 12,  0,  6,  0,  3,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_124[] = {  6,  0,  0,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_125[] = { 10,  0,  0,  0,  0,112,  0, 24,  0, 12,  0, 12,  0, 12,  0, 12,  0, 12,  0, 12,  0,  4,  0,  6,  0,  2,  0,  1,128,  2,  0,  6,  0,  4,  0, 12,  0, 12,  0, 12,  0, 12,  0, 12,  0, 24,  0,112,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_126[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 65,192, 99,224, 62, 48, 28, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_127[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_128[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_129[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_130[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_131[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_132[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_133[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_134[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_135[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_136[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_137[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_138[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_139[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_140[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_141[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_142[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_143[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_144[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_145[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_146[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_147[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_148[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_149[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_150[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_151[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_152[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_153[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_154[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_155[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_156[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_157[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_158[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_159[] = { 26,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 64,  0, 64,  0,  0,  0,  0,  0, 85, 85, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_160[] = {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_161[] = {  8,  0,  0, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_162[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0, 32,  0, 31,  0, 63,128, 56, 64,104,  0,100,  0,100,  0,100,  0, 98,  0, 98,  0, 33,192, 49,192, 15,128,  0,128,  0,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_163[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,115,192, 95, 96, 60, 32, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,  0,126,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,192, 12,192,  7,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_164[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96, 48,119,112, 63,224, 24,192, 48, 96, 48, 96, 48, 96, 48, 96, 24,192, 63,224,119,112, 96, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_165[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,192,  3,  0,  3,  0,  3,  0,  3,  0, 31,224,  3,  0, 31,224,  3,  0,  7,128, 12,128, 12,192, 24, 64, 24, 96, 48, 32,112, 48,248,124,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_166[] = {  6,  0,  0,  0,  0,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48,  0,  0,  0, 48, 48, 48, 48, 48, 48, 48,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_167[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,  0, 25,  0, 24,128,  1,128,  3,128,  7,  0, 14,  0, 29,  0, 56,128, 48,192, 32,192, 33,192, 19,128, 15,  0, 14,  0, 28,  0, 24,  0, 17,128,  9,128,  7,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_168[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,102,102,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_169[] = { 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,248,  0, 14, 14,  0, 24,  3,  0, 48,225,128, 35,184,128, 98, 12,192, 70,  0, 64, 68,  0, 64, 68,  0, 64, 68,  0, 64, 70,  0, 64, 98, 12,192, 35,152,128, 48,241,128, 24,  3,  0, 14, 14,  0,  3,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_170[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,  0,118,204,204,124, 12,204,120,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_171[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2, 32,  6, 96, 12,192, 25,128, 51,  0, 51,  0, 25,128, 12,192,  6, 96,  2, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_172[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24,  0, 24,  0, 24,  0, 24,  0, 24,127,248,127,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_173[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,  0,127,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_174[] = { 19,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,248,  0, 14, 14,  0, 24,  3,  0, 48,  1,128, 35,140,128, 97, 24,192, 65, 16, 64, 65, 32, 64, 65,240, 64, 65, 24, 64, 65,  8, 64, 97,  8,192, 33, 24,128, 51,241,128, 24,  3,  0, 14, 14,  0,  3,248,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_175[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,126,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_176[] = {  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 28,  0, 34,  0, 65,  0, 65,  0, 65,  0, 34,  0, 28,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_177[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,248,127,248,  0,  0,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,127,248,127,248,  3,  0,  3,  0,  3,  0,  3,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_178[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 68, 32, 48, 16,  8, 12,140, 76, 56,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_179[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,112,136,140, 12,  8, 48,  8,140, 76, 56,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_180[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32, 24, 14,  6,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_181[] = { 13,  0,  0,  0,  0, 32,  0,112,  0, 96,  0, 32,  0, 32,  0, 46,112, 63, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_182[] = { 11,  0,  0,  0,  0,  4,128,  4,128,  4,128,  4,128,  4,128,  4,128,  4,128,  4,128,  4,128,  4,128,  4,128, 12,128, 28,128, 60,128, 60,128,124,128,124,128,124,128, 60,128, 60,128, 28,128, 15,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_183[] = {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 48, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_184[] = {  8,  0, 60,102,  6, 30, 24,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_185[] = {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124, 16, 16, 16, 16, 16, 16, 80, 48, 16,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_186[] = {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,  0, 60,102,102,102,102,102, 60,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_187[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 34,  0, 51,  0, 25,128, 12,192,  6, 96,  6, 96, 12,192, 25,128, 51,  0, 34,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_188[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24,  2,  0,  8,  2,  0, 12,127,128,  4, 34,  0,  6, 50,  0,  3, 18,  0,  1, 10,  0,125,142,  0, 16,134,  0, 16,194,  0, 16, 96,  0, 16, 32,  0, 16, 48,  0, 16, 16,  0, 80, 24,  0, 48, 12,  0, 16,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_189[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24, 63,  0,  8, 17,  0, 12,  8,  0,  4, 12,  0,  6,  4,  0,  3,  2,  0,  1,  3,  0,125,163,  0, 16,147,  0, 16,206,  0, 16, 96,  0, 16, 32,  0, 16, 48,  0, 16, 16,  0, 80, 24,  0, 48, 12,  0, 16,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_190[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 24,  2,  0,  8,  2,  0, 12,127,128,  4, 34,  0,  6, 50,  0,  3, 18,  0,  1, 10,  0,113,142,  0,136,134,  0,140,194,  0, 12, 96,  0,  8, 32,  0, 48, 48,  0,  8, 16,  0,140, 24,  0, 76, 12,  0, 56,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_191[] = { 11,  0,  0,  0,  0, 31,  0, 49,128, 96,128, 97,128, 97,128,112,  0, 56,  0, 24,  0, 28,  0, 12,  0, 12,  0,  4,  0,  4,  0,  0,  0,  0,  0,  6,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_192[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 31,128, 48,  6,  0, 16,  6,  0, 16, 12,  0, 24, 12,  0,  8, 12,  0, 15,248,  0, 12, 24,  0,  4, 24,  0,  4, 48,  0,  6, 48,  0,  2, 48,  0,  2, 96,  0,  1, 96,  0,  1,192,  0,  1,192,  0,  0,128,  0,  0,  0,  0,  0, 32,  0,  0,192,  0,  3,128,  0,  3,  0,  0};
+static const GLubyte TimesRoman24_Character_193[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 31,128, 48,  6,  0, 16,  6,  0, 16, 12,  0, 24, 12,  0,  8, 12,  0, 15,248,  0, 12, 24,  0,  4, 24,  0,  4, 48,  0,  6, 48,  0,  2, 48,  0,  2, 96,  0,  1, 96,  0,  1,192,  0,  1,192,  0,  0,128,  0,  0,  0,  0,  1,  0,  0,  0,192,  0,  0,112,  0,  0, 48,  0};
+static const GLubyte TimesRoman24_Character_194[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 31,128, 48,  6,  0, 16,  6,  0, 16, 12,  0, 24, 12,  0,  8, 12,  0, 15,248,  0, 12, 24,  0,  4, 24,  0,  4, 48,  0,  6, 48,  0,  2, 48,  0,  2, 96,  0,  1, 96,  0,  1,192,  0,  1,192,  0,  0,128,  0,  0,  0,  0,  8, 16,  0,  6, 96,  0,  3,192,  0,  1,128,  0};
+static const GLubyte TimesRoman24_Character_195[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 31,128, 48,  7,  0, 16,  6,  0, 16, 12,  0, 24, 12,  0,  8, 12,  0, 15,248,  0, 12, 24,  0,  4, 24,  0,  4, 48,  0,  6, 48,  0,  2, 48,  0,  2, 96,  0,  1, 96,  0,  1,192,  0,  1,192,  0,  0,128,  0,  0,  0,  0,  0,  0,  0,  4,224,  0,  3,144,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_196[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 31,128, 48,  6,  0, 16,  6,  0, 16, 12,  0, 24, 12,  0,  8, 12,  0, 15,248,  0, 12, 24,  0,  4, 24,  0,  4, 48,  0,  6, 48,  0,  2, 48,  0,  2, 96,  0,  1, 96,  0,  1,192,  0,  1,192,  0,  0,128,  0,  0,  0,  0,  0,  0,  0,  6, 48,  0,  6, 48,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_197[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,252, 31,128, 48,  6,  0, 16,  6,  0, 16, 12,  0, 24, 12,  0,  8, 12,  0, 15,248,  0, 12, 24,  0,  4, 24,  0,  4, 48,  0,  6, 48,  0,  2, 48,  0,  2, 96,  0,  1, 96,  0,  1,192,  0,  1,192,  0,  0,128,  0,  1,192,  0,  2, 32,  0,  2, 32,  0,  1,192,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_198[] = { 21,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,249,255,240, 48, 96, 48, 16, 96, 16, 16, 96, 16, 24, 96,  0,  8, 96,  0, 15,224,128, 12, 96,128,  4,127,128,  4, 96,128,  6, 96,128,  2, 96,  0,  2, 96,  0,  1, 96, 32,  1, 96, 32,  1,224, 96,  3,255,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_199[] = { 16,  0,  0,  3,192,  6, 96,  0, 96,  1,224,  1,128,  0,128,  3,240, 15, 28, 28,  4, 48,  2, 48,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 48,  2, 48,  2, 28,  6, 14, 30,  3,242,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_200[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,252, 24, 12, 24,  4, 24,  4, 24,  0, 24,  0, 24, 32, 24, 32, 31,224, 24, 32, 24, 32, 24,  0, 24,  0, 24,  8, 24,  8, 24, 24,127,248,  0,  0,  0,128,  3,  0, 14,  0, 12,  0};
+static const GLubyte TimesRoman24_Character_201[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,252, 24, 12, 24,  4, 24,  4, 24,  0, 24,  0, 24, 32, 24, 32, 31,224, 24, 32, 24, 32, 24,  0, 24,  0, 24,  8, 24,  8, 24, 24,127,248,  0,  0,  2,  0,  1,128,  0,224,  0, 96};
+static const GLubyte TimesRoman24_Character_202[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,252, 24, 12, 24,  4, 24,  4, 24,  0, 24,  0, 24, 32, 24, 32, 31,224, 24, 32, 24, 32, 24,  0, 24,  0, 24,  8, 24,  8, 24, 24,127,248,  0,  0,  8, 16,  6, 96,  3,192,  1,128};
+static const GLubyte TimesRoman24_Character_203[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,252, 24, 12, 24,  4, 24,  4, 24,  0, 24,  0, 24, 32, 24, 32, 31,224, 24, 32, 24, 32, 24,  0, 24,  0, 24,  8, 24,  8, 24, 24,127,248,  0,  0,  0,  0, 12,192, 12,192,  0,  0};
+static const GLubyte TimesRoman24_Character_204[] = {  8,  0,  0,  0,  0,  0,  0,  0,126, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,126,  0,  4, 24,112, 96};
+static const GLubyte TimesRoman24_Character_205[] = {  8,  0,  0,  0,  0,  0,  0,  0,126, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,126,  0, 32, 24, 14,  6};
+static const GLubyte TimesRoman24_Character_206[] = {  8,  0,  0,  0,  0,  0,  0,  0, 63, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 63,  0, 64, 51, 30, 12};
+static const GLubyte TimesRoman24_Character_207[] = {  8,  0,  0,  0,  0,  0,  0,  0,126, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,126,  0,  0,102,102,  0};
+static const GLubyte TimesRoman24_Character_208[] = { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,127,224,  0, 24, 56,  0, 24, 28,  0, 24,  6,  0, 24,  6,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0,255,  3,  0, 24,  3,  0, 24,  3,  0, 24,  3,  0, 24,  6,  0, 24,  6,  0, 24, 28,  0, 24, 56,  0,127,224,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_209[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,124,  6,  0, 16, 14,  0, 16, 14,  0, 16, 26,  0, 16, 50,  0, 16, 50,  0, 16, 98,  0, 16,194,  0, 16,194,  0, 17,130,  0, 19,  2,  0, 19,  2,  0, 22,  2,  0, 28,  2,  0, 28,  2,  0, 24,  2,  0,120, 15,128,  0,  0,  0,  0,  0,  0,  2,112,  0,  1,200,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_210[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 28,  0, 28, 14,  0, 48,  3,  0, 48,  3,  0, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 48,  3,  0, 48,  3,  0, 28, 14,  0, 14, 28,  0,  3,240,  0,  0,  0,  0,  0, 32,  0,  0,192,  0,  3,128,  0,  3,  0,  0};
+static const GLubyte TimesRoman24_Character_211[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 28,  0, 28, 14,  0, 48,  3,  0, 48,  3,  0, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 48,  3,  0, 48,  3,  0, 28, 14,  0, 14, 28,  0,  3,240,  0,  0,  0,  0,  0,128,  0,  0, 96,  0,  0, 56,  0,  0, 24,  0};
+static const GLubyte TimesRoman24_Character_212[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 28,  0, 28, 14,  0, 48,  3,  0, 48,  3,  0, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 48,  3,  0, 48,  3,  0, 28, 14,  0, 14, 28,  0,  3,240,  0,  0,  0,  0,  4,  8,  0,  3, 48,  0,  1,224,  0,  0,192,  0};
+static const GLubyte TimesRoman24_Character_213[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 28,  0, 28, 14,  0, 48,  3,  0, 48,  3,  0, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 48,  3,  0, 48,  3,  0, 28, 14,  0, 14, 28,  0,  3,240,  0,  0,  0,  0,  0,  0,  0,  2,112,  0,  1,200,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_214[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 28,  0, 28, 14,  0, 48,  3,  0, 48,  3,  0, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 96,  1,128, 48,  3,  0, 48,  3,  0, 28, 14,  0, 14, 28,  0,  3,240,  0,  0,  0,  0,  0,  0,  0,  3, 48,  0,  3, 48,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_215[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32, 16, 48, 48, 24, 96, 12,192,  7,128,  3,  0,  7,128, 12,192, 24, 96, 48, 48, 32, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_216[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 16,  0,  0, 19,240,  0, 14, 28,  0, 28, 14,  0, 52,  3,  0, 50,  3,  0, 97,  1,128, 97,  1,128, 96,129,128, 96,129,128, 96, 65,128, 96, 65,128, 96, 33,128, 48, 35,  0, 48, 19,  0, 28, 14,  0, 14, 28,  0,  3,242,  0,  0,  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_217[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 24,  0, 12,  4,  0, 24,  4,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0,126, 15,128,  0,  0,  0,  0, 32,  0,  0,192,  0,  3,128,  0,  3,  0,  0};
+static const GLubyte TimesRoman24_Character_218[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 24,  0, 12,  4,  0, 24,  4,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0,126, 15,128,  0,  0,  0,  0,128,  0,  0, 96,  0,  0, 56,  0,  0, 24,  0};
+static const GLubyte TimesRoman24_Character_219[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 24,  0, 12,  4,  0, 24,  4,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0,126, 15,128,  0,  0,  0,  4,  8,  0,  3, 48,  0,  1,224,  0,  0,192,  0};
+static const GLubyte TimesRoman24_Character_220[] = { 18,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,240,  0, 14, 24,  0, 12,  4,  0, 24,  4,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0, 24,  2,  0,126, 15,128,  0,  0,  0,  0,  0,  0,  3, 24,  0,  3, 24,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_221[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,224,  1,128,  1,128,  1,128,  1,128,  1,128,  1,128,  3,192,  3, 64,  6, 96,  6, 32, 12, 48, 28, 16, 24, 24, 56,  8, 48, 12,252, 63,  0,  0,  1,  0,  0,192,  0,112,  0, 48};
+static const GLubyte TimesRoman24_Character_222[] = { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,126,  0, 24,  0, 24,  0, 24,  0, 31,224, 24, 56, 24, 24, 24, 12, 24, 12, 24, 12, 24, 24, 24, 56, 31,224, 24,  0, 24,  0, 24,  0,126,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_223[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,115,128, 54, 64, 54, 96, 48, 96, 48, 96, 48,224, 48,192, 49,192, 51,128, 54,  0, 49,128, 48,192, 48,192, 48,192, 48,192, 25,128, 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_224[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128,  7,128,  1,128, 49,128, 51,128, 31,  0,  0,  0,  2,  0, 12,  0, 56,  0, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_225[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128,  7,128,  1,128, 49,128, 51,128, 31,  0,  0,  0,  8,  0,  6,  0,  3,128,  1,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_226[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128,  7,128,  1,128, 49,128, 51,128, 31,  0,  0,  0, 33,  0, 18,  0, 30,  0, 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_227[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128,  7,128,  1,128, 49,128, 51,128, 31,  0,  0,  0,  0,  0, 46,  0, 29,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_228[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128,  7,128,  1,128, 49,128, 51,128, 31,  0,  0,  0,  0,  0, 51,  0, 51,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_229[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,192,125,128, 99,128, 97,128, 97,128, 49,128, 29,128,  7,128,  1,128, 49,128, 51,128, 31,  0,  0,  0, 14,  0, 17,  0, 17,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_230[] = { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 56,120,125,252, 99,194, 97,128, 97,128, 49,128, 29,128,  7,254,  1,134, 49,134, 51,204, 30,120,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_231[] = { 11,  0,  0, 30,  0, 51,  0,  3,  0, 15,  0, 12,  0,  4,  0, 15,  0, 63,128, 56, 64,112,  0, 96,  0, 96,  0, 96,  0, 96,  0, 96,  0, 32,192, 49,192, 15,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_232[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 63,128, 56, 64,112,  0, 96,  0, 96,  0, 96,  0,127,192, 96,192, 32,192, 49,128, 15,  0,  0,  0,  2,  0, 12,  0, 56,  0, 48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_233[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 63,128, 56, 64,112,  0, 96,  0, 96,  0, 96,  0,127,192, 96,192, 32,192, 49,128, 15,  0,  0,  0,  8,  0,  6,  0,  3,128,  1,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_234[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 63,128, 56, 64,112,  0, 96,  0, 96,  0, 96,  0,127,192, 96,192, 32,192, 49,128, 15,  0,  0,  0, 16,128,  9,  0, 15,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_235[] = { 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 63,128, 56, 64,112,  0, 96,  0, 96,  0, 96,  0,127,192, 96,192, 32,192, 49,128, 15,  0,  0,  0,  0,  0, 25,128, 25,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_236[] = {  6,  0,  0,  0,  0,  0,  0,  0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112,  0,  8, 48,224,192,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_237[] = {  6,  0,  0,  0,  0,  0,  0,  0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112,  0, 64, 48, 28, 12,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_238[] = {  6,  0,  0,  0,  0,  0,  0,  0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112,  0,132, 72,120, 48,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_239[] = {  6,  0,  0,  0,  0,  0,  0,  0,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,112,  0,  0,204,204,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_240[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15,128, 99,  0, 30,  0, 15,  0, 56,192, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_241[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,120,240, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 56,224, 55,192,115,128,  0,  0,  0,  0, 19,128, 14, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_242[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15,  0,  0,  0,  1,  0,  6,  0, 28,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_243[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15,  0,  0,  0,  4,  0,  3,  0,  1,192,  0,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_244[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15,  0,  0,  0, 16,128,  9,  0, 15,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_245[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15,  0,  0,  0,  0,  0, 19,128, 14, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_246[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 15,  0, 57,192, 48,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 48,192, 57,192, 15,  0,  0,  0,  0,  0, 25,128, 25,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_247[] = { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  3,  0,  3,  0,  0,  0,  0,  0,127,248,127,248,  0,  0,  0,  0,  3,  0,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_248[] = { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 96,  0,111,  0, 57,192, 56,192,104, 96,108, 96,100, 96,102, 96, 98, 96, 99, 96, 49,192, 57,192, 15, 96,  0, 96,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_249[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,112, 31, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224,  0,  0,  1,  0,  6,  0, 28,  0, 24,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_250[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,112, 31, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224,  0,  0,  4,  0,  3,  0,  1,192,  0,192,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_251[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,112, 31, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224,  0,  0, 16,128,  9,  0, 15,  0,  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_252[] = { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 14,112, 31, 96, 56,224, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96,112,224,  0,  0,  0,  0, 25,128, 25,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_253[] = { 11,  0,  0,  0,  0,224,  0,240,  0, 24,  0,  8,  0, 12,  0,  4,  0, 14,  0, 14,  0, 26,  0, 25,  0, 25,  0, 49,  0, 48,128, 48,128, 96,128, 96,192,241,224,  0,  0,  8,  0,  6,  0,  3,128,  1,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_254[] = { 12,  0,  0,  0,  0,120,  0, 48,  0, 48,  0, 48,  0, 48,  0, 55,  0, 57,192, 48,192, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48, 96, 48,192, 57,192, 55,  0, 48,  0, 48,  0, 48,  0, 48,  0,112,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+static const GLubyte TimesRoman24_Character_255[] = { 11,  0,  0,  0,  0,224,  0,240,  0, 24,  0,  8,  0, 12,  0,  4,  0, 14,  0, 14,  0, 26,  0, 25,  0, 25,  0, 49,  0, 48,128, 48,128, 96,128, 96,192,241,224,  0,  0,  0,  0, 51,  0, 51,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
+
+/* The font characters mapping: */
+static const GLubyte* TimesRoman24_Character_Map[] = {TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,
+                                                      TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,
+                                                      TimesRoman24_Character_032,TimesRoman24_Character_033,TimesRoman24_Character_034,TimesRoman24_Character_035,TimesRoman24_Character_036,TimesRoman24_Character_037,TimesRoman24_Character_038,TimesRoman24_Character_039,TimesRoman24_Character_040,TimesRoman24_Character_041,TimesRoman24_Character_042,TimesRoman24_Character_043,TimesRoman24_Character_044,TimesRoman24_Character_045,TimesRoman24_Character_046,TimesRoman24_Character_047,
+                                                      TimesRoman24_Character_048,TimesRoman24_Character_049,TimesRoman24_Character_050,TimesRoman24_Character_051,TimesRoman24_Character_052,TimesRoman24_Character_053,TimesRoman24_Character_054,TimesRoman24_Character_055,TimesRoman24_Character_056,TimesRoman24_Character_057,TimesRoman24_Character_058,TimesRoman24_Character_059,TimesRoman24_Character_060,TimesRoman24_Character_061,TimesRoman24_Character_062,TimesRoman24_Character_063,
+                                                      TimesRoman24_Character_064,TimesRoman24_Character_065,TimesRoman24_Character_066,TimesRoman24_Character_067,TimesRoman24_Character_068,TimesRoman24_Character_069,TimesRoman24_Character_070,TimesRoman24_Character_071,TimesRoman24_Character_072,TimesRoman24_Character_073,TimesRoman24_Character_074,TimesRoman24_Character_075,TimesRoman24_Character_076,TimesRoman24_Character_077,TimesRoman24_Character_078,TimesRoman24_Character_079,
+                                                      TimesRoman24_Character_080,TimesRoman24_Character_081,TimesRoman24_Character_082,TimesRoman24_Character_083,TimesRoman24_Character_084,TimesRoman24_Character_085,TimesRoman24_Character_086,TimesRoman24_Character_087,TimesRoman24_Character_088,TimesRoman24_Character_089,TimesRoman24_Character_090,TimesRoman24_Character_091,TimesRoman24_Character_092,TimesRoman24_Character_093,TimesRoman24_Character_094,TimesRoman24_Character_095,
+                                                      TimesRoman24_Character_096,TimesRoman24_Character_097,TimesRoman24_Character_098,TimesRoman24_Character_099,TimesRoman24_Character_100,TimesRoman24_Character_101,TimesRoman24_Character_102,TimesRoman24_Character_103,TimesRoman24_Character_104,TimesRoman24_Character_105,TimesRoman24_Character_106,TimesRoman24_Character_107,TimesRoman24_Character_108,TimesRoman24_Character_109,TimesRoman24_Character_110,TimesRoman24_Character_111,
+                                                      TimesRoman24_Character_112,TimesRoman24_Character_113,TimesRoman24_Character_114,TimesRoman24_Character_115,TimesRoman24_Character_116,TimesRoman24_Character_117,TimesRoman24_Character_118,TimesRoman24_Character_119,TimesRoman24_Character_120,TimesRoman24_Character_121,TimesRoman24_Character_122,TimesRoman24_Character_123,TimesRoman24_Character_124,TimesRoman24_Character_125,TimesRoman24_Character_126,TimesRoman24_Character_032,
+                                                      TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,
+                                                      TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,TimesRoman24_Character_032,
+                                                      TimesRoman24_Character_160,TimesRoman24_Character_161,TimesRoman24_Character_162,TimesRoman24_Character_163,TimesRoman24_Character_164,TimesRoman24_Character_165,TimesRoman24_Character_166,TimesRoman24_Character_167,TimesRoman24_Character_168,TimesRoman24_Character_169,TimesRoman24_Character_170,TimesRoman24_Character_171,TimesRoman24_Character_172,TimesRoman24_Character_173,TimesRoman24_Character_174,TimesRoman24_Character_175,
+                                                      TimesRoman24_Character_176,TimesRoman24_Character_177,TimesRoman24_Character_178,TimesRoman24_Character_179,TimesRoman24_Character_180,TimesRoman24_Character_181,TimesRoman24_Character_182,TimesRoman24_Character_183,TimesRoman24_Character_184,TimesRoman24_Character_185,TimesRoman24_Character_186,TimesRoman24_Character_187,TimesRoman24_Character_188,TimesRoman24_Character_189,TimesRoman24_Character_190,TimesRoman24_Character_191,
+                                                      TimesRoman24_Character_192,TimesRoman24_Character_193,TimesRoman24_Character_194,TimesRoman24_Character_195,TimesRoman24_Character_196,TimesRoman24_Character_197,TimesRoman24_Character_198,TimesRoman24_Character_199,TimesRoman24_Character_200,TimesRoman24_Character_201,TimesRoman24_Character_202,TimesRoman24_Character_203,TimesRoman24_Character_204,TimesRoman24_Character_205,TimesRoman24_Character_206,TimesRoman24_Character_207,
+                                                      TimesRoman24_Character_208,TimesRoman24_Character_209,TimesRoman24_Character_210,TimesRoman24_Character_211,TimesRoman24_Character_212,TimesRoman24_Character_213,TimesRoman24_Character_214,TimesRoman24_Character_215,TimesRoman24_Character_216,TimesRoman24_Character_217,TimesRoman24_Character_218,TimesRoman24_Character_219,TimesRoman24_Character_220,TimesRoman24_Character_221,TimesRoman24_Character_222,TimesRoman24_Character_223,
+                                                      TimesRoman24_Character_224,TimesRoman24_Character_225,TimesRoman24_Character_226,TimesRoman24_Character_227,TimesRoman24_Character_228,TimesRoman24_Character_229,TimesRoman24_Character_230,TimesRoman24_Character_231,TimesRoman24_Character_232,TimesRoman24_Character_233,TimesRoman24_Character_234,TimesRoman24_Character_235,TimesRoman24_Character_236,TimesRoman24_Character_237,TimesRoman24_Character_238,TimesRoman24_Character_239,
+                                                      TimesRoman24_Character_240,TimesRoman24_Character_241,TimesRoman24_Character_242,TimesRoman24_Character_243,TimesRoman24_Character_244,TimesRoman24_Character_245,TimesRoman24_Character_246,TimesRoman24_Character_247,TimesRoman24_Character_248,TimesRoman24_Character_249,TimesRoman24_Character_250,TimesRoman24_Character_251,TimesRoman24_Character_252,TimesRoman24_Character_253,TimesRoman24_Character_254,TimesRoman24_Character_255,NULL};
+
+/* The font structure: */
+const SFG_Font fgFontTimesRoman24 = { "-adobe-times-medium-r-normal--24-240-75-75-p-124-iso8859-1", 256, 29, TimesRoman24_Character_Map, 0, 7 };
+
index 8a923eb..d9b71f8 100644 (file)
-/*\r
- * freeglut_gamemode.c\r
- *\r
- * The game mode handling code.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Thu Dec 16 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-/*\r
- * TODO BEFORE THE STABLE RELEASE:\r
- *\r
- *  glutGameModeString()    -- missing\r
- *  glutEnterGameMode()     -- X11 version\r
- *  glutLeaveGameMode()     -- is that correct?\r
- *  glutGameModeGet()       -- is that correct?\r
- */\r
-\r
-\r
-/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */\r
-extern void fgPlatformRememberState( void );\r
-extern void fgPlatformRestoreState( void );\r
-extern GLboolean fgPlatformChangeDisplayMode( GLboolean haveToTest );\r
-extern void fgPlatformEnterGameMode( void );\r
-extern void fgPlatformLeaveGameMode( void );\r
-\r
-\r
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */\r
-\r
-/*\r
- * Sets the game mode display string\r
- */\r
-void FGAPIENTRY glutGameModeString( const char* string )\r
-{\r
-    int width = -1, height = -1, depth = -1, refresh = -1;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGameModeString" );\r
-\r
-    /*\r
-     * This one seems a bit easier than glutInitDisplayString. The bad thing\r
-     * about it that I was unable to find the game mode string definition, so\r
-     * that I assumed it is: "[width]x[height]:[depth]@[refresh rate]", which\r
-     * appears in all GLUT game mode programs I have seen to date.\r
-     */\r
-    if( sscanf( string, "%ix%i:%i@%i", &width, &height, &depth, &refresh ) !=\r
-        4 )\r
-        if( sscanf( string, "%ix%i:%i", &width, &height, &depth ) != 3 )\r
-            if( sscanf( string, "%ix%i@%i", &width, &height, &refresh ) != 3 )\r
-                if( sscanf( string, "%ix%i", &width, &height ) != 2 )\r
-                    if( sscanf( string, ":%i@%i", &depth, &refresh ) != 2 )\r
-                        if( sscanf( string, ":%i", &depth ) != 1 )\r
-                            if( sscanf( string, "@%i", &refresh ) != 1 )\r
-                                fgWarning(\r
-                                    "unable to parse game mode string `%s'",\r
-                                    string\r
-                                );\r
-\r
-    /* All values not specified are now set to -1, which means those\r
-     * aspects of the current display mode are not changed in\r
-     * fgPlatformChangeDisplayMode() above.\r
-     */\r
-    fgState.GameModeSize.X  = width;\r
-    fgState.GameModeSize.Y  = height;\r
-    fgState.GameModeDepth   = depth;\r
-    fgState.GameModeRefresh = refresh;\r
-}\r
-\r
-\r
-\r
-/*\r
- * Enters the game mode\r
- */\r
-int FGAPIENTRY glutEnterGameMode( void )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutEnterGameMode" );\r
-\r
-    if( fgStructure.GameModeWindow )\r
-        fgAddToWindowDestroyList( fgStructure.GameModeWindow );\r
-    else\r
-        fgPlatformRememberState( );\r
-\r
-    if( ! fgPlatformChangeDisplayMode( GL_FALSE ) )\r
-    {\r
-        fgWarning( "failed to change screen settings" );\r
-        return 0;\r
-    }\r
-\r
-    fgStructure.GameModeWindow = fgCreateWindow(\r
-        NULL, "FREEGLUT", GL_TRUE, 0, 0,\r
-        GL_TRUE, fgState.GameModeSize.X, fgState.GameModeSize.Y,\r
-        GL_TRUE, GL_FALSE\r
-    );\r
-\r
-    fgStructure.GameModeWindow->State.Width  = fgState.GameModeSize.X;\r
-    fgStructure.GameModeWindow->State.Height = fgState.GameModeSize.Y;\r
-    fgStructure.GameModeWindow->State.NeedToResize = GL_TRUE;\r
-\r
-    fgPlatformEnterGameMode();\r
-\r
-    return fgStructure.GameModeWindow->ID;\r
-}\r
-\r
-/*\r
- * Leaves the game mode\r
- */\r
-void FGAPIENTRY glutLeaveGameMode( void )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutLeaveGameMode" );\r
-\r
-    freeglut_return_if_fail( fgStructure.GameModeWindow );\r
-\r
-    fgAddToWindowDestroyList( fgStructure.GameModeWindow );\r
-    fgStructure.GameModeWindow = NULL;\r
-\r
-    fgPlatformLeaveGameMode();\r
-\r
-    fgPlatformRestoreState();\r
-}\r
-\r
-/*\r
- * Returns information concerning the freeglut game mode\r
- */\r
-int FGAPIENTRY glutGameModeGet( GLenum eWhat )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGameModeGet" );\r
-\r
-    switch( eWhat )\r
-    {\r
-    case GLUT_GAME_MODE_ACTIVE:\r
-        return !!fgStructure.GameModeWindow;\r
-\r
-    case GLUT_GAME_MODE_POSSIBLE:\r
-        return fgPlatformChangeDisplayMode( GL_TRUE );\r
-\r
-    case GLUT_GAME_MODE_WIDTH:\r
-        return fgState.GameModeSize.X;\r
-\r
-    case GLUT_GAME_MODE_HEIGHT:\r
-        return fgState.GameModeSize.Y;\r
-\r
-    case GLUT_GAME_MODE_PIXEL_DEPTH:\r
-        return fgState.GameModeDepth;\r
-\r
-    case GLUT_GAME_MODE_REFRESH_RATE:\r
-        return fgState.GameModeRefresh;\r
-\r
-    case GLUT_GAME_MODE_DISPLAY_CHANGED:\r
-        /*\r
-         * This is true if the game mode has been activated successfully..\r
-         */\r
-        return !!fgStructure.GameModeWindow;\r
-    }\r
-\r
-    fgWarning( "Unknown gamemode get: %d", eWhat );\r
-    return -1;\r
-}\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_gamemode.c
+ *
+ * The game mode handling code.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Thu Dec 16 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ *
+ *  glutGameModeString()    -- missing
+ *  glutEnterGameMode()     -- X11 version
+ *  glutLeaveGameMode()     -- is that correct?
+ *  glutGameModeGet()       -- is that correct?
+ */
+
+
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
+extern void fgPlatformRememberState( void );
+extern void fgPlatformRestoreState( void );
+extern GLboolean fgPlatformChangeDisplayMode( GLboolean haveToTest );
+extern void fgPlatformEnterGameMode( void );
+extern void fgPlatformLeaveGameMode( void );
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Sets the game mode display string
+ */
+void FGAPIENTRY glutGameModeString( const char* string )
+{
+    int width = -1, height = -1, depth = -1, refresh = -1;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGameModeString" );
+
+    /*
+     * This one seems a bit easier than glutInitDisplayString. The bad thing
+     * about it that I was unable to find the game mode string definition, so
+     * that I assumed it is: "[width]x[height]:[depth]@[refresh rate]", which
+     * appears in all GLUT game mode programs I have seen to date.
+     */
+    if( sscanf( string, "%ix%i:%i@%i", &width, &height, &depth, &refresh ) !=
+        4 )
+        if( sscanf( string, "%ix%i:%i", &width, &height, &depth ) != 3 )
+            if( sscanf( string, "%ix%i@%i", &width, &height, &refresh ) != 3 )
+                if( sscanf( string, "%ix%i", &width, &height ) != 2 )
+                    if( sscanf( string, ":%i@%i", &depth, &refresh ) != 2 )
+                        if( sscanf( string, ":%i", &depth ) != 1 )
+                            if( sscanf( string, "@%i", &refresh ) != 1 )
+                                fgWarning(
+                                    "unable to parse game mode string `%s'",
+                                    string
+                                );
+
+    /* All values not specified are now set to -1, which means those
+     * aspects of the current display mode are not changed in
+     * fgPlatformChangeDisplayMode() above.
+     */
+    fgState.GameModeSize.X  = width;
+    fgState.GameModeSize.Y  = height;
+    fgState.GameModeDepth   = depth;
+    fgState.GameModeRefresh = refresh;
+}
+
+
+
+/*
+ * Enters the game mode
+ */
+int FGAPIENTRY glutEnterGameMode( void )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutEnterGameMode" );
+
+    if( fgStructure.GameModeWindow )
+        fgAddToWindowDestroyList( fgStructure.GameModeWindow );
+    else
+        fgPlatformRememberState( );
+
+    if( ! fgPlatformChangeDisplayMode( GL_FALSE ) )
+    {
+        fgWarning( "failed to change screen settings" );
+        return 0;
+    }
+
+    fgStructure.GameModeWindow = fgCreateWindow(
+        NULL, "FREEGLUT", GL_TRUE, 0, 0,
+        GL_TRUE, fgState.GameModeSize.X, fgState.GameModeSize.Y,
+        GL_TRUE, GL_FALSE
+    );
+
+    fgStructure.GameModeWindow->State.Width  = fgState.GameModeSize.X;
+    fgStructure.GameModeWindow->State.Height = fgState.GameModeSize.Y;
+    fgStructure.GameModeWindow->State.NeedToResize = GL_TRUE;
+
+    fgPlatformEnterGameMode();
+
+    return fgStructure.GameModeWindow->ID;
+}
+
+/*
+ * Leaves the game mode
+ */
+void FGAPIENTRY glutLeaveGameMode( void )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutLeaveGameMode" );
+
+    freeglut_return_if_fail( fgStructure.GameModeWindow );
+
+    fgAddToWindowDestroyList( fgStructure.GameModeWindow );
+    fgStructure.GameModeWindow = NULL;
+
+    fgPlatformLeaveGameMode();
+
+    fgPlatformRestoreState();
+}
+
+/*
+ * Returns information concerning the freeglut game mode
+ */
+int FGAPIENTRY glutGameModeGet( GLenum eWhat )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGameModeGet" );
+
+    switch( eWhat )
+    {
+    case GLUT_GAME_MODE_ACTIVE:
+        return !!fgStructure.GameModeWindow;
+
+    case GLUT_GAME_MODE_POSSIBLE:
+        return fgPlatformChangeDisplayMode( GL_TRUE );
+
+    case GLUT_GAME_MODE_WIDTH:
+        return fgState.GameModeSize.X;
+
+    case GLUT_GAME_MODE_HEIGHT:
+        return fgState.GameModeSize.Y;
+
+    case GLUT_GAME_MODE_PIXEL_DEPTH:
+        return fgState.GameModeDepth;
+
+    case GLUT_GAME_MODE_REFRESH_RATE:
+        return fgState.GameModeRefresh;
+
+    case GLUT_GAME_MODE_DISPLAY_CHANGED:
+        /*
+         * This is true if the game mode has been activated successfully..
+         */
+        return !!fgStructure.GameModeWindow;
+    }
+
+    fgWarning( "Unknown gamemode get: %d", eWhat );
+    return -1;
+}
+
+/*** END OF FILE ***/
index e102cba..0f9f5c5 100644 (file)
-/*\r
- * freeglut_geometry.c\r
- *\r
- * Freeglut geometry rendering methods.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Fri Dec 3 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-/*\r
- * TODO BEFORE THE STABLE RELEASE:\r
- *\r
- * Following functions have been contributed by Andreas Umbach.\r
- *\r
- *      glutWireCube()          -- looks OK\r
- *      glutSolidCube()         -- OK\r
- *\r
- * Those functions have been implemented by John Fay.\r
- *\r
- *      glutWireTorus()         -- looks OK\r
- *      glutSolidTorus()        -- looks OK\r
- *      glutWireDodecahedron()  -- looks OK\r
- *      glutSolidDodecahedron() -- looks OK\r
- *      glutWireOctahedron()    -- looks OK\r
- *      glutSolidOctahedron()   -- looks OK\r
- *      glutWireTetrahedron()   -- looks OK\r
- *      glutSolidTetrahedron()  -- looks OK\r
- *      glutWireIcosahedron()   -- looks OK\r
- *      glutSolidIcosahedron()  -- looks OK\r
- *\r
- *  The Following functions have been updated by Nigel Stewart, based\r
- *  on FreeGLUT 2.0.0 implementations:\r
- *\r
- *      glutWireSphere()        -- looks OK\r
- *      glutSolidSphere()       -- looks OK\r
- *      glutWireCone()          -- looks OK\r
- *      glutSolidCone()         -- looks OK\r
- */\r
-\r
-\r
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */\r
-\r
-/*\r
- * Draws a wireframed cube. Code contributed by Andreas Umbach <marvin@dataway.ch>\r
- */\r
-void FGAPIENTRY glutWireCube( GLdouble dSize )\r
-{\r
-    double size = dSize * 0.5;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireCube" );\r
-\r
-#   define V(a,b,c) glVertex3d( a size, b size, c size );\r
-#   define N(a,b,c) glNormal3d( a, b, c );\r
-\r
-    /* PWO: I dared to convert the code to use macros... */\r
-    glBegin( GL_LINE_LOOP ); N( 1.0, 0.0, 0.0); V(+,-,+); V(+,-,-); V(+,+,-); V(+,+,+); glEnd();\r
-    glBegin( GL_LINE_LOOP ); N( 0.0, 1.0, 0.0); V(+,+,+); V(+,+,-); V(-,+,-); V(-,+,+); glEnd();\r
-    glBegin( GL_LINE_LOOP ); N( 0.0, 0.0, 1.0); V(+,+,+); V(-,+,+); V(-,-,+); V(+,-,+); glEnd();\r
-    glBegin( GL_LINE_LOOP ); N(-1.0, 0.0, 0.0); V(-,-,+); V(-,+,+); V(-,+,-); V(-,-,-); glEnd();\r
-    glBegin( GL_LINE_LOOP ); N( 0.0,-1.0, 0.0); V(-,-,+); V(-,-,-); V(+,-,-); V(+,-,+); glEnd();\r
-    glBegin( GL_LINE_LOOP ); N( 0.0, 0.0,-1.0); V(-,-,-); V(-,+,-); V(+,+,-); V(+,-,-); glEnd();\r
-\r
-#   undef V\r
-#   undef N\r
-}\r
-\r
-/*\r
- * Draws a solid cube. Code contributed by Andreas Umbach <marvin@dataway.ch>\r
- */\r
-void FGAPIENTRY glutSolidCube( GLdouble dSize )\r
-{\r
-    double size = dSize * 0.5;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidCube" );\r
-\r
-#   define V(a,b,c) glVertex3d( a size, b size, c size );\r
-#   define N(a,b,c) glNormal3d( a, b, c );\r
-\r
-    /* PWO: Again, I dared to convert the code to use macros... */\r
-    glBegin( GL_QUADS );\r
-        N( 1.0, 0.0, 0.0); V(+,-,+); V(+,-,-); V(+,+,-); V(+,+,+);\r
-        N( 0.0, 1.0, 0.0); V(+,+,+); V(+,+,-); V(-,+,-); V(-,+,+);\r
-        N( 0.0, 0.0, 1.0); V(+,+,+); V(-,+,+); V(-,-,+); V(+,-,+);\r
-        N(-1.0, 0.0, 0.0); V(-,-,+); V(-,+,+); V(-,+,-); V(-,-,-);\r
-        N( 0.0,-1.0, 0.0); V(-,-,+); V(-,-,-); V(+,-,-); V(+,-,+);\r
-        N( 0.0, 0.0,-1.0); V(-,-,-); V(-,+,-); V(+,+,-); V(+,-,-);\r
-    glEnd();\r
-\r
-#   undef V\r
-#   undef N\r
-}\r
-\r
-/*\r
- * Compute lookup table of cos and sin values forming a cirle\r
- *\r
- * Notes:\r
- *    It is the responsibility of the caller to free these tables\r
- *    The size of the table is (n+1) to form a connected loop\r
- *    The last entry is exactly the same as the first\r
- *    The sign of n can be flipped to get the reverse loop\r
- */\r
-\r
-static void fghCircleTable(double **sint,double **cost,const int n)\r
-{\r
-    int i;\r
-\r
-    /* Table size, the sign of n flips the circle direction */\r
-\r
-    const int size = abs(n);\r
-\r
-    /* Determine the angle between samples */\r
-\r
-    const double angle = 2*M_PI/(double)( ( n == 0 ) ? 1 : n );\r
-\r
-    /* Allocate memory for n samples, plus duplicate of first entry at the end */\r
-\r
-    *sint = (double *) calloc(sizeof(double), size+1);\r
-    *cost = (double *) calloc(sizeof(double), size+1);\r
-\r
-    /* Bail out if memory allocation fails, fgError never returns */\r
-\r
-    if (!(*sint) || !(*cost))\r
-    {\r
-        free(*sint);\r
-        free(*cost);\r
-        fgError("Failed to allocate memory in fghCircleTable");\r
-    }\r
-\r
-    /* Compute cos and sin around the circle */\r
-\r
-    (*sint)[0] = 0.0;\r
-    (*cost)[0] = 1.0;\r
-\r
-    for (i=1; i<size; i++)\r
-    {\r
-        (*sint)[i] = sin(angle*i);\r
-        (*cost)[i] = cos(angle*i);\r
-    }\r
-\r
-    /* Last sample is duplicate of the first */\r
-\r
-    (*sint)[size] = (*sint)[0];\r
-    (*cost)[size] = (*cost)[0];\r
-}\r
-\r
-/*\r
- * Draws a solid sphere\r
- */\r
-void FGAPIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks)\r
-{\r
-    int i,j;\r
-\r
-    /* Adjust z and radius as stacks are drawn. */\r
-\r
-    double z0,z1;\r
-    double r0,r1;\r
-\r
-    /* Pre-computed circle */\r
-\r
-    double *sint1,*cost1;\r
-    double *sint2,*cost2;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidSphere" );\r
-\r
-    fghCircleTable(&sint1,&cost1,-slices);\r
-    fghCircleTable(&sint2,&cost2,stacks*2);\r
-\r
-    /* The top stack is covered with a triangle fan */\r
-\r
-    z0 = 1.0;\r
-    z1 = cost2[(stacks>0)?1:0];\r
-    r0 = 0.0;\r
-    r1 = sint2[(stacks>0)?1:0];\r
-\r
-    glBegin(GL_TRIANGLE_FAN);\r
-\r
-        glNormal3d(0,0,1);\r
-        glVertex3d(0,0,radius);\r
-\r
-        for (j=slices; j>=0; j--)\r
-        {\r
-            glNormal3d(cost1[j]*r1,        sint1[j]*r1,        z1       );\r
-            glVertex3d(cost1[j]*r1*radius, sint1[j]*r1*radius, z1*radius);\r
-        }\r
-\r
-    glEnd();\r
-\r
-    /* Cover each stack with a quad strip, except the top and bottom stacks */\r
-\r
-    for( i=1; i<stacks-1; i++ )\r
-    {\r
-        z0 = z1; z1 = cost2[i+1];\r
-        r0 = r1; r1 = sint2[i+1];\r
-\r
-        glBegin(GL_QUAD_STRIP);\r
-\r
-            for(j=0; j<=slices; j++)\r
-            {\r
-                glNormal3d(cost1[j]*r1,        sint1[j]*r1,        z1       );\r
-                glVertex3d(cost1[j]*r1*radius, sint1[j]*r1*radius, z1*radius);\r
-                glNormal3d(cost1[j]*r0,        sint1[j]*r0,        z0       );\r
-                glVertex3d(cost1[j]*r0*radius, sint1[j]*r0*radius, z0*radius);\r
-            }\r
-\r
-        glEnd();\r
-    }\r
-\r
-    /* The bottom stack is covered with a triangle fan */\r
-\r
-    z0 = z1;\r
-    r0 = r1;\r
-\r
-    glBegin(GL_TRIANGLE_FAN);\r
-\r
-        glNormal3d(0,0,-1);\r
-        glVertex3d(0,0,-radius);\r
-\r
-        for (j=0; j<=slices; j++)\r
-        {\r
-            glNormal3d(cost1[j]*r0,        sint1[j]*r0,        z0       );\r
-            glVertex3d(cost1[j]*r0*radius, sint1[j]*r0*radius, z0*radius);\r
-        }\r
-\r
-    glEnd();\r
-\r
-    /* Release sin and cos tables */\r
-\r
-    free(sint1);\r
-    free(cost1);\r
-    free(sint2);\r
-    free(cost2);\r
-}\r
-\r
-/*\r
- * Draws a wire sphere\r
- */\r
-void FGAPIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks)\r
-{\r
-    int i,j;\r
-\r
-    /* Adjust z and radius as stacks and slices are drawn. */\r
-\r
-    double r;\r
-    double x,y,z;\r
-\r
-    /* Pre-computed circle */\r
-\r
-    double *sint1,*cost1;\r
-    double *sint2,*cost2;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireSphere" );\r
-\r
-    fghCircleTable(&sint1,&cost1,-slices  );\r
-    fghCircleTable(&sint2,&cost2, stacks*2);\r
-\r
-    /* Draw a line loop for each stack */\r
-\r
-    for (i=1; i<stacks; i++)\r
-    {\r
-        z = cost2[i];\r
-        r = sint2[i];\r
-\r
-        glBegin(GL_LINE_LOOP);\r
-\r
-            for(j=0; j<=slices; j++)\r
-            {\r
-                x = cost1[j];\r
-                y = sint1[j];\r
-\r
-                glNormal3d(x,y,z);\r
-                glVertex3d(x*r*radius,y*r*radius,z*radius);\r
-            }\r
-\r
-        glEnd();\r
-    }\r
-\r
-    /* Draw a line loop for each slice */\r
-\r
-    for (i=0; i<slices; i++)\r
-    {\r
-        glBegin(GL_LINE_STRIP);\r
-\r
-            for(j=0; j<=stacks; j++)\r
-            {\r
-                x = cost1[i]*sint2[j];\r
-                y = sint1[i]*sint2[j];\r
-                z = cost2[j];\r
-\r
-                glNormal3d(x,y,z);\r
-                glVertex3d(x*radius,y*radius,z*radius);\r
-            }\r
-\r
-        glEnd();\r
-    }\r
-\r
-    /* Release sin and cos tables */\r
-\r
-    free(sint1);\r
-    free(cost1);\r
-    free(sint2);\r
-    free(cost2);\r
-}\r
-\r
-/*\r
- * Draws a solid cone\r
- */\r
-void FGAPIENTRY glutSolidCone( GLdouble base, GLdouble height, GLint slices, GLint stacks )\r
-{\r
-    int i,j;\r
-\r
-    /* Step in z and radius as stacks are drawn. */\r
-\r
-    double z0,z1;\r
-    double r0,r1;\r
-\r
-    const double zStep = height / ( ( stacks > 0 ) ? stacks : 1 );\r
-    const double rStep = base / ( ( stacks > 0 ) ? stacks : 1 );\r
-\r
-    /* Scaling factors for vertex normals */\r
-\r
-    const double cosn = ( height / sqrt ( height * height + base * base ));\r
-    const double sinn = ( base   / sqrt ( height * height + base * base ));\r
-\r
-    /* Pre-computed circle */\r
-\r
-    double *sint,*cost;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidCone" );\r
-\r
-    fghCircleTable(&sint,&cost,-slices);\r
-\r
-    /* Cover the circular base with a triangle fan... */\r
-\r
-    z0 = 0.0;\r
-    z1 = zStep;\r
-\r
-    r0 = base;\r
-    r1 = r0 - rStep;\r
-\r
-    glBegin(GL_TRIANGLE_FAN);\r
-\r
-        glNormal3d(0.0,0.0,-1.0);\r
-        glVertex3d(0.0,0.0, z0 );\r
-\r
-        for (j=0; j<=slices; j++)\r
-            glVertex3d(cost[j]*r0, sint[j]*r0, z0);\r
-\r
-    glEnd();\r
-\r
-    /* Cover each stack with a quad strip, except the top stack */\r
-\r
-    for( i=0; i<stacks-1; i++ )\r
-    {\r
-        glBegin(GL_QUAD_STRIP);\r
-\r
-            for(j=0; j<=slices; j++)\r
-            {\r
-                glNormal3d(cost[j]*cosn, sint[j]*cosn, sinn);\r
-                glVertex3d(cost[j]*r0,   sint[j]*r0,   z0  );\r
-                glVertex3d(cost[j]*r1,   sint[j]*r1,   z1  );\r
-            }\r
-\r
-            z0 = z1; z1 += zStep;\r
-            r0 = r1; r1 -= rStep;\r
-\r
-        glEnd();\r
-    }\r
-\r
-    /* The top stack is covered with individual triangles */\r
-\r
-    glBegin(GL_TRIANGLES);\r
-\r
-        glNormal3d(cost[0]*sinn, sint[0]*sinn, cosn);\r
-\r
-        for (j=0; j<slices; j++)\r
-        {\r
-            glVertex3d(cost[j+0]*r0,   sint[j+0]*r0,   z0    );\r
-            glVertex3d(0,              0,              height);\r
-            glNormal3d(cost[j+1]*sinn, sint[j+1]*sinn, cosn  );\r
-            glVertex3d(cost[j+1]*r0,   sint[j+1]*r0,   z0    );\r
-        }\r
-\r
-    glEnd();\r
-\r
-    /* Release sin and cos tables */\r
-\r
-    free(sint);\r
-    free(cost);\r
-}\r
-\r
-/*\r
- * Draws a wire cone\r
- */\r
-void FGAPIENTRY glutWireCone( GLdouble base, GLdouble height, GLint slices, GLint stacks)\r
-{\r
-    int i,j;\r
-\r
-    /* Step in z and radius as stacks are drawn. */\r
-\r
-    double z = 0.0;\r
-    double r = base;\r
-\r
-    const double zStep = height / ( ( stacks > 0 ) ? stacks : 1 );\r
-    const double rStep = base / ( ( stacks > 0 ) ? stacks : 1 );\r
-\r
-    /* Scaling factors for vertex normals */\r
-\r
-    const double cosn = ( height / sqrt ( height * height + base * base ));\r
-    const double sinn = ( base   / sqrt ( height * height + base * base ));\r
-\r
-    /* Pre-computed circle */\r
-\r
-    double *sint,*cost;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireCone" );\r
-\r
-    fghCircleTable(&sint,&cost,-slices);\r
-\r
-    /* Draw the stacks... */\r
-\r
-    for (i=0; i<stacks; i++)\r
-    {\r
-        glBegin(GL_LINE_LOOP);\r
-\r
-            for( j=0; j<slices; j++ )\r
-            {\r
-                glNormal3d(cost[j]*sinn, sint[j]*sinn, cosn);\r
-                glVertex3d(cost[j]*r,    sint[j]*r,    z   );\r
-            }\r
-\r
-        glEnd();\r
-\r
-        z += zStep;\r
-        r -= rStep;\r
-    }\r
-\r
-    /* Draw the slices */\r
-\r
-    r = base;\r
-\r
-    glBegin(GL_LINES);\r
-\r
-        for (j=0; j<slices; j++)\r
-        {\r
-            glNormal3d(cost[j]*sinn, sint[j]*sinn, cosn  );\r
-            glVertex3d(cost[j]*r,    sint[j]*r,    0.0   );\r
-            glVertex3d(0.0,          0.0,          height);\r
-        }\r
-\r
-    glEnd();\r
-\r
-    /* Release sin and cos tables */\r
-\r
-    free(sint);\r
-    free(cost);\r
-}\r
-\r
-\r
-/*\r
- * Draws a solid cylinder\r
- */\r
-void FGAPIENTRY glutSolidCylinder(GLdouble radius, GLdouble height, GLint slices, GLint stacks)\r
-{\r
-    int i,j;\r
-\r
-    /* Step in z and radius as stacks are drawn. */\r
-\r
-    double z0,z1;\r
-    const double zStep = height / ( ( stacks > 0 ) ? stacks : 1 );\r
-\r
-    /* Pre-computed circle */\r
-\r
-    double *sint,*cost;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidCylinder" );\r
-\r
-    fghCircleTable(&sint,&cost,-slices);\r
-\r
-    /* Cover the base and top */\r
-\r
-    glBegin(GL_TRIANGLE_FAN);\r
-        glNormal3d(0.0, 0.0, -1.0 );\r
-        glVertex3d(0.0, 0.0,  0.0 );\r
-        for (j=0; j<=slices; j++)\r
-          glVertex3d(cost[j]*radius, sint[j]*radius, 0.0);\r
-    glEnd();\r
-\r
-    glBegin(GL_TRIANGLE_FAN);\r
-        glNormal3d(0.0, 0.0, 1.0   );\r
-        glVertex3d(0.0, 0.0, height);\r
-        for (j=slices; j>=0; j--)\r
-          glVertex3d(cost[j]*radius, sint[j]*radius, height);\r
-    glEnd();\r
-\r
-    /* Do the stacks */\r
-\r
-    z0 = 0.0;\r
-    z1 = zStep;\r
-\r
-    for (i=1; i<=stacks; i++)\r
-    {\r
-        if (i==stacks)\r
-            z1 = height;\r
-\r
-        glBegin(GL_QUAD_STRIP);\r
-            for (j=0; j<=slices; j++ )\r
-            {\r
-                glNormal3d(cost[j],        sint[j],        0.0 );\r
-                glVertex3d(cost[j]*radius, sint[j]*radius, z0  );\r
-                glVertex3d(cost[j]*radius, sint[j]*radius, z1  );\r
-            }\r
-        glEnd();\r
-\r
-        z0 = z1; z1 += zStep;\r
-    }\r
-\r
-    /* Release sin and cos tables */\r
-\r
-    free(sint);\r
-    free(cost);\r
-}\r
-\r
-/*\r
- * Draws a wire cylinder\r
- */\r
-void FGAPIENTRY glutWireCylinder(GLdouble radius, GLdouble height, GLint slices, GLint stacks)\r
-{\r
-    int i,j;\r
-\r
-    /* Step in z and radius as stacks are drawn. */\r
-\r
-          double z = 0.0;\r
-    const double zStep = height / ( ( stacks > 0 ) ? stacks : 1 );\r
-\r
-    /* Pre-computed circle */\r
-\r
-    double *sint,*cost;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireCylinder" );\r
-\r
-    fghCircleTable(&sint,&cost,-slices);\r
-\r
-    /* Draw the stacks... */\r
-\r
-    for (i=0; i<=stacks; i++)\r
-    {\r
-        if (i==stacks)\r
-            z = height;\r
-\r
-        glBegin(GL_LINE_LOOP);\r
-\r
-            for( j=0; j<slices; j++ )\r
-            {\r
-                glNormal3d(cost[j],        sint[j],        0.0);\r
-                glVertex3d(cost[j]*radius, sint[j]*radius, z  );\r
-            }\r
-\r
-        glEnd();\r
-\r
-        z += zStep;\r
-    }\r
-\r
-    /* Draw the slices */\r
-\r
-    glBegin(GL_LINES);\r
-\r
-        for (j=0; j<slices; j++)\r
-        {\r
-            glNormal3d(cost[j],        sint[j],        0.0   );\r
-            glVertex3d(cost[j]*radius, sint[j]*radius, 0.0   );\r
-            glVertex3d(cost[j]*radius, sint[j]*radius, height);\r
-        }\r
-\r
-    glEnd();\r
-\r
-    /* Release sin and cos tables */\r
-\r
-    free(sint);\r
-    free(cost);\r
-}\r
-\r
-/*\r
- * Draws a wire torus\r
- */\r
-void FGAPIENTRY glutWireTorus( GLdouble dInnerRadius, GLdouble dOuterRadius, GLint nSides, GLint nRings )\r
-{\r
-  double  iradius = dInnerRadius, oradius = dOuterRadius, phi, psi, dpsi, dphi;\r
-  double *vertex, *normal;\r
-  int    i, j;\r
-  double spsi, cpsi, sphi, cphi ;\r
-\r
-  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireTorus" );\r
-\r
-  if ( nSides < 1 ) nSides = 1;\r
-  if ( nRings < 1 ) nRings = 1;\r
-\r
-  /* Allocate the vertices array */\r
-  vertex = (double *)calloc( sizeof(double), 3 * nSides * nRings );\r
-  normal = (double *)calloc( sizeof(double), 3 * nSides * nRings );\r
-\r
-  glPushMatrix();\r
-\r
-  dpsi =  2.0 * M_PI / (double)nRings ;\r
-  dphi = -2.0 * M_PI / (double)nSides ;\r
-  psi  = 0.0;\r
-\r
-  for( j=0; j<nRings; j++ )\r
-  {\r
-    cpsi = cos ( psi ) ;\r
-    spsi = sin ( psi ) ;\r
-    phi = 0.0;\r
-\r
-    for( i=0; i<nSides; i++ )\r
-    {\r
-      int offset = 3 * ( j * nSides + i ) ;\r
-      cphi = cos ( phi ) ;\r
-      sphi = sin ( phi ) ;\r
-      *(vertex + offset + 0) = cpsi * ( oradius + cphi * iradius ) ;\r
-      *(vertex + offset + 1) = spsi * ( oradius + cphi * iradius ) ;\r
-      *(vertex + offset + 2) =                    sphi * iradius  ;\r
-      *(normal + offset + 0) = cpsi * cphi ;\r
-      *(normal + offset + 1) = spsi * cphi ;\r
-      *(normal + offset + 2) =        sphi ;\r
-      phi += dphi;\r
-    }\r
-\r
-    psi += dpsi;\r
-  }\r
-\r
-  for( i=0; i<nSides; i++ )\r
-  {\r
-    glBegin( GL_LINE_LOOP );\r
-\r
-    for( j=0; j<nRings; j++ )\r
-    {\r
-      int offset = 3 * ( j * nSides + i ) ;\r
-      glNormal3dv( normal + offset );\r
-      glVertex3dv( vertex + offset );\r
-    }\r
-\r
-    glEnd();\r
-  }\r
-\r
-  for( j=0; j<nRings; j++ )\r
-  {\r
-    glBegin(GL_LINE_LOOP);\r
-\r
-    for( i=0; i<nSides; i++ )\r
-    {\r
-      int offset = 3 * ( j * nSides + i ) ;\r
-      glNormal3dv( normal + offset );\r
-      glVertex3dv( vertex + offset );\r
-    }\r
-\r
-    glEnd();\r
-  }\r
-\r
-  free ( vertex ) ;\r
-  free ( normal ) ;\r
-  glPopMatrix();\r
-}\r
-\r
-/*\r
- * Draws a solid torus\r
- */\r
-void FGAPIENTRY glutSolidTorus( GLdouble dInnerRadius, GLdouble dOuterRadius, GLint nSides, GLint nRings )\r
-{\r
-  double  iradius = dInnerRadius, oradius = dOuterRadius, phi, psi, dpsi, dphi;\r
-  double *vertex, *normal;\r
-  int    i, j;\r
-  double spsi, cpsi, sphi, cphi ;\r
-\r
-  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidTorus" );\r
-\r
-  if ( nSides < 1 ) nSides = 1;\r
-  if ( nRings < 1 ) nRings = 1;\r
-\r
-  /* Increment the number of sides and rings to allow for one more point than surface */\r
-  nSides ++ ;\r
-  nRings ++ ;\r
-\r
-  /* Allocate the vertices array */\r
-  vertex = (double *)calloc( sizeof(double), 3 * nSides * nRings );\r
-  normal = (double *)calloc( sizeof(double), 3 * nSides * nRings );\r
-\r
-  glPushMatrix();\r
-\r
-  dpsi =  2.0 * M_PI / (double)(nRings - 1) ;\r
-  dphi = -2.0 * M_PI / (double)(nSides - 1) ;\r
-  psi  = 0.0;\r
-\r
-  for( j=0; j<nRings; j++ )\r
-  {\r
-    cpsi = cos ( psi ) ;\r
-    spsi = sin ( psi ) ;\r
-    phi = 0.0;\r
-\r
-    for( i=0; i<nSides; i++ )\r
-    {\r
-      int offset = 3 * ( j * nSides + i ) ;\r
-      cphi = cos ( phi ) ;\r
-      sphi = sin ( phi ) ;\r
-      *(vertex + offset + 0) = cpsi * ( oradius + cphi * iradius ) ;\r
-      *(vertex + offset + 1) = spsi * ( oradius + cphi * iradius ) ;\r
-      *(vertex + offset + 2) =                    sphi * iradius  ;\r
-      *(normal + offset + 0) = cpsi * cphi ;\r
-      *(normal + offset + 1) = spsi * cphi ;\r
-      *(normal + offset + 2) =        sphi ;\r
-      phi += dphi;\r
-    }\r
-\r
-    psi += dpsi;\r
-  }\r
-\r
-    glBegin( GL_QUADS );\r
-  for( i=0; i<nSides-1; i++ )\r
-  {\r
-    for( j=0; j<nRings-1; j++ )\r
-    {\r
-      int offset = 3 * ( j * nSides + i ) ;\r
-      glNormal3dv( normal + offset );\r
-      glVertex3dv( vertex + offset );\r
-      glNormal3dv( normal + offset + 3 );\r
-      glVertex3dv( vertex + offset + 3 );\r
-      glNormal3dv( normal + offset + 3 * nSides + 3 );\r
-      glVertex3dv( vertex + offset + 3 * nSides + 3 );\r
-      glNormal3dv( normal + offset + 3 * nSides );\r
-      glVertex3dv( vertex + offset + 3 * nSides );\r
-    }\r
-  }\r
-\r
-  glEnd();\r
-\r
-  free ( vertex ) ;\r
-  free ( normal ) ;\r
-  glPopMatrix();\r
-}\r
-\r
-/*\r
- *\r
- */\r
-void FGAPIENTRY glutWireDodecahedron( void )\r
-{\r
-  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireDodecahedron" );\r
-\r
-  /* Magic Numbers:  It is possible to create a dodecahedron by attaching two pentagons to each face of\r
-   * of a cube.  The coordinates of the points are:\r
-   *   (+-x,0, z); (+-1, 1, 1); (0, z, x )\r
-   * where x = (-1 + sqrt(5))/2, z = (1 + sqrt(5))/2  or\r
-   *       x = 0.61803398875 and z = 1.61803398875.\r
-   */\r
-  glBegin ( GL_LINE_LOOP ) ;\r
-  glNormal3d (  0.0,  0.525731112119,  0.850650808354 ) ; glVertex3d (  0.0,  1.61803398875,  0.61803398875 ) ; glVertex3d ( -1.0,  1.0,  1.0 ) ; glVertex3d ( -0.61803398875, 0.0,  1.61803398875 ) ; glVertex3d (  0.61803398875, 0.0,  1.61803398875 ) ; glVertex3d (  1.0,  1.0,  1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_LINE_LOOP ) ;\r
-  glNormal3d (  0.0,  0.525731112119, -0.850650808354 ) ; glVertex3d (  0.0,  1.61803398875, -0.61803398875 ) ; glVertex3d (  1.0,  1.0, -1.0 ) ; glVertex3d (  0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( -0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( -1.0,  1.0, -1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_LINE_LOOP ) ;\r
-  glNormal3d (  0.0, -0.525731112119,  0.850650808354 ) ; glVertex3d (  0.0, -1.61803398875,  0.61803398875 ) ; glVertex3d (  1.0, -1.0,  1.0 ) ; glVertex3d (  0.61803398875, 0.0,  1.61803398875 ) ; glVertex3d ( -0.61803398875, 0.0,  1.61803398875 ) ; glVertex3d ( -1.0, -1.0,  1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_LINE_LOOP ) ;\r
-  glNormal3d (  0.0, -0.525731112119, -0.850650808354 ) ; glVertex3d (  0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( -0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d (  0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d (  1.0, -1.0, -1.0 ) ;\r
-  glEnd () ;\r
-\r
-  glBegin ( GL_LINE_LOOP ) ;\r
-  glNormal3d (  0.850650808354,  0.0,  0.525731112119 ) ; glVertex3d (  0.61803398875,  0.0,  1.61803398875 ) ; glVertex3d (  1.0, -1.0,  1.0 ) ; glVertex3d (  1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d (  1.61803398875,  0.61803398875, 0.0 ) ; glVertex3d (  1.0,  1.0,  1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_LINE_LOOP ) ;\r
-  glNormal3d ( -0.850650808354,  0.0,  0.525731112119 ) ; glVertex3d ( -0.61803398875,  0.0,  1.61803398875 ) ; glVertex3d ( -1.0,  1.0,  1.0 ) ; glVertex3d ( -1.61803398875,  0.61803398875, 0.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( -1.0, -1.0,  1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_LINE_LOOP ) ;\r
-  glNormal3d (  0.850650808354,  0.0, -0.525731112119 ) ; glVertex3d (  0.61803398875,  0.0, -1.61803398875 ) ; glVertex3d (  1.0,  1.0, -1.0 ) ; glVertex3d (  1.61803398875,  0.61803398875, 0.0 ) ; glVertex3d (  1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d (  1.0, -1.0, -1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_LINE_LOOP ) ;\r
-  glNormal3d ( -0.850650808354,  0.0, -0.525731112119 ) ; glVertex3d ( -0.61803398875,  0.0, -1.61803398875 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( -1.61803398875,  0.61803398875, 0.0 ) ; glVertex3d ( -1.0,  1.0, -1.0 ) ;\r
-  glEnd () ;\r
-\r
-  glBegin ( GL_LINE_LOOP ) ;\r
-  glNormal3d (  0.525731112119,  0.850650808354,  0.0 ) ; glVertex3d (  1.61803398875,  0.61803398875,  0.0 ) ; glVertex3d (  1.0,  1.0, -1.0 ) ; glVertex3d ( 0.0,  1.61803398875, -0.61803398875 ) ; glVertex3d ( 0.0,  1.61803398875,  0.61803398875 ) ; glVertex3d (  1.0,  1.0,  1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_LINE_LOOP ) ;\r
-  glNormal3d (  0.525731112119, -0.850650808354,  0.0 ) ; glVertex3d (  1.61803398875, -0.61803398875,  0.0 ) ; glVertex3d (  1.0, -1.0,  1.0 ) ; glVertex3d ( 0.0, -1.61803398875,  0.61803398875 ) ; glVertex3d ( 0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d (  1.0, -1.0, -1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_LINE_LOOP ) ;\r
-  glNormal3d ( -0.525731112119,  0.850650808354,  0.0 ) ; glVertex3d ( -1.61803398875,  0.61803398875,  0.0 ) ; glVertex3d ( -1.0,  1.0,  1.0 ) ; glVertex3d ( 0.0,  1.61803398875,  0.61803398875 ) ; glVertex3d ( 0.0,  1.61803398875, -0.61803398875 ) ; glVertex3d ( -1.0,  1.0, -1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_LINE_LOOP ) ;\r
-  glNormal3d ( -0.525731112119, -0.850650808354,  0.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875,  0.0 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( 0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d ( 0.0, -1.61803398875,  0.61803398875 ) ; glVertex3d ( -1.0, -1.0,  1.0 ) ;\r
-  glEnd () ;\r
-}\r
-\r
-/*\r
- *\r
- */\r
-void FGAPIENTRY glutSolidDodecahedron( void )\r
-{\r
-  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidDodecahedron" );\r
-\r
-  /* Magic Numbers:  It is possible to create a dodecahedron by attaching two pentagons to each face of\r
-   * of a cube.  The coordinates of the points are:\r
-   *   (+-x,0, z); (+-1, 1, 1); (0, z, x )\r
-   * where x = (-1 + sqrt(5))/2, z = (1 + sqrt(5))/2 or\r
-   *       x = 0.61803398875 and z = 1.61803398875.\r
-   */\r
-  glBegin ( GL_POLYGON ) ;\r
-  glNormal3d (  0.0,  0.525731112119,  0.850650808354 ) ; glVertex3d (  0.0,  1.61803398875,  0.61803398875 ) ; glVertex3d ( -1.0,  1.0,  1.0 ) ; glVertex3d ( -0.61803398875, 0.0,  1.61803398875 ) ; glVertex3d (  0.61803398875, 0.0,  1.61803398875 ) ; glVertex3d (  1.0,  1.0,  1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_POLYGON ) ;\r
-  glNormal3d (  0.0,  0.525731112119, -0.850650808354 ) ; glVertex3d (  0.0,  1.61803398875, -0.61803398875 ) ; glVertex3d (  1.0,  1.0, -1.0 ) ; glVertex3d (  0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( -0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( -1.0,  1.0, -1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_POLYGON ) ;\r
-  glNormal3d (  0.0, -0.525731112119,  0.850650808354 ) ; glVertex3d (  0.0, -1.61803398875,  0.61803398875 ) ; glVertex3d (  1.0, -1.0,  1.0 ) ; glVertex3d (  0.61803398875, 0.0,  1.61803398875 ) ; glVertex3d ( -0.61803398875, 0.0,  1.61803398875 ) ; glVertex3d ( -1.0, -1.0,  1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_POLYGON ) ;\r
-  glNormal3d (  0.0, -0.525731112119, -0.850650808354 ) ; glVertex3d (  0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( -0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d (  0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d (  1.0, -1.0, -1.0 ) ;\r
-  glEnd () ;\r
-\r
-  glBegin ( GL_POLYGON ) ;\r
-  glNormal3d (  0.850650808354,  0.0,  0.525731112119 ) ; glVertex3d (  0.61803398875,  0.0,  1.61803398875 ) ; glVertex3d (  1.0, -1.0,  1.0 ) ; glVertex3d (  1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d (  1.61803398875,  0.61803398875, 0.0 ) ; glVertex3d (  1.0,  1.0,  1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_POLYGON ) ;\r
-  glNormal3d ( -0.850650808354,  0.0,  0.525731112119 ) ; glVertex3d ( -0.61803398875,  0.0,  1.61803398875 ) ; glVertex3d ( -1.0,  1.0,  1.0 ) ; glVertex3d ( -1.61803398875,  0.61803398875, 0.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( -1.0, -1.0,  1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_POLYGON ) ;\r
-  glNormal3d (  0.850650808354,  0.0, -0.525731112119 ) ; glVertex3d (  0.61803398875,  0.0, -1.61803398875 ) ; glVertex3d (  1.0,  1.0, -1.0 ) ; glVertex3d (  1.61803398875,  0.61803398875, 0.0 ) ; glVertex3d (  1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d (  1.0, -1.0, -1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_POLYGON ) ;\r
-  glNormal3d ( -0.850650808354,  0.0, -0.525731112119 ) ; glVertex3d ( -0.61803398875,  0.0, -1.61803398875 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( -1.61803398875,  0.61803398875, 0.0 ) ; glVertex3d ( -1.0,  1.0, -1.0 ) ;\r
-  glEnd () ;\r
-\r
-  glBegin ( GL_POLYGON ) ;\r
-  glNormal3d (  0.525731112119,  0.850650808354,  0.0 ) ; glVertex3d (  1.61803398875,  0.61803398875,  0.0 ) ; glVertex3d (  1.0,  1.0, -1.0 ) ; glVertex3d ( 0.0,  1.61803398875, -0.61803398875 ) ; glVertex3d ( 0.0,  1.61803398875,  0.61803398875 ) ; glVertex3d (  1.0,  1.0,  1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_POLYGON ) ;\r
-  glNormal3d (  0.525731112119, -0.850650808354,  0.0 ) ; glVertex3d (  1.61803398875, -0.61803398875,  0.0 ) ; glVertex3d (  1.0, -1.0,  1.0 ) ; glVertex3d ( 0.0, -1.61803398875,  0.61803398875 ) ; glVertex3d ( 0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d (  1.0, -1.0, -1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_POLYGON ) ;\r
-  glNormal3d ( -0.525731112119,  0.850650808354,  0.0 ) ; glVertex3d ( -1.61803398875,  0.61803398875,  0.0 ) ; glVertex3d ( -1.0,  1.0,  1.0 ) ; glVertex3d ( 0.0,  1.61803398875,  0.61803398875 ) ; glVertex3d ( 0.0,  1.61803398875, -0.61803398875 ) ; glVertex3d ( -1.0,  1.0, -1.0 ) ;\r
-  glEnd () ;\r
-  glBegin ( GL_POLYGON ) ;\r
-  glNormal3d ( -0.525731112119, -0.850650808354,  0.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875,  0.0 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( 0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d ( 0.0, -1.61803398875,  0.61803398875 ) ; glVertex3d ( -1.0, -1.0,  1.0 ) ;\r
-  glEnd () ;\r
-}\r
-\r
-/*\r
- *\r
- */\r
-void FGAPIENTRY glutWireOctahedron( void )\r
-{\r
-  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireOctahedron" );\r
-\r
-#define RADIUS    1.0f\r
-  glBegin( GL_LINE_LOOP );\r
-    glNormal3d( 0.577350269189, 0.577350269189, 0.577350269189); glVertex3d( RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, RADIUS, 0.0 ); glVertex3d( 0.0, 0.0, RADIUS );\r
-    glNormal3d( 0.577350269189, 0.577350269189,-0.577350269189); glVertex3d( RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, 0.0,-RADIUS ); glVertex3d( 0.0, RADIUS, 0.0 );\r
-    glNormal3d( 0.577350269189,-0.577350269189, 0.577350269189); glVertex3d( RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, 0.0, RADIUS ); glVertex3d( 0.0,-RADIUS, 0.0 );\r
-    glNormal3d( 0.577350269189,-0.577350269189,-0.577350269189); glVertex3d( RADIUS, 0.0, 0.0 ); glVertex3d( 0.0,-RADIUS, 0.0 ); glVertex3d( 0.0, 0.0,-RADIUS );\r
-    glNormal3d(-0.577350269189, 0.577350269189, 0.577350269189); glVertex3d(-RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, 0.0, RADIUS ); glVertex3d( 0.0, RADIUS, 0.0 );\r
-    glNormal3d(-0.577350269189, 0.577350269189,-0.577350269189); glVertex3d(-RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, RADIUS, 0.0 ); glVertex3d( 0.0, 0.0,-RADIUS );\r
-    glNormal3d(-0.577350269189,-0.577350269189, 0.577350269189); glVertex3d(-RADIUS, 0.0, 0.0 ); glVertex3d( 0.0,-RADIUS, 0.0 ); glVertex3d( 0.0, 0.0, RADIUS );\r
-    glNormal3d(-0.577350269189,-0.577350269189,-0.577350269189); glVertex3d(-RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, 0.0,-RADIUS ); glVertex3d( 0.0,-RADIUS, 0.0 );\r
-  glEnd();\r
-#undef RADIUS\r
-}\r
-\r
-/*\r
- *\r
- */\r
-void FGAPIENTRY glutSolidOctahedron( void )\r
-{\r
-  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidOctahedron" );\r
-\r
-#define RADIUS    1.0f\r
-  glBegin( GL_TRIANGLES );\r
-    glNormal3d( 0.577350269189, 0.577350269189, 0.577350269189); glVertex3d( RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, RADIUS, 0.0 ); glVertex3d( 0.0, 0.0, RADIUS );\r
-    glNormal3d( 0.577350269189, 0.577350269189,-0.577350269189); glVertex3d( RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, 0.0,-RADIUS ); glVertex3d( 0.0, RADIUS, 0.0 );\r
-    glNormal3d( 0.577350269189,-0.577350269189, 0.577350269189); glVertex3d( RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, 0.0, RADIUS ); glVertex3d( 0.0,-RADIUS, 0.0 );\r
-    glNormal3d( 0.577350269189,-0.577350269189,-0.577350269189); glVertex3d( RADIUS, 0.0, 0.0 ); glVertex3d( 0.0,-RADIUS, 0.0 ); glVertex3d( 0.0, 0.0,-RADIUS );\r
-    glNormal3d(-0.577350269189, 0.577350269189, 0.577350269189); glVertex3d(-RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, 0.0, RADIUS ); glVertex3d( 0.0, RADIUS, 0.0 );\r
-    glNormal3d(-0.577350269189, 0.577350269189,-0.577350269189); glVertex3d(-RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, RADIUS, 0.0 ); glVertex3d( 0.0, 0.0,-RADIUS );\r
-    glNormal3d(-0.577350269189,-0.577350269189, 0.577350269189); glVertex3d(-RADIUS, 0.0, 0.0 ); glVertex3d( 0.0,-RADIUS, 0.0 ); glVertex3d( 0.0, 0.0, RADIUS );\r
-    glNormal3d(-0.577350269189,-0.577350269189,-0.577350269189); glVertex3d(-RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, 0.0,-RADIUS ); glVertex3d( 0.0,-RADIUS, 0.0 );\r
-  glEnd();\r
-#undef RADIUS\r
-}\r
-\r
-/* Magic Numbers:  r0 = ( 1, 0, 0 )\r
- *                 r1 = ( -1/3, 2 sqrt(2) / 3, 0 )\r
- *                 r2 = ( -1/3, -sqrt(2) / 3, sqrt(6) / 3 )\r
- *                 r3 = ( -1/3, -sqrt(2) / 3, -sqrt(6) / 3 )\r
- * |r0| = |r1| = |r2| = |r3| = 1\r
- * Distance between any two points is 2 sqrt(6) / 3\r
- *\r
- * Normals:  The unit normals are simply the negative of the coordinates of the point not on the surface.\r
- */\r
-\r
-#define NUM_TETR_FACES     4\r
-\r
-static GLdouble tet_r[4][3] = { {             1.0,             0.0,             0.0 },\r
-                                { -0.333333333333,  0.942809041582,             0.0 },\r
-                                { -0.333333333333, -0.471404520791,  0.816496580928 },\r
-                                { -0.333333333333, -0.471404520791, -0.816496580928 } } ;\r
-\r
-static GLint tet_i[4][3] =  /* Vertex indices */\r
-{\r
-  { 1, 3, 2 }, { 0, 2, 3 }, { 0, 3, 1 }, { 0, 1, 2 }\r
-} ;\r
-\r
-/*\r
- *\r
- */\r
-void FGAPIENTRY glutWireTetrahedron( void )\r
-{\r
-  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireTetrahedron" );\r
-\r
-  glBegin( GL_LINE_LOOP ) ;\r
-    glNormal3d ( -tet_r[0][0], -tet_r[0][1], -tet_r[0][2] ) ; glVertex3dv ( tet_r[1] ) ; glVertex3dv ( tet_r[3] ) ; glVertex3dv ( tet_r[2] ) ;\r
-    glNormal3d ( -tet_r[1][0], -tet_r[1][1], -tet_r[1][2] ) ; glVertex3dv ( tet_r[0] ) ; glVertex3dv ( tet_r[2] ) ; glVertex3dv ( tet_r[3] ) ;\r
-    glNormal3d ( -tet_r[2][0], -tet_r[2][1], -tet_r[2][2] ) ; glVertex3dv ( tet_r[0] ) ; glVertex3dv ( tet_r[3] ) ; glVertex3dv ( tet_r[1] ) ;\r
-    glNormal3d ( -tet_r[3][0], -tet_r[3][1], -tet_r[3][2] ) ; glVertex3dv ( tet_r[0] ) ; glVertex3dv ( tet_r[1] ) ; glVertex3dv ( tet_r[2] ) ;\r
-  glEnd() ;\r
-}\r
-\r
-/*\r
- *\r
- */\r
-void FGAPIENTRY glutSolidTetrahedron( void )\r
-{\r
-  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidTetrahedron" );\r
-\r
-  glBegin( GL_TRIANGLES ) ;\r
-    glNormal3d ( -tet_r[0][0], -tet_r[0][1], -tet_r[0][2] ) ; glVertex3dv ( tet_r[1] ) ; glVertex3dv ( tet_r[3] ) ; glVertex3dv ( tet_r[2] ) ;\r
-    glNormal3d ( -tet_r[1][0], -tet_r[1][1], -tet_r[1][2] ) ; glVertex3dv ( tet_r[0] ) ; glVertex3dv ( tet_r[2] ) ; glVertex3dv ( tet_r[3] ) ;\r
-    glNormal3d ( -tet_r[2][0], -tet_r[2][1], -tet_r[2][2] ) ; glVertex3dv ( tet_r[0] ) ; glVertex3dv ( tet_r[3] ) ; glVertex3dv ( tet_r[1] ) ;\r
-    glNormal3d ( -tet_r[3][0], -tet_r[3][1], -tet_r[3][2] ) ; glVertex3dv ( tet_r[0] ) ; glVertex3dv ( tet_r[1] ) ; glVertex3dv ( tet_r[2] ) ;\r
-  glEnd() ;\r
-}\r
-\r
-/*\r
- *\r
- */\r
-static double icos_r[12][3] = {\r
-    {  1.0,             0.0,             0.0            },\r
-    {  0.447213595500,  0.894427191000,  0.0            },\r
-    {  0.447213595500,  0.276393202252,  0.850650808354 },\r
-    {  0.447213595500, -0.723606797748,  0.525731112119 },\r
-    {  0.447213595500, -0.723606797748, -0.525731112119 },\r
-    {  0.447213595500,  0.276393202252, -0.850650808354 },\r
-    { -0.447213595500, -0.894427191000,  0.0 },\r
-    { -0.447213595500, -0.276393202252,  0.850650808354 },\r
-    { -0.447213595500,  0.723606797748,  0.525731112119 },\r
-    { -0.447213595500,  0.723606797748, -0.525731112119 },\r
-    { -0.447213595500, -0.276393202252, -0.850650808354 },\r
-    { -1.0,             0.0,             0.0            }\r
-};\r
-\r
-static int icos_v [20][3] = {\r
-    {  0,  1,  2 },\r
-    {  0,  2,  3 },\r
-    {  0,  3,  4 },\r
-    {  0,  4,  5 },\r
-    {  0,  5,  1 },\r
-    {  1,  8,  2 },\r
-    {  2,  7,  3 },\r
-    {  3,  6,  4 },\r
-    {  4, 10,  5 },\r
-    {  5,  9,  1 },\r
-    {  1,  9,  8 },\r
-    {  2,  8,  7 },\r
-    {  3,  7,  6 },\r
-    {  4,  6, 10 },\r
-    {  5, 10,  9 },\r
-    { 11,  9, 10 },\r
-    { 11,  8,  9 },\r
-    { 11,  7,  8 },\r
-    { 11,  6,  7 },\r
-    { 11, 10,  6 }\r
-};\r
-\r
-void FGAPIENTRY glutWireIcosahedron( void )\r
-{\r
-  int i ;\r
-\r
-  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireIcosahedron" );\r
-\r
-  for ( i = 0; i < 20; i++ )\r
-  {\r
-    double normal[3] ;\r
-    normal[0] = ( icos_r[icos_v[i][1]][1] - icos_r[icos_v[i][0]][1] ) * ( icos_r[icos_v[i][2]][2] - icos_r[icos_v[i][0]][2] ) - ( icos_r[icos_v[i][1]][2] - icos_r[icos_v[i][0]][2] ) * ( icos_r[icos_v[i][2]][1] - icos_r[icos_v[i][0]][1] ) ;\r
-    normal[1] = ( icos_r[icos_v[i][1]][2] - icos_r[icos_v[i][0]][2] ) * ( icos_r[icos_v[i][2]][0] - icos_r[icos_v[i][0]][0] ) - ( icos_r[icos_v[i][1]][0] - icos_r[icos_v[i][0]][0] ) * ( icos_r[icos_v[i][2]][2] - icos_r[icos_v[i][0]][2] ) ;\r
-    normal[2] = ( icos_r[icos_v[i][1]][0] - icos_r[icos_v[i][0]][0] ) * ( icos_r[icos_v[i][2]][1] - icos_r[icos_v[i][0]][1] ) - ( icos_r[icos_v[i][1]][1] - icos_r[icos_v[i][0]][1] ) * ( icos_r[icos_v[i][2]][0] - icos_r[icos_v[i][0]][0] ) ;\r
-    glBegin ( GL_LINE_LOOP ) ;\r
-      glNormal3dv ( normal ) ;\r
-      glVertex3dv ( icos_r[icos_v[i][0]] ) ;\r
-      glVertex3dv ( icos_r[icos_v[i][1]] ) ;\r
-      glVertex3dv ( icos_r[icos_v[i][2]] ) ;\r
-    glEnd () ;\r
-  }\r
-}\r
-\r
-/*\r
- *\r
- */\r
-void FGAPIENTRY glutSolidIcosahedron( void )\r
-{\r
-  int i ;\r
-\r
-  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidIcosahedron" );\r
-\r
-  glBegin ( GL_TRIANGLES ) ;\r
-  for ( i = 0; i < 20; i++ )\r
-  {\r
-    double normal[3] ;\r
-    normal[0] = ( icos_r[icos_v[i][1]][1] - icos_r[icos_v[i][0]][1] ) * ( icos_r[icos_v[i][2]][2] - icos_r[icos_v[i][0]][2] ) - ( icos_r[icos_v[i][1]][2] - icos_r[icos_v[i][0]][2] ) * ( icos_r[icos_v[i][2]][1] - icos_r[icos_v[i][0]][1] ) ;\r
-    normal[1] = ( icos_r[icos_v[i][1]][2] - icos_r[icos_v[i][0]][2] ) * ( icos_r[icos_v[i][2]][0] - icos_r[icos_v[i][0]][0] ) - ( icos_r[icos_v[i][1]][0] - icos_r[icos_v[i][0]][0] ) * ( icos_r[icos_v[i][2]][2] - icos_r[icos_v[i][0]][2] ) ;\r
-    normal[2] = ( icos_r[icos_v[i][1]][0] - icos_r[icos_v[i][0]][0] ) * ( icos_r[icos_v[i][2]][1] - icos_r[icos_v[i][0]][1] ) - ( icos_r[icos_v[i][1]][1] - icos_r[icos_v[i][0]][1] ) * ( icos_r[icos_v[i][2]][0] - icos_r[icos_v[i][0]][0] ) ;\r
-      glNormal3dv ( normal ) ;\r
-      glVertex3dv ( icos_r[icos_v[i][0]] ) ;\r
-      glVertex3dv ( icos_r[icos_v[i][1]] ) ;\r
-      glVertex3dv ( icos_r[icos_v[i][2]] ) ;\r
-  }\r
-\r
-  glEnd () ;\r
-}\r
-\r
-/*\r
- *\r
- */\r
-static double rdod_r[14][3] = {\r
-    {  0.0,             0.0,             1.0 },\r
-    {  0.707106781187,  0.000000000000,  0.5 },\r
-    {  0.000000000000,  0.707106781187,  0.5 },\r
-    { -0.707106781187,  0.000000000000,  0.5 },\r
-    {  0.000000000000, -0.707106781187,  0.5 },\r
-    {  0.707106781187,  0.707106781187,  0.0 },\r
-    { -0.707106781187,  0.707106781187,  0.0 },\r
-    { -0.707106781187, -0.707106781187,  0.0 },\r
-    {  0.707106781187, -0.707106781187,  0.0 },\r
-    {  0.707106781187,  0.000000000000, -0.5 },\r
-    {  0.000000000000,  0.707106781187, -0.5 },\r
-    { -0.707106781187,  0.000000000000, -0.5 },\r
-    {  0.000000000000, -0.707106781187, -0.5 },\r
-    {  0.0,             0.0,            -1.0 }\r
-} ;\r
-\r
-static int rdod_v [12][4] = {\r
-    { 0,  1,  5,  2 },\r
-    { 0,  2,  6,  3 },\r
-    { 0,  3,  7,  4 },\r
-    { 0,  4,  8,  1 },\r
-    { 5, 10,  6,  2 },\r
-    { 6, 11,  7,  3 },\r
-    { 7, 12,  8,  4 },\r
-    { 8,  9,  5,  1 },\r
-    { 5,  9, 13, 10 },\r
-    { 6, 10, 13, 11 },\r
-    { 7, 11, 13, 12 },\r
-    { 8, 12, 13,  9 }\r
-};\r
-\r
-static double rdod_n[12][3] = {\r
-    {  0.353553390594,  0.353553390594,  0.5 },\r
-    { -0.353553390594,  0.353553390594,  0.5 },\r
-    { -0.353553390594, -0.353553390594,  0.5 },\r
-    {  0.353553390594, -0.353553390594,  0.5 },\r
-    {  0.000000000000,  1.000000000000,  0.0 },\r
-    { -1.000000000000,  0.000000000000,  0.0 },\r
-    {  0.000000000000, -1.000000000000,  0.0 },\r
-    {  1.000000000000,  0.000000000000,  0.0 },\r
-    {  0.353553390594,  0.353553390594, -0.5 },\r
-    { -0.353553390594,  0.353553390594, -0.5 },\r
-    { -0.353553390594, -0.353553390594, -0.5 },\r
-    {  0.353553390594, -0.353553390594, -0.5 }\r
-};\r
-\r
-void FGAPIENTRY glutWireRhombicDodecahedron( void )\r
-{\r
-  int i ;\r
-\r
-  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireRhombicDodecahedron" );\r
-\r
-  for ( i = 0; i < 12; i++ )\r
-  {\r
-    glBegin ( GL_LINE_LOOP ) ;\r
-      glNormal3dv ( rdod_n[i] ) ;\r
-      glVertex3dv ( rdod_r[rdod_v[i][0]] ) ;\r
-      glVertex3dv ( rdod_r[rdod_v[i][1]] ) ;\r
-      glVertex3dv ( rdod_r[rdod_v[i][2]] ) ;\r
-      glVertex3dv ( rdod_r[rdod_v[i][3]] ) ;\r
-    glEnd () ;\r
-  }\r
-}\r
-\r
-/*\r
- *\r
- */\r
-void FGAPIENTRY glutSolidRhombicDodecahedron( void )\r
-{\r
-  int i ;\r
-\r
-  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidRhombicDodecahedron" );\r
-\r
-  glBegin ( GL_QUADS ) ;\r
-  for ( i = 0; i < 12; i++ )\r
-  {\r
-      glNormal3dv ( rdod_n[i] ) ;\r
-      glVertex3dv ( rdod_r[rdod_v[i][0]] ) ;\r
-      glVertex3dv ( rdod_r[rdod_v[i][1]] ) ;\r
-      glVertex3dv ( rdod_r[rdod_v[i][2]] ) ;\r
-      glVertex3dv ( rdod_r[rdod_v[i][3]] ) ;\r
-  }\r
-\r
-  glEnd () ;\r
-}\r
-\r
-void FGAPIENTRY glutWireSierpinskiSponge ( int num_levels, GLdouble offset[3], GLdouble scale )\r
-{\r
-  int i, j ;\r
-\r
-  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireSierpinskiSponge" );\r
-\r
-  if ( num_levels == 0 )\r
-  {\r
-\r
-    for ( i = 0 ; i < NUM_TETR_FACES ; i++ )\r
-    {\r
-      glBegin ( GL_LINE_LOOP ) ;\r
-      glNormal3d ( -tet_r[i][0], -tet_r[i][1], -tet_r[i][2] ) ;\r
-      for ( j = 0; j < 3; j++ )\r
-      {\r
-        double x = offset[0] + scale * tet_r[tet_i[i][j]][0] ;\r
-        double y = offset[1] + scale * tet_r[tet_i[i][j]][1] ;\r
-        double z = offset[2] + scale * tet_r[tet_i[i][j]][2] ;\r
-        glVertex3d ( x, y, z ) ;\r
-      }\r
-\r
-      glEnd () ;\r
-    }\r
-  }\r
-  else if ( num_levels > 0 )\r
-  {\r
-    GLdouble local_offset[3] ;  /* Use a local variable to avoid buildup of roundoff errors */\r
-    num_levels -- ;\r
-    scale /= 2.0 ;\r
-    for ( i = 0 ; i < NUM_TETR_FACES ; i++ )\r
-    {\r
-      local_offset[0] = offset[0] + scale * tet_r[i][0] ;\r
-      local_offset[1] = offset[1] + scale * tet_r[i][1] ;\r
-      local_offset[2] = offset[2] + scale * tet_r[i][2] ;\r
-      glutWireSierpinskiSponge ( num_levels, local_offset, scale ) ;\r
-    }\r
-  }\r
-}\r
-\r
-void FGAPIENTRY glutSolidSierpinskiSponge ( int num_levels, GLdouble offset[3], GLdouble scale )\r
-{\r
-  int i, j ;\r
-\r
-  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidSierpinskiSponge" );\r
-\r
-  if ( num_levels == 0 )\r
-  {\r
-    glBegin ( GL_TRIANGLES ) ;\r
-\r
-    for ( i = 0 ; i < NUM_TETR_FACES ; i++ )\r
-    {\r
-      glNormal3d ( -tet_r[i][0], -tet_r[i][1], -tet_r[i][2] ) ;\r
-      for ( j = 0; j < 3; j++ )\r
-      {\r
-        double x = offset[0] + scale * tet_r[tet_i[i][j]][0] ;\r
-        double y = offset[1] + scale * tet_r[tet_i[i][j]][1] ;\r
-        double z = offset[2] + scale * tet_r[tet_i[i][j]][2] ;\r
-        glVertex3d ( x, y, z ) ;\r
-      }\r
-    }\r
-\r
-    glEnd () ;\r
-  }\r
-  else if ( num_levels > 0 )\r
-  {\r
-    GLdouble local_offset[3] ;  /* Use a local variable to avoid buildup of roundoff errors */\r
-    num_levels -- ;\r
-    scale /= 2.0 ;\r
-    for ( i = 0 ; i < NUM_TETR_FACES ; i++ )\r
-    {\r
-      local_offset[0] = offset[0] + scale * tet_r[i][0] ;\r
-      local_offset[1] = offset[1] + scale * tet_r[i][1] ;\r
-      local_offset[2] = offset[2] + scale * tet_r[i][2] ;\r
-      glutSolidSierpinskiSponge ( num_levels, local_offset, scale ) ;\r
-    }\r
-  }\r
-}\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_geometry.c
+ *
+ * Freeglut geometry rendering methods.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Fri Dec 3 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ *
+ * Following functions have been contributed by Andreas Umbach.
+ *
+ *      glutWireCube()          -- looks OK
+ *      glutSolidCube()         -- OK
+ *
+ * Those functions have been implemented by John Fay.
+ *
+ *      glutWireTorus()         -- looks OK
+ *      glutSolidTorus()        -- looks OK
+ *      glutWireDodecahedron()  -- looks OK
+ *      glutSolidDodecahedron() -- looks OK
+ *      glutWireOctahedron()    -- looks OK
+ *      glutSolidOctahedron()   -- looks OK
+ *      glutWireTetrahedron()   -- looks OK
+ *      glutSolidTetrahedron()  -- looks OK
+ *      glutWireIcosahedron()   -- looks OK
+ *      glutSolidIcosahedron()  -- looks OK
+ *
+ *  The Following functions have been updated by Nigel Stewart, based
+ *  on FreeGLUT 2.0.0 implementations:
+ *
+ *      glutWireSphere()        -- looks OK
+ *      glutSolidSphere()       -- looks OK
+ *      glutWireCone()          -- looks OK
+ *      glutSolidCone()         -- looks OK
+ */
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Draws a wireframed cube. Code contributed by Andreas Umbach <marvin@dataway.ch>
+ */
+void FGAPIENTRY glutWireCube( GLdouble dSize )
+{
+    double size = dSize * 0.5;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireCube" );
+
+#   define V(a,b,c) glVertex3d( a size, b size, c size );
+#   define N(a,b,c) glNormal3d( a, b, c );
+
+    /* PWO: I dared to convert the code to use macros... */
+    glBegin( GL_LINE_LOOP ); N( 1.0, 0.0, 0.0); V(+,-,+); V(+,-,-); V(+,+,-); V(+,+,+); glEnd();
+    glBegin( GL_LINE_LOOP ); N( 0.0, 1.0, 0.0); V(+,+,+); V(+,+,-); V(-,+,-); V(-,+,+); glEnd();
+    glBegin( GL_LINE_LOOP ); N( 0.0, 0.0, 1.0); V(+,+,+); V(-,+,+); V(-,-,+); V(+,-,+); glEnd();
+    glBegin( GL_LINE_LOOP ); N(-1.0, 0.0, 0.0); V(-,-,+); V(-,+,+); V(-,+,-); V(-,-,-); glEnd();
+    glBegin( GL_LINE_LOOP ); N( 0.0,-1.0, 0.0); V(-,-,+); V(-,-,-); V(+,-,-); V(+,-,+); glEnd();
+    glBegin( GL_LINE_LOOP ); N( 0.0, 0.0,-1.0); V(-,-,-); V(-,+,-); V(+,+,-); V(+,-,-); glEnd();
+
+#   undef V
+#   undef N
+}
+
+/*
+ * Draws a solid cube. Code contributed by Andreas Umbach <marvin@dataway.ch>
+ */
+void FGAPIENTRY glutSolidCube( GLdouble dSize )
+{
+    double size = dSize * 0.5;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidCube" );
+
+#   define V(a,b,c) glVertex3d( a size, b size, c size );
+#   define N(a,b,c) glNormal3d( a, b, c );
+
+    /* PWO: Again, I dared to convert the code to use macros... */
+    glBegin( GL_QUADS );
+        N( 1.0, 0.0, 0.0); V(+,-,+); V(+,-,-); V(+,+,-); V(+,+,+);
+        N( 0.0, 1.0, 0.0); V(+,+,+); V(+,+,-); V(-,+,-); V(-,+,+);
+        N( 0.0, 0.0, 1.0); V(+,+,+); V(-,+,+); V(-,-,+); V(+,-,+);
+        N(-1.0, 0.0, 0.0); V(-,-,+); V(-,+,+); V(-,+,-); V(-,-,-);
+        N( 0.0,-1.0, 0.0); V(-,-,+); V(-,-,-); V(+,-,-); V(+,-,+);
+        N( 0.0, 0.0,-1.0); V(-,-,-); V(-,+,-); V(+,+,-); V(+,-,-);
+    glEnd();
+
+#   undef V
+#   undef N
+}
+
+/*
+ * Compute lookup table of cos and sin values forming a cirle
+ *
+ * Notes:
+ *    It is the responsibility of the caller to free these tables
+ *    The size of the table is (n+1) to form a connected loop
+ *    The last entry is exactly the same as the first
+ *    The sign of n can be flipped to get the reverse loop
+ */
+
+static void fghCircleTable(double **sint,double **cost,const int n)
+{
+    int i;
+
+    /* Table size, the sign of n flips the circle direction */
+
+    const int size = abs(n);
+
+    /* Determine the angle between samples */
+
+    const double angle = 2*M_PI/(double)( ( n == 0 ) ? 1 : n );
+
+    /* Allocate memory for n samples, plus duplicate of first entry at the end */
+
+    *sint = (double *) calloc(sizeof(double), size+1);
+    *cost = (double *) calloc(sizeof(double), size+1);
+
+    /* Bail out if memory allocation fails, fgError never returns */
+
+    if (!(*sint) || !(*cost))
+    {
+        free(*sint);
+        free(*cost);
+        fgError("Failed to allocate memory in fghCircleTable");
+    }
+
+    /* Compute cos and sin around the circle */
+
+    (*sint)[0] = 0.0;
+    (*cost)[0] = 1.0;
+
+    for (i=1; i<size; i++)
+    {
+        (*sint)[i] = sin(angle*i);
+        (*cost)[i] = cos(angle*i);
+    }
+
+    /* Last sample is duplicate of the first */
+
+    (*sint)[size] = (*sint)[0];
+    (*cost)[size] = (*cost)[0];
+}
+
+/*
+ * Draws a solid sphere
+ */
+void FGAPIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks)
+{
+    int i,j;
+
+    /* Adjust z and radius as stacks are drawn. */
+
+    double z0,z1;
+    double r0,r1;
+
+    /* Pre-computed circle */
+
+    double *sint1,*cost1;
+    double *sint2,*cost2;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidSphere" );
+
+    fghCircleTable(&sint1,&cost1,-slices);
+    fghCircleTable(&sint2,&cost2,stacks*2);
+
+    /* The top stack is covered with a triangle fan */
+
+    z0 = 1.0;
+    z1 = cost2[(stacks>0)?1:0];
+    r0 = 0.0;
+    r1 = sint2[(stacks>0)?1:0];
+
+    glBegin(GL_TRIANGLE_FAN);
+
+        glNormal3d(0,0,1);
+        glVertex3d(0,0,radius);
+
+        for (j=slices; j>=0; j--)
+        {
+            glNormal3d(cost1[j]*r1,        sint1[j]*r1,        z1       );
+            glVertex3d(cost1[j]*r1*radius, sint1[j]*r1*radius, z1*radius);
+        }
+
+    glEnd();
+
+    /* Cover each stack with a quad strip, except the top and bottom stacks */
+
+    for( i=1; i<stacks-1; i++ )
+    {
+        z0 = z1; z1 = cost2[i+1];
+        r0 = r1; r1 = sint2[i+1];
+
+        glBegin(GL_QUAD_STRIP);
+
+            for(j=0; j<=slices; j++)
+            {
+                glNormal3d(cost1[j]*r1,        sint1[j]*r1,        z1       );
+                glVertex3d(cost1[j]*r1*radius, sint1[j]*r1*radius, z1*radius);
+                glNormal3d(cost1[j]*r0,        sint1[j]*r0,        z0       );
+                glVertex3d(cost1[j]*r0*radius, sint1[j]*r0*radius, z0*radius);
+            }
+
+        glEnd();
+    }
+
+    /* The bottom stack is covered with a triangle fan */
+
+    z0 = z1;
+    r0 = r1;
+
+    glBegin(GL_TRIANGLE_FAN);
+
+        glNormal3d(0,0,-1);
+        glVertex3d(0,0,-radius);
+
+        for (j=0; j<=slices; j++)
+        {
+            glNormal3d(cost1[j]*r0,        sint1[j]*r0,        z0       );
+            glVertex3d(cost1[j]*r0*radius, sint1[j]*r0*radius, z0*radius);
+        }
+
+    glEnd();
+
+    /* Release sin and cos tables */
+
+    free(sint1);
+    free(cost1);
+    free(sint2);
+    free(cost2);
+}
+
+/*
+ * Draws a wire sphere
+ */
+void FGAPIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks)
+{
+    int i,j;
+
+    /* Adjust z and radius as stacks and slices are drawn. */
+
+    double r;
+    double x,y,z;
+
+    /* Pre-computed circle */
+
+    double *sint1,*cost1;
+    double *sint2,*cost2;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireSphere" );
+
+    fghCircleTable(&sint1,&cost1,-slices  );
+    fghCircleTable(&sint2,&cost2, stacks*2);
+
+    /* Draw a line loop for each stack */
+
+    for (i=1; i<stacks; i++)
+    {
+        z = cost2[i];
+        r = sint2[i];
+
+        glBegin(GL_LINE_LOOP);
+
+            for(j=0; j<=slices; j++)
+            {
+                x = cost1[j];
+                y = sint1[j];
+
+                glNormal3d(x,y,z);
+                glVertex3d(x*r*radius,y*r*radius,z*radius);
+            }
+
+        glEnd();
+    }
+
+    /* Draw a line loop for each slice */
+
+    for (i=0; i<slices; i++)
+    {
+        glBegin(GL_LINE_STRIP);
+
+            for(j=0; j<=stacks; j++)
+            {
+                x = cost1[i]*sint2[j];
+                y = sint1[i]*sint2[j];
+                z = cost2[j];
+
+                glNormal3d(x,y,z);
+                glVertex3d(x*radius,y*radius,z*radius);
+            }
+
+        glEnd();
+    }
+
+    /* Release sin and cos tables */
+
+    free(sint1);
+    free(cost1);
+    free(sint2);
+    free(cost2);
+}
+
+/*
+ * Draws a solid cone
+ */
+void FGAPIENTRY glutSolidCone( GLdouble base, GLdouble height, GLint slices, GLint stacks )
+{
+    int i,j;
+
+    /* Step in z and radius as stacks are drawn. */
+
+    double z0,z1;
+    double r0,r1;
+
+    const double zStep = height / ( ( stacks > 0 ) ? stacks : 1 );
+    const double rStep = base / ( ( stacks > 0 ) ? stacks : 1 );
+
+    /* Scaling factors for vertex normals */
+
+    const double cosn = ( height / sqrt ( height * height + base * base ));
+    const double sinn = ( base   / sqrt ( height * height + base * base ));
+
+    /* Pre-computed circle */
+
+    double *sint,*cost;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidCone" );
+
+    fghCircleTable(&sint,&cost,-slices);
+
+    /* Cover the circular base with a triangle fan... */
+
+    z0 = 0.0;
+    z1 = zStep;
+
+    r0 = base;
+    r1 = r0 - rStep;
+
+    glBegin(GL_TRIANGLE_FAN);
+
+        glNormal3d(0.0,0.0,-1.0);
+        glVertex3d(0.0,0.0, z0 );
+
+        for (j=0; j<=slices; j++)
+            glVertex3d(cost[j]*r0, sint[j]*r0, z0);
+
+    glEnd();
+
+    /* Cover each stack with a quad strip, except the top stack */
+
+    for( i=0; i<stacks-1; i++ )
+    {
+        glBegin(GL_QUAD_STRIP);
+
+            for(j=0; j<=slices; j++)
+            {
+                glNormal3d(cost[j]*cosn, sint[j]*cosn, sinn);
+                glVertex3d(cost[j]*r0,   sint[j]*r0,   z0  );
+                glVertex3d(cost[j]*r1,   sint[j]*r1,   z1  );
+            }
+
+            z0 = z1; z1 += zStep;
+            r0 = r1; r1 -= rStep;
+
+        glEnd();
+    }
+
+    /* The top stack is covered with individual triangles */
+
+    glBegin(GL_TRIANGLES);
+
+        glNormal3d(cost[0]*sinn, sint[0]*sinn, cosn);
+
+        for (j=0; j<slices; j++)
+        {
+            glVertex3d(cost[j+0]*r0,   sint[j+0]*r0,   z0    );
+            glVertex3d(0,              0,              height);
+            glNormal3d(cost[j+1]*sinn, sint[j+1]*sinn, cosn  );
+            glVertex3d(cost[j+1]*r0,   sint[j+1]*r0,   z0    );
+        }
+
+    glEnd();
+
+    /* Release sin and cos tables */
+
+    free(sint);
+    free(cost);
+}
+
+/*
+ * Draws a wire cone
+ */
+void FGAPIENTRY glutWireCone( GLdouble base, GLdouble height, GLint slices, GLint stacks)
+{
+    int i,j;
+
+    /* Step in z and radius as stacks are drawn. */
+
+    double z = 0.0;
+    double r = base;
+
+    const double zStep = height / ( ( stacks > 0 ) ? stacks : 1 );
+    const double rStep = base / ( ( stacks > 0 ) ? stacks : 1 );
+
+    /* Scaling factors for vertex normals */
+
+    const double cosn = ( height / sqrt ( height * height + base * base ));
+    const double sinn = ( base   / sqrt ( height * height + base * base ));
+
+    /* Pre-computed circle */
+
+    double *sint,*cost;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireCone" );
+
+    fghCircleTable(&sint,&cost,-slices);
+
+    /* Draw the stacks... */
+
+    for (i=0; i<stacks; i++)
+    {
+        glBegin(GL_LINE_LOOP);
+
+            for( j=0; j<slices; j++ )
+            {
+                glNormal3d(cost[j]*sinn, sint[j]*sinn, cosn);
+                glVertex3d(cost[j]*r,    sint[j]*r,    z   );
+            }
+
+        glEnd();
+
+        z += zStep;
+        r -= rStep;
+    }
+
+    /* Draw the slices */
+
+    r = base;
+
+    glBegin(GL_LINES);
+
+        for (j=0; j<slices; j++)
+        {
+            glNormal3d(cost[j]*sinn, sint[j]*sinn, cosn  );
+            glVertex3d(cost[j]*r,    sint[j]*r,    0.0   );
+            glVertex3d(0.0,          0.0,          height);
+        }
+
+    glEnd();
+
+    /* Release sin and cos tables */
+
+    free(sint);
+    free(cost);
+}
+
+
+/*
+ * Draws a solid cylinder
+ */
+void FGAPIENTRY glutSolidCylinder(GLdouble radius, GLdouble height, GLint slices, GLint stacks)
+{
+    int i,j;
+
+    /* Step in z and radius as stacks are drawn. */
+
+    double z0,z1;
+    const double zStep = height / ( ( stacks > 0 ) ? stacks : 1 );
+
+    /* Pre-computed circle */
+
+    double *sint,*cost;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidCylinder" );
+
+    fghCircleTable(&sint,&cost,-slices);
+
+    /* Cover the base and top */
+
+    glBegin(GL_TRIANGLE_FAN);
+        glNormal3d(0.0, 0.0, -1.0 );
+        glVertex3d(0.0, 0.0,  0.0 );
+        for (j=0; j<=slices; j++)
+          glVertex3d(cost[j]*radius, sint[j]*radius, 0.0);
+    glEnd();
+
+    glBegin(GL_TRIANGLE_FAN);
+        glNormal3d(0.0, 0.0, 1.0   );
+        glVertex3d(0.0, 0.0, height);
+        for (j=slices; j>=0; j--)
+          glVertex3d(cost[j]*radius, sint[j]*radius, height);
+    glEnd();
+
+    /* Do the stacks */
+
+    z0 = 0.0;
+    z1 = zStep;
+
+    for (i=1; i<=stacks; i++)
+    {
+        if (i==stacks)
+            z1 = height;
+
+        glBegin(GL_QUAD_STRIP);
+            for (j=0; j<=slices; j++ )
+            {
+                glNormal3d(cost[j],        sint[j],        0.0 );
+                glVertex3d(cost[j]*radius, sint[j]*radius, z0  );
+                glVertex3d(cost[j]*radius, sint[j]*radius, z1  );
+            }
+        glEnd();
+
+        z0 = z1; z1 += zStep;
+    }
+
+    /* Release sin and cos tables */
+
+    free(sint);
+    free(cost);
+}
+
+/*
+ * Draws a wire cylinder
+ */
+void FGAPIENTRY glutWireCylinder(GLdouble radius, GLdouble height, GLint slices, GLint stacks)
+{
+    int i,j;
+
+    /* Step in z and radius as stacks are drawn. */
+
+          double z = 0.0;
+    const double zStep = height / ( ( stacks > 0 ) ? stacks : 1 );
+
+    /* Pre-computed circle */
+
+    double *sint,*cost;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireCylinder" );
+
+    fghCircleTable(&sint,&cost,-slices);
+
+    /* Draw the stacks... */
+
+    for (i=0; i<=stacks; i++)
+    {
+        if (i==stacks)
+            z = height;
+
+        glBegin(GL_LINE_LOOP);
+
+            for( j=0; j<slices; j++ )
+            {
+                glNormal3d(cost[j],        sint[j],        0.0);
+                glVertex3d(cost[j]*radius, sint[j]*radius, z  );
+            }
+
+        glEnd();
+
+        z += zStep;
+    }
+
+    /* Draw the slices */
+
+    glBegin(GL_LINES);
+
+        for (j=0; j<slices; j++)
+        {
+            glNormal3d(cost[j],        sint[j],        0.0   );
+            glVertex3d(cost[j]*radius, sint[j]*radius, 0.0   );
+            glVertex3d(cost[j]*radius, sint[j]*radius, height);
+        }
+
+    glEnd();
+
+    /* Release sin and cos tables */
+
+    free(sint);
+    free(cost);
+}
+
+/*
+ * Draws a wire torus
+ */
+void FGAPIENTRY glutWireTorus( GLdouble dInnerRadius, GLdouble dOuterRadius, GLint nSides, GLint nRings )
+{
+  double  iradius = dInnerRadius, oradius = dOuterRadius, phi, psi, dpsi, dphi;
+  double *vertex, *normal;
+  int    i, j;
+  double spsi, cpsi, sphi, cphi ;
+
+  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireTorus" );
+
+  if ( nSides < 1 ) nSides = 1;
+  if ( nRings < 1 ) nRings = 1;
+
+  /* Allocate the vertices array */
+  vertex = (double *)calloc( sizeof(double), 3 * nSides * nRings );
+  normal = (double *)calloc( sizeof(double), 3 * nSides * nRings );
+
+  glPushMatrix();
+
+  dpsi =  2.0 * M_PI / (double)nRings ;
+  dphi = -2.0 * M_PI / (double)nSides ;
+  psi  = 0.0;
+
+  for( j=0; j<nRings; j++ )
+  {
+    cpsi = cos ( psi ) ;
+    spsi = sin ( psi ) ;
+    phi = 0.0;
+
+    for( i=0; i<nSides; i++ )
+    {
+      int offset = 3 * ( j * nSides + i ) ;
+      cphi = cos ( phi ) ;
+      sphi = sin ( phi ) ;
+      *(vertex + offset + 0) = cpsi * ( oradius + cphi * iradius ) ;
+      *(vertex + offset + 1) = spsi * ( oradius + cphi * iradius ) ;
+      *(vertex + offset + 2) =                    sphi * iradius  ;
+      *(normal + offset + 0) = cpsi * cphi ;
+      *(normal + offset + 1) = spsi * cphi ;
+      *(normal + offset + 2) =        sphi ;
+      phi += dphi;
+    }
+
+    psi += dpsi;
+  }
+
+  for( i=0; i<nSides; i++ )
+  {
+    glBegin( GL_LINE_LOOP );
+
+    for( j=0; j<nRings; j++ )
+    {
+      int offset = 3 * ( j * nSides + i ) ;
+      glNormal3dv( normal + offset );
+      glVertex3dv( vertex + offset );
+    }
+
+    glEnd();
+  }
+
+  for( j=0; j<nRings; j++ )
+  {
+    glBegin(GL_LINE_LOOP);
+
+    for( i=0; i<nSides; i++ )
+    {
+      int offset = 3 * ( j * nSides + i ) ;
+      glNormal3dv( normal + offset );
+      glVertex3dv( vertex + offset );
+    }
+
+    glEnd();
+  }
+
+  free ( vertex ) ;
+  free ( normal ) ;
+  glPopMatrix();
+}
+
+/*
+ * Draws a solid torus
+ */
+void FGAPIENTRY glutSolidTorus( GLdouble dInnerRadius, GLdouble dOuterRadius, GLint nSides, GLint nRings )
+{
+  double  iradius = dInnerRadius, oradius = dOuterRadius, phi, psi, dpsi, dphi;
+  double *vertex, *normal;
+  int    i, j;
+  double spsi, cpsi, sphi, cphi ;
+
+  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidTorus" );
+
+  if ( nSides < 1 ) nSides = 1;
+  if ( nRings < 1 ) nRings = 1;
+
+  /* Increment the number of sides and rings to allow for one more point than surface */
+  nSides ++ ;
+  nRings ++ ;
+
+  /* Allocate the vertices array */
+  vertex = (double *)calloc( sizeof(double), 3 * nSides * nRings );
+  normal = (double *)calloc( sizeof(double), 3 * nSides * nRings );
+
+  glPushMatrix();
+
+  dpsi =  2.0 * M_PI / (double)(nRings - 1) ;
+  dphi = -2.0 * M_PI / (double)(nSides - 1) ;
+  psi  = 0.0;
+
+  for( j=0; j<nRings; j++ )
+  {
+    cpsi = cos ( psi ) ;
+    spsi = sin ( psi ) ;
+    phi = 0.0;
+
+    for( i=0; i<nSides; i++ )
+    {
+      int offset = 3 * ( j * nSides + i ) ;
+      cphi = cos ( phi ) ;
+      sphi = sin ( phi ) ;
+      *(vertex + offset + 0) = cpsi * ( oradius + cphi * iradius ) ;
+      *(vertex + offset + 1) = spsi * ( oradius + cphi * iradius ) ;
+      *(vertex + offset + 2) =                    sphi * iradius  ;
+      *(normal + offset + 0) = cpsi * cphi ;
+      *(normal + offset + 1) = spsi * cphi ;
+      *(normal + offset + 2) =        sphi ;
+      phi += dphi;
+    }
+
+    psi += dpsi;
+  }
+
+    glBegin( GL_QUADS );
+  for( i=0; i<nSides-1; i++ )
+  {
+    for( j=0; j<nRings-1; j++ )
+    {
+      int offset = 3 * ( j * nSides + i ) ;
+      glNormal3dv( normal + offset );
+      glVertex3dv( vertex + offset );
+      glNormal3dv( normal + offset + 3 );
+      glVertex3dv( vertex + offset + 3 );
+      glNormal3dv( normal + offset + 3 * nSides + 3 );
+      glVertex3dv( vertex + offset + 3 * nSides + 3 );
+      glNormal3dv( normal + offset + 3 * nSides );
+      glVertex3dv( vertex + offset + 3 * nSides );
+    }
+  }
+
+  glEnd();
+
+  free ( vertex ) ;
+  free ( normal ) ;
+  glPopMatrix();
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutWireDodecahedron( void )
+{
+  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireDodecahedron" );
+
+  /* Magic Numbers:  It is possible to create a dodecahedron by attaching two pentagons to each face of
+   * of a cube.  The coordinates of the points are:
+   *   (+-x,0, z); (+-1, 1, 1); (0, z, x )
+   * where x = (-1 + sqrt(5))/2, z = (1 + sqrt(5))/2  or
+   *       x = 0.61803398875 and z = 1.61803398875.
+   */
+  glBegin ( GL_LINE_LOOP ) ;
+  glNormal3d (  0.0,  0.525731112119,  0.850650808354 ) ; glVertex3d (  0.0,  1.61803398875,  0.61803398875 ) ; glVertex3d ( -1.0,  1.0,  1.0 ) ; glVertex3d ( -0.61803398875, 0.0,  1.61803398875 ) ; glVertex3d (  0.61803398875, 0.0,  1.61803398875 ) ; glVertex3d (  1.0,  1.0,  1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_LINE_LOOP ) ;
+  glNormal3d (  0.0,  0.525731112119, -0.850650808354 ) ; glVertex3d (  0.0,  1.61803398875, -0.61803398875 ) ; glVertex3d (  1.0,  1.0, -1.0 ) ; glVertex3d (  0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( -0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( -1.0,  1.0, -1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_LINE_LOOP ) ;
+  glNormal3d (  0.0, -0.525731112119,  0.850650808354 ) ; glVertex3d (  0.0, -1.61803398875,  0.61803398875 ) ; glVertex3d (  1.0, -1.0,  1.0 ) ; glVertex3d (  0.61803398875, 0.0,  1.61803398875 ) ; glVertex3d ( -0.61803398875, 0.0,  1.61803398875 ) ; glVertex3d ( -1.0, -1.0,  1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_LINE_LOOP ) ;
+  glNormal3d (  0.0, -0.525731112119, -0.850650808354 ) ; glVertex3d (  0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( -0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d (  0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d (  1.0, -1.0, -1.0 ) ;
+  glEnd () ;
+
+  glBegin ( GL_LINE_LOOP ) ;
+  glNormal3d (  0.850650808354,  0.0,  0.525731112119 ) ; glVertex3d (  0.61803398875,  0.0,  1.61803398875 ) ; glVertex3d (  1.0, -1.0,  1.0 ) ; glVertex3d (  1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d (  1.61803398875,  0.61803398875, 0.0 ) ; glVertex3d (  1.0,  1.0,  1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_LINE_LOOP ) ;
+  glNormal3d ( -0.850650808354,  0.0,  0.525731112119 ) ; glVertex3d ( -0.61803398875,  0.0,  1.61803398875 ) ; glVertex3d ( -1.0,  1.0,  1.0 ) ; glVertex3d ( -1.61803398875,  0.61803398875, 0.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( -1.0, -1.0,  1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_LINE_LOOP ) ;
+  glNormal3d (  0.850650808354,  0.0, -0.525731112119 ) ; glVertex3d (  0.61803398875,  0.0, -1.61803398875 ) ; glVertex3d (  1.0,  1.0, -1.0 ) ; glVertex3d (  1.61803398875,  0.61803398875, 0.0 ) ; glVertex3d (  1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d (  1.0, -1.0, -1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_LINE_LOOP ) ;
+  glNormal3d ( -0.850650808354,  0.0, -0.525731112119 ) ; glVertex3d ( -0.61803398875,  0.0, -1.61803398875 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( -1.61803398875,  0.61803398875, 0.0 ) ; glVertex3d ( -1.0,  1.0, -1.0 ) ;
+  glEnd () ;
+
+  glBegin ( GL_LINE_LOOP ) ;
+  glNormal3d (  0.525731112119,  0.850650808354,  0.0 ) ; glVertex3d (  1.61803398875,  0.61803398875,  0.0 ) ; glVertex3d (  1.0,  1.0, -1.0 ) ; glVertex3d ( 0.0,  1.61803398875, -0.61803398875 ) ; glVertex3d ( 0.0,  1.61803398875,  0.61803398875 ) ; glVertex3d (  1.0,  1.0,  1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_LINE_LOOP ) ;
+  glNormal3d (  0.525731112119, -0.850650808354,  0.0 ) ; glVertex3d (  1.61803398875, -0.61803398875,  0.0 ) ; glVertex3d (  1.0, -1.0,  1.0 ) ; glVertex3d ( 0.0, -1.61803398875,  0.61803398875 ) ; glVertex3d ( 0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d (  1.0, -1.0, -1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_LINE_LOOP ) ;
+  glNormal3d ( -0.525731112119,  0.850650808354,  0.0 ) ; glVertex3d ( -1.61803398875,  0.61803398875,  0.0 ) ; glVertex3d ( -1.0,  1.0,  1.0 ) ; glVertex3d ( 0.0,  1.61803398875,  0.61803398875 ) ; glVertex3d ( 0.0,  1.61803398875, -0.61803398875 ) ; glVertex3d ( -1.0,  1.0, -1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_LINE_LOOP ) ;
+  glNormal3d ( -0.525731112119, -0.850650808354,  0.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875,  0.0 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( 0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d ( 0.0, -1.61803398875,  0.61803398875 ) ; glVertex3d ( -1.0, -1.0,  1.0 ) ;
+  glEnd () ;
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutSolidDodecahedron( void )
+{
+  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidDodecahedron" );
+
+  /* Magic Numbers:  It is possible to create a dodecahedron by attaching two pentagons to each face of
+   * of a cube.  The coordinates of the points are:
+   *   (+-x,0, z); (+-1, 1, 1); (0, z, x )
+   * where x = (-1 + sqrt(5))/2, z = (1 + sqrt(5))/2 or
+   *       x = 0.61803398875 and z = 1.61803398875.
+   */
+  glBegin ( GL_POLYGON ) ;
+  glNormal3d (  0.0,  0.525731112119,  0.850650808354 ) ; glVertex3d (  0.0,  1.61803398875,  0.61803398875 ) ; glVertex3d ( -1.0,  1.0,  1.0 ) ; glVertex3d ( -0.61803398875, 0.0,  1.61803398875 ) ; glVertex3d (  0.61803398875, 0.0,  1.61803398875 ) ; glVertex3d (  1.0,  1.0,  1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_POLYGON ) ;
+  glNormal3d (  0.0,  0.525731112119, -0.850650808354 ) ; glVertex3d (  0.0,  1.61803398875, -0.61803398875 ) ; glVertex3d (  1.0,  1.0, -1.0 ) ; glVertex3d (  0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( -0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( -1.0,  1.0, -1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_POLYGON ) ;
+  glNormal3d (  0.0, -0.525731112119,  0.850650808354 ) ; glVertex3d (  0.0, -1.61803398875,  0.61803398875 ) ; glVertex3d (  1.0, -1.0,  1.0 ) ; glVertex3d (  0.61803398875, 0.0,  1.61803398875 ) ; glVertex3d ( -0.61803398875, 0.0,  1.61803398875 ) ; glVertex3d ( -1.0, -1.0,  1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_POLYGON ) ;
+  glNormal3d (  0.0, -0.525731112119, -0.850650808354 ) ; glVertex3d (  0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( -0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d (  0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d (  1.0, -1.0, -1.0 ) ;
+  glEnd () ;
+
+  glBegin ( GL_POLYGON ) ;
+  glNormal3d (  0.850650808354,  0.0,  0.525731112119 ) ; glVertex3d (  0.61803398875,  0.0,  1.61803398875 ) ; glVertex3d (  1.0, -1.0,  1.0 ) ; glVertex3d (  1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d (  1.61803398875,  0.61803398875, 0.0 ) ; glVertex3d (  1.0,  1.0,  1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_POLYGON ) ;
+  glNormal3d ( -0.850650808354,  0.0,  0.525731112119 ) ; glVertex3d ( -0.61803398875,  0.0,  1.61803398875 ) ; glVertex3d ( -1.0,  1.0,  1.0 ) ; glVertex3d ( -1.61803398875,  0.61803398875, 0.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( -1.0, -1.0,  1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_POLYGON ) ;
+  glNormal3d (  0.850650808354,  0.0, -0.525731112119 ) ; glVertex3d (  0.61803398875,  0.0, -1.61803398875 ) ; glVertex3d (  1.0,  1.0, -1.0 ) ; glVertex3d (  1.61803398875,  0.61803398875, 0.0 ) ; glVertex3d (  1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d (  1.0, -1.0, -1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_POLYGON ) ;
+  glNormal3d ( -0.850650808354,  0.0, -0.525731112119 ) ; glVertex3d ( -0.61803398875,  0.0, -1.61803398875 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( -1.61803398875,  0.61803398875, 0.0 ) ; glVertex3d ( -1.0,  1.0, -1.0 ) ;
+  glEnd () ;
+
+  glBegin ( GL_POLYGON ) ;
+  glNormal3d (  0.525731112119,  0.850650808354,  0.0 ) ; glVertex3d (  1.61803398875,  0.61803398875,  0.0 ) ; glVertex3d (  1.0,  1.0, -1.0 ) ; glVertex3d ( 0.0,  1.61803398875, -0.61803398875 ) ; glVertex3d ( 0.0,  1.61803398875,  0.61803398875 ) ; glVertex3d (  1.0,  1.0,  1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_POLYGON ) ;
+  glNormal3d (  0.525731112119, -0.850650808354,  0.0 ) ; glVertex3d (  1.61803398875, -0.61803398875,  0.0 ) ; glVertex3d (  1.0, -1.0,  1.0 ) ; glVertex3d ( 0.0, -1.61803398875,  0.61803398875 ) ; glVertex3d ( 0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d (  1.0, -1.0, -1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_POLYGON ) ;
+  glNormal3d ( -0.525731112119,  0.850650808354,  0.0 ) ; glVertex3d ( -1.61803398875,  0.61803398875,  0.0 ) ; glVertex3d ( -1.0,  1.0,  1.0 ) ; glVertex3d ( 0.0,  1.61803398875,  0.61803398875 ) ; glVertex3d ( 0.0,  1.61803398875, -0.61803398875 ) ; glVertex3d ( -1.0,  1.0, -1.0 ) ;
+  glEnd () ;
+  glBegin ( GL_POLYGON ) ;
+  glNormal3d ( -0.525731112119, -0.850650808354,  0.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875,  0.0 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( 0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d ( 0.0, -1.61803398875,  0.61803398875 ) ; glVertex3d ( -1.0, -1.0,  1.0 ) ;
+  glEnd () ;
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutWireOctahedron( void )
+{
+  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireOctahedron" );
+
+#define RADIUS    1.0f
+  glBegin( GL_LINE_LOOP );
+    glNormal3d( 0.577350269189, 0.577350269189, 0.577350269189); glVertex3d( RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, RADIUS, 0.0 ); glVertex3d( 0.0, 0.0, RADIUS );
+    glNormal3d( 0.577350269189, 0.577350269189,-0.577350269189); glVertex3d( RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, 0.0,-RADIUS ); glVertex3d( 0.0, RADIUS, 0.0 );
+    glNormal3d( 0.577350269189,-0.577350269189, 0.577350269189); glVertex3d( RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, 0.0, RADIUS ); glVertex3d( 0.0,-RADIUS, 0.0 );
+    glNormal3d( 0.577350269189,-0.577350269189,-0.577350269189); glVertex3d( RADIUS, 0.0, 0.0 ); glVertex3d( 0.0,-RADIUS, 0.0 ); glVertex3d( 0.0, 0.0,-RADIUS );
+    glNormal3d(-0.577350269189, 0.577350269189, 0.577350269189); glVertex3d(-RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, 0.0, RADIUS ); glVertex3d( 0.0, RADIUS, 0.0 );
+    glNormal3d(-0.577350269189, 0.577350269189,-0.577350269189); glVertex3d(-RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, RADIUS, 0.0 ); glVertex3d( 0.0, 0.0,-RADIUS );
+    glNormal3d(-0.577350269189,-0.577350269189, 0.577350269189); glVertex3d(-RADIUS, 0.0, 0.0 ); glVertex3d( 0.0,-RADIUS, 0.0 ); glVertex3d( 0.0, 0.0, RADIUS );
+    glNormal3d(-0.577350269189,-0.577350269189,-0.577350269189); glVertex3d(-RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, 0.0,-RADIUS ); glVertex3d( 0.0,-RADIUS, 0.0 );
+  glEnd();
+#undef RADIUS
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutSolidOctahedron( void )
+{
+  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidOctahedron" );
+
+#define RADIUS    1.0f
+  glBegin( GL_TRIANGLES );
+    glNormal3d( 0.577350269189, 0.577350269189, 0.577350269189); glVertex3d( RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, RADIUS, 0.0 ); glVertex3d( 0.0, 0.0, RADIUS );
+    glNormal3d( 0.577350269189, 0.577350269189,-0.577350269189); glVertex3d( RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, 0.0,-RADIUS ); glVertex3d( 0.0, RADIUS, 0.0 );
+    glNormal3d( 0.577350269189,-0.577350269189, 0.577350269189); glVertex3d( RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, 0.0, RADIUS ); glVertex3d( 0.0,-RADIUS, 0.0 );
+    glNormal3d( 0.577350269189,-0.577350269189,-0.577350269189); glVertex3d( RADIUS, 0.0, 0.0 ); glVertex3d( 0.0,-RADIUS, 0.0 ); glVertex3d( 0.0, 0.0,-RADIUS );
+    glNormal3d(-0.577350269189, 0.577350269189, 0.577350269189); glVertex3d(-RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, 0.0, RADIUS ); glVertex3d( 0.0, RADIUS, 0.0 );
+    glNormal3d(-0.577350269189, 0.577350269189,-0.577350269189); glVertex3d(-RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, RADIUS, 0.0 ); glVertex3d( 0.0, 0.0,-RADIUS );
+    glNormal3d(-0.577350269189,-0.577350269189, 0.577350269189); glVertex3d(-RADIUS, 0.0, 0.0 ); glVertex3d( 0.0,-RADIUS, 0.0 ); glVertex3d( 0.0, 0.0, RADIUS );
+    glNormal3d(-0.577350269189,-0.577350269189,-0.577350269189); glVertex3d(-RADIUS, 0.0, 0.0 ); glVertex3d( 0.0, 0.0,-RADIUS ); glVertex3d( 0.0,-RADIUS, 0.0 );
+  glEnd();
+#undef RADIUS
+}
+
+/* Magic Numbers:  r0 = ( 1, 0, 0 )
+ *                 r1 = ( -1/3, 2 sqrt(2) / 3, 0 )
+ *                 r2 = ( -1/3, -sqrt(2) / 3, sqrt(6) / 3 )
+ *                 r3 = ( -1/3, -sqrt(2) / 3, -sqrt(6) / 3 )
+ * |r0| = |r1| = |r2| = |r3| = 1
+ * Distance between any two points is 2 sqrt(6) / 3
+ *
+ * Normals:  The unit normals are simply the negative of the coordinates of the point not on the surface.
+ */
+
+#define NUM_TETR_FACES     4
+
+static GLdouble tet_r[4][3] = { {             1.0,             0.0,             0.0 },
+                                { -0.333333333333,  0.942809041582,             0.0 },
+                                { -0.333333333333, -0.471404520791,  0.816496580928 },
+                                { -0.333333333333, -0.471404520791, -0.816496580928 } } ;
+
+static GLint tet_i[4][3] =  /* Vertex indices */
+{
+  { 1, 3, 2 }, { 0, 2, 3 }, { 0, 3, 1 }, { 0, 1, 2 }
+} ;
+
+/*
+ *
+ */
+void FGAPIENTRY glutWireTetrahedron( void )
+{
+  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireTetrahedron" );
+
+  glBegin( GL_LINE_LOOP ) ;
+    glNormal3d ( -tet_r[0][0], -tet_r[0][1], -tet_r[0][2] ) ; glVertex3dv ( tet_r[1] ) ; glVertex3dv ( tet_r[3] ) ; glVertex3dv ( tet_r[2] ) ;
+    glNormal3d ( -tet_r[1][0], -tet_r[1][1], -tet_r[1][2] ) ; glVertex3dv ( tet_r[0] ) ; glVertex3dv ( tet_r[2] ) ; glVertex3dv ( tet_r[3] ) ;
+    glNormal3d ( -tet_r[2][0], -tet_r[2][1], -tet_r[2][2] ) ; glVertex3dv ( tet_r[0] ) ; glVertex3dv ( tet_r[3] ) ; glVertex3dv ( tet_r[1] ) ;
+    glNormal3d ( -tet_r[3][0], -tet_r[3][1], -tet_r[3][2] ) ; glVertex3dv ( tet_r[0] ) ; glVertex3dv ( tet_r[1] ) ; glVertex3dv ( tet_r[2] ) ;
+  glEnd() ;
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutSolidTetrahedron( void )
+{
+  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidTetrahedron" );
+
+  glBegin( GL_TRIANGLES ) ;
+    glNormal3d ( -tet_r[0][0], -tet_r[0][1], -tet_r[0][2] ) ; glVertex3dv ( tet_r[1] ) ; glVertex3dv ( tet_r[3] ) ; glVertex3dv ( tet_r[2] ) ;
+    glNormal3d ( -tet_r[1][0], -tet_r[1][1], -tet_r[1][2] ) ; glVertex3dv ( tet_r[0] ) ; glVertex3dv ( tet_r[2] ) ; glVertex3dv ( tet_r[3] ) ;
+    glNormal3d ( -tet_r[2][0], -tet_r[2][1], -tet_r[2][2] ) ; glVertex3dv ( tet_r[0] ) ; glVertex3dv ( tet_r[3] ) ; glVertex3dv ( tet_r[1] ) ;
+    glNormal3d ( -tet_r[3][0], -tet_r[3][1], -tet_r[3][2] ) ; glVertex3dv ( tet_r[0] ) ; glVertex3dv ( tet_r[1] ) ; glVertex3dv ( tet_r[2] ) ;
+  glEnd() ;
+}
+
+/*
+ *
+ */
+static double icos_r[12][3] = {
+    {  1.0,             0.0,             0.0            },
+    {  0.447213595500,  0.894427191000,  0.0            },
+    {  0.447213595500,  0.276393202252,  0.850650808354 },
+    {  0.447213595500, -0.723606797748,  0.525731112119 },
+    {  0.447213595500, -0.723606797748, -0.525731112119 },
+    {  0.447213595500,  0.276393202252, -0.850650808354 },
+    { -0.447213595500, -0.894427191000,  0.0 },
+    { -0.447213595500, -0.276393202252,  0.850650808354 },
+    { -0.447213595500,  0.723606797748,  0.525731112119 },
+    { -0.447213595500,  0.723606797748, -0.525731112119 },
+    { -0.447213595500, -0.276393202252, -0.850650808354 },
+    { -1.0,             0.0,             0.0            }
+};
+
+static int icos_v [20][3] = {
+    {  0,  1,  2 },
+    {  0,  2,  3 },
+    {  0,  3,  4 },
+    {  0,  4,  5 },
+    {  0,  5,  1 },
+    {  1,  8,  2 },
+    {  2,  7,  3 },
+    {  3,  6,  4 },
+    {  4, 10,  5 },
+    {  5,  9,  1 },
+    {  1,  9,  8 },
+    {  2,  8,  7 },
+    {  3,  7,  6 },
+    {  4,  6, 10 },
+    {  5, 10,  9 },
+    { 11,  9, 10 },
+    { 11,  8,  9 },
+    { 11,  7,  8 },
+    { 11,  6,  7 },
+    { 11, 10,  6 }
+};
+
+void FGAPIENTRY glutWireIcosahedron( void )
+{
+  int i ;
+
+  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireIcosahedron" );
+
+  for ( i = 0; i < 20; i++ )
+  {
+    double normal[3] ;
+    normal[0] = ( icos_r[icos_v[i][1]][1] - icos_r[icos_v[i][0]][1] ) * ( icos_r[icos_v[i][2]][2] - icos_r[icos_v[i][0]][2] ) - ( icos_r[icos_v[i][1]][2] - icos_r[icos_v[i][0]][2] ) * ( icos_r[icos_v[i][2]][1] - icos_r[icos_v[i][0]][1] ) ;
+    normal[1] = ( icos_r[icos_v[i][1]][2] - icos_r[icos_v[i][0]][2] ) * ( icos_r[icos_v[i][2]][0] - icos_r[icos_v[i][0]][0] ) - ( icos_r[icos_v[i][1]][0] - icos_r[icos_v[i][0]][0] ) * ( icos_r[icos_v[i][2]][2] - icos_r[icos_v[i][0]][2] ) ;
+    normal[2] = ( icos_r[icos_v[i][1]][0] - icos_r[icos_v[i][0]][0] ) * ( icos_r[icos_v[i][2]][1] - icos_r[icos_v[i][0]][1] ) - ( icos_r[icos_v[i][1]][1] - icos_r[icos_v[i][0]][1] ) * ( icos_r[icos_v[i][2]][0] - icos_r[icos_v[i][0]][0] ) ;
+    glBegin ( GL_LINE_LOOP ) ;
+      glNormal3dv ( normal ) ;
+      glVertex3dv ( icos_r[icos_v[i][0]] ) ;
+      glVertex3dv ( icos_r[icos_v[i][1]] ) ;
+      glVertex3dv ( icos_r[icos_v[i][2]] ) ;
+    glEnd () ;
+  }
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutSolidIcosahedron( void )
+{
+  int i ;
+
+  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidIcosahedron" );
+
+  glBegin ( GL_TRIANGLES ) ;
+  for ( i = 0; i < 20; i++ )
+  {
+    double normal[3] ;
+    normal[0] = ( icos_r[icos_v[i][1]][1] - icos_r[icos_v[i][0]][1] ) * ( icos_r[icos_v[i][2]][2] - icos_r[icos_v[i][0]][2] ) - ( icos_r[icos_v[i][1]][2] - icos_r[icos_v[i][0]][2] ) * ( icos_r[icos_v[i][2]][1] - icos_r[icos_v[i][0]][1] ) ;
+    normal[1] = ( icos_r[icos_v[i][1]][2] - icos_r[icos_v[i][0]][2] ) * ( icos_r[icos_v[i][2]][0] - icos_r[icos_v[i][0]][0] ) - ( icos_r[icos_v[i][1]][0] - icos_r[icos_v[i][0]][0] ) * ( icos_r[icos_v[i][2]][2] - icos_r[icos_v[i][0]][2] ) ;
+    normal[2] = ( icos_r[icos_v[i][1]][0] - icos_r[icos_v[i][0]][0] ) * ( icos_r[icos_v[i][2]][1] - icos_r[icos_v[i][0]][1] ) - ( icos_r[icos_v[i][1]][1] - icos_r[icos_v[i][0]][1] ) * ( icos_r[icos_v[i][2]][0] - icos_r[icos_v[i][0]][0] ) ;
+      glNormal3dv ( normal ) ;
+      glVertex3dv ( icos_r[icos_v[i][0]] ) ;
+      glVertex3dv ( icos_r[icos_v[i][1]] ) ;
+      glVertex3dv ( icos_r[icos_v[i][2]] ) ;
+  }
+
+  glEnd () ;
+}
+
+/*
+ *
+ */
+static double rdod_r[14][3] = {
+    {  0.0,             0.0,             1.0 },
+    {  0.707106781187,  0.000000000000,  0.5 },
+    {  0.000000000000,  0.707106781187,  0.5 },
+    { -0.707106781187,  0.000000000000,  0.5 },
+    {  0.000000000000, -0.707106781187,  0.5 },
+    {  0.707106781187,  0.707106781187,  0.0 },
+    { -0.707106781187,  0.707106781187,  0.0 },
+    { -0.707106781187, -0.707106781187,  0.0 },
+    {  0.707106781187, -0.707106781187,  0.0 },
+    {  0.707106781187,  0.000000000000, -0.5 },
+    {  0.000000000000,  0.707106781187, -0.5 },
+    { -0.707106781187,  0.000000000000, -0.5 },
+    {  0.000000000000, -0.707106781187, -0.5 },
+    {  0.0,             0.0,            -1.0 }
+} ;
+
+static int rdod_v [12][4] = {
+    { 0,  1,  5,  2 },
+    { 0,  2,  6,  3 },
+    { 0,  3,  7,  4 },
+    { 0,  4,  8,  1 },
+    { 5, 10,  6,  2 },
+    { 6, 11,  7,  3 },
+    { 7, 12,  8,  4 },
+    { 8,  9,  5,  1 },
+    { 5,  9, 13, 10 },
+    { 6, 10, 13, 11 },
+    { 7, 11, 13, 12 },
+    { 8, 12, 13,  9 }
+};
+
+static double rdod_n[12][3] = {
+    {  0.353553390594,  0.353553390594,  0.5 },
+    { -0.353553390594,  0.353553390594,  0.5 },
+    { -0.353553390594, -0.353553390594,  0.5 },
+    {  0.353553390594, -0.353553390594,  0.5 },
+    {  0.000000000000,  1.000000000000,  0.0 },
+    { -1.000000000000,  0.000000000000,  0.0 },
+    {  0.000000000000, -1.000000000000,  0.0 },
+    {  1.000000000000,  0.000000000000,  0.0 },
+    {  0.353553390594,  0.353553390594, -0.5 },
+    { -0.353553390594,  0.353553390594, -0.5 },
+    { -0.353553390594, -0.353553390594, -0.5 },
+    {  0.353553390594, -0.353553390594, -0.5 }
+};
+
+void FGAPIENTRY glutWireRhombicDodecahedron( void )
+{
+  int i ;
+
+  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireRhombicDodecahedron" );
+
+  for ( i = 0; i < 12; i++ )
+  {
+    glBegin ( GL_LINE_LOOP ) ;
+      glNormal3dv ( rdod_n[i] ) ;
+      glVertex3dv ( rdod_r[rdod_v[i][0]] ) ;
+      glVertex3dv ( rdod_r[rdod_v[i][1]] ) ;
+      glVertex3dv ( rdod_r[rdod_v[i][2]] ) ;
+      glVertex3dv ( rdod_r[rdod_v[i][3]] ) ;
+    glEnd () ;
+  }
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutSolidRhombicDodecahedron( void )
+{
+  int i ;
+
+  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidRhombicDodecahedron" );
+
+  glBegin ( GL_QUADS ) ;
+  for ( i = 0; i < 12; i++ )
+  {
+      glNormal3dv ( rdod_n[i] ) ;
+      glVertex3dv ( rdod_r[rdod_v[i][0]] ) ;
+      glVertex3dv ( rdod_r[rdod_v[i][1]] ) ;
+      glVertex3dv ( rdod_r[rdod_v[i][2]] ) ;
+      glVertex3dv ( rdod_r[rdod_v[i][3]] ) ;
+  }
+
+  glEnd () ;
+}
+
+void FGAPIENTRY glutWireSierpinskiSponge ( int num_levels, GLdouble offset[3], GLdouble scale )
+{
+  int i, j ;
+
+  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireSierpinskiSponge" );
+
+  if ( num_levels == 0 )
+  {
+
+    for ( i = 0 ; i < NUM_TETR_FACES ; i++ )
+    {
+      glBegin ( GL_LINE_LOOP ) ;
+      glNormal3d ( -tet_r[i][0], -tet_r[i][1], -tet_r[i][2] ) ;
+      for ( j = 0; j < 3; j++ )
+      {
+        double x = offset[0] + scale * tet_r[tet_i[i][j]][0] ;
+        double y = offset[1] + scale * tet_r[tet_i[i][j]][1] ;
+        double z = offset[2] + scale * tet_r[tet_i[i][j]][2] ;
+        glVertex3d ( x, y, z ) ;
+      }
+
+      glEnd () ;
+    }
+  }
+  else if ( num_levels > 0 )
+  {
+    GLdouble local_offset[3] ;  /* Use a local variable to avoid buildup of roundoff errors */
+    num_levels -- ;
+    scale /= 2.0 ;
+    for ( i = 0 ; i < NUM_TETR_FACES ; i++ )
+    {
+      local_offset[0] = offset[0] + scale * tet_r[i][0] ;
+      local_offset[1] = offset[1] + scale * tet_r[i][1] ;
+      local_offset[2] = offset[2] + scale * tet_r[i][2] ;
+      glutWireSierpinskiSponge ( num_levels, local_offset, scale ) ;
+    }
+  }
+}
+
+void FGAPIENTRY glutSolidSierpinskiSponge ( int num_levels, GLdouble offset[3], GLdouble scale )
+{
+  int i, j ;
+
+  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidSierpinskiSponge" );
+
+  if ( num_levels == 0 )
+  {
+    glBegin ( GL_TRIANGLES ) ;
+
+    for ( i = 0 ; i < NUM_TETR_FACES ; i++ )
+    {
+      glNormal3d ( -tet_r[i][0], -tet_r[i][1], -tet_r[i][2] ) ;
+      for ( j = 0; j < 3; j++ )
+      {
+        double x = offset[0] + scale * tet_r[tet_i[i][j]][0] ;
+        double y = offset[1] + scale * tet_r[tet_i[i][j]][1] ;
+        double z = offset[2] + scale * tet_r[tet_i[i][j]][2] ;
+        glVertex3d ( x, y, z ) ;
+      }
+    }
+
+    glEnd () ;
+  }
+  else if ( num_levels > 0 )
+  {
+    GLdouble local_offset[3] ;  /* Use a local variable to avoid buildup of roundoff errors */
+    num_levels -- ;
+    scale /= 2.0 ;
+    for ( i = 0 ; i < NUM_TETR_FACES ; i++ )
+    {
+      local_offset[0] = offset[0] + scale * tet_r[i][0] ;
+      local_offset[1] = offset[1] + scale * tet_r[i][1] ;
+      local_offset[2] = offset[2] + scale * tet_r[i][2] ;
+      glutSolidSierpinskiSponge ( num_levels, local_offset, scale ) ;
+    }
+  }
+}
+
+/*** END OF FILE ***/
index d8e87e0..27abc46 100644 (file)
-/*\r
- * freeglut_init.c\r
- *\r
- * Various freeglut initialization functions.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Thu Dec 2 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#define FREEGLUT_BUILDING_LIB\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-/*\r
- * TODO BEFORE THE STABLE RELEASE:\r
- *\r
- *  fgDeinitialize()        -- Win32's OK, X11 needs the OS-specific\r
- *                             deinitialization done\r
- *  glutInitDisplayString() -- display mode string parsing\r
- *\r
- * Wouldn't it be cool to use gettext() for error messages? I just love\r
- * bash saying  "nie znaleziono pliku" instead of "file not found" :)\r
- * Is gettext easily portable?\r
- */\r
-\r
-/* -- GLOBAL VARIABLES ----------------------------------------------------- */\r
-\r
-/*\r
- * A structure pointed by g_pDisplay holds all information\r
- * regarding the display, screen, root window etc.\r
- */\r
-SFG_Display fgDisplay;\r
-\r
-/*\r
- * The settings for the current freeglut session\r
- */\r
-SFG_State fgState = { { -1, -1, GL_FALSE },  /* Position */\r
-                      { 300, 300, GL_TRUE }, /* Size */\r
-                      GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH,  /* DisplayMode */\r
-                      GL_FALSE,              /* Initialised */\r
-                      GLUT_TRY_DIRECT_CONTEXT,  /* DirectContext */\r
-                      GL_FALSE,              /* ForceIconic */\r
-                      GL_FALSE,              /* UseCurrentContext */\r
-                      GL_FALSE,              /* GLDebugSwitch */\r
-                      GL_FALSE,              /* XSyncSwitch */\r
-                      GLUT_KEY_REPEAT_ON,    /* KeyRepeat */\r
-                      INVALID_MODIFIERS,     /* Modifiers */\r
-                      0,                     /* FPSInterval */\r
-                      0,                     /* SwapCount */\r
-                      0,                     /* SwapTime */\r
-                      0,                     /* Time */\r
-                      { NULL, NULL },         /* Timers */\r
-                      { NULL, NULL },         /* FreeTimers */\r
-                      NULL,                   /* IdleCallback */\r
-                      0,                      /* ActiveMenus */\r
-                      NULL,                   /* MenuStateCallback */\r
-                      NULL,                   /* MenuStatusCallback */\r
-                      { 640, 480, GL_TRUE },  /* GameModeSize */\r
-                      16,                     /* GameModeDepth */\r
-                      72,                     /* GameModeRefresh */\r
-                      GLUT_ACTION_EXIT,       /* ActionOnWindowClose */\r
-                      GLUT_EXEC_STATE_INIT,   /* ExecState */\r
-                      NULL,                   /* ProgramName */\r
-                      GL_FALSE,               /* JoysticksInitialised */\r
-                      0,                      /* NumActiveJoysticks */\r
-                      GL_FALSE,               /* InputDevsInitialised */\r
-                      0,                      /* MouseWheelTicks */\r
-                      1,                      /* AuxiliaryBufferNumber */\r
-                      4,                      /* SampleNumber */\r
-                      1,                      /* MajorVersion */\r
-                      0,                      /* MinorVersion */\r
-                      0,                      /* ContextFlags */\r
-                      0,                      /* ContextProfile */\r
-                      NULL,                   /* ErrorFunc */\r
-                      NULL                    /* WarningFunc */\r
-};\r
-\r
-\r
-/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */\r
-\r
-extern void fgPlatformInitialize( const char* displayName );\r
-extern void fgPlatformDeinitialiseInputDevices ( void );\r
-extern void fgPlatformCloseDisplay ( void );\r
-extern void fgPlatformDestroyContext ( SFG_PlatformDisplay pDisplay, SFG_WindowContextType MContext );\r
-\r
-\r
-void fghParseCommandLineArguments ( int* pargc, char** argv, char **pDisplayName, char **pGeometry )\r
-{\r
-#ifndef _WIN32_WCE\r
-    int i, j, argc = *pargc;\r
-\r
-    {\r
-           /* check if GLUT_FPS env var is set */\r
-        const char *fps = getenv( "GLUT_FPS" );\r
-\r
-        if( fps )\r
-        {\r
-            int interval;\r
-            sscanf( fps, "%d", &interval );\r
-\r
-            if( interval <= 0 )\r
-                fgState.FPSInterval = 5000;  /* 5000 millisecond default */\r
-            else\r
-                fgState.FPSInterval = interval;\r
-        }\r
-    }\r
-\r
-    *pDisplayName = getenv( "DISPLAY" );\r
-\r
-    for( i = 1; i < argc; i++ )\r
-    {\r
-        if( strcmp( argv[ i ], "-display" ) == 0 )\r
-        {\r
-            if( ++i >= argc )\r
-                fgError( "-display parameter must be followed by display name" );\r
-\r
-            *pDisplayName = argv[ i ];\r
-\r
-            argv[ i - 1 ] = NULL;\r
-            argv[ i     ] = NULL;\r
-            ( *pargc ) -= 2;\r
-        }\r
-        else if( strcmp( argv[ i ], "-geometry" ) == 0 )\r
-        {\r
-            if( ++i >= argc )\r
-                fgError( "-geometry parameter must be followed by window "\r
-                         "geometry settings" );\r
-\r
-            *pGeometry = argv[ i ];\r
-\r
-            argv[ i - 1 ] = NULL;\r
-            argv[ i     ] = NULL;\r
-            ( *pargc ) -= 2;\r
-        }\r
-        else if( strcmp( argv[ i ], "-direct" ) == 0)\r
-        {\r
-            if( fgState.DirectContext == GLUT_FORCE_INDIRECT_CONTEXT )\r
-                fgError( "parameters ambiguity, -direct and -indirect "\r
-                    "cannot be both specified" );\r
-\r
-            fgState.DirectContext = GLUT_FORCE_DIRECT_CONTEXT;\r
-            argv[ i ] = NULL;\r
-            ( *pargc )--;\r
-        }\r
-        else if( strcmp( argv[ i ], "-indirect" ) == 0 )\r
-        {\r
-            if( fgState.DirectContext == GLUT_FORCE_DIRECT_CONTEXT )\r
-                fgError( "parameters ambiguity, -direct and -indirect "\r
-                    "cannot be both specified" );\r
-\r
-            fgState.DirectContext = GLUT_FORCE_INDIRECT_CONTEXT;\r
-            argv[ i ] = NULL;\r
-            (*pargc)--;\r
-        }\r
-        else if( strcmp( argv[ i ], "-iconic" ) == 0 )\r
-        {\r
-            fgState.ForceIconic = GL_TRUE;\r
-            argv[ i ] = NULL;\r
-            ( *pargc )--;\r
-        }\r
-        else if( strcmp( argv[ i ], "-gldebug" ) == 0 )\r
-        {\r
-            fgState.GLDebugSwitch = GL_TRUE;\r
-            argv[ i ] = NULL;\r
-            ( *pargc )--;\r
-        }\r
-        else if( strcmp( argv[ i ], "-sync" ) == 0 )\r
-        {\r
-            fgState.XSyncSwitch = GL_TRUE;\r
-            argv[ i ] = NULL;\r
-            ( *pargc )--;\r
-        }\r
-    }\r
-\r
-    /* Compact {argv}. */\r
-    for( i = j = 1; i < *pargc; i++, j++ )\r
-    {\r
-        /* Guaranteed to end because there are "*pargc" arguments left */\r
-        while ( argv[ j ] == NULL )\r
-            j++;\r
-        if ( i != j )\r
-            argv[ i ] = argv[ j ];\r
-    }\r
-\r
-#endif /* _WIN32_WCE */\r
-\r
-}\r
-\r
-\r
-void fghCloseInputDevices ( void )\r
-{\r
-    if ( fgState.JoysticksInitialised )\r
-        fgJoystickClose( );\r
-\r
-    if ( fgState.InputDevsInitialised )\r
-        fgInputDeviceClose( );\r
-}\r
-\r
-\r
-/*\r
- * Perform the freeglut deinitialization...\r
- */\r
-void fgDeinitialize( void )\r
-{\r
-    SFG_Timer *timer;\r
-\r
-    if( !fgState.Initialised )\r
-    {\r
-        return;\r
-    }\r
-\r
-       /* If we're in game mode, we want to leave game mode */\r
-    if( fgStructure.GameModeWindow ) {\r
-        glutLeaveGameMode();\r
-    }\r
-\r
-    /* If there was a menu created, destroy the rendering context */\r
-    if( fgStructure.MenuContext )\r
-    {\r
-               fgPlatformDestroyContext (fgDisplay.pDisplay, fgStructure.MenuContext->MContext );\r
-        free( fgStructure.MenuContext );\r
-        fgStructure.MenuContext = NULL;\r
-    }\r
-\r
-    fgDestroyStructure( );\r
-\r
-    while( ( timer = fgState.Timers.First) )\r
-    {\r
-        fgListRemove( &fgState.Timers, &timer->Node );\r
-        free( timer );\r
-    }\r
-\r
-    while( ( timer = fgState.FreeTimers.First) )\r
-    {\r
-        fgListRemove( &fgState.FreeTimers, &timer->Node );\r
-        free( timer );\r
-    }\r
-\r
-       fgPlatformDeinitialiseInputDevices ();\r
-\r
-       fgState.MouseWheelTicks = 0;\r
-\r
-    fgState.MajorVersion = 1;\r
-    fgState.MinorVersion = 0;\r
-    fgState.ContextFlags = 0;\r
-    fgState.ContextProfile = 0;\r
-\r
-    fgState.Initialised = GL_FALSE;\r
-\r
-    fgState.Position.X = -1;\r
-    fgState.Position.Y = -1;\r
-    fgState.Position.Use = GL_FALSE;\r
-\r
-    fgState.Size.X = 300;\r
-    fgState.Size.Y = 300;\r
-    fgState.Size.Use = GL_TRUE;\r
-\r
-    fgState.DisplayMode = GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH;\r
-\r
-    fgState.DirectContext  = GLUT_TRY_DIRECT_CONTEXT;\r
-    fgState.ForceIconic         = GL_FALSE;\r
-    fgState.UseCurrentContext   = GL_FALSE;\r
-    fgState.GLDebugSwitch       = GL_FALSE;\r
-    fgState.XSyncSwitch         = GL_FALSE;\r
-    fgState.ActionOnWindowClose = GLUT_ACTION_EXIT;\r
-    fgState.ExecState           = GLUT_EXEC_STATE_INIT;\r
-\r
-    fgState.KeyRepeat       = GLUT_KEY_REPEAT_ON;\r
-    fgState.Modifiers       = INVALID_MODIFIERS;\r
-\r
-    fgState.GameModeSize.X  = 640;\r
-    fgState.GameModeSize.Y  = 480;\r
-    fgState.GameModeDepth   =  16;\r
-    fgState.GameModeRefresh =  72;\r
-\r
-    fgListInit( &fgState.Timers );\r
-    fgListInit( &fgState.FreeTimers );\r
-\r
-    fgState.IdleCallback = NULL;\r
-    fgState.MenuStateCallback = ( FGCBMenuState )NULL;\r
-    fgState.MenuStatusCallback = ( FGCBMenuStatus )NULL;\r
-\r
-    fgState.SwapCount   = 0;\r
-    fgState.SwapTime    = 0;\r
-    fgState.FPSInterval = 0;\r
-\r
-    if( fgState.ProgramName )\r
-    {\r
-        free( fgState.ProgramName );\r
-        fgState.ProgramName = NULL;\r
-    }\r
-\r
-       fgPlatformCloseDisplay ();\r
-\r
-    fgState.Initialised = GL_FALSE;\r
-}\r
-\r
-\r
-#if TARGET_HOST_MS_WINDOWS\r
-#define NoValue         0x0000\r
-#define XValue          0x0001\r
-#define YValue          0x0002\r
-#define WidthValue      0x0004\r
-#define HeightValue     0x0008\r
-#define AllValues       0x000F\r
-#define XNegative       0x0010\r
-#define YNegative       0x0020\r
-\r
-extern int XParseGeometry (\r
-    const char *string,\r
-    int *x,\r
-    int *y,\r
-    unsigned int *width,    /* RETURN */\r
-    unsigned int *height);    /* RETURN */\r
-#endif\r
-\r
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */\r
-\r
-/*\r
- * Perform initialization. This usually happens on the program startup\r
- * and restarting after glutMainLoop termination...\r
- */\r
-void FGAPIENTRY glutInit( int* pargc, char** argv )\r
-{\r
-    char* displayName = NULL;\r
-    char* geometry = NULL;\r
-    if( fgState.Initialised )\r
-        fgError( "illegal glutInit() reinitialization attempt" );\r
-\r
-    if (pargc && *pargc && argv && *argv && **argv)\r
-    {\r
-        fgState.ProgramName = strdup (*argv);\r
-\r
-        if( !fgState.ProgramName )\r
-            fgError ("Could not allocate space for the program's name.");\r
-    }\r
-\r
-    fgCreateStructure( );\r
-\r
-    /* Get start time */\r
-    fgState.Time = fgSystemTime();\r
-\r
-       fghParseCommandLineArguments ( pargc, argv, &displayName, &geometry );\r
-\r
-    /*\r
-     * Have the display created now. If there wasn't a "-display"\r
-     * in the program arguments, we will use the DISPLAY environment\r
-     * variable for opening the X display (see code above):\r
-     */\r
-    fgPlatformInitialize( displayName );\r
-\r
-    /*\r
-     * Geometry parsing deffered until here because we may need the screen\r
-     * size.\r
-     */\r
-\r
-    if (geometry )\r
-    {\r
-        unsigned int parsedWidth, parsedHeight;\r
-        int mask = XParseGeometry( geometry,\r
-                                   &fgState.Position.X, &fgState.Position.Y,\r
-                                   &parsedWidth, &parsedHeight );\r
-        /* TODO: Check for overflow? */\r
-        fgState.Size.X = parsedWidth;\r
-        fgState.Size.Y = parsedHeight;\r
-\r
-        if( (mask & (WidthValue|HeightValue)) == (WidthValue|HeightValue) )\r
-            fgState.Size.Use = GL_TRUE;\r
-\r
-        if( mask & XNegative )\r
-            fgState.Position.X += fgDisplay.ScreenWidth - fgState.Size.X;\r
-\r
-        if( mask & YNegative )\r
-            fgState.Position.Y += fgDisplay.ScreenHeight - fgState.Size.Y;\r
-\r
-        if( (mask & (XValue|YValue)) == (XValue|YValue) )\r
-            fgState.Position.Use = GL_TRUE;\r
-    }\r
-}\r
-\r
-/*\r
- * Undoes all the "glutInit" stuff\r
- */\r
-void FGAPIENTRY glutExit ( void )\r
-{\r
-  fgDeinitialize ();\r
-}\r
-\r
-/*\r
- * Sets the default initial window position for new windows\r
- */\r
-void FGAPIENTRY glutInitWindowPosition( int x, int y )\r
-{\r
-    fgState.Position.X = x;\r
-    fgState.Position.Y = y;\r
-\r
-    if( ( x >= 0 ) && ( y >= 0 ) )\r
-        fgState.Position.Use = GL_TRUE;\r
-    else\r
-        fgState.Position.Use = GL_FALSE;\r
-}\r
-\r
-/*\r
- * Sets the default initial window size for new windows\r
- */\r
-void FGAPIENTRY glutInitWindowSize( int width, int height )\r
-{\r
-    fgState.Size.X = width;\r
-    fgState.Size.Y = height;\r
-\r
-    if( ( width > 0 ) && ( height > 0 ) )\r
-        fgState.Size.Use = GL_TRUE;\r
-    else\r
-        fgState.Size.Use = GL_FALSE;\r
-}\r
-\r
-/*\r
- * Sets the default display mode for all new windows\r
- */\r
-void FGAPIENTRY glutInitDisplayMode( unsigned int displayMode )\r
-{\r
-    /* We will make use of this value when creating a new OpenGL context... */\r
-    fgState.DisplayMode = displayMode;\r
-}\r
-\r
-\r
-/* -- INIT DISPLAY STRING PARSING ------------------------------------------ */\r
-\r
-static char* Tokens[] =\r
-{\r
-    "alpha", "acca", "acc", "blue", "buffer", "conformant", "depth", "double",\r
-    "green", "index", "num", "red", "rgba", "rgb", "luminance", "stencil",\r
-    "single", "stereo", "samples", "slow", "win32pdf", "win32pfd", "xvisual",\r
-    "xstaticgray", "xgrayscale", "xstaticcolor", "xpseudocolor",\r
-    "xtruecolor", "xdirectcolor",\r
-    "xstaticgrey", "xgreyscale", "xstaticcolour", "xpseudocolour",\r
-    "xtruecolour", "xdirectcolour", "borderless", "aux"\r
-};\r
-#define NUM_TOKENS             (sizeof(Tokens) / sizeof(*Tokens))\r
-\r
-void FGAPIENTRY glutInitDisplayString( const char* displayMode )\r
-{\r
-    int glut_state_flag = 0 ;\r
-    /*\r
-     * Unpack a lot of options from a character string.  The options are\r
-     * delimited by blanks or tabs.\r
-     */\r
-    char *token ;\r
-    size_t len = strlen ( displayMode );\r
-    char *buffer = (char *)malloc ( (len+1) * sizeof(char) );\r
-    memcpy ( buffer, displayMode, len );\r
-    buffer[len] = '\0';\r
-\r
-    token = strtok ( buffer, " \t" );\r
-\r
-    while ( token )\r
-    {\r
-        /* Process this token */\r
-        int i ;\r
-\r
-        /* Temporary fix:  Ignore any length specifications and at least\r
-         * process the basic token\r
-         * TODO:  Fix this permanently\r
-         */\r
-        size_t cleanlength = strcspn ( token, "=<>~!" );\r
-\r
-        for ( i = 0; i < NUM_TOKENS; i++ )\r
-        {\r
-            if ( strncmp ( token, Tokens[i], cleanlength ) == 0 ) break ;\r
-        }\r
-\r
-        switch ( i )\r
-        {\r
-        case 0 :  /* "alpha":  Alpha color buffer precision in bits */\r
-            glut_state_flag |= GLUT_ALPHA ;  /* Somebody fix this for me! */\r
-            break ;\r
-\r
-        case 1 :  /* "acca":  Red, green, blue, and alpha accumulation buffer\r
-                     precision in bits */\r
-            break ;\r
-\r
-        case 2 :  /* "acc":  Red, green, and blue accumulation buffer precision\r
-                     in bits with zero bits alpha */\r
-            glut_state_flag |= GLUT_ACCUM ;  /* Somebody fix this for me! */\r
-            break ;\r
-\r
-        case 3 :  /* "blue":  Blue color buffer precision in bits */\r
-            break ;\r
-\r
-        case 4 :  /* "buffer":  Number of bits in the color index color buffer\r
-                   */\r
-            break ;\r
-\r
-        case 5 :  /* "conformant":  Boolean indicating if the frame buffer\r
-                     configuration is conformant or not */\r
-            break ;\r
-\r
-        case 6 : /* "depth":  Number of bits of precsion in the depth buffer */\r
-            glut_state_flag |= GLUT_DEPTH ;  /* Somebody fix this for me! */\r
-            break ;\r
-\r
-        case 7 :  /* "double":  Boolean indicating if the color buffer is\r
-                     double buffered */\r
-            glut_state_flag |= GLUT_DOUBLE ;\r
-            break ;\r
-\r
-        case 8 :  /* "green":  Green color buffer precision in bits */\r
-            break ;\r
-\r
-        case 9 :  /* "index":  Boolean if the color model is color index or not\r
-                   */\r
-            glut_state_flag |= GLUT_INDEX ;\r
-            break ;\r
-\r
-        case 10 :  /* "num":  A special capability  name indicating where the\r
-                      value represents the Nth frame buffer configuration\r
-                      matching the description string */\r
-            break ;\r
-\r
-        case 11 :  /* "red":  Red color buffer precision in bits */\r
-            break ;\r
-\r
-        case 12 :  /* "rgba":  Number of bits of red, green, blue, and alpha in\r
-                      the RGBA color buffer */\r
-            glut_state_flag |= GLUT_RGBA ;  /* Somebody fix this for me! */\r
-            break ;\r
-\r
-        case 13 :  /* "rgb":  Number of bits of red, green, and blue in the\r
-                      RGBA color buffer with zero bits alpha */\r
-            glut_state_flag |= GLUT_RGB ;  /* Somebody fix this for me! */\r
-            break ;\r
-\r
-        case 14 :  /* "luminance":  Number of bits of red in the RGBA and zero\r
-                      bits of green, blue (alpha not specified) of color buffer\r
-                      precision */\r
-            glut_state_flag |= GLUT_LUMINANCE ; /* Somebody fix this for me! */\r
-            break ;\r
-\r
-        case 15 :  /* "stencil":  Number of bits in the stencil buffer */\r
-            glut_state_flag |= GLUT_STENCIL;  /* Somebody fix this for me! */\r
-            break ;\r
-\r
-        case 16 :  /* "single":  Boolean indicate the color buffer is single\r
-                      buffered */\r
-            glut_state_flag |= GLUT_SINGLE ;\r
-            break ;\r
-\r
-        case 17 :  /* "stereo":  Boolean indicating the color buffer supports\r
-                      OpenGL-style stereo */\r
-            glut_state_flag |= GLUT_STEREO ;\r
-            break ;\r
-\r
-        case 18 :  /* "samples":  Indicates the number of multisamples to use\r
-                      based on GLX's SGIS_multisample extension (for\r
-                      antialiasing) */\r
-            glut_state_flag |= GLUT_MULTISAMPLE ; /*Somebody fix this for me!*/\r
-            break ;\r
-\r
-        case 19 :  /* "slow":  Boolean indicating if the frame buffer\r
-                      configuration is slow or not */\r
-            break ;\r
-\r
-        case 20 :  /* "win32pdf": (incorrect spelling but was there before */\r
-        case 21 :  /* "win32pfd":  matches the Win32 Pixel Format Descriptor by\r
-                      number */\r
-#if TARGET_HOST_MS_WINDOWS\r
-#endif\r
-            break ;\r
-\r
-        case 22 :  /* "xvisual":  matches the X visual ID by number */\r
-#if TARGET_HOST_POSIX_X11\r
-#endif\r
-            break ;\r
-\r
-        case 23 :  /* "xstaticgray": */\r
-        case 29 :  /* "xstaticgrey":  boolean indicating if the frame buffer\r
-                      configuration's X visual is of type StaticGray */\r
-#if TARGET_HOST_POSIX_X11\r
-#endif\r
-            break ;\r
-\r
-        case 24 :  /* "xgrayscale": */\r
-        case 30 :  /* "xgreyscale":  boolean indicating if the frame buffer\r
-                      configuration's X visual is of type GrayScale */\r
-#if TARGET_HOST_POSIX_X11\r
-#endif\r
-            break ;\r
-\r
-        case 25 :  /* "xstaticcolor": */\r
-        case 31 :  /* "xstaticcolour":  boolean indicating if the frame buffer\r
-                      configuration's X visual is of type StaticColor */\r
-#if TARGET_HOST_POSIX_X11\r
-#endif\r
-            break ;\r
-\r
-        case 26 :  /* "xpseudocolor": */\r
-        case 32 :  /* "xpseudocolour":  boolean indicating if the frame buffer\r
-                      configuration's X visual is of type PseudoColor */\r
-#if TARGET_HOST_POSIX_X11\r
-#endif\r
-            break ;\r
-\r
-        case 27 :  /* "xtruecolor": */\r
-        case 33 :  /* "xtruecolour":  boolean indicating if the frame buffer\r
-                      configuration's X visual is of type TrueColor */\r
-#if TARGET_HOST_POSIX_X11\r
-#endif\r
-            break ;\r
-\r
-        case 28 :  /* "xdirectcolor": */\r
-        case 34 :  /* "xdirectcolour":  boolean indicating if the frame buffer\r
-                      configuration's X visual is of type DirectColor */\r
-#if TARGET_HOST_POSIX_X11\r
-#endif\r
-            break ;\r
-\r
-        case 35 :  /* "borderless":  windows should not have borders */\r
-#if TARGET_HOST_POSIX_X11\r
-#endif\r
-            break ;\r
-\r
-        case 36 :  /* "aux":  some number of aux buffers */\r
-            glut_state_flag |= GLUT_AUX;\r
-            break ;\r
-\r
-        case 37 :  /* Unrecognized */\r
-            fgWarning ( "WARNING - Display string token not recognized:  %s",\r
-                        token );\r
-            break ;\r
-        }\r
-\r
-        token = strtok ( NULL, " \t" );\r
-    }\r
-\r
-    free ( buffer );\r
-\r
-    /* We will make use of this value when creating a new OpenGL context... */\r
-    fgState.DisplayMode = glut_state_flag;\r
-}\r
-\r
-/* -- SETTING OPENGL 3.0 CONTEXT CREATION PARAMETERS ---------------------- */\r
-\r
-void FGAPIENTRY glutInitContextVersion( int majorVersion, int minorVersion )\r
-{\r
-    /* We will make use of these valuse when creating a new OpenGL context... */\r
-    fgState.MajorVersion = majorVersion;\r
-    fgState.MinorVersion = minorVersion;\r
-}\r
-\r
-\r
-void FGAPIENTRY glutInitContextFlags( int flags )\r
-{\r
-    /* We will make use of this value when creating a new OpenGL context... */\r
-    fgState.ContextFlags = flags;\r
-}\r
-\r
-void FGAPIENTRY glutInitContextProfile( int profile )\r
-{\r
-    /* We will make use of this value when creating a new OpenGL context... */\r
-    fgState.ContextProfile = profile;\r
-}\r
-\r
-/* -------------- User Defined Error/Warning Handler Support -------------- */\r
-\r
-/*\r
- * Sets the user error handler (note the use of va_list for the args to the fmt)\r
- */\r
-void FGAPIENTRY glutInitErrorFunc( void (* vfgError) ( const char *fmt, va_list ap ) )\r
-{\r
-    /* This allows user programs to handle freeglut errors */\r
-    fgState.ErrorFunc = vfgError;\r
-}\r
-\r
-/*\r
- * Sets the user warning handler (note the use of va_list for the args to the fmt)\r
- */\r
-void FGAPIENTRY glutInitWarningFunc( void (* vfgWarning) ( const char *fmt, va_list ap ) )\r
-{\r
-    /* This allows user programs to handle freeglut warnings */\r
-    fgState.WarningFunc = vfgWarning;\r
-}\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_init.c
+ *
+ * Various freeglut initialization functions.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Thu Dec 2 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#define FREEGLUT_BUILDING_LIB
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ *
+ *  fgDeinitialize()        -- Win32's OK, X11 needs the OS-specific
+ *                             deinitialization done
+ *  glutInitDisplayString() -- display mode string parsing
+ *
+ * Wouldn't it be cool to use gettext() for error messages? I just love
+ * bash saying  "nie znaleziono pliku" instead of "file not found" :)
+ * Is gettext easily portable?
+ */
+
+/* -- GLOBAL VARIABLES ----------------------------------------------------- */
+
+/*
+ * A structure pointed by g_pDisplay holds all information
+ * regarding the display, screen, root window etc.
+ */
+SFG_Display fgDisplay;
+
+/*
+ * The settings for the current freeglut session
+ */
+SFG_State fgState = { { -1, -1, GL_FALSE },  /* Position */
+                      { 300, 300, GL_TRUE }, /* Size */
+                      GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH,  /* DisplayMode */
+                      GL_FALSE,              /* Initialised */
+                      GLUT_TRY_DIRECT_CONTEXT,  /* DirectContext */
+                      GL_FALSE,              /* ForceIconic */
+                      GL_FALSE,              /* UseCurrentContext */
+                      GL_FALSE,              /* GLDebugSwitch */
+                      GL_FALSE,              /* XSyncSwitch */
+                      GLUT_KEY_REPEAT_ON,    /* KeyRepeat */
+                      INVALID_MODIFIERS,     /* Modifiers */
+                      0,                     /* FPSInterval */
+                      0,                     /* SwapCount */
+                      0,                     /* SwapTime */
+                      0,                     /* Time */
+                      { NULL, NULL },         /* Timers */
+                      { NULL, NULL },         /* FreeTimers */
+                      NULL,                   /* IdleCallback */
+                      0,                      /* ActiveMenus */
+                      NULL,                   /* MenuStateCallback */
+                      NULL,                   /* MenuStatusCallback */
+                      { 640, 480, GL_TRUE },  /* GameModeSize */
+                      16,                     /* GameModeDepth */
+                      72,                     /* GameModeRefresh */
+                      GLUT_ACTION_EXIT,       /* ActionOnWindowClose */
+                      GLUT_EXEC_STATE_INIT,   /* ExecState */
+                      NULL,                   /* ProgramName */
+                      GL_FALSE,               /* JoysticksInitialised */
+                      0,                      /* NumActiveJoysticks */
+                      GL_FALSE,               /* InputDevsInitialised */
+                      0,                      /* MouseWheelTicks */
+                      1,                      /* AuxiliaryBufferNumber */
+                      4,                      /* SampleNumber */
+                      1,                      /* MajorVersion */
+                      0,                      /* MinorVersion */
+                      0,                      /* ContextFlags */
+                      0,                      /* ContextProfile */
+                      NULL,                   /* ErrorFunc */
+                      NULL                    /* WarningFunc */
+};
+
+
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
+
+extern void fgPlatformInitialize( const char* displayName );
+extern void fgPlatformDeinitialiseInputDevices ( void );
+extern void fgPlatformCloseDisplay ( void );
+extern void fgPlatformDestroyContext ( SFG_PlatformDisplay pDisplay, SFG_WindowContextType MContext );
+
+
+void fghParseCommandLineArguments ( int* pargc, char** argv, char **pDisplayName, char **pGeometry )
+{
+#ifndef _WIN32_WCE
+    int i, j, argc = *pargc;
+
+    {
+           /* check if GLUT_FPS env var is set */
+        const char *fps = getenv( "GLUT_FPS" );
+
+        if( fps )
+        {
+            int interval;
+            sscanf( fps, "%d", &interval );
+
+            if( interval <= 0 )
+                fgState.FPSInterval = 5000;  /* 5000 millisecond default */
+            else
+                fgState.FPSInterval = interval;
+        }
+    }
+
+    *pDisplayName = getenv( "DISPLAY" );
+
+    for( i = 1; i < argc; i++ )
+    {
+        if( strcmp( argv[ i ], "-display" ) == 0 )
+        {
+            if( ++i >= argc )
+                fgError( "-display parameter must be followed by display name" );
+
+            *pDisplayName = argv[ i ];
+
+            argv[ i - 1 ] = NULL;
+            argv[ i     ] = NULL;
+            ( *pargc ) -= 2;
+        }
+        else if( strcmp( argv[ i ], "-geometry" ) == 0 )
+        {
+            if( ++i >= argc )
+                fgError( "-geometry parameter must be followed by window "
+                         "geometry settings" );
+
+            *pGeometry = argv[ i ];
+
+            argv[ i - 1 ] = NULL;
+            argv[ i     ] = NULL;
+            ( *pargc ) -= 2;
+        }
+        else if( strcmp( argv[ i ], "-direct" ) == 0)
+        {
+            if( fgState.DirectContext == GLUT_FORCE_INDIRECT_CONTEXT )
+                fgError( "parameters ambiguity, -direct and -indirect "
+                    "cannot be both specified" );
+
+            fgState.DirectContext = GLUT_FORCE_DIRECT_CONTEXT;
+            argv[ i ] = NULL;
+            ( *pargc )--;
+        }
+        else if( strcmp( argv[ i ], "-indirect" ) == 0 )
+        {
+            if( fgState.DirectContext == GLUT_FORCE_DIRECT_CONTEXT )
+                fgError( "parameters ambiguity, -direct and -indirect "
+                    "cannot be both specified" );
+
+            fgState.DirectContext = GLUT_FORCE_INDIRECT_CONTEXT;
+            argv[ i ] = NULL;
+            (*pargc)--;
+        }
+        else if( strcmp( argv[ i ], "-iconic" ) == 0 )
+        {
+            fgState.ForceIconic = GL_TRUE;
+            argv[ i ] = NULL;
+            ( *pargc )--;
+        }
+        else if( strcmp( argv[ i ], "-gldebug" ) == 0 )
+        {
+            fgState.GLDebugSwitch = GL_TRUE;
+            argv[ i ] = NULL;
+            ( *pargc )--;
+        }
+        else if( strcmp( argv[ i ], "-sync" ) == 0 )
+        {
+            fgState.XSyncSwitch = GL_TRUE;
+            argv[ i ] = NULL;
+            ( *pargc )--;
+        }
+    }
+
+    /* Compact {argv}. */
+    for( i = j = 1; i < *pargc; i++, j++ )
+    {
+        /* Guaranteed to end because there are "*pargc" arguments left */
+        while ( argv[ j ] == NULL )
+            j++;
+        if ( i != j )
+            argv[ i ] = argv[ j ];
+    }
+
+#endif /* _WIN32_WCE */
+
+}
+
+
+void fghCloseInputDevices ( void )
+{
+    if ( fgState.JoysticksInitialised )
+        fgJoystickClose( );
+
+    if ( fgState.InputDevsInitialised )
+        fgInputDeviceClose( );
+}
+
+
+/*
+ * Perform the freeglut deinitialization...
+ */
+void fgDeinitialize( void )
+{
+    SFG_Timer *timer;
+
+    if( !fgState.Initialised )
+    {
+        return;
+    }
+
+       /* If we're in game mode, we want to leave game mode */
+    if( fgStructure.GameModeWindow ) {
+        glutLeaveGameMode();
+    }
+
+    /* If there was a menu created, destroy the rendering context */
+    if( fgStructure.MenuContext )
+    {
+               fgPlatformDestroyContext (fgDisplay.pDisplay, fgStructure.MenuContext->MContext );
+        free( fgStructure.MenuContext );
+        fgStructure.MenuContext = NULL;
+    }
+
+    fgDestroyStructure( );
+
+    while( ( timer = fgState.Timers.First) )
+    {
+        fgListRemove( &fgState.Timers, &timer->Node );
+        free( timer );
+    }
+
+    while( ( timer = fgState.FreeTimers.First) )
+    {
+        fgListRemove( &fgState.FreeTimers, &timer->Node );
+        free( timer );
+    }
+
+       fgPlatformDeinitialiseInputDevices ();
+
+       fgState.MouseWheelTicks = 0;
+
+    fgState.MajorVersion = 1;
+    fgState.MinorVersion = 0;
+    fgState.ContextFlags = 0;
+    fgState.ContextProfile = 0;
+
+    fgState.Initialised = GL_FALSE;
+
+    fgState.Position.X = -1;
+    fgState.Position.Y = -1;
+    fgState.Position.Use = GL_FALSE;
+
+    fgState.Size.X = 300;
+    fgState.Size.Y = 300;
+    fgState.Size.Use = GL_TRUE;
+
+    fgState.DisplayMode = GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH;
+
+    fgState.DirectContext  = GLUT_TRY_DIRECT_CONTEXT;
+    fgState.ForceIconic         = GL_FALSE;
+    fgState.UseCurrentContext   = GL_FALSE;
+    fgState.GLDebugSwitch       = GL_FALSE;
+    fgState.XSyncSwitch         = GL_FALSE;
+    fgState.ActionOnWindowClose = GLUT_ACTION_EXIT;
+    fgState.ExecState           = GLUT_EXEC_STATE_INIT;
+
+    fgState.KeyRepeat       = GLUT_KEY_REPEAT_ON;
+    fgState.Modifiers       = INVALID_MODIFIERS;
+
+    fgState.GameModeSize.X  = 640;
+    fgState.GameModeSize.Y  = 480;
+    fgState.GameModeDepth   =  16;
+    fgState.GameModeRefresh =  72;
+
+    fgListInit( &fgState.Timers );
+    fgListInit( &fgState.FreeTimers );
+
+    fgState.IdleCallback = NULL;
+    fgState.MenuStateCallback = ( FGCBMenuState )NULL;
+    fgState.MenuStatusCallback = ( FGCBMenuStatus )NULL;
+
+    fgState.SwapCount   = 0;
+    fgState.SwapTime    = 0;
+    fgState.FPSInterval = 0;
+
+    if( fgState.ProgramName )
+    {
+        free( fgState.ProgramName );
+        fgState.ProgramName = NULL;
+    }
+
+       fgPlatformCloseDisplay ();
+
+    fgState.Initialised = GL_FALSE;
+}
+
+
+#if TARGET_HOST_MS_WINDOWS
+#define NoValue         0x0000
+#define XValue          0x0001
+#define YValue          0x0002
+#define WidthValue      0x0004
+#define HeightValue     0x0008
+#define AllValues       0x000F
+#define XNegative       0x0010
+#define YNegative       0x0020
+
+extern int XParseGeometry (
+    const char *string,
+    int *x,
+    int *y,
+    unsigned int *width,    /* RETURN */
+    unsigned int *height);    /* RETURN */
+#endif
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Perform initialization. This usually happens on the program startup
+ * and restarting after glutMainLoop termination...
+ */
+void FGAPIENTRY glutInit( int* pargc, char** argv )
+{
+    char* displayName = NULL;
+    char* geometry = NULL;
+    if( fgState.Initialised )
+        fgError( "illegal glutInit() reinitialization attempt" );
+
+    if (pargc && *pargc && argv && *argv && **argv)
+    {
+        fgState.ProgramName = strdup (*argv);
+
+        if( !fgState.ProgramName )
+            fgError ("Could not allocate space for the program's name.");
+    }
+
+    fgCreateStructure( );
+
+    /* Get start time */
+    fgState.Time = fgSystemTime();
+
+       fghParseCommandLineArguments ( pargc, argv, &displayName, &geometry );
+
+    /*
+     * Have the display created now. If there wasn't a "-display"
+     * in the program arguments, we will use the DISPLAY environment
+     * variable for opening the X display (see code above):
+     */
+    fgPlatformInitialize( displayName );
+
+    /*
+     * Geometry parsing deffered until here because we may need the screen
+     * size.
+     */
+
+    if (geometry )
+    {
+        unsigned int parsedWidth, parsedHeight;
+        int mask = XParseGeometry( geometry,
+                                   &fgState.Position.X, &fgState.Position.Y,
+                                   &parsedWidth, &parsedHeight );
+        /* TODO: Check for overflow? */
+        fgState.Size.X = parsedWidth;
+        fgState.Size.Y = parsedHeight;
+
+        if( (mask & (WidthValue|HeightValue)) == (WidthValue|HeightValue) )
+            fgState.Size.Use = GL_TRUE;
+
+        if( mask & XNegative )
+            fgState.Position.X += fgDisplay.ScreenWidth - fgState.Size.X;
+
+        if( mask & YNegative )
+            fgState.Position.Y += fgDisplay.ScreenHeight - fgState.Size.Y;
+
+        if( (mask & (XValue|YValue)) == (XValue|YValue) )
+            fgState.Position.Use = GL_TRUE;
+    }
+}
+
+/*
+ * Undoes all the "glutInit" stuff
+ */
+void FGAPIENTRY glutExit ( void )
+{
+  fgDeinitialize ();
+}
+
+/*
+ * Sets the default initial window position for new windows
+ */
+void FGAPIENTRY glutInitWindowPosition( int x, int y )
+{
+    fgState.Position.X = x;
+    fgState.Position.Y = y;
+
+    if( ( x >= 0 ) && ( y >= 0 ) )
+        fgState.Position.Use = GL_TRUE;
+    else
+        fgState.Position.Use = GL_FALSE;
+}
+
+/*
+ * Sets the default initial window size for new windows
+ */
+void FGAPIENTRY glutInitWindowSize( int width, int height )
+{
+    fgState.Size.X = width;
+    fgState.Size.Y = height;
+
+    if( ( width > 0 ) && ( height > 0 ) )
+        fgState.Size.Use = GL_TRUE;
+    else
+        fgState.Size.Use = GL_FALSE;
+}
+
+/*
+ * Sets the default display mode for all new windows
+ */
+void FGAPIENTRY glutInitDisplayMode( unsigned int displayMode )
+{
+    /* We will make use of this value when creating a new OpenGL context... */
+    fgState.DisplayMode = displayMode;
+}
+
+
+/* -- INIT DISPLAY STRING PARSING ------------------------------------------ */
+
+static char* Tokens[] =
+{
+    "alpha", "acca", "acc", "blue", "buffer", "conformant", "depth", "double",
+    "green", "index", "num", "red", "rgba", "rgb", "luminance", "stencil",
+    "single", "stereo", "samples", "slow", "win32pdf", "win32pfd", "xvisual",
+    "xstaticgray", "xgrayscale", "xstaticcolor", "xpseudocolor",
+    "xtruecolor", "xdirectcolor",
+    "xstaticgrey", "xgreyscale", "xstaticcolour", "xpseudocolour",
+    "xtruecolour", "xdirectcolour", "borderless", "aux"
+};
+#define NUM_TOKENS             (sizeof(Tokens) / sizeof(*Tokens))
+
+void FGAPIENTRY glutInitDisplayString( const char* displayMode )
+{
+    int glut_state_flag = 0 ;
+    /*
+     * Unpack a lot of options from a character string.  The options are
+     * delimited by blanks or tabs.
+     */
+    char *token ;
+    size_t len = strlen ( displayMode );
+    char *buffer = (char *)malloc ( (len+1) * sizeof(char) );
+    memcpy ( buffer, displayMode, len );
+    buffer[len] = '\0';
+
+    token = strtok ( buffer, " \t" );
+
+    while ( token )
+    {
+        /* Process this token */
+        int i ;
+
+        /* Temporary fix:  Ignore any length specifications and at least
+         * process the basic token
+         * TODO:  Fix this permanently
+         */
+        size_t cleanlength = strcspn ( token, "=<>~!" );
+
+        for ( i = 0; i < NUM_TOKENS; i++ )
+        {
+            if ( strncmp ( token, Tokens[i], cleanlength ) == 0 ) break ;
+        }
+
+        switch ( i )
+        {
+        case 0 :  /* "alpha":  Alpha color buffer precision in bits */
+            glut_state_flag |= GLUT_ALPHA ;  /* Somebody fix this for me! */
+            break ;
+
+        case 1 :  /* "acca":  Red, green, blue, and alpha accumulation buffer
+                     precision in bits */
+            break ;
+
+        case 2 :  /* "acc":  Red, green, and blue accumulation buffer precision
+                     in bits with zero bits alpha */
+            glut_state_flag |= GLUT_ACCUM ;  /* Somebody fix this for me! */
+            break ;
+
+        case 3 :  /* "blue":  Blue color buffer precision in bits */
+            break ;
+
+        case 4 :  /* "buffer":  Number of bits in the color index color buffer
+                   */
+            break ;
+
+        case 5 :  /* "conformant":  Boolean indicating if the frame buffer
+                     configuration is conformant or not */
+            break ;
+
+        case 6 : /* "depth":  Number of bits of precsion in the depth buffer */
+            glut_state_flag |= GLUT_DEPTH ;  /* Somebody fix this for me! */
+            break ;
+
+        case 7 :  /* "double":  Boolean indicating if the color buffer is
+                     double buffered */
+            glut_state_flag |= GLUT_DOUBLE ;
+            break ;
+
+        case 8 :  /* "green":  Green color buffer precision in bits */
+            break ;
+
+        case 9 :  /* "index":  Boolean if the color model is color index or not
+                   */
+            glut_state_flag |= GLUT_INDEX ;
+            break ;
+
+        case 10 :  /* "num":  A special capability  name indicating where the
+                      value represents the Nth frame buffer configuration
+                      matching the description string */
+            break ;
+
+        case 11 :  /* "red":  Red color buffer precision in bits */
+            break ;
+
+        case 12 :  /* "rgba":  Number of bits of red, green, blue, and alpha in
+                      the RGBA color buffer */
+            glut_state_flag |= GLUT_RGBA ;  /* Somebody fix this for me! */
+            break ;
+
+        case 13 :  /* "rgb":  Number of bits of red, green, and blue in the
+                      RGBA color buffer with zero bits alpha */
+            glut_state_flag |= GLUT_RGB ;  /* Somebody fix this for me! */
+            break ;
+
+        case 14 :  /* "luminance":  Number of bits of red in the RGBA and zero
+                      bits of green, blue (alpha not specified) of color buffer
+                      precision */
+            glut_state_flag |= GLUT_LUMINANCE ; /* Somebody fix this for me! */
+            break ;
+
+        case 15 :  /* "stencil":  Number of bits in the stencil buffer */
+            glut_state_flag |= GLUT_STENCIL;  /* Somebody fix this for me! */
+            break ;
+
+        case 16 :  /* "single":  Boolean indicate the color buffer is single
+                      buffered */
+            glut_state_flag |= GLUT_SINGLE ;
+            break ;
+
+        case 17 :  /* "stereo":  Boolean indicating the color buffer supports
+                      OpenGL-style stereo */
+            glut_state_flag |= GLUT_STEREO ;
+            break ;
+
+        case 18 :  /* "samples":  Indicates the number of multisamples to use
+                      based on GLX's SGIS_multisample extension (for
+                      antialiasing) */
+            glut_state_flag |= GLUT_MULTISAMPLE ; /*Somebody fix this for me!*/
+            break ;
+
+        case 19 :  /* "slow":  Boolean indicating if the frame buffer
+                      configuration is slow or not */
+            break ;
+
+        case 20 :  /* "win32pdf": (incorrect spelling but was there before */
+        case 21 :  /* "win32pfd":  matches the Win32 Pixel Format Descriptor by
+                      number */
+#if TARGET_HOST_MS_WINDOWS
+#endif
+            break ;
+
+        case 22 :  /* "xvisual":  matches the X visual ID by number */
+#if TARGET_HOST_POSIX_X11
+#endif
+            break ;
+
+        case 23 :  /* "xstaticgray": */
+        case 29 :  /* "xstaticgrey":  boolean indicating if the frame buffer
+                      configuration's X visual is of type StaticGray */
+#if TARGET_HOST_POSIX_X11
+#endif
+            break ;
+
+        case 24 :  /* "xgrayscale": */
+        case 30 :  /* "xgreyscale":  boolean indicating if the frame buffer
+                      configuration's X visual is of type GrayScale */
+#if TARGET_HOST_POSIX_X11
+#endif
+            break ;
+
+        case 25 :  /* "xstaticcolor": */
+        case 31 :  /* "xstaticcolour":  boolean indicating if the frame buffer
+                      configuration's X visual is of type StaticColor */
+#if TARGET_HOST_POSIX_X11
+#endif
+            break ;
+
+        case 26 :  /* "xpseudocolor": */
+        case 32 :  /* "xpseudocolour":  boolean indicating if the frame buffer
+                      configuration's X visual is of type PseudoColor */
+#if TARGET_HOST_POSIX_X11
+#endif
+            break ;
+
+        case 27 :  /* "xtruecolor": */
+        case 33 :  /* "xtruecolour":  boolean indicating if the frame buffer
+                      configuration's X visual is of type TrueColor */
+#if TARGET_HOST_POSIX_X11
+#endif
+            break ;
+
+        case 28 :  /* "xdirectcolor": */
+        case 34 :  /* "xdirectcolour":  boolean indicating if the frame buffer
+                      configuration's X visual is of type DirectColor */
+#if TARGET_HOST_POSIX_X11
+#endif
+            break ;
+
+        case 35 :  /* "borderless":  windows should not have borders */
+#if TARGET_HOST_POSIX_X11
+#endif
+            break ;
+
+        case 36 :  /* "aux":  some number of aux buffers */
+            glut_state_flag |= GLUT_AUX;
+            break ;
+
+        case 37 :  /* Unrecognized */
+            fgWarning ( "WARNING - Display string token not recognized:  %s",
+                        token );
+            break ;
+        }
+
+        token = strtok ( NULL, " \t" );
+    }
+
+    free ( buffer );
+
+    /* We will make use of this value when creating a new OpenGL context... */
+    fgState.DisplayMode = glut_state_flag;
+}
+
+/* -- SETTING OPENGL 3.0 CONTEXT CREATION PARAMETERS ---------------------- */
+
+void FGAPIENTRY glutInitContextVersion( int majorVersion, int minorVersion )
+{
+    /* We will make use of these valuse when creating a new OpenGL context... */
+    fgState.MajorVersion = majorVersion;
+    fgState.MinorVersion = minorVersion;
+}
+
+
+void FGAPIENTRY glutInitContextFlags( int flags )
+{
+    /* We will make use of this value when creating a new OpenGL context... */
+    fgState.ContextFlags = flags;
+}
+
+void FGAPIENTRY glutInitContextProfile( int profile )
+{
+    /* We will make use of this value when creating a new OpenGL context... */
+    fgState.ContextProfile = profile;
+}
+
+/* -------------- User Defined Error/Warning Handler Support -------------- */
+
+/*
+ * Sets the user error handler (note the use of va_list for the args to the fmt)
+ */
+void FGAPIENTRY glutInitErrorFunc( void (* vfgError) ( const char *fmt, va_list ap ) )
+{
+    /* This allows user programs to handle freeglut errors */
+    fgState.ErrorFunc = vfgError;
+}
+
+/*
+ * Sets the user warning handler (note the use of va_list for the args to the fmt)
+ */
+void FGAPIENTRY glutInitWarningFunc( void (* vfgWarning) ( const char *fmt, va_list ap ) )
+{
+    /* This allows user programs to handle freeglut warnings */
+    fgState.WarningFunc = vfgWarning;
+}
+
+/*** END OF FILE ***/
index 7cff5a0..1dab040 100644 (file)
-/*\r
- * freeglut_input_devices.c\r
- *\r
- * Handles miscellaneous input devices via direct serial-port access.\r
- * Proper X11 XInput device support is not yet supported.\r
- * Also lacks Mac support.\r
- *\r
- * Written by Joe Krahn <krahn@niehs.nih.gov> 2005\r
- *\r
- * Copyright (c) 2005 Stephen J. Baker. All Rights Reserved.\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA OR STEPHEN J. BAKER BE LIABLE FOR ANY CLAIM, DAMAGES OR\r
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\r
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
- * DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#ifdef HAVE_CONFIG_H\r
-#    include "config.h"\r
-#endif\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-typedef struct _serialport SERIALPORT;\r
-\r
-\r
-/********************* Dialbox definitions ***********************/\r
-\r
-#define DIAL_NUM_VALUATORS 8\r
-\r
-/* dial parser state machine states */\r
-#define DIAL_NEW                (-1)\r
-#define DIAL_WHICH_DEVICE       0\r
-#define DIAL_VALUE_HIGH         1\r
-#define DIAL_VALUE_LOW          2\r
-\r
-/* dial/button box commands */\r
-#define DIAL_INITIALIZE                 0x20\r
-#define DIAL_SET_LEDS                   0x75\r
-#define DIAL_SET_TEXT                   0x61\r
-#define DIAL_SET_AUTO_DIALS             0x50\r
-#define DIAL_SET_AUTO_DELTA_DIALS       0x51\r
-#define DIAL_SET_FILTER                 0x53\r
-#define DIAL_SET_BUTTONS_MOM_TYPE       0x71\r
-#define DIAL_SET_AUTO_MOM_BUTTONS       0x73\r
-#define DIAL_SET_ALL_LEDS               0x4b\r
-#define DIAL_CLEAR_ALL_LEDS             0x4c\r
-\r
-/* dial/button box replies and events */\r
-#define DIAL_INITIALIZED        0x20\r
-#define DIAL_BASE               0x30\r
-#define DIAL_DELTA_BASE         0x40\r
-#define DIAL_PRESS_BASE         0xc0\r
-#define DIAL_RELEASE_BASE       0xe0\r
-\r
-/* macros to determine reply type */\r
-#define IS_DIAL_EVENT(ch)       (((ch)>=DIAL_BASE)&&((ch)<DIAL_BASE+DIAL_NUM_VALUATORS))\r
-#define IS_KEY_PRESS(ch)        (((ch)>=DIAL_PRESS_BASE)&&((ch)<DIAL_PRESS_BASE+DIAL_NUM_BUTTONS))\r
-#define IS_KEY_RELEASE(ch)      (((ch)>=DIAL_RELEASE_BASE)&&((ch)<DIAL_RELEASE_BASE+DIAL_NUM_BUTTONS))\r
-#define IS_INIT_EVENT(ch)       ((ch)==DIAL_INITIALIZED)\r
-\r
-/*****************************************************************/\r
-\r
-extern SERIALPORT *serial_open ( const char *device );\r
-extern void serial_close ( SERIALPORT *port );\r
-extern int serial_getchar ( SERIALPORT *port );\r
-extern int serial_putchar ( SERIALPORT *port, unsigned char ch );\r
-extern void serial_flush ( SERIALPORT *port );\r
-\r
-extern void fgPlatformRegisterDialDevice ( const char *dial_device );\r
-static void send_dial_event(int dial, int value);\r
-static void poll_dials(int id);\r
-\r
-/* local variables */\r
-static SERIALPORT *dialbox_port=NULL;\r
-\r
-/*****************************************************************/\r
-\r
-/*\r
- * Implementation for glutDeviceGet(GLUT_HAS_DIAL_AND_BUTTON_BOX)\r
- */\r
-int fgInputDeviceDetect( void )\r
-{\r
-    fgInitialiseInputDevices ();\r
-\r
-    if ( !dialbox_port )\r
-        return 0;\r
-\r
-    if ( !fgState.InputDevsInitialised )\r
-        return 0;\r
-\r
-    return 1;\r
-}\r
-\r
-/*\r
- * Try initializing the input device(s)\r
- */\r
-void fgInitialiseInputDevices ( void )\r
-{\r
-    if( !fgState.InputDevsInitialised )\r
-    {\r
-        const char *dial_device=NULL;\r
-        dial_device = getenv ( "GLUT_DIALS_SERIAL" );\r
-               fgPlatformRegisterDialDevice ( dial_device );\r
-\r
-        if ( !dial_device ) return;\r
-        if ( !( dialbox_port = serial_open ( dial_device ) ) ) return;\r
-        serial_putchar(dialbox_port,DIAL_INITIALIZE);\r
-        glutTimerFunc ( 10, poll_dials, 0 );\r
-        fgState.InputDevsInitialised = GL_TRUE;\r
-    }\r
-}\r
-\r
-/*\r
- *\r
- */\r
-void fgInputDeviceClose( void )\r
-{\r
-    if ( fgState.InputDevsInitialised )\r
-    {\r
-        serial_close ( dialbox_port );\r
-        dialbox_port = NULL;\r
-        fgState.InputDevsInitialised = GL_FALSE;\r
-    }\r
-}\r
-\r
-/********************************************************************/\r
-\r
-/* Check all windows for dialbox callbacks */\r
-static void fghcbEnumDialCallbacks ( SFG_Window *window, SFG_Enumerator *enumerator )\r
-{\r
-    /* Built-in to INVOKE_WCB():  if window->Callbacks[CB_Dials] */\r
-    INVOKE_WCB ( *window,Dials, ( ((int*)enumerator->data)[0], ((int*)enumerator->data)[1]) );\r
-    fgEnumSubWindows ( window, fghcbEnumDialCallbacks, enumerator );\r
-}\r
-\r
-static void send_dial_event ( int num, int value )\r
-{\r
-    SFG_Enumerator enumerator;\r
-    int data[2];\r
-    data[0] = num;\r
-    data[1] = value;\r
-    enumerator.found = GL_FALSE;\r
-    enumerator.data  =  data;\r
-    fgEnumWindows ( fghcbEnumDialCallbacks, &enumerator );\r
-}\r
-\r
-/********************************************************************/\r
-static void poll_dials ( int id )\r
-{\r
-    int data;\r
-    static int dial_state = DIAL_NEW;\r
-    static int dial_which;\r
-    static int dial_value;\r
-    static int dials[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };\r
-\r
-    if ( !dialbox_port ) return;\r
-\r
-    while ( (data=serial_getchar(dialbox_port)) != EOF )\r
-    {\r
-        if ( ( dial_state > DIAL_WHICH_DEVICE ) || IS_DIAL_EVENT ( data ) )\r
-        {\r
-            switch ( dial_state )\r
-            {\r
-            case DIAL_WHICH_DEVICE:\r
-                dial_which = data - DIAL_BASE;\r
-                dial_state++;\r
-                break;\r
-            case DIAL_VALUE_HIGH:\r
-                dial_value = ( data << 8 );\r
-                dial_state++;\r
-                break;\r
-            case DIAL_VALUE_LOW:\r
-                dial_value |= data;\r
-                if ( dial_value & 0x8000 ) dial_value -= 0x10000;\r
-                dials[dial_which] = dial_value;\r
-                send_dial_event ( dial_which + 1, dial_value * 360 / 256 );\r
-                dial_state = DIAL_WHICH_DEVICE;\r
-                break;\r
-            default:\r
-                /* error: Impossible state value! */\r
-                break;\r
-            }\r
-        }\r
-        else if ( data == DIAL_INITIALIZED )\r
-        {\r
-            fgState.InputDevsInitialised = GL_TRUE;\r
-            dial_state = DIAL_WHICH_DEVICE;\r
-            serial_putchar(dialbox_port,DIAL_SET_AUTO_DIALS);\r
-            serial_putchar(dialbox_port,0xff);\r
-            serial_putchar(dialbox_port,0xff);\r
-        }\r
-        else  /* Unknown data; try flushing. */\r
-            serial_flush(dialbox_port);\r
-    }\r
-\r
-    glutTimerFunc ( 2, poll_dials, 0 );\r
-}\r
-\r
+/*
+ * freeglut_input_devices.c
+ *
+ * Handles miscellaneous input devices via direct serial-port access.
+ * Proper X11 XInput device support is not yet supported.
+ * Also lacks Mac support.
+ *
+ * Written by Joe Krahn <krahn@niehs.nih.gov> 2005
+ *
+ * Copyright (c) 2005 Stephen J. Baker. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA OR STEPHEN J. BAKER BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#    include "config.h"
+#endif
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+typedef struct _serialport SERIALPORT;
+
+
+/********************* Dialbox definitions ***********************/
+
+#define DIAL_NUM_VALUATORS 8
+
+/* dial parser state machine states */
+#define DIAL_NEW                (-1)
+#define DIAL_WHICH_DEVICE       0
+#define DIAL_VALUE_HIGH         1
+#define DIAL_VALUE_LOW          2
+
+/* dial/button box commands */
+#define DIAL_INITIALIZE                 0x20
+#define DIAL_SET_LEDS                   0x75
+#define DIAL_SET_TEXT                   0x61
+#define DIAL_SET_AUTO_DIALS             0x50
+#define DIAL_SET_AUTO_DELTA_DIALS       0x51
+#define DIAL_SET_FILTER                 0x53
+#define DIAL_SET_BUTTONS_MOM_TYPE       0x71
+#define DIAL_SET_AUTO_MOM_BUTTONS       0x73
+#define DIAL_SET_ALL_LEDS               0x4b
+#define DIAL_CLEAR_ALL_LEDS             0x4c
+
+/* dial/button box replies and events */
+#define DIAL_INITIALIZED        0x20
+#define DIAL_BASE               0x30
+#define DIAL_DELTA_BASE         0x40
+#define DIAL_PRESS_BASE         0xc0
+#define DIAL_RELEASE_BASE       0xe0
+
+/* macros to determine reply type */
+#define IS_DIAL_EVENT(ch)       (((ch)>=DIAL_BASE)&&((ch)<DIAL_BASE+DIAL_NUM_VALUATORS))
+#define IS_KEY_PRESS(ch)        (((ch)>=DIAL_PRESS_BASE)&&((ch)<DIAL_PRESS_BASE+DIAL_NUM_BUTTONS))
+#define IS_KEY_RELEASE(ch)      (((ch)>=DIAL_RELEASE_BASE)&&((ch)<DIAL_RELEASE_BASE+DIAL_NUM_BUTTONS))
+#define IS_INIT_EVENT(ch)       ((ch)==DIAL_INITIALIZED)
+
+/*****************************************************************/
+
+extern SERIALPORT *serial_open ( const char *device );
+extern void serial_close ( SERIALPORT *port );
+extern int serial_getchar ( SERIALPORT *port );
+extern int serial_putchar ( SERIALPORT *port, unsigned char ch );
+extern void serial_flush ( SERIALPORT *port );
+
+extern void fgPlatformRegisterDialDevice ( const char *dial_device );
+static void send_dial_event(int dial, int value);
+static void poll_dials(int id);
+
+/* local variables */
+static SERIALPORT *dialbox_port=NULL;
+
+/*****************************************************************/
+
+/*
+ * Implementation for glutDeviceGet(GLUT_HAS_DIAL_AND_BUTTON_BOX)
+ */
+int fgInputDeviceDetect( void )
+{
+    fgInitialiseInputDevices ();
+
+    if ( !dialbox_port )
+        return 0;
+
+    if ( !fgState.InputDevsInitialised )
+        return 0;
+
+    return 1;
+}
+
+/*
+ * Try initializing the input device(s)
+ */
+void fgInitialiseInputDevices ( void )
+{
+    if( !fgState.InputDevsInitialised )
+    {
+        const char *dial_device=NULL;
+        dial_device = getenv ( "GLUT_DIALS_SERIAL" );
+               fgPlatformRegisterDialDevice ( dial_device );
+
+        if ( !dial_device ) return;
+        if ( !( dialbox_port = serial_open ( dial_device ) ) ) return;
+        serial_putchar(dialbox_port,DIAL_INITIALIZE);
+        glutTimerFunc ( 10, poll_dials, 0 );
+        fgState.InputDevsInitialised = GL_TRUE;
+    }
+}
+
+/*
+ *
+ */
+void fgInputDeviceClose( void )
+{
+    if ( fgState.InputDevsInitialised )
+    {
+        serial_close ( dialbox_port );
+        dialbox_port = NULL;
+        fgState.InputDevsInitialised = GL_FALSE;
+    }
+}
+
+/********************************************************************/
+
+/* Check all windows for dialbox callbacks */
+static void fghcbEnumDialCallbacks ( SFG_Window *window, SFG_Enumerator *enumerator )
+{
+    /* Built-in to INVOKE_WCB():  if window->Callbacks[CB_Dials] */
+    INVOKE_WCB ( *window,Dials, ( ((int*)enumerator->data)[0], ((int*)enumerator->data)[1]) );
+    fgEnumSubWindows ( window, fghcbEnumDialCallbacks, enumerator );
+}
+
+static void send_dial_event ( int num, int value )
+{
+    SFG_Enumerator enumerator;
+    int data[2];
+    data[0] = num;
+    data[1] = value;
+    enumerator.found = GL_FALSE;
+    enumerator.data  =  data;
+    fgEnumWindows ( fghcbEnumDialCallbacks, &enumerator );
+}
+
+/********************************************************************/
+static void poll_dials ( int id )
+{
+    int data;
+    static int dial_state = DIAL_NEW;
+    static int dial_which;
+    static int dial_value;
+    static int dials[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+
+    if ( !dialbox_port ) return;
+
+    while ( (data=serial_getchar(dialbox_port)) != EOF )
+    {
+        if ( ( dial_state > DIAL_WHICH_DEVICE ) || IS_DIAL_EVENT ( data ) )
+        {
+            switch ( dial_state )
+            {
+            case DIAL_WHICH_DEVICE:
+                dial_which = data - DIAL_BASE;
+                dial_state++;
+                break;
+            case DIAL_VALUE_HIGH:
+                dial_value = ( data << 8 );
+                dial_state++;
+                break;
+            case DIAL_VALUE_LOW:
+                dial_value |= data;
+                if ( dial_value & 0x8000 ) dial_value -= 0x10000;
+                dials[dial_which] = dial_value;
+                send_dial_event ( dial_which + 1, dial_value * 360 / 256 );
+                dial_state = DIAL_WHICH_DEVICE;
+                break;
+            default:
+                /* error: Impossible state value! */
+                break;
+            }
+        }
+        else if ( data == DIAL_INITIALIZED )
+        {
+            fgState.InputDevsInitialised = GL_TRUE;
+            dial_state = DIAL_WHICH_DEVICE;
+            serial_putchar(dialbox_port,DIAL_SET_AUTO_DIALS);
+            serial_putchar(dialbox_port,0xff);
+            serial_putchar(dialbox_port,0xff);
+        }
+        else  /* Unknown data; try flushing. */
+            serial_flush(dialbox_port);
+    }
+
+    glutTimerFunc ( 2, poll_dials, 0 );
+}
+
index 4cca9e9..bbd7f62 100644 (file)
-/*\r
- * freeglut_internal.h\r
- *\r
- * The freeglut library private include file.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Thu Dec 2 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#ifndef  FREEGLUT_INTERNAL_H\r
-#define  FREEGLUT_INTERNAL_H\r
-\r
-#ifdef HAVE_CONFIG_H\r
-#    include "config.h"\r
-#endif\r
-\r
-/* XXX Update these for each release! */\r
-#define  VERSION_MAJOR 3\r
-#define  VERSION_MINOR 0\r
-#define  VERSION_PATCH 0\r
-\r
-/* Freeglut is intended to function under all Unix/X11 and Win32 platforms. */\r
-/* XXX: Don't all MS-Windows compilers (except Cygwin) have _WIN32 defined?\r
- * XXX: If so, remove the first set of defined()'s below.\r
- */\r
-#if !defined(TARGET_HOST_POSIX_X11) && !defined(TARGET_HOST_MS_WINDOWS) && !defined(TARGET_HOST_MAC_OSX) && !defined(TARGET_HOST_SOLARIS)\r
-#if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__MINGW32__) \\r
-    || defined(_WIN32) || defined(_WIN32_WCE) \\r
-    || ( defined(__CYGWIN__) && defined(X_DISPLAY_MISSING) )\r
-#   define  TARGET_HOST_MS_WINDOWS 1\r
-\r
-#elif defined(__posix__) || defined(__unix__) || defined(__linux__) || defined(__sun)\r
-#   define  TARGET_HOST_POSIX_X11  1\r
-\r
-#elif defined(__APPLE__)\r
-/* This is a placeholder until we get native OSX support ironed out -- JFF 11/18/09 */\r
-#   define  TARGET_HOST_POSIX_X11  1\r
-/* #   define  TARGET_HOST_MAC_OSX    1 */\r
-\r
-#else\r
-#   error "Unrecognized target host!"\r
-\r
-#endif\r
-#endif\r
-\r
-/* Detect both SunPro and gcc compilers on Sun Solaris */\r
-#if defined (__SVR4) && defined (__sun)\r
-#   define TARGET_HOST_SOLARIS 1\r
-#endif\r
-\r
-#ifndef TARGET_HOST_MS_WINDOWS\r
-#   define  TARGET_HOST_MS_WINDOWS 0\r
-#endif\r
-\r
-#ifndef  TARGET_HOST_POSIX_X11\r
-#   define  TARGET_HOST_POSIX_X11  0\r
-#endif\r
-\r
-#ifndef  TARGET_HOST_MAC_OSX\r
-#   define  TARGET_HOST_MAC_OSX    0\r
-#endif\r
-\r
-#ifndef  TARGET_HOST_SOLARIS\r
-#   define  TARGET_HOST_SOLARIS    0\r
-#endif\r
-\r
-/* -- FIXED CONFIGURATION LIMITS ------------------------------------------- */\r
-\r
-#define  FREEGLUT_MAX_MENUS         3\r
-\r
-/* These files should be available on every platform. */\r
-#include <stdio.h>\r
-#include <string.h>\r
-#include <math.h>\r
-#include <stdlib.h>\r
-#include <stdarg.h>\r
-\r
-/* These are included based on autoconf directives. */\r
-#ifdef HAVE_SYS_TYPES_H\r
-#    include <sys/types.h>\r
-#endif\r
-#ifdef HAVE_UNISTD_H\r
-#    include <unistd.h>\r
-#endif\r
-#ifdef TIME_WITH_SYS_TIME\r
-#    include <sys/time.h>\r
-#    include <time.h>\r
-#elif defined(HAVE_SYS_TIME_H)\r
-#    include <sys/time.h>\r
-#else\r
-#    include <time.h>\r
-#endif\r
-\r
-/* -- AUTOCONF HACKS --------------------------------------------------------*/\r
-\r
-/* XXX: Update autoconf to avoid these.\r
- * XXX: Are non-POSIX platforms intended not to use autoconf?\r
- * If so, perhaps there should be a config_guess.h for them. Alternatively,\r
- * config guesses could be placed above, just after the config.h exclusion.\r
- */\r
-#if defined(__FreeBSD__) || defined(__NetBSD__)\r
-#    define HAVE_USB_JS 1\r
-#    if defined(__NetBSD__) || ( defined(__FreeBSD__) && __FreeBSD_version >= 500000)\r
-#        define HAVE_USBHID_H 1\r
-#    endif\r
-#endif\r
-\r
-#if defined(_MSC_VER) || defined(__WATCOMC__)\r
-/* strdup() is non-standard, for all but POSIX-2001 */\r
-#define strdup   _strdup\r
-#endif\r
-\r
-/* M_PI is non-standard (defined by BSD, not ISO-C) */\r
-#ifndef M_PI\r
-#    define  M_PI  3.14159265358979323846\r
-#endif\r
-\r
-#ifdef HAVE_STDBOOL_H\r
-#    include <stdbool.h>\r
-#    ifndef TRUE\r
-#        define TRUE true\r
-#    endif\r
-#    ifndef FALSE\r
-#        define FALSE false\r
-#    endif\r
-#else\r
-#    ifndef TRUE\r
-#        define  TRUE  1\r
-#    endif\r
-#    ifndef FALSE\r
-#        define  FALSE  0\r
-#    endif\r
-#endif\r
-\r
-/* General defines */\r
-\r
-#define INVALID_MODIFIERS 0xffffffff\r
-\r
-\r
-\r
-/* Platform-specific includes */\r
-#if TARGET_HOST_POSIX_X11\r
-#include "../x11/freeglut_internal_x11.h"\r
-#endif\r
-#if TARGET_HOST_MS_WINDOWS\r
-#include "../mswin/freeglut_internal_mswin.h"\r
-#endif\r
-\r
-\r
-/* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */\r
-\r
-/* Freeglut callbacks type definitions */\r
-typedef void (* FGCBDisplay       )( void );\r
-typedef void (* FGCBReshape       )( int, int );\r
-typedef void (* FGCBVisibility    )( int );\r
-typedef void (* FGCBKeyboard      )( unsigned char, int, int );\r
-typedef void (* FGCBSpecial       )( int, int, int );\r
-typedef void (* FGCBMouse         )( int, int, int, int );\r
-typedef void (* FGCBMouseWheel    )( int, int, int, int );\r
-typedef void (* FGCBMotion        )( int, int );\r
-typedef void (* FGCBPassive       )( int, int );\r
-typedef void (* FGCBEntry         )( int );\r
-typedef void (* FGCBWindowStatus  )( int );\r
-typedef void (* FGCBSelect        )( int, int, int );\r
-typedef void (* FGCBJoystick      )( unsigned int, int, int, int );\r
-typedef void (* FGCBKeyboardUp    )( unsigned char, int, int );\r
-typedef void (* FGCBSpecialUp     )( int, int, int );\r
-typedef void (* FGCBOverlayDisplay)( void );\r
-typedef void (* FGCBSpaceMotion   )( int, int, int );\r
-typedef void (* FGCBSpaceRotation )( int, int, int );\r
-typedef void (* FGCBSpaceButton   )( int, int );\r
-typedef void (* FGCBDials         )( int, int );\r
-typedef void (* FGCBButtonBox     )( int, int );\r
-typedef void (* FGCBTabletMotion  )( int, int );\r
-typedef void (* FGCBTabletButton  )( int, int, int, int );\r
-typedef void (* FGCBDestroy       )( void );\r
-\r
-typedef void (* FGCBMultiEntry   )( int, int );\r
-typedef void (* FGCBMultiButton  )( int, int, int, int, int );\r
-typedef void (* FGCBMultiMotion  )( int, int, int );\r
-typedef void (* FGCBMultiPassive )( int, int, int );\r
-\r
-/* The global callbacks type definitions */\r
-typedef void (* FGCBIdle          )( void );\r
-typedef void (* FGCBTimer         )( int );\r
-typedef void (* FGCBMenuState     )( int );\r
-typedef void (* FGCBMenuStatus    )( int, int, int );\r
-\r
-/* The callback used when creating/using menus */\r
-typedef void (* FGCBMenu          )( int );\r
-\r
-/* The FreeGLUT error/warning handler type definition */\r
-typedef void (* FGError           ) ( const char *fmt, va_list ap);\r
-typedef void (* FGWarning         ) ( const char *fmt, va_list ap);\r
-\r
-\r
-/* A list structure */\r
-typedef struct tagSFG_List SFG_List;\r
-struct tagSFG_List\r
-{\r
-    void *First;\r
-    void *Last;\r
-};\r
-\r
-/* A list node structure */\r
-typedef struct tagSFG_Node SFG_Node;\r
-struct tagSFG_Node\r
-{\r
-    void *Next;\r
-    void *Prev;\r
-};\r
-\r
-/* A helper structure holding two ints and a boolean */\r
-typedef struct tagSFG_XYUse SFG_XYUse;\r
-struct tagSFG_XYUse\r
-{\r
-    GLint           X, Y;               /* The two integers...               */\r
-    GLboolean       Use;                /* ...and a single boolean.          */\r
-};\r
-\r
-/*\r
- * An enumeration containing the state of the GLUT execution:\r
- * initializing, running, or stopping\r
- */\r
-typedef enum\r
-{\r
-  GLUT_EXEC_STATE_INIT,\r
-  GLUT_EXEC_STATE_RUNNING,\r
-  GLUT_EXEC_STATE_STOP\r
-} fgExecutionState ;\r
-\r
-/* This structure holds different freeglut settings */\r
-typedef struct tagSFG_State SFG_State;\r
-struct tagSFG_State\r
-{\r
-    SFG_XYUse        Position;             /* The default windows' position  */\r
-    SFG_XYUse        Size;                 /* The default windows' size      */\r
-    unsigned int     DisplayMode;          /* Display mode for new windows   */\r
-\r
-    GLboolean        Initialised;          /* freeglut has been initialised  */\r
-\r
-    int              DirectContext;        /* Direct rendering state         */\r
-\r
-    GLboolean        ForceIconic;          /* New top windows are iconified  */\r
-    GLboolean        UseCurrentContext;    /* New windows share with current */\r
-\r
-    GLboolean        GLDebugSwitch;        /* OpenGL state debugging switch  */\r
-    GLboolean        XSyncSwitch;          /* X11 sync protocol switch       */\r
-\r
-    int              KeyRepeat;            /* Global key repeat mode.        */\r
-    int              Modifiers;            /* Current ALT/SHIFT/CTRL state   */\r
-\r
-    GLuint           FPSInterval;          /* Interval between FPS printfs   */\r
-    GLuint           SwapCount;            /* Count of glutSwapBuffer calls  */\r
-    GLuint           SwapTime;             /* Time of last SwapBuffers       */\r
-\r
-    unsigned long    Time;                 /* Time that glutInit was called  */\r
-    SFG_List         Timers;               /* The freeglut timer hooks       */\r
-    SFG_List         FreeTimers;           /* The unused timer hooks         */\r
-\r
-    FGCBIdle         IdleCallback;         /* The global idle callback       */\r
-\r
-    int              ActiveMenus;          /* Num. of currently active menus */\r
-    FGCBMenuState    MenuStateCallback;    /* Menu callbacks are global      */\r
-    FGCBMenuStatus   MenuStatusCallback;\r
-\r
-    SFG_XYUse        GameModeSize;         /* Game mode screen's dimensions  */\r
-    int              GameModeDepth;        /* The pixel depth for game mode  */\r
-    int              GameModeRefresh;      /* The refresh rate for game mode */\r
-\r
-    int              ActionOnWindowClose; /* Action when user closes window  */\r
-\r
-    fgExecutionState ExecState;           /* Used for GLUT termination       */\r
-    char            *ProgramName;         /* Name of the invoking program    */\r
-    GLboolean        JoysticksInitialised;  /* Only initialize if application calls for them */\r
-    int              NumActiveJoysticks;    /* Number of active joysticks -- if zero, don't poll joysticks */\r
-    GLboolean        InputDevsInitialised;  /* Only initialize if application calls for them */\r
-\r
-       int              MouseWheelTicks;      /* Number of ticks the mouse wheel has turned */\r
-\r
-    int              AuxiliaryBufferNumber;  /* Number of auxiliary buffers */\r
-    int              SampleNumber;         /*  Number of samples per pixel  */\r
-\r
-    int              MajorVersion;         /* Major OpenGL context version  */\r
-    int              MinorVersion;         /* Minor OpenGL context version  */\r
-    int              ContextFlags;         /* OpenGL context flags          */\r
-    int              ContextProfile;       /* OpenGL context profile        */\r
-    FGError          ErrorFunc;            /* User defined error handler    */\r
-    FGWarning        WarningFunc;          /* User defined warning handler  */\r
-};\r
-\r
-/* The structure used by display initialization in freeglut_init.c */\r
-typedef struct tagSFG_Display SFG_Display;\r
-struct tagSFG_Display\r
-{\r
-       SFG_PlatformDisplay pDisplay;\r
-\r
-    int             ScreenWidth;        /* The screen's width in pixels      */\r
-    int             ScreenHeight;       /* The screen's height in pixels     */\r
-    int             ScreenWidthMM;      /* The screen's width in milimeters  */\r
-    int             ScreenHeightMM;     /* The screen's height in milimeters */\r
-};\r
-\r
-\r
-/* The user can create any number of timer hooks */\r
-typedef struct tagSFG_Timer SFG_Timer;\r
-struct tagSFG_Timer\r
-{\r
-    SFG_Node        Node;\r
-    int             ID;                 /* The timer ID integer              */\r
-    FGCBTimer       Callback;           /* The timer callback                */\r
-    long            TriggerTime;        /* The timer trigger time            */\r
-};\r
-\r
-/*\r
- * A window and its OpenGL context. The contents of this structure\r
- * are highly dependant on the target operating system we aim at...\r
- */\r
-typedef struct tagSFG_Context SFG_Context;\r
-struct tagSFG_Context\r
-{\r
-    SFG_WindowHandleType  Handle;    /* The window's handle                 */\r
-    SFG_WindowContextType Context;   /* The window's OpenGL/WGL context     */\r
-\r
-       SFG_PlatformContext pContext;    /* The window's FBConfig (X11) or device context (Windows) */\r
-\r
-    int             DoubleBuffered;  /* Treat the window as double-buffered */\r
-};\r
-\r
-\r
-typedef struct tagSFG_WindowState SFG_WindowState;\r
-struct tagSFG_WindowState\r
-{\r
-    /* Note that on Windows, sizes always refer to the client area, thus without the window decorations */\r
-    int             Width;              /* Window's width in pixels          */\r
-    int             Height;             /* The same about the height         */\r
-\r
-       SFG_PlatformWindowState pWState;    /* Window width/height (X11) or rectangle/style (Windows) from before a resize */\r
-\r
-    GLboolean       Redisplay;          /* Do we have to redisplay?          */\r
-    GLboolean       Visible;            /* Is the window visible now         */\r
-\r
-    int             Cursor;             /* The currently selected cursor     */\r
-\r
-    long            JoystickPollRate;   /* The joystick polling rate         */\r
-    long            JoystickLastPoll;   /* When the last poll happened       */\r
-\r
-    int             MouseX, MouseY;     /* The most recent mouse position    */\r
-\r
-    GLboolean       IgnoreKeyRepeat;    /* Whether to ignore key repeat.     */\r
-    GLboolean       KeyRepeating;       /* Currently in repeat mode          */\r
-\r
-    GLboolean       NeedToResize;       /* Do we need to resize the window?  */\r
-\r
-    GLboolean       IsFullscreen;       /* is the window fullscreen? */\r
-};\r
-\r
-\r
-/*\r
- * A generic function pointer.  We should really use the GLUTproc type\r
- * defined in freeglut_ext.h, but if we include that header in this file\r
- * a bunch of other stuff (font-related) blows up!\r
- */\r
-typedef void (*SFG_Proc)();\r
-\r
-\r
-/*\r
- * SET_WCB() is used as:\r
- *\r
- *     SET_WCB( window, cbname, func );\r
- *\r
- * ...where {window} is the freeglut window to set the callback,\r
- *          {cbname} is the window-specific callback to set,\r
- *          {func} is a function-pointer.\r
- *\r
- * Originally, {FETCH_WCB( ... ) = func} was rather sloppily used,\r
- * but this can cause warnings because the FETCH_WCB() macro type-\r
- * casts its result, and a type-cast value shouldn't be an lvalue.\r
- *\r
- * The {if( FETCH_WCB( ... ) != func )} test is to do type-checking\r
- * and for no other reason.  Since it's hidden in the macro, the\r
- * ugliness is felt to be rather benign.\r
- */\r
-#define SET_WCB(window,cbname,func)                            \\r
-do                                                             \\r
-{                                                              \\r
-    if( FETCH_WCB( window, cbname ) != (SFG_Proc)(func) )      \\r
-        (((window).CallBacks[CB_ ## cbname]) = (SFG_Proc)(func)); \\r
-} while( 0 )\r
-\r
-/*\r
- * FETCH_WCB() is used as:\r
- *\r
- *     FETCH_WCB( window, cbname );\r
- *\r
- * ...where {window} is the freeglut window to fetch the callback from,\r
- *          {cbname} is the window-specific callback to fetch.\r
- *\r
- * The result is correctly type-cast to the callback function pointer\r
- * type.\r
- */\r
-#define FETCH_WCB(window,cbname) \\r
-    ((window).CallBacks[CB_ ## cbname])\r
-\r
-/*\r
- * INVOKE_WCB() is used as:\r
- *\r
- *     INVOKE_WCB( window, cbname, ( arg_list ) );\r
- *\r
- * ...where {window} is the freeglut window,\r
- *          {cbname} is the window-specific callback to be invoked,\r
- *          {(arg_list)} is the parameter list.\r
- *\r
- * The callback is invoked as:\r
- *\r
- *    callback( arg_list );\r
- *\r
- * ...so the parentheses are REQUIRED in the {arg_list}.\r
- *\r
- * NOTE that it does a sanity-check and also sets the\r
- * current window.\r
- *\r
- */\r
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) /* FIXME: also WinCE? */\r
-#define INVOKE_WCB(window,cbname,arg_list)    \\r
-do                                            \\r
-{                                             \\r
-    if( FETCH_WCB( window, cbname ) )         \\r
-    {                                         \\r
-        FGCB ## cbname func = (FGCB ## cbname)(FETCH_WCB( window, cbname )); \\r
-        fgSetWindow( &window );               \\r
-        func arg_list;                        \\r
-    }                                         \\r
-} while( 0 )\r
-#else\r
-#define INVOKE_WCB(window,cbname,arg_list)    \\r
-do                                            \\r
-{                                             \\r
-    if( FETCH_WCB( window, cbname ) )         \\r
-    {                                         \\r
-        fgSetWindow( &window );               \\r
-        ((FGCB ## cbname)FETCH_WCB( window, cbname )) arg_list; \\r
-    }                                         \\r
-} while( 0 )\r
-#endif\r
-\r
-/*\r
- * The window callbacks the user can supply us with. Should be kept portable.\r
- *\r
- * This enumeration provides the freeglut CallBack numbers.\r
- * The symbolic constants are indices into a window's array of\r
- * function callbacks.  The names are formed by splicing a common\r
- * prefix onto the callback's base name.  (This was originally\r
- * done so that an early stage of development could live side-by-\r
- * side with the old callback code.  The old callback code used\r
- * the bare callback's name as a structure member, so I used a\r
- * prefix for the array index name.)\r
- *\r
- * XXX For consistancy, perhaps the prefix should match the\r
- * XXX FETCH* and INVOKE* macro suffices.  I.e., WCB_, rather than\r
- * XXX CB_.\r
- */\r
-enum\r
-{\r
-    CB_Display,\r
-    CB_Reshape,\r
-    CB_Keyboard,\r
-    CB_KeyboardUp,\r
-    CB_Special,\r
-    CB_SpecialUp,\r
-    CB_Mouse,\r
-    CB_MouseWheel,\r
-    CB_Motion,\r
-    CB_Passive,\r
-    CB_Entry,\r
-    CB_Visibility,\r
-    CB_WindowStatus,\r
-    CB_Joystick,\r
-    CB_Destroy,\r
-\r
-    /* MPX-related */\r
-    CB_MultiEntry,\r
-    CB_MultiButton,\r
-    CB_MultiMotion,\r
-    CB_MultiPassive,\r
-\r
-    /* Presently ignored */\r
-    CB_Select,\r
-    CB_OverlayDisplay,\r
-    CB_SpaceMotion,     /* presently implemented only on UNIX/X11 */\r
-    CB_SpaceRotation,   /* presently implemented only on UNIX/X11 */\r
-    CB_SpaceButton,     /* presently implemented only on UNIX/X11 */\r
-    CB_Dials,\r
-    CB_ButtonBox,\r
-    CB_TabletMotion,\r
-    CB_TabletButton,\r
-\r
-    /* Always make this the LAST one */\r
-    TOTAL_CALLBACKS\r
-};\r
-\r
-\r
-/* This structure holds the OpenGL rendering context for all the menu windows */\r
-typedef struct tagSFG_MenuContext SFG_MenuContext;\r
-struct tagSFG_MenuContext\r
-{\r
-    SFG_WindowContextType MContext;       /* The menu window's WGL context   */\r
-};\r
-\r
-/* This structure describes a menu */\r
-typedef struct tagSFG_Window SFG_Window;\r
-typedef struct tagSFG_MenuEntry SFG_MenuEntry;\r
-typedef struct tagSFG_Menu SFG_Menu;\r
-struct tagSFG_Menu\r
-{\r
-    SFG_Node            Node;\r
-    void               *UserData;     /* User data passed back at callback   */\r
-    int                 ID;           /* The global menu ID                  */\r
-    SFG_List            Entries;      /* The menu entries list               */\r
-    FGCBMenu            Callback;     /* The menu callback                   */\r
-    FGCBDestroy         Destroy;      /* Destruction callback                */\r
-    GLboolean           IsActive;     /* Is the menu selected?               */\r
-    int                 Width;        /* Menu box width in pixels            */\r
-    int                 Height;       /* Menu box height in pixels           */\r
-    int                 X, Y;         /* Menu box raster position            */\r
-\r
-    SFG_MenuEntry      *ActiveEntry;  /* Currently active entry in the menu  */\r
-    SFG_Window         *Window;       /* Window for menu                     */\r
-    SFG_Window         *ParentWindow; /* Window in which the menu is invoked */\r
-};\r
-\r
-/* This is a menu entry */\r
-struct tagSFG_MenuEntry\r
-{\r
-    SFG_Node            Node;\r
-    int                 ID;                     /* The menu entry ID (local) */\r
-    int                 Ordinal;                /* The menu's ordinal number */\r
-    char*               Text;                   /* The text to be displayed  */\r
-    SFG_Menu*           SubMenu;                /* Optional sub-menu tree    */\r
-    GLboolean           IsActive;               /* Is the entry highlighted? */\r
-    int                 Width;                  /* Label's width in pixels   */\r
-};\r
-\r
-/*\r
- * A window, making part of freeglut windows hierarchy.\r
- * Should be kept portable.\r
- *\r
- * NOTE that ActiveMenu is set to menu itself if the window is a menu.\r
- */\r
-struct tagSFG_Window\r
-{\r
-    SFG_Node            Node;\r
-    int                 ID;                     /* Window's ID number        */\r
-\r
-    SFG_Context         Window;                 /* Window and OpenGL context */\r
-    SFG_WindowState     State;                  /* The window state          */\r
-    SFG_Proc            CallBacks[ TOTAL_CALLBACKS ]; /* Array of window callbacks */\r
-    void               *UserData ;              /* For use by user           */\r
-\r
-    SFG_Menu*       Menu[ FREEGLUT_MAX_MENUS ]; /* Menus appended to window  */\r
-    SFG_Menu*       ActiveMenu;                 /* The window's active menu  */\r
-\r
-    SFG_Window*         Parent;                 /* The parent to this window */\r
-    SFG_List            Children;               /* The subwindows d.l. list  */\r
-\r
-    GLboolean           IsMenu;                 /* Set to 1 if we are a menu */\r
-};\r
-\r
-\r
-/* A linked list structure of windows */\r
-typedef struct tagSFG_WindowList SFG_WindowList ;\r
-struct tagSFG_WindowList\r
-{\r
-    SFG_Node node;\r
-    SFG_Window *window ;\r
-};\r
-\r
-/* This holds information about all the windows, menus etc. */\r
-typedef struct tagSFG_Structure SFG_Structure;\r
-struct tagSFG_Structure\r
-{\r
-    SFG_List        Windows;         /* The global windows list            */\r
-    SFG_List        Menus;           /* The global menus list              */\r
-    SFG_List        WindowsToDestroy;\r
-\r
-    SFG_Window*     CurrentWindow;   /* The currently set window          */\r
-    SFG_Menu*       CurrentMenu;     /* Same, but menu...                 */\r
-\r
-    SFG_MenuContext* MenuContext;    /* OpenGL rendering context for menus */\r
-\r
-    SFG_Window*      GameModeWindow; /* The game mode window               */\r
-\r
-    int              WindowID;       /* The new current window ID          */\r
-    int              MenuID;         /* The new current menu ID            */\r
-};\r
-\r
-/*\r
- * This structure is used for the enumeration purposes.\r
- * You can easily extend its functionalities by declaring\r
- * a structure containing enumerator's contents and custom\r
- * data, then casting its pointer to (SFG_Enumerator *).\r
- */\r
-typedef struct tagSFG_Enumerator SFG_Enumerator;\r
-struct tagSFG_Enumerator\r
-{\r
-    GLboolean   found;                          /* Used to terminate search  */\r
-    void*       data;                           /* Custom data pointer       */\r
-};\r
-typedef void (* FGCBenumerator  )( SFG_Window *, SFG_Enumerator * );\r
-\r
-/* The bitmap font structure */\r
-typedef struct tagSFG_Font SFG_Font;\r
-struct tagSFG_Font\r
-{\r
-    char*           Name;         /* The source font name             */\r
-    int             Quantity;     /* Number of chars in font          */\r
-    int             Height;       /* Height of the characters         */\r
-    const GLubyte** Characters;   /* The characters mapping           */\r
-\r
-    float           xorig, yorig; /* Relative origin of the character */\r
-};\r
-\r
-/* The stroke font structures */\r
-\r
-typedef struct tagSFG_StrokeVertex SFG_StrokeVertex;\r
-struct tagSFG_StrokeVertex\r
-{\r
-    GLfloat         X, Y;\r
-};\r
-\r
-typedef struct tagSFG_StrokeStrip SFG_StrokeStrip;\r
-struct tagSFG_StrokeStrip\r
-{\r
-    int             Number;\r
-    const SFG_StrokeVertex* Vertices;\r
-};\r
-\r
-typedef struct tagSFG_StrokeChar SFG_StrokeChar;\r
-struct tagSFG_StrokeChar\r
-{\r
-    GLfloat         Right;\r
-    int             Number;\r
-    const SFG_StrokeStrip* Strips;\r
-};\r
-\r
-typedef struct tagSFG_StrokeFont SFG_StrokeFont;\r
-struct tagSFG_StrokeFont\r
-{\r
-    char*           Name;                       /* The source font name      */\r
-    int             Quantity;                   /* Number of chars in font   */\r
-    GLfloat         Height;                     /* Height of the characters  */\r
-    const SFG_StrokeChar** Characters;          /* The characters mapping    */\r
-};\r
-\r
-\r
-/* -- JOYSTICK-SPECIFIC STRUCTURES AND TYPES ------------------------------- */\r
-/*\r
- * Initial defines from "js.h" starting around line 33 with the existing "freeglut_joystick.c"\r
- * interspersed\r
- */\r
-\r
-#if TARGET_HOST_MACINTOSH\r
-#    include <InputSprocket.h>\r
-#endif\r
-\r
-#if TARGET_HOST_MAC_OSX\r
-#    include <mach/mach.h>\r
-#    include <IOKit/IOkitLib.h>\r
-#    include <IOKit/hid/IOHIDLib.h>\r
-#endif\r
-\r
-/* XXX It might be better to poll the operating system for the numbers of buttons and\r
- * XXX axes and then dynamically allocate the arrays.\r
- */\r
-#define _JS_MAX_BUTTONS 32\r
-\r
-#if TARGET_HOST_MACINTOSH\r
-#    define _JS_MAX_AXES  9\r
-typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick;\r
-struct tagSFG_PlatformJoystick\r
-{\r
-#define  ISP_NUM_AXIS    9\r
-#define  ISP_NUM_NEEDS  41\r
-    ISpElementReference isp_elem  [ ISP_NUM_NEEDS ];\r
-    ISpNeed             isp_needs [ ISP_NUM_NEEDS ];\r
-};\r
-#endif\r
-\r
-#if TARGET_HOST_MAC_OSX\r
-#    define _JS_MAX_AXES 16\r
-typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick;\r
-struct tagSFG_PlatformJoystick\r
-{\r
-    IOHIDDeviceInterface ** hidDev;\r
-    IOHIDElementCookie buttonCookies[41];\r
-    IOHIDElementCookie axisCookies[_JS_MAX_AXES];\r
-/* The next two variables are not used anywhere */\r
-/*    long minReport[_JS_MAX_AXES],\r
- *         maxReport[_JS_MAX_AXES];\r
- */\r
-};\r
-#endif\r
-\r
-\r
-/*\r
- * Definition of "SFG_Joystick" structure -- based on JS's "jsJoystick" object class.\r
- * See "js.h" lines 80-178.\r
- */\r
-typedef struct tagSFG_Joystick SFG_Joystick;\r
-struct tagSFG_Joystick\r
-{\r
-       SFG_PlatformJoystick pJoystick;\r
-\r
-    int          id;\r
-    GLboolean    error;\r
-    char         name [ 128 ];\r
-    int          num_axes;\r
-    int          num_buttons;\r
-\r
-    float dead_band[ _JS_MAX_AXES ];\r
-    float saturate [ _JS_MAX_AXES ];\r
-    float center   [ _JS_MAX_AXES ];\r
-    float max      [ _JS_MAX_AXES ];\r
-    float min      [ _JS_MAX_AXES ];\r
-};\r
-\r
-\r
-\r
-/* -- GLOBAL VARIABLES EXPORTS --------------------------------------------- */\r
-\r
-/* Freeglut display related stuff (initialized once per session) */\r
-extern SFG_Display fgDisplay;\r
-\r
-/* Freeglut internal structure */\r
-extern SFG_Structure fgStructure;\r
-\r
-/* The current freeglut settings */\r
-extern SFG_State fgState;\r
-\r
-\r
-/* -- PRIVATE FUNCTION DECLARATIONS ---------------------------------------- */\r
-\r
-/*\r
- * A call to this function makes us sure that the Display and Structure\r
- * subsystems have been properly initialized and are ready to be used\r
- */\r
-#define  FREEGLUT_EXIT_IF_NOT_INITIALISED( string )               \\r
-  if ( ! fgState.Initialised )                                    \\r
-  {                                                               \\r
-    fgError ( " ERROR:  Function <%s> called"                     \\r
-              " without first calling 'glutInit'.", (string) ) ;  \\r
-  }\r
-\r
-#define  FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED( string )  \\r
-  if ( ! fgState.Initialised )                                      \\r
-  {                                                                 \\r
-    fgError ( " ERROR:  Internal <%s> function called"              \\r
-              " without first calling 'glutInit'.", (string) ) ;    \\r
-  }\r
-\r
-#define  FREEGLUT_INTERNAL_ERROR_EXIT( cond, string, function )  \\r
-  if ( ! ( cond ) )                                              \\r
-  {                                                              \\r
-    fgError ( " ERROR:  Internal error <%s> in function %s",     \\r
-              (string), (function) ) ;                           \\r
-  }\r
-\r
-/*\r
- * Following definitions are somewhat similiar to GLib's,\r
- * but do not generate any log messages:\r
- */\r
-#define  freeglut_return_if_fail( expr ) \\r
-    if( !(expr) )                        \\r
-        return;\r
-#define  freeglut_return_val_if_fail( expr, val ) \\r
-    if( !(expr) )                                 \\r
-        return val ;\r
-\r
-/*\r
- * A call to those macros assures us that there is a current\r
- * window set, respectively:\r
- */\r
-#define  FREEGLUT_EXIT_IF_NO_WINDOW( string )                               \\r
-  if ( ! fgStructure.CurrentWindow &&                                       \\r
-       ( fgState.ActionOnWindowClose != GLUT_ACTION_CONTINUE_EXECUTION ) )  \\r
-  {                                                                         \\r
-    fgError ( " ERROR:  Function <%s> called"                               \\r
-              " with no current window defined.", (string) ) ;              \\r
-  }\r
-\r
-/*\r
- * The deinitialize function gets called on glutMainLoop() end. It should clean up\r
- * everything inside of the freeglut\r
- */\r
-void fgDeinitialize( void );\r
-\r
-/*\r
- * Those two functions are used to create/destroy the freeglut internal\r
- * structures. This actually happens when calling glutInit() and when\r
- * quitting the glutMainLoop() (which actually happens, when all windows\r
- * have been closed).\r
- */\r
-void fgCreateStructure( void );\r
-void fgDestroyStructure( void );\r
-\r
-/*\r
- * Window creation, opening, closing and destruction.\r
- * Also CallBack clearing/initialization.\r
- * Defined in freeglut_structure.c, freeglut_window.c.\r
- */\r
-SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title,\r
-                            GLboolean positionUse, int x, int y,\r
-                            GLboolean sizeUse, int w, int h,\r
-                            GLboolean gameMode, GLboolean isMenu );\r
-void        fgSetWindow ( SFG_Window *window );\r
-void        fgOpenWindow( SFG_Window* window, const char* title,\r
-                          GLboolean positionUse, int x, int y,\r
-                          GLboolean sizeUse, int w, int h,\r
-                          GLboolean gameMode, GLboolean isSubWindow );\r
-void        fgCloseWindow( SFG_Window* window );\r
-void        fgAddToWindowDestroyList ( SFG_Window* window );\r
-void        fgCloseWindows ();\r
-void        fgDestroyWindow( SFG_Window* window );\r
-\r
-/* Menu creation and destruction. Defined in freeglut_structure.c */\r
-SFG_Menu*   fgCreateMenu( FGCBMenu menuCallback );\r
-void        fgDestroyMenu( SFG_Menu* menu );\r
-\r
-/* Joystick device management functions, defined in freeglut_joystick.c */\r
-int         fgJoystickDetect( void );\r
-void        fgInitialiseJoysticks( void );\r
-void        fgJoystickClose( void );\r
-void        fgJoystickPollWindow( SFG_Window* window );\r
-\r
-/* InputDevice Initialisation and Closure */\r
-int         fgInputDeviceDetect( void );\r
-void        fgInitialiseInputDevices( void );\r
-void        fgInputDeviceClose( void );\r
-\r
-/* spaceball device functions, defined in freeglut_spaceball.c */\r
-void        fgInitialiseSpaceball( void );\r
-void        fgSpaceballClose( void );\r
-void        fgSpaceballSetWindow( SFG_Window *window );\r
-\r
-int         fgHasSpaceball( void );\r
-int         fgSpaceballNumButtons( void );\r
-\r
-/* Setting the cursor for a given window */\r
-void fgSetCursor ( SFG_Window *window, int cursorID );\r
-\r
-/*\r
- * Helper function to enumerate through all registered windows\r
- * and one to enumerate all of a window's subwindows...\r
- *\r
- * The GFunc callback for those functions will be defined as:\r
- *\r
- *      void enumCallback( gpointer window, gpointer enumerator );\r
- *\r
- * where window is the enumerated (sub)window pointer (SFG_Window *),\r
- * and userData is the a custom user-supplied pointer. Functions\r
- * are defined and exported from freeglut_structure.c file.\r
- */\r
-void fgEnumWindows( FGCBenumerator enumCallback, SFG_Enumerator* enumerator );\r
-void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback,\r
-                       SFG_Enumerator* enumerator );\r
-\r
-/*\r
- * fgWindowByHandle returns a (SFG_Window *) value pointing to the\r
- * first window in the queue matching the specified window handle.\r
- * The function is defined in freeglut_structure.c file.\r
- */\r
-SFG_Window* fgWindowByHandle( SFG_WindowHandleType hWindow );\r
-\r
-/*\r
- * This function is similiar to the previous one, except it is\r
- * looking for a specified (sub)window identifier. The function\r
- * is defined in freeglut_structure.c file.\r
- */\r
-SFG_Window* fgWindowByID( int windowID );\r
-\r
-/*\r
- * Looks up a menu given its ID. This is easier than fgWindowByXXX\r
- * as all menus are placed in a single doubly linked list...\r
- */\r
-SFG_Menu* fgMenuByID( int menuID );\r
-\r
-/*\r
- * The menu activation and deactivation the code. This is the meat\r
- * of the menu user interface handling code...\r
- */\r
-void fgUpdateMenuHighlight ( SFG_Menu *menu );\r
-GLboolean fgCheckActiveMenu ( SFG_Window *window, int button, GLboolean pressed,\r
-                              int mouse_x, int mouse_y );\r
-void fgDeactivateMenu( SFG_Window *window );\r
-\r
-/*\r
- * This function gets called just before the buffers swap, so that\r
- * freeglut can display the pull-down menus via OpenGL. The function\r
- * is defined in freeglut_menu.c file.\r
- */\r
-void fgDisplayMenu( void );\r
-\r
-/* Elapsed time as per glutGet(GLUT_ELAPSED_TIME). */\r
-long fgElapsedTime( void );\r
-\r
-/* System time in milliseconds */\r
-long unsigned fgSystemTime(void);\r
-\r
-/* List functions */\r
-void fgListInit(SFG_List *list);\r
-void fgListAppend(SFG_List *list, SFG_Node *node);\r
-void fgListRemove(SFG_List *list, SFG_Node *node);\r
-int fgListLength(SFG_List *list);\r
-void fgListInsert(SFG_List *list, SFG_Node *next, SFG_Node *node);\r
-\r
-/* Error Message functions */\r
-void fgError( const char *fmt, ... );\r
-void fgWarning( const char *fmt, ... );\r
-\r
-SFG_Proc fgPlatformGetProcAddress( const char *procName );\r
-\r
-/* Window functions needed for Platform implementations */\r
-/* pushing attribute/value pairs into an array */\r
-#define ATTRIB(a) attributes[where++]=(a)\r
-#define ATTRIB_VAL(a,v) {ATTRIB(a); ATTRIB(v);}\r
-\r
-extern int fghIsLegacyContextVersionRequested( void );\r
-extern int fghMapBit( int mask, int from, int to );\r
-extern int fghIsLegacyContextRequested( void );\r
-extern void fghContextCreationError( void );\r
-extern int fghNumberOfAuxBuffersRequested( void );\r
-\r
-#endif /* FREEGLUT_INTERNAL_H */\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_internal.h
+ *
+ * The freeglut library private include file.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Thu Dec 2 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef  FREEGLUT_INTERNAL_H
+#define  FREEGLUT_INTERNAL_H
+
+#ifdef HAVE_CONFIG_H
+#    include "config.h"
+#endif
+
+/* XXX Update these for each release! */
+#define  VERSION_MAJOR 3
+#define  VERSION_MINOR 0
+#define  VERSION_PATCH 0
+
+/* Freeglut is intended to function under all Unix/X11 and Win32 platforms. */
+/* XXX: Don't all MS-Windows compilers (except Cygwin) have _WIN32 defined?
+ * XXX: If so, remove the first set of defined()'s below.
+ */
+#if !defined(TARGET_HOST_POSIX_X11) && !defined(TARGET_HOST_MS_WINDOWS) && !defined(TARGET_HOST_MAC_OSX) && !defined(TARGET_HOST_SOLARIS)
+#if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__MINGW32__) \
+    || defined(_WIN32) || defined(_WIN32_WCE) \
+    || ( defined(__CYGWIN__) && defined(X_DISPLAY_MISSING) )
+#   define  TARGET_HOST_MS_WINDOWS 1
+
+#elif defined(__posix__) || defined(__unix__) || defined(__linux__) || defined(__sun)
+#   define  TARGET_HOST_POSIX_X11  1
+
+#elif defined(__APPLE__)
+/* This is a placeholder until we get native OSX support ironed out -- JFF 11/18/09 */
+#   define  TARGET_HOST_POSIX_X11  1
+/* #   define  TARGET_HOST_MAC_OSX    1 */
+
+#else
+#   error "Unrecognized target host!"
+
+#endif
+#endif
+
+/* Detect both SunPro and gcc compilers on Sun Solaris */
+#if defined (__SVR4) && defined (__sun)
+#   define TARGET_HOST_SOLARIS 1
+#endif
+
+#ifndef TARGET_HOST_MS_WINDOWS
+#   define  TARGET_HOST_MS_WINDOWS 0
+#endif
+
+#ifndef  TARGET_HOST_POSIX_X11
+#   define  TARGET_HOST_POSIX_X11  0
+#endif
+
+#ifndef  TARGET_HOST_MAC_OSX
+#   define  TARGET_HOST_MAC_OSX    0
+#endif
+
+#ifndef  TARGET_HOST_SOLARIS
+#   define  TARGET_HOST_SOLARIS    0
+#endif
+
+/* -- FIXED CONFIGURATION LIMITS ------------------------------------------- */
+
+#define  FREEGLUT_MAX_MENUS         3
+
+/* These files should be available on every platform. */
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+/* These are included based on autoconf directives. */
+#ifdef HAVE_SYS_TYPES_H
+#    include <sys/types.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#    include <unistd.h>
+#endif
+#ifdef TIME_WITH_SYS_TIME
+#    include <sys/time.h>
+#    include <time.h>
+#elif defined(HAVE_SYS_TIME_H)
+#    include <sys/time.h>
+#else
+#    include <time.h>
+#endif
+
+/* -- AUTOCONF HACKS --------------------------------------------------------*/
+
+/* XXX: Update autoconf to avoid these.
+ * XXX: Are non-POSIX platforms intended not to use autoconf?
+ * If so, perhaps there should be a config_guess.h for them. Alternatively,
+ * config guesses could be placed above, just after the config.h exclusion.
+ */
+#if defined(__FreeBSD__) || defined(__NetBSD__)
+#    define HAVE_USB_JS 1
+#    if defined(__NetBSD__) || ( defined(__FreeBSD__) && __FreeBSD_version >= 500000)
+#        define HAVE_USBHID_H 1
+#    endif
+#endif
+
+#if defined(_MSC_VER) || defined(__WATCOMC__)
+/* strdup() is non-standard, for all but POSIX-2001 */
+#define strdup   _strdup
+#endif
+
+/* M_PI is non-standard (defined by BSD, not ISO-C) */
+#ifndef M_PI
+#    define  M_PI  3.14159265358979323846
+#endif
+
+#ifdef HAVE_STDBOOL_H
+#    include <stdbool.h>
+#    ifndef TRUE
+#        define TRUE true
+#    endif
+#    ifndef FALSE
+#        define FALSE false
+#    endif
+#else
+#    ifndef TRUE
+#        define  TRUE  1
+#    endif
+#    ifndef FALSE
+#        define  FALSE  0
+#    endif
+#endif
+
+/* General defines */
+
+#define INVALID_MODIFIERS 0xffffffff
+
+
+
+/* Platform-specific includes */
+#if TARGET_HOST_POSIX_X11
+#include "../x11/freeglut_internal_x11.h"
+#endif
+#if TARGET_HOST_MS_WINDOWS
+#include "../mswin/freeglut_internal_mswin.h"
+#endif
+
+
+/* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */
+
+/* Freeglut callbacks type definitions */
+typedef void (* FGCBDisplay       )( void );
+typedef void (* FGCBReshape       )( int, int );
+typedef void (* FGCBVisibility    )( int );
+typedef void (* FGCBKeyboard      )( unsigned char, int, int );
+typedef void (* FGCBSpecial       )( int, int, int );
+typedef void (* FGCBMouse         )( int, int, int, int );
+typedef void (* FGCBMouseWheel    )( int, int, int, int );
+typedef void (* FGCBMotion        )( int, int );
+typedef void (* FGCBPassive       )( int, int );
+typedef void (* FGCBEntry         )( int );
+typedef void (* FGCBWindowStatus  )( int );
+typedef void (* FGCBSelect        )( int, int, int );
+typedef void (* FGCBJoystick      )( unsigned int, int, int, int );
+typedef void (* FGCBKeyboardUp    )( unsigned char, int, int );
+typedef void (* FGCBSpecialUp     )( int, int, int );
+typedef void (* FGCBOverlayDisplay)( void );
+typedef void (* FGCBSpaceMotion   )( int, int, int );
+typedef void (* FGCBSpaceRotation )( int, int, int );
+typedef void (* FGCBSpaceButton   )( int, int );
+typedef void (* FGCBDials         )( int, int );
+typedef void (* FGCBButtonBox     )( int, int );
+typedef void (* FGCBTabletMotion  )( int, int );
+typedef void (* FGCBTabletButton  )( int, int, int, int );
+typedef void (* FGCBDestroy       )( void );
+
+typedef void (* FGCBMultiEntry   )( int, int );
+typedef void (* FGCBMultiButton  )( int, int, int, int, int );
+typedef void (* FGCBMultiMotion  )( int, int, int );
+typedef void (* FGCBMultiPassive )( int, int, int );
+
+/* The global callbacks type definitions */
+typedef void (* FGCBIdle          )( void );
+typedef void (* FGCBTimer         )( int );
+typedef void (* FGCBMenuState     )( int );
+typedef void (* FGCBMenuStatus    )( int, int, int );
+
+/* The callback used when creating/using menus */
+typedef void (* FGCBMenu          )( int );
+
+/* The FreeGLUT error/warning handler type definition */
+typedef void (* FGError           ) ( const char *fmt, va_list ap);
+typedef void (* FGWarning         ) ( const char *fmt, va_list ap);
+
+
+/* A list structure */
+typedef struct tagSFG_List SFG_List;
+struct tagSFG_List
+{
+    void *First;
+    void *Last;
+};
+
+/* A list node structure */
+typedef struct tagSFG_Node SFG_Node;
+struct tagSFG_Node
+{
+    void *Next;
+    void *Prev;
+};
+
+/* A helper structure holding two ints and a boolean */
+typedef struct tagSFG_XYUse SFG_XYUse;
+struct tagSFG_XYUse
+{
+    GLint           X, Y;               /* The two integers...               */
+    GLboolean       Use;                /* ...and a single boolean.          */
+};
+
+/*
+ * An enumeration containing the state of the GLUT execution:
+ * initializing, running, or stopping
+ */
+typedef enum
+{
+  GLUT_EXEC_STATE_INIT,
+  GLUT_EXEC_STATE_RUNNING,
+  GLUT_EXEC_STATE_STOP
+} fgExecutionState ;
+
+/* This structure holds different freeglut settings */
+typedef struct tagSFG_State SFG_State;
+struct tagSFG_State
+{
+    SFG_XYUse        Position;             /* The default windows' position  */
+    SFG_XYUse        Size;                 /* The default windows' size      */
+    unsigned int     DisplayMode;          /* Display mode for new windows   */
+
+    GLboolean        Initialised;          /* freeglut has been initialised  */
+
+    int              DirectContext;        /* Direct rendering state         */
+
+    GLboolean        ForceIconic;          /* New top windows are iconified  */
+    GLboolean        UseCurrentContext;    /* New windows share with current */
+
+    GLboolean        GLDebugSwitch;        /* OpenGL state debugging switch  */
+    GLboolean        XSyncSwitch;          /* X11 sync protocol switch       */
+
+    int              KeyRepeat;            /* Global key repeat mode.        */
+    int              Modifiers;            /* Current ALT/SHIFT/CTRL state   */
+
+    GLuint           FPSInterval;          /* Interval between FPS printfs   */
+    GLuint           SwapCount;            /* Count of glutSwapBuffer calls  */
+    GLuint           SwapTime;             /* Time of last SwapBuffers       */
+
+    unsigned long    Time;                 /* Time that glutInit was called  */
+    SFG_List         Timers;               /* The freeglut timer hooks       */
+    SFG_List         FreeTimers;           /* The unused timer hooks         */
+
+    FGCBIdle         IdleCallback;         /* The global idle callback       */
+
+    int              ActiveMenus;          /* Num. of currently active menus */
+    FGCBMenuState    MenuStateCallback;    /* Menu callbacks are global      */
+    FGCBMenuStatus   MenuStatusCallback;
+
+    SFG_XYUse        GameModeSize;         /* Game mode screen's dimensions  */
+    int              GameModeDepth;        /* The pixel depth for game mode  */
+    int              GameModeRefresh;      /* The refresh rate for game mode */
+
+    int              ActionOnWindowClose; /* Action when user closes window  */
+
+    fgExecutionState ExecState;           /* Used for GLUT termination       */
+    char            *ProgramName;         /* Name of the invoking program    */
+    GLboolean        JoysticksInitialised;  /* Only initialize if application calls for them */
+    int              NumActiveJoysticks;    /* Number of active joysticks -- if zero, don't poll joysticks */
+    GLboolean        InputDevsInitialised;  /* Only initialize if application calls for them */
+
+       int              MouseWheelTicks;      /* Number of ticks the mouse wheel has turned */
+
+    int              AuxiliaryBufferNumber;  /* Number of auxiliary buffers */
+    int              SampleNumber;         /*  Number of samples per pixel  */
+
+    int              MajorVersion;         /* Major OpenGL context version  */
+    int              MinorVersion;         /* Minor OpenGL context version  */
+    int              ContextFlags;         /* OpenGL context flags          */
+    int              ContextProfile;       /* OpenGL context profile        */
+    FGError          ErrorFunc;            /* User defined error handler    */
+    FGWarning        WarningFunc;          /* User defined warning handler  */
+};
+
+/* The structure used by display initialization in freeglut_init.c */
+typedef struct tagSFG_Display SFG_Display;
+struct tagSFG_Display
+{
+       SFG_PlatformDisplay pDisplay;
+
+    int             ScreenWidth;        /* The screen's width in pixels      */
+    int             ScreenHeight;       /* The screen's height in pixels     */
+    int             ScreenWidthMM;      /* The screen's width in milimeters  */
+    int             ScreenHeightMM;     /* The screen's height in milimeters */
+};
+
+
+/* The user can create any number of timer hooks */
+typedef struct tagSFG_Timer SFG_Timer;
+struct tagSFG_Timer
+{
+    SFG_Node        Node;
+    int             ID;                 /* The timer ID integer              */
+    FGCBTimer       Callback;           /* The timer callback                */
+    long            TriggerTime;        /* The timer trigger time            */
+};
+
+/*
+ * A window and its OpenGL context. The contents of this structure
+ * are highly dependant on the target operating system we aim at...
+ */
+typedef struct tagSFG_Context SFG_Context;
+struct tagSFG_Context
+{
+    SFG_WindowHandleType  Handle;    /* The window's handle                 */
+    SFG_WindowContextType Context;   /* The window's OpenGL/WGL context     */
+
+       SFG_PlatformContext pContext;    /* The window's FBConfig (X11) or device context (Windows) */
+
+    int             DoubleBuffered;  /* Treat the window as double-buffered */
+};
+
+
+typedef struct tagSFG_WindowState SFG_WindowState;
+struct tagSFG_WindowState
+{
+    /* Note that on Windows, sizes always refer to the client area, thus without the window decorations */
+    int             Width;              /* Window's width in pixels          */
+    int             Height;             /* The same about the height         */
+
+       SFG_PlatformWindowState pWState;    /* Window width/height (X11) or rectangle/style (Windows) from before a resize */
+
+    GLboolean       Redisplay;          /* Do we have to redisplay?          */
+    GLboolean       Visible;            /* Is the window visible now         */
+
+    int             Cursor;             /* The currently selected cursor     */
+
+    long            JoystickPollRate;   /* The joystick polling rate         */
+    long            JoystickLastPoll;   /* When the last poll happened       */
+
+    int             MouseX, MouseY;     /* The most recent mouse position    */
+
+    GLboolean       IgnoreKeyRepeat;    /* Whether to ignore key repeat.     */
+    GLboolean       KeyRepeating;       /* Currently in repeat mode          */
+
+    GLboolean       NeedToResize;       /* Do we need to resize the window?  */
+
+    GLboolean       IsFullscreen;       /* is the window fullscreen? */
+};
+
+
+/*
+ * A generic function pointer.  We should really use the GLUTproc type
+ * defined in freeglut_ext.h, but if we include that header in this file
+ * a bunch of other stuff (font-related) blows up!
+ */
+typedef void (*SFG_Proc)();
+
+
+/*
+ * SET_WCB() is used as:
+ *
+ *     SET_WCB( window, cbname, func );
+ *
+ * ...where {window} is the freeglut window to set the callback,
+ *          {cbname} is the window-specific callback to set,
+ *          {func} is a function-pointer.
+ *
+ * Originally, {FETCH_WCB( ... ) = func} was rather sloppily used,
+ * but this can cause warnings because the FETCH_WCB() macro type-
+ * casts its result, and a type-cast value shouldn't be an lvalue.
+ *
+ * The {if( FETCH_WCB( ... ) != func )} test is to do type-checking
+ * and for no other reason.  Since it's hidden in the macro, the
+ * ugliness is felt to be rather benign.
+ */
+#define SET_WCB(window,cbname,func)                            \
+do                                                             \
+{                                                              \
+    if( FETCH_WCB( window, cbname ) != (SFG_Proc)(func) )      \
+        (((window).CallBacks[CB_ ## cbname]) = (SFG_Proc)(func)); \
+} while( 0 )
+
+/*
+ * FETCH_WCB() is used as:
+ *
+ *     FETCH_WCB( window, cbname );
+ *
+ * ...where {window} is the freeglut window to fetch the callback from,
+ *          {cbname} is the window-specific callback to fetch.
+ *
+ * The result is correctly type-cast to the callback function pointer
+ * type.
+ */
+#define FETCH_WCB(window,cbname) \
+    ((window).CallBacks[CB_ ## cbname])
+
+/*
+ * INVOKE_WCB() is used as:
+ *
+ *     INVOKE_WCB( window, cbname, ( arg_list ) );
+ *
+ * ...where {window} is the freeglut window,
+ *          {cbname} is the window-specific callback to be invoked,
+ *          {(arg_list)} is the parameter list.
+ *
+ * The callback is invoked as:
+ *
+ *    callback( arg_list );
+ *
+ * ...so the parentheses are REQUIRED in the {arg_list}.
+ *
+ * NOTE that it does a sanity-check and also sets the
+ * current window.
+ *
+ */
+#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE) /* FIXME: also WinCE? */
+#define INVOKE_WCB(window,cbname,arg_list)    \
+do                                            \
+{                                             \
+    if( FETCH_WCB( window, cbname ) )         \
+    {                                         \
+        FGCB ## cbname func = (FGCB ## cbname)(FETCH_WCB( window, cbname )); \
+        fgSetWindow( &window );               \
+        func arg_list;                        \
+    }                                         \
+} while( 0 )
+#else
+#define INVOKE_WCB(window,cbname,arg_list)    \
+do                                            \
+{                                             \
+    if( FETCH_WCB( window, cbname ) )         \
+    {                                         \
+        fgSetWindow( &window );               \
+        ((FGCB ## cbname)FETCH_WCB( window, cbname )) arg_list; \
+    }                                         \
+} while( 0 )
+#endif
+
+/*
+ * The window callbacks the user can supply us with. Should be kept portable.
+ *
+ * This enumeration provides the freeglut CallBack numbers.
+ * The symbolic constants are indices into a window's array of
+ * function callbacks.  The names are formed by splicing a common
+ * prefix onto the callback's base name.  (This was originally
+ * done so that an early stage of development could live side-by-
+ * side with the old callback code.  The old callback code used
+ * the bare callback's name as a structure member, so I used a
+ * prefix for the array index name.)
+ *
+ * XXX For consistancy, perhaps the prefix should match the
+ * XXX FETCH* and INVOKE* macro suffices.  I.e., WCB_, rather than
+ * XXX CB_.
+ */
+enum
+{
+    CB_Display,
+    CB_Reshape,
+    CB_Keyboard,
+    CB_KeyboardUp,
+    CB_Special,
+    CB_SpecialUp,
+    CB_Mouse,
+    CB_MouseWheel,
+    CB_Motion,
+    CB_Passive,
+    CB_Entry,
+    CB_Visibility,
+    CB_WindowStatus,
+    CB_Joystick,
+    CB_Destroy,
+
+    /* MPX-related */
+    CB_MultiEntry,
+    CB_MultiButton,
+    CB_MultiMotion,
+    CB_MultiPassive,
+
+    /* Presently ignored */
+    CB_Select,
+    CB_OverlayDisplay,
+    CB_SpaceMotion,     /* presently implemented only on UNIX/X11 */
+    CB_SpaceRotation,   /* presently implemented only on UNIX/X11 */
+    CB_SpaceButton,     /* presently implemented only on UNIX/X11 */
+    CB_Dials,
+    CB_ButtonBox,
+    CB_TabletMotion,
+    CB_TabletButton,
+
+    /* Always make this the LAST one */
+    TOTAL_CALLBACKS
+};
+
+
+/* This structure holds the OpenGL rendering context for all the menu windows */
+typedef struct tagSFG_MenuContext SFG_MenuContext;
+struct tagSFG_MenuContext
+{
+    SFG_WindowContextType MContext;       /* The menu window's WGL context   */
+};
+
+/* This structure describes a menu */
+typedef struct tagSFG_Window SFG_Window;
+typedef struct tagSFG_MenuEntry SFG_MenuEntry;
+typedef struct tagSFG_Menu SFG_Menu;
+struct tagSFG_Menu
+{
+    SFG_Node            Node;
+    void               *UserData;     /* User data passed back at callback   */
+    int                 ID;           /* The global menu ID                  */
+    SFG_List            Entries;      /* The menu entries list               */
+    FGCBMenu            Callback;     /* The menu callback                   */
+    FGCBDestroy         Destroy;      /* Destruction callback                */
+    GLboolean           IsActive;     /* Is the menu selected?               */
+    int                 Width;        /* Menu box width in pixels            */
+    int                 Height;       /* Menu box height in pixels           */
+    int                 X, Y;         /* Menu box raster position            */
+
+    SFG_MenuEntry      *ActiveEntry;  /* Currently active entry in the menu  */
+    SFG_Window         *Window;       /* Window for menu                     */
+    SFG_Window         *ParentWindow; /* Window in which the menu is invoked */
+};
+
+/* This is a menu entry */
+struct tagSFG_MenuEntry
+{
+    SFG_Node            Node;
+    int                 ID;                     /* The menu entry ID (local) */
+    int                 Ordinal;                /* The menu's ordinal number */
+    char*               Text;                   /* The text to be displayed  */
+    SFG_Menu*           SubMenu;                /* Optional sub-menu tree    */
+    GLboolean           IsActive;               /* Is the entry highlighted? */
+    int                 Width;                  /* Label's width in pixels   */
+};
+
+/*
+ * A window, making part of freeglut windows hierarchy.
+ * Should be kept portable.
+ *
+ * NOTE that ActiveMenu is set to menu itself if the window is a menu.
+ */
+struct tagSFG_Window
+{
+    SFG_Node            Node;
+    int                 ID;                     /* Window's ID number        */
+
+    SFG_Context         Window;                 /* Window and OpenGL context */
+    SFG_WindowState     State;                  /* The window state          */
+    SFG_Proc            CallBacks[ TOTAL_CALLBACKS ]; /* Array of window callbacks */
+    void               *UserData ;              /* For use by user           */
+
+    SFG_Menu*       Menu[ FREEGLUT_MAX_MENUS ]; /* Menus appended to window  */
+    SFG_Menu*       ActiveMenu;                 /* The window's active menu  */
+
+    SFG_Window*         Parent;                 /* The parent to this window */
+    SFG_List            Children;               /* The subwindows d.l. list  */
+
+    GLboolean           IsMenu;                 /* Set to 1 if we are a menu */
+};
+
+
+/* A linked list structure of windows */
+typedef struct tagSFG_WindowList SFG_WindowList ;
+struct tagSFG_WindowList
+{
+    SFG_Node node;
+    SFG_Window *window ;
+};
+
+/* This holds information about all the windows, menus etc. */
+typedef struct tagSFG_Structure SFG_Structure;
+struct tagSFG_Structure
+{
+    SFG_List        Windows;         /* The global windows list            */
+    SFG_List        Menus;           /* The global menus list              */
+    SFG_List        WindowsToDestroy;
+
+    SFG_Window*     CurrentWindow;   /* The currently set window          */
+    SFG_Menu*       CurrentMenu;     /* Same, but menu...                 */
+
+    SFG_MenuContext* MenuContext;    /* OpenGL rendering context for menus */
+
+    SFG_Window*      GameModeWindow; /* The game mode window               */
+
+    int              WindowID;       /* The new current window ID          */
+    int              MenuID;         /* The new current menu ID            */
+};
+
+/*
+ * This structure is used for the enumeration purposes.
+ * You can easily extend its functionalities by declaring
+ * a structure containing enumerator's contents and custom
+ * data, then casting its pointer to (SFG_Enumerator *).
+ */
+typedef struct tagSFG_Enumerator SFG_Enumerator;
+struct tagSFG_Enumerator
+{
+    GLboolean   found;                          /* Used to terminate search  */
+    void*       data;                           /* Custom data pointer       */
+};
+typedef void (* FGCBenumerator  )( SFG_Window *, SFG_Enumerator * );
+
+/* The bitmap font structure */
+typedef struct tagSFG_Font SFG_Font;
+struct tagSFG_Font
+{
+    char*           Name;         /* The source font name             */
+    int             Quantity;     /* Number of chars in font          */
+    int             Height;       /* Height of the characters         */
+    const GLubyte** Characters;   /* The characters mapping           */
+
+    float           xorig, yorig; /* Relative origin of the character */
+};
+
+/* The stroke font structures */
+
+typedef struct tagSFG_StrokeVertex SFG_StrokeVertex;
+struct tagSFG_StrokeVertex
+{
+    GLfloat         X, Y;
+};
+
+typedef struct tagSFG_StrokeStrip SFG_StrokeStrip;
+struct tagSFG_StrokeStrip
+{
+    int             Number;
+    const SFG_StrokeVertex* Vertices;
+};
+
+typedef struct tagSFG_StrokeChar SFG_StrokeChar;
+struct tagSFG_StrokeChar
+{
+    GLfloat         Right;
+    int             Number;
+    const SFG_StrokeStrip* Strips;
+};
+
+typedef struct tagSFG_StrokeFont SFG_StrokeFont;
+struct tagSFG_StrokeFont
+{
+    char*           Name;                       /* The source font name      */
+    int             Quantity;                   /* Number of chars in font   */
+    GLfloat         Height;                     /* Height of the characters  */
+    const SFG_StrokeChar** Characters;          /* The characters mapping    */
+};
+
+
+/* -- JOYSTICK-SPECIFIC STRUCTURES AND TYPES ------------------------------- */
+/*
+ * Initial defines from "js.h" starting around line 33 with the existing "freeglut_joystick.c"
+ * interspersed
+ */
+
+#if TARGET_HOST_MACINTOSH
+#    include <InputSprocket.h>
+#endif
+
+#if TARGET_HOST_MAC_OSX
+#    include <mach/mach.h>
+#    include <IOKit/IOkitLib.h>
+#    include <IOKit/hid/IOHIDLib.h>
+#endif
+
+/* XXX It might be better to poll the operating system for the numbers of buttons and
+ * XXX axes and then dynamically allocate the arrays.
+ */
+#define _JS_MAX_BUTTONS 32
+
+#if TARGET_HOST_MACINTOSH
+#    define _JS_MAX_AXES  9
+typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick;
+struct tagSFG_PlatformJoystick
+{
+#define  ISP_NUM_AXIS    9
+#define  ISP_NUM_NEEDS  41
+    ISpElementReference isp_elem  [ ISP_NUM_NEEDS ];
+    ISpNeed             isp_needs [ ISP_NUM_NEEDS ];
+};
+#endif
+
+#if TARGET_HOST_MAC_OSX
+#    define _JS_MAX_AXES 16
+typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick;
+struct tagSFG_PlatformJoystick
+{
+    IOHIDDeviceInterface ** hidDev;
+    IOHIDElementCookie buttonCookies[41];
+    IOHIDElementCookie axisCookies[_JS_MAX_AXES];
+/* The next two variables are not used anywhere */
+/*    long minReport[_JS_MAX_AXES],
+ *         maxReport[_JS_MAX_AXES];
+ */
+};
+#endif
+
+
+/*
+ * Definition of "SFG_Joystick" structure -- based on JS's "jsJoystick" object class.
+ * See "js.h" lines 80-178.
+ */
+typedef struct tagSFG_Joystick SFG_Joystick;
+struct tagSFG_Joystick
+{
+       SFG_PlatformJoystick pJoystick;
+
+    int          id;
+    GLboolean    error;
+    char         name [ 128 ];
+    int          num_axes;
+    int          num_buttons;
+
+    float dead_band[ _JS_MAX_AXES ];
+    float saturate [ _JS_MAX_AXES ];
+    float center   [ _JS_MAX_AXES ];
+    float max      [ _JS_MAX_AXES ];
+    float min      [ _JS_MAX_AXES ];
+};
+
+
+
+/* -- GLOBAL VARIABLES EXPORTS --------------------------------------------- */
+
+/* Freeglut display related stuff (initialized once per session) */
+extern SFG_Display fgDisplay;
+
+/* Freeglut internal structure */
+extern SFG_Structure fgStructure;
+
+/* The current freeglut settings */
+extern SFG_State fgState;
+
+
+/* -- PRIVATE FUNCTION DECLARATIONS ---------------------------------------- */
+
+/*
+ * A call to this function makes us sure that the Display and Structure
+ * subsystems have been properly initialized and are ready to be used
+ */
+#define  FREEGLUT_EXIT_IF_NOT_INITIALISED( string )               \
+  if ( ! fgState.Initialised )                                    \
+  {                                                               \
+    fgError ( " ERROR:  Function <%s> called"                     \
+              " without first calling 'glutInit'.", (string) ) ;  \
+  }
+
+#define  FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED( string )  \
+  if ( ! fgState.Initialised )                                      \
+  {                                                                 \
+    fgError ( " ERROR:  Internal <%s> function called"              \
+              " without first calling 'glutInit'.", (string) ) ;    \
+  }
+
+#define  FREEGLUT_INTERNAL_ERROR_EXIT( cond, string, function )  \
+  if ( ! ( cond ) )                                              \
+  {                                                              \
+    fgError ( " ERROR:  Internal error <%s> in function %s",     \
+              (string), (function) ) ;                           \
+  }
+
+/*
+ * Following definitions are somewhat similiar to GLib's,
+ * but do not generate any log messages:
+ */
+#define  freeglut_return_if_fail( expr ) \
+    if( !(expr) )                        \
+        return;
+#define  freeglut_return_val_if_fail( expr, val ) \
+    if( !(expr) )                                 \
+        return val ;
+
+/*
+ * A call to those macros assures us that there is a current
+ * window set, respectively:
+ */
+#define  FREEGLUT_EXIT_IF_NO_WINDOW( string )                               \
+  if ( ! fgStructure.CurrentWindow &&                                       \
+       ( fgState.ActionOnWindowClose != GLUT_ACTION_CONTINUE_EXECUTION ) )  \
+  {                                                                         \
+    fgError ( " ERROR:  Function <%s> called"                               \
+              " with no current window defined.", (string) ) ;              \
+  }
+
+/*
+ * The deinitialize function gets called on glutMainLoop() end. It should clean up
+ * everything inside of the freeglut
+ */
+void fgDeinitialize( void );
+
+/*
+ * Those two functions are used to create/destroy the freeglut internal
+ * structures. This actually happens when calling glutInit() and when
+ * quitting the glutMainLoop() (which actually happens, when all windows
+ * have been closed).
+ */
+void fgCreateStructure( void );
+void fgDestroyStructure( void );
+
+/*
+ * Window creation, opening, closing and destruction.
+ * Also CallBack clearing/initialization.
+ * Defined in freeglut_structure.c, freeglut_window.c.
+ */
+SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title,
+                            GLboolean positionUse, int x, int y,
+                            GLboolean sizeUse, int w, int h,
+                            GLboolean gameMode, GLboolean isMenu );
+void        fgSetWindow ( SFG_Window *window );
+void        fgOpenWindow( SFG_Window* window, const char* title,
+                          GLboolean positionUse, int x, int y,
+                          GLboolean sizeUse, int w, int h,
+                          GLboolean gameMode, GLboolean isSubWindow );
+void        fgCloseWindow( SFG_Window* window );
+void        fgAddToWindowDestroyList ( SFG_Window* window );
+void        fgCloseWindows ();
+void        fgDestroyWindow( SFG_Window* window );
+
+/* Menu creation and destruction. Defined in freeglut_structure.c */
+SFG_Menu*   fgCreateMenu( FGCBMenu menuCallback );
+void        fgDestroyMenu( SFG_Menu* menu );
+
+/* Joystick device management functions, defined in freeglut_joystick.c */
+int         fgJoystickDetect( void );
+void        fgInitialiseJoysticks( void );
+void        fgJoystickClose( void );
+void        fgJoystickPollWindow( SFG_Window* window );
+
+/* InputDevice Initialisation and Closure */
+int         fgInputDeviceDetect( void );
+void        fgInitialiseInputDevices( void );
+void        fgInputDeviceClose( void );
+
+/* spaceball device functions, defined in freeglut_spaceball.c */
+void        fgInitialiseSpaceball( void );
+void        fgSpaceballClose( void );
+void        fgSpaceballSetWindow( SFG_Window *window );
+
+int         fgHasSpaceball( void );
+int         fgSpaceballNumButtons( void );
+
+/* Setting the cursor for a given window */
+void fgSetCursor ( SFG_Window *window, int cursorID );
+
+/*
+ * Helper function to enumerate through all registered windows
+ * and one to enumerate all of a window's subwindows...
+ *
+ * The GFunc callback for those functions will be defined as:
+ *
+ *      void enumCallback( gpointer window, gpointer enumerator );
+ *
+ * where window is the enumerated (sub)window pointer (SFG_Window *),
+ * and userData is the a custom user-supplied pointer. Functions
+ * are defined and exported from freeglut_structure.c file.
+ */
+void fgEnumWindows( FGCBenumerator enumCallback, SFG_Enumerator* enumerator );
+void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback,
+                       SFG_Enumerator* enumerator );
+
+/*
+ * fgWindowByHandle returns a (SFG_Window *) value pointing to the
+ * first window in the queue matching the specified window handle.
+ * The function is defined in freeglut_structure.c file.
+ */
+SFG_Window* fgWindowByHandle( SFG_WindowHandleType hWindow );
+
+/*
+ * This function is similiar to the previous one, except it is
+ * looking for a specified (sub)window identifier. The function
+ * is defined in freeglut_structure.c file.
+ */
+SFG_Window* fgWindowByID( int windowID );
+
+/*
+ * Looks up a menu given its ID. This is easier than fgWindowByXXX
+ * as all menus are placed in a single doubly linked list...
+ */
+SFG_Menu* fgMenuByID( int menuID );
+
+/*
+ * The menu activation and deactivation the code. This is the meat
+ * of the menu user interface handling code...
+ */
+void fgUpdateMenuHighlight ( SFG_Menu *menu );
+GLboolean fgCheckActiveMenu ( SFG_Window *window, int button, GLboolean pressed,
+                              int mouse_x, int mouse_y );
+void fgDeactivateMenu( SFG_Window *window );
+
+/*
+ * This function gets called just before the buffers swap, so that
+ * freeglut can display the pull-down menus via OpenGL. The function
+ * is defined in freeglut_menu.c file.
+ */
+void fgDisplayMenu( void );
+
+/* Elapsed time as per glutGet(GLUT_ELAPSED_TIME). */
+long fgElapsedTime( void );
+
+/* System time in milliseconds */
+long unsigned fgSystemTime(void);
+
+/* List functions */
+void fgListInit(SFG_List *list);
+void fgListAppend(SFG_List *list, SFG_Node *node);
+void fgListRemove(SFG_List *list, SFG_Node *node);
+int fgListLength(SFG_List *list);
+void fgListInsert(SFG_List *list, SFG_Node *next, SFG_Node *node);
+
+/* Error Message functions */
+void fgError( const char *fmt, ... );
+void fgWarning( const char *fmt, ... );
+
+SFG_Proc fgPlatformGetProcAddress( const char *procName );
+
+/* Window functions needed for Platform implementations */
+/* pushing attribute/value pairs into an array */
+#define ATTRIB(a) attributes[where++]=(a)
+#define ATTRIB_VAL(a,v) {ATTRIB(a); ATTRIB(v);}
+
+extern int fghIsLegacyContextVersionRequested( void );
+extern int fghMapBit( int mask, int from, int to );
+extern int fghIsLegacyContextRequested( void );
+extern void fghContextCreationError( void );
+extern int fghNumberOfAuxBuffersRequested( void );
+
+#endif /* FREEGLUT_INTERNAL_H */
+
+/*** END OF FILE ***/
index c2190da..f6edc26 100644 (file)
-/*\r
- * freeglut_joystick.c\r
- *\r
- * Joystick handling code\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Steve Baker, <sjbaker1@airmail.net>\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-/*\r
- * FreeBSD port by Stephen Montgomery-Smith <stephen@math.missouri.edu>\r
- *\r
- * Redone by John Fay 2/4/04 with another look from the PLIB "js" library.\r
- *  Many thanks for Steve Baker for permission to pull from that library.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-#ifdef HAVE_SYS_PARAM_H\r
-#    include <sys/param.h>\r
-#endif\r
-\r
-#define JS_TRUE  1\r
-#define JS_FALSE 0\r
-\r
-/* BSD defines from "jsBSD.cxx" around lines 42-270 */\r
-\r
-#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__)\r
-\r
-#    ifdef HAVE_USB_JS\r
-#        if defined(__NetBSD__)\r
-/* XXX The below hack is done until freeglut's autoconf is updated. */\r
-#            define HAVE_USBHID_H 1\r
-#            ifdef HAVE_USBHID_H\r
-#                include <usbhid.h>\r
-#            else\r
-#                include <usb.h>\r
-#            endif\r
-#        elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)\r
-#            ifdef HAVE_USBHID_H\r
-#                include <usbhid.h>\r
-#            else\r
-#                include <libusbhid.h>\r
-#            endif\r
-#        endif\r
-#        include <legacy/dev/usb/usb.h>\r
-#        include <dev/usb/usbhid.h>\r
-\r
-/* Compatibility with older usb.h revisions */\r
-#        if !defined(USB_MAX_DEVNAMES) && defined(MAXDEVNAMES)\r
-#            define USB_MAX_DEVNAMES MAXDEVNAMES\r
-#        endif\r
-#    endif\r
-\r
-static int hatmap_x[9] = { 0, 0, 1, 1, 1, 0, -1, -1, -1 };\r
-static int hatmap_y[9] = { 0, 1, 1, 0, -1, -1, -1, 0, 1 };\r
-struct os_specific_s {\r
-  char             fname [128 ];\r
-  int              fd;\r
-  int              is_analog;\r
-  /* The following structure members are specific to analog joysticks */\r
-  struct joystick  ajs;\r
-#    ifdef HAVE_USB_JS\r
-  /* The following structure members are specific to USB joysticks */\r
-  struct hid_item *hids;\r
-  int              hid_dlen;\r
-  int              hid_offset;\r
-  char            *hid_data_buf;\r
-  int              axes_usage [ _JS_MAX_AXES ];\r
-#    endif\r
-  /* We keep button and axes state ourselves, as they might not be updated\r
-   * on every read of a USB device\r
-   */\r
-  int              cache_buttons;\r
-  float            cache_axes [ _JS_MAX_AXES ];\r
-};\r
-\r
-/* Idents lower than USB_IDENT_OFFSET are for analog joysticks. */\r
-#    define USB_IDENT_OFFSET    2\r
-\r
-#    define USBDEV "/dev/usb"\r
-#    define UHIDDEV "/dev/uhid"\r
-#    define AJSDEV "/dev/joy"\r
-\r
-#    ifdef HAVE_USB_JS\r
-/*\r
- * fghJoystickFindUSBdev (and its helper, fghJoystickWalkUSBdev) try to locate\r
- * the full name of a USB device. If /dev/usbN isn't readable, we punt and\r
- * return the uhidN device name. We warn the user of this situation once.\r
- */\r
-static char *fghJoystickWalkUSBdev(int f, char *dev, char *out, int outlen)\r
-{\r
-  struct usb_device_info di;\r
-  int i, a;\r
-  char *cp;\r
-\r
-  for (a = 1; a < USB_MAX_DEVICES; a++) {\r
-    di.udi_addr = a;\r
-    if (ioctl(f, USB_DEVICEINFO, &di) != 0)\r
-      return NULL;\r
-    for (i = 0; i < USB_MAX_DEVNAMES; i++)\r
-      if (di.udi_devnames[i][0] &&\r
-          strcmp(di.udi_devnames[i], dev) == 0) {\r
-        cp =  calloc( 1, strlen(di.udi_vendor) + strlen(di.udi_product) + 2);\r
-        strcpy(cp, di.udi_vendor);\r
-        strcat(cp, " ");\r
-        strcat(cp, di.udi_product);\r
-        strncpy(out, cp, outlen - 1);\r
-        out[outlen - 1] = 0;\r
-        free( cp );\r
-        return out;\r
-      }\r
-  }\r
-  return NULL;\r
-}\r
-\r
-static int fghJoystickFindUSBdev(char *name, char *out, int outlen)\r
-{\r
-  int i, f;\r
-  char buf[50];\r
-  char *cp;\r
-  static int protection_warned = 0;\r
-\r
-  for (i = 0; i < 16; i++) {\r
-    snprintf(buf, sizeof(buf), "%s%d", USBDEV, i);\r
-    f = open(buf, O_RDONLY);\r
-    if (f >= 0) {\r
-      cp = fghJoystickWalkUSBdev(f, name, out, outlen);\r
-      close(f);\r
-      if (cp)\r
-        return 1;\r
-    }\r
-#ifdef HAVE_ERRNO_H\r
-    else if (errno == EACCES) {\r
-      if (!protection_warned) {\r
-        fgWarning ( "Can't open %s for read!", buf );\r
-        protection_warned = 1;\r
-      }\r
-    }\r
-#endif\r
-  }\r
-  return 0;\r
-}\r
-\r
-static int fghJoystickInitializeHID(struct os_specific_s *os,\r
-       int *num_axes, int *num_buttons)\r
-{\r
-    int size, is_joystick;\r
-#   ifdef HAVE_USBHID_H\r
-        int report_id = 0;\r
-#   endif\r
-    struct hid_data *d;\r
-    struct hid_item h;\r
-    report_desc_t rd;\r
-\r
-    if ( ( rd = hid_get_report_desc( os->fd ) ) == 0 )\r
-    {\r
-#ifdef HAVE_ERRNO_H\r
-        fgWarning ( "error: %s: %s", os->fname, strerror( errno ) );\r
-#else\r
-        fgWarning ( "error: %s", os->fname );\r
-#endif\r
-        return FALSE;\r
-    }\r
-\r
-    os->hids = NULL;\r
-\r
-#   ifdef HAVE_USBHID_H\r
-        if( ioctl( os->fd, USB_GET_REPORT_ID, &report_id ) < 0)\r
-        {\r
-            /*** XXX {report_id} may not be the right variable? ***/\r
-#ifdef HAVE_ERRNO_H\r
-            fgWarning ( "error: %s%d: %s", UHIDDEV, report_id, strerror( errno ) );\r
-#else\r
-            fgWarning ( "error: %s%d", UHIDDEV, report_id );\r
-#endif\r
-            return FALSE;\r
-        }\r
-\r
-        size = hid_report_size( rd, hid_input, report_id );\r
-#   else\r
-        size = hid_report_size( rd, 0, hid_input );\r
-#   endif\r
-    os->hid_data_buf = calloc( 1, size );\r
-    os->hid_dlen = size;\r
-\r
-    is_joystick = 0;\r
-#   ifdef HAVE_USBHID_H\r
-        d = hid_start_parse( rd, 1 << hid_input, report_id );\r
-#   else\r
-        d = hid_start_parse( rd, 1 << hid_input );\r
-#   endif\r
-        while( hid_get_item( d, &h ) )\r
-        {\r
-            int usage, page, interesting_hid;\r
-\r
-            page = HID_PAGE( h.usage );\r
-            usage = HID_USAGE( h.usage );\r
-\r
-            /* This test is somewhat too simplistic, but this is how MicroSoft\r
-             * does, so I guess it works for all joysticks/game pads. */\r
-            is_joystick = is_joystick ||\r
-                ( h.kind == hid_collection &&\r
-                  page == HUP_GENERIC_DESKTOP &&\r
-                  ( usage == HUG_JOYSTICK || usage == HUG_GAME_PAD ) );\r
-\r
-            if( h.kind != hid_input )\r
-                continue;\r
-\r
-            if( !is_joystick )\r
-                continue;\r
-\r
-            interesting_hid = TRUE;\r
-            if( page == HUP_GENERIC_DESKTOP )\r
-            {\r
-                switch( usage )\r
-                {\r
-                case HUG_X:\r
-                case HUG_RX:\r
-                case HUG_Y:\r
-                case HUG_RY:\r
-                case HUG_Z:\r
-                case HUG_RZ:\r
-                case HUG_SLIDER:\r
-                    if( *num_axes < _JS_MAX_AXES )\r
-                    {\r
-                        os->axes_usage[ *num_axes ] = usage;\r
-                        ( *num_axes )++;\r
-                    }\r
-                    break;\r
-                case HUG_HAT_SWITCH:\r
-                    /* Allocate two axes for a hat */\r
-                    if( *num_axes + 1 < _JS_MAX_AXES )\r
-                    {\r
-                        os->axes_usage[ *num_axes ] = usage;\r
-                        (*num_axes)++;\r
-                        os->axes_usage[ *num_axes ] = usage;\r
-                        (*num_axes)++;\r
-                    }\r
-                    break;\r
-                default:\r
-                    interesting_hid = FALSE;\r
-                    break;\r
-                }\r
-            }\r
-            else if( page == HUP_BUTTON )\r
-            {\r
-                interesting_hid = ( usage > 0 ) &&\r
-                    ( usage <= _JS_MAX_BUTTONS );\r
-\r
-                if( interesting_hid && usage - 1 > *num_buttons )\r
-                    *num_buttons = usage - 1;\r
-            }\r
-\r
-            if( interesting_hid )\r
-            {\r
-                h.next = os->hids;\r
-                os->hids = calloc( 1, sizeof ( struct hid_item ) );\r
-                *os->hids = h;\r
-            }\r
-        }\r
-        hid_end_parse( d );\r
-\r
-        return os->hids != NULL;\r
-}\r
-#    endif\r
-#endif\r
-\r
-/*\r
- * Functions associated with the "jsJoystick" class in PLIB\r
- */\r
-#if TARGET_HOST_MAC_OSX\r
-#define K_NUM_DEVICES   32\r
-int numDevices;\r
-io_object_t ioDevices[K_NUM_DEVICES];\r
-\r
-static void fghJoystickFindDevices ( SFG_Joystick* joy, mach_port_t );\r
-static CFDictionaryRef fghJoystickGetCFProperties ( SFG_Joystick* joy, io_object_t );\r
-\r
-static void fghJoystickEnumerateElements ( SFG_Joystick* joy, CFTypeRef element );\r
-/* callback for CFArrayApply */\r
-static void fghJoystickElementEnumerator ( SFG_Joystick* joy, void *element, void* vjs );\r
-\r
-static void fghJoystickAddAxisElement ( SFG_Joystick* joy, CFDictionaryRef axis );\r
-static void fghJoystickAddButtonElement ( SFG_Joystick* joy, CFDictionaryRef button );\r
-static void fghJoystickAddHatElement ( SFG_Joystick* joy, CFDictionaryRef hat );\r
-#endif\r
-\r
-\r
-/* External function declarations (mostly platform-specific) */\r
-extern void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes );\r
-extern void fgPlatformJoystickOpen( SFG_Joystick* joy );\r
-extern void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident );\r
-extern void fgPlatformJoystickClose ( int ident );\r
-\r
-/*\r
- * The static joystick structure pointer\r
- */\r
-#define MAX_NUM_JOYSTICKS  2\r
-SFG_Joystick *fgJoystick [ MAX_NUM_JOYSTICKS ];\r
-\r
-/*\r
- * Read the raw joystick data\r
- */\r
-static void fghJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes )\r
-{\r
-    int i;\r
-\r
-    /* Defaults */\r
-    if( buttons )\r
-        *buttons = 0;\r
-\r
-    if( axes )\r
-        for( i = 0; i < joy->num_axes; i++ )\r
-            axes[ i ] = 1500.0f;\r
-\r
-    if( joy->error )\r
-        return;\r
-\r
-       fgPlatformJoystickRawRead ( joy, buttons, axes );\r
-}\r
-\r
-/*\r
- * Correct the joystick axis data\r
- */\r
-static float fghJoystickFudgeAxis( SFG_Joystick* joy, float value, int axis )\r
-{\r
-    if( value < joy->center[ axis ] )\r
-    {\r
-        float xx = ( value - joy->center[ axis ] ) / ( joy->center[ axis ] -\r
-                                                       joy->min[ axis ] );\r
-\r
-        if( xx < -joy->saturate[ axis ] )\r
-            return -1.0f;\r
-\r
-        if( xx > -joy->dead_band [ axis ] )\r
-            return 0.0f;\r
-\r
-        xx = ( xx + joy->dead_band[ axis ] ) / ( joy->saturate[ axis ] -\r
-                                                 joy->dead_band[ axis ] );\r
-\r
-        return ( xx < -1.0f ) ? -1.0f : xx;\r
-    }\r
-    else\r
-    {\r
-        float xx = ( value - joy->center [ axis ] ) / ( joy->max[ axis ] -\r
-                                                        joy->center[ axis ] );\r
-\r
-        if( xx > joy->saturate[ axis ] )\r
-            return 1.0f;\r
-\r
-        if( xx < joy->dead_band[ axis ] )\r
-            return 0.0f;\r
-\r
-        xx = ( xx - joy->dead_band[ axis ] ) / ( joy->saturate[ axis ] -\r
-                                                 joy->dead_band[ axis ] );\r
-\r
-        return ( xx > 1.0f ) ? 1.0f : xx;\r
-    }\r
-}\r
-\r
-/*\r
- * Read the corrected joystick data\r
- */\r
-static void fghJoystickRead( SFG_Joystick* joy, int* buttons, float* axes )\r
-{\r
-    float raw_axes[ _JS_MAX_AXES ];\r
-    int  i;\r
-\r
-    if( joy->error )\r
-    {\r
-        if( buttons )\r
-            *buttons = 0;\r
-\r
-        if( axes )\r
-            for ( i=0; i<joy->num_axes; i++ )\r
-                axes[ i ] = 0.0f;\r
-    }\r
-\r
-    fghJoystickRawRead( joy, buttons, raw_axes );\r
-\r
-    if( axes )\r
-        for( i=0; i<joy->num_axes; i++ )\r
-            axes[ i ] = fghJoystickFudgeAxis( joy, raw_axes[ i ], i );\r
-}\r
-\r
-/*\r
- * Happy happy happy joy joy joy (happy new year toudi :D)\r
- */\r
-\r
-\r
-#if TARGET_HOST_MAC_OSX\r
-/** open the IOKit connection, enumerate all the HID devices, add their\r
-interface references to the static array. We then use the array index\r
-as the device number when we come to open() the joystick. */\r
-static int fghJoystickFindDevices ( SFG_Joystick *joy, mach_port_t masterPort )\r
-{\r
-    CFMutableDictionaryRef hidMatch = NULL;\r
-    IOReturn rv = kIOReturnSuccess;\r
-\r
-    io_iterator_t hidIterator;\r
-    io_object_t ioDev;\r
-\r
-    /* build a dictionary matching HID devices */\r
-    hidMatch = IOServiceMatching(kIOHIDDeviceKey);\r
-\r
-    rv = IOServiceGetMatchingServices(masterPort, hidMatch, &hidIterator);\r
-    if (rv != kIOReturnSuccess || !hidIterator) {\r
-      fgWarning( "no joystick (HID) devices found" );\r
-      return;\r
-    }\r
-\r
-    /* iterate */\r
-    while ((ioDev = IOIteratorNext(hidIterator))) {\r
-        /* filter out keyboard and mouse devices */\r
-        CFDictionaryRef properties = getCFProperties(ioDev);\r
-        long usage, page;\r
-\r
-        CFTypeRef refPage = CFDictionaryGetValue (properties, CFSTR(kIOHIDPrimaryUsagePageKey));\r
-        CFTypeRef refUsage = CFDictionaryGetValue (properties, CFSTR(kIOHIDPrimaryUsageKey));\r
-        CFNumberGetValue((CFNumberRef) refUsage, kCFNumberLongType, &usage);\r
-        CFNumberGetValue((CFNumberRef) refPage, kCFNumberLongType, &page);\r
-\r
-        /* keep only joystick devices */\r
-        if ( ( page == kHIDPage_GenericDesktop ) && (\r
-                            (usage == kHIDUsage_GD_Joystick)\r
-                         || (usage == kHIDUsage_GD_GamePad)\r
-                         || (usage == kHIDUsage_GD_MultiAxisController)\r
-                         || (usage == kHIDUsage_GD_Hatswitch) /* last two necessary ? */\r
-            /* add it to the array */\r
-            ioDevices[numDevices++] = ioDev;\r
-    }\r
-\r
-    IOObjectRelease(hidIterator);\r
-}\r
-\r
-static CFDictionaryRef fghJoystickGetCFProperties ( SFG_Joystick *joy, io_object_t ioDev )\r
-{\r
-    IOReturn rv;\r
-    CFMutableDictionaryRef cfProperties;\r
-\r
-#if 0\r
-    /* comment copied from darwin/SDL_sysjoystick.c */\r
-    /* Mac OS X currently is not mirroring all USB properties to HID page so need to look at USB device page also\r
-     * get dictionary for usb properties: step up two levels and get CF dictionary for USB properties\r
-     */\r
-\r
-    io_registry_entry_t parent1, parent2;\r
-\r
-    rv = IORegistryEntryGetParentEntry (ioDev, kIOServicePlane, &parent1);\r
-    if (rv != kIOReturnSuccess) {\r
-        fgWarning ( "error getting device entry parent");\r
-        return NULL;\r
-    }\r
-\r
-    rv = IORegistryEntryGetParentEntry (parent1, kIOServicePlane, &parent2);\r
-    if (rv != kIOReturnSuccess) {\r
-        fgWarning ( "error getting device entry parent 2");\r
-        return NULL;\r
-    }\r
-#endif\r
-\r
-    rv = IORegistryEntryCreateCFProperties( ioDev /*parent2*/,\r
-        &cfProperties, kCFAllocatorDefault, kNilOptions);\r
-    if (rv != kIOReturnSuccess || !cfProperties) {\r
-        fgWarning ( "error getting device properties");\r
-        return NULL;\r
-    }\r
-\r
-    return cfProperties;\r
-}\r
-\r
-static void fghJoystickElementEnumerator ( SFG_Joystick *joy, void *element, void* vjs )\r
-{\r
-      if (CFGetTypeID((CFTypeRef) element) != CFDictionaryGetTypeID()) {\r
-            fgError ( "%s", "element enumerator passed non-dictionary value");\r
-            return;\r
-    }\r
-\r
-      static_cast<jsJoystick*>(vjs)->parseElement ( (CFDictionaryRef) element );\r
-}\r
-\r
-/** element enumerator function : pass NULL for top-level*/\r
-static void fghJoystickEnumerateElements ( SFG_Joystick *joy, CFTypeRef element )\r
-{\r
-      FREEGLUT_INTERNAL_ERROR_EXIT( (CFGetTypeID(element) == CFArrayGetTypeID(),\r
-                                    "Joystick element type mismatch",\r
-                                    "fghJoystickEnumerateElements" );\r
-\r
-      CFRange range = {0, CFArrayGetCount ((CFArrayRef)element)};\r
-      CFArrayApplyFunction((CFArrayRef) element, range,\r
-            &fghJoystickElementEnumerator, joy );\r
-}\r
-\r
-static void fghJoystickAddAxisElement ( SFG_Joystick *joy, CFDictionaryRef axis )\r
-{\r
-    long cookie, lmin, lmax;\r
-    int index = joy->num_axes++;\r
-\r
-    CFNumberGetValue ((CFNumberRef)\r
-        CFDictionaryGetValue ( axis, CFSTR(kIOHIDElementCookieKey) ),\r
-        kCFNumberLongType, &cookie);\r
-\r
-    joy->pJoystick.axisCookies[index] = (IOHIDElementCookie) cookie;\r
-\r
-    CFNumberGetValue ((CFNumberRef)\r
-        CFDictionaryGetValue ( axis, CFSTR(kIOHIDElementMinKey) ),\r
-        kCFNumberLongType, &lmin);\r
-\r
-    CFNumberGetValue ((CFNumberRef)\r
-        CFDictionaryGetValue ( axis, CFSTR(kIOHIDElementMaxKey) ),\r
-        kCFNumberLongType, &lmax);\r
-\r
-    joy->min[index] = lmin;\r
-    joy->max[index] = lmax;\r
-    joy->dead_band[index] = 0.0;\r
-    joy->saturate[index] = 1.0;\r
-    joy->center[index] = (lmax + lmin) * 0.5;\r
-}\r
-\r
-static void fghJoystickAddButtonElement ( SFG_Joystick *joy, CFDictionaryRef button )\r
-{\r
-    long cookie;\r
-    CFNumberGetValue ((CFNumberRef)\r
-            CFDictionaryGetValue ( button, CFSTR(kIOHIDElementCookieKey) ),\r
-            kCFNumberLongType, &cookie);\r
-\r
-    joy->pJoystick.buttonCookies[num_buttons++] = (IOHIDElementCookie) cookie;\r
-    /* anything else for buttons? */\r
-}\r
-\r
-static void fghJoystickAddHatElement ( SFG_Joystick *joy, CFDictionaryRef button )\r
-{\r
-    /* hatCookies[num_hats++] = (IOHIDElementCookie) cookie; */\r
-    /* do we map hats to axes or buttons? */\r
-}\r
-#endif\r
-\r
-/*\r
- *  Platform-Specific Code\r
- */\r
-\r
-#if TARGET_HOST_MACINTOSH\r
-void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes )\r
-{\r
-    int i;\r
-\r
-    if ( buttons )\r
-    {\r
-        *buttons = 0;\r
-\r
-        for ( i = 0; i < joy->num_buttons; i++ )\r
-        {\r
-            UInt32 state;\r
-            int err = ISpElement_GetSimpleState ( joy->pJoystick.isp_elem [ i + ISP_NUM_AXIS ], &state);\r
-            ISP_CHECK_ERR(err)\r
-\r
-            *buttons |= state << i;\r
-        }\r
-    }\r
-\r
-    if ( axes )\r
-    {\r
-        for ( i = 0; i < joy->num_axes; i++ )\r
-        {\r
-            UInt32 state;\r
-            int err = ISpElement_GetSimpleState ( joy->pJoystick.isp_elem [ i ], &state );\r
-            ISP_CHECK_ERR(err)\r
-\r
-            axes [i] = (float) state;\r
-        }\r
-    }\r
-}\r
-\r
-\r
-void fgPlatformJoystickOpen( SFG_Joystick* joy )\r
-{\r
-       int i = 0;\r
-    OSStatus err;\r
-\r
-    /* XXX FIXME: get joystick name in Mac */\r
-\r
-    err = ISpStartup( );\r
-\r
-    if( err == noErr )\r
-    {\r
-#define ISP_CHECK_ERR(x) if( x != noErr ) { joy->error = GL_TRUE; return; }\r
-\r
-        joy->error = GL_TRUE;\r
-\r
-        /* initialize the needs structure */\r
-        ISpNeed temp_isp_needs[ ISP_NUM_NEEDS ] =\r
-        {\r
-          { "\pX-Axis",  128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },\r
-          { "\pY-Axis",  128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },\r
-          { "\pZ-Axis",    128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },\r
-          { "\pR-Axis",    128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },\r
-          { "\pAxis   4",  128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },\r
-          { "\pAxis   5",  128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },\r
-          { "\pAxis   6",  128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },\r
-          { "\pAxis   7",  128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },\r
-          { "\pAxis   8",  128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },\r
-\r
-          { "\pButton 0",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 1",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 2",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 3",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 4",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 5",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 6",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 7",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 8",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 9",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 10", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 11", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 12", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 13", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 14", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 15", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 16", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 17", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 18", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 19", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 20", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 21", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 22", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 23", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 24", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 25", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 26", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 27", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 28", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 29", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 30", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-          { "\pButton 31", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },\r
-        };\r
-\r
-        memcpy( joy->pJoystick.isp_needs, temp_isp_needs, sizeof (temp_isp_needs ) );\r
-\r
-\r
-        /* next two calls allow keyboard and mouse to emulate other input\r
-         * devices (gamepads, joysticks, etc)\r
-         */\r
-        /*\r
-          err = ISpDevices_ActivateClass ( kISpDeviceClass_Keyboard );\r
-          ISP_CHECK_ERR(err)\r
-\r
-\r
-          err = ISpDevices_ActivateClass ( kISpDeviceClass_Mouse );\r
-          ISP_CHECK_ERR(err)\r
-        */\r
-\r
-        err = ISpElement_NewVirtualFromNeeds( ISP_NUM_NEEDS,\r
-                                              joy->pJoystick.isp_needs, joy->pJoystick.isp_elem,\r
-                                              0 );\r
-        ISP_CHECK_ERR( err )\r
-\r
-        err = ISpInit( ISP_NUM_NEEDS, joy->pJoystick.isp_needs, joy->pJoystick.isp_elem,\r
-                       'freeglut', nil, 0, 128, 0 );\r
-        ISP_CHECK_ERR( err )\r
-\r
-        joy->num_buttons = ISP_NUM_NEEDS - ISP_NUM_AXIS;\r
-        joy->num_axes    = ISP_NUM_AXIS;\r
-\r
-        for( i = 0; i < joy->num_axes; i++ )\r
-        {\r
-            joy->dead_band[ i ] = 0;\r
-            joy->saturate [ i ] = 1;\r
-            joy->center   [ i ] = kISpAxisMiddle;\r
-            joy->max      [ i ] = kISpAxisMaximum;\r
-            joy->min      [ i ] = kISpAxisMinimum;\r
-        }\r
-\r
-        joy->error = GL_FALSE;\r
-    }\r
-    else\r
-        joy->num_buttons = joy->num_axes = 0;\r
-}\r
-\r
-\r
-void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )\r
-{\r
-    fgJoystick[ ident ]->id = ident;\r
-    snprintf( fgJoystick[ ident ]->pJoystick.fname, sizeof(fgJoystick[ ident ]->pJoystick.fname), "/dev/js%d", ident ); /* FIXME */\r
-    fgJoystick[ ident ]->error = GL_FALSE;\r
-}\r
-\r
-\r
-void fgPlatformJoystickClose ( int ident )\r
-{\r
-    ISpSuspend( );\r
-    ISpStop( );\r
-    ISpShutdown( );\r
-}\r
-#endif\r
-\r
-#if TARGET_HOST_MAC_OSX\r
-void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes )\r
-{\r
-    int i;\r
-\r
-    if ( buttons != NULL )\r
-    {\r
-        *buttons = 0;\r
-\r
-        for ( i = 0; i < joy->num_buttons; i++ )\r
-        {\r
-            IOHIDEventStruct hidEvent;\r
-            (*(joy->pJoystick.hidDev))->getElementValue ( joy->pJoystick.hidDev, joy->pJoystick.buttonCookies[i], &hidEvent );\r
-            if ( hidEvent.value )\r
-                *buttons |= 1 << i;\r
-        }\r
-    }\r
-\r
-    if ( axes != NULL )\r
-    {\r
-        for ( i = 0; i < joy->num_axes; i++ )\r
-        {\r
-            IOHIDEventStruct hidEvent;\r
-            (*(joy->pJoystick.hidDev))->getElementValue ( joy->pJoystick.hidDev, joy->pJoystick.axisCookies[i], &hidEvent );\r
-            axes[i] = hidEvent.value;\r
-        }\r
-    }\r
-}\r
-\r
-\r
-void fgPlatformJoystickOpen( SFG_Joystick* joy )\r
-{\r
-    IOReturn rv;\r
-    SInt32 score;\r
-    IOCFPlugInInterface **plugin;\r
-\r
-    HRESULT pluginResult;\r
-\r
-    CFDictionaryRef props;\r
-    CFTypeRef topLevelElement;\r
-\r
-    if( joy->id >= numDevices )\r
-    {\r
-        fgWarning( "device index out of range in fgJoystickOpen()" );\r
-        return;\r
-    }\r
-\r
-    /* create device interface */\r
-    rv = IOCreatePlugInInterfaceForService( ioDevices[ joy->id ],\r
-                                            kIOHIDDeviceUserClientTypeID,\r
-                                            kIOCFPlugInInterfaceID,\r
-                                            &plugin, &score );\r
-\r
-    if( rv != kIOReturnSuccess )\r
-    {\r
-        fgWarning( "error creating plugin for io device" );\r
-        return;\r
-    }\r
-\r
-    pluginResult = ( *plugin )->QueryInterface(\r
-        plugin,\r
-        CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID),\r
-        &( LPVOID )joy->pJoystick.hidDev\r
-    );\r
-\r
-    if( pluginResult != S_OK )\r
-        fgWarning ( "QI-ing IO plugin to HID Device interface failed" );\r
-\r
-    ( *plugin )->Release( plugin ); /* don't leak a ref */\r
-    if( joy->pJoystick.hidDev == NULL )\r
-        return;\r
-\r
-    /* store the interface in this instance */\r
-    rv = ( *( joy->pJoystick.hidDev ) )->open( joy->pJoystick.hidDev, 0 );\r
-    if( rv != kIOReturnSuccess )\r
-    {\r
-        fgWarning( "error opening device interface");\r
-        return;\r
-    }\r
-\r
-    props = getCFProperties( ioDevices[ joy->id ] );\r
-\r
-    /* recursively enumerate all the bits */\r
-    CFTypeRef topLevelElement =\r
-        CFDictionaryGetValue( props, CFSTR( kIOHIDElementKey ) );\r
-    enumerateElements( topLevelElement );\r
-\r
-    CFRelease( props );\r
-}\r
-\r
-\r
-void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )\r
-{\r
-    fgJoystick[ ident ]->id = ident;\r
-    fgJoystick[ ident ]->error = GL_FALSE;\r
-    fgJoystick[ ident ]->num_axes = 0;\r
-    fgJoystick[ ident ]->num_buttons = 0;\r
-\r
-    if( numDevices < 0 )\r
-    {\r
-        /* do first-time init (since we can't over-ride jsInit, hmm */\r
-        numDevices = 0;\r
-\r
-        mach_port_t masterPort;\r
-        IOReturn rv = IOMasterPort( bootstrap_port, &masterPort );\r
-        if( rv != kIOReturnSuccess )\r
-        {\r
-            fgWarning( "error getting master Mach port" );\r
-            return;\r
-        }\r
-        fghJoystickFindDevices( masterPort );\r
-    }\r
-\r
-    if ( ident >= numDevices )\r
-    {\r
-        fgJoystick[ ident ]->error = GL_TRUE;\r
-        return;\r
-    }\r
-\r
-    /* get the name now too */\r
-    CFDictionaryRef properties = getCFProperties( ioDevices[ ident ] );\r
-    CFTypeRef ref = CFDictionaryGetValue( properties,\r
-                                          CFSTR( kIOHIDProductKey ) );\r
-    if (!ref)\r
-        ref = CFDictionaryGetValue(properties, CFSTR( "USB Product Name" ) );\r
-\r
-    if( !ref ||\r
-        !CFStringGetCString( ( CFStringRef )ref, name, 128,\r
-                             CFStringGetSystemEncoding( ) ) )\r
-    {\r
-        fgWarning( "error getting device name" );\r
-        name[ 0 ] = '\0';\r
-    }\r
-}\r
-\r
-\r
-void fgPlatformJoystickClose ( int ident )\r
-{\r
-    ( *( fgJoystick[ ident ]->pJoystick.hidDev ) )->\r
-        close( fgJoystick[ ident ]->pJoystick.hidDev );\r
-}\r
-#endif\r
-\r
-\r
-\r
-\r
-static void fghJoystickOpen( SFG_Joystick* joy )\r
-{\r
-    /*\r
-     * Default values (for no joystick -- each conditional will reset the\r
-     * error flag)\r
-     */\r
-    joy->error = TRUE;\r
-    joy->num_axes = joy->num_buttons = 0;\r
-    joy->name[ 0 ] = '\0';\r
-\r
-       fgPlatformJoystickOpen ( joy );\r
-\r
-}\r
-\r
-/*\r
- * This function replaces the constructor method in the JS library.\r
- */\r
-static void fghJoystickInit( int ident )\r
-{\r
-    if( ident >= MAX_NUM_JOYSTICKS )\r
-      fgError( "Too large a joystick number: %d", ident );\r
-\r
-    if( fgJoystick[ ident ] )\r
-        fgError( "illegal attempt to initialize joystick device again" );\r
-\r
-    fgJoystick[ ident ] =\r
-        ( SFG_Joystick * )calloc( sizeof( SFG_Joystick ), 1 );\r
-\r
-    /* Set defaults */\r
-    fgJoystick[ ident ]->num_axes = fgJoystick[ ident ]->num_buttons = 0;\r
-    fgJoystick[ ident ]->error = GL_TRUE;\r
-\r
-       fgPlatformJoystickInit( fgJoystick, ident );\r
-\r
-    fghJoystickOpen( fgJoystick[ ident  ] );\r
-}\r
-\r
-/*\r
- * Try initializing all the joysticks (well, both of them)\r
- */\r
-void fgInitialiseJoysticks ( void )\r
-{\r
-    if( !fgState.JoysticksInitialised )\r
-    {\r
-        int ident ;\r
-        for ( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ )\r
-            fghJoystickInit( ident );\r
-\r
-        fgState.JoysticksInitialised = GL_TRUE;\r
-    }\r
-}\r
-\r
-\r
-void fgJoystickClose( void )\r
-{\r
-    int ident ;\r
-    for( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ )\r
-    {\r
-        if( fgJoystick[ ident ] )\r
-        {\r
-                       fgPlatformJoystickClose ( ident );\r
-\r
-            free( fgJoystick[ ident ] );\r
-            fgJoystick[ ident ] = NULL;\r
-            /* show joystick has been deinitialized */\r
-        }\r
-    }\r
-}\r
-\r
-/*\r
- * Polls the joystick and executes the joystick callback hooked to the\r
- * window specified in the function's parameter:\r
- */\r
-void fgJoystickPollWindow( SFG_Window* window )\r
-{\r
-    float axes[ _JS_MAX_AXES ];\r
-    int buttons;\r
-    int ident;\r
-\r
-    freeglut_return_if_fail( window );\r
-    freeglut_return_if_fail( FETCH_WCB( *window, Joystick ) );\r
-\r
-    for( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ )\r
-    {\r
-        if( fgJoystick[ident] )\r
-        {\r
-            fghJoystickRead( fgJoystick[ident], &buttons, axes );\r
-\r
-            if( !fgJoystick[ident]->error )\r
-                INVOKE_WCB( *window, Joystick,\r
-                            ( buttons,\r
-                              (int) ( axes[ 0 ] * 1000.0f ),\r
-                              (int) ( axes[ 1 ] * 1000.0f ),\r
-                              (int) ( axes[ 2 ] * 1000.0f ) )\r
-                );\r
-        }\r
-    }\r
-}\r
-\r
-/*\r
- * Implementation for glutDeviceGet(GLUT_HAS_JOYSTICK)\r
- */\r
-int fgJoystickDetect( void )\r
-{\r
-    int ident;\r
-\r
-    fgInitialiseJoysticks ();\r
-\r
-    if ( !fgState.JoysticksInitialised )\r
-        return 0;\r
-\r
-    for( ident=0; ident<MAX_NUM_JOYSTICKS; ident++ )\r
-        if( fgJoystick[ident] && !fgJoystick[ident]->error )\r
-            return 1;\r
-\r
-    return 0;\r
-}\r
-\r
-/*\r
- * Joystick information functions\r
- */\r
-int  glutJoystickGetNumAxes( int ident )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetNumAxes" );\r
-    return fgJoystick[ ident ]->num_axes;\r
-}\r
-int  glutJoystickGetNumButtons( int ident )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetNumButtons" );\r
-    return fgJoystick[ ident ]->num_buttons;\r
-}\r
-int  glutJoystickNotWorking( int ident )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickNotWorking" );\r
-    return fgJoystick[ ident ]->error;\r
-}\r
-\r
-float glutJoystickGetDeadBand( int ident, int axis )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetDeadBand" );\r
-    return fgJoystick[ ident ]->dead_band [ axis ];\r
-}\r
-void  glutJoystickSetDeadBand( int ident, int axis, float db )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetDeadBand" );\r
-    fgJoystick[ ident ]->dead_band[ axis ] = db;\r
-}\r
-\r
-float glutJoystickGetSaturation( int ident, int axis )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetSaturation" );\r
-    return fgJoystick[ ident ]->saturate[ axis ];\r
-}\r
-void  glutJoystickSetSaturation( int ident, int axis, float st )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetSaturation" );\r
-    fgJoystick[ ident ]->saturate [ axis ] = st;\r
-}\r
-\r
-void glutJoystickSetMinRange( int ident, float *axes )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetMinRange" );\r
-    memcpy( fgJoystick[ ident ]->min, axes,\r
-            fgJoystick[ ident ]->num_axes * sizeof( float ) );\r
-}\r
-void glutJoystickSetMaxRange( int ident, float *axes )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetMaxRange" );\r
-    memcpy( fgJoystick[ ident ]->max, axes,\r
-            fgJoystick[ ident ]->num_axes * sizeof( float ) );\r
-}\r
-void glutJoystickSetCenter( int ident, float *axes )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetCenter" );\r
-    memcpy( fgJoystick[ ident ]->center, axes,\r
-            fgJoystick[ ident ]->num_axes * sizeof( float ) );\r
-}\r
-\r
-void glutJoystickGetMinRange( int ident, float *axes )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetMinRange" );\r
-    memcpy( axes, fgJoystick[ ident ]->min,\r
-            fgJoystick[ ident ]->num_axes * sizeof( float ) );\r
-}\r
-void glutJoystickGetMaxRange( int ident, float *axes )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetMaxRange" );\r
-    memcpy( axes, fgJoystick[ ident ]->max,\r
-            fgJoystick[ ident ]->num_axes * sizeof( float ) );\r
-}\r
-void glutJoystickGetCenter( int ident, float *axes )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetCenter" );\r
-    memcpy( axes, fgJoystick[ ident ]->center,\r
-            fgJoystick[ ident ]->num_axes * sizeof( float ) );\r
-}\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_joystick.c
+ *
+ * Joystick handling code
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Steve Baker, <sjbaker1@airmail.net>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * FreeBSD port by Stephen Montgomery-Smith <stephen@math.missouri.edu>
+ *
+ * Redone by John Fay 2/4/04 with another look from the PLIB "js" library.
+ *  Many thanks for Steve Baker for permission to pull from that library.
+ */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+#ifdef HAVE_SYS_PARAM_H
+#    include <sys/param.h>
+#endif
+
+#define JS_TRUE  1
+#define JS_FALSE 0
+
+/* BSD defines from "jsBSD.cxx" around lines 42-270 */
+
+#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+
+#    ifdef HAVE_USB_JS
+#        if defined(__NetBSD__)
+/* XXX The below hack is done until freeglut's autoconf is updated. */
+#            define HAVE_USBHID_H 1
+#            ifdef HAVE_USBHID_H
+#                include <usbhid.h>
+#            else
+#                include <usb.h>
+#            endif
+#        elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+#            ifdef HAVE_USBHID_H
+#                include <usbhid.h>
+#            else
+#                include <libusbhid.h>
+#            endif
+#        endif
+#        include <legacy/dev/usb/usb.h>
+#        include <dev/usb/usbhid.h>
+
+/* Compatibility with older usb.h revisions */
+#        if !defined(USB_MAX_DEVNAMES) && defined(MAXDEVNAMES)
+#            define USB_MAX_DEVNAMES MAXDEVNAMES
+#        endif
+#    endif
+
+static int hatmap_x[9] = { 0, 0, 1, 1, 1, 0, -1, -1, -1 };
+static int hatmap_y[9] = { 0, 1, 1, 0, -1, -1, -1, 0, 1 };
+struct os_specific_s {
+  char             fname [128 ];
+  int              fd;
+  int              is_analog;
+  /* The following structure members are specific to analog joysticks */
+  struct joystick  ajs;
+#    ifdef HAVE_USB_JS
+  /* The following structure members are specific to USB joysticks */
+  struct hid_item *hids;
+  int              hid_dlen;
+  int              hid_offset;
+  char            *hid_data_buf;
+  int              axes_usage [ _JS_MAX_AXES ];
+#    endif
+  /* We keep button and axes state ourselves, as they might not be updated
+   * on every read of a USB device
+   */
+  int              cache_buttons;
+  float            cache_axes [ _JS_MAX_AXES ];
+};
+
+/* Idents lower than USB_IDENT_OFFSET are for analog joysticks. */
+#    define USB_IDENT_OFFSET    2
+
+#    define USBDEV "/dev/usb"
+#    define UHIDDEV "/dev/uhid"
+#    define AJSDEV "/dev/joy"
+
+#    ifdef HAVE_USB_JS
+/*
+ * fghJoystickFindUSBdev (and its helper, fghJoystickWalkUSBdev) try to locate
+ * the full name of a USB device. If /dev/usbN isn't readable, we punt and
+ * return the uhidN device name. We warn the user of this situation once.
+ */
+static char *fghJoystickWalkUSBdev(int f, char *dev, char *out, int outlen)
+{
+  struct usb_device_info di;
+  int i, a;
+  char *cp;
+
+  for (a = 1; a < USB_MAX_DEVICES; a++) {
+    di.udi_addr = a;
+    if (ioctl(f, USB_DEVICEINFO, &di) != 0)
+      return NULL;
+    for (i = 0; i < USB_MAX_DEVNAMES; i++)
+      if (di.udi_devnames[i][0] &&
+          strcmp(di.udi_devnames[i], dev) == 0) {
+        cp =  calloc( 1, strlen(di.udi_vendor) + strlen(di.udi_product) + 2);
+        strcpy(cp, di.udi_vendor);
+        strcat(cp, " ");
+        strcat(cp, di.udi_product);
+        strncpy(out, cp, outlen - 1);
+        out[outlen - 1] = 0;
+        free( cp );
+        return out;
+      }
+  }
+  return NULL;
+}
+
+static int fghJoystickFindUSBdev(char *name, char *out, int outlen)
+{
+  int i, f;
+  char buf[50];
+  char *cp;
+  static int protection_warned = 0;
+
+  for (i = 0; i < 16; i++) {
+    snprintf(buf, sizeof(buf), "%s%d", USBDEV, i);
+    f = open(buf, O_RDONLY);
+    if (f >= 0) {
+      cp = fghJoystickWalkUSBdev(f, name, out, outlen);
+      close(f);
+      if (cp)
+        return 1;
+    }
+#ifdef HAVE_ERRNO_H
+    else if (errno == EACCES) {
+      if (!protection_warned) {
+        fgWarning ( "Can't open %s for read!", buf );
+        protection_warned = 1;
+      }
+    }
+#endif
+  }
+  return 0;
+}
+
+static int fghJoystickInitializeHID(struct os_specific_s *os,
+       int *num_axes, int *num_buttons)
+{
+    int size, is_joystick;
+#   ifdef HAVE_USBHID_H
+        int report_id = 0;
+#   endif
+    struct hid_data *d;
+    struct hid_item h;
+    report_desc_t rd;
+
+    if ( ( rd = hid_get_report_desc( os->fd ) ) == 0 )
+    {
+#ifdef HAVE_ERRNO_H
+        fgWarning ( "error: %s: %s", os->fname, strerror( errno ) );
+#else
+        fgWarning ( "error: %s", os->fname );
+#endif
+        return FALSE;
+    }
+
+    os->hids = NULL;
+
+#   ifdef HAVE_USBHID_H
+        if( ioctl( os->fd, USB_GET_REPORT_ID, &report_id ) < 0)
+        {
+            /*** XXX {report_id} may not be the right variable? ***/
+#ifdef HAVE_ERRNO_H
+            fgWarning ( "error: %s%d: %s", UHIDDEV, report_id, strerror( errno ) );
+#else
+            fgWarning ( "error: %s%d", UHIDDEV, report_id );
+#endif
+            return FALSE;
+        }
+
+        size = hid_report_size( rd, hid_input, report_id );
+#   else
+        size = hid_report_size( rd, 0, hid_input );
+#   endif
+    os->hid_data_buf = calloc( 1, size );
+    os->hid_dlen = size;
+
+    is_joystick = 0;
+#   ifdef HAVE_USBHID_H
+        d = hid_start_parse( rd, 1 << hid_input, report_id );
+#   else
+        d = hid_start_parse( rd, 1 << hid_input );
+#   endif
+        while( hid_get_item( d, &h ) )
+        {
+            int usage, page, interesting_hid;
+
+            page = HID_PAGE( h.usage );
+            usage = HID_USAGE( h.usage );
+
+            /* This test is somewhat too simplistic, but this is how MicroSoft
+             * does, so I guess it works for all joysticks/game pads. */
+            is_joystick = is_joystick ||
+                ( h.kind == hid_collection &&
+                  page == HUP_GENERIC_DESKTOP &&
+                  ( usage == HUG_JOYSTICK || usage == HUG_GAME_PAD ) );
+
+            if( h.kind != hid_input )
+                continue;
+
+            if( !is_joystick )
+                continue;
+
+            interesting_hid = TRUE;
+            if( page == HUP_GENERIC_DESKTOP )
+            {
+                switch( usage )
+                {
+                case HUG_X:
+                case HUG_RX:
+                case HUG_Y:
+                case HUG_RY:
+                case HUG_Z:
+                case HUG_RZ:
+                case HUG_SLIDER:
+                    if( *num_axes < _JS_MAX_AXES )
+                    {
+                        os->axes_usage[ *num_axes ] = usage;
+                        ( *num_axes )++;
+                    }
+                    break;
+                case HUG_HAT_SWITCH:
+                    /* Allocate two axes for a hat */
+                    if( *num_axes + 1 < _JS_MAX_AXES )
+                    {
+                        os->axes_usage[ *num_axes ] = usage;
+                        (*num_axes)++;
+                        os->axes_usage[ *num_axes ] = usage;
+                        (*num_axes)++;
+                    }
+                    break;
+                default:
+                    interesting_hid = FALSE;
+                    break;
+                }
+            }
+            else if( page == HUP_BUTTON )
+            {
+                interesting_hid = ( usage > 0 ) &&
+                    ( usage <= _JS_MAX_BUTTONS );
+
+                if( interesting_hid && usage - 1 > *num_buttons )
+                    *num_buttons = usage - 1;
+            }
+
+            if( interesting_hid )
+            {
+                h.next = os->hids;
+                os->hids = calloc( 1, sizeof ( struct hid_item ) );
+                *os->hids = h;
+            }
+        }
+        hid_end_parse( d );
+
+        return os->hids != NULL;
+}
+#    endif
+#endif
+
+/*
+ * Functions associated with the "jsJoystick" class in PLIB
+ */
+#if TARGET_HOST_MAC_OSX
+#define K_NUM_DEVICES   32
+int numDevices;
+io_object_t ioDevices[K_NUM_DEVICES];
+
+static void fghJoystickFindDevices ( SFG_Joystick* joy, mach_port_t );
+static CFDictionaryRef fghJoystickGetCFProperties ( SFG_Joystick* joy, io_object_t );
+
+static void fghJoystickEnumerateElements ( SFG_Joystick* joy, CFTypeRef element );
+/* callback for CFArrayApply */
+static void fghJoystickElementEnumerator ( SFG_Joystick* joy, void *element, void* vjs );
+
+static void fghJoystickAddAxisElement ( SFG_Joystick* joy, CFDictionaryRef axis );
+static void fghJoystickAddButtonElement ( SFG_Joystick* joy, CFDictionaryRef button );
+static void fghJoystickAddHatElement ( SFG_Joystick* joy, CFDictionaryRef hat );
+#endif
+
+
+/* External function declarations (mostly platform-specific) */
+extern void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes );
+extern void fgPlatformJoystickOpen( SFG_Joystick* joy );
+extern void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident );
+extern void fgPlatformJoystickClose ( int ident );
+
+/*
+ * The static joystick structure pointer
+ */
+#define MAX_NUM_JOYSTICKS  2
+SFG_Joystick *fgJoystick [ MAX_NUM_JOYSTICKS ];
+
+/*
+ * Read the raw joystick data
+ */
+static void fghJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes )
+{
+    int i;
+
+    /* Defaults */
+    if( buttons )
+        *buttons = 0;
+
+    if( axes )
+        for( i = 0; i < joy->num_axes; i++ )
+            axes[ i ] = 1500.0f;
+
+    if( joy->error )
+        return;
+
+       fgPlatformJoystickRawRead ( joy, buttons, axes );
+}
+
+/*
+ * Correct the joystick axis data
+ */
+static float fghJoystickFudgeAxis( SFG_Joystick* joy, float value, int axis )
+{
+    if( value < joy->center[ axis ] )
+    {
+        float xx = ( value - joy->center[ axis ] ) / ( joy->center[ axis ] -
+                                                       joy->min[ axis ] );
+
+        if( xx < -joy->saturate[ axis ] )
+            return -1.0f;
+
+        if( xx > -joy->dead_band [ axis ] )
+            return 0.0f;
+
+        xx = ( xx + joy->dead_band[ axis ] ) / ( joy->saturate[ axis ] -
+                                                 joy->dead_band[ axis ] );
+
+        return ( xx < -1.0f ) ? -1.0f : xx;
+    }
+    else
+    {
+        float xx = ( value - joy->center [ axis ] ) / ( joy->max[ axis ] -
+                                                        joy->center[ axis ] );
+
+        if( xx > joy->saturate[ axis ] )
+            return 1.0f;
+
+        if( xx < joy->dead_band[ axis ] )
+            return 0.0f;
+
+        xx = ( xx - joy->dead_band[ axis ] ) / ( joy->saturate[ axis ] -
+                                                 joy->dead_band[ axis ] );
+
+        return ( xx > 1.0f ) ? 1.0f : xx;
+    }
+}
+
+/*
+ * Read the corrected joystick data
+ */
+static void fghJoystickRead( SFG_Joystick* joy, int* buttons, float* axes )
+{
+    float raw_axes[ _JS_MAX_AXES ];
+    int  i;
+
+    if( joy->error )
+    {
+        if( buttons )
+            *buttons = 0;
+
+        if( axes )
+            for ( i=0; i<joy->num_axes; i++ )
+                axes[ i ] = 0.0f;
+    }
+
+    fghJoystickRawRead( joy, buttons, raw_axes );
+
+    if( axes )
+        for( i=0; i<joy->num_axes; i++ )
+            axes[ i ] = fghJoystickFudgeAxis( joy, raw_axes[ i ], i );
+}
+
+/*
+ * Happy happy happy joy joy joy (happy new year toudi :D)
+ */
+
+
+#if TARGET_HOST_MAC_OSX
+/** open the IOKit connection, enumerate all the HID devices, add their
+interface references to the static array. We then use the array index
+as the device number when we come to open() the joystick. */
+static int fghJoystickFindDevices ( SFG_Joystick *joy, mach_port_t masterPort )
+{
+    CFMutableDictionaryRef hidMatch = NULL;
+    IOReturn rv = kIOReturnSuccess;
+
+    io_iterator_t hidIterator;
+    io_object_t ioDev;
+
+    /* build a dictionary matching HID devices */
+    hidMatch = IOServiceMatching(kIOHIDDeviceKey);
+
+    rv = IOServiceGetMatchingServices(masterPort, hidMatch, &hidIterator);
+    if (rv != kIOReturnSuccess || !hidIterator) {
+      fgWarning( "no joystick (HID) devices found" );
+      return;
+    }
+
+    /* iterate */
+    while ((ioDev = IOIteratorNext(hidIterator))) {
+        /* filter out keyboard and mouse devices */
+        CFDictionaryRef properties = getCFProperties(ioDev);
+        long usage, page;
+
+        CFTypeRef refPage = CFDictionaryGetValue (properties, CFSTR(kIOHIDPrimaryUsagePageKey));
+        CFTypeRef refUsage = CFDictionaryGetValue (properties, CFSTR(kIOHIDPrimaryUsageKey));
+        CFNumberGetValue((CFNumberRef) refUsage, kCFNumberLongType, &usage);
+        CFNumberGetValue((CFNumberRef) refPage, kCFNumberLongType, &page);
+
+        /* keep only joystick devices */
+        if ( ( page == kHIDPage_GenericDesktop ) && (
+                            (usage == kHIDUsage_GD_Joystick)
+                         || (usage == kHIDUsage_GD_GamePad)
+                         || (usage == kHIDUsage_GD_MultiAxisController)
+                         || (usage == kHIDUsage_GD_Hatswitch) /* last two necessary ? */
+            /* add it to the array */
+            ioDevices[numDevices++] = ioDev;
+    }
+
+    IOObjectRelease(hidIterator);
+}
+
+static CFDictionaryRef fghJoystickGetCFProperties ( SFG_Joystick *joy, io_object_t ioDev )
+{
+    IOReturn rv;
+    CFMutableDictionaryRef cfProperties;
+
+#if 0
+    /* comment copied from darwin/SDL_sysjoystick.c */
+    /* Mac OS X currently is not mirroring all USB properties to HID page so need to look at USB device page also
+     * get dictionary for usb properties: step up two levels and get CF dictionary for USB properties
+     */
+
+    io_registry_entry_t parent1, parent2;
+
+    rv = IORegistryEntryGetParentEntry (ioDev, kIOServicePlane, &parent1);
+    if (rv != kIOReturnSuccess) {
+        fgWarning ( "error getting device entry parent");
+        return NULL;
+    }
+
+    rv = IORegistryEntryGetParentEntry (parent1, kIOServicePlane, &parent2);
+    if (rv != kIOReturnSuccess) {
+        fgWarning ( "error getting device entry parent 2");
+        return NULL;
+    }
+#endif
+
+    rv = IORegistryEntryCreateCFProperties( ioDev /*parent2*/,
+        &cfProperties, kCFAllocatorDefault, kNilOptions);
+    if (rv != kIOReturnSuccess || !cfProperties) {
+        fgWarning ( "error getting device properties");
+        return NULL;
+    }
+
+    return cfProperties;
+}
+
+static void fghJoystickElementEnumerator ( SFG_Joystick *joy, void *element, void* vjs )
+{
+      if (CFGetTypeID((CFTypeRef) element) != CFDictionaryGetTypeID()) {
+            fgError ( "%s", "element enumerator passed non-dictionary value");
+            return;
+    }
+
+      static_cast<jsJoystick*>(vjs)->parseElement ( (CFDictionaryRef) element );
+}
+
+/** element enumerator function : pass NULL for top-level*/
+static void fghJoystickEnumerateElements ( SFG_Joystick *joy, CFTypeRef element )
+{
+      FREEGLUT_INTERNAL_ERROR_EXIT( (CFGetTypeID(element) == CFArrayGetTypeID(),
+                                    "Joystick element type mismatch",
+                                    "fghJoystickEnumerateElements" );
+
+      CFRange range = {0, CFArrayGetCount ((CFArrayRef)element)};
+      CFArrayApplyFunction((CFArrayRef) element, range,
+            &fghJoystickElementEnumerator, joy );
+}
+
+static void fghJoystickAddAxisElement ( SFG_Joystick *joy, CFDictionaryRef axis )
+{
+    long cookie, lmin, lmax;
+    int index = joy->num_axes++;
+
+    CFNumberGetValue ((CFNumberRef)
+        CFDictionaryGetValue ( axis, CFSTR(kIOHIDElementCookieKey) ),
+        kCFNumberLongType, &cookie);
+
+    joy->pJoystick.axisCookies[index] = (IOHIDElementCookie) cookie;
+
+    CFNumberGetValue ((CFNumberRef)
+        CFDictionaryGetValue ( axis, CFSTR(kIOHIDElementMinKey) ),
+        kCFNumberLongType, &lmin);
+
+    CFNumberGetValue ((CFNumberRef)
+        CFDictionaryGetValue ( axis, CFSTR(kIOHIDElementMaxKey) ),
+        kCFNumberLongType, &lmax);
+
+    joy->min[index] = lmin;
+    joy->max[index] = lmax;
+    joy->dead_band[index] = 0.0;
+    joy->saturate[index] = 1.0;
+    joy->center[index] = (lmax + lmin) * 0.5;
+}
+
+static void fghJoystickAddButtonElement ( SFG_Joystick *joy, CFDictionaryRef button )
+{
+    long cookie;
+    CFNumberGetValue ((CFNumberRef)
+            CFDictionaryGetValue ( button, CFSTR(kIOHIDElementCookieKey) ),
+            kCFNumberLongType, &cookie);
+
+    joy->pJoystick.buttonCookies[num_buttons++] = (IOHIDElementCookie) cookie;
+    /* anything else for buttons? */
+}
+
+static void fghJoystickAddHatElement ( SFG_Joystick *joy, CFDictionaryRef button )
+{
+    /* hatCookies[num_hats++] = (IOHIDElementCookie) cookie; */
+    /* do we map hats to axes or buttons? */
+}
+#endif
+
+/*
+ *  Platform-Specific Code
+ */
+
+#if TARGET_HOST_MACINTOSH
+void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes )
+{
+    int i;
+
+    if ( buttons )
+    {
+        *buttons = 0;
+
+        for ( i = 0; i < joy->num_buttons; i++ )
+        {
+            UInt32 state;
+            int err = ISpElement_GetSimpleState ( joy->pJoystick.isp_elem [ i + ISP_NUM_AXIS ], &state);
+            ISP_CHECK_ERR(err)
+
+            *buttons |= state << i;
+        }
+    }
+
+    if ( axes )
+    {
+        for ( i = 0; i < joy->num_axes; i++ )
+        {
+            UInt32 state;
+            int err = ISpElement_GetSimpleState ( joy->pJoystick.isp_elem [ i ], &state );
+            ISP_CHECK_ERR(err)
+
+            axes [i] = (float) state;
+        }
+    }
+}
+
+
+void fgPlatformJoystickOpen( SFG_Joystick* joy )
+{
+       int i = 0;
+    OSStatus err;
+
+    /* XXX FIXME: get joystick name in Mac */
+
+    err = ISpStartup( );
+
+    if( err == noErr )
+    {
+#define ISP_CHECK_ERR(x) if( x != noErr ) { joy->error = GL_TRUE; return; }
+
+        joy->error = GL_TRUE;
+
+        /* initialize the needs structure */
+        ISpNeed temp_isp_needs[ ISP_NUM_NEEDS ] =
+        {
+          { "\pX-Axis",  128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },
+          { "\pY-Axis",  128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },
+          { "\pZ-Axis",    128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },
+          { "\pR-Axis",    128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },
+          { "\pAxis   4",  128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },
+          { "\pAxis   5",  128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },
+          { "\pAxis   6",  128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },
+          { "\pAxis   7",  128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },
+          { "\pAxis   8",  128, 0, 0, kISpElementKind_Axis,   kISpElementLabel_None, 0, 0, 0, 0 },
+
+          { "\pButton 0",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 1",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 2",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 3",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 4",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 5",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 6",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 7",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 8",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 9",  128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 10", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 11", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 12", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 13", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 14", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 15", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 16", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 17", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 18", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 19", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 20", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 21", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 22", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 23", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 24", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 25", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 26", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 27", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 28", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 29", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 30", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+          { "\pButton 31", 128, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Select, 0, 0, 0, 0 },
+        };
+
+        memcpy( joy->pJoystick.isp_needs, temp_isp_needs, sizeof (temp_isp_needs ) );
+
+
+        /* next two calls allow keyboard and mouse to emulate other input
+         * devices (gamepads, joysticks, etc)
+         */
+        /*
+          err = ISpDevices_ActivateClass ( kISpDeviceClass_Keyboard );
+          ISP_CHECK_ERR(err)
+
+
+          err = ISpDevices_ActivateClass ( kISpDeviceClass_Mouse );
+          ISP_CHECK_ERR(err)
+        */
+
+        err = ISpElement_NewVirtualFromNeeds( ISP_NUM_NEEDS,
+                                              joy->pJoystick.isp_needs, joy->pJoystick.isp_elem,
+                                              0 );
+        ISP_CHECK_ERR( err )
+
+        err = ISpInit( ISP_NUM_NEEDS, joy->pJoystick.isp_needs, joy->pJoystick.isp_elem,
+                       'freeglut', nil, 0, 128, 0 );
+        ISP_CHECK_ERR( err )
+
+        joy->num_buttons = ISP_NUM_NEEDS - ISP_NUM_AXIS;
+        joy->num_axes    = ISP_NUM_AXIS;
+
+        for( i = 0; i < joy->num_axes; i++ )
+        {
+            joy->dead_band[ i ] = 0;
+            joy->saturate [ i ] = 1;
+            joy->center   [ i ] = kISpAxisMiddle;
+            joy->max      [ i ] = kISpAxisMaximum;
+            joy->min      [ i ] = kISpAxisMinimum;
+        }
+
+        joy->error = GL_FALSE;
+    }
+    else
+        joy->num_buttons = joy->num_axes = 0;
+}
+
+
+void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )
+{
+    fgJoystick[ ident ]->id = ident;
+    snprintf( fgJoystick[ ident ]->pJoystick.fname, sizeof(fgJoystick[ ident ]->pJoystick.fname), "/dev/js%d", ident ); /* FIXME */
+    fgJoystick[ ident ]->error = GL_FALSE;
+}
+
+
+void fgPlatformJoystickClose ( int ident )
+{
+    ISpSuspend( );
+    ISpStop( );
+    ISpShutdown( );
+}
+#endif
+
+#if TARGET_HOST_MAC_OSX
+void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes )
+{
+    int i;
+
+    if ( buttons != NULL )
+    {
+        *buttons = 0;
+
+        for ( i = 0; i < joy->num_buttons; i++ )
+        {
+            IOHIDEventStruct hidEvent;
+            (*(joy->pJoystick.hidDev))->getElementValue ( joy->pJoystick.hidDev, joy->pJoystick.buttonCookies[i], &hidEvent );
+            if ( hidEvent.value )
+                *buttons |= 1 << i;
+        }
+    }
+
+    if ( axes != NULL )
+    {
+        for ( i = 0; i < joy->num_axes; i++ )
+        {
+            IOHIDEventStruct hidEvent;
+            (*(joy->pJoystick.hidDev))->getElementValue ( joy->pJoystick.hidDev, joy->pJoystick.axisCookies[i], &hidEvent );
+            axes[i] = hidEvent.value;
+        }
+    }
+}
+
+
+void fgPlatformJoystickOpen( SFG_Joystick* joy )
+{
+    IOReturn rv;
+    SInt32 score;
+    IOCFPlugInInterface **plugin;
+
+    HRESULT pluginResult;
+
+    CFDictionaryRef props;
+    CFTypeRef topLevelElement;
+
+    if( joy->id >= numDevices )
+    {
+        fgWarning( "device index out of range in fgJoystickOpen()" );
+        return;
+    }
+
+    /* create device interface */
+    rv = IOCreatePlugInInterfaceForService( ioDevices[ joy->id ],
+                                            kIOHIDDeviceUserClientTypeID,
+                                            kIOCFPlugInInterfaceID,
+                                            &plugin, &score );
+
+    if( rv != kIOReturnSuccess )
+    {
+        fgWarning( "error creating plugin for io device" );
+        return;
+    }
+
+    pluginResult = ( *plugin )->QueryInterface(
+        plugin,
+        CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID),
+        &( LPVOID )joy->pJoystick.hidDev
+    );
+
+    if( pluginResult != S_OK )
+        fgWarning ( "QI-ing IO plugin to HID Device interface failed" );
+
+    ( *plugin )->Release( plugin ); /* don't leak a ref */
+    if( joy->pJoystick.hidDev == NULL )
+        return;
+
+    /* store the interface in this instance */
+    rv = ( *( joy->pJoystick.hidDev ) )->open( joy->pJoystick.hidDev, 0 );
+    if( rv != kIOReturnSuccess )
+    {
+        fgWarning( "error opening device interface");
+        return;
+    }
+
+    props = getCFProperties( ioDevices[ joy->id ] );
+
+    /* recursively enumerate all the bits */
+    CFTypeRef topLevelElement =
+        CFDictionaryGetValue( props, CFSTR( kIOHIDElementKey ) );
+    enumerateElements( topLevelElement );
+
+    CFRelease( props );
+}
+
+
+void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )
+{
+    fgJoystick[ ident ]->id = ident;
+    fgJoystick[ ident ]->error = GL_FALSE;
+    fgJoystick[ ident ]->num_axes = 0;
+    fgJoystick[ ident ]->num_buttons = 0;
+
+    if( numDevices < 0 )
+    {
+        /* do first-time init (since we can't over-ride jsInit, hmm */
+        numDevices = 0;
+
+        mach_port_t masterPort;
+        IOReturn rv = IOMasterPort( bootstrap_port, &masterPort );
+        if( rv != kIOReturnSuccess )
+        {
+            fgWarning( "error getting master Mach port" );
+            return;
+        }
+        fghJoystickFindDevices( masterPort );
+    }
+
+    if ( ident >= numDevices )
+    {
+        fgJoystick[ ident ]->error = GL_TRUE;
+        return;
+    }
+
+    /* get the name now too */
+    CFDictionaryRef properties = getCFProperties( ioDevices[ ident ] );
+    CFTypeRef ref = CFDictionaryGetValue( properties,
+                                          CFSTR( kIOHIDProductKey ) );
+    if (!ref)
+        ref = CFDictionaryGetValue(properties, CFSTR( "USB Product Name" ) );
+
+    if( !ref ||
+        !CFStringGetCString( ( CFStringRef )ref, name, 128,
+                             CFStringGetSystemEncoding( ) ) )
+    {
+        fgWarning( "error getting device name" );
+        name[ 0 ] = '\0';
+    }
+}
+
+
+void fgPlatformJoystickClose ( int ident )
+{
+    ( *( fgJoystick[ ident ]->pJoystick.hidDev ) )->
+        close( fgJoystick[ ident ]->pJoystick.hidDev );
+}
+#endif
+
+
+
+
+static void fghJoystickOpen( SFG_Joystick* joy )
+{
+    /*
+     * Default values (for no joystick -- each conditional will reset the
+     * error flag)
+     */
+    joy->error = TRUE;
+    joy->num_axes = joy->num_buttons = 0;
+    joy->name[ 0 ] = '\0';
+
+       fgPlatformJoystickOpen ( joy );
+
+}
+
+/*
+ * This function replaces the constructor method in the JS library.
+ */
+static void fghJoystickInit( int ident )
+{
+    if( ident >= MAX_NUM_JOYSTICKS )
+      fgError( "Too large a joystick number: %d", ident );
+
+    if( fgJoystick[ ident ] )
+        fgError( "illegal attempt to initialize joystick device again" );
+
+    fgJoystick[ ident ] =
+        ( SFG_Joystick * )calloc( sizeof( SFG_Joystick ), 1 );
+
+    /* Set defaults */
+    fgJoystick[ ident ]->num_axes = fgJoystick[ ident ]->num_buttons = 0;
+    fgJoystick[ ident ]->error = GL_TRUE;
+
+       fgPlatformJoystickInit( fgJoystick, ident );
+
+    fghJoystickOpen( fgJoystick[ ident  ] );
+}
+
+/*
+ * Try initializing all the joysticks (well, both of them)
+ */
+void fgInitialiseJoysticks ( void )
+{
+    if( !fgState.JoysticksInitialised )
+    {
+        int ident ;
+        for ( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ )
+            fghJoystickInit( ident );
+
+        fgState.JoysticksInitialised = GL_TRUE;
+    }
+}
+
+
+void fgJoystickClose( void )
+{
+    int ident ;
+    for( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ )
+    {
+        if( fgJoystick[ ident ] )
+        {
+                       fgPlatformJoystickClose ( ident );
+
+            free( fgJoystick[ ident ] );
+            fgJoystick[ ident ] = NULL;
+            /* show joystick has been deinitialized */
+        }
+    }
+}
+
+/*
+ * Polls the joystick and executes the joystick callback hooked to the
+ * window specified in the function's parameter:
+ */
+void fgJoystickPollWindow( SFG_Window* window )
+{
+    float axes[ _JS_MAX_AXES ];
+    int buttons;
+    int ident;
+
+    freeglut_return_if_fail( window );
+    freeglut_return_if_fail( FETCH_WCB( *window, Joystick ) );
+
+    for( ident = 0; ident < MAX_NUM_JOYSTICKS; ident++ )
+    {
+        if( fgJoystick[ident] )
+        {
+            fghJoystickRead( fgJoystick[ident], &buttons, axes );
+
+            if( !fgJoystick[ident]->error )
+                INVOKE_WCB( *window, Joystick,
+                            ( buttons,
+                              (int) ( axes[ 0 ] * 1000.0f ),
+                              (int) ( axes[ 1 ] * 1000.0f ),
+                              (int) ( axes[ 2 ] * 1000.0f ) )
+                );
+        }
+    }
+}
+
+/*
+ * Implementation for glutDeviceGet(GLUT_HAS_JOYSTICK)
+ */
+int fgJoystickDetect( void )
+{
+    int ident;
+
+    fgInitialiseJoysticks ();
+
+    if ( !fgState.JoysticksInitialised )
+        return 0;
+
+    for( ident=0; ident<MAX_NUM_JOYSTICKS; ident++ )
+        if( fgJoystick[ident] && !fgJoystick[ident]->error )
+            return 1;
+
+    return 0;
+}
+
+/*
+ * Joystick information functions
+ */
+int  glutJoystickGetNumAxes( int ident )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetNumAxes" );
+    return fgJoystick[ ident ]->num_axes;
+}
+int  glutJoystickGetNumButtons( int ident )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetNumButtons" );
+    return fgJoystick[ ident ]->num_buttons;
+}
+int  glutJoystickNotWorking( int ident )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickNotWorking" );
+    return fgJoystick[ ident ]->error;
+}
+
+float glutJoystickGetDeadBand( int ident, int axis )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetDeadBand" );
+    return fgJoystick[ ident ]->dead_band [ axis ];
+}
+void  glutJoystickSetDeadBand( int ident, int axis, float db )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetDeadBand" );
+    fgJoystick[ ident ]->dead_band[ axis ] = db;
+}
+
+float glutJoystickGetSaturation( int ident, int axis )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetSaturation" );
+    return fgJoystick[ ident ]->saturate[ axis ];
+}
+void  glutJoystickSetSaturation( int ident, int axis, float st )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetSaturation" );
+    fgJoystick[ ident ]->saturate [ axis ] = st;
+}
+
+void glutJoystickSetMinRange( int ident, float *axes )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetMinRange" );
+    memcpy( fgJoystick[ ident ]->min, axes,
+            fgJoystick[ ident ]->num_axes * sizeof( float ) );
+}
+void glutJoystickSetMaxRange( int ident, float *axes )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetMaxRange" );
+    memcpy( fgJoystick[ ident ]->max, axes,
+            fgJoystick[ ident ]->num_axes * sizeof( float ) );
+}
+void glutJoystickSetCenter( int ident, float *axes )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickSetCenter" );
+    memcpy( fgJoystick[ ident ]->center, axes,
+            fgJoystick[ ident ]->num_axes * sizeof( float ) );
+}
+
+void glutJoystickGetMinRange( int ident, float *axes )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetMinRange" );
+    memcpy( axes, fgJoystick[ ident ]->min,
+            fgJoystick[ ident ]->num_axes * sizeof( float ) );
+}
+void glutJoystickGetMaxRange( int ident, float *axes )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetMaxRange" );
+    memcpy( axes, fgJoystick[ ident ]->max,
+            fgJoystick[ ident ]->num_axes * sizeof( float ) );
+}
+void glutJoystickGetCenter( int ident, float *axes )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutJoystickGetCenter" );
+    memcpy( axes, fgJoystick[ ident ]->center,
+            fgJoystick[ ident ]->num_axes * sizeof( float ) );
+}
+
+/*** END OF FILE ***/
index 763783c..73f53c9 100644 (file)
-/*\r
- * freeglut_main.c\r
- *\r
- * The windows message processing methods.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Fri Dec 3 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-#ifdef HAVE_ERRNO_H\r
-#    include <errno.h>\r
-#endif\r
-#include <stdarg.h>\r
-#ifdef  HAVE_VFPRINTF\r
-#    define VFPRINTF(s,f,a) vfprintf((s),(f),(a))\r
-#elif defined(HAVE__DOPRNT)\r
-#    define VFPRINTF(s,f,a) _doprnt((f),(a),(s))\r
-#else\r
-#    define VFPRINTF(s,f,a)\r
-#endif\r
-\r
-#ifdef _WIN32_WCE\r
-\r
-typedef struct GXDisplayProperties GXDisplayProperties;\r
-typedef struct GXKeyList GXKeyList;\r
-#include <gx.h>\r
-\r
-typedef struct GXKeyList (*GXGETDEFAULTKEYS)(int);\r
-typedef int (*GXOPENINPUT)();\r
-\r
-GXGETDEFAULTKEYS GXGetDefaultKeys_ = NULL;\r
-GXOPENINPUT GXOpenInput_ = NULL;\r
-\r
-struct GXKeyList gxKeyList;\r
-\r
-#endif /* _WIN32_WCE */\r
-\r
-/*\r
- * Try to get the maximum value allowed for ints, falling back to the minimum\r
- * guaranteed by ISO C99 if there is no suitable header.\r
- */\r
-#ifdef HAVE_LIMITS_H\r
-#    include <limits.h>\r
-#endif\r
-#ifndef INT_MAX\r
-#    define INT_MAX 32767\r
-#endif\r
-\r
-#ifndef MIN\r
-#    define MIN(a,b) (((a)<(b)) ? (a) : (b))\r
-#endif\r
-\r
-extern void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height );\r
-extern void fgPlatformDisplayWindow ( SFG_Window *window );\r
-extern unsigned long fgPlatformSystemTime ( void );\r
-extern void fgPlatformSleepForEvents( long msec );\r
-extern void fgPlatformProcessSingleEvent ( void );\r
-extern void fgPlatformMainLoopPreliminaryWork ( void );\r
-\r
-\r
-\r
-\r
-/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */\r
-\r
-static void fghReshapeWindow ( SFG_Window *window, int width, int height )\r
-{\r
-    SFG_Window *current_window = fgStructure.CurrentWindow;\r
-\r
-    freeglut_return_if_fail( window != NULL );\r
-\r
-       fgPlatformReshapeWindow ( window, width, height );\r
-\r
-    if( FETCH_WCB( *window, Reshape ) )\r
-        INVOKE_WCB( *window, Reshape, ( width, height ) );\r
-    else\r
-    {\r
-        fgSetWindow( window );\r
-        glViewport( 0, 0, width, height );\r
-    }\r
-\r
-    /*\r
-     * Force a window redraw.  In Windows at least this is only a partial\r
-     * solution:  if the window is increasing in size in either dimension,\r
-     * the already-drawn part does not get drawn again and things look funny.\r
-     * But without this we get this bad behaviour whenever we resize the\r
-     * window.\r
-     */\r
-    window->State.Redisplay = GL_TRUE;\r
-\r
-    if( window->IsMenu )\r
-        fgSetWindow( current_window );\r
-}\r
-\r
-/*\r
- * Calls a window's redraw method. This is used when\r
- * a redraw is forced by the incoming window messages.\r
- */\r
-void fghRedrawWindow ( SFG_Window *window )\r
-{\r
-    SFG_Window *current_window = fgStructure.CurrentWindow;\r
-\r
-    freeglut_return_if_fail( window );\r
-    freeglut_return_if_fail( FETCH_WCB ( *window, Display ) );\r
-\r
-    window->State.Redisplay = GL_FALSE;\r
-\r
-    freeglut_return_if_fail( window->State.Visible );\r
-\r
-    fgSetWindow( window );\r
-\r
-    if( window->State.NeedToResize )\r
-    {\r
-        fghReshapeWindow(\r
-            window,\r
-            window->State.Width,\r
-            window->State.Height\r
-        );\r
-\r
-        window->State.NeedToResize = GL_FALSE;\r
-    }\r
-\r
-    INVOKE_WCB( *window, Display, ( ) );\r
-\r
-    fgSetWindow( current_window );\r
-}\r
-\r
-\r
-static void fghcbDisplayWindow( SFG_Window *window,\r
-                                SFG_Enumerator *enumerator )\r
-{\r
-    if( window->State.Redisplay &&\r
-        window->State.Visible )\r
-    {\r
-        window->State.Redisplay = GL_FALSE;\r
-               fgPlatformDisplayWindow ( window );\r
-    }\r
-\r
-    fgEnumSubWindows( window, fghcbDisplayWindow, enumerator );\r
-}\r
-\r
-/*\r
- * Make all windows perform a display call\r
- */\r
-static void fghDisplayAll( void )\r
-{\r
-    SFG_Enumerator enumerator;\r
-\r
-    enumerator.found = GL_FALSE;\r
-    enumerator.data  =  NULL;\r
-\r
-    fgEnumWindows( fghcbDisplayWindow, &enumerator );\r
-}\r
-\r
-/*\r
- * Window enumerator callback to check for the joystick polling code\r
- */\r
-static void fghcbCheckJoystickPolls( SFG_Window *window,\r
-                                     SFG_Enumerator *enumerator )\r
-{\r
-    long int checkTime = fgElapsedTime( );\r
-\r
-    if( window->State.JoystickLastPoll + window->State.JoystickPollRate <=\r
-        checkTime )\r
-    {\r
-#if !defined(_WIN32_WCE)\r
-        fgJoystickPollWindow( window );\r
-#endif /* !defined(_WIN32_WCE) */\r
-        window->State.JoystickLastPoll = checkTime;\r
-    }\r
-\r
-    fgEnumSubWindows( window, fghcbCheckJoystickPolls, enumerator );\r
-}\r
-\r
-/*\r
- * Check all windows for joystick polling\r
- */\r
-static void fghCheckJoystickPolls( void )\r
-{\r
-    SFG_Enumerator enumerator;\r
-\r
-    enumerator.found = GL_FALSE;\r
-    enumerator.data  =  NULL;\r
-\r
-    fgEnumWindows( fghcbCheckJoystickPolls, &enumerator );\r
-}\r
-\r
-/*\r
- * Check the global timers\r
- */\r
-static void fghCheckTimers( void )\r
-{\r
-    long checkTime = fgElapsedTime( );\r
-\r
-    while( fgState.Timers.First )\r
-    {\r
-        SFG_Timer *timer = fgState.Timers.First;\r
-\r
-        if( timer->TriggerTime > checkTime )\r
-            break;\r
-\r
-        fgListRemove( &fgState.Timers, &timer->Node );\r
-        fgListAppend( &fgState.FreeTimers, &timer->Node );\r
-\r
-        timer->Callback( timer->ID );\r
-    }\r
-}\r
-\r
\r
-/* Platform-dependent time in milliseconds, as an unsigned 32-bit integer.\r
- * This value wraps every 49.7 days, but integer overflows cancel\r
- * when subtracting an initial start time, unless the total time exceeds\r
- * 32-bit, where the GLUT API return value is also overflowed.\r
- */  \r
-unsigned long fgSystemTime(void)\r
-{\r
-       return fgPlatformSystemTime ();\r
-}\r
-  \r
-/*\r
- * Elapsed Time\r
- */\r
-long fgElapsedTime( void )\r
-{\r
-    return (long) (fgSystemTime() - fgState.Time);\r
-}\r
-\r
-/*\r
- * Error Messages.\r
- */\r
-void fgError( const char *fmt, ... )\r
-{\r
-    va_list ap;\r
-\r
-    if (fgState.ErrorFunc) {\r
-\r
-        va_start( ap, fmt );\r
-\r
-        /* call user set error handler here */\r
-        fgState.ErrorFunc(fmt, ap);\r
-\r
-        va_end( ap );\r
-\r
-    } else {\r
-\r
-        va_start( ap, fmt );\r
-\r
-        fprintf( stderr, "freeglut ");\r
-        if( fgState.ProgramName )\r
-            fprintf( stderr, "(%s): ", fgState.ProgramName );\r
-        VFPRINTF( stderr, fmt, ap );\r
-        fprintf( stderr, "\n" );\r
-\r
-        va_end( ap );\r
-\r
-        if ( fgState.Initialised )\r
-            fgDeinitialize ();\r
-\r
-        exit( 1 );\r
-    }\r
-}\r
-\r
-void fgWarning( const char *fmt, ... )\r
-{\r
-    va_list ap;\r
-\r
-    if (fgState.WarningFunc) {\r
-\r
-        va_start( ap, fmt );\r
-\r
-        /* call user set warning handler here */\r
-        fgState.WarningFunc(fmt, ap);\r
-\r
-        va_end( ap );\r
-\r
-    } else {\r
-\r
-        va_start( ap, fmt );\r
-\r
-        fprintf( stderr, "freeglut ");\r
-        if( fgState.ProgramName )\r
-            fprintf( stderr, "(%s): ", fgState.ProgramName );\r
-        VFPRINTF( stderr, fmt, ap );\r
-        fprintf( stderr, "\n" );\r
-\r
-        va_end( ap );\r
-    }\r
-}\r
-\r
-\r
-/*\r
- * Indicates whether Joystick events are being used by ANY window.\r
- *\r
- * The current mechanism is to walk all of the windows and ask if\r
- * there is a joystick callback.  We have a short-circuit early\r
- * return if we find any joystick handler registered.\r
- *\r
- * The real way to do this is to make use of the glutTimer() API\r
- * to more cleanly re-implement the joystick API.  Then, this code\r
- * and all other "joystick timer" code can be yanked.\r
- *\r
- */\r
-static void fghCheckJoystickCallback( SFG_Window* w, SFG_Enumerator* e)\r
-{\r
-    if( FETCH_WCB( *w, Joystick ) )\r
-    {\r
-        e->found = GL_TRUE;\r
-        e->data = w;\r
-    }\r
-    fgEnumSubWindows( w, fghCheckJoystickCallback, e );\r
-}\r
-static int fghHaveJoystick( void )\r
-{\r
-    SFG_Enumerator enumerator;\r
-\r
-    enumerator.found = GL_FALSE;\r
-    enumerator.data = NULL;\r
-    fgEnumWindows( fghCheckJoystickCallback, &enumerator );\r
-    return !!enumerator.data;\r
-}\r
-static void fghHavePendingRedisplaysCallback( SFG_Window* w, SFG_Enumerator* e)\r
-{\r
-    if( w->State.Redisplay && w->State.Visible )\r
-    {\r
-        e->found = GL_TRUE;\r
-        e->data = w;\r
-    }\r
-    fgEnumSubWindows( w, fghHavePendingRedisplaysCallback, e );\r
-}\r
-static int fghHavePendingRedisplays (void)\r
-{\r
-    SFG_Enumerator enumerator;\r
-\r
-    enumerator.found = GL_FALSE;\r
-    enumerator.data = NULL;\r
-    fgEnumWindows( fghHavePendingRedisplaysCallback, &enumerator );\r
-    return !!enumerator.data;\r
-}\r
-/*\r
- * Returns the number of GLUT ticks (milliseconds) till the next timer event.\r
- */\r
-static long fghNextTimer( void )\r
-{\r
-    long ret = INT_MAX;\r
-    SFG_Timer *timer = fgState.Timers.First;\r
-\r
-    if( timer )\r
-        ret = timer->TriggerTime - fgElapsedTime();\r
-    if( ret < 0 )\r
-        ret = 0;\r
-\r
-    return ret;\r
-}\r
-\r
-static void fghSleepForEvents( void )\r
-{\r
-    long msec;\r
-\r
-    if( fgState.IdleCallback || fghHavePendingRedisplays( ) )\r
-        return;\r
-\r
-    msec = fghNextTimer( );\r
-    /* XXX Use GLUT timers for joysticks... */\r
-    /* XXX Dumb; forces granularity to .01sec */\r
-    if( fghHaveJoystick( ) && ( msec > 10 ) )     \r
-        msec = 10;\r
-\r
-       fgPlatformSleepForEvents ( msec );\r
-}\r
-\r
-\r
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */\r
-\r
-/*\r
- * Executes a single iteration in the freeglut processing loop.\r
- */\r
-void FGAPIENTRY glutMainLoopEvent( void )\r
-{\r
-       fgPlatformProcessSingleEvent ();\r
-\r
-    if( fgState.Timers.First )\r
-        fghCheckTimers( );\r
-    fghCheckJoystickPolls( );\r
-    fghDisplayAll( );\r
-\r
-    fgCloseWindows( );\r
-}\r
-\r
-/*\r
- * Enters the freeglut processing loop.\r
- * Stays until the "ExecState" changes to "GLUT_EXEC_STATE_STOP".\r
- */\r
-void FGAPIENTRY glutMainLoop( void )\r
-{\r
-    int action;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMainLoop" );\r
-\r
-       fgPlatformMainLoopPreliminaryWork ();\r
-\r
-    fgState.ExecState = GLUT_EXEC_STATE_RUNNING ;\r
-    while( fgState.ExecState == GLUT_EXEC_STATE_RUNNING )\r
-    {\r
-        SFG_Window *window;\r
-\r
-        glutMainLoopEvent( );\r
-        /*\r
-         * Step through the list of windows, seeing if there are any\r
-         * that are not menus\r
-         */\r
-        for( window = ( SFG_Window * )fgStructure.Windows.First;\r
-             window;\r
-             window = ( SFG_Window * )window->Node.Next )\r
-            if ( ! ( window->IsMenu ) )\r
-                break;\r
-\r
-        if( ! window )\r
-            fgState.ExecState = GLUT_EXEC_STATE_STOP;\r
-        else\r
-        {\r
-            if( fgState.IdleCallback )\r
-            {\r
-                if( fgStructure.CurrentWindow &&\r
-                    fgStructure.CurrentWindow->IsMenu )\r
-                    /* fail safe */\r
-                    fgSetWindow( window );\r
-                fgState.IdleCallback( );\r
-            }\r
-\r
-            fghSleepForEvents( );\r
-        }\r
-    }\r
-\r
-    /*\r
-     * When this loop terminates, destroy the display, state and structure\r
-     * of a freeglut session, so that another glutInit() call can happen\r
-     *\r
-     * Save the "ActionOnWindowClose" because "fgDeinitialize" resets it.\r
-     */\r
-    action = fgState.ActionOnWindowClose;\r
-    fgDeinitialize( );\r
-    if( action == GLUT_ACTION_EXIT )\r
-        exit( 0 );\r
-}\r
-\r
-/*\r
- * Leaves the freeglut processing loop.\r
- */\r
-void FGAPIENTRY glutLeaveMainLoop( void )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutLeaveMainLoop" );\r
-    fgState.ExecState = GLUT_EXEC_STATE_STOP ;\r
-}\r
-\r
-\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_main.c
+ *
+ * The windows message processing methods.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Fri Dec 3 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+#ifdef HAVE_ERRNO_H
+#    include <errno.h>
+#endif
+#include <stdarg.h>
+#ifdef  HAVE_VFPRINTF
+#    define VFPRINTF(s,f,a) vfprintf((s),(f),(a))
+#elif defined(HAVE__DOPRNT)
+#    define VFPRINTF(s,f,a) _doprnt((f),(a),(s))
+#else
+#    define VFPRINTF(s,f,a)
+#endif
+
+#ifdef _WIN32_WCE
+
+typedef struct GXDisplayProperties GXDisplayProperties;
+typedef struct GXKeyList GXKeyList;
+#include <gx.h>
+
+typedef struct GXKeyList (*GXGETDEFAULTKEYS)(int);
+typedef int (*GXOPENINPUT)();
+
+GXGETDEFAULTKEYS GXGetDefaultKeys_ = NULL;
+GXOPENINPUT GXOpenInput_ = NULL;
+
+struct GXKeyList gxKeyList;
+
+#endif /* _WIN32_WCE */
+
+/*
+ * Try to get the maximum value allowed for ints, falling back to the minimum
+ * guaranteed by ISO C99 if there is no suitable header.
+ */
+#ifdef HAVE_LIMITS_H
+#    include <limits.h>
+#endif
+#ifndef INT_MAX
+#    define INT_MAX 32767
+#endif
+
+#ifndef MIN
+#    define MIN(a,b) (((a)<(b)) ? (a) : (b))
+#endif
+
+extern void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height );
+extern void fgPlatformDisplayWindow ( SFG_Window *window );
+extern unsigned long fgPlatformSystemTime ( void );
+extern void fgPlatformSleepForEvents( long msec );
+extern void fgPlatformProcessSingleEvent ( void );
+extern void fgPlatformMainLoopPreliminaryWork ( void );
+
+
+
+
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
+
+static void fghReshapeWindow ( SFG_Window *window, int width, int height )
+{
+    SFG_Window *current_window = fgStructure.CurrentWindow;
+
+    freeglut_return_if_fail( window != NULL );
+
+       fgPlatformReshapeWindow ( window, width, height );
+
+    if( FETCH_WCB( *window, Reshape ) )
+        INVOKE_WCB( *window, Reshape, ( width, height ) );
+    else
+    {
+        fgSetWindow( window );
+        glViewport( 0, 0, width, height );
+    }
+
+    /*
+     * Force a window redraw.  In Windows at least this is only a partial
+     * solution:  if the window is increasing in size in either dimension,
+     * the already-drawn part does not get drawn again and things look funny.
+     * But without this we get this bad behaviour whenever we resize the
+     * window.
+     */
+    window->State.Redisplay = GL_TRUE;
+
+    if( window->IsMenu )
+        fgSetWindow( current_window );
+}
+
+/*
+ * Calls a window's redraw method. This is used when
+ * a redraw is forced by the incoming window messages.
+ */
+void fghRedrawWindow ( SFG_Window *window )
+{
+    SFG_Window *current_window = fgStructure.CurrentWindow;
+
+    freeglut_return_if_fail( window );
+    freeglut_return_if_fail( FETCH_WCB ( *window, Display ) );
+
+    window->State.Redisplay = GL_FALSE;
+
+    freeglut_return_if_fail( window->State.Visible );
+
+    fgSetWindow( window );
+
+    if( window->State.NeedToResize )
+    {
+        fghReshapeWindow(
+            window,
+            window->State.Width,
+            window->State.Height
+        );
+
+        window->State.NeedToResize = GL_FALSE;
+    }
+
+    INVOKE_WCB( *window, Display, ( ) );
+
+    fgSetWindow( current_window );
+}
+
+
+static void fghcbDisplayWindow( SFG_Window *window,
+                                SFG_Enumerator *enumerator )
+{
+    if( window->State.Redisplay &&
+        window->State.Visible )
+    {
+        window->State.Redisplay = GL_FALSE;
+               fgPlatformDisplayWindow ( window );
+    }
+
+    fgEnumSubWindows( window, fghcbDisplayWindow, enumerator );
+}
+
+/*
+ * Make all windows perform a display call
+ */
+static void fghDisplayAll( void )
+{
+    SFG_Enumerator enumerator;
+
+    enumerator.found = GL_FALSE;
+    enumerator.data  =  NULL;
+
+    fgEnumWindows( fghcbDisplayWindow, &enumerator );
+}
+
+/*
+ * Window enumerator callback to check for the joystick polling code
+ */
+static void fghcbCheckJoystickPolls( SFG_Window *window,
+                                     SFG_Enumerator *enumerator )
+{
+    long int checkTime = fgElapsedTime( );
+
+    if( window->State.JoystickLastPoll + window->State.JoystickPollRate <=
+        checkTime )
+    {
+#if !defined(_WIN32_WCE)
+        fgJoystickPollWindow( window );
+#endif /* !defined(_WIN32_WCE) */
+        window->State.JoystickLastPoll = checkTime;
+    }
+
+    fgEnumSubWindows( window, fghcbCheckJoystickPolls, enumerator );
+}
+
+/*
+ * Check all windows for joystick polling
+ */
+static void fghCheckJoystickPolls( void )
+{
+    SFG_Enumerator enumerator;
+
+    enumerator.found = GL_FALSE;
+    enumerator.data  =  NULL;
+
+    fgEnumWindows( fghcbCheckJoystickPolls, &enumerator );
+}
+
+/*
+ * Check the global timers
+ */
+static void fghCheckTimers( void )
+{
+    long checkTime = fgElapsedTime( );
+
+    while( fgState.Timers.First )
+    {
+        SFG_Timer *timer = fgState.Timers.First;
+
+        if( timer->TriggerTime > checkTime )
+            break;
+
+        fgListRemove( &fgState.Timers, &timer->Node );
+        fgListAppend( &fgState.FreeTimers, &timer->Node );
+
+        timer->Callback( timer->ID );
+    }
+}
+
+/* Platform-dependent time in milliseconds, as an unsigned 32-bit integer.
+ * This value wraps every 49.7 days, but integer overflows cancel
+ * when subtracting an initial start time, unless the total time exceeds
+ * 32-bit, where the GLUT API return value is also overflowed.
+ */  
+unsigned long fgSystemTime(void)
+{
+       return fgPlatformSystemTime ();
+}
+  
+/*
+ * Elapsed Time
+ */
+long fgElapsedTime( void )
+{
+    return (long) (fgSystemTime() - fgState.Time);
+}
+
+/*
+ * Error Messages.
+ */
+void fgError( const char *fmt, ... )
+{
+    va_list ap;
+
+    if (fgState.ErrorFunc) {
+
+        va_start( ap, fmt );
+
+        /* call user set error handler here */
+        fgState.ErrorFunc(fmt, ap);
+
+        va_end( ap );
+
+    } else {
+
+        va_start( ap, fmt );
+
+        fprintf( stderr, "freeglut ");
+        if( fgState.ProgramName )
+            fprintf( stderr, "(%s): ", fgState.ProgramName );
+        VFPRINTF( stderr, fmt, ap );
+        fprintf( stderr, "\n" );
+
+        va_end( ap );
+
+        if ( fgState.Initialised )
+            fgDeinitialize ();
+
+        exit( 1 );
+    }
+}
+
+void fgWarning( const char *fmt, ... )
+{
+    va_list ap;
+
+    if (fgState.WarningFunc) {
+
+        va_start( ap, fmt );
+
+        /* call user set warning handler here */
+        fgState.WarningFunc(fmt, ap);
+
+        va_end( ap );
+
+    } else {
+
+        va_start( ap, fmt );
+
+        fprintf( stderr, "freeglut ");
+        if( fgState.ProgramName )
+            fprintf( stderr, "(%s): ", fgState.ProgramName );
+        VFPRINTF( stderr, fmt, ap );
+        fprintf( stderr, "\n" );
+
+        va_end( ap );
+    }
+}
+
+
+/*
+ * Indicates whether Joystick events are being used by ANY window.
+ *
+ * The current mechanism is to walk all of the windows and ask if
+ * there is a joystick callback.  We have a short-circuit early
+ * return if we find any joystick handler registered.
+ *
+ * The real way to do this is to make use of the glutTimer() API
+ * to more cleanly re-implement the joystick API.  Then, this code
+ * and all other "joystick timer" code can be yanked.
+ *
+ */
+static void fghCheckJoystickCallback( SFG_Window* w, SFG_Enumerator* e)
+{
+    if( FETCH_WCB( *w, Joystick ) )
+    {
+        e->found = GL_TRUE;
+        e->data = w;
+    }
+    fgEnumSubWindows( w, fghCheckJoystickCallback, e );
+}
+static int fghHaveJoystick( void )
+{
+    SFG_Enumerator enumerator;
+
+    enumerator.found = GL_FALSE;
+    enumerator.data = NULL;
+    fgEnumWindows( fghCheckJoystickCallback, &enumerator );
+    return !!enumerator.data;
+}
+static void fghHavePendingRedisplaysCallback( SFG_Window* w, SFG_Enumerator* e)
+{
+    if( w->State.Redisplay && w->State.Visible )
+    {
+        e->found = GL_TRUE;
+        e->data = w;
+    }
+    fgEnumSubWindows( w, fghHavePendingRedisplaysCallback, e );
+}
+static int fghHavePendingRedisplays (void)
+{
+    SFG_Enumerator enumerator;
+
+    enumerator.found = GL_FALSE;
+    enumerator.data = NULL;
+    fgEnumWindows( fghHavePendingRedisplaysCallback, &enumerator );
+    return !!enumerator.data;
+}
+/*
+ * Returns the number of GLUT ticks (milliseconds) till the next timer event.
+ */
+static long fghNextTimer( void )
+{
+    long ret = INT_MAX;
+    SFG_Timer *timer = fgState.Timers.First;
+
+    if( timer )
+        ret = timer->TriggerTime - fgElapsedTime();
+    if( ret < 0 )
+        ret = 0;
+
+    return ret;
+}
+
+static void fghSleepForEvents( void )
+{
+    long msec;
+
+    if( fgState.IdleCallback || fghHavePendingRedisplays( ) )
+        return;
+
+    msec = fghNextTimer( );
+    /* XXX Use GLUT timers for joysticks... */
+    /* XXX Dumb; forces granularity to .01sec */
+    if( fghHaveJoystick( ) && ( msec > 10 ) )     
+        msec = 10;
+
+       fgPlatformSleepForEvents ( msec );
+}
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Executes a single iteration in the freeglut processing loop.
+ */
+void FGAPIENTRY glutMainLoopEvent( void )
+{
+       fgPlatformProcessSingleEvent ();
+
+    if( fgState.Timers.First )
+        fghCheckTimers( );
+    fghCheckJoystickPolls( );
+    fghDisplayAll( );
+
+    fgCloseWindows( );
+}
+
+/*
+ * Enters the freeglut processing loop.
+ * Stays until the "ExecState" changes to "GLUT_EXEC_STATE_STOP".
+ */
+void FGAPIENTRY glutMainLoop( void )
+{
+    int action;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMainLoop" );
+
+       fgPlatformMainLoopPreliminaryWork ();
+
+    fgState.ExecState = GLUT_EXEC_STATE_RUNNING ;
+    while( fgState.ExecState == GLUT_EXEC_STATE_RUNNING )
+    {
+        SFG_Window *window;
+
+        glutMainLoopEvent( );
+        /*
+         * Step through the list of windows, seeing if there are any
+         * that are not menus
+         */
+        for( window = ( SFG_Window * )fgStructure.Windows.First;
+             window;
+             window = ( SFG_Window * )window->Node.Next )
+            if ( ! ( window->IsMenu ) )
+                break;
+
+        if( ! window )
+            fgState.ExecState = GLUT_EXEC_STATE_STOP;
+        else
+        {
+            if( fgState.IdleCallback )
+            {
+                if( fgStructure.CurrentWindow &&
+                    fgStructure.CurrentWindow->IsMenu )
+                    /* fail safe */
+                    fgSetWindow( window );
+                fgState.IdleCallback( );
+            }
+
+            fghSleepForEvents( );
+        }
+    }
+
+    /*
+     * When this loop terminates, destroy the display, state and structure
+     * of a freeglut session, so that another glutInit() call can happen
+     *
+     * Save the "ActionOnWindowClose" because "fgDeinitialize" resets it.
+     */
+    action = fgState.ActionOnWindowClose;
+    fgDeinitialize( );
+    if( action == GLUT_ACTION_EXIT )
+        exit( 0 );
+}
+
+/*
+ * Leaves the freeglut processing loop.
+ */
+void FGAPIENTRY glutLeaveMainLoop( void )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutLeaveMainLoop" );
+    fgState.ExecState = GLUT_EXEC_STATE_STOP ;
+}
+
+
+
+/*** END OF FILE ***/
index 4ea023a..d844f96 100644 (file)
-/*\r
- * freeglut_menu.c\r
- *\r
- * Pull-down menu creation and handling.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Thu Dec 16 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#define FREEGLUT_BUILDING_LIB\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-/* -- DEFINITIONS ---------------------------------------------------------- */\r
-\r
-/*\r
- * FREEGLUT_MENU_FONT can be any freeglut bitmapped font.\r
- * (Stroked fonts would not be out of the question, but we'd need to alter\r
- *  code, since GLUT (hence freeglut) does not quite unify stroked and\r
- *  bitmapped font handling.)\r
- * Old UNIX/X11 GLUT (BSD, UNIX, IRIX, LINUX, HPUX, ...) used a system\r
- * font best approximated by an 18-pixel HELVETICA, I think.  MS-WINDOWS\r
- * GLUT used something closest to the 8x13 fixed-width font.  (Old\r
- * GLUT apparently uses host-system menus rather than building its own.\r
- * freeglut is building its own menus from scratch.)\r
- *\r
- * FREEGLUT_MENU_HEIGHT gives the height of ONE menu box.  This should be\r
- * the distances between two adjacent menu entries.  It should scale\r
- * automatically with the font choice, so you needn't alter it---unless you\r
- * use a stroked font.\r
- *\r
- * FREEGLUT_MENU_BORDER says how many pixels to allow around the edge of a\r
- * menu.  (It also seems to be the same as the number of pixels used as\r
- * a border around *items* to separate them from neighbors.  John says\r
- * that that wasn't the original intent...if not, perhaps we need another\r
- * symbolic constant, FREEGLUT_MENU_ITEM_BORDER, or such.)\r
- */\r
-/* See platform-specific header files for menu font and color definitions */\r
-\r
-#define  FREEGLUT_MENU_HEIGHT  (glutBitmapHeight(FREEGLUT_MENU_FONT) + \\r
-                                FREEGLUT_MENU_BORDER)\r
-#define  FREEGLUT_MENU_BORDER   2\r
-\r
-\r
-/*\r
- * These variables are for rendering the freeglut menu items.\r
- *\r
- * The choices are fore- and background, with and without h for Highlighting.\r
- * Old GLUT appeared to be system-dependant for its colors (sigh) so we are\r
- * too.  These variables should be stuffed into global state and initialized\r
- * via the glutInit*() system.\r
- */\r
-static float menu_pen_fore  [4] = FREEGLUT_MENU_PEN_FORE_COLORS ;\r
-static float menu_pen_back  [4] = FREEGLUT_MENU_PEN_BACK_COLORS ;\r
-static float menu_pen_hfore [4] = FREEGLUT_MENU_PEN_HFORE_COLORS;\r
-static float menu_pen_hback [4] = FREEGLUT_MENU_PEN_HBACK_COLORS;\r
-\r
-\r
-extern GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y );\r
-\r
-/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */\r
-\r
-/*\r
- * Private function to find a menu entry by index\r
- */\r
-static SFG_MenuEntry *fghFindMenuEntry( SFG_Menu* menu, int index )\r
-{\r
-    SFG_MenuEntry *entry;\r
-    int i = 1;\r
-\r
-    for( entry = (SFG_MenuEntry *)menu->Entries.First;\r
-         entry;\r
-         entry = (SFG_MenuEntry *)entry->Node.Next )\r
-    {\r
-        if( i == index )\r
-            break;\r
-        ++i;\r
-    }\r
-\r
-    return entry;\r
-}\r
-\r
-/*\r
- * Deactivates a menu pointed by the function argument.\r
- */\r
-static void fghDeactivateSubMenu( SFG_MenuEntry *menuEntry )\r
-{\r
-    SFG_MenuEntry *subMenuIter;\r
-    /* Hide the present menu's window */\r
-    fgSetWindow( menuEntry->SubMenu->Window );\r
-    glutHideWindow( );\r
-\r
-    /* Forget about having that menu active anymore, now: */\r
-    menuEntry->SubMenu->Window->ActiveMenu = NULL;\r
-    menuEntry->SubMenu->IsActive = GL_FALSE;\r
-    menuEntry->SubMenu->ActiveEntry = NULL;\r
-\r
-    /* Hide all submenu windows, and the root menu's window. */\r
-    for ( subMenuIter = (SFG_MenuEntry *)menuEntry->SubMenu->Entries.First;\r
-          subMenuIter;\r
-          subMenuIter = (SFG_MenuEntry *)subMenuIter->Node.Next )\r
-    {\r
-        subMenuIter->IsActive = GL_FALSE;\r
-\r
-        /* Is that an active submenu by any case? */\r
-        if( subMenuIter->SubMenu )\r
-            fghDeactivateSubMenu( subMenuIter );\r
-    }\r
-\r
-    fgSetWindow ( menuEntry->SubMenu->ParentWindow ) ;\r
-}\r
-\r
-/*\r
- * Private function to get the virtual maximum screen extent\r
- */\r
-static GLvoid fghGetVMaxExtent( SFG_Window* window, int* x, int* y )\r
-{\r
-    if( fgStructure.GameModeWindow )\r
-               fgPlatformGetGameModeVMaxExtent ( window, x, y );\r
-    else\r
-    {\r
-        *x = fgDisplay.ScreenWidth;\r
-        *y = fgDisplay.ScreenHeight;\r
-    }\r
-}\r
-\r
-/*\r
- * Private function to check for the current menu/sub menu activity state\r
- */\r
-static GLboolean fghCheckMenuStatus( SFG_Menu* menu )\r
-{\r
-    SFG_MenuEntry* menuEntry;\r
-    int x, y;\r
-\r
-    /* First of all check any of the active sub menus... */\r
-    for( menuEntry = (SFG_MenuEntry *)menu->Entries.First;\r
-         menuEntry;\r
-         menuEntry = (SFG_MenuEntry *)menuEntry->Node.Next )\r
-    {\r
-        if( menuEntry->SubMenu && menuEntry->IsActive )\r
-        {\r
-            /*\r
-             * OK, have the sub-menu checked, too. If it returns GL_TRUE, it\r
-             * will mean that it caught the mouse cursor and we do not need\r
-             * to regenerate the activity list, and so our parents do...\r
-             */\r
-            GLboolean return_status;\r
-\r
-            menuEntry->SubMenu->Window->State.MouseX =\r
-                menu->Window->State.MouseX + menu->X - menuEntry->SubMenu->X;\r
-            menuEntry->SubMenu->Window->State.MouseY =\r
-                menu->Window->State.MouseY + menu->Y - menuEntry->SubMenu->Y;\r
-            return_status = fghCheckMenuStatus( menuEntry->SubMenu );\r
-\r
-            if ( return_status )\r
-                return GL_TRUE;\r
-        }\r
-    }\r
-\r
-    /* That much about our sub menus, let's get to checking the current menu: */\r
-    x = menu->Window->State.MouseX;\r
-    y = menu->Window->State.MouseY;\r
-\r
-    /* Check if the mouse cursor is contained within the current menu box */\r
-    if( ( x >= FREEGLUT_MENU_BORDER ) &&\r
-        ( x < menu->Width  - FREEGLUT_MENU_BORDER ) &&\r
-        ( y >= FREEGLUT_MENU_BORDER ) &&\r
-        ( y < menu->Height - FREEGLUT_MENU_BORDER )  )\r
-    {\r
-        int menuID = ( y - FREEGLUT_MENU_BORDER ) / FREEGLUT_MENU_HEIGHT;\r
-\r
-        /* The mouse cursor is somewhere over our box, check it out. */\r
-        menuEntry = fghFindMenuEntry( menu, menuID + 1 );\r
-        FREEGLUT_INTERNAL_ERROR_EXIT( menuEntry, "Cannot find menu entry",\r
-                                      "fghCheckMenuStatus" );\r
-\r
-        menuEntry->IsActive = GL_TRUE;\r
-        menuEntry->Ordinal = menuID;\r
-\r
-        /*\r
-         * If this is not the same as the last active menu entry, deactivate\r
-         * the previous entry.  Specifically, if the previous active entry\r
-         * was a submenu then deactivate it.\r
-         */\r
-        if( menu->ActiveEntry && ( menuEntry != menu->ActiveEntry ) )\r
-            if( menu->ActiveEntry->SubMenu )\r
-                fghDeactivateSubMenu( menu->ActiveEntry );\r
-\r
-        if( menuEntry != menu->ActiveEntry )\r
-        {\r
-            menu->Window->State.Redisplay = GL_TRUE;\r
-            if( menu->ActiveEntry )\r
-                menu->ActiveEntry->IsActive = GL_FALSE;\r
-        }\r
-\r
-        menu->ActiveEntry = menuEntry;\r
-        menu->IsActive = GL_TRUE;  /* XXX Do we need this? */\r
-\r
-        /*\r
-         * OKi, we have marked that entry as active, but it would be also\r
-         * nice to have its contents updated, in case it's a sub menu.\r
-         * Also, ignore the return value of the check function:\r
-         */\r
-        if( menuEntry->SubMenu )\r
-        {\r
-            if ( ! menuEntry->SubMenu->IsActive )\r
-            {\r
-                int max_x, max_y;\r
-                SFG_Window *current_window = fgStructure.CurrentWindow;\r
-\r
-                /* Set up the initial menu position now... */\r
-                menuEntry->SubMenu->IsActive = GL_TRUE;\r
-\r
-                /* Set up the initial submenu position now: */\r
-                fghGetVMaxExtent(menu->ParentWindow, &max_x, &max_y);\r
-                menuEntry->SubMenu->X = menu->X + menu->Width;\r
-                menuEntry->SubMenu->Y = menu->Y +\r
-                    menuEntry->Ordinal * FREEGLUT_MENU_HEIGHT;\r
-\r
-                if( menuEntry->SubMenu->X + menuEntry->SubMenu->Width > max_x )\r
-                    menuEntry->SubMenu->X = menu->X - menuEntry->SubMenu->Width;\r
-\r
-                if( menuEntry->SubMenu->Y + menuEntry->SubMenu->Height > max_y )\r
-                {\r
-                    menuEntry->SubMenu->Y -= ( menuEntry->SubMenu->Height -\r
-                                               FREEGLUT_MENU_HEIGHT -\r
-                                               2 * FREEGLUT_MENU_BORDER );\r
-                    if( menuEntry->SubMenu->Y < 0 )\r
-                        menuEntry->SubMenu->Y = 0;\r
-                }\r
-\r
-                fgSetWindow( menuEntry->SubMenu->Window );\r
-                glutPositionWindow( menuEntry->SubMenu->X,\r
-                                    menuEntry->SubMenu->Y );\r
-                glutReshapeWindow( menuEntry->SubMenu->Width,\r
-                                   menuEntry->SubMenu->Height );\r
-                glutPopWindow( );\r
-                glutShowWindow( );\r
-                menuEntry->SubMenu->Window->ActiveMenu = menuEntry->SubMenu;\r
-                fgSetWindow( current_window );\r
-                menuEntry->SubMenu->Window->State.MouseX =\r
-                    x + menu->X - menuEntry->SubMenu->X;\r
-                menuEntry->SubMenu->Window->State.MouseY =\r
-                    y + menu->Y - menuEntry->SubMenu->Y;\r
-                fghCheckMenuStatus( menuEntry->SubMenu );\r
-            }\r
-\r
-            /* Activate it because its parent entry is active */\r
-            menuEntry->SubMenu->IsActive = GL_TRUE;  /* XXX Do we need this? */\r
-        }\r
-\r
-        /* Report back that we have caught the menu cursor */\r
-        return GL_TRUE;\r
-    }\r
-\r
-    /* Looks like the menu cursor is somewhere else... */\r
-    if( menu->ActiveEntry && menu->ActiveEntry->IsActive &&\r
-        ( !menu->ActiveEntry->SubMenu ||\r
-          !menu->ActiveEntry->SubMenu->IsActive ) )\r
-    {\r
-        menu->Window->State.Redisplay = GL_TRUE;\r
-        menu->ActiveEntry->IsActive = GL_FALSE;\r
-        menu->ActiveEntry = NULL;\r
-    }\r
-\r
-    return GL_FALSE;\r
-}\r
-\r
-/*\r
- * Displays a menu box and all of its submenus (if they are active)\r
- */\r
-static void fghDisplayMenuBox( SFG_Menu* menu )\r
-{\r
-    SFG_MenuEntry *menuEntry;\r
-    int i;\r
-    int border = FREEGLUT_MENU_BORDER;\r
-\r
-    /*\r
-     * Have the menu box drawn first. The +- values are\r
-     * here just to make it more nice-looking...\r
-     */\r
-    /* a non-black dark version of the below. */\r
-    glColor4f( 1.0f, 1.0f, 1.0f, 1.0f );\r
-    glBegin( GL_QUAD_STRIP );\r
-        glVertex2i( menu->Width         , 0                    );\r
-        glVertex2i( menu->Width - border,                border);\r
-        glVertex2i( 0                   , 0                    );\r
-        glVertex2i(               border,                border);\r
-        glVertex2i( 0                   , menu->Height         );\r
-        glVertex2i(               border, menu->Height - border);\r
-    glEnd( );\r
-\r
-    /* a non-black dark version of the below. */\r
-    glColor4f( 0.5f, 0.5f, 0.5f, 1.0f );\r
-    glBegin( GL_QUAD_STRIP );\r
-        glVertex2i( 0                   , menu->Height         );\r
-        glVertex2i(               border, menu->Height - border);\r
-        glVertex2i( menu->Width         , menu->Height         );\r
-        glVertex2i( menu->Width - border, menu->Height - border);\r
-        glVertex2i( menu->Width         , 0                    );\r
-        glVertex2i( menu->Width - border,                border);\r
-    glEnd( );\r
-\r
-    glColor4fv( menu_pen_back );\r
-    glBegin( GL_QUADS );\r
-        glVertex2i(               border,                border);\r
-        glVertex2i( menu->Width - border,                border);\r
-        glVertex2i( menu->Width - border, menu->Height - border);\r
-        glVertex2i(               border, menu->Height - border);\r
-    glEnd( );\r
-\r
-    /* Check if any of the submenus is currently active... */\r
-    for( menuEntry = (SFG_MenuEntry *)menu->Entries.First;\r
-         menuEntry;\r
-         menuEntry = (SFG_MenuEntry *)menuEntry->Node.Next )\r
-    {\r
-        /* Has the menu been marked as active, maybe? */\r
-        if( menuEntry->IsActive )\r
-        {\r
-            /*\r
-             * That's truly right, and we need to have it highlighted.\r
-             * There is an assumption that mouse cursor didn't move\r
-             * since the last check of menu activity state:\r
-             */\r
-            int menuID = menuEntry->Ordinal;\r
-\r
-            /* So have the highlight drawn... */\r
-            glColor4fv( menu_pen_hback );\r
-            glBegin( GL_QUADS );\r
-                glVertex2i( border,\r
-                            (menuID + 0)*FREEGLUT_MENU_HEIGHT + border );\r
-                glVertex2i( menu->Width - border,\r
-                            (menuID + 0)*FREEGLUT_MENU_HEIGHT + border );\r
-                glVertex2i( menu->Width - border,\r
-                            (menuID + 1)*FREEGLUT_MENU_HEIGHT + border );\r
-                glVertex2i( border,\r
-                            (menuID + 1)*FREEGLUT_MENU_HEIGHT + border );\r
-            glEnd( );\r
-        }\r
-    }\r
-\r
-    /* Print the menu entries now... */\r
-\r
-    glColor4fv( menu_pen_fore );\r
-\r
-    for( menuEntry = (SFG_MenuEntry *)menu->Entries.First, i = 0;\r
-         menuEntry;\r
-         menuEntry = (SFG_MenuEntry *)menuEntry->Node.Next, ++i )\r
-    {\r
-        /* If the menu entry is active, set the color to white */\r
-        if( menuEntry->IsActive )\r
-            glColor4fv( menu_pen_hfore );\r
-\r
-        /* Move the raster into position... */\r
-        /* Try to center the text - JCJ 31 July 2003*/\r
-        glRasterPos2i(\r
-            2 * border,\r
-            ( i + 1 )*FREEGLUT_MENU_HEIGHT -\r
-            ( int )( FREEGLUT_MENU_HEIGHT*0.3 - border )\r
-        );\r
-\r
-        /* Have the label drawn, character after character: */\r
-        glutBitmapString( FREEGLUT_MENU_FONT,\r
-                          (unsigned char *)menuEntry->Text);\r
-\r
-        /* If it's a submenu, draw a right arrow */\r
-        if( menuEntry->SubMenu )\r
-        {\r
-            int width = glutBitmapWidth( FREEGLUT_MENU_FONT, '_' );\r
-            int x_base = menu->Width - 2 - width;\r
-            int y_base = i*FREEGLUT_MENU_HEIGHT + border;\r
-            glBegin( GL_TRIANGLES );\r
-                glVertex2i( x_base, y_base + 2*border);\r
-                glVertex2i( menu->Width - 2, y_base +\r
-                            ( FREEGLUT_MENU_HEIGHT + border) / 2 );\r
-                glVertex2i( x_base, y_base + FREEGLUT_MENU_HEIGHT - border );\r
-            glEnd( );\r
-        }\r
-\r
-        /* If the menu entry is active, reset the color */\r
-        if( menuEntry->IsActive )\r
-            glColor4fv( menu_pen_fore );\r
-    }\r
-}\r
-\r
-/*\r
- * Private static function to set the parent window of a submenu and all\r
- * of its submenus\r
- */\r
-static void fghSetMenuParentWindow( SFG_Window *window, SFG_Menu *menu )\r
-{\r
-    SFG_MenuEntry *menuEntry;\r
-\r
-    menu->ParentWindow = window;\r
-\r
-    for( menuEntry = ( SFG_MenuEntry * )menu->Entries.First;\r
-         menuEntry;\r
-         menuEntry = ( SFG_MenuEntry * )menuEntry->Node.Next )\r
-        if( menuEntry->SubMenu )\r
-            fghSetMenuParentWindow( window, menuEntry->SubMenu );\r
-}\r
-\r
-/*\r
- * Function to check for menu entry selection on menu deactivation\r
- */\r
-static void fghExecuteMenuCallback( SFG_Menu* menu )\r
-{\r
-    SFG_MenuEntry *menuEntry;\r
-\r
-    /* First of all check any of the active sub menus... */\r
-    for( menuEntry = (SFG_MenuEntry *)menu->Entries.First;\r
-         menuEntry;\r
-         menuEntry = (SFG_MenuEntry *)menuEntry->Node.Next)\r
-    {\r
-        if( menuEntry->IsActive )\r
-        {\r
-            if( menuEntry->SubMenu )\r
-                fghExecuteMenuCallback( menuEntry->SubMenu );\r
-            else\r
-                if( menu->Callback )\r
-                {\r
-                    SFG_Menu *save_menu = fgStructure.CurrentMenu;\r
-                    fgStructure.CurrentMenu = menu;\r
-                    menu->Callback( menuEntry->ID );\r
-                    fgStructure.CurrentMenu = save_menu;\r
-                }\r
-\r
-            return;\r
-        }\r
-    }\r
-}\r
-\r
-\r
-/*\r
- * Displays the currently active menu for the current window\r
- */\r
-void fgDisplayMenu( void )\r
-{\r
-    SFG_Window* window = fgStructure.CurrentWindow;\r
-    SFG_Menu* menu = NULL;\r
-\r
-    FREEGLUT_INTERNAL_ERROR_EXIT ( fgStructure.CurrentWindow, "Displaying menu in nonexistent window",\r
-                                   "fgDisplayMenu" );\r
-\r
-    /* Check if there is an active menu attached to this window... */\r
-    menu = window->ActiveMenu;\r
-    freeglut_return_if_fail( menu );\r
-\r
-    fgSetWindow( menu->Window );\r
-\r
-    glPushAttrib( GL_DEPTH_BUFFER_BIT | GL_TEXTURE_BIT | GL_LIGHTING_BIT |\r
-                  GL_POLYGON_BIT );\r
-\r
-    glDisable( GL_DEPTH_TEST );\r
-    glDisable( GL_TEXTURE_2D );\r
-    glDisable( GL_LIGHTING   );\r
-    glDisable( GL_CULL_FACE  );\r
-\r
-    glMatrixMode( GL_PROJECTION );\r
-    glPushMatrix( );\r
-    glLoadIdentity( );\r
-    glOrtho(\r
-         0, glutGet( GLUT_WINDOW_WIDTH  ),\r
-         glutGet( GLUT_WINDOW_HEIGHT ), 0,\r
-        -1, 1\r
-    );\r
-\r
-    glMatrixMode( GL_MODELVIEW );\r
-    glPushMatrix( );\r
-    glLoadIdentity( );\r
-\r
-    fghDisplayMenuBox( menu );\r
-\r
-    glPopAttrib( );\r
-\r
-    glMatrixMode( GL_PROJECTION );\r
-    glPopMatrix( );\r
-    glMatrixMode( GL_MODELVIEW );\r
-    glPopMatrix( );\r
-\r
-    glutSwapBuffers( );\r
-\r
-    fgSetWindow ( window );\r
-}\r
-\r
-/*\r
- * Activates a menu pointed by the function argument\r
- */\r
-static void fghActivateMenu( SFG_Window* window, int button )\r
-{\r
-    int max_x, max_y;\r
-\r
-    /* We'll be referencing this menu a lot, so remember its address: */\r
-    SFG_Menu* menu = window->Menu[ button ];\r
-    SFG_Window* current_window = fgStructure.CurrentWindow;\r
-\r
-    /* If the menu is already active in another window, deactivate it there */\r
-    if ( menu->ParentWindow )\r
-      menu->ParentWindow->ActiveMenu = NULL ;\r
-\r
-    /* Mark the menu as active, so that it gets displayed: */\r
-    window->ActiveMenu = menu;\r
-    menu->IsActive = GL_TRUE;\r
-    fghSetMenuParentWindow ( window, menu );\r
-    fgState.ActiveMenus++;\r
-\r
-    /* Set up the initial menu position now: */\r
-    fghGetVMaxExtent(menu->ParentWindow, &max_x, &max_y);\r
-    fgSetWindow( window );\r
-    menu->X = window->State.MouseX + glutGet( GLUT_WINDOW_X );\r
-    menu->Y = window->State.MouseY + glutGet( GLUT_WINDOW_Y );\r
-\r
-    if( menu->X + menu->Width > max_x )\r
-        menu->X -=menu->Width;\r
-\r
-    if( menu->Y + menu->Height > max_y )\r
-    {\r
-        menu->Y -=menu->Height;\r
-        if( menu->Y < 0 )\r
-            menu->Y = 0;\r
-    }\r
-\r
-    menu->Window->State.MouseX =\r
-        window->State.MouseX + glutGet( GLUT_WINDOW_X ) - menu->X;\r
-    menu->Window->State.MouseY =\r
-        window->State.MouseY + glutGet( GLUT_WINDOW_Y ) - menu->Y;\r
-\r
-    fgSetWindow( menu->Window );\r
-    glutPositionWindow( menu->X, menu->Y );\r
-    glutReshapeWindow( menu->Width, menu->Height );\r
-    glutPopWindow( );\r
-    glutShowWindow( );\r
-    menu->Window->ActiveMenu = menu;\r
-    fghCheckMenuStatus( menu );\r
-    fgSetWindow( current_window );\r
-}\r
-\r
-/*\r
- * Update Highlight states of the menu\r
- *\r
- * Current mouse position is in menu->Window->State.MouseX/Y.\r
- */\r
-void fgUpdateMenuHighlight ( SFG_Menu *menu )\r
-{\r
-    fghCheckMenuStatus( menu );\r
-}\r
-\r
-/*\r
- * Check whether an active menu absorbs a mouse click\r
- */\r
-GLboolean fgCheckActiveMenu ( SFG_Window *window, int button, GLboolean pressed,\r
-                              int mouse_x, int mouse_y )\r
-{\r
-    /*\r
-     * Near as I can tell, this is the menu behaviour:\r
-     *  - Down-click the menu button, menu not active:  activate\r
-     *    the menu with its upper left-hand corner at the mouse\r
-     *    location.\r
-     *  - Down-click any button outside the menu, menu active:\r
-     *    deactivate the menu\r
-     *  - Down-click any button inside the menu, menu active:\r
-     *    select the menu entry and deactivate the menu\r
-     *  - Up-click the menu button, menu not active:  nothing happens\r
-     *  - Up-click the menu button outside the menu, menu active:\r
-     *    nothing happens\r
-     *  - Up-click the menu button inside the menu, menu active:\r
-     *    select the menu entry and deactivate the menu\r
-     * Since menus can have submenus, we need to check this recursively.\r
-     */\r
-    if( window->ActiveMenu )\r
-    {\r
-        if( window == window->ActiveMenu->ParentWindow )\r
-        {\r
-            window->ActiveMenu->Window->State.MouseX =\r
-                                       mouse_x - window->ActiveMenu->X;\r
-            window->ActiveMenu->Window->State.MouseY =\r
-                                       mouse_y - window->ActiveMenu->Y;\r
-        }\r
-\r
-        /* In the menu, invoke the callback and deactivate the menu */\r
-        if( fghCheckMenuStatus( window->ActiveMenu ) )\r
-        {\r
-            /*\r
-             * Save the current window and menu and set the current\r
-             * window to the window whose menu this is\r
-             */\r
-            SFG_Window *save_window = fgStructure.CurrentWindow;\r
-            SFG_Menu *save_menu = fgStructure.CurrentMenu;\r
-            SFG_Window *parent_window = window->ActiveMenu->ParentWindow;\r
-            fgSetWindow( parent_window );\r
-            fgStructure.CurrentMenu = window->ActiveMenu;\r
-\r
-            /* Execute the menu callback */\r
-            fghExecuteMenuCallback( window->ActiveMenu );\r
-            fgDeactivateMenu( parent_window );\r
-\r
-            /* Restore the current window and menu */\r
-            fgSetWindow( save_window );\r
-            fgStructure.CurrentMenu = save_menu;\r
-        }\r
-        else if( pressed )\r
-            /*\r
-             * Outside the menu, deactivate if it's a downclick\r
-             *\r
-             * XXX This isn't enough.  A downclick outside of\r
-             * XXX the interior of our freeglut windows should also\r
-             * XXX deactivate the menu.  This is more complicated.\r
-             */\r
-            fgDeactivateMenu( window->ActiveMenu->ParentWindow );\r
-\r
-        /*\r
-         * XXX Why does an active menu require a redisplay at\r
-         * XXX this point?  If this can come out cleanly, then\r
-         * XXX it probably should do so; if not, a comment should\r
-         * XXX explain it.\r
-         */\r
-        if( ! window->IsMenu )\r
-            window->State.Redisplay = GL_TRUE;\r
-\r
-        return GL_TRUE;\r
-    }\r
-\r
-    /* No active menu, let's check whether we need to activate one. */\r
-    if( ( 0 <= button ) &&\r
-        ( FREEGLUT_MAX_MENUS > button ) &&\r
-        ( window->Menu[ button ] ) &&\r
-        pressed )\r
-    {\r
-        /* XXX Posting a requisite Redisplay seems bogus. */\r
-        window->State.Redisplay = GL_TRUE;\r
-        fghActivateMenu( window, button );\r
-        return GL_TRUE;\r
-    }\r
-\r
-    return GL_FALSE;\r
-}\r
-\r
-/*\r
- * Deactivates a menu pointed by the function argument.\r
- */\r
-void fgDeactivateMenu( SFG_Window *window )\r
-{\r
-    SFG_Window *parent_window = NULL;\r
-\r
-    /* Check if there is an active menu attached to this window... */\r
-    SFG_Menu* menu = window->ActiveMenu;\r
-    SFG_MenuEntry *menuEntry;\r
-\r
-    /* Did we find an active window? */\r
-    freeglut_return_if_fail( menu );\r
-\r
-    parent_window = menu->ParentWindow;\r
-\r
-    /* Hide the present menu's window */\r
-    fgSetWindow( menu->Window );\r
-    glutHideWindow( );\r
-\r
-    /* Forget about having that menu active anymore, now: */\r
-    menu->Window->ActiveMenu = NULL;\r
-    menu->ParentWindow->ActiveMenu = NULL;\r
-    fghSetMenuParentWindow ( NULL, menu );\r
-    menu->IsActive = GL_FALSE;\r
-    menu->ActiveEntry = NULL;\r
-\r
-    fgState.ActiveMenus--;\r
-\r
-    /* Hide all submenu windows, and the root menu's window. */\r
-    for ( menuEntry = ( SFG_MenuEntry * )menu->Entries.First;\r
-          menuEntry;\r
-          menuEntry = ( SFG_MenuEntry * )menuEntry->Node.Next )\r
-    {\r
-        menuEntry->IsActive = GL_FALSE;\r
-\r
-        /* Is that an active submenu by any case? */\r
-        if( menuEntry->SubMenu )\r
-            fghDeactivateSubMenu( menuEntry );\r
-    }\r
-\r
-    fgSetWindow ( parent_window ) ;\r
-}\r
-\r
-/*\r
- * Recalculates current menu's box size\r
- */\r
-void fghCalculateMenuBoxSize( void )\r
-{\r
-    SFG_MenuEntry* menuEntry;\r
-    int width = 0, height = 0;\r
-\r
-    /* Make sure there is a current menu set */\r
-    freeglut_return_if_fail( fgStructure.CurrentMenu );\r
-\r
-    /* The menu's box size depends on the menu entries: */\r
-    for( menuEntry = ( SFG_MenuEntry * )fgStructure.CurrentMenu->Entries.First;\r
-         menuEntry;\r
-         menuEntry = ( SFG_MenuEntry * )menuEntry->Node.Next )\r
-    {\r
-        /* Update the menu entry's width value */\r
-        menuEntry->Width = glutBitmapLength(\r
-            FREEGLUT_MENU_FONT,\r
-            (unsigned char *)menuEntry->Text\r
-        );\r
-\r
-        /*\r
-         * If the entry is a submenu, then it needs to be wider to\r
-         * accomodate the arrow. JCJ 31 July 2003\r
-         */\r
-        if (menuEntry->SubMenu )\r
-            menuEntry->Width += glutBitmapLength(\r
-                FREEGLUT_MENU_FONT,\r
-                (unsigned char *)"_"\r
-            );\r
-\r
-        /* Check if it's the biggest we've found */\r
-        if( menuEntry->Width > width )\r
-            width = menuEntry->Width;\r
-\r
-        height += FREEGLUT_MENU_HEIGHT;\r
-    }\r
-\r
-    /* Store the menu's box size now: */\r
-    fgStructure.CurrentMenu->Height = height + 2 * FREEGLUT_MENU_BORDER;\r
-    fgStructure.CurrentMenu->Width  = width  + 4 * FREEGLUT_MENU_BORDER;\r
-}\r
-\r
-\r
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */\r
-\r
-/*\r
- * Creates a new menu object, adding it to the freeglut structure\r
- */\r
-int FGAPIENTRY glutCreateMenu( void(* callback)( int ) )\r
-{\r
-    /* The menu object creation code resides in freeglut_structure.c */\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateMenu" );\r
-    return fgCreateMenu( callback )->ID;\r
-}\r
-\r
-/*\r
- * Destroys a menu object, removing all references to it\r
- */\r
-void FGAPIENTRY glutDestroyMenu( int menuID )\r
-{\r
-    SFG_Menu* menu;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDestroyMenu" );\r
-    menu = fgMenuByID( menuID );\r
-\r
-    freeglut_return_if_fail( menu );\r
-\r
-    /* The menu object destruction code resides in freeglut_structure.c */\r
-    fgDestroyMenu( menu );\r
-}\r
-\r
-/*\r
- * Returns the ID number of the currently active menu\r
- */\r
-int FGAPIENTRY glutGetMenu( void )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetMenu" );\r
-\r
-    if( fgStructure.CurrentMenu )\r
-        return fgStructure.CurrentMenu->ID;\r
-\r
-    return 0;\r
-}\r
-\r
-/*\r
- * Sets the current menu given its menu ID\r
- */\r
-void FGAPIENTRY glutSetMenu( int menuID )\r
-{\r
-    SFG_Menu* menu;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetMenu" );\r
-    menu = fgMenuByID( menuID );\r
-\r
-    freeglut_return_if_fail( menu );\r
-\r
-    fgStructure.CurrentMenu = menu;\r
-}\r
-\r
-/*\r
- * Adds a menu entry to the bottom of the current menu\r
- */\r
-void FGAPIENTRY glutAddMenuEntry( const char* label, int value )\r
-{\r
-    SFG_MenuEntry* menuEntry;\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutAddMenuEntry" );\r
-    menuEntry = (SFG_MenuEntry *)calloc( sizeof(SFG_MenuEntry), 1 );\r
-    freeglut_return_if_fail( fgStructure.CurrentMenu );\r
-\r
-    menuEntry->Text = strdup( label );\r
-    menuEntry->ID   = value;\r
-\r
-    /* Have the new menu entry attached to the current menu */\r
-    fgListAppend( &fgStructure.CurrentMenu->Entries, &menuEntry->Node );\r
-\r
-    fghCalculateMenuBoxSize( );\r
-}\r
-\r
-/*\r
- * Add a sub menu to the bottom of the current menu\r
- */\r
-void FGAPIENTRY glutAddSubMenu( const char *label, int subMenuID )\r
-{\r
-    SFG_MenuEntry *menuEntry;\r
-    SFG_Menu *subMenu;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutAddSubMenu" );\r
-    menuEntry = ( SFG_MenuEntry * )calloc( sizeof( SFG_MenuEntry ), 1 );\r
-    subMenu = fgMenuByID( subMenuID );\r
-\r
-    freeglut_return_if_fail( fgStructure.CurrentMenu );\r
-    freeglut_return_if_fail( subMenu );\r
-\r
-    menuEntry->Text    = strdup( label );\r
-    menuEntry->SubMenu = subMenu;\r
-    menuEntry->ID      = -1;\r
-\r
-    fgListAppend( &fgStructure.CurrentMenu->Entries, &menuEntry->Node );\r
-    fghCalculateMenuBoxSize( );\r
-}\r
-\r
-/*\r
- * Changes the specified menu item in the current menu into a menu entry\r
- */\r
-void FGAPIENTRY glutChangeToMenuEntry( int item, const char* label, int value )\r
-{\r
-    SFG_MenuEntry* menuEntry = NULL;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutChangeToMenuEntry" );\r
-    freeglut_return_if_fail( fgStructure.CurrentMenu );\r
-\r
-    /* Get n-th menu entry in the current menu, starting from one: */\r
-    menuEntry = fghFindMenuEntry( fgStructure.CurrentMenu, item );\r
-\r
-    freeglut_return_if_fail( menuEntry );\r
-\r
-    /* We want it to become a normal menu entry, so: */\r
-    if( menuEntry->Text )\r
-        free( menuEntry->Text );\r
-\r
-    menuEntry->Text    = strdup( label );\r
-    menuEntry->ID      = value;\r
-    menuEntry->SubMenu = NULL;\r
-    fghCalculateMenuBoxSize( );\r
-}\r
-\r
-/*\r
- * Changes the specified menu item in the current menu into a sub-menu trigger.\r
- */\r
-void FGAPIENTRY glutChangeToSubMenu( int item, const char* label,\r
-                                     int subMenuID )\r
-{\r
-    SFG_Menu*      subMenu;\r
-    SFG_MenuEntry* menuEntry;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutChangeToSubMenu" );\r
-    subMenu = fgMenuByID( subMenuID );\r
-    menuEntry = NULL;\r
-\r
-    freeglut_return_if_fail( fgStructure.CurrentMenu );\r
-    freeglut_return_if_fail( subMenu );\r
-\r
-    /* Get n-th menu entry in the current menu, starting from one: */\r
-    menuEntry = fghFindMenuEntry( fgStructure.CurrentMenu, item );\r
-\r
-    freeglut_return_if_fail( menuEntry );\r
-\r
-    /* We want it to become a sub menu entry, so: */\r
-    if( menuEntry->Text )\r
-        free( menuEntry->Text );\r
-\r
-    menuEntry->Text    = strdup( label );\r
-    menuEntry->SubMenu = subMenu;\r
-    menuEntry->ID      = -1;\r
-    fghCalculateMenuBoxSize( );\r
-}\r
-\r
-/*\r
- * Removes the specified menu item from the current menu\r
- */\r
-void FGAPIENTRY glutRemoveMenuItem( int item )\r
-{\r
-    SFG_MenuEntry* menuEntry;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutRemoveMenuItem" );\r
-    freeglut_return_if_fail( fgStructure.CurrentMenu );\r
-\r
-    /* Get n-th menu entry in the current menu, starting from one: */\r
-    menuEntry = fghFindMenuEntry( fgStructure.CurrentMenu, item );\r
-\r
-    freeglut_return_if_fail( menuEntry );\r
-\r
-    fgListRemove( &fgStructure.CurrentMenu->Entries, &menuEntry->Node );\r
-    if ( menuEntry->Text )\r
-      free( menuEntry->Text );\r
-\r
-    free( menuEntry );\r
-    fghCalculateMenuBoxSize( );\r
-}\r
-\r
-/*\r
- * Attaches a menu to the current window\r
- */\r
-void FGAPIENTRY glutAttachMenu( int button )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutAttachMenu" );\r
-\r
-    freeglut_return_if_fail( fgStructure.CurrentWindow );\r
-    freeglut_return_if_fail( fgStructure.CurrentMenu );\r
-\r
-    freeglut_return_if_fail( button >= 0 );\r
-    freeglut_return_if_fail( button < FREEGLUT_MAX_MENUS );\r
-\r
-    fgStructure.CurrentWindow->Menu[ button ] = fgStructure.CurrentMenu;\r
-}\r
-\r
-/*\r
- * Detaches a menu from the current window\r
- */\r
-void FGAPIENTRY glutDetachMenu( int button )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDetachMenu" );\r
-\r
-    freeglut_return_if_fail( fgStructure.CurrentWindow );\r
-    freeglut_return_if_fail( fgStructure.CurrentMenu );\r
-\r
-    freeglut_return_if_fail( button >= 0 );\r
-    freeglut_return_if_fail( button < FREEGLUT_MAX_MENUS );\r
-\r
-    fgStructure.CurrentWindow->Menu[ button ] = NULL;\r
-}\r
-\r
-/*\r
- * A.Donev: Set and retrieve the menu's user data\r
- */\r
-void* FGAPIENTRY glutGetMenuData( void )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetMenuData" );\r
-    return fgStructure.CurrentMenu->UserData;\r
-}\r
-\r
-void FGAPIENTRY glutSetMenuData(void* data)\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetMenuData" );\r
-    fgStructure.CurrentMenu->UserData=data;\r
-}\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_menu.c
+ *
+ * Pull-down menu creation and handling.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Thu Dec 16 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#define FREEGLUT_BUILDING_LIB
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+/* -- DEFINITIONS ---------------------------------------------------------- */
+
+/*
+ * FREEGLUT_MENU_FONT can be any freeglut bitmapped font.
+ * (Stroked fonts would not be out of the question, but we'd need to alter
+ *  code, since GLUT (hence freeglut) does not quite unify stroked and
+ *  bitmapped font handling.)
+ * Old UNIX/X11 GLUT (BSD, UNIX, IRIX, LINUX, HPUX, ...) used a system
+ * font best approximated by an 18-pixel HELVETICA, I think.  MS-WINDOWS
+ * GLUT used something closest to the 8x13 fixed-width font.  (Old
+ * GLUT apparently uses host-system menus rather than building its own.
+ * freeglut is building its own menus from scratch.)
+ *
+ * FREEGLUT_MENU_HEIGHT gives the height of ONE menu box.  This should be
+ * the distances between two adjacent menu entries.  It should scale
+ * automatically with the font choice, so you needn't alter it---unless you
+ * use a stroked font.
+ *
+ * FREEGLUT_MENU_BORDER says how many pixels to allow around the edge of a
+ * menu.  (It also seems to be the same as the number of pixels used as
+ * a border around *items* to separate them from neighbors.  John says
+ * that that wasn't the original intent...if not, perhaps we need another
+ * symbolic constant, FREEGLUT_MENU_ITEM_BORDER, or such.)
+ */
+/* See platform-specific header files for menu font and color definitions */
+
+#define  FREEGLUT_MENU_HEIGHT  (glutBitmapHeight(FREEGLUT_MENU_FONT) + \
+                                FREEGLUT_MENU_BORDER)
+#define  FREEGLUT_MENU_BORDER   2
+
+
+/*
+ * These variables are for rendering the freeglut menu items.
+ *
+ * The choices are fore- and background, with and without h for Highlighting.
+ * Old GLUT appeared to be system-dependant for its colors (sigh) so we are
+ * too.  These variables should be stuffed into global state and initialized
+ * via the glutInit*() system.
+ */
+static float menu_pen_fore  [4] = FREEGLUT_MENU_PEN_FORE_COLORS ;
+static float menu_pen_back  [4] = FREEGLUT_MENU_PEN_BACK_COLORS ;
+static float menu_pen_hfore [4] = FREEGLUT_MENU_PEN_HFORE_COLORS;
+static float menu_pen_hback [4] = FREEGLUT_MENU_PEN_HBACK_COLORS;
+
+
+extern GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y );
+
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
+
+/*
+ * Private function to find a menu entry by index
+ */
+static SFG_MenuEntry *fghFindMenuEntry( SFG_Menu* menu, int index )
+{
+    SFG_MenuEntry *entry;
+    int i = 1;
+
+    for( entry = (SFG_MenuEntry *)menu->Entries.First;
+         entry;
+         entry = (SFG_MenuEntry *)entry->Node.Next )
+    {
+        if( i == index )
+            break;
+        ++i;
+    }
+
+    return entry;
+}
+
+/*
+ * Deactivates a menu pointed by the function argument.
+ */
+static void fghDeactivateSubMenu( SFG_MenuEntry *menuEntry )
+{
+    SFG_MenuEntry *subMenuIter;
+    /* Hide the present menu's window */
+    fgSetWindow( menuEntry->SubMenu->Window );
+    glutHideWindow( );
+
+    /* Forget about having that menu active anymore, now: */
+    menuEntry->SubMenu->Window->ActiveMenu = NULL;
+    menuEntry->SubMenu->IsActive = GL_FALSE;
+    menuEntry->SubMenu->ActiveEntry = NULL;
+
+    /* Hide all submenu windows, and the root menu's window. */
+    for ( subMenuIter = (SFG_MenuEntry *)menuEntry->SubMenu->Entries.First;
+          subMenuIter;
+          subMenuIter = (SFG_MenuEntry *)subMenuIter->Node.Next )
+    {
+        subMenuIter->IsActive = GL_FALSE;
+
+        /* Is that an active submenu by any case? */
+        if( subMenuIter->SubMenu )
+            fghDeactivateSubMenu( subMenuIter );
+    }
+
+    fgSetWindow ( menuEntry->SubMenu->ParentWindow ) ;
+}
+
+/*
+ * Private function to get the virtual maximum screen extent
+ */
+static GLvoid fghGetVMaxExtent( SFG_Window* window, int* x, int* y )
+{
+    if( fgStructure.GameModeWindow )
+               fgPlatformGetGameModeVMaxExtent ( window, x, y );
+    else
+    {
+        *x = fgDisplay.ScreenWidth;
+        *y = fgDisplay.ScreenHeight;
+    }
+}
+
+/*
+ * Private function to check for the current menu/sub menu activity state
+ */
+static GLboolean fghCheckMenuStatus( SFG_Menu* menu )
+{
+    SFG_MenuEntry* menuEntry;
+    int x, y;
+
+    /* First of all check any of the active sub menus... */
+    for( menuEntry = (SFG_MenuEntry *)menu->Entries.First;
+         menuEntry;
+         menuEntry = (SFG_MenuEntry *)menuEntry->Node.Next )
+    {
+        if( menuEntry->SubMenu && menuEntry->IsActive )
+        {
+            /*
+             * OK, have the sub-menu checked, too. If it returns GL_TRUE, it
+             * will mean that it caught the mouse cursor and we do not need
+             * to regenerate the activity list, and so our parents do...
+             */
+            GLboolean return_status;
+
+            menuEntry->SubMenu->Window->State.MouseX =
+                menu->Window->State.MouseX + menu->X - menuEntry->SubMenu->X;
+            menuEntry->SubMenu->Window->State.MouseY =
+                menu->Window->State.MouseY + menu->Y - menuEntry->SubMenu->Y;
+            return_status = fghCheckMenuStatus( menuEntry->SubMenu );
+
+            if ( return_status )
+                return GL_TRUE;
+        }
+    }
+
+    /* That much about our sub menus, let's get to checking the current menu: */
+    x = menu->Window->State.MouseX;
+    y = menu->Window->State.MouseY;
+
+    /* Check if the mouse cursor is contained within the current menu box */
+    if( ( x >= FREEGLUT_MENU_BORDER ) &&
+        ( x < menu->Width  - FREEGLUT_MENU_BORDER ) &&
+        ( y >= FREEGLUT_MENU_BORDER ) &&
+        ( y < menu->Height - FREEGLUT_MENU_BORDER )  )
+    {
+        int menuID = ( y - FREEGLUT_MENU_BORDER ) / FREEGLUT_MENU_HEIGHT;
+
+        /* The mouse cursor is somewhere over our box, check it out. */
+        menuEntry = fghFindMenuEntry( menu, menuID + 1 );
+        FREEGLUT_INTERNAL_ERROR_EXIT( menuEntry, "Cannot find menu entry",
+                                      "fghCheckMenuStatus" );
+
+        menuEntry->IsActive = GL_TRUE;
+        menuEntry->Ordinal = menuID;
+
+        /*
+         * If this is not the same as the last active menu entry, deactivate
+         * the previous entry.  Specifically, if the previous active entry
+         * was a submenu then deactivate it.
+         */
+        if( menu->ActiveEntry && ( menuEntry != menu->ActiveEntry ) )
+            if( menu->ActiveEntry->SubMenu )
+                fghDeactivateSubMenu( menu->ActiveEntry );
+
+        if( menuEntry != menu->ActiveEntry )
+        {
+            menu->Window->State.Redisplay = GL_TRUE;
+            if( menu->ActiveEntry )
+                menu->ActiveEntry->IsActive = GL_FALSE;
+        }
+
+        menu->ActiveEntry = menuEntry;
+        menu->IsActive = GL_TRUE;  /* XXX Do we need this? */
+
+        /*
+         * OKi, we have marked that entry as active, but it would be also
+         * nice to have its contents updated, in case it's a sub menu.
+         * Also, ignore the return value of the check function:
+         */
+        if( menuEntry->SubMenu )
+        {
+            if ( ! menuEntry->SubMenu->IsActive )
+            {
+                int max_x, max_y;
+                SFG_Window *current_window = fgStructure.CurrentWindow;
+
+                /* Set up the initial menu position now... */
+                menuEntry->SubMenu->IsActive = GL_TRUE;
+
+                /* Set up the initial submenu position now: */
+                fghGetVMaxExtent(menu->ParentWindow, &max_x, &max_y);
+                menuEntry->SubMenu->X = menu->X + menu->Width;
+                menuEntry->SubMenu->Y = menu->Y +
+                    menuEntry->Ordinal * FREEGLUT_MENU_HEIGHT;
+
+                if( menuEntry->SubMenu->X + menuEntry->SubMenu->Width > max_x )
+                    menuEntry->SubMenu->X = menu->X - menuEntry->SubMenu->Width;
+
+                if( menuEntry->SubMenu->Y + menuEntry->SubMenu->Height > max_y )
+                {
+                    menuEntry->SubMenu->Y -= ( menuEntry->SubMenu->Height -
+                                               FREEGLUT_MENU_HEIGHT -
+                                               2 * FREEGLUT_MENU_BORDER );
+                    if( menuEntry->SubMenu->Y < 0 )
+                        menuEntry->SubMenu->Y = 0;
+                }
+
+                fgSetWindow( menuEntry->SubMenu->Window );
+                glutPositionWindow( menuEntry->SubMenu->X,
+                                    menuEntry->SubMenu->Y );
+                glutReshapeWindow( menuEntry->SubMenu->Width,
+                                   menuEntry->SubMenu->Height );
+                glutPopWindow( );
+                glutShowWindow( );
+                menuEntry->SubMenu->Window->ActiveMenu = menuEntry->SubMenu;
+                fgSetWindow( current_window );
+                menuEntry->SubMenu->Window->State.MouseX =
+                    x + menu->X - menuEntry->SubMenu->X;
+                menuEntry->SubMenu->Window->State.MouseY =
+                    y + menu->Y - menuEntry->SubMenu->Y;
+                fghCheckMenuStatus( menuEntry->SubMenu );
+            }
+
+            /* Activate it because its parent entry is active */
+            menuEntry->SubMenu->IsActive = GL_TRUE;  /* XXX Do we need this? */
+        }
+
+        /* Report back that we have caught the menu cursor */
+        return GL_TRUE;
+    }
+
+    /* Looks like the menu cursor is somewhere else... */
+    if( menu->ActiveEntry && menu->ActiveEntry->IsActive &&
+        ( !menu->ActiveEntry->SubMenu ||
+          !menu->ActiveEntry->SubMenu->IsActive ) )
+    {
+        menu->Window->State.Redisplay = GL_TRUE;
+        menu->ActiveEntry->IsActive = GL_FALSE;
+        menu->ActiveEntry = NULL;
+    }
+
+    return GL_FALSE;
+}
+
+/*
+ * Displays a menu box and all of its submenus (if they are active)
+ */
+static void fghDisplayMenuBox( SFG_Menu* menu )
+{
+    SFG_MenuEntry *menuEntry;
+    int i;
+    int border = FREEGLUT_MENU_BORDER;
+
+    /*
+     * Have the menu box drawn first. The +- values are
+     * here just to make it more nice-looking...
+     */
+    /* a non-black dark version of the below. */
+    glColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
+    glBegin( GL_QUAD_STRIP );
+        glVertex2i( menu->Width         , 0                    );
+        glVertex2i( menu->Width - border,                border);
+        glVertex2i( 0                   , 0                    );
+        glVertex2i(               border,                border);
+        glVertex2i( 0                   , menu->Height         );
+        glVertex2i(               border, menu->Height - border);
+    glEnd( );
+
+    /* a non-black dark version of the below. */
+    glColor4f( 0.5f, 0.5f, 0.5f, 1.0f );
+    glBegin( GL_QUAD_STRIP );
+        glVertex2i( 0                   , menu->Height         );
+        glVertex2i(               border, menu->Height - border);
+        glVertex2i( menu->Width         , menu->Height         );
+        glVertex2i( menu->Width - border, menu->Height - border);
+        glVertex2i( menu->Width         , 0                    );
+        glVertex2i( menu->Width - border,                border);
+    glEnd( );
+
+    glColor4fv( menu_pen_back );
+    glBegin( GL_QUADS );
+        glVertex2i(               border,                border);
+        glVertex2i( menu->Width - border,                border);
+        glVertex2i( menu->Width - border, menu->Height - border);
+        glVertex2i(               border, menu->Height - border);
+    glEnd( );
+
+    /* Check if any of the submenus is currently active... */
+    for( menuEntry = (SFG_MenuEntry *)menu->Entries.First;
+         menuEntry;
+         menuEntry = (SFG_MenuEntry *)menuEntry->Node.Next )
+    {
+        /* Has the menu been marked as active, maybe? */
+        if( menuEntry->IsActive )
+        {
+            /*
+             * That's truly right, and we need to have it highlighted.
+             * There is an assumption that mouse cursor didn't move
+             * since the last check of menu activity state:
+             */
+            int menuID = menuEntry->Ordinal;
+
+            /* So have the highlight drawn... */
+            glColor4fv( menu_pen_hback );
+            glBegin( GL_QUADS );
+                glVertex2i( border,
+                            (menuID + 0)*FREEGLUT_MENU_HEIGHT + border );
+                glVertex2i( menu->Width - border,
+                            (menuID + 0)*FREEGLUT_MENU_HEIGHT + border );
+                glVertex2i( menu->Width - border,
+                            (menuID + 1)*FREEGLUT_MENU_HEIGHT + border );
+                glVertex2i( border,
+                            (menuID + 1)*FREEGLUT_MENU_HEIGHT + border );
+            glEnd( );
+        }
+    }
+
+    /* Print the menu entries now... */
+
+    glColor4fv( menu_pen_fore );
+
+    for( menuEntry = (SFG_MenuEntry *)menu->Entries.First, i = 0;
+         menuEntry;
+         menuEntry = (SFG_MenuEntry *)menuEntry->Node.Next, ++i )
+    {
+        /* If the menu entry is active, set the color to white */
+        if( menuEntry->IsActive )
+            glColor4fv( menu_pen_hfore );
+
+        /* Move the raster into position... */
+        /* Try to center the text - JCJ 31 July 2003*/
+        glRasterPos2i(
+            2 * border,
+            ( i + 1 )*FREEGLUT_MENU_HEIGHT -
+            ( int )( FREEGLUT_MENU_HEIGHT*0.3 - border )
+        );
+
+        /* Have the label drawn, character after character: */
+        glutBitmapString( FREEGLUT_MENU_FONT,
+                          (unsigned char *)menuEntry->Text);
+
+        /* If it's a submenu, draw a right arrow */
+        if( menuEntry->SubMenu )
+        {
+            int width = glutBitmapWidth( FREEGLUT_MENU_FONT, '_' );
+            int x_base = menu->Width - 2 - width;
+            int y_base = i*FREEGLUT_MENU_HEIGHT + border;
+            glBegin( GL_TRIANGLES );
+                glVertex2i( x_base, y_base + 2*border);
+                glVertex2i( menu->Width - 2, y_base +
+                            ( FREEGLUT_MENU_HEIGHT + border) / 2 );
+                glVertex2i( x_base, y_base + FREEGLUT_MENU_HEIGHT - border );
+            glEnd( );
+        }
+
+        /* If the menu entry is active, reset the color */
+        if( menuEntry->IsActive )
+            glColor4fv( menu_pen_fore );
+    }
+}
+
+/*
+ * Private static function to set the parent window of a submenu and all
+ * of its submenus
+ */
+static void fghSetMenuParentWindow( SFG_Window *window, SFG_Menu *menu )
+{
+    SFG_MenuEntry *menuEntry;
+
+    menu->ParentWindow = window;
+
+    for( menuEntry = ( SFG_MenuEntry * )menu->Entries.First;
+         menuEntry;
+         menuEntry = ( SFG_MenuEntry * )menuEntry->Node.Next )
+        if( menuEntry->SubMenu )
+            fghSetMenuParentWindow( window, menuEntry->SubMenu );
+}
+
+/*
+ * Function to check for menu entry selection on menu deactivation
+ */
+static void fghExecuteMenuCallback( SFG_Menu* menu )
+{
+    SFG_MenuEntry *menuEntry;
+
+    /* First of all check any of the active sub menus... */
+    for( menuEntry = (SFG_MenuEntry *)menu->Entries.First;
+         menuEntry;
+         menuEntry = (SFG_MenuEntry *)menuEntry->Node.Next)
+    {
+        if( menuEntry->IsActive )
+        {
+            if( menuEntry->SubMenu )
+                fghExecuteMenuCallback( menuEntry->SubMenu );
+            else
+                if( menu->Callback )
+                {
+                    SFG_Menu *save_menu = fgStructure.CurrentMenu;
+                    fgStructure.CurrentMenu = menu;
+                    menu->Callback( menuEntry->ID );
+                    fgStructure.CurrentMenu = save_menu;
+                }
+
+            return;
+        }
+    }
+}
+
+
+/*
+ * Displays the currently active menu for the current window
+ */
+void fgDisplayMenu( void )
+{
+    SFG_Window* window = fgStructure.CurrentWindow;
+    SFG_Menu* menu = NULL;
+
+    FREEGLUT_INTERNAL_ERROR_EXIT ( fgStructure.CurrentWindow, "Displaying menu in nonexistent window",
+                                   "fgDisplayMenu" );
+
+    /* Check if there is an active menu attached to this window... */
+    menu = window->ActiveMenu;
+    freeglut_return_if_fail( menu );
+
+    fgSetWindow( menu->Window );
+
+    glPushAttrib( GL_DEPTH_BUFFER_BIT | GL_TEXTURE_BIT | GL_LIGHTING_BIT |
+                  GL_POLYGON_BIT );
+
+    glDisable( GL_DEPTH_TEST );
+    glDisable( GL_TEXTURE_2D );
+    glDisable( GL_LIGHTING   );
+    glDisable( GL_CULL_FACE  );
+
+    glMatrixMode( GL_PROJECTION );
+    glPushMatrix( );
+    glLoadIdentity( );
+    glOrtho(
+         0, glutGet( GLUT_WINDOW_WIDTH  ),
+         glutGet( GLUT_WINDOW_HEIGHT ), 0,
+        -1, 1
+    );
+
+    glMatrixMode( GL_MODELVIEW );
+    glPushMatrix( );
+    glLoadIdentity( );
+
+    fghDisplayMenuBox( menu );
+
+    glPopAttrib( );
+
+    glMatrixMode( GL_PROJECTION );
+    glPopMatrix( );
+    glMatrixMode( GL_MODELVIEW );
+    glPopMatrix( );
+
+    glutSwapBuffers( );
+
+    fgSetWindow ( window );
+}
+
+/*
+ * Activates a menu pointed by the function argument
+ */
+static void fghActivateMenu( SFG_Window* window, int button )
+{
+    int max_x, max_y;
+
+    /* We'll be referencing this menu a lot, so remember its address: */
+    SFG_Menu* menu = window->Menu[ button ];
+    SFG_Window* current_window = fgStructure.CurrentWindow;
+
+    /* If the menu is already active in another window, deactivate it there */
+    if ( menu->ParentWindow )
+      menu->ParentWindow->ActiveMenu = NULL ;
+
+    /* Mark the menu as active, so that it gets displayed: */
+    window->ActiveMenu = menu;
+    menu->IsActive = GL_TRUE;
+    fghSetMenuParentWindow ( window, menu );
+    fgState.ActiveMenus++;
+
+    /* Set up the initial menu position now: */
+    fghGetVMaxExtent(menu->ParentWindow, &max_x, &max_y);
+    fgSetWindow( window );
+    menu->X = window->State.MouseX + glutGet( GLUT_WINDOW_X );
+    menu->Y = window->State.MouseY + glutGet( GLUT_WINDOW_Y );
+
+    if( menu->X + menu->Width > max_x )
+        menu->X -=menu->Width;
+
+    if( menu->Y + menu->Height > max_y )
+    {
+        menu->Y -=menu->Height;
+        if( menu->Y < 0 )
+            menu->Y = 0;
+    }
+
+    menu->Window->State.MouseX =
+        window->State.MouseX + glutGet( GLUT_WINDOW_X ) - menu->X;
+    menu->Window->State.MouseY =
+        window->State.MouseY + glutGet( GLUT_WINDOW_Y ) - menu->Y;
+
+    fgSetWindow( menu->Window );
+    glutPositionWindow( menu->X, menu->Y );
+    glutReshapeWindow( menu->Width, menu->Height );
+    glutPopWindow( );
+    glutShowWindow( );
+    menu->Window->ActiveMenu = menu;
+    fghCheckMenuStatus( menu );
+    fgSetWindow( current_window );
+}
+
+/*
+ * Update Highlight states of the menu
+ *
+ * Current mouse position is in menu->Window->State.MouseX/Y.
+ */
+void fgUpdateMenuHighlight ( SFG_Menu *menu )
+{
+    fghCheckMenuStatus( menu );
+}
+
+/*
+ * Check whether an active menu absorbs a mouse click
+ */
+GLboolean fgCheckActiveMenu ( SFG_Window *window, int button, GLboolean pressed,
+                              int mouse_x, int mouse_y )
+{
+    /*
+     * Near as I can tell, this is the menu behaviour:
+     *  - Down-click the menu button, menu not active:  activate
+     *    the menu with its upper left-hand corner at the mouse
+     *    location.
+     *  - Down-click any button outside the menu, menu active:
+     *    deactivate the menu
+     *  - Down-click any button inside the menu, menu active:
+     *    select the menu entry and deactivate the menu
+     *  - Up-click the menu button, menu not active:  nothing happens
+     *  - Up-click the menu button outside the menu, menu active:
+     *    nothing happens
+     *  - Up-click the menu button inside the menu, menu active:
+     *    select the menu entry and deactivate the menu
+     * Since menus can have submenus, we need to check this recursively.
+     */
+    if( window->ActiveMenu )
+    {
+        if( window == window->ActiveMenu->ParentWindow )
+        {
+            window->ActiveMenu->Window->State.MouseX =
+                                       mouse_x - window->ActiveMenu->X;
+            window->ActiveMenu->Window->State.MouseY =
+                                       mouse_y - window->ActiveMenu->Y;
+        }
+
+        /* In the menu, invoke the callback and deactivate the menu */
+        if( fghCheckMenuStatus( window->ActiveMenu ) )
+        {
+            /*
+             * Save the current window and menu and set the current
+             * window to the window whose menu this is
+             */
+            SFG_Window *save_window = fgStructure.CurrentWindow;
+            SFG_Menu *save_menu = fgStructure.CurrentMenu;
+            SFG_Window *parent_window = window->ActiveMenu->ParentWindow;
+            fgSetWindow( parent_window );
+            fgStructure.CurrentMenu = window->ActiveMenu;
+
+            /* Execute the menu callback */
+            fghExecuteMenuCallback( window->ActiveMenu );
+            fgDeactivateMenu( parent_window );
+
+            /* Restore the current window and menu */
+            fgSetWindow( save_window );
+            fgStructure.CurrentMenu = save_menu;
+        }
+        else if( pressed )
+            /*
+             * Outside the menu, deactivate if it's a downclick
+             *
+             * XXX This isn't enough.  A downclick outside of
+             * XXX the interior of our freeglut windows should also
+             * XXX deactivate the menu.  This is more complicated.
+             */
+            fgDeactivateMenu( window->ActiveMenu->ParentWindow );
+
+        /*
+         * XXX Why does an active menu require a redisplay at
+         * XXX this point?  If this can come out cleanly, then
+         * XXX it probably should do so; if not, a comment should
+         * XXX explain it.
+         */
+        if( ! window->IsMenu )
+            window->State.Redisplay = GL_TRUE;
+
+        return GL_TRUE;
+    }
+
+    /* No active menu, let's check whether we need to activate one. */
+    if( ( 0 <= button ) &&
+        ( FREEGLUT_MAX_MENUS > button ) &&
+        ( window->Menu[ button ] ) &&
+        pressed )
+    {
+        /* XXX Posting a requisite Redisplay seems bogus. */
+        window->State.Redisplay = GL_TRUE;
+        fghActivateMenu( window, button );
+        return GL_TRUE;
+    }
+
+    return GL_FALSE;
+}
+
+/*
+ * Deactivates a menu pointed by the function argument.
+ */
+void fgDeactivateMenu( SFG_Window *window )
+{
+    SFG_Window *parent_window = NULL;
+
+    /* Check if there is an active menu attached to this window... */
+    SFG_Menu* menu = window->ActiveMenu;
+    SFG_MenuEntry *menuEntry;
+
+    /* Did we find an active window? */
+    freeglut_return_if_fail( menu );
+
+    parent_window = menu->ParentWindow;
+
+    /* Hide the present menu's window */
+    fgSetWindow( menu->Window );
+    glutHideWindow( );
+
+    /* Forget about having that menu active anymore, now: */
+    menu->Window->ActiveMenu = NULL;
+    menu->ParentWindow->ActiveMenu = NULL;
+    fghSetMenuParentWindow ( NULL, menu );
+    menu->IsActive = GL_FALSE;
+    menu->ActiveEntry = NULL;
+
+    fgState.ActiveMenus--;
+
+    /* Hide all submenu windows, and the root menu's window. */
+    for ( menuEntry = ( SFG_MenuEntry * )menu->Entries.First;
+          menuEntry;
+          menuEntry = ( SFG_MenuEntry * )menuEntry->Node.Next )
+    {
+        menuEntry->IsActive = GL_FALSE;
+
+        /* Is that an active submenu by any case? */
+        if( menuEntry->SubMenu )
+            fghDeactivateSubMenu( menuEntry );
+    }
+
+    fgSetWindow ( parent_window ) ;
+}
+
+/*
+ * Recalculates current menu's box size
+ */
+void fghCalculateMenuBoxSize( void )
+{
+    SFG_MenuEntry* menuEntry;
+    int width = 0, height = 0;
+
+    /* Make sure there is a current menu set */
+    freeglut_return_if_fail( fgStructure.CurrentMenu );
+
+    /* The menu's box size depends on the menu entries: */
+    for( menuEntry = ( SFG_MenuEntry * )fgStructure.CurrentMenu->Entries.First;
+         menuEntry;
+         menuEntry = ( SFG_MenuEntry * )menuEntry->Node.Next )
+    {
+        /* Update the menu entry's width value */
+        menuEntry->Width = glutBitmapLength(
+            FREEGLUT_MENU_FONT,
+            (unsigned char *)menuEntry->Text
+        );
+
+        /*
+         * If the entry is a submenu, then it needs to be wider to
+         * accomodate the arrow. JCJ 31 July 2003
+         */
+        if (menuEntry->SubMenu )
+            menuEntry->Width += glutBitmapLength(
+                FREEGLUT_MENU_FONT,
+                (unsigned char *)"_"
+            );
+
+        /* Check if it's the biggest we've found */
+        if( menuEntry->Width > width )
+            width = menuEntry->Width;
+
+        height += FREEGLUT_MENU_HEIGHT;
+    }
+
+    /* Store the menu's box size now: */
+    fgStructure.CurrentMenu->Height = height + 2 * FREEGLUT_MENU_BORDER;
+    fgStructure.CurrentMenu->Width  = width  + 4 * FREEGLUT_MENU_BORDER;
+}
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Creates a new menu object, adding it to the freeglut structure
+ */
+int FGAPIENTRY glutCreateMenu( void(* callback)( int ) )
+{
+    /* The menu object creation code resides in freeglut_structure.c */
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateMenu" );
+    return fgCreateMenu( callback )->ID;
+}
+
+/*
+ * Destroys a menu object, removing all references to it
+ */
+void FGAPIENTRY glutDestroyMenu( int menuID )
+{
+    SFG_Menu* menu;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDestroyMenu" );
+    menu = fgMenuByID( menuID );
+
+    freeglut_return_if_fail( menu );
+
+    /* The menu object destruction code resides in freeglut_structure.c */
+    fgDestroyMenu( menu );
+}
+
+/*
+ * Returns the ID number of the currently active menu
+ */
+int FGAPIENTRY glutGetMenu( void )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetMenu" );
+
+    if( fgStructure.CurrentMenu )
+        return fgStructure.CurrentMenu->ID;
+
+    return 0;
+}
+
+/*
+ * Sets the current menu given its menu ID
+ */
+void FGAPIENTRY glutSetMenu( int menuID )
+{
+    SFG_Menu* menu;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetMenu" );
+    menu = fgMenuByID( menuID );
+
+    freeglut_return_if_fail( menu );
+
+    fgStructure.CurrentMenu = menu;
+}
+
+/*
+ * Adds a menu entry to the bottom of the current menu
+ */
+void FGAPIENTRY glutAddMenuEntry( const char* label, int value )
+{
+    SFG_MenuEntry* menuEntry;
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutAddMenuEntry" );
+    menuEntry = (SFG_MenuEntry *)calloc( sizeof(SFG_MenuEntry), 1 );
+    freeglut_return_if_fail( fgStructure.CurrentMenu );
+
+    menuEntry->Text = strdup( label );
+    menuEntry->ID   = value;
+
+    /* Have the new menu entry attached to the current menu */
+    fgListAppend( &fgStructure.CurrentMenu->Entries, &menuEntry->Node );
+
+    fghCalculateMenuBoxSize( );
+}
+
+/*
+ * Add a sub menu to the bottom of the current menu
+ */
+void FGAPIENTRY glutAddSubMenu( const char *label, int subMenuID )
+{
+    SFG_MenuEntry *menuEntry;
+    SFG_Menu *subMenu;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutAddSubMenu" );
+    menuEntry = ( SFG_MenuEntry * )calloc( sizeof( SFG_MenuEntry ), 1 );
+    subMenu = fgMenuByID( subMenuID );
+
+    freeglut_return_if_fail( fgStructure.CurrentMenu );
+    freeglut_return_if_fail( subMenu );
+
+    menuEntry->Text    = strdup( label );
+    menuEntry->SubMenu = subMenu;
+    menuEntry->ID      = -1;
+
+    fgListAppend( &fgStructure.CurrentMenu->Entries, &menuEntry->Node );
+    fghCalculateMenuBoxSize( );
+}
+
+/*
+ * Changes the specified menu item in the current menu into a menu entry
+ */
+void FGAPIENTRY glutChangeToMenuEntry( int item, const char* label, int value )
+{
+    SFG_MenuEntry* menuEntry = NULL;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutChangeToMenuEntry" );
+    freeglut_return_if_fail( fgStructure.CurrentMenu );
+
+    /* Get n-th menu entry in the current menu, starting from one: */
+    menuEntry = fghFindMenuEntry( fgStructure.CurrentMenu, item );
+
+    freeglut_return_if_fail( menuEntry );
+
+    /* We want it to become a normal menu entry, so: */
+    if( menuEntry->Text )
+        free( menuEntry->Text );
+
+    menuEntry->Text    = strdup( label );
+    menuEntry->ID      = value;
+    menuEntry->SubMenu = NULL;
+    fghCalculateMenuBoxSize( );
+}
+
+/*
+ * Changes the specified menu item in the current menu into a sub-menu trigger.
+ */
+void FGAPIENTRY glutChangeToSubMenu( int item, const char* label,
+                                     int subMenuID )
+{
+    SFG_Menu*      subMenu;
+    SFG_MenuEntry* menuEntry;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutChangeToSubMenu" );
+    subMenu = fgMenuByID( subMenuID );
+    menuEntry = NULL;
+
+    freeglut_return_if_fail( fgStructure.CurrentMenu );
+    freeglut_return_if_fail( subMenu );
+
+    /* Get n-th menu entry in the current menu, starting from one: */
+    menuEntry = fghFindMenuEntry( fgStructure.CurrentMenu, item );
+
+    freeglut_return_if_fail( menuEntry );
+
+    /* We want it to become a sub menu entry, so: */
+    if( menuEntry->Text )
+        free( menuEntry->Text );
+
+    menuEntry->Text    = strdup( label );
+    menuEntry->SubMenu = subMenu;
+    menuEntry->ID      = -1;
+    fghCalculateMenuBoxSize( );
+}
+
+/*
+ * Removes the specified menu item from the current menu
+ */
+void FGAPIENTRY glutRemoveMenuItem( int item )
+{
+    SFG_MenuEntry* menuEntry;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutRemoveMenuItem" );
+    freeglut_return_if_fail( fgStructure.CurrentMenu );
+
+    /* Get n-th menu entry in the current menu, starting from one: */
+    menuEntry = fghFindMenuEntry( fgStructure.CurrentMenu, item );
+
+    freeglut_return_if_fail( menuEntry );
+
+    fgListRemove( &fgStructure.CurrentMenu->Entries, &menuEntry->Node );
+    if ( menuEntry->Text )
+      free( menuEntry->Text );
+
+    free( menuEntry );
+    fghCalculateMenuBoxSize( );
+}
+
+/*
+ * Attaches a menu to the current window
+ */
+void FGAPIENTRY glutAttachMenu( int button )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutAttachMenu" );
+
+    freeglut_return_if_fail( fgStructure.CurrentWindow );
+    freeglut_return_if_fail( fgStructure.CurrentMenu );
+
+    freeglut_return_if_fail( button >= 0 );
+    freeglut_return_if_fail( button < FREEGLUT_MAX_MENUS );
+
+    fgStructure.CurrentWindow->Menu[ button ] = fgStructure.CurrentMenu;
+}
+
+/*
+ * Detaches a menu from the current window
+ */
+void FGAPIENTRY glutDetachMenu( int button )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDetachMenu" );
+
+    freeglut_return_if_fail( fgStructure.CurrentWindow );
+    freeglut_return_if_fail( fgStructure.CurrentMenu );
+
+    freeglut_return_if_fail( button >= 0 );
+    freeglut_return_if_fail( button < FREEGLUT_MAX_MENUS );
+
+    fgStructure.CurrentWindow->Menu[ button ] = NULL;
+}
+
+/*
+ * A.Donev: Set and retrieve the menu's user data
+ */
+void* FGAPIENTRY glutGetMenuData( void )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetMenuData" );
+    return fgStructure.CurrentMenu->UserData;
+}
+
+void FGAPIENTRY glutSetMenuData(void* data)
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetMenuData" );
+    fgStructure.CurrentMenu->UserData=data;
+}
+
+/*** END OF FILE ***/
index 823dcc1..4aa809a 100644 (file)
-/*\r
- * freeglut_misc.c\r
- *\r
- * Functions that didn't fit anywhere else...\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Thu Dec 9 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-/*\r
- * TODO BEFORE THE STABLE RELEASE:\r
- *\r
- *  glutSetColor()     --\r
- *  glutGetColor()     --\r
- *  glutCopyColormap() --\r
- *  glutSetKeyRepeat() -- this is evil and should be removed from API\r
- */\r
-\r
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */\r
-\r
-/*\r
- * This functions checks if an OpenGL extension is supported or not\r
- *\r
- * XXX Wouldn't this be simpler and clearer if we used strtok()?\r
- */\r
-int FGAPIENTRY glutExtensionSupported( const char* extension )\r
-{\r
-  const char *extensions, *start;\r
-  const size_t len = strlen( extension );\r
-\r
-  /* Make sure there is a current window, and thus a current context available */\r
-  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutExtensionSupported" );\r
-  freeglut_return_val_if_fail( fgStructure.CurrentWindow != NULL, 0 );\r
-\r
-  if (strchr(extension, ' '))\r
-    return 0;\r
-  start = extensions = (const char *) glGetString(GL_EXTENSIONS);\r
-\r
-  /* XXX consider printing a warning to stderr that there's no current\r
-   * rendering context.\r
-   */\r
-  freeglut_return_val_if_fail( extensions != NULL, 0 );\r
-\r
-  while (1) {\r
-     const char *p = strstr(extensions, extension);\r
-     if (!p)\r
-        return 0;  /* not found */\r
-     /* check that the match isn't a super string */\r
-     if ((p == start || p[-1] == ' ') && (p[len] == ' ' || p[len] == 0))\r
-        return 1;\r
-     /* skip the false match and continue */\r
-     extensions = p + len;\r
-  }\r
-\r
-  return 0 ;\r
-}\r
-\r
-#ifndef GL_INVALID_FRAMEBUFFER_OPERATION\r
-#ifdef GL_INVALID_FRAMEBUFFER_OPERATION_EXT\r
-#define GL_INVALID_FRAMEBUFFER_OPERATION GL_INVALID_FRAMEBUFFER_OPERATION_EXT\r
-#else\r
-#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506\r
-#endif\r
-#endif\r
-\r
-#ifndef GL_TABLE_TOO_LARGE\r
-#ifdef GL_TABLE_TOO_LARGE_EXT\r
-#define GL_TABLE_TOO_LARGE GL_TABLE_TOO_LARGE_EXT\r
-#else\r
-#define GL_TABLE_TOO_LARGE 0x8031\r
-#endif\r
-#endif\r
-\r
-#ifndef GL_TEXTURE_TOO_LARGE\r
-#ifdef GL_TEXTURE_TOO_LARGE_EXT\r
-#define GL_TEXTURE_TOO_LARGE GL_TEXTURE_TOO_LARGE_EXT\r
-#else\r
-#define GL_TEXTURE_TOO_LARGE 0x8065\r
-#endif\r
-#endif\r
-\r
-/*\r
- * A cut-down local version of gluErrorString to avoid depending on GLU.\r
- */\r
-static const char* fghErrorString( GLenum error )\r
-{\r
-  switch ( error ) {\r
-  case GL_INVALID_ENUM: return "invalid enumerant";\r
-  case GL_INVALID_VALUE: return "invalid value";\r
-  case GL_INVALID_OPERATION: return "invalid operation";\r
-  case GL_STACK_OVERFLOW: return "stack overflow";\r
-  case GL_STACK_UNDERFLOW: return "stack underflow";\r
-  case GL_OUT_OF_MEMORY: return "out of memory";\r
-  case GL_TABLE_TOO_LARGE: return "table too large";\r
-  case GL_INVALID_FRAMEBUFFER_OPERATION: return "invalid framebuffer operation";\r
-  case GL_TEXTURE_TOO_LARGE: return "texture too large";\r
-  default: return "unknown GL error";\r
-  }\r
-}\r
-\r
-/*\r
- * This function reports all the OpenGL errors that happened till now\r
- */\r
-void FGAPIENTRY glutReportErrors( void )\r
-{\r
-    GLenum error;\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutReportErrors" );\r
-    while( ( error = glGetError() ) != GL_NO_ERROR )\r
-        fgWarning( "GL error: %s", fghErrorString( error ) );\r
-}\r
-\r
-/*\r
- * Control the auto-repeat of keystrokes to the current window\r
- */\r
-void FGAPIENTRY glutIgnoreKeyRepeat( int ignore )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutIgnoreKeyRepeat" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutIgnoreKeyRepeat" );\r
-\r
-    fgStructure.CurrentWindow->State.IgnoreKeyRepeat = ignore ? GL_TRUE : GL_FALSE;\r
-}\r
-\r
-/*\r
- * Set global auto-repeat of keystrokes\r
- *\r
- * RepeatMode should be either:\r
- *    GLUT_KEY_REPEAT_OFF\r
- *    GLUT_KEY_REPEAT_ON\r
- *    GLUT_KEY_REPEAT_DEFAULT\r
- */\r
-void FGAPIENTRY glutSetKeyRepeat( int repeatMode )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetKeyRepeat" );\r
-\r
-    switch( repeatMode )\r
-    {\r
-    case GLUT_KEY_REPEAT_OFF:\r
-    case GLUT_KEY_REPEAT_ON:\r
-     fgState.KeyRepeat = repeatMode;\r
-     break;\r
-\r
-    case GLUT_KEY_REPEAT_DEFAULT:\r
-     fgState.KeyRepeat = GLUT_KEY_REPEAT_ON;\r
-     break;\r
-\r
-    default:\r
-        fgError ("Invalid glutSetKeyRepeat mode: %d", repeatMode);\r
-        break;\r
-    }\r
-}\r
-\r
-/*\r
- * Forces the joystick callback to be executed\r
- */\r
-void FGAPIENTRY glutForceJoystickFunc( void )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutForceJoystickFunc" );\r
-#if !defined(_WIN32_WCE)\r
-    freeglut_return_if_fail( fgStructure.CurrentWindow != NULL );\r
-    freeglut_return_if_fail( FETCH_WCB( *( fgStructure.CurrentWindow ), Joystick ) );\r
-    fgJoystickPollWindow( fgStructure.CurrentWindow );\r
-#endif /* !defined(_WIN32_WCE) */\r
-}\r
-\r
-/*\r
- *\r
- */\r
-void FGAPIENTRY glutSetColor( int nColor, GLfloat red, GLfloat green, GLfloat blue )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetColor" );\r
-    /* We really need to do something here. */\r
-}\r
-\r
-/*\r
- *\r
- */\r
-GLfloat FGAPIENTRY glutGetColor( int color, int component )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetColor" );\r
-    /* We really need to do something here. */\r
-    return( 0.0f );\r
-}\r
-\r
-/*\r
- *\r
- */\r
-void FGAPIENTRY glutCopyColormap( int window )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCopyColormap" );\r
-    /* We really need to do something here. */\r
-}\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_misc.c
+ *
+ * Functions that didn't fit anywhere else...
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Thu Dec 9 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ *
+ *  glutSetColor()     --
+ *  glutGetColor()     --
+ *  glutCopyColormap() --
+ *  glutSetKeyRepeat() -- this is evil and should be removed from API
+ */
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * This functions checks if an OpenGL extension is supported or not
+ *
+ * XXX Wouldn't this be simpler and clearer if we used strtok()?
+ */
+int FGAPIENTRY glutExtensionSupported( const char* extension )
+{
+  const char *extensions, *start;
+  const size_t len = strlen( extension );
+
+  /* Make sure there is a current window, and thus a current context available */
+  FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutExtensionSupported" );
+  freeglut_return_val_if_fail( fgStructure.CurrentWindow != NULL, 0 );
+
+  if (strchr(extension, ' '))
+    return 0;
+  start = extensions = (const char *) glGetString(GL_EXTENSIONS);
+
+  /* XXX consider printing a warning to stderr that there's no current
+   * rendering context.
+   */
+  freeglut_return_val_if_fail( extensions != NULL, 0 );
+
+  while (1) {
+     const char *p = strstr(extensions, extension);
+     if (!p)
+        return 0;  /* not found */
+     /* check that the match isn't a super string */
+     if ((p == start || p[-1] == ' ') && (p[len] == ' ' || p[len] == 0))
+        return 1;
+     /* skip the false match and continue */
+     extensions = p + len;
+  }
+
+  return 0 ;
+}
+
+#ifndef GL_INVALID_FRAMEBUFFER_OPERATION
+#ifdef GL_INVALID_FRAMEBUFFER_OPERATION_EXT
+#define GL_INVALID_FRAMEBUFFER_OPERATION GL_INVALID_FRAMEBUFFER_OPERATION_EXT
+#else
+#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
+#endif
+#endif
+
+#ifndef GL_TABLE_TOO_LARGE
+#ifdef GL_TABLE_TOO_LARGE_EXT
+#define GL_TABLE_TOO_LARGE GL_TABLE_TOO_LARGE_EXT
+#else
+#define GL_TABLE_TOO_LARGE 0x8031
+#endif
+#endif
+
+#ifndef GL_TEXTURE_TOO_LARGE
+#ifdef GL_TEXTURE_TOO_LARGE_EXT
+#define GL_TEXTURE_TOO_LARGE GL_TEXTURE_TOO_LARGE_EXT
+#else
+#define GL_TEXTURE_TOO_LARGE 0x8065
+#endif
+#endif
+
+/*
+ * A cut-down local version of gluErrorString to avoid depending on GLU.
+ */
+static const char* fghErrorString( GLenum error )
+{
+  switch ( error ) {
+  case GL_INVALID_ENUM: return "invalid enumerant";
+  case GL_INVALID_VALUE: return "invalid value";
+  case GL_INVALID_OPERATION: return "invalid operation";
+  case GL_STACK_OVERFLOW: return "stack overflow";
+  case GL_STACK_UNDERFLOW: return "stack underflow";
+  case GL_OUT_OF_MEMORY: return "out of memory";
+  case GL_TABLE_TOO_LARGE: return "table too large";
+  case GL_INVALID_FRAMEBUFFER_OPERATION: return "invalid framebuffer operation";
+  case GL_TEXTURE_TOO_LARGE: return "texture too large";
+  default: return "unknown GL error";
+  }
+}
+
+/*
+ * This function reports all the OpenGL errors that happened till now
+ */
+void FGAPIENTRY glutReportErrors( void )
+{
+    GLenum error;
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutReportErrors" );
+    while( ( error = glGetError() ) != GL_NO_ERROR )
+        fgWarning( "GL error: %s", fghErrorString( error ) );
+}
+
+/*
+ * Control the auto-repeat of keystrokes to the current window
+ */
+void FGAPIENTRY glutIgnoreKeyRepeat( int ignore )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutIgnoreKeyRepeat" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutIgnoreKeyRepeat" );
+
+    fgStructure.CurrentWindow->State.IgnoreKeyRepeat = ignore ? GL_TRUE : GL_FALSE;
+}
+
+/*
+ * Set global auto-repeat of keystrokes
+ *
+ * RepeatMode should be either:
+ *    GLUT_KEY_REPEAT_OFF
+ *    GLUT_KEY_REPEAT_ON
+ *    GLUT_KEY_REPEAT_DEFAULT
+ */
+void FGAPIENTRY glutSetKeyRepeat( int repeatMode )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetKeyRepeat" );
+
+    switch( repeatMode )
+    {
+    case GLUT_KEY_REPEAT_OFF:
+    case GLUT_KEY_REPEAT_ON:
+     fgState.KeyRepeat = repeatMode;
+     break;
+
+    case GLUT_KEY_REPEAT_DEFAULT:
+     fgState.KeyRepeat = GLUT_KEY_REPEAT_ON;
+     break;
+
+    default:
+        fgError ("Invalid glutSetKeyRepeat mode: %d", repeatMode);
+        break;
+    }
+}
+
+/*
+ * Forces the joystick callback to be executed
+ */
+void FGAPIENTRY glutForceJoystickFunc( void )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutForceJoystickFunc" );
+#if !defined(_WIN32_WCE)
+    freeglut_return_if_fail( fgStructure.CurrentWindow != NULL );
+    freeglut_return_if_fail( FETCH_WCB( *( fgStructure.CurrentWindow ), Joystick ) );
+    fgJoystickPollWindow( fgStructure.CurrentWindow );
+#endif /* !defined(_WIN32_WCE) */
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutSetColor( int nColor, GLfloat red, GLfloat green, GLfloat blue )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetColor" );
+    /* We really need to do something here. */
+}
+
+/*
+ *
+ */
+GLfloat FGAPIENTRY glutGetColor( int color, int component )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetColor" );
+    /* We really need to do something here. */
+    return( 0.0f );
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutCopyColormap( int window )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCopyColormap" );
+    /* We really need to do something here. */
+}
+
+/*** END OF FILE ***/
index 8b15245..2a1314a 100644 (file)
@@ -1,45 +1,45 @@
-/*\r
- * freeglut_overlay.c\r
- *\r
- * Overlay management functions (as defined by GLUT API)\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Thu Dec 16 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-/*\r
- * NOTE: functions declared in this file probably will not be implemented.\r
- */\r
-\r
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */\r
-\r
-void FGAPIENTRY glutEstablishOverlay( void )             { /* Not implemented */ }\r
-void FGAPIENTRY glutRemoveOverlay( void )                { /* Not implemented */ }\r
-void FGAPIENTRY glutUseLayer( GLenum layer )             { /* Not implemented */ }\r
-void FGAPIENTRY glutPostOverlayRedisplay( void )         { /* Not implemented */ }\r
-void FGAPIENTRY glutPostWindowOverlayRedisplay( int ID ) { /* Not implemented */ }\r
-void FGAPIENTRY glutShowOverlay( void )                  { /* Not implemented */ }\r
-void FGAPIENTRY glutHideOverlay( void )                  { /* Not implemented */ }\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_overlay.c
+ *
+ * Overlay management functions (as defined by GLUT API)
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Thu Dec 16 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+/*
+ * NOTE: functions declared in this file probably will not be implemented.
+ */
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+void FGAPIENTRY glutEstablishOverlay( void )             { /* Not implemented */ }
+void FGAPIENTRY glutRemoveOverlay( void )                { /* Not implemented */ }
+void FGAPIENTRY glutUseLayer( GLenum layer )             { /* Not implemented */ }
+void FGAPIENTRY glutPostOverlayRedisplay( void )         { /* Not implemented */ }
+void FGAPIENTRY glutPostWindowOverlayRedisplay( int ID ) { /* Not implemented */ }
+void FGAPIENTRY glutShowOverlay( void )                  { /* Not implemented */ }
+void FGAPIENTRY glutHideOverlay( void )                  { /* Not implemented */ }
+
+/*** END OF FILE ***/
index 6f8feba..231531d 100644 (file)
@@ -1,76 +1,76 @@
-/* Spaceball support for Linux.\r
- * Written by John Tsiombikas <nuclear@member.fsf.org>\r
- *\r
- * This code supports 3Dconnexion's 6-dof space-whatever devices.\r
- * It can communicate with either the proprietary 3Dconnexion daemon (3dxsrv)\r
- * free spacenavd (http://spacenav.sourceforge.net), through the "standard"\r
- * magellan X-based protocol.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-/* -- PRIVATE FUNCTIONS --------------------------------------------------- */\r
-\r
-extern void fgPlatformInitializeSpaceball(void);\r
-extern void fgPlatformSpaceballClose(void);\r
-extern int fgPlatformHasSpaceball(void);\r
-extern int fgPlatformSpaceballNumButtons(void);\r
-extern void fgPlatformSpaceballSetWindow(SFG_Window *window);\r
-\r
-\r
-int sball_initialized = 0;\r
-\r
-void fgInitialiseSpaceball(void)\r
-{\r
-    if(sball_initialized != 0) {\r
-        return;\r
-    }\r
-\r
-    fgPlatformInitializeSpaceball();\r
-\r
-    sball_initialized = 1;\r
-}\r
-\r
-void fgSpaceballClose(void)\r
-{\r
-       fgPlatformSpaceballClose();}\r
-\r
-int fgHasSpaceball(void)\r
-{\r
-    if(sball_initialized == 0) {\r
-        fgInitialiseSpaceball();\r
-        if(sball_initialized != 1) {\r
-            fgWarning("fgInitialiseSpaceball failed\n");\r
-            return 0;\r
-        }\r
-    }\r
-\r
-    return fgPlatformHasSpaceball();\r
-}\r
-\r
-int fgSpaceballNumButtons(void)\r
-{\r
-    if(sball_initialized == 0) {\r
-        fgInitialiseSpaceball();\r
-        if(sball_initialized != 1) {\r
-            fgWarning("fgInitialiseSpaceball failed\n");\r
-            return 0;\r
-        }\r
-    }\r
-\r
-    return fgPlatformSpaceballNumButtons();\r
-}\r
-\r
-void fgSpaceballSetWindow(SFG_Window *window)\r
-{\r
-    if(sball_initialized == 0) {\r
-        fgInitialiseSpaceball();\r
-        if(sball_initialized != 1) {\r
-            return;\r
-        }\r
-    }\r
-\r
-    fgPlatformSpaceballSetWindow(window);\r
-}\r
-\r
+/* Spaceball support for Linux.
+ * Written by John Tsiombikas <nuclear@member.fsf.org>
+ *
+ * This code supports 3Dconnexion's 6-dof space-whatever devices.
+ * It can communicate with either the proprietary 3Dconnexion daemon (3dxsrv)
+ * free spacenavd (http://spacenav.sourceforge.net), through the "standard"
+ * magellan X-based protocol.
+ */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+/* -- PRIVATE FUNCTIONS --------------------------------------------------- */
+
+extern void fgPlatformInitializeSpaceball(void);
+extern void fgPlatformSpaceballClose(void);
+extern int fgPlatformHasSpaceball(void);
+extern int fgPlatformSpaceballNumButtons(void);
+extern void fgPlatformSpaceballSetWindow(SFG_Window *window);
+
+
+int sball_initialized = 0;
+
+void fgInitialiseSpaceball(void)
+{
+    if(sball_initialized != 0) {
+        return;
+    }
+
+    fgPlatformInitializeSpaceball();
+
+    sball_initialized = 1;
+}
+
+void fgSpaceballClose(void)
+{
+       fgPlatformSpaceballClose();}
+
+int fgHasSpaceball(void)
+{
+    if(sball_initialized == 0) {
+        fgInitialiseSpaceball();
+        if(sball_initialized != 1) {
+            fgWarning("fgInitialiseSpaceball failed\n");
+            return 0;
+        }
+    }
+
+    return fgPlatformHasSpaceball();
+}
+
+int fgSpaceballNumButtons(void)
+{
+    if(sball_initialized == 0) {
+        fgInitialiseSpaceball();
+        if(sball_initialized != 1) {
+            fgWarning("fgInitialiseSpaceball failed\n");
+            return 0;
+        }
+    }
+
+    return fgPlatformSpaceballNumButtons();
+}
+
+void fgSpaceballSetWindow(SFG_Window *window)
+{
+    if(sball_initialized == 0) {
+        fgInitialiseSpaceball();
+        if(sball_initialized != 1) {
+            return;
+        }
+    }
+
+    fgPlatformSpaceballSetWindow(window);
+}
+
index 7001582..b134660 100644 (file)
-/*\r
- * freeglut_state.c\r
- *\r
- * Freeglut state query methods.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Thu Dec 16 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-/*\r
- * TODO BEFORE THE STABLE RELEASE:\r
- *\r
- *  glutGet()               -- X11 tests passed, but check if all enums\r
- *                             handled (what about Win32?)\r
- *  glutDeviceGet()         -- X11 tests passed, but check if all enums\r
- *                             handled (what about Win32?)\r
- *  glutGetModifiers()      -- OK, but could also remove the limitation\r
- *  glutLayerGet()          -- what about GLUT_NORMAL_DAMAGED?\r
- *\r
- * The fail-on-call policy will help adding the most needed things imho.\r
- */\r
-\r
-extern int fgPlatformGlutGet ( GLenum eWhat );\r
-extern int fgPlatformGlutDeviceGet ( GLenum eWhat );\r
-extern int fgPlatformGlutLayerGet ( GLenum eWhat );\r
-extern int *fgPlatformGlutGetModeValues(GLenum eWhat, int *size);\r
-\r
-\r
-/* -- LOCAL DEFINITIONS ---------------------------------------------------- */\r
-\r
-/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */\r
-\r
-\r
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */\r
-\r
-/*\r
- * General settings assignment method\r
- */\r
-void FGAPIENTRY glutSetOption( GLenum eWhat, int value )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetOption" );\r
-\r
-    /*\r
-     * XXX In chronological code add order.  (WHY in that order?)\r
-     */\r
-    switch( eWhat )\r
-    {\r
-    case GLUT_INIT_WINDOW_X:\r
-        fgState.Position.X = (GLint)value;\r
-        break;\r
-\r
-    case GLUT_INIT_WINDOW_Y:\r
-        fgState.Position.Y = (GLint)value;\r
-        break;\r
-\r
-    case GLUT_INIT_WINDOW_WIDTH:\r
-        fgState.Size.X = (GLint)value;\r
-        break;\r
-\r
-    case GLUT_INIT_WINDOW_HEIGHT:\r
-        fgState.Size.Y = (GLint)value;\r
-        break;\r
-\r
-    case GLUT_INIT_DISPLAY_MODE:\r
-        fgState.DisplayMode = (unsigned int)value;\r
-        break;\r
-\r
-    case GLUT_ACTION_ON_WINDOW_CLOSE:\r
-        fgState.ActionOnWindowClose = value;\r
-        break;\r
-\r
-    case GLUT_RENDERING_CONTEXT:\r
-        fgState.UseCurrentContext =\r
-            ( value == GLUT_USE_CURRENT_CONTEXT ) ? GL_TRUE : GL_FALSE;\r
-        break;\r
-\r
-    case GLUT_DIRECT_RENDERING:\r
-        fgState.DirectContext = value;\r
-        break;\r
-\r
-    case GLUT_WINDOW_CURSOR:\r
-        if( fgStructure.CurrentWindow != NULL )\r
-            fgStructure.CurrentWindow->State.Cursor = value;\r
-        break;\r
-\r
-    case GLUT_AUX:\r
-      fgState.AuxiliaryBufferNumber = value;\r
-      break;\r
-\r
-    case GLUT_MULTISAMPLE:\r
-      fgState.SampleNumber = value;\r
-      break;\r
-\r
-    default:\r
-        fgWarning( "glutSetOption(): missing enum handle %d", eWhat );\r
-        break;\r
-    }\r
-}\r
-\r
-/*\r
- * General settings query method\r
- */\r
-int FGAPIENTRY glutGet( GLenum eWhat )\r
-{\r
-    switch (eWhat)\r
-    {\r
-    case GLUT_INIT_STATE:\r
-        return fgState.Initialised;\r
-\r
-    case GLUT_ELAPSED_TIME:\r
-        return fgElapsedTime();\r
-    }\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGet" );\r
-\r
-    /* XXX In chronological code add order.  (WHY in that order?) */\r
-    switch( eWhat )\r
-    {\r
-    /* Following values are stored in fgState and fgDisplay global structures */\r
-    case GLUT_SCREEN_WIDTH:         return fgDisplay.ScreenWidth   ;\r
-    case GLUT_SCREEN_HEIGHT:        return fgDisplay.ScreenHeight  ;\r
-    case GLUT_SCREEN_WIDTH_MM:      return fgDisplay.ScreenWidthMM ;\r
-    case GLUT_SCREEN_HEIGHT_MM:     return fgDisplay.ScreenHeightMM;\r
-    case GLUT_INIT_WINDOW_X:        return fgState.Position.Use ?\r
-                                           fgState.Position.X : -1 ;\r
-    case GLUT_INIT_WINDOW_Y:        return fgState.Position.Use ?\r
-                                           fgState.Position.Y : -1 ;\r
-    case GLUT_INIT_WINDOW_WIDTH:    return fgState.Size.Use ?\r
-                                           fgState.Size.X : -1     ;\r
-    case GLUT_INIT_WINDOW_HEIGHT:   return fgState.Size.Use ?\r
-                                           fgState.Size.Y : -1     ;\r
-    case GLUT_INIT_DISPLAY_MODE:    return fgState.DisplayMode     ;\r
-    case GLUT_INIT_MAJOR_VERSION:   return fgState.MajorVersion    ;\r
-    case GLUT_INIT_MINOR_VERSION:   return fgState.MinorVersion    ;\r
-    case GLUT_INIT_FLAGS:           return fgState.ContextFlags    ;\r
-    case GLUT_INIT_PROFILE:         return fgState.ContextProfile  ;\r
-\r
-    /* The window structure queries */\r
-    case GLUT_WINDOW_PARENT:\r
-        if( fgStructure.CurrentWindow         == NULL ) return 0;\r
-        if( fgStructure.CurrentWindow->Parent == NULL ) return 0;\r
-        return fgStructure.CurrentWindow->Parent->ID;\r
-\r
-    case GLUT_WINDOW_NUM_CHILDREN:\r
-        if( fgStructure.CurrentWindow == NULL )\r
-            return 0;\r
-        return fgListLength( &fgStructure.CurrentWindow->Children );\r
-\r
-    case GLUT_WINDOW_CURSOR:\r
-        if( fgStructure.CurrentWindow == NULL )\r
-            return 0;\r
-        return fgStructure.CurrentWindow->State.Cursor;\r
-\r
-    case GLUT_MENU_NUM_ITEMS:\r
-        if( fgStructure.CurrentMenu == NULL )\r
-            return 0;\r
-        return fgListLength( &fgStructure.CurrentMenu->Entries );\r
-\r
-    case GLUT_ACTION_ON_WINDOW_CLOSE:\r
-        return fgState.ActionOnWindowClose;\r
-\r
-    case GLUT_VERSION :\r
-        return VERSION_MAJOR * 10000 + VERSION_MINOR * 100 + VERSION_PATCH;\r
-\r
-    case GLUT_RENDERING_CONTEXT:\r
-        return fgState.UseCurrentContext ? GLUT_USE_CURRENT_CONTEXT\r
-                                         : GLUT_CREATE_NEW_CONTEXT;\r
-\r
-    case GLUT_DIRECT_RENDERING:\r
-        return fgState.DirectContext;\r
-\r
-    case GLUT_FULL_SCREEN:\r
-        return fgStructure.CurrentWindow->State.IsFullscreen;\r
-\r
-    case GLUT_AUX:\r
-      return fgState.AuxiliaryBufferNumber;\r
-\r
-    case GLUT_MULTISAMPLE:\r
-      return fgState.SampleNumber;\r
-\r
-    default:\r
-        return fgPlatformGlutGet ( eWhat );\r
-        break;\r
-    }\r
-    return -1;\r
-}\r
-\r
-/*\r
- * Returns various device information.\r
- */\r
-int FGAPIENTRY glutDeviceGet( GLenum eWhat )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDeviceGet" );\r
-\r
-    /* XXX WARNING: we are mostly lying in this function. */\r
-    switch( eWhat )\r
-    {\r
-    case GLUT_HAS_JOYSTICK:\r
-        return fgJoystickDetect ();\r
-\r
-    case GLUT_OWNS_JOYSTICK:\r
-        return fgState.JoysticksInitialised;\r
-\r
-    case GLUT_JOYSTICK_POLL_RATE:\r
-        return fgStructure.CurrentWindow ? fgStructure.CurrentWindow->State.JoystickPollRate : 0;\r
-\r
-    /* XXX The following two are only for Joystick 0 but this is an improvement */\r
-    case GLUT_JOYSTICK_BUTTONS:\r
-        return glutJoystickGetNumButtons ( 0 );\r
-\r
-    case GLUT_JOYSTICK_AXES:\r
-        return glutJoystickGetNumAxes ( 0 );\r
-\r
-    case GLUT_HAS_DIAL_AND_BUTTON_BOX:\r
-        return fgInputDeviceDetect ();\r
-\r
-    case GLUT_NUM_DIALS:\r
-        if ( fgState.InputDevsInitialised ) return 8;\r
-        return 0;\r
\r
-    case GLUT_NUM_BUTTON_BOX_BUTTONS:\r
-        return 0;\r
-\r
-    case GLUT_HAS_SPACEBALL:\r
-        return fgHasSpaceball();\r
-\r
-    case GLUT_HAS_TABLET:\r
-        return 0;\r
-\r
-    case GLUT_NUM_SPACEBALL_BUTTONS:\r
-        return fgSpaceballNumButtons();\r
-\r
-    case GLUT_NUM_TABLET_BUTTONS:\r
-        return 0;\r
-\r
-    case GLUT_DEVICE_IGNORE_KEY_REPEAT:\r
-        return fgStructure.CurrentWindow ? fgStructure.CurrentWindow->State.IgnoreKeyRepeat : 0;\r
-\r
-    case GLUT_DEVICE_KEY_REPEAT:\r
-        return fgState.KeyRepeat;\r
-\r
-    default:\r
-               return fgPlatformGlutDeviceGet ( eWhat );\r
-    }\r
-\r
-    /* And now -- the failure. */\r
-    return -1;\r
-}\r
-\r
-/*\r
- * This should return the current state of ALT, SHIFT and CTRL keys.\r
- */\r
-int FGAPIENTRY glutGetModifiers( void )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetModifiers" );\r
-    if( fgState.Modifiers == INVALID_MODIFIERS )\r
-    {\r
-        fgWarning( "glutGetModifiers() called outside an input callback" );\r
-        return 0;\r
-    }\r
-\r
-    return fgState.Modifiers;\r
-}\r
-\r
-/*\r
- * Return the state of the GLUT API overlay subsystem. A misery ;-)\r
- */\r
-int FGAPIENTRY glutLayerGet( GLenum eWhat )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutLayerGet" );\r
-\r
-    /*\r
-     * This is easy as layers are not implemented ;-)\r
-     *\r
-     * XXX Can we merge the UNIX/X11 and WIN32 sections?  Or\r
-     * XXX is overlay support planned?\r
-     */\r
-    switch( eWhat )\r
-    {\r
-\r
-    default:\r
-        return fgPlatformGlutLayerGet( eWhat );\r
-    }\r
-\r
-    /* And fail. That's good. Programs do love failing. */\r
-    return -1;\r
-}\r
-\r
-int * FGAPIENTRY glutGetModeValues(GLenum eWhat, int *size)\r
-{\r
-  int *array;\r
-\r
-  FREEGLUT_EXIT_IF_NOT_INITIALISED("glutGetModeValues");\r
-\r
-  *size = 0;\r
-  array = fgPlatformGlutGetModeValues ( eWhat, size );\r
-\r
-  return array;\r
-}\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_state.c
+ *
+ * Freeglut state query methods.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Thu Dec 16 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ *
+ *  glutGet()               -- X11 tests passed, but check if all enums
+ *                             handled (what about Win32?)
+ *  glutDeviceGet()         -- X11 tests passed, but check if all enums
+ *                             handled (what about Win32?)
+ *  glutGetModifiers()      -- OK, but could also remove the limitation
+ *  glutLayerGet()          -- what about GLUT_NORMAL_DAMAGED?
+ *
+ * The fail-on-call policy will help adding the most needed things imho.
+ */
+
+extern int fgPlatformGlutGet ( GLenum eWhat );
+extern int fgPlatformGlutDeviceGet ( GLenum eWhat );
+extern int fgPlatformGlutLayerGet ( GLenum eWhat );
+extern int *fgPlatformGlutGetModeValues(GLenum eWhat, int *size);
+
+
+/* -- LOCAL DEFINITIONS ---------------------------------------------------- */
+
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * General settings assignment method
+ */
+void FGAPIENTRY glutSetOption( GLenum eWhat, int value )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetOption" );
+
+    /*
+     * XXX In chronological code add order.  (WHY in that order?)
+     */
+    switch( eWhat )
+    {
+    case GLUT_INIT_WINDOW_X:
+        fgState.Position.X = (GLint)value;
+        break;
+
+    case GLUT_INIT_WINDOW_Y:
+        fgState.Position.Y = (GLint)value;
+        break;
+
+    case GLUT_INIT_WINDOW_WIDTH:
+        fgState.Size.X = (GLint)value;
+        break;
+
+    case GLUT_INIT_WINDOW_HEIGHT:
+        fgState.Size.Y = (GLint)value;
+        break;
+
+    case GLUT_INIT_DISPLAY_MODE:
+        fgState.DisplayMode = (unsigned int)value;
+        break;
+
+    case GLUT_ACTION_ON_WINDOW_CLOSE:
+        fgState.ActionOnWindowClose = value;
+        break;
+
+    case GLUT_RENDERING_CONTEXT:
+        fgState.UseCurrentContext =
+            ( value == GLUT_USE_CURRENT_CONTEXT ) ? GL_TRUE : GL_FALSE;
+        break;
+
+    case GLUT_DIRECT_RENDERING:
+        fgState.DirectContext = value;
+        break;
+
+    case GLUT_WINDOW_CURSOR:
+        if( fgStructure.CurrentWindow != NULL )
+            fgStructure.CurrentWindow->State.Cursor = value;
+        break;
+
+    case GLUT_AUX:
+      fgState.AuxiliaryBufferNumber = value;
+      break;
+
+    case GLUT_MULTISAMPLE:
+      fgState.SampleNumber = value;
+      break;
+
+    default:
+        fgWarning( "glutSetOption(): missing enum handle %d", eWhat );
+        break;
+    }
+}
+
+/*
+ * General settings query method
+ */
+int FGAPIENTRY glutGet( GLenum eWhat )
+{
+    switch (eWhat)
+    {
+    case GLUT_INIT_STATE:
+        return fgState.Initialised;
+
+    case GLUT_ELAPSED_TIME:
+        return fgElapsedTime();
+    }
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGet" );
+
+    /* XXX In chronological code add order.  (WHY in that order?) */
+    switch( eWhat )
+    {
+    /* Following values are stored in fgState and fgDisplay global structures */
+    case GLUT_SCREEN_WIDTH:         return fgDisplay.ScreenWidth   ;
+    case GLUT_SCREEN_HEIGHT:        return fgDisplay.ScreenHeight  ;
+    case GLUT_SCREEN_WIDTH_MM:      return fgDisplay.ScreenWidthMM ;
+    case GLUT_SCREEN_HEIGHT_MM:     return fgDisplay.ScreenHeightMM;
+    case GLUT_INIT_WINDOW_X:        return fgState.Position.Use ?
+                                           fgState.Position.X : -1 ;
+    case GLUT_INIT_WINDOW_Y:        return fgState.Position.Use ?
+                                           fgState.Position.Y : -1 ;
+    case GLUT_INIT_WINDOW_WIDTH:    return fgState.Size.Use ?
+                                           fgState.Size.X : -1     ;
+    case GLUT_INIT_WINDOW_HEIGHT:   return fgState.Size.Use ?
+                                           fgState.Size.Y : -1     ;
+    case GLUT_INIT_DISPLAY_MODE:    return fgState.DisplayMode     ;
+    case GLUT_INIT_MAJOR_VERSION:   return fgState.MajorVersion    ;
+    case GLUT_INIT_MINOR_VERSION:   return fgState.MinorVersion    ;
+    case GLUT_INIT_FLAGS:           return fgState.ContextFlags    ;
+    case GLUT_INIT_PROFILE:         return fgState.ContextProfile  ;
+
+    /* The window structure queries */
+    case GLUT_WINDOW_PARENT:
+        if( fgStructure.CurrentWindow         == NULL ) return 0;
+        if( fgStructure.CurrentWindow->Parent == NULL ) return 0;
+        return fgStructure.CurrentWindow->Parent->ID;
+
+    case GLUT_WINDOW_NUM_CHILDREN:
+        if( fgStructure.CurrentWindow == NULL )
+            return 0;
+        return fgListLength( &fgStructure.CurrentWindow->Children );
+
+    case GLUT_WINDOW_CURSOR:
+        if( fgStructure.CurrentWindow == NULL )
+            return 0;
+        return fgStructure.CurrentWindow->State.Cursor;
+
+    case GLUT_MENU_NUM_ITEMS:
+        if( fgStructure.CurrentMenu == NULL )
+            return 0;
+        return fgListLength( &fgStructure.CurrentMenu->Entries );
+
+    case GLUT_ACTION_ON_WINDOW_CLOSE:
+        return fgState.ActionOnWindowClose;
+
+    case GLUT_VERSION :
+        return VERSION_MAJOR * 10000 + VERSION_MINOR * 100 + VERSION_PATCH;
+
+    case GLUT_RENDERING_CONTEXT:
+        return fgState.UseCurrentContext ? GLUT_USE_CURRENT_CONTEXT
+                                         : GLUT_CREATE_NEW_CONTEXT;
+
+    case GLUT_DIRECT_RENDERING:
+        return fgState.DirectContext;
+
+    case GLUT_FULL_SCREEN:
+        return fgStructure.CurrentWindow->State.IsFullscreen;
+
+    case GLUT_AUX:
+      return fgState.AuxiliaryBufferNumber;
+
+    case GLUT_MULTISAMPLE:
+      return fgState.SampleNumber;
+
+    default:
+        return fgPlatformGlutGet ( eWhat );
+        break;
+    }
+    return -1;
+}
+
+/*
+ * Returns various device information.
+ */
+int FGAPIENTRY glutDeviceGet( GLenum eWhat )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDeviceGet" );
+
+    /* XXX WARNING: we are mostly lying in this function. */
+    switch( eWhat )
+    {
+    case GLUT_HAS_JOYSTICK:
+        return fgJoystickDetect ();
+
+    case GLUT_OWNS_JOYSTICK:
+        return fgState.JoysticksInitialised;
+
+    case GLUT_JOYSTICK_POLL_RATE:
+        return fgStructure.CurrentWindow ? fgStructure.CurrentWindow->State.JoystickPollRate : 0;
+
+    /* XXX The following two are only for Joystick 0 but this is an improvement */
+    case GLUT_JOYSTICK_BUTTONS:
+        return glutJoystickGetNumButtons ( 0 );
+
+    case GLUT_JOYSTICK_AXES:
+        return glutJoystickGetNumAxes ( 0 );
+
+    case GLUT_HAS_DIAL_AND_BUTTON_BOX:
+        return fgInputDeviceDetect ();
+
+    case GLUT_NUM_DIALS:
+        if ( fgState.InputDevsInitialised ) return 8;
+        return 0;
+    case GLUT_NUM_BUTTON_BOX_BUTTONS:
+        return 0;
+
+    case GLUT_HAS_SPACEBALL:
+        return fgHasSpaceball();
+
+    case GLUT_HAS_TABLET:
+        return 0;
+
+    case GLUT_NUM_SPACEBALL_BUTTONS:
+        return fgSpaceballNumButtons();
+
+    case GLUT_NUM_TABLET_BUTTONS:
+        return 0;
+
+    case GLUT_DEVICE_IGNORE_KEY_REPEAT:
+        return fgStructure.CurrentWindow ? fgStructure.CurrentWindow->State.IgnoreKeyRepeat : 0;
+
+    case GLUT_DEVICE_KEY_REPEAT:
+        return fgState.KeyRepeat;
+
+    default:
+               return fgPlatformGlutDeviceGet ( eWhat );
+    }
+
+    /* And now -- the failure. */
+    return -1;
+}
+
+/*
+ * This should return the current state of ALT, SHIFT and CTRL keys.
+ */
+int FGAPIENTRY glutGetModifiers( void )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetModifiers" );
+    if( fgState.Modifiers == INVALID_MODIFIERS )
+    {
+        fgWarning( "glutGetModifiers() called outside an input callback" );
+        return 0;
+    }
+
+    return fgState.Modifiers;
+}
+
+/*
+ * Return the state of the GLUT API overlay subsystem. A misery ;-)
+ */
+int FGAPIENTRY glutLayerGet( GLenum eWhat )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutLayerGet" );
+
+    /*
+     * This is easy as layers are not implemented ;-)
+     *
+     * XXX Can we merge the UNIX/X11 and WIN32 sections?  Or
+     * XXX is overlay support planned?
+     */
+    switch( eWhat )
+    {
+
+    default:
+        return fgPlatformGlutLayerGet( eWhat );
+    }
+
+    /* And fail. That's good. Programs do love failing. */
+    return -1;
+}
+
+int * FGAPIENTRY glutGetModeValues(GLenum eWhat, int *size)
+{
+  int *array;
+
+  FREEGLUT_EXIT_IF_NOT_INITIALISED("glutGetModeValues");
+
+  *size = 0;
+  array = fgPlatformGlutGetModeValues ( eWhat, size );
+
+  return array;
+}
+
+/*** END OF FILE ***/
index f0bb6b1..ec86d56 100644 (file)
-/*\r
- * freeglut_stroke_mono_roman.c\r
- *\r
- * freeglut Monospace Roman stroke font definition\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Thu Dec 16 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-\r
-/* This file has been automatically generated by the genstroke utility. */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-/* char: 0x20 */\r
-\r
-static const SFG_StrokeStrip ch32st[] =\r
-{\r
-  { 0, NULL }\r
-};\r
-\r
-static const SFG_StrokeChar ch32 = {104.762f,0,ch32st};\r
-\r
-/* char: 0x21 */\r
-\r
-static const SFG_StrokeVertex ch33st0[] =\r
-{\r
- {52.381f,100.0f},\r
- {52.381f,33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch33st1[] =\r
-{\r
- {52.381f,9.5238f},\r
- {47.6191f,4.7619f},\r
- {52.381f,0.0f},\r
- {57.1429f,4.7619f},\r
- {52.381f,9.5238f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch33st[] =\r
-{\r
- {2,ch33st0},\r
- {5,ch33st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch33 = {104.762f,2,ch33st};\r
-\r
-/* char: 0x22 */\r
-\r
-static const SFG_StrokeVertex ch34st0[] =\r
-{\r
- {33.3334f,100.0f},\r
- {33.3334f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch34st1[] =\r
-{\r
- {71.4286f,100.0f},\r
- {71.4286f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch34st[] =\r
-{\r
- {2,ch34st0},\r
- {2,ch34st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch34 = {104.762f,2,ch34st};\r
-\r
-/* char: 0x23 */\r
-\r
-static const SFG_StrokeVertex ch35st0[] =\r
-{\r
- {54.7619f,119.048f},\r
- {21.4286f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch35st1[] =\r
-{\r
- {83.3334f,119.048f},\r
- {50.0f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch35st2[] =\r
-{\r
- {21.4286f,57.1429f},\r
- {88.0952f,57.1429f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch35st3[] =\r
-{\r
- {16.6667f,28.5714f},\r
- {83.3334f,28.5714f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch35st[] =\r
-{\r
- {2,ch35st0},\r
- {2,ch35st1},\r
- {2,ch35st2},\r
- {2,ch35st3}\r
-};\r
-\r
-static const SFG_StrokeChar ch35 = {104.762f,4,ch35st};\r
-\r
-/* char: 0x24 */\r
-\r
-static const SFG_StrokeVertex ch36st0[] =\r
-{\r
- {42.8571f,119.048f},\r
- {42.8571f,-19.0476f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch36st1[] =\r
-{\r
- {61.9047f,119.048f},\r
- {61.9047f,-19.0476f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch36st2[] =\r
-{\r
- {85.7143f,85.7143f},\r
- {76.1905f,95.2381f},\r
- {61.9047f,100.0f},\r
- {42.8571f,100.0f},\r
- {28.5714f,95.2381f},\r
- {19.0476f,85.7143f},\r
- {19.0476f,76.1905f},\r
- {23.8095f,66.6667f},\r
- {28.5714f,61.9048f},\r
- {38.0952f,57.1429f},\r
- {66.6666f,47.619f},\r
- {76.1905f,42.8571f},\r
- {80.9524f,38.0952f},\r
- {85.7143f,28.5714f},\r
- {85.7143f,14.2857f},\r
- {76.1905f,4.7619f},\r
- {61.9047f,0.0f},\r
- {42.8571f,0.0f},\r
- {28.5714f,4.7619f},\r
- {19.0476f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch36st[] =\r
-{\r
- {2,ch36st0},\r
- {2,ch36st1},\r
- {20,ch36st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch36 = {104.762f,3,ch36st};\r
-\r
-/* char: 0x25 */\r
-\r
-static const SFG_StrokeVertex ch37st0[] =\r
-{\r
- {95.2381f,100.0f},\r
- {9.5238f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch37st1[] =\r
-{\r
- {33.3333f,100.0f},\r
- {42.8571f,90.4762f},\r
- {42.8571f,80.9524f},\r
- {38.0952f,71.4286f},\r
- {28.5714f,66.6667f},\r
- {19.0476f,66.6667f},\r
- {9.5238f,76.1905f},\r
- {9.5238f,85.7143f},\r
- {14.2857f,95.2381f},\r
- {23.8095f,100.0f},\r
- {33.3333f,100.0f},\r
- {42.8571f,95.2381f},\r
- {57.1428f,90.4762f},\r
- {71.4286f,90.4762f},\r
- {85.7143f,95.2381f},\r
- {95.2381f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch37st2[] =\r
-{\r
- {76.1905f,33.3333f},\r
- {66.6667f,28.5714f},\r
- {61.9048f,19.0476f},\r
- {61.9048f,9.5238f},\r
- {71.4286f,0.0f},\r
- {80.9524f,0.0f},\r
- {90.4762f,4.7619f},\r
- {95.2381f,14.2857f},\r
- {95.2381f,23.8095f},\r
- {85.7143f,33.3333f},\r
- {76.1905f,33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch37st[] =\r
-{\r
- {2,ch37st0},\r
- {16,ch37st1},\r
- {11,ch37st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch37 = {104.762f,3,ch37st};\r
-\r
-/* char: 0x26 */\r
-\r
-static const SFG_StrokeVertex ch38st0[] =\r
-{\r
- {100.0f,57.1429f},\r
- {100.0f,61.9048f},\r
- {95.2381f,66.6667f},\r
- {90.4762f,66.6667f},\r
- {85.7143f,61.9048f},\r
- {80.9524f,52.381f},\r
- {71.4286f,28.5714f},\r
- {61.9048f,14.2857f},\r
- {52.3809f,4.7619f},\r
- {42.8571f,0.0f},\r
- {23.8095f,0.0f},\r
- {14.2857f,4.7619f},\r
- {9.5238f,9.5238f},\r
- {4.7619f,19.0476f},\r
- {4.7619f,28.5714f},\r
- {9.5238f,38.0952f},\r
- {14.2857f,42.8571f},\r
- {47.619f,61.9048f},\r
- {52.3809f,66.6667f},\r
- {57.1429f,76.1905f},\r
- {57.1429f,85.7143f},\r
- {52.3809f,95.2381f},\r
- {42.8571f,100.0f},\r
- {33.3333f,95.2381f},\r
- {28.5714f,85.7143f},\r
- {28.5714f,76.1905f},\r
- {33.3333f,61.9048f},\r
- {42.8571f,47.619f},\r
- {66.6667f,14.2857f},\r
- {76.1905f,4.7619f},\r
- {85.7143f,0.0f},\r
- {95.2381f,0.0f},\r
- {100.0f,4.7619f},\r
- {100.0f,9.5238f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch38st[] =\r
-{\r
- {34,ch38st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch38 = {104.762f,1,ch38st};\r
-\r
-/* char: 0x27 */\r
-\r
-static const SFG_StrokeVertex ch39st0[] =\r
-{\r
- {52.381f,100.0f},\r
- {52.381f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch39st[] =\r
-{\r
- {2,ch39st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch39 = {104.762f,1,ch39st};\r
-\r
-/* char: 0x28 */\r
-\r
-static const SFG_StrokeVertex ch40st0[] =\r
-{\r
- {69.0476f,119.048f},\r
- {59.5238f,109.524f},\r
- {50.0f,95.2381f},\r
- {40.4762f,76.1905f},\r
- {35.7143f,52.381f},\r
- {35.7143f,33.3333f},\r
- {40.4762f,9.5238f},\r
- {50.0f,-9.5238f},\r
- {59.5238f,-23.8095f},\r
- {69.0476f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch40st[] =\r
-{\r
- {10,ch40st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch40 = {104.762f,1,ch40st};\r
-\r
-/* char: 0x29 */\r
-\r
-static const SFG_StrokeVertex ch41st0[] =\r
-{\r
- {35.7143f,119.048f},\r
- {45.2381f,109.524f},\r
- {54.7619f,95.2381f},\r
- {64.2857f,76.1905f},\r
- {69.0476f,52.381f},\r
- {69.0476f,33.3333f},\r
- {64.2857f,9.5238f},\r
- {54.7619f,-9.5238f},\r
- {45.2381f,-23.8095f},\r
- {35.7143f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch41st[] =\r
-{\r
- {10,ch41st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch41 = {104.762f,1,ch41st};\r
-\r
-/* char: 0x2a */\r
-\r
-static const SFG_StrokeVertex ch42st0[] =\r
-{\r
- {52.381f,71.4286f},\r
- {52.381f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch42st1[] =\r
-{\r
- {28.5715f,57.1429f},\r
- {76.1905f,28.5714f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch42st2[] =\r
-{\r
- {76.1905f,57.1429f},\r
- {28.5715f,28.5714f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch42st[] =\r
-{\r
- {2,ch42st0},\r
- {2,ch42st1},\r
- {2,ch42st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch42 = {104.762f,3,ch42st};\r
-\r
-/* char: 0x2b */\r
-\r
-static const SFG_StrokeVertex ch43st0[] =\r
-{\r
- {52.3809f,85.7143f},\r
- {52.3809f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch43st1[] =\r
-{\r
- {9.5238f,42.8571f},\r
- {95.2381f,42.8571f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch43st[] =\r
-{\r
- {2,ch43st0},\r
- {2,ch43st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch43 = {104.762f,2,ch43st};\r
-\r
-/* char: 0x2c */\r
-\r
-static const SFG_StrokeVertex ch44st0[] =\r
-{\r
- {57.1429f,4.7619f},\r
- {52.381f,0.0f},\r
- {47.6191f,4.7619f},\r
- {52.381f,9.5238f},\r
- {57.1429f,4.7619f},\r
- {57.1429f,-4.7619f},\r
- {52.381f,-14.2857f},\r
- {47.6191f,-19.0476f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch44st[] =\r
-{\r
- {8,ch44st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch44 = {104.762f,1,ch44st};\r
-\r
-/* char: 0x2d */\r
-\r
-static const SFG_StrokeVertex ch45st0[] =\r
-{\r
- {9.5238f,42.8571f},\r
- {95.2381f,42.8571f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch45st[] =\r
-{\r
- {2,ch45st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch45 = {104.762f,1,ch45st};\r
-\r
-/* char: 0x2e */\r
-\r
-static const SFG_StrokeVertex ch46st0[] =\r
-{\r
- {52.381f,9.5238f},\r
- {47.6191f,4.7619f},\r
- {52.381f,0.0f},\r
- {57.1429f,4.7619f},\r
- {52.381f,9.5238f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch46st[] =\r
-{\r
- {5,ch46st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch46 = {104.762f,1,ch46st};\r
-\r
-/* char: 0x2f */\r
-\r
-static const SFG_StrokeVertex ch47st0[] =\r
-{\r
- {19.0476f,-14.2857f},\r
- {85.7143f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch47st[] =\r
-{\r
- {2,ch47st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch47 = {104.762f,1,ch47st};\r
-\r
-/* char: 0x30 */\r
-\r
-static const SFG_StrokeVertex ch48st0[] =\r
-{\r
- {47.619f,100.0f},\r
- {33.3333f,95.2381f},\r
- {23.8095f,80.9524f},\r
- {19.0476f,57.1429f},\r
- {19.0476f,42.8571f},\r
- {23.8095f,19.0476f},\r
- {33.3333f,4.7619f},\r
- {47.619f,0.0f},\r
- {57.1428f,0.0f},\r
- {71.4286f,4.7619f},\r
- {80.9524f,19.0476f},\r
- {85.7143f,42.8571f},\r
- {85.7143f,57.1429f},\r
- {80.9524f,80.9524f},\r
- {71.4286f,95.2381f},\r
- {57.1428f,100.0f},\r
- {47.619f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch48st[] =\r
-{\r
- {17,ch48st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch48 = {104.762f,1,ch48st};\r
-\r
-/* char: 0x31 */\r
-\r
-static const SFG_StrokeVertex ch49st0[] =\r
-{\r
- {40.4762f,80.9524f},\r
- {50.0f,85.7143f},\r
- {64.2857f,100.0f},\r
- {64.2857f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch49st[] =\r
-{\r
- {4,ch49st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch49 = {104.762f,1,ch49st};\r
-\r
-/* char: 0x32 */\r
-\r
-static const SFG_StrokeVertex ch50st0[] =\r
-{\r
- {23.8095f,76.1905f},\r
- {23.8095f,80.9524f},\r
- {28.5714f,90.4762f},\r
- {33.3333f,95.2381f},\r
- {42.8571f,100.0f},\r
- {61.9047f,100.0f},\r
- {71.4286f,95.2381f},\r
- {76.1905f,90.4762f},\r
- {80.9524f,80.9524f},\r
- {80.9524f,71.4286f},\r
- {76.1905f,61.9048f},\r
- {66.6666f,47.619f},\r
- {19.0476f,0.0f},\r
- {85.7143f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch50st[] =\r
-{\r
- {14,ch50st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch50 = {104.762f,1,ch50st};\r
-\r
-/* char: 0x33 */\r
-\r
-static const SFG_StrokeVertex ch51st0[] =\r
-{\r
- {28.5714f,100.0f},\r
- {80.9524f,100.0f},\r
- {52.3809f,61.9048f},\r
- {66.6666f,61.9048f},\r
- {76.1905f,57.1429f},\r
- {80.9524f,52.381f},\r
- {85.7143f,38.0952f},\r
- {85.7143f,28.5714f},\r
- {80.9524f,14.2857f},\r
- {71.4286f,4.7619f},\r
- {57.1428f,0.0f},\r
- {42.8571f,0.0f},\r
- {28.5714f,4.7619f},\r
- {23.8095f,9.5238f},\r
- {19.0476f,19.0476f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch51st[] =\r
-{\r
- {15,ch51st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch51 = {104.762f,1,ch51st};\r
-\r
-/* char: 0x34 */\r
-\r
-static const SFG_StrokeVertex ch52st0[] =\r
-{\r
- {64.2857f,100.0f},\r
- {16.6667f,33.3333f},\r
- {88.0952f,33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch52st1[] =\r
-{\r
- {64.2857f,100.0f},\r
- {64.2857f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch52st[] =\r
-{\r
- {3,ch52st0},\r
- {2,ch52st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch52 = {104.762f,2,ch52st};\r
-\r
-/* char: 0x35 */\r
-\r
-static const SFG_StrokeVertex ch53st0[] =\r
-{\r
- {76.1905f,100.0f},\r
- {28.5714f,100.0f},\r
- {23.8095f,57.1429f},\r
- {28.5714f,61.9048f},\r
- {42.8571f,66.6667f},\r
- {57.1428f,66.6667f},\r
- {71.4286f,61.9048f},\r
- {80.9524f,52.381f},\r
- {85.7143f,38.0952f},\r
- {85.7143f,28.5714f},\r
- {80.9524f,14.2857f},\r
- {71.4286f,4.7619f},\r
- {57.1428f,0.0f},\r
- {42.8571f,0.0f},\r
- {28.5714f,4.7619f},\r
- {23.8095f,9.5238f},\r
- {19.0476f,19.0476f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch53st[] =\r
-{\r
- {17,ch53st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch53 = {104.762f,1,ch53st};\r
-\r
-/* char: 0x36 */\r
-\r
-static const SFG_StrokeVertex ch54st0[] =\r
-{\r
- {78.5714f,85.7143f},\r
- {73.8096f,95.2381f},\r
- {59.5238f,100.0f},\r
- {50.0f,100.0f},\r
- {35.7143f,95.2381f},\r
- {26.1905f,80.9524f},\r
- {21.4286f,57.1429f},\r
- {21.4286f,33.3333f},\r
- {26.1905f,14.2857f},\r
- {35.7143f,4.7619f},\r
- {50.0f,0.0f},\r
- {54.7619f,0.0f},\r
- {69.0476f,4.7619f},\r
- {78.5714f,14.2857f},\r
- {83.3334f,28.5714f},\r
- {83.3334f,33.3333f},\r
- {78.5714f,47.619f},\r
- {69.0476f,57.1429f},\r
- {54.7619f,61.9048f},\r
- {50.0f,61.9048f},\r
- {35.7143f,57.1429f},\r
- {26.1905f,47.619f},\r
- {21.4286f,33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch54st[] =\r
-{\r
- {23,ch54st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch54 = {104.762f,1,ch54st};\r
-\r
-/* char: 0x37 */\r
-\r
-static const SFG_StrokeVertex ch55st0[] =\r
-{\r
- {85.7143f,100.0f},\r
- {38.0952f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch55st1[] =\r
-{\r
- {19.0476f,100.0f},\r
- {85.7143f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch55st[] =\r
-{\r
- {2,ch55st0},\r
- {2,ch55st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch55 = {104.762f,2,ch55st};\r
-\r
-/* char: 0x38 */\r
-\r
-static const SFG_StrokeVertex ch56st0[] =\r
-{\r
- {42.8571f,100.0f},\r
- {28.5714f,95.2381f},\r
- {23.8095f,85.7143f},\r
- {23.8095f,76.1905f},\r
- {28.5714f,66.6667f},\r
- {38.0952f,61.9048f},\r
- {57.1428f,57.1429f},\r
- {71.4286f,52.381f},\r
- {80.9524f,42.8571f},\r
- {85.7143f,33.3333f},\r
- {85.7143f,19.0476f},\r
- {80.9524f,9.5238f},\r
- {76.1905f,4.7619f},\r
- {61.9047f,0.0f},\r
- {42.8571f,0.0f},\r
- {28.5714f,4.7619f},\r
- {23.8095f,9.5238f},\r
- {19.0476f,19.0476f},\r
- {19.0476f,33.3333f},\r
- {23.8095f,42.8571f},\r
- {33.3333f,52.381f},\r
- {47.619f,57.1429f},\r
- {66.6666f,61.9048f},\r
- {76.1905f,66.6667f},\r
- {80.9524f,76.1905f},\r
- {80.9524f,85.7143f},\r
- {76.1905f,95.2381f},\r
- {61.9047f,100.0f},\r
- {42.8571f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch56st[] =\r
-{\r
- {29,ch56st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch56 = {104.762f,1,ch56st};\r
-\r
-/* char: 0x39 */\r
-\r
-static const SFG_StrokeVertex ch57st0[] =\r
-{\r
- {83.3334f,66.6667f},\r
- {78.5714f,52.381f},\r
- {69.0476f,42.8571f},\r
- {54.7619f,38.0952f},\r
- {50.0f,38.0952f},\r
- {35.7143f,42.8571f},\r
- {26.1905f,52.381f},\r
- {21.4286f,66.6667f},\r
- {21.4286f,71.4286f},\r
- {26.1905f,85.7143f},\r
- {35.7143f,95.2381f},\r
- {50.0f,100.0f},\r
- {54.7619f,100.0f},\r
- {69.0476f,95.2381f},\r
- {78.5714f,85.7143f},\r
- {83.3334f,66.6667f},\r
- {83.3334f,42.8571f},\r
- {78.5714f,19.0476f},\r
- {69.0476f,4.7619f},\r
- {54.7619f,0.0f},\r
- {45.2381f,0.0f},\r
- {30.9524f,4.7619f},\r
- {26.1905f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch57st[] =\r
-{\r
- {23,ch57st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch57 = {104.762f,1,ch57st};\r
-\r
-/* char: 0x3a */\r
-\r
-static const SFG_StrokeVertex ch58st0[] =\r
-{\r
- {52.381f,66.6667f},\r
- {47.6191f,61.9048f},\r
- {52.381f,57.1429f},\r
- {57.1429f,61.9048f},\r
- {52.381f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch58st1[] =\r
-{\r
- {52.381f,9.5238f},\r
- {47.6191f,4.7619f},\r
- {52.381f,0.0f},\r
- {57.1429f,4.7619f},\r
- {52.381f,9.5238f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch58st[] =\r
-{\r
- {5,ch58st0},\r
- {5,ch58st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch58 = {104.762f,2,ch58st};\r
-\r
-/* char: 0x3b */\r
-\r
-static const SFG_StrokeVertex ch59st0[] =\r
-{\r
- {52.381f,66.6667f},\r
- {47.6191f,61.9048f},\r
- {52.381f,57.1429f},\r
- {57.1429f,61.9048f},\r
- {52.381f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch59st1[] =\r
-{\r
- {57.1429f,4.7619f},\r
- {52.381f,0.0f},\r
- {47.6191f,4.7619f},\r
- {52.381f,9.5238f},\r
- {57.1429f,4.7619f},\r
- {57.1429f,-4.7619f},\r
- {52.381f,-14.2857f},\r
- {47.6191f,-19.0476f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch59st[] =\r
-{\r
- {5,ch59st0},\r
- {8,ch59st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch59 = {104.762f,2,ch59st};\r
-\r
-/* char: 0x3c */\r
-\r
-static const SFG_StrokeVertex ch60st0[] =\r
-{\r
- {90.4762f,85.7143f},\r
- {14.2857f,42.8571f},\r
- {90.4762f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch60st[] =\r
-{\r
- {3,ch60st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch60 = {104.762f,1,ch60st};\r
-\r
-/* char: 0x3d */\r
-\r
-static const SFG_StrokeVertex ch61st0[] =\r
-{\r
- {9.5238f,57.1429f},\r
- {95.2381f,57.1429f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch61st1[] =\r
-{\r
- {9.5238f,28.5714f},\r
- {95.2381f,28.5714f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch61st[] =\r
-{\r
- {2,ch61st0},\r
- {2,ch61st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch61 = {104.762f,2,ch61st};\r
-\r
-/* char: 0x3e */\r
-\r
-static const SFG_StrokeVertex ch62st0[] =\r
-{\r
- {14.2857f,85.7143f},\r
- {90.4762f,42.8571f},\r
- {14.2857f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch62st[] =\r
-{\r
- {3,ch62st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch62 = {104.762f,1,ch62st};\r
-\r
-/* char: 0x3f */\r
-\r
-static const SFG_StrokeVertex ch63st0[] =\r
-{\r
- {23.8095f,76.1905f},\r
- {23.8095f,80.9524f},\r
- {28.5714f,90.4762f},\r
- {33.3333f,95.2381f},\r
- {42.8571f,100.0f},\r
- {61.9047f,100.0f},\r
- {71.4285f,95.2381f},\r
- {76.1905f,90.4762f},\r
- {80.9524f,80.9524f},\r
- {80.9524f,71.4286f},\r
- {76.1905f,61.9048f},\r
- {71.4285f,57.1429f},\r
- {52.3809f,47.619f},\r
- {52.3809f,33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch63st1[] =\r
-{\r
- {52.3809f,9.5238f},\r
- {47.619f,4.7619f},\r
- {52.3809f,0.0f},\r
- {57.1428f,4.7619f},\r
- {52.3809f,9.5238f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch63st[] =\r
-{\r
- {14,ch63st0},\r
- {5,ch63st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch63 = {104.762f,2,ch63st};\r
-\r
-/* char: 0x40 */\r
-\r
-static const SFG_StrokeVertex ch64st0[] =\r
-{\r
- {64.2857f,52.381f},\r
- {54.7619f,57.1429f},\r
- {45.2381f,57.1429f},\r
- {40.4762f,47.619f},\r
- {40.4762f,42.8571f},\r
- {45.2381f,33.3333f},\r
- {54.7619f,33.3333f},\r
- {64.2857f,38.0952f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch64st1[] =\r
-{\r
- {64.2857f,57.1429f},\r
- {64.2857f,38.0952f},\r
- {69.0476f,33.3333f},\r
- {78.5714f,33.3333f},\r
- {83.3334f,42.8571f},\r
- {83.3334f,47.619f},\r
- {78.5714f,61.9048f},\r
- {69.0476f,71.4286f},\r
- {54.7619f,76.1905f},\r
- {50.0f,76.1905f},\r
- {35.7143f,71.4286f},\r
- {26.1905f,61.9048f},\r
- {21.4286f,47.619f},\r
- {21.4286f,42.8571f},\r
- {26.1905f,28.5714f},\r
- {35.7143f,19.0476f},\r
- {50.0f,14.2857f},\r
- {54.7619f,14.2857f},\r
- {69.0476f,19.0476f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch64st[] =\r
-{\r
- {8,ch64st0},\r
- {19,ch64st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch64 = {104.762f,2,ch64st};\r
-\r
-/* char: 0x41 */\r
-\r
-static const SFG_StrokeVertex ch65st0[] =\r
-{\r
- {52.3809f,100.0f},\r
- {14.2857f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch65st1[] =\r
-{\r
- {52.3809f,100.0f},\r
- {90.4762f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch65st2[] =\r
-{\r
- {28.5714f,33.3333f},\r
- {76.1905f,33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch65st[] =\r
-{\r
- {2,ch65st0},\r
- {2,ch65st1},\r
- {2,ch65st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch65 = {104.762f,3,ch65st};\r
-\r
-/* char: 0x42 */\r
-\r
-static const SFG_StrokeVertex ch66st0[] =\r
-{\r
- {19.0476f,100.0f},\r
- {19.0476f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch66st1[] =\r
-{\r
- {19.0476f,100.0f},\r
- {61.9047f,100.0f},\r
- {76.1905f,95.2381f},\r
- {80.9524f,90.4762f},\r
- {85.7143f,80.9524f},\r
- {85.7143f,71.4286f},\r
- {80.9524f,61.9048f},\r
- {76.1905f,57.1429f},\r
- {61.9047f,52.381f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch66st2[] =\r
-{\r
- {19.0476f,52.381f},\r
- {61.9047f,52.381f},\r
- {76.1905f,47.619f},\r
- {80.9524f,42.8571f},\r
- {85.7143f,33.3333f},\r
- {85.7143f,19.0476f},\r
- {80.9524f,9.5238f},\r
- {76.1905f,4.7619f},\r
- {61.9047f,0.0f},\r
- {19.0476f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch66st[] =\r
-{\r
- {2,ch66st0},\r
- {9,ch66st1},\r
- {10,ch66st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch66 = {104.762f,3,ch66st};\r
-\r
-/* char: 0x43 */\r
-\r
-static const SFG_StrokeVertex ch67st0[] =\r
-{\r
- {88.0952f,76.1905f},\r
- {83.3334f,85.7143f},\r
- {73.8096f,95.2381f},\r
- {64.2857f,100.0f},\r
- {45.2381f,100.0f},\r
- {35.7143f,95.2381f},\r
- {26.1905f,85.7143f},\r
- {21.4286f,76.1905f},\r
- {16.6667f,61.9048f},\r
- {16.6667f,38.0952f},\r
- {21.4286f,23.8095f},\r
- {26.1905f,14.2857f},\r
- {35.7143f,4.7619f},\r
- {45.2381f,0.0f},\r
- {64.2857f,0.0f},\r
- {73.8096f,4.7619f},\r
- {83.3334f,14.2857f},\r
- {88.0952f,23.8095f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch67st[] =\r
-{\r
- {18,ch67st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch67 = {104.762f,1,ch67st};\r
-\r
-/* char: 0x44 */\r
-\r
-static const SFG_StrokeVertex ch68st0[] =\r
-{\r
- {19.0476f,100.0f},\r
- {19.0476f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch68st1[] =\r
-{\r
- {19.0476f,100.0f},\r
- {52.3809f,100.0f},\r
- {66.6666f,95.2381f},\r
- {76.1905f,85.7143f},\r
- {80.9524f,76.1905f},\r
- {85.7143f,61.9048f},\r
- {85.7143f,38.0952f},\r
- {80.9524f,23.8095f},\r
- {76.1905f,14.2857f},\r
- {66.6666f,4.7619f},\r
- {52.3809f,0.0f},\r
- {19.0476f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch68st[] =\r
-{\r
- {2,ch68st0},\r
- {12,ch68st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch68 = {104.762f,2,ch68st};\r
-\r
-/* char: 0x45 */\r
-\r
-static const SFG_StrokeVertex ch69st0[] =\r
-{\r
- {21.4286f,100.0f},\r
- {21.4286f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch69st1[] =\r
-{\r
- {21.4286f,100.0f},\r
- {83.3334f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch69st2[] =\r
-{\r
- {21.4286f,52.381f},\r
- {59.5238f,52.381f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch69st3[] =\r
-{\r
- {21.4286f,0.0f},\r
- {83.3334f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch69st[] =\r
-{\r
- {2,ch69st0},\r
- {2,ch69st1},\r
- {2,ch69st2},\r
- {2,ch69st3}\r
-};\r
-\r
-static const SFG_StrokeChar ch69 = {104.762f,4,ch69st};\r
-\r
-/* char: 0x46 */\r
-\r
-static const SFG_StrokeVertex ch70st0[] =\r
-{\r
- {21.4286f,100.0f},\r
- {21.4286f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch70st1[] =\r
-{\r
- {21.4286f,100.0f},\r
- {83.3334f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch70st2[] =\r
-{\r
- {21.4286f,52.381f},\r
- {59.5238f,52.381f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch70st[] =\r
-{\r
- {2,ch70st0},\r
- {2,ch70st1},\r
- {2,ch70st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch70 = {104.762f,3,ch70st};\r
-\r
-/* char: 0x47 */\r
-\r
-static const SFG_StrokeVertex ch71st0[] =\r
-{\r
- {88.0952f,76.1905f},\r
- {83.3334f,85.7143f},\r
- {73.8096f,95.2381f},\r
- {64.2857f,100.0f},\r
- {45.2381f,100.0f},\r
- {35.7143f,95.2381f},\r
- {26.1905f,85.7143f},\r
- {21.4286f,76.1905f},\r
- {16.6667f,61.9048f},\r
- {16.6667f,38.0952f},\r
- {21.4286f,23.8095f},\r
- {26.1905f,14.2857f},\r
- {35.7143f,4.7619f},\r
- {45.2381f,0.0f},\r
- {64.2857f,0.0f},\r
- {73.8096f,4.7619f},\r
- {83.3334f,14.2857f},\r
- {88.0952f,23.8095f},\r
- {88.0952f,38.0952f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch71st1[] =\r
-{\r
- {64.2857f,38.0952f},\r
- {88.0952f,38.0952f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch71st[] =\r
-{\r
- {19,ch71st0},\r
- {2,ch71st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch71 = {104.762f,2,ch71st};\r
-\r
-/* char: 0x48 */\r
-\r
-static const SFG_StrokeVertex ch72st0[] =\r
-{\r
- {19.0476f,100.0f},\r
- {19.0476f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch72st1[] =\r
-{\r
- {85.7143f,100.0f},\r
- {85.7143f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch72st2[] =\r
-{\r
- {19.0476f,52.381f},\r
- {85.7143f,52.381f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch72st[] =\r
-{\r
- {2,ch72st0},\r
- {2,ch72st1},\r
- {2,ch72st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch72 = {104.762f,3,ch72st};\r
-\r
-/* char: 0x49 */\r
-\r
-static const SFG_StrokeVertex ch73st0[] =\r
-{\r
- {52.381f,100.0f},\r
- {52.381f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch73st[] =\r
-{\r
- {2,ch73st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch73 = {104.762f,1,ch73st};\r
-\r
-/* char: 0x4a */\r
-\r
-static const SFG_StrokeVertex ch74st0[] =\r
-{\r
- {76.1905f,100.0f},\r
- {76.1905f,23.8095f},\r
- {71.4286f,9.5238f},\r
- {66.6667f,4.7619f},\r
- {57.1429f,0.0f},\r
- {47.6191f,0.0f},\r
- {38.0953f,4.7619f},\r
- {33.3334f,9.5238f},\r
- {28.5715f,23.8095f},\r
- {28.5715f,33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch74st[] =\r
-{\r
- {10,ch74st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch74 = {104.762f,1,ch74st};\r
-\r
-/* char: 0x4b */\r
-\r
-static const SFG_StrokeVertex ch75st0[] =\r
-{\r
- {19.0476f,100.0f},\r
- {19.0476f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch75st1[] =\r
-{\r
- {85.7143f,100.0f},\r
- {19.0476f,33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch75st2[] =\r
-{\r
- {42.8571f,57.1429f},\r
- {85.7143f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch75st[] =\r
-{\r
- {2,ch75st0},\r
- {2,ch75st1},\r
- {2,ch75st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch75 = {104.762f,3,ch75st};\r
-\r
-/* char: 0x4c */\r
-\r
-static const SFG_StrokeVertex ch76st0[] =\r
-{\r
- {23.8095f,100.0f},\r
- {23.8095f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch76st1[] =\r
-{\r
- {23.8095f,0.0f},\r
- {80.9524f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch76st[] =\r
-{\r
- {2,ch76st0},\r
- {2,ch76st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch76 = {104.762f,2,ch76st};\r
-\r
-/* char: 0x4d */\r
-\r
-static const SFG_StrokeVertex ch77st0[] =\r
-{\r
- {14.2857f,100.0f},\r
- {14.2857f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch77st1[] =\r
-{\r
- {14.2857f,100.0f},\r
- {52.3809f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch77st2[] =\r
-{\r
- {90.4762f,100.0f},\r
- {52.3809f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch77st3[] =\r
-{\r
- {90.4762f,100.0f},\r
- {90.4762f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch77st[] =\r
-{\r
- {2,ch77st0},\r
- {2,ch77st1},\r
- {2,ch77st2},\r
- {2,ch77st3}\r
-};\r
-\r
-static const SFG_StrokeChar ch77 = {104.762f,4,ch77st};\r
-\r
-/* char: 0x4e */\r
-\r
-static const SFG_StrokeVertex ch78st0[] =\r
-{\r
- {19.0476f,100.0f},\r
- {19.0476f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch78st1[] =\r
-{\r
- {19.0476f,100.0f},\r
- {85.7143f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch78st2[] =\r
-{\r
- {85.7143f,100.0f},\r
- {85.7143f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch78st[] =\r
-{\r
- {2,ch78st0},\r
- {2,ch78st1},\r
- {2,ch78st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch78 = {104.762f,3,ch78st};\r
-\r
-/* char: 0x4f */\r
-\r
-static const SFG_StrokeVertex ch79st0[] =\r
-{\r
- {42.8571f,100.0f},\r
- {33.3333f,95.2381f},\r
- {23.8095f,85.7143f},\r
- {19.0476f,76.1905f},\r
- {14.2857f,61.9048f},\r
- {14.2857f,38.0952f},\r
- {19.0476f,23.8095f},\r
- {23.8095f,14.2857f},\r
- {33.3333f,4.7619f},\r
- {42.8571f,0.0f},\r
- {61.9047f,0.0f},\r
- {71.4286f,4.7619f},\r
- {80.9524f,14.2857f},\r
- {85.7143f,23.8095f},\r
- {90.4762f,38.0952f},\r
- {90.4762f,61.9048f},\r
- {85.7143f,76.1905f},\r
- {80.9524f,85.7143f},\r
- {71.4286f,95.2381f},\r
- {61.9047f,100.0f},\r
- {42.8571f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch79st[] =\r
-{\r
- {21,ch79st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch79 = {104.762f,1,ch79st};\r
-\r
-/* char: 0x50 */\r
-\r
-static const SFG_StrokeVertex ch80st0[] =\r
-{\r
- {19.0476f,100.0f},\r
- {19.0476f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch80st1[] =\r
-{\r
- {19.0476f,100.0f},\r
- {61.9047f,100.0f},\r
- {76.1905f,95.2381f},\r
- {80.9524f,90.4762f},\r
- {85.7143f,80.9524f},\r
- {85.7143f,66.6667f},\r
- {80.9524f,57.1429f},\r
- {76.1905f,52.381f},\r
- {61.9047f,47.619f},\r
- {19.0476f,47.619f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch80st[] =\r
-{\r
- {2,ch80st0},\r
- {10,ch80st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch80 = {104.762f,2,ch80st};\r
-\r
-/* char: 0x51 */\r
-\r
-static const SFG_StrokeVertex ch81st0[] =\r
-{\r
- {42.8571f,100.0f},\r
- {33.3333f,95.2381f},\r
- {23.8095f,85.7143f},\r
- {19.0476f,76.1905f},\r
- {14.2857f,61.9048f},\r
- {14.2857f,38.0952f},\r
- {19.0476f,23.8095f},\r
- {23.8095f,14.2857f},\r
- {33.3333f,4.7619f},\r
- {42.8571f,0.0f},\r
- {61.9047f,0.0f},\r
- {71.4286f,4.7619f},\r
- {80.9524f,14.2857f},\r
- {85.7143f,23.8095f},\r
- {90.4762f,38.0952f},\r
- {90.4762f,61.9048f},\r
- {85.7143f,76.1905f},\r
- {80.9524f,85.7143f},\r
- {71.4286f,95.2381f},\r
- {61.9047f,100.0f},\r
- {42.8571f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch81st1[] =\r
-{\r
- {57.1428f,19.0476f},\r
- {85.7143f,-9.5238f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch81st[] =\r
-{\r
- {21,ch81st0},\r
- {2,ch81st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch81 = {104.762f,2,ch81st};\r
-\r
-/* char: 0x52 */\r
-\r
-static const SFG_StrokeVertex ch82st0[] =\r
-{\r
- {19.0476f,100.0f},\r
- {19.0476f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch82st1[] =\r
-{\r
- {19.0476f,100.0f},\r
- {61.9047f,100.0f},\r
- {76.1905f,95.2381f},\r
- {80.9524f,90.4762f},\r
- {85.7143f,80.9524f},\r
- {85.7143f,71.4286f},\r
- {80.9524f,61.9048f},\r
- {76.1905f,57.1429f},\r
- {61.9047f,52.381f},\r
- {19.0476f,52.381f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch82st2[] =\r
-{\r
- {52.3809f,52.381f},\r
- {85.7143f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch82st[] =\r
-{\r
- {2,ch82st0},\r
- {10,ch82st1},\r
- {2,ch82st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch82 = {104.762f,3,ch82st};\r
-\r
-/* char: 0x53 */\r
-\r
-static const SFG_StrokeVertex ch83st0[] =\r
-{\r
- {85.7143f,85.7143f},\r
- {76.1905f,95.2381f},\r
- {61.9047f,100.0f},\r
- {42.8571f,100.0f},\r
- {28.5714f,95.2381f},\r
- {19.0476f,85.7143f},\r
- {19.0476f,76.1905f},\r
- {23.8095f,66.6667f},\r
- {28.5714f,61.9048f},\r
- {38.0952f,57.1429f},\r
- {66.6666f,47.619f},\r
- {76.1905f,42.8571f},\r
- {80.9524f,38.0952f},\r
- {85.7143f,28.5714f},\r
- {85.7143f,14.2857f},\r
- {76.1905f,4.7619f},\r
- {61.9047f,0.0f},\r
- {42.8571f,0.0f},\r
- {28.5714f,4.7619f},\r
- {19.0476f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch83st[] =\r
-{\r
- {20,ch83st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch83 = {104.762f,1,ch83st};\r
-\r
-/* char: 0x54 */\r
-\r
-static const SFG_StrokeVertex ch84st0[] =\r
-{\r
- {52.3809f,100.0f},\r
- {52.3809f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch84st1[] =\r
-{\r
- {19.0476f,100.0f},\r
- {85.7143f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch84st[] =\r
-{\r
- {2,ch84st0},\r
- {2,ch84st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch84 = {104.762f,2,ch84st};\r
-\r
-/* char: 0x55 */\r
-\r
-static const SFG_StrokeVertex ch85st0[] =\r
-{\r
- {19.0476f,100.0f},\r
- {19.0476f,28.5714f},\r
- {23.8095f,14.2857f},\r
- {33.3333f,4.7619f},\r
- {47.619f,0.0f},\r
- {57.1428f,0.0f},\r
- {71.4286f,4.7619f},\r
- {80.9524f,14.2857f},\r
- {85.7143f,28.5714f},\r
- {85.7143f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch85st[] =\r
-{\r
- {10,ch85st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch85 = {104.762f,1,ch85st};\r
-\r
-/* char: 0x56 */\r
-\r
-static const SFG_StrokeVertex ch86st0[] =\r
-{\r
- {14.2857f,100.0f},\r
- {52.3809f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch86st1[] =\r
-{\r
- {90.4762f,100.0f},\r
- {52.3809f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch86st[] =\r
-{\r
- {2,ch86st0},\r
- {2,ch86st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch86 = {104.762f,2,ch86st};\r
-\r
-/* char: 0x57 */\r
-\r
-static const SFG_StrokeVertex ch87st0[] =\r
-{\r
- {4.7619f,100.0f},\r
- {28.5714f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch87st1[] =\r
-{\r
- {52.3809f,100.0f},\r
- {28.5714f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch87st2[] =\r
-{\r
- {52.3809f,100.0f},\r
- {76.1905f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch87st3[] =\r
-{\r
- {100.0f,100.0f},\r
- {76.1905f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch87st[] =\r
-{\r
- {2,ch87st0},\r
- {2,ch87st1},\r
- {2,ch87st2},\r
- {2,ch87st3}\r
-};\r
-\r
-static const SFG_StrokeChar ch87 = {104.762f,4,ch87st};\r
-\r
-/* char: 0x58 */\r
-\r
-static const SFG_StrokeVertex ch88st0[] =\r
-{\r
- {19.0476f,100.0f},\r
- {85.7143f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch88st1[] =\r
-{\r
- {85.7143f,100.0f},\r
- {19.0476f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch88st[] =\r
-{\r
- {2,ch88st0},\r
- {2,ch88st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch88 = {104.762f,2,ch88st};\r
-\r
-/* char: 0x59 */\r
-\r
-static const SFG_StrokeVertex ch89st0[] =\r
-{\r
- {14.2857f,100.0f},\r
- {52.3809f,52.381f},\r
- {52.3809f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch89st1[] =\r
-{\r
- {90.4762f,100.0f},\r
- {52.3809f,52.381f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch89st[] =\r
-{\r
- {3,ch89st0},\r
- {2,ch89st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch89 = {104.762f,2,ch89st};\r
-\r
-/* char: 0x5a */\r
-\r
-static const SFG_StrokeVertex ch90st0[] =\r
-{\r
- {85.7143f,100.0f},\r
- {19.0476f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch90st1[] =\r
-{\r
- {19.0476f,100.0f},\r
- {85.7143f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch90st2[] =\r
-{\r
- {19.0476f,0.0f},\r
- {85.7143f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch90st[] =\r
-{\r
- {2,ch90st0},\r
- {2,ch90st1},\r
- {2,ch90st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch90 = {104.762f,3,ch90st};\r
-\r
-/* char: 0x5b */\r
-\r
-static const SFG_StrokeVertex ch91st0[] =\r
-{\r
- {35.7143f,119.048f},\r
- {35.7143f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch91st1[] =\r
-{\r
- {40.4762f,119.048f},\r
- {40.4762f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch91st2[] =\r
-{\r
- {35.7143f,119.048f},\r
- {69.0476f,119.048f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch91st3[] =\r
-{\r
- {35.7143f,-33.3333f},\r
- {69.0476f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch91st[] =\r
-{\r
- {2,ch91st0},\r
- {2,ch91st1},\r
- {2,ch91st2},\r
- {2,ch91st3}\r
-};\r
-\r
-static const SFG_StrokeChar ch91 = {104.762f,4,ch91st};\r
-\r
-/* char: 0x5c */\r
-\r
-static const SFG_StrokeVertex ch92st0[] =\r
-{\r
- {19.0476f,100.0f},\r
- {85.7143f,-14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch92st[] =\r
-{\r
- {2,ch92st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch92 = {104.762f,1,ch92st};\r
-\r
-/* char: 0x5d */\r
-\r
-static const SFG_StrokeVertex ch93st0[] =\r
-{\r
- {64.2857f,119.048f},\r
- {64.2857f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch93st1[] =\r
-{\r
- {69.0476f,119.048f},\r
- {69.0476f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch93st2[] =\r
-{\r
- {35.7143f,119.048f},\r
- {69.0476f,119.048f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch93st3[] =\r
-{\r
- {35.7143f,-33.3333f},\r
- {69.0476f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch93st[] =\r
-{\r
- {2,ch93st0},\r
- {2,ch93st1},\r
- {2,ch93st2},\r
- {2,ch93st3}\r
-};\r
-\r
-static const SFG_StrokeChar ch93 = {104.762f,4,ch93st};\r
-\r
-/* char: 0x5e */\r
-\r
-static const SFG_StrokeVertex ch94st0[] =\r
-{\r
- {52.3809f,109.524f},\r
- {14.2857f,42.8571f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch94st1[] =\r
-{\r
- {52.3809f,109.524f},\r
- {90.4762f,42.8571f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch94st[] =\r
-{\r
- {2,ch94st0},\r
- {2,ch94st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch94 = {104.762f,2,ch94st};\r
-\r
-/* char: 0x5f */\r
-\r
-static const SFG_StrokeVertex ch95st0[] =\r
-{\r
- {0,-33.3333f},\r
- {104.762f,-33.3333f},\r
- {104.762f,-28.5714f},\r
- {0,-28.5714f},\r
- {0,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch95st[] =\r
-{\r
- {5,ch95st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch95 = {104.762f,1,ch95st};\r
-\r
-/* char: 0x60 */\r
-\r
-static const SFG_StrokeVertex ch96st0[] =\r
-{\r
- {42.8572f,100.0f},\r
- {66.6667f,71.4286f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch96st1[] =\r
-{\r
- {42.8572f,100.0f},\r
- {38.0953f,95.2381f},\r
- {66.6667f,71.4286f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch96st[] =\r
-{\r
- {2,ch96st0},\r
- {3,ch96st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch96 = {104.762f,2,ch96st};\r
-\r
-/* char: 0x61 */\r
-\r
-static const SFG_StrokeVertex ch97st0[] =\r
-{\r
- {80.9524f,66.6667f},\r
- {80.9524f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch97st1[] =\r
-{\r
- {80.9524f,52.381f},\r
- {71.4285f,61.9048f},\r
- {61.9047f,66.6667f},\r
- {47.619f,66.6667f},\r
- {38.0952f,61.9048f},\r
- {28.5714f,52.381f},\r
- {23.8095f,38.0952f},\r
- {23.8095f,28.5714f},\r
- {28.5714f,14.2857f},\r
- {38.0952f,4.7619f},\r
- {47.619f,0.0f},\r
- {61.9047f,0.0f},\r
- {71.4285f,4.7619f},\r
- {80.9524f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch97st[] =\r
-{\r
- {2,ch97st0},\r
- {14,ch97st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch97 = {104.762f,2,ch97st};\r
-\r
-/* char: 0x62 */\r
-\r
-static const SFG_StrokeVertex ch98st0[] =\r
-{\r
- {23.8095f,100.0f},\r
- {23.8095f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch98st1[] =\r
-{\r
- {23.8095f,52.381f},\r
- {33.3333f,61.9048f},\r
- {42.8571f,66.6667f},\r
- {57.1428f,66.6667f},\r
- {66.6666f,61.9048f},\r
- {76.1905f,52.381f},\r
- {80.9524f,38.0952f},\r
- {80.9524f,28.5714f},\r
- {76.1905f,14.2857f},\r
- {66.6666f,4.7619f},\r
- {57.1428f,0.0f},\r
- {42.8571f,0.0f},\r
- {33.3333f,4.7619f},\r
- {23.8095f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch98st[] =\r
-{\r
- {2,ch98st0},\r
- {14,ch98st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch98 = {104.762f,2,ch98st};\r
-\r
-/* char: 0x63 */\r
-\r
-static const SFG_StrokeVertex ch99st0[] =\r
-{\r
- {80.9524f,52.381f},\r
- {71.4285f,61.9048f},\r
- {61.9047f,66.6667f},\r
- {47.619f,66.6667f},\r
- {38.0952f,61.9048f},\r
- {28.5714f,52.381f},\r
- {23.8095f,38.0952f},\r
- {23.8095f,28.5714f},\r
- {28.5714f,14.2857f},\r
- {38.0952f,4.7619f},\r
- {47.619f,0.0f},\r
- {61.9047f,0.0f},\r
- {71.4285f,4.7619f},\r
- {80.9524f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch99st[] =\r
-{\r
- {14,ch99st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch99 = {104.762f,1,ch99st};\r
-\r
-/* char: 0x64 */\r
-\r
-static const SFG_StrokeVertex ch100st0[] =\r
-{\r
- {80.9524f,100.0f},\r
- {80.9524f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch100st1[] =\r
-{\r
- {80.9524f,52.381f},\r
- {71.4285f,61.9048f},\r
- {61.9047f,66.6667f},\r
- {47.619f,66.6667f},\r
- {38.0952f,61.9048f},\r
- {28.5714f,52.381f},\r
- {23.8095f,38.0952f},\r
- {23.8095f,28.5714f},\r
- {28.5714f,14.2857f},\r
- {38.0952f,4.7619f},\r
- {47.619f,0.0f},\r
- {61.9047f,0.0f},\r
- {71.4285f,4.7619f},\r
- {80.9524f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch100st[] =\r
-{\r
- {2,ch100st0},\r
- {14,ch100st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch100 = {104.762f,2,ch100st};\r
-\r
-/* char: 0x65 */\r
-\r
-static const SFG_StrokeVertex ch101st0[] =\r
-{\r
- {23.8095f,38.0952f},\r
- {80.9524f,38.0952f},\r
- {80.9524f,47.619f},\r
- {76.1905f,57.1429f},\r
- {71.4285f,61.9048f},\r
- {61.9047f,66.6667f},\r
- {47.619f,66.6667f},\r
- {38.0952f,61.9048f},\r
- {28.5714f,52.381f},\r
- {23.8095f,38.0952f},\r
- {23.8095f,28.5714f},\r
- {28.5714f,14.2857f},\r
- {38.0952f,4.7619f},\r
- {47.619f,0.0f},\r
- {61.9047f,0.0f},\r
- {71.4285f,4.7619f},\r
- {80.9524f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch101st[] =\r
-{\r
- {17,ch101st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch101 = {104.762f,1,ch101st};\r
-\r
-/* char: 0x66 */\r
-\r
-static const SFG_StrokeVertex ch102st0[] =\r
-{\r
- {71.4286f,100.0f},\r
- {61.9048f,100.0f},\r
- {52.381f,95.2381f},\r
- {47.6191f,80.9524f},\r
- {47.6191f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch102st1[] =\r
-{\r
- {33.3334f,66.6667f},\r
- {66.6667f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch102st[] =\r
-{\r
- {5,ch102st0},\r
- {2,ch102st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch102 = {104.762f,2,ch102st};\r
-\r
-/* char: 0x67 */\r
-\r
-static const SFG_StrokeVertex ch103st0[] =\r
-{\r
- {80.9524f,66.6667f},\r
- {80.9524f,-9.5238f},\r
- {76.1905f,-23.8095f},\r
- {71.4285f,-28.5714f},\r
- {61.9047f,-33.3333f},\r
- {47.619f,-33.3333f},\r
- {38.0952f,-28.5714f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch103st1[] =\r
-{\r
- {80.9524f,52.381f},\r
- {71.4285f,61.9048f},\r
- {61.9047f,66.6667f},\r
- {47.619f,66.6667f},\r
- {38.0952f,61.9048f},\r
- {28.5714f,52.381f},\r
- {23.8095f,38.0952f},\r
- {23.8095f,28.5714f},\r
- {28.5714f,14.2857f},\r
- {38.0952f,4.7619f},\r
- {47.619f,0.0f},\r
- {61.9047f,0.0f},\r
- {71.4285f,4.7619f},\r
- {80.9524f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch103st[] =\r
-{\r
- {7,ch103st0},\r
- {14,ch103st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch103 = {104.762f,2,ch103st};\r
-\r
-/* char: 0x68 */\r
-\r
-static const SFG_StrokeVertex ch104st0[] =\r
-{\r
- {26.1905f,100.0f},\r
- {26.1905f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch104st1[] =\r
-{\r
- {26.1905f,47.619f},\r
- {40.4762f,61.9048f},\r
- {50.0f,66.6667f},\r
- {64.2857f,66.6667f},\r
- {73.8095f,61.9048f},\r
- {78.5715f,47.619f},\r
- {78.5715f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch104st[] =\r
-{\r
- {2,ch104st0},\r
- {7,ch104st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch104 = {104.762f,2,ch104st};\r
-\r
-/* char: 0x69 */\r
-\r
-static const SFG_StrokeVertex ch105st0[] =\r
-{\r
- {47.6191f,100.0f},\r
- {52.381f,95.2381f},\r
- {57.1429f,100.0f},\r
- {52.381f,104.762f},\r
- {47.6191f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch105st1[] =\r
-{\r
- {52.381f,66.6667f},\r
- {52.381f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch105st[] =\r
-{\r
- {5,ch105st0},\r
- {2,ch105st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch105 = {104.762f,2,ch105st};\r
-\r
-/* char: 0x6a */\r
-\r
-static const SFG_StrokeVertex ch106st0[] =\r
-{\r
- {57.1429f,100.0f},\r
- {61.9048f,95.2381f},\r
- {66.6667f,100.0f},\r
- {61.9048f,104.762f},\r
- {57.1429f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch106st1[] =\r
-{\r
- {61.9048f,66.6667f},\r
- {61.9048f,-14.2857f},\r
- {57.1429f,-28.5714f},\r
- {47.6191f,-33.3333f},\r
- {38.0953f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch106st[] =\r
-{\r
- {5,ch106st0},\r
- {5,ch106st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch106 = {104.762f,2,ch106st};\r
-\r
-/* char: 0x6b */\r
-\r
-static const SFG_StrokeVertex ch107st0[] =\r
-{\r
- {26.1905f,100.0f},\r
- {26.1905f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch107st1[] =\r
-{\r
- {73.8095f,66.6667f},\r
- {26.1905f,19.0476f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch107st2[] =\r
-{\r
- {45.2381f,38.0952f},\r
- {78.5715f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch107st[] =\r
-{\r
- {2,ch107st0},\r
- {2,ch107st1},\r
- {2,ch107st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch107 = {104.762f,3,ch107st};\r
-\r
-/* char: 0x6c */\r
-\r
-static const SFG_StrokeVertex ch108st0[] =\r
-{\r
- {52.381f,100.0f},\r
- {52.381f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch108st[] =\r
-{\r
- {2,ch108st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch108 = {104.762f,1,ch108st};\r
-\r
-/* char: 0x6d */\r
-\r
-static const SFG_StrokeVertex ch109st0[] =\r
-{\r
- {0,66.6667f},\r
- {0,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch109st1[] =\r
-{\r
- {0,47.619f},\r
- {14.2857f,61.9048f},\r
- {23.8095f,66.6667f},\r
- {38.0952f,66.6667f},\r
- {47.619f,61.9048f},\r
- {52.381f,47.619f},\r
- {52.381f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch109st2[] =\r
-{\r
- {52.381f,47.619f},\r
- {66.6667f,61.9048f},\r
- {76.1905f,66.6667f},\r
- {90.4762f,66.6667f},\r
- {100.0f,61.9048f},\r
- {104.762f,47.619f},\r
- {104.762f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch109st[] =\r
-{\r
- {2,ch109st0},\r
- {7,ch109st1},\r
- {7,ch109st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch109 = {104.762f,3,ch109st};\r
-\r
-/* char: 0x6e */\r
-\r
-static const SFG_StrokeVertex ch110st0[] =\r
-{\r
- {26.1905f,66.6667f},\r
- {26.1905f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch110st1[] =\r
-{\r
- {26.1905f,47.619f},\r
- {40.4762f,61.9048f},\r
- {50.0f,66.6667f},\r
- {64.2857f,66.6667f},\r
- {73.8095f,61.9048f},\r
- {78.5715f,47.619f},\r
- {78.5715f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch110st[] =\r
-{\r
- {2,ch110st0},\r
- {7,ch110st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch110 = {104.762f,2,ch110st};\r
-\r
-/* char: 0x6f */\r
-\r
-static const SFG_StrokeVertex ch111st0[] =\r
-{\r
- {45.2381f,66.6667f},\r
- {35.7143f,61.9048f},\r
- {26.1905f,52.381f},\r
- {21.4286f,38.0952f},\r
- {21.4286f,28.5714f},\r
- {26.1905f,14.2857f},\r
- {35.7143f,4.7619f},\r
- {45.2381f,0.0f},\r
- {59.5238f,0.0f},\r
- {69.0476f,4.7619f},\r
- {78.5714f,14.2857f},\r
- {83.3334f,28.5714f},\r
- {83.3334f,38.0952f},\r
- {78.5714f,52.381f},\r
- {69.0476f,61.9048f},\r
- {59.5238f,66.6667f},\r
- {45.2381f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch111st[] =\r
-{\r
- {17,ch111st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch111 = {104.762f,1,ch111st};\r
-\r
-/* char: 0x70 */\r
-\r
-static const SFG_StrokeVertex ch112st0[] =\r
-{\r
- {23.8095f,66.6667f},\r
- {23.8095f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch112st1[] =\r
-{\r
- {23.8095f,52.381f},\r
- {33.3333f,61.9048f},\r
- {42.8571f,66.6667f},\r
- {57.1428f,66.6667f},\r
- {66.6666f,61.9048f},\r
- {76.1905f,52.381f},\r
- {80.9524f,38.0952f},\r
- {80.9524f,28.5714f},\r
- {76.1905f,14.2857f},\r
- {66.6666f,4.7619f},\r
- {57.1428f,0.0f},\r
- {42.8571f,0.0f},\r
- {33.3333f,4.7619f},\r
- {23.8095f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch112st[] =\r
-{\r
- {2,ch112st0},\r
- {14,ch112st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch112 = {104.762f,2,ch112st};\r
-\r
-/* char: 0x71 */\r
-\r
-static const SFG_StrokeVertex ch113st0[] =\r
-{\r
- {80.9524f,66.6667f},\r
- {80.9524f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch113st1[] =\r
-{\r
- {80.9524f,52.381f},\r
- {71.4285f,61.9048f},\r
- {61.9047f,66.6667f},\r
- {47.619f,66.6667f},\r
- {38.0952f,61.9048f},\r
- {28.5714f,52.381f},\r
- {23.8095f,38.0952f},\r
- {23.8095f,28.5714f},\r
- {28.5714f,14.2857f},\r
- {38.0952f,4.7619f},\r
- {47.619f,0.0f},\r
- {61.9047f,0.0f},\r
- {71.4285f,4.7619f},\r
- {80.9524f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch113st[] =\r
-{\r
- {2,ch113st0},\r
- {14,ch113st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch113 = {104.762f,2,ch113st};\r
-\r
-/* char: 0x72 */\r
-\r
-static const SFG_StrokeVertex ch114st0[] =\r
-{\r
- {33.3334f,66.6667f},\r
- {33.3334f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch114st1[] =\r
-{\r
- {33.3334f,38.0952f},\r
- {38.0953f,52.381f},\r
- {47.6191f,61.9048f},\r
- {57.1429f,66.6667f},\r
- {71.4286f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch114st[] =\r
-{\r
- {2,ch114st0},\r
- {5,ch114st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch114 = {104.762f,2,ch114st};\r
-\r
-/* char: 0x73 */\r
-\r
-static const SFG_StrokeVertex ch115st0[] =\r
-{\r
- {78.5715f,52.381f},\r
- {73.8095f,61.9048f},\r
- {59.5238f,66.6667f},\r
- {45.2381f,66.6667f},\r
- {30.9524f,61.9048f},\r
- {26.1905f,52.381f},\r
- {30.9524f,42.8571f},\r
- {40.4762f,38.0952f},\r
- {64.2857f,33.3333f},\r
- {73.8095f,28.5714f},\r
- {78.5715f,19.0476f},\r
- {78.5715f,14.2857f},\r
- {73.8095f,4.7619f},\r
- {59.5238f,0.0f},\r
- {45.2381f,0.0f},\r
- {30.9524f,4.7619f},\r
- {26.1905f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch115st[] =\r
-{\r
- {17,ch115st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch115 = {104.762f,1,ch115st};\r
-\r
-/* char: 0x74 */\r
-\r
-static const SFG_StrokeVertex ch116st0[] =\r
-{\r
- {47.6191f,100.0f},\r
- {47.6191f,19.0476f},\r
- {52.381f,4.7619f},\r
- {61.9048f,0.0f},\r
- {71.4286f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch116st1[] =\r
-{\r
- {33.3334f,66.6667f},\r
- {66.6667f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch116st[] =\r
-{\r
- {5,ch116st0},\r
- {2,ch116st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch116 = {104.762f,2,ch116st};\r
-\r
-/* char: 0x75 */\r
-\r
-static const SFG_StrokeVertex ch117st0[] =\r
-{\r
- {26.1905f,66.6667f},\r
- {26.1905f,19.0476f},\r
- {30.9524f,4.7619f},\r
- {40.4762f,0.0f},\r
- {54.7619f,0.0f},\r
- {64.2857f,4.7619f},\r
- {78.5715f,19.0476f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch117st1[] =\r
-{\r
- {78.5715f,66.6667f},\r
- {78.5715f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch117st[] =\r
-{\r
- {7,ch117st0},\r
- {2,ch117st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch117 = {104.762f,2,ch117st};\r
-\r
-/* char: 0x76 */\r
-\r
-static const SFG_StrokeVertex ch118st0[] =\r
-{\r
- {23.8095f,66.6667f},\r
- {52.3809f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch118st1[] =\r
-{\r
- {80.9524f,66.6667f},\r
- {52.3809f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch118st[] =\r
-{\r
- {2,ch118st0},\r
- {2,ch118st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch118 = {104.762f,2,ch118st};\r
-\r
-/* char: 0x77 */\r
-\r
-static const SFG_StrokeVertex ch119st0[] =\r
-{\r
- {14.2857f,66.6667f},\r
- {33.3333f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch119st1[] =\r
-{\r
- {52.3809f,66.6667f},\r
- {33.3333f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch119st2[] =\r
-{\r
- {52.3809f,66.6667f},\r
- {71.4286f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch119st3[] =\r
-{\r
- {90.4762f,66.6667f},\r
- {71.4286f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch119st[] =\r
-{\r
- {2,ch119st0},\r
- {2,ch119st1},\r
- {2,ch119st2},\r
- {2,ch119st3}\r
-};\r
-\r
-static const SFG_StrokeChar ch119 = {104.762f,4,ch119st};\r
-\r
-/* char: 0x78 */\r
-\r
-static const SFG_StrokeVertex ch120st0[] =\r
-{\r
- {26.1905f,66.6667f},\r
- {78.5715f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch120st1[] =\r
-{\r
- {78.5715f,66.6667f},\r
- {26.1905f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch120st[] =\r
-{\r
- {2,ch120st0},\r
- {2,ch120st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch120 = {104.762f,2,ch120st};\r
-\r
-/* char: 0x79 */\r
-\r
-static const SFG_StrokeVertex ch121st0[] =\r
-{\r
- {26.1905f,66.6667f},\r
- {54.7619f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch121st1[] =\r
-{\r
- {83.3334f,66.6667f},\r
- {54.7619f,0.0f},\r
- {45.2381f,-19.0476f},\r
- {35.7143f,-28.5714f},\r
- {26.1905f,-33.3333f},\r
- {21.4286f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch121st[] =\r
-{\r
- {2,ch121st0},\r
- {6,ch121st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch121 = {104.762f,2,ch121st};\r
-\r
-/* char: 0x7a */\r
-\r
-static const SFG_StrokeVertex ch122st0[] =\r
-{\r
- {78.5715f,66.6667f},\r
- {26.1905f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch122st1[] =\r
-{\r
- {26.1905f,66.6667f},\r
- {78.5715f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch122st2[] =\r
-{\r
- {26.1905f,0.0f},\r
- {78.5715f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch122st[] =\r
-{\r
- {2,ch122st0},\r
- {2,ch122st1},\r
- {2,ch122st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch122 = {104.762f,3,ch122st};\r
-\r
-/* char: 0x7b */\r
-\r
-static const SFG_StrokeVertex ch123st0[] =\r
-{\r
- {64.2857f,119.048f},\r
- {54.7619f,114.286f},\r
- {50.0f,109.524f},\r
- {45.2381f,100.0f},\r
- {45.2381f,90.4762f},\r
- {50.0f,80.9524f},\r
- {54.7619f,76.1905f},\r
- {59.5238f,66.6667f},\r
- {59.5238f,57.1429f},\r
- {50.0f,47.619f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch123st1[] =\r
-{\r
- {54.7619f,114.286f},\r
- {50.0f,104.762f},\r
- {50.0f,95.2381f},\r
- {54.7619f,85.7143f},\r
- {59.5238f,80.9524f},\r
- {64.2857f,71.4286f},\r
- {64.2857f,61.9048f},\r
- {59.5238f,52.381f},\r
- {40.4762f,42.8571f},\r
- {59.5238f,33.3333f},\r
- {64.2857f,23.8095f},\r
- {64.2857f,14.2857f},\r
- {59.5238f,4.7619f},\r
- {54.7619f,0.0f},\r
- {50.0f,-9.5238f},\r
- {50.0f,-19.0476f},\r
- {54.7619f,-28.5714f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch123st2[] =\r
-{\r
- {50.0f,38.0952f},\r
- {59.5238f,28.5714f},\r
- {59.5238f,19.0476f},\r
- {54.7619f,9.5238f},\r
- {50.0f,4.7619f},\r
- {45.2381f,-4.7619f},\r
- {45.2381f,-14.2857f},\r
- {50.0f,-23.8095f},\r
- {54.7619f,-28.5714f},\r
- {64.2857f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch123st[] =\r
-{\r
- {10,ch123st0},\r
- {17,ch123st1},\r
- {10,ch123st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch123 = {104.762f,3,ch123st};\r
-\r
-/* char: 0x7c */\r
-\r
-static const SFG_StrokeVertex ch124st0[] =\r
-{\r
- {52.381f,119.048f},\r
- {52.381f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch124st[] =\r
-{\r
- {2,ch124st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch124 = {104.762f,1,ch124st};\r
-\r
-/* char: 0x7d */\r
-\r
-static const SFG_StrokeVertex ch125st0[] =\r
-{\r
- {40.4762f,119.048f},\r
- {50.0f,114.286f},\r
- {54.7619f,109.524f},\r
- {59.5238f,100.0f},\r
- {59.5238f,90.4762f},\r
- {54.7619f,80.9524f},\r
- {50.0f,76.1905f},\r
- {45.2381f,66.6667f},\r
- {45.2381f,57.1429f},\r
- {54.7619f,47.619f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch125st1[] =\r
-{\r
- {50.0f,114.286f},\r
- {54.7619f,104.762f},\r
- {54.7619f,95.2381f},\r
- {50.0f,85.7143f},\r
- {45.2381f,80.9524f},\r
- {40.4762f,71.4286f},\r
- {40.4762f,61.9048f},\r
- {45.2381f,52.381f},\r
- {64.2857f,42.8571f},\r
- {45.2381f,33.3333f},\r
- {40.4762f,23.8095f},\r
- {40.4762f,14.2857f},\r
- {45.2381f,4.7619f},\r
- {50.0f,0.0f},\r
- {54.7619f,-9.5238f},\r
- {54.7619f,-19.0476f},\r
- {50.0f,-28.5714f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch125st2[] =\r
-{\r
- {54.7619f,38.0952f},\r
- {45.2381f,28.5714f},\r
- {45.2381f,19.0476f},\r
- {50.0f,9.5238f},\r
- {54.7619f,4.7619f},\r
- {59.5238f,-4.7619f},\r
- {59.5238f,-14.2857f},\r
- {54.7619f,-23.8095f},\r
- {50.0f,-28.5714f},\r
- {40.4762f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch125st[] =\r
-{\r
- {10,ch125st0},\r
- {17,ch125st1},\r
- {10,ch125st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch125 = {104.762f,3,ch125st};\r
-\r
-/* char: 0x7e */\r
-\r
-static const SFG_StrokeVertex ch126st0[] =\r
-{\r
- {9.5238f,28.5714f},\r
- {9.5238f,38.0952f},\r
- {14.2857f,52.381f},\r
- {23.8095f,57.1429f},\r
- {33.3333f,57.1429f},\r
- {42.8571f,52.381f},\r
- {61.9048f,38.0952f},\r
- {71.4286f,33.3333f},\r
- {80.9524f,33.3333f},\r
- {90.4762f,38.0952f},\r
- {95.2381f,47.619f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch126st1[] =\r
-{\r
- {9.5238f,38.0952f},\r
- {14.2857f,47.619f},\r
- {23.8095f,52.381f},\r
- {33.3333f,52.381f},\r
- {42.8571f,47.619f},\r
- {61.9048f,33.3333f},\r
- {71.4286f,28.5714f},\r
- {80.9524f,28.5714f},\r
- {90.4762f,33.3333f},\r
- {95.2381f,47.619f},\r
- {95.2381f,57.1429f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch126st[] =\r
-{\r
- {11,ch126st0},\r
- {11,ch126st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch126 = {104.762f,2,ch126st};\r
-\r
-/* char: 0x7f */\r
-\r
-static const SFG_StrokeVertex ch127st0[] =\r
-{\r
- {71.4286f,100.0f},\r
- {33.3333f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch127st1[] =\r
-{\r
- {47.619f,66.6667f},\r
- {33.3333f,61.9048f},\r
- {23.8095f,52.381f},\r
- {19.0476f,38.0952f},\r
- {19.0476f,23.8095f},\r
- {23.8095f,14.2857f},\r
- {33.3333f,4.7619f},\r
- {47.619f,0.0f},\r
- {57.1428f,0.0f},\r
- {71.4286f,4.7619f},\r
- {80.9524f,14.2857f},\r
- {85.7143f,28.5714f},\r
- {85.7143f,42.8571f},\r
- {80.9524f,52.381f},\r
- {71.4286f,61.9048f},\r
- {57.1428f,66.6667f},\r
- {47.619f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch127st[] =\r
-{\r
- {2,ch127st0},\r
- {17,ch127st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch127 = {104.762f,2,ch127st};\r
-\r
-static const SFG_StrokeChar *chars[] =\r
-{\r
- 0, 0, 0, 0, 0, 0, 0, 0,\r
- 0, 0, 0, 0, 0, 0, 0, 0,\r
- 0, 0, 0, 0, 0, 0, 0, 0,\r
- 0, 0, 0, 0, 0, 0, 0, 0,\r
- &ch32, &ch33, &ch34, &ch35, &ch36, &ch37, &ch38, &ch39,\r
- &ch40, &ch41, &ch42, &ch43, &ch44, &ch45, &ch46, &ch47,\r
- &ch48, &ch49, &ch50, &ch51, &ch52, &ch53, &ch54, &ch55,\r
- &ch56, &ch57, &ch58, &ch59, &ch60, &ch61, &ch62, &ch63,\r
- &ch64, &ch65, &ch66, &ch67, &ch68, &ch69, &ch70, &ch71,\r
- &ch72, &ch73, &ch74, &ch75, &ch76, &ch77, &ch78, &ch79,\r
- &ch80, &ch81, &ch82, &ch83, &ch84, &ch85, &ch86, &ch87,\r
- &ch88, &ch89, &ch90, &ch91, &ch92, &ch93, &ch94, &ch95,\r
- &ch96, &ch97, &ch98, &ch99, &ch100, &ch101, &ch102, &ch103,\r
- &ch104, &ch105, &ch106, &ch107, &ch108, &ch109, &ch110, &ch111,\r
- &ch112, &ch113, &ch114, &ch115, &ch116, &ch117, &ch118, &ch119,\r
- &ch120, &ch121, &ch122, &ch123, &ch124, &ch125, &ch126, &ch127\r
-};\r
-\r
-const SFG_StrokeFont fgStrokeMonoRoman = {"MonoRoman",128,152.381f,chars};\r
+/*
+ * freeglut_stroke_mono_roman.c
+ *
+ * freeglut Monospace Roman stroke font definition
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Thu Dec 16 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+/* This file has been automatically generated by the genstroke utility. */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+/* char: 0x20 */
+
+static const SFG_StrokeStrip ch32st[] =
+{
+  { 0, NULL }
+};
+
+static const SFG_StrokeChar ch32 = {104.762f,0,ch32st};
+
+/* char: 0x21 */
+
+static const SFG_StrokeVertex ch33st0[] =
+{
+ {52.381f,100.0f},
+ {52.381f,33.3333f}
+};
+
+static const SFG_StrokeVertex ch33st1[] =
+{
+ {52.381f,9.5238f},
+ {47.6191f,4.7619f},
+ {52.381f,0.0f},
+ {57.1429f,4.7619f},
+ {52.381f,9.5238f}
+};
+
+static const SFG_StrokeStrip ch33st[] =
+{
+ {2,ch33st0},
+ {5,ch33st1}
+};
+
+static const SFG_StrokeChar ch33 = {104.762f,2,ch33st};
+
+/* char: 0x22 */
+
+static const SFG_StrokeVertex ch34st0[] =
+{
+ {33.3334f,100.0f},
+ {33.3334f,66.6667f}
+};
+
+static const SFG_StrokeVertex ch34st1[] =
+{
+ {71.4286f,100.0f},
+ {71.4286f,66.6667f}
+};
+
+static const SFG_StrokeStrip ch34st[] =
+{
+ {2,ch34st0},
+ {2,ch34st1}
+};
+
+static const SFG_StrokeChar ch34 = {104.762f,2,ch34st};
+
+/* char: 0x23 */
+
+static const SFG_StrokeVertex ch35st0[] =
+{
+ {54.7619f,119.048f},
+ {21.4286f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch35st1[] =
+{
+ {83.3334f,119.048f},
+ {50.0f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch35st2[] =
+{
+ {21.4286f,57.1429f},
+ {88.0952f,57.1429f}
+};
+
+static const SFG_StrokeVertex ch35st3[] =
+{
+ {16.6667f,28.5714f},
+ {83.3334f,28.5714f}
+};
+
+static const SFG_StrokeStrip ch35st[] =
+{
+ {2,ch35st0},
+ {2,ch35st1},
+ {2,ch35st2},
+ {2,ch35st3}
+};
+
+static const SFG_StrokeChar ch35 = {104.762f,4,ch35st};
+
+/* char: 0x24 */
+
+static const SFG_StrokeVertex ch36st0[] =
+{
+ {42.8571f,119.048f},
+ {42.8571f,-19.0476f}
+};
+
+static const SFG_StrokeVertex ch36st1[] =
+{
+ {61.9047f,119.048f},
+ {61.9047f,-19.0476f}
+};
+
+static const SFG_StrokeVertex ch36st2[] =
+{
+ {85.7143f,85.7143f},
+ {76.1905f,95.2381f},
+ {61.9047f,100.0f},
+ {42.8571f,100.0f},
+ {28.5714f,95.2381f},
+ {19.0476f,85.7143f},
+ {19.0476f,76.1905f},
+ {23.8095f,66.6667f},
+ {28.5714f,61.9048f},
+ {38.0952f,57.1429f},
+ {66.6666f,47.619f},
+ {76.1905f,42.8571f},
+ {80.9524f,38.0952f},
+ {85.7143f,28.5714f},
+ {85.7143f,14.2857f},
+ {76.1905f,4.7619f},
+ {61.9047f,0.0f},
+ {42.8571f,0.0f},
+ {28.5714f,4.7619f},
+ {19.0476f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch36st[] =
+{
+ {2,ch36st0},
+ {2,ch36st1},
+ {20,ch36st2}
+};
+
+static const SFG_StrokeChar ch36 = {104.762f,3,ch36st};
+
+/* char: 0x25 */
+
+static const SFG_StrokeVertex ch37st0[] =
+{
+ {95.2381f,100.0f},
+ {9.5238f,0.0f}
+};
+
+static const SFG_StrokeVertex ch37st1[] =
+{
+ {33.3333f,100.0f},
+ {42.8571f,90.4762f},
+ {42.8571f,80.9524f},
+ {38.0952f,71.4286f},
+ {28.5714f,66.6667f},
+ {19.0476f,66.6667f},
+ {9.5238f,76.1905f},
+ {9.5238f,85.7143f},
+ {14.2857f,95.2381f},
+ {23.8095f,100.0f},
+ {33.3333f,100.0f},
+ {42.8571f,95.2381f},
+ {57.1428f,90.4762f},
+ {71.4286f,90.4762f},
+ {85.7143f,95.2381f},
+ {95.2381f,100.0f}
+};
+
+static const SFG_StrokeVertex ch37st2[] =
+{
+ {76.1905f,33.3333f},
+ {66.6667f,28.5714f},
+ {61.9048f,19.0476f},
+ {61.9048f,9.5238f},
+ {71.4286f,0.0f},
+ {80.9524f,0.0f},
+ {90.4762f,4.7619f},
+ {95.2381f,14.2857f},
+ {95.2381f,23.8095f},
+ {85.7143f,33.3333f},
+ {76.1905f,33.3333f}
+};
+
+static const SFG_StrokeStrip ch37st[] =
+{
+ {2,ch37st0},
+ {16,ch37st1},
+ {11,ch37st2}
+};
+
+static const SFG_StrokeChar ch37 = {104.762f,3,ch37st};
+
+/* char: 0x26 */
+
+static const SFG_StrokeVertex ch38st0[] =
+{
+ {100.0f,57.1429f},
+ {100.0f,61.9048f},
+ {95.2381f,66.6667f},
+ {90.4762f,66.6667f},
+ {85.7143f,61.9048f},
+ {80.9524f,52.381f},
+ {71.4286f,28.5714f},
+ {61.9048f,14.2857f},
+ {52.3809f,4.7619f},
+ {42.8571f,0.0f},
+ {23.8095f,0.0f},
+ {14.2857f,4.7619f},
+ {9.5238f,9.5238f},
+ {4.7619f,19.0476f},
+ {4.7619f,28.5714f},
+ {9.5238f,38.0952f},
+ {14.2857f,42.8571f},
+ {47.619f,61.9048f},
+ {52.3809f,66.6667f},
+ {57.1429f,76.1905f},
+ {57.1429f,85.7143f},
+ {52.3809f,95.2381f},
+ {42.8571f,100.0f},
+ {33.3333f,95.2381f},
+ {28.5714f,85.7143f},
+ {28.5714f,76.1905f},
+ {33.3333f,61.9048f},
+ {42.8571f,47.619f},
+ {66.6667f,14.2857f},
+ {76.1905f,4.7619f},
+ {85.7143f,0.0f},
+ {95.2381f,0.0f},
+ {100.0f,4.7619f},
+ {100.0f,9.5238f}
+};
+
+static const SFG_StrokeStrip ch38st[] =
+{
+ {34,ch38st0}
+};
+
+static const SFG_StrokeChar ch38 = {104.762f,1,ch38st};
+
+/* char: 0x27 */
+
+static const SFG_StrokeVertex ch39st0[] =
+{
+ {52.381f,100.0f},
+ {52.381f,66.6667f}
+};
+
+static const SFG_StrokeStrip ch39st[] =
+{
+ {2,ch39st0}
+};
+
+static const SFG_StrokeChar ch39 = {104.762f,1,ch39st};
+
+/* char: 0x28 */
+
+static const SFG_StrokeVertex ch40st0[] =
+{
+ {69.0476f,119.048f},
+ {59.5238f,109.524f},
+ {50.0f,95.2381f},
+ {40.4762f,76.1905f},
+ {35.7143f,52.381f},
+ {35.7143f,33.3333f},
+ {40.4762f,9.5238f},
+ {50.0f,-9.5238f},
+ {59.5238f,-23.8095f},
+ {69.0476f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch40st[] =
+{
+ {10,ch40st0}
+};
+
+static const SFG_StrokeChar ch40 = {104.762f,1,ch40st};
+
+/* char: 0x29 */
+
+static const SFG_StrokeVertex ch41st0[] =
+{
+ {35.7143f,119.048f},
+ {45.2381f,109.524f},
+ {54.7619f,95.2381f},
+ {64.2857f,76.1905f},
+ {69.0476f,52.381f},
+ {69.0476f,33.3333f},
+ {64.2857f,9.5238f},
+ {54.7619f,-9.5238f},
+ {45.2381f,-23.8095f},
+ {35.7143f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch41st[] =
+{
+ {10,ch41st0}
+};
+
+static const SFG_StrokeChar ch41 = {104.762f,1,ch41st};
+
+/* char: 0x2a */
+
+static const SFG_StrokeVertex ch42st0[] =
+{
+ {52.381f,71.4286f},
+ {52.381f,14.2857f}
+};
+
+static const SFG_StrokeVertex ch42st1[] =
+{
+ {28.5715f,57.1429f},
+ {76.1905f,28.5714f}
+};
+
+static const SFG_StrokeVertex ch42st2[] =
+{
+ {76.1905f,57.1429f},
+ {28.5715f,28.5714f}
+};
+
+static const SFG_StrokeStrip ch42st[] =
+{
+ {2,ch42st0},
+ {2,ch42st1},
+ {2,ch42st2}
+};
+
+static const SFG_StrokeChar ch42 = {104.762f,3,ch42st};
+
+/* char: 0x2b */
+
+static const SFG_StrokeVertex ch43st0[] =
+{
+ {52.3809f,85.7143f},
+ {52.3809f,0.0f}
+};
+
+static const SFG_StrokeVertex ch43st1[] =
+{
+ {9.5238f,42.8571f},
+ {95.2381f,42.8571f}
+};
+
+static const SFG_StrokeStrip ch43st[] =
+{
+ {2,ch43st0},
+ {2,ch43st1}
+};
+
+static const SFG_StrokeChar ch43 = {104.762f,2,ch43st};
+
+/* char: 0x2c */
+
+static const SFG_StrokeVertex ch44st0[] =
+{
+ {57.1429f,4.7619f},
+ {52.381f,0.0f},
+ {47.6191f,4.7619f},
+ {52.381f,9.5238f},
+ {57.1429f,4.7619f},
+ {57.1429f,-4.7619f},
+ {52.381f,-14.2857f},
+ {47.6191f,-19.0476f}
+};
+
+static const SFG_StrokeStrip ch44st[] =
+{
+ {8,ch44st0}
+};
+
+static const SFG_StrokeChar ch44 = {104.762f,1,ch44st};
+
+/* char: 0x2d */
+
+static const SFG_StrokeVertex ch45st0[] =
+{
+ {9.5238f,42.8571f},
+ {95.2381f,42.8571f}
+};
+
+static const SFG_StrokeStrip ch45st[] =
+{
+ {2,ch45st0}
+};
+
+static const SFG_StrokeChar ch45 = {104.762f,1,ch45st};
+
+/* char: 0x2e */
+
+static const SFG_StrokeVertex ch46st0[] =
+{
+ {52.381f,9.5238f},
+ {47.6191f,4.7619f},
+ {52.381f,0.0f},
+ {57.1429f,4.7619f},
+ {52.381f,9.5238f}
+};
+
+static const SFG_StrokeStrip ch46st[] =
+{
+ {5,ch46st0}
+};
+
+static const SFG_StrokeChar ch46 = {104.762f,1,ch46st};
+
+/* char: 0x2f */
+
+static const SFG_StrokeVertex ch47st0[] =
+{
+ {19.0476f,-14.2857f},
+ {85.7143f,100.0f}
+};
+
+static const SFG_StrokeStrip ch47st[] =
+{
+ {2,ch47st0}
+};
+
+static const SFG_StrokeChar ch47 = {104.762f,1,ch47st};
+
+/* char: 0x30 */
+
+static const SFG_StrokeVertex ch48st0[] =
+{
+ {47.619f,100.0f},
+ {33.3333f,95.2381f},
+ {23.8095f,80.9524f},
+ {19.0476f,57.1429f},
+ {19.0476f,42.8571f},
+ {23.8095f,19.0476f},
+ {33.3333f,4.7619f},
+ {47.619f,0.0f},
+ {57.1428f,0.0f},
+ {71.4286f,4.7619f},
+ {80.9524f,19.0476f},
+ {85.7143f,42.8571f},
+ {85.7143f,57.1429f},
+ {80.9524f,80.9524f},
+ {71.4286f,95.2381f},
+ {57.1428f,100.0f},
+ {47.619f,100.0f}
+};
+
+static const SFG_StrokeStrip ch48st[] =
+{
+ {17,ch48st0}
+};
+
+static const SFG_StrokeChar ch48 = {104.762f,1,ch48st};
+
+/* char: 0x31 */
+
+static const SFG_StrokeVertex ch49st0[] =
+{
+ {40.4762f,80.9524f},
+ {50.0f,85.7143f},
+ {64.2857f,100.0f},
+ {64.2857f,0.0f}
+};
+
+static const SFG_StrokeStrip ch49st[] =
+{
+ {4,ch49st0}
+};
+
+static const SFG_StrokeChar ch49 = {104.762f,1,ch49st};
+
+/* char: 0x32 */
+
+static const SFG_StrokeVertex ch50st0[] =
+{
+ {23.8095f,76.1905f},
+ {23.8095f,80.9524f},
+ {28.5714f,90.4762f},
+ {33.3333f,95.2381f},
+ {42.8571f,100.0f},
+ {61.9047f,100.0f},
+ {71.4286f,95.2381f},
+ {76.1905f,90.4762f},
+ {80.9524f,80.9524f},
+ {80.9524f,71.4286f},
+ {76.1905f,61.9048f},
+ {66.6666f,47.619f},
+ {19.0476f,0.0f},
+ {85.7143f,0.0f}
+};
+
+static const SFG_StrokeStrip ch50st[] =
+{
+ {14,ch50st0}
+};
+
+static const SFG_StrokeChar ch50 = {104.762f,1,ch50st};
+
+/* char: 0x33 */
+
+static const SFG_StrokeVertex ch51st0[] =
+{
+ {28.5714f,100.0f},
+ {80.9524f,100.0f},
+ {52.3809f,61.9048f},
+ {66.6666f,61.9048f},
+ {76.1905f,57.1429f},
+ {80.9524f,52.381f},
+ {85.7143f,38.0952f},
+ {85.7143f,28.5714f},
+ {80.9524f,14.2857f},
+ {71.4286f,4.7619f},
+ {57.1428f,0.0f},
+ {42.8571f,0.0f},
+ {28.5714f,4.7619f},
+ {23.8095f,9.5238f},
+ {19.0476f,19.0476f}
+};
+
+static const SFG_StrokeStrip ch51st[] =
+{
+ {15,ch51st0}
+};
+
+static const SFG_StrokeChar ch51 = {104.762f,1,ch51st};
+
+/* char: 0x34 */
+
+static const SFG_StrokeVertex ch52st0[] =
+{
+ {64.2857f,100.0f},
+ {16.6667f,33.3333f},
+ {88.0952f,33.3333f}
+};
+
+static const SFG_StrokeVertex ch52st1[] =
+{
+ {64.2857f,100.0f},
+ {64.2857f,0.0f}
+};
+
+static const SFG_StrokeStrip ch52st[] =
+{
+ {3,ch52st0},
+ {2,ch52st1}
+};
+
+static const SFG_StrokeChar ch52 = {104.762f,2,ch52st};
+
+/* char: 0x35 */
+
+static const SFG_StrokeVertex ch53st0[] =
+{
+ {76.1905f,100.0f},
+ {28.5714f,100.0f},
+ {23.8095f,57.1429f},
+ {28.5714f,61.9048f},
+ {42.8571f,66.6667f},
+ {57.1428f,66.6667f},
+ {71.4286f,61.9048f},
+ {80.9524f,52.381f},
+ {85.7143f,38.0952f},
+ {85.7143f,28.5714f},
+ {80.9524f,14.2857f},
+ {71.4286f,4.7619f},
+ {57.1428f,0.0f},
+ {42.8571f,0.0f},
+ {28.5714f,4.7619f},
+ {23.8095f,9.5238f},
+ {19.0476f,19.0476f}
+};
+
+static const SFG_StrokeStrip ch53st[] =
+{
+ {17,ch53st0}
+};
+
+static const SFG_StrokeChar ch53 = {104.762f,1,ch53st};
+
+/* char: 0x36 */
+
+static const SFG_StrokeVertex ch54st0[] =
+{
+ {78.5714f,85.7143f},
+ {73.8096f,95.2381f},
+ {59.5238f,100.0f},
+ {50.0f,100.0f},
+ {35.7143f,95.2381f},
+ {26.1905f,80.9524f},
+ {21.4286f,57.1429f},
+ {21.4286f,33.3333f},
+ {26.1905f,14.2857f},
+ {35.7143f,4.7619f},
+ {50.0f,0.0f},
+ {54.7619f,0.0f},
+ {69.0476f,4.7619f},
+ {78.5714f,14.2857f},
+ {83.3334f,28.5714f},
+ {83.3334f,33.3333f},
+ {78.5714f,47.619f},
+ {69.0476f,57.1429f},
+ {54.7619f,61.9048f},
+ {50.0f,61.9048f},
+ {35.7143f,57.1429f},
+ {26.1905f,47.619f},
+ {21.4286f,33.3333f}
+};
+
+static const SFG_StrokeStrip ch54st[] =
+{
+ {23,ch54st0}
+};
+
+static const SFG_StrokeChar ch54 = {104.762f,1,ch54st};
+
+/* char: 0x37 */
+
+static const SFG_StrokeVertex ch55st0[] =
+{
+ {85.7143f,100.0f},
+ {38.0952f,0.0f}
+};
+
+static const SFG_StrokeVertex ch55st1[] =
+{
+ {19.0476f,100.0f},
+ {85.7143f,100.0f}
+};
+
+static const SFG_StrokeStrip ch55st[] =
+{
+ {2,ch55st0},
+ {2,ch55st1}
+};
+
+static const SFG_StrokeChar ch55 = {104.762f,2,ch55st};
+
+/* char: 0x38 */
+
+static const SFG_StrokeVertex ch56st0[] =
+{
+ {42.8571f,100.0f},
+ {28.5714f,95.2381f},
+ {23.8095f,85.7143f},
+ {23.8095f,76.1905f},
+ {28.5714f,66.6667f},
+ {38.0952f,61.9048f},
+ {57.1428f,57.1429f},
+ {71.4286f,52.381f},
+ {80.9524f,42.8571f},
+ {85.7143f,33.3333f},
+ {85.7143f,19.0476f},
+ {80.9524f,9.5238f},
+ {76.1905f,4.7619f},
+ {61.9047f,0.0f},
+ {42.8571f,0.0f},
+ {28.5714f,4.7619f},
+ {23.8095f,9.5238f},
+ {19.0476f,19.0476f},
+ {19.0476f,33.3333f},
+ {23.8095f,42.8571f},
+ {33.3333f,52.381f},
+ {47.619f,57.1429f},
+ {66.6666f,61.9048f},
+ {76.1905f,66.6667f},
+ {80.9524f,76.1905f},
+ {80.9524f,85.7143f},
+ {76.1905f,95.2381f},
+ {61.9047f,100.0f},
+ {42.8571f,100.0f}
+};
+
+static const SFG_StrokeStrip ch56st[] =
+{
+ {29,ch56st0}
+};
+
+static const SFG_StrokeChar ch56 = {104.762f,1,ch56st};
+
+/* char: 0x39 */
+
+static const SFG_StrokeVertex ch57st0[] =
+{
+ {83.3334f,66.6667f},
+ {78.5714f,52.381f},
+ {69.0476f,42.8571f},
+ {54.7619f,38.0952f},
+ {50.0f,38.0952f},
+ {35.7143f,42.8571f},
+ {26.1905f,52.381f},
+ {21.4286f,66.6667f},
+ {21.4286f,71.4286f},
+ {26.1905f,85.7143f},
+ {35.7143f,95.2381f},
+ {50.0f,100.0f},
+ {54.7619f,100.0f},
+ {69.0476f,95.2381f},
+ {78.5714f,85.7143f},
+ {83.3334f,66.6667f},
+ {83.3334f,42.8571f},
+ {78.5714f,19.0476f},
+ {69.0476f,4.7619f},
+ {54.7619f,0.0f},
+ {45.2381f,0.0f},
+ {30.9524f,4.7619f},
+ {26.1905f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch57st[] =
+{
+ {23,ch57st0}
+};
+
+static const SFG_StrokeChar ch57 = {104.762f,1,ch57st};
+
+/* char: 0x3a */
+
+static const SFG_StrokeVertex ch58st0[] =
+{
+ {52.381f,66.6667f},
+ {47.6191f,61.9048f},
+ {52.381f,57.1429f},
+ {57.1429f,61.9048f},
+ {52.381f,66.6667f}
+};
+
+static const SFG_StrokeVertex ch58st1[] =
+{
+ {52.381f,9.5238f},
+ {47.6191f,4.7619f},
+ {52.381f,0.0f},
+ {57.1429f,4.7619f},
+ {52.381f,9.5238f}
+};
+
+static const SFG_StrokeStrip ch58st[] =
+{
+ {5,ch58st0},
+ {5,ch58st1}
+};
+
+static const SFG_StrokeChar ch58 = {104.762f,2,ch58st};
+
+/* char: 0x3b */
+
+static const SFG_StrokeVertex ch59st0[] =
+{
+ {52.381f,66.6667f},
+ {47.6191f,61.9048f},
+ {52.381f,57.1429f},
+ {57.1429f,61.9048f},
+ {52.381f,66.6667f}
+};
+
+static const SFG_StrokeVertex ch59st1[] =
+{
+ {57.1429f,4.7619f},
+ {52.381f,0.0f},
+ {47.6191f,4.7619f},
+ {52.381f,9.5238f},
+ {57.1429f,4.7619f},
+ {57.1429f,-4.7619f},
+ {52.381f,-14.2857f},
+ {47.6191f,-19.0476f}
+};
+
+static const SFG_StrokeStrip ch59st[] =
+{
+ {5,ch59st0},
+ {8,ch59st1}
+};
+
+static const SFG_StrokeChar ch59 = {104.762f,2,ch59st};
+
+/* char: 0x3c */
+
+static const SFG_StrokeVertex ch60st0[] =
+{
+ {90.4762f,85.7143f},
+ {14.2857f,42.8571f},
+ {90.4762f,0.0f}
+};
+
+static const SFG_StrokeStrip ch60st[] =
+{
+ {3,ch60st0}
+};
+
+static const SFG_StrokeChar ch60 = {104.762f,1,ch60st};
+
+/* char: 0x3d */
+
+static const SFG_StrokeVertex ch61st0[] =
+{
+ {9.5238f,57.1429f},
+ {95.2381f,57.1429f}
+};
+
+static const SFG_StrokeVertex ch61st1[] =
+{
+ {9.5238f,28.5714f},
+ {95.2381f,28.5714f}
+};
+
+static const SFG_StrokeStrip ch61st[] =
+{
+ {2,ch61st0},
+ {2,ch61st1}
+};
+
+static const SFG_StrokeChar ch61 = {104.762f,2,ch61st};
+
+/* char: 0x3e */
+
+static const SFG_StrokeVertex ch62st0[] =
+{
+ {14.2857f,85.7143f},
+ {90.4762f,42.8571f},
+ {14.2857f,0.0f}
+};
+
+static const SFG_StrokeStrip ch62st[] =
+{
+ {3,ch62st0}
+};
+
+static const SFG_StrokeChar ch62 = {104.762f,1,ch62st};
+
+/* char: 0x3f */
+
+static const SFG_StrokeVertex ch63st0[] =
+{
+ {23.8095f,76.1905f},
+ {23.8095f,80.9524f},
+ {28.5714f,90.4762f},
+ {33.3333f,95.2381f},
+ {42.8571f,100.0f},
+ {61.9047f,100.0f},
+ {71.4285f,95.2381f},
+ {76.1905f,90.4762f},
+ {80.9524f,80.9524f},
+ {80.9524f,71.4286f},
+ {76.1905f,61.9048f},
+ {71.4285f,57.1429f},
+ {52.3809f,47.619f},
+ {52.3809f,33.3333f}
+};
+
+static const SFG_StrokeVertex ch63st1[] =
+{
+ {52.3809f,9.5238f},
+ {47.619f,4.7619f},
+ {52.3809f,0.0f},
+ {57.1428f,4.7619f},
+ {52.3809f,9.5238f}
+};
+
+static const SFG_StrokeStrip ch63st[] =
+{
+ {14,ch63st0},
+ {5,ch63st1}
+};
+
+static const SFG_StrokeChar ch63 = {104.762f,2,ch63st};
+
+/* char: 0x40 */
+
+static const SFG_StrokeVertex ch64st0[] =
+{
+ {64.2857f,52.381f},
+ {54.7619f,57.1429f},
+ {45.2381f,57.1429f},
+ {40.4762f,47.619f},
+ {40.4762f,42.8571f},
+ {45.2381f,33.3333f},
+ {54.7619f,33.3333f},
+ {64.2857f,38.0952f}
+};
+
+static const SFG_StrokeVertex ch64st1[] =
+{
+ {64.2857f,57.1429f},
+ {64.2857f,38.0952f},
+ {69.0476f,33.3333f},
+ {78.5714f,33.3333f},
+ {83.3334f,42.8571f},
+ {83.3334f,47.619f},
+ {78.5714f,61.9048f},
+ {69.0476f,71.4286f},
+ {54.7619f,76.1905f},
+ {50.0f,76.1905f},
+ {35.7143f,71.4286f},
+ {26.1905f,61.9048f},
+ {21.4286f,47.619f},
+ {21.4286f,42.8571f},
+ {26.1905f,28.5714f},
+ {35.7143f,19.0476f},
+ {50.0f,14.2857f},
+ {54.7619f,14.2857f},
+ {69.0476f,19.0476f}
+};
+
+static const SFG_StrokeStrip ch64st[] =
+{
+ {8,ch64st0},
+ {19,ch64st1}
+};
+
+static const SFG_StrokeChar ch64 = {104.762f,2,ch64st};
+
+/* char: 0x41 */
+
+static const SFG_StrokeVertex ch65st0[] =
+{
+ {52.3809f,100.0f},
+ {14.2857f,0.0f}
+};
+
+static const SFG_StrokeVertex ch65st1[] =
+{
+ {52.3809f,100.0f},
+ {90.4762f,0.0f}
+};
+
+static const SFG_StrokeVertex ch65st2[] =
+{
+ {28.5714f,33.3333f},
+ {76.1905f,33.3333f}
+};
+
+static const SFG_StrokeStrip ch65st[] =
+{
+ {2,ch65st0},
+ {2,ch65st1},
+ {2,ch65st2}
+};
+
+static const SFG_StrokeChar ch65 = {104.762f,3,ch65st};
+
+/* char: 0x42 */
+
+static const SFG_StrokeVertex ch66st0[] =
+{
+ {19.0476f,100.0f},
+ {19.0476f,0.0f}
+};
+
+static const SFG_StrokeVertex ch66st1[] =
+{
+ {19.0476f,100.0f},
+ {61.9047f,100.0f},
+ {76.1905f,95.2381f},
+ {80.9524f,90.4762f},
+ {85.7143f,80.9524f},
+ {85.7143f,71.4286f},
+ {80.9524f,61.9048f},
+ {76.1905f,57.1429f},
+ {61.9047f,52.381f}
+};
+
+static const SFG_StrokeVertex ch66st2[] =
+{
+ {19.0476f,52.381f},
+ {61.9047f,52.381f},
+ {76.1905f,47.619f},
+ {80.9524f,42.8571f},
+ {85.7143f,33.3333f},
+ {85.7143f,19.0476f},
+ {80.9524f,9.5238f},
+ {76.1905f,4.7619f},
+ {61.9047f,0.0f},
+ {19.0476f,0.0f}
+};
+
+static const SFG_StrokeStrip ch66st[] =
+{
+ {2,ch66st0},
+ {9,ch66st1},
+ {10,ch66st2}
+};
+
+static const SFG_StrokeChar ch66 = {104.762f,3,ch66st};
+
+/* char: 0x43 */
+
+static const SFG_StrokeVertex ch67st0[] =
+{
+ {88.0952f,76.1905f},
+ {83.3334f,85.7143f},
+ {73.8096f,95.2381f},
+ {64.2857f,100.0f},
+ {45.2381f,100.0f},
+ {35.7143f,95.2381f},
+ {26.1905f,85.7143f},
+ {21.4286f,76.1905f},
+ {16.6667f,61.9048f},
+ {16.6667f,38.0952f},
+ {21.4286f,23.8095f},
+ {26.1905f,14.2857f},
+ {35.7143f,4.7619f},
+ {45.2381f,0.0f},
+ {64.2857f,0.0f},
+ {73.8096f,4.7619f},
+ {83.3334f,14.2857f},
+ {88.0952f,23.8095f}
+};
+
+static const SFG_StrokeStrip ch67st[] =
+{
+ {18,ch67st0}
+};
+
+static const SFG_StrokeChar ch67 = {104.762f,1,ch67st};
+
+/* char: 0x44 */
+
+static const SFG_StrokeVertex ch68st0[] =
+{
+ {19.0476f,100.0f},
+ {19.0476f,0.0f}
+};
+
+static const SFG_StrokeVertex ch68st1[] =
+{
+ {19.0476f,100.0f},
+ {52.3809f,100.0f},
+ {66.6666f,95.2381f},
+ {76.1905f,85.7143f},
+ {80.9524f,76.1905f},
+ {85.7143f,61.9048f},
+ {85.7143f,38.0952f},
+ {80.9524f,23.8095f},
+ {76.1905f,14.2857f},
+ {66.6666f,4.7619f},
+ {52.3809f,0.0f},
+ {19.0476f,0.0f}
+};
+
+static const SFG_StrokeStrip ch68st[] =
+{
+ {2,ch68st0},
+ {12,ch68st1}
+};
+
+static const SFG_StrokeChar ch68 = {104.762f,2,ch68st};
+
+/* char: 0x45 */
+
+static const SFG_StrokeVertex ch69st0[] =
+{
+ {21.4286f,100.0f},
+ {21.4286f,0.0f}
+};
+
+static const SFG_StrokeVertex ch69st1[] =
+{
+ {21.4286f,100.0f},
+ {83.3334f,100.0f}
+};
+
+static const SFG_StrokeVertex ch69st2[] =
+{
+ {21.4286f,52.381f},
+ {59.5238f,52.381f}
+};
+
+static const SFG_StrokeVertex ch69st3[] =
+{
+ {21.4286f,0.0f},
+ {83.3334f,0.0f}
+};
+
+static const SFG_StrokeStrip ch69st[] =
+{
+ {2,ch69st0},
+ {2,ch69st1},
+ {2,ch69st2},
+ {2,ch69st3}
+};
+
+static const SFG_StrokeChar ch69 = {104.762f,4,ch69st};
+
+/* char: 0x46 */
+
+static const SFG_StrokeVertex ch70st0[] =
+{
+ {21.4286f,100.0f},
+ {21.4286f,0.0f}
+};
+
+static const SFG_StrokeVertex ch70st1[] =
+{
+ {21.4286f,100.0f},
+ {83.3334f,100.0f}
+};
+
+static const SFG_StrokeVertex ch70st2[] =
+{
+ {21.4286f,52.381f},
+ {59.5238f,52.381f}
+};
+
+static const SFG_StrokeStrip ch70st[] =
+{
+ {2,ch70st0},
+ {2,ch70st1},
+ {2,ch70st2}
+};
+
+static const SFG_StrokeChar ch70 = {104.762f,3,ch70st};
+
+/* char: 0x47 */
+
+static const SFG_StrokeVertex ch71st0[] =
+{
+ {88.0952f,76.1905f},
+ {83.3334f,85.7143f},
+ {73.8096f,95.2381f},
+ {64.2857f,100.0f},
+ {45.2381f,100.0f},
+ {35.7143f,95.2381f},
+ {26.1905f,85.7143f},
+ {21.4286f,76.1905f},
+ {16.6667f,61.9048f},
+ {16.6667f,38.0952f},
+ {21.4286f,23.8095f},
+ {26.1905f,14.2857f},
+ {35.7143f,4.7619f},
+ {45.2381f,0.0f},
+ {64.2857f,0.0f},
+ {73.8096f,4.7619f},
+ {83.3334f,14.2857f},
+ {88.0952f,23.8095f},
+ {88.0952f,38.0952f}
+};
+
+static const SFG_StrokeVertex ch71st1[] =
+{
+ {64.2857f,38.0952f},
+ {88.0952f,38.0952f}
+};
+
+static const SFG_StrokeStrip ch71st[] =
+{
+ {19,ch71st0},
+ {2,ch71st1}
+};
+
+static const SFG_StrokeChar ch71 = {104.762f,2,ch71st};
+
+/* char: 0x48 */
+
+static const SFG_StrokeVertex ch72st0[] =
+{
+ {19.0476f,100.0f},
+ {19.0476f,0.0f}
+};
+
+static const SFG_StrokeVertex ch72st1[] =
+{
+ {85.7143f,100.0f},
+ {85.7143f,0.0f}
+};
+
+static const SFG_StrokeVertex ch72st2[] =
+{
+ {19.0476f,52.381f},
+ {85.7143f,52.381f}
+};
+
+static const SFG_StrokeStrip ch72st[] =
+{
+ {2,ch72st0},
+ {2,ch72st1},
+ {2,ch72st2}
+};
+
+static const SFG_StrokeChar ch72 = {104.762f,3,ch72st};
+
+/* char: 0x49 */
+
+static const SFG_StrokeVertex ch73st0[] =
+{
+ {52.381f,100.0f},
+ {52.381f,0.0f}
+};
+
+static const SFG_StrokeStrip ch73st[] =
+{
+ {2,ch73st0}
+};
+
+static const SFG_StrokeChar ch73 = {104.762f,1,ch73st};
+
+/* char: 0x4a */
+
+static const SFG_StrokeVertex ch74st0[] =
+{
+ {76.1905f,100.0f},
+ {76.1905f,23.8095f},
+ {71.4286f,9.5238f},
+ {66.6667f,4.7619f},
+ {57.1429f,0.0f},
+ {47.6191f,0.0f},
+ {38.0953f,4.7619f},
+ {33.3334f,9.5238f},
+ {28.5715f,23.8095f},
+ {28.5715f,33.3333f}
+};
+
+static const SFG_StrokeStrip ch74st[] =
+{
+ {10,ch74st0}
+};
+
+static const SFG_StrokeChar ch74 = {104.762f,1,ch74st};
+
+/* char: 0x4b */
+
+static const SFG_StrokeVertex ch75st0[] =
+{
+ {19.0476f,100.0f},
+ {19.0476f,0.0f}
+};
+
+static const SFG_StrokeVertex ch75st1[] =
+{
+ {85.7143f,100.0f},
+ {19.0476f,33.3333f}
+};
+
+static const SFG_StrokeVertex ch75st2[] =
+{
+ {42.8571f,57.1429f},
+ {85.7143f,0.0f}
+};
+
+static const SFG_StrokeStrip ch75st[] =
+{
+ {2,ch75st0},
+ {2,ch75st1},
+ {2,ch75st2}
+};
+
+static const SFG_StrokeChar ch75 = {104.762f,3,ch75st};
+
+/* char: 0x4c */
+
+static const SFG_StrokeVertex ch76st0[] =
+{
+ {23.8095f,100.0f},
+ {23.8095f,0.0f}
+};
+
+static const SFG_StrokeVertex ch76st1[] =
+{
+ {23.8095f,0.0f},
+ {80.9524f,0.0f}
+};
+
+static const SFG_StrokeStrip ch76st[] =
+{
+ {2,ch76st0},
+ {2,ch76st1}
+};
+
+static const SFG_StrokeChar ch76 = {104.762f,2,ch76st};
+
+/* char: 0x4d */
+
+static const SFG_StrokeVertex ch77st0[] =
+{
+ {14.2857f,100.0f},
+ {14.2857f,0.0f}
+};
+
+static const SFG_StrokeVertex ch77st1[] =
+{
+ {14.2857f,100.0f},
+ {52.3809f,0.0f}
+};
+
+static const SFG_StrokeVertex ch77st2[] =
+{
+ {90.4762f,100.0f},
+ {52.3809f,0.0f}
+};
+
+static const SFG_StrokeVertex ch77st3[] =
+{
+ {90.4762f,100.0f},
+ {90.4762f,0.0f}
+};
+
+static const SFG_StrokeStrip ch77st[] =
+{
+ {2,ch77st0},
+ {2,ch77st1},
+ {2,ch77st2},
+ {2,ch77st3}
+};
+
+static const SFG_StrokeChar ch77 = {104.762f,4,ch77st};
+
+/* char: 0x4e */
+
+static const SFG_StrokeVertex ch78st0[] =
+{
+ {19.0476f,100.0f},
+ {19.0476f,0.0f}
+};
+
+static const SFG_StrokeVertex ch78st1[] =
+{
+ {19.0476f,100.0f},
+ {85.7143f,0.0f}
+};
+
+static const SFG_StrokeVertex ch78st2[] =
+{
+ {85.7143f,100.0f},
+ {85.7143f,0.0f}
+};
+
+static const SFG_StrokeStrip ch78st[] =
+{
+ {2,ch78st0},
+ {2,ch78st1},
+ {2,ch78st2}
+};
+
+static const SFG_StrokeChar ch78 = {104.762f,3,ch78st};
+
+/* char: 0x4f */
+
+static const SFG_StrokeVertex ch79st0[] =
+{
+ {42.8571f,100.0f},
+ {33.3333f,95.2381f},
+ {23.8095f,85.7143f},
+ {19.0476f,76.1905f},
+ {14.2857f,61.9048f},
+ {14.2857f,38.0952f},
+ {19.0476f,23.8095f},
+ {23.8095f,14.2857f},
+ {33.3333f,4.7619f},
+ {42.8571f,0.0f},
+ {61.9047f,0.0f},
+ {71.4286f,4.7619f},
+ {80.9524f,14.2857f},
+ {85.7143f,23.8095f},
+ {90.4762f,38.0952f},
+ {90.4762f,61.9048f},
+ {85.7143f,76.1905f},
+ {80.9524f,85.7143f},
+ {71.4286f,95.2381f},
+ {61.9047f,100.0f},
+ {42.8571f,100.0f}
+};
+
+static const SFG_StrokeStrip ch79st[] =
+{
+ {21,ch79st0}
+};
+
+static const SFG_StrokeChar ch79 = {104.762f,1,ch79st};
+
+/* char: 0x50 */
+
+static const SFG_StrokeVertex ch80st0[] =
+{
+ {19.0476f,100.0f},
+ {19.0476f,0.0f}
+};
+
+static const SFG_StrokeVertex ch80st1[] =
+{
+ {19.0476f,100.0f},
+ {61.9047f,100.0f},
+ {76.1905f,95.2381f},
+ {80.9524f,90.4762f},
+ {85.7143f,80.9524f},
+ {85.7143f,66.6667f},
+ {80.9524f,57.1429f},
+ {76.1905f,52.381f},
+ {61.9047f,47.619f},
+ {19.0476f,47.619f}
+};
+
+static const SFG_StrokeStrip ch80st[] =
+{
+ {2,ch80st0},
+ {10,ch80st1}
+};
+
+static const SFG_StrokeChar ch80 = {104.762f,2,ch80st};
+
+/* char: 0x51 */
+
+static const SFG_StrokeVertex ch81st0[] =
+{
+ {42.8571f,100.0f},
+ {33.3333f,95.2381f},
+ {23.8095f,85.7143f},
+ {19.0476f,76.1905f},
+ {14.2857f,61.9048f},
+ {14.2857f,38.0952f},
+ {19.0476f,23.8095f},
+ {23.8095f,14.2857f},
+ {33.3333f,4.7619f},
+ {42.8571f,0.0f},
+ {61.9047f,0.0f},
+ {71.4286f,4.7619f},
+ {80.9524f,14.2857f},
+ {85.7143f,23.8095f},
+ {90.4762f,38.0952f},
+ {90.4762f,61.9048f},
+ {85.7143f,76.1905f},
+ {80.9524f,85.7143f},
+ {71.4286f,95.2381f},
+ {61.9047f,100.0f},
+ {42.8571f,100.0f}
+};
+
+static const SFG_StrokeVertex ch81st1[] =
+{
+ {57.1428f,19.0476f},
+ {85.7143f,-9.5238f}
+};
+
+static const SFG_StrokeStrip ch81st[] =
+{
+ {21,ch81st0},
+ {2,ch81st1}
+};
+
+static const SFG_StrokeChar ch81 = {104.762f,2,ch81st};
+
+/* char: 0x52 */
+
+static const SFG_StrokeVertex ch82st0[] =
+{
+ {19.0476f,100.0f},
+ {19.0476f,0.0f}
+};
+
+static const SFG_StrokeVertex ch82st1[] =
+{
+ {19.0476f,100.0f},
+ {61.9047f,100.0f},
+ {76.1905f,95.2381f},
+ {80.9524f,90.4762f},
+ {85.7143f,80.9524f},
+ {85.7143f,71.4286f},
+ {80.9524f,61.9048f},
+ {76.1905f,57.1429f},
+ {61.9047f,52.381f},
+ {19.0476f,52.381f}
+};
+
+static const SFG_StrokeVertex ch82st2[] =
+{
+ {52.3809f,52.381f},
+ {85.7143f,0.0f}
+};
+
+static const SFG_StrokeStrip ch82st[] =
+{
+ {2,ch82st0},
+ {10,ch82st1},
+ {2,ch82st2}
+};
+
+static const SFG_StrokeChar ch82 = {104.762f,3,ch82st};
+
+/* char: 0x53 */
+
+static const SFG_StrokeVertex ch83st0[] =
+{
+ {85.7143f,85.7143f},
+ {76.1905f,95.2381f},
+ {61.9047f,100.0f},
+ {42.8571f,100.0f},
+ {28.5714f,95.2381f},
+ {19.0476f,85.7143f},
+ {19.0476f,76.1905f},
+ {23.8095f,66.6667f},
+ {28.5714f,61.9048f},
+ {38.0952f,57.1429f},
+ {66.6666f,47.619f},
+ {76.1905f,42.8571f},
+ {80.9524f,38.0952f},
+ {85.7143f,28.5714f},
+ {85.7143f,14.2857f},
+ {76.1905f,4.7619f},
+ {61.9047f,0.0f},
+ {42.8571f,0.0f},
+ {28.5714f,4.7619f},
+ {19.0476f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch83st[] =
+{
+ {20,ch83st0}
+};
+
+static const SFG_StrokeChar ch83 = {104.762f,1,ch83st};
+
+/* char: 0x54 */
+
+static const SFG_StrokeVertex ch84st0[] =
+{
+ {52.3809f,100.0f},
+ {52.3809f,0.0f}
+};
+
+static const SFG_StrokeVertex ch84st1[] =
+{
+ {19.0476f,100.0f},
+ {85.7143f,100.0f}
+};
+
+static const SFG_StrokeStrip ch84st[] =
+{
+ {2,ch84st0},
+ {2,ch84st1}
+};
+
+static const SFG_StrokeChar ch84 = {104.762f,2,ch84st};
+
+/* char: 0x55 */
+
+static const SFG_StrokeVertex ch85st0[] =
+{
+ {19.0476f,100.0f},
+ {19.0476f,28.5714f},
+ {23.8095f,14.2857f},
+ {33.3333f,4.7619f},
+ {47.619f,0.0f},
+ {57.1428f,0.0f},
+ {71.4286f,4.7619f},
+ {80.9524f,14.2857f},
+ {85.7143f,28.5714f},
+ {85.7143f,100.0f}
+};
+
+static const SFG_StrokeStrip ch85st[] =
+{
+ {10,ch85st0}
+};
+
+static const SFG_StrokeChar ch85 = {104.762f,1,ch85st};
+
+/* char: 0x56 */
+
+static const SFG_StrokeVertex ch86st0[] =
+{
+ {14.2857f,100.0f},
+ {52.3809f,0.0f}
+};
+
+static const SFG_StrokeVertex ch86st1[] =
+{
+ {90.4762f,100.0f},
+ {52.3809f,0.0f}
+};
+
+static const SFG_StrokeStrip ch86st[] =
+{
+ {2,ch86st0},
+ {2,ch86st1}
+};
+
+static const SFG_StrokeChar ch86 = {104.762f,2,ch86st};
+
+/* char: 0x57 */
+
+static const SFG_StrokeVertex ch87st0[] =
+{
+ {4.7619f,100.0f},
+ {28.5714f,0.0f}
+};
+
+static const SFG_StrokeVertex ch87st1[] =
+{
+ {52.3809f,100.0f},
+ {28.5714f,0.0f}
+};
+
+static const SFG_StrokeVertex ch87st2[] =
+{
+ {52.3809f,100.0f},
+ {76.1905f,0.0f}
+};
+
+static const SFG_StrokeVertex ch87st3[] =
+{
+ {100.0f,100.0f},
+ {76.1905f,0.0f}
+};
+
+static const SFG_StrokeStrip ch87st[] =
+{
+ {2,ch87st0},
+ {2,ch87st1},
+ {2,ch87st2},
+ {2,ch87st3}
+};
+
+static const SFG_StrokeChar ch87 = {104.762f,4,ch87st};
+
+/* char: 0x58 */
+
+static const SFG_StrokeVertex ch88st0[] =
+{
+ {19.0476f,100.0f},
+ {85.7143f,0.0f}
+};
+
+static const SFG_StrokeVertex ch88st1[] =
+{
+ {85.7143f,100.0f},
+ {19.0476f,0.0f}
+};
+
+static const SFG_StrokeStrip ch88st[] =
+{
+ {2,ch88st0},
+ {2,ch88st1}
+};
+
+static const SFG_StrokeChar ch88 = {104.762f,2,ch88st};
+
+/* char: 0x59 */
+
+static const SFG_StrokeVertex ch89st0[] =
+{
+ {14.2857f,100.0f},
+ {52.3809f,52.381f},
+ {52.3809f,0.0f}
+};
+
+static const SFG_StrokeVertex ch89st1[] =
+{
+ {90.4762f,100.0f},
+ {52.3809f,52.381f}
+};
+
+static const SFG_StrokeStrip ch89st[] =
+{
+ {3,ch89st0},
+ {2,ch89st1}
+};
+
+static const SFG_StrokeChar ch89 = {104.762f,2,ch89st};
+
+/* char: 0x5a */
+
+static const SFG_StrokeVertex ch90st0[] =
+{
+ {85.7143f,100.0f},
+ {19.0476f,0.0f}
+};
+
+static const SFG_StrokeVertex ch90st1[] =
+{
+ {19.0476f,100.0f},
+ {85.7143f,100.0f}
+};
+
+static const SFG_StrokeVertex ch90st2[] =
+{
+ {19.0476f,0.0f},
+ {85.7143f,0.0f}
+};
+
+static const SFG_StrokeStrip ch90st[] =
+{
+ {2,ch90st0},
+ {2,ch90st1},
+ {2,ch90st2}
+};
+
+static const SFG_StrokeChar ch90 = {104.762f,3,ch90st};
+
+/* char: 0x5b */
+
+static const SFG_StrokeVertex ch91st0[] =
+{
+ {35.7143f,119.048f},
+ {35.7143f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch91st1[] =
+{
+ {40.4762f,119.048f},
+ {40.4762f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch91st2[] =
+{
+ {35.7143f,119.048f},
+ {69.0476f,119.048f}
+};
+
+static const SFG_StrokeVertex ch91st3[] =
+{
+ {35.7143f,-33.3333f},
+ {69.0476f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch91st[] =
+{
+ {2,ch91st0},
+ {2,ch91st1},
+ {2,ch91st2},
+ {2,ch91st3}
+};
+
+static const SFG_StrokeChar ch91 = {104.762f,4,ch91st};
+
+/* char: 0x5c */
+
+static const SFG_StrokeVertex ch92st0[] =
+{
+ {19.0476f,100.0f},
+ {85.7143f,-14.2857f}
+};
+
+static const SFG_StrokeStrip ch92st[] =
+{
+ {2,ch92st0}
+};
+
+static const SFG_StrokeChar ch92 = {104.762f,1,ch92st};
+
+/* char: 0x5d */
+
+static const SFG_StrokeVertex ch93st0[] =
+{
+ {64.2857f,119.048f},
+ {64.2857f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch93st1[] =
+{
+ {69.0476f,119.048f},
+ {69.0476f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch93st2[] =
+{
+ {35.7143f,119.048f},
+ {69.0476f,119.048f}
+};
+
+static const SFG_StrokeVertex ch93st3[] =
+{
+ {35.7143f,-33.3333f},
+ {69.0476f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch93st[] =
+{
+ {2,ch93st0},
+ {2,ch93st1},
+ {2,ch93st2},
+ {2,ch93st3}
+};
+
+static const SFG_StrokeChar ch93 = {104.762f,4,ch93st};
+
+/* char: 0x5e */
+
+static const SFG_StrokeVertex ch94st0[] =
+{
+ {52.3809f,109.524f},
+ {14.2857f,42.8571f}
+};
+
+static const SFG_StrokeVertex ch94st1[] =
+{
+ {52.3809f,109.524f},
+ {90.4762f,42.8571f}
+};
+
+static const SFG_StrokeStrip ch94st[] =
+{
+ {2,ch94st0},
+ {2,ch94st1}
+};
+
+static const SFG_StrokeChar ch94 = {104.762f,2,ch94st};
+
+/* char: 0x5f */
+
+static const SFG_StrokeVertex ch95st0[] =
+{
+ {0,-33.3333f},
+ {104.762f,-33.3333f},
+ {104.762f,-28.5714f},
+ {0,-28.5714f},
+ {0,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch95st[] =
+{
+ {5,ch95st0}
+};
+
+static const SFG_StrokeChar ch95 = {104.762f,1,ch95st};
+
+/* char: 0x60 */
+
+static const SFG_StrokeVertex ch96st0[] =
+{
+ {42.8572f,100.0f},
+ {66.6667f,71.4286f}
+};
+
+static const SFG_StrokeVertex ch96st1[] =
+{
+ {42.8572f,100.0f},
+ {38.0953f,95.2381f},
+ {66.6667f,71.4286f}
+};
+
+static const SFG_StrokeStrip ch96st[] =
+{
+ {2,ch96st0},
+ {3,ch96st1}
+};
+
+static const SFG_StrokeChar ch96 = {104.762f,2,ch96st};
+
+/* char: 0x61 */
+
+static const SFG_StrokeVertex ch97st0[] =
+{
+ {80.9524f,66.6667f},
+ {80.9524f,0.0f}
+};
+
+static const SFG_StrokeVertex ch97st1[] =
+{
+ {80.9524f,52.381f},
+ {71.4285f,61.9048f},
+ {61.9047f,66.6667f},
+ {47.619f,66.6667f},
+ {38.0952f,61.9048f},
+ {28.5714f,52.381f},
+ {23.8095f,38.0952f},
+ {23.8095f,28.5714f},
+ {28.5714f,14.2857f},
+ {38.0952f,4.7619f},
+ {47.619f,0.0f},
+ {61.9047f,0.0f},
+ {71.4285f,4.7619f},
+ {80.9524f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch97st[] =
+{
+ {2,ch97st0},
+ {14,ch97st1}
+};
+
+static const SFG_StrokeChar ch97 = {104.762f,2,ch97st};
+
+/* char: 0x62 */
+
+static const SFG_StrokeVertex ch98st0[] =
+{
+ {23.8095f,100.0f},
+ {23.8095f,0.0f}
+};
+
+static const SFG_StrokeVertex ch98st1[] =
+{
+ {23.8095f,52.381f},
+ {33.3333f,61.9048f},
+ {42.8571f,66.6667f},
+ {57.1428f,66.6667f},
+ {66.6666f,61.9048f},
+ {76.1905f,52.381f},
+ {80.9524f,38.0952f},
+ {80.9524f,28.5714f},
+ {76.1905f,14.2857f},
+ {66.6666f,4.7619f},
+ {57.1428f,0.0f},
+ {42.8571f,0.0f},
+ {33.3333f,4.7619f},
+ {23.8095f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch98st[] =
+{
+ {2,ch98st0},
+ {14,ch98st1}
+};
+
+static const SFG_StrokeChar ch98 = {104.762f,2,ch98st};
+
+/* char: 0x63 */
+
+static const SFG_StrokeVertex ch99st0[] =
+{
+ {80.9524f,52.381f},
+ {71.4285f,61.9048f},
+ {61.9047f,66.6667f},
+ {47.619f,66.6667f},
+ {38.0952f,61.9048f},
+ {28.5714f,52.381f},
+ {23.8095f,38.0952f},
+ {23.8095f,28.5714f},
+ {28.5714f,14.2857f},
+ {38.0952f,4.7619f},
+ {47.619f,0.0f},
+ {61.9047f,0.0f},
+ {71.4285f,4.7619f},
+ {80.9524f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch99st[] =
+{
+ {14,ch99st0}
+};
+
+static const SFG_StrokeChar ch99 = {104.762f,1,ch99st};
+
+/* char: 0x64 */
+
+static const SFG_StrokeVertex ch100st0[] =
+{
+ {80.9524f,100.0f},
+ {80.9524f,0.0f}
+};
+
+static const SFG_StrokeVertex ch100st1[] =
+{
+ {80.9524f,52.381f},
+ {71.4285f,61.9048f},
+ {61.9047f,66.6667f},
+ {47.619f,66.6667f},
+ {38.0952f,61.9048f},
+ {28.5714f,52.381f},
+ {23.8095f,38.0952f},
+ {23.8095f,28.5714f},
+ {28.5714f,14.2857f},
+ {38.0952f,4.7619f},
+ {47.619f,0.0f},
+ {61.9047f,0.0f},
+ {71.4285f,4.7619f},
+ {80.9524f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch100st[] =
+{
+ {2,ch100st0},
+ {14,ch100st1}
+};
+
+static const SFG_StrokeChar ch100 = {104.762f,2,ch100st};
+
+/* char: 0x65 */
+
+static const SFG_StrokeVertex ch101st0[] =
+{
+ {23.8095f,38.0952f},
+ {80.9524f,38.0952f},
+ {80.9524f,47.619f},
+ {76.1905f,57.1429f},
+ {71.4285f,61.9048f},
+ {61.9047f,66.6667f},
+ {47.619f,66.6667f},
+ {38.0952f,61.9048f},
+ {28.5714f,52.381f},
+ {23.8095f,38.0952f},
+ {23.8095f,28.5714f},
+ {28.5714f,14.2857f},
+ {38.0952f,4.7619f},
+ {47.619f,0.0f},
+ {61.9047f,0.0f},
+ {71.4285f,4.7619f},
+ {80.9524f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch101st[] =
+{
+ {17,ch101st0}
+};
+
+static const SFG_StrokeChar ch101 = {104.762f,1,ch101st};
+
+/* char: 0x66 */
+
+static const SFG_StrokeVertex ch102st0[] =
+{
+ {71.4286f,100.0f},
+ {61.9048f,100.0f},
+ {52.381f,95.2381f},
+ {47.6191f,80.9524f},
+ {47.6191f,0.0f}
+};
+
+static const SFG_StrokeVertex ch102st1[] =
+{
+ {33.3334f,66.6667f},
+ {66.6667f,66.6667f}
+};
+
+static const SFG_StrokeStrip ch102st[] =
+{
+ {5,ch102st0},
+ {2,ch102st1}
+};
+
+static const SFG_StrokeChar ch102 = {104.762f,2,ch102st};
+
+/* char: 0x67 */
+
+static const SFG_StrokeVertex ch103st0[] =
+{
+ {80.9524f,66.6667f},
+ {80.9524f,-9.5238f},
+ {76.1905f,-23.8095f},
+ {71.4285f,-28.5714f},
+ {61.9047f,-33.3333f},
+ {47.619f,-33.3333f},
+ {38.0952f,-28.5714f}
+};
+
+static const SFG_StrokeVertex ch103st1[] =
+{
+ {80.9524f,52.381f},
+ {71.4285f,61.9048f},
+ {61.9047f,66.6667f},
+ {47.619f,66.6667f},
+ {38.0952f,61.9048f},
+ {28.5714f,52.381f},
+ {23.8095f,38.0952f},
+ {23.8095f,28.5714f},
+ {28.5714f,14.2857f},
+ {38.0952f,4.7619f},
+ {47.619f,0.0f},
+ {61.9047f,0.0f},
+ {71.4285f,4.7619f},
+ {80.9524f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch103st[] =
+{
+ {7,ch103st0},
+ {14,ch103st1}
+};
+
+static const SFG_StrokeChar ch103 = {104.762f,2,ch103st};
+
+/* char: 0x68 */
+
+static const SFG_StrokeVertex ch104st0[] =
+{
+ {26.1905f,100.0f},
+ {26.1905f,0.0f}
+};
+
+static const SFG_StrokeVertex ch104st1[] =
+{
+ {26.1905f,47.619f},
+ {40.4762f,61.9048f},
+ {50.0f,66.6667f},
+ {64.2857f,66.6667f},
+ {73.8095f,61.9048f},
+ {78.5715f,47.619f},
+ {78.5715f,0.0f}
+};
+
+static const SFG_StrokeStrip ch104st[] =
+{
+ {2,ch104st0},
+ {7,ch104st1}
+};
+
+static const SFG_StrokeChar ch104 = {104.762f,2,ch104st};
+
+/* char: 0x69 */
+
+static const SFG_StrokeVertex ch105st0[] =
+{
+ {47.6191f,100.0f},
+ {52.381f,95.2381f},
+ {57.1429f,100.0f},
+ {52.381f,104.762f},
+ {47.6191f,100.0f}
+};
+
+static const SFG_StrokeVertex ch105st1[] =
+{
+ {52.381f,66.6667f},
+ {52.381f,0.0f}
+};
+
+static const SFG_StrokeStrip ch105st[] =
+{
+ {5,ch105st0},
+ {2,ch105st1}
+};
+
+static const SFG_StrokeChar ch105 = {104.762f,2,ch105st};
+
+/* char: 0x6a */
+
+static const SFG_StrokeVertex ch106st0[] =
+{
+ {57.1429f,100.0f},
+ {61.9048f,95.2381f},
+ {66.6667f,100.0f},
+ {61.9048f,104.762f},
+ {57.1429f,100.0f}
+};
+
+static const SFG_StrokeVertex ch106st1[] =
+{
+ {61.9048f,66.6667f},
+ {61.9048f,-14.2857f},
+ {57.1429f,-28.5714f},
+ {47.6191f,-33.3333f},
+ {38.0953f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch106st[] =
+{
+ {5,ch106st0},
+ {5,ch106st1}
+};
+
+static const SFG_StrokeChar ch106 = {104.762f,2,ch106st};
+
+/* char: 0x6b */
+
+static const SFG_StrokeVertex ch107st0[] =
+{
+ {26.1905f,100.0f},
+ {26.1905f,0.0f}
+};
+
+static const SFG_StrokeVertex ch107st1[] =
+{
+ {73.8095f,66.6667f},
+ {26.1905f,19.0476f}
+};
+
+static const SFG_StrokeVertex ch107st2[] =
+{
+ {45.2381f,38.0952f},
+ {78.5715f,0.0f}
+};
+
+static const SFG_StrokeStrip ch107st[] =
+{
+ {2,ch107st0},
+ {2,ch107st1},
+ {2,ch107st2}
+};
+
+static const SFG_StrokeChar ch107 = {104.762f,3,ch107st};
+
+/* char: 0x6c */
+
+static const SFG_StrokeVertex ch108st0[] =
+{
+ {52.381f,100.0f},
+ {52.381f,0.0f}
+};
+
+static const SFG_StrokeStrip ch108st[] =
+{
+ {2,ch108st0}
+};
+
+static const SFG_StrokeChar ch108 = {104.762f,1,ch108st};
+
+/* char: 0x6d */
+
+static const SFG_StrokeVertex ch109st0[] =
+{
+ {0,66.6667f},
+ {0,0.0f}
+};
+
+static const SFG_StrokeVertex ch109st1[] =
+{
+ {0,47.619f},
+ {14.2857f,61.9048f},
+ {23.8095f,66.6667f},
+ {38.0952f,66.6667f},
+ {47.619f,61.9048f},
+ {52.381f,47.619f},
+ {52.381f,0.0f}
+};
+
+static const SFG_StrokeVertex ch109st2[] =
+{
+ {52.381f,47.619f},
+ {66.6667f,61.9048f},
+ {76.1905f,66.6667f},
+ {90.4762f,66.6667f},
+ {100.0f,61.9048f},
+ {104.762f,47.619f},
+ {104.762f,0.0f}
+};
+
+static const SFG_StrokeStrip ch109st[] =
+{
+ {2,ch109st0},
+ {7,ch109st1},
+ {7,ch109st2}
+};
+
+static const SFG_StrokeChar ch109 = {104.762f,3,ch109st};
+
+/* char: 0x6e */
+
+static const SFG_StrokeVertex ch110st0[] =
+{
+ {26.1905f,66.6667f},
+ {26.1905f,0.0f}
+};
+
+static const SFG_StrokeVertex ch110st1[] =
+{
+ {26.1905f,47.619f},
+ {40.4762f,61.9048f},
+ {50.0f,66.6667f},
+ {64.2857f,66.6667f},
+ {73.8095f,61.9048f},
+ {78.5715f,47.619f},
+ {78.5715f,0.0f}
+};
+
+static const SFG_StrokeStrip ch110st[] =
+{
+ {2,ch110st0},
+ {7,ch110st1}
+};
+
+static const SFG_StrokeChar ch110 = {104.762f,2,ch110st};
+
+/* char: 0x6f */
+
+static const SFG_StrokeVertex ch111st0[] =
+{
+ {45.2381f,66.6667f},
+ {35.7143f,61.9048f},
+ {26.1905f,52.381f},
+ {21.4286f,38.0952f},
+ {21.4286f,28.5714f},
+ {26.1905f,14.2857f},
+ {35.7143f,4.7619f},
+ {45.2381f,0.0f},
+ {59.5238f,0.0f},
+ {69.0476f,4.7619f},
+ {78.5714f,14.2857f},
+ {83.3334f,28.5714f},
+ {83.3334f,38.0952f},
+ {78.5714f,52.381f},
+ {69.0476f,61.9048f},
+ {59.5238f,66.6667f},
+ {45.2381f,66.6667f}
+};
+
+static const SFG_StrokeStrip ch111st[] =
+{
+ {17,ch111st0}
+};
+
+static const SFG_StrokeChar ch111 = {104.762f,1,ch111st};
+
+/* char: 0x70 */
+
+static const SFG_StrokeVertex ch112st0[] =
+{
+ {23.8095f,66.6667f},
+ {23.8095f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch112st1[] =
+{
+ {23.8095f,52.381f},
+ {33.3333f,61.9048f},
+ {42.8571f,66.6667f},
+ {57.1428f,66.6667f},
+ {66.6666f,61.9048f},
+ {76.1905f,52.381f},
+ {80.9524f,38.0952f},
+ {80.9524f,28.5714f},
+ {76.1905f,14.2857f},
+ {66.6666f,4.7619f},
+ {57.1428f,0.0f},
+ {42.8571f,0.0f},
+ {33.3333f,4.7619f},
+ {23.8095f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch112st[] =
+{
+ {2,ch112st0},
+ {14,ch112st1}
+};
+
+static const SFG_StrokeChar ch112 = {104.762f,2,ch112st};
+
+/* char: 0x71 */
+
+static const SFG_StrokeVertex ch113st0[] =
+{
+ {80.9524f,66.6667f},
+ {80.9524f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch113st1[] =
+{
+ {80.9524f,52.381f},
+ {71.4285f,61.9048f},
+ {61.9047f,66.6667f},
+ {47.619f,66.6667f},
+ {38.0952f,61.9048f},
+ {28.5714f,52.381f},
+ {23.8095f,38.0952f},
+ {23.8095f,28.5714f},
+ {28.5714f,14.2857f},
+ {38.0952f,4.7619f},
+ {47.619f,0.0f},
+ {61.9047f,0.0f},
+ {71.4285f,4.7619f},
+ {80.9524f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch113st[] =
+{
+ {2,ch113st0},
+ {14,ch113st1}
+};
+
+static const SFG_StrokeChar ch113 = {104.762f,2,ch113st};
+
+/* char: 0x72 */
+
+static const SFG_StrokeVertex ch114st0[] =
+{
+ {33.3334f,66.6667f},
+ {33.3334f,0.0f}
+};
+
+static const SFG_StrokeVertex ch114st1[] =
+{
+ {33.3334f,38.0952f},
+ {38.0953f,52.381f},
+ {47.6191f,61.9048f},
+ {57.1429f,66.6667f},
+ {71.4286f,66.6667f}
+};
+
+static const SFG_StrokeStrip ch114st[] =
+{
+ {2,ch114st0},
+ {5,ch114st1}
+};
+
+static const SFG_StrokeChar ch114 = {104.762f,2,ch114st};
+
+/* char: 0x73 */
+
+static const SFG_StrokeVertex ch115st0[] =
+{
+ {78.5715f,52.381f},
+ {73.8095f,61.9048f},
+ {59.5238f,66.6667f},
+ {45.2381f,66.6667f},
+ {30.9524f,61.9048f},
+ {26.1905f,52.381f},
+ {30.9524f,42.8571f},
+ {40.4762f,38.0952f},
+ {64.2857f,33.3333f},
+ {73.8095f,28.5714f},
+ {78.5715f,19.0476f},
+ {78.5715f,14.2857f},
+ {73.8095f,4.7619f},
+ {59.5238f,0.0f},
+ {45.2381f,0.0f},
+ {30.9524f,4.7619f},
+ {26.1905f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch115st[] =
+{
+ {17,ch115st0}
+};
+
+static const SFG_StrokeChar ch115 = {104.762f,1,ch115st};
+
+/* char: 0x74 */
+
+static const SFG_StrokeVertex ch116st0[] =
+{
+ {47.6191f,100.0f},
+ {47.6191f,19.0476f},
+ {52.381f,4.7619f},
+ {61.9048f,0.0f},
+ {71.4286f,0.0f}
+};
+
+static const SFG_StrokeVertex ch116st1[] =
+{
+ {33.3334f,66.6667f},
+ {66.6667f,66.6667f}
+};
+
+static const SFG_StrokeStrip ch116st[] =
+{
+ {5,ch116st0},
+ {2,ch116st1}
+};
+
+static const SFG_StrokeChar ch116 = {104.762f,2,ch116st};
+
+/* char: 0x75 */
+
+static const SFG_StrokeVertex ch117st0[] =
+{
+ {26.1905f,66.6667f},
+ {26.1905f,19.0476f},
+ {30.9524f,4.7619f},
+ {40.4762f,0.0f},
+ {54.7619f,0.0f},
+ {64.2857f,4.7619f},
+ {78.5715f,19.0476f}
+};
+
+static const SFG_StrokeVertex ch117st1[] =
+{
+ {78.5715f,66.6667f},
+ {78.5715f,0.0f}
+};
+
+static const SFG_StrokeStrip ch117st[] =
+{
+ {7,ch117st0},
+ {2,ch117st1}
+};
+
+static const SFG_StrokeChar ch117 = {104.762f,2,ch117st};
+
+/* char: 0x76 */
+
+static const SFG_StrokeVertex ch118st0[] =
+{
+ {23.8095f,66.6667f},
+ {52.3809f,0.0f}
+};
+
+static const SFG_StrokeVertex ch118st1[] =
+{
+ {80.9524f,66.6667f},
+ {52.3809f,0.0f}
+};
+
+static const SFG_StrokeStrip ch118st[] =
+{
+ {2,ch118st0},
+ {2,ch118st1}
+};
+
+static const SFG_StrokeChar ch118 = {104.762f,2,ch118st};
+
+/* char: 0x77 */
+
+static const SFG_StrokeVertex ch119st0[] =
+{
+ {14.2857f,66.6667f},
+ {33.3333f,0.0f}
+};
+
+static const SFG_StrokeVertex ch119st1[] =
+{
+ {52.3809f,66.6667f},
+ {33.3333f,0.0f}
+};
+
+static const SFG_StrokeVertex ch119st2[] =
+{
+ {52.3809f,66.6667f},
+ {71.4286f,0.0f}
+};
+
+static const SFG_StrokeVertex ch119st3[] =
+{
+ {90.4762f,66.6667f},
+ {71.4286f,0.0f}
+};
+
+static const SFG_StrokeStrip ch119st[] =
+{
+ {2,ch119st0},
+ {2,ch119st1},
+ {2,ch119st2},
+ {2,ch119st3}
+};
+
+static const SFG_StrokeChar ch119 = {104.762f,4,ch119st};
+
+/* char: 0x78 */
+
+static const SFG_StrokeVertex ch120st0[] =
+{
+ {26.1905f,66.6667f},
+ {78.5715f,0.0f}
+};
+
+static const SFG_StrokeVertex ch120st1[] =
+{
+ {78.5715f,66.6667f},
+ {26.1905f,0.0f}
+};
+
+static const SFG_StrokeStrip ch120st[] =
+{
+ {2,ch120st0},
+ {2,ch120st1}
+};
+
+static const SFG_StrokeChar ch120 = {104.762f,2,ch120st};
+
+/* char: 0x79 */
+
+static const SFG_StrokeVertex ch121st0[] =
+{
+ {26.1905f,66.6667f},
+ {54.7619f,0.0f}
+};
+
+static const SFG_StrokeVertex ch121st1[] =
+{
+ {83.3334f,66.6667f},
+ {54.7619f,0.0f},
+ {45.2381f,-19.0476f},
+ {35.7143f,-28.5714f},
+ {26.1905f,-33.3333f},
+ {21.4286f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch121st[] =
+{
+ {2,ch121st0},
+ {6,ch121st1}
+};
+
+static const SFG_StrokeChar ch121 = {104.762f,2,ch121st};
+
+/* char: 0x7a */
+
+static const SFG_StrokeVertex ch122st0[] =
+{
+ {78.5715f,66.6667f},
+ {26.1905f,0.0f}
+};
+
+static const SFG_StrokeVertex ch122st1[] =
+{
+ {26.1905f,66.6667f},
+ {78.5715f,66.6667f}
+};
+
+static const SFG_StrokeVertex ch122st2[] =
+{
+ {26.1905f,0.0f},
+ {78.5715f,0.0f}
+};
+
+static const SFG_StrokeStrip ch122st[] =
+{
+ {2,ch122st0},
+ {2,ch122st1},
+ {2,ch122st2}
+};
+
+static const SFG_StrokeChar ch122 = {104.762f,3,ch122st};
+
+/* char: 0x7b */
+
+static const SFG_StrokeVertex ch123st0[] =
+{
+ {64.2857f,119.048f},
+ {54.7619f,114.286f},
+ {50.0f,109.524f},
+ {45.2381f,100.0f},
+ {45.2381f,90.4762f},
+ {50.0f,80.9524f},
+ {54.7619f,76.1905f},
+ {59.5238f,66.6667f},
+ {59.5238f,57.1429f},
+ {50.0f,47.619f}
+};
+
+static const SFG_StrokeVertex ch123st1[] =
+{
+ {54.7619f,114.286f},
+ {50.0f,104.762f},
+ {50.0f,95.2381f},
+ {54.7619f,85.7143f},
+ {59.5238f,80.9524f},
+ {64.2857f,71.4286f},
+ {64.2857f,61.9048f},
+ {59.5238f,52.381f},
+ {40.4762f,42.8571f},
+ {59.5238f,33.3333f},
+ {64.2857f,23.8095f},
+ {64.2857f,14.2857f},
+ {59.5238f,4.7619f},
+ {54.7619f,0.0f},
+ {50.0f,-9.5238f},
+ {50.0f,-19.0476f},
+ {54.7619f,-28.5714f}
+};
+
+static const SFG_StrokeVertex ch123st2[] =
+{
+ {50.0f,38.0952f},
+ {59.5238f,28.5714f},
+ {59.5238f,19.0476f},
+ {54.7619f,9.5238f},
+ {50.0f,4.7619f},
+ {45.2381f,-4.7619f},
+ {45.2381f,-14.2857f},
+ {50.0f,-23.8095f},
+ {54.7619f,-28.5714f},
+ {64.2857f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch123st[] =
+{
+ {10,ch123st0},
+ {17,ch123st1},
+ {10,ch123st2}
+};
+
+static const SFG_StrokeChar ch123 = {104.762f,3,ch123st};
+
+/* char: 0x7c */
+
+static const SFG_StrokeVertex ch124st0[] =
+{
+ {52.381f,119.048f},
+ {52.381f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch124st[] =
+{
+ {2,ch124st0}
+};
+
+static const SFG_StrokeChar ch124 = {104.762f,1,ch124st};
+
+/* char: 0x7d */
+
+static const SFG_StrokeVertex ch125st0[] =
+{
+ {40.4762f,119.048f},
+ {50.0f,114.286f},
+ {54.7619f,109.524f},
+ {59.5238f,100.0f},
+ {59.5238f,90.4762f},
+ {54.7619f,80.9524f},
+ {50.0f,76.1905f},
+ {45.2381f,66.6667f},
+ {45.2381f,57.1429f},
+ {54.7619f,47.619f}
+};
+
+static const SFG_StrokeVertex ch125st1[] =
+{
+ {50.0f,114.286f},
+ {54.7619f,104.762f},
+ {54.7619f,95.2381f},
+ {50.0f,85.7143f},
+ {45.2381f,80.9524f},
+ {40.4762f,71.4286f},
+ {40.4762f,61.9048f},
+ {45.2381f,52.381f},
+ {64.2857f,42.8571f},
+ {45.2381f,33.3333f},
+ {40.4762f,23.8095f},
+ {40.4762f,14.2857f},
+ {45.2381f,4.7619f},
+ {50.0f,0.0f},
+ {54.7619f,-9.5238f},
+ {54.7619f,-19.0476f},
+ {50.0f,-28.5714f}
+};
+
+static const SFG_StrokeVertex ch125st2[] =
+{
+ {54.7619f,38.0952f},
+ {45.2381f,28.5714f},
+ {45.2381f,19.0476f},
+ {50.0f,9.5238f},
+ {54.7619f,4.7619f},
+ {59.5238f,-4.7619f},
+ {59.5238f,-14.2857f},
+ {54.7619f,-23.8095f},
+ {50.0f,-28.5714f},
+ {40.4762f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch125st[] =
+{
+ {10,ch125st0},
+ {17,ch125st1},
+ {10,ch125st2}
+};
+
+static const SFG_StrokeChar ch125 = {104.762f,3,ch125st};
+
+/* char: 0x7e */
+
+static const SFG_StrokeVertex ch126st0[] =
+{
+ {9.5238f,28.5714f},
+ {9.5238f,38.0952f},
+ {14.2857f,52.381f},
+ {23.8095f,57.1429f},
+ {33.3333f,57.1429f},
+ {42.8571f,52.381f},
+ {61.9048f,38.0952f},
+ {71.4286f,33.3333f},
+ {80.9524f,33.3333f},
+ {90.4762f,38.0952f},
+ {95.2381f,47.619f}
+};
+
+static const SFG_StrokeVertex ch126st1[] =
+{
+ {9.5238f,38.0952f},
+ {14.2857f,47.619f},
+ {23.8095f,52.381f},
+ {33.3333f,52.381f},
+ {42.8571f,47.619f},
+ {61.9048f,33.3333f},
+ {71.4286f,28.5714f},
+ {80.9524f,28.5714f},
+ {90.4762f,33.3333f},
+ {95.2381f,47.619f},
+ {95.2381f,57.1429f}
+};
+
+static const SFG_StrokeStrip ch126st[] =
+{
+ {11,ch126st0},
+ {11,ch126st1}
+};
+
+static const SFG_StrokeChar ch126 = {104.762f,2,ch126st};
+
+/* char: 0x7f */
+
+static const SFG_StrokeVertex ch127st0[] =
+{
+ {71.4286f,100.0f},
+ {33.3333f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch127st1[] =
+{
+ {47.619f,66.6667f},
+ {33.3333f,61.9048f},
+ {23.8095f,52.381f},
+ {19.0476f,38.0952f},
+ {19.0476f,23.8095f},
+ {23.8095f,14.2857f},
+ {33.3333f,4.7619f},
+ {47.619f,0.0f},
+ {57.1428f,0.0f},
+ {71.4286f,4.7619f},
+ {80.9524f,14.2857f},
+ {85.7143f,28.5714f},
+ {85.7143f,42.8571f},
+ {80.9524f,52.381f},
+ {71.4286f,61.9048f},
+ {57.1428f,66.6667f},
+ {47.619f,66.6667f}
+};
+
+static const SFG_StrokeStrip ch127st[] =
+{
+ {2,ch127st0},
+ {17,ch127st1}
+};
+
+static const SFG_StrokeChar ch127 = {104.762f,2,ch127st};
+
+static const SFG_StrokeChar *chars[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ &ch32, &ch33, &ch34, &ch35, &ch36, &ch37, &ch38, &ch39,
+ &ch40, &ch41, &ch42, &ch43, &ch44, &ch45, &ch46, &ch47,
+ &ch48, &ch49, &ch50, &ch51, &ch52, &ch53, &ch54, &ch55,
+ &ch56, &ch57, &ch58, &ch59, &ch60, &ch61, &ch62, &ch63,
+ &ch64, &ch65, &ch66, &ch67, &ch68, &ch69, &ch70, &ch71,
+ &ch72, &ch73, &ch74, &ch75, &ch76, &ch77, &ch78, &ch79,
+ &ch80, &ch81, &ch82, &ch83, &ch84, &ch85, &ch86, &ch87,
+ &ch88, &ch89, &ch90, &ch91, &ch92, &ch93, &ch94, &ch95,
+ &ch96, &ch97, &ch98, &ch99, &ch100, &ch101, &ch102, &ch103,
+ &ch104, &ch105, &ch106, &ch107, &ch108, &ch109, &ch110, &ch111,
+ &ch112, &ch113, &ch114, &ch115, &ch116, &ch117, &ch118, &ch119,
+ &ch120, &ch121, &ch122, &ch123, &ch124, &ch125, &ch126, &ch127
+};
+
+const SFG_StrokeFont fgStrokeMonoRoman = {"MonoRoman",128,152.381f,chars};
index 948e369..da4e030 100644 (file)
-/*\r
- * freeglut_stroke_roman.c\r
- *\r
- * freeglut Roman stroke font definition\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Thu Dec 16 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-\r
-/* This file has been automatically generated by the genstroke utility. */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-/* char: 0x20 */\r
-\r
-static const SFG_StrokeStrip ch32st[] =\r
-{\r
-  { 0, NULL }\r
-};\r
-\r
-static const SFG_StrokeChar ch32 = {104.762f,0,ch32st};\r
-\r
-/* char: 0x21 */\r
-\r
-static const SFG_StrokeVertex ch33st0[] =\r
-{\r
- {13.3819f,100.0f},\r
- {13.3819f,33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch33st1[] =\r
-{\r
- {13.3819f,9.5238f},\r
- {8.62f,4.7619f},\r
- {13.3819f,0.0f},\r
- {18.1438f,4.7619f},\r
- {13.3819f,9.5238f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch33st[] =\r
-{\r
- {2,ch33st0},\r
- {5,ch33st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch33 = {26.6238f,2,ch33st};\r
-\r
-/* char: 0x22 */\r
-\r
-static const SFG_StrokeVertex ch34st0[] =\r
-{\r
- {4.02f,100.0f},\r
- {4.02f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch34st1[] =\r
-{\r
- {42.1152f,100.0f},\r
- {42.1152f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch34st[] =\r
-{\r
- {2,ch34st0},\r
- {2,ch34st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch34 = {51.4352f,2,ch34st};\r
-\r
-/* char: 0x23 */\r
-\r
-static const SFG_StrokeVertex ch35st0[] =\r
-{\r
- {41.2952f,119.048f},\r
- {7.9619f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch35st1[] =\r
-{\r
- {69.8667f,119.048f},\r
- {36.5333f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch35st2[] =\r
-{\r
- {7.9619f,57.1429f},\r
- {74.6286f,57.1429f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch35st3[] =\r
-{\r
- {3.2f,28.5714f},\r
- {69.8667f,28.5714f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch35st[] =\r
-{\r
- {2,ch35st0},\r
- {2,ch35st1},\r
- {2,ch35st2},\r
- {2,ch35st3}\r
-};\r
-\r
-static const SFG_StrokeChar ch35 = {79.4886f,4,ch35st};\r
-\r
-/* char: 0x24 */\r
-\r
-static const SFG_StrokeVertex ch36st0[] =\r
-{\r
- {28.6295f,119.048f},\r
- {28.6295f,-19.0476f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch36st1[] =\r
-{\r
- {47.6771f,119.048f},\r
- {47.6771f,-19.0476f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch36st2[] =\r
-{\r
- {71.4867f,85.7143f},\r
- {61.9629f,95.2381f},\r
- {47.6771f,100.0f},\r
- {28.6295f,100.0f},\r
- {14.3438f,95.2381f},\r
- {4.82f,85.7143f},\r
- {4.82f,76.1905f},\r
- {9.5819f,66.6667f},\r
- {14.3438f,61.9048f},\r
- {23.8676f,57.1429f},\r
- {52.439f,47.619f},\r
- {61.9629f,42.8571f},\r
- {66.7248f,38.0952f},\r
- {71.4867f,28.5714f},\r
- {71.4867f,14.2857f},\r
- {61.9629f,4.7619f},\r
- {47.6771f,0.0f},\r
- {28.6295f,0.0f},\r
- {14.3438f,4.7619f},\r
- {4.82f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch36st[] =\r
-{\r
- {2,ch36st0},\r
- {2,ch36st1},\r
- {20,ch36st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch36 = {76.2067f,3,ch36st};\r
-\r
-/* char: 0x25 */\r
-\r
-static const SFG_StrokeVertex ch37st0[] =\r
-{\r
- {92.0743f,100.0f},\r
- {6.36f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch37st1[] =\r
-{\r
- {30.1695f,100.0f},\r
- {39.6933f,90.4762f},\r
- {39.6933f,80.9524f},\r
- {34.9314f,71.4286f},\r
- {25.4076f,66.6667f},\r
- {15.8838f,66.6667f},\r
- {6.36f,76.1905f},\r
- {6.36f,85.7143f},\r
- {11.1219f,95.2381f},\r
- {20.6457f,100.0f},\r
- {30.1695f,100.0f},\r
- {39.6933f,95.2381f},\r
- {53.979f,90.4762f},\r
- {68.2648f,90.4762f},\r
- {82.5505f,95.2381f},\r
- {92.0743f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch37st2[] =\r
-{\r
- {73.0267f,33.3333f},\r
- {63.5029f,28.5714f},\r
- {58.741f,19.0476f},\r
- {58.741f,9.5238f},\r
- {68.2648f,0.0f},\r
- {77.7886f,0.0f},\r
- {87.3124f,4.7619f},\r
- {92.0743f,14.2857f},\r
- {92.0743f,23.8095f},\r
- {82.5505f,33.3333f},\r
- {73.0267f,33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch37st[] =\r
-{\r
- {2,ch37st0},\r
- {16,ch37st1},\r
- {11,ch37st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch37 = {96.5743f,3,ch37st};\r
-\r
-/* char: 0x26 */\r
-\r
-static const SFG_StrokeVertex ch38st0[] =\r
-{\r
- {101.218f,57.1429f},\r
- {101.218f,61.9048f},\r
- {96.4562f,66.6667f},\r
- {91.6943f,66.6667f},\r
- {86.9324f,61.9048f},\r
- {82.1705f,52.381f},\r
- {72.6467f,28.5714f},\r
- {63.1229f,14.2857f},\r
- {53.599f,4.7619f},\r
- {44.0752f,0.0f},\r
- {25.0276f,0.0f},\r
- {15.5038f,4.7619f},\r
- {10.7419f,9.5238f},\r
- {5.98f,19.0476f},\r
- {5.98f,28.5714f},\r
- {10.7419f,38.0952f},\r
- {15.5038f,42.8571f},\r
- {48.8371f,61.9048f},\r
- {53.599f,66.6667f},\r
- {58.361f,76.1905f},\r
- {58.361f,85.7143f},\r
- {53.599f,95.2381f},\r
- {44.0752f,100.0f},\r
- {34.5514f,95.2381f},\r
- {29.7895f,85.7143f},\r
- {29.7895f,76.1905f},\r
- {34.5514f,61.9048f},\r
- {44.0752f,47.619f},\r
- {67.8848f,14.2857f},\r
- {77.4086f,4.7619f},\r
- {86.9324f,0.0f},\r
- {96.4562f,0.0f},\r
- {101.218f,4.7619f},\r
- {101.218f,9.5238f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch38st[] =\r
-{\r
- {34,ch38st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch38 = {101.758f,1,ch38st};\r
-\r
-/* char: 0x27 */\r
-\r
-static const SFG_StrokeVertex ch39st0[] =\r
-{\r
- {4.44f,100.0f},\r
- {4.44f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch39st[] =\r
-{\r
- {2,ch39st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch39 = {13.62f,1,ch39st};\r
-\r
-/* char: 0x28 */\r
-\r
-static const SFG_StrokeVertex ch40st0[] =\r
-{\r
- {40.9133f,119.048f},\r
- {31.3895f,109.524f},\r
- {21.8657f,95.2381f},\r
- {12.3419f,76.1905f},\r
- {7.58f,52.381f},\r
- {7.58f,33.3333f},\r
- {12.3419f,9.5238f},\r
- {21.8657f,-9.5238f},\r
- {31.3895f,-23.8095f},\r
- {40.9133f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch40st[] =\r
-{\r
- {10,ch40st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch40 = {47.1733f,1,ch40st};\r
-\r
-/* char: 0x29 */\r
-\r
-static const SFG_StrokeVertex ch41st0[] =\r
-{\r
- {5.28f,119.048f},\r
- {14.8038f,109.524f},\r
- {24.3276f,95.2381f},\r
- {33.8514f,76.1905f},\r
- {38.6133f,52.381f},\r
- {38.6133f,33.3333f},\r
- {33.8514f,9.5238f},\r
- {24.3276f,-9.5238f},\r
- {14.8038f,-23.8095f},\r
- {5.28f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch41st[] =\r
-{\r
- {10,ch41st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch41 = {47.5333f,1,ch41st};\r
-\r
-/* char: 0x2a */\r
-\r
-static const SFG_StrokeVertex ch42st0[] =\r
-{\r
- {30.7695f,71.4286f},\r
- {30.7695f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch42st1[] =\r
-{\r
- {6.96f,57.1429f},\r
- {54.579f,28.5714f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch42st2[] =\r
-{\r
- {54.579f,57.1429f},\r
- {6.96f,28.5714f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch42st[] =\r
-{\r
- {2,ch42st0},\r
- {2,ch42st1},\r
- {2,ch42st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch42 = {59.439f,3,ch42st};\r
-\r
-/* char: 0x2b */\r
-\r
-static const SFG_StrokeVertex ch43st0[] =\r
-{\r
- {48.8371f,85.7143f},\r
- {48.8371f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch43st1[] =\r
-{\r
- {5.98f,42.8571f},\r
- {91.6943f,42.8571f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch43st[] =\r
-{\r
- {2,ch43st0},\r
- {2,ch43st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch43 = {97.2543f,2,ch43st};\r
-\r
-/* char: 0x2c */\r
-\r
-static const SFG_StrokeVertex ch44st0[] =\r
-{\r
- {18.2838f,4.7619f},\r
- {13.5219f,0.0f},\r
- {8.76f,4.7619f},\r
- {13.5219f,9.5238f},\r
- {18.2838f,4.7619f},\r
- {18.2838f,-4.7619f},\r
- {13.5219f,-14.2857f},\r
- {8.76f,-19.0476f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch44st[] =\r
-{\r
- {8,ch44st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch44 = {26.0638f,1,ch44st};\r
-\r
-/* char: 0x2d */\r
-\r
-static const SFG_StrokeVertex ch45st0[] =\r
-{\r
- {7.38f,42.8571f},\r
- {93.0943f,42.8571f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch45st[] =\r
-{\r
- {2,ch45st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch45 = {100.754f,1,ch45st};\r
-\r
-/* char: 0x2e */\r
-\r
-static const SFG_StrokeVertex ch46st0[] =\r
-{\r
- {13.1019f,9.5238f},\r
- {8.34f,4.7619f},\r
- {13.1019f,0.0f},\r
- {17.8638f,4.7619f},\r
- {13.1019f,9.5238f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch46st[] =\r
-{\r
- {5,ch46st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch46 = {26.4838f,1,ch46st};\r
-\r
-/* char: 0x2f */\r
-\r
-static const SFG_StrokeVertex ch47st0[] =\r
-{\r
- {7.24f,-14.2857f},\r
- {73.9067f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch47st[] =\r
-{\r
- {2,ch47st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch47 = {82.1067f,1,ch47st};\r
-\r
-/* char: 0x30 */\r
-\r
-static const SFG_StrokeVertex ch48st0[] =\r
-{\r
- {33.5514f,100.0f},\r
- {19.2657f,95.2381f},\r
- {9.7419f,80.9524f},\r
- {4.98f,57.1429f},\r
- {4.98f,42.8571f},\r
- {9.7419f,19.0476f},\r
- {19.2657f,4.7619f},\r
- {33.5514f,0.0f},\r
- {43.0752f,0.0f},\r
- {57.361f,4.7619f},\r
- {66.8848f,19.0476f},\r
- {71.6467f,42.8571f},\r
- {71.6467f,57.1429f},\r
- {66.8848f,80.9524f},\r
- {57.361f,95.2381f},\r
- {43.0752f,100.0f},\r
- {33.5514f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch48st[] =\r
-{\r
- {17,ch48st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch48 = {77.0667f,1,ch48st};\r
-\r
-/* char: 0x31 */\r
-\r
-static const SFG_StrokeVertex ch49st0[] =\r
-{\r
- {11.82f,80.9524f},\r
- {21.3438f,85.7143f},\r
- {35.6295f,100.0f},\r
- {35.6295f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch49st[] =\r
-{\r
- {4,ch49st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch49 = {66.5295f,1,ch49st};\r
-\r
-/* char: 0x32 */\r
-\r
-static const SFG_StrokeVertex ch50st0[] =\r
-{\r
- {10.1819f,76.1905f},\r
- {10.1819f,80.9524f},\r
- {14.9438f,90.4762f},\r
- {19.7057f,95.2381f},\r
- {29.2295f,100.0f},\r
- {48.2771f,100.0f},\r
- {57.801f,95.2381f},\r
- {62.5629f,90.4762f},\r
- {67.3248f,80.9524f},\r
- {67.3248f,71.4286f},\r
- {62.5629f,61.9048f},\r
- {53.039f,47.619f},\r
- {5.42f,0.0f},\r
- {72.0867f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch50st[] =\r
-{\r
- {14,ch50st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch50 = {77.6467f,1,ch50st};\r
-\r
-/* char: 0x33 */\r
-\r
-static const SFG_StrokeVertex ch51st0[] =\r
-{\r
- {14.5238f,100.0f},\r
- {66.9048f,100.0f},\r
- {38.3333f,61.9048f},\r
- {52.619f,61.9048f},\r
- {62.1429f,57.1429f},\r
- {66.9048f,52.381f},\r
- {71.6667f,38.0952f},\r
- {71.6667f,28.5714f},\r
- {66.9048f,14.2857f},\r
- {57.381f,4.7619f},\r
- {43.0952f,0.0f},\r
- {28.8095f,0.0f},\r
- {14.5238f,4.7619f},\r
- {9.7619f,9.5238f},\r
- {5.0f,19.0476f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch51st[] =\r
-{\r
- {15,ch51st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch51 = {77.0467f,1,ch51st};\r
-\r
-/* char: 0x34 */\r
-\r
-static const SFG_StrokeVertex ch52st0[] =\r
-{\r
- {51.499f,100.0f},\r
- {3.88f,33.3333f},\r
- {75.3086f,33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch52st1[] =\r
-{\r
- {51.499f,100.0f},\r
- {51.499f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch52st[] =\r
-{\r
- {3,ch52st0},\r
- {2,ch52st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch52 = {80.1686f,2,ch52st};\r
-\r
-/* char: 0x35 */\r
-\r
-static const SFG_StrokeVertex ch53st0[] =\r
-{\r
- {62.0029f,100.0f},\r
- {14.3838f,100.0f},\r
- {9.6219f,57.1429f},\r
- {14.3838f,61.9048f},\r
- {28.6695f,66.6667f},\r
- {42.9552f,66.6667f},\r
- {57.241f,61.9048f},\r
- {66.7648f,52.381f},\r
- {71.5267f,38.0952f},\r
- {71.5267f,28.5714f},\r
- {66.7648f,14.2857f},\r
- {57.241f,4.7619f},\r
- {42.9552f,0.0f},\r
- {28.6695f,0.0f},\r
- {14.3838f,4.7619f},\r
- {9.6219f,9.5238f},\r
- {4.86f,19.0476f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch53st[] =\r
-{\r
- {17,ch53st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch53 = {77.6867f,1,ch53st};\r
-\r
-/* char: 0x36 */\r
-\r
-static const SFG_StrokeVertex ch54st0[] =\r
-{\r
- {62.7229f,85.7143f},\r
- {57.961f,95.2381f},\r
- {43.6752f,100.0f},\r
- {34.1514f,100.0f},\r
- {19.8657f,95.2381f},\r
- {10.3419f,80.9524f},\r
- {5.58f,57.1429f},\r
- {5.58f,33.3333f},\r
- {10.3419f,14.2857f},\r
- {19.8657f,4.7619f},\r
- {34.1514f,0.0f},\r
- {38.9133f,0.0f},\r
- {53.199f,4.7619f},\r
- {62.7229f,14.2857f},\r
- {67.4848f,28.5714f},\r
- {67.4848f,33.3333f},\r
- {62.7229f,47.619f},\r
- {53.199f,57.1429f},\r
- {38.9133f,61.9048f},\r
- {34.1514f,61.9048f},\r
- {19.8657f,57.1429f},\r
- {10.3419f,47.619f},\r
- {5.58f,33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch54st[] =\r
-{\r
- {23,ch54st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch54 = {73.8048f,1,ch54st};\r
-\r
-/* char: 0x37 */\r
-\r
-static const SFG_StrokeVertex ch55st0[] =\r
-{\r
- {72.2267f,100.0f},\r
- {24.6076f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch55st1[] =\r
-{\r
- {5.56f,100.0f},\r
- {72.2267f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch55st[] =\r
-{\r
- {2,ch55st0},\r
- {2,ch55st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch55 = {77.2267f,2,ch55st};\r
-\r
-/* char: 0x38 */\r
-\r
-static const SFG_StrokeVertex ch56st0[] =\r
-{\r
- {29.4095f,100.0f},\r
- {15.1238f,95.2381f},\r
- {10.3619f,85.7143f},\r
- {10.3619f,76.1905f},\r
- {15.1238f,66.6667f},\r
- {24.6476f,61.9048f},\r
- {43.6952f,57.1429f},\r
- {57.981f,52.381f},\r
- {67.5048f,42.8571f},\r
- {72.2667f,33.3333f},\r
- {72.2667f,19.0476f},\r
- {67.5048f,9.5238f},\r
- {62.7429f,4.7619f},\r
- {48.4571f,0.0f},\r
- {29.4095f,0.0f},\r
- {15.1238f,4.7619f},\r
- {10.3619f,9.5238f},\r
- {5.6f,19.0476f},\r
- {5.6f,33.3333f},\r
- {10.3619f,42.8571f},\r
- {19.8857f,52.381f},\r
- {34.1714f,57.1429f},\r
- {53.219f,61.9048f},\r
- {62.7429f,66.6667f},\r
- {67.5048f,76.1905f},\r
- {67.5048f,85.7143f},\r
- {62.7429f,95.2381f},\r
- {48.4571f,100.0f},\r
- {29.4095f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch56st[] =\r
-{\r
- {29,ch56st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch56 = {77.6667f,1,ch56st};\r
-\r
-/* char: 0x39 */\r
-\r
-static const SFG_StrokeVertex ch57st0[] =\r
-{\r
- {68.5048f,66.6667f},\r
- {63.7429f,52.381f},\r
- {54.219f,42.8571f},\r
- {39.9333f,38.0952f},\r
- {35.1714f,38.0952f},\r
- {20.8857f,42.8571f},\r
- {11.3619f,52.381f},\r
- {6.6f,66.6667f},\r
- {6.6f,71.4286f},\r
- {11.3619f,85.7143f},\r
- {20.8857f,95.2381f},\r
- {35.1714f,100.0f},\r
- {39.9333f,100.0f},\r
- {54.219f,95.2381f},\r
- {63.7429f,85.7143f},\r
- {68.5048f,66.6667f},\r
- {68.5048f,42.8571f},\r
- {63.7429f,19.0476f},\r
- {54.219f,4.7619f},\r
- {39.9333f,0.0f},\r
- {30.4095f,0.0f},\r
- {16.1238f,4.7619f},\r
- {11.3619f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch57st[] =\r
-{\r
- {23,ch57st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch57 = {74.0648f,1,ch57st};\r
-\r
-/* char: 0x3a */\r
-\r
-static const SFG_StrokeVertex ch58st0[] =\r
-{\r
- {14.0819f,66.6667f},\r
- {9.32f,61.9048f},\r
- {14.0819f,57.1429f},\r
- {18.8438f,61.9048f},\r
- {14.0819f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch58st1[] =\r
-{\r
- {14.0819f,9.5238f},\r
- {9.32f,4.7619f},\r
- {14.0819f,0.0f},\r
- {18.8438f,4.7619f},\r
- {14.0819f,9.5238f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch58st[] =\r
-{\r
- {5,ch58st0},\r
- {5,ch58st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch58 = {26.2238f,2,ch58st};\r
-\r
-/* char: 0x3b */\r
-\r
-static const SFG_StrokeVertex ch59st0[] =\r
-{\r
- {12.9619f,66.6667f},\r
- {8.2f,61.9048f},\r
- {12.9619f,57.1429f},\r
- {17.7238f,61.9048f},\r
- {12.9619f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch59st1[] =\r
-{\r
- {17.7238f,4.7619f},\r
- {12.9619f,0.0f},\r
- {8.2f,4.7619f},\r
- {12.9619f,9.5238f},\r
- {17.7238f,4.7619f},\r
- {17.7238f,-4.7619f},\r
- {12.9619f,-14.2857f},\r
- {8.2f,-19.0476f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch59st[] =\r
-{\r
- {5,ch59st0},\r
- {8,ch59st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch59 = {26.3038f,2,ch59st};\r
-\r
-/* char: 0x3c */\r
-\r
-static const SFG_StrokeVertex ch60st0[] =\r
-{\r
- {79.2505f,85.7143f},\r
- {3.06f,42.8571f},\r
- {79.2505f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch60st[] =\r
-{\r
- {3,ch60st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch60 = {81.6105f,1,ch60st};\r
-\r
-/* char: 0x3d */\r
-\r
-static const SFG_StrokeVertex ch61st0[] =\r
-{\r
- {5.7f,57.1429f},\r
- {91.4143f,57.1429f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch61st1[] =\r
-{\r
- {5.7f,28.5714f},\r
- {91.4143f,28.5714f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch61st[] =\r
-{\r
- {2,ch61st0},\r
- {2,ch61st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch61 = {97.2543f,2,ch61st};\r
-\r
-/* char: 0x3e */\r
-\r
-static const SFG_StrokeVertex ch62st0[] =\r
-{\r
- {2.78f,85.7143f},\r
- {78.9705f,42.8571f},\r
- {2.78f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch62st[] =\r
-{\r
- {3,ch62st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch62 = {81.6105f,1,ch62st};\r
-\r
-/* char: 0x3f */\r
-\r
-static const SFG_StrokeVertex ch63st0[] =\r
-{\r
- {8.42f,76.1905f},\r
- {8.42f,80.9524f},\r
- {13.1819f,90.4762f},\r
- {17.9438f,95.2381f},\r
- {27.4676f,100.0f},\r
- {46.5152f,100.0f},\r
- {56.039f,95.2381f},\r
- {60.801f,90.4762f},\r
- {65.5629f,80.9524f},\r
- {65.5629f,71.4286f},\r
- {60.801f,61.9048f},\r
- {56.039f,57.1429f},\r
- {36.9914f,47.619f},\r
- {36.9914f,33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch63st1[] =\r
-{\r
- {36.9914f,9.5238f},\r
- {32.2295f,4.7619f},\r
- {36.9914f,0.0f},\r
- {41.7533f,4.7619f},\r
- {36.9914f,9.5238f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch63st[] =\r
-{\r
- {14,ch63st0},\r
- {5,ch63st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch63 = {73.9029f,2,ch63st};\r
-\r
-/* char: 0x40 */\r
-\r
-static const SFG_StrokeVertex ch64st0[] =\r
-{\r
- {49.2171f,52.381f},\r
- {39.6933f,57.1429f},\r
- {30.1695f,57.1429f},\r
- {25.4076f,47.619f},\r
- {25.4076f,42.8571f},\r
- {30.1695f,33.3333f},\r
- {39.6933f,33.3333f},\r
- {49.2171f,38.0952f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch64st1[] =\r
-{\r
- {49.2171f,57.1429f},\r
- {49.2171f,38.0952f},\r
- {53.979f,33.3333f},\r
- {63.5029f,33.3333f},\r
- {68.2648f,42.8571f},\r
- {68.2648f,47.619f},\r
- {63.5029f,61.9048f},\r
- {53.979f,71.4286f},\r
- {39.6933f,76.1905f},\r
- {34.9314f,76.1905f},\r
- {20.6457f,71.4286f},\r
- {11.1219f,61.9048f},\r
- {6.36f,47.619f},\r
- {6.36f,42.8571f},\r
- {11.1219f,28.5714f},\r
- {20.6457f,19.0476f},\r
- {34.9314f,14.2857f},\r
- {39.6933f,14.2857f},\r
- {53.979f,19.0476f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch64st[] =\r
-{\r
- {8,ch64st0},\r
- {19,ch64st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch64 = {74.3648f,2,ch64st};\r
-\r
-/* char: 0x41 */\r
-\r
-static const SFG_StrokeVertex ch65st0[] =\r
-{\r
- {40.5952f,100.0f},\r
- {2.5f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch65st1[] =\r
-{\r
- {40.5952f,100.0f},\r
- {78.6905f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch65st2[] =\r
-{\r
- {16.7857f,33.3333f},\r
- {64.4048f,33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch65st[] =\r
-{\r
- {2,ch65st0},\r
- {2,ch65st1},\r
- {2,ch65st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch65 = {80.4905f,3,ch65st};\r
-\r
-/* char: 0x42 */\r
-\r
-static const SFG_StrokeVertex ch66st0[] =\r
-{\r
- {11.42f,100.0f},\r
- {11.42f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch66st1[] =\r
-{\r
- {11.42f,100.0f},\r
- {54.2771f,100.0f},\r
- {68.5629f,95.2381f},\r
- {73.3248f,90.4762f},\r
- {78.0867f,80.9524f},\r
- {78.0867f,71.4286f},\r
- {73.3248f,61.9048f},\r
- {68.5629f,57.1429f},\r
- {54.2771f,52.381f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch66st2[] =\r
-{\r
- {11.42f,52.381f},\r
- {54.2771f,52.381f},\r
- {68.5629f,47.619f},\r
- {73.3248f,42.8571f},\r
- {78.0867f,33.3333f},\r
- {78.0867f,19.0476f},\r
- {73.3248f,9.5238f},\r
- {68.5629f,4.7619f},\r
- {54.2771f,0.0f},\r
- {11.42f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch66st[] =\r
-{\r
- {2,ch66st0},\r
- {9,ch66st1},\r
- {10,ch66st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch66 = {83.6267f,3,ch66st};\r
-\r
-/* char: 0x43 */\r
-\r
-static const SFG_StrokeVertex ch67st0[] =\r
-{\r
- {78.0886f,76.1905f},\r
- {73.3267f,85.7143f},\r
- {63.8029f,95.2381f},\r
- {54.279f,100.0f},\r
- {35.2314f,100.0f},\r
- {25.7076f,95.2381f},\r
- {16.1838f,85.7143f},\r
- {11.4219f,76.1905f},\r
- {6.66f,61.9048f},\r
- {6.66f,38.0952f},\r
- {11.4219f,23.8095f},\r
- {16.1838f,14.2857f},\r
- {25.7076f,4.7619f},\r
- {35.2314f,0.0f},\r
- {54.279f,0.0f},\r
- {63.8029f,4.7619f},\r
- {73.3267f,14.2857f},\r
- {78.0886f,23.8095f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch67st[] =\r
-{\r
- {18,ch67st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch67 = {84.4886f,1,ch67st};\r
-\r
-/* char: 0x44 */\r
-\r
-static const SFG_StrokeVertex ch68st0[] =\r
-{\r
- {11.96f,100.0f},\r
- {11.96f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch68st1[] =\r
-{\r
- {11.96f,100.0f},\r
- {45.2933f,100.0f},\r
- {59.579f,95.2381f},\r
- {69.1029f,85.7143f},\r
- {73.8648f,76.1905f},\r
- {78.6267f,61.9048f},\r
- {78.6267f,38.0952f},\r
- {73.8648f,23.8095f},\r
- {69.1029f,14.2857f},\r
- {59.579f,4.7619f},\r
- {45.2933f,0.0f},\r
- {11.96f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch68st[] =\r
-{\r
- {2,ch68st0},\r
- {12,ch68st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch68 = {85.2867f,2,ch68st};\r
-\r
-/* char: 0x45 */\r
-\r
-static const SFG_StrokeVertex ch69st0[] =\r
-{\r
- {11.42f,100.0f},\r
- {11.42f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch69st1[] =\r
-{\r
- {11.42f,100.0f},\r
- {73.3248f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch69st2[] =\r
-{\r
- {11.42f,52.381f},\r
- {49.5152f,52.381f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch69st3[] =\r
-{\r
- {11.42f,0.0f},\r
- {73.3248f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch69st[] =\r
-{\r
- {2,ch69st0},\r
- {2,ch69st1},\r
- {2,ch69st2},\r
- {2,ch69st3}\r
-};\r
-\r
-static const SFG_StrokeChar ch69 = {78.1848f,4,ch69st};\r
-\r
-/* char: 0x46 */\r
-\r
-static const SFG_StrokeVertex ch70st0[] =\r
-{\r
- {11.42f,100.0f},\r
- {11.42f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch70st1[] =\r
-{\r
- {11.42f,100.0f},\r
- {73.3248f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch70st2[] =\r
-{\r
- {11.42f,52.381f},\r
- {49.5152f,52.381f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch70st[] =\r
-{\r
- {2,ch70st0},\r
- {2,ch70st1},\r
- {2,ch70st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch70 = {78.7448f,3,ch70st};\r
-\r
-/* char: 0x47 */\r
-\r
-static const SFG_StrokeVertex ch71st0[] =\r
-{\r
- {78.4886f,76.1905f},\r
- {73.7267f,85.7143f},\r
- {64.2029f,95.2381f},\r
- {54.679f,100.0f},\r
- {35.6314f,100.0f},\r
- {26.1076f,95.2381f},\r
- {16.5838f,85.7143f},\r
- {11.8219f,76.1905f},\r
- {7.06f,61.9048f},\r
- {7.06f,38.0952f},\r
- {11.8219f,23.8095f},\r
- {16.5838f,14.2857f},\r
- {26.1076f,4.7619f},\r
- {35.6314f,0.0f},\r
- {54.679f,0.0f},\r
- {64.2029f,4.7619f},\r
- {73.7267f,14.2857f},\r
- {78.4886f,23.8095f},\r
- {78.4886f,38.0952f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch71st1[] =\r
-{\r
- {54.679f,38.0952f},\r
- {78.4886f,38.0952f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch71st[] =\r
-{\r
- {19,ch71st0},\r
- {2,ch71st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch71 = {89.7686f,2,ch71st};\r
-\r
-/* char: 0x48 */\r
-\r
-static const SFG_StrokeVertex ch72st0[] =\r
-{\r
- {11.42f,100.0f},\r
- {11.42f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch72st1[] =\r
-{\r
- {78.0867f,100.0f},\r
- {78.0867f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch72st2[] =\r
-{\r
- {11.42f,52.381f},\r
- {78.0867f,52.381f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch72st[] =\r
-{\r
- {2,ch72st0},\r
- {2,ch72st1},\r
- {2,ch72st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch72 = {89.0867f,3,ch72st};\r
-\r
-/* char: 0x49 */\r
-\r
-static const SFG_StrokeVertex ch73st0[] =\r
-{\r
- {10.86f,100.0f},\r
- {10.86f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch73st[] =\r
-{\r
- {2,ch73st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch73 = {21.3f,1,ch73st};\r
-\r
-/* char: 0x4a */\r
-\r
-static const SFG_StrokeVertex ch74st0[] =\r
-{\r
- {50.119f,100.0f},\r
- {50.119f,23.8095f},\r
- {45.3571f,9.5238f},\r
- {40.5952f,4.7619f},\r
- {31.0714f,0.0f},\r
- {21.5476f,0.0f},\r
- {12.0238f,4.7619f},\r
- {7.2619f,9.5238f},\r
- {2.5f,23.8095f},\r
- {2.5f,33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch74st[] =\r
-{\r
- {10,ch74st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch74 = {59.999f,1,ch74st};\r
-\r
-/* char: 0x4b */\r
-\r
-static const SFG_StrokeVertex ch75st0[] =\r
-{\r
- {11.28f,100.0f},\r
- {11.28f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch75st1[] =\r
-{\r
- {77.9467f,100.0f},\r
- {11.28f,33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch75st2[] =\r
-{\r
- {35.0895f,57.1429f},\r
- {77.9467f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch75st[] =\r
-{\r
- {2,ch75st0},\r
- {2,ch75st1},\r
- {2,ch75st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch75 = {79.3267f,3,ch75st};\r
-\r
-/* char: 0x4c */\r
-\r
-static const SFG_StrokeVertex ch76st0[] =\r
-{\r
- {11.68f,100.0f},\r
- {11.68f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch76st1[] =\r
-{\r
- {11.68f,0.0f},\r
- {68.8229f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch76st[] =\r
-{\r
- {2,ch76st0},\r
- {2,ch76st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch76 = {71.3229f,2,ch76st};\r
-\r
-/* char: 0x4d */\r
-\r
-static const SFG_StrokeVertex ch77st0[] =\r
-{\r
- {10.86f,100.0f},\r
- {10.86f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch77st1[] =\r
-{\r
- {10.86f,100.0f},\r
- {48.9552f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch77st2[] =\r
-{\r
- {87.0505f,100.0f},\r
- {48.9552f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch77st3[] =\r
-{\r
- {87.0505f,100.0f},\r
- {87.0505f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch77st[] =\r
-{\r
- {2,ch77st0},\r
- {2,ch77st1},\r
- {2,ch77st2},\r
- {2,ch77st3}\r
-};\r
-\r
-static const SFG_StrokeChar ch77 = {97.2105f,4,ch77st};\r
-\r
-/* char: 0x4e */\r
-\r
-static const SFG_StrokeVertex ch78st0[] =\r
-{\r
- {11.14f,100.0f},\r
- {11.14f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch78st1[] =\r
-{\r
- {11.14f,100.0f},\r
- {77.8067f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch78st2[] =\r
-{\r
- {77.8067f,100.0f},\r
- {77.8067f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch78st[] =\r
-{\r
- {2,ch78st0},\r
- {2,ch78st1},\r
- {2,ch78st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch78 = {88.8067f,3,ch78st};\r
-\r
-/* char: 0x4f */\r
-\r
-static const SFG_StrokeVertex ch79st0[] =\r
-{\r
- {34.8114f,100.0f},\r
- {25.2876f,95.2381f},\r
- {15.7638f,85.7143f},\r
- {11.0019f,76.1905f},\r
- {6.24f,61.9048f},\r
- {6.24f,38.0952f},\r
- {11.0019f,23.8095f},\r
- {15.7638f,14.2857f},\r
- {25.2876f,4.7619f},\r
- {34.8114f,0.0f},\r
- {53.859f,0.0f},\r
- {63.3829f,4.7619f},\r
- {72.9067f,14.2857f},\r
- {77.6686f,23.8095f},\r
- {82.4305f,38.0952f},\r
- {82.4305f,61.9048f},\r
- {77.6686f,76.1905f},\r
- {72.9067f,85.7143f},\r
- {63.3829f,95.2381f},\r
- {53.859f,100.0f},\r
- {34.8114f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch79st[] =\r
-{\r
- {21,ch79st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch79 = {88.8305f,1,ch79st};\r
-\r
-/* char: 0x50 */\r
-\r
-static const SFG_StrokeVertex ch80st0[] =\r
-{\r
- {12.1f,100.0f},\r
- {12.1f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch80st1[] =\r
-{\r
- {12.1f,100.0f},\r
- {54.9571f,100.0f},\r
- {69.2429f,95.2381f},\r
- {74.0048f,90.4762f},\r
- {78.7667f,80.9524f},\r
- {78.7667f,66.6667f},\r
- {74.0048f,57.1429f},\r
- {69.2429f,52.381f},\r
- {54.9571f,47.619f},\r
- {12.1f,47.619f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch80st[] =\r
-{\r
- {2,ch80st0},\r
- {10,ch80st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch80 = {85.6667f,2,ch80st};\r
-\r
-/* char: 0x51 */\r
-\r
-static const SFG_StrokeVertex ch81st0[] =\r
-{\r
- {33.8714f,100.0f},\r
- {24.3476f,95.2381f},\r
- {14.8238f,85.7143f},\r
- {10.0619f,76.1905f},\r
- {5.3f,61.9048f},\r
- {5.3f,38.0952f},\r
- {10.0619f,23.8095f},\r
- {14.8238f,14.2857f},\r
- {24.3476f,4.7619f},\r
- {33.8714f,0.0f},\r
- {52.919f,0.0f},\r
- {62.4429f,4.7619f},\r
- {71.9667f,14.2857f},\r
- {76.7286f,23.8095f},\r
- {81.4905f,38.0952f},\r
- {81.4905f,61.9048f},\r
- {76.7286f,76.1905f},\r
- {71.9667f,85.7143f},\r
- {62.4429f,95.2381f},\r
- {52.919f,100.0f},\r
- {33.8714f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch81st1[] =\r
-{\r
- {48.1571f,19.0476f},\r
- {76.7286f,-9.5238f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch81st[] =\r
-{\r
- {21,ch81st0},\r
- {2,ch81st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch81 = {88.0905f,2,ch81st};\r
-\r
-/* char: 0x52 */\r
-\r
-static const SFG_StrokeVertex ch82st0[] =\r
-{\r
- {11.68f,100.0f},\r
- {11.68f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch82st1[] =\r
-{\r
- {11.68f,100.0f},\r
- {54.5371f,100.0f},\r
- {68.8229f,95.2381f},\r
- {73.5848f,90.4762f},\r
- {78.3467f,80.9524f},\r
- {78.3467f,71.4286f},\r
- {73.5848f,61.9048f},\r
- {68.8229f,57.1429f},\r
- {54.5371f,52.381f},\r
- {11.68f,52.381f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch82st2[] =\r
-{\r
- {45.0133f,52.381f},\r
- {78.3467f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch82st[] =\r
-{\r
- {2,ch82st0},\r
- {10,ch82st1},\r
- {2,ch82st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch82 = {82.3667f,3,ch82st};\r
-\r
-/* char: 0x53 */\r
-\r
-static const SFG_StrokeVertex ch83st0[] =\r
-{\r
- {74.6667f,85.7143f},\r
- {65.1429f,95.2381f},\r
- {50.8571f,100.0f},\r
- {31.8095f,100.0f},\r
- {17.5238f,95.2381f},\r
- {8.0f,85.7143f},\r
- {8.0f,76.1905f},\r
- {12.7619f,66.6667f},\r
- {17.5238f,61.9048f},\r
- {27.0476f,57.1429f},\r
- {55.619f,47.619f},\r
- {65.1429f,42.8571f},\r
- {69.9048f,38.0952f},\r
- {74.6667f,28.5714f},\r
- {74.6667f,14.2857f},\r
- {65.1429f,4.7619f},\r
- {50.8571f,0.0f},\r
- {31.8095f,0.0f},\r
- {17.5238f,4.7619f},\r
- {8.0f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch83st[] =\r
-{\r
- {20,ch83st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch83 = {80.8267f,1,ch83st};\r
-\r
-/* char: 0x54 */\r
-\r
-static const SFG_StrokeVertex ch84st0[] =\r
-{\r
- {35.6933f,100.0f},\r
- {35.6933f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch84st1[] =\r
-{\r
- {2.36f,100.0f},\r
- {69.0267f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch84st[] =\r
-{\r
- {2,ch84st0},\r
- {2,ch84st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch84 = {71.9467f,2,ch84st};\r
-\r
-/* char: 0x55 */\r
-\r
-static const SFG_StrokeVertex ch85st0[] =\r
-{\r
- {11.54f,100.0f},\r
- {11.54f,28.5714f},\r
- {16.3019f,14.2857f},\r
- {25.8257f,4.7619f},\r
- {40.1114f,0.0f},\r
- {49.6352f,0.0f},\r
- {63.921f,4.7619f},\r
- {73.4448f,14.2857f},\r
- {78.2067f,28.5714f},\r
- {78.2067f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch85st[] =\r
-{\r
- {10,ch85st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch85 = {89.4867f,1,ch85st};\r
-\r
-/* char: 0x56 */\r
-\r
-static const SFG_StrokeVertex ch86st0[] =\r
-{\r
- {2.36f,100.0f},\r
- {40.4552f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch86st1[] =\r
-{\r
- {78.5505f,100.0f},\r
- {40.4552f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch86st[] =\r
-{\r
- {2,ch86st0},\r
- {2,ch86st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch86 = {81.6105f,2,ch86st};\r
-\r
-/* char: 0x57 */\r
-\r
-static const SFG_StrokeVertex ch87st0[] =\r
-{\r
- {2.22f,100.0f},\r
- {26.0295f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch87st1[] =\r
-{\r
- {49.839f,100.0f},\r
- {26.0295f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch87st2[] =\r
-{\r
- {49.839f,100.0f},\r
- {73.6486f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch87st3[] =\r
-{\r
- {97.4581f,100.0f},\r
- {73.6486f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch87st[] =\r
-{\r
- {2,ch87st0},\r
- {2,ch87st1},\r
- {2,ch87st2},\r
- {2,ch87st3}\r
-};\r
-\r
-static const SFG_StrokeChar ch87 = {100.518f,4,ch87st};\r
-\r
-/* char: 0x58 */\r
-\r
-static const SFG_StrokeVertex ch88st0[] =\r
-{\r
- {2.5f,100.0f},\r
- {69.1667f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch88st1[] =\r
-{\r
- {69.1667f,100.0f},\r
- {2.5f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch88st[] =\r
-{\r
- {2,ch88st0},\r
- {2,ch88st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch88 = {72.3667f,2,ch88st};\r
-\r
-/* char: 0x59 */\r
-\r
-static const SFG_StrokeVertex ch89st0[] =\r
-{\r
- {1.52f,100.0f},\r
- {39.6152f,52.381f},\r
- {39.6152f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch89st1[] =\r
-{\r
- {77.7105f,100.0f},\r
- {39.6152f,52.381f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch89st[] =\r
-{\r
- {3,ch89st0},\r
- {2,ch89st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch89 = {79.6505f,2,ch89st};\r
-\r
-/* char: 0x5a */\r
-\r
-static const SFG_StrokeVertex ch90st0[] =\r
-{\r
- {69.1667f,100.0f},\r
- {2.5f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch90st1[] =\r
-{\r
- {2.5f,100.0f},\r
- {69.1667f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch90st2[] =\r
-{\r
- {2.5f,0.0f},\r
- {69.1667f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch90st[] =\r
-{\r
- {2,ch90st0},\r
- {2,ch90st1},\r
- {2,ch90st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch90 = {73.7467f,3,ch90st};\r
-\r
-/* char: 0x5b */\r
-\r
-static const SFG_StrokeVertex ch91st0[] =\r
-{\r
- {7.78f,119.048f},\r
- {7.78f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch91st1[] =\r
-{\r
- {12.5419f,119.048f},\r
- {12.5419f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch91st2[] =\r
-{\r
- {7.78f,119.048f},\r
- {41.1133f,119.048f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch91st3[] =\r
-{\r
- {7.78f,-33.3333f},\r
- {41.1133f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch91st[] =\r
-{\r
- {2,ch91st0},\r
- {2,ch91st1},\r
- {2,ch91st2},\r
- {2,ch91st3}\r
-};\r
-\r
-static const SFG_StrokeChar ch91 = {46.1133f,4,ch91st};\r
-\r
-/* char: 0x5c */\r
-\r
-static const SFG_StrokeVertex ch92st0[] =\r
-{\r
- {5.84f,100.0f},\r
- {72.5067f,-14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch92st[] =\r
-{\r
- {2,ch92st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch92 = {78.2067f,1,ch92st};\r
-\r
-/* char: 0x5d */\r
-\r
-static const SFG_StrokeVertex ch93st0[] =\r
-{\r
- {33.0114f,119.048f},\r
- {33.0114f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch93st1[] =\r
-{\r
- {37.7733f,119.048f},\r
- {37.7733f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch93st2[] =\r
-{\r
- {4.44f,119.048f},\r
- {37.7733f,119.048f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch93st3[] =\r
-{\r
- {4.44f,-33.3333f},\r
- {37.7733f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch93st[] =\r
-{\r
- {2,ch93st0},\r
- {2,ch93st1},\r
- {2,ch93st2},\r
- {2,ch93st3}\r
-};\r
-\r
-static const SFG_StrokeChar ch93 = {46.3933f,4,ch93st};\r
-\r
-/* char: 0x5e */\r
-\r
-static const SFG_StrokeVertex ch94st0[] =\r
-{\r
- {44.0752f,109.524f},\r
- {5.98f,42.8571f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch94st1[] =\r
-{\r
- {44.0752f,109.524f},\r
- {82.1705f,42.8571f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch94st[] =\r
-{\r
- {2,ch94st0},\r
- {2,ch94st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch94 = {90.2305f,2,ch94st};\r
-\r
-/* char: 0x5f */\r
-\r
-static const SFG_StrokeVertex ch95st0[] =\r
-{\r
- {-1.1f,-33.3333f},\r
- {103.662f,-33.3333f},\r
- {103.662f,-28.5714f},\r
- {-1.1f,-28.5714f},\r
- {-1.1f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch95st[] =\r
-{\r
- {5,ch95st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch95 = {104.062f,1,ch95st};\r
-\r
-/* char: 0x60 */\r
-\r
-static const SFG_StrokeVertex ch96st0[] =\r
-{\r
- {33.0219f,100.0f},\r
- {56.8314f,71.4286f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch96st1[] =\r
-{\r
- {33.0219f,100.0f},\r
- {28.26f,95.2381f},\r
- {56.8314f,71.4286f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch96st[] =\r
-{\r
- {2,ch96st0},\r
- {3,ch96st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch96 = {83.5714f,2,ch96st};\r
-\r
-/* char: 0x61 */\r
-\r
-static const SFG_StrokeVertex ch97st0[] =\r
-{\r
- {63.8229f,66.6667f},\r
- {63.8229f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch97st1[] =\r
-{\r
- {63.8229f,52.381f},\r
- {54.299f,61.9048f},\r
- {44.7752f,66.6667f},\r
- {30.4895f,66.6667f},\r
- {20.9657f,61.9048f},\r
- {11.4419f,52.381f},\r
- {6.68f,38.0952f},\r
- {6.68f,28.5714f},\r
- {11.4419f,14.2857f},\r
- {20.9657f,4.7619f},\r
- {30.4895f,0.0f},\r
- {44.7752f,0.0f},\r
- {54.299f,4.7619f},\r
- {63.8229f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch97st[] =\r
-{\r
- {2,ch97st0},\r
- {14,ch97st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch97 = {66.6029f,2,ch97st};\r
-\r
-/* char: 0x62 */\r
-\r
-static const SFG_StrokeVertex ch98st0[] =\r
-{\r
- {8.76f,100.0f},\r
- {8.76f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch98st1[] =\r
-{\r
- {8.76f,52.381f},\r
- {18.2838f,61.9048f},\r
- {27.8076f,66.6667f},\r
- {42.0933f,66.6667f},\r
- {51.6171f,61.9048f},\r
- {61.141f,52.381f},\r
- {65.9029f,38.0952f},\r
- {65.9029f,28.5714f},\r
- {61.141f,14.2857f},\r
- {51.6171f,4.7619f},\r
- {42.0933f,0.0f},\r
- {27.8076f,0.0f},\r
- {18.2838f,4.7619f},\r
- {8.76f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch98st[] =\r
-{\r
- {2,ch98st0},\r
- {14,ch98st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch98 = {70.4629f,2,ch98st};\r
-\r
-/* char: 0x63 */\r
-\r
-static const SFG_StrokeVertex ch99st0[] =\r
-{\r
- {62.6629f,52.381f},\r
- {53.139f,61.9048f},\r
- {43.6152f,66.6667f},\r
- {29.3295f,66.6667f},\r
- {19.8057f,61.9048f},\r
- {10.2819f,52.381f},\r
- {5.52f,38.0952f},\r
- {5.52f,28.5714f},\r
- {10.2819f,14.2857f},\r
- {19.8057f,4.7619f},\r
- {29.3295f,0.0f},\r
- {43.6152f,0.0f},\r
- {53.139f,4.7619f},\r
- {62.6629f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch99st[] =\r
-{\r
- {14,ch99st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch99 = {68.9229f,1,ch99st};\r
-\r
-/* char: 0x64 */\r
-\r
-static const SFG_StrokeVertex ch100st0[] =\r
-{\r
- {61.7829f,100.0f},\r
- {61.7829f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch100st1[] =\r
-{\r
- {61.7829f,52.381f},\r
- {52.259f,61.9048f},\r
- {42.7352f,66.6667f},\r
- {28.4495f,66.6667f},\r
- {18.9257f,61.9048f},\r
- {9.4019f,52.381f},\r
- {4.64f,38.0952f},\r
- {4.64f,28.5714f},\r
- {9.4019f,14.2857f},\r
- {18.9257f,4.7619f},\r
- {28.4495f,0.0f},\r
- {42.7352f,0.0f},\r
- {52.259f,4.7619f},\r
- {61.7829f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch100st[] =\r
-{\r
- {2,ch100st0},\r
- {14,ch100st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch100 = {70.2629f,2,ch100st};\r
-\r
-/* char: 0x65 */\r
-\r
-static const SFG_StrokeVertex ch101st0[] =\r
-{\r
- {5.72f,38.0952f},\r
- {62.8629f,38.0952f},\r
- {62.8629f,47.619f},\r
- {58.101f,57.1429f},\r
- {53.339f,61.9048f},\r
- {43.8152f,66.6667f},\r
- {29.5295f,66.6667f},\r
- {20.0057f,61.9048f},\r
- {10.4819f,52.381f},\r
- {5.72f,38.0952f},\r
- {5.72f,28.5714f},\r
- {10.4819f,14.2857f},\r
- {20.0057f,4.7619f},\r
- {29.5295f,0.0f},\r
- {43.8152f,0.0f},\r
- {53.339f,4.7619f},\r
- {62.8629f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch101st[] =\r
-{\r
- {17,ch101st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch101 = {68.5229f,1,ch101st};\r
-\r
-/* char: 0x66 */\r
-\r
-static const SFG_StrokeVertex ch102st0[] =\r
-{\r
- {38.7752f,100.0f},\r
- {29.2514f,100.0f},\r
- {19.7276f,95.2381f},\r
- {14.9657f,80.9524f},\r
- {14.9657f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch102st1[] =\r
-{\r
- {0.68f,66.6667f},\r
- {34.0133f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch102st[] =\r
-{\r
- {5,ch102st0},\r
- {2,ch102st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch102 = {38.6552f,2,ch102st};\r
-\r
-/* char: 0x67 */\r
-\r
-static const SFG_StrokeVertex ch103st0[] =\r
-{\r
- {62.5029f,66.6667f},\r
- {62.5029f,-9.5238f},\r
- {57.741f,-23.8095f},\r
- {52.979f,-28.5714f},\r
- {43.4552f,-33.3333f},\r
- {29.1695f,-33.3333f},\r
- {19.6457f,-28.5714f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch103st1[] =\r
-{\r
- {62.5029f,52.381f},\r
- {52.979f,61.9048f},\r
- {43.4552f,66.6667f},\r
- {29.1695f,66.6667f},\r
- {19.6457f,61.9048f},\r
- {10.1219f,52.381f},\r
- {5.36f,38.0952f},\r
- {5.36f,28.5714f},\r
- {10.1219f,14.2857f},\r
- {19.6457f,4.7619f},\r
- {29.1695f,0.0f},\r
- {43.4552f,0.0f},\r
- {52.979f,4.7619f},\r
- {62.5029f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch103st[] =\r
-{\r
- {7,ch103st0},\r
- {14,ch103st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch103 = {70.9829f,2,ch103st};\r
-\r
-/* char: 0x68 */\r
-\r
-static const SFG_StrokeVertex ch104st0[] =\r
-{\r
- {9.6f,100.0f},\r
- {9.6f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch104st1[] =\r
-{\r
- {9.6f,47.619f},\r
- {23.8857f,61.9048f},\r
- {33.4095f,66.6667f},\r
- {47.6952f,66.6667f},\r
- {57.219f,61.9048f},\r
- {61.981f,47.619f},\r
- {61.981f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch104st[] =\r
-{\r
- {2,ch104st0},\r
- {7,ch104st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch104 = {71.021f,2,ch104st};\r
-\r
-/* char: 0x69 */\r
-\r
-static const SFG_StrokeVertex ch105st0[] =\r
-{\r
- {10.02f,100.0f},\r
- {14.7819f,95.2381f},\r
- {19.5438f,100.0f},\r
- {14.7819f,104.762f},\r
- {10.02f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch105st1[] =\r
-{\r
- {14.7819f,66.6667f},\r
- {14.7819f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch105st[] =\r
-{\r
- {5,ch105st0},\r
- {2,ch105st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch105 = {28.8638f,2,ch105st};\r
-\r
-/* char: 0x6a */\r
-\r
-static const SFG_StrokeVertex ch106st0[] =\r
-{\r
- {17.3876f,100.0f},\r
- {22.1495f,95.2381f},\r
- {26.9114f,100.0f},\r
- {22.1495f,104.762f},\r
- {17.3876f,100.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch106st1[] =\r
-{\r
- {22.1495f,66.6667f},\r
- {22.1495f,-14.2857f},\r
- {17.3876f,-28.5714f},\r
- {7.8638f,-33.3333f},\r
- {-1.66f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch106st[] =\r
-{\r
- {5,ch106st0},\r
- {5,ch106st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch106 = {36.2314f,2,ch106st};\r
-\r
-/* char: 0x6b */\r
-\r
-static const SFG_StrokeVertex ch107st0[] =\r
-{\r
- {9.6f,100.0f},\r
- {9.6f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch107st1[] =\r
-{\r
- {57.219f,66.6667f},\r
- {9.6f,19.0476f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch107st2[] =\r
-{\r
- {28.6476f,38.0952f},\r
- {61.981f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch107st[] =\r
-{\r
- {2,ch107st0},\r
- {2,ch107st1},\r
- {2,ch107st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch107 = {62.521f,3,ch107st};\r
-\r
-/* char: 0x6c */\r
-\r
-static const SFG_StrokeVertex ch108st0[] =\r
-{\r
- {10.02f,100.0f},\r
- {10.02f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch108st[] =\r
-{\r
- {2,ch108st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch108 = {19.34f,1,ch108st};\r
-\r
-/* char: 0x6d */\r
-\r
-static const SFG_StrokeVertex ch109st0[] =\r
-{\r
- {9.6f,66.6667f},\r
- {9.6f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch109st1[] =\r
-{\r
- {9.6f,47.619f},\r
- {23.8857f,61.9048f},\r
- {33.4095f,66.6667f},\r
- {47.6952f,66.6667f},\r
- {57.219f,61.9048f},\r
- {61.981f,47.619f},\r
- {61.981f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch109st2[] =\r
-{\r
- {61.981f,47.619f},\r
- {76.2667f,61.9048f},\r
- {85.7905f,66.6667f},\r
- {100.076f,66.6667f},\r
- {109.6f,61.9048f},\r
- {114.362f,47.619f},\r
- {114.362f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch109st[] =\r
-{\r
- {2,ch109st0},\r
- {7,ch109st1},\r
- {7,ch109st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch109 = {123.962f,3,ch109st};\r
-\r
-/* char: 0x6e */\r
-\r
-static const SFG_StrokeVertex ch110st0[] =\r
-{\r
- {9.18f,66.6667f},\r
- {9.18f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch110st1[] =\r
-{\r
- {9.18f,47.619f},\r
- {23.4657f,61.9048f},\r
- {32.9895f,66.6667f},\r
- {47.2752f,66.6667f},\r
- {56.799f,61.9048f},\r
- {61.561f,47.619f},\r
- {61.561f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch110st[] =\r
-{\r
- {2,ch110st0},\r
- {7,ch110st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch110 = {70.881f,2,ch110st};\r
-\r
-/* char: 0x6f */\r
-\r
-static const SFG_StrokeVertex ch111st0[] =\r
-{\r
- {28.7895f,66.6667f},\r
- {19.2657f,61.9048f},\r
- {9.7419f,52.381f},\r
- {4.98f,38.0952f},\r
- {4.98f,28.5714f},\r
- {9.7419f,14.2857f},\r
- {19.2657f,4.7619f},\r
- {28.7895f,0.0f},\r
- {43.0752f,0.0f},\r
- {52.599f,4.7619f},\r
- {62.1229f,14.2857f},\r
- {66.8848f,28.5714f},\r
- {66.8848f,38.0952f},\r
- {62.1229f,52.381f},\r
- {52.599f,61.9048f},\r
- {43.0752f,66.6667f},\r
- {28.7895f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch111st[] =\r
-{\r
- {17,ch111st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch111 = {71.7448f,1,ch111st};\r
-\r
-/* char: 0x70 */\r
-\r
-static const SFG_StrokeVertex ch112st0[] =\r
-{\r
- {9.46f,66.6667f},\r
- {9.46f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch112st1[] =\r
-{\r
- {9.46f,52.381f},\r
- {18.9838f,61.9048f},\r
- {28.5076f,66.6667f},\r
- {42.7933f,66.6667f},\r
- {52.3171f,61.9048f},\r
- {61.841f,52.381f},\r
- {66.6029f,38.0952f},\r
- {66.6029f,28.5714f},\r
- {61.841f,14.2857f},\r
- {52.3171f,4.7619f},\r
- {42.7933f,0.0f},\r
- {28.5076f,0.0f},\r
- {18.9838f,4.7619f},\r
- {9.46f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch112st[] =\r
-{\r
- {2,ch112st0},\r
- {14,ch112st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch112 = {70.8029f,2,ch112st};\r
-\r
-/* char: 0x71 */\r
-\r
-static const SFG_StrokeVertex ch113st0[] =\r
-{\r
- {61.9829f,66.6667f},\r
- {61.9829f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch113st1[] =\r
-{\r
- {61.9829f,52.381f},\r
- {52.459f,61.9048f},\r
- {42.9352f,66.6667f},\r
- {28.6495f,66.6667f},\r
- {19.1257f,61.9048f},\r
- {9.6019f,52.381f},\r
- {4.84f,38.0952f},\r
- {4.84f,28.5714f},\r
- {9.6019f,14.2857f},\r
- {19.1257f,4.7619f},\r
- {28.6495f,0.0f},\r
- {42.9352f,0.0f},\r
- {52.459f,4.7619f},\r
- {61.9829f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch113st[] =\r
-{\r
- {2,ch113st0},\r
- {14,ch113st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch113 = {70.7429f,2,ch113st};\r
-\r
-/* char: 0x72 */\r
-\r
-static const SFG_StrokeVertex ch114st0[] =\r
-{\r
- {9.46f,66.6667f},\r
- {9.46f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch114st1[] =\r
-{\r
- {9.46f,38.0952f},\r
- {14.2219f,52.381f},\r
- {23.7457f,61.9048f},\r
- {33.2695f,66.6667f},\r
- {47.5552f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch114st[] =\r
-{\r
- {2,ch114st0},\r
- {5,ch114st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch114 = {49.4952f,2,ch114st};\r
-\r
-/* char: 0x73 */\r
-\r
-static const SFG_StrokeVertex ch115st0[] =\r
-{\r
- {57.081f,52.381f},\r
- {52.319f,61.9048f},\r
- {38.0333f,66.6667f},\r
- {23.7476f,66.6667f},\r
- {9.4619f,61.9048f},\r
- {4.7f,52.381f},\r
- {9.4619f,42.8571f},\r
- {18.9857f,38.0952f},\r
- {42.7952f,33.3333f},\r
- {52.319f,28.5714f},\r
- {57.081f,19.0476f},\r
- {57.081f,14.2857f},\r
- {52.319f,4.7619f},\r
- {38.0333f,0.0f},\r
- {23.7476f,0.0f},\r
- {9.4619f,4.7619f},\r
- {4.7f,14.2857f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch115st[] =\r
-{\r
- {17,ch115st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch115 = {62.321f,1,ch115st};\r
-\r
-/* char: 0x74 */\r
-\r
-static const SFG_StrokeVertex ch116st0[] =\r
-{\r
- {14.8257f,100.0f},\r
- {14.8257f,19.0476f},\r
- {19.5876f,4.7619f},\r
- {29.1114f,0.0f},\r
- {38.6352f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch116st1[] =\r
-{\r
- {0.54f,66.6667f},\r
- {33.8733f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch116st[] =\r
-{\r
- {5,ch116st0},\r
- {2,ch116st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch116 = {39.3152f,2,ch116st};\r
-\r
-/* char: 0x75 */\r
-\r
-static const SFG_StrokeVertex ch117st0[] =\r
-{\r
- {9.46f,66.6667f},\r
- {9.46f,19.0476f},\r
- {14.2219f,4.7619f},\r
- {23.7457f,0.0f},\r
- {38.0314f,0.0f},\r
- {47.5552f,4.7619f},\r
- {61.841f,19.0476f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch117st1[] =\r
-{\r
- {61.841f,66.6667f},\r
- {61.841f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch117st[] =\r
-{\r
- {7,ch117st0},\r
- {2,ch117st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch117 = {71.161f,2,ch117st};\r
-\r
-/* char: 0x76 */\r
-\r
-static const SFG_StrokeVertex ch118st0[] =\r
-{\r
- {1.8f,66.6667f},\r
- {30.3714f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch118st1[] =\r
-{\r
- {58.9429f,66.6667f},\r
- {30.3714f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch118st[] =\r
-{\r
- {2,ch118st0},\r
- {2,ch118st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch118 = {60.6029f,2,ch118st};\r
-\r
-/* char: 0x77 */\r
-\r
-static const SFG_StrokeVertex ch119st0[] =\r
-{\r
- {2.5f,66.6667f},\r
- {21.5476f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch119st1[] =\r
-{\r
- {40.5952f,66.6667f},\r
- {21.5476f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch119st2[] =\r
-{\r
- {40.5952f,66.6667f},\r
- {59.6429f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch119st3[] =\r
-{\r
- {78.6905f,66.6667f},\r
- {59.6429f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch119st[] =\r
-{\r
- {2,ch119st0},\r
- {2,ch119st1},\r
- {2,ch119st2},\r
- {2,ch119st3}\r
-};\r
-\r
-static const SFG_StrokeChar ch119 = {80.4905f,4,ch119st};\r
-\r
-/* char: 0x78 */\r
-\r
-static const SFG_StrokeVertex ch120st0[] =\r
-{\r
- {1.66f,66.6667f},\r
- {54.041f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch120st1[] =\r
-{\r
- {54.041f,66.6667f},\r
- {1.66f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch120st[] =\r
-{\r
- {2,ch120st0},\r
- {2,ch120st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch120 = {56.401f,2,ch120st};\r
-\r
-/* char: 0x79 */\r
-\r
-static const SFG_StrokeVertex ch121st0[] =\r
-{\r
- {6.5619f,66.6667f},\r
- {35.1333f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch121st1[] =\r
-{\r
- {63.7048f,66.6667f},\r
- {35.1333f,0.0f},\r
- {25.6095f,-19.0476f},\r
- {16.0857f,-28.5714f},\r
- {6.5619f,-33.3333f},\r
- {1.8f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch121st[] =\r
-{\r
- {2,ch121st0},\r
- {6,ch121st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch121 = {66.0648f,2,ch121st};\r
-\r
-/* char: 0x7a */\r
-\r
-static const SFG_StrokeVertex ch122st0[] =\r
-{\r
- {56.821f,66.6667f},\r
- {4.44f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch122st1[] =\r
-{\r
- {4.44f,66.6667f},\r
- {56.821f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch122st2[] =\r
-{\r
- {4.44f,0.0f},\r
- {56.821f,0.0f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch122st[] =\r
-{\r
- {2,ch122st0},\r
- {2,ch122st1},\r
- {2,ch122st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch122 = {61.821f,3,ch122st};\r
-\r
-/* char: 0x7b */\r
-\r
-static const SFG_StrokeVertex ch123st0[] =\r
-{\r
- {31.1895f,119.048f},\r
- {21.6657f,114.286f},\r
- {16.9038f,109.524f},\r
- {12.1419f,100.0f},\r
- {12.1419f,90.4762f},\r
- {16.9038f,80.9524f},\r
- {21.6657f,76.1905f},\r
- {26.4276f,66.6667f},\r
- {26.4276f,57.1429f},\r
- {16.9038f,47.619f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch123st1[] =\r
-{\r
- {21.6657f,114.286f},\r
- {16.9038f,104.762f},\r
- {16.9038f,95.2381f},\r
- {21.6657f,85.7143f},\r
- {26.4276f,80.9524f},\r
- {31.1895f,71.4286f},\r
- {31.1895f,61.9048f},\r
- {26.4276f,52.381f},\r
- {7.38f,42.8571f},\r
- {26.4276f,33.3333f},\r
- {31.1895f,23.8095f},\r
- {31.1895f,14.2857f},\r
- {26.4276f,4.7619f},\r
- {21.6657f,0.0f},\r
- {16.9038f,-9.5238f},\r
- {16.9038f,-19.0476f},\r
- {21.6657f,-28.5714f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch123st2[] =\r
-{\r
- {16.9038f,38.0952f},\r
- {26.4276f,28.5714f},\r
- {26.4276f,19.0476f},\r
- {21.6657f,9.5238f},\r
- {16.9038f,4.7619f},\r
- {12.1419f,-4.7619f},\r
- {12.1419f,-14.2857f},\r
- {16.9038f,-23.8095f},\r
- {21.6657f,-28.5714f},\r
- {31.1895f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch123st[] =\r
-{\r
- {10,ch123st0},\r
- {17,ch123st1},\r
- {10,ch123st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch123 = {41.6295f,3,ch123st};\r
-\r
-/* char: 0x7c */\r
-\r
-static const SFG_StrokeVertex ch124st0[] =\r
-{\r
- {11.54f,119.048f},\r
- {11.54f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch124st[] =\r
-{\r
- {2,ch124st0}\r
-};\r
-\r
-static const SFG_StrokeChar ch124 = {23.78f,1,ch124st};\r
-\r
-/* char: 0x7d */\r
-\r
-static const SFG_StrokeVertex ch125st0[] =\r
-{\r
- {9.18f,119.048f},\r
- {18.7038f,114.286f},\r
- {23.4657f,109.524f},\r
- {28.2276f,100.0f},\r
- {28.2276f,90.4762f},\r
- {23.4657f,80.9524f},\r
- {18.7038f,76.1905f},\r
- {13.9419f,66.6667f},\r
- {13.9419f,57.1429f},\r
- {23.4657f,47.619f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch125st1[] =\r
-{\r
- {18.7038f,114.286f},\r
- {23.4657f,104.762f},\r
- {23.4657f,95.2381f},\r
- {18.7038f,85.7143f},\r
- {13.9419f,80.9524f},\r
- {9.18f,71.4286f},\r
- {9.18f,61.9048f},\r
- {13.9419f,52.381f},\r
- {32.9895f,42.8571f},\r
- {13.9419f,33.3333f},\r
- {9.18f,23.8095f},\r
- {9.18f,14.2857f},\r
- {13.9419f,4.7619f},\r
- {18.7038f,0.0f},\r
- {23.4657f,-9.5238f},\r
- {23.4657f,-19.0476f},\r
- {18.7038f,-28.5714f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch125st2[] =\r
-{\r
- {23.4657f,38.0952f},\r
- {13.9419f,28.5714f},\r
- {13.9419f,19.0476f},\r
- {18.7038f,9.5238f},\r
- {23.4657f,4.7619f},\r
- {28.2276f,-4.7619f},\r
- {28.2276f,-14.2857f},\r
- {23.4657f,-23.8095f},\r
- {18.7038f,-28.5714f},\r
- {9.18f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch125st[] =\r
-{\r
- {10,ch125st0},\r
- {17,ch125st1},\r
- {10,ch125st2}\r
-};\r
-\r
-static const SFG_StrokeChar ch125 = {41.4695f,3,ch125st};\r
-\r
-/* char: 0x7e */\r
-\r
-static const SFG_StrokeVertex ch126st0[] =\r
-{\r
- {2.92f,28.5714f},\r
- {2.92f,38.0952f},\r
- {7.6819f,52.381f},\r
- {17.2057f,57.1429f},\r
- {26.7295f,57.1429f},\r
- {36.2533f,52.381f},\r
- {55.301f,38.0952f},\r
- {64.8248f,33.3333f},\r
- {74.3486f,33.3333f},\r
- {83.8724f,38.0952f},\r
- {88.6343f,47.619f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch126st1[] =\r
-{\r
- {2.92f,38.0952f},\r
- {7.6819f,47.619f},\r
- {17.2057f,52.381f},\r
- {26.7295f,52.381f},\r
- {36.2533f,47.619f},\r
- {55.301f,33.3333f},\r
- {64.8248f,28.5714f},\r
- {74.3486f,28.5714f},\r
- {83.8724f,33.3333f},\r
- {88.6343f,47.619f},\r
- {88.6343f,57.1429f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch126st[] =\r
-{\r
- {11,ch126st0},\r
- {11,ch126st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch126 = {91.2743f,2,ch126st};\r
-\r
-/* char: 0x7f */\r
-\r
-static const SFG_StrokeVertex ch127st0[] =\r
-{\r
- {52.381f,100.0f},\r
- {14.2857f,-33.3333f}\r
-};\r
-\r
-static const SFG_StrokeVertex ch127st1[] =\r
-{\r
- {28.5714f,66.6667f},\r
- {14.2857f,61.9048f},\r
- {4.7619f,52.381f},\r
- {0.0f,38.0952f},\r
- {0.0f,23.8095f},\r
- {4.7619f,14.2857f},\r
- {14.2857f,4.7619f},\r
- {28.5714f,0.0f},\r
- {38.0952f,0.0f},\r
- {52.381f,4.7619f},\r
- {61.9048f,14.2857f},\r
- {66.6667f,28.5714f},\r
- {66.6667f,42.8571f},\r
- {61.9048f,52.381f},\r
- {52.381f,61.9048f},\r
- {38.0952f,66.6667f},\r
- {28.5714f,66.6667f}\r
-};\r
-\r
-static const SFG_StrokeStrip ch127st[] =\r
-{\r
- {2,ch127st0},\r
- {17,ch127st1}\r
-};\r
-\r
-static const SFG_StrokeChar ch127 = {66.6667f,2,ch127st};\r
-\r
-static const SFG_StrokeChar *chars[] =\r
-{\r
- 0, 0, 0, 0, 0, 0, 0, 0,\r
- 0, 0, 0, 0, 0, 0, 0, 0,\r
- 0, 0, 0, 0, 0, 0, 0, 0,\r
- 0, 0, 0, 0, 0, 0, 0, 0,\r
- &ch32, &ch33, &ch34, &ch35, &ch36, &ch37, &ch38, &ch39,\r
- &ch40, &ch41, &ch42, &ch43, &ch44, &ch45, &ch46, &ch47,\r
- &ch48, &ch49, &ch50, &ch51, &ch52, &ch53, &ch54, &ch55,\r
- &ch56, &ch57, &ch58, &ch59, &ch60, &ch61, &ch62, &ch63,\r
- &ch64, &ch65, &ch66, &ch67, &ch68, &ch69, &ch70, &ch71,\r
- &ch72, &ch73, &ch74, &ch75, &ch76, &ch77, &ch78, &ch79,\r
- &ch80, &ch81, &ch82, &ch83, &ch84, &ch85, &ch86, &ch87,\r
- &ch88, &ch89, &ch90, &ch91, &ch92, &ch93, &ch94, &ch95,\r
- &ch96, &ch97, &ch98, &ch99, &ch100, &ch101, &ch102, &ch103,\r
- &ch104, &ch105, &ch106, &ch107, &ch108, &ch109, &ch110, &ch111,\r
- &ch112, &ch113, &ch114, &ch115, &ch116, &ch117, &ch118, &ch119,\r
- &ch120, &ch121, &ch122, &ch123, &ch124, &ch125, &ch126, &ch127\r
-};\r
-\r
-const SFG_StrokeFont fgStrokeRoman = {"Roman",128,152.381f,chars};\r
+/*
+ * freeglut_stroke_roman.c
+ *
+ * freeglut Roman stroke font definition
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Thu Dec 16 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+/* This file has been automatically generated by the genstroke utility. */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+/* char: 0x20 */
+
+static const SFG_StrokeStrip ch32st[] =
+{
+  { 0, NULL }
+};
+
+static const SFG_StrokeChar ch32 = {104.762f,0,ch32st};
+
+/* char: 0x21 */
+
+static const SFG_StrokeVertex ch33st0[] =
+{
+ {13.3819f,100.0f},
+ {13.3819f,33.3333f}
+};
+
+static const SFG_StrokeVertex ch33st1[] =
+{
+ {13.3819f,9.5238f},
+ {8.62f,4.7619f},
+ {13.3819f,0.0f},
+ {18.1438f,4.7619f},
+ {13.3819f,9.5238f}
+};
+
+static const SFG_StrokeStrip ch33st[] =
+{
+ {2,ch33st0},
+ {5,ch33st1}
+};
+
+static const SFG_StrokeChar ch33 = {26.6238f,2,ch33st};
+
+/* char: 0x22 */
+
+static const SFG_StrokeVertex ch34st0[] =
+{
+ {4.02f,100.0f},
+ {4.02f,66.6667f}
+};
+
+static const SFG_StrokeVertex ch34st1[] =
+{
+ {42.1152f,100.0f},
+ {42.1152f,66.6667f}
+};
+
+static const SFG_StrokeStrip ch34st[] =
+{
+ {2,ch34st0},
+ {2,ch34st1}
+};
+
+static const SFG_StrokeChar ch34 = {51.4352f,2,ch34st};
+
+/* char: 0x23 */
+
+static const SFG_StrokeVertex ch35st0[] =
+{
+ {41.2952f,119.048f},
+ {7.9619f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch35st1[] =
+{
+ {69.8667f,119.048f},
+ {36.5333f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch35st2[] =
+{
+ {7.9619f,57.1429f},
+ {74.6286f,57.1429f}
+};
+
+static const SFG_StrokeVertex ch35st3[] =
+{
+ {3.2f,28.5714f},
+ {69.8667f,28.5714f}
+};
+
+static const SFG_StrokeStrip ch35st[] =
+{
+ {2,ch35st0},
+ {2,ch35st1},
+ {2,ch35st2},
+ {2,ch35st3}
+};
+
+static const SFG_StrokeChar ch35 = {79.4886f,4,ch35st};
+
+/* char: 0x24 */
+
+static const SFG_StrokeVertex ch36st0[] =
+{
+ {28.6295f,119.048f},
+ {28.6295f,-19.0476f}
+};
+
+static const SFG_StrokeVertex ch36st1[] =
+{
+ {47.6771f,119.048f},
+ {47.6771f,-19.0476f}
+};
+
+static const SFG_StrokeVertex ch36st2[] =
+{
+ {71.4867f,85.7143f},
+ {61.9629f,95.2381f},
+ {47.6771f,100.0f},
+ {28.6295f,100.0f},
+ {14.3438f,95.2381f},
+ {4.82f,85.7143f},
+ {4.82f,76.1905f},
+ {9.5819f,66.6667f},
+ {14.3438f,61.9048f},
+ {23.8676f,57.1429f},
+ {52.439f,47.619f},
+ {61.9629f,42.8571f},
+ {66.7248f,38.0952f},
+ {71.4867f,28.5714f},
+ {71.4867f,14.2857f},
+ {61.9629f,4.7619f},
+ {47.6771f,0.0f},
+ {28.6295f,0.0f},
+ {14.3438f,4.7619f},
+ {4.82f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch36st[] =
+{
+ {2,ch36st0},
+ {2,ch36st1},
+ {20,ch36st2}
+};
+
+static const SFG_StrokeChar ch36 = {76.2067f,3,ch36st};
+
+/* char: 0x25 */
+
+static const SFG_StrokeVertex ch37st0[] =
+{
+ {92.0743f,100.0f},
+ {6.36f,0.0f}
+};
+
+static const SFG_StrokeVertex ch37st1[] =
+{
+ {30.1695f,100.0f},
+ {39.6933f,90.4762f},
+ {39.6933f,80.9524f},
+ {34.9314f,71.4286f},
+ {25.4076f,66.6667f},
+ {15.8838f,66.6667f},
+ {6.36f,76.1905f},
+ {6.36f,85.7143f},
+ {11.1219f,95.2381f},
+ {20.6457f,100.0f},
+ {30.1695f,100.0f},
+ {39.6933f,95.2381f},
+ {53.979f,90.4762f},
+ {68.2648f,90.4762f},
+ {82.5505f,95.2381f},
+ {92.0743f,100.0f}
+};
+
+static const SFG_StrokeVertex ch37st2[] =
+{
+ {73.0267f,33.3333f},
+ {63.5029f,28.5714f},
+ {58.741f,19.0476f},
+ {58.741f,9.5238f},
+ {68.2648f,0.0f},
+ {77.7886f,0.0f},
+ {87.3124f,4.7619f},
+ {92.0743f,14.2857f},
+ {92.0743f,23.8095f},
+ {82.5505f,33.3333f},
+ {73.0267f,33.3333f}
+};
+
+static const SFG_StrokeStrip ch37st[] =
+{
+ {2,ch37st0},
+ {16,ch37st1},
+ {11,ch37st2}
+};
+
+static const SFG_StrokeChar ch37 = {96.5743f,3,ch37st};
+
+/* char: 0x26 */
+
+static const SFG_StrokeVertex ch38st0[] =
+{
+ {101.218f,57.1429f},
+ {101.218f,61.9048f},
+ {96.4562f,66.6667f},
+ {91.6943f,66.6667f},
+ {86.9324f,61.9048f},
+ {82.1705f,52.381f},
+ {72.6467f,28.5714f},
+ {63.1229f,14.2857f},
+ {53.599f,4.7619f},
+ {44.0752f,0.0f},
+ {25.0276f,0.0f},
+ {15.5038f,4.7619f},
+ {10.7419f,9.5238f},
+ {5.98f,19.0476f},
+ {5.98f,28.5714f},
+ {10.7419f,38.0952f},
+ {15.5038f,42.8571f},
+ {48.8371f,61.9048f},
+ {53.599f,66.6667f},
+ {58.361f,76.1905f},
+ {58.361f,85.7143f},
+ {53.599f,95.2381f},
+ {44.0752f,100.0f},
+ {34.5514f,95.2381f},
+ {29.7895f,85.7143f},
+ {29.7895f,76.1905f},
+ {34.5514f,61.9048f},
+ {44.0752f,47.619f},
+ {67.8848f,14.2857f},
+ {77.4086f,4.7619f},
+ {86.9324f,0.0f},
+ {96.4562f,0.0f},
+ {101.218f,4.7619f},
+ {101.218f,9.5238f}
+};
+
+static const SFG_StrokeStrip ch38st[] =
+{
+ {34,ch38st0}
+};
+
+static const SFG_StrokeChar ch38 = {101.758f,1,ch38st};
+
+/* char: 0x27 */
+
+static const SFG_StrokeVertex ch39st0[] =
+{
+ {4.44f,100.0f},
+ {4.44f,66.6667f}
+};
+
+static const SFG_StrokeStrip ch39st[] =
+{
+ {2,ch39st0}
+};
+
+static const SFG_StrokeChar ch39 = {13.62f,1,ch39st};
+
+/* char: 0x28 */
+
+static const SFG_StrokeVertex ch40st0[] =
+{
+ {40.9133f,119.048f},
+ {31.3895f,109.524f},
+ {21.8657f,95.2381f},
+ {12.3419f,76.1905f},
+ {7.58f,52.381f},
+ {7.58f,33.3333f},
+ {12.3419f,9.5238f},
+ {21.8657f,-9.5238f},
+ {31.3895f,-23.8095f},
+ {40.9133f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch40st[] =
+{
+ {10,ch40st0}
+};
+
+static const SFG_StrokeChar ch40 = {47.1733f,1,ch40st};
+
+/* char: 0x29 */
+
+static const SFG_StrokeVertex ch41st0[] =
+{
+ {5.28f,119.048f},
+ {14.8038f,109.524f},
+ {24.3276f,95.2381f},
+ {33.8514f,76.1905f},
+ {38.6133f,52.381f},
+ {38.6133f,33.3333f},
+ {33.8514f,9.5238f},
+ {24.3276f,-9.5238f},
+ {14.8038f,-23.8095f},
+ {5.28f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch41st[] =
+{
+ {10,ch41st0}
+};
+
+static const SFG_StrokeChar ch41 = {47.5333f,1,ch41st};
+
+/* char: 0x2a */
+
+static const SFG_StrokeVertex ch42st0[] =
+{
+ {30.7695f,71.4286f},
+ {30.7695f,14.2857f}
+};
+
+static const SFG_StrokeVertex ch42st1[] =
+{
+ {6.96f,57.1429f},
+ {54.579f,28.5714f}
+};
+
+static const SFG_StrokeVertex ch42st2[] =
+{
+ {54.579f,57.1429f},
+ {6.96f,28.5714f}
+};
+
+static const SFG_StrokeStrip ch42st[] =
+{
+ {2,ch42st0},
+ {2,ch42st1},
+ {2,ch42st2}
+};
+
+static const SFG_StrokeChar ch42 = {59.439f,3,ch42st};
+
+/* char: 0x2b */
+
+static const SFG_StrokeVertex ch43st0[] =
+{
+ {48.8371f,85.7143f},
+ {48.8371f,0.0f}
+};
+
+static const SFG_StrokeVertex ch43st1[] =
+{
+ {5.98f,42.8571f},
+ {91.6943f,42.8571f}
+};
+
+static const SFG_StrokeStrip ch43st[] =
+{
+ {2,ch43st0},
+ {2,ch43st1}
+};
+
+static const SFG_StrokeChar ch43 = {97.2543f,2,ch43st};
+
+/* char: 0x2c */
+
+static const SFG_StrokeVertex ch44st0[] =
+{
+ {18.2838f,4.7619f},
+ {13.5219f,0.0f},
+ {8.76f,4.7619f},
+ {13.5219f,9.5238f},
+ {18.2838f,4.7619f},
+ {18.2838f,-4.7619f},
+ {13.5219f,-14.2857f},
+ {8.76f,-19.0476f}
+};
+
+static const SFG_StrokeStrip ch44st[] =
+{
+ {8,ch44st0}
+};
+
+static const SFG_StrokeChar ch44 = {26.0638f,1,ch44st};
+
+/* char: 0x2d */
+
+static const SFG_StrokeVertex ch45st0[] =
+{
+ {7.38f,42.8571f},
+ {93.0943f,42.8571f}
+};
+
+static const SFG_StrokeStrip ch45st[] =
+{
+ {2,ch45st0}
+};
+
+static const SFG_StrokeChar ch45 = {100.754f,1,ch45st};
+
+/* char: 0x2e */
+
+static const SFG_StrokeVertex ch46st0[] =
+{
+ {13.1019f,9.5238f},
+ {8.34f,4.7619f},
+ {13.1019f,0.0f},
+ {17.8638f,4.7619f},
+ {13.1019f,9.5238f}
+};
+
+static const SFG_StrokeStrip ch46st[] =
+{
+ {5,ch46st0}
+};
+
+static const SFG_StrokeChar ch46 = {26.4838f,1,ch46st};
+
+/* char: 0x2f */
+
+static const SFG_StrokeVertex ch47st0[] =
+{
+ {7.24f,-14.2857f},
+ {73.9067f,100.0f}
+};
+
+static const SFG_StrokeStrip ch47st[] =
+{
+ {2,ch47st0}
+};
+
+static const SFG_StrokeChar ch47 = {82.1067f,1,ch47st};
+
+/* char: 0x30 */
+
+static const SFG_StrokeVertex ch48st0[] =
+{
+ {33.5514f,100.0f},
+ {19.2657f,95.2381f},
+ {9.7419f,80.9524f},
+ {4.98f,57.1429f},
+ {4.98f,42.8571f},
+ {9.7419f,19.0476f},
+ {19.2657f,4.7619f},
+ {33.5514f,0.0f},
+ {43.0752f,0.0f},
+ {57.361f,4.7619f},
+ {66.8848f,19.0476f},
+ {71.6467f,42.8571f},
+ {71.6467f,57.1429f},
+ {66.8848f,80.9524f},
+ {57.361f,95.2381f},
+ {43.0752f,100.0f},
+ {33.5514f,100.0f}
+};
+
+static const SFG_StrokeStrip ch48st[] =
+{
+ {17,ch48st0}
+};
+
+static const SFG_StrokeChar ch48 = {77.0667f,1,ch48st};
+
+/* char: 0x31 */
+
+static const SFG_StrokeVertex ch49st0[] =
+{
+ {11.82f,80.9524f},
+ {21.3438f,85.7143f},
+ {35.6295f,100.0f},
+ {35.6295f,0.0f}
+};
+
+static const SFG_StrokeStrip ch49st[] =
+{
+ {4,ch49st0}
+};
+
+static const SFG_StrokeChar ch49 = {66.5295f,1,ch49st};
+
+/* char: 0x32 */
+
+static const SFG_StrokeVertex ch50st0[] =
+{
+ {10.1819f,76.1905f},
+ {10.1819f,80.9524f},
+ {14.9438f,90.4762f},
+ {19.7057f,95.2381f},
+ {29.2295f,100.0f},
+ {48.2771f,100.0f},
+ {57.801f,95.2381f},
+ {62.5629f,90.4762f},
+ {67.3248f,80.9524f},
+ {67.3248f,71.4286f},
+ {62.5629f,61.9048f},
+ {53.039f,47.619f},
+ {5.42f,0.0f},
+ {72.0867f,0.0f}
+};
+
+static const SFG_StrokeStrip ch50st[] =
+{
+ {14,ch50st0}
+};
+
+static const SFG_StrokeChar ch50 = {77.6467f,1,ch50st};
+
+/* char: 0x33 */
+
+static const SFG_StrokeVertex ch51st0[] =
+{
+ {14.5238f,100.0f},
+ {66.9048f,100.0f},
+ {38.3333f,61.9048f},
+ {52.619f,61.9048f},
+ {62.1429f,57.1429f},
+ {66.9048f,52.381f},
+ {71.6667f,38.0952f},
+ {71.6667f,28.5714f},
+ {66.9048f,14.2857f},
+ {57.381f,4.7619f},
+ {43.0952f,0.0f},
+ {28.8095f,0.0f},
+ {14.5238f,4.7619f},
+ {9.7619f,9.5238f},
+ {5.0f,19.0476f}
+};
+
+static const SFG_StrokeStrip ch51st[] =
+{
+ {15,ch51st0}
+};
+
+static const SFG_StrokeChar ch51 = {77.0467f,1,ch51st};
+
+/* char: 0x34 */
+
+static const SFG_StrokeVertex ch52st0[] =
+{
+ {51.499f,100.0f},
+ {3.88f,33.3333f},
+ {75.3086f,33.3333f}
+};
+
+static const SFG_StrokeVertex ch52st1[] =
+{
+ {51.499f,100.0f},
+ {51.499f,0.0f}
+};
+
+static const SFG_StrokeStrip ch52st[] =
+{
+ {3,ch52st0},
+ {2,ch52st1}
+};
+
+static const SFG_StrokeChar ch52 = {80.1686f,2,ch52st};
+
+/* char: 0x35 */
+
+static const SFG_StrokeVertex ch53st0[] =
+{
+ {62.0029f,100.0f},
+ {14.3838f,100.0f},
+ {9.6219f,57.1429f},
+ {14.3838f,61.9048f},
+ {28.6695f,66.6667f},
+ {42.9552f,66.6667f},
+ {57.241f,61.9048f},
+ {66.7648f,52.381f},
+ {71.5267f,38.0952f},
+ {71.5267f,28.5714f},
+ {66.7648f,14.2857f},
+ {57.241f,4.7619f},
+ {42.9552f,0.0f},
+ {28.6695f,0.0f},
+ {14.3838f,4.7619f},
+ {9.6219f,9.5238f},
+ {4.86f,19.0476f}
+};
+
+static const SFG_StrokeStrip ch53st[] =
+{
+ {17,ch53st0}
+};
+
+static const SFG_StrokeChar ch53 = {77.6867f,1,ch53st};
+
+/* char: 0x36 */
+
+static const SFG_StrokeVertex ch54st0[] =
+{
+ {62.7229f,85.7143f},
+ {57.961f,95.2381f},
+ {43.6752f,100.0f},
+ {34.1514f,100.0f},
+ {19.8657f,95.2381f},
+ {10.3419f,80.9524f},
+ {5.58f,57.1429f},
+ {5.58f,33.3333f},
+ {10.3419f,14.2857f},
+ {19.8657f,4.7619f},
+ {34.1514f,0.0f},
+ {38.9133f,0.0f},
+ {53.199f,4.7619f},
+ {62.7229f,14.2857f},
+ {67.4848f,28.5714f},
+ {67.4848f,33.3333f},
+ {62.7229f,47.619f},
+ {53.199f,57.1429f},
+ {38.9133f,61.9048f},
+ {34.1514f,61.9048f},
+ {19.8657f,57.1429f},
+ {10.3419f,47.619f},
+ {5.58f,33.3333f}
+};
+
+static const SFG_StrokeStrip ch54st[] =
+{
+ {23,ch54st0}
+};
+
+static const SFG_StrokeChar ch54 = {73.8048f,1,ch54st};
+
+/* char: 0x37 */
+
+static const SFG_StrokeVertex ch55st0[] =
+{
+ {72.2267f,100.0f},
+ {24.6076f,0.0f}
+};
+
+static const SFG_StrokeVertex ch55st1[] =
+{
+ {5.56f,100.0f},
+ {72.2267f,100.0f}
+};
+
+static const SFG_StrokeStrip ch55st[] =
+{
+ {2,ch55st0},
+ {2,ch55st1}
+};
+
+static const SFG_StrokeChar ch55 = {77.2267f,2,ch55st};
+
+/* char: 0x38 */
+
+static const SFG_StrokeVertex ch56st0[] =
+{
+ {29.4095f,100.0f},
+ {15.1238f,95.2381f},
+ {10.3619f,85.7143f},
+ {10.3619f,76.1905f},
+ {15.1238f,66.6667f},
+ {24.6476f,61.9048f},
+ {43.6952f,57.1429f},
+ {57.981f,52.381f},
+ {67.5048f,42.8571f},
+ {72.2667f,33.3333f},
+ {72.2667f,19.0476f},
+ {67.5048f,9.5238f},
+ {62.7429f,4.7619f},
+ {48.4571f,0.0f},
+ {29.4095f,0.0f},
+ {15.1238f,4.7619f},
+ {10.3619f,9.5238f},
+ {5.6f,19.0476f},
+ {5.6f,33.3333f},
+ {10.3619f,42.8571f},
+ {19.8857f,52.381f},
+ {34.1714f,57.1429f},
+ {53.219f,61.9048f},
+ {62.7429f,66.6667f},
+ {67.5048f,76.1905f},
+ {67.5048f,85.7143f},
+ {62.7429f,95.2381f},
+ {48.4571f,100.0f},
+ {29.4095f,100.0f}
+};
+
+static const SFG_StrokeStrip ch56st[] =
+{
+ {29,ch56st0}
+};
+
+static const SFG_StrokeChar ch56 = {77.6667f,1,ch56st};
+
+/* char: 0x39 */
+
+static const SFG_StrokeVertex ch57st0[] =
+{
+ {68.5048f,66.6667f},
+ {63.7429f,52.381f},
+ {54.219f,42.8571f},
+ {39.9333f,38.0952f},
+ {35.1714f,38.0952f},
+ {20.8857f,42.8571f},
+ {11.3619f,52.381f},
+ {6.6f,66.6667f},
+ {6.6f,71.4286f},
+ {11.3619f,85.7143f},
+ {20.8857f,95.2381f},
+ {35.1714f,100.0f},
+ {39.9333f,100.0f},
+ {54.219f,95.2381f},
+ {63.7429f,85.7143f},
+ {68.5048f,66.6667f},
+ {68.5048f,42.8571f},
+ {63.7429f,19.0476f},
+ {54.219f,4.7619f},
+ {39.9333f,0.0f},
+ {30.4095f,0.0f},
+ {16.1238f,4.7619f},
+ {11.3619f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch57st[] =
+{
+ {23,ch57st0}
+};
+
+static const SFG_StrokeChar ch57 = {74.0648f,1,ch57st};
+
+/* char: 0x3a */
+
+static const SFG_StrokeVertex ch58st0[] =
+{
+ {14.0819f,66.6667f},
+ {9.32f,61.9048f},
+ {14.0819f,57.1429f},
+ {18.8438f,61.9048f},
+ {14.0819f,66.6667f}
+};
+
+static const SFG_StrokeVertex ch58st1[] =
+{
+ {14.0819f,9.5238f},
+ {9.32f,4.7619f},
+ {14.0819f,0.0f},
+ {18.8438f,4.7619f},
+ {14.0819f,9.5238f}
+};
+
+static const SFG_StrokeStrip ch58st[] =
+{
+ {5,ch58st0},
+ {5,ch58st1}
+};
+
+static const SFG_StrokeChar ch58 = {26.2238f,2,ch58st};
+
+/* char: 0x3b */
+
+static const SFG_StrokeVertex ch59st0[] =
+{
+ {12.9619f,66.6667f},
+ {8.2f,61.9048f},
+ {12.9619f,57.1429f},
+ {17.7238f,61.9048f},
+ {12.9619f,66.6667f}
+};
+
+static const SFG_StrokeVertex ch59st1[] =
+{
+ {17.7238f,4.7619f},
+ {12.9619f,0.0f},
+ {8.2f,4.7619f},
+ {12.9619f,9.5238f},
+ {17.7238f,4.7619f},
+ {17.7238f,-4.7619f},
+ {12.9619f,-14.2857f},
+ {8.2f,-19.0476f}
+};
+
+static const SFG_StrokeStrip ch59st[] =
+{
+ {5,ch59st0},
+ {8,ch59st1}
+};
+
+static const SFG_StrokeChar ch59 = {26.3038f,2,ch59st};
+
+/* char: 0x3c */
+
+static const SFG_StrokeVertex ch60st0[] =
+{
+ {79.2505f,85.7143f},
+ {3.06f,42.8571f},
+ {79.2505f,0.0f}
+};
+
+static const SFG_StrokeStrip ch60st[] =
+{
+ {3,ch60st0}
+};
+
+static const SFG_StrokeChar ch60 = {81.6105f,1,ch60st};
+
+/* char: 0x3d */
+
+static const SFG_StrokeVertex ch61st0[] =
+{
+ {5.7f,57.1429f},
+ {91.4143f,57.1429f}
+};
+
+static const SFG_StrokeVertex ch61st1[] =
+{
+ {5.7f,28.5714f},
+ {91.4143f,28.5714f}
+};
+
+static const SFG_StrokeStrip ch61st[] =
+{
+ {2,ch61st0},
+ {2,ch61st1}
+};
+
+static const SFG_StrokeChar ch61 = {97.2543f,2,ch61st};
+
+/* char: 0x3e */
+
+static const SFG_StrokeVertex ch62st0[] =
+{
+ {2.78f,85.7143f},
+ {78.9705f,42.8571f},
+ {2.78f,0.0f}
+};
+
+static const SFG_StrokeStrip ch62st[] =
+{
+ {3,ch62st0}
+};
+
+static const SFG_StrokeChar ch62 = {81.6105f,1,ch62st};
+
+/* char: 0x3f */
+
+static const SFG_StrokeVertex ch63st0[] =
+{
+ {8.42f,76.1905f},
+ {8.42f,80.9524f},
+ {13.1819f,90.4762f},
+ {17.9438f,95.2381f},
+ {27.4676f,100.0f},
+ {46.5152f,100.0f},
+ {56.039f,95.2381f},
+ {60.801f,90.4762f},
+ {65.5629f,80.9524f},
+ {65.5629f,71.4286f},
+ {60.801f,61.9048f},
+ {56.039f,57.1429f},
+ {36.9914f,47.619f},
+ {36.9914f,33.3333f}
+};
+
+static const SFG_StrokeVertex ch63st1[] =
+{
+ {36.9914f,9.5238f},
+ {32.2295f,4.7619f},
+ {36.9914f,0.0f},
+ {41.7533f,4.7619f},
+ {36.9914f,9.5238f}
+};
+
+static const SFG_StrokeStrip ch63st[] =
+{
+ {14,ch63st0},
+ {5,ch63st1}
+};
+
+static const SFG_StrokeChar ch63 = {73.9029f,2,ch63st};
+
+/* char: 0x40 */
+
+static const SFG_StrokeVertex ch64st0[] =
+{
+ {49.2171f,52.381f},
+ {39.6933f,57.1429f},
+ {30.1695f,57.1429f},
+ {25.4076f,47.619f},
+ {25.4076f,42.8571f},
+ {30.1695f,33.3333f},
+ {39.6933f,33.3333f},
+ {49.2171f,38.0952f}
+};
+
+static const SFG_StrokeVertex ch64st1[] =
+{
+ {49.2171f,57.1429f},
+ {49.2171f,38.0952f},
+ {53.979f,33.3333f},
+ {63.5029f,33.3333f},
+ {68.2648f,42.8571f},
+ {68.2648f,47.619f},
+ {63.5029f,61.9048f},
+ {53.979f,71.4286f},
+ {39.6933f,76.1905f},
+ {34.9314f,76.1905f},
+ {20.6457f,71.4286f},
+ {11.1219f,61.9048f},
+ {6.36f,47.619f},
+ {6.36f,42.8571f},
+ {11.1219f,28.5714f},
+ {20.6457f,19.0476f},
+ {34.9314f,14.2857f},
+ {39.6933f,14.2857f},
+ {53.979f,19.0476f}
+};
+
+static const SFG_StrokeStrip ch64st[] =
+{
+ {8,ch64st0},
+ {19,ch64st1}
+};
+
+static const SFG_StrokeChar ch64 = {74.3648f,2,ch64st};
+
+/* char: 0x41 */
+
+static const SFG_StrokeVertex ch65st0[] =
+{
+ {40.5952f,100.0f},
+ {2.5f,0.0f}
+};
+
+static const SFG_StrokeVertex ch65st1[] =
+{
+ {40.5952f,100.0f},
+ {78.6905f,0.0f}
+};
+
+static const SFG_StrokeVertex ch65st2[] =
+{
+ {16.7857f,33.3333f},
+ {64.4048f,33.3333f}
+};
+
+static const SFG_StrokeStrip ch65st[] =
+{
+ {2,ch65st0},
+ {2,ch65st1},
+ {2,ch65st2}
+};
+
+static const SFG_StrokeChar ch65 = {80.4905f,3,ch65st};
+
+/* char: 0x42 */
+
+static const SFG_StrokeVertex ch66st0[] =
+{
+ {11.42f,100.0f},
+ {11.42f,0.0f}
+};
+
+static const SFG_StrokeVertex ch66st1[] =
+{
+ {11.42f,100.0f},
+ {54.2771f,100.0f},
+ {68.5629f,95.2381f},
+ {73.3248f,90.4762f},
+ {78.0867f,80.9524f},
+ {78.0867f,71.4286f},
+ {73.3248f,61.9048f},
+ {68.5629f,57.1429f},
+ {54.2771f,52.381f}
+};
+
+static const SFG_StrokeVertex ch66st2[] =
+{
+ {11.42f,52.381f},
+ {54.2771f,52.381f},
+ {68.5629f,47.619f},
+ {73.3248f,42.8571f},
+ {78.0867f,33.3333f},
+ {78.0867f,19.0476f},
+ {73.3248f,9.5238f},
+ {68.5629f,4.7619f},
+ {54.2771f,0.0f},
+ {11.42f,0.0f}
+};
+
+static const SFG_StrokeStrip ch66st[] =
+{
+ {2,ch66st0},
+ {9,ch66st1},
+ {10,ch66st2}
+};
+
+static const SFG_StrokeChar ch66 = {83.6267f,3,ch66st};
+
+/* char: 0x43 */
+
+static const SFG_StrokeVertex ch67st0[] =
+{
+ {78.0886f,76.1905f},
+ {73.3267f,85.7143f},
+ {63.8029f,95.2381f},
+ {54.279f,100.0f},
+ {35.2314f,100.0f},
+ {25.7076f,95.2381f},
+ {16.1838f,85.7143f},
+ {11.4219f,76.1905f},
+ {6.66f,61.9048f},
+ {6.66f,38.0952f},
+ {11.4219f,23.8095f},
+ {16.1838f,14.2857f},
+ {25.7076f,4.7619f},
+ {35.2314f,0.0f},
+ {54.279f,0.0f},
+ {63.8029f,4.7619f},
+ {73.3267f,14.2857f},
+ {78.0886f,23.8095f}
+};
+
+static const SFG_StrokeStrip ch67st[] =
+{
+ {18,ch67st0}
+};
+
+static const SFG_StrokeChar ch67 = {84.4886f,1,ch67st};
+
+/* char: 0x44 */
+
+static const SFG_StrokeVertex ch68st0[] =
+{
+ {11.96f,100.0f},
+ {11.96f,0.0f}
+};
+
+static const SFG_StrokeVertex ch68st1[] =
+{
+ {11.96f,100.0f},
+ {45.2933f,100.0f},
+ {59.579f,95.2381f},
+ {69.1029f,85.7143f},
+ {73.8648f,76.1905f},
+ {78.6267f,61.9048f},
+ {78.6267f,38.0952f},
+ {73.8648f,23.8095f},
+ {69.1029f,14.2857f},
+ {59.579f,4.7619f},
+ {45.2933f,0.0f},
+ {11.96f,0.0f}
+};
+
+static const SFG_StrokeStrip ch68st[] =
+{
+ {2,ch68st0},
+ {12,ch68st1}
+};
+
+static const SFG_StrokeChar ch68 = {85.2867f,2,ch68st};
+
+/* char: 0x45 */
+
+static const SFG_StrokeVertex ch69st0[] =
+{
+ {11.42f,100.0f},
+ {11.42f,0.0f}
+};
+
+static const SFG_StrokeVertex ch69st1[] =
+{
+ {11.42f,100.0f},
+ {73.3248f,100.0f}
+};
+
+static const SFG_StrokeVertex ch69st2[] =
+{
+ {11.42f,52.381f},
+ {49.5152f,52.381f}
+};
+
+static const SFG_StrokeVertex ch69st3[] =
+{
+ {11.42f,0.0f},
+ {73.3248f,0.0f}
+};
+
+static const SFG_StrokeStrip ch69st[] =
+{
+ {2,ch69st0},
+ {2,ch69st1},
+ {2,ch69st2},
+ {2,ch69st3}
+};
+
+static const SFG_StrokeChar ch69 = {78.1848f,4,ch69st};
+
+/* char: 0x46 */
+
+static const SFG_StrokeVertex ch70st0[] =
+{
+ {11.42f,100.0f},
+ {11.42f,0.0f}
+};
+
+static const SFG_StrokeVertex ch70st1[] =
+{
+ {11.42f,100.0f},
+ {73.3248f,100.0f}
+};
+
+static const SFG_StrokeVertex ch70st2[] =
+{
+ {11.42f,52.381f},
+ {49.5152f,52.381f}
+};
+
+static const SFG_StrokeStrip ch70st[] =
+{
+ {2,ch70st0},
+ {2,ch70st1},
+ {2,ch70st2}
+};
+
+static const SFG_StrokeChar ch70 = {78.7448f,3,ch70st};
+
+/* char: 0x47 */
+
+static const SFG_StrokeVertex ch71st0[] =
+{
+ {78.4886f,76.1905f},
+ {73.7267f,85.7143f},
+ {64.2029f,95.2381f},
+ {54.679f,100.0f},
+ {35.6314f,100.0f},
+ {26.1076f,95.2381f},
+ {16.5838f,85.7143f},
+ {11.8219f,76.1905f},
+ {7.06f,61.9048f},
+ {7.06f,38.0952f},
+ {11.8219f,23.8095f},
+ {16.5838f,14.2857f},
+ {26.1076f,4.7619f},
+ {35.6314f,0.0f},
+ {54.679f,0.0f},
+ {64.2029f,4.7619f},
+ {73.7267f,14.2857f},
+ {78.4886f,23.8095f},
+ {78.4886f,38.0952f}
+};
+
+static const SFG_StrokeVertex ch71st1[] =
+{
+ {54.679f,38.0952f},
+ {78.4886f,38.0952f}
+};
+
+static const SFG_StrokeStrip ch71st[] =
+{
+ {19,ch71st0},
+ {2,ch71st1}
+};
+
+static const SFG_StrokeChar ch71 = {89.7686f,2,ch71st};
+
+/* char: 0x48 */
+
+static const SFG_StrokeVertex ch72st0[] =
+{
+ {11.42f,100.0f},
+ {11.42f,0.0f}
+};
+
+static const SFG_StrokeVertex ch72st1[] =
+{
+ {78.0867f,100.0f},
+ {78.0867f,0.0f}
+};
+
+static const SFG_StrokeVertex ch72st2[] =
+{
+ {11.42f,52.381f},
+ {78.0867f,52.381f}
+};
+
+static const SFG_StrokeStrip ch72st[] =
+{
+ {2,ch72st0},
+ {2,ch72st1},
+ {2,ch72st2}
+};
+
+static const SFG_StrokeChar ch72 = {89.0867f,3,ch72st};
+
+/* char: 0x49 */
+
+static const SFG_StrokeVertex ch73st0[] =
+{
+ {10.86f,100.0f},
+ {10.86f,0.0f}
+};
+
+static const SFG_StrokeStrip ch73st[] =
+{
+ {2,ch73st0}
+};
+
+static const SFG_StrokeChar ch73 = {21.3f,1,ch73st};
+
+/* char: 0x4a */
+
+static const SFG_StrokeVertex ch74st0[] =
+{
+ {50.119f,100.0f},
+ {50.119f,23.8095f},
+ {45.3571f,9.5238f},
+ {40.5952f,4.7619f},
+ {31.0714f,0.0f},
+ {21.5476f,0.0f},
+ {12.0238f,4.7619f},
+ {7.2619f,9.5238f},
+ {2.5f,23.8095f},
+ {2.5f,33.3333f}
+};
+
+static const SFG_StrokeStrip ch74st[] =
+{
+ {10,ch74st0}
+};
+
+static const SFG_StrokeChar ch74 = {59.999f,1,ch74st};
+
+/* char: 0x4b */
+
+static const SFG_StrokeVertex ch75st0[] =
+{
+ {11.28f,100.0f},
+ {11.28f,0.0f}
+};
+
+static const SFG_StrokeVertex ch75st1[] =
+{
+ {77.9467f,100.0f},
+ {11.28f,33.3333f}
+};
+
+static const SFG_StrokeVertex ch75st2[] =
+{
+ {35.0895f,57.1429f},
+ {77.9467f,0.0f}
+};
+
+static const SFG_StrokeStrip ch75st[] =
+{
+ {2,ch75st0},
+ {2,ch75st1},
+ {2,ch75st2}
+};
+
+static const SFG_StrokeChar ch75 = {79.3267f,3,ch75st};
+
+/* char: 0x4c */
+
+static const SFG_StrokeVertex ch76st0[] =
+{
+ {11.68f,100.0f},
+ {11.68f,0.0f}
+};
+
+static const SFG_StrokeVertex ch76st1[] =
+{
+ {11.68f,0.0f},
+ {68.8229f,0.0f}
+};
+
+static const SFG_StrokeStrip ch76st[] =
+{
+ {2,ch76st0},
+ {2,ch76st1}
+};
+
+static const SFG_StrokeChar ch76 = {71.3229f,2,ch76st};
+
+/* char: 0x4d */
+
+static const SFG_StrokeVertex ch77st0[] =
+{
+ {10.86f,100.0f},
+ {10.86f,0.0f}
+};
+
+static const SFG_StrokeVertex ch77st1[] =
+{
+ {10.86f,100.0f},
+ {48.9552f,0.0f}
+};
+
+static const SFG_StrokeVertex ch77st2[] =
+{
+ {87.0505f,100.0f},
+ {48.9552f,0.0f}
+};
+
+static const SFG_StrokeVertex ch77st3[] =
+{
+ {87.0505f,100.0f},
+ {87.0505f,0.0f}
+};
+
+static const SFG_StrokeStrip ch77st[] =
+{
+ {2,ch77st0},
+ {2,ch77st1},
+ {2,ch77st2},
+ {2,ch77st3}
+};
+
+static const SFG_StrokeChar ch77 = {97.2105f,4,ch77st};
+
+/* char: 0x4e */
+
+static const SFG_StrokeVertex ch78st0[] =
+{
+ {11.14f,100.0f},
+ {11.14f,0.0f}
+};
+
+static const SFG_StrokeVertex ch78st1[] =
+{
+ {11.14f,100.0f},
+ {77.8067f,0.0f}
+};
+
+static const SFG_StrokeVertex ch78st2[] =
+{
+ {77.8067f,100.0f},
+ {77.8067f,0.0f}
+};
+
+static const SFG_StrokeStrip ch78st[] =
+{
+ {2,ch78st0},
+ {2,ch78st1},
+ {2,ch78st2}
+};
+
+static const SFG_StrokeChar ch78 = {88.8067f,3,ch78st};
+
+/* char: 0x4f */
+
+static const SFG_StrokeVertex ch79st0[] =
+{
+ {34.8114f,100.0f},
+ {25.2876f,95.2381f},
+ {15.7638f,85.7143f},
+ {11.0019f,76.1905f},
+ {6.24f,61.9048f},
+ {6.24f,38.0952f},
+ {11.0019f,23.8095f},
+ {15.7638f,14.2857f},
+ {25.2876f,4.7619f},
+ {34.8114f,0.0f},
+ {53.859f,0.0f},
+ {63.3829f,4.7619f},
+ {72.9067f,14.2857f},
+ {77.6686f,23.8095f},
+ {82.4305f,38.0952f},
+ {82.4305f,61.9048f},
+ {77.6686f,76.1905f},
+ {72.9067f,85.7143f},
+ {63.3829f,95.2381f},
+ {53.859f,100.0f},
+ {34.8114f,100.0f}
+};
+
+static const SFG_StrokeStrip ch79st[] =
+{
+ {21,ch79st0}
+};
+
+static const SFG_StrokeChar ch79 = {88.8305f,1,ch79st};
+
+/* char: 0x50 */
+
+static const SFG_StrokeVertex ch80st0[] =
+{
+ {12.1f,100.0f},
+ {12.1f,0.0f}
+};
+
+static const SFG_StrokeVertex ch80st1[] =
+{
+ {12.1f,100.0f},
+ {54.9571f,100.0f},
+ {69.2429f,95.2381f},
+ {74.0048f,90.4762f},
+ {78.7667f,80.9524f},
+ {78.7667f,66.6667f},
+ {74.0048f,57.1429f},
+ {69.2429f,52.381f},
+ {54.9571f,47.619f},
+ {12.1f,47.619f}
+};
+
+static const SFG_StrokeStrip ch80st[] =
+{
+ {2,ch80st0},
+ {10,ch80st1}
+};
+
+static const SFG_StrokeChar ch80 = {85.6667f,2,ch80st};
+
+/* char: 0x51 */
+
+static const SFG_StrokeVertex ch81st0[] =
+{
+ {33.8714f,100.0f},
+ {24.3476f,95.2381f},
+ {14.8238f,85.7143f},
+ {10.0619f,76.1905f},
+ {5.3f,61.9048f},
+ {5.3f,38.0952f},
+ {10.0619f,23.8095f},
+ {14.8238f,14.2857f},
+ {24.3476f,4.7619f},
+ {33.8714f,0.0f},
+ {52.919f,0.0f},
+ {62.4429f,4.7619f},
+ {71.9667f,14.2857f},
+ {76.7286f,23.8095f},
+ {81.4905f,38.0952f},
+ {81.4905f,61.9048f},
+ {76.7286f,76.1905f},
+ {71.9667f,85.7143f},
+ {62.4429f,95.2381f},
+ {52.919f,100.0f},
+ {33.8714f,100.0f}
+};
+
+static const SFG_StrokeVertex ch81st1[] =
+{
+ {48.1571f,19.0476f},
+ {76.7286f,-9.5238f}
+};
+
+static const SFG_StrokeStrip ch81st[] =
+{
+ {21,ch81st0},
+ {2,ch81st1}
+};
+
+static const SFG_StrokeChar ch81 = {88.0905f,2,ch81st};
+
+/* char: 0x52 */
+
+static const SFG_StrokeVertex ch82st0[] =
+{
+ {11.68f,100.0f},
+ {11.68f,0.0f}
+};
+
+static const SFG_StrokeVertex ch82st1[] =
+{
+ {11.68f,100.0f},
+ {54.5371f,100.0f},
+ {68.8229f,95.2381f},
+ {73.5848f,90.4762f},
+ {78.3467f,80.9524f},
+ {78.3467f,71.4286f},
+ {73.5848f,61.9048f},
+ {68.8229f,57.1429f},
+ {54.5371f,52.381f},
+ {11.68f,52.381f}
+};
+
+static const SFG_StrokeVertex ch82st2[] =
+{
+ {45.0133f,52.381f},
+ {78.3467f,0.0f}
+};
+
+static const SFG_StrokeStrip ch82st[] =
+{
+ {2,ch82st0},
+ {10,ch82st1},
+ {2,ch82st2}
+};
+
+static const SFG_StrokeChar ch82 = {82.3667f,3,ch82st};
+
+/* char: 0x53 */
+
+static const SFG_StrokeVertex ch83st0[] =
+{
+ {74.6667f,85.7143f},
+ {65.1429f,95.2381f},
+ {50.8571f,100.0f},
+ {31.8095f,100.0f},
+ {17.5238f,95.2381f},
+ {8.0f,85.7143f},
+ {8.0f,76.1905f},
+ {12.7619f,66.6667f},
+ {17.5238f,61.9048f},
+ {27.0476f,57.1429f},
+ {55.619f,47.619f},
+ {65.1429f,42.8571f},
+ {69.9048f,38.0952f},
+ {74.6667f,28.5714f},
+ {74.6667f,14.2857f},
+ {65.1429f,4.7619f},
+ {50.8571f,0.0f},
+ {31.8095f,0.0f},
+ {17.5238f,4.7619f},
+ {8.0f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch83st[] =
+{
+ {20,ch83st0}
+};
+
+static const SFG_StrokeChar ch83 = {80.8267f,1,ch83st};
+
+/* char: 0x54 */
+
+static const SFG_StrokeVertex ch84st0[] =
+{
+ {35.6933f,100.0f},
+ {35.6933f,0.0f}
+};
+
+static const SFG_StrokeVertex ch84st1[] =
+{
+ {2.36f,100.0f},
+ {69.0267f,100.0f}
+};
+
+static const SFG_StrokeStrip ch84st[] =
+{
+ {2,ch84st0},
+ {2,ch84st1}
+};
+
+static const SFG_StrokeChar ch84 = {71.9467f,2,ch84st};
+
+/* char: 0x55 */
+
+static const SFG_StrokeVertex ch85st0[] =
+{
+ {11.54f,100.0f},
+ {11.54f,28.5714f},
+ {16.3019f,14.2857f},
+ {25.8257f,4.7619f},
+ {40.1114f,0.0f},
+ {49.6352f,0.0f},
+ {63.921f,4.7619f},
+ {73.4448f,14.2857f},
+ {78.2067f,28.5714f},
+ {78.2067f,100.0f}
+};
+
+static const SFG_StrokeStrip ch85st[] =
+{
+ {10,ch85st0}
+};
+
+static const SFG_StrokeChar ch85 = {89.4867f,1,ch85st};
+
+/* char: 0x56 */
+
+static const SFG_StrokeVertex ch86st0[] =
+{
+ {2.36f,100.0f},
+ {40.4552f,0.0f}
+};
+
+static const SFG_StrokeVertex ch86st1[] =
+{
+ {78.5505f,100.0f},
+ {40.4552f,0.0f}
+};
+
+static const SFG_StrokeStrip ch86st[] =
+{
+ {2,ch86st0},
+ {2,ch86st1}
+};
+
+static const SFG_StrokeChar ch86 = {81.6105f,2,ch86st};
+
+/* char: 0x57 */
+
+static const SFG_StrokeVertex ch87st0[] =
+{
+ {2.22f,100.0f},
+ {26.0295f,0.0f}
+};
+
+static const SFG_StrokeVertex ch87st1[] =
+{
+ {49.839f,100.0f},
+ {26.0295f,0.0f}
+};
+
+static const SFG_StrokeVertex ch87st2[] =
+{
+ {49.839f,100.0f},
+ {73.6486f,0.0f}
+};
+
+static const SFG_StrokeVertex ch87st3[] =
+{
+ {97.4581f,100.0f},
+ {73.6486f,0.0f}
+};
+
+static const SFG_StrokeStrip ch87st[] =
+{
+ {2,ch87st0},
+ {2,ch87st1},
+ {2,ch87st2},
+ {2,ch87st3}
+};
+
+static const SFG_StrokeChar ch87 = {100.518f,4,ch87st};
+
+/* char: 0x58 */
+
+static const SFG_StrokeVertex ch88st0[] =
+{
+ {2.5f,100.0f},
+ {69.1667f,0.0f}
+};
+
+static const SFG_StrokeVertex ch88st1[] =
+{
+ {69.1667f,100.0f},
+ {2.5f,0.0f}
+};
+
+static const SFG_StrokeStrip ch88st[] =
+{
+ {2,ch88st0},
+ {2,ch88st1}
+};
+
+static const SFG_StrokeChar ch88 = {72.3667f,2,ch88st};
+
+/* char: 0x59 */
+
+static const SFG_StrokeVertex ch89st0[] =
+{
+ {1.52f,100.0f},
+ {39.6152f,52.381f},
+ {39.6152f,0.0f}
+};
+
+static const SFG_StrokeVertex ch89st1[] =
+{
+ {77.7105f,100.0f},
+ {39.6152f,52.381f}
+};
+
+static const SFG_StrokeStrip ch89st[] =
+{
+ {3,ch89st0},
+ {2,ch89st1}
+};
+
+static const SFG_StrokeChar ch89 = {79.6505f,2,ch89st};
+
+/* char: 0x5a */
+
+static const SFG_StrokeVertex ch90st0[] =
+{
+ {69.1667f,100.0f},
+ {2.5f,0.0f}
+};
+
+static const SFG_StrokeVertex ch90st1[] =
+{
+ {2.5f,100.0f},
+ {69.1667f,100.0f}
+};
+
+static const SFG_StrokeVertex ch90st2[] =
+{
+ {2.5f,0.0f},
+ {69.1667f,0.0f}
+};
+
+static const SFG_StrokeStrip ch90st[] =
+{
+ {2,ch90st0},
+ {2,ch90st1},
+ {2,ch90st2}
+};
+
+static const SFG_StrokeChar ch90 = {73.7467f,3,ch90st};
+
+/* char: 0x5b */
+
+static const SFG_StrokeVertex ch91st0[] =
+{
+ {7.78f,119.048f},
+ {7.78f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch91st1[] =
+{
+ {12.5419f,119.048f},
+ {12.5419f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch91st2[] =
+{
+ {7.78f,119.048f},
+ {41.1133f,119.048f}
+};
+
+static const SFG_StrokeVertex ch91st3[] =
+{
+ {7.78f,-33.3333f},
+ {41.1133f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch91st[] =
+{
+ {2,ch91st0},
+ {2,ch91st1},
+ {2,ch91st2},
+ {2,ch91st3}
+};
+
+static const SFG_StrokeChar ch91 = {46.1133f,4,ch91st};
+
+/* char: 0x5c */
+
+static const SFG_StrokeVertex ch92st0[] =
+{
+ {5.84f,100.0f},
+ {72.5067f,-14.2857f}
+};
+
+static const SFG_StrokeStrip ch92st[] =
+{
+ {2,ch92st0}
+};
+
+static const SFG_StrokeChar ch92 = {78.2067f,1,ch92st};
+
+/* char: 0x5d */
+
+static const SFG_StrokeVertex ch93st0[] =
+{
+ {33.0114f,119.048f},
+ {33.0114f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch93st1[] =
+{
+ {37.7733f,119.048f},
+ {37.7733f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch93st2[] =
+{
+ {4.44f,119.048f},
+ {37.7733f,119.048f}
+};
+
+static const SFG_StrokeVertex ch93st3[] =
+{
+ {4.44f,-33.3333f},
+ {37.7733f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch93st[] =
+{
+ {2,ch93st0},
+ {2,ch93st1},
+ {2,ch93st2},
+ {2,ch93st3}
+};
+
+static const SFG_StrokeChar ch93 = {46.3933f,4,ch93st};
+
+/* char: 0x5e */
+
+static const SFG_StrokeVertex ch94st0[] =
+{
+ {44.0752f,109.524f},
+ {5.98f,42.8571f}
+};
+
+static const SFG_StrokeVertex ch94st1[] =
+{
+ {44.0752f,109.524f},
+ {82.1705f,42.8571f}
+};
+
+static const SFG_StrokeStrip ch94st[] =
+{
+ {2,ch94st0},
+ {2,ch94st1}
+};
+
+static const SFG_StrokeChar ch94 = {90.2305f,2,ch94st};
+
+/* char: 0x5f */
+
+static const SFG_StrokeVertex ch95st0[] =
+{
+ {-1.1f,-33.3333f},
+ {103.662f,-33.3333f},
+ {103.662f,-28.5714f},
+ {-1.1f,-28.5714f},
+ {-1.1f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch95st[] =
+{
+ {5,ch95st0}
+};
+
+static const SFG_StrokeChar ch95 = {104.062f,1,ch95st};
+
+/* char: 0x60 */
+
+static const SFG_StrokeVertex ch96st0[] =
+{
+ {33.0219f,100.0f},
+ {56.8314f,71.4286f}
+};
+
+static const SFG_StrokeVertex ch96st1[] =
+{
+ {33.0219f,100.0f},
+ {28.26f,95.2381f},
+ {56.8314f,71.4286f}
+};
+
+static const SFG_StrokeStrip ch96st[] =
+{
+ {2,ch96st0},
+ {3,ch96st1}
+};
+
+static const SFG_StrokeChar ch96 = {83.5714f,2,ch96st};
+
+/* char: 0x61 */
+
+static const SFG_StrokeVertex ch97st0[] =
+{
+ {63.8229f,66.6667f},
+ {63.8229f,0.0f}
+};
+
+static const SFG_StrokeVertex ch97st1[] =
+{
+ {63.8229f,52.381f},
+ {54.299f,61.9048f},
+ {44.7752f,66.6667f},
+ {30.4895f,66.6667f},
+ {20.9657f,61.9048f},
+ {11.4419f,52.381f},
+ {6.68f,38.0952f},
+ {6.68f,28.5714f},
+ {11.4419f,14.2857f},
+ {20.9657f,4.7619f},
+ {30.4895f,0.0f},
+ {44.7752f,0.0f},
+ {54.299f,4.7619f},
+ {63.8229f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch97st[] =
+{
+ {2,ch97st0},
+ {14,ch97st1}
+};
+
+static const SFG_StrokeChar ch97 = {66.6029f,2,ch97st};
+
+/* char: 0x62 */
+
+static const SFG_StrokeVertex ch98st0[] =
+{
+ {8.76f,100.0f},
+ {8.76f,0.0f}
+};
+
+static const SFG_StrokeVertex ch98st1[] =
+{
+ {8.76f,52.381f},
+ {18.2838f,61.9048f},
+ {27.8076f,66.6667f},
+ {42.0933f,66.6667f},
+ {51.6171f,61.9048f},
+ {61.141f,52.381f},
+ {65.9029f,38.0952f},
+ {65.9029f,28.5714f},
+ {61.141f,14.2857f},
+ {51.6171f,4.7619f},
+ {42.0933f,0.0f},
+ {27.8076f,0.0f},
+ {18.2838f,4.7619f},
+ {8.76f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch98st[] =
+{
+ {2,ch98st0},
+ {14,ch98st1}
+};
+
+static const SFG_StrokeChar ch98 = {70.4629f,2,ch98st};
+
+/* char: 0x63 */
+
+static const SFG_StrokeVertex ch99st0[] =
+{
+ {62.6629f,52.381f},
+ {53.139f,61.9048f},
+ {43.6152f,66.6667f},
+ {29.3295f,66.6667f},
+ {19.8057f,61.9048f},
+ {10.2819f,52.381f},
+ {5.52f,38.0952f},
+ {5.52f,28.5714f},
+ {10.2819f,14.2857f},
+ {19.8057f,4.7619f},
+ {29.3295f,0.0f},
+ {43.6152f,0.0f},
+ {53.139f,4.7619f},
+ {62.6629f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch99st[] =
+{
+ {14,ch99st0}
+};
+
+static const SFG_StrokeChar ch99 = {68.9229f,1,ch99st};
+
+/* char: 0x64 */
+
+static const SFG_StrokeVertex ch100st0[] =
+{
+ {61.7829f,100.0f},
+ {61.7829f,0.0f}
+};
+
+static const SFG_StrokeVertex ch100st1[] =
+{
+ {61.7829f,52.381f},
+ {52.259f,61.9048f},
+ {42.7352f,66.6667f},
+ {28.4495f,66.6667f},
+ {18.9257f,61.9048f},
+ {9.4019f,52.381f},
+ {4.64f,38.0952f},
+ {4.64f,28.5714f},
+ {9.4019f,14.2857f},
+ {18.9257f,4.7619f},
+ {28.4495f,0.0f},
+ {42.7352f,0.0f},
+ {52.259f,4.7619f},
+ {61.7829f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch100st[] =
+{
+ {2,ch100st0},
+ {14,ch100st1}
+};
+
+static const SFG_StrokeChar ch100 = {70.2629f,2,ch100st};
+
+/* char: 0x65 */
+
+static const SFG_StrokeVertex ch101st0[] =
+{
+ {5.72f,38.0952f},
+ {62.8629f,38.0952f},
+ {62.8629f,47.619f},
+ {58.101f,57.1429f},
+ {53.339f,61.9048f},
+ {43.8152f,66.6667f},
+ {29.5295f,66.6667f},
+ {20.0057f,61.9048f},
+ {10.4819f,52.381f},
+ {5.72f,38.0952f},
+ {5.72f,28.5714f},
+ {10.4819f,14.2857f},
+ {20.0057f,4.7619f},
+ {29.5295f,0.0f},
+ {43.8152f,0.0f},
+ {53.339f,4.7619f},
+ {62.8629f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch101st[] =
+{
+ {17,ch101st0}
+};
+
+static const SFG_StrokeChar ch101 = {68.5229f,1,ch101st};
+
+/* char: 0x66 */
+
+static const SFG_StrokeVertex ch102st0[] =
+{
+ {38.7752f,100.0f},
+ {29.2514f,100.0f},
+ {19.7276f,95.2381f},
+ {14.9657f,80.9524f},
+ {14.9657f,0.0f}
+};
+
+static const SFG_StrokeVertex ch102st1[] =
+{
+ {0.68f,66.6667f},
+ {34.0133f,66.6667f}
+};
+
+static const SFG_StrokeStrip ch102st[] =
+{
+ {5,ch102st0},
+ {2,ch102st1}
+};
+
+static const SFG_StrokeChar ch102 = {38.6552f,2,ch102st};
+
+/* char: 0x67 */
+
+static const SFG_StrokeVertex ch103st0[] =
+{
+ {62.5029f,66.6667f},
+ {62.5029f,-9.5238f},
+ {57.741f,-23.8095f},
+ {52.979f,-28.5714f},
+ {43.4552f,-33.3333f},
+ {29.1695f,-33.3333f},
+ {19.6457f,-28.5714f}
+};
+
+static const SFG_StrokeVertex ch103st1[] =
+{
+ {62.5029f,52.381f},
+ {52.979f,61.9048f},
+ {43.4552f,66.6667f},
+ {29.1695f,66.6667f},
+ {19.6457f,61.9048f},
+ {10.1219f,52.381f},
+ {5.36f,38.0952f},
+ {5.36f,28.5714f},
+ {10.1219f,14.2857f},
+ {19.6457f,4.7619f},
+ {29.1695f,0.0f},
+ {43.4552f,0.0f},
+ {52.979f,4.7619f},
+ {62.5029f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch103st[] =
+{
+ {7,ch103st0},
+ {14,ch103st1}
+};
+
+static const SFG_StrokeChar ch103 = {70.9829f,2,ch103st};
+
+/* char: 0x68 */
+
+static const SFG_StrokeVertex ch104st0[] =
+{
+ {9.6f,100.0f},
+ {9.6f,0.0f}
+};
+
+static const SFG_StrokeVertex ch104st1[] =
+{
+ {9.6f,47.619f},
+ {23.8857f,61.9048f},
+ {33.4095f,66.6667f},
+ {47.6952f,66.6667f},
+ {57.219f,61.9048f},
+ {61.981f,47.619f},
+ {61.981f,0.0f}
+};
+
+static const SFG_StrokeStrip ch104st[] =
+{
+ {2,ch104st0},
+ {7,ch104st1}
+};
+
+static const SFG_StrokeChar ch104 = {71.021f,2,ch104st};
+
+/* char: 0x69 */
+
+static const SFG_StrokeVertex ch105st0[] =
+{
+ {10.02f,100.0f},
+ {14.7819f,95.2381f},
+ {19.5438f,100.0f},
+ {14.7819f,104.762f},
+ {10.02f,100.0f}
+};
+
+static const SFG_StrokeVertex ch105st1[] =
+{
+ {14.7819f,66.6667f},
+ {14.7819f,0.0f}
+};
+
+static const SFG_StrokeStrip ch105st[] =
+{
+ {5,ch105st0},
+ {2,ch105st1}
+};
+
+static const SFG_StrokeChar ch105 = {28.8638f,2,ch105st};
+
+/* char: 0x6a */
+
+static const SFG_StrokeVertex ch106st0[] =
+{
+ {17.3876f,100.0f},
+ {22.1495f,95.2381f},
+ {26.9114f,100.0f},
+ {22.1495f,104.762f},
+ {17.3876f,100.0f}
+};
+
+static const SFG_StrokeVertex ch106st1[] =
+{
+ {22.1495f,66.6667f},
+ {22.1495f,-14.2857f},
+ {17.3876f,-28.5714f},
+ {7.8638f,-33.3333f},
+ {-1.66f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch106st[] =
+{
+ {5,ch106st0},
+ {5,ch106st1}
+};
+
+static const SFG_StrokeChar ch106 = {36.2314f,2,ch106st};
+
+/* char: 0x6b */
+
+static const SFG_StrokeVertex ch107st0[] =
+{
+ {9.6f,100.0f},
+ {9.6f,0.0f}
+};
+
+static const SFG_StrokeVertex ch107st1[] =
+{
+ {57.219f,66.6667f},
+ {9.6f,19.0476f}
+};
+
+static const SFG_StrokeVertex ch107st2[] =
+{
+ {28.6476f,38.0952f},
+ {61.981f,0.0f}
+};
+
+static const SFG_StrokeStrip ch107st[] =
+{
+ {2,ch107st0},
+ {2,ch107st1},
+ {2,ch107st2}
+};
+
+static const SFG_StrokeChar ch107 = {62.521f,3,ch107st};
+
+/* char: 0x6c */
+
+static const SFG_StrokeVertex ch108st0[] =
+{
+ {10.02f,100.0f},
+ {10.02f,0.0f}
+};
+
+static const SFG_StrokeStrip ch108st[] =
+{
+ {2,ch108st0}
+};
+
+static const SFG_StrokeChar ch108 = {19.34f,1,ch108st};
+
+/* char: 0x6d */
+
+static const SFG_StrokeVertex ch109st0[] =
+{
+ {9.6f,66.6667f},
+ {9.6f,0.0f}
+};
+
+static const SFG_StrokeVertex ch109st1[] =
+{
+ {9.6f,47.619f},
+ {23.8857f,61.9048f},
+ {33.4095f,66.6667f},
+ {47.6952f,66.6667f},
+ {57.219f,61.9048f},
+ {61.981f,47.619f},
+ {61.981f,0.0f}
+};
+
+static const SFG_StrokeVertex ch109st2[] =
+{
+ {61.981f,47.619f},
+ {76.2667f,61.9048f},
+ {85.7905f,66.6667f},
+ {100.076f,66.6667f},
+ {109.6f,61.9048f},
+ {114.362f,47.619f},
+ {114.362f,0.0f}
+};
+
+static const SFG_StrokeStrip ch109st[] =
+{
+ {2,ch109st0},
+ {7,ch109st1},
+ {7,ch109st2}
+};
+
+static const SFG_StrokeChar ch109 = {123.962f,3,ch109st};
+
+/* char: 0x6e */
+
+static const SFG_StrokeVertex ch110st0[] =
+{
+ {9.18f,66.6667f},
+ {9.18f,0.0f}
+};
+
+static const SFG_StrokeVertex ch110st1[] =
+{
+ {9.18f,47.619f},
+ {23.4657f,61.9048f},
+ {32.9895f,66.6667f},
+ {47.2752f,66.6667f},
+ {56.799f,61.9048f},
+ {61.561f,47.619f},
+ {61.561f,0.0f}
+};
+
+static const SFG_StrokeStrip ch110st[] =
+{
+ {2,ch110st0},
+ {7,ch110st1}
+};
+
+static const SFG_StrokeChar ch110 = {70.881f,2,ch110st};
+
+/* char: 0x6f */
+
+static const SFG_StrokeVertex ch111st0[] =
+{
+ {28.7895f,66.6667f},
+ {19.2657f,61.9048f},
+ {9.7419f,52.381f},
+ {4.98f,38.0952f},
+ {4.98f,28.5714f},
+ {9.7419f,14.2857f},
+ {19.2657f,4.7619f},
+ {28.7895f,0.0f},
+ {43.0752f,0.0f},
+ {52.599f,4.7619f},
+ {62.1229f,14.2857f},
+ {66.8848f,28.5714f},
+ {66.8848f,38.0952f},
+ {62.1229f,52.381f},
+ {52.599f,61.9048f},
+ {43.0752f,66.6667f},
+ {28.7895f,66.6667f}
+};
+
+static const SFG_StrokeStrip ch111st[] =
+{
+ {17,ch111st0}
+};
+
+static const SFG_StrokeChar ch111 = {71.7448f,1,ch111st};
+
+/* char: 0x70 */
+
+static const SFG_StrokeVertex ch112st0[] =
+{
+ {9.46f,66.6667f},
+ {9.46f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch112st1[] =
+{
+ {9.46f,52.381f},
+ {18.9838f,61.9048f},
+ {28.5076f,66.6667f},
+ {42.7933f,66.6667f},
+ {52.3171f,61.9048f},
+ {61.841f,52.381f},
+ {66.6029f,38.0952f},
+ {66.6029f,28.5714f},
+ {61.841f,14.2857f},
+ {52.3171f,4.7619f},
+ {42.7933f,0.0f},
+ {28.5076f,0.0f},
+ {18.9838f,4.7619f},
+ {9.46f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch112st[] =
+{
+ {2,ch112st0},
+ {14,ch112st1}
+};
+
+static const SFG_StrokeChar ch112 = {70.8029f,2,ch112st};
+
+/* char: 0x71 */
+
+static const SFG_StrokeVertex ch113st0[] =
+{
+ {61.9829f,66.6667f},
+ {61.9829f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch113st1[] =
+{
+ {61.9829f,52.381f},
+ {52.459f,61.9048f},
+ {42.9352f,66.6667f},
+ {28.6495f,66.6667f},
+ {19.1257f,61.9048f},
+ {9.6019f,52.381f},
+ {4.84f,38.0952f},
+ {4.84f,28.5714f},
+ {9.6019f,14.2857f},
+ {19.1257f,4.7619f},
+ {28.6495f,0.0f},
+ {42.9352f,0.0f},
+ {52.459f,4.7619f},
+ {61.9829f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch113st[] =
+{
+ {2,ch113st0},
+ {14,ch113st1}
+};
+
+static const SFG_StrokeChar ch113 = {70.7429f,2,ch113st};
+
+/* char: 0x72 */
+
+static const SFG_StrokeVertex ch114st0[] =
+{
+ {9.46f,66.6667f},
+ {9.46f,0.0f}
+};
+
+static const SFG_StrokeVertex ch114st1[] =
+{
+ {9.46f,38.0952f},
+ {14.2219f,52.381f},
+ {23.7457f,61.9048f},
+ {33.2695f,66.6667f},
+ {47.5552f,66.6667f}
+};
+
+static const SFG_StrokeStrip ch114st[] =
+{
+ {2,ch114st0},
+ {5,ch114st1}
+};
+
+static const SFG_StrokeChar ch114 = {49.4952f,2,ch114st};
+
+/* char: 0x73 */
+
+static const SFG_StrokeVertex ch115st0[] =
+{
+ {57.081f,52.381f},
+ {52.319f,61.9048f},
+ {38.0333f,66.6667f},
+ {23.7476f,66.6667f},
+ {9.4619f,61.9048f},
+ {4.7f,52.381f},
+ {9.4619f,42.8571f},
+ {18.9857f,38.0952f},
+ {42.7952f,33.3333f},
+ {52.319f,28.5714f},
+ {57.081f,19.0476f},
+ {57.081f,14.2857f},
+ {52.319f,4.7619f},
+ {38.0333f,0.0f},
+ {23.7476f,0.0f},
+ {9.4619f,4.7619f},
+ {4.7f,14.2857f}
+};
+
+static const SFG_StrokeStrip ch115st[] =
+{
+ {17,ch115st0}
+};
+
+static const SFG_StrokeChar ch115 = {62.321f,1,ch115st};
+
+/* char: 0x74 */
+
+static const SFG_StrokeVertex ch116st0[] =
+{
+ {14.8257f,100.0f},
+ {14.8257f,19.0476f},
+ {19.5876f,4.7619f},
+ {29.1114f,0.0f},
+ {38.6352f,0.0f}
+};
+
+static const SFG_StrokeVertex ch116st1[] =
+{
+ {0.54f,66.6667f},
+ {33.8733f,66.6667f}
+};
+
+static const SFG_StrokeStrip ch116st[] =
+{
+ {5,ch116st0},
+ {2,ch116st1}
+};
+
+static const SFG_StrokeChar ch116 = {39.3152f,2,ch116st};
+
+/* char: 0x75 */
+
+static const SFG_StrokeVertex ch117st0[] =
+{
+ {9.46f,66.6667f},
+ {9.46f,19.0476f},
+ {14.2219f,4.7619f},
+ {23.7457f,0.0f},
+ {38.0314f,0.0f},
+ {47.5552f,4.7619f},
+ {61.841f,19.0476f}
+};
+
+static const SFG_StrokeVertex ch117st1[] =
+{
+ {61.841f,66.6667f},
+ {61.841f,0.0f}
+};
+
+static const SFG_StrokeStrip ch117st[] =
+{
+ {7,ch117st0},
+ {2,ch117st1}
+};
+
+static const SFG_StrokeChar ch117 = {71.161f,2,ch117st};
+
+/* char: 0x76 */
+
+static const SFG_StrokeVertex ch118st0[] =
+{
+ {1.8f,66.6667f},
+ {30.3714f,0.0f}
+};
+
+static const SFG_StrokeVertex ch118st1[] =
+{
+ {58.9429f,66.6667f},
+ {30.3714f,0.0f}
+};
+
+static const SFG_StrokeStrip ch118st[] =
+{
+ {2,ch118st0},
+ {2,ch118st1}
+};
+
+static const SFG_StrokeChar ch118 = {60.6029f,2,ch118st};
+
+/* char: 0x77 */
+
+static const SFG_StrokeVertex ch119st0[] =
+{
+ {2.5f,66.6667f},
+ {21.5476f,0.0f}
+};
+
+static const SFG_StrokeVertex ch119st1[] =
+{
+ {40.5952f,66.6667f},
+ {21.5476f,0.0f}
+};
+
+static const SFG_StrokeVertex ch119st2[] =
+{
+ {40.5952f,66.6667f},
+ {59.6429f,0.0f}
+};
+
+static const SFG_StrokeVertex ch119st3[] =
+{
+ {78.6905f,66.6667f},
+ {59.6429f,0.0f}
+};
+
+static const SFG_StrokeStrip ch119st[] =
+{
+ {2,ch119st0},
+ {2,ch119st1},
+ {2,ch119st2},
+ {2,ch119st3}
+};
+
+static const SFG_StrokeChar ch119 = {80.4905f,4,ch119st};
+
+/* char: 0x78 */
+
+static const SFG_StrokeVertex ch120st0[] =
+{
+ {1.66f,66.6667f},
+ {54.041f,0.0f}
+};
+
+static const SFG_StrokeVertex ch120st1[] =
+{
+ {54.041f,66.6667f},
+ {1.66f,0.0f}
+};
+
+static const SFG_StrokeStrip ch120st[] =
+{
+ {2,ch120st0},
+ {2,ch120st1}
+};
+
+static const SFG_StrokeChar ch120 = {56.401f,2,ch120st};
+
+/* char: 0x79 */
+
+static const SFG_StrokeVertex ch121st0[] =
+{
+ {6.5619f,66.6667f},
+ {35.1333f,0.0f}
+};
+
+static const SFG_StrokeVertex ch121st1[] =
+{
+ {63.7048f,66.6667f},
+ {35.1333f,0.0f},
+ {25.6095f,-19.0476f},
+ {16.0857f,-28.5714f},
+ {6.5619f,-33.3333f},
+ {1.8f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch121st[] =
+{
+ {2,ch121st0},
+ {6,ch121st1}
+};
+
+static const SFG_StrokeChar ch121 = {66.0648f,2,ch121st};
+
+/* char: 0x7a */
+
+static const SFG_StrokeVertex ch122st0[] =
+{
+ {56.821f,66.6667f},
+ {4.44f,0.0f}
+};
+
+static const SFG_StrokeVertex ch122st1[] =
+{
+ {4.44f,66.6667f},
+ {56.821f,66.6667f}
+};
+
+static const SFG_StrokeVertex ch122st2[] =
+{
+ {4.44f,0.0f},
+ {56.821f,0.0f}
+};
+
+static const SFG_StrokeStrip ch122st[] =
+{
+ {2,ch122st0},
+ {2,ch122st1},
+ {2,ch122st2}
+};
+
+static const SFG_StrokeChar ch122 = {61.821f,3,ch122st};
+
+/* char: 0x7b */
+
+static const SFG_StrokeVertex ch123st0[] =
+{
+ {31.1895f,119.048f},
+ {21.6657f,114.286f},
+ {16.9038f,109.524f},
+ {12.1419f,100.0f},
+ {12.1419f,90.4762f},
+ {16.9038f,80.9524f},
+ {21.6657f,76.1905f},
+ {26.4276f,66.6667f},
+ {26.4276f,57.1429f},
+ {16.9038f,47.619f}
+};
+
+static const SFG_StrokeVertex ch123st1[] =
+{
+ {21.6657f,114.286f},
+ {16.9038f,104.762f},
+ {16.9038f,95.2381f},
+ {21.6657f,85.7143f},
+ {26.4276f,80.9524f},
+ {31.1895f,71.4286f},
+ {31.1895f,61.9048f},
+ {26.4276f,52.381f},
+ {7.38f,42.8571f},
+ {26.4276f,33.3333f},
+ {31.1895f,23.8095f},
+ {31.1895f,14.2857f},
+ {26.4276f,4.7619f},
+ {21.6657f,0.0f},
+ {16.9038f,-9.5238f},
+ {16.9038f,-19.0476f},
+ {21.6657f,-28.5714f}
+};
+
+static const SFG_StrokeVertex ch123st2[] =
+{
+ {16.9038f,38.0952f},
+ {26.4276f,28.5714f},
+ {26.4276f,19.0476f},
+ {21.6657f,9.5238f},
+ {16.9038f,4.7619f},
+ {12.1419f,-4.7619f},
+ {12.1419f,-14.2857f},
+ {16.9038f,-23.8095f},
+ {21.6657f,-28.5714f},
+ {31.1895f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch123st[] =
+{
+ {10,ch123st0},
+ {17,ch123st1},
+ {10,ch123st2}
+};
+
+static const SFG_StrokeChar ch123 = {41.6295f,3,ch123st};
+
+/* char: 0x7c */
+
+static const SFG_StrokeVertex ch124st0[] =
+{
+ {11.54f,119.048f},
+ {11.54f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch124st[] =
+{
+ {2,ch124st0}
+};
+
+static const SFG_StrokeChar ch124 = {23.78f,1,ch124st};
+
+/* char: 0x7d */
+
+static const SFG_StrokeVertex ch125st0[] =
+{
+ {9.18f,119.048f},
+ {18.7038f,114.286f},
+ {23.4657f,109.524f},
+ {28.2276f,100.0f},
+ {28.2276f,90.4762f},
+ {23.4657f,80.9524f},
+ {18.7038f,76.1905f},
+ {13.9419f,66.6667f},
+ {13.9419f,57.1429f},
+ {23.4657f,47.619f}
+};
+
+static const SFG_StrokeVertex ch125st1[] =
+{
+ {18.7038f,114.286f},
+ {23.4657f,104.762f},
+ {23.4657f,95.2381f},
+ {18.7038f,85.7143f},
+ {13.9419f,80.9524f},
+ {9.18f,71.4286f},
+ {9.18f,61.9048f},
+ {13.9419f,52.381f},
+ {32.9895f,42.8571f},
+ {13.9419f,33.3333f},
+ {9.18f,23.8095f},
+ {9.18f,14.2857f},
+ {13.9419f,4.7619f},
+ {18.7038f,0.0f},
+ {23.4657f,-9.5238f},
+ {23.4657f,-19.0476f},
+ {18.7038f,-28.5714f}
+};
+
+static const SFG_StrokeVertex ch125st2[] =
+{
+ {23.4657f,38.0952f},
+ {13.9419f,28.5714f},
+ {13.9419f,19.0476f},
+ {18.7038f,9.5238f},
+ {23.4657f,4.7619f},
+ {28.2276f,-4.7619f},
+ {28.2276f,-14.2857f},
+ {23.4657f,-23.8095f},
+ {18.7038f,-28.5714f},
+ {9.18f,-33.3333f}
+};
+
+static const SFG_StrokeStrip ch125st[] =
+{
+ {10,ch125st0},
+ {17,ch125st1},
+ {10,ch125st2}
+};
+
+static const SFG_StrokeChar ch125 = {41.4695f,3,ch125st};
+
+/* char: 0x7e */
+
+static const SFG_StrokeVertex ch126st0[] =
+{
+ {2.92f,28.5714f},
+ {2.92f,38.0952f},
+ {7.6819f,52.381f},
+ {17.2057f,57.1429f},
+ {26.7295f,57.1429f},
+ {36.2533f,52.381f},
+ {55.301f,38.0952f},
+ {64.8248f,33.3333f},
+ {74.3486f,33.3333f},
+ {83.8724f,38.0952f},
+ {88.6343f,47.619f}
+};
+
+static const SFG_StrokeVertex ch126st1[] =
+{
+ {2.92f,38.0952f},
+ {7.6819f,47.619f},
+ {17.2057f,52.381f},
+ {26.7295f,52.381f},
+ {36.2533f,47.619f},
+ {55.301f,33.3333f},
+ {64.8248f,28.5714f},
+ {74.3486f,28.5714f},
+ {83.8724f,33.3333f},
+ {88.6343f,47.619f},
+ {88.6343f,57.1429f}
+};
+
+static const SFG_StrokeStrip ch126st[] =
+{
+ {11,ch126st0},
+ {11,ch126st1}
+};
+
+static const SFG_StrokeChar ch126 = {91.2743f,2,ch126st};
+
+/* char: 0x7f */
+
+static const SFG_StrokeVertex ch127st0[] =
+{
+ {52.381f,100.0f},
+ {14.2857f,-33.3333f}
+};
+
+static const SFG_StrokeVertex ch127st1[] =
+{
+ {28.5714f,66.6667f},
+ {14.2857f,61.9048f},
+ {4.7619f,52.381f},
+ {0.0f,38.0952f},
+ {0.0f,23.8095f},
+ {4.7619f,14.2857f},
+ {14.2857f,4.7619f},
+ {28.5714f,0.0f},
+ {38.0952f,0.0f},
+ {52.381f,4.7619f},
+ {61.9048f,14.2857f},
+ {66.6667f,28.5714f},
+ {66.6667f,42.8571f},
+ {61.9048f,52.381f},
+ {52.381f,61.9048f},
+ {38.0952f,66.6667f},
+ {28.5714f,66.6667f}
+};
+
+static const SFG_StrokeStrip ch127st[] =
+{
+ {2,ch127st0},
+ {17,ch127st1}
+};
+
+static const SFG_StrokeChar ch127 = {66.6667f,2,ch127st};
+
+static const SFG_StrokeChar *chars[] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ &ch32, &ch33, &ch34, &ch35, &ch36, &ch37, &ch38, &ch39,
+ &ch40, &ch41, &ch42, &ch43, &ch44, &ch45, &ch46, &ch47,
+ &ch48, &ch49, &ch50, &ch51, &ch52, &ch53, &ch54, &ch55,
+ &ch56, &ch57, &ch58, &ch59, &ch60, &ch61, &ch62, &ch63,
+ &ch64, &ch65, &ch66, &ch67, &ch68, &ch69, &ch70, &ch71,
+ &ch72, &ch73, &ch74, &ch75, &ch76, &ch77, &ch78, &ch79,
+ &ch80, &ch81, &ch82, &ch83, &ch84, &ch85, &ch86, &ch87,
+ &ch88, &ch89, &ch90, &ch91, &ch92, &ch93, &ch94, &ch95,
+ &ch96, &ch97, &ch98, &ch99, &ch100, &ch101, &ch102, &ch103,
+ &ch104, &ch105, &ch106, &ch107, &ch108, &ch109, &ch110, &ch111,
+ &ch112, &ch113, &ch114, &ch115, &ch116, &ch117, &ch118, &ch119,
+ &ch120, &ch121, &ch122, &ch123, &ch124, &ch125, &ch126, &ch127
+};
+
+const SFG_StrokeFont fgStrokeRoman = {"Roman",128,152.381f,chars};
index cc64817..6a18b58 100644 (file)
-/*\r
- * freeglut_structure.c\r
- *\r
- * Windows and menus need tree structure\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Sat Dec 18 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-/* -- GLOBAL EXPORTS ------------------------------------------------------- */\r
-\r
-/*\r
- * The SFG_Structure container holds information about windows and menus\r
- * created between glutInit() and glutMainLoop() return.\r
- */\r
-\r
-SFG_Structure fgStructure = { { NULL, NULL },  /* The list of windows       */\r
-                              { NULL, NULL },  /* The list of menus         */\r
-                              { NULL, NULL },  /* Windows to Destroy list   */\r
-                              NULL,            /* The current window        */\r
-                              NULL,            /* The current menu          */\r
-                              NULL,            /* The menu OpenGL context   */\r
-                              NULL,            /* The game mode window      */\r
-                              0,               /* The current new window ID */\r
-                              0 };             /* The current new menu ID   */\r
-\r
-\r
-/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */\r
-\r
-extern void fgPlatformCreateWindow ( SFG_Window *window );\r
-\r
-static void fghClearCallBacks( SFG_Window *window )\r
-{\r
-    if( window )\r
-    {\r
-        int i;\r
-        for( i = 0; i < TOTAL_CALLBACKS; ++i )\r
-            window->CallBacks[ i ] = NULL;\r
-    }\r
-}\r
-\r
-/*\r
- * This private function creates, opens and adds to the hierarchy\r
- * a freeglut window complete with OpenGL context and stuff...\r
- *\r
- * If parent is set to NULL, the window created will be a topmost one.\r
- */\r
-SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title,\r
-                            GLboolean positionUse, int x, int y,\r
-                            GLboolean sizeUse, int w, int h,\r
-                            GLboolean gameMode, GLboolean isMenu )\r
-{\r
-    /* Have the window object created */\r
-    SFG_Window *window = (SFG_Window *)calloc( sizeof(SFG_Window), 1 );\r
-\r
-       fgPlatformCreateWindow ( window );\r
-\r
-    fghClearCallBacks( window );\r
-\r
-    /* Initialize the object properties */\r
-    window->ID = ++fgStructure.WindowID;\r
-\r
-    fgListInit( &window->Children );\r
-    if( parent )\r
-    {\r
-        fgListAppend( &parent->Children, &window->Node );\r
-        window->Parent = parent;\r
-    }\r
-    else\r
-        fgListAppend( &fgStructure.Windows, &window->Node );\r
-\r
-    /* Set the default mouse cursor and reset the modifiers value */\r
-    window->State.Cursor    = GLUT_CURSOR_INHERIT;\r
-\r
-    window->IsMenu = isMenu;\r
-\r
-    window->State.IgnoreKeyRepeat = GL_FALSE;\r
-    window->State.KeyRepeating    = GL_FALSE;\r
-    window->State.IsFullscreen    = GL_FALSE;\r
-\r
-    /*\r
-     * Open the window now. The fgOpenWindow() function is system\r
-     * dependant, and resides in freeglut_window.c. Uses fgState.\r
-     */\r
-    fgOpenWindow( window, title, positionUse, x, y, sizeUse, w, h, gameMode,\r
-                  (GLboolean)(parent ? GL_TRUE : GL_FALSE) );\r
-\r
-    return window;\r
-}\r
-\r
-/*\r
- * This private function creates a menu and adds it to the menus list\r
- */\r
-SFG_Menu* fgCreateMenu( FGCBMenu menuCallback )\r
-{\r
-    int x = 100, y = 100, w = 1, h = 1;\r
-    SFG_Window *current_window = fgStructure.CurrentWindow;\r
-\r
-    /* Have the menu object created */\r
-    SFG_Menu* menu = (SFG_Menu *)calloc( sizeof(SFG_Menu), 1 );\r
-\r
-    menu->ParentWindow = NULL;\r
-\r
-    /* Create a window for the menu to reside in. */\r
-\r
-    fgCreateWindow( NULL, "freeglut menu", GL_TRUE, x, y, GL_TRUE, w, h,\r
-                    GL_FALSE, GL_TRUE );\r
-    menu->Window = fgStructure.CurrentWindow;\r
-    glutDisplayFunc( fgDisplayMenu );\r
-\r
-    glutHideWindow( );  /* Hide the window for now */\r
-    fgSetWindow( current_window );\r
-\r
-    /* Initialize the object properties: */\r
-    menu->ID       = ++fgStructure.MenuID;\r
-    menu->Callback = menuCallback;\r
-    menu->ActiveEntry = NULL;\r
-\r
-    fgListInit( &menu->Entries );\r
-    fgListAppend( &fgStructure.Menus, &menu->Node );\r
-\r
-    /* Newly created menus implicitly become current ones */\r
-    fgStructure.CurrentMenu = menu;\r
-\r
-    return menu;\r
-}\r
-\r
-/*\r
- * Function to add a window to the linked list of windows to destroy.\r
- * Subwindows are automatically added because they hang from the window\r
- * structure.\r
- */\r
-void fgAddToWindowDestroyList( SFG_Window* window )\r
-{\r
-    SFG_WindowList *new_list_entry =\r
-        ( SFG_WindowList* )malloc( sizeof(SFG_WindowList ) );\r
-    new_list_entry->window = window;\r
-    fgListAppend( &fgStructure.WindowsToDestroy, &new_list_entry->node );\r
-\r
-    /* Check if the window is the current one... */\r
-    if( fgStructure.CurrentWindow == window )\r
-        fgStructure.CurrentWindow = NULL;\r
-\r
-    /*\r
-     * Clear all window callbacks except Destroy, which will\r
-     * be invoked later.  Right now, we are potentially carrying\r
-     * out a freeglut operation at the behest of a client callback,\r
-     * so we are reluctant to re-enter the client with the Destroy\r
-     * callback, right now.  The others are all wiped out, however,\r
-     * to ensure that they are no longer called after this point.\r
-     */\r
-    {\r
-        FGCBDestroy destroy = (FGCBDestroy)FETCH_WCB( *window, Destroy );\r
-        fghClearCallBacks( window );\r
-        SET_WCB( *window, Destroy, destroy );\r
-    }\r
-}\r
-\r
-/*\r
- * Function to close down all the windows in the "WindowsToDestroy" list\r
- */\r
-void fgCloseWindows( )\r
-{\r
-    while( fgStructure.WindowsToDestroy.First )\r
-    {\r
-        SFG_WindowList *window_ptr = fgStructure.WindowsToDestroy.First;\r
-        fgDestroyWindow( window_ptr->window );\r
-        fgListRemove( &fgStructure.WindowsToDestroy, &window_ptr->node );\r
-        free( window_ptr );\r
-    }\r
-}\r
-\r
-/*\r
- * This function destroys a window and all of its subwindows. Actually,\r
- * another function, defined in freeglut_window.c is called, but this is\r
- * a whole different story...\r
- */\r
-void fgDestroyWindow( SFG_Window* window )\r
-{\r
-    FREEGLUT_INTERNAL_ERROR_EXIT ( window, "Window destroy function called with null window",\r
-                                   "fgDestroyWindow" );\r
-\r
-    while( window->Children.First )\r
-        fgDestroyWindow( ( SFG_Window * )window->Children.First );\r
-\r
-    {\r
-        SFG_Window *activeWindow = fgStructure.CurrentWindow;\r
-        INVOKE_WCB( *window, Destroy, ( ) );\r
-        fgSetWindow( activeWindow );\r
-    }\r
-\r
-    if( window->Parent )\r
-        fgListRemove( &window->Parent->Children, &window->Node );\r
-    else\r
-        fgListRemove( &fgStructure.Windows, &window->Node );\r
-\r
-    if( window->ActiveMenu )\r
-      fgDeactivateMenu( window );\r
-\r
-    fghClearCallBacks( window );\r
-    fgCloseWindow( window );\r
-    free( window );\r
-    if( fgStructure.CurrentWindow == window )\r
-        fgStructure.CurrentWindow = NULL;\r
-}\r
-\r
-/*\r
- * This is a helper static function that removes a menu (given its pointer)\r
- * from any windows that can be accessed from a given parent...\r
- */\r
-static void fghRemoveMenuFromWindow( SFG_Window* window, SFG_Menu* menu )\r
-{\r
-    SFG_Window *subWindow;\r
-    int i;\r
-\r
-    /* Check whether this is the active menu in the window */\r
-    if ( menu == window->ActiveMenu )\r
-        window->ActiveMenu = NULL ;\r
-\r
-    /*\r
-     * Check if the menu is attached to the current window,\r
-     * if so, have it detached (by overwriting with a NULL):\r
-     */\r
-    for( i = 0; i < FREEGLUT_MAX_MENUS; i++ )\r
-        if( window->Menu[ i ] == menu )\r
-            window->Menu[ i ] = NULL;\r
-\r
-    /* Call this function for all of the window's children recursively: */\r
-    for( subWindow = (SFG_Window *)window->Children.First;\r
-         subWindow;\r
-         subWindow = (SFG_Window *)subWindow->Node.Next)\r
-        fghRemoveMenuFromWindow( subWindow, menu );\r
-}\r
-\r
-/*\r
- * This is a static helper function that removes menu references\r
- * from another menu, given two pointers to them...\r
- */\r
-static void fghRemoveMenuFromMenu( SFG_Menu* from, SFG_Menu* menu )\r
-{\r
-    SFG_MenuEntry *entry;\r
-\r
-    for( entry = (SFG_MenuEntry *)from->Entries.First;\r
-         entry;\r
-         entry = ( SFG_MenuEntry * )entry->Node.Next )\r
-        if( entry->SubMenu == menu )\r
-            entry->SubMenu = NULL;\r
-}\r
-\r
-/*\r
- * This function destroys a menu specified by the parameter. All menus\r
- * and windows are updated to make sure no ill pointers hang around.\r
- */\r
-void fgDestroyMenu( SFG_Menu* menu )\r
-{\r
-    SFG_Window *window;\r
-    SFG_Menu *from;\r
-\r
-    FREEGLUT_INTERNAL_ERROR_EXIT ( menu, "Menu destroy function called with null menu",\r
-                                   "fgDestroyMenu" );\r
-\r
-    /* First of all, have all references to this menu removed from all windows: */\r
-    for( window = (SFG_Window *)fgStructure.Windows.First;\r
-         window;\r
-         window = (SFG_Window *)window->Node.Next )\r
-        fghRemoveMenuFromWindow( window, menu );\r
-\r
-    /* Now proceed with removing menu entries that lead to this menu */\r
-    for( from = ( SFG_Menu * )fgStructure.Menus.First;\r
-         from;\r
-         from = ( SFG_Menu * )from->Node.Next )\r
-        fghRemoveMenuFromMenu( from, menu );\r
-\r
-    /*\r
-     * If the programmer defined a destroy callback, call it\r
-     * A. Donev: But first make this the active menu\r
-     */\r
-    if( menu->Destroy )\r
-    {\r
-        SFG_Menu *activeMenu=fgStructure.CurrentMenu;\r
-        fgStructure.CurrentMenu = menu;\r
-        menu->Destroy( );\r
-        fgStructure.CurrentMenu = activeMenu;\r
-    }\r
-\r
-    /*\r
-     * Now we are pretty sure the menu is not used anywhere\r
-     * and that we can remove all of its entries\r
-     */\r
-    while( menu->Entries.First )\r
-    {\r
-        SFG_MenuEntry *entry = ( SFG_MenuEntry * ) menu->Entries.First;\r
-\r
-        fgListRemove( &menu->Entries, &entry->Node );\r
-\r
-        if( entry->Text )\r
-            free( entry->Text );\r
-        entry->Text = NULL;\r
-\r
-        free( entry );\r
-    }\r
-\r
-    if( fgStructure.CurrentWindow == menu->Window )\r
-        fgSetWindow( NULL );\r
-    fgDestroyWindow( menu->Window );\r
-    fgListRemove( &fgStructure.Menus, &menu->Node );\r
-    if( fgStructure.CurrentMenu == menu )\r
-        fgStructure.CurrentMenu = NULL;\r
-\r
-    free( menu );\r
-}\r
-\r
-/*\r
- * This function should be called on glutInit(). It will prepare the internal\r
- * structure of freeglut to be used in the application. The structure will be\r
- * destroyed using fgDestroyStructure() on glutMainLoop() return. In that\r
- * case further use of freeglut should be preceeded with a glutInit() call.\r
- */\r
-void fgCreateStructure( void )\r
-{\r
-    /*\r
-     * We will be needing two lists: the first containing windows,\r
-     * and the second containing the user-defined menus.\r
-     * Also, no current window/menu is set, as none has been created yet.\r
-     */\r
-\r
-    fgListInit(&fgStructure.Windows);\r
-    fgListInit(&fgStructure.Menus);\r
-    fgListInit(&fgStructure.WindowsToDestroy);\r
-\r
-    fgStructure.CurrentWindow = NULL;\r
-    fgStructure.CurrentMenu = NULL;\r
-    fgStructure.MenuContext = NULL;\r
-    fgStructure.GameModeWindow = NULL;\r
-    fgStructure.WindowID = 0;\r
-    fgStructure.MenuID = 0;\r
-}\r
-\r
-/*\r
- * This function is automatically called on glutMainLoop() return.\r
- * It should deallocate and destroy all remnants of previous\r
- * glutInit()-enforced structure initialization...\r
- */\r
-void fgDestroyStructure( void )\r
-{\r
-    /* Clean up the WindowsToDestroy list. */\r
-    fgCloseWindows( );\r
-\r
-    /* Make sure all windows and menus have been deallocated */\r
-    while( fgStructure.Menus.First )\r
-        fgDestroyMenu( ( SFG_Menu * )fgStructure.Menus.First );\r
-\r
-    while( fgStructure.Windows.First )\r
-        fgDestroyWindow( ( SFG_Window * )fgStructure.Windows.First );\r
-}\r
-\r
-/*\r
- * Helper function to enumerate through all registered top-level windows\r
- */\r
-void fgEnumWindows( FGCBenumerator enumCallback, SFG_Enumerator* enumerator )\r
-{\r
-    SFG_Window *window;\r
-\r
-    FREEGLUT_INTERNAL_ERROR_EXIT ( enumCallback && enumerator,\r
-                                   "Enumerator or callback missing from window enumerator call",\r
-                                   "fgEnumWindows" );\r
-\r
-    /* Check every of the top-level windows */\r
-    for( window = ( SFG_Window * )fgStructure.Windows.First;\r
-         window;\r
-         window = ( SFG_Window * )window->Node.Next )\r
-    {\r
-        enumCallback( window, enumerator );\r
-        if( enumerator->found )\r
-            return;\r
-    }\r
-}\r
-\r
-/*\r
- * Helper function to enumerate through all a window's subwindows\r
- * (single level descent)\r
- */\r
-void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback,\r
-                       SFG_Enumerator* enumerator )\r
-{\r
-    SFG_Window *child;\r
-\r
-    FREEGLUT_INTERNAL_ERROR_EXIT ( enumCallback && enumerator,\r
-                                   "Enumerator or callback missing from subwindow enumerator call",\r
-                                   "fgEnumSubWindows" );\r
-    FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Window Enumeration" );\r
-\r
-    for( child = ( SFG_Window * )window->Children.First;\r
-         child;\r
-         child = ( SFG_Window * )child->Node.Next )\r
-    {\r
-        enumCallback( child, enumerator );\r
-        if( enumerator->found )\r
-            return;\r
-    }\r
-}\r
-\r
-/*\r
- * A static helper function to look for a window given its handle\r
- */\r
-static void fghcbWindowByHandle( SFG_Window *window,\r
-                                 SFG_Enumerator *enumerator )\r
-{\r
-    if ( enumerator->found )\r
-        return;\r
-\r
-    /* Check the window's handle. Hope this works. Looks ugly. That's for sure. */\r
-    if( window->Window.Handle == (SFG_WindowHandleType) (enumerator->data) )\r
-    {\r
-        enumerator->found = GL_TRUE;\r
-        enumerator->data = window;\r
-\r
-        return;\r
-    }\r
-\r
-    /* Otherwise, check this window's children */\r
-    fgEnumSubWindows( window, fghcbWindowByHandle, enumerator );\r
-}\r
-\r
-/*\r
- * fgWindowByHandle returns a (SFG_Window *) value pointing to the\r
- * first window in the queue matching the specified window handle.\r
- * The function is defined in freeglut_structure.c file.\r
- */\r
-SFG_Window* fgWindowByHandle ( SFG_WindowHandleType hWindow )\r
-{\r
-    SFG_Enumerator enumerator;\r
-\r
-    /* This is easy and makes use of the windows enumeration defined above */\r
-    enumerator.found = GL_FALSE;\r
-    enumerator.data = (void *)hWindow;\r
-    fgEnumWindows( fghcbWindowByHandle, &enumerator );\r
-\r
-    if( enumerator.found )\r
-        return( SFG_Window *) enumerator.data;\r
-    return NULL;\r
-}\r
-\r
-/*\r
- * A static helper function to look for a window given its ID\r
- */\r
-static void fghcbWindowByID( SFG_Window *window, SFG_Enumerator *enumerator )\r
-{\r
-    /* Make sure we do not overwrite our precious results... */\r
-    if( enumerator->found )\r
-        return;\r
-\r
-    /* Check the window's handle. Hope this works. Looks ugly. That's for sure. */\r
-    if( window->ID == *( int *)(enumerator->data) )\r
-    {\r
-        enumerator->found = GL_TRUE;\r
-        enumerator->data = window;\r
-\r
-        return;\r
-    }\r
-\r
-    /* Otherwise, check this window's children */\r
-    fgEnumSubWindows( window, fghcbWindowByID, enumerator );\r
-}\r
-\r
-/*\r
- * This function is similiar to the previous one, except it is\r
- * looking for a specified (sub)window identifier. The function\r
- * is defined in freeglut_structure.c file.\r
- */\r
-SFG_Window* fgWindowByID( int windowID )\r
-{\r
-    SFG_Enumerator enumerator;\r
-\r
-    /* Uses a method very similiar for fgWindowByHandle... */\r
-    enumerator.found = GL_FALSE;\r
-    enumerator.data = ( void * )&windowID;\r
-    fgEnumWindows( fghcbWindowByID, &enumerator );\r
-    if( enumerator.found )\r
-        return ( SFG_Window * )enumerator.data;\r
-    return NULL;\r
-}\r
-\r
-/*\r
- * Looks up a menu given its ID. This is easier that fgWindowByXXX\r
- * as all menus are placed in one doubly linked list...\r
- */\r
-SFG_Menu* fgMenuByID( int menuID )\r
-{\r
-    SFG_Menu *menu = NULL;\r
-\r
-    /* It's enough to check all entries in fgStructure.Menus... */\r
-    for( menu = (SFG_Menu *)fgStructure.Menus.First;\r
-         menu;\r
-         menu = (SFG_Menu *)menu->Node.Next )\r
-        if( menu->ID == menuID )\r
-            return menu;\r
-    return NULL;\r
-}\r
-\r
-/*\r
- * List functions...\r
- */\r
-void fgListInit(SFG_List *list)\r
-{\r
-    list->First = NULL;\r
-    list->Last = NULL;\r
-}\r
-\r
-void fgListAppend(SFG_List *list, SFG_Node *node)\r
-{\r
-    if ( list->Last )\r
-    {\r
-        SFG_Node *ln = (SFG_Node *) list->Last;\r
-        ln->Next = node;\r
-        node->Prev = ln;\r
-    }\r
-    else\r
-    {\r
-        node->Prev = NULL;\r
-        list->First = node;\r
-    }\r
-\r
-    node->Next = NULL;\r
-    list->Last = node;\r
-}\r
-\r
-void fgListRemove(SFG_List *list, SFG_Node *node)\r
-{\r
-    if( node->Next )\r
-        ( ( SFG_Node * )node->Next )->Prev = node->Prev;\r
-    if( node->Prev )\r
-        ( ( SFG_Node * )node->Prev )->Next = node->Next;\r
-    if( ( ( SFG_Node * )list->First ) == node )\r
-        list->First = node->Next;\r
-    if( ( ( SFG_Node * )list->Last ) == node )\r
-        list->Last = node->Prev;\r
-}\r
-\r
-int fgListLength(SFG_List *list)\r
-{\r
-    SFG_Node *node;\r
-    int length = 0;\r
-\r
-    for( node =( SFG_Node * )list->First;\r
-         node;\r
-         node = ( SFG_Node * )node->Next )\r
-        ++length;\r
-\r
-    return length;\r
-}\r
-\r
-\r
-void fgListInsert(SFG_List *list, SFG_Node *next, SFG_Node *node)\r
-{\r
-    SFG_Node *prev;\r
-\r
-    if( (node->Next = next) )\r
-    {\r
-        prev = next->Prev;\r
-        next->Prev = node;\r
-    }\r
-    else\r
-    {\r
-        prev = list->Last;\r
-        list->Last = node;\r
-    }\r
-\r
-    if( (node->Prev = prev) )\r
-        prev->Next = node;\r
-    else\r
-        list->First = node;\r
-}\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_structure.c
+ *
+ * Windows and menus need tree structure
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Sat Dec 18 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+/* -- GLOBAL EXPORTS ------------------------------------------------------- */
+
+/*
+ * The SFG_Structure container holds information about windows and menus
+ * created between glutInit() and glutMainLoop() return.
+ */
+
+SFG_Structure fgStructure = { { NULL, NULL },  /* The list of windows       */
+                              { NULL, NULL },  /* The list of menus         */
+                              { NULL, NULL },  /* Windows to Destroy list   */
+                              NULL,            /* The current window        */
+                              NULL,            /* The current menu          */
+                              NULL,            /* The menu OpenGL context   */
+                              NULL,            /* The game mode window      */
+                              0,               /* The current new window ID */
+                              0 };             /* The current new menu ID   */
+
+
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
+
+extern void fgPlatformCreateWindow ( SFG_Window *window );
+
+static void fghClearCallBacks( SFG_Window *window )
+{
+    if( window )
+    {
+        int i;
+        for( i = 0; i < TOTAL_CALLBACKS; ++i )
+            window->CallBacks[ i ] = NULL;
+    }
+}
+
+/*
+ * This private function creates, opens and adds to the hierarchy
+ * a freeglut window complete with OpenGL context and stuff...
+ *
+ * If parent is set to NULL, the window created will be a topmost one.
+ */
+SFG_Window* fgCreateWindow( SFG_Window* parent, const char* title,
+                            GLboolean positionUse, int x, int y,
+                            GLboolean sizeUse, int w, int h,
+                            GLboolean gameMode, GLboolean isMenu )
+{
+    /* Have the window object created */
+    SFG_Window *window = (SFG_Window *)calloc( sizeof(SFG_Window), 1 );
+
+       fgPlatformCreateWindow ( window );
+
+    fghClearCallBacks( window );
+
+    /* Initialize the object properties */
+    window->ID = ++fgStructure.WindowID;
+
+    fgListInit( &window->Children );
+    if( parent )
+    {
+        fgListAppend( &parent->Children, &window->Node );
+        window->Parent = parent;
+    }
+    else
+        fgListAppend( &fgStructure.Windows, &window->Node );
+
+    /* Set the default mouse cursor and reset the modifiers value */
+    window->State.Cursor    = GLUT_CURSOR_INHERIT;
+
+    window->IsMenu = isMenu;
+
+    window->State.IgnoreKeyRepeat = GL_FALSE;
+    window->State.KeyRepeating    = GL_FALSE;
+    window->State.IsFullscreen    = GL_FALSE;
+
+    /*
+     * Open the window now. The fgOpenWindow() function is system
+     * dependant, and resides in freeglut_window.c. Uses fgState.
+     */
+    fgOpenWindow( window, title, positionUse, x, y, sizeUse, w, h, gameMode,
+                  (GLboolean)(parent ? GL_TRUE : GL_FALSE) );
+
+    return window;
+}
+
+/*
+ * This private function creates a menu and adds it to the menus list
+ */
+SFG_Menu* fgCreateMenu( FGCBMenu menuCallback )
+{
+    int x = 100, y = 100, w = 1, h = 1;
+    SFG_Window *current_window = fgStructure.CurrentWindow;
+
+    /* Have the menu object created */
+    SFG_Menu* menu = (SFG_Menu *)calloc( sizeof(SFG_Menu), 1 );
+
+    menu->ParentWindow = NULL;
+
+    /* Create a window for the menu to reside in. */
+
+    fgCreateWindow( NULL, "freeglut menu", GL_TRUE, x, y, GL_TRUE, w, h,
+                    GL_FALSE, GL_TRUE );
+    menu->Window = fgStructure.CurrentWindow;
+    glutDisplayFunc( fgDisplayMenu );
+
+    glutHideWindow( );  /* Hide the window for now */
+    fgSetWindow( current_window );
+
+    /* Initialize the object properties: */
+    menu->ID       = ++fgStructure.MenuID;
+    menu->Callback = menuCallback;
+    menu->ActiveEntry = NULL;
+
+    fgListInit( &menu->Entries );
+    fgListAppend( &fgStructure.Menus, &menu->Node );
+
+    /* Newly created menus implicitly become current ones */
+    fgStructure.CurrentMenu = menu;
+
+    return menu;
+}
+
+/*
+ * Function to add a window to the linked list of windows to destroy.
+ * Subwindows are automatically added because they hang from the window
+ * structure.
+ */
+void fgAddToWindowDestroyList( SFG_Window* window )
+{
+    SFG_WindowList *new_list_entry =
+        ( SFG_WindowList* )malloc( sizeof(SFG_WindowList ) );
+    new_list_entry->window = window;
+    fgListAppend( &fgStructure.WindowsToDestroy, &new_list_entry->node );
+
+    /* Check if the window is the current one... */
+    if( fgStructure.CurrentWindow == window )
+        fgStructure.CurrentWindow = NULL;
+
+    /*
+     * Clear all window callbacks except Destroy, which will
+     * be invoked later.  Right now, we are potentially carrying
+     * out a freeglut operation at the behest of a client callback,
+     * so we are reluctant to re-enter the client with the Destroy
+     * callback, right now.  The others are all wiped out, however,
+     * to ensure that they are no longer called after this point.
+     */
+    {
+        FGCBDestroy destroy = (FGCBDestroy)FETCH_WCB( *window, Destroy );
+        fghClearCallBacks( window );
+        SET_WCB( *window, Destroy, destroy );
+    }
+}
+
+/*
+ * Function to close down all the windows in the "WindowsToDestroy" list
+ */
+void fgCloseWindows( )
+{
+    while( fgStructure.WindowsToDestroy.First )
+    {
+        SFG_WindowList *window_ptr = fgStructure.WindowsToDestroy.First;
+        fgDestroyWindow( window_ptr->window );
+        fgListRemove( &fgStructure.WindowsToDestroy, &window_ptr->node );
+        free( window_ptr );
+    }
+}
+
+/*
+ * This function destroys a window and all of its subwindows. Actually,
+ * another function, defined in freeglut_window.c is called, but this is
+ * a whole different story...
+ */
+void fgDestroyWindow( SFG_Window* window )
+{
+    FREEGLUT_INTERNAL_ERROR_EXIT ( window, "Window destroy function called with null window",
+                                   "fgDestroyWindow" );
+
+    while( window->Children.First )
+        fgDestroyWindow( ( SFG_Window * )window->Children.First );
+
+    {
+        SFG_Window *activeWindow = fgStructure.CurrentWindow;
+        INVOKE_WCB( *window, Destroy, ( ) );
+        fgSetWindow( activeWindow );
+    }
+
+    if( window->Parent )
+        fgListRemove( &window->Parent->Children, &window->Node );
+    else
+        fgListRemove( &fgStructure.Windows, &window->Node );
+
+    if( window->ActiveMenu )
+      fgDeactivateMenu( window );
+
+    fghClearCallBacks( window );
+    fgCloseWindow( window );
+    free( window );
+    if( fgStructure.CurrentWindow == window )
+        fgStructure.CurrentWindow = NULL;
+}
+
+/*
+ * This is a helper static function that removes a menu (given its pointer)
+ * from any windows that can be accessed from a given parent...
+ */
+static void fghRemoveMenuFromWindow( SFG_Window* window, SFG_Menu* menu )
+{
+    SFG_Window *subWindow;
+    int i;
+
+    /* Check whether this is the active menu in the window */
+    if ( menu == window->ActiveMenu )
+        window->ActiveMenu = NULL ;
+
+    /*
+     * Check if the menu is attached to the current window,
+     * if so, have it detached (by overwriting with a NULL):
+     */
+    for( i = 0; i < FREEGLUT_MAX_MENUS; i++ )
+        if( window->Menu[ i ] == menu )
+            window->Menu[ i ] = NULL;
+
+    /* Call this function for all of the window's children recursively: */
+    for( subWindow = (SFG_Window *)window->Children.First;
+         subWindow;
+         subWindow = (SFG_Window *)subWindow->Node.Next)
+        fghRemoveMenuFromWindow( subWindow, menu );
+}
+
+/*
+ * This is a static helper function that removes menu references
+ * from another menu, given two pointers to them...
+ */
+static void fghRemoveMenuFromMenu( SFG_Menu* from, SFG_Menu* menu )
+{
+    SFG_MenuEntry *entry;
+
+    for( entry = (SFG_MenuEntry *)from->Entries.First;
+         entry;
+         entry = ( SFG_MenuEntry * )entry->Node.Next )
+        if( entry->SubMenu == menu )
+            entry->SubMenu = NULL;
+}
+
+/*
+ * This function destroys a menu specified by the parameter. All menus
+ * and windows are updated to make sure no ill pointers hang around.
+ */
+void fgDestroyMenu( SFG_Menu* menu )
+{
+    SFG_Window *window;
+    SFG_Menu *from;
+
+    FREEGLUT_INTERNAL_ERROR_EXIT ( menu, "Menu destroy function called with null menu",
+                                   "fgDestroyMenu" );
+
+    /* First of all, have all references to this menu removed from all windows: */
+    for( window = (SFG_Window *)fgStructure.Windows.First;
+         window;
+         window = (SFG_Window *)window->Node.Next )
+        fghRemoveMenuFromWindow( window, menu );
+
+    /* Now proceed with removing menu entries that lead to this menu */
+    for( from = ( SFG_Menu * )fgStructure.Menus.First;
+         from;
+         from = ( SFG_Menu * )from->Node.Next )
+        fghRemoveMenuFromMenu( from, menu );
+
+    /*
+     * If the programmer defined a destroy callback, call it
+     * A. Donev: But first make this the active menu
+     */
+    if( menu->Destroy )
+    {
+        SFG_Menu *activeMenu=fgStructure.CurrentMenu;
+        fgStructure.CurrentMenu = menu;
+        menu->Destroy( );
+        fgStructure.CurrentMenu = activeMenu;
+    }
+
+    /*
+     * Now we are pretty sure the menu is not used anywhere
+     * and that we can remove all of its entries
+     */
+    while( menu->Entries.First )
+    {
+        SFG_MenuEntry *entry = ( SFG_MenuEntry * ) menu->Entries.First;
+
+        fgListRemove( &menu->Entries, &entry->Node );
+
+        if( entry->Text )
+            free( entry->Text );
+        entry->Text = NULL;
+
+        free( entry );
+    }
+
+    if( fgStructure.CurrentWindow == menu->Window )
+        fgSetWindow( NULL );
+    fgDestroyWindow( menu->Window );
+    fgListRemove( &fgStructure.Menus, &menu->Node );
+    if( fgStructure.CurrentMenu == menu )
+        fgStructure.CurrentMenu = NULL;
+
+    free( menu );
+}
+
+/*
+ * This function should be called on glutInit(). It will prepare the internal
+ * structure of freeglut to be used in the application. The structure will be
+ * destroyed using fgDestroyStructure() on glutMainLoop() return. In that
+ * case further use of freeglut should be preceeded with a glutInit() call.
+ */
+void fgCreateStructure( void )
+{
+    /*
+     * We will be needing two lists: the first containing windows,
+     * and the second containing the user-defined menus.
+     * Also, no current window/menu is set, as none has been created yet.
+     */
+
+    fgListInit(&fgStructure.Windows);
+    fgListInit(&fgStructure.Menus);
+    fgListInit(&fgStructure.WindowsToDestroy);
+
+    fgStructure.CurrentWindow = NULL;
+    fgStructure.CurrentMenu = NULL;
+    fgStructure.MenuContext = NULL;
+    fgStructure.GameModeWindow = NULL;
+    fgStructure.WindowID = 0;
+    fgStructure.MenuID = 0;
+}
+
+/*
+ * This function is automatically called on glutMainLoop() return.
+ * It should deallocate and destroy all remnants of previous
+ * glutInit()-enforced structure initialization...
+ */
+void fgDestroyStructure( void )
+{
+    /* Clean up the WindowsToDestroy list. */
+    fgCloseWindows( );
+
+    /* Make sure all windows and menus have been deallocated */
+    while( fgStructure.Menus.First )
+        fgDestroyMenu( ( SFG_Menu * )fgStructure.Menus.First );
+
+    while( fgStructure.Windows.First )
+        fgDestroyWindow( ( SFG_Window * )fgStructure.Windows.First );
+}
+
+/*
+ * Helper function to enumerate through all registered top-level windows
+ */
+void fgEnumWindows( FGCBenumerator enumCallback, SFG_Enumerator* enumerator )
+{
+    SFG_Window *window;
+
+    FREEGLUT_INTERNAL_ERROR_EXIT ( enumCallback && enumerator,
+                                   "Enumerator or callback missing from window enumerator call",
+                                   "fgEnumWindows" );
+
+    /* Check every of the top-level windows */
+    for( window = ( SFG_Window * )fgStructure.Windows.First;
+         window;
+         window = ( SFG_Window * )window->Node.Next )
+    {
+        enumCallback( window, enumerator );
+        if( enumerator->found )
+            return;
+    }
+}
+
+/*
+ * Helper function to enumerate through all a window's subwindows
+ * (single level descent)
+ */
+void fgEnumSubWindows( SFG_Window* window, FGCBenumerator enumCallback,
+                       SFG_Enumerator* enumerator )
+{
+    SFG_Window *child;
+
+    FREEGLUT_INTERNAL_ERROR_EXIT ( enumCallback && enumerator,
+                                   "Enumerator or callback missing from subwindow enumerator call",
+                                   "fgEnumSubWindows" );
+    FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Window Enumeration" );
+
+    for( child = ( SFG_Window * )window->Children.First;
+         child;
+         child = ( SFG_Window * )child->Node.Next )
+    {
+        enumCallback( child, enumerator );
+        if( enumerator->found )
+            return;
+    }
+}
+
+/*
+ * A static helper function to look for a window given its handle
+ */
+static void fghcbWindowByHandle( SFG_Window *window,
+                                 SFG_Enumerator *enumerator )
+{
+    if ( enumerator->found )
+        return;
+
+    /* Check the window's handle. Hope this works. Looks ugly. That's for sure. */
+    if( window->Window.Handle == (SFG_WindowHandleType) (enumerator->data) )
+    {
+        enumerator->found = GL_TRUE;
+        enumerator->data = window;
+
+        return;
+    }
+
+    /* Otherwise, check this window's children */
+    fgEnumSubWindows( window, fghcbWindowByHandle, enumerator );
+}
+
+/*
+ * fgWindowByHandle returns a (SFG_Window *) value pointing to the
+ * first window in the queue matching the specified window handle.
+ * The function is defined in freeglut_structure.c file.
+ */
+SFG_Window* fgWindowByHandle ( SFG_WindowHandleType hWindow )
+{
+    SFG_Enumerator enumerator;
+
+    /* This is easy and makes use of the windows enumeration defined above */
+    enumerator.found = GL_FALSE;
+    enumerator.data = (void *)hWindow;
+    fgEnumWindows( fghcbWindowByHandle, &enumerator );
+
+    if( enumerator.found )
+        return( SFG_Window *) enumerator.data;
+    return NULL;
+}
+
+/*
+ * A static helper function to look for a window given its ID
+ */
+static void fghcbWindowByID( SFG_Window *window, SFG_Enumerator *enumerator )
+{
+    /* Make sure we do not overwrite our precious results... */
+    if( enumerator->found )
+        return;
+
+    /* Check the window's handle. Hope this works. Looks ugly. That's for sure. */
+    if( window->ID == *( int *)(enumerator->data) )
+    {
+        enumerator->found = GL_TRUE;
+        enumerator->data = window;
+
+        return;
+    }
+
+    /* Otherwise, check this window's children */
+    fgEnumSubWindows( window, fghcbWindowByID, enumerator );
+}
+
+/*
+ * This function is similiar to the previous one, except it is
+ * looking for a specified (sub)window identifier. The function
+ * is defined in freeglut_structure.c file.
+ */
+SFG_Window* fgWindowByID( int windowID )
+{
+    SFG_Enumerator enumerator;
+
+    /* Uses a method very similiar for fgWindowByHandle... */
+    enumerator.found = GL_FALSE;
+    enumerator.data = ( void * )&windowID;
+    fgEnumWindows( fghcbWindowByID, &enumerator );
+    if( enumerator.found )
+        return ( SFG_Window * )enumerator.data;
+    return NULL;
+}
+
+/*
+ * Looks up a menu given its ID. This is easier that fgWindowByXXX
+ * as all menus are placed in one doubly linked list...
+ */
+SFG_Menu* fgMenuByID( int menuID )
+{
+    SFG_Menu *menu = NULL;
+
+    /* It's enough to check all entries in fgStructure.Menus... */
+    for( menu = (SFG_Menu *)fgStructure.Menus.First;
+         menu;
+         menu = (SFG_Menu *)menu->Node.Next )
+        if( menu->ID == menuID )
+            return menu;
+    return NULL;
+}
+
+/*
+ * List functions...
+ */
+void fgListInit(SFG_List *list)
+{
+    list->First = NULL;
+    list->Last = NULL;
+}
+
+void fgListAppend(SFG_List *list, SFG_Node *node)
+{
+    if ( list->Last )
+    {
+        SFG_Node *ln = (SFG_Node *) list->Last;
+        ln->Next = node;
+        node->Prev = ln;
+    }
+    else
+    {
+        node->Prev = NULL;
+        list->First = node;
+    }
+
+    node->Next = NULL;
+    list->Last = node;
+}
+
+void fgListRemove(SFG_List *list, SFG_Node *node)
+{
+    if( node->Next )
+        ( ( SFG_Node * )node->Next )->Prev = node->Prev;
+    if( node->Prev )
+        ( ( SFG_Node * )node->Prev )->Next = node->Next;
+    if( ( ( SFG_Node * )list->First ) == node )
+        list->First = node->Next;
+    if( ( ( SFG_Node * )list->Last ) == node )
+        list->Last = node->Prev;
+}
+
+int fgListLength(SFG_List *list)
+{
+    SFG_Node *node;
+    int length = 0;
+
+    for( node =( SFG_Node * )list->First;
+         node;
+         node = ( SFG_Node * )node->Next )
+        ++length;
+
+    return length;
+}
+
+
+void fgListInsert(SFG_List *list, SFG_Node *next, SFG_Node *node)
+{
+    SFG_Node *prev;
+
+    if( (node->Next = next) )
+    {
+        prev = next->Prev;
+        next->Prev = node;
+    }
+    else
+    {
+        prev = list->Last;
+        list->Last = node;
+    }
+
+    if( (node->Prev = prev) )
+        prev->Next = node;
+    else
+        list->First = node;
+}
+
+/*** END OF FILE ***/
index 0c7da12..722bca6 100644 (file)
-/*\r
- * freeglut_teapot.c\r
- *\r
- * Teapot(tm) rendering code.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Fri Dec 24 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-/*\r
- * Original teapot code copyright follows:\r
- */\r
-\r
-/*\r
- * (c) Copyright 1993, Silicon Graphics, Inc.\r
- *\r
- * ALL RIGHTS RESERVED\r
- *\r
- * Permission to use, copy, modify, and distribute this software\r
- * for any purpose and without fee is hereby granted, provided\r
- * that the above copyright notice appear in all copies and that\r
- * both the copyright notice and this permission notice appear in\r
- * supporting documentation, and that the name of Silicon\r
- * Graphics, Inc. not be used in advertising or publicity\r
- * pertaining to distribution of the software without specific,\r
- * written prior permission.\r
- *\r
- * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU\r
- * "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR\r
- * OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF\r
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  IN NO\r
- * EVENT SHALL SILICON GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE\r
- * ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR\r
- * CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,\r
- * INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,\r
- * SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR\r
- * NOT SILICON GRAPHICS, INC.  HAS BEEN ADVISED OF THE POSSIBILITY\r
- * OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
- * ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR\r
- * PERFORMANCE OF THIS SOFTWARE.\r
- *\r
- * US Government Users Restricted Rights\r
- *\r
- * Use, duplication, or disclosure by the Government is subject to\r
- * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph\r
- * (c)(1)(ii) of the Rights in Technical Data and Computer\r
- * Software clause at DFARS 252.227-7013 and/or in similar or\r
- * successor clauses in the FAR or the DOD or NASA FAR\r
- * Supplement.  Unpublished-- rights reserved under the copyright\r
- * laws of the United States.  Contractor/manufacturer is Silicon\r
- * Graphics, Inc., 2011 N.  Shoreline Blvd., Mountain View, CA\r
- * 94039-7311.\r
- *\r
- * OpenGL(TM) is a trademark of Silicon Graphics, Inc.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-#include "freeglut_teapot_data.h"\r
-\r
-/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */\r
-\r
-\r
-static void fghTeapot( GLint grid, GLdouble scale, GLenum type )\r
-{\r
-#if defined(_WIN32_WCE)\r
-               int i, numV=sizeof(strip_vertices)/4, numI=sizeof(strip_normals)/4;\r
-#else\r
-    double p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3];\r
-    long i, j, k, l;\r
-#endif\r
-\r
-    glPushAttrib( GL_ENABLE_BIT | GL_EVAL_BIT );\r
-    glEnable( GL_AUTO_NORMAL );\r
-    glEnable( GL_NORMALIZE );\r
-    glEnable( GL_MAP2_VERTEX_3 );\r
-    glEnable( GL_MAP2_TEXTURE_COORD_2 );\r
-\r
-    glPushMatrix();\r
-    glRotated( 270.0, 1.0, 0.0, 0.0 );\r
-    glScaled( 0.5 * scale, 0.5 * scale, 0.5 * scale );\r
-    glTranslated( 0.0, 0.0, -1.5 );\r
-\r
-#if defined(_WIN32_WCE)\r
-    glRotated( 90.0, 1.0, 0.0, 0.0 );\r
-    glBegin( GL_TRIANGLE_STRIP );\r
-\r
-    for( i = 0; i < numV-1; i++ )\r
-    {\r
-        int vidx = strip_vertices[i],\r
-            nidx = strip_normals[i];\r
-\r
-        if( vidx != -1 )\r
-        {\r
-            glNormal3fv( normals[nidx]  );\r
-            glVertex3fv( vertices[vidx] );\r
-        }\r
-        else\r
-        {\r
-            glEnd();\r
-            glBegin( GL_TRIANGLE_STRIP );\r
-        }\r
-    }\r
-\r
-    glEnd();\r
-#else\r
-    for (i = 0; i < 10; i++) {\r
-      for (j = 0; j < 4; j++) {\r
-        for (k = 0; k < 4; k++) {\r
-          for (l = 0; l < 3; l++) {\r
-            p[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];\r
-            q[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];\r
-            if (l == 1)\r
-              q[j][k][l] *= -1.0;\r
-            if (i < 6) {\r
-              r[j][k][l] =\r
-                cpdata[patchdata[i][j * 4 + (3 - k)]][l];\r
-              if (l == 0)\r
-                r[j][k][l] *= -1.0;\r
-              s[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];\r
-              if (l == 0)\r
-                s[j][k][l] *= -1.0;\r
-              if (l == 1)\r
-                s[j][k][l] *= -1.0;\r
-            }\r
-          }\r
-        }\r
-      }\r
-\r
-      glMap2d(GL_MAP2_TEXTURE_COORD_2, 0.0, 1.0, 2, 2, 0.0, 1.0, 4, 2,\r
-        &tex[0][0][0]);\r
-      glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4,\r
-        &p[0][0][0]);\r
-      glMapGrid2d(grid, 0.0, 1.0, grid, 0.0, 1.0);\r
-      glEvalMesh2(type, 0, grid, 0, grid);\r
-      glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4,\r
-        &q[0][0][0]);\r
-      glEvalMesh2(type, 0, grid, 0, grid);\r
-      if (i < 6) {\r
-        glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4,\r
-          &r[0][0][0]);\r
-        glEvalMesh2(type, 0, grid, 0, grid);\r
-        glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4,\r
-          &s[0][0][0]);\r
-        glEvalMesh2(type, 0, grid, 0, grid);\r
-      }\r
-    }\r
-#endif  /* defined(_WIN32_WCE) */\r
-\r
-    glPopMatrix();\r
-    glPopAttrib();\r
-}\r
-\r
-\r
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */\r
-\r
-/*\r
- * Renders a beautiful wired teapot...\r
- */\r
-void FGAPIENTRY glutWireTeapot( GLdouble size )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireTeapot" );\r
-    /* We will use the general teapot rendering code */\r
-    fghTeapot( 10, size, GL_LINE );\r
-}\r
-\r
-/*\r
- * Renders a beautiful filled teapot...\r
- */\r
-void FGAPIENTRY glutSolidTeapot( GLdouble size )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidTeapot" );\r
-    /* We will use the general teapot rendering code */\r
-    fghTeapot( 7, size, GL_FILL );\r
-}\r
-\r
-/*** END OF FILE ***/\r
-\r
-\r
-\r
-\r
-\r
+/*
+ * freeglut_teapot.c
+ *
+ * Teapot(tm) rendering code.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Fri Dec 24 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Original teapot code copyright follows:
+ */
+
+/*
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ *
+ * ALL RIGHTS RESERVED
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that
+ * both the copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Silicon
+ * Graphics, Inc. not be used in advertising or publicity
+ * pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU
+ * "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR
+ * OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  IN NO
+ * EVENT SHALL SILICON GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE
+ * ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
+ * INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,
+ * SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR
+ * NOT SILICON GRAPHICS, INC.  HAS BEEN ADVISED OF THE POSSIBILITY
+ * OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ *
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer
+ * Software clause at DFARS 252.227-7013 and/or in similar or
+ * successor clauses in the FAR or the DOD or NASA FAR
+ * Supplement.  Unpublished-- rights reserved under the copyright
+ * laws of the United States.  Contractor/manufacturer is Silicon
+ * Graphics, Inc., 2011 N.  Shoreline Blvd., Mountain View, CA
+ * 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+#include "freeglut_teapot_data.h"
+
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
+
+
+static void fghTeapot( GLint grid, GLdouble scale, GLenum type )
+{
+#if defined(_WIN32_WCE)
+               int i, numV=sizeof(strip_vertices)/4, numI=sizeof(strip_normals)/4;
+#else
+    double p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3];
+    long i, j, k, l;
+#endif
+
+    glPushAttrib( GL_ENABLE_BIT | GL_EVAL_BIT );
+    glEnable( GL_AUTO_NORMAL );
+    glEnable( GL_NORMALIZE );
+    glEnable( GL_MAP2_VERTEX_3 );
+    glEnable( GL_MAP2_TEXTURE_COORD_2 );
+
+    glPushMatrix();
+    glRotated( 270.0, 1.0, 0.0, 0.0 );
+    glScaled( 0.5 * scale, 0.5 * scale, 0.5 * scale );
+    glTranslated( 0.0, 0.0, -1.5 );
+
+#if defined(_WIN32_WCE)
+    glRotated( 90.0, 1.0, 0.0, 0.0 );
+    glBegin( GL_TRIANGLE_STRIP );
+
+    for( i = 0; i < numV-1; i++ )
+    {
+        int vidx = strip_vertices[i],
+            nidx = strip_normals[i];
+
+        if( vidx != -1 )
+        {
+            glNormal3fv( normals[nidx]  );
+            glVertex3fv( vertices[vidx] );
+        }
+        else
+        {
+            glEnd();
+            glBegin( GL_TRIANGLE_STRIP );
+        }
+    }
+
+    glEnd();
+#else
+    for (i = 0; i < 10; i++) {
+      for (j = 0; j < 4; j++) {
+        for (k = 0; k < 4; k++) {
+          for (l = 0; l < 3; l++) {
+            p[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
+            q[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
+            if (l == 1)
+              q[j][k][l] *= -1.0;
+            if (i < 6) {
+              r[j][k][l] =
+                cpdata[patchdata[i][j * 4 + (3 - k)]][l];
+              if (l == 0)
+                r[j][k][l] *= -1.0;
+              s[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
+              if (l == 0)
+                s[j][k][l] *= -1.0;
+              if (l == 1)
+                s[j][k][l] *= -1.0;
+            }
+          }
+        }
+      }
+
+      glMap2d(GL_MAP2_TEXTURE_COORD_2, 0.0, 1.0, 2, 2, 0.0, 1.0, 4, 2,
+        &tex[0][0][0]);
+      glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4,
+        &p[0][0][0]);
+      glMapGrid2d(grid, 0.0, 1.0, grid, 0.0, 1.0);
+      glEvalMesh2(type, 0, grid, 0, grid);
+      glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4,
+        &q[0][0][0]);
+      glEvalMesh2(type, 0, grid, 0, grid);
+      if (i < 6) {
+        glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4,
+          &r[0][0][0]);
+        glEvalMesh2(type, 0, grid, 0, grid);
+        glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4,
+          &s[0][0][0]);
+        glEvalMesh2(type, 0, grid, 0, grid);
+      }
+    }
+#endif  /* defined(_WIN32_WCE) */
+
+    glPopMatrix();
+    glPopAttrib();
+}
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Renders a beautiful wired teapot...
+ */
+void FGAPIENTRY glutWireTeapot( GLdouble size )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireTeapot" );
+    /* We will use the general teapot rendering code */
+    fghTeapot( 10, size, GL_LINE );
+}
+
+/*
+ * Renders a beautiful filled teapot...
+ */
+void FGAPIENTRY glutSolidTeapot( GLdouble size )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidTeapot" );
+    /* We will use the general teapot rendering code */
+    fghTeapot( 7, size, GL_FILL );
+}
+
+/*** END OF FILE ***/
+
+
+
+
+
index 183951b..3bf83e1 100644 (file)
-/*\r
- * freeglut_teapot_data.h\r
- *\r
- * The freeglut library teapot data include file.\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#ifndef  FREEGLUT_TEAPOT_DATA_H\r
-#define  FREEGLUT_TEAPOT_DATA_H\r
-\r
-#if defined(_WIN32_WCE)\r
-/*\r
- * Submitted through the kind offices of Daniel Wagner (daniel@ims.tuwien.ac.at)\r
- */\r
-\r
-/* 530 vertices */\r
-\r
-const int numVertices = 530;\r
-const float vertices[530][3] =  {\r
-2.1f, 3.6f, 0.0f, \r
-2.071f, 3.711f, 0.0f, \r
-2.105f, 3.748f, 0.0f, \r
-2.174f, 3.711f, 0.0f, \r
-2.25f, 3.6f, 0.0f, \r
-1.937f, 3.6f, 0.8242f, \r
-1.91f, 3.711f, 0.8128f, \r
-1.942f, 3.748f, 0.8261f, \r
-2.005f, 3.711f, 0.8532f, \r
-2.076f, 3.6f, 0.8831f, \r
-1.491f, 3.6f, 1.491f, \r
-1.47f, 3.711f, 1.47f, \r
-1.494f, 3.748f, 1.494f, \r
-1.543f, 3.711f, 1.543f, \r
-1.597f, 3.6f, 1.597f, \r
-0.8242f, 3.6f, 1.937f, \r
-0.8128f, 3.711f, 1.91f, \r
-0.8261f, 3.748f, 1.942f, \r
-0.8532f, 3.711f, 2.005f, \r
-0.8831f, 3.6f, 2.076f, \r
-0.0f, 3.6f, 2.1f, \r
-0.0f, 3.711f, 2.071f, \r
-0.0f, 3.748f, 2.105f, \r
-0.0f, 3.711f, 2.174f, \r
-0.0f, 3.6f, 2.25f, \r
--0.8812f, 3.6f, 1.937f, \r
--0.8368f, 3.711f, 1.91f, \r
--0.8332f, 3.748f, 1.942f, \r
--0.8541f, 3.711f, 2.005f, \r
--0.8831f, 3.6f, 2.076f, \r
--1.542f, 3.6f, 1.491f, \r
--1.492f, 3.711f, 1.47f, \r
--1.501f, 3.748f, 1.494f, \r
--1.544f, 3.711f, 1.543f, \r
--1.597f, 3.6f, 1.597f, \r
--1.956f, 3.6f, 0.8242f, \r
--1.918f, 3.711f, 0.8128f, \r
--1.944f, 3.748f, 0.8261f, \r
--2.006f, 3.711f, 0.8532f, \r
--2.076f, 3.6f, 0.8831f, \r
--2.1f, 3.6f, 0.0f, \r
--2.071f, 3.711f, 0.0f, \r
--2.105f, 3.748f, 0.0f, \r
--2.174f, 3.711f, 0.0f, \r
--2.25f, 3.6f, 0.0f, \r
--1.937f, 3.6f, -0.8242f, \r
--1.91f, 3.711f, -0.8128f, \r
--1.942f, 3.748f, -0.8261f, \r
--2.005f, 3.711f, -0.8532f, \r
--2.076f, 3.6f, -0.8831f, \r
--1.491f, 3.6f, -1.491f, \r
--1.47f, 3.711f, -1.47f, \r
--1.494f, 3.748f, -1.494f, \r
--1.543f, 3.711f, -1.543f, \r
--1.597f, 3.6f, -1.597f, \r
--0.8242f, 3.6f, -1.937f, \r
--0.8128f, 3.711f, -1.91f, \r
--0.8261f, 3.748f, -1.942f, \r
--0.8532f, 3.711f, -2.005f, \r
--0.8831f, 3.6f, -2.076f, \r
-0.0f, 3.6f, -2.1f, \r
-0.0f, 3.711f, -2.071f, \r
-0.0f, 3.748f, -2.105f, \r
-0.0f, 3.711f, -2.174f, \r
-0.0f, 3.6f, -2.25f, \r
-0.8242f, 3.6f, -1.937f, \r
-0.8128f, 3.711f, -1.91f, \r
-0.8261f, 3.748f, -1.942f, \r
-0.8532f, 3.711f, -2.005f, \r
-0.8831f, 3.6f, -2.076f, \r
-1.491f, 3.6f, -1.491f, \r
-1.47f, 3.711f, -1.47f, \r
-1.494f, 3.748f, -1.494f, \r
-1.543f, 3.711f, -1.543f, \r
-1.597f, 3.6f, -1.597f, \r
-1.937f, 3.6f, -0.8242f, \r
-1.91f, 3.711f, -0.8128f, \r
-1.942f, 3.748f, -0.8261f, \r
-2.005f, 3.711f, -0.8532f, \r
-2.076f, 3.6f, -0.8831f, \r
-2.525f, 3.011f, 0.0f, \r
-2.766f, 2.433f, 0.0f, \r
-2.936f, 1.876f, 0.0f, \r
-3.0f, 1.35f, 0.0f, \r
-2.33f, 3.011f, 0.9912f, \r
-2.551f, 2.433f, 1.086f, \r
-2.708f, 1.876f, 1.152f, \r
-2.767f, 1.35f, 1.178f, \r
-1.793f, 3.011f, 1.793f, \r
-1.964f, 2.433f, 1.964f, \r
-2.084f, 1.876f, 2.084f, \r
-2.13f, 1.35f, 2.13f, \r
-0.9912f, 3.011f, 2.33f, \r
-1.086f, 2.433f, 2.551f, \r
-1.152f, 1.876f, 2.708f, \r
-1.178f, 1.35f, 2.767f, \r
-0.0f, 3.011f, 2.525f, \r
-0.0f, 2.433f, 2.766f, \r
-0.0f, 1.876f, 2.936f, \r
-0.0f, 1.35f, 3.0f, \r
--0.9912f, 3.011f, 2.33f, \r
--1.086f, 2.433f, 2.551f, \r
--1.152f, 1.876f, 2.708f, \r
--1.178f, 1.35f, 2.767f, \r
--1.793f, 3.011f, 1.793f, \r
--1.964f, 2.433f, 1.964f, \r
--2.084f, 1.876f, 2.084f, \r
--2.13f, 1.35f, 2.13f, \r
--2.33f, 3.011f, 0.9912f, \r
--2.551f, 2.433f, 1.086f, \r
--2.708f, 1.876f, 1.152f, \r
--2.767f, 1.35f, 1.178f, \r
--2.525f, 3.011f, 0.0f, \r
--2.766f, 2.433f, 0.0f, \r
--2.936f, 1.876f, 0.0f, \r
--3.0f, 1.35f, 0.0f, \r
--2.33f, 3.011f, -0.9912f, \r
--2.551f, 2.433f, -1.086f, \r
--2.708f, 1.876f, -1.152f, \r
--2.767f, 1.35f, -1.178f, \r
--1.793f, 3.011f, -1.793f, \r
--1.964f, 2.433f, -1.964f, \r
--2.084f, 1.876f, -2.084f, \r
--2.13f, 1.35f, -2.13f, \r
--0.9912f, 3.011f, -2.33f, \r
--1.086f, 2.433f, -2.551f, \r
--1.152f, 1.876f, -2.708f, \r
--1.178f, 1.35f, -2.767f, \r
-0.0f, 3.011f, -2.525f, \r
-0.0f, 2.433f, -2.766f, \r
-0.0f, 1.876f, -2.936f, \r
-0.0f, 1.35f, -3.0f, \r
-0.9912f, 3.011f, -2.33f, \r
-1.086f, 2.433f, -2.551f, \r
-1.152f, 1.876f, -2.708f, \r
-1.178f, 1.35f, -2.767f, \r
-1.793f, 3.011f, -1.793f, \r
-1.964f, 2.433f, -1.964f, \r
-2.084f, 1.876f, -2.084f, \r
-2.13f, 1.35f, -2.13f, \r
-2.33f, 3.011f, -0.9912f, \r
-2.551f, 2.433f, -1.086f, \r
-2.708f, 1.876f, -1.152f, \r
-2.767f, 1.35f, -1.178f, \r
-2.883f, 0.9053f, 0.0f, \r
-2.625f, 0.5766f, 0.0f, \r
-2.367f, 0.3533f, 0.0f, \r
-2.25f, 0.225f, 0.0f, \r
-2.659f, 0.9053f, 1.132f, \r
-2.422f, 0.5766f, 1.03f, \r
-2.184f, 0.3533f, 0.9291f, \r
-2.076f, 0.225f, 0.8831f, \r
-2.047f, 0.9053f, 2.047f, \r
-1.864f, 0.5766f, 1.864f, \r
-1.681f, 0.3533f, 1.681f, \r
-1.597f, 0.225f, 1.597f, \r
-1.132f, 0.9053f, 2.659f, \r
-1.03f, 0.5766f, 2.422f, \r
-0.9291f, 0.3533f, 2.184f, \r
-0.8831f, 0.225f, 2.076f, \r
-0.0f, 0.9053f, 2.883f, \r
-0.0f, 0.5766f, 2.625f, \r
-0.0f, 0.3533f, 2.367f, \r
-0.0f, 0.225f, 2.25f, \r
--1.132f, 0.9053f, 2.659f, \r
--1.03f, 0.5766f, 2.422f, \r
--0.9291f, 0.3533f, 2.184f, \r
--0.8831f, 0.225f, 2.076f, \r
--2.047f, 0.9053f, 2.047f, \r
--1.864f, 0.5766f, 1.864f, \r
--1.681f, 0.3533f, 1.681f, \r
--1.597f, 0.225f, 1.597f, \r
--2.659f, 0.9053f, 1.132f, \r
--2.422f, 0.5766f, 1.03f, \r
--2.184f, 0.3533f, 0.9291f, \r
--2.076f, 0.225f, 0.8831f, \r
--2.883f, 0.9053f, 0.0f, \r
--2.625f, 0.5766f, 0.0f, \r
--2.367f, 0.3533f, 0.0f, \r
--2.25f, 0.225f, 0.0f, \r
--2.659f, 0.9053f, -1.132f, \r
--2.422f, 0.5766f, -1.03f, \r
--2.184f, 0.3533f, -0.9291f, \r
--2.076f, 0.225f, -0.8831f, \r
--2.047f, 0.9053f, -2.047f, \r
--1.864f, 0.5766f, -1.864f, \r
--1.681f, 0.3533f, -1.681f, \r
--1.597f, 0.225f, -1.597f, \r
--1.132f, 0.9053f, -2.659f, \r
--1.03f, 0.5766f, -2.422f, \r
--0.9291f, 0.3533f, -2.184f, \r
--0.8831f, 0.225f, -2.076f, \r
-0.0f, 0.9053f, -2.883f, \r
-0.0f, 0.5766f, -2.625f, \r
-0.0f, 0.3533f, -2.367f, \r
-0.0f, 0.225f, -2.25f, \r
-1.132f, 0.9053f, -2.659f, \r
-1.03f, 0.5766f, -2.422f, \r
-0.9291f, 0.3533f, -2.184f, \r
-0.8831f, 0.225f, -2.076f, \r
-2.047f, 0.9053f, -2.047f, \r
-1.864f, 0.5766f, -1.864f, \r
-1.681f, 0.3533f, -1.681f, \r
-1.597f, 0.225f, -1.597f, \r
-2.659f, 0.9053f, -1.132f, \r
-2.422f, 0.5766f, -1.03f, \r
-2.184f, 0.3533f, -0.9291f, \r
-2.076f, 0.225f, -0.8831f, \r
-2.199f, 0.1424f, 0.0f, \r
-1.927f, 0.07031f, 0.0f, \r
-1.253f, 0.01934f, 0.0f, \r
-0.0f, 0.0f, 0.0f, \r
-2.029f, 0.1424f, 0.8631f, \r
-1.777f, 0.07031f, 0.7562f, \r
-1.156f, 0.01934f, 0.4919f, \r
-1.561f, 0.1424f, 1.561f, \r
-1.368f, 0.07031f, 1.368f, \r
-0.8899f, 0.01934f, 0.8899f, \r
-0.8631f, 0.1424f, 2.029f, \r
-0.7562f, 0.07031f, 1.777f, \r
-0.4919f, 0.01934f, 1.156f, \r
-0.0f, 0.1424f, 2.199f, \r
-0.0f, 0.07031f, 1.927f, \r
-0.0f, 0.01934f, 1.253f, \r
--0.8631f, 0.1424f, 2.029f, \r
--0.7562f, 0.07031f, 1.777f, \r
--0.4919f, 0.01934f, 1.156f, \r
--1.561f, 0.1424f, 1.561f, \r
--1.368f, 0.07031f, 1.368f, \r
--0.8899f, 0.01934f, 0.8899f, \r
--2.029f, 0.1424f, 0.8631f, \r
--1.777f, 0.07031f, 0.7562f, \r
--1.156f, 0.01934f, 0.4919f, \r
--2.199f, 0.1424f, 0.0f, \r
--1.927f, 0.07031f, 0.0f, \r
--1.253f, 0.01934f, 0.0f, \r
--2.029f, 0.1424f, -0.8631f, \r
--1.777f, 0.07031f, -0.7562f, \r
--1.156f, 0.01934f, -0.4919f, \r
--1.561f, 0.1424f, -1.561f, \r
--1.368f, 0.07031f, -1.368f, \r
--0.8899f, 0.01934f, -0.8899f, \r
--0.8631f, 0.1424f, -2.029f, \r
--0.7562f, 0.07031f, -1.777f, \r
--0.4919f, 0.01934f, -1.156f, \r
-0.0f, 0.1424f, -2.199f, \r
-0.0f, 0.07031f, -1.927f, \r
-0.0f, 0.01934f, -1.253f, \r
-0.8631f, 0.1424f, -2.029f, \r
-0.7562f, 0.07031f, -1.777f, \r
-0.4919f, 0.01934f, -1.156f, \r
-1.561f, 0.1424f, -1.561f, \r
-1.368f, 0.07031f, -1.368f, \r
-0.8899f, 0.01934f, -0.8899f, \r
-2.029f, 0.1424f, -0.8631f, \r
-1.777f, 0.07031f, -0.7562f, \r
-1.156f, 0.01934f, -0.4919f, \r
--2.4f, 3.038f, 0.0f, \r
--3.101f, 3.032f, 0.0f, \r
--3.619f, 2.995f, 0.0f, \r
--3.94f, 2.895f, 0.0f, \r
--4.05f, 2.7f, 0.0f, \r
--2.377f, 3.09f, 0.2531f, \r
--3.122f, 3.084f, 0.2531f, \r
--3.669f, 3.041f, 0.2531f, \r
--4.005f, 2.926f, 0.2531f, \r
--4.12f, 2.7f, 0.2531f, \r
--2.325f, 3.206f, 0.3375f, \r
--3.168f, 3.198f, 0.3375f, \r
--3.778f, 3.143f, 0.3375f, \r
--4.15f, 2.993f, 0.3375f, \r
--4.275f, 2.7f, 0.3375f, \r
--2.273f, 3.322f, 0.2531f, \r
--3.214f, 3.313f, 0.2531f, \r
--3.888f, 3.244f, 0.2531f, \r
--4.294f, 3.06f, 0.2531f, \r
--4.43f, 2.7f, 0.2531f, \r
--2.25f, 3.375f, 0.0f, \r
--3.234f, 3.364f, 0.0f, \r
--3.938f, 3.291f, 0.0f, \r
--4.359f, 3.09f, 0.0f, \r
--4.5f, 2.7f, 0.0f, \r
--2.273f, 3.322f, -0.2531f, \r
--3.214f, 3.313f, -0.2531f, \r
--3.888f, 3.244f, -0.2531f, \r
--4.294f, 3.06f, -0.2531f, \r
--4.43f, 2.7f, -0.2531f, \r
--2.325f, 3.206f, -0.3375f, \r
--3.168f, 3.198f, -0.3375f, \r
--3.778f, 3.143f, -0.3375f, \r
--4.15f, 2.993f, -0.3375f, \r
--4.275f, 2.7f, -0.3375f, \r
--2.377f, 3.09f, -0.2531f, \r
--3.122f, 3.084f, -0.2531f, \r
--3.669f, 3.041f, -0.2531f, \r
--4.005f, 2.926f, -0.2531f, \r
--4.12f, 2.7f, -0.2531f, \r
--3.991f, 2.394f, 0.0f, \r
--3.806f, 2.025f, 0.0f, \r
--3.48f, 1.656f, 0.0f, \r
--3.0f, 1.35f, 0.0f, \r
--4.055f, 2.365f, 0.2531f, \r
--3.852f, 1.98f, 0.2531f, \r
--3.496f, 1.6f, 0.2531f, \r
--2.977f, 1.28f, 0.2531f, \r
--4.196f, 2.3f, 0.3375f, \r
--3.952f, 1.881f, 0.3375f, \r
--3.531f, 1.478f, 0.3375f, \r
--2.925f, 1.125f, 0.3375f, \r
--4.336f, 2.235f, 0.2531f, \r
--4.051f, 1.782f, 0.2531f, \r
--3.566f, 1.356f, 0.2531f, \r
--2.873f, 0.9703f, 0.2531f, \r
--4.4f, 2.205f, 0.0f, \r
--4.097f, 1.737f, 0.0f, \r
--3.582f, 1.3f, 0.0f, \r
--2.85f, 0.9f, 0.0f, \r
--4.336f, 2.235f, -0.2531f, \r
--4.051f, 1.782f, -0.2531f, \r
--3.566f, 1.356f, -0.2531f, \r
--2.873f, 0.9703f, -0.2531f, \r
--4.196f, 2.3f, -0.3375f, \r
--3.952f, 1.881f, -0.3375f, \r
--3.531f, 1.478f, -0.3375f, \r
--2.925f, 1.125f, -0.3375f, \r
--4.055f, 2.365f, -0.2531f, \r
--3.852f, 1.98f, -0.2531f, \r
--3.496f, 1.6f, -0.2531f, \r
--2.977f, 1.28f, -0.2531f, \r
-2.55f, 2.137f, 0.0f, \r
-3.27f, 2.303f, 0.0f, \r
-3.581f, 2.7f, 0.0f, \r
-3.752f, 3.182f, 0.0f, \r
-4.05f, 3.6f, 0.0f, \r
-2.55f, 1.944f, 0.5569f, \r
-3.324f, 2.159f, 0.5028f, \r
-3.652f, 2.617f, 0.3839f, \r
-3.838f, 3.151f, 0.265f, \r
-4.191f, 3.6f, 0.2109f, \r
-2.55f, 1.519f, 0.7425f, \r
-3.445f, 1.844f, 0.6704f, \r
-3.806f, 2.433f, 0.5119f, \r
-4.027f, 3.085f, 0.3533f, \r
-4.5f, 3.6f, 0.2813f, \r
-2.55f, 1.093f, 0.5569f, \r
-3.566f, 1.529f, 0.5028f, \r
-3.961f, 2.249f, 0.3839f, \r
-4.215f, 3.018f, 0.265f, \r
-4.809f, 3.6f, 0.2109f, \r
-2.55f, 0.9f, 0.0f, \r
-3.621f, 1.385f, 0.0f, \r
-4.031f, 2.166f, 0.0f, \r
-4.301f, 2.988f, 0.0f, \r
-4.95f, 3.6f, 0.0f, \r
-2.55f, 1.093f, -0.5569f, \r
-3.566f, 1.529f, -0.5028f, \r
-3.961f, 2.249f, -0.3839f, \r
-4.215f, 3.018f, -0.265f, \r
-4.809f, 3.6f, -0.2109f, \r
-2.55f, 1.519f, -0.7425f, \r
-3.445f, 1.844f, -0.6704f, \r
-3.806f, 2.433f, -0.5119f, \r
-4.027f, 3.085f, -0.3533f, \r
-4.5f, 3.6f, -0.2813f, \r
-2.55f, 1.944f, -0.5569f, \r
-3.324f, 2.159f, -0.5028f, \r
-3.652f, 2.617f, -0.3839f, \r
-3.838f, 3.151f, -0.265f, \r
-4.191f, 3.6f, -0.2109f, \r
-4.158f, 3.663f, 0.0f, \r
-4.238f, 3.684f, 0.0f, \r
-4.261f, 3.663f, 0.0f, \r
-4.2f, 3.6f, 0.0f, \r
-4.308f, 3.666f, 0.1978f, \r
-4.379f, 3.689f, 0.1687f, \r
-4.381f, 3.668f, 0.1397f, \r
-4.294f, 3.6f, 0.1266f, \r
-4.64f, 3.673f, 0.2637f, \r
-4.69f, 3.7f, 0.225f, \r
-4.645f, 3.677f, 0.1863f, \r
-4.5f, 3.6f, 0.1688f, \r
-4.971f, 3.68f, 0.1978f, \r
-5.001f, 3.711f, 0.1687f, \r
-4.909f, 3.687f, 0.1397f, \r
-4.706f, 3.6f, 0.1266f, \r
-5.122f, 3.683f, 0.0f, \r
-5.142f, 3.716f, 0.0f, \r
-5.029f, 3.691f, 0.0f, \r
-4.8f, 3.6f, 0.0f, \r
-4.971f, 3.68f, -0.1978f, \r
-5.001f, 3.711f, -0.1687f, \r
-4.909f, 3.687f, -0.1397f, \r
-4.706f, 3.6f, -0.1266f, \r
-4.64f, 3.673f, -0.2637f, \r
-4.69f, 3.7f, -0.225f, \r
-4.645f, 3.677f, -0.1863f, \r
-4.5f, 3.6f, -0.1688f, \r
-4.308f, 3.666f, -0.1978f, \r
-4.379f, 3.689f, -0.1687f, \r
-4.381f, 3.668f, -0.1397f, \r
-4.294f, 3.6f, -0.1266f, \r
-0.0f, 4.725f, 0.0f, \r
-0.5109f, 4.651f, 0.0f, \r
-0.4875f, 4.472f, 0.0f, \r
-0.2953f, 4.25f, 0.0f, \r
-0.3f, 4.05f, 0.0f, \r
-0.4715f, 4.651f, 0.2011f, \r
-0.4499f, 4.472f, 0.1918f, \r
-0.2725f, 4.25f, 0.1161f, \r
-0.2768f, 4.05f, 0.1178f, \r
-0.3632f, 4.651f, 0.3632f, \r
-0.3465f, 4.472f, 0.3465f, \r
-0.2098f, 4.25f, 0.2098f, \r
-0.213f, 4.05f, 0.213f, \r
-0.2011f, 4.651f, 0.4715f, \r
-0.1918f, 4.472f, 0.4499f, \r
-0.1161f, 4.25f, 0.2725f, \r
-0.1178f, 4.05f, 0.2768f, \r
-0.0f, 4.651f, 0.5109f, \r
-0.0f, 4.472f, 0.4875f, \r
-0.0f, 4.25f, 0.2953f, \r
-0.0f, 4.05f, 0.3f, \r
--0.2011f, 4.651f, 0.4715f, \r
--0.1918f, 4.472f, 0.4499f, \r
--0.1161f, 4.25f, 0.2725f, \r
--0.1178f, 4.05f, 0.2768f, \r
--0.3632f, 4.651f, 0.3632f, \r
--0.3465f, 4.472f, 0.3465f, \r
--0.2098f, 4.25f, 0.2098f, \r
--0.213f, 4.05f, 0.213f, \r
--0.4715f, 4.651f, 0.2011f, \r
--0.4499f, 4.472f, 0.1918f, \r
--0.2725f, 4.25f, 0.1161f, \r
--0.2768f, 4.05f, 0.1178f, \r
--0.5109f, 4.651f, 0.0f, \r
--0.4875f, 4.472f, 0.0f, \r
--0.2953f, 4.25f, 0.0f, \r
--0.3f, 4.05f, 0.0f, \r
--0.4715f, 4.651f, -0.2011f, \r
--0.4499f, 4.472f, -0.1918f, \r
--0.2725f, 4.25f, -0.1161f, \r
--0.2768f, 4.05f, -0.1178f, \r
--0.3632f, 4.651f, -0.3632f, \r
--0.3465f, 4.472f, -0.3465f, \r
--0.2098f, 4.25f, -0.2098f, \r
--0.213f, 4.05f, -0.213f, \r
--0.2011f, 4.651f, -0.4715f, \r
--0.1918f, 4.472f, -0.4499f, \r
--0.1161f, 4.25f, -0.2725f, \r
--0.1178f, 4.05f, -0.2768f, \r
-0.0f, 4.651f, -0.5109f, \r
-0.0f, 4.472f, -0.4875f, \r
-0.0f, 4.25f, -0.2953f, \r
-0.0f, 4.05f, -0.3f, \r
-0.2011f, 4.651f, -0.4715f, \r
-0.1918f, 4.472f, -0.4499f, \r
-0.1161f, 4.25f, -0.2725f, \r
-0.1178f, 4.05f, -0.2768f, \r
-0.3632f, 4.651f, -0.3632f, \r
-0.3465f, 4.472f, -0.3465f, \r
-0.2098f, 4.25f, -0.2098f, \r
-0.213f, 4.05f, -0.213f, \r
-0.4715f, 4.651f, -0.2011f, \r
-0.4499f, 4.472f, -0.1918f, \r
-0.2725f, 4.25f, -0.1161f, \r
-0.2768f, 4.05f, -0.1178f, \r
-0.6844f, 3.916f, 0.0f, \r
-1.237f, 3.825f, 0.0f, \r
-1.734f, 3.734f, 0.0f, \r
-1.95f, 3.6f, 0.0f, \r
-0.6313f, 3.916f, 0.2686f, \r
-1.142f, 3.825f, 0.4857f, \r
-1.6f, 3.734f, 0.6807f, \r
-1.799f, 3.6f, 0.7654f, \r
-0.4859f, 3.916f, 0.4859f, \r
-0.8786f, 3.825f, 0.8786f, \r
-1.231f, 3.734f, 1.231f, \r
-1.385f, 3.6f, 1.385f, \r
-0.2686f, 3.916f, 0.6313f, \r
-0.4857f, 3.825f, 1.142f, \r
-0.6807f, 3.734f, 1.6f, \r
-0.7654f, 3.6f, 1.799f, \r
-0.0f, 3.916f, 0.6844f, \r
-0.0f, 3.825f, 1.237f, \r
-0.0f, 3.734f, 1.734f, \r
-0.0f, 3.6f, 1.95f, \r
--0.2686f, 3.916f, 0.6313f, \r
--0.4857f, 3.825f, 1.142f, \r
--0.6807f, 3.734f, 1.6f, \r
--0.7654f, 3.6f, 1.799f, \r
--0.4859f, 3.916f, 0.4859f, \r
--0.8786f, 3.825f, 0.8786f, \r
--1.231f, 3.734f, 1.231f, \r
--1.385f, 3.6f, 1.385f, \r
--0.6313f, 3.916f, 0.2686f, \r
--1.142f, 3.825f, 0.4857f, \r
--1.6f, 3.734f, 0.6807f, \r
--1.799f, 3.6f, 0.7654f, \r
--0.6844f, 3.916f, 0.0f, \r
--1.237f, 3.825f, 0.0f, \r
--1.734f, 3.734f, 0.0f, \r
--1.95f, 3.6f, 0.0f, \r
--0.6313f, 3.916f, -0.2686f, \r
--1.142f, 3.825f, -0.4857f, \r
--1.6f, 3.734f, -0.6807f, \r
--1.799f, 3.6f, -0.7654f, \r
--0.4859f, 3.916f, -0.4859f, \r
--0.8786f, 3.825f, -0.8786f, \r
--1.231f, 3.734f, -1.231f, \r
--1.385f, 3.6f, -1.385f, \r
--0.2686f, 3.916f, -0.6313f, \r
--0.4857f, 3.825f, -1.142f, \r
--0.6807f, 3.734f, -1.6f, \r
--0.7654f, 3.6f, -1.799f, \r
-0.0f, 3.916f, -0.6844f, \r
-0.0f, 3.825f, -1.237f, \r
-0.0f, 3.734f, -1.734f, \r
-0.0f, 3.6f, -1.95f, \r
-0.2686f, 3.916f, -0.6313f, \r
-0.4857f, 3.825f, -1.142f, \r
-0.6807f, 3.734f, -1.6f, \r
-0.7654f, 3.6f, -1.799f, \r
-0.4859f, 3.916f, -0.4859f, \r
-0.8786f, 3.825f, -0.8786f, \r
-1.231f, 3.734f, -1.231f, \r
-1.385f, 3.6f, -1.385f, \r
-0.6313f, 3.916f, -0.2686f, \r
-1.142f, 3.825f, -0.4857f, \r
-1.6f, 3.734f, -0.6807f, \r
-1.799f, 3.6f, -0.7654f\r
-};\r
-\r
-\r
-/* 530 normals */\r
-const int numNormals = 530;\r
-const float normals[530][3] = {\r
-0.0486f, -0.9986f, 0.0168f, \r
-0.9976f, -0.0678f, -0.0008f, \r
--0.233f, 0.8502f, -0.4719f, \r
--0.2299f, 0.9679f, 0.1004f, \r
--0.1648f, 0.985f, 0.0501f, \r
--0.0117f, 0.7461f, 0.6656f, \r
--0.0888f, 0.9692f, 0.2294f, \r
-0.6449f, -0.7172f, -0.2637f, \r
--0.066f, 0.9851f, 0.1583f, \r
--0.6585f, -0.342f, -0.6703f, \r
--0.293f, 0.9558f, 0.0209f, \r
-0.179f, 0.9825f, -0.0513f, \r
--0.0094f, 0.903f, 0.4295f, \r
--0.0059f, -0.986f, -0.1662f, \r
--0.7355f, 0.6774f, -0.0026f, \r
--0.997f, 0.0763f, 0.0019f, \r
--0.1478f, 0.9333f, 0.3271f, \r
--0.3014f, -0.6034f, -0.7382f, \r
--0.7048f, -0.0681f, 0.706f, \r
--0.3361f, 0.9332f, 0.1263f, \r
-0.3709f, 0.1524f, -0.916f, \r
--0.3399f, -0.4121f, 0.8453f, \r
-0.1921f, 0.9724f, -0.1316f, \r
--0.2671f, 0.7429f, 0.6137f, \r
-0.0888f, 0.9692f, -0.2294f, \r
-0.066f, 0.9851f, -0.1583f, \r
-0.9411f, 0.338f, 0.001f, \r
-0.8666f, -0.2559f, 0.4282f, \r
--0.8029f, 0.4968f, 0.3293f, \r
--0.0008f, -0.0678f, -0.9976f, \r
--0.8453f, -0.4121f, -0.3399f, \r
--0.4801f, -0.8741f, 0.0733f, \r
-0.6355f, -0.772f, 0.0006f, \r
--0.9215f, -0.0678f, 0.3822f, \r
--0.6698f, -0.6907f, -0.2723f, \r
-0.3734f, 0.876f, -0.3051f, \r
-0.3548f, -0.4118f, 0.8393f, \r
--0.3629f, 0.2429f, 0.8995f, \r
-0.9033f, 0.2079f, 0.375f, \r
--0.2824f, 0.5939f, 0.7532f, \r
-0.8938f, 0.4452f, 0.0532f, \r
-0.1478f, 0.9333f, -0.3271f, \r
-0.0085f, -0.0031f, -0.9999f, \r
-0.3595f, 0.933f, 0.0115f, \r
-0.8995f, 0.2429f, 0.3629f, \r
-0.7048f, -0.0681f, -0.706f, \r
--0.6428f, -0.7172f, -0.2688f, \r
-0.6366f, -0.447f, 0.6283f, \r
--0.1213f, -0.9861f, -0.1128f, \r
-0.8003f, 0.4978f, 0.334f, \r
-0.3361f, 0.9332f, -0.1263f, \r
-0.3399f, -0.4121f, -0.8453f, \r
--0.3909f, 0.4452f, 0.8055f, \r
-0.0117f, 0.7462f, -0.6655f, \r
-0.9215f, -0.0678f, -0.3822f, \r
-0.3582f, -0.7656f, 0.5343f, \r
--0.9782f, 0.2075f, -0.0011f, \r
-0.2824f, 0.5939f, -0.7532f, \r
-0.035f, -0.8413f, 0.5393f, \r
--0.8044f, 0.5934f, 0.0262f, \r
--0.1128f, -0.9861f, 0.1213f, \r
-0.13f, -0.1396f, 0.9816f, \r
-0.6644f, 0.3392f, 0.6659f, \r
--0.0042f, -0.6898f, -0.7239f, \r
--0.1587f, 0.9851f, 0.065f, \r
--0.8719f, -0.3415f, 0.3508f, \r
-0.6486f, 0.4756f, -0.5941f, \r
--0.4991f, 0.8499f, -0.1684f, \r
--0.3969f, 0.6342f, -0.6634f, \r
-0.7041f, -0.3863f, -0.5956f, \r
-0.3909f, 0.4452f, -0.8055f, \r
--0.0391f, -0.0113f, 0.9991f, \r
--0.3321f, 0.5936f, -0.733f, \r
-0.8523f, -0.5219f, -0.0338f, \r
-0.329f, 0.4978f, 0.8023f, \r
-0.8044f, 0.5934f, -0.0262f, \r
-0.1128f, -0.9861f, -0.1213f, \r
-0.0178f, 0.9861f, -0.1651f, \r
-0.3491f, 0.4045f, 0.8452f, \r
--0.2727f, 0.8505f, 0.4496f, \r
-0.065f, 0.9851f, 0.1587f, \r
--0.0005f, 0.4037f, 0.9148f, \r
--0.0077f, -0.4109f, -0.9116f, \r
-0.5609f, -0.604f, 0.5661f, \r
-0.8236f, 0.5668f, -0.0138f, \r
-0.1587f, 0.9851f, -0.065f, \r
-0.8719f, -0.3415f, -0.3508f, \r
--0.7382f, -0.6034f, 0.3014f, \r
-0.0346f, 0.8495f, 0.5263f, \r
--0.4373f, -0.7921f, -0.4257f, \r
--0.0532f, 0.4452f, 0.8938f, \r
-0.0689f, -0.9861f, 0.1509f, \r
--0.1509f, -0.9861f, 0.0689f, \r
-0.7706f, -0.2424f, -0.5893f, \r
--0.7543f, -0.6564f, 0.0105f, \r
-0.0005f, 0.4037f, -0.9148f, \r
--0.9116f, -0.4109f, 0.0077f, \r
-0.0058f, -0.0438f, 0.999f, \r
-0.1719f, 0.985f, 0.0005f, \r
--0.1697f, 0.9693f, 0.1774f, \r
-0.5874f, -0.5124f, 0.6263f, \r
-0.7382f, -0.6034f, -0.3014f, \r
--0.1518f, 0.985f, -0.081f, \r
-0.646f, 0.4051f, 0.6468f, \r
-0.334f, 0.4978f, -0.8003f, \r
--0.7354f, -0.6034f, -0.3082f, \r
--0.6919f, 0.2428f, -0.6798f, \r
-0.0532f, 0.4452f, -0.8938f, \r
-0.3547f, -0.3173f, 0.8794f, \r
-0.9879f, -0.1547f, -0.0033f, \r
--0.0462f, -0.9986f, 0.0223f, \r
--0.6088f, 0.4806f, 0.6311f, \r
--0.109f, -0.1969f, -0.9743f, \r
-0.1509f, -0.9861f, -0.0689f, \r
--0.0568f, 0.9983f, 0.0009f, \r
-0.9074f, -0.3096f, -0.2839f, \r
-0.8677f, 0.4969f, 0.0026f, \r
--0.2723f, -0.6907f, 0.6698f, \r
--0.4734f, -0.6798f, 0.5599f, \r
-0.9116f, -0.4109f, -0.0077f, \r
-0.1697f, 0.9693f, -0.1774f, \r
-0.5875f, 0.5937f, 0.5497f, \r
--0.3232f, 0.6846f, 0.6533f, \r
--0.5078f, -0.6913f, 0.5139f, \r
--0.4612f, 0.7474f, -0.478f, \r
--0.2071f, -0.8049f, 0.556f, \r
--0.6976f, -0.7164f, -0.0027f, \r
--0.8697f, 0.3388f, 0.3587f, \r
-0.0462f, -0.9986f, -0.0223f, \r
-0.2723f, -0.6907f, -0.6698f, \r
--0.829f, -0.4466f, -0.3365f, \r
-0.9148f, 0.4037f, 0.0005f, \r
--0.1583f, 0.9851f, -0.066f, \r
-0.148f, 0.9838f, 0.1002f, \r
--0.1717f, 0.985f, -0.0162f, \r
--0.4282f, -0.2559f, 0.8666f, \r
-0.3094f, -0.2556f, 0.9159f, \r
-0.2803f, -0.6907f, 0.6665f, \r
--0.6154f, 0.497f, 0.6117f, \r
--0.0262f, 0.5934f, -0.8044f, \r
-0.0286f, 0.1639f, -0.986f, \r
--0.6924f, 0.2083f, 0.6907f, \r
--0.0105f, 0.9975f, -0.0685f, \r
-0.5078f, -0.6913f, -0.5139f, \r
-0.2071f, -0.8049f, -0.556f, \r
--0.4903f, -0.7178f, -0.4942f, \r
--0.2637f, -0.7172f, -0.6449f, \r
--0.3822f, -0.0678f, -0.9215f, \r
-0.8697f, 0.3388f, -0.3587f, \r
-0.2461f, -0.805f, 0.5397f, \r
--0.2615f, 0.9334f, 0.2452f, \r
-0.6187f, 0.747f, -0.243f, \r
-0.0375f, -0.8401f, -0.5411f, \r
-0.0054f, 0.9691f, 0.2464f, \r
-0.3587f, 0.3388f, 0.8697f, \r
-0.3993f, 0.6582f, -0.6381f, \r
--0.3476f, -0.4464f, -0.8245f, \r
-0.099f, 0.9692f, 0.2251f, \r
--0.3666f, -0.3412f, 0.8655f, \r
-0.0396f, 0.153f, -0.9874f, \r
-0.0349f, 0.9969f, -0.0698f, \r
-0.1096f, 0.985f, 0.1324f, \r
--0.0578f, -0.9861f, 0.1556f, \r
-0.4479f, -0.5145f, -0.7311f, \r
-0.6924f, 0.2083f, -0.6907f, \r
-0.6096f, 0.747f, 0.265f, \r
--0.3508f, -0.3415f, -0.8719f, \r
--0.6215f, 0.4454f, -0.6443f, \r
--0.4942f, -0.7178f, 0.4903f, \r
--0.9402f, -0.3403f, -0.0085f, \r
-0.0056f, -0.0358f, 0.9993f, \r
-0.2615f, 0.9334f, -0.2452f, \r
--0.0024f, 0.0291f, -0.9995f, \r
--0.2667f, 0.9637f, -0.001f, \r
-0.0569f, -0.2712f, -0.9608f, \r
-0.7463f, 0.254f, 0.615f, \r
-0.5153f, 0.6516f, -0.5564f, \r
-0.0223f, -0.9986f, 0.0462f, \r
-0.3666f, -0.3412f, -0.8655f, \r
-0.0578f, -0.9861f, -0.1556f, \r
-0.6111f, 0.4984f, 0.6148f, \r
--0.243f, 0.747f, -0.6187f, \r
--0.0092f, 0.2338f, -0.9722f, \r
-0.478f, 0.7474f, -0.4612f, \r
--0.0058f, -0.4457f, -0.8951f, \r
--0.4856f, -0.6774f, -0.5524f, \r
-0.54f, 0.6414f, 0.5448f, \r
--0.3365f, -0.4466f, 0.829f, \r
--0.2257f, 0.795f, 0.5629f, \r
-0.8055f, 0.4452f, 0.3909f, \r
-0.3729f, 0.208f, 0.9042f, \r
--0.727f, -0.2562f, 0.6369f, \r
--0.0514f, -0.9986f, 0.0029f, \r
-0.9159f, 0.1555f, -0.3699f, \r
-0.0019f, -0.2377f, -0.9713f, \r
-0.4942f, -0.7178f, -0.4903f, \r
-0.6497f, -0.4127f, 0.6383f, \r
-0.0089f, 0.0486f, -0.9987f, \r
--0.0213f, 0.6301f, -0.7761f, \r
--0.9269f, -0.3751f, 0.0038f, \r
--0.1215f, 0.9852f, 0.1207f, \r
--0.5856f, 0.5198f, 0.6218f, \r
-0.8655f, -0.3412f, 0.3666f, \r
--0.2464f, 0.9691f, 0.0054f, \r
-0.0123f, 0.1386f, 0.9902f, \r
-0.0179f, -0.0369f, 0.9991f, \r
--0.1207f, 0.9852f, -0.1215f, \r
--0.0081f, 0.5671f, 0.8235f, \r
--0.8689f, 0.3387f, -0.3607f, \r
-0.0062f, 0.0309f, -0.9995f, \r
-0.3365f, -0.4466f, -0.829f, \r
--0.3787f, 0.2424f, -0.8931f, \r
--0.2904f, 0.4454f, -0.8468f, \r
--0.8707f, 0.4915f, 0.0133f, \r
-0.163f, -0.8182f, 0.5512f, \r
-0.4337f, -0.8052f, 0.4041f, \r
-0.0514f, -0.9986f, -0.0029f, \r
--0.0084f, 0.1303f, 0.9914f, \r
--0.706f, -0.0681f, -0.7048f, \r
--0.556f, -0.8049f, -0.2071f, \r
-0.8448f, 0.4045f, 0.3501f, \r
-0.4259f, -0.5474f, 0.7203f, \r
--0.6907f, 0.2083f, -0.6924f, \r
-0.1215f, 0.9852f, -0.1207f, \r
--0.1263f, 0.9332f, -0.3361f, \r
-0.7711f, -0.0741f, -0.6323f, \r
-0.2464f, 0.9691f, -0.0054f, \r
-0.1774f, 0.9693f, 0.1697f, \r
--0.9042f, 0.208f, 0.3729f, \r
--0.8393f, -0.4118f, 0.3548f, \r
-0.6888f, -0.7219f, -0.0648f, \r
-0.1556f, -0.9861f, 0.0578f, \r
-0.3271f, 0.9333f, 0.1478f, \r
--0.0024f, 0.2379f, 0.9712f, \r
--0.0026f, 0.4969f, 0.8677f, \r
-0.0f, 1.0f, 0.0f, \r
-0.1912f, -0.9815f, -0.0025f, \r
--0.3762f, -0.6681f, 0.6418f, \r
--0.7759f, 0.0432f, 0.6292f, \r
--0.0208f, -0.8044f, -0.5936f, \r
--0.2274f, 0.8822f, -0.4122f, \r
-0.7532f, 0.5939f, 0.2824f, \r
--0.9221f, -0.0681f, -0.3807f, \r
--0.2198f, 0.8494f, 0.4796f, \r
-0.0065f, -0.7656f, 0.6431f, \r
--0.5876f, 0.4472f, -0.6742f, \r
-0.7981f, -0.6024f, 0.0036f, \r
--0.0383f, -0.9986f, -0.0341f, \r
--0.6369f, -0.2562f, -0.727f, \r
--0.5497f, 0.5937f, 0.5875f, \r
-0.1084f, 0.9431f, 0.314f, \r
-0.9042f, 0.208f, -0.3729f, \r
--0.6659f, 0.3392f, 0.6644f, \r
-0.8393f, -0.4118f, -0.3548f, \r
-0.0029f, -0.9986f, 0.0514f, \r
--0.9647f, -0.2552f, -0.0635f, \r
--0.2294f, 0.9692f, -0.0888f, \r
-0.0026f, 0.4969f, -0.8677f, \r
-0.2452f, 0.9334f, 0.2615f, \r
-0.5171f, -0.4876f, -0.7033f, \r
--0.8951f, -0.4457f, 0.0058f, \r
--0.5936f, -0.8044f, 0.0208f, \r
-0.5642f, -0.5426f, -0.6222f, \r
-0.5938f, 0.4451f, 0.6702f, \r
-0.5497f, 0.5937f, -0.5875f, \r
-0.6657f, 0.4653f, 0.5832f, \r
-0.4857f, -0.6243f, 0.6117f, \r
--0.0486f, -0.9986f, -0.0168f, \r
--0.6468f, 0.4051f, 0.646f, \r
-0.6659f, 0.3392f, -0.6644f, \r
-0.1833f, 0.9735f, -0.1365f, \r
-0.3955f, 0.8505f, 0.3465f, \r
-0.5139f, -0.6913f, 0.5078f, \r
-0.8023f, 0.4978f, -0.329f, \r
--0.001f, 0.338f, 0.9411f, \r
--0.2496f, 0.8321f, -0.4951f, \r
-0.8951f, -0.4457f, -0.0058f, \r
-0.233f, 0.8502f, 0.4719f, \r
--0.0168f, -0.9986f, 0.0486f, \r
-0.5936f, -0.8044f, -0.0208f, \r
--0.05f, 0.3155f, 0.9475f, \r
-0.6585f, -0.342f, 0.6703f, \r
-0.4909f, -0.1864f, -0.8509f, \r
--0.37f, 0.9238f, -0.0973f, \r
-0.6468f, 0.4051f, -0.646f, \r
-0.0059f, -0.986f, 0.1662f, \r
--0.3724f, 0.9278f, -0.0202f, \r
--0.3501f, 0.4045f, 0.8448f, \r
--0.0425f, 0.8398f, -0.5411f, \r
--0.1684f, 0.8499f, 0.4991f, \r
--0.6665f, -0.6907f, 0.2803f, \r
--0.2251f, 0.9692f, 0.099f, \r
-0.9241f, -0.3816f, -0.0169f, \r
-0.001f, 0.338f, -0.9411f, \r
--0.9411f, 0.338f, -0.001f, \r
--0.8666f, -0.2559f, -0.4282f, \r
-0.0262f, 0.5183f, -0.8547f, \r
-0.3014f, -0.6034f, 0.7382f, \r
-0.0168f, -0.9986f, -0.0486f, \r
--0.3548f, -0.4118f, -0.8393f, \r
--0.6023f, -0.5297f, 0.5971f, \r
--0.9033f, 0.2079f, -0.375f, \r
--0.8938f, 0.4452f, -0.0532f, \r
-0.6044f, 0.7397f, 0.2957f, \r
-0.0008f, -0.0678f, 0.9976f, \r
-0.7058f, 0.0906f, -0.7025f, \r
-0.8453f, -0.4121f, 0.3399f, \r
--0.3595f, 0.933f, -0.0115f, \r
-0.6698f, -0.6907f, 0.2723f, \r
--0.8995f, 0.2429f, -0.3629f, \r
--0.6366f, -0.447f, -0.6283f, \r
-0.3501f, 0.4045f, -0.8448f, \r
--0.01f, -0.0605f, 0.9981f, \r
--0.8003f, 0.4978f, -0.334f, \r
-0.1684f, 0.8499f, -0.4991f, \r
-0.6665f, -0.6907f, -0.2803f, \r
-0.2251f, 0.9692f, -0.099f, \r
--0.0036f, -0.6024f, 0.7981f, \r
-0.6637f, -0.2967f, -0.6865f, \r
--0.081f, 0.985f, 0.1518f, \r
-0.0084f, 0.2423f, 0.9701f, \r
-0.0071f, -0.9029f, -0.4296f, \r
--0.8679f, 0.4966f, -0.0026f, \r
-0.0123f, 0.5735f, 0.819f, \r
--0.0005f, 0.985f, 0.1719f, \r
-0.6428f, -0.7172f, 0.2688f, \r
-0.6588f, -0.3366f, 0.6727f, \r
-0.1213f, -0.9861f, 0.1128f, \r
--0.8931f, 0.2424f, 0.3787f, \r
--0.1662f, -0.986f, 0.0059f, \r
-0.9994f, 0.0313f, 0.0095f, \r
-0.762f, -0.146f, 0.6308f, \r
--0.7731f, 0.0861f, -0.6283f, \r
--0.6644f, 0.3392f, -0.6659f, \r
--0.0027f, -0.7164f, 0.6976f, \r
-0.0036f, -0.6024f, -0.7981f, \r
-0.9782f, 0.2075f, 0.0011f, \r
-0.0405f, -0.9991f, -0.0018f, \r
-0.6882f, -0.703f, 0.179f, \r
--0.0115f, 0.933f, 0.3595f, \r
-0.0911f, 0.0518f, -0.9944f, \r
-0.0005f, 0.985f, -0.1719f, \r
-0.5337f, -0.5852f, -0.6104f, \r
-0.0042f, -0.6898f, 0.7239f, \r
-0.4863f, 0.2366f, 0.8411f, \r
-0.4991f, 0.8499f, 0.1684f, \r
--0.6543f, 0.7561f, 0.0071f, \r
-0.265f, 0.747f, -0.6096f, \r
--0.329f, 0.4978f, -0.8023f, \r
-0.1662f, -0.986f, -0.0059f, \r
--0.3491f, 0.4045f, -0.8452f, \r
-0.3321f, 0.5936f, 0.733f, \r
--0.065f, 0.9851f, -0.1587f, \r
--0.6283f, -0.447f, 0.6366f, \r
-0.0027f, -0.7164f, -0.6976f, \r
--0.1316f, 0.6339f, 0.762f, \r
--0.5609f, -0.604f, -0.5661f, \r
--0.8452f, 0.4045f, 0.3491f, \r
--0.5263f, 0.8495f, 0.0346f, \r
-0.0115f, 0.933f, -0.3595f, \r
--0.0346f, 0.8495f, -0.5263f, \r
-0.0077f, -0.4109f, 0.9116f, \r
-0.5758f, -0.8175f, -0.0017f, \r
--0.0011f, 0.2075f, 0.9782f, \r
--0.0689f, -0.9861f, -0.1509f, \r
-0.2934f, -0.5928f, -0.7499f, \r
-0.0724f, 0.1198f, -0.9901f, \r
--0.7367f, -0.275f, -0.6176f, \r
--0.3131f, 0.8154f, 0.4868f, \r
--0.0114f, 0.0022f, 0.9999f, \r
-0.6283f, -0.447f, -0.6366f, \r
-0.8452f, 0.4045f, -0.3491f, \r
-0.5263f, 0.8495f, -0.0346f, \r
--0.6383f, -0.4127f, 0.6497f, \r
--0.1719f, 0.985f, -0.0005f, \r
--0.6703f, -0.342f, 0.6585f, \r
--0.0085f, -0.3403f, 0.9402f, \r
--0.646f, 0.4051f, -0.6468f, \r
-0.0011f, 0.2075f, -0.9782f, \r
--0.7216f, -0.3071f, 0.6204f, \r
-0.0282f, 0.0023f, -0.9995f, \r
--0.2483f, 0.6806f, -0.6892f, \r
-0.1518f, 0.985f, 0.081f, \r
-0.047f, 0.0466f, -0.9978f, \r
-0.7354f, -0.6034f, 0.3082f, \r
-0.6919f, 0.2428f, 0.6798f, \r
-0.4086f, -0.3626f, -0.8375f, \r
-0.6383f, -0.4127f, -0.6497f, \r
--0.5875f, 0.5937f, -0.5497f, \r
-0.6703f, -0.342f, -0.6585f, \r
--0.8245f, -0.4464f, 0.3476f, \r
-0.0085f, -0.3403f, -0.9402f, \r
--0.0591f, -0.0663f, 0.996f, \r
-0.0f, -1.0f, 0.0f, \r
-0.4612f, 0.7474f, 0.478f, \r
-0.6976f, -0.7164f, 0.0027f, \r
--0.9148f, 0.4037f, -0.0005f, \r
-0.173f, -0.8158f, -0.5518f, \r
--0.3607f, 0.3387f, 0.8689f, \r
-0.7836f, -0.2411f, 0.5724f, \r
--0.1985f, 0.8026f, -0.5623f, \r
--0.3094f, -0.2556f, -0.9159f, \r
--0.2803f, -0.6907f, -0.6665f, \r
-0.8245f, -0.4464f, -0.3476f, \r
-0.829f, -0.4466f, 0.3365f, \r
--0.4848f, 0.7385f, 0.4683f, \r
-0.1583f, 0.9851f, 0.066f, \r
--0.0077f, 0.7656f, -0.6432f, \r
--0.0162f, 0.985f, 0.1717f, \r
-0.1717f, 0.985f, 0.0162f, \r
-0.0244f, 0.9805f, -0.1949f, \r
--0.2461f, -0.805f, -0.5397f, \r
-0.0262f, 0.5934f, 0.8044f, \r
-0.142f, 0.1881f, 0.9718f, \r
-0.1846f, 0.1002f, 0.9776f, \r
-0.4903f, -0.7178f, 0.4942f, \r
-0.2637f, -0.7172f, 0.6449f, \r
-0.3822f, -0.0678f, 0.9215f, \r
--0.0054f, 0.9691f, -0.2464f, \r
-0.3607f, 0.3387f, -0.8689f, \r
--0.3587f, 0.3388f, -0.8697f, \r
--0.5694f, -0.8219f, 0.0081f, \r
--0.1324f, 0.985f, 0.1096f, \r
--0.099f, 0.9692f, -0.2251f, \r
--0.6702f, 0.4451f, 0.5938f, \r
-0.0077f, -0.9976f, 0.0684f, \r
--0.5661f, -0.604f, 0.5609f, \r
--0.1096f, 0.985f, -0.1324f, \r
--0.6096f, 0.747f, -0.265f, \r
--0.0015f, 0.0295f, -0.9995f, \r
-0.3476f, -0.4464f, 0.8245f, \r
--0.0635f, -0.2552f, 0.9647f, \r
--0.8468f, 0.4454f, 0.2904f, \r
--0.4719f, 0.8502f, 0.233f, \r
--0.0502f, 0.8385f, 0.5425f, \r
--0.6671f, 0.7448f, -0.0116f, \r
-0.3508f, -0.3415f, 0.8719f, \r
--0.4119f, 0.6135f, -0.6736f, \r
--0.2688f, -0.7172f, 0.6428f, \r
--0.4041f, -0.8052f, 0.4337f, \r
--0.375f, 0.2079f, 0.9033f, \r
--0.0223f, -0.9986f, -0.0462f, \r
-0.6702f, 0.4451f, -0.5938f, \r
-0.9402f, -0.3403f, 0.0085f, \r
-0.5661f, -0.604f, -0.5609f, \r
--0.6252f, 0.7406f, 0.246f, \r
--0.0341f, -0.9986f, 0.0383f, \r
--0.6111f, 0.4984f, -0.6148f, \r
-0.6655f, 0.7462f, 0.0117f, \r
-0.1233f, 0.199f, 0.9722f, \r
-0.8468f, 0.4454f, -0.2904f, \r
-0.7383f, 0.2702f, -0.6179f, \r
--0.8055f, 0.4452f, -0.3909f, \r
--0.3729f, 0.208f, -0.9042f, \r
-0.4719f, 0.8502f, -0.233f, \r
-0.243f, 0.747f, 0.6187f, \r
--0.6497f, -0.4127f, -0.6383f, \r
--0.5406f, 0.5651f, -0.623f, \r
-0.0058f, -0.4457f, 0.8951f, \r
--0.3082f, -0.6034f, 0.7354f, \r
--0.8655f, -0.3412f, -0.3666f, \r
-0.2688f, -0.7172f, -0.6428f, \r
-0.4041f, -0.8052f, -0.4337f, \r
-0.375f, 0.2079f, -0.9033f, \r
-0.0341f, -0.9986f, -0.0383f, \r
--0.9701f, 0.2423f, 0.0084f, \r
--0.3807f, -0.0681f, 0.9221f, \r
-0.9643f, -0.2551f, 0.0705f, \r
--0.8758f, 0.4808f, 0.0415f, \r
-0.1207f, 0.9852f, 0.1215f, \r
-0.4821f, 0.7724f, 0.4133f, \r
--0.0522f, 0.9982f, 0.0278f, \r
--0.4337f, -0.8052f, -0.4041f, \r
--0.6164f, 0.4198f, 0.6661f, \r
--0.8448f, 0.4045f, -0.3501f, \r
-0.3082f, -0.6034f, -0.7354f, \r
-0.8689f, 0.3387f, 0.3607f, \r
-0.6894f, -0.7242f, 0.0091f, \r
-0.3787f, 0.2424f, 0.8931f, \r
-0.2904f, 0.4454f, 0.8468f, \r
-0.6148f, 0.4984f, -0.6111f, \r
-0.0501f, 0.985f, 0.1648f, \r
--0.5397f, -0.805f, 0.2461f, \r
--0.9159f, -0.2556f, 0.3094f, \r
-0.706f, -0.0681f, 0.7048f, \r
--0.3341f, 0.4972f, 0.8006f, \r
-0.556f, -0.8049f, 0.2071f, \r
--0.1774f, 0.9693f, -0.1697f, \r
-0.6907f, 0.2083f, 0.6924f, \r
-0.1263f, 0.9332f, 0.3361f, \r
-0.3807f, -0.0681f, -0.9221f, \r
--0.1556f, -0.9861f, -0.0578f, \r
--0.3271f, 0.9333f, -0.1478f, \r
--0.3465f, 0.8505f, 0.3955f, \r
-0.5315f, 0.8438f, -0.0735f, \r
-0.9737f, 0.2276f, -0.0003f, \r
-0.6441f, 0.7648f, -0.0112f, \r
--0.7239f, -0.6898f, 0.0042f, \r
--0.7532f, 0.5939f, -0.2824f, \r
-0.1093f, 0.1415f, -0.9838f, \r
-0.5397f, -0.805f, -0.2461f, \r
--0.7981f, -0.6024f, -0.0036f, \r
-0.9456f, 0.3251f, -0.0052f, \r
-0.1278f, 0.9696f, -0.2085f, \r
-0.0208f, -0.8044f, 0.5936f, \r
-0.1635f, 0.1348f, -0.9772f, \r
--0.733f, 0.5936f, 0.3321f, \r
--0.0505f, 0.9852f, -0.1635f, \r
-0.4089f, -0.9069f, -0.1015f, \r
--0.0029f, -0.9986f, -0.0514f, \r
--0.1796f, 0.814f, -0.5522f, \r
-0.9221f, -0.0681f, 0.3807f, \r
-0.0383f, -0.9986f, 0.0341f, \r
-0.6369f, -0.2562f, 0.727f, \r
-0.3465f, 0.8505f, -0.3955f, \r
--0.2452f, 0.9334f, -0.2615f, \r
-0.4921f, -0.247f, 0.8346f, \r
--0.9976f, -0.0678f, 0.0008f, \r
--0.5396f, 0.8418f, -0.0094f, \r
-0.2294f, 0.9692f, 0.0888f, \r
-0.7239f, -0.6898f, -0.0042f, \r
--0.4472f, 0.5952f, 0.6675f, \r
--0.6449f, -0.7172f, 0.2637f, \r
-0.4543f, 0.2732f, -0.8478f, \r
--0.6798f, 0.2428f, 0.6919f, \r
--0.5938f, 0.4451f, -0.6702f, \r
-0.733f, 0.5936f, -0.3321f, \r
--0.3955f, 0.8505f, -0.3465f, \r
--0.5139f, -0.6913f, -0.5078f, \r
--0.623f, -0.5156f, -0.5881f\r
-};\r
-\r
-/* 1 color   */\r
-/*255 255 0  */\r
-\r
-/* 1024 faces */\r
-/* numIdx fidx0 fidx1 fidx2 nidx0 nidx1 nidx2 coloridx */\r
-\r
-const int numFaces = 1024;\r
-const int faces[1024][8] = {\r
-3, 0, 5, 6, 255, 295, 309, 0,\r
-3, 6, 1, 0, 309, 465, 255, 0,\r
-3, 1, 6, 7, 465, 309, 134, 0,\r
-3, 7, 2, 1, 134, 4, 465, 0,\r
-3, 2, 7, 8, 4, 134, 165, 0,\r
-3, 8, 3, 2, 165, 448, 4, 0,\r
-3, 3, 8, 9, 448, 165, 49, 0,\r
-3, 9, 4, 3, 49, 116, 448, 0,\r
-3, 5, 10, 11, 295, 248, 106, 0,\r
-3, 11, 6, 5, 106, 309, 295, 0,\r
-3, 6, 11, 12, 309, 106, 102, 0,\r
-3, 12, 7, 6, 102, 134, 309, 0,\r
-3, 7, 12, 13, 134, 102, 394, 0,\r
-3, 13, 8, 7, 394, 165, 134, 0,\r
-3, 8, 13, 14, 165, 394, 180, 0,\r
-3, 14, 9, 8, 180, 49, 165, 0,\r
-3, 10, 15, 16, 248, 401, 211, 0,\r
-3, 16, 11, 10, 211, 106, 248, 0,\r
-3, 11, 16, 17, 106, 211, 427, 0,\r
-3, 17, 12, 11, 427, 102, 106, 0,\r
-3, 12, 17, 18, 102, 427, 455, 0,\r
-3, 18, 13, 12, 455, 394, 102, 0,\r
-3, 13, 18, 19, 394, 455, 74, 0,\r
-3, 19, 14, 13, 74, 180, 394, 0,\r
-3, 15, 20, 21, 401, 174, 182, 0,\r
-3, 21, 16, 15, 182, 211, 401, 0,\r
-3, 16, 21, 22, 211, 182, 507, 0,\r
-3, 22, 17, 16, 507, 427, 211, 0,\r
-3, 17, 22, 23, 427, 507, 5, 0,\r
-3, 23, 18, 17, 5, 455, 427, 0,\r
-3, 18, 23, 24, 455, 5, 234, 0,\r
-3, 24, 19, 18, 234, 74, 455, 0,\r
-3, 20, 25, 26, 174, 386, 20, 0,\r
-3, 26, 21, 20, 20, 182, 174, 0,\r
-3, 21, 26, 27, 182, 20, 410, 0,\r
-3, 27, 22, 21, 410, 507, 182, 0,\r
-3, 22, 27, 28, 507, 410, 23, 0,\r
-3, 28, 23, 22, 23, 5, 507, 0,\r
-3, 23, 28, 29, 5, 23, 485, 0,\r
-3, 29, 24, 23, 485, 234, 5, 0,\r
-3, 25, 30, 31, 386, 69, 305, 0,\r
-3, 31, 26, 25, 305, 20, 386, 0,\r
-3, 26, 31, 32, 20, 305, 503, 0,\r
-3, 32, 27, 26, 503, 410, 20, 0,\r
-3, 27, 32, 33, 410, 503, 405, 0,\r
-3, 33, 28, 27, 405, 23, 410, 0,\r
-3, 28, 33, 34, 23, 405, 138, 0,\r
-3, 34, 29, 28, 138, 485, 23, 0,\r
-3, 30, 35, 36, 69, 115, 193, 0,\r
-3, 36, 31, 30, 193, 305, 69, 0,\r
-3, 31, 36, 37, 305, 193, 270, 0,\r
-3, 37, 32, 31, 270, 503, 305, 0,\r
-3, 32, 37, 38, 503, 270, 445, 0,\r
-3, 38, 33, 32, 445, 405, 503, 0,\r
-3, 33, 38, 39, 405, 445, 28, 0,\r
-3, 39, 34, 33, 28, 138, 405, 0,\r
-3, 35, 40, 41, 115, 467, 495, 0,\r
-3, 41, 36, 35, 495, 193, 115, 0,\r
-3, 36, 41, 42, 193, 495, 11, 0,\r
-3, 42, 37, 36, 11, 270, 193, 0,\r
-3, 37, 42, 43, 270, 11, 435, 0,\r
-3, 43, 38, 37, 435, 445, 270, 0,\r
-3, 38, 43, 44, 445, 435, 322, 0,\r
-3, 44, 39, 38, 322, 28, 445, 0,\r
-3, 40, 45, 46, 467, 27, 44, 0,\r
-3, 46, 41, 40, 44, 495, 467, 0,\r
-3, 41, 46, 47, 495, 44, 409, 0,\r
-3, 47, 42, 41, 409, 11, 495, 0,\r
-3, 42, 47, 48, 11, 409, 428, 0,\r
-3, 48, 43, 42, 428, 435, 11, 0,\r
-3, 43, 48, 49, 435, 428, 313, 0,\r
-3, 49, 44, 43, 313, 322, 435, 0,\r
-3, 45, 50, 51, 27, 513, 385, 0,\r
-3, 51, 46, 45, 385, 44, 27, 0,\r
-3, 46, 51, 52, 44, 385, 382, 0,\r
-3, 52, 47, 46, 382, 409, 44, 0,\r
-3, 47, 52, 53, 409, 382, 124, 0,\r
-3, 53, 48, 47, 124, 428, 409, 0,\r
-3, 48, 53, 54, 428, 124, 447, 0,\r
-3, 54, 49, 48, 447, 313, 428, 0,\r
-3, 50, 55, 56, 513, 136, 478, 0,\r
-3, 56, 51, 50, 478, 385, 513, 0,\r
-3, 51, 56, 57, 385, 478, 161, 0,\r
-3, 57, 52, 51, 161, 382, 385, 0,\r
-3, 52, 57, 58, 382, 161, 181, 0,\r
-3, 58, 53, 52, 181, 124, 382, 0,\r
-3, 53, 58, 59, 124, 181, 348, 0,\r
-3, 59, 54, 53, 348, 447, 124, 0,\r
-3, 55, 60, 61, 136, 431, 320, 0,\r
-3, 61, 56, 55, 320, 478, 136, 0,\r
-3, 56, 61, 62, 478, 320, 481, 0,\r
-3, 62, 57, 56, 481, 161, 478, 0,\r
-3, 57, 62, 63, 161, 481, 53, 0,\r
-3, 63, 58, 57, 53, 181, 161, 0,\r
-3, 58, 63, 64, 181, 53, 257, 0,\r
-3, 64, 59, 58, 257, 348, 181, 0,\r
-3, 60, 65, 66, 431, 135, 37, 0,\r
-3, 66, 61, 60, 37, 320, 431, 0,\r
-3, 61, 66, 67, 320, 37, 408, 0,\r
-3, 67, 62, 61, 408, 481, 320, 0,\r
-3, 62, 67, 68, 481, 408, 347, 0,\r
-3, 68, 63, 62, 347, 53, 481, 0,\r
-3, 63, 68, 69, 53, 347, 104, 0,\r
-3, 69, 64, 63, 104, 257, 53, 0,\r
-3, 65, 70, 71, 135, 191, 524, 0,\r
-3, 71, 66, 65, 524, 37, 135, 0,\r
-3, 66, 71, 72, 37, 524, 319, 0,\r
-3, 72, 67, 66, 319, 408, 37, 0,\r
-3, 67, 72, 73, 408, 319, 183, 0,\r
-3, 73, 68, 67, 183, 347, 408, 0,\r
-3, 68, 73, 74, 347, 183, 480, 0,\r
-3, 74, 69, 68, 480, 104, 347, 0,\r
-3, 70, 75, 76, 191, 483, 328, 0,\r
-3, 76, 71, 70, 328, 524, 191, 0,\r
-3, 71, 76, 77, 524, 328, 422, 0,\r
-3, 77, 72, 71, 422, 319, 524, 0,\r
-3, 72, 77, 78, 319, 422, 151, 0,\r
-3, 78, 73, 72, 151, 183, 319, 0,\r
-3, 73, 78, 79, 183, 151, 273, 0,\r
-3, 79, 74, 73, 273, 480, 183, 0,\r
-3, 75, 0, 1, 483, 255, 465, 0,\r
-3, 1, 76, 75, 465, 328, 483, 0,\r
-3, 76, 1, 2, 328, 465, 4, 0,\r
-3, 2, 77, 76, 4, 422, 328, 0,\r
-3, 77, 2, 3, 422, 4, 448, 0,\r
-3, 3, 78, 77, 448, 151, 422, 0,\r
-3, 78, 3, 4, 151, 448, 116, 0,\r
-3, 4, 79, 78, 116, 273, 151, 0,\r
-3, 4, 9, 84, 116, 49, 220, 0,\r
-3, 84, 80, 4, 220, 131, 116, 0,\r
-3, 80, 84, 85, 131, 220, 476, 0,\r
-3, 85, 81, 80, 476, 26, 131, 0,\r
-3, 81, 85, 86, 26, 476, 38, 0,\r
-3, 86, 82, 81, 38, 336, 26, 0,\r
-3, 82, 86, 87, 336, 38, 511, 0,\r
-3, 87, 83, 82, 511, 1, 336, 0,\r
-3, 9, 14, 88, 49, 180, 103, 0,\r
-3, 88, 84, 9, 103, 220, 49, 0,\r
-3, 84, 88, 89, 220, 103, 62, 0,\r
-3, 89, 85, 84, 62, 476, 220, 0,\r
-3, 85, 89, 90, 476, 62, 488, 0,\r
-3, 90, 86, 85, 488, 38, 476, 0,\r
-3, 86, 90, 91, 38, 488, 484, 0,\r
-3, 91, 87, 86, 484, 511, 38, 0,\r
-3, 14, 19, 92, 180, 74, 78, 0,\r
-3, 92, 88, 14, 78, 103, 180, 0,\r
-3, 88, 92, 93, 103, 78, 154, 0,\r
-3, 93, 89, 88, 154, 62, 103, 0,\r
-3, 89, 93, 94, 62, 154, 190, 0,\r
-3, 94, 90, 89, 190, 488, 62, 0,\r
-3, 90, 94, 95, 488, 190, 417, 0,\r
-3, 95, 91, 90, 417, 484, 488, 0,\r
-3, 19, 24, 96, 74, 234, 81, 0,\r
-3, 96, 92, 19, 81, 78, 74, 0,\r
-3, 92, 96, 97, 78, 81, 274, 0,\r
-3, 97, 93, 92, 274, 154, 78, 0,\r
-3, 93, 97, 98, 154, 274, 363, 0,\r
-3, 98, 94, 93, 363, 190, 154, 0,\r
-3, 94, 98, 99, 190, 363, 304, 0,\r
-3, 99, 95, 94, 304, 417, 190, 0,\r
-3, 24, 29, 100, 234, 485, 287, 0,\r
-3, 100, 96, 24, 287, 81, 234, 0,\r
-3, 96, 100, 101, 81, 287, 398, 0,\r
-3, 101, 97, 96, 398, 274, 81, 0,\r
-3, 97, 101, 102, 274, 398, 440, 0,\r
-3, 102, 98, 97, 440, 363, 274, 0,\r
-3, 98, 102, 103, 363, 440, 466, 0,\r
-3, 103, 99, 98, 466, 304, 363, 0,\r
-3, 29, 34, 104, 485, 138, 268, 0,\r
-3, 104, 100, 29, 268, 287, 485, 0,\r
-3, 100, 104, 105, 287, 268, 252, 0,\r
-3, 105, 101, 100, 252, 398, 287, 0,\r
-3, 101, 105, 106, 398, 252, 141, 0,\r
-3, 106, 102, 101, 141, 440, 398, 0,\r
-3, 102, 106, 107, 440, 141, 18, 0,\r
-3, 107, 103, 102, 18, 466, 440, 0,\r
-3, 34, 39, 108, 138, 28, 357, 0,\r
-3, 108, 104, 34, 357, 268, 138, 0,\r
-3, 104, 108, 109, 268, 357, 127, 0,\r
-3, 109, 105, 104, 127, 252, 268, 0,\r
-3, 105, 109, 110, 252, 127, 228, 0,\r
-3, 110, 106, 105, 228, 141, 252, 0,\r
-3, 106, 110, 111, 141, 228, 33, 0,\r
-3, 111, 107, 106, 33, 18, 141, 0,\r
-3, 39, 44, 112, 28, 322, 396, 0,\r
-3, 112, 108, 39, 396, 357, 28, 0,\r
-3, 108, 112, 113, 357, 396, 294, 0,\r
-3, 113, 109, 108, 294, 127, 357, 0,\r
-3, 109, 113, 114, 127, 294, 56, 0,\r
-3, 114, 110, 109, 56, 228, 127, 0,\r
-3, 110, 114, 115, 228, 56, 517, 0,\r
-3, 115, 111, 110, 517, 33, 228, 0,\r
-3, 44, 49, 116, 322, 313, 474, 0,\r
-3, 116, 112, 44, 474, 396, 322, 0,\r
-3, 112, 116, 117, 396, 474, 208, 0,\r
-3, 117, 113, 112, 208, 294, 396, 0,\r
-3, 113, 117, 118, 294, 208, 301, 0,\r
-3, 118, 114, 113, 301, 56, 294, 0,\r
-3, 114, 118, 119, 56, 301, 242, 0,\r
-3, 119, 115, 114, 242, 517, 56, 0,\r
-3, 49, 54, 120, 313, 447, 377, 0,\r
-3, 120, 116, 49, 377, 474, 313, 0,\r
-3, 116, 120, 121, 474, 377, 333, 0,\r
-3, 121, 117, 116, 333, 208, 474, 0,\r
-3, 117, 121, 122, 208, 333, 222, 0,\r
-3, 122, 118, 117, 222, 301, 208, 0,\r
-3, 118, 122, 123, 301, 222, 218, 0,\r
-3, 123, 119, 118, 218, 242, 301, 0,\r
-3, 54, 59, 124, 447, 348, 350, 0,\r
-3, 124, 120, 54, 350, 377, 447, 0,\r
-3, 120, 124, 125, 377, 350, 420, 0,\r
-3, 125, 121, 120, 420, 333, 377, 0,\r
-3, 121, 125, 126, 333, 420, 453, 0,\r
-3, 126, 122, 121, 453, 222, 333, 0,\r
-3, 122, 126, 127, 222, 453, 147, 0,\r
-3, 127, 123, 122, 147, 218, 222, 0,\r
-3, 59, 64, 128, 348, 257, 95, 0,\r
-3, 128, 124, 59, 95, 350, 348, 0,\r
-3, 124, 128, 129, 350, 95, 293, 0,\r
-3, 129, 125, 124, 293, 420, 350, 0,\r
-3, 125, 129, 130, 420, 293, 378, 0,\r
-3, 130, 126, 125, 378, 453, 420, 0,\r
-3, 126, 130, 131, 453, 378, 29, 0,\r
-3, 131, 127, 126, 29, 147, 453, 0,\r
-3, 64, 69, 132, 257, 104, 311, 0,\r
-3, 132, 128, 64, 311, 95, 257, 0,\r
-3, 128, 132, 133, 95, 311, 419, 0,\r
-3, 133, 129, 128, 419, 293, 95, 0,\r
-3, 129, 133, 134, 293, 419, 463, 0,\r
-3, 134, 130, 129, 463, 378, 293, 0,\r
-3, 130, 134, 135, 378, 463, 490, 0,\r
-3, 135, 131, 130, 490, 29, 378, 0,\r
-3, 69, 74, 136, 104, 480, 284, 0,\r
-3, 136, 132, 69, 284, 311, 104, 0,\r
-3, 132, 136, 137, 311, 284, 269, 0,\r
-3, 137, 133, 132, 269, 419, 311, 0,\r
-3, 133, 137, 138, 419, 269, 164, 0,\r
-3, 138, 134, 133, 164, 463, 419, 0,\r
-3, 134, 138, 139, 463, 164, 45, 0,\r
-3, 139, 135, 134, 45, 490, 463, 0,\r
-3, 74, 79, 140, 480, 273, 371, 0,\r
-3, 140, 136, 74, 371, 284, 480, 0,\r
-3, 136, 140, 141, 284, 371, 148, 0,\r
-3, 141, 137, 136, 148, 269, 284, 0,\r
-3, 137, 141, 142, 269, 148, 251, 0,\r
-3, 142, 138, 137, 251, 164, 269, 0,\r
-3, 138, 142, 143, 164, 251, 54, 0,\r
-3, 143, 139, 138, 54, 45, 164, 0,\r
-3, 79, 4, 80, 273, 116, 131, 0,\r
-3, 80, 140, 79, 131, 371, 273, 0,\r
-3, 140, 80, 81, 371, 131, 26, 0,\r
-3, 81, 141, 140, 26, 148, 371, 0,\r
-3, 141, 81, 82, 148, 26, 336, 0,\r
-3, 82, 142, 141, 336, 251, 148, 0,\r
-3, 142, 82, 83, 251, 336, 1, 0,\r
-3, 83, 143, 142, 1, 54, 251, 0,\r
-3, 83, 87, 148, 1, 511, 404, 0,\r
-3, 148, 144, 83, 404, 276, 1, 0,\r
-3, 144, 148, 149, 276, 404, 308, 0,\r
-3, 149, 145, 144, 308, 520, 276, 0,\r
-3, 145, 149, 150, 520, 308, 325, 0,\r
-3, 150, 146, 145, 325, 395, 520, 0,\r
-3, 146, 150, 151, 395, 325, 384, 0,\r
-3, 151, 147, 146, 384, 246, 395, 0,\r
-3, 87, 91, 152, 511, 484, 47, 0,\r
-3, 152, 148, 87, 47, 404, 511, 0,\r
-3, 148, 152, 153, 404, 47, 272, 0,\r
-3, 153, 149, 148, 272, 308, 404, 0,\r
-3, 149, 153, 154, 308, 272, 415, 0,\r
-3, 154, 150, 149, 415, 325, 308, 0,\r
-3, 150, 154, 155, 325, 415, 83, 0,\r
-3, 155, 151, 150, 83, 384, 325, 0,\r
-3, 91, 95, 156, 484, 417, 430, 0,\r
-3, 156, 152, 91, 430, 47, 484, 0,\r
-3, 152, 156, 157, 47, 430, 137, 0,\r
-3, 157, 153, 152, 137, 272, 47, 0,\r
-3, 153, 157, 158, 272, 137, 416, 0,\r
-3, 158, 154, 153, 416, 415, 272, 0,\r
-3, 154, 158, 159, 415, 416, 297, 0,\r
-3, 159, 155, 154, 297, 83, 415, 0,\r
-3, 95, 99, 160, 417, 304, 458, 0,\r
-3, 160, 156, 95, 458, 430, 417, 0,\r
-3, 156, 160, 161, 430, 458, 343, 0,\r
-3, 161, 157, 156, 343, 137, 430, 0,\r
-3, 157, 161, 162, 137, 343, 334, 0,\r
-3, 162, 158, 157, 334, 416, 137, 0,\r
-3, 158, 162, 163, 416, 334, 317, 0,\r
-3, 163, 159, 158, 317, 297, 416, 0,\r
-3, 99, 103, 164, 304, 466, 187, 0,\r
-3, 164, 160, 99, 187, 458, 304, 0,\r
-3, 160, 164, 165, 458, 187, 117, 0,\r
-3, 165, 161, 160, 117, 343, 458, 0,\r
-3, 161, 165, 166, 343, 117, 438, 0,\r
-3, 166, 162, 161, 438, 334, 343, 0,\r
-3, 162, 166, 167, 334, 438, 459, 0,\r
-3, 167, 163, 162, 459, 317, 334, 0,\r
-3, 103, 107, 168, 466, 18, 353, 0,\r
-3, 168, 164, 103, 353, 187, 466, 0,\r
-3, 164, 168, 169, 187, 353, 123, 0,\r
-3, 169, 165, 164, 123, 117, 187, 0,\r
-3, 165, 169, 170, 117, 123, 168, 0,\r
-3, 170, 166, 165, 168, 438, 117, 0,\r
-3, 166, 170, 171, 438, 168, 426, 0,\r
-3, 171, 167, 166, 426, 459, 438, 0,\r
-3, 107, 111, 172, 18, 33, 390, 0,\r
-3, 172, 168, 107, 390, 353, 18, 0,\r
-3, 168, 172, 173, 353, 390, 290, 0,\r
-3, 173, 169, 168, 290, 123, 353, 0,\r
-3, 169, 173, 174, 123, 290, 522, 0,\r
-3, 174, 170, 169, 522, 168, 123, 0,\r
-3, 170, 174, 175, 168, 522, 87, 0,\r
-3, 175, 171, 170, 87, 426, 168, 0,\r
-3, 111, 115, 176, 33, 517, 260, 0,\r
-3, 176, 172, 111, 260, 390, 33, 0,\r
-3, 172, 176, 177, 390, 260, 497, 0,\r
-3, 177, 173, 172, 497, 290, 390, 0,\r
-3, 173, 177, 178, 290, 497, 126, 0,\r
-3, 178, 174, 173, 126, 522, 290, 0,\r
-3, 174, 178, 179, 522, 126, 501, 0,\r
-3, 179, 175, 174, 501, 87, 522, 0,\r
-3, 115, 119, 180, 517, 242, 130, 0,\r
-3, 180, 176, 115, 130, 260, 517, 0,\r
-3, 176, 180, 181, 260, 130, 34, 0,\r
-3, 181, 177, 176, 34, 497, 260, 0,\r
-3, 177, 181, 182, 497, 34, 46, 0,\r
-3, 182, 178, 177, 46, 126, 497, 0,\r
-3, 178, 182, 183, 126, 46, 105, 0,\r
-3, 183, 179, 178, 105, 501, 126, 0,\r
-3, 119, 123, 184, 242, 218, 310, 0,\r
-3, 184, 180, 119, 310, 130, 242, 0,\r
-3, 180, 184, 185, 130, 310, 528, 0,\r
-3, 185, 181, 180, 528, 34, 130, 0,\r
-3, 181, 185, 186, 34, 528, 145, 0,\r
-3, 186, 182, 181, 145, 46, 34, 0,\r
-3, 182, 186, 187, 46, 145, 356, 0,\r
-3, 187, 183, 182, 356, 105, 46, 0,\r
-3, 123, 127, 188, 218, 147, 156, 0,\r
-3, 188, 184, 123, 156, 310, 218, 0,\r
-3, 184, 188, 189, 310, 156, 402, 0,\r
-3, 189, 185, 184, 402, 528, 310, 0,\r
-3, 185, 189, 190, 528, 402, 146, 0,\r
-3, 190, 186, 185, 146, 145, 528, 0,\r
-3, 186, 190, 191, 145, 146, 17, 0,\r
-3, 191, 187, 186, 17, 356, 145, 0,\r
-3, 127, 131, 192, 147, 29, 184, 0,\r
-3, 192, 188, 127, 184, 156, 147, 0,\r
-3, 188, 192, 193, 156, 184, 63, 0,\r
-3, 193, 189, 188, 63, 402, 156, 0,\r
-3, 189, 193, 194, 402, 63, 354, 0,\r
-3, 194, 190, 189, 354, 146, 402, 0,\r
-3, 190, 194, 195, 146, 354, 335, 0,\r
-3, 195, 191, 190, 335, 17, 146, 0,\r
-3, 131, 135, 196, 29, 490, 210, 0,\r
-3, 196, 192, 131, 210, 184, 29, 0,\r
-3, 192, 196, 197, 184, 210, 129, 0,\r
-3, 197, 193, 192, 129, 63, 184, 0,\r
-3, 193, 197, 198, 63, 129, 461, 0,\r
-3, 198, 194, 193, 461, 354, 63, 0,\r
-3, 194, 198, 199, 354, 461, 475, 0,\r
-3, 199, 195, 194, 475, 335, 354, 0,\r
-3, 135, 139, 200, 490, 45, 370, 0,\r
-3, 200, 196, 135, 370, 210, 490, 0,\r
-3, 196, 200, 201, 210, 370, 143, 0,\r
-3, 201, 197, 196, 143, 129, 210, 0,\r
-3, 197, 201, 202, 129, 143, 195, 0,\r
-3, 202, 198, 197, 195, 461, 129, 0,\r
-3, 198, 202, 203, 461, 195, 444, 0,\r
-3, 203, 199, 198, 444, 475, 461, 0,\r
-3, 139, 143, 204, 45, 54, 403, 0,\r
-3, 204, 200, 139, 403, 370, 45, 0,\r
-3, 200, 204, 205, 370, 403, 315, 0,\r
-3, 205, 201, 200, 315, 143, 370, 0,\r
-3, 201, 205, 206, 143, 315, 7, 0,\r
-3, 206, 202, 201, 7, 195, 143, 0,\r
-3, 202, 206, 207, 195, 7, 101, 0,\r
-3, 207, 203, 202, 101, 444, 195, 0,\r
-3, 143, 83, 144, 54, 1, 276, 0,\r
-3, 144, 204, 143, 276, 403, 54, 0,\r
-3, 204, 144, 145, 403, 276, 520, 0,\r
-3, 145, 205, 204, 520, 315, 403, 0,\r
-3, 205, 145, 146, 315, 520, 395, 0,\r
-3, 146, 206, 205, 395, 7, 315, 0,\r
-3, 206, 146, 147, 7, 395, 246, 0,\r
-3, 147, 207, 206, 246, 101, 7, 0,\r
-3, 147, 151, 212, 246, 384, 486, 0,\r
-3, 212, 208, 147, 486, 279, 246, 0,\r
-3, 208, 212, 213, 279, 486, 231, 0,\r
-3, 213, 209, 208, 231, 349, 279, 0,\r
-3, 209, 213, 214, 349, 231, 0, 0,\r
-3, 214, 210, 209, 0, 216, 349, 0,\r
-3, 210, 214, 211, 216, 0, 393, 0,\r
-3, 211, 211, 210, 393, 393, 216, 0,\r
-3, 151, 155, 215, 384, 83, 215, 0,\r
-3, 215, 212, 151, 215, 486, 384, 0,\r
-3, 212, 215, 216, 486, 215, 327, 0,\r
-3, 216, 213, 212, 327, 231, 486, 0,\r
-3, 213, 216, 217, 231, 327, 512, 0,\r
-3, 217, 214, 213, 512, 0, 231, 0,\r
-3, 214, 217, 211, 0, 512, 393, 0,\r
-3, 211, 211, 214, 393, 393, 0, 0,\r
-3, 155, 159, 218, 83, 297, 149, 0,\r
-3, 218, 215, 155, 149, 215, 83, 0,\r
-3, 215, 218, 219, 215, 149, 91, 0,\r
-3, 219, 216, 215, 91, 327, 215, 0,\r
-3, 216, 219, 220, 327, 91, 177, 0,\r
-3, 220, 217, 216, 177, 512, 327, 0,\r
-3, 217, 220, 211, 512, 177, 393, 0,\r
-3, 211, 211, 217, 393, 393, 512, 0,\r
-3, 159, 163, 221, 297, 317, 504, 0,\r
-3, 221, 218, 159, 504, 149, 297, 0,\r
-3, 218, 221, 222, 149, 504, 285, 0,\r
-3, 222, 219, 218, 285, 91, 149, 0,\r
-3, 219, 222, 223, 91, 285, 254, 0,\r
-3, 223, 220, 219, 254, 177, 91, 0,\r
-3, 220, 223, 211, 177, 254, 393, 0,\r
-3, 211, 211, 220, 393, 393, 177, 0,\r
-3, 163, 167, 224, 317, 459, 125, 0,\r
-3, 224, 221, 163, 125, 504, 317, 0,\r
-3, 221, 224, 225, 504, 125, 162, 0,\r
-3, 225, 222, 221, 162, 285, 504, 0,\r
-3, 222, 225, 226, 285, 162, 278, 0,\r
-3, 226, 223, 222, 278, 254, 285, 0,\r
-3, 223, 226, 211, 254, 278, 393, 0,\r
-3, 211, 211, 223, 393, 393, 254, 0,\r
-3, 167, 171, 227, 459, 426, 439, 0,\r
-3, 227, 224, 167, 439, 125, 459, 0,\r
-3, 224, 227, 228, 125, 439, 60, 0,\r
-3, 228, 225, 224, 60, 162, 125, 0,\r
-3, 225, 228, 229, 162, 60, 446, 0,\r
-3, 229, 226, 225, 446, 278, 162, 0,\r
-3, 226, 229, 211, 278, 446, 393, 0,\r
-3, 211, 211, 226, 393, 393, 278, 0,\r
-3, 171, 175, 230, 426, 87, 482, 0,\r
-3, 230, 227, 171, 482, 439, 426, 0,\r
-3, 227, 230, 231, 439, 482, 92, 0,\r
-3, 231, 228, 227, 92, 60, 439, 0,\r
-3, 228, 231, 232, 60, 92, 110, 0,\r
-3, 232, 229, 228, 110, 446, 60, 0,\r
-3, 229, 232, 211, 446, 110, 393, 0,\r
-3, 211, 211, 229, 393, 393, 446, 0,\r
-3, 175, 179, 233, 87, 501, 261, 0,\r
-3, 233, 230, 175, 261, 482, 87, 0,\r
-3, 230, 233, 234, 482, 261, 329, 0,\r
-3, 234, 231, 230, 329, 92, 482, 0,\r
-3, 231, 234, 235, 92, 329, 192, 0,\r
-3, 235, 232, 231, 192, 110, 92, 0,\r
-3, 232, 235, 211, 110, 192, 393, 0,\r
-3, 211, 211, 232, 393, 393, 110, 0,\r
-3, 179, 183, 236, 501, 105, 219, 0,\r
-3, 236, 233, 179, 219, 261, 501, 0,\r
-3, 233, 236, 237, 261, 219, 491, 0,\r
-3, 237, 234, 233, 491, 329, 261, 0,\r
-3, 234, 237, 238, 329, 491, 267, 0,\r
-3, 238, 235, 234, 267, 192, 329, 0,\r
-3, 235, 238, 211, 192, 267, 393, 0,\r
-3, 211, 211, 235, 393, 393, 192, 0,\r
-3, 183, 187, 239, 105, 356, 472, 0,\r
-3, 239, 236, 183, 472, 219, 105, 0,\r
-3, 236, 239, 240, 219, 472, 48, 0,\r
-3, 240, 237, 236, 48, 491, 219, 0,\r
-3, 237, 240, 241, 491, 48, 247, 0,\r
-3, 241, 238, 237, 247, 267, 491, 0,\r
-3, 238, 241, 211, 267, 247, 393, 0,\r
-3, 211, 211, 238, 393, 393, 267, 0,\r
-3, 187, 191, 242, 356, 17, 411, 0,\r
-3, 242, 239, 187, 411, 472, 356, 0,\r
-3, 239, 242, 243, 472, 411, 364, 0,\r
-3, 243, 240, 239, 364, 48, 472, 0,\r
-3, 240, 243, 244, 48, 364, 441, 0,\r
-3, 244, 241, 240, 441, 247, 48, 0,\r
-3, 241, 244, 211, 247, 441, 393, 0,\r
-3, 211, 211, 241, 393, 393, 247, 0,\r
-3, 191, 195, 245, 17, 335, 239, 0,\r
-3, 245, 242, 191, 239, 411, 17, 0,\r
-3, 242, 245, 246, 411, 239, 13, 0,\r
-3, 246, 243, 242, 13, 364, 411, 0,\r
-3, 243, 246, 247, 364, 13, 509, 0,\r
-3, 247, 244, 243, 509, 441, 364, 0,\r
-3, 244, 247, 211, 441, 509, 393, 0,\r
-3, 211, 211, 244, 393, 393, 441, 0,\r
-3, 195, 199, 248, 335, 475, 144, 0,\r
-3, 248, 245, 195, 144, 239, 335, 0,\r
-3, 245, 248, 249, 239, 144, 179, 0,\r
-3, 249, 246, 245, 179, 13, 239, 0,\r
-3, 246, 249, 250, 13, 179, 298, 0,\r
-3, 250, 247, 246, 298, 509, 13, 0,\r
-3, 247, 250, 211, 509, 298, 393, 0,\r
-3, 211, 211, 247, 393, 393, 509, 0,\r
-3, 199, 203, 251, 475, 444, 462, 0,\r
-3, 251, 248, 199, 462, 144, 475, 0,\r
-3, 248, 251, 252, 144, 462, 76, 0,\r
-3, 252, 249, 248, 76, 179, 144, 0,\r
-3, 249, 252, 253, 179, 76, 464, 0,\r
-3, 253, 250, 249, 464, 298, 179, 0,\r
-3, 250, 253, 211, 298, 464, 393, 0,\r
-3, 211, 211, 250, 393, 393, 298, 0,\r
-3, 203, 207, 254, 444, 101, 500, 0,\r
-3, 254, 251, 203, 500, 462, 444, 0,\r
-3, 251, 254, 255, 462, 500, 113, 0,\r
-3, 255, 252, 251, 113, 76, 462, 0,\r
-3, 252, 255, 256, 76, 113, 128, 0,\r
-3, 256, 253, 252, 128, 464, 76, 0,\r
-3, 253, 256, 211, 464, 128, 393, 0,\r
-3, 211, 211, 253, 393, 393, 464, 0,\r
-3, 207, 147, 208, 101, 246, 279, 0,\r
-3, 208, 254, 207, 279, 500, 101, 0,\r
-3, 254, 208, 209, 500, 279, 349, 0,\r
-3, 209, 255, 254, 349, 113, 500, 0,\r
-3, 255, 209, 210, 113, 349, 216, 0,\r
-3, 210, 256, 255, 216, 128, 113, 0,\r
-3, 256, 210, 211, 128, 216, 393, 0,\r
-3, 211, 211, 256, 393, 393, 128, 0,\r
-3, 257, 262, 263, 425, 244, 58, 0,\r
-3, 263, 258, 257, 58, 337, 425, 0,\r
-3, 258, 263, 264, 337, 58, 214, 0,\r
-3, 264, 259, 258, 214, 236, 337, 0,\r
-3, 259, 264, 265, 236, 214, 266, 0,\r
-3, 265, 260, 259, 266, 32, 236, 0,\r
-3, 260, 265, 266, 32, 266, 331, 0,\r
-3, 266, 261, 260, 331, 109, 32, 0,\r
-3, 262, 267, 268, 244, 233, 369, 0,\r
-3, 268, 263, 262, 369, 58, 244, 0,\r
-3, 263, 268, 269, 58, 369, 71, 0,\r
-3, 269, 264, 263, 71, 214, 58, 0,\r
-3, 264, 269, 270, 214, 71, 392, 0,\r
-3, 270, 265, 264, 392, 266, 214, 0,\r
-3, 265, 270, 271, 266, 392, 312, 0,\r
-3, 271, 266, 265, 312, 331, 266, 0,\r
-3, 267, 272, 273, 233, 12, 434, 0,\r
-3, 273, 268, 267, 434, 369, 233, 0,\r
-3, 268, 273, 274, 369, 434, 188, 0,\r
-3, 274, 269, 268, 188, 71, 369, 0,\r
-3, 269, 274, 275, 71, 188, 201, 0,\r
-3, 275, 270, 269, 201, 392, 71, 0,\r
-3, 270, 275, 276, 392, 201, 238, 0,\r
-3, 276, 271, 270, 238, 312, 392, 0,\r
-3, 272, 277, 278, 12, 142, 114, 0,\r
-3, 278, 273, 272, 114, 434, 12, 0,\r
-3, 273, 278, 279, 434, 114, 173, 0,\r
-3, 279, 274, 273, 173, 188, 434, 0,\r
-3, 274, 279, 280, 188, 173, 14, 0,\r
-3, 280, 275, 274, 14, 201, 188, 0,\r
-3, 275, 280, 281, 201, 14, 15, 0,\r
-3, 281, 276, 275, 15, 238, 201, 0,\r
-3, 277, 282, 283, 142, 407, 288, 0,\r
-3, 283, 278, 277, 288, 114, 142, 0,\r
-3, 278, 283, 284, 114, 288, 400, 0,\r
-3, 284, 279, 278, 400, 173, 114, 0,\r
-3, 279, 284, 285, 173, 400, 457, 0,\r
-3, 285, 280, 279, 457, 14, 173, 0,\r
-3, 280, 285, 286, 14, 457, 332, 0,\r
-3, 286, 281, 280, 332, 15, 14, 0,\r
-3, 282, 287, 288, 407, 194, 42, 0,\r
-3, 288, 283, 282, 42, 288, 407, 0,\r
-3, 283, 288, 289, 288, 42, 380, 0,\r
-3, 289, 284, 283, 380, 400, 288, 0,\r
-3, 284, 289, 290, 400, 380, 383, 0,\r
-3, 290, 285, 284, 383, 457, 400, 0,\r
-3, 285, 290, 291, 457, 383, 197, 0,\r
-3, 291, 286, 285, 197, 332, 457, 0,\r
-3, 287, 292, 293, 194, 321, 152, 0,\r
-3, 293, 288, 287, 152, 42, 194, 0,\r
-3, 288, 293, 294, 42, 152, 397, 0,\r
-3, 294, 289, 288, 397, 380, 42, 0,\r
-3, 289, 294, 295, 380, 397, 342, 0,\r
-3, 295, 290, 289, 342, 383, 380, 0,\r
-3, 290, 295, 296, 383, 342, 225, 0,\r
-3, 296, 291, 290, 225, 197, 383, 0,\r
-3, 292, 257, 258, 321, 425, 337, 0,\r
-3, 258, 293, 292, 337, 152, 321, 0,\r
-3, 293, 258, 259, 152, 337, 236, 0,\r
-3, 259, 294, 293, 236, 397, 152, 0,\r
-3, 294, 259, 260, 397, 236, 32, 0,\r
-3, 260, 295, 294, 32, 342, 397, 0,\r
-3, 295, 260, 261, 342, 32, 109, 0,\r
-3, 261, 296, 295, 109, 225, 342, 0,\r
-3, 261, 266, 301, 109, 331, 175, 0,\r
-3, 301, 297, 261, 175, 502, 109, 0,\r
-3, 297, 301, 302, 502, 175, 265, 0,\r
-3, 302, 298, 297, 265, 84, 502, 0,\r
-3, 298, 302, 303, 84, 265, 186, 0,\r
-3, 303, 299, 298, 186, 496, 84, 0,\r
-3, 299, 303, 304, 496, 186, 470, 0,\r
-3, 304, 300, 299, 470, 494, 496, 0,\r
-3, 266, 271, 305, 331, 312, 170, 0,\r
-3, 305, 301, 266, 170, 175, 331, 0,\r
-3, 301, 305, 306, 175, 170, 97, 0,\r
-3, 306, 302, 301, 97, 265, 175, 0,\r
-3, 302, 306, 307, 265, 97, 205, 0,\r
-3, 307, 303, 302, 205, 186, 265, 0,\r
-3, 303, 307, 308, 186, 205, 449, 0,\r
-3, 308, 304, 303, 449, 470, 186, 0,\r
-3, 271, 276, 309, 312, 238, 379, 0,\r
-3, 309, 305, 271, 379, 170, 312, 0,\r
-3, 305, 309, 310, 170, 379, 300, 0,\r
-3, 310, 306, 305, 300, 97, 170, 0,\r
-3, 306, 310, 311, 97, 300, 118, 0,\r
-3, 311, 307, 306, 118, 205, 97, 0,\r
-3, 307, 311, 312, 205, 118, 237, 0,\r
-3, 312, 308, 307, 237, 449, 205, 0,\r
-3, 276, 281, 313, 238, 15, 199, 0,\r
-3, 313, 309, 276, 199, 379, 238, 0,\r
-3, 309, 313, 314, 379, 199, 94, 0,\r
-3, 314, 310, 309, 94, 300, 379, 0,\r
-3, 310, 314, 315, 300, 94, 421, 0,\r
-3, 315, 311, 310, 421, 118, 300, 0,\r
-3, 311, 315, 316, 118, 421, 31, 0,\r
-3, 316, 312, 311, 31, 237, 118, 0,\r
-3, 281, 286, 317, 15, 332, 367, 0,\r
-3, 317, 313, 281, 367, 199, 15, 0,\r
-3, 313, 317, 318, 199, 367, 529, 0,\r
-3, 318, 314, 313, 529, 94, 199, 0,\r
-3, 314, 318, 319, 94, 529, 185, 0,\r
-3, 319, 315, 314, 185, 421, 94, 0,\r
-3, 315, 319, 320, 421, 185, 89, 0,\r
-3, 320, 316, 315, 89, 31, 421, 0,\r
-3, 286, 291, 321, 332, 197, 172, 0,\r
-3, 321, 317, 286, 172, 367, 332, 0,\r
-3, 317, 321, 322, 367, 172, 209, 0,\r
-3, 322, 318, 317, 209, 529, 367, 0,\r
-3, 318, 322, 323, 529, 209, 429, 0,\r
-3, 323, 319, 318, 429, 185, 529, 0,\r
-3, 319, 323, 324, 185, 429, 112, 0,\r
-3, 324, 320, 319, 112, 89, 185, 0,\r
-3, 291, 296, 325, 197, 225, 451, 0,\r
-3, 325, 321, 291, 451, 172, 197, 0,\r
-3, 321, 325, 326, 172, 451, 66, 0,\r
-3, 326, 322, 321, 66, 209, 172, 0,\r
-3, 322, 326, 327, 209, 66, 176, 0,\r
-3, 327, 323, 322, 176, 429, 209, 0,\r
-3, 323, 327, 328, 429, 176, 155, 0,\r
-3, 328, 324, 323, 155, 112, 429, 0,\r
-3, 296, 261, 297, 225, 109, 502, 0,\r
-3, 297, 325, 296, 502, 451, 225, 0,\r
-3, 325, 297, 298, 451, 502, 84, 0,\r
-3, 298, 326, 325, 84, 66, 451, 0,\r
-3, 326, 298, 299, 66, 84, 496, 0,\r
-3, 299, 327, 326, 496, 176, 66, 0,\r
-3, 327, 299, 300, 176, 496, 494, 0,\r
-3, 300, 328, 327, 494, 155, 176, 0,\r
-3, 329, 334, 335, 3, 355, 122, 0,\r
-3, 335, 330, 329, 122, 518, 3, 0,\r
-3, 330, 335, 336, 518, 122, 111, 0,\r
-3, 336, 331, 330, 111, 213, 518, 0,\r
-3, 331, 336, 337, 213, 111, 473, 0,\r
-3, 337, 332, 331, 473, 468, 213, 0,\r
-3, 332, 337, 338, 468, 473, 521, 0,\r
-3, 338, 333, 332, 521, 346, 468, 0,\r
-3, 334, 339, 340, 355, 61, 414, 0,\r
-3, 340, 335, 334, 414, 122, 355, 0,\r
-3, 335, 340, 341, 122, 414, 413, 0,\r
-3, 341, 336, 335, 413, 111, 122, 0,\r
-3, 336, 341, 342, 111, 413, 204, 0,\r
-3, 342, 337, 336, 204, 473, 111, 0,\r
-3, 337, 342, 343, 473, 204, 217, 0,\r
-3, 343, 338, 337, 217, 521, 473, 0,\r
-3, 339, 344, 345, 61, 55, 100, 0,\r
-3, 345, 340, 339, 100, 414, 61, 0,\r
-3, 340, 345, 346, 414, 100, 399, 0,\r
-3, 346, 341, 340, 399, 413, 414, 0,\r
-3, 341, 346, 347, 413, 399, 326, 0,\r
-3, 347, 342, 341, 326, 204, 413, 0,\r
-3, 342, 347, 348, 204, 326, 221, 0,\r
-3, 348, 343, 342, 221, 217, 204, 0,\r
-3, 344, 349, 350, 55, 508, 477, 0,\r
-3, 350, 345, 344, 477, 100, 55, 0,\r
-3, 345, 350, 351, 100, 477, 292, 0,\r
-3, 351, 346, 345, 292, 399, 100, 0,\r
-3, 346, 351, 352, 399, 292, 73, 0,\r
-3, 352, 347, 346, 73, 326, 399, 0,\r
-3, 347, 352, 353, 326, 73, 362, 0,\r
-3, 353, 348, 347, 362, 221, 326, 0,\r
-3, 349, 354, 355, 508, 365, 262, 0,\r
-3, 355, 350, 349, 262, 477, 508, 0,\r
-3, 350, 355, 356, 477, 262, 93, 0,\r
-3, 356, 351, 350, 93, 292, 477, 0,\r
-3, 351, 356, 357, 292, 93, 318, 0,\r
-3, 357, 352, 351, 318, 73, 292, 0,\r
-3, 352, 357, 358, 73, 318, 163, 0,\r
-3, 358, 353, 352, 163, 362, 73, 0,\r
-3, 354, 359, 360, 365, 140, 340, 0,\r
-3, 360, 355, 354, 340, 262, 365, 0,\r
-3, 355, 360, 361, 262, 340, 505, 0,\r
-3, 361, 356, 355, 505, 93, 262, 0,\r
-3, 356, 361, 362, 93, 505, 499, 0,\r
-3, 362, 357, 356, 499, 318, 93, 0,\r
-3, 357, 362, 363, 318, 499, 159, 0,\r
-3, 363, 358, 357, 159, 163, 318, 0,\r
-3, 359, 364, 365, 140, 510, 68, 0,\r
-3, 365, 360, 359, 68, 340, 140, 0,\r
-3, 360, 365, 366, 340, 68, 167, 0,\r
-3, 366, 361, 360, 167, 505, 340, 0,\r
-3, 361, 366, 367, 505, 167, 245, 0,\r
-3, 367, 362, 361, 245, 499, 505, 0,\r
-3, 362, 367, 368, 499, 245, 437, 0,\r
-3, 368, 363, 362, 437, 159, 499, 0,\r
-3, 364, 329, 330, 510, 3, 518, 0,\r
-3, 330, 365, 364, 518, 68, 510, 0,\r
-3, 365, 330, 331, 68, 518, 213, 0,\r
-3, 331, 366, 365, 213, 167, 68, 0,\r
-3, 366, 331, 332, 167, 213, 468, 0,\r
-3, 332, 367, 366, 468, 245, 167, 0,\r
-3, 367, 332, 333, 245, 468, 346, 0,\r
-3, 333, 368, 367, 346, 437, 245, 0,\r
-3, 333, 338, 373, 346, 521, 79, 0,\r
-3, 373, 369, 333, 79, 286, 346, 0,\r
-3, 369, 373, 374, 286, 79, 77, 0,\r
-3, 374, 370, 369, 77, 22, 286, 0,\r
-3, 370, 374, 375, 22, 77, 523, 0,\r
-3, 375, 371, 370, 523, 330, 22, 0,\r
-3, 371, 375, 376, 330, 523, 259, 0,\r
-3, 376, 372, 371, 259, 338, 330, 0,\r
-3, 338, 343, 377, 521, 217, 207, 0,\r
-3, 377, 373, 338, 207, 79, 521, 0,\r
-3, 373, 377, 378, 79, 207, 471, 0,\r
-3, 378, 374, 373, 471, 77, 79, 0,\r
-3, 374, 378, 379, 77, 471, 198, 0,\r
-3, 379, 375, 374, 198, 523, 77, 0,\r
-3, 375, 379, 380, 523, 198, 366, 0,\r
-3, 380, 376, 375, 366, 259, 523, 0,\r
-3, 343, 348, 381, 217, 221, 516, 0,\r
-3, 381, 377, 343, 516, 207, 217, 0,\r
-3, 377, 381, 382, 207, 516, 250, 0,\r
-3, 382, 378, 377, 250, 471, 207, 0,\r
-3, 378, 382, 383, 471, 250, 240, 0,\r
-3, 383, 379, 378, 240, 198, 471, 0,\r
-3, 379, 383, 384, 198, 240, 381, 0,\r
-3, 384, 380, 379, 381, 366, 198, 0,\r
-3, 348, 353, 385, 221, 362, 230, 0,\r
-3, 385, 381, 348, 230, 516, 221, 0,\r
-3, 381, 385, 386, 516, 230, 303, 0,\r
-3, 386, 382, 381, 303, 250, 516, 0,\r
-3, 382, 386, 387, 250, 303, 10, 0,\r
-3, 387, 383, 382, 10, 240, 250, 0,\r
-3, 383, 387, 388, 240, 10, 283, 0,\r
-3, 388, 384, 383, 283, 381, 240, 0,\r
-3, 353, 358, 389, 362, 163, 282, 0,\r
-3, 389, 385, 353, 282, 230, 362, 0,\r
-3, 385, 389, 390, 230, 282, 35, 0,\r
-3, 390, 386, 385, 35, 303, 230, 0,\r
-3, 386, 390, 391, 303, 35, 243, 0,\r
-3, 391, 387, 386, 243, 10, 303, 0,\r
-3, 387, 391, 392, 10, 243, 368, 0,\r
-3, 392, 388, 387, 368, 283, 10, 0,\r
-3, 358, 363, 393, 163, 159, 296, 0,\r
-3, 393, 389, 358, 296, 282, 163, 0,\r
-3, 389, 393, 394, 282, 296, 160, 0,\r
-3, 394, 390, 389, 160, 35, 282, 0,\r
-3, 390, 394, 395, 35, 160, 323, 0,\r
-3, 395, 391, 390, 323, 243, 35, 0,\r
-3, 391, 395, 396, 243, 323, 280, 0,\r
-3, 396, 392, 391, 280, 368, 243, 0,\r
-3, 363, 368, 397, 159, 437, 275, 0,\r
-3, 397, 393, 363, 275, 296, 159, 0,\r
-3, 393, 397, 398, 296, 275, 133, 0,\r
-3, 398, 394, 393, 133, 160, 296, 0,\r
-3, 394, 398, 399, 160, 133, 344, 0,\r
-3, 399, 395, 394, 344, 323, 160, 0,\r
-3, 395, 399, 400, 323, 344, 108, 0,\r
-3, 400, 396, 395, 108, 280, 323, 0,\r
-3, 368, 333, 369, 437, 346, 286, 0,\r
-3, 369, 397, 368, 286, 275, 437, 0,\r
-3, 397, 369, 370, 275, 286, 22, 0,\r
-3, 370, 398, 397, 22, 133, 275, 0,\r
-3, 398, 370, 371, 133, 22, 330, 0,\r
-3, 371, 399, 398, 330, 344, 133, 0,\r
-3, 399, 371, 372, 344, 330, 338, 0,\r
-3, 372, 400, 399, 338, 108, 344, 0,\r
-3, 401, 401, 406, 235, 235, 189, 0,\r
-3, 406, 402, 401, 189, 40, 235, 0,\r
-3, 402, 406, 407, 40, 189, 306, 0,\r
-3, 407, 403, 402, 306, 119, 40, 0,\r
-3, 403, 407, 408, 119, 306, 202, 0,\r
-3, 408, 404, 403, 202, 443, 119, 0,\r
-3, 404, 408, 409, 443, 202, 241, 0,\r
-3, 409, 405, 404, 241, 75, 443, 0,\r
-3, 401, 401, 410, 235, 235, 263, 0,\r
-3, 410, 406, 401, 263, 189, 235, 0,\r
-3, 406, 410, 411, 189, 263, 196, 0,\r
-3, 411, 407, 406, 196, 306, 189, 0,\r
-3, 407, 411, 412, 306, 196, 281, 0,\r
-3, 412, 408, 407, 281, 202, 306, 0,\r
-3, 408, 412, 413, 202, 281, 121, 0,\r
-3, 413, 409, 408, 121, 241, 202, 0,\r
-3, 401, 401, 414, 235, 235, 479, 0,\r
-3, 414, 410, 401, 479, 263, 235, 0,\r
-3, 410, 414, 415, 263, 479, 36, 0,\r
-3, 415, 411, 410, 36, 196, 263, 0,\r
-3, 411, 415, 416, 196, 36, 436, 0,\r
-3, 416, 412, 411, 436, 281, 196, 0,\r
-3, 412, 416, 417, 281, 436, 351, 0,\r
-3, 417, 413, 412, 351, 121, 281, 0,\r
-3, 401, 401, 418, 235, 235, 90, 0,\r
-3, 418, 414, 401, 90, 479, 235, 0,\r
-3, 414, 418, 419, 479, 90, 361, 0,\r
-3, 419, 415, 414, 361, 36, 479, 0,\r
-3, 415, 419, 420, 36, 361, 376, 0,\r
-3, 420, 416, 415, 376, 436, 36, 0,\r
-3, 416, 420, 421, 436, 376, 412, 0,\r
-3, 421, 417, 416, 412, 351, 436, 0,\r
-3, 401, 401, 422, 235, 235, 52, 0,\r
-3, 422, 418, 401, 52, 90, 235, 0,\r
-3, 418, 422, 423, 90, 52, 21, 0,\r
-3, 423, 419, 418, 21, 361, 90, 0,\r
-3, 419, 423, 424, 361, 21, 158, 0,\r
-3, 424, 420, 419, 158, 376, 361, 0,\r
-3, 420, 424, 425, 376, 158, 39, 0,\r
-3, 425, 421, 420, 39, 412, 376, 0,\r
-3, 401, 401, 426, 235, 235, 424, 0,\r
-3, 426, 422, 401, 424, 52, 235, 0,\r
-3, 422, 426, 427, 52, 424, 373, 0,\r
-3, 427, 423, 422, 373, 21, 52, 0,\r
-3, 423, 427, 428, 21, 373, 375, 0,\r
-3, 428, 424, 423, 375, 158, 21, 0,\r
-3, 424, 428, 429, 158, 375, 249, 0,\r
-3, 429, 425, 424, 249, 39, 158, 0,\r
-3, 401, 401, 430, 235, 235, 432, 0,\r
-3, 430, 426, 401, 432, 424, 235, 0,\r
-3, 426, 430, 431, 424, 432, 229, 0,\r
-3, 431, 427, 426, 229, 373, 424, 0,\r
-3, 427, 431, 432, 373, 229, 65, 0,\r
-3, 432, 428, 427, 65, 375, 373, 0,\r
-3, 428, 432, 433, 375, 65, 506, 0,\r
-3, 433, 429, 428, 506, 249, 375, 0,\r
-3, 401, 401, 434, 235, 235, 302, 0,\r
-3, 434, 430, 401, 302, 432, 235, 0,\r
-3, 430, 434, 435, 432, 302, 96, 0,\r
-3, 435, 431, 430, 96, 229, 432, 0,\r
-3, 431, 435, 436, 229, 96, 169, 0,\r
-3, 436, 432, 431, 169, 65, 229, 0,\r
-3, 432, 436, 437, 65, 169, 59, 0,\r
-3, 437, 433, 432, 59, 506, 65, 0,\r
-3, 401, 401, 438, 235, 235, 452, 0,\r
-3, 438, 434, 401, 452, 302, 235, 0,\r
-3, 434, 438, 439, 302, 452, 30, 0,\r
-3, 439, 435, 434, 30, 96, 302, 0,\r
-3, 435, 439, 440, 96, 30, 460, 0,\r
-3, 440, 436, 435, 460, 169, 96, 0,\r
-3, 436, 440, 441, 169, 460, 498, 0,\r
-3, 441, 437, 436, 498, 59, 169, 0,\r
-3, 401, 401, 442, 235, 235, 525, 0,\r
-3, 442, 438, 401, 525, 452, 235, 0,\r
-3, 438, 442, 443, 452, 525, 456, 0,\r
-3, 443, 439, 438, 456, 30, 452, 0,\r
-3, 439, 443, 444, 30, 456, 9, 0,\r
-3, 444, 440, 439, 9, 460, 30, 0,\r
-3, 440, 444, 445, 460, 9, 388, 0,\r
-3, 445, 441, 440, 388, 498, 460, 0,\r
-3, 401, 401, 446, 235, 235, 212, 0,\r
-3, 446, 442, 401, 212, 525, 235, 0,\r
-3, 442, 446, 447, 525, 212, 299, 0,\r
-3, 447, 443, 442, 299, 456, 525, 0,\r
-3, 443, 447, 448, 456, 299, 166, 0,\r
-3, 448, 444, 443, 166, 9, 456, 0,\r
-3, 444, 448, 449, 9, 166, 72, 0,\r
-3, 449, 445, 444, 72, 388, 9, 0,\r
-3, 401, 401, 450, 235, 235, 107, 0,\r
-3, 450, 446, 401, 107, 212, 235, 0,\r
-3, 446, 450, 451, 212, 107, 82, 0,\r
-3, 451, 447, 446, 82, 299, 212, 0,\r
-3, 447, 451, 452, 299, 82, 391, 0,\r
-3, 452, 448, 447, 391, 166, 299, 0,\r
-3, 448, 452, 453, 166, 391, 139, 0,\r
-3, 453, 449, 448, 139, 72, 166, 0,\r
-3, 401, 401, 454, 235, 235, 70, 0,\r
-3, 454, 450, 401, 70, 107, 235, 0,\r
-3, 450, 454, 455, 107, 70, 51, 0,\r
-3, 455, 451, 450, 51, 82, 107, 0,\r
-3, 451, 455, 456, 82, 51, 178, 0,\r
-3, 456, 452, 451, 178, 391, 82, 0,\r
-3, 452, 456, 457, 391, 178, 57, 0,\r
-3, 457, 453, 452, 57, 139, 391, 0,\r
-3, 401, 401, 458, 235, 235, 442, 0,\r
-3, 458, 454, 401, 442, 70, 235, 0,\r
-3, 454, 458, 459, 70, 442, 387, 0,\r
-3, 459, 455, 454, 387, 51, 70, 0,\r
-3, 455, 459, 460, 51, 387, 389, 0,\r
-3, 460, 456, 455, 389, 178, 51, 0,\r
-3, 456, 460, 461, 178, 389, 264, 0,\r
-3, 461, 457, 456, 264, 57, 178, 0,\r
-3, 401, 401, 462, 235, 235, 450, 0,\r
-3, 462, 458, 401, 450, 442, 235, 0,\r
-3, 458, 462, 463, 442, 450, 253, 0,\r
-3, 463, 459, 458, 253, 387, 442, 0,\r
-3, 459, 463, 464, 387, 253, 86, 0,\r
-3, 464, 460, 459, 86, 389, 387, 0,\r
-3, 460, 464, 465, 389, 86, 526, 0,\r
-3, 465, 461, 460, 526, 264, 389, 0,\r
-3, 401, 401, 402, 235, 235, 40, 0,\r
-3, 402, 462, 401, 40, 450, 235, 0,\r
-3, 462, 402, 403, 450, 40, 119, 0,\r
-3, 403, 463, 462, 119, 253, 450, 0,\r
-3, 463, 403, 404, 253, 119, 443, 0,\r
-3, 404, 464, 463, 443, 86, 253, 0,\r
-3, 464, 404, 405, 86, 443, 75, 0,\r
-3, 405, 465, 464, 75, 526, 86, 0,\r
-3, 405, 409, 470, 75, 241, 519, 0,\r
-3, 470, 466, 405, 519, 226, 75, 0,\r
-3, 466, 470, 471, 226, 519, 406, 0,\r
-3, 471, 467, 466, 406, 98, 226, 0,\r
-3, 467, 471, 472, 98, 406, 232, 0,\r
-3, 472, 468, 467, 232, 43, 98, 0,\r
-3, 468, 472, 473, 43, 232, 345, 0,\r
-3, 473, 469, 468, 345, 372, 43, 0,\r
-3, 409, 413, 474, 241, 121, 227, 0,\r
-3, 474, 470, 409, 227, 519, 241, 0,\r
-3, 470, 474, 475, 519, 227, 469, 0,\r
-3, 475, 471, 470, 469, 406, 519, 0,\r
-3, 471, 475, 476, 406, 469, 258, 0,\r
-3, 476, 472, 471, 258, 232, 406, 0,\r
-3, 472, 476, 477, 232, 258, 271, 0,\r
-3, 477, 473, 472, 271, 345, 232, 0,\r
-3, 413, 417, 478, 121, 351, 157, 0,\r
-3, 478, 474, 413, 157, 227, 121, 0,\r
-3, 474, 478, 479, 227, 157, 80, 0,\r
-3, 479, 475, 474, 80, 469, 227, 0,\r
-3, 475, 479, 480, 469, 80, 489, 0,\r
-3, 480, 476, 475, 489, 258, 469, 0,\r
-3, 476, 480, 481, 258, 489, 277, 0,\r
-3, 481, 477, 476, 277, 271, 258, 0,\r
-3, 417, 421, 482, 351, 412, 153, 0,\r
-3, 482, 478, 417, 153, 157, 351, 0,\r
-3, 478, 482, 483, 157, 153, 324, 0,\r
-3, 483, 479, 478, 324, 80, 157, 0,\r
-3, 479, 483, 484, 80, 324, 339, 0,\r
-3, 484, 480, 479, 339, 489, 80, 0,\r
-3, 480, 484, 485, 489, 339, 88, 0,\r
-3, 485, 481, 480, 88, 277, 489, 0,\r
-3, 421, 425, 486, 412, 39, 6, 0,\r
-3, 486, 482, 421, 6, 153, 412, 0,\r
-3, 482, 486, 487, 153, 6, 8, 0,\r
-3, 487, 483, 482, 8, 324, 153, 0,\r
-3, 483, 487, 488, 324, 8, 16, 0,\r
-3, 488, 484, 483, 16, 339, 324, 0,\r
-3, 484, 488, 489, 339, 16, 289, 0,\r
-3, 489, 485, 484, 289, 88, 339, 0,\r
-3, 425, 429, 490, 39, 249, 99, 0,\r
-3, 490, 486, 425, 99, 6, 39, 0,\r
-3, 486, 490, 491, 6, 99, 200, 0,\r
-3, 491, 487, 486, 200, 8, 6, 0,\r
-3, 487, 491, 492, 8, 200, 150, 0,\r
-3, 492, 488, 487, 150, 16, 8, 0,\r
-3, 488, 492, 493, 16, 150, 493, 0,\r
-3, 493, 489, 488, 493, 289, 16, 0,\r
-3, 429, 433, 494, 249, 506, 291, 0,\r
-3, 494, 490, 429, 291, 99, 249, 0,\r
-3, 490, 494, 495, 99, 291, 64, 0,\r
-3, 495, 491, 490, 64, 200, 99, 0,\r
-3, 491, 495, 496, 200, 64, 19, 0,\r
-3, 496, 492, 491, 19, 150, 200, 0,\r
-3, 492, 496, 497, 150, 19, 433, 0,\r
-3, 497, 493, 492, 433, 493, 150, 0,\r
-3, 433, 437, 498, 506, 59, 203, 0,\r
-3, 498, 494, 433, 203, 291, 506, 0,\r
-3, 494, 498, 499, 291, 203, 374, 0,\r
-3, 499, 495, 494, 374, 64, 291, 0,\r
-3, 495, 499, 500, 64, 374, 307, 0,\r
-3, 500, 496, 495, 307, 19, 64, 0,\r
-3, 496, 500, 501, 19, 307, 358, 0,\r
-3, 501, 497, 496, 358, 433, 19, 0,\r
-3, 437, 441, 502, 59, 498, 256, 0,\r
-3, 502, 498, 437, 256, 203, 59, 0,\r
-3, 498, 502, 503, 203, 256, 132, 0,\r
-3, 503, 499, 498, 132, 374, 203, 0,\r
-3, 499, 503, 504, 374, 132, 492, 0,\r
-3, 504, 500, 499, 492, 307, 374, 0,\r
-3, 500, 504, 505, 307, 492, 67, 0,\r
-3, 505, 501, 500, 67, 358, 307, 0,\r
-3, 441, 445, 506, 498, 388, 487, 0,\r
-3, 506, 502, 441, 487, 256, 498, 0,\r
-3, 502, 506, 507, 256, 487, 206, 0,\r
-3, 507, 503, 502, 206, 132, 256, 0,\r
-3, 503, 507, 508, 132, 206, 515, 0,\r
-3, 508, 504, 503, 515, 492, 132, 0,\r
-3, 504, 508, 509, 492, 515, 527, 0,\r
-3, 509, 505, 504, 527, 67, 492, 0,\r
-3, 445, 449, 510, 388, 72, 423, 0,\r
-3, 510, 506, 445, 423, 487, 388, 0,\r
-3, 506, 510, 511, 487, 423, 352, 0,\r
-3, 511, 507, 506, 352, 206, 487, 0,\r
-3, 507, 511, 512, 206, 352, 224, 0,\r
-3, 512, 508, 507, 224, 515, 206, 0,\r
-3, 508, 512, 513, 515, 224, 2, 0,\r
-3, 513, 509, 508, 2, 527, 515, 0,\r
-3, 449, 453, 514, 72, 139, 418, 0,\r
-3, 514, 510, 449, 418, 423, 72, 0,\r
-3, 510, 514, 515, 423, 418, 341, 0,\r
-3, 515, 511, 510, 341, 352, 423, 0,\r
-3, 511, 515, 516, 352, 341, 359, 0,\r
-3, 516, 512, 511, 359, 224, 352, 0,\r
-3, 512, 516, 517, 224, 359, 360, 0,\r
-3, 517, 513, 512, 360, 2, 224, 0,\r
-3, 453, 457, 518, 139, 57, 24, 0,\r
-3, 518, 514, 453, 24, 418, 139, 0,\r
-3, 514, 518, 519, 418, 24, 25, 0,\r
-3, 519, 515, 514, 25, 341, 418, 0,\r
-3, 515, 519, 520, 341, 25, 41, 0,\r
-3, 520, 516, 515, 41, 359, 341, 0,\r
-3, 516, 520, 521, 359, 41, 314, 0,\r
-3, 521, 517, 516, 314, 360, 359, 0,\r
-3, 457, 461, 522, 57, 264, 120, 0,\r
-3, 522, 518, 457, 120, 24, 57, 0,\r
-3, 518, 522, 523, 24, 120, 223, 0,\r
-3, 523, 519, 518, 223, 25, 24, 0,\r
-3, 519, 523, 524, 25, 223, 171, 0,\r
-3, 524, 520, 519, 171, 41, 25, 0,\r
-3, 520, 524, 525, 41, 171, 514, 0,\r
-3, 525, 521, 520, 514, 314, 41, 0,\r
-3, 461, 465, 526, 264, 526, 316, 0,\r
-3, 526, 522, 461, 316, 120, 264, 0,\r
-3, 522, 526, 527, 120, 316, 85, 0,\r
-3, 527, 523, 522, 85, 223, 120, 0,\r
-3, 523, 527, 528, 223, 85, 50, 0,\r
-3, 528, 524, 523, 50, 171, 223, 0,\r
-3, 524, 528, 529, 171, 50, 454, 0,\r
-3, 529, 525, 524, 454, 514, 171, 0,\r
-3, 465, 405, 466, 526, 75, 226, 0,\r
-3, 466, 526, 465, 226, 316, 526, 0,\r
-3, 526, 466, 467, 316, 226, 98, 0,\r
-3, 467, 527, 526, 98, 85, 316, 0,\r
-3, 527, 467, 468, 85, 98, 43, 0,\r
-3, 468, 528, 527, 43, 50, 85, 0,\r
-3, 528, 468, 469, 50, 43, 372, 0,\r
-3, 469, 529, 528, 372, 454, 50, 0\r
-};\r
-\r
-\r
-const int strip_vertices[] = {\r
-508, 508, 504, 509, 504, 505, 500, 501, 496, 497, 492, 493, 488, 489, 484, 485, 480, 481, 476, 477, 472, 473, -1,\r
-476, 475, 480, 479, 484, 483, 488, 487, 492, 491, 496, 495, 500, 499, 504, 499, 503, 498, 502, 437, 441, -1,\r
-527, 526, 467, 466, 471, 470, 475, 474, 479, 478, 483, 482, 487, 486, 491, 490, 495, 494, 499, 494, 498, -1,\r
-490, 490, 425, 486, 421, 482, 417, 478, 413, 474, 409, 470, 405, 466, 465, 526, 465, 461, 460, 456, 455, 451, -1,\r
-405, 465, 464, 460, 459, 455, 454, 450, -1,\r
-455, 451, 450, 446, 450, 401, 454, 458, 459, 463, 464, 404, 405, 404, 409, 408, 413, 412, 417, 416, 421, 420, -1,\r
-421, 420, 425, 420, 424, 419, 423, 418, 422, 418, 401, 414, 410, 415, 411, 416, 411, 412, 407, 408, 403, 404, 403, 463, -1,\r
-418, 418, 414, 419, 415, 420, 416, -1,\r
-407, 403, 402, 462, -1,\r
-403, 463, 462, 458, 462, 401, 402, 406, 407, 406, 411, 406, 410, 401, -1,\r
-494, 494, 498, 433, 437, 432, 436, 431, 435, 430, 434, 430, 401, 426, 422, 427, 423, 428, 424, 429, 425, 490, -1,\r
-430, 430, 426, 431, 427, 432, 428, 433, 429, 494, 490, -1,\r
-437, 437, 441, 436, 440, 435, 439, 434, 438, 401, 442, 446, 447, 451, 452, 456, 457, 461, 522, 526, 527, -1,\r
-452, 448, 447, -1,\r
-510, 445, 449, 444, 448, 443, 447, 443, 442, 443, 438, 443, 439, 444, 440, 445, 441, 506, 502, 507, 503, -1,\r
-510, 506, 445, -1,\r
-507, 506, 511, 510, 515, 510, 514, 449, 453, 448, 453, 452, 457, -1,\r
-527, 523, 522, 518, 457, 518, 453, 518, 514, 519, 515, -1,\r
-523, 519, 518, -1,\r
-504, 503, 508, 507, 512, 511, 516, 515, 520, 519, 524, 523, 528, 527, 468, 467, 472, 471, 476, 475, -1,\r
-472, 473, 468, 469, 528, 529, 524, 525, 520, 521, 516, 517, 512, 513, 508, 509, -1,\r
-211, 211, 214, 210, 209, -1,\r
-212, 215, 216, 219, 220, 223, 220, 211, 217, 214, 213, 209, 213, 208, 212, 147, -1,\r
-220, 217, 216, 213, 212, -1,\r
-251, 251, 248, 252, 249, 253, 250, 253, 211, 256, 210, 255, 209, 254, 208, 207, 147, 206, 147, 146, 147, 151, 212, 215, -1,\r
-206, 206, 202, 207, 203, 254, 251, 255, 252, 256, 253, -1,\r
-223, 223, 222, 219, 218, 215, 155, 151, 150, 146, 145, 146, 205, 206, 201, 202, 197, 202, 198, 203, 199, 251, 248, -1,\r
-145, 149, 150, 154, 155, 159, 218, 221, 222, 225, 226, 229, -1,\r
-204, 204, 145, 144, 149, 148, 149, 153, 154, 158, 159, 163, 221, 224, 225, 228, 229, 232, 229, 211, 226, 223, 222, -1,\r
-224, 224, 167, 163, 162, 158, 157, 153, 152, 148, 87, 148, 83, 144, 143, 204, 139, 200, 135, 196, 131, 192, -1,\r
-82, 83, 142, 143, 138, 139, 134, 135, 130, 131, 126, 127, 122, 123, 118, 123, 119, 184, 180, 185, 181, -1,\r
-81, 82, 141, 142, 137, 138, 133, 134, 129, 130, 125, 126, 121, 122, 117, 118, 113, 114, 109, 110, -1,\r
-80, 81, 140, 141, 136, 137, 132, 133, 128, 129, 124, 125, 120, 121, 116, 117, 112, 113, 108, 109, -1,\r
-4, 80, 79, 140, 74, 136, 69, 132, 64, 128, 59, 124, 54, 120, 49, 116, 44, 112, 39, 108, -1,\r
-79, 79, 73, 74, 68, 69, 63, 64, 58, 59, 53, 54, 48, 49, 48, 43, 42, 37, 36, 31, 30, 31, 25, -1,\r
-42, 42, 48, 47, 53, 52, 58, 57, 63, 62, 68, 67, 73, 72, 78, 77, 3, 2, 8, 7, 13, -1,\r
-36, 36, 42, 41, 47, 46, 52, 51, 57, 56, 62, 61, 67, 66, 72, 71, 77, 76, 2, 1, 7, -1,\r
-66, 66, 60, 61, 55, 56, 50, 51, 45, 46, 40, 41, 35, 36, 30, -1,\r
-31, 31, 25, 26, 20, 21, 15, 16, 10, 11, 5, 6, 0, 1, 75, 76, 70, 71, 65, 66, 60, -1,\r
-1, 1, 7, 6, 12, 11, 17, 16, 22, 21, 27, 26, 32, 31, 32, 37, 38, 43, 44, 49, -1,\r
-7, 7, 13, 12, 18, 17, 23, 22, 28, 27, 33, 32, 33, 38, -1,\r
-44, 44, 38, 39, 33, 34, 28, 29, 23, 24, 18, 19, 13, 14, 8, 9, 3, 4, 78, 79, 73, -1,\r
-39, 108, 34, 104, 29, 100, 24, 96, 19, 92, 14, 88, 9, 84, 4, 84, 80, 85, 81, 86, 81, 82, -1,\r
-108, 109, 104, 105, 100, 101, 96, 97, 92, 93, 88, 89, 84, 85, -1,\r
-109, 110, 105, 106, 101, 102, 97, 98, 93, 94, 89, 90, 85, 86, -1,\r
-118, 119, 114, 115, 110, 111, 106, 107, 102, 103, 98, 99, 94, 95, 90, 91, 86, 87, 82, 83, -1,\r
-111, 115, 176, -1,\r
-107, 111, 172, 176, 177, -1,\r
-103, 107, 168, 172, 173, 177, 178, -1,\r
-99, 103, 164, 168, 169, 173, 174, 178, 179, -1,\r
-95, 99, 160, 164, 165, 169, 170, 174, 175, 179, 233, -1,\r
-91, 95, 156, 160, 161, 165, 166, 170, 171, 175, 230, 233, 234, -1,\r
-87, 91, 152, 156, 157, 161, 162, 166, 167, 171, 227, 230, 231, 234, 235, 234, 238, 234, 237, 233, 236, 179, -1,\r
-185, 185, 181, 186, 182, 187, 183, 239, 236, 240, 237, 241, 238, 211, 235, 232, 231, 228, 227, 224, 167, -1,\r
-236, 179, 183, 178, 182, 177, 181, 176, 180, 115, 119, -1,\r
-131, 192, 127, 188, 123, 188, 184, 189, 185, 190, 186, 191, 187, 242, 239, 243, 240, 244, 241, 244, 211, 247, -1,\r
-192, 192, 188, 193, 189, 194, 190, 195, 191, 245, 242, 246, 243, 247, 244, -1,\r
-211, 247, 250, 246, 249, 245, 248, 195, 199, 194, 198, 193, 197, 192, 197, 196, 201, 200, 205, 204, 145, -1,\r
-393, 393, 394, 398, 399, 371, -1,\r
-399, 395, 394, -1,\r
-363, 363, 393, 397, 398, 370, 371, 375, -1,\r
-379, 375, 374, 370, 369, 397, 368, 363, 362, -1,\r
-396, 395, 400, 399, 372, 371, 376, 375, 380, 379, 384, 383, 388, 387, 392, 391, 396, 391, 395, 390, 394, -1,\r
-374, 378, 379, 378, 383, 382, 387, 386, 391, 386, 390, 385, 389, 353, 358, 352, 357, 351, 356, 350, 355, -1,\r
-341, 341, 347, 346, 352, 346, 351, 345, 350, -1,\r
-335, 334, 340, 339, 345, 344, 350, 349, 355, 354, -1,\r
-390, 390, 394, 389, 393, 358, 363, 357, 362, 356, 361, 355, 360, 354, 360, 359, 365, 364, 330, 329, 335, 334, -1,\r
-345, 346, 340, 341, 335, 336, 330, 331, 365, 366, 360, 366, 361, 367, 362, 367, 368, 333, 369, 373, 374, 378, -1,\r
-353, 353, 348, 385, 381, 386, 381, 382, 377, 378, 377, 373, 338, 333, 332, 367, 332, 366, 332, 331, 337, 336, 342, 341, 347, -1,\r
-332, 337, 338, 343, 377, 343, 381, 343, 348, 342, 348, 347, 353, 352, -1,\r
-337, 342, 343, -1,\r
-314, 314, 319, 318, 323, 322, 323, 327, -1,\r
-309, 309, 314, 313, 318, 317, 322, 321, 322, 326, 327, 299, -1,\r
-271, 271, 309, 276, 313, 281, 317, 286, 321, 291, 321, 325, 326, 298, 299, 303, -1,\r
-265, 265, 271, 270, 276, 275, 281, 280, 286, 285, 291, 290, 291, 296, 325, 297, 298, 302, 303, 307, -1,\r
-259, 259, 265, 264, 270, 269, 275, 274, 280, 279, 285, 284, 290, 289, 290, 295, 296, 261, 297, 301, 302, 306, 307, 311, -1,\r
-293, 293, 259, 258, 264, 263, 269, 268, 274, 273, 279, 278, 284, 283, 289, 288, 289, 294, 295, 260, 261, 266, -1,\r
-309, 305, 271, 266, 265, 260, 259, 294, 293, 288, 287, 288, 282, 283, 277, 278, 272, 273, 267, 268, 262, -1,\r
-268, 268, 262, 263, 257, 258, 292, 293, 287, -1,\r
-261, 266, 301, 305, 306, 310, 311, 315, 316, 320, -1,\r
-316, 316, 311, 312, 307, 308, 303, 304, 299, 300, 327, 328, 323, 324, 319, 320, 319, 315, 314, 310, 309, 305, -1\r
-};\r
-\r
-\r
-const int strip_normals[] = {\r
-515, 515, 492, 527, 492, 67, 307, 358, 19, 433, 150, 493, 16, 289, 339, 88, 489, 277, 258, 271, 232, 345, -1,\r
-258, 469, 489, 80, 339, 324, 16, 8, 150, 200, 19, 64, 307, 374, 492, 374, 132, 203, 256, 59, 498, -1,\r
-85, 316, 98, 226, 406, 519, 469, 227, 80, 157, 324, 153, 8, 6, 200, 99, 64, 291, 374, 291, 203, -1,\r
-99, 99, 39, 6, 412, 153, 351, 157, 121, 227, 241, 519, 75, 226, 526, 316, 526, 264, 389, 178, 51, 82, -1,\r
-75, 526, 86, 389, 387, 51, 70, 107, -1,\r
-51, 82, 107, 212, 107, 235, 70, 442, 387, 253, 86, 443, 75, 443, 241, 202, 121, 281, 351, 436, 412, 376, -1,\r
-412, 376, 39, 376, 158, 361, 21, 90, 52, 90, 235, 479, 263, 36, 196, 436, 196, 281, 306, 202, 119, 443, 119, 253, -1,\r
-90, 90, 479, 361, 36, 376, 436, -1,\r
-306, 119, 40, 450, -1,\r
-119, 253, 450, 442, 450, 235, 40, 189, 306, 189, 196, 189, 263, 235, -1,\r
-291, 291, 203, 506, 59, 65, 169, 229, 96, 432, 302, 432, 235, 424, 52, 373, 21, 375, 158, 249, 39, 99, -1,\r
-432, 432, 424, 229, 373, 65, 375, 506, 249, 291, 99, -1,\r
-59, 59, 498, 169, 460, 96, 30, 302, 452, 235, 525, 212, 299, 82, 391, 178, 57, 264, 120, 316, 85, -1,\r
-391, 166, 299, -1,\r
-423, 388, 72, 9, 166, 456, 299, 456, 525, 456, 452, 456, 30, 9, 460, 388, 498, 487, 256, 206, 132, -1,\r
-423, 487, 388, -1,\r
-206, 487, 352, 423, 341, 423, 418, 72, 139, 166, 139, 391, 57, -1,\r
-85, 223, 120, 24, 57, 24, 139, 24, 418, 25, 341, -1,\r
-223, 25, 24, -1,\r
-492, 132, 515, 206, 224, 352, 359, 341, 41, 25, 171, 223, 50, 85, 43, 98, 232, 406, 258, 469, -1,\r
-232, 345, 43, 372, 50, 454, 171, 514, 41, 314, 359, 360, 224, 2, 515, 527, -1,\r
-393, 393, 0, 216, 349, -1,\r
-486, 215, 327, 91, 177, 254, 177, 393, 512, 0, 231, 349, 231, 279, 486, 246, -1,\r
-177, 512, 327, 231, 486, -1,\r
-462, 462, 144, 76, 179, 464, 298, 464, 393, 128, 216, 113, 349, 500, 279, 101, 246, 7, 246, 395, 246, 384, 486, 215, -1,\r
-7, 7, 195, 101, 444, 500, 462, 113, 76, 128, 464, -1,\r
-254, 254, 285, 91, 149, 215, 83, 384, 325, 395, 520, 395, 315, 7, 143, 195, 129, 195, 461, 444, 475, 462, 144, -1,\r
-520, 308, 325, 415, 83, 297, 149, 504, 285, 162, 278, 446, -1,\r
-403, 403, 520, 276, 308, 404, 308, 272, 415, 416, 297, 317, 504, 125, 162, 60, 446, 110, 446, 393, 278, 254, 285, -1,\r
-125, 125, 459, 317, 334, 416, 137, 272, 47, 404, 511, 404, 1, 276, 54, 403, 45, 370, 490, 210, 29, 184, -1,\r
-336, 1, 251, 54, 164, 45, 463, 490, 378, 29, 453, 147, 222, 218, 301, 218, 242, 310, 130, 528, 34, -1,\r
-26, 336, 148, 251, 269, 164, 419, 463, 293, 378, 420, 453, 333, 222, 208, 301, 294, 56, 127, 228, -1,\r
-131, 26, 371, 148, 284, 269, 311, 419, 95, 293, 350, 420, 377, 333, 474, 208, 396, 294, 357, 127, -1,\r
-116, 131, 273, 371, 480, 284, 104, 311, 257, 95, 348, 350, 447, 377, 313, 474, 322, 396, 28, 357, -1,\r
-273, 273, 183, 480, 347, 104, 53, 257, 181, 348, 124, 447, 428, 313, 428, 435, 11, 270, 193, 305, 69, 305, 386, -1,\r
-11, 11, 428, 409, 124, 382, 181, 161, 53, 481, 347, 408, 183, 319, 151, 422, 448, 4, 165, 134, 394, -1,\r
-193, 193, 11, 495, 409, 44, 382, 385, 161, 478, 481, 320, 408, 37, 319, 524, 422, 328, 4, 465, 134, -1,\r
-37, 37, 431, 320, 136, 478, 513, 385, 27, 44, 467, 495, 115, 193, 69, -1,\r
-305, 305, 386, 20, 174, 182, 401, 211, 248, 106, 295, 309, 255, 465, 483, 328, 191, 524, 135, 37, 431, -1,\r
-465, 465, 134, 309, 102, 106, 427, 211, 507, 182, 410, 20, 503, 305, 503, 270, 445, 435, 322, 313, -1,\r
-134, 134, 394, 102, 455, 427, 5, 507, 23, 410, 405, 503, 405, 445, -1,\r
-322, 322, 445, 28, 405, 138, 23, 485, 5, 234, 455, 74, 394, 180, 165, 49, 448, 116, 151, 273, 183, -1,\r
-28, 357, 138, 268, 485, 287, 234, 81, 74, 78, 180, 103, 49, 220, 116, 220, 131, 476, 26, 38, 26, 336, -1,\r
-357, 127, 268, 252, 287, 398, 81, 274, 78, 154, 103, 62, 220, 476, -1,\r
-127, 228, 252, 141, 398, 440, 274, 363, 154, 190, 62, 488, 476, 38, -1,\r
-301, 242, 56, 517, 228, 33, 141, 18, 440, 466, 363, 304, 190, 417, 488, 484, 38, 511, 336, 1, -1,\r
-33, 517, 260, -1,\r
-18, 33, 390, 260, 497, -1,\r
-466, 18, 353, 390, 290, 497, 126, -1,\r
-304, 466, 187, 353, 123, 290, 522, 126, 501, -1,\r
-417, 304, 458, 187, 117, 123, 168, 522, 87, 501, 261, -1,\r
-484, 417, 430, 458, 343, 117, 438, 168, 426, 87, 482, 261, 329, -1,\r
-511, 484, 47, 430, 137, 343, 334, 438, 459, 426, 439, 482, 92, 329, 192, 329, 267, 329, 491, 261, 219, 501, -1,\r
-528, 528, 34, 145, 46, 356, 105, 472, 219, 48, 491, 247, 267, 393, 192, 110, 92, 60, 439, 125, 459, -1,\r
-219, 501, 105, 126, 46, 497, 34, 260, 130, 517, 242, -1,\r
-29, 184, 147, 156, 218, 156, 310, 402, 528, 146, 145, 17, 356, 411, 472, 364, 48, 441, 247, 441, 393, 509, -1,\r
-184, 184, 156, 63, 402, 354, 146, 335, 17, 239, 411, 13, 364, 509, 441, -1,\r
-393, 509, 298, 13, 179, 239, 144, 335, 475, 354, 461, 63, 129, 184, 129, 210, 143, 370, 315, 403, 520, -1,\r
-296, 296, 160, 133, 344, 330, -1,\r
-344, 323, 160, -1,\r
-159, 159, 296, 275, 133, 22, 330, 523, -1,\r
-198, 523, 77, 22, 286, 275, 437, 159, 499, -1,\r
-280, 323, 108, 344, 338, 330, 259, 523, 366, 198, 381, 240, 283, 10, 368, 243, 280, 243, 323, 35, 160, -1,\r
-77, 471, 198, 471, 240, 250, 10, 303, 243, 303, 35, 230, 282, 362, 163, 73, 318, 292, 93, 477, 262, -1,\r
-413, 413, 326, 399, 73, 399, 292, 100, 477, -1,\r
-122, 355, 414, 61, 100, 55, 477, 508, 262, 365, -1,\r
-35, 35, 160, 282, 296, 163, 159, 318, 499, 93, 505, 262, 340, 365, 340, 140, 68, 510, 518, 3, 122, 355, -1,\r
-100, 399, 414, 413, 122, 111, 518, 213, 68, 167, 340, 167, 505, 245, 499, 245, 437, 346, 286, 79, 77, 471, -1,\r
-362, 362, 221, 230, 516, 303, 516, 250, 207, 471, 207, 79, 521, 346, 468, 245, 468, 167, 468, 213, 473, 111, 204, 413, 326, -1,\r
-468, 473, 521, 217, 207, 217, 516, 217, 221, 204, 221, 326, 362, 73, -1,\r
-473, 204, 217, -1,\r
-94, 94, 185, 529, 429, 209, 429, 176, -1,\r
-379, 379, 94, 199, 529, 367, 209, 172, 209, 66, 176, 496, -1,\r
-312, 312, 379, 238, 199, 15, 367, 332, 172, 197, 172, 451, 66, 84, 496, 186, -1,\r
-266, 266, 312, 392, 238, 201, 15, 14, 332, 457, 197, 383, 197, 225, 451, 502, 84, 265, 186, 205, -1,\r
-236, 236, 266, 214, 392, 71, 201, 188, 14, 173, 457, 400, 383, 380, 383, 342, 225, 109, 502, 175, 265, 97, 205, 118, -1,\r
-152, 152, 236, 337, 214, 58, 71, 369, 188, 434, 173, 114, 400, 288, 380, 42, 380, 397, 342, 32, 109, 331, -1,\r
-379, 170, 312, 331, 266, 32, 236, 397, 152, 42, 194, 42, 407, 288, 142, 114, 12, 434, 233, 369, 244, -1,\r
-369, 369, 244, 58, 425, 337, 321, 152, 194, -1,\r
-109, 331, 175, 170, 97, 300, 118, 421, 31, 89, -1,\r
-31, 31, 118, 237, 205, 449, 186, 470, 496, 494, 176, 155, 429, 112, 185, 89, 185, 421, 94, 300, 379, 170, -1\r
-};\r
-\r
-#else  /* defined(_WIN32_WCE) */\r
-\r
-/*\r
- * Original teapot code copyright follows:\r
- */\r
-\r
-/*\r
- * (c) Copyright 1993, Silicon Graphics, Inc.\r
- *\r
- * ALL RIGHTS RESERVED\r
- *\r
- * Permission to use, copy, modify, and distribute this software\r
- * for any purpose and without fee is hereby granted, provided\r
- * that the above copyright notice appear in all copies and that\r
- * both the copyright notice and this permission notice appear in\r
- * supporting documentation, and that the name of Silicon\r
- * Graphics, Inc. not be used in advertising or publicity\r
- * pertaining to distribution of the software without specific,\r
- * written prior permission.\r
- *\r
- * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU\r
- * "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR\r
- * OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF\r
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  IN NO\r
- * EVENT SHALL SILICON GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE\r
- * ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR\r
- * CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,\r
- * INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,\r
- * SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR\r
- * NOT SILICON GRAPHICS, INC.  HAS BEEN ADVISED OF THE POSSIBILITY\r
- * OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
- * ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR\r
- * PERFORMANCE OF THIS SOFTWARE.\r
- *\r
- * US Government Users Restricted Rights\r
- *\r
- * Use, duplication, or disclosure by the Government is subject to\r
- * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph\r
- * (c)(1)(ii) of the Rights in Technical Data and Computer\r
- * Software clause at DFARS 252.227-7013 and/or in similar or\r
- * successor clauses in the FAR or the DOD or NASA FAR\r
- * Supplement.  Unpublished-- rights reserved under the copyright\r
- * laws of the United States.  Contractor/manufacturer is Silicon\r
- * Graphics, Inc., 2011 N.  Shoreline Blvd., Mountain View, CA\r
- * 94039-7311.\r
- *\r
- * OpenGL(TM) is a trademark of Silicon Graphics, Inc.\r
- */\r
-\r
-/*\r
- * Rim, body, lid, and bottom data must be reflected in x and y;\r
- * handle and spout data across the y axis only.\r
- */\r
-static int patchdata[][16] =\r
-{\r
-    { 102, 103, 104, 105,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15 }, /* rim    */\r
-    {  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27 }, /* body   */\r
-    {  24,  25,  26,  27,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40 },\r
-    {  96,  96,  96,  96,  97,  98,  99, 100, 101, 101, 101, 101,   0,   1,   2,   3 }, /* lid    */\r
-    {   0,   1,   2,   3, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117 },\r
-    { 118, 118, 118, 118, 124, 122, 119, 121, 123, 126, 125, 120,  40,  39,  38,  37 }, /* bottom */\r
-    {  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56 }, /* handle */\r
-    {  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  28,  65,  66,  67 },\r
-    {  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83 }, /* spout  */\r
-    {  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95 }\r
-};\r
-\r
-static double cpdata[][3] =\r
-{\r
-    {0.2, 0, 2.7}, {0.2, -0.112, 2.7}, {0.112, -0.2, 2.7}, {0,\r
-    -0.2, 2.7}, {1.3375, 0, 2.53125}, {1.3375, -0.749, 2.53125},\r
-    {0.749, -1.3375, 2.53125}, {0, -1.3375, 2.53125}, {1.4375,\r
-    0, 2.53125}, {1.4375, -0.805, 2.53125}, {0.805, -1.4375,\r
-    2.53125}, {0, -1.4375, 2.53125}, {1.5, 0, 2.4}, {1.5, -0.84,\r
-    2.4}, {0.84, -1.5, 2.4}, {0, -1.5, 2.4}, {1.75, 0, 1.875},\r
-    {1.75, -0.98, 1.875}, {0.98, -1.75, 1.875}, {0, -1.75,\r
-    1.875}, {2, 0, 1.35}, {2, -1.12, 1.35}, {1.12, -2, 1.35},\r
-    {0, -2, 1.35}, {2, 0, 0.9}, {2, -1.12, 0.9}, {1.12, -2,\r
-    0.9}, {0, -2, 0.9}, {-2, 0, 0.9}, {2, 0, 0.45}, {2, -1.12,\r
-    0.45}, {1.12, -2, 0.45}, {0, -2, 0.45}, {1.5, 0, 0.225},\r
-    {1.5, -0.84, 0.225}, {0.84, -1.5, 0.225}, {0, -1.5, 0.225},\r
-    {1.5, 0, 0.15}, {1.5, -0.84, 0.15}, {0.84, -1.5, 0.15}, {0,\r
-    -1.5, 0.15}, {-1.6, 0, 2.025}, {-1.6, -0.3, 2.025}, {-1.5,\r
-    -0.3, 2.25}, {-1.5, 0, 2.25}, {-2.3, 0, 2.025}, {-2.3, -0.3,\r
-    2.025}, {-2.5, -0.3, 2.25}, {-2.5, 0, 2.25}, {-2.7, 0,\r
-    2.025}, {-2.7, -0.3, 2.025}, {-3, -0.3, 2.25}, {-3, 0,\r
-    2.25}, {-2.7, 0, 1.8}, {-2.7, -0.3, 1.8}, {-3, -0.3, 1.8},\r
-    {-3, 0, 1.8}, {-2.7, 0, 1.575}, {-2.7, -0.3, 1.575}, {-3,\r
-    -0.3, 1.35}, {-3, 0, 1.35}, {-2.5, 0, 1.125}, {-2.5, -0.3,\r
-    1.125}, {-2.65, -0.3, 0.9375}, {-2.65, 0, 0.9375}, {-2,\r
-    -0.3, 0.9}, {-1.9, -0.3, 0.6}, {-1.9, 0, 0.6}, {1.7, 0,\r
-    1.425}, {1.7, -0.66, 1.425}, {1.7, -0.66, 0.6}, {1.7, 0,\r
-    0.6}, {2.6, 0, 1.425}, {2.6, -0.66, 1.425}, {3.1, -0.66,\r
-    0.825}, {3.1, 0, 0.825}, {2.3, 0, 2.1}, {2.3, -0.25, 2.1},\r
-    {2.4, -0.25, 2.025}, {2.4, 0, 2.025}, {2.7, 0, 2.4}, {2.7,\r
-    -0.25, 2.4}, {3.3, -0.25, 2.4}, {3.3, 0, 2.4}, {2.8, 0,\r
-    2.475}, {2.8, -0.25, 2.475}, {3.525, -0.25, 2.49375},\r
-    {3.525, 0, 2.49375}, {2.9, 0, 2.475}, {2.9, -0.15, 2.475},\r
-    {3.45, -0.15, 2.5125}, {3.45, 0, 2.5125}, {2.8, 0, 2.4},\r
-    {2.8, -0.15, 2.4}, {3.2, -0.15, 2.4}, {3.2, 0, 2.4}, {0, 0,\r
-    3.15}, {0.8, 0, 3.15}, {0.8, -0.45, 3.15}, {0.45, -0.8,\r
-    3.15}, {0, -0.8, 3.15}, {0, 0, 2.85}, {1.4, 0, 2.4}, {1.4,\r
-    -0.784, 2.4}, {0.784, -1.4, 2.4}, {0, -1.4, 2.4}, {0.4, 0,\r
-    2.55}, {0.4, -0.224, 2.55}, {0.224, -0.4, 2.55}, {0, -0.4,\r
-    2.55}, {1.3, 0, 2.55}, {1.3, -0.728, 2.55}, {0.728, -1.3,\r
-    2.55}, {0, -1.3, 2.55}, {1.3, 0, 2.4}, {1.3, -0.728, 2.4},\r
-    {0.728, -1.3, 2.4}, {0, -1.3, 2.4}, {0, 0, 0}, {1.425,\r
-    -0.798, 0}, {1.5, 0, 0.075}, {1.425, 0, 0}, {0.798, -1.425,\r
-    0}, {0, -1.5, 0.075}, {0, -1.425, 0}, {1.5, -0.84, 0.075},\r
-    {0.84, -1.5, 0.075}\r
-};\r
-\r
-static double tex[2][2][2] =\r
-{\r
-    { {0.0, 0.0}, {1.0, 0.0} },\r
-    { {0.0, 1.0}, {1.0, 1.0} }\r
-};\r
-#endif  /* defined(_WIN32_WCE) */\r
-\r
-\r
-#endif  /* FREEGLUT_TEAPOT_DATA_H */\r
-\r
+/*
+ * freeglut_teapot_data.h
+ *
+ * The freeglut library teapot data include file.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef  FREEGLUT_TEAPOT_DATA_H
+#define  FREEGLUT_TEAPOT_DATA_H
+
+#if defined(_WIN32_WCE)
+/*
+ * Submitted through the kind offices of Daniel Wagner (daniel@ims.tuwien.ac.at)
+ */
+
+/* 530 vertices */
+
+const int numVertices = 530;
+const float vertices[530][3] =  {
+2.1f, 3.6f, 0.0f, 
+2.071f, 3.711f, 0.0f, 
+2.105f, 3.748f, 0.0f, 
+2.174f, 3.711f, 0.0f, 
+2.25f, 3.6f, 0.0f, 
+1.937f, 3.6f, 0.8242f, 
+1.91f, 3.711f, 0.8128f, 
+1.942f, 3.748f, 0.8261f, 
+2.005f, 3.711f, 0.8532f, 
+2.076f, 3.6f, 0.8831f, 
+1.491f, 3.6f, 1.491f, 
+1.47f, 3.711f, 1.47f, 
+1.494f, 3.748f, 1.494f, 
+1.543f, 3.711f, 1.543f, 
+1.597f, 3.6f, 1.597f, 
+0.8242f, 3.6f, 1.937f, 
+0.8128f, 3.711f, 1.91f, 
+0.8261f, 3.748f, 1.942f, 
+0.8532f, 3.711f, 2.005f, 
+0.8831f, 3.6f, 2.076f, 
+0.0f, 3.6f, 2.1f, 
+0.0f, 3.711f, 2.071f, 
+0.0f, 3.748f, 2.105f, 
+0.0f, 3.711f, 2.174f, 
+0.0f, 3.6f, 2.25f, 
+-0.8812f, 3.6f, 1.937f, 
+-0.8368f, 3.711f, 1.91f, 
+-0.8332f, 3.748f, 1.942f, 
+-0.8541f, 3.711f, 2.005f, 
+-0.8831f, 3.6f, 2.076f, 
+-1.542f, 3.6f, 1.491f, 
+-1.492f, 3.711f, 1.47f, 
+-1.501f, 3.748f, 1.494f, 
+-1.544f, 3.711f, 1.543f, 
+-1.597f, 3.6f, 1.597f, 
+-1.956f, 3.6f, 0.8242f, 
+-1.918f, 3.711f, 0.8128f, 
+-1.944f, 3.748f, 0.8261f, 
+-2.006f, 3.711f, 0.8532f, 
+-2.076f, 3.6f, 0.8831f, 
+-2.1f, 3.6f, 0.0f, 
+-2.071f, 3.711f, 0.0f, 
+-2.105f, 3.748f, 0.0f, 
+-2.174f, 3.711f, 0.0f, 
+-2.25f, 3.6f, 0.0f, 
+-1.937f, 3.6f, -0.8242f, 
+-1.91f, 3.711f, -0.8128f, 
+-1.942f, 3.748f, -0.8261f, 
+-2.005f, 3.711f, -0.8532f, 
+-2.076f, 3.6f, -0.8831f, 
+-1.491f, 3.6f, -1.491f, 
+-1.47f, 3.711f, -1.47f, 
+-1.494f, 3.748f, -1.494f, 
+-1.543f, 3.711f, -1.543f, 
+-1.597f, 3.6f, -1.597f, 
+-0.8242f, 3.6f, -1.937f, 
+-0.8128f, 3.711f, -1.91f, 
+-0.8261f, 3.748f, -1.942f, 
+-0.8532f, 3.711f, -2.005f, 
+-0.8831f, 3.6f, -2.076f, 
+0.0f, 3.6f, -2.1f, 
+0.0f, 3.711f, -2.071f, 
+0.0f, 3.748f, -2.105f, 
+0.0f, 3.711f, -2.174f, 
+0.0f, 3.6f, -2.25f, 
+0.8242f, 3.6f, -1.937f, 
+0.8128f, 3.711f, -1.91f, 
+0.8261f, 3.748f, -1.942f, 
+0.8532f, 3.711f, -2.005f, 
+0.8831f, 3.6f, -2.076f, 
+1.491f, 3.6f, -1.491f, 
+1.47f, 3.711f, -1.47f, 
+1.494f, 3.748f, -1.494f, 
+1.543f, 3.711f, -1.543f, 
+1.597f, 3.6f, -1.597f, 
+1.937f, 3.6f, -0.8242f, 
+1.91f, 3.711f, -0.8128f, 
+1.942f, 3.748f, -0.8261f, 
+2.005f, 3.711f, -0.8532f, 
+2.076f, 3.6f, -0.8831f, 
+2.525f, 3.011f, 0.0f, 
+2.766f, 2.433f, 0.0f, 
+2.936f, 1.876f, 0.0f, 
+3.0f, 1.35f, 0.0f, 
+2.33f, 3.011f, 0.9912f, 
+2.551f, 2.433f, 1.086f, 
+2.708f, 1.876f, 1.152f, 
+2.767f, 1.35f, 1.178f, 
+1.793f, 3.011f, 1.793f, 
+1.964f, 2.433f, 1.964f, 
+2.084f, 1.876f, 2.084f, 
+2.13f, 1.35f, 2.13f, 
+0.9912f, 3.011f, 2.33f, 
+1.086f, 2.433f, 2.551f, 
+1.152f, 1.876f, 2.708f, 
+1.178f, 1.35f, 2.767f, 
+0.0f, 3.011f, 2.525f, 
+0.0f, 2.433f, 2.766f, 
+0.0f, 1.876f, 2.936f, 
+0.0f, 1.35f, 3.0f, 
+-0.9912f, 3.011f, 2.33f, 
+-1.086f, 2.433f, 2.551f, 
+-1.152f, 1.876f, 2.708f, 
+-1.178f, 1.35f, 2.767f, 
+-1.793f, 3.011f, 1.793f, 
+-1.964f, 2.433f, 1.964f, 
+-2.084f, 1.876f, 2.084f, 
+-2.13f, 1.35f, 2.13f, 
+-2.33f, 3.011f, 0.9912f, 
+-2.551f, 2.433f, 1.086f, 
+-2.708f, 1.876f, 1.152f, 
+-2.767f, 1.35f, 1.178f, 
+-2.525f, 3.011f, 0.0f, 
+-2.766f, 2.433f, 0.0f, 
+-2.936f, 1.876f, 0.0f, 
+-3.0f, 1.35f, 0.0f, 
+-2.33f, 3.011f, -0.9912f, 
+-2.551f, 2.433f, -1.086f, 
+-2.708f, 1.876f, -1.152f, 
+-2.767f, 1.35f, -1.178f, 
+-1.793f, 3.011f, -1.793f, 
+-1.964f, 2.433f, -1.964f, 
+-2.084f, 1.876f, -2.084f, 
+-2.13f, 1.35f, -2.13f, 
+-0.9912f, 3.011f, -2.33f, 
+-1.086f, 2.433f, -2.551f, 
+-1.152f, 1.876f, -2.708f, 
+-1.178f, 1.35f, -2.767f, 
+0.0f, 3.011f, -2.525f, 
+0.0f, 2.433f, -2.766f, 
+0.0f, 1.876f, -2.936f, 
+0.0f, 1.35f, -3.0f, 
+0.9912f, 3.011f, -2.33f, 
+1.086f, 2.433f, -2.551f, 
+1.152f, 1.876f, -2.708f, 
+1.178f, 1.35f, -2.767f, 
+1.793f, 3.011f, -1.793f, 
+1.964f, 2.433f, -1.964f, 
+2.084f, 1.876f, -2.084f, 
+2.13f, 1.35f, -2.13f, 
+2.33f, 3.011f, -0.9912f, 
+2.551f, 2.433f, -1.086f, 
+2.708f, 1.876f, -1.152f, 
+2.767f, 1.35f, -1.178f, 
+2.883f, 0.9053f, 0.0f, 
+2.625f, 0.5766f, 0.0f, 
+2.367f, 0.3533f, 0.0f, 
+2.25f, 0.225f, 0.0f, 
+2.659f, 0.9053f, 1.132f, 
+2.422f, 0.5766f, 1.03f, 
+2.184f, 0.3533f, 0.9291f, 
+2.076f, 0.225f, 0.8831f, 
+2.047f, 0.9053f, 2.047f, 
+1.864f, 0.5766f, 1.864f, 
+1.681f, 0.3533f, 1.681f, 
+1.597f, 0.225f, 1.597f, 
+1.132f, 0.9053f, 2.659f, 
+1.03f, 0.5766f, 2.422f, 
+0.9291f, 0.3533f, 2.184f, 
+0.8831f, 0.225f, 2.076f, 
+0.0f, 0.9053f, 2.883f, 
+0.0f, 0.5766f, 2.625f, 
+0.0f, 0.3533f, 2.367f, 
+0.0f, 0.225f, 2.25f, 
+-1.132f, 0.9053f, 2.659f, 
+-1.03f, 0.5766f, 2.422f, 
+-0.9291f, 0.3533f, 2.184f, 
+-0.8831f, 0.225f, 2.076f, 
+-2.047f, 0.9053f, 2.047f, 
+-1.864f, 0.5766f, 1.864f, 
+-1.681f, 0.3533f, 1.681f, 
+-1.597f, 0.225f, 1.597f, 
+-2.659f, 0.9053f, 1.132f, 
+-2.422f, 0.5766f, 1.03f, 
+-2.184f, 0.3533f, 0.9291f, 
+-2.076f, 0.225f, 0.8831f, 
+-2.883f, 0.9053f, 0.0f, 
+-2.625f, 0.5766f, 0.0f, 
+-2.367f, 0.3533f, 0.0f, 
+-2.25f, 0.225f, 0.0f, 
+-2.659f, 0.9053f, -1.132f, 
+-2.422f, 0.5766f, -1.03f, 
+-2.184f, 0.3533f, -0.9291f, 
+-2.076f, 0.225f, -0.8831f, 
+-2.047f, 0.9053f, -2.047f, 
+-1.864f, 0.5766f, -1.864f, 
+-1.681f, 0.3533f, -1.681f, 
+-1.597f, 0.225f, -1.597f, 
+-1.132f, 0.9053f, -2.659f, 
+-1.03f, 0.5766f, -2.422f, 
+-0.9291f, 0.3533f, -2.184f, 
+-0.8831f, 0.225f, -2.076f, 
+0.0f, 0.9053f, -2.883f, 
+0.0f, 0.5766f, -2.625f, 
+0.0f, 0.3533f, -2.367f, 
+0.0f, 0.225f, -2.25f, 
+1.132f, 0.9053f, -2.659f, 
+1.03f, 0.5766f, -2.422f, 
+0.9291f, 0.3533f, -2.184f, 
+0.8831f, 0.225f, -2.076f, 
+2.047f, 0.9053f, -2.047f, 
+1.864f, 0.5766f, -1.864f, 
+1.681f, 0.3533f, -1.681f, 
+1.597f, 0.225f, -1.597f, 
+2.659f, 0.9053f, -1.132f, 
+2.422f, 0.5766f, -1.03f, 
+2.184f, 0.3533f, -0.9291f, 
+2.076f, 0.225f, -0.8831f, 
+2.199f, 0.1424f, 0.0f, 
+1.927f, 0.07031f, 0.0f, 
+1.253f, 0.01934f, 0.0f, 
+0.0f, 0.0f, 0.0f, 
+2.029f, 0.1424f, 0.8631f, 
+1.777f, 0.07031f, 0.7562f, 
+1.156f, 0.01934f, 0.4919f, 
+1.561f, 0.1424f, 1.561f, 
+1.368f, 0.07031f, 1.368f, 
+0.8899f, 0.01934f, 0.8899f, 
+0.8631f, 0.1424f, 2.029f, 
+0.7562f, 0.07031f, 1.777f, 
+0.4919f, 0.01934f, 1.156f, 
+0.0f, 0.1424f, 2.199f, 
+0.0f, 0.07031f, 1.927f, 
+0.0f, 0.01934f, 1.253f, 
+-0.8631f, 0.1424f, 2.029f, 
+-0.7562f, 0.07031f, 1.777f, 
+-0.4919f, 0.01934f, 1.156f, 
+-1.561f, 0.1424f, 1.561f, 
+-1.368f, 0.07031f, 1.368f, 
+-0.8899f, 0.01934f, 0.8899f, 
+-2.029f, 0.1424f, 0.8631f, 
+-1.777f, 0.07031f, 0.7562f, 
+-1.156f, 0.01934f, 0.4919f, 
+-2.199f, 0.1424f, 0.0f, 
+-1.927f, 0.07031f, 0.0f, 
+-1.253f, 0.01934f, 0.0f, 
+-2.029f, 0.1424f, -0.8631f, 
+-1.777f, 0.07031f, -0.7562f, 
+-1.156f, 0.01934f, -0.4919f, 
+-1.561f, 0.1424f, -1.561f, 
+-1.368f, 0.07031f, -1.368f, 
+-0.8899f, 0.01934f, -0.8899f, 
+-0.8631f, 0.1424f, -2.029f, 
+-0.7562f, 0.07031f, -1.777f, 
+-0.4919f, 0.01934f, -1.156f, 
+0.0f, 0.1424f, -2.199f, 
+0.0f, 0.07031f, -1.927f, 
+0.0f, 0.01934f, -1.253f, 
+0.8631f, 0.1424f, -2.029f, 
+0.7562f, 0.07031f, -1.777f, 
+0.4919f, 0.01934f, -1.156f, 
+1.561f, 0.1424f, -1.561f, 
+1.368f, 0.07031f, -1.368f, 
+0.8899f, 0.01934f, -0.8899f, 
+2.029f, 0.1424f, -0.8631f, 
+1.777f, 0.07031f, -0.7562f, 
+1.156f, 0.01934f, -0.4919f, 
+-2.4f, 3.038f, 0.0f, 
+-3.101f, 3.032f, 0.0f, 
+-3.619f, 2.995f, 0.0f, 
+-3.94f, 2.895f, 0.0f, 
+-4.05f, 2.7f, 0.0f, 
+-2.377f, 3.09f, 0.2531f, 
+-3.122f, 3.084f, 0.2531f, 
+-3.669f, 3.041f, 0.2531f, 
+-4.005f, 2.926f, 0.2531f, 
+-4.12f, 2.7f, 0.2531f, 
+-2.325f, 3.206f, 0.3375f, 
+-3.168f, 3.198f, 0.3375f, 
+-3.778f, 3.143f, 0.3375f, 
+-4.15f, 2.993f, 0.3375f, 
+-4.275f, 2.7f, 0.3375f, 
+-2.273f, 3.322f, 0.2531f, 
+-3.214f, 3.313f, 0.2531f, 
+-3.888f, 3.244f, 0.2531f, 
+-4.294f, 3.06f, 0.2531f, 
+-4.43f, 2.7f, 0.2531f, 
+-2.25f, 3.375f, 0.0f, 
+-3.234f, 3.364f, 0.0f, 
+-3.938f, 3.291f, 0.0f, 
+-4.359f, 3.09f, 0.0f, 
+-4.5f, 2.7f, 0.0f, 
+-2.273f, 3.322f, -0.2531f, 
+-3.214f, 3.313f, -0.2531f, 
+-3.888f, 3.244f, -0.2531f, 
+-4.294f, 3.06f, -0.2531f, 
+-4.43f, 2.7f, -0.2531f, 
+-2.325f, 3.206f, -0.3375f, 
+-3.168f, 3.198f, -0.3375f, 
+-3.778f, 3.143f, -0.3375f, 
+-4.15f, 2.993f, -0.3375f, 
+-4.275f, 2.7f, -0.3375f, 
+-2.377f, 3.09f, -0.2531f, 
+-3.122f, 3.084f, -0.2531f, 
+-3.669f, 3.041f, -0.2531f, 
+-4.005f, 2.926f, -0.2531f, 
+-4.12f, 2.7f, -0.2531f, 
+-3.991f, 2.394f, 0.0f, 
+-3.806f, 2.025f, 0.0f, 
+-3.48f, 1.656f, 0.0f, 
+-3.0f, 1.35f, 0.0f, 
+-4.055f, 2.365f, 0.2531f, 
+-3.852f, 1.98f, 0.2531f, 
+-3.496f, 1.6f, 0.2531f, 
+-2.977f, 1.28f, 0.2531f, 
+-4.196f, 2.3f, 0.3375f, 
+-3.952f, 1.881f, 0.3375f, 
+-3.531f, 1.478f, 0.3375f, 
+-2.925f, 1.125f, 0.3375f, 
+-4.336f, 2.235f, 0.2531f, 
+-4.051f, 1.782f, 0.2531f, 
+-3.566f, 1.356f, 0.2531f, 
+-2.873f, 0.9703f, 0.2531f, 
+-4.4f, 2.205f, 0.0f, 
+-4.097f, 1.737f, 0.0f, 
+-3.582f, 1.3f, 0.0f, 
+-2.85f, 0.9f, 0.0f, 
+-4.336f, 2.235f, -0.2531f, 
+-4.051f, 1.782f, -0.2531f, 
+-3.566f, 1.356f, -0.2531f, 
+-2.873f, 0.9703f, -0.2531f, 
+-4.196f, 2.3f, -0.3375f, 
+-3.952f, 1.881f, -0.3375f, 
+-3.531f, 1.478f, -0.3375f, 
+-2.925f, 1.125f, -0.3375f, 
+-4.055f, 2.365f, -0.2531f, 
+-3.852f, 1.98f, -0.2531f, 
+-3.496f, 1.6f, -0.2531f, 
+-2.977f, 1.28f, -0.2531f, 
+2.55f, 2.137f, 0.0f, 
+3.27f, 2.303f, 0.0f, 
+3.581f, 2.7f, 0.0f, 
+3.752f, 3.182f, 0.0f, 
+4.05f, 3.6f, 0.0f, 
+2.55f, 1.944f, 0.5569f, 
+3.324f, 2.159f, 0.5028f, 
+3.652f, 2.617f, 0.3839f, 
+3.838f, 3.151f, 0.265f, 
+4.191f, 3.6f, 0.2109f, 
+2.55f, 1.519f, 0.7425f, 
+3.445f, 1.844f, 0.6704f, 
+3.806f, 2.433f, 0.5119f, 
+4.027f, 3.085f, 0.3533f, 
+4.5f, 3.6f, 0.2813f, 
+2.55f, 1.093f, 0.5569f, 
+3.566f, 1.529f, 0.5028f, 
+3.961f, 2.249f, 0.3839f, 
+4.215f, 3.018f, 0.265f, 
+4.809f, 3.6f, 0.2109f, 
+2.55f, 0.9f, 0.0f, 
+3.621f, 1.385f, 0.0f, 
+4.031f, 2.166f, 0.0f, 
+4.301f, 2.988f, 0.0f, 
+4.95f, 3.6f, 0.0f, 
+2.55f, 1.093f, -0.5569f, 
+3.566f, 1.529f, -0.5028f, 
+3.961f, 2.249f, -0.3839f, 
+4.215f, 3.018f, -0.265f, 
+4.809f, 3.6f, -0.2109f, 
+2.55f, 1.519f, -0.7425f, 
+3.445f, 1.844f, -0.6704f, 
+3.806f, 2.433f, -0.5119f, 
+4.027f, 3.085f, -0.3533f, 
+4.5f, 3.6f, -0.2813f, 
+2.55f, 1.944f, -0.5569f, 
+3.324f, 2.159f, -0.5028f, 
+3.652f, 2.617f, -0.3839f, 
+3.838f, 3.151f, -0.265f, 
+4.191f, 3.6f, -0.2109f, 
+4.158f, 3.663f, 0.0f, 
+4.238f, 3.684f, 0.0f, 
+4.261f, 3.663f, 0.0f, 
+4.2f, 3.6f, 0.0f, 
+4.308f, 3.666f, 0.1978f, 
+4.379f, 3.689f, 0.1687f, 
+4.381f, 3.668f, 0.1397f, 
+4.294f, 3.6f, 0.1266f, 
+4.64f, 3.673f, 0.2637f, 
+4.69f, 3.7f, 0.225f, 
+4.645f, 3.677f, 0.1863f, 
+4.5f, 3.6f, 0.1688f, 
+4.971f, 3.68f, 0.1978f, 
+5.001f, 3.711f, 0.1687f, 
+4.909f, 3.687f, 0.1397f, 
+4.706f, 3.6f, 0.1266f, 
+5.122f, 3.683f, 0.0f, 
+5.142f, 3.716f, 0.0f, 
+5.029f, 3.691f, 0.0f, 
+4.8f, 3.6f, 0.0f, 
+4.971f, 3.68f, -0.1978f, 
+5.001f, 3.711f, -0.1687f, 
+4.909f, 3.687f, -0.1397f, 
+4.706f, 3.6f, -0.1266f, 
+4.64f, 3.673f, -0.2637f, 
+4.69f, 3.7f, -0.225f, 
+4.645f, 3.677f, -0.1863f, 
+4.5f, 3.6f, -0.1688f, 
+4.308f, 3.666f, -0.1978f, 
+4.379f, 3.689f, -0.1687f, 
+4.381f, 3.668f, -0.1397f, 
+4.294f, 3.6f, -0.1266f, 
+0.0f, 4.725f, 0.0f, 
+0.5109f, 4.651f, 0.0f, 
+0.4875f, 4.472f, 0.0f, 
+0.2953f, 4.25f, 0.0f, 
+0.3f, 4.05f, 0.0f, 
+0.4715f, 4.651f, 0.2011f, 
+0.4499f, 4.472f, 0.1918f, 
+0.2725f, 4.25f, 0.1161f, 
+0.2768f, 4.05f, 0.1178f, 
+0.3632f, 4.651f, 0.3632f, 
+0.3465f, 4.472f, 0.3465f, 
+0.2098f, 4.25f, 0.2098f, 
+0.213f, 4.05f, 0.213f, 
+0.2011f, 4.651f, 0.4715f, 
+0.1918f, 4.472f, 0.4499f, 
+0.1161f, 4.25f, 0.2725f, 
+0.1178f, 4.05f, 0.2768f, 
+0.0f, 4.651f, 0.5109f, 
+0.0f, 4.472f, 0.4875f, 
+0.0f, 4.25f, 0.2953f, 
+0.0f, 4.05f, 0.3f, 
+-0.2011f, 4.651f, 0.4715f, 
+-0.1918f, 4.472f, 0.4499f, 
+-0.1161f, 4.25f, 0.2725f, 
+-0.1178f, 4.05f, 0.2768f, 
+-0.3632f, 4.651f, 0.3632f, 
+-0.3465f, 4.472f, 0.3465f, 
+-0.2098f, 4.25f, 0.2098f, 
+-0.213f, 4.05f, 0.213f, 
+-0.4715f, 4.651f, 0.2011f, 
+-0.4499f, 4.472f, 0.1918f, 
+-0.2725f, 4.25f, 0.1161f, 
+-0.2768f, 4.05f, 0.1178f, 
+-0.5109f, 4.651f, 0.0f, 
+-0.4875f, 4.472f, 0.0f, 
+-0.2953f, 4.25f, 0.0f, 
+-0.3f, 4.05f, 0.0f, 
+-0.4715f, 4.651f, -0.2011f, 
+-0.4499f, 4.472f, -0.1918f, 
+-0.2725f, 4.25f, -0.1161f, 
+-0.2768f, 4.05f, -0.1178f, 
+-0.3632f, 4.651f, -0.3632f, 
+-0.3465f, 4.472f, -0.3465f, 
+-0.2098f, 4.25f, -0.2098f, 
+-0.213f, 4.05f, -0.213f, 
+-0.2011f, 4.651f, -0.4715f, 
+-0.1918f, 4.472f, -0.4499f, 
+-0.1161f, 4.25f, -0.2725f, 
+-0.1178f, 4.05f, -0.2768f, 
+0.0f, 4.651f, -0.5109f, 
+0.0f, 4.472f, -0.4875f, 
+0.0f, 4.25f, -0.2953f, 
+0.0f, 4.05f, -0.3f, 
+0.2011f, 4.651f, -0.4715f, 
+0.1918f, 4.472f, -0.4499f, 
+0.1161f, 4.25f, -0.2725f, 
+0.1178f, 4.05f, -0.2768f, 
+0.3632f, 4.651f, -0.3632f, 
+0.3465f, 4.472f, -0.3465f, 
+0.2098f, 4.25f, -0.2098f, 
+0.213f, 4.05f, -0.213f, 
+0.4715f, 4.651f, -0.2011f, 
+0.4499f, 4.472f, -0.1918f, 
+0.2725f, 4.25f, -0.1161f, 
+0.2768f, 4.05f, -0.1178f, 
+0.6844f, 3.916f, 0.0f, 
+1.237f, 3.825f, 0.0f, 
+1.734f, 3.734f, 0.0f, 
+1.95f, 3.6f, 0.0f, 
+0.6313f, 3.916f, 0.2686f, 
+1.142f, 3.825f, 0.4857f, 
+1.6f, 3.734f, 0.6807f, 
+1.799f, 3.6f, 0.7654f, 
+0.4859f, 3.916f, 0.4859f, 
+0.8786f, 3.825f, 0.8786f, 
+1.231f, 3.734f, 1.231f, 
+1.385f, 3.6f, 1.385f, 
+0.2686f, 3.916f, 0.6313f, 
+0.4857f, 3.825f, 1.142f, 
+0.6807f, 3.734f, 1.6f, 
+0.7654f, 3.6f, 1.799f, 
+0.0f, 3.916f, 0.6844f, 
+0.0f, 3.825f, 1.237f, 
+0.0f, 3.734f, 1.734f, 
+0.0f, 3.6f, 1.95f, 
+-0.2686f, 3.916f, 0.6313f, 
+-0.4857f, 3.825f, 1.142f, 
+-0.6807f, 3.734f, 1.6f, 
+-0.7654f, 3.6f, 1.799f, 
+-0.4859f, 3.916f, 0.4859f, 
+-0.8786f, 3.825f, 0.8786f, 
+-1.231f, 3.734f, 1.231f, 
+-1.385f, 3.6f, 1.385f, 
+-0.6313f, 3.916f, 0.2686f, 
+-1.142f, 3.825f, 0.4857f, 
+-1.6f, 3.734f, 0.6807f, 
+-1.799f, 3.6f, 0.7654f, 
+-0.6844f, 3.916f, 0.0f, 
+-1.237f, 3.825f, 0.0f, 
+-1.734f, 3.734f, 0.0f, 
+-1.95f, 3.6f, 0.0f, 
+-0.6313f, 3.916f, -0.2686f, 
+-1.142f, 3.825f, -0.4857f, 
+-1.6f, 3.734f, -0.6807f, 
+-1.799f, 3.6f, -0.7654f, 
+-0.4859f, 3.916f, -0.4859f, 
+-0.8786f, 3.825f, -0.8786f, 
+-1.231f, 3.734f, -1.231f, 
+-1.385f, 3.6f, -1.385f, 
+-0.2686f, 3.916f, -0.6313f, 
+-0.4857f, 3.825f, -1.142f, 
+-0.6807f, 3.734f, -1.6f, 
+-0.7654f, 3.6f, -1.799f, 
+0.0f, 3.916f, -0.6844f, 
+0.0f, 3.825f, -1.237f, 
+0.0f, 3.734f, -1.734f, 
+0.0f, 3.6f, -1.95f, 
+0.2686f, 3.916f, -0.6313f, 
+0.4857f, 3.825f, -1.142f, 
+0.6807f, 3.734f, -1.6f, 
+0.7654f, 3.6f, -1.799f, 
+0.4859f, 3.916f, -0.4859f, 
+0.8786f, 3.825f, -0.8786f, 
+1.231f, 3.734f, -1.231f, 
+1.385f, 3.6f, -1.385f, 
+0.6313f, 3.916f, -0.2686f, 
+1.142f, 3.825f, -0.4857f, 
+1.6f, 3.734f, -0.6807f, 
+1.799f, 3.6f, -0.7654f
+};
+
+
+/* 530 normals */
+const int numNormals = 530;
+const float normals[530][3] = {
+0.0486f, -0.9986f, 0.0168f, 
+0.9976f, -0.0678f, -0.0008f, 
+-0.233f, 0.8502f, -0.4719f, 
+-0.2299f, 0.9679f, 0.1004f, 
+-0.1648f, 0.985f, 0.0501f, 
+-0.0117f, 0.7461f, 0.6656f, 
+-0.0888f, 0.9692f, 0.2294f, 
+0.6449f, -0.7172f, -0.2637f, 
+-0.066f, 0.9851f, 0.1583f, 
+-0.6585f, -0.342f, -0.6703f, 
+-0.293f, 0.9558f, 0.0209f, 
+0.179f, 0.9825f, -0.0513f, 
+-0.0094f, 0.903f, 0.4295f, 
+-0.0059f, -0.986f, -0.1662f, 
+-0.7355f, 0.6774f, -0.0026f, 
+-0.997f, 0.0763f, 0.0019f, 
+-0.1478f, 0.9333f, 0.3271f, 
+-0.3014f, -0.6034f, -0.7382f, 
+-0.7048f, -0.0681f, 0.706f, 
+-0.3361f, 0.9332f, 0.1263f, 
+0.3709f, 0.1524f, -0.916f, 
+-0.3399f, -0.4121f, 0.8453f, 
+0.1921f, 0.9724f, -0.1316f, 
+-0.2671f, 0.7429f, 0.6137f, 
+0.0888f, 0.9692f, -0.2294f, 
+0.066f, 0.9851f, -0.1583f, 
+0.9411f, 0.338f, 0.001f, 
+0.8666f, -0.2559f, 0.4282f, 
+-0.8029f, 0.4968f, 0.3293f, 
+-0.0008f, -0.0678f, -0.9976f, 
+-0.8453f, -0.4121f, -0.3399f, 
+-0.4801f, -0.8741f, 0.0733f, 
+0.6355f, -0.772f, 0.0006f, 
+-0.9215f, -0.0678f, 0.3822f, 
+-0.6698f, -0.6907f, -0.2723f, 
+0.3734f, 0.876f, -0.3051f, 
+0.3548f, -0.4118f, 0.8393f, 
+-0.3629f, 0.2429f, 0.8995f, 
+0.9033f, 0.2079f, 0.375f, 
+-0.2824f, 0.5939f, 0.7532f, 
+0.8938f, 0.4452f, 0.0532f, 
+0.1478f, 0.9333f, -0.3271f, 
+0.0085f, -0.0031f, -0.9999f, 
+0.3595f, 0.933f, 0.0115f, 
+0.8995f, 0.2429f, 0.3629f, 
+0.7048f, -0.0681f, -0.706f, 
+-0.6428f, -0.7172f, -0.2688f, 
+0.6366f, -0.447f, 0.6283f, 
+-0.1213f, -0.9861f, -0.1128f, 
+0.8003f, 0.4978f, 0.334f, 
+0.3361f, 0.9332f, -0.1263f, 
+0.3399f, -0.4121f, -0.8453f, 
+-0.3909f, 0.4452f, 0.8055f, 
+0.0117f, 0.7462f, -0.6655f, 
+0.9215f, -0.0678f, -0.3822f, 
+0.3582f, -0.7656f, 0.5343f, 
+-0.9782f, 0.2075f, -0.0011f, 
+0.2824f, 0.5939f, -0.7532f, 
+0.035f, -0.8413f, 0.5393f, 
+-0.8044f, 0.5934f, 0.0262f, 
+-0.1128f, -0.9861f, 0.1213f, 
+0.13f, -0.1396f, 0.9816f, 
+0.6644f, 0.3392f, 0.6659f, 
+-0.0042f, -0.6898f, -0.7239f, 
+-0.1587f, 0.9851f, 0.065f, 
+-0.8719f, -0.3415f, 0.3508f, 
+0.6486f, 0.4756f, -0.5941f, 
+-0.4991f, 0.8499f, -0.1684f, 
+-0.3969f, 0.6342f, -0.6634f, 
+0.7041f, -0.3863f, -0.5956f, 
+0.3909f, 0.4452f, -0.8055f, 
+-0.0391f, -0.0113f, 0.9991f, 
+-0.3321f, 0.5936f, -0.733f, 
+0.8523f, -0.5219f, -0.0338f, 
+0.329f, 0.4978f, 0.8023f, 
+0.8044f, 0.5934f, -0.0262f, 
+0.1128f, -0.9861f, -0.1213f, 
+0.0178f, 0.9861f, -0.1651f, 
+0.3491f, 0.4045f, 0.8452f, 
+-0.2727f, 0.8505f, 0.4496f, 
+0.065f, 0.9851f, 0.1587f, 
+-0.0005f, 0.4037f, 0.9148f, 
+-0.0077f, -0.4109f, -0.9116f, 
+0.5609f, -0.604f, 0.5661f, 
+0.8236f, 0.5668f, -0.0138f, 
+0.1587f, 0.9851f, -0.065f, 
+0.8719f, -0.3415f, -0.3508f, 
+-0.7382f, -0.6034f, 0.3014f, 
+0.0346f, 0.8495f, 0.5263f, 
+-0.4373f, -0.7921f, -0.4257f, 
+-0.0532f, 0.4452f, 0.8938f, 
+0.0689f, -0.9861f, 0.1509f, 
+-0.1509f, -0.9861f, 0.0689f, 
+0.7706f, -0.2424f, -0.5893f, 
+-0.7543f, -0.6564f, 0.0105f, 
+0.0005f, 0.4037f, -0.9148f, 
+-0.9116f, -0.4109f, 0.0077f, 
+0.0058f, -0.0438f, 0.999f, 
+0.1719f, 0.985f, 0.0005f, 
+-0.1697f, 0.9693f, 0.1774f, 
+0.5874f, -0.5124f, 0.6263f, 
+0.7382f, -0.6034f, -0.3014f, 
+-0.1518f, 0.985f, -0.081f, 
+0.646f, 0.4051f, 0.6468f, 
+0.334f, 0.4978f, -0.8003f, 
+-0.7354f, -0.6034f, -0.3082f, 
+-0.6919f, 0.2428f, -0.6798f, 
+0.0532f, 0.4452f, -0.8938f, 
+0.3547f, -0.3173f, 0.8794f, 
+0.9879f, -0.1547f, -0.0033f, 
+-0.0462f, -0.9986f, 0.0223f, 
+-0.6088f, 0.4806f, 0.6311f, 
+-0.109f, -0.1969f, -0.9743f, 
+0.1509f, -0.9861f, -0.0689f, 
+-0.0568f, 0.9983f, 0.0009f, 
+0.9074f, -0.3096f, -0.2839f, 
+0.8677f, 0.4969f, 0.0026f, 
+-0.2723f, -0.6907f, 0.6698f, 
+-0.4734f, -0.6798f, 0.5599f, 
+0.9116f, -0.4109f, -0.0077f, 
+0.1697f, 0.9693f, -0.1774f, 
+0.5875f, 0.5937f, 0.5497f, 
+-0.3232f, 0.6846f, 0.6533f, 
+-0.5078f, -0.6913f, 0.5139f, 
+-0.4612f, 0.7474f, -0.478f, 
+-0.2071f, -0.8049f, 0.556f, 
+-0.6976f, -0.7164f, -0.0027f, 
+-0.8697f, 0.3388f, 0.3587f, 
+0.0462f, -0.9986f, -0.0223f, 
+0.2723f, -0.6907f, -0.6698f, 
+-0.829f, -0.4466f, -0.3365f, 
+0.9148f, 0.4037f, 0.0005f, 
+-0.1583f, 0.9851f, -0.066f, 
+0.148f, 0.9838f, 0.1002f, 
+-0.1717f, 0.985f, -0.0162f, 
+-0.4282f, -0.2559f, 0.8666f, 
+0.3094f, -0.2556f, 0.9159f, 
+0.2803f, -0.6907f, 0.6665f, 
+-0.6154f, 0.497f, 0.6117f, 
+-0.0262f, 0.5934f, -0.8044f, 
+0.0286f, 0.1639f, -0.986f, 
+-0.6924f, 0.2083f, 0.6907f, 
+-0.0105f, 0.9975f, -0.0685f, 
+0.5078f, -0.6913f, -0.5139f, 
+0.2071f, -0.8049f, -0.556f, 
+-0.4903f, -0.7178f, -0.4942f, 
+-0.2637f, -0.7172f, -0.6449f, 
+-0.3822f, -0.0678f, -0.9215f, 
+0.8697f, 0.3388f, -0.3587f, 
+0.2461f, -0.805f, 0.5397f, 
+-0.2615f, 0.9334f, 0.2452f, 
+0.6187f, 0.747f, -0.243f, 
+0.0375f, -0.8401f, -0.5411f, 
+0.0054f, 0.9691f, 0.2464f, 
+0.3587f, 0.3388f, 0.8697f, 
+0.3993f, 0.6582f, -0.6381f, 
+-0.3476f, -0.4464f, -0.8245f, 
+0.099f, 0.9692f, 0.2251f, 
+-0.3666f, -0.3412f, 0.8655f, 
+0.0396f, 0.153f, -0.9874f, 
+0.0349f, 0.9969f, -0.0698f, 
+0.1096f, 0.985f, 0.1324f, 
+-0.0578f, -0.9861f, 0.1556f, 
+0.4479f, -0.5145f, -0.7311f, 
+0.6924f, 0.2083f, -0.6907f, 
+0.6096f, 0.747f, 0.265f, 
+-0.3508f, -0.3415f, -0.8719f, 
+-0.6215f, 0.4454f, -0.6443f, 
+-0.4942f, -0.7178f, 0.4903f, 
+-0.9402f, -0.3403f, -0.0085f, 
+0.0056f, -0.0358f, 0.9993f, 
+0.2615f, 0.9334f, -0.2452f, 
+-0.0024f, 0.0291f, -0.9995f, 
+-0.2667f, 0.9637f, -0.001f, 
+0.0569f, -0.2712f, -0.9608f, 
+0.7463f, 0.254f, 0.615f, 
+0.5153f, 0.6516f, -0.5564f, 
+0.0223f, -0.9986f, 0.0462f, 
+0.3666f, -0.3412f, -0.8655f, 
+0.0578f, -0.9861f, -0.1556f, 
+0.6111f, 0.4984f, 0.6148f, 
+-0.243f, 0.747f, -0.6187f, 
+-0.0092f, 0.2338f, -0.9722f, 
+0.478f, 0.7474f, -0.4612f, 
+-0.0058f, -0.4457f, -0.8951f, 
+-0.4856f, -0.6774f, -0.5524f, 
+0.54f, 0.6414f, 0.5448f, 
+-0.3365f, -0.4466f, 0.829f, 
+-0.2257f, 0.795f, 0.5629f, 
+0.8055f, 0.4452f, 0.3909f, 
+0.3729f, 0.208f, 0.9042f, 
+-0.727f, -0.2562f, 0.6369f, 
+-0.0514f, -0.9986f, 0.0029f, 
+0.9159f, 0.1555f, -0.3699f, 
+0.0019f, -0.2377f, -0.9713f, 
+0.4942f, -0.7178f, -0.4903f, 
+0.6497f, -0.4127f, 0.6383f, 
+0.0089f, 0.0486f, -0.9987f, 
+-0.0213f, 0.6301f, -0.7761f, 
+-0.9269f, -0.3751f, 0.0038f, 
+-0.1215f, 0.9852f, 0.1207f, 
+-0.5856f, 0.5198f, 0.6218f, 
+0.8655f, -0.3412f, 0.3666f, 
+-0.2464f, 0.9691f, 0.0054f, 
+0.0123f, 0.1386f, 0.9902f, 
+0.0179f, -0.0369f, 0.9991f, 
+-0.1207f, 0.9852f, -0.1215f, 
+-0.0081f, 0.5671f, 0.8235f, 
+-0.8689f, 0.3387f, -0.3607f, 
+0.0062f, 0.0309f, -0.9995f, 
+0.3365f, -0.4466f, -0.829f, 
+-0.3787f, 0.2424f, -0.8931f, 
+-0.2904f, 0.4454f, -0.8468f, 
+-0.8707f, 0.4915f, 0.0133f, 
+0.163f, -0.8182f, 0.5512f, 
+0.4337f, -0.8052f, 0.4041f, 
+0.0514f, -0.9986f, -0.0029f, 
+-0.0084f, 0.1303f, 0.9914f, 
+-0.706f, -0.0681f, -0.7048f, 
+-0.556f, -0.8049f, -0.2071f, 
+0.8448f, 0.4045f, 0.3501f, 
+0.4259f, -0.5474f, 0.7203f, 
+-0.6907f, 0.2083f, -0.6924f, 
+0.1215f, 0.9852f, -0.1207f, 
+-0.1263f, 0.9332f, -0.3361f, 
+0.7711f, -0.0741f, -0.6323f, 
+0.2464f, 0.9691f, -0.0054f, 
+0.1774f, 0.9693f, 0.1697f, 
+-0.9042f, 0.208f, 0.3729f, 
+-0.8393f, -0.4118f, 0.3548f, 
+0.6888f, -0.7219f, -0.0648f, 
+0.1556f, -0.9861f, 0.0578f, 
+0.3271f, 0.9333f, 0.1478f, 
+-0.0024f, 0.2379f, 0.9712f, 
+-0.0026f, 0.4969f, 0.8677f, 
+0.0f, 1.0f, 0.0f, 
+0.1912f, -0.9815f, -0.0025f, 
+-0.3762f, -0.6681f, 0.6418f, 
+-0.7759f, 0.0432f, 0.6292f, 
+-0.0208f, -0.8044f, -0.5936f, 
+-0.2274f, 0.8822f, -0.4122f, 
+0.7532f, 0.5939f, 0.2824f, 
+-0.9221f, -0.0681f, -0.3807f, 
+-0.2198f, 0.8494f, 0.4796f, 
+0.0065f, -0.7656f, 0.6431f, 
+-0.5876f, 0.4472f, -0.6742f, 
+0.7981f, -0.6024f, 0.0036f, 
+-0.0383f, -0.9986f, -0.0341f, 
+-0.6369f, -0.2562f, -0.727f, 
+-0.5497f, 0.5937f, 0.5875f, 
+0.1084f, 0.9431f, 0.314f, 
+0.9042f, 0.208f, -0.3729f, 
+-0.6659f, 0.3392f, 0.6644f, 
+0.8393f, -0.4118f, -0.3548f, 
+0.0029f, -0.9986f, 0.0514f, 
+-0.9647f, -0.2552f, -0.0635f, 
+-0.2294f, 0.9692f, -0.0888f, 
+0.0026f, 0.4969f, -0.8677f, 
+0.2452f, 0.9334f, 0.2615f, 
+0.5171f, -0.4876f, -0.7033f, 
+-0.8951f, -0.4457f, 0.0058f, 
+-0.5936f, -0.8044f, 0.0208f, 
+0.5642f, -0.5426f, -0.6222f, 
+0.5938f, 0.4451f, 0.6702f, 
+0.5497f, 0.5937f, -0.5875f, 
+0.6657f, 0.4653f, 0.5832f, 
+0.4857f, -0.6243f, 0.6117f, 
+-0.0486f, -0.9986f, -0.0168f, 
+-0.6468f, 0.4051f, 0.646f, 
+0.6659f, 0.3392f, -0.6644f, 
+0.1833f, 0.9735f, -0.1365f, 
+0.3955f, 0.8505f, 0.3465f, 
+0.5139f, -0.6913f, 0.5078f, 
+0.8023f, 0.4978f, -0.329f, 
+-0.001f, 0.338f, 0.9411f, 
+-0.2496f, 0.8321f, -0.4951f, 
+0.8951f, -0.4457f, -0.0058f, 
+0.233f, 0.8502f, 0.4719f, 
+-0.0168f, -0.9986f, 0.0486f, 
+0.5936f, -0.8044f, -0.0208f, 
+-0.05f, 0.3155f, 0.9475f, 
+0.6585f, -0.342f, 0.6703f, 
+0.4909f, -0.1864f, -0.8509f, 
+-0.37f, 0.9238f, -0.0973f, 
+0.6468f, 0.4051f, -0.646f, 
+0.0059f, -0.986f, 0.1662f, 
+-0.3724f, 0.9278f, -0.0202f, 
+-0.3501f, 0.4045f, 0.8448f, 
+-0.0425f, 0.8398f, -0.5411f, 
+-0.1684f, 0.8499f, 0.4991f, 
+-0.6665f, -0.6907f, 0.2803f, 
+-0.2251f, 0.9692f, 0.099f, 
+0.9241f, -0.3816f, -0.0169f, 
+0.001f, 0.338f, -0.9411f, 
+-0.9411f, 0.338f, -0.001f, 
+-0.8666f, -0.2559f, -0.4282f, 
+0.0262f, 0.5183f, -0.8547f, 
+0.3014f, -0.6034f, 0.7382f, 
+0.0168f, -0.9986f, -0.0486f, 
+-0.3548f, -0.4118f, -0.8393f, 
+-0.6023f, -0.5297f, 0.5971f, 
+-0.9033f, 0.2079f, -0.375f, 
+-0.8938f, 0.4452f, -0.0532f, 
+0.6044f, 0.7397f, 0.2957f, 
+0.0008f, -0.0678f, 0.9976f, 
+0.7058f, 0.0906f, -0.7025f, 
+0.8453f, -0.4121f, 0.3399f, 
+-0.3595f, 0.933f, -0.0115f, 
+0.6698f, -0.6907f, 0.2723f, 
+-0.8995f, 0.2429f, -0.3629f, 
+-0.6366f, -0.447f, -0.6283f, 
+0.3501f, 0.4045f, -0.8448f, 
+-0.01f, -0.0605f, 0.9981f, 
+-0.8003f, 0.4978f, -0.334f, 
+0.1684f, 0.8499f, -0.4991f, 
+0.6665f, -0.6907f, -0.2803f, 
+0.2251f, 0.9692f, -0.099f, 
+-0.0036f, -0.6024f, 0.7981f, 
+0.6637f, -0.2967f, -0.6865f, 
+-0.081f, 0.985f, 0.1518f, 
+0.0084f, 0.2423f, 0.9701f, 
+0.0071f, -0.9029f, -0.4296f, 
+-0.8679f, 0.4966f, -0.0026f, 
+0.0123f, 0.5735f, 0.819f, 
+-0.0005f, 0.985f, 0.1719f, 
+0.6428f, -0.7172f, 0.2688f, 
+0.6588f, -0.3366f, 0.6727f, 
+0.1213f, -0.9861f, 0.1128f, 
+-0.8931f, 0.2424f, 0.3787f, 
+-0.1662f, -0.986f, 0.0059f, 
+0.9994f, 0.0313f, 0.0095f, 
+0.762f, -0.146f, 0.6308f, 
+-0.7731f, 0.0861f, -0.6283f, 
+-0.6644f, 0.3392f, -0.6659f, 
+-0.0027f, -0.7164f, 0.6976f, 
+0.0036f, -0.6024f, -0.7981f, 
+0.9782f, 0.2075f, 0.0011f, 
+0.0405f, -0.9991f, -0.0018f, 
+0.6882f, -0.703f, 0.179f, 
+-0.0115f, 0.933f, 0.3595f, 
+0.0911f, 0.0518f, -0.9944f, 
+0.0005f, 0.985f, -0.1719f, 
+0.5337f, -0.5852f, -0.6104f, 
+0.0042f, -0.6898f, 0.7239f, 
+0.4863f, 0.2366f, 0.8411f, 
+0.4991f, 0.8499f, 0.1684f, 
+-0.6543f, 0.7561f, 0.0071f, 
+0.265f, 0.747f, -0.6096f, 
+-0.329f, 0.4978f, -0.8023f, 
+0.1662f, -0.986f, -0.0059f, 
+-0.3491f, 0.4045f, -0.8452f, 
+0.3321f, 0.5936f, 0.733f, 
+-0.065f, 0.9851f, -0.1587f, 
+-0.6283f, -0.447f, 0.6366f, 
+0.0027f, -0.7164f, -0.6976f, 
+-0.1316f, 0.6339f, 0.762f, 
+-0.5609f, -0.604f, -0.5661f, 
+-0.8452f, 0.4045f, 0.3491f, 
+-0.5263f, 0.8495f, 0.0346f, 
+0.0115f, 0.933f, -0.3595f, 
+-0.0346f, 0.8495f, -0.5263f, 
+0.0077f, -0.4109f, 0.9116f, 
+0.5758f, -0.8175f, -0.0017f, 
+-0.0011f, 0.2075f, 0.9782f, 
+-0.0689f, -0.9861f, -0.1509f, 
+0.2934f, -0.5928f, -0.7499f, 
+0.0724f, 0.1198f, -0.9901f, 
+-0.7367f, -0.275f, -0.6176f, 
+-0.3131f, 0.8154f, 0.4868f, 
+-0.0114f, 0.0022f, 0.9999f, 
+0.6283f, -0.447f, -0.6366f, 
+0.8452f, 0.4045f, -0.3491f, 
+0.5263f, 0.8495f, -0.0346f, 
+-0.6383f, -0.4127f, 0.6497f, 
+-0.1719f, 0.985f, -0.0005f, 
+-0.6703f, -0.342f, 0.6585f, 
+-0.0085f, -0.3403f, 0.9402f, 
+-0.646f, 0.4051f, -0.6468f, 
+0.0011f, 0.2075f, -0.9782f, 
+-0.7216f, -0.3071f, 0.6204f, 
+0.0282f, 0.0023f, -0.9995f, 
+-0.2483f, 0.6806f, -0.6892f, 
+0.1518f, 0.985f, 0.081f, 
+0.047f, 0.0466f, -0.9978f, 
+0.7354f, -0.6034f, 0.3082f, 
+0.6919f, 0.2428f, 0.6798f, 
+0.4086f, -0.3626f, -0.8375f, 
+0.6383f, -0.4127f, -0.6497f, 
+-0.5875f, 0.5937f, -0.5497f, 
+0.6703f, -0.342f, -0.6585f, 
+-0.8245f, -0.4464f, 0.3476f, 
+0.0085f, -0.3403f, -0.9402f, 
+-0.0591f, -0.0663f, 0.996f, 
+0.0f, -1.0f, 0.0f, 
+0.4612f, 0.7474f, 0.478f, 
+0.6976f, -0.7164f, 0.0027f, 
+-0.9148f, 0.4037f, -0.0005f, 
+0.173f, -0.8158f, -0.5518f, 
+-0.3607f, 0.3387f, 0.8689f, 
+0.7836f, -0.2411f, 0.5724f, 
+-0.1985f, 0.8026f, -0.5623f, 
+-0.3094f, -0.2556f, -0.9159f, 
+-0.2803f, -0.6907f, -0.6665f, 
+0.8245f, -0.4464f, -0.3476f, 
+0.829f, -0.4466f, 0.3365f, 
+-0.4848f, 0.7385f, 0.4683f, 
+0.1583f, 0.9851f, 0.066f, 
+-0.0077f, 0.7656f, -0.6432f, 
+-0.0162f, 0.985f, 0.1717f, 
+0.1717f, 0.985f, 0.0162f, 
+0.0244f, 0.9805f, -0.1949f, 
+-0.2461f, -0.805f, -0.5397f, 
+0.0262f, 0.5934f, 0.8044f, 
+0.142f, 0.1881f, 0.9718f, 
+0.1846f, 0.1002f, 0.9776f, 
+0.4903f, -0.7178f, 0.4942f, 
+0.2637f, -0.7172f, 0.6449f, 
+0.3822f, -0.0678f, 0.9215f, 
+-0.0054f, 0.9691f, -0.2464f, 
+0.3607f, 0.3387f, -0.8689f, 
+-0.3587f, 0.3388f, -0.8697f, 
+-0.5694f, -0.8219f, 0.0081f, 
+-0.1324f, 0.985f, 0.1096f, 
+-0.099f, 0.9692f, -0.2251f, 
+-0.6702f, 0.4451f, 0.5938f, 
+0.0077f, -0.9976f, 0.0684f, 
+-0.5661f, -0.604f, 0.5609f, 
+-0.1096f, 0.985f, -0.1324f, 
+-0.6096f, 0.747f, -0.265f, 
+-0.0015f, 0.0295f, -0.9995f, 
+0.3476f, -0.4464f, 0.8245f, 
+-0.0635f, -0.2552f, 0.9647f, 
+-0.8468f, 0.4454f, 0.2904f, 
+-0.4719f, 0.8502f, 0.233f, 
+-0.0502f, 0.8385f, 0.5425f, 
+-0.6671f, 0.7448f, -0.0116f, 
+0.3508f, -0.3415f, 0.8719f, 
+-0.4119f, 0.6135f, -0.6736f, 
+-0.2688f, -0.7172f, 0.6428f, 
+-0.4041f, -0.8052f, 0.4337f, 
+-0.375f, 0.2079f, 0.9033f, 
+-0.0223f, -0.9986f, -0.0462f, 
+0.6702f, 0.4451f, -0.5938f, 
+0.9402f, -0.3403f, 0.0085f, 
+0.5661f, -0.604f, -0.5609f, 
+-0.6252f, 0.7406f, 0.246f, 
+-0.0341f, -0.9986f, 0.0383f, 
+-0.6111f, 0.4984f, -0.6148f, 
+0.6655f, 0.7462f, 0.0117f, 
+0.1233f, 0.199f, 0.9722f, 
+0.8468f, 0.4454f, -0.2904f, 
+0.7383f, 0.2702f, -0.6179f, 
+-0.8055f, 0.4452f, -0.3909f, 
+-0.3729f, 0.208f, -0.9042f, 
+0.4719f, 0.8502f, -0.233f, 
+0.243f, 0.747f, 0.6187f, 
+-0.6497f, -0.4127f, -0.6383f, 
+-0.5406f, 0.5651f, -0.623f, 
+0.0058f, -0.4457f, 0.8951f, 
+-0.3082f, -0.6034f, 0.7354f, 
+-0.8655f, -0.3412f, -0.3666f, 
+0.2688f, -0.7172f, -0.6428f, 
+0.4041f, -0.8052f, -0.4337f, 
+0.375f, 0.2079f, -0.9033f, 
+0.0341f, -0.9986f, -0.0383f, 
+-0.9701f, 0.2423f, 0.0084f, 
+-0.3807f, -0.0681f, 0.9221f, 
+0.9643f, -0.2551f, 0.0705f, 
+-0.8758f, 0.4808f, 0.0415f, 
+0.1207f, 0.9852f, 0.1215f, 
+0.4821f, 0.7724f, 0.4133f, 
+-0.0522f, 0.9982f, 0.0278f, 
+-0.4337f, -0.8052f, -0.4041f, 
+-0.6164f, 0.4198f, 0.6661f, 
+-0.8448f, 0.4045f, -0.3501f, 
+0.3082f, -0.6034f, -0.7354f, 
+0.8689f, 0.3387f, 0.3607f, 
+0.6894f, -0.7242f, 0.0091f, 
+0.3787f, 0.2424f, 0.8931f, 
+0.2904f, 0.4454f, 0.8468f, 
+0.6148f, 0.4984f, -0.6111f, 
+0.0501f, 0.985f, 0.1648f, 
+-0.5397f, -0.805f, 0.2461f, 
+-0.9159f, -0.2556f, 0.3094f, 
+0.706f, -0.0681f, 0.7048f, 
+-0.3341f, 0.4972f, 0.8006f, 
+0.556f, -0.8049f, 0.2071f, 
+-0.1774f, 0.9693f, -0.1697f, 
+0.6907f, 0.2083f, 0.6924f, 
+0.1263f, 0.9332f, 0.3361f, 
+0.3807f, -0.0681f, -0.9221f, 
+-0.1556f, -0.9861f, -0.0578f, 
+-0.3271f, 0.9333f, -0.1478f, 
+-0.3465f, 0.8505f, 0.3955f, 
+0.5315f, 0.8438f, -0.0735f, 
+0.9737f, 0.2276f, -0.0003f, 
+0.6441f, 0.7648f, -0.0112f, 
+-0.7239f, -0.6898f, 0.0042f, 
+-0.7532f, 0.5939f, -0.2824f, 
+0.1093f, 0.1415f, -0.9838f, 
+0.5397f, -0.805f, -0.2461f, 
+-0.7981f, -0.6024f, -0.0036f, 
+0.9456f, 0.3251f, -0.0052f, 
+0.1278f, 0.9696f, -0.2085f, 
+0.0208f, -0.8044f, 0.5936f, 
+0.1635f, 0.1348f, -0.9772f, 
+-0.733f, 0.5936f, 0.3321f, 
+-0.0505f, 0.9852f, -0.1635f, 
+0.4089f, -0.9069f, -0.1015f, 
+-0.0029f, -0.9986f, -0.0514f, 
+-0.1796f, 0.814f, -0.5522f, 
+0.9221f, -0.0681f, 0.3807f, 
+0.0383f, -0.9986f, 0.0341f, 
+0.6369f, -0.2562f, 0.727f, 
+0.3465f, 0.8505f, -0.3955f, 
+-0.2452f, 0.9334f, -0.2615f, 
+0.4921f, -0.247f, 0.8346f, 
+-0.9976f, -0.0678f, 0.0008f, 
+-0.5396f, 0.8418f, -0.0094f, 
+0.2294f, 0.9692f, 0.0888f, 
+0.7239f, -0.6898f, -0.0042f, 
+-0.4472f, 0.5952f, 0.6675f, 
+-0.6449f, -0.7172f, 0.2637f, 
+0.4543f, 0.2732f, -0.8478f, 
+-0.6798f, 0.2428f, 0.6919f, 
+-0.5938f, 0.4451f, -0.6702f, 
+0.733f, 0.5936f, -0.3321f, 
+-0.3955f, 0.8505f, -0.3465f, 
+-0.5139f, -0.6913f, -0.5078f, 
+-0.623f, -0.5156f, -0.5881f
+};
+
+/* 1 color   */
+/*255 255 0  */
+
+/* 1024 faces */
+/* numIdx fidx0 fidx1 fidx2 nidx0 nidx1 nidx2 coloridx */
+
+const int numFaces = 1024;
+const int faces[1024][8] = {
+3, 0, 5, 6, 255, 295, 309, 0,
+3, 6, 1, 0, 309, 465, 255, 0,
+3, 1, 6, 7, 465, 309, 134, 0,
+3, 7, 2, 1, 134, 4, 465, 0,
+3, 2, 7, 8, 4, 134, 165, 0,
+3, 8, 3, 2, 165, 448, 4, 0,
+3, 3, 8, 9, 448, 165, 49, 0,
+3, 9, 4, 3, 49, 116, 448, 0,
+3, 5, 10, 11, 295, 248, 106, 0,
+3, 11, 6, 5, 106, 309, 295, 0,
+3, 6, 11, 12, 309, 106, 102, 0,
+3, 12, 7, 6, 102, 134, 309, 0,
+3, 7, 12, 13, 134, 102, 394, 0,
+3, 13, 8, 7, 394, 165, 134, 0,
+3, 8, 13, 14, 165, 394, 180, 0,
+3, 14, 9, 8, 180, 49, 165, 0,
+3, 10, 15, 16, 248, 401, 211, 0,
+3, 16, 11, 10, 211, 106, 248, 0,
+3, 11, 16, 17, 106, 211, 427, 0,
+3, 17, 12, 11, 427, 102, 106, 0,
+3, 12, 17, 18, 102, 427, 455, 0,
+3, 18, 13, 12, 455, 394, 102, 0,
+3, 13, 18, 19, 394, 455, 74, 0,
+3, 19, 14, 13, 74, 180, 394, 0,
+3, 15, 20, 21, 401, 174, 182, 0,
+3, 21, 16, 15, 182, 211, 401, 0,
+3, 16, 21, 22, 211, 182, 507, 0,
+3, 22, 17, 16, 507, 427, 211, 0,
+3, 17, 22, 23, 427, 507, 5, 0,
+3, 23, 18, 17, 5, 455, 427, 0,
+3, 18, 23, 24, 455, 5, 234, 0,
+3, 24, 19, 18, 234, 74, 455, 0,
+3, 20, 25, 26, 174, 386, 20, 0,
+3, 26, 21, 20, 20, 182, 174, 0,
+3, 21, 26, 27, 182, 20, 410, 0,
+3, 27, 22, 21, 410, 507, 182, 0,
+3, 22, 27, 28, 507, 410, 23, 0,
+3, 28, 23, 22, 23, 5, 507, 0,
+3, 23, 28, 29, 5, 23, 485, 0,
+3, 29, 24, 23, 485, 234, 5, 0,
+3, 25, 30, 31, 386, 69, 305, 0,
+3, 31, 26, 25, 305, 20, 386, 0,
+3, 26, 31, 32, 20, 305, 503, 0,
+3, 32, 27, 26, 503, 410, 20, 0,
+3, 27, 32, 33, 410, 503, 405, 0,
+3, 33, 28, 27, 405, 23, 410, 0,
+3, 28, 33, 34, 23, 405, 138, 0,
+3, 34, 29, 28, 138, 485, 23, 0,
+3, 30, 35, 36, 69, 115, 193, 0,
+3, 36, 31, 30, 193, 305, 69, 0,
+3, 31, 36, 37, 305, 193, 270, 0,
+3, 37, 32, 31, 270, 503, 305, 0,
+3, 32, 37, 38, 503, 270, 445, 0,
+3, 38, 33, 32, 445, 405, 503, 0,
+3, 33, 38, 39, 405, 445, 28, 0,
+3, 39, 34, 33, 28, 138, 405, 0,
+3, 35, 40, 41, 115, 467, 495, 0,
+3, 41, 36, 35, 495, 193, 115, 0,
+3, 36, 41, 42, 193, 495, 11, 0,
+3, 42, 37, 36, 11, 270, 193, 0,
+3, 37, 42, 43, 270, 11, 435, 0,
+3, 43, 38, 37, 435, 445, 270, 0,
+3, 38, 43, 44, 445, 435, 322, 0,
+3, 44, 39, 38, 322, 28, 445, 0,
+3, 40, 45, 46, 467, 27, 44, 0,
+3, 46, 41, 40, 44, 495, 467, 0,
+3, 41, 46, 47, 495, 44, 409, 0,
+3, 47, 42, 41, 409, 11, 495, 0,
+3, 42, 47, 48, 11, 409, 428, 0,
+3, 48, 43, 42, 428, 435, 11, 0,
+3, 43, 48, 49, 435, 428, 313, 0,
+3, 49, 44, 43, 313, 322, 435, 0,
+3, 45, 50, 51, 27, 513, 385, 0,
+3, 51, 46, 45, 385, 44, 27, 0,
+3, 46, 51, 52, 44, 385, 382, 0,
+3, 52, 47, 46, 382, 409, 44, 0,
+3, 47, 52, 53, 409, 382, 124, 0,
+3, 53, 48, 47, 124, 428, 409, 0,
+3, 48, 53, 54, 428, 124, 447, 0,
+3, 54, 49, 48, 447, 313, 428, 0,
+3, 50, 55, 56, 513, 136, 478, 0,
+3, 56, 51, 50, 478, 385, 513, 0,
+3, 51, 56, 57, 385, 478, 161, 0,
+3, 57, 52, 51, 161, 382, 385, 0,
+3, 52, 57, 58, 382, 161, 181, 0,
+3, 58, 53, 52, 181, 124, 382, 0,
+3, 53, 58, 59, 124, 181, 348, 0,
+3, 59, 54, 53, 348, 447, 124, 0,
+3, 55, 60, 61, 136, 431, 320, 0,
+3, 61, 56, 55, 320, 478, 136, 0,
+3, 56, 61, 62, 478, 320, 481, 0,
+3, 62, 57, 56, 481, 161, 478, 0,
+3, 57, 62, 63, 161, 481, 53, 0,
+3, 63, 58, 57, 53, 181, 161, 0,
+3, 58, 63, 64, 181, 53, 257, 0,
+3, 64, 59, 58, 257, 348, 181, 0,
+3, 60, 65, 66, 431, 135, 37, 0,
+3, 66, 61, 60, 37, 320, 431, 0,
+3, 61, 66, 67, 320, 37, 408, 0,
+3, 67, 62, 61, 408, 481, 320, 0,
+3, 62, 67, 68, 481, 408, 347, 0,
+3, 68, 63, 62, 347, 53, 481, 0,
+3, 63, 68, 69, 53, 347, 104, 0,
+3, 69, 64, 63, 104, 257, 53, 0,
+3, 65, 70, 71, 135, 191, 524, 0,
+3, 71, 66, 65, 524, 37, 135, 0,
+3, 66, 71, 72, 37, 524, 319, 0,
+3, 72, 67, 66, 319, 408, 37, 0,
+3, 67, 72, 73, 408, 319, 183, 0,
+3, 73, 68, 67, 183, 347, 408, 0,
+3, 68, 73, 74, 347, 183, 480, 0,
+3, 74, 69, 68, 480, 104, 347, 0,
+3, 70, 75, 76, 191, 483, 328, 0,
+3, 76, 71, 70, 328, 524, 191, 0,
+3, 71, 76, 77, 524, 328, 422, 0,
+3, 77, 72, 71, 422, 319, 524, 0,
+3, 72, 77, 78, 319, 422, 151, 0,
+3, 78, 73, 72, 151, 183, 319, 0,
+3, 73, 78, 79, 183, 151, 273, 0,
+3, 79, 74, 73, 273, 480, 183, 0,
+3, 75, 0, 1, 483, 255, 465, 0,
+3, 1, 76, 75, 465, 328, 483, 0,
+3, 76, 1, 2, 328, 465, 4, 0,
+3, 2, 77, 76, 4, 422, 328, 0,
+3, 77, 2, 3, 422, 4, 448, 0,
+3, 3, 78, 77, 448, 151, 422, 0,
+3, 78, 3, 4, 151, 448, 116, 0,
+3, 4, 79, 78, 116, 273, 151, 0,
+3, 4, 9, 84, 116, 49, 220, 0,
+3, 84, 80, 4, 220, 131, 116, 0,
+3, 80, 84, 85, 131, 220, 476, 0,
+3, 85, 81, 80, 476, 26, 131, 0,
+3, 81, 85, 86, 26, 476, 38, 0,
+3, 86, 82, 81, 38, 336, 26, 0,
+3, 82, 86, 87, 336, 38, 511, 0,
+3, 87, 83, 82, 511, 1, 336, 0,
+3, 9, 14, 88, 49, 180, 103, 0,
+3, 88, 84, 9, 103, 220, 49, 0,
+3, 84, 88, 89, 220, 103, 62, 0,
+3, 89, 85, 84, 62, 476, 220, 0,
+3, 85, 89, 90, 476, 62, 488, 0,
+3, 90, 86, 85, 488, 38, 476, 0,
+3, 86, 90, 91, 38, 488, 484, 0,
+3, 91, 87, 86, 484, 511, 38, 0,
+3, 14, 19, 92, 180, 74, 78, 0,
+3, 92, 88, 14, 78, 103, 180, 0,
+3, 88, 92, 93, 103, 78, 154, 0,
+3, 93, 89, 88, 154, 62, 103, 0,
+3, 89, 93, 94, 62, 154, 190, 0,
+3, 94, 90, 89, 190, 488, 62, 0,
+3, 90, 94, 95, 488, 190, 417, 0,
+3, 95, 91, 90, 417, 484, 488, 0,
+3, 19, 24, 96, 74, 234, 81, 0,
+3, 96, 92, 19, 81, 78, 74, 0,
+3, 92, 96, 97, 78, 81, 274, 0,
+3, 97, 93, 92, 274, 154, 78, 0,
+3, 93, 97, 98, 154, 274, 363, 0,
+3, 98, 94, 93, 363, 190, 154, 0,
+3, 94, 98, 99, 190, 363, 304, 0,
+3, 99, 95, 94, 304, 417, 190, 0,
+3, 24, 29, 100, 234, 485, 287, 0,
+3, 100, 96, 24, 287, 81, 234, 0,
+3, 96, 100, 101, 81, 287, 398, 0,
+3, 101, 97, 96, 398, 274, 81, 0,
+3, 97, 101, 102, 274, 398, 440, 0,
+3, 102, 98, 97, 440, 363, 274, 0,
+3, 98, 102, 103, 363, 440, 466, 0,
+3, 103, 99, 98, 466, 304, 363, 0,
+3, 29, 34, 104, 485, 138, 268, 0,
+3, 104, 100, 29, 268, 287, 485, 0,
+3, 100, 104, 105, 287, 268, 252, 0,
+3, 105, 101, 100, 252, 398, 287, 0,
+3, 101, 105, 106, 398, 252, 141, 0,
+3, 106, 102, 101, 141, 440, 398, 0,
+3, 102, 106, 107, 440, 141, 18, 0,
+3, 107, 103, 102, 18, 466, 440, 0,
+3, 34, 39, 108, 138, 28, 357, 0,
+3, 108, 104, 34, 357, 268, 138, 0,
+3, 104, 108, 109, 268, 357, 127, 0,
+3, 109, 105, 104, 127, 252, 268, 0,
+3, 105, 109, 110, 252, 127, 228, 0,
+3, 110, 106, 105, 228, 141, 252, 0,
+3, 106, 110, 111, 141, 228, 33, 0,
+3, 111, 107, 106, 33, 18, 141, 0,
+3, 39, 44, 112, 28, 322, 396, 0,
+3, 112, 108, 39, 396, 357, 28, 0,
+3, 108, 112, 113, 357, 396, 294, 0,
+3, 113, 109, 108, 294, 127, 357, 0,
+3, 109, 113, 114, 127, 294, 56, 0,
+3, 114, 110, 109, 56, 228, 127, 0,
+3, 110, 114, 115, 228, 56, 517, 0,
+3, 115, 111, 110, 517, 33, 228, 0,
+3, 44, 49, 116, 322, 313, 474, 0,
+3, 116, 112, 44, 474, 396, 322, 0,
+3, 112, 116, 117, 396, 474, 208, 0,
+3, 117, 113, 112, 208, 294, 396, 0,
+3, 113, 117, 118, 294, 208, 301, 0,
+3, 118, 114, 113, 301, 56, 294, 0,
+3, 114, 118, 119, 56, 301, 242, 0,
+3, 119, 115, 114, 242, 517, 56, 0,
+3, 49, 54, 120, 313, 447, 377, 0,
+3, 120, 116, 49, 377, 474, 313, 0,
+3, 116, 120, 121, 474, 377, 333, 0,
+3, 121, 117, 116, 333, 208, 474, 0,
+3, 117, 121, 122, 208, 333, 222, 0,
+3, 122, 118, 117, 222, 301, 208, 0,
+3, 118, 122, 123, 301, 222, 218, 0,
+3, 123, 119, 118, 218, 242, 301, 0,
+3, 54, 59, 124, 447, 348, 350, 0,
+3, 124, 120, 54, 350, 377, 447, 0,
+3, 120, 124, 125, 377, 350, 420, 0,
+3, 125, 121, 120, 420, 333, 377, 0,
+3, 121, 125, 126, 333, 420, 453, 0,
+3, 126, 122, 121, 453, 222, 333, 0,
+3, 122, 126, 127, 222, 453, 147, 0,
+3, 127, 123, 122, 147, 218, 222, 0,
+3, 59, 64, 128, 348, 257, 95, 0,
+3, 128, 124, 59, 95, 350, 348, 0,
+3, 124, 128, 129, 350, 95, 293, 0,
+3, 129, 125, 124, 293, 420, 350, 0,
+3, 125, 129, 130, 420, 293, 378, 0,
+3, 130, 126, 125, 378, 453, 420, 0,
+3, 126, 130, 131, 453, 378, 29, 0,
+3, 131, 127, 126, 29, 147, 453, 0,
+3, 64, 69, 132, 257, 104, 311, 0,
+3, 132, 128, 64, 311, 95, 257, 0,
+3, 128, 132, 133, 95, 311, 419, 0,
+3, 133, 129, 128, 419, 293, 95, 0,
+3, 129, 133, 134, 293, 419, 463, 0,
+3, 134, 130, 129, 463, 378, 293, 0,
+3, 130, 134, 135, 378, 463, 490, 0,
+3, 135, 131, 130, 490, 29, 378, 0,
+3, 69, 74, 136, 104, 480, 284, 0,
+3, 136, 132, 69, 284, 311, 104, 0,
+3, 132, 136, 137, 311, 284, 269, 0,
+3, 137, 133, 132, 269, 419, 311, 0,
+3, 133, 137, 138, 419, 269, 164, 0,
+3, 138, 134, 133, 164, 463, 419, 0,
+3, 134, 138, 139, 463, 164, 45, 0,
+3, 139, 135, 134, 45, 490, 463, 0,
+3, 74, 79, 140, 480, 273, 371, 0,
+3, 140, 136, 74, 371, 284, 480, 0,
+3, 136, 140, 141, 284, 371, 148, 0,
+3, 141, 137, 136, 148, 269, 284, 0,
+3, 137, 141, 142, 269, 148, 251, 0,
+3, 142, 138, 137, 251, 164, 269, 0,
+3, 138, 142, 143, 164, 251, 54, 0,
+3, 143, 139, 138, 54, 45, 164, 0,
+3, 79, 4, 80, 273, 116, 131, 0,
+3, 80, 140, 79, 131, 371, 273, 0,
+3, 140, 80, 81, 371, 131, 26, 0,
+3, 81, 141, 140, 26, 148, 371, 0,
+3, 141, 81, 82, 148, 26, 336, 0,
+3, 82, 142, 141, 336, 251, 148, 0,
+3, 142, 82, 83, 251, 336, 1, 0,
+3, 83, 143, 142, 1, 54, 251, 0,
+3, 83, 87, 148, 1, 511, 404, 0,
+3, 148, 144, 83, 404, 276, 1, 0,
+3, 144, 148, 149, 276, 404, 308, 0,
+3, 149, 145, 144, 308, 520, 276, 0,
+3, 145, 149, 150, 520, 308, 325, 0,
+3, 150, 146, 145, 325, 395, 520, 0,
+3, 146, 150, 151, 395, 325, 384, 0,
+3, 151, 147, 146, 384, 246, 395, 0,
+3, 87, 91, 152, 511, 484, 47, 0,
+3, 152, 148, 87, 47, 404, 511, 0,
+3, 148, 152, 153, 404, 47, 272, 0,
+3, 153, 149, 148, 272, 308, 404, 0,
+3, 149, 153, 154, 308, 272, 415, 0,
+3, 154, 150, 149, 415, 325, 308, 0,
+3, 150, 154, 155, 325, 415, 83, 0,
+3, 155, 151, 150, 83, 384, 325, 0,
+3, 91, 95, 156, 484, 417, 430, 0,
+3, 156, 152, 91, 430, 47, 484, 0,
+3, 152, 156, 157, 47, 430, 137, 0,
+3, 157, 153, 152, 137, 272, 47, 0,
+3, 153, 157, 158, 272, 137, 416, 0,
+3, 158, 154, 153, 416, 415, 272, 0,
+3, 154, 158, 159, 415, 416, 297, 0,
+3, 159, 155, 154, 297, 83, 415, 0,
+3, 95, 99, 160, 417, 304, 458, 0,
+3, 160, 156, 95, 458, 430, 417, 0,
+3, 156, 160, 161, 430, 458, 343, 0,
+3, 161, 157, 156, 343, 137, 430, 0,
+3, 157, 161, 162, 137, 343, 334, 0,
+3, 162, 158, 157, 334, 416, 137, 0,
+3, 158, 162, 163, 416, 334, 317, 0,
+3, 163, 159, 158, 317, 297, 416, 0,
+3, 99, 103, 164, 304, 466, 187, 0,
+3, 164, 160, 99, 187, 458, 304, 0,
+3, 160, 164, 165, 458, 187, 117, 0,
+3, 165, 161, 160, 117, 343, 458, 0,
+3, 161, 165, 166, 343, 117, 438, 0,
+3, 166, 162, 161, 438, 334, 343, 0,
+3, 162, 166, 167, 334, 438, 459, 0,
+3, 167, 163, 162, 459, 317, 334, 0,
+3, 103, 107, 168, 466, 18, 353, 0,
+3, 168, 164, 103, 353, 187, 466, 0,
+3, 164, 168, 169, 187, 353, 123, 0,
+3, 169, 165, 164, 123, 117, 187, 0,
+3, 165, 169, 170, 117, 123, 168, 0,
+3, 170, 166, 165, 168, 438, 117, 0,
+3, 166, 170, 171, 438, 168, 426, 0,
+3, 171, 167, 166, 426, 459, 438, 0,
+3, 107, 111, 172, 18, 33, 390, 0,
+3, 172, 168, 107, 390, 353, 18, 0,
+3, 168, 172, 173, 353, 390, 290, 0,
+3, 173, 169, 168, 290, 123, 353, 0,
+3, 169, 173, 174, 123, 290, 522, 0,
+3, 174, 170, 169, 522, 168, 123, 0,
+3, 170, 174, 175, 168, 522, 87, 0,
+3, 175, 171, 170, 87, 426, 168, 0,
+3, 111, 115, 176, 33, 517, 260, 0,
+3, 176, 172, 111, 260, 390, 33, 0,
+3, 172, 176, 177, 390, 260, 497, 0,
+3, 177, 173, 172, 497, 290, 390, 0,
+3, 173, 177, 178, 290, 497, 126, 0,
+3, 178, 174, 173, 126, 522, 290, 0,
+3, 174, 178, 179, 522, 126, 501, 0,
+3, 179, 175, 174, 501, 87, 522, 0,
+3, 115, 119, 180, 517, 242, 130, 0,
+3, 180, 176, 115, 130, 260, 517, 0,
+3, 176, 180, 181, 260, 130, 34, 0,
+3, 181, 177, 176, 34, 497, 260, 0,
+3, 177, 181, 182, 497, 34, 46, 0,
+3, 182, 178, 177, 46, 126, 497, 0,
+3, 178, 182, 183, 126, 46, 105, 0,
+3, 183, 179, 178, 105, 501, 126, 0,
+3, 119, 123, 184, 242, 218, 310, 0,
+3, 184, 180, 119, 310, 130, 242, 0,
+3, 180, 184, 185, 130, 310, 528, 0,
+3, 185, 181, 180, 528, 34, 130, 0,
+3, 181, 185, 186, 34, 528, 145, 0,
+3, 186, 182, 181, 145, 46, 34, 0,
+3, 182, 186, 187, 46, 145, 356, 0,
+3, 187, 183, 182, 356, 105, 46, 0,
+3, 123, 127, 188, 218, 147, 156, 0,
+3, 188, 184, 123, 156, 310, 218, 0,
+3, 184, 188, 189, 310, 156, 402, 0,
+3, 189, 185, 184, 402, 528, 310, 0,
+3, 185, 189, 190, 528, 402, 146, 0,
+3, 190, 186, 185, 146, 145, 528, 0,
+3, 186, 190, 191, 145, 146, 17, 0,
+3, 191, 187, 186, 17, 356, 145, 0,
+3, 127, 131, 192, 147, 29, 184, 0,
+3, 192, 188, 127, 184, 156, 147, 0,
+3, 188, 192, 193, 156, 184, 63, 0,
+3, 193, 189, 188, 63, 402, 156, 0,
+3, 189, 193, 194, 402, 63, 354, 0,
+3, 194, 190, 189, 354, 146, 402, 0,
+3, 190, 194, 195, 146, 354, 335, 0,
+3, 195, 191, 190, 335, 17, 146, 0,
+3, 131, 135, 196, 29, 490, 210, 0,
+3, 196, 192, 131, 210, 184, 29, 0,
+3, 192, 196, 197, 184, 210, 129, 0,
+3, 197, 193, 192, 129, 63, 184, 0,
+3, 193, 197, 198, 63, 129, 461, 0,
+3, 198, 194, 193, 461, 354, 63, 0,
+3, 194, 198, 199, 354, 461, 475, 0,
+3, 199, 195, 194, 475, 335, 354, 0,
+3, 135, 139, 200, 490, 45, 370, 0,
+3, 200, 196, 135, 370, 210, 490, 0,
+3, 196, 200, 201, 210, 370, 143, 0,
+3, 201, 197, 196, 143, 129, 210, 0,
+3, 197, 201, 202, 129, 143, 195, 0,
+3, 202, 198, 197, 195, 461, 129, 0,
+3, 198, 202, 203, 461, 195, 444, 0,
+3, 203, 199, 198, 444, 475, 461, 0,
+3, 139, 143, 204, 45, 54, 403, 0,
+3, 204, 200, 139, 403, 370, 45, 0,
+3, 200, 204, 205, 370, 403, 315, 0,
+3, 205, 201, 200, 315, 143, 370, 0,
+3, 201, 205, 206, 143, 315, 7, 0,
+3, 206, 202, 201, 7, 195, 143, 0,
+3, 202, 206, 207, 195, 7, 101, 0,
+3, 207, 203, 202, 101, 444, 195, 0,
+3, 143, 83, 144, 54, 1, 276, 0,
+3, 144, 204, 143, 276, 403, 54, 0,
+3, 204, 144, 145, 403, 276, 520, 0,
+3, 145, 205, 204, 520, 315, 403, 0,
+3, 205, 145, 146, 315, 520, 395, 0,
+3, 146, 206, 205, 395, 7, 315, 0,
+3, 206, 146, 147, 7, 395, 246, 0,
+3, 147, 207, 206, 246, 101, 7, 0,
+3, 147, 151, 212, 246, 384, 486, 0,
+3, 212, 208, 147, 486, 279, 246, 0,
+3, 208, 212, 213, 279, 486, 231, 0,
+3, 213, 209, 208, 231, 349, 279, 0,
+3, 209, 213, 214, 349, 231, 0, 0,
+3, 214, 210, 209, 0, 216, 349, 0,
+3, 210, 214, 211, 216, 0, 393, 0,
+3, 211, 211, 210, 393, 393, 216, 0,
+3, 151, 155, 215, 384, 83, 215, 0,
+3, 215, 212, 151, 215, 486, 384, 0,
+3, 212, 215, 216, 486, 215, 327, 0,
+3, 216, 213, 212, 327, 231, 486, 0,
+3, 213, 216, 217, 231, 327, 512, 0,
+3, 217, 214, 213, 512, 0, 231, 0,
+3, 214, 217, 211, 0, 512, 393, 0,
+3, 211, 211, 214, 393, 393, 0, 0,
+3, 155, 159, 218, 83, 297, 149, 0,
+3, 218, 215, 155, 149, 215, 83, 0,
+3, 215, 218, 219, 215, 149, 91, 0,
+3, 219, 216, 215, 91, 327, 215, 0,
+3, 216, 219, 220, 327, 91, 177, 0,
+3, 220, 217, 216, 177, 512, 327, 0,
+3, 217, 220, 211, 512, 177, 393, 0,
+3, 211, 211, 217, 393, 393, 512, 0,
+3, 159, 163, 221, 297, 317, 504, 0,
+3, 221, 218, 159, 504, 149, 297, 0,
+3, 218, 221, 222, 149, 504, 285, 0,
+3, 222, 219, 218, 285, 91, 149, 0,
+3, 219, 222, 223, 91, 285, 254, 0,
+3, 223, 220, 219, 254, 177, 91, 0,
+3, 220, 223, 211, 177, 254, 393, 0,
+3, 211, 211, 220, 393, 393, 177, 0,
+3, 163, 167, 224, 317, 459, 125, 0,
+3, 224, 221, 163, 125, 504, 317, 0,
+3, 221, 224, 225, 504, 125, 162, 0,
+3, 225, 222, 221, 162, 285, 504, 0,
+3, 222, 225, 226, 285, 162, 278, 0,
+3, 226, 223, 222, 278, 254, 285, 0,
+3, 223, 226, 211, 254, 278, 393, 0,
+3, 211, 211, 223, 393, 393, 254, 0,
+3, 167, 171, 227, 459, 426, 439, 0,
+3, 227, 224, 167, 439, 125, 459, 0,
+3, 224, 227, 228, 125, 439, 60, 0,
+3, 228, 225, 224, 60, 162, 125, 0,
+3, 225, 228, 229, 162, 60, 446, 0,
+3, 229, 226, 225, 446, 278, 162, 0,
+3, 226, 229, 211, 278, 446, 393, 0,
+3, 211, 211, 226, 393, 393, 278, 0,
+3, 171, 175, 230, 426, 87, 482, 0,
+3, 230, 227, 171, 482, 439, 426, 0,
+3, 227, 230, 231, 439, 482, 92, 0,
+3, 231, 228, 227, 92, 60, 439, 0,
+3, 228, 231, 232, 60, 92, 110, 0,
+3, 232, 229, 228, 110, 446, 60, 0,
+3, 229, 232, 211, 446, 110, 393, 0,
+3, 211, 211, 229, 393, 393, 446, 0,
+3, 175, 179, 233, 87, 501, 261, 0,
+3, 233, 230, 175, 261, 482, 87, 0,
+3, 230, 233, 234, 482, 261, 329, 0,
+3, 234, 231, 230, 329, 92, 482, 0,
+3, 231, 234, 235, 92, 329, 192, 0,
+3, 235, 232, 231, 192, 110, 92, 0,
+3, 232, 235, 211, 110, 192, 393, 0,
+3, 211, 211, 232, 393, 393, 110, 0,
+3, 179, 183, 236, 501, 105, 219, 0,
+3, 236, 233, 179, 219, 261, 501, 0,
+3, 233, 236, 237, 261, 219, 491, 0,
+3, 237, 234, 233, 491, 329, 261, 0,
+3, 234, 237, 238, 329, 491, 267, 0,
+3, 238, 235, 234, 267, 192, 329, 0,
+3, 235, 238, 211, 192, 267, 393, 0,
+3, 211, 211, 235, 393, 393, 192, 0,
+3, 183, 187, 239, 105, 356, 472, 0,
+3, 239, 236, 183, 472, 219, 105, 0,
+3, 236, 239, 240, 219, 472, 48, 0,
+3, 240, 237, 236, 48, 491, 219, 0,
+3, 237, 240, 241, 491, 48, 247, 0,
+3, 241, 238, 237, 247, 267, 491, 0,
+3, 238, 241, 211, 267, 247, 393, 0,
+3, 211, 211, 238, 393, 393, 267, 0,
+3, 187, 191, 242, 356, 17, 411, 0,
+3, 242, 239, 187, 411, 472, 356, 0,
+3, 239, 242, 243, 472, 411, 364, 0,
+3, 243, 240, 239, 364, 48, 472, 0,
+3, 240, 243, 244, 48, 364, 441, 0,
+3, 244, 241, 240, 441, 247, 48, 0,
+3, 241, 244, 211, 247, 441, 393, 0,
+3, 211, 211, 241, 393, 393, 247, 0,
+3, 191, 195, 245, 17, 335, 239, 0,
+3, 245, 242, 191, 239, 411, 17, 0,
+3, 242, 245, 246, 411, 239, 13, 0,
+3, 246, 243, 242, 13, 364, 411, 0,
+3, 243, 246, 247, 364, 13, 509, 0,
+3, 247, 244, 243, 509, 441, 364, 0,
+3, 244, 247, 211, 441, 509, 393, 0,
+3, 211, 211, 244, 393, 393, 441, 0,
+3, 195, 199, 248, 335, 475, 144, 0,
+3, 248, 245, 195, 144, 239, 335, 0,
+3, 245, 248, 249, 239, 144, 179, 0,
+3, 249, 246, 245, 179, 13, 239, 0,
+3, 246, 249, 250, 13, 179, 298, 0,
+3, 250, 247, 246, 298, 509, 13, 0,
+3, 247, 250, 211, 509, 298, 393, 0,
+3, 211, 211, 247, 393, 393, 509, 0,
+3, 199, 203, 251, 475, 444, 462, 0,
+3, 251, 248, 199, 462, 144, 475, 0,
+3, 248, 251, 252, 144, 462, 76, 0,
+3, 252, 249, 248, 76, 179, 144, 0,
+3, 249, 252, 253, 179, 76, 464, 0,
+3, 253, 250, 249, 464, 298, 179, 0,
+3, 250, 253, 211, 298, 464, 393, 0,
+3, 211, 211, 250, 393, 393, 298, 0,
+3, 203, 207, 254, 444, 101, 500, 0,
+3, 254, 251, 203, 500, 462, 444, 0,
+3, 251, 254, 255, 462, 500, 113, 0,
+3, 255, 252, 251, 113, 76, 462, 0,
+3, 252, 255, 256, 76, 113, 128, 0,
+3, 256, 253, 252, 128, 464, 76, 0,
+3, 253, 256, 211, 464, 128, 393, 0,
+3, 211, 211, 253, 393, 393, 464, 0,
+3, 207, 147, 208, 101, 246, 279, 0,
+3, 208, 254, 207, 279, 500, 101, 0,
+3, 254, 208, 209, 500, 279, 349, 0,
+3, 209, 255, 254, 349, 113, 500, 0,
+3, 255, 209, 210, 113, 349, 216, 0,
+3, 210, 256, 255, 216, 128, 113, 0,
+3, 256, 210, 211, 128, 216, 393, 0,
+3, 211, 211, 256, 393, 393, 128, 0,
+3, 257, 262, 263, 425, 244, 58, 0,
+3, 263, 258, 257, 58, 337, 425, 0,
+3, 258, 263, 264, 337, 58, 214, 0,
+3, 264, 259, 258, 214, 236, 337, 0,
+3, 259, 264, 265, 236, 214, 266, 0,
+3, 265, 260, 259, 266, 32, 236, 0,
+3, 260, 265, 266, 32, 266, 331, 0,
+3, 266, 261, 260, 331, 109, 32, 0,
+3, 262, 267, 268, 244, 233, 369, 0,
+3, 268, 263, 262, 369, 58, 244, 0,
+3, 263, 268, 269, 58, 369, 71, 0,
+3, 269, 264, 263, 71, 214, 58, 0,
+3, 264, 269, 270, 214, 71, 392, 0,
+3, 270, 265, 264, 392, 266, 214, 0,
+3, 265, 270, 271, 266, 392, 312, 0,
+3, 271, 266, 265, 312, 331, 266, 0,
+3, 267, 272, 273, 233, 12, 434, 0,
+3, 273, 268, 267, 434, 369, 233, 0,
+3, 268, 273, 274, 369, 434, 188, 0,
+3, 274, 269, 268, 188, 71, 369, 0,
+3, 269, 274, 275, 71, 188, 201, 0,
+3, 275, 270, 269, 201, 392, 71, 0,
+3, 270, 275, 276, 392, 201, 238, 0,
+3, 276, 271, 270, 238, 312, 392, 0,
+3, 272, 277, 278, 12, 142, 114, 0,
+3, 278, 273, 272, 114, 434, 12, 0,
+3, 273, 278, 279, 434, 114, 173, 0,
+3, 279, 274, 273, 173, 188, 434, 0,
+3, 274, 279, 280, 188, 173, 14, 0,
+3, 280, 275, 274, 14, 201, 188, 0,
+3, 275, 280, 281, 201, 14, 15, 0,
+3, 281, 276, 275, 15, 238, 201, 0,
+3, 277, 282, 283, 142, 407, 288, 0,
+3, 283, 278, 277, 288, 114, 142, 0,
+3, 278, 283, 284, 114, 288, 400, 0,
+3, 284, 279, 278, 400, 173, 114, 0,
+3, 279, 284, 285, 173, 400, 457, 0,
+3, 285, 280, 279, 457, 14, 173, 0,
+3, 280, 285, 286, 14, 457, 332, 0,
+3, 286, 281, 280, 332, 15, 14, 0,
+3, 282, 287, 288, 407, 194, 42, 0,
+3, 288, 283, 282, 42, 288, 407, 0,
+3, 283, 288, 289, 288, 42, 380, 0,
+3, 289, 284, 283, 380, 400, 288, 0,
+3, 284, 289, 290, 400, 380, 383, 0,
+3, 290, 285, 284, 383, 457, 400, 0,
+3, 285, 290, 291, 457, 383, 197, 0,
+3, 291, 286, 285, 197, 332, 457, 0,
+3, 287, 292, 293, 194, 321, 152, 0,
+3, 293, 288, 287, 152, 42, 194, 0,
+3, 288, 293, 294, 42, 152, 397, 0,
+3, 294, 289, 288, 397, 380, 42, 0,
+3, 289, 294, 295, 380, 397, 342, 0,
+3, 295, 290, 289, 342, 383, 380, 0,
+3, 290, 295, 296, 383, 342, 225, 0,
+3, 296, 291, 290, 225, 197, 383, 0,
+3, 292, 257, 258, 321, 425, 337, 0,
+3, 258, 293, 292, 337, 152, 321, 0,
+3, 293, 258, 259, 152, 337, 236, 0,
+3, 259, 294, 293, 236, 397, 152, 0,
+3, 294, 259, 260, 397, 236, 32, 0,
+3, 260, 295, 294, 32, 342, 397, 0,
+3, 295, 260, 261, 342, 32, 109, 0,
+3, 261, 296, 295, 109, 225, 342, 0,
+3, 261, 266, 301, 109, 331, 175, 0,
+3, 301, 297, 261, 175, 502, 109, 0,
+3, 297, 301, 302, 502, 175, 265, 0,
+3, 302, 298, 297, 265, 84, 502, 0,
+3, 298, 302, 303, 84, 265, 186, 0,
+3, 303, 299, 298, 186, 496, 84, 0,
+3, 299, 303, 304, 496, 186, 470, 0,
+3, 304, 300, 299, 470, 494, 496, 0,
+3, 266, 271, 305, 331, 312, 170, 0,
+3, 305, 301, 266, 170, 175, 331, 0,
+3, 301, 305, 306, 175, 170, 97, 0,
+3, 306, 302, 301, 97, 265, 175, 0,
+3, 302, 306, 307, 265, 97, 205, 0,
+3, 307, 303, 302, 205, 186, 265, 0,
+3, 303, 307, 308, 186, 205, 449, 0,
+3, 308, 304, 303, 449, 470, 186, 0,
+3, 271, 276, 309, 312, 238, 379, 0,
+3, 309, 305, 271, 379, 170, 312, 0,
+3, 305, 309, 310, 170, 379, 300, 0,
+3, 310, 306, 305, 300, 97, 170, 0,
+3, 306, 310, 311, 97, 300, 118, 0,
+3, 311, 307, 306, 118, 205, 97, 0,
+3, 307, 311, 312, 205, 118, 237, 0,
+3, 312, 308, 307, 237, 449, 205, 0,
+3, 276, 281, 313, 238, 15, 199, 0,
+3, 313, 309, 276, 199, 379, 238, 0,
+3, 309, 313, 314, 379, 199, 94, 0,
+3, 314, 310, 309, 94, 300, 379, 0,
+3, 310, 314, 315, 300, 94, 421, 0,
+3, 315, 311, 310, 421, 118, 300, 0,
+3, 311, 315, 316, 118, 421, 31, 0,
+3, 316, 312, 311, 31, 237, 118, 0,
+3, 281, 286, 317, 15, 332, 367, 0,
+3, 317, 313, 281, 367, 199, 15, 0,
+3, 313, 317, 318, 199, 367, 529, 0,
+3, 318, 314, 313, 529, 94, 199, 0,
+3, 314, 318, 319, 94, 529, 185, 0,
+3, 319, 315, 314, 185, 421, 94, 0,
+3, 315, 319, 320, 421, 185, 89, 0,
+3, 320, 316, 315, 89, 31, 421, 0,
+3, 286, 291, 321, 332, 197, 172, 0,
+3, 321, 317, 286, 172, 367, 332, 0,
+3, 317, 321, 322, 367, 172, 209, 0,
+3, 322, 318, 317, 209, 529, 367, 0,
+3, 318, 322, 323, 529, 209, 429, 0,
+3, 323, 319, 318, 429, 185, 529, 0,
+3, 319, 323, 324, 185, 429, 112, 0,
+3, 324, 320, 319, 112, 89, 185, 0,
+3, 291, 296, 325, 197, 225, 451, 0,
+3, 325, 321, 291, 451, 172, 197, 0,
+3, 321, 325, 326, 172, 451, 66, 0,
+3, 326, 322, 321, 66, 209, 172, 0,
+3, 322, 326, 327, 209, 66, 176, 0,
+3, 327, 323, 322, 176, 429, 209, 0,
+3, 323, 327, 328, 429, 176, 155, 0,
+3, 328, 324, 323, 155, 112, 429, 0,
+3, 296, 261, 297, 225, 109, 502, 0,
+3, 297, 325, 296, 502, 451, 225, 0,
+3, 325, 297, 298, 451, 502, 84, 0,
+3, 298, 326, 325, 84, 66, 451, 0,
+3, 326, 298, 299, 66, 84, 496, 0,
+3, 299, 327, 326, 496, 176, 66, 0,
+3, 327, 299, 300, 176, 496, 494, 0,
+3, 300, 328, 327, 494, 155, 176, 0,
+3, 329, 334, 335, 3, 355, 122, 0,
+3, 335, 330, 329, 122, 518, 3, 0,
+3, 330, 335, 336, 518, 122, 111, 0,
+3, 336, 331, 330, 111, 213, 518, 0,
+3, 331, 336, 337, 213, 111, 473, 0,
+3, 337, 332, 331, 473, 468, 213, 0,
+3, 332, 337, 338, 468, 473, 521, 0,
+3, 338, 333, 332, 521, 346, 468, 0,
+3, 334, 339, 340, 355, 61, 414, 0,
+3, 340, 335, 334, 414, 122, 355, 0,
+3, 335, 340, 341, 122, 414, 413, 0,
+3, 341, 336, 335, 413, 111, 122, 0,
+3, 336, 341, 342, 111, 413, 204, 0,
+3, 342, 337, 336, 204, 473, 111, 0,
+3, 337, 342, 343, 473, 204, 217, 0,
+3, 343, 338, 337, 217, 521, 473, 0,
+3, 339, 344, 345, 61, 55, 100, 0,
+3, 345, 340, 339, 100, 414, 61, 0,
+3, 340, 345, 346, 414, 100, 399, 0,
+3, 346, 341, 340, 399, 413, 414, 0,
+3, 341, 346, 347, 413, 399, 326, 0,
+3, 347, 342, 341, 326, 204, 413, 0,
+3, 342, 347, 348, 204, 326, 221, 0,
+3, 348, 343, 342, 221, 217, 204, 0,
+3, 344, 349, 350, 55, 508, 477, 0,
+3, 350, 345, 344, 477, 100, 55, 0,
+3, 345, 350, 351, 100, 477, 292, 0,
+3, 351, 346, 345, 292, 399, 100, 0,
+3, 346, 351, 352, 399, 292, 73, 0,
+3, 352, 347, 346, 73, 326, 399, 0,
+3, 347, 352, 353, 326, 73, 362, 0,
+3, 353, 348, 347, 362, 221, 326, 0,
+3, 349, 354, 355, 508, 365, 262, 0,
+3, 355, 350, 349, 262, 477, 508, 0,
+3, 350, 355, 356, 477, 262, 93, 0,
+3, 356, 351, 350, 93, 292, 477, 0,
+3, 351, 356, 357, 292, 93, 318, 0,
+3, 357, 352, 351, 318, 73, 292, 0,
+3, 352, 357, 358, 73, 318, 163, 0,
+3, 358, 353, 352, 163, 362, 73, 0,
+3, 354, 359, 360, 365, 140, 340, 0,
+3, 360, 355, 354, 340, 262, 365, 0,
+3, 355, 360, 361, 262, 340, 505, 0,
+3, 361, 356, 355, 505, 93, 262, 0,
+3, 356, 361, 362, 93, 505, 499, 0,
+3, 362, 357, 356, 499, 318, 93, 0,
+3, 357, 362, 363, 318, 499, 159, 0,
+3, 363, 358, 357, 159, 163, 318, 0,
+3, 359, 364, 365, 140, 510, 68, 0,
+3, 365, 360, 359, 68, 340, 140, 0,
+3, 360, 365, 366, 340, 68, 167, 0,
+3, 366, 361, 360, 167, 505, 340, 0,
+3, 361, 366, 367, 505, 167, 245, 0,
+3, 367, 362, 361, 245, 499, 505, 0,
+3, 362, 367, 368, 499, 245, 437, 0,
+3, 368, 363, 362, 437, 159, 499, 0,
+3, 364, 329, 330, 510, 3, 518, 0,
+3, 330, 365, 364, 518, 68, 510, 0,
+3, 365, 330, 331, 68, 518, 213, 0,
+3, 331, 366, 365, 213, 167, 68, 0,
+3, 366, 331, 332, 167, 213, 468, 0,
+3, 332, 367, 366, 468, 245, 167, 0,
+3, 367, 332, 333, 245, 468, 346, 0,
+3, 333, 368, 367, 346, 437, 245, 0,
+3, 333, 338, 373, 346, 521, 79, 0,
+3, 373, 369, 333, 79, 286, 346, 0,
+3, 369, 373, 374, 286, 79, 77, 0,
+3, 374, 370, 369, 77, 22, 286, 0,
+3, 370, 374, 375, 22, 77, 523, 0,
+3, 375, 371, 370, 523, 330, 22, 0,
+3, 371, 375, 376, 330, 523, 259, 0,
+3, 376, 372, 371, 259, 338, 330, 0,
+3, 338, 343, 377, 521, 217, 207, 0,
+3, 377, 373, 338, 207, 79, 521, 0,
+3, 373, 377, 378, 79, 207, 471, 0,
+3, 378, 374, 373, 471, 77, 79, 0,
+3, 374, 378, 379, 77, 471, 198, 0,
+3, 379, 375, 374, 198, 523, 77, 0,
+3, 375, 379, 380, 523, 198, 366, 0,
+3, 380, 376, 375, 366, 259, 523, 0,
+3, 343, 348, 381, 217, 221, 516, 0,
+3, 381, 377, 343, 516, 207, 217, 0,
+3, 377, 381, 382, 207, 516, 250, 0,
+3, 382, 378, 377, 250, 471, 207, 0,
+3, 378, 382, 383, 471, 250, 240, 0,
+3, 383, 379, 378, 240, 198, 471, 0,
+3, 379, 383, 384, 198, 240, 381, 0,
+3, 384, 380, 379, 381, 366, 198, 0,
+3, 348, 353, 385, 221, 362, 230, 0,
+3, 385, 381, 348, 230, 516, 221, 0,
+3, 381, 385, 386, 516, 230, 303, 0,
+3, 386, 382, 381, 303, 250, 516, 0,
+3, 382, 386, 387, 250, 303, 10, 0,
+3, 387, 383, 382, 10, 240, 250, 0,
+3, 383, 387, 388, 240, 10, 283, 0,
+3, 388, 384, 383, 283, 381, 240, 0,
+3, 353, 358, 389, 362, 163, 282, 0,
+3, 389, 385, 353, 282, 230, 362, 0,
+3, 385, 389, 390, 230, 282, 35, 0,
+3, 390, 386, 385, 35, 303, 230, 0,
+3, 386, 390, 391, 303, 35, 243, 0,
+3, 391, 387, 386, 243, 10, 303, 0,
+3, 387, 391, 392, 10, 243, 368, 0,
+3, 392, 388, 387, 368, 283, 10, 0,
+3, 358, 363, 393, 163, 159, 296, 0,
+3, 393, 389, 358, 296, 282, 163, 0,
+3, 389, 393, 394, 282, 296, 160, 0,
+3, 394, 390, 389, 160, 35, 282, 0,
+3, 390, 394, 395, 35, 160, 323, 0,
+3, 395, 391, 390, 323, 243, 35, 0,
+3, 391, 395, 396, 243, 323, 280, 0,
+3, 396, 392, 391, 280, 368, 243, 0,
+3, 363, 368, 397, 159, 437, 275, 0,
+3, 397, 393, 363, 275, 296, 159, 0,
+3, 393, 397, 398, 296, 275, 133, 0,
+3, 398, 394, 393, 133, 160, 296, 0,
+3, 394, 398, 399, 160, 133, 344, 0,
+3, 399, 395, 394, 344, 323, 160, 0,
+3, 395, 399, 400, 323, 344, 108, 0,
+3, 400, 396, 395, 108, 280, 323, 0,
+3, 368, 333, 369, 437, 346, 286, 0,
+3, 369, 397, 368, 286, 275, 437, 0,
+3, 397, 369, 370, 275, 286, 22, 0,
+3, 370, 398, 397, 22, 133, 275, 0,
+3, 398, 370, 371, 133, 22, 330, 0,
+3, 371, 399, 398, 330, 344, 133, 0,
+3, 399, 371, 372, 344, 330, 338, 0,
+3, 372, 400, 399, 338, 108, 344, 0,
+3, 401, 401, 406, 235, 235, 189, 0,
+3, 406, 402, 401, 189, 40, 235, 0,
+3, 402, 406, 407, 40, 189, 306, 0,
+3, 407, 403, 402, 306, 119, 40, 0,
+3, 403, 407, 408, 119, 306, 202, 0,
+3, 408, 404, 403, 202, 443, 119, 0,
+3, 404, 408, 409, 443, 202, 241, 0,
+3, 409, 405, 404, 241, 75, 443, 0,
+3, 401, 401, 410, 235, 235, 263, 0,
+3, 410, 406, 401, 263, 189, 235, 0,
+3, 406, 410, 411, 189, 263, 196, 0,
+3, 411, 407, 406, 196, 306, 189, 0,
+3, 407, 411, 412, 306, 196, 281, 0,
+3, 412, 408, 407, 281, 202, 306, 0,
+3, 408, 412, 413, 202, 281, 121, 0,
+3, 413, 409, 408, 121, 241, 202, 0,
+3, 401, 401, 414, 235, 235, 479, 0,
+3, 414, 410, 401, 479, 263, 235, 0,
+3, 410, 414, 415, 263, 479, 36, 0,
+3, 415, 411, 410, 36, 196, 263, 0,
+3, 411, 415, 416, 196, 36, 436, 0,
+3, 416, 412, 411, 436, 281, 196, 0,
+3, 412, 416, 417, 281, 436, 351, 0,
+3, 417, 413, 412, 351, 121, 281, 0,
+3, 401, 401, 418, 235, 235, 90, 0,
+3, 418, 414, 401, 90, 479, 235, 0,
+3, 414, 418, 419, 479, 90, 361, 0,
+3, 419, 415, 414, 361, 36, 479, 0,
+3, 415, 419, 420, 36, 361, 376, 0,
+3, 420, 416, 415, 376, 436, 36, 0,
+3, 416, 420, 421, 436, 376, 412, 0,
+3, 421, 417, 416, 412, 351, 436, 0,
+3, 401, 401, 422, 235, 235, 52, 0,
+3, 422, 418, 401, 52, 90, 235, 0,
+3, 418, 422, 423, 90, 52, 21, 0,
+3, 423, 419, 418, 21, 361, 90, 0,
+3, 419, 423, 424, 361, 21, 158, 0,
+3, 424, 420, 419, 158, 376, 361, 0,
+3, 420, 424, 425, 376, 158, 39, 0,
+3, 425, 421, 420, 39, 412, 376, 0,
+3, 401, 401, 426, 235, 235, 424, 0,
+3, 426, 422, 401, 424, 52, 235, 0,
+3, 422, 426, 427, 52, 424, 373, 0,
+3, 427, 423, 422, 373, 21, 52, 0,
+3, 423, 427, 428, 21, 373, 375, 0,
+3, 428, 424, 423, 375, 158, 21, 0,
+3, 424, 428, 429, 158, 375, 249, 0,
+3, 429, 425, 424, 249, 39, 158, 0,
+3, 401, 401, 430, 235, 235, 432, 0,
+3, 430, 426, 401, 432, 424, 235, 0,
+3, 426, 430, 431, 424, 432, 229, 0,
+3, 431, 427, 426, 229, 373, 424, 0,
+3, 427, 431, 432, 373, 229, 65, 0,
+3, 432, 428, 427, 65, 375, 373, 0,
+3, 428, 432, 433, 375, 65, 506, 0,
+3, 433, 429, 428, 506, 249, 375, 0,
+3, 401, 401, 434, 235, 235, 302, 0,
+3, 434, 430, 401, 302, 432, 235, 0,
+3, 430, 434, 435, 432, 302, 96, 0,
+3, 435, 431, 430, 96, 229, 432, 0,
+3, 431, 435, 436, 229, 96, 169, 0,
+3, 436, 432, 431, 169, 65, 229, 0,
+3, 432, 436, 437, 65, 169, 59, 0,
+3, 437, 433, 432, 59, 506, 65, 0,
+3, 401, 401, 438, 235, 235, 452, 0,
+3, 438, 434, 401, 452, 302, 235, 0,
+3, 434, 438, 439, 302, 452, 30, 0,
+3, 439, 435, 434, 30, 96, 302, 0,
+3, 435, 439, 440, 96, 30, 460, 0,
+3, 440, 436, 435, 460, 169, 96, 0,
+3, 436, 440, 441, 169, 460, 498, 0,
+3, 441, 437, 436, 498, 59, 169, 0,
+3, 401, 401, 442, 235, 235, 525, 0,
+3, 442, 438, 401, 525, 452, 235, 0,
+3, 438, 442, 443, 452, 525, 456, 0,
+3, 443, 439, 438, 456, 30, 452, 0,
+3, 439, 443, 444, 30, 456, 9, 0,
+3, 444, 440, 439, 9, 460, 30, 0,
+3, 440, 444, 445, 460, 9, 388, 0,
+3, 445, 441, 440, 388, 498, 460, 0,
+3, 401, 401, 446, 235, 235, 212, 0,
+3, 446, 442, 401, 212, 525, 235, 0,
+3, 442, 446, 447, 525, 212, 299, 0,
+3, 447, 443, 442, 299, 456, 525, 0,
+3, 443, 447, 448, 456, 299, 166, 0,
+3, 448, 444, 443, 166, 9, 456, 0,
+3, 444, 448, 449, 9, 166, 72, 0,
+3, 449, 445, 444, 72, 388, 9, 0,
+3, 401, 401, 450, 235, 235, 107, 0,
+3, 450, 446, 401, 107, 212, 235, 0,
+3, 446, 450, 451, 212, 107, 82, 0,
+3, 451, 447, 446, 82, 299, 212, 0,
+3, 447, 451, 452, 299, 82, 391, 0,
+3, 452, 448, 447, 391, 166, 299, 0,
+3, 448, 452, 453, 166, 391, 139, 0,
+3, 453, 449, 448, 139, 72, 166, 0,
+3, 401, 401, 454, 235, 235, 70, 0,
+3, 454, 450, 401, 70, 107, 235, 0,
+3, 450, 454, 455, 107, 70, 51, 0,
+3, 455, 451, 450, 51, 82, 107, 0,
+3, 451, 455, 456, 82, 51, 178, 0,
+3, 456, 452, 451, 178, 391, 82, 0,
+3, 452, 456, 457, 391, 178, 57, 0,
+3, 457, 453, 452, 57, 139, 391, 0,
+3, 401, 401, 458, 235, 235, 442, 0,
+3, 458, 454, 401, 442, 70, 235, 0,
+3, 454, 458, 459, 70, 442, 387, 0,
+3, 459, 455, 454, 387, 51, 70, 0,
+3, 455, 459, 460, 51, 387, 389, 0,
+3, 460, 456, 455, 389, 178, 51, 0,
+3, 456, 460, 461, 178, 389, 264, 0,
+3, 461, 457, 456, 264, 57, 178, 0,
+3, 401, 401, 462, 235, 235, 450, 0,
+3, 462, 458, 401, 450, 442, 235, 0,
+3, 458, 462, 463, 442, 450, 253, 0,
+3, 463, 459, 458, 253, 387, 442, 0,
+3, 459, 463, 464, 387, 253, 86, 0,
+3, 464, 460, 459, 86, 389, 387, 0,
+3, 460, 464, 465, 389, 86, 526, 0,
+3, 465, 461, 460, 526, 264, 389, 0,
+3, 401, 401, 402, 235, 235, 40, 0,
+3, 402, 462, 401, 40, 450, 235, 0,
+3, 462, 402, 403, 450, 40, 119, 0,
+3, 403, 463, 462, 119, 253, 450, 0,
+3, 463, 403, 404, 253, 119, 443, 0,
+3, 404, 464, 463, 443, 86, 253, 0,
+3, 464, 404, 405, 86, 443, 75, 0,
+3, 405, 465, 464, 75, 526, 86, 0,
+3, 405, 409, 470, 75, 241, 519, 0,
+3, 470, 466, 405, 519, 226, 75, 0,
+3, 466, 470, 471, 226, 519, 406, 0,
+3, 471, 467, 466, 406, 98, 226, 0,
+3, 467, 471, 472, 98, 406, 232, 0,
+3, 472, 468, 467, 232, 43, 98, 0,
+3, 468, 472, 473, 43, 232, 345, 0,
+3, 473, 469, 468, 345, 372, 43, 0,
+3, 409, 413, 474, 241, 121, 227, 0,
+3, 474, 470, 409, 227, 519, 241, 0,
+3, 470, 474, 475, 519, 227, 469, 0,
+3, 475, 471, 470, 469, 406, 519, 0,
+3, 471, 475, 476, 406, 469, 258, 0,
+3, 476, 472, 471, 258, 232, 406, 0,
+3, 472, 476, 477, 232, 258, 271, 0,
+3, 477, 473, 472, 271, 345, 232, 0,
+3, 413, 417, 478, 121, 351, 157, 0,
+3, 478, 474, 413, 157, 227, 121, 0,
+3, 474, 478, 479, 227, 157, 80, 0,
+3, 479, 475, 474, 80, 469, 227, 0,
+3, 475, 479, 480, 469, 80, 489, 0,
+3, 480, 476, 475, 489, 258, 469, 0,
+3, 476, 480, 481, 258, 489, 277, 0,
+3, 481, 477, 476, 277, 271, 258, 0,
+3, 417, 421, 482, 351, 412, 153, 0,
+3, 482, 478, 417, 153, 157, 351, 0,
+3, 478, 482, 483, 157, 153, 324, 0,
+3, 483, 479, 478, 324, 80, 157, 0,
+3, 479, 483, 484, 80, 324, 339, 0,
+3, 484, 480, 479, 339, 489, 80, 0,
+3, 480, 484, 485, 489, 339, 88, 0,
+3, 485, 481, 480, 88, 277, 489, 0,
+3, 421, 425, 486, 412, 39, 6, 0,
+3, 486, 482, 421, 6, 153, 412, 0,
+3, 482, 486, 487, 153, 6, 8, 0,
+3, 487, 483, 482, 8, 324, 153, 0,
+3, 483, 487, 488, 324, 8, 16, 0,
+3, 488, 484, 483, 16, 339, 324, 0,
+3, 484, 488, 489, 339, 16, 289, 0,
+3, 489, 485, 484, 289, 88, 339, 0,
+3, 425, 429, 490, 39, 249, 99, 0,
+3, 490, 486, 425, 99, 6, 39, 0,
+3, 486, 490, 491, 6, 99, 200, 0,
+3, 491, 487, 486, 200, 8, 6, 0,
+3, 487, 491, 492, 8, 200, 150, 0,
+3, 492, 488, 487, 150, 16, 8, 0,
+3, 488, 492, 493, 16, 150, 493, 0,
+3, 493, 489, 488, 493, 289, 16, 0,
+3, 429, 433, 494, 249, 506, 291, 0,
+3, 494, 490, 429, 291, 99, 249, 0,
+3, 490, 494, 495, 99, 291, 64, 0,
+3, 495, 491, 490, 64, 200, 99, 0,
+3, 491, 495, 496, 200, 64, 19, 0,
+3, 496, 492, 491, 19, 150, 200, 0,
+3, 492, 496, 497, 150, 19, 433, 0,
+3, 497, 493, 492, 433, 493, 150, 0,
+3, 433, 437, 498, 506, 59, 203, 0,
+3, 498, 494, 433, 203, 291, 506, 0,
+3, 494, 498, 499, 291, 203, 374, 0,
+3, 499, 495, 494, 374, 64, 291, 0,
+3, 495, 499, 500, 64, 374, 307, 0,
+3, 500, 496, 495, 307, 19, 64, 0,
+3, 496, 500, 501, 19, 307, 358, 0,
+3, 501, 497, 496, 358, 433, 19, 0,
+3, 437, 441, 502, 59, 498, 256, 0,
+3, 502, 498, 437, 256, 203, 59, 0,
+3, 498, 502, 503, 203, 256, 132, 0,
+3, 503, 499, 498, 132, 374, 203, 0,
+3, 499, 503, 504, 374, 132, 492, 0,
+3, 504, 500, 499, 492, 307, 374, 0,
+3, 500, 504, 505, 307, 492, 67, 0,
+3, 505, 501, 500, 67, 358, 307, 0,
+3, 441, 445, 506, 498, 388, 487, 0,
+3, 506, 502, 441, 487, 256, 498, 0,
+3, 502, 506, 507, 256, 487, 206, 0,
+3, 507, 503, 502, 206, 132, 256, 0,
+3, 503, 507, 508, 132, 206, 515, 0,
+3, 508, 504, 503, 515, 492, 132, 0,
+3, 504, 508, 509, 492, 515, 527, 0,
+3, 509, 505, 504, 527, 67, 492, 0,
+3, 445, 449, 510, 388, 72, 423, 0,
+3, 510, 506, 445, 423, 487, 388, 0,
+3, 506, 510, 511, 487, 423, 352, 0,
+3, 511, 507, 506, 352, 206, 487, 0,
+3, 507, 511, 512, 206, 352, 224, 0,
+3, 512, 508, 507, 224, 515, 206, 0,
+3, 508, 512, 513, 515, 224, 2, 0,
+3, 513, 509, 508, 2, 527, 515, 0,
+3, 449, 453, 514, 72, 139, 418, 0,
+3, 514, 510, 449, 418, 423, 72, 0,
+3, 510, 514, 515, 423, 418, 341, 0,
+3, 515, 511, 510, 341, 352, 423, 0,
+3, 511, 515, 516, 352, 341, 359, 0,
+3, 516, 512, 511, 359, 224, 352, 0,
+3, 512, 516, 517, 224, 359, 360, 0,
+3, 517, 513, 512, 360, 2, 224, 0,
+3, 453, 457, 518, 139, 57, 24, 0,
+3, 518, 514, 453, 24, 418, 139, 0,
+3, 514, 518, 519, 418, 24, 25, 0,
+3, 519, 515, 514, 25, 341, 418, 0,
+3, 515, 519, 520, 341, 25, 41, 0,
+3, 520, 516, 515, 41, 359, 341, 0,
+3, 516, 520, 521, 359, 41, 314, 0,
+3, 521, 517, 516, 314, 360, 359, 0,
+3, 457, 461, 522, 57, 264, 120, 0,
+3, 522, 518, 457, 120, 24, 57, 0,
+3, 518, 522, 523, 24, 120, 223, 0,
+3, 523, 519, 518, 223, 25, 24, 0,
+3, 519, 523, 524, 25, 223, 171, 0,
+3, 524, 520, 519, 171, 41, 25, 0,
+3, 520, 524, 525, 41, 171, 514, 0,
+3, 525, 521, 520, 514, 314, 41, 0,
+3, 461, 465, 526, 264, 526, 316, 0,
+3, 526, 522, 461, 316, 120, 264, 0,
+3, 522, 526, 527, 120, 316, 85, 0,
+3, 527, 523, 522, 85, 223, 120, 0,
+3, 523, 527, 528, 223, 85, 50, 0,
+3, 528, 524, 523, 50, 171, 223, 0,
+3, 524, 528, 529, 171, 50, 454, 0,
+3, 529, 525, 524, 454, 514, 171, 0,
+3, 465, 405, 466, 526, 75, 226, 0,
+3, 466, 526, 465, 226, 316, 526, 0,
+3, 526, 466, 467, 316, 226, 98, 0,
+3, 467, 527, 526, 98, 85, 316, 0,
+3, 527, 467, 468, 85, 98, 43, 0,
+3, 468, 528, 527, 43, 50, 85, 0,
+3, 528, 468, 469, 50, 43, 372, 0,
+3, 469, 529, 528, 372, 454, 50, 0
+};
+
+
+const int strip_vertices[] = {
+508, 508, 504, 509, 504, 505, 500, 501, 496, 497, 492, 493, 488, 489, 484, 485, 480, 481, 476, 477, 472, 473, -1,
+476, 475, 480, 479, 484, 483, 488, 487, 492, 491, 496, 495, 500, 499, 504, 499, 503, 498, 502, 437, 441, -1,
+527, 526, 467, 466, 471, 470, 475, 474, 479, 478, 483, 482, 487, 486, 491, 490, 495, 494, 499, 494, 498, -1,
+490, 490, 425, 486, 421, 482, 417, 478, 413, 474, 409, 470, 405, 466, 465, 526, 465, 461, 460, 456, 455, 451, -1,
+405, 465, 464, 460, 459, 455, 454, 450, -1,
+455, 451, 450, 446, 450, 401, 454, 458, 459, 463, 464, 404, 405, 404, 409, 408, 413, 412, 417, 416, 421, 420, -1,
+421, 420, 425, 420, 424, 419, 423, 418, 422, 418, 401, 414, 410, 415, 411, 416, 411, 412, 407, 408, 403, 404, 403, 463, -1,
+418, 418, 414, 419, 415, 420, 416, -1,
+407, 403, 402, 462, -1,
+403, 463, 462, 458, 462, 401, 402, 406, 407, 406, 411, 406, 410, 401, -1,
+494, 494, 498, 433, 437, 432, 436, 431, 435, 430, 434, 430, 401, 426, 422, 427, 423, 428, 424, 429, 425, 490, -1,
+430, 430, 426, 431, 427, 432, 428, 433, 429, 494, 490, -1,
+437, 437, 441, 436, 440, 435, 439, 434, 438, 401, 442, 446, 447, 451, 452, 456, 457, 461, 522, 526, 527, -1,
+452, 448, 447, -1,
+510, 445, 449, 444, 448, 443, 447, 443, 442, 443, 438, 443, 439, 444, 440, 445, 441, 506, 502, 507, 503, -1,
+510, 506, 445, -1,
+507, 506, 511, 510, 515, 510, 514, 449, 453, 448, 453, 452, 457, -1,
+527, 523, 522, 518, 457, 518, 453, 518, 514, 519, 515, -1,
+523, 519, 518, -1,
+504, 503, 508, 507, 512, 511, 516, 515, 520, 519, 524, 523, 528, 527, 468, 467, 472, 471, 476, 475, -1,
+472, 473, 468, 469, 528, 529, 524, 525, 520, 521, 516, 517, 512, 513, 508, 509, -1,
+211, 211, 214, 210, 209, -1,
+212, 215, 216, 219, 220, 223, 220, 211, 217, 214, 213, 209, 213, 208, 212, 147, -1,
+220, 217, 216, 213, 212, -1,
+251, 251, 248, 252, 249, 253, 250, 253, 211, 256, 210, 255, 209, 254, 208, 207, 147, 206, 147, 146, 147, 151, 212, 215, -1,
+206, 206, 202, 207, 203, 254, 251, 255, 252, 256, 253, -1,
+223, 223, 222, 219, 218, 215, 155, 151, 150, 146, 145, 146, 205, 206, 201, 202, 197, 202, 198, 203, 199, 251, 248, -1,
+145, 149, 150, 154, 155, 159, 218, 221, 222, 225, 226, 229, -1,
+204, 204, 145, 144, 149, 148, 149, 153, 154, 158, 159, 163, 221, 224, 225, 228, 229, 232, 229, 211, 226, 223, 222, -1,
+224, 224, 167, 163, 162, 158, 157, 153, 152, 148, 87, 148, 83, 144, 143, 204, 139, 200, 135, 196, 131, 192, -1,
+82, 83, 142, 143, 138, 139, 134, 135, 130, 131, 126, 127, 122, 123, 118, 123, 119, 184, 180, 185, 181, -1,
+81, 82, 141, 142, 137, 138, 133, 134, 129, 130, 125, 126, 121, 122, 117, 118, 113, 114, 109, 110, -1,
+80, 81, 140, 141, 136, 137, 132, 133, 128, 129, 124, 125, 120, 121, 116, 117, 112, 113, 108, 109, -1,
+4, 80, 79, 140, 74, 136, 69, 132, 64, 128, 59, 124, 54, 120, 49, 116, 44, 112, 39, 108, -1,
+79, 79, 73, 74, 68, 69, 63, 64, 58, 59, 53, 54, 48, 49, 48, 43, 42, 37, 36, 31, 30, 31, 25, -1,
+42, 42, 48, 47, 53, 52, 58, 57, 63, 62, 68, 67, 73, 72, 78, 77, 3, 2, 8, 7, 13, -1,
+36, 36, 42, 41, 47, 46, 52, 51, 57, 56, 62, 61, 67, 66, 72, 71, 77, 76, 2, 1, 7, -1,
+66, 66, 60, 61, 55, 56, 50, 51, 45, 46, 40, 41, 35, 36, 30, -1,
+31, 31, 25, 26, 20, 21, 15, 16, 10, 11, 5, 6, 0, 1, 75, 76, 70, 71, 65, 66, 60, -1,
+1, 1, 7, 6, 12, 11, 17, 16, 22, 21, 27, 26, 32, 31, 32, 37, 38, 43, 44, 49, -1,
+7, 7, 13, 12, 18, 17, 23, 22, 28, 27, 33, 32, 33, 38, -1,
+44, 44, 38, 39, 33, 34, 28, 29, 23, 24, 18, 19, 13, 14, 8, 9, 3, 4, 78, 79, 73, -1,
+39, 108, 34, 104, 29, 100, 24, 96, 19, 92, 14, 88, 9, 84, 4, 84, 80, 85, 81, 86, 81, 82, -1,
+108, 109, 104, 105, 100, 101, 96, 97, 92, 93, 88, 89, 84, 85, -1,
+109, 110, 105, 106, 101, 102, 97, 98, 93, 94, 89, 90, 85, 86, -1,
+118, 119, 114, 115, 110, 111, 106, 107, 102, 103, 98, 99, 94, 95, 90, 91, 86, 87, 82, 83, -1,
+111, 115, 176, -1,
+107, 111, 172, 176, 177, -1,
+103, 107, 168, 172, 173, 177, 178, -1,
+99, 103, 164, 168, 169, 173, 174, 178, 179, -1,
+95, 99, 160, 164, 165, 169, 170, 174, 175, 179, 233, -1,
+91, 95, 156, 160, 161, 165, 166, 170, 171, 175, 230, 233, 234, -1,
+87, 91, 152, 156, 157, 161, 162, 166, 167, 171, 227, 230, 231, 234, 235, 234, 238, 234, 237, 233, 236, 179, -1,
+185, 185, 181, 186, 182, 187, 183, 239, 236, 240, 237, 241, 238, 211, 235, 232, 231, 228, 227, 224, 167, -1,
+236, 179, 183, 178, 182, 177, 181, 176, 180, 115, 119, -1,
+131, 192, 127, 188, 123, 188, 184, 189, 185, 190, 186, 191, 187, 242, 239, 243, 240, 244, 241, 244, 211, 247, -1,
+192, 192, 188, 193, 189, 194, 190, 195, 191, 245, 242, 246, 243, 247, 244, -1,
+211, 247, 250, 246, 249, 245, 248, 195, 199, 194, 198, 193, 197, 192, 197, 196, 201, 200, 205, 204, 145, -1,
+393, 393, 394, 398, 399, 371, -1,
+399, 395, 394, -1,
+363, 363, 393, 397, 398, 370, 371, 375, -1,
+379, 375, 374, 370, 369, 397, 368, 363, 362, -1,
+396, 395, 400, 399, 372, 371, 376, 375, 380, 379, 384, 383, 388, 387, 392, 391, 396, 391, 395, 390, 394, -1,
+374, 378, 379, 378, 383, 382, 387, 386, 391, 386, 390, 385, 389, 353, 358, 352, 357, 351, 356, 350, 355, -1,
+341, 341, 347, 346, 352, 346, 351, 345, 350, -1,
+335, 334, 340, 339, 345, 344, 350, 349, 355, 354, -1,
+390, 390, 394, 389, 393, 358, 363, 357, 362, 356, 361, 355, 360, 354, 360, 359, 365, 364, 330, 329, 335, 334, -1,
+345, 346, 340, 341, 335, 336, 330, 331, 365, 366, 360, 366, 361, 367, 362, 367, 368, 333, 369, 373, 374, 378, -1,
+353, 353, 348, 385, 381, 386, 381, 382, 377, 378, 377, 373, 338, 333, 332, 367, 332, 366, 332, 331, 337, 336, 342, 341, 347, -1,
+332, 337, 338, 343, 377, 343, 381, 343, 348, 342, 348, 347, 353, 352, -1,
+337, 342, 343, -1,
+314, 314, 319, 318, 323, 322, 323, 327, -1,
+309, 309, 314, 313, 318, 317, 322, 321, 322, 326, 327, 299, -1,
+271, 271, 309, 276, 313, 281, 317, 286, 321, 291, 321, 325, 326, 298, 299, 303, -1,
+265, 265, 271, 270, 276, 275, 281, 280, 286, 285, 291, 290, 291, 296, 325, 297, 298, 302, 303, 307, -1,
+259, 259, 265, 264, 270, 269, 275, 274, 280, 279, 285, 284, 290, 289, 290, 295, 296, 261, 297, 301, 302, 306, 307, 311, -1,
+293, 293, 259, 258, 264, 263, 269, 268, 274, 273, 279, 278, 284, 283, 289, 288, 289, 294, 295, 260, 261, 266, -1,
+309, 305, 271, 266, 265, 260, 259, 294, 293, 288, 287, 288, 282, 283, 277, 278, 272, 273, 267, 268, 262, -1,
+268, 268, 262, 263, 257, 258, 292, 293, 287, -1,
+261, 266, 301, 305, 306, 310, 311, 315, 316, 320, -1,
+316, 316, 311, 312, 307, 308, 303, 304, 299, 300, 327, 328, 323, 324, 319, 320, 319, 315, 314, 310, 309, 305, -1
+};
+
+
+const int strip_normals[] = {
+515, 515, 492, 527, 492, 67, 307, 358, 19, 433, 150, 493, 16, 289, 339, 88, 489, 277, 258, 271, 232, 345, -1,
+258, 469, 489, 80, 339, 324, 16, 8, 150, 200, 19, 64, 307, 374, 492, 374, 132, 203, 256, 59, 498, -1,
+85, 316, 98, 226, 406, 519, 469, 227, 80, 157, 324, 153, 8, 6, 200, 99, 64, 291, 374, 291, 203, -1,
+99, 99, 39, 6, 412, 153, 351, 157, 121, 227, 241, 519, 75, 226, 526, 316, 526, 264, 389, 178, 51, 82, -1,
+75, 526, 86, 389, 387, 51, 70, 107, -1,
+51, 82, 107, 212, 107, 235, 70, 442, 387, 253, 86, 443, 75, 443, 241, 202, 121, 281, 351, 436, 412, 376, -1,
+412, 376, 39, 376, 158, 361, 21, 90, 52, 90, 235, 479, 263, 36, 196, 436, 196, 281, 306, 202, 119, 443, 119, 253, -1,
+90, 90, 479, 361, 36, 376, 436, -1,
+306, 119, 40, 450, -1,
+119, 253, 450, 442, 450, 235, 40, 189, 306, 189, 196, 189, 263, 235, -1,
+291, 291, 203, 506, 59, 65, 169, 229, 96, 432, 302, 432, 235, 424, 52, 373, 21, 375, 158, 249, 39, 99, -1,
+432, 432, 424, 229, 373, 65, 375, 506, 249, 291, 99, -1,
+59, 59, 498, 169, 460, 96, 30, 302, 452, 235, 525, 212, 299, 82, 391, 178, 57, 264, 120, 316, 85, -1,
+391, 166, 299, -1,
+423, 388, 72, 9, 166, 456, 299, 456, 525, 456, 452, 456, 30, 9, 460, 388, 498, 487, 256, 206, 132, -1,
+423, 487, 388, -1,
+206, 487, 352, 423, 341, 423, 418, 72, 139, 166, 139, 391, 57, -1,
+85, 223, 120, 24, 57, 24, 139, 24, 418, 25, 341, -1,
+223, 25, 24, -1,
+492, 132, 515, 206, 224, 352, 359, 341, 41, 25, 171, 223, 50, 85, 43, 98, 232, 406, 258, 469, -1,
+232, 345, 43, 372, 50, 454, 171, 514, 41, 314, 359, 360, 224, 2, 515, 527, -1,
+393, 393, 0, 216, 349, -1,
+486, 215, 327, 91, 177, 254, 177, 393, 512, 0, 231, 349, 231, 279, 486, 246, -1,
+177, 512, 327, 231, 486, -1,
+462, 462, 144, 76, 179, 464, 298, 464, 393, 128, 216, 113, 349, 500, 279, 101, 246, 7, 246, 395, 246, 384, 486, 215, -1,
+7, 7, 195, 101, 444, 500, 462, 113, 76, 128, 464, -1,
+254, 254, 285, 91, 149, 215, 83, 384, 325, 395, 520, 395, 315, 7, 143, 195, 129, 195, 461, 444, 475, 462, 144, -1,
+520, 308, 325, 415, 83, 297, 149, 504, 285, 162, 278, 446, -1,
+403, 403, 520, 276, 308, 404, 308, 272, 415, 416, 297, 317, 504, 125, 162, 60, 446, 110, 446, 393, 278, 254, 285, -1,
+125, 125, 459, 317, 334, 416, 137, 272, 47, 404, 511, 404, 1, 276, 54, 403, 45, 370, 490, 210, 29, 184, -1,
+336, 1, 251, 54, 164, 45, 463, 490, 378, 29, 453, 147, 222, 218, 301, 218, 242, 310, 130, 528, 34, -1,
+26, 336, 148, 251, 269, 164, 419, 463, 293, 378, 420, 453, 333, 222, 208, 301, 294, 56, 127, 228, -1,
+131, 26, 371, 148, 284, 269, 311, 419, 95, 293, 350, 420, 377, 333, 474, 208, 396, 294, 357, 127, -1,
+116, 131, 273, 371, 480, 284, 104, 311, 257, 95, 348, 350, 447, 377, 313, 474, 322, 396, 28, 357, -1,
+273, 273, 183, 480, 347, 104, 53, 257, 181, 348, 124, 447, 428, 313, 428, 435, 11, 270, 193, 305, 69, 305, 386, -1,
+11, 11, 428, 409, 124, 382, 181, 161, 53, 481, 347, 408, 183, 319, 151, 422, 448, 4, 165, 134, 394, -1,
+193, 193, 11, 495, 409, 44, 382, 385, 161, 478, 481, 320, 408, 37, 319, 524, 422, 328, 4, 465, 134, -1,
+37, 37, 431, 320, 136, 478, 513, 385, 27, 44, 467, 495, 115, 193, 69, -1,
+305, 305, 386, 20, 174, 182, 401, 211, 248, 106, 295, 309, 255, 465, 483, 328, 191, 524, 135, 37, 431, -1,
+465, 465, 134, 309, 102, 106, 427, 211, 507, 182, 410, 20, 503, 305, 503, 270, 445, 435, 322, 313, -1,
+134, 134, 394, 102, 455, 427, 5, 507, 23, 410, 405, 503, 405, 445, -1,
+322, 322, 445, 28, 405, 138, 23, 485, 5, 234, 455, 74, 394, 180, 165, 49, 448, 116, 151, 273, 183, -1,
+28, 357, 138, 268, 485, 287, 234, 81, 74, 78, 180, 103, 49, 220, 116, 220, 131, 476, 26, 38, 26, 336, -1,
+357, 127, 268, 252, 287, 398, 81, 274, 78, 154, 103, 62, 220, 476, -1,
+127, 228, 252, 141, 398, 440, 274, 363, 154, 190, 62, 488, 476, 38, -1,
+301, 242, 56, 517, 228, 33, 141, 18, 440, 466, 363, 304, 190, 417, 488, 484, 38, 511, 336, 1, -1,
+33, 517, 260, -1,
+18, 33, 390, 260, 497, -1,
+466, 18, 353, 390, 290, 497, 126, -1,
+304, 466, 187, 353, 123, 290, 522, 126, 501, -1,
+417, 304, 458, 187, 117, 123, 168, 522, 87, 501, 261, -1,
+484, 417, 430, 458, 343, 117, 438, 168, 426, 87, 482, 261, 329, -1,
+511, 484, 47, 430, 137, 343, 334, 438, 459, 426, 439, 482, 92, 329, 192, 329, 267, 329, 491, 261, 219, 501, -1,
+528, 528, 34, 145, 46, 356, 105, 472, 219, 48, 491, 247, 267, 393, 192, 110, 92, 60, 439, 125, 459, -1,
+219, 501, 105, 126, 46, 497, 34, 260, 130, 517, 242, -1,
+29, 184, 147, 156, 218, 156, 310, 402, 528, 146, 145, 17, 356, 411, 472, 364, 48, 441, 247, 441, 393, 509, -1,
+184, 184, 156, 63, 402, 354, 146, 335, 17, 239, 411, 13, 364, 509, 441, -1,
+393, 509, 298, 13, 179, 239, 144, 335, 475, 354, 461, 63, 129, 184, 129, 210, 143, 370, 315, 403, 520, -1,
+296, 296, 160, 133, 344, 330, -1,
+344, 323, 160, -1,
+159, 159, 296, 275, 133, 22, 330, 523, -1,
+198, 523, 77, 22, 286, 275, 437, 159, 499, -1,
+280, 323, 108, 344, 338, 330, 259, 523, 366, 198, 381, 240, 283, 10, 368, 243, 280, 243, 323, 35, 160, -1,
+77, 471, 198, 471, 240, 250, 10, 303, 243, 303, 35, 230, 282, 362, 163, 73, 318, 292, 93, 477, 262, -1,
+413, 413, 326, 399, 73, 399, 292, 100, 477, -1,
+122, 355, 414, 61, 100, 55, 477, 508, 262, 365, -1,
+35, 35, 160, 282, 296, 163, 159, 318, 499, 93, 505, 262, 340, 365, 340, 140, 68, 510, 518, 3, 122, 355, -1,
+100, 399, 414, 413, 122, 111, 518, 213, 68, 167, 340, 167, 505, 245, 499, 245, 437, 346, 286, 79, 77, 471, -1,
+362, 362, 221, 230, 516, 303, 516, 250, 207, 471, 207, 79, 521, 346, 468, 245, 468, 167, 468, 213, 473, 111, 204, 413, 326, -1,
+468, 473, 521, 217, 207, 217, 516, 217, 221, 204, 221, 326, 362, 73, -1,
+473, 204, 217, -1,
+94, 94, 185, 529, 429, 209, 429, 176, -1,
+379, 379, 94, 199, 529, 367, 209, 172, 209, 66, 176, 496, -1,
+312, 312, 379, 238, 199, 15, 367, 332, 172, 197, 172, 451, 66, 84, 496, 186, -1,
+266, 266, 312, 392, 238, 201, 15, 14, 332, 457, 197, 383, 197, 225, 451, 502, 84, 265, 186, 205, -1,
+236, 236, 266, 214, 392, 71, 201, 188, 14, 173, 457, 400, 383, 380, 383, 342, 225, 109, 502, 175, 265, 97, 205, 118, -1,
+152, 152, 236, 337, 214, 58, 71, 369, 188, 434, 173, 114, 400, 288, 380, 42, 380, 397, 342, 32, 109, 331, -1,
+379, 170, 312, 331, 266, 32, 236, 397, 152, 42, 194, 42, 407, 288, 142, 114, 12, 434, 233, 369, 244, -1,
+369, 369, 244, 58, 425, 337, 321, 152, 194, -1,
+109, 331, 175, 170, 97, 300, 118, 421, 31, 89, -1,
+31, 31, 118, 237, 205, 449, 186, 470, 496, 494, 176, 155, 429, 112, 185, 89, 185, 421, 94, 300, 379, 170, -1
+};
+
+#else  /* defined(_WIN32_WCE) */
+
+/*
+ * Original teapot code copyright follows:
+ */
+
+/*
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ *
+ * ALL RIGHTS RESERVED
+ *
+ * Permission to use, copy, modify, and distribute this software
+ * for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that
+ * both the copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of Silicon
+ * Graphics, Inc. not be used in advertising or publicity
+ * pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU
+ * "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR
+ * OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  IN NO
+ * EVENT SHALL SILICON GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE
+ * ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
+ * INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,
+ * SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR
+ * NOT SILICON GRAPHICS, INC.  HAS BEEN ADVISED OF THE POSSIBILITY
+ * OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ *
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer
+ * Software clause at DFARS 252.227-7013 and/or in similar or
+ * successor clauses in the FAR or the DOD or NASA FAR
+ * Supplement.  Unpublished-- rights reserved under the copyright
+ * laws of the United States.  Contractor/manufacturer is Silicon
+ * Graphics, Inc., 2011 N.  Shoreline Blvd., Mountain View, CA
+ * 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+
+/*
+ * Rim, body, lid, and bottom data must be reflected in x and y;
+ * handle and spout data across the y axis only.
+ */
+static int patchdata[][16] =
+{
+    { 102, 103, 104, 105,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15 }, /* rim    */
+    {  12,  13,  14,  15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27 }, /* body   */
+    {  24,  25,  26,  27,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40 },
+    {  96,  96,  96,  96,  97,  98,  99, 100, 101, 101, 101, 101,   0,   1,   2,   3 }, /* lid    */
+    {   0,   1,   2,   3, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117 },
+    { 118, 118, 118, 118, 124, 122, 119, 121, 123, 126, 125, 120,  40,  39,  38,  37 }, /* bottom */
+    {  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56 }, /* handle */
+    {  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  28,  65,  66,  67 },
+    {  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,  80,  81,  82,  83 }, /* spout  */
+    {  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95 }
+};
+
+static double cpdata[][3] =
+{
+    {0.2, 0, 2.7}, {0.2, -0.112, 2.7}, {0.112, -0.2, 2.7}, {0,
+    -0.2, 2.7}, {1.3375, 0, 2.53125}, {1.3375, -0.749, 2.53125},
+    {0.749, -1.3375, 2.53125}, {0, -1.3375, 2.53125}, {1.4375,
+    0, 2.53125}, {1.4375, -0.805, 2.53125}, {0.805, -1.4375,
+    2.53125}, {0, -1.4375, 2.53125}, {1.5, 0, 2.4}, {1.5, -0.84,
+    2.4}, {0.84, -1.5, 2.4}, {0, -1.5, 2.4}, {1.75, 0, 1.875},
+    {1.75, -0.98, 1.875}, {0.98, -1.75, 1.875}, {0, -1.75,
+    1.875}, {2, 0, 1.35}, {2, -1.12, 1.35}, {1.12, -2, 1.35},
+    {0, -2, 1.35}, {2, 0, 0.9}, {2, -1.12, 0.9}, {1.12, -2,
+    0.9}, {0, -2, 0.9}, {-2, 0, 0.9}, {2, 0, 0.45}, {2, -1.12,
+    0.45}, {1.12, -2, 0.45}, {0, -2, 0.45}, {1.5, 0, 0.225},
+    {1.5, -0.84, 0.225}, {0.84, -1.5, 0.225}, {0, -1.5, 0.225},
+    {1.5, 0, 0.15}, {1.5, -0.84, 0.15}, {0.84, -1.5, 0.15}, {0,
+    -1.5, 0.15}, {-1.6, 0, 2.025}, {-1.6, -0.3, 2.025}, {-1.5,
+    -0.3, 2.25}, {-1.5, 0, 2.25}, {-2.3, 0, 2.025}, {-2.3, -0.3,
+    2.025}, {-2.5, -0.3, 2.25}, {-2.5, 0, 2.25}, {-2.7, 0,
+    2.025}, {-2.7, -0.3, 2.025}, {-3, -0.3, 2.25}, {-3, 0,
+    2.25}, {-2.7, 0, 1.8}, {-2.7, -0.3, 1.8}, {-3, -0.3, 1.8},
+    {-3, 0, 1.8}, {-2.7, 0, 1.575}, {-2.7, -0.3, 1.575}, {-3,
+    -0.3, 1.35}, {-3, 0, 1.35}, {-2.5, 0, 1.125}, {-2.5, -0.3,
+    1.125}, {-2.65, -0.3, 0.9375}, {-2.65, 0, 0.9375}, {-2,
+    -0.3, 0.9}, {-1.9, -0.3, 0.6}, {-1.9, 0, 0.6}, {1.7, 0,
+    1.425}, {1.7, -0.66, 1.425}, {1.7, -0.66, 0.6}, {1.7, 0,
+    0.6}, {2.6, 0, 1.425}, {2.6, -0.66, 1.425}, {3.1, -0.66,
+    0.825}, {3.1, 0, 0.825}, {2.3, 0, 2.1}, {2.3, -0.25, 2.1},
+    {2.4, -0.25, 2.025}, {2.4, 0, 2.025}, {2.7, 0, 2.4}, {2.7,
+    -0.25, 2.4}, {3.3, -0.25, 2.4}, {3.3, 0, 2.4}, {2.8, 0,
+    2.475}, {2.8, -0.25, 2.475}, {3.525, -0.25, 2.49375},
+    {3.525, 0, 2.49375}, {2.9, 0, 2.475}, {2.9, -0.15, 2.475},
+    {3.45, -0.15, 2.5125}, {3.45, 0, 2.5125}, {2.8, 0, 2.4},
+    {2.8, -0.15, 2.4}, {3.2, -0.15, 2.4}, {3.2, 0, 2.4}, {0, 0,
+    3.15}, {0.8, 0, 3.15}, {0.8, -0.45, 3.15}, {0.45, -0.8,
+    3.15}, {0, -0.8, 3.15}, {0, 0, 2.85}, {1.4, 0, 2.4}, {1.4,
+    -0.784, 2.4}, {0.784, -1.4, 2.4}, {0, -1.4, 2.4}, {0.4, 0,
+    2.55}, {0.4, -0.224, 2.55}, {0.224, -0.4, 2.55}, {0, -0.4,
+    2.55}, {1.3, 0, 2.55}, {1.3, -0.728, 2.55}, {0.728, -1.3,
+    2.55}, {0, -1.3, 2.55}, {1.3, 0, 2.4}, {1.3, -0.728, 2.4},
+    {0.728, -1.3, 2.4}, {0, -1.3, 2.4}, {0, 0, 0}, {1.425,
+    -0.798, 0}, {1.5, 0, 0.075}, {1.425, 0, 0}, {0.798, -1.425,
+    0}, {0, -1.5, 0.075}, {0, -1.425, 0}, {1.5, -0.84, 0.075},
+    {0.84, -1.5, 0.075}
+};
+
+static double tex[2][2][2] =
+{
+    { {0.0, 0.0}, {1.0, 0.0} },
+    { {0.0, 1.0}, {1.0, 1.0} }
+};
+#endif  /* defined(_WIN32_WCE) */
+
+
+#endif  /* FREEGLUT_TEAPOT_DATA_H */
+
index 1570662..4d00fb9 100644 (file)
@@ -1,50 +1,50 @@
-/*\r
- * freeglut_videoresize.c\r
- *\r
- * Video resize functions (as defined by GLUT API)\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Thu Dec 16 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-/*\r
- * NOTE: functions declared in this file probably will not be implemented.\r
- */\r
-\r
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */\r
-\r
-int  FGAPIENTRY glutVideoResizeGet( GLenum eWhat )            {    return( 0x00 );    }\r
-void FGAPIENTRY glutSetupVideoResizing( void )                { /* Not implemented */ }\r
-void FGAPIENTRY glutStopVideoResizing( void )                 { /* Not implemented */ }\r
-void FGAPIENTRY glutVideoResize( int x, int y, int w, int h ) { /* Not implemented */ }\r
-void FGAPIENTRY glutVideoPan( int x, int y, int w, int h )    { /* Not implemented */ }\r
-\r
-/*** END OF FILE ***/\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
+/*
+ * freeglut_videoresize.c
+ *
+ * Video resize functions (as defined by GLUT API)
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Thu Dec 16 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+/*
+ * NOTE: functions declared in this file probably will not be implemented.
+ */
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+int  FGAPIENTRY glutVideoResizeGet( GLenum eWhat )            {    return( 0x00 );    }
+void FGAPIENTRY glutSetupVideoResizing( void )                { /* Not implemented */ }
+void FGAPIENTRY glutStopVideoResizing( void )                 { /* Not implemented */ }
+void FGAPIENTRY glutVideoResize( int x, int y, int w, int h ) { /* Not implemented */ }
+void FGAPIENTRY glutVideoPan( int x, int y, int w, int h )    { /* Not implemented */ }
+
+/*** END OF FILE ***/
+
+
+
+
+
+
+
index 732082b..9610a38 100644 (file)
-/*\r
- * freeglut_window.c\r
- *\r
- * Window management methods.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Creation date: Fri Dec 3 1999\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#define FREEGLUT_BUILDING_LIB\r
-#include <GL/freeglut.h>\r
-#include "freeglut_internal.h"\r
-\r
-#if defined(_WIN32_WCE)\r
-#   include <Aygshell.h>\r
-#   ifdef FREEGLUT_LIB_PRAGMAS\r
-#       pragma comment( lib, "Aygshell.lib" )\r
-#   endif\r
-#endif /* defined(_WIN32_WCE) */\r
-\r
-\r
-/*\r
- * TODO BEFORE THE STABLE RELEASE:\r
- *\r
- *  fgSetupPixelFormat      -- ignores the display mode settings\r
- *  fgOpenWindow()          -- check the Win32 version, -iconic handling!\r
- *  fgCloseWindow()         -- check the Win32 version\r
- *  glutCreateWindow()      -- Check when default position and size is {-1,-1}\r
- *  glutCreateSubWindow()   -- Check when default position and size is {-1,-1}\r
- *  glutDestroyWindow()     -- check the Win32 version\r
- *  glutSetWindow()         -- check the Win32 version\r
- *  glutGetWindow()         -- OK\r
- *  glutSetWindowTitle()    -- check the Win32 version\r
- *  glutSetIconTitle()      -- check the Win32 version\r
- *  glutShowWindow()        -- check the Win32 version\r
- *  glutHideWindow()        -- check the Win32 version\r
- *  glutIconifyWindow()     -- check the Win32 version\r
- *  glutReshapeWindow()     -- check the Win32 version\r
- *  glutPositionWindow()    -- check the Win32 version\r
- *  glutPushWindow()        -- check the Win32 version\r
- *  glutPopWindow()         -- check the Win32 version\r
- */\r
-\r
-\r
-extern void fgPlatformSetWindow ( SFG_Window *window );\r
-extern void fgPlatformOpenWindow( SFG_Window* window, const char* title,\r
-                                  GLboolean positionUse, int x, int y,\r
-                                  GLboolean sizeUse, int w, int h,\r
-                                  GLboolean gameMode, GLboolean isSubWindow );\r
-extern void fgPlatformCloseWindow( SFG_Window* window );\r
-extern void fgPlatformGlutShowWindow( void );\r
-extern void fgPlatformGlutHideWindow( void );\r
-extern void fgPlatformGlutIconifyWindow( void );\r
-extern void fgPlatformGlutSetWindowTitle( const char* title );\r
-extern void fgPlatformGlutSetIconTitle( const char* title );\r
-extern void fgPlatformGlutPositionWindow( int x, int y );\r
-extern void fgPlatformGlutPushWindow( void );\r
-extern void fgPlatformGlutPopWindow( void );\r
-extern void fgPlatformGlutFullScreen( SFG_Window *win );\r
-extern void fgPlatformGlutLeaveFullScreen( SFG_Window *win );\r
-extern void fgPlatformGlutFullScreenToggle( SFG_Window *win );\r
-\r
-\r
-/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */\r
-\r
-int fghIsLegacyContextVersionRequested( void )\r
-{\r
-  return fgState.MajorVersion < 2 || (fgState.MajorVersion == 2 && fgState.MinorVersion <= 1);\r
-}\r
-\r
-int fghIsLegacyContextRequested( void )\r
-{\r
-  return fghIsLegacyContextVersionRequested() &&\r
-         fgState.ContextFlags == 0 &&\r
-         fgState.ContextProfile == 0;\r
-}\r
-\r
-int fghNumberOfAuxBuffersRequested( void )\r
-{\r
-  if ( fgState.DisplayMode & GLUT_AUX4 ) {\r
-    return 4;\r
-  }\r
-  if ( fgState.DisplayMode & GLUT_AUX3 ) {\r
-    return 3;\r
-  }\r
-  if ( fgState.DisplayMode & GLUT_AUX2 ) {\r
-    return 2;\r
-  }\r
-  if ( fgState.DisplayMode & GLUT_AUX1 ) { /* NOTE: Same as GLUT_AUX! */\r
-    return fgState.AuxiliaryBufferNumber;\r
-  }\r
-  return 0;\r
-}\r
-\r
-int fghMapBit( int mask, int from, int to )\r
-{\r
-  return ( mask & from ) ? to : 0;\r
-\r
-}\r
-\r
-void fghContextCreationError( void )\r
-{\r
-    fgError( "Unable to create OpenGL %d.%d context (flags %x, profile %x)",\r
-             fgState.MajorVersion, fgState.MinorVersion, fgState.ContextFlags,\r
-             fgState.ContextProfile );\r
-}\r
-\r
-\r
-/* -- SYSTEM-DEPENDENT PRIVATE FUNCTIONS ------------------------------------ */\r
-\r
-/*\r
- * Sets the OpenGL context and the fgStructure "Current Window" pointer to\r
- * the window structure passed in.\r
- */\r
-void fgSetWindow ( SFG_Window *window )\r
-{\r
-       fgPlatformSetWindow ( window );\r
-\r
-    fgStructure.CurrentWindow = window;\r
-}\r
-\r
-/*\r
- * Opens a window. Requires a SFG_Window object created and attached\r
- * to the freeglut structure. OpenGL context is created here.\r
- */\r
-void fgOpenWindow( SFG_Window* window, const char* title,\r
-                   GLboolean positionUse, int x, int y,\r
-                   GLboolean sizeUse, int w, int h,\r
-                   GLboolean gameMode, GLboolean isSubWindow )\r
-{\r
-       fgPlatformOpenWindow( window, title,\r
-                   positionUse, x, y,\r
-                   sizeUse, w, h,\r
-                   gameMode, isSubWindow );\r
-\r
-    fgSetWindow( window );\r
-\r
-    window->Window.DoubleBuffered =\r
-        ( fgState.DisplayMode & GLUT_DOUBLE ) ? 1 : 0;\r
-\r
-    if ( ! window->Window.DoubleBuffered )\r
-    {\r
-        glDrawBuffer ( GL_FRONT );\r
-        glReadBuffer ( GL_FRONT );\r
-    }\r
-}\r
-\r
-/*\r
- * Closes a window, destroying the frame and OpenGL context\r
- */\r
-void fgCloseWindow( SFG_Window* window )\r
-{\r
-    /* if we're in gamemode and we're closing the gamemode window,\r
-     * call glutLeaveGameMode first to make sure the gamemode is\r
-     * properly closed before closing the window\r
-     */\r
-    if (fgStructure.GameModeWindow != NULL && fgStructure.GameModeWindow->ID==window->ID)\r
-        glutLeaveGameMode();\r
-\r
-       fgPlatformCloseWindow ( window );\r
-}\r
-\r
-\r
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */\r
-\r
-/*\r
- * Creates a new top-level freeglut window\r
- */\r
-int FGAPIENTRY glutCreateWindow( const char* title )\r
-{\r
-    /* XXX GLUT does not exit; it simply calls "glutInit" quietly if the\r
-     * XXX application has not already done so.  The "freeglut" community\r
-     * XXX decided not to go this route (freeglut-developer e-mail from\r
-     * XXX Steve Baker, 12/16/04, 4:22 PM CST, "Re: [Freeglut-developer]\r
-     * XXX Desired 'freeglut' behaviour when there is no current window"\r
-     */\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateWindow" );\r
-\r
-    return fgCreateWindow( NULL, title, fgState.Position.Use,\r
-                           fgState.Position.X, fgState.Position.Y,\r
-                           fgState.Size.Use, fgState.Size.X, fgState.Size.Y,\r
-                           GL_FALSE, GL_FALSE )->ID;\r
-}\r
-\r
-/*\r
- * This function creates a sub window.\r
- */\r
-int FGAPIENTRY glutCreateSubWindow( int parentID, int x, int y, int w, int h )\r
-{\r
-    int ret = 0;\r
-    SFG_Window* window = NULL;\r
-    SFG_Window* parent = NULL;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateSubWindow" );\r
-    parent = fgWindowByID( parentID );\r
-    freeglut_return_val_if_fail( parent != NULL, 0 );\r
-    if ( x < 0 )\r
-    {\r
-        x = parent->State.Width + x ;\r
-        if ( w >= 0 ) x -= w ;\r
-    }\r
-\r
-    if ( w < 0 ) w = parent->State.Width - x + w ;\r
-    if ( w < 0 )\r
-    {\r
-        x += w ;\r
-        w = -w ;\r
-    }\r
-\r
-    if ( y < 0 )\r
-    {\r
-        y = parent->State.Height + y ;\r
-        if ( h >= 0 ) y -= h ;\r
-    }\r
-\r
-    if ( h < 0 ) h = parent->State.Height - y + h ;\r
-    if ( h < 0 )\r
-    {\r
-        y += h ;\r
-        h = -h ;\r
-    }\r
-\r
-    window = fgCreateWindow( parent, "", GL_TRUE, x, y, GL_TRUE, w, h, GL_FALSE, GL_FALSE );\r
-    ret = window->ID;\r
-\r
-    return ret;\r
-}\r
-\r
-/*\r
- * Destroys a window and all of its subwindows\r
- */\r
-void FGAPIENTRY glutDestroyWindow( int windowID )\r
-{\r
-    SFG_Window* window;\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDestroyWindow" );\r
-    window = fgWindowByID( windowID );\r
-    freeglut_return_if_fail( window != NULL );\r
-    {\r
-        fgExecutionState ExecState = fgState.ExecState;\r
-        fgAddToWindowDestroyList( window );\r
-        fgState.ExecState = ExecState;\r
-    }\r
-}\r
-\r
-/*\r
- * This function selects the current window\r
- */\r
-void FGAPIENTRY glutSetWindow( int ID )\r
-{\r
-    SFG_Window* window = NULL;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetWindow" );\r
-    if( fgStructure.CurrentWindow != NULL )\r
-        if( fgStructure.CurrentWindow->ID == ID )\r
-            return;\r
-\r
-    window = fgWindowByID( ID );\r
-    if( window == NULL )\r
-    {\r
-        fgWarning( "glutSetWindow(): window ID %d not found!", ID );\r
-        return;\r
-    }\r
-\r
-    fgSetWindow( window );\r
-}\r
-\r
-/*\r
- * This function returns the ID number of the current window, 0 if none exists\r
- */\r
-int FGAPIENTRY glutGetWindow( void )\r
-{\r
-    SFG_Window *win = fgStructure.CurrentWindow;\r
-    /*\r
-     * Since GLUT did not throw an error if this function was called without a prior call to\r
-     * "glutInit", this function shouldn't do so here.  Instead let us return a zero.\r
-     * See Feature Request "[ 1307049 ] glutInit check".\r
-     */\r
-    if ( ! fgState.Initialised )\r
-        return 0;\r
-\r
-    while ( win && win->IsMenu )\r
-        win = win->Parent;\r
-    return win ? win->ID : 0;\r
-}\r
-\r
-/*\r
- * This function makes the current window visible\r
- */\r
-void FGAPIENTRY glutShowWindow( void )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutShowWindow" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutShowWindow" );\r
-\r
-       fgPlatformGlutShowWindow ();\r
-\r
-    fgStructure.CurrentWindow->State.Redisplay = GL_TRUE;\r
-}\r
-\r
-/*\r
- * This function hides the current window\r
- */\r
-void FGAPIENTRY glutHideWindow( void )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutHideWindow" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutHideWindow" );\r
-\r
-       fgPlatformGlutHideWindow ();\r
-\r
-    fgStructure.CurrentWindow->State.Redisplay = GL_FALSE;\r
-}\r
-\r
-/*\r
- * Iconify the current window (top-level windows only)\r
- */\r
-void FGAPIENTRY glutIconifyWindow( void )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutIconifyWindow" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutIconifyWindow" );\r
-\r
-    fgStructure.CurrentWindow->State.Visible   = GL_FALSE;\r
-\r
-       fgPlatformGlutIconifyWindow ();\r
-\r
-    fgStructure.CurrentWindow->State.Redisplay = GL_FALSE;\r
-}\r
-\r
-/*\r
- * Set the current window's title\r
- */\r
-void FGAPIENTRY glutSetWindowTitle( const char* title )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetWindowTitle" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetWindowTitle" );\r
-    if( ! fgStructure.CurrentWindow->Parent )\r
-    {\r
-               fgPlatformGlutSetWindowTitle ( title );\r
-    }\r
-}\r
-\r
-/*\r
- * Set the current window's iconified title\r
- */\r
-void FGAPIENTRY glutSetIconTitle( const char* title )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetIconTitle" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetIconTitle" );\r
-\r
-    if( ! fgStructure.CurrentWindow->Parent )\r
-    {\r
-               fgPlatformGlutSetIconTitle ( title );\r
-    }\r
-}\r
-\r
-/*\r
- * Change the current window's size\r
- */\r
-void FGAPIENTRY glutReshapeWindow( int width, int height )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutReshapeWindow" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutReshapeWindow" );\r
-\r
-    if (glutGet(GLUT_FULL_SCREEN))\r
-    {\r
-      /*  Leave full screen state before resizing. */\r
-      glutLeaveFullScreen();\r
-    }\r
-\r
-    fgStructure.CurrentWindow->State.NeedToResize = GL_TRUE;\r
-    fgStructure.CurrentWindow->State.Width  = width ;\r
-    fgStructure.CurrentWindow->State.Height = height;\r
-}\r
-\r
-/*\r
- * Change the current window's position\r
- */\r
-void FGAPIENTRY glutPositionWindow( int x, int y )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPositionWindow" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPositionWindow" );\r
-\r
-    if (glutGet(GLUT_FULL_SCREEN))\r
-    {\r
-      /*  Leave full screen state before moving. */\r
-      glutLeaveFullScreen();\r
-    }\r
-\r
-       fgPlatformGlutPositionWindow ( x, y );\r
-}\r
-\r
-/*\r
- * Lowers the current window (by Z order change)\r
- */\r
-void FGAPIENTRY glutPushWindow( void )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPushWindow" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPushWindow" );\r
-\r
-       fgPlatformGlutPushWindow ();\r
-}\r
-\r
-/*\r
- * Raises the current window (by Z order change)\r
- */\r
-void FGAPIENTRY glutPopWindow( void )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPopWindow" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPopWindow" );\r
-\r
-       fgPlatformGlutPopWindow ();\r
-}\r
-\r
-/*\r
- * Resize the current window so that it fits the whole screen\r
- */\r
-void FGAPIENTRY glutFullScreen( void )\r
-{\r
-    SFG_Window *win;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutFullScreen" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutFullScreen" );\r
-\r
-    win = fgStructure.CurrentWindow;\r
-\r
-    if (win->Parent)\r
-    {\r
-        /* Child windows cannot be made fullscreen, consistent with GLUT's behavior\r
-         * Also, what would it mean for a child window to be fullscreen, given that it\r
-         * is confined to its parent?\r
-         */\r
-        fgWarning("glutFullScreen called on a child window, ignoring...");\r
-        return;\r
-    }\r
-    else if (fgStructure.GameModeWindow != NULL && fgStructure.GameModeWindow->ID==win->ID)\r
-    {\r
-        /* Ignore fullscreen call on GameMode window, those are always fullscreen already */\r
-        return;\r
-    }\r
-\r
-       fgPlatformGlutFullScreen ( win );\r
-}\r
-\r
-/*\r
- * If we are fullscreen, resize the current window back to its original size\r
- */\r
-void FGAPIENTRY glutLeaveFullScreen( void )\r
-{\r
-    SFG_Window *win;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutFullScreen" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutFullScreen" );\r
-\r
-    win = fgStructure.CurrentWindow;\r
-\r
-       fgPlatformGlutLeaveFullScreen ( win );\r
-}\r
-\r
-/*\r
- * Toggle the window's full screen state.\r
- */\r
-void FGAPIENTRY glutFullScreenToggle( void )\r
-{\r
-    SFG_Window *win;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutFullScreenToggle" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutFullScreenToggle" );\r
-\r
-    win = fgStructure.CurrentWindow;\r
-\r
-       fgPlatformGlutFullScreenToggle ( win );\r
-}\r
-\r
-/*\r
- * A.Donev: Set and retrieve the window's user data\r
- */\r
-void* FGAPIENTRY glutGetWindowData( void )\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetWindowData" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutGetWindowData" );\r
-    return fgStructure.CurrentWindow->UserData;\r
-}\r
-\r
-void FGAPIENTRY glutSetWindowData(void* data)\r
-{\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetWindowData" );\r
-    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetWindowData" );\r
-    fgStructure.CurrentWindow->UserData = data;\r
-}\r
-\r
-/*** END OF FILE ***/\r
+/*
+ * freeglut_window.c
+ *
+ * Window management methods.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: Fri Dec 3 1999
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#define FREEGLUT_BUILDING_LIB
+#include <GL/freeglut.h>
+#include "freeglut_internal.h"
+
+#if defined(_WIN32_WCE)
+#   include <Aygshell.h>
+#   ifdef FREEGLUT_LIB_PRAGMAS
+#       pragma comment( lib, "Aygshell.lib" )
+#   endif
+#endif /* defined(_WIN32_WCE) */
+
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ *
+ *  fgSetupPixelFormat      -- ignores the display mode settings
+ *  fgOpenWindow()          -- check the Win32 version, -iconic handling!
+ *  fgCloseWindow()         -- check the Win32 version
+ *  glutCreateWindow()      -- Check when default position and size is {-1,-1}
+ *  glutCreateSubWindow()   -- Check when default position and size is {-1,-1}
+ *  glutDestroyWindow()     -- check the Win32 version
+ *  glutSetWindow()         -- check the Win32 version
+ *  glutGetWindow()         -- OK
+ *  glutSetWindowTitle()    -- check the Win32 version
+ *  glutSetIconTitle()      -- check the Win32 version
+ *  glutShowWindow()        -- check the Win32 version
+ *  glutHideWindow()        -- check the Win32 version
+ *  glutIconifyWindow()     -- check the Win32 version
+ *  glutReshapeWindow()     -- check the Win32 version
+ *  glutPositionWindow()    -- check the Win32 version
+ *  glutPushWindow()        -- check the Win32 version
+ *  glutPopWindow()         -- check the Win32 version
+ */
+
+
+extern void fgPlatformSetWindow ( SFG_Window *window );
+extern void fgPlatformOpenWindow( SFG_Window* window, const char* title,
+                                  GLboolean positionUse, int x, int y,
+                                  GLboolean sizeUse, int w, int h,
+                                  GLboolean gameMode, GLboolean isSubWindow );
+extern void fgPlatformCloseWindow( SFG_Window* window );
+extern void fgPlatformGlutShowWindow( void );
+extern void fgPlatformGlutHideWindow( void );
+extern void fgPlatformGlutIconifyWindow( void );
+extern void fgPlatformGlutSetWindowTitle( const char* title );
+extern void fgPlatformGlutSetIconTitle( const char* title );
+extern void fgPlatformGlutPositionWindow( int x, int y );
+extern void fgPlatformGlutPushWindow( void );
+extern void fgPlatformGlutPopWindow( void );
+extern void fgPlatformGlutFullScreen( SFG_Window *win );
+extern void fgPlatformGlutLeaveFullScreen( SFG_Window *win );
+extern void fgPlatformGlutFullScreenToggle( SFG_Window *win );
+
+
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
+
+int fghIsLegacyContextVersionRequested( void )
+{
+  return fgState.MajorVersion < 2 || (fgState.MajorVersion == 2 && fgState.MinorVersion <= 1);
+}
+
+int fghIsLegacyContextRequested( void )
+{
+  return fghIsLegacyContextVersionRequested() &&
+         fgState.ContextFlags == 0 &&
+         fgState.ContextProfile == 0;
+}
+
+int fghNumberOfAuxBuffersRequested( void )
+{
+  if ( fgState.DisplayMode & GLUT_AUX4 ) {
+    return 4;
+  }
+  if ( fgState.DisplayMode & GLUT_AUX3 ) {
+    return 3;
+  }
+  if ( fgState.DisplayMode & GLUT_AUX2 ) {
+    return 2;
+  }
+  if ( fgState.DisplayMode & GLUT_AUX1 ) { /* NOTE: Same as GLUT_AUX! */
+    return fgState.AuxiliaryBufferNumber;
+  }
+  return 0;
+}
+
+int fghMapBit( int mask, int from, int to )
+{
+  return ( mask & from ) ? to : 0;
+
+}
+
+void fghContextCreationError( void )
+{
+    fgError( "Unable to create OpenGL %d.%d context (flags %x, profile %x)",
+             fgState.MajorVersion, fgState.MinorVersion, fgState.ContextFlags,
+             fgState.ContextProfile );
+}
+
+
+/* -- SYSTEM-DEPENDENT PRIVATE FUNCTIONS ------------------------------------ */
+
+/*
+ * Sets the OpenGL context and the fgStructure "Current Window" pointer to
+ * the window structure passed in.
+ */
+void fgSetWindow ( SFG_Window *window )
+{
+       fgPlatformSetWindow ( window );
+
+    fgStructure.CurrentWindow = window;
+}
+
+/*
+ * Opens a window. Requires a SFG_Window object created and attached
+ * to the freeglut structure. OpenGL context is created here.
+ */
+void fgOpenWindow( SFG_Window* window, const char* title,
+                   GLboolean positionUse, int x, int y,
+                   GLboolean sizeUse, int w, int h,
+                   GLboolean gameMode, GLboolean isSubWindow )
+{
+       fgPlatformOpenWindow( window, title,
+                   positionUse, x, y,
+                   sizeUse, w, h,
+                   gameMode, isSubWindow );
+
+    fgSetWindow( window );
+
+    window->Window.DoubleBuffered =
+        ( fgState.DisplayMode & GLUT_DOUBLE ) ? 1 : 0;
+
+    if ( ! window->Window.DoubleBuffered )
+    {
+        glDrawBuffer ( GL_FRONT );
+        glReadBuffer ( GL_FRONT );
+    }
+}
+
+/*
+ * Closes a window, destroying the frame and OpenGL context
+ */
+void fgCloseWindow( SFG_Window* window )
+{
+    /* if we're in gamemode and we're closing the gamemode window,
+     * call glutLeaveGameMode first to make sure the gamemode is
+     * properly closed before closing the window
+     */
+    if (fgStructure.GameModeWindow != NULL && fgStructure.GameModeWindow->ID==window->ID)
+        glutLeaveGameMode();
+
+       fgPlatformCloseWindow ( window );
+}
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Creates a new top-level freeglut window
+ */
+int FGAPIENTRY glutCreateWindow( const char* title )
+{
+    /* XXX GLUT does not exit; it simply calls "glutInit" quietly if the
+     * XXX application has not already done so.  The "freeglut" community
+     * XXX decided not to go this route (freeglut-developer e-mail from
+     * XXX Steve Baker, 12/16/04, 4:22 PM CST, "Re: [Freeglut-developer]
+     * XXX Desired 'freeglut' behaviour when there is no current window"
+     */
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateWindow" );
+
+    return fgCreateWindow( NULL, title, fgState.Position.Use,
+                           fgState.Position.X, fgState.Position.Y,
+                           fgState.Size.Use, fgState.Size.X, fgState.Size.Y,
+                           GL_FALSE, GL_FALSE )->ID;
+}
+
+/*
+ * This function creates a sub window.
+ */
+int FGAPIENTRY glutCreateSubWindow( int parentID, int x, int y, int w, int h )
+{
+    int ret = 0;
+    SFG_Window* window = NULL;
+    SFG_Window* parent = NULL;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutCreateSubWindow" );
+    parent = fgWindowByID( parentID );
+    freeglut_return_val_if_fail( parent != NULL, 0 );
+    if ( x < 0 )
+    {
+        x = parent->State.Width + x ;
+        if ( w >= 0 ) x -= w ;
+    }
+
+    if ( w < 0 ) w = parent->State.Width - x + w ;
+    if ( w < 0 )
+    {
+        x += w ;
+        w = -w ;
+    }
+
+    if ( y < 0 )
+    {
+        y = parent->State.Height + y ;
+        if ( h >= 0 ) y -= h ;
+    }
+
+    if ( h < 0 ) h = parent->State.Height - y + h ;
+    if ( h < 0 )
+    {
+        y += h ;
+        h = -h ;
+    }
+
+    window = fgCreateWindow( parent, "", GL_TRUE, x, y, GL_TRUE, w, h, GL_FALSE, GL_FALSE );
+    ret = window->ID;
+
+    return ret;
+}
+
+/*
+ * Destroys a window and all of its subwindows
+ */
+void FGAPIENTRY glutDestroyWindow( int windowID )
+{
+    SFG_Window* window;
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutDestroyWindow" );
+    window = fgWindowByID( windowID );
+    freeglut_return_if_fail( window != NULL );
+    {
+        fgExecutionState ExecState = fgState.ExecState;
+        fgAddToWindowDestroyList( window );
+        fgState.ExecState = ExecState;
+    }
+}
+
+/*
+ * This function selects the current window
+ */
+void FGAPIENTRY glutSetWindow( int ID )
+{
+    SFG_Window* window = NULL;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetWindow" );
+    if( fgStructure.CurrentWindow != NULL )
+        if( fgStructure.CurrentWindow->ID == ID )
+            return;
+
+    window = fgWindowByID( ID );
+    if( window == NULL )
+    {
+        fgWarning( "glutSetWindow(): window ID %d not found!", ID );
+        return;
+    }
+
+    fgSetWindow( window );
+}
+
+/*
+ * This function returns the ID number of the current window, 0 if none exists
+ */
+int FGAPIENTRY glutGetWindow( void )
+{
+    SFG_Window *win = fgStructure.CurrentWindow;
+    /*
+     * Since GLUT did not throw an error if this function was called without a prior call to
+     * "glutInit", this function shouldn't do so here.  Instead let us return a zero.
+     * See Feature Request "[ 1307049 ] glutInit check".
+     */
+    if ( ! fgState.Initialised )
+        return 0;
+
+    while ( win && win->IsMenu )
+        win = win->Parent;
+    return win ? win->ID : 0;
+}
+
+/*
+ * This function makes the current window visible
+ */
+void FGAPIENTRY glutShowWindow( void )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutShowWindow" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutShowWindow" );
+
+       fgPlatformGlutShowWindow ();
+
+    fgStructure.CurrentWindow->State.Redisplay = GL_TRUE;
+}
+
+/*
+ * This function hides the current window
+ */
+void FGAPIENTRY glutHideWindow( void )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutHideWindow" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutHideWindow" );
+
+       fgPlatformGlutHideWindow ();
+
+    fgStructure.CurrentWindow->State.Redisplay = GL_FALSE;
+}
+
+/*
+ * Iconify the current window (top-level windows only)
+ */
+void FGAPIENTRY glutIconifyWindow( void )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutIconifyWindow" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutIconifyWindow" );
+
+    fgStructure.CurrentWindow->State.Visible   = GL_FALSE;
+
+       fgPlatformGlutIconifyWindow ();
+
+    fgStructure.CurrentWindow->State.Redisplay = GL_FALSE;
+}
+
+/*
+ * Set the current window's title
+ */
+void FGAPIENTRY glutSetWindowTitle( const char* title )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetWindowTitle" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetWindowTitle" );
+    if( ! fgStructure.CurrentWindow->Parent )
+    {
+               fgPlatformGlutSetWindowTitle ( title );
+    }
+}
+
+/*
+ * Set the current window's iconified title
+ */
+void FGAPIENTRY glutSetIconTitle( const char* title )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetIconTitle" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetIconTitle" );
+
+    if( ! fgStructure.CurrentWindow->Parent )
+    {
+               fgPlatformGlutSetIconTitle ( title );
+    }
+}
+
+/*
+ * Change the current window's size
+ */
+void FGAPIENTRY glutReshapeWindow( int width, int height )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutReshapeWindow" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutReshapeWindow" );
+
+    if (glutGet(GLUT_FULL_SCREEN))
+    {
+      /*  Leave full screen state before resizing. */
+      glutLeaveFullScreen();
+    }
+
+    fgStructure.CurrentWindow->State.NeedToResize = GL_TRUE;
+    fgStructure.CurrentWindow->State.Width  = width ;
+    fgStructure.CurrentWindow->State.Height = height;
+}
+
+/*
+ * Change the current window's position
+ */
+void FGAPIENTRY glutPositionWindow( int x, int y )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPositionWindow" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPositionWindow" );
+
+    if (glutGet(GLUT_FULL_SCREEN))
+    {
+      /*  Leave full screen state before moving. */
+      glutLeaveFullScreen();
+    }
+
+       fgPlatformGlutPositionWindow ( x, y );
+}
+
+/*
+ * Lowers the current window (by Z order change)
+ */
+void FGAPIENTRY glutPushWindow( void )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPushWindow" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPushWindow" );
+
+       fgPlatformGlutPushWindow ();
+}
+
+/*
+ * Raises the current window (by Z order change)
+ */
+void FGAPIENTRY glutPopWindow( void )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPopWindow" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPopWindow" );
+
+       fgPlatformGlutPopWindow ();
+}
+
+/*
+ * Resize the current window so that it fits the whole screen
+ */
+void FGAPIENTRY glutFullScreen( void )
+{
+    SFG_Window *win;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutFullScreen" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutFullScreen" );
+
+    win = fgStructure.CurrentWindow;
+
+    if (win->Parent)
+    {
+        /* Child windows cannot be made fullscreen, consistent with GLUT's behavior
+         * Also, what would it mean for a child window to be fullscreen, given that it
+         * is confined to its parent?
+         */
+        fgWarning("glutFullScreen called on a child window, ignoring...");
+        return;
+    }
+    else if (fgStructure.GameModeWindow != NULL && fgStructure.GameModeWindow->ID==win->ID)
+    {
+        /* Ignore fullscreen call on GameMode window, those are always fullscreen already */
+        return;
+    }
+
+       fgPlatformGlutFullScreen ( win );
+}
+
+/*
+ * If we are fullscreen, resize the current window back to its original size
+ */
+void FGAPIENTRY glutLeaveFullScreen( void )
+{
+    SFG_Window *win;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutFullScreen" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutFullScreen" );
+
+    win = fgStructure.CurrentWindow;
+
+       fgPlatformGlutLeaveFullScreen ( win );
+}
+
+/*
+ * Toggle the window's full screen state.
+ */
+void FGAPIENTRY glutFullScreenToggle( void )
+{
+    SFG_Window *win;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutFullScreenToggle" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutFullScreenToggle" );
+
+    win = fgStructure.CurrentWindow;
+
+       fgPlatformGlutFullScreenToggle ( win );
+}
+
+/*
+ * A.Donev: Set and retrieve the window's user data
+ */
+void* FGAPIENTRY glutGetWindowData( void )
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutGetWindowData" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutGetWindowData" );
+    return fgStructure.CurrentWindow->UserData;
+}
+
+void FGAPIENTRY glutSetWindowData(void* data)
+{
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSetWindowData" );
+    FREEGLUT_EXIT_IF_NO_WINDOW ( "glutSetWindowData" );
+    fgStructure.CurrentWindow->UserData = data;
+}
+
+/*** END OF FILE ***/
index 306cfc6..ac52730 100644 (file)
-LIBRARY freeglut\r
-VERSION 2.6\r
-EXPORTS\r
-       glutInit\r
-       glutInitWindowPosition\r
-       glutInitWindowSize\r
-       glutInitDisplayMode\r
-       glutInitDisplayString\r
-       glutMainLoop\r
-       glutMainLoopEvent\r
-       glutLeaveMainLoop\r
-       glutCreateWindow\r
-       glutCreateSubWindow\r
-       glutDestroyWindow\r
-       glutSetWindow\r
-       glutGetWindow\r
-       glutSetWindowData\r
-       glutGetWindowData\r
-       glutSetWindowTitle\r
-       glutSetIconTitle\r
-       glutReshapeWindow\r
-       glutPositionWindow\r
-       glutShowWindow\r
-       glutHideWindow\r
-       glutIconifyWindow\r
-       glutPushWindow\r
-       glutPopWindow\r
-       glutFullScreen\r
-       glutPostWindowRedisplay\r
-       glutPostRedisplay\r
-       glutSwapBuffers\r
-       glutWarpPointer\r
-       glutSetCursor\r
-       glutEstablishOverlay\r
-       glutRemoveOverlay\r
-       glutUseLayer\r
-       glutPostOverlayRedisplay\r
-       glutPostWindowOverlayRedisplay\r
-       glutShowOverlay\r
-       glutHideOverlay\r
-       glutCreateMenu\r
-       glutDestroyMenu\r
-       glutGetMenu\r
-       glutSetMenu\r
-       glutGetMenuData\r
-       glutSetMenuData\r
-       glutAddMenuEntry\r
-       glutAddSubMenu\r
-       glutChangeToMenuEntry\r
-       glutChangeToSubMenu\r
-       glutRemoveMenuItem\r
-       glutAttachMenu\r
-       glutDetachMenu\r
-       glutTimerFunc\r
-       glutIdleFunc\r
-       glutKeyboardFunc\r
-       glutSpecialFunc\r
-       glutReshapeFunc\r
-       glutVisibilityFunc\r
-       glutDisplayFunc\r
-       glutMouseFunc\r
-       glutMouseWheelFunc\r
-       glutMotionFunc\r
-       glutPassiveMotionFunc\r
-       glutEntryFunc\r
-       glutCloseFunc\r
-       glutWMCloseFunc\r
-       glutKeyboardUpFunc\r
-       glutSpecialUpFunc\r
-       glutJoystickFunc\r
-       glutMenuStateFunc\r
-       glutMenuStatusFunc\r
-       glutMenuDestroyFunc\r
-       glutOverlayDisplayFunc\r
-       glutWindowStatusFunc\r
-       glutSpaceballMotionFunc\r
-       glutSpaceballRotateFunc\r
-       glutSpaceballButtonFunc\r
-       glutButtonBoxFunc\r
-       glutDialsFunc\r
-       glutTabletMotionFunc\r
-       glutTabletButtonFunc\r
-       glutSetOption\r
-       glutGet\r
-       glutDeviceGet\r
-       glutGetModifiers\r
-       glutLayerGet\r
-       glutBitmapCharacter\r
-       glutBitmapWidth\r
-       glutStrokeCharacter\r
-       glutStrokeWidth\r
-       glutBitmapLength\r
-       glutStrokeLength\r
-       glutBitmapHeight\r
-       glutStrokeHeight\r
-       glutBitmapString\r
-       glutStrokeString\r
-       glutWireCube\r
-       glutSolidCube\r
-       glutWireSphere\r
-       glutSolidSphere\r
-       glutWireCone\r
-       glutSolidCone\r
-       glutWireTorus\r
-       glutSolidTorus\r
-       glutWireDodecahedron\r
-       glutSolidDodecahedron\r
-       glutWireOctahedron\r
-       glutSolidOctahedron\r
-       glutWireTetrahedron\r
-       glutSolidTetrahedron\r
-       glutWireIcosahedron\r
-       glutSolidIcosahedron\r
-       glutWireRhombicDodecahedron\r
-       glutSolidRhombicDodecahedron\r
-       glutWireSierpinskiSponge\r
-       glutSolidSierpinskiSponge\r
-       glutWireTeapot\r
-       glutSolidTeapot\r
-       glutWireCylinder\r
-       glutSolidCylinder\r
-       glutGameModeString\r
-       glutEnterGameMode\r
-       glutLeaveGameMode\r
-       glutGameModeGet\r
-       glutVideoResizeGet\r
-       glutSetupVideoResizing\r
-       glutStopVideoResizing\r
-       glutVideoResize\r
-       glutVideoPan\r
-       glutSetColor\r
-       glutGetColor\r
-       glutCopyColormap\r
-       glutIgnoreKeyRepeat\r
-       glutSetKeyRepeat\r
-       glutForceJoystickFunc\r
-       glutExtensionSupported\r
-       glutReportErrors\r
-       glutGetProcAddress\r
-       glutExit\r
-       glutFullScreenToggle\r
-       glutLeaveFullScreen\r
-       glutGetModeValues\r
-       glutInitContextFlags\r
-       glutInitContextVersion\r
-       glutInitContextProfile\r
-        glutInitErrorFunc\r
-        glutInitWarningFunc\r
-       __glutInitWithExit\r
-       __glutCreateWindowWithExit\r
-       __glutCreateMenuWithExit\r
-       glutMultiButtonFunc\r
-       glutMultiEntryFunc\r
-       glutMultiMotionFunc\r
-       glutMultiPassiveFunc\r
+LIBRARY freeglut
+VERSION 2.6
+EXPORTS
+       glutInit
+       glutInitWindowPosition
+       glutInitWindowSize
+       glutInitDisplayMode
+       glutInitDisplayString
+       glutMainLoop
+       glutMainLoopEvent
+       glutLeaveMainLoop
+       glutCreateWindow
+       glutCreateSubWindow
+       glutDestroyWindow
+       glutSetWindow
+       glutGetWindow
+       glutSetWindowData
+       glutGetWindowData
+       glutSetWindowTitle
+       glutSetIconTitle
+       glutReshapeWindow
+       glutPositionWindow
+       glutShowWindow
+       glutHideWindow
+       glutIconifyWindow
+       glutPushWindow
+       glutPopWindow
+       glutFullScreen
+       glutPostWindowRedisplay
+       glutPostRedisplay
+       glutSwapBuffers
+       glutWarpPointer
+       glutSetCursor
+       glutEstablishOverlay
+       glutRemoveOverlay
+       glutUseLayer
+       glutPostOverlayRedisplay
+       glutPostWindowOverlayRedisplay
+       glutShowOverlay
+       glutHideOverlay
+       glutCreateMenu
+       glutDestroyMenu
+       glutGetMenu
+       glutSetMenu
+       glutGetMenuData
+       glutSetMenuData
+       glutAddMenuEntry
+       glutAddSubMenu
+       glutChangeToMenuEntry
+       glutChangeToSubMenu
+       glutRemoveMenuItem
+       glutAttachMenu
+       glutDetachMenu
+       glutTimerFunc
+       glutIdleFunc
+       glutKeyboardFunc
+       glutSpecialFunc
+       glutReshapeFunc
+       glutVisibilityFunc
+       glutDisplayFunc
+       glutMouseFunc
+       glutMouseWheelFunc
+       glutMotionFunc
+       glutPassiveMotionFunc
+       glutEntryFunc
+       glutCloseFunc
+       glutWMCloseFunc
+       glutKeyboardUpFunc
+       glutSpecialUpFunc
+       glutJoystickFunc
+       glutMenuStateFunc
+       glutMenuStatusFunc
+       glutMenuDestroyFunc
+       glutOverlayDisplayFunc
+       glutWindowStatusFunc
+       glutSpaceballMotionFunc
+       glutSpaceballRotateFunc
+       glutSpaceballButtonFunc
+       glutButtonBoxFunc
+       glutDialsFunc
+       glutTabletMotionFunc
+       glutTabletButtonFunc
+       glutSetOption
+       glutGet
+       glutDeviceGet
+       glutGetModifiers
+       glutLayerGet
+       glutBitmapCharacter
+       glutBitmapWidth
+       glutStrokeCharacter
+       glutStrokeWidth
+       glutBitmapLength
+       glutStrokeLength
+       glutBitmapHeight
+       glutStrokeHeight
+       glutBitmapString
+       glutStrokeString
+       glutWireCube
+       glutSolidCube
+       glutWireSphere
+       glutSolidSphere
+       glutWireCone
+       glutSolidCone
+       glutWireTorus
+       glutSolidTorus
+       glutWireDodecahedron
+       glutSolidDodecahedron
+       glutWireOctahedron
+       glutSolidOctahedron
+       glutWireTetrahedron
+       glutSolidTetrahedron
+       glutWireIcosahedron
+       glutSolidIcosahedron
+       glutWireRhombicDodecahedron
+       glutSolidRhombicDodecahedron
+       glutWireSierpinskiSponge
+       glutSolidSierpinskiSponge
+       glutWireTeapot
+       glutSolidTeapot
+       glutWireCylinder
+       glutSolidCylinder
+       glutGameModeString
+       glutEnterGameMode
+       glutLeaveGameMode
+       glutGameModeGet
+       glutVideoResizeGet
+       glutSetupVideoResizing
+       glutStopVideoResizing
+       glutVideoResize
+       glutVideoPan
+       glutSetColor
+       glutGetColor
+       glutCopyColormap
+       glutIgnoreKeyRepeat
+       glutSetKeyRepeat
+       glutForceJoystickFunc
+       glutExtensionSupported
+       glutReportErrors
+       glutGetProcAddress
+       glutExit
+       glutFullScreenToggle
+       glutLeaveFullScreen
+       glutGetModeValues
+       glutInitContextFlags
+       glutInitContextVersion
+       glutInitContextProfile
+        glutInitErrorFunc
+        glutInitWarningFunc
+       __glutInitWithExit
+       __glutCreateWindowWithExit
+       __glutCreateMenuWithExit
+       glutMultiButtonFunc
+       glutMultiEntryFunc
+       glutMultiMotionFunc
+       glutMultiPassiveFunc
index 641a722..e2c0523 100644 (file)
-/*\r
- * freeglut_cursor_mswin.c\r
- *\r
- * The Windows-specific mouse cursor related stuff.\r
- *\r
- * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
- * Written by John F. Fay, <fayjf@sourceforge.net>\r
- * Creation date: Thu Jan 19, 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-\r
-\r
-void fgPlatformSetCursor ( SFG_Window *window, int cursorID )\r
-{\r
-    /*\r
-     * Joe Krahn is re-writing the following code.\r
-     */\r
-    /* Set the cursor AND change it for this window class. */\r
-#if !defined(__MINGW64__) && _MSC_VER <= 1200\r
-#       define MAP_CURSOR(a,b)                                   \\r
-        case a:                                                  \\r
-            SetCursor( LoadCursor( NULL, b ) );                  \\r
-            SetClassLong( window->Window.Handle,                 \\r
-                          GCL_HCURSOR,                           \\r
-                          ( LONG )LoadCursor( NULL, b ) );       \\r
-        break;\r
-    /* Nuke the cursor AND change it for this window class. */\r
-#       define ZAP_CURSOR(a,b)                                   \\r
-        case a:                                                  \\r
-            SetCursor( NULL );                                   \\r
-            SetClassLong( window->Window.Handle,                 \\r
-                          GCL_HCURSOR, ( LONG )NULL );           \\r
-        break;\r
-#else\r
-#       define MAP_CURSOR(a,b)                                   \\r
-        case a:                                                  \\r
-            SetCursor( LoadCursor( NULL, b ) );                  \\r
-            SetClassLongPtr( window->Window.Handle,              \\r
-                          GCLP_HCURSOR,                          \\r
-                          ( LONG )( LONG_PTR )LoadCursor( NULL, b ) );       \\r
-        break;\r
-    /* Nuke the cursor AND change it for this window class. */\r
-#       define ZAP_CURSOR(a,b)                                   \\r
-        case a:                                                  \\r
-            SetCursor( NULL );                                   \\r
-            SetClassLongPtr( window->Window.Handle,              \\r
-                          GCLP_HCURSOR, ( LONG )( LONG_PTR )NULL );          \\r
-        break;\r
-#endif\r
-\r
-    switch( cursorID )\r
-    {\r
-        MAP_CURSOR( GLUT_CURSOR_RIGHT_ARROW,         IDC_ARROW     );\r
-        MAP_CURSOR( GLUT_CURSOR_LEFT_ARROW,          IDC_ARROW     );\r
-        MAP_CURSOR( GLUT_CURSOR_INFO,                IDC_HELP      );\r
-        MAP_CURSOR( GLUT_CURSOR_DESTROY,             IDC_CROSS     );\r
-        MAP_CURSOR( GLUT_CURSOR_HELP,                IDC_HELP      );\r
-        MAP_CURSOR( GLUT_CURSOR_CYCLE,               IDC_SIZEALL   );\r
-        MAP_CURSOR( GLUT_CURSOR_SPRAY,               IDC_CROSS     );\r
-        MAP_CURSOR( GLUT_CURSOR_WAIT,                IDC_WAIT      );\r
-        MAP_CURSOR( GLUT_CURSOR_TEXT,                IDC_IBEAM     );\r
-        MAP_CURSOR( GLUT_CURSOR_CROSSHAIR,           IDC_CROSS     );\r
-        MAP_CURSOR( GLUT_CURSOR_UP_DOWN,             IDC_SIZENS    );\r
-        MAP_CURSOR( GLUT_CURSOR_LEFT_RIGHT,          IDC_SIZEWE    );\r
-        MAP_CURSOR( GLUT_CURSOR_TOP_SIDE,            IDC_ARROW     ); /* XXX ToDo */\r
-        MAP_CURSOR( GLUT_CURSOR_BOTTOM_SIDE,         IDC_ARROW     ); /* XXX ToDo */\r
-        MAP_CURSOR( GLUT_CURSOR_LEFT_SIDE,           IDC_ARROW     ); /* XXX ToDo */\r
-        MAP_CURSOR( GLUT_CURSOR_RIGHT_SIDE,          IDC_ARROW     ); /* XXX ToDo */\r
-        MAP_CURSOR( GLUT_CURSOR_TOP_LEFT_CORNER,     IDC_SIZENWSE  );\r
-        MAP_CURSOR( GLUT_CURSOR_TOP_RIGHT_CORNER,    IDC_SIZENESW  );\r
-        MAP_CURSOR( GLUT_CURSOR_BOTTOM_RIGHT_CORNER, IDC_SIZENWSE  );\r
-        MAP_CURSOR( GLUT_CURSOR_BOTTOM_LEFT_CORNER,  IDC_SIZENESW  );\r
-        MAP_CURSOR( GLUT_CURSOR_INHERIT,             IDC_ARROW     ); /* XXX ToDo */\r
-        ZAP_CURSOR( GLUT_CURSOR_NONE,                NULL          );\r
-        MAP_CURSOR( GLUT_CURSOR_FULL_CROSSHAIR,      IDC_CROSS     ); /* XXX ToDo */\r
-\r
-    default:\r
-        fgError( "Unknown cursor type: %d", cursorID );\r
-        break;\r
-    }\r
-}\r
-\r
-\r
-void fgPlatformWarpPointer ( int x, int y )\r
-{\r
-    POINT coords;\r
-    coords.x = x;\r
-    coords.y = y;\r
-\r
-    /* ClientToScreen() translates {coords} for us. */\r
-    ClientToScreen( fgStructure.CurrentWindow->Window.Handle, &coords );\r
-    SetCursorPos( coords.x, coords.y );\r
-}\r
-\r
-\r
+/*
+ * freeglut_cursor_mswin.c
+ *
+ * The Windows-specific mouse cursor related stuff.
+ *
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
+ * Written by John F. Fay, <fayjf@sourceforge.net>
+ * Creation date: Thu Jan 19, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+
+
+void fgPlatformSetCursor ( SFG_Window *window, int cursorID )
+{
+    /*
+     * Joe Krahn is re-writing the following code.
+     */
+    /* Set the cursor AND change it for this window class. */
+#if !defined(__MINGW64__) && _MSC_VER <= 1200
+#       define MAP_CURSOR(a,b)                                   \
+        case a:                                                  \
+            SetCursor( LoadCursor( NULL, b ) );                  \
+            SetClassLong( window->Window.Handle,                 \
+                          GCL_HCURSOR,                           \
+                          ( LONG )LoadCursor( NULL, b ) );       \
+        break;
+    /* Nuke the cursor AND change it for this window class. */
+#       define ZAP_CURSOR(a,b)                                   \
+        case a:                                                  \
+            SetCursor( NULL );                                   \
+            SetClassLong( window->Window.Handle,                 \
+                          GCL_HCURSOR, ( LONG )NULL );           \
+        break;
+#else
+#       define MAP_CURSOR(a,b)                                   \
+        case a:                                                  \
+            SetCursor( LoadCursor( NULL, b ) );                  \
+            SetClassLongPtr( window->Window.Handle,              \
+                          GCLP_HCURSOR,                          \
+                          ( LONG )( LONG_PTR )LoadCursor( NULL, b ) );       \
+        break;
+    /* Nuke the cursor AND change it for this window class. */
+#       define ZAP_CURSOR(a,b)                                   \
+        case a:                                                  \
+            SetCursor( NULL );                                   \
+            SetClassLongPtr( window->Window.Handle,              \
+                          GCLP_HCURSOR, ( LONG )( LONG_PTR )NULL );          \
+        break;
+#endif
+
+    switch( cursorID )
+    {
+        MAP_CURSOR( GLUT_CURSOR_RIGHT_ARROW,         IDC_ARROW     );
+        MAP_CURSOR( GLUT_CURSOR_LEFT_ARROW,          IDC_ARROW     );
+        MAP_CURSOR( GLUT_CURSOR_INFO,                IDC_HELP      );
+        MAP_CURSOR( GLUT_CURSOR_DESTROY,             IDC_CROSS     );
+        MAP_CURSOR( GLUT_CURSOR_HELP,                IDC_HELP      );
+        MAP_CURSOR( GLUT_CURSOR_CYCLE,               IDC_SIZEALL   );
+        MAP_CURSOR( GLUT_CURSOR_SPRAY,               IDC_CROSS     );
+        MAP_CURSOR( GLUT_CURSOR_WAIT,                IDC_WAIT      );
+        MAP_CURSOR( GLUT_CURSOR_TEXT,                IDC_IBEAM     );
+        MAP_CURSOR( GLUT_CURSOR_CROSSHAIR,           IDC_CROSS     );
+        MAP_CURSOR( GLUT_CURSOR_UP_DOWN,             IDC_SIZENS    );
+        MAP_CURSOR( GLUT_CURSOR_LEFT_RIGHT,          IDC_SIZEWE    );
+        MAP_CURSOR( GLUT_CURSOR_TOP_SIDE,            IDC_ARROW     ); /* XXX ToDo */
+        MAP_CURSOR( GLUT_CURSOR_BOTTOM_SIDE,         IDC_ARROW     ); /* XXX ToDo */
+        MAP_CURSOR( GLUT_CURSOR_LEFT_SIDE,           IDC_ARROW     ); /* XXX ToDo */
+        MAP_CURSOR( GLUT_CURSOR_RIGHT_SIDE,          IDC_ARROW     ); /* XXX ToDo */
+        MAP_CURSOR( GLUT_CURSOR_TOP_LEFT_CORNER,     IDC_SIZENWSE  );
+        MAP_CURSOR( GLUT_CURSOR_TOP_RIGHT_CORNER,    IDC_SIZENESW  );
+        MAP_CURSOR( GLUT_CURSOR_BOTTOM_RIGHT_CORNER, IDC_SIZENWSE  );
+        MAP_CURSOR( GLUT_CURSOR_BOTTOM_LEFT_CORNER,  IDC_SIZENESW  );
+        MAP_CURSOR( GLUT_CURSOR_INHERIT,             IDC_ARROW     ); /* XXX ToDo */
+        ZAP_CURSOR( GLUT_CURSOR_NONE,                NULL          );
+        MAP_CURSOR( GLUT_CURSOR_FULL_CROSSHAIR,      IDC_CROSS     ); /* XXX ToDo */
+
+    default:
+        fgError( "Unknown cursor type: %d", cursorID );
+        break;
+    }
+}
+
+
+void fgPlatformWarpPointer ( int x, int y )
+{
+    POINT coords;
+    coords.x = x;
+    coords.y = y;
+
+    /* ClientToScreen() translates {coords} for us. */
+    ClientToScreen( fgStructure.CurrentWindow->Window.Handle, &coords );
+    SetCursorPos( coords.x, coords.y );
+}
+
+
index d93675c..5becaa4 100644 (file)
@@ -1,37 +1,37 @@
-/*\r
- * freeglut_display_mswin.c\r
- *\r
- * The Windows-specific mouse cursor related stuff.\r
- *\r
- * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
- * Written by John F. Fay, <fayjf@sourceforge.net>\r
- * Creation date: Sat Jan 28, 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-\r
-\r
-\r
-void fgPlatformGlutSwapBuffers( SFG_PlatformDisplay *pDisplayPtr, SFG_Window* CurrentWindow )\r
-{\r
-    SwapBuffers( CurrentWindow->Window.pContext.Device );\r
-}\r
+/*
+ * freeglut_display_mswin.c
+ *
+ * The Windows-specific mouse cursor related stuff.
+ *
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
+ * Written by John F. Fay, <fayjf@sourceforge.net>
+ * Creation date: Sat Jan 28, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+
+
+
+void fgPlatformGlutSwapBuffers( SFG_PlatformDisplay *pDisplayPtr, SFG_Window* CurrentWindow )
+{
+    SwapBuffers( CurrentWindow->Window.pContext.Device );
+}
index 6b09f9d..3b4fc10 100644 (file)
@@ -1,56 +1,56 @@
-/*\r
- * freeglut_ext_mswin.c\r
- *\r
- * The Windows-specific mouse cursor related stuff.\r
- *\r
- * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
- * Written by John F. Fay, <fayjf@sourceforge.net>\r
- * Creation date: Thu Jan 19, 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-GLUTproc fgPlatformGetGLUTProcAddress( const char* procName )\r
-{\r
-#if !defined(_WIN32_WCE)\r
-    /* optimization: quick initial check */\r
-    if( strncmp( procName, "glut", 4 ) != 0 )\r
-        return NULL;\r
-\r
-#define CHECK_NAME(x) if( strcmp( procName, #x ) == 0) return (GLUTproc)x;\r
-    CHECK_NAME(glutJoystickFunc);\r
-    CHECK_NAME(glutForceJoystickFunc);\r
-    CHECK_NAME(glutGameModeString);\r
-    CHECK_NAME(glutEnterGameMode);\r
-    CHECK_NAME(glutLeaveGameMode);\r
-    CHECK_NAME(glutGameModeGet);\r
-#undef CHECK_NAME\r
-#endif /* !defined(_WIN32_WCE) */\r
-\r
-    return NULL;\r
-}\r
-\r
-\r
-\r
-SFG_Proc fgPlatformGetProcAddress( const char *procName )\r
-{\r
-    return (SFG_Proc)wglGetProcAddress( ( LPCSTR )procName );\r
-}\r
+/*
+ * freeglut_ext_mswin.c
+ *
+ * The Windows-specific mouse cursor related stuff.
+ *
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
+ * Written by John F. Fay, <fayjf@sourceforge.net>
+ * Creation date: Thu Jan 19, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+GLUTproc fgPlatformGetGLUTProcAddress( const char* procName )
+{
+#if !defined(_WIN32_WCE)
+    /* optimization: quick initial check */
+    if( strncmp( procName, "glut", 4 ) != 0 )
+        return NULL;
+
+#define CHECK_NAME(x) if( strcmp( procName, #x ) == 0) return (GLUTproc)x;
+    CHECK_NAME(glutJoystickFunc);
+    CHECK_NAME(glutForceJoystickFunc);
+    CHECK_NAME(glutGameModeString);
+    CHECK_NAME(glutEnterGameMode);
+    CHECK_NAME(glutLeaveGameMode);
+    CHECK_NAME(glutGameModeGet);
+#undef CHECK_NAME
+#endif /* !defined(_WIN32_WCE) */
+
+    return NULL;
+}
+
+
+
+SFG_Proc fgPlatformGetProcAddress( const char *procName )
+{
+    return (SFG_Proc)wglGetProcAddress( ( LPCSTR )procName );
+}
index 510c0f6..b1a75d4 100644 (file)
-/*\r
- * freeglut_gamemode_mswin.c\r
- *\r
- * The Windows-specific mouse cursor related stuff.\r
- *\r
- * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
- * Written by John F. Fay, <fayjf@sourceforge.net>\r
- * Creation date: Thu Jan 19, 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-/*\r
- * Remembers the current visual settings, so that\r
- * we can change them and restore later...\r
- */\r
-void fgPlatformRememberState( void )\r
-{\r
-/*    DEVMODE devMode; */\r
-\r
-    /* Grab the current desktop settings... */\r
-\r
-/* hack to get around my stupid cross-gcc headers */\r
-#define FREEGLUT_ENUM_CURRENT_SETTINGS -1\r
-\r
-    EnumDisplaySettings( fgDisplay.pDisplay.DisplayName, FREEGLUT_ENUM_CURRENT_SETTINGS,\r
-                         &fgDisplay.pDisplay.DisplayMode );\r
-\r
-    /* Make sure we will be restoring all settings needed */\r
-    fgDisplay.pDisplay.DisplayMode.dmFields |=\r
-        DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;\r
-\r
-}\r
-\r
-/*\r
- * Restores the previously remembered visual settings\r
- */\r
-void fgPlatformRestoreState( void )\r
-{\r
-    /* Restore the previously remembered desktop display settings */\r
-    ChangeDisplaySettingsEx( fgDisplay.pDisplay.DisplayName,&fgDisplay.pDisplay.DisplayMode, 0,0,0 );\r
-\r
-}\r
-\r
-\r
-\r
-\r
-/*\r
- * Changes the current display mode to match user's settings\r
- */\r
-GLboolean fgPlatformChangeDisplayMode( GLboolean haveToTest )\r
-{\r
-    GLboolean success = GL_FALSE;\r
-    DEVMODE  devMode;\r
-    char *fggmstr = NULL;\r
-    char displayMode[300];\r
-\r
-    success = GL_FALSE;\r
-\r
-    EnumDisplaySettings( fgDisplay.pDisplay.DisplayName, -1, &devMode ); \r
-    devMode.dmFields = 0;\r
-\r
-    if (fgState.GameModeSize.X!=-1)\r
-    {\r
-        devMode.dmPelsWidth  = fgState.GameModeSize.X;\r
-        devMode.dmFields |= DM_PELSWIDTH;\r
-    }\r
-    if (fgState.GameModeSize.Y!=-1)\r
-    {\r
-        devMode.dmPelsHeight  = fgState.GameModeSize.Y;\r
-        devMode.dmFields |= DM_PELSHEIGHT;\r
-    }\r
-    if (fgState.GameModeDepth!=-1)\r
-    {\r
-        devMode.dmBitsPerPel  = fgState.GameModeDepth;\r
-        devMode.dmFields |= DM_BITSPERPEL;\r
-    }\r
-    if (fgState.GameModeRefresh!=-1)\r
-    {\r
-        devMode.dmDisplayFrequency  = fgState.GameModeRefresh;\r
-        devMode.dmFields |= DM_DISPLAYFREQUENCY;\r
-    }\r
-\r
-    switch ( ChangeDisplaySettingsEx(fgDisplay.pDisplay.DisplayName, &devMode, NULL, haveToTest ? CDS_TEST : CDS_FULLSCREEN , NULL) )\r
-    {\r
-    case DISP_CHANGE_SUCCESSFUL:\r
-        success = GL_TRUE;\r
-\r
-        if (!haveToTest)\r
-        {\r
-            /* update vars in case if windows switched to proper mode */\r
-            EnumDisplaySettings( fgDisplay.pDisplay.DisplayName, FREEGLUT_ENUM_CURRENT_SETTINGS, &devMode );\r
-            fgState.GameModeSize.X  = devMode.dmPelsWidth;        \r
-            fgState.GameModeSize.Y  = devMode.dmPelsHeight;\r
-            fgState.GameModeDepth   = devMode.dmBitsPerPel;\r
-            fgState.GameModeRefresh = devMode.dmDisplayFrequency;\r
-        }\r
-               break;\r
-    case DISP_CHANGE_RESTART:\r
-        fggmstr = "The computer must be restarted for the graphics mode to work.";\r
-        break;\r
-    case DISP_CHANGE_BADFLAGS:\r
-        fggmstr = "An invalid set of flags was passed in.";\r
-        break;\r
-    case DISP_CHANGE_BADPARAM:\r
-        fggmstr = "An invalid parameter was passed in. This can include an invalid flag or combination of flags.";\r
-        break;\r
-    case DISP_CHANGE_FAILED:\r
-        fggmstr = "The display driver failed the specified graphics mode.";\r
-        break;\r
-    case DISP_CHANGE_BADMODE:\r
-        fggmstr = "The graphics mode is not supported.";\r
-        break;\r
-    default:\r
-        fggmstr = "Unknown error in graphics mode???"; /* dunno if it is possible,MSDN does not mention any other error */\r
-        break;\r
-    }\r
-\r
-    if ( !success )\r
-    {\r
-        /* I'd rather get info whats going on in my program than wonder about */\r
-        /* magic happenings behind my back, its lib for devels at last ;) */\r
-        \r
-        /* append display mode to error to make things more informative */\r
-        sprintf(displayMode,"%s Problem with requested mode: %ix%i:%i@%i", fggmstr, devMode.dmPelsWidth, devMode.dmPelsHeight, devMode.dmBitsPerPel, devMode.dmDisplayFrequency);\r
-        fgWarning(displayMode);\r
-    }\r
-\r
-    return success;\r
-}\r
-\r
-void fgPlatformEnterGameMode( void ) \r
-{\r
-}\r
-\r
-void fgPlatformLeaveGameMode( void ) \r
-{\r
-}\r
-\r
+/*
+ * freeglut_gamemode_mswin.c
+ *
+ * The Windows-specific mouse cursor related stuff.
+ *
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
+ * Written by John F. Fay, <fayjf@sourceforge.net>
+ * Creation date: Thu Jan 19, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+/*
+ * Remembers the current visual settings, so that
+ * we can change them and restore later...
+ */
+void fgPlatformRememberState( void )
+{
+/*    DEVMODE devMode; */
+
+    /* Grab the current desktop settings... */
+
+/* hack to get around my stupid cross-gcc headers */
+#define FREEGLUT_ENUM_CURRENT_SETTINGS -1
+
+    EnumDisplaySettings( fgDisplay.pDisplay.DisplayName, FREEGLUT_ENUM_CURRENT_SETTINGS,
+                         &fgDisplay.pDisplay.DisplayMode );
+
+    /* Make sure we will be restoring all settings needed */
+    fgDisplay.pDisplay.DisplayMode.dmFields |=
+        DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
+
+}
+
+/*
+ * Restores the previously remembered visual settings
+ */
+void fgPlatformRestoreState( void )
+{
+    /* Restore the previously remembered desktop display settings */
+    ChangeDisplaySettingsEx( fgDisplay.pDisplay.DisplayName,&fgDisplay.pDisplay.DisplayMode, 0,0,0 );
+
+}
+
+
+
+
+/*
+ * Changes the current display mode to match user's settings
+ */
+GLboolean fgPlatformChangeDisplayMode( GLboolean haveToTest )
+{
+    GLboolean success = GL_FALSE;
+    DEVMODE  devMode;
+    char *fggmstr = NULL;
+    char displayMode[300];
+
+    success = GL_FALSE;
+
+    EnumDisplaySettings( fgDisplay.pDisplay.DisplayName, -1, &devMode ); 
+    devMode.dmFields = 0;
+
+    if (fgState.GameModeSize.X!=-1)
+    {
+        devMode.dmPelsWidth  = fgState.GameModeSize.X;
+        devMode.dmFields |= DM_PELSWIDTH;
+    }
+    if (fgState.GameModeSize.Y!=-1)
+    {
+        devMode.dmPelsHeight  = fgState.GameModeSize.Y;
+        devMode.dmFields |= DM_PELSHEIGHT;
+    }
+    if (fgState.GameModeDepth!=-1)
+    {
+        devMode.dmBitsPerPel  = fgState.GameModeDepth;
+        devMode.dmFields |= DM_BITSPERPEL;
+    }
+    if (fgState.GameModeRefresh!=-1)
+    {
+        devMode.dmDisplayFrequency  = fgState.GameModeRefresh;
+        devMode.dmFields |= DM_DISPLAYFREQUENCY;
+    }
+
+    switch ( ChangeDisplaySettingsEx(fgDisplay.pDisplay.DisplayName, &devMode, NULL, haveToTest ? CDS_TEST : CDS_FULLSCREEN , NULL) )
+    {
+    case DISP_CHANGE_SUCCESSFUL:
+        success = GL_TRUE;
+
+        if (!haveToTest)
+        {
+            /* update vars in case if windows switched to proper mode */
+            EnumDisplaySettings( fgDisplay.pDisplay.DisplayName, FREEGLUT_ENUM_CURRENT_SETTINGS, &devMode );
+            fgState.GameModeSize.X  = devMode.dmPelsWidth;        
+            fgState.GameModeSize.Y  = devMode.dmPelsHeight;
+            fgState.GameModeDepth   = devMode.dmBitsPerPel;
+            fgState.GameModeRefresh = devMode.dmDisplayFrequency;
+        }
+               break;
+    case DISP_CHANGE_RESTART:
+        fggmstr = "The computer must be restarted for the graphics mode to work.";
+        break;
+    case DISP_CHANGE_BADFLAGS:
+        fggmstr = "An invalid set of flags was passed in.";
+        break;
+    case DISP_CHANGE_BADPARAM:
+        fggmstr = "An invalid parameter was passed in. This can include an invalid flag or combination of flags.";
+        break;
+    case DISP_CHANGE_FAILED:
+        fggmstr = "The display driver failed the specified graphics mode.";
+        break;
+    case DISP_CHANGE_BADMODE:
+        fggmstr = "The graphics mode is not supported.";
+        break;
+    default:
+        fggmstr = "Unknown error in graphics mode???"; /* dunno if it is possible,MSDN does not mention any other error */
+        break;
+    }
+
+    if ( !success )
+    {
+        /* I'd rather get info whats going on in my program than wonder about */
+        /* magic happenings behind my back, its lib for devels at last ;) */
+        
+        /* append display mode to error to make things more informative */
+        sprintf(displayMode,"%s Problem with requested mode: %ix%i:%i@%i", fggmstr, devMode.dmPelsWidth, devMode.dmPelsHeight, devMode.dmBitsPerPel, devMode.dmDisplayFrequency);
+        fgWarning(displayMode);
+    }
+
+    return success;
+}
+
+void fgPlatformEnterGameMode( void ) 
+{
+}
+
+void fgPlatformLeaveGameMode( void ) 
+{
+}
+
index c7457de..6f5d614 100644 (file)
-/*\r
- * freeglut_init_mswin.c\r
- *\r
- * The Windows-specific mouse cursor related stuff.\r
- *\r
- * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
- * Written by John F. Fay, <fayjf@sourceforge.net>\r
- * Creation date: Thu Jan 19, 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#define FREEGLUT_BUILDING_LIB\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-\r
-\r
-extern LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg,\r
-                               WPARAM wParam, LPARAM lParam );\r
-\r
-\r
-/*\r
- * A call to this function should initialize all the display stuff...\r
- */\r
-void fgPlatformInitialize( const char* displayName )\r
-{\r
-    WNDCLASS wc;\r
-    ATOM atom;\r
-\r
-    /* What we need to do is to initialize the fgDisplay global structure here. */\r
-    fgDisplay.pDisplay.Instance = GetModuleHandle( NULL );\r
-    fgDisplay.pDisplay.DisplayName= displayName ? strdup(displayName) : 0 ;\r
-    atom = GetClassInfo( fgDisplay.pDisplay.Instance, _T("FREEGLUT"), &wc );\r
-\r
-    if( atom == 0 )\r
-    {\r
-        ZeroMemory( &wc, sizeof(WNDCLASS) );\r
-\r
-        /*\r
-         * Each of the windows should have its own device context, and we\r
-         * want redraw events during Vertical and Horizontal Resizes by\r
-         * the user.\r
-         *\r
-         * XXX Old code had "| CS_DBCLCKS" commented out.  Plans for the\r
-         * XXX future?  Dead-end idea?\r
-         */\r
-        wc.lpfnWndProc    = fgPlatformWindowProc;\r
-        wc.cbClsExtra     = 0;\r
-        wc.cbWndExtra     = 0;\r
-        wc.hInstance      = fgDisplay.pDisplay.Instance;\r
-        wc.hIcon          = LoadIcon( fgDisplay.pDisplay.Instance, _T("GLUT_ICON") );\r
-\r
-#if defined(_WIN32_WCE)\r
-        wc.style          = CS_HREDRAW | CS_VREDRAW;\r
-#else\r
-        wc.style          = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;\r
-        if (!wc.hIcon)\r
-          wc.hIcon        = LoadIcon( NULL, IDI_WINLOGO );\r
-#endif\r
-\r
-        wc.hCursor        = LoadCursor( NULL, IDC_ARROW );\r
-        wc.hbrBackground  = NULL;\r
-        wc.lpszMenuName   = NULL;\r
-        wc.lpszClassName  = _T("FREEGLUT");\r
-\r
-        /* Register the window class */\r
-        atom = RegisterClass( &wc );\r
-        FREEGLUT_INTERNAL_ERROR_EXIT ( atom, "Window Class Not Registered", "fgPlatformInitialize" );\r
-    }\r
-\r
-    /* The screen dimensions can be obtained via GetSystemMetrics() calls */\r
-    fgDisplay.ScreenWidth  = GetSystemMetrics( SM_CXSCREEN );\r
-    fgDisplay.ScreenHeight = GetSystemMetrics( SM_CYSCREEN );\r
-\r
-    {\r
-        HWND desktop = GetDesktopWindow( );\r
-        HDC  context = GetDC( desktop );\r
-\r
-        fgDisplay.ScreenWidthMM  = GetDeviceCaps( context, HORZSIZE );\r
-        fgDisplay.ScreenHeightMM = GetDeviceCaps( context, VERTSIZE );\r
-\r
-        ReleaseDC( desktop, context );\r
-    }\r
-    /* If we have a DisplayName try to use it for metrics */\r
-    if( fgDisplay.pDisplay.DisplayName )\r
-    {\r
-        HDC context = CreateDC(fgDisplay.pDisplay.DisplayName,0,0,0);\r
-        if( context )\r
-        {\r
-           fgDisplay.ScreenWidth  = GetDeviceCaps( context, HORZRES );\r
-           fgDisplay.ScreenHeight = GetDeviceCaps( context, VERTRES );\r
-           fgDisplay.ScreenWidthMM  = GetDeviceCaps( context, HORZSIZE );\r
-           fgDisplay.ScreenHeightMM = GetDeviceCaps( context, VERTSIZE );\r
-           DeleteDC(context);\r
-        }\r
-        else\r
-           fgWarning("fgPlatformInitialize: "\r
-                     "CreateDC failed, Screen size info may be incorrect\n"\r
-          "This is quite likely caused by a bad '-display' parameter");\r
-      \r
-    }\r
-    /* Set the timer granularity to 1 ms */\r
-    timeBeginPeriod ( 1 );\r
-\r
-\r
-    fgState.Initialised = GL_TRUE;\r
-\r
-    /* Avoid registering atexit callback on Win32 as it results in an access\r
-     * violation due to calling into a module which has been unloaded.\r
-     * Any cleanup isn't needed on Windows anyway, the OS takes care of it.c\r
-     * see: http://blogs.msdn.com/b/oldnewthing/archive/2012/01/05/10253268.aspx\r
-     */\r
-/*    atexit(fgDeinitialize); */\r
-\r
-    /* InputDevice uses GlutTimerFunc(), so fgState.Initialised must be TRUE */\r
-    fgInitialiseInputDevices();\r
-}\r
-\r
-\r
-\r
-/* Platform-Specific Deinitialization Functions: */\r
-extern void fghCloseInputDevices ( void );\r
-\r
-void fgPlatformDeinitialiseInputDevices ( void )\r
-{\r
-#if !defined(_WIN32_WCE)\r
-       fghCloseInputDevices ();\r
-#endif /* !defined(_WIN32_WCE) */\r
-    fgState.JoysticksInitialised = GL_FALSE;\r
-    fgState.InputDevsInitialised = GL_FALSE;\r
-}\r
-\r
-void fgPlatformCloseDisplay ( void )\r
-{\r
-    if( fgDisplay.pDisplay.DisplayName )\r
-    {\r
-        free( fgDisplay.pDisplay.DisplayName );\r
-        fgDisplay.pDisplay.DisplayName = NULL;\r
-    }\r
-\r
-    /* Reset the timer granularity */\r
-    timeEndPeriod ( 1 );\r
-}\r
-\r
-void fgPlatformDestroyContext ( SFG_PlatformDisplay pDisplay, SFG_WindowContextType MContext )\r
-{\r
-       /* Do nothing -- this is required for X11 */\r
-}\r
-\r
-/*\r
- * Everything down to the end of the next two functions is copied from the X sources.\r
- */\r
-\r
-/*\r
-\r
-Copyright 1985, 1986, 1987,1998  The Open Group\r
-\r
-Permission to use, copy, modify, distribute, and sell this software and its\r
-documentation for any purpose is hereby granted without fee, provided that\r
-the above copyright notice appear in all copies and that both that\r
-copyright notice and this permission notice appear in supporting\r
-documentation.\r
-\r
-The above copyright notice and this permission notice shall be included\r
-in all copies or substantial portions of the Software.\r
-\r
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r
-IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR\r
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\r
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\r
-OTHER DEALINGS IN THE SOFTWARE.\r
-\r
-Except as contained in this notice, the name of The Open Group shall\r
-not be used in advertising or otherwise to promote the sale, use or\r
-other dealings in this Software without prior written authorization\r
-from The Open Group.\r
-\r
-*/\r
-\r
-#define NoValue         0x0000\r
-#define XValue          0x0001\r
-#define YValue          0x0002\r
-#define WidthValue      0x0004\r
-#define HeightValue     0x0008\r
-#define AllValues       0x000F\r
-#define XNegative       0x0010\r
-#define YNegative       0x0020\r
-\r
-/*\r
- *    XParseGeometry parses strings of the form\r
- *   "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where\r
- *   width, height, xoffset, and yoffset are unsigned integers.\r
- *   Example:  "=80x24+300-49"\r
- *   The equal sign is optional.\r
- *   It returns a bitmask that indicates which of the four values\r
- *   were actually found in the string.  For each value found,\r
- *   the corresponding argument is updated;  for each value\r
- *   not found, the corresponding argument is left unchanged.\r
- */\r
-\r
-static int\r
-ReadInteger(char *string, char **NextString)\r
-{\r
-    register int Result = 0;\r
-    int Sign = 1;\r
-\r
-    if (*string == '+')\r
-        string++;\r
-    else if (*string == '-')\r
-    {\r
-        string++;\r
-        Sign = -1;\r
-    }\r
-    for (; (*string >= '0') && (*string <= '9'); string++)\r
-    {\r
-        Result = (Result * 10) + (*string - '0');\r
-    }\r
-    *NextString = string;\r
-    if (Sign >= 0)\r
-        return Result;\r
-    else\r
-        return -Result;\r
-}\r
-\r
-int XParseGeometry (\r
-    const char *string,\r
-    int *x,\r
-    int *y,\r
-    unsigned int *width,    /* RETURN */\r
-    unsigned int *height)    /* RETURN */\r
-{\r
-    int mask = NoValue;\r
-    register char *strind;\r
-    unsigned int tempWidth = 0, tempHeight = 0;\r
-    int tempX = 0, tempY = 0;\r
-    char *nextCharacter;\r
-\r
-    if ( (string == NULL) || (*string == '\0'))\r
-      return mask;\r
-    if (*string == '=')\r
-        string++;  /* ignore possible '=' at beg of geometry spec */\r
-\r
-    strind = (char *)string;\r
-    if (*strind != '+' && *strind != '-' && *strind != 'x') {\r
-        tempWidth = ReadInteger(strind, &nextCharacter);\r
-        if (strind == nextCharacter)\r
-            return 0;\r
-        strind = nextCharacter;\r
-        mask |= WidthValue;\r
-    }\r
-\r
-    if (*strind == 'x' || *strind == 'X') {\r
-        strind++;\r
-        tempHeight = ReadInteger(strind, &nextCharacter);\r
-        if (strind == nextCharacter)\r
-            return 0;\r
-        strind = nextCharacter;\r
-        mask |= HeightValue;\r
-    }\r
-\r
-    if ((*strind == '+') || (*strind == '-')) {\r
-        if (*strind == '-') {\r
-            strind++;\r
-            tempX = -ReadInteger(strind, &nextCharacter);\r
-            if (strind == nextCharacter)\r
-                return 0;\r
-            strind = nextCharacter;\r
-            mask |= XNegative;\r
-        }\r
-        else\r
-        {\r
-            strind++;\r
-            tempX = ReadInteger(strind, &nextCharacter);\r
-            if (strind == nextCharacter)\r
-                return 0;\r
-            strind = nextCharacter;\r
-        }\r
-        mask |= XValue;\r
-        if ((*strind == '+') || (*strind == '-')) {\r
-            if (*strind == '-') {\r
-                strind++;\r
-                tempY = -ReadInteger(strind, &nextCharacter);\r
-                if (strind == nextCharacter)\r
-                    return 0;\r
-                strind = nextCharacter;\r
-                mask |= YNegative;\r
-            }\r
-            else\r
-            {\r
-                strind++;\r
-                tempY = ReadInteger(strind, &nextCharacter);\r
-                if (strind == nextCharacter)\r
-                    return 0;\r
-                strind = nextCharacter;\r
-            }\r
-            mask |= YValue;\r
-        }\r
-    }\r
-\r
-    /* If strind isn't at the end of the string the it's an invalid\r
-       geometry specification. */\r
-\r
-    if (*strind != '\0') return 0;\r
-\r
-    if (mask & XValue)\r
-        *x = tempX;\r
-    if (mask & YValue)\r
-        *y = tempY;\r
-    if (mask & WidthValue)\r
-        *width = tempWidth;\r
-    if (mask & HeightValue)\r
-        *height = tempHeight;\r
-    return mask;\r
-}\r
-\r
-\r
-\r
-/* -- PLATFORM-SPECIFIC INTERFACE FUNCTION -------------------------------------------------- */\r
-\r
-void (__cdecl *__glutExitFunc)( int return_value ) = NULL;\r
-\r
-void FGAPIENTRY __glutInitWithExit( int *pargc, char **argv, void (__cdecl *exit_function)(int) )\r
-{\r
-  __glutExitFunc = exit_function;\r
-  glutInit(pargc, argv);\r
-}\r
-\r
+/*
+ * freeglut_init_mswin.c
+ *
+ * The Windows-specific mouse cursor related stuff.
+ *
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
+ * Written by John F. Fay, <fayjf@sourceforge.net>
+ * Creation date: Thu Jan 19, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#define FREEGLUT_BUILDING_LIB
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+
+
+extern LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg,
+                               WPARAM wParam, LPARAM lParam );
+
+
+/*
+ * A call to this function should initialize all the display stuff...
+ */
+void fgPlatformInitialize( const char* displayName )
+{
+    WNDCLASS wc;
+    ATOM atom;
+
+    /* What we need to do is to initialize the fgDisplay global structure here. */
+    fgDisplay.pDisplay.Instance = GetModuleHandle( NULL );
+    fgDisplay.pDisplay.DisplayName= displayName ? strdup(displayName) : 0 ;
+    atom = GetClassInfo( fgDisplay.pDisplay.Instance, _T("FREEGLUT"), &wc );
+
+    if( atom == 0 )
+    {
+        ZeroMemory( &wc, sizeof(WNDCLASS) );
+
+        /*
+         * Each of the windows should have its own device context, and we
+         * want redraw events during Vertical and Horizontal Resizes by
+         * the user.
+         *
+         * XXX Old code had "| CS_DBCLCKS" commented out.  Plans for the
+         * XXX future?  Dead-end idea?
+         */
+        wc.lpfnWndProc    = fgPlatformWindowProc;
+        wc.cbClsExtra     = 0;
+        wc.cbWndExtra     = 0;
+        wc.hInstance      = fgDisplay.pDisplay.Instance;
+        wc.hIcon          = LoadIcon( fgDisplay.pDisplay.Instance, _T("GLUT_ICON") );
+
+#if defined(_WIN32_WCE)
+        wc.style          = CS_HREDRAW | CS_VREDRAW;
+#else
+        wc.style          = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
+        if (!wc.hIcon)
+          wc.hIcon        = LoadIcon( NULL, IDI_WINLOGO );
+#endif
+
+        wc.hCursor        = LoadCursor( NULL, IDC_ARROW );
+        wc.hbrBackground  = NULL;
+        wc.lpszMenuName   = NULL;
+        wc.lpszClassName  = _T("FREEGLUT");
+
+        /* Register the window class */
+        atom = RegisterClass( &wc );
+        FREEGLUT_INTERNAL_ERROR_EXIT ( atom, "Window Class Not Registered", "fgPlatformInitialize" );
+    }
+
+    /* The screen dimensions can be obtained via GetSystemMetrics() calls */
+    fgDisplay.ScreenWidth  = GetSystemMetrics( SM_CXSCREEN );
+    fgDisplay.ScreenHeight = GetSystemMetrics( SM_CYSCREEN );
+
+    {
+        HWND desktop = GetDesktopWindow( );
+        HDC  context = GetDC( desktop );
+
+        fgDisplay.ScreenWidthMM  = GetDeviceCaps( context, HORZSIZE );
+        fgDisplay.ScreenHeightMM = GetDeviceCaps( context, VERTSIZE );
+
+        ReleaseDC( desktop, context );
+    }
+    /* If we have a DisplayName try to use it for metrics */
+    if( fgDisplay.pDisplay.DisplayName )
+    {
+        HDC context = CreateDC(fgDisplay.pDisplay.DisplayName,0,0,0);
+        if( context )
+        {
+           fgDisplay.ScreenWidth  = GetDeviceCaps( context, HORZRES );
+           fgDisplay.ScreenHeight = GetDeviceCaps( context, VERTRES );
+           fgDisplay.ScreenWidthMM  = GetDeviceCaps( context, HORZSIZE );
+           fgDisplay.ScreenHeightMM = GetDeviceCaps( context, VERTSIZE );
+           DeleteDC(context);
+        }
+        else
+           fgWarning("fgPlatformInitialize: "
+                     "CreateDC failed, Screen size info may be incorrect\n"
+          "This is quite likely caused by a bad '-display' parameter");
+      
+    }
+    /* Set the timer granularity to 1 ms */
+    timeBeginPeriod ( 1 );
+
+
+    fgState.Initialised = GL_TRUE;
+
+    /* Avoid registering atexit callback on Win32 as it results in an access
+     * violation due to calling into a module which has been unloaded.
+     * Any cleanup isn't needed on Windows anyway, the OS takes care of it.c
+     * see: http://blogs.msdn.com/b/oldnewthing/archive/2012/01/05/10253268.aspx
+     */
+/*    atexit(fgDeinitialize); */
+
+    /* InputDevice uses GlutTimerFunc(), so fgState.Initialised must be TRUE */
+    fgInitialiseInputDevices();
+}
+
+
+
+/* Platform-Specific Deinitialization Functions: */
+extern void fghCloseInputDevices ( void );
+
+void fgPlatformDeinitialiseInputDevices ( void )
+{
+#if !defined(_WIN32_WCE)
+       fghCloseInputDevices ();
+#endif /* !defined(_WIN32_WCE) */
+    fgState.JoysticksInitialised = GL_FALSE;
+    fgState.InputDevsInitialised = GL_FALSE;
+}
+
+void fgPlatformCloseDisplay ( void )
+{
+    if( fgDisplay.pDisplay.DisplayName )
+    {
+        free( fgDisplay.pDisplay.DisplayName );
+        fgDisplay.pDisplay.DisplayName = NULL;
+    }
+
+    /* Reset the timer granularity */
+    timeEndPeriod ( 1 );
+}
+
+void fgPlatformDestroyContext ( SFG_PlatformDisplay pDisplay, SFG_WindowContextType MContext )
+{
+       /* Do nothing -- this is required for X11 */
+}
+
+/*
+ * Everything down to the end of the next two functions is copied from the X sources.
+ */
+
+/*
+
+Copyright 1985, 1986, 1987,1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from The Open Group.
+
+*/
+
+#define NoValue         0x0000
+#define XValue          0x0001
+#define YValue          0x0002
+#define WidthValue      0x0004
+#define HeightValue     0x0008
+#define AllValues       0x000F
+#define XNegative       0x0010
+#define YNegative       0x0020
+
+/*
+ *    XParseGeometry parses strings of the form
+ *   "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where
+ *   width, height, xoffset, and yoffset are unsigned integers.
+ *   Example:  "=80x24+300-49"
+ *   The equal sign is optional.
+ *   It returns a bitmask that indicates which of the four values
+ *   were actually found in the string.  For each value found,
+ *   the corresponding argument is updated;  for each value
+ *   not found, the corresponding argument is left unchanged.
+ */
+
+static int
+ReadInteger(char *string, char **NextString)
+{
+    register int Result = 0;
+    int Sign = 1;
+
+    if (*string == '+')
+        string++;
+    else if (*string == '-')
+    {
+        string++;
+        Sign = -1;
+    }
+    for (; (*string >= '0') && (*string <= '9'); string++)
+    {
+        Result = (Result * 10) + (*string - '0');
+    }
+    *NextString = string;
+    if (Sign >= 0)
+        return Result;
+    else
+        return -Result;
+}
+
+int XParseGeometry (
+    const char *string,
+    int *x,
+    int *y,
+    unsigned int *width,    /* RETURN */
+    unsigned int *height)    /* RETURN */
+{
+    int mask = NoValue;
+    register char *strind;
+    unsigned int tempWidth = 0, tempHeight = 0;
+    int tempX = 0, tempY = 0;
+    char *nextCharacter;
+
+    if ( (string == NULL) || (*string == '\0'))
+      return mask;
+    if (*string == '=')
+        string++;  /* ignore possible '=' at beg of geometry spec */
+
+    strind = (char *)string;
+    if (*strind != '+' && *strind != '-' && *strind != 'x') {
+        tempWidth = ReadInteger(strind, &nextCharacter);
+        if (strind == nextCharacter)
+            return 0;
+        strind = nextCharacter;
+        mask |= WidthValue;
+    }
+
+    if (*strind == 'x' || *strind == 'X') {
+        strind++;
+        tempHeight = ReadInteger(strind, &nextCharacter);
+        if (strind == nextCharacter)
+            return 0;
+        strind = nextCharacter;
+        mask |= HeightValue;
+    }
+
+    if ((*strind == '+') || (*strind == '-')) {
+        if (*strind == '-') {
+            strind++;
+            tempX = -ReadInteger(strind, &nextCharacter);
+            if (strind == nextCharacter)
+                return 0;
+            strind = nextCharacter;
+            mask |= XNegative;
+        }
+        else
+        {
+            strind++;
+            tempX = ReadInteger(strind, &nextCharacter);
+            if (strind == nextCharacter)
+                return 0;
+            strind = nextCharacter;
+        }
+        mask |= XValue;
+        if ((*strind == '+') || (*strind == '-')) {
+            if (*strind == '-') {
+                strind++;
+                tempY = -ReadInteger(strind, &nextCharacter);
+                if (strind == nextCharacter)
+                    return 0;
+                strind = nextCharacter;
+                mask |= YNegative;
+            }
+            else
+            {
+                strind++;
+                tempY = ReadInteger(strind, &nextCharacter);
+                if (strind == nextCharacter)
+                    return 0;
+                strind = nextCharacter;
+            }
+            mask |= YValue;
+        }
+    }
+
+    /* If strind isn't at the end of the string the it's an invalid
+       geometry specification. */
+
+    if (*strind != '\0') return 0;
+
+    if (mask & XValue)
+        *x = tempX;
+    if (mask & YValue)
+        *y = tempY;
+    if (mask & WidthValue)
+        *width = tempWidth;
+    if (mask & HeightValue)
+        *height = tempHeight;
+    return mask;
+}
+
+
+
+/* -- PLATFORM-SPECIFIC INTERFACE FUNCTION -------------------------------------------------- */
+
+void (__cdecl *__glutExitFunc)( int return_value ) = NULL;
+
+void FGAPIENTRY __glutInitWithExit( int *pargc, char **argv, void (__cdecl *exit_function)(int) )
+{
+  __glutExitFunc = exit_function;
+  glutInit(pargc, argv);
+}
+
index f92eadc..fb70d33 100644 (file)
-/*\r
- * freeglut_input_devices_mswin.c\r
- *\r
- * The Windows-specific mouse cursor related stuff.\r
- *\r
- * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
- * Written by John F. Fay, <fayjf@sourceforge.net>\r
- * Creation date: Sat Jan 21, 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-#include <sys/types.h>\r
-#include <winbase.h>\r
-\r
-typedef struct {\r
-   HANDLE fh;\r
-   COMMTIMEOUTS timeouts_save;\r
-   DCB dcb_save;\r
-} SERIALPORT;\r
-\r
-/* Serial Port Prototypes */\r
-SERIALPORT *serial_open ( const char *device );\r
-void serial_close ( SERIALPORT *port );\r
-int serial_getchar ( SERIALPORT *port );\r
-int serial_putchar ( SERIALPORT *port, unsigned char ch );\r
-void serial_flush ( SERIALPORT *port );\r
-\r
-\r
-void fgPlatformRegisterDialDevice ( const char *dial_device )\r
-{\r
-        if (!dial_device){\r
-            static char devname[256];\r
-            DWORD size=sizeof(devname);\r
-            DWORD type = REG_SZ;\r
-            HKEY key;\r
-            if (RegOpenKeyA(HKEY_LOCAL_MACHINE,"SOFTWARE\\FreeGLUT",&key)==ERROR_SUCCESS) {\r
-                if (RegQueryValueExA(key,"DialboxSerialPort",NULL,&type,(LPBYTE)devname,&size)==ERROR_SUCCESS){\r
-                    dial_device=devname;\r
-                }\r
-                RegCloseKey(key);\r
-            }\r
-        }\r
-}\r
-\r
-\r
-/*  Serial Port Functions */\r
-SERIALPORT *serial_open(const char *device){\r
-    HANDLE fh;\r
-    DCB dcb={sizeof(DCB)};\r
-    COMMTIMEOUTS timeouts;\r
-    SERIALPORT *port;\r
-\r
-    fh = CreateFile(device,GENERIC_READ|GENERIC_WRITE,0,NULL,\r
-      OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);\r
-    if (!fh) return NULL;\r
-\r
-    port = malloc(sizeof(SERIALPORT));\r
-    ZeroMemory(port, sizeof(SERIALPORT));\r
-    port->fh = fh;\r
-\r
-    /* save current port settings */\r
-    GetCommState(fh,&port->dcb_save);\r
-    GetCommTimeouts(fh,&port->timeouts_save);\r
-\r
-    dcb.DCBlength=sizeof(DCB);\r
-    BuildCommDCB("96,n,8,1",&dcb);\r
-    SetCommState(fh,&dcb);\r
-\r
-    ZeroMemory(&timeouts,sizeof(timeouts));\r
-    timeouts.ReadTotalTimeoutConstant=1;\r
-    timeouts.WriteTotalTimeoutConstant=1;\r
-    SetCommTimeouts(fh,&timeouts);\r
-\r
-    serial_flush(port);\r
-\r
-    return port;\r
-}\r
-\r
-void serial_close(SERIALPORT *port){\r
-    if (port){\r
-        /* restore old port settings */\r
-        SetCommState(port->fh,&port->dcb_save);\r
-        SetCommTimeouts(port->fh,&port->timeouts_save);\r
-        CloseHandle(port->fh);\r
-        free(port);\r
-    }\r
-}\r
-\r
-int serial_getchar(SERIALPORT *port){\r
-    DWORD n;\r
-    unsigned char ch;\r
-    if (!port) return EOF;\r
-    if (!ReadFile(port->fh,&ch,1,&n,NULL)) return EOF;\r
-    if (n==1) return ch;\r
-    return EOF;\r
-}\r
-\r
-int serial_putchar(SERIALPORT *port, unsigned char ch){\r
-    DWORD n;\r
-    if (!port) return 0;\r
-    return WriteFile(port->fh,&ch,1,&n,NULL);\r
-}\r
-\r
-void serial_flush ( SERIALPORT *port )\r
-{\r
-    FlushFileBuffers(port->fh);\r
-}\r
-\r
+/*
+ * freeglut_input_devices_mswin.c
+ *
+ * The Windows-specific mouse cursor related stuff.
+ *
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
+ * Written by John F. Fay, <fayjf@sourceforge.net>
+ * Creation date: Sat Jan 21, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+#include <sys/types.h>
+#include <winbase.h>
+
+typedef struct {
+   HANDLE fh;
+   COMMTIMEOUTS timeouts_save;
+   DCB dcb_save;
+} SERIALPORT;
+
+/* Serial Port Prototypes */
+SERIALPORT *serial_open ( const char *device );
+void serial_close ( SERIALPORT *port );
+int serial_getchar ( SERIALPORT *port );
+int serial_putchar ( SERIALPORT *port, unsigned char ch );
+void serial_flush ( SERIALPORT *port );
+
+
+void fgPlatformRegisterDialDevice ( const char *dial_device )
+{
+        if (!dial_device){
+            static char devname[256];
+            DWORD size=sizeof(devname);
+            DWORD type = REG_SZ;
+            HKEY key;
+            if (RegOpenKeyA(HKEY_LOCAL_MACHINE,"SOFTWARE\\FreeGLUT",&key)==ERROR_SUCCESS) {
+                if (RegQueryValueExA(key,"DialboxSerialPort",NULL,&type,(LPBYTE)devname,&size)==ERROR_SUCCESS){
+                    dial_device=devname;
+                }
+                RegCloseKey(key);
+            }
+        }
+}
+
+
+/*  Serial Port Functions */
+SERIALPORT *serial_open(const char *device){
+    HANDLE fh;
+    DCB dcb={sizeof(DCB)};
+    COMMTIMEOUTS timeouts;
+    SERIALPORT *port;
+
+    fh = CreateFile(device,GENERIC_READ|GENERIC_WRITE,0,NULL,
+      OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+    if (!fh) return NULL;
+
+    port = malloc(sizeof(SERIALPORT));
+    ZeroMemory(port, sizeof(SERIALPORT));
+    port->fh = fh;
+
+    /* save current port settings */
+    GetCommState(fh,&port->dcb_save);
+    GetCommTimeouts(fh,&port->timeouts_save);
+
+    dcb.DCBlength=sizeof(DCB);
+    BuildCommDCB("96,n,8,1",&dcb);
+    SetCommState(fh,&dcb);
+
+    ZeroMemory(&timeouts,sizeof(timeouts));
+    timeouts.ReadTotalTimeoutConstant=1;
+    timeouts.WriteTotalTimeoutConstant=1;
+    SetCommTimeouts(fh,&timeouts);
+
+    serial_flush(port);
+
+    return port;
+}
+
+void serial_close(SERIALPORT *port){
+    if (port){
+        /* restore old port settings */
+        SetCommState(port->fh,&port->dcb_save);
+        SetCommTimeouts(port->fh,&port->timeouts_save);
+        CloseHandle(port->fh);
+        free(port);
+    }
+}
+
+int serial_getchar(SERIALPORT *port){
+    DWORD n;
+    unsigned char ch;
+    if (!port) return EOF;
+    if (!ReadFile(port->fh,&ch,1,&n,NULL)) return EOF;
+    if (n==1) return ch;
+    return EOF;
+}
+
+int serial_putchar(SERIALPORT *port, unsigned char ch){
+    DWORD n;
+    if (!port) return 0;
+    return WriteFile(port->fh,&ch,1,&n,NULL);
+}
+
+void serial_flush ( SERIALPORT *port )
+{
+    FlushFileBuffers(port->fh);
+}
+
index b37ad8c..37a77b4 100644 (file)
-/*\r
- * freeglut_internal_mswin.h\r
- *\r
- * The freeglut library private include file.\r
- *\r
- * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
- * Written by John F. Fay, <fayjf@sourceforge.net>\r
- * Creation date: Thu Jan 19, 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#ifndef  FREEGLUT_INTERNAL_MSWIN_H\r
-#define  FREEGLUT_INTERNAL_MSWIN_H\r
-\r
-\r
-/* All Win32 headers depend on the huge windows.h recursive include.\r
- * Note: Lower-case header names are used, for best cross-platform\r
- * compatibility.\r
- */\r
-#if !defined(_WIN32_WCE)\r
-#    include <windows.h>\r
-#    include <windowsx.h>\r
-#    include <mmsystem.h>\r
-/* CYGWIN does not have tchar.h, but has TEXT(x), defined in winnt.h. */\r
-#    ifndef __CYGWIN__\r
-#      include <tchar.h>\r
-#    else\r
-#      define _TEXT(x) TEXT(x)\r
-#      define _T(x)    TEXT(x)\r
-#    endif\r
-\r
-#endif\r
-\r
-\r
-#define  HAVE_VFPRINTF 1\r
-\r
-/* MinGW may lack a prototype for ChangeDisplaySettingsEx() (depending on the version?) */\r
-#if !defined(ChangeDisplaySettingsEx)\r
-LONG WINAPI ChangeDisplaySettingsExA(LPCSTR,LPDEVMODEA,HWND,DWORD,LPVOID);\r
-LONG WINAPI ChangeDisplaySettingsExW(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID);\r
-#    ifdef UNICODE\r
-#        define ChangeDisplaySettingsEx ChangeDisplaySettingsExW\r
-#    else\r
-#        define ChangeDisplaySettingsEx ChangeDisplaySettingsExA\r
-#    endif\r
-#endif\r
-\r
-\r
-/* Structure Definitions */\r
-\r
-typedef struct tagSFG_PlatformDisplay SFG_PlatformDisplay;\r
-struct tagSFG_PlatformDisplay\r
-{\r
-    HINSTANCE       Instance;           /* The application's instance        */\r
-    DEVMODE         DisplayMode;        /* Desktop's display settings        */\r
-    char           *DisplayName;        /* Display name for multi display support*/ \r
-};\r
-\r
-/*\r
- * Make "freeglut" window handle and context types so that we don't need so\r
- * much conditionally-compiled code later in the library.\r
- */\r
-typedef HWND    SFG_WindowHandleType ;\r
-typedef HGLRC   SFG_WindowContextType ;\r
-typedef struct tagSFG_PlatformContext SFG_PlatformContext;\r
-struct tagSFG_PlatformContext\r
-{\r
-    HDC             Device;          /* The window's device context         */\r
-};\r
-\r
-\r
-/* Window's state description. This structure should be kept portable. */\r
-typedef struct tagSFG_PlatformWindowState SFG_PlatformWindowState;\r
-struct tagSFG_PlatformWindowState\r
-{\r
-    RECT            OldRect;            /* window rect - stored before the window is made fullscreen */\r
-    DWORD           OldStyle;           /* window style - stored before the window is made fullscreen */\r
-};\r
-\r
-\r
-\r
-/* Joystick-Specific Definitions */\r
-#if !defined(_WIN32_WCE)\r
-#    define _JS_MAX_AXES  8\r
-typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick;\r
-struct tagSFG_PlatformJoystick\r
-{\r
-    JOYCAPS     jsCaps;\r
-    JOYINFOEX   js;\r
-    UINT        js_id;\r
-};\r
-#endif\r
-\r
-\r
-/* Menu font and color definitions */\r
-#define  FREEGLUT_MENU_FONT    GLUT_BITMAP_8_BY_13\r
-\r
-#define  FREEGLUT_MENU_PEN_FORE_COLORS   {0.0f,  0.0f,  0.0f,  1.0f}\r
-#define  FREEGLUT_MENU_PEN_BACK_COLORS   {0.85f, 0.85f, 0.85f, 1.0f}\r
-#define  FREEGLUT_MENU_PEN_HFORE_COLORS  {1.0f,  1.0f,  1.0f,  1.0f}\r
-#define  FREEGLUT_MENU_PEN_HBACK_COLORS  {0.15f, 0.15f, 0.45f, 1.0f}\r
-\r
-\r
-/* Function to be called on exit */\r
-extern void (__cdecl *__glutExitFunc)( int return_value );\r
-\r
-\r
+/*
+ * freeglut_internal_mswin.h
+ *
+ * The freeglut library private include file.
+ *
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
+ * Written by John F. Fay, <fayjf@sourceforge.net>
+ * Creation date: Thu Jan 19, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef  FREEGLUT_INTERNAL_MSWIN_H
+#define  FREEGLUT_INTERNAL_MSWIN_H
+
+
+/* All Win32 headers depend on the huge windows.h recursive include.
+ * Note: Lower-case header names are used, for best cross-platform
+ * compatibility.
+ */
+#if !defined(_WIN32_WCE)
+#    include <windows.h>
+#    include <windowsx.h>
+#    include <mmsystem.h>
+/* CYGWIN does not have tchar.h, but has TEXT(x), defined in winnt.h. */
+#    ifndef __CYGWIN__
+#      include <tchar.h>
+#    else
+#      define _TEXT(x) TEXT(x)
+#      define _T(x)    TEXT(x)
+#    endif
+
+#endif
+
+
+#define  HAVE_VFPRINTF 1
+
+/* MinGW may lack a prototype for ChangeDisplaySettingsEx() (depending on the version?) */
+#if !defined(ChangeDisplaySettingsEx)
+LONG WINAPI ChangeDisplaySettingsExA(LPCSTR,LPDEVMODEA,HWND,DWORD,LPVOID);
+LONG WINAPI ChangeDisplaySettingsExW(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID);
+#    ifdef UNICODE
+#        define ChangeDisplaySettingsEx ChangeDisplaySettingsExW
+#    else
+#        define ChangeDisplaySettingsEx ChangeDisplaySettingsExA
+#    endif
+#endif
+
+
+/* Structure Definitions */
+
+typedef struct tagSFG_PlatformDisplay SFG_PlatformDisplay;
+struct tagSFG_PlatformDisplay
+{
+    HINSTANCE       Instance;           /* The application's instance        */
+    DEVMODE         DisplayMode;        /* Desktop's display settings        */
+    char           *DisplayName;        /* Display name for multi display support*/ 
+};
+
+/*
+ * Make "freeglut" window handle and context types so that we don't need so
+ * much conditionally-compiled code later in the library.
+ */
+typedef HWND    SFG_WindowHandleType ;
+typedef HGLRC   SFG_WindowContextType ;
+typedef struct tagSFG_PlatformContext SFG_PlatformContext;
+struct tagSFG_PlatformContext
+{
+    HDC             Device;          /* The window's device context         */
+};
+
+
+/* Window's state description. This structure should be kept portable. */
+typedef struct tagSFG_PlatformWindowState SFG_PlatformWindowState;
+struct tagSFG_PlatformWindowState
+{
+    RECT            OldRect;            /* window rect - stored before the window is made fullscreen */
+    DWORD           OldStyle;           /* window style - stored before the window is made fullscreen */
+};
+
+
+
+/* Joystick-Specific Definitions */
+#if !defined(_WIN32_WCE)
+#    define _JS_MAX_AXES  8
+typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick;
+struct tagSFG_PlatformJoystick
+{
+    JOYCAPS     jsCaps;
+    JOYINFOEX   js;
+    UINT        js_id;
+};
+#endif
+
+
+/* Menu font and color definitions */
+#define  FREEGLUT_MENU_FONT    GLUT_BITMAP_8_BY_13
+
+#define  FREEGLUT_MENU_PEN_FORE_COLORS   {0.0f,  0.0f,  0.0f,  1.0f}
+#define  FREEGLUT_MENU_PEN_BACK_COLORS   {0.85f, 0.85f, 0.85f, 1.0f}
+#define  FREEGLUT_MENU_PEN_HFORE_COLORS  {1.0f,  1.0f,  1.0f,  1.0f}
+#define  FREEGLUT_MENU_PEN_HBACK_COLORS  {0.15f, 0.15f, 0.45f, 1.0f}
+
+
+/* Function to be called on exit */
+extern void (__cdecl *__glutExitFunc)( int return_value );
+
+
 #endif  /* FREEGLUT_INTERNAL_MSWIN_H */
\ No newline at end of file
index 50dbf1e..104afbe 100644 (file)
-/*\r
- * freeglut_joystick_mswin.c\r
- *\r
- * The Windows-specific mouse cursor related stuff.\r
- *\r
- * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
- * Written by John F. Fay, <fayjf@sourceforge.net>\r
- * Creation date: Sat Jan 28, 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-\r
-#if !defined(_WIN32_WCE)\r
-#    include <windows.h>\r
-#    include <mmsystem.h>\r
-#    include <regstr.h>\r
-\r
-\r
-\r
-\r
-void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes )\r
-{\r
-    MMRESULT status;\r
-\r
-    status = joyGetPosEx( joy->pJoystick.js_id, &joy->pJoystick.js );\r
-\r
-    if ( status != JOYERR_NOERROR )\r
-    {\r
-        joy->error = GL_TRUE;\r
-        return;\r
-    }\r
-\r
-    if ( buttons )\r
-        *buttons = joy->pJoystick.js.dwButtons;\r
-\r
-    if ( axes )\r
-    {\r
-        /*\r
-         * WARNING - Fall through case clauses!!\r
-         */\r
-        switch ( joy->num_axes )\r
-        {\r
-        case 8:\r
-            /* Generate two POV axes from the POV hat angle.\r
-             * Low 16 bits of js.dwPOV gives heading (clockwise from ahead) in\r
-             *   hundredths of a degree, or 0xFFFF when idle.\r
-             */\r
-            if ( ( joy->pJoystick.js.dwPOV & 0xFFFF ) == 0xFFFF )\r
-            {\r
-              axes [ 6 ] = 0.0;\r
-              axes [ 7 ] = 0.0;\r
-            }\r
-            else\r
-            {\r
-              /* This is the contentious bit: how to convert angle to X/Y.\r
-               *    wk: I know of no define for PI that we could use here:\r
-               *    SG_PI would pull in sg, M_PI is undefined for MSVC\r
-               * But the accuracy of the value of PI is very unimportant at\r
-               * this point.\r
-               */\r
-              float s = (float) sin ( ( joy->pJoystick.js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180.0f ) );\r
-              float c = (float) cos ( ( joy->pJoystick.js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180.0f ) );\r
-\r
-              /* Convert to coordinates on a square so that North-East\r
-               * is (1,1) not (.7,.7), etc.\r
-               * s and c cannot both be zero so we won't divide by zero.\r
-               */\r
-              if ( fabs ( s ) < fabs ( c ) )\r
-              {\r
-                axes [ 6 ] = ( c < 0.0 ) ? -s/c  : s/c ;\r
-                axes [ 7 ] = ( c < 0.0 ) ? -1.0f : 1.0f;\r
-              }\r
-              else\r
-              {\r
-                axes [ 6 ] = ( s < 0.0 ) ? -1.0f : 1.0f;\r
-                axes [ 7 ] = ( s < 0.0 ) ? -c/s  : c/s ;\r
-              }\r
-            }\r
-\r
-        case 6: axes[5] = (float) joy->pJoystick.js.dwVpos;\r
-        case 5: axes[4] = (float) joy->pJoystick.js.dwUpos;\r
-        case 4: axes[3] = (float) joy->pJoystick.js.dwRpos;\r
-        case 3: axes[2] = (float) joy->pJoystick.js.dwZpos;\r
-        case 2: axes[1] = (float) joy->pJoystick.js.dwYpos;\r
-        case 1: axes[0] = (float) joy->pJoystick.js.dwXpos;\r
-        }\r
-    }\r
-}\r
-\r
-\r
-\r
-/* Inspired by\r
-   http://msdn.microsoft.com/archive/en-us/dnargame/html/msdn_sidewind3d.asp\r
- */\r
-#  if FREEGLUT_LIB_PRAGMAS\r
-#      pragma comment (lib, "advapi32.lib")\r
-#  endif\r
-\r
-static int fghJoystickGetOEMProductName ( SFG_Joystick* joy, char *buf, int buf_sz )\r
-{\r
-    char buffer [ 256 ];\r
-\r
-    char OEMKey [ 256 ];\r
-\r
-    HKEY  hKey;\r
-    DWORD dwcb;\r
-    LONG  lr;\r
-\r
-    if ( joy->error )\r
-        return 0;\r
-\r
-    /* Open .. MediaResources\CurrentJoystickSettings */\r
-    _snprintf ( buffer, sizeof(buffer), "%s\\%s\\%s",\r
-                REGSTR_PATH_JOYCONFIG, joy->pJoystick.jsCaps.szRegKey,\r
-                REGSTR_KEY_JOYCURR );\r
-\r
-    lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey);\r
-\r
-    if ( lr != ERROR_SUCCESS ) return 0;\r
-\r
-    /* Get OEM Key name */\r
-    dwcb = sizeof(OEMKey);\r
-\r
-    /* JOYSTICKID1-16 is zero-based; registry entries for VJOYD are 1-based. */\r
-    _snprintf ( buffer, sizeof(buffer), "Joystick%d%s", joy->pJoystick.js_id + 1, REGSTR_VAL_JOYOEMNAME );\r
-\r
-    lr = RegQueryValueEx ( hKey, buffer, 0, 0, (LPBYTE) OEMKey, &dwcb);\r
-    RegCloseKey ( hKey );\r
-\r
-    if ( lr != ERROR_SUCCESS ) return 0;\r
-\r
-    /* Open OEM Key from ...MediaProperties */\r
-    _snprintf ( buffer, sizeof(buffer), "%s\\%s", REGSTR_PATH_JOYOEM, OEMKey );\r
-\r
-    lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey );\r
-\r
-    if ( lr != ERROR_SUCCESS ) return 0;\r
-\r
-    /* Get OEM Name */\r
-    dwcb = buf_sz;\r
-\r
-    lr = RegQueryValueEx ( hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, (LPBYTE) buf,\r
-                             &dwcb );\r
-    RegCloseKey ( hKey );\r
-\r
-    if ( lr != ERROR_SUCCESS ) return 0;\r
-\r
-    return 1;\r
-}\r
-\r
-\r
-void fgPlatformJoystickOpen( SFG_Joystick* joy )\r
-{\r
-       int i = 0;\r
-\r
-    joy->pJoystick.js.dwFlags = JOY_RETURNALL;\r
-    joy->pJoystick.js.dwSize  = sizeof( joy->pJoystick.js );\r
-\r
-    memset( &joy->pJoystick.jsCaps, 0, sizeof( joy->pJoystick.jsCaps ) );\r
-\r
-    joy->error =\r
-        ( joyGetDevCaps( joy->pJoystick.js_id, &joy->pJoystick.jsCaps, sizeof( joy->pJoystick.jsCaps ) ) !=\r
-          JOYERR_NOERROR );\r
-\r
-    if( joy->pJoystick.jsCaps.wNumAxes == 0 )\r
-    {\r
-        joy->num_axes = 0;\r
-        joy->error = GL_TRUE;\r
-    }\r
-    else\r
-    {\r
-        /* Device name from jsCaps is often "Microsoft PC-joystick driver",\r
-         * at least for USB.  Try to get the real name from the registry.\r
-         */\r
-        if ( ! fghJoystickGetOEMProductName( joy, joy->name,\r
-                                             sizeof( joy->name ) ) )\r
-        {\r
-            fgWarning( "JS: Failed to read joystick name from registry" );\r
-            strncpy( joy->name, joy->pJoystick.jsCaps.szPname, sizeof( joy->name ) );\r
-        }\r
-\r
-        /* Windows joystick drivers may provide any combination of\r
-         * X,Y,Z,R,U,V,POV - not necessarily the first n of these.\r
-         */\r
-        if( joy->pJoystick.jsCaps.wCaps & JOYCAPS_HASPOV )\r
-        {\r
-            joy->num_axes = _JS_MAX_AXES;\r
-            joy->min[ 7 ] = -1.0; joy->max[ 7 ] = 1.0;  /* POV Y */\r
-            joy->min[ 6 ] = -1.0; joy->max[ 6 ] = 1.0;  /* POV X */\r
-        }\r
-        else\r
-            joy->num_axes = 6;\r
-\r
-        joy->min[ 5 ] = ( float )joy->pJoystick.jsCaps.wVmin;\r
-        joy->max[ 5 ] = ( float )joy->pJoystick.jsCaps.wVmax;\r
-        joy->min[ 4 ] = ( float )joy->pJoystick.jsCaps.wUmin;\r
-        joy->max[ 4 ] = ( float )joy->pJoystick.jsCaps.wUmax;\r
-        joy->min[ 3 ] = ( float )joy->pJoystick.jsCaps.wRmin;\r
-        joy->max[ 3 ] = ( float )joy->pJoystick.jsCaps.wRmax;\r
-        joy->min[ 2 ] = ( float )joy->pJoystick.jsCaps.wZmin;\r
-        joy->max[ 2 ] = ( float )joy->pJoystick.jsCaps.wZmax;\r
-        joy->min[ 1 ] = ( float )joy->pJoystick.jsCaps.wYmin;\r
-        joy->max[ 1 ] = ( float )joy->pJoystick.jsCaps.wYmax;\r
-        joy->min[ 0 ] = ( float )joy->pJoystick.jsCaps.wXmin;\r
-        joy->max[ 0 ] = ( float )joy->pJoystick.jsCaps.wXmax;\r
-    }\r
-\r
-    /* Guess all the rest judging on the axes extremals */\r
-    for( i = 0; i < joy->num_axes; i++ )\r
-    {\r
-        joy->center   [ i ] = ( joy->max[ i ] + joy->min[ i ] ) * 0.5f;\r
-        joy->dead_band[ i ] = 0.0f;\r
-        joy->saturate [ i ] = 1.0f;\r
-    }\r
-}\r
-\r
-\r
-\r
-void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )\r
-{\r
-    switch( ident )\r
-    {\r
-    case 0:\r
-        fgJoystick[ ident ]->pJoystick.js_id = JOYSTICKID1;\r
-        fgJoystick[ ident ]->error = GL_FALSE;\r
-        break;\r
-    case 1:\r
-        fgJoystick[ ident ]->pJoystick.js_id = JOYSTICKID2;\r
-        fgJoystick[ ident ]->error = GL_FALSE;\r
-        break;\r
-    default:\r
-        fgJoystick[ ident ]->num_axes = 0;\r
-        fgJoystick[ ident ]->error = GL_TRUE;\r
-        return;\r
-    }\r
-}\r
-\r
-\r
-\r
-void fgPlatformJoystickClose ( int ident )\r
-{\r
-    /* Do nothing special */\r
-}\r
-#endif\r
-\r
+/*
+ * freeglut_joystick_mswin.c
+ *
+ * The Windows-specific mouse cursor related stuff.
+ *
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
+ * Written by John F. Fay, <fayjf@sourceforge.net>
+ * Creation date: Sat Jan 28, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+
+#if !defined(_WIN32_WCE)
+#    include <windows.h>
+#    include <mmsystem.h>
+#    include <regstr.h>
+
+
+
+
+void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes )
+{
+    MMRESULT status;
+
+    status = joyGetPosEx( joy->pJoystick.js_id, &joy->pJoystick.js );
+
+    if ( status != JOYERR_NOERROR )
+    {
+        joy->error = GL_TRUE;
+        return;
+    }
+
+    if ( buttons )
+        *buttons = joy->pJoystick.js.dwButtons;
+
+    if ( axes )
+    {
+        /*
+         * WARNING - Fall through case clauses!!
+         */
+        switch ( joy->num_axes )
+        {
+        case 8:
+            /* Generate two POV axes from the POV hat angle.
+             * Low 16 bits of js.dwPOV gives heading (clockwise from ahead) in
+             *   hundredths of a degree, or 0xFFFF when idle.
+             */
+            if ( ( joy->pJoystick.js.dwPOV & 0xFFFF ) == 0xFFFF )
+            {
+              axes [ 6 ] = 0.0;
+              axes [ 7 ] = 0.0;
+            }
+            else
+            {
+              /* This is the contentious bit: how to convert angle to X/Y.
+               *    wk: I know of no define for PI that we could use here:
+               *    SG_PI would pull in sg, M_PI is undefined for MSVC
+               * But the accuracy of the value of PI is very unimportant at
+               * this point.
+               */
+              float s = (float) sin ( ( joy->pJoystick.js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180.0f ) );
+              float c = (float) cos ( ( joy->pJoystick.js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180.0f ) );
+
+              /* Convert to coordinates on a square so that North-East
+               * is (1,1) not (.7,.7), etc.
+               * s and c cannot both be zero so we won't divide by zero.
+               */
+              if ( fabs ( s ) < fabs ( c ) )
+              {
+                axes [ 6 ] = ( c < 0.0 ) ? -s/c  : s/c ;
+                axes [ 7 ] = ( c < 0.0 ) ? -1.0f : 1.0f;
+              }
+              else
+              {
+                axes [ 6 ] = ( s < 0.0 ) ? -1.0f : 1.0f;
+                axes [ 7 ] = ( s < 0.0 ) ? -c/s  : c/s ;
+              }
+            }
+
+        case 6: axes[5] = (float) joy->pJoystick.js.dwVpos;
+        case 5: axes[4] = (float) joy->pJoystick.js.dwUpos;
+        case 4: axes[3] = (float) joy->pJoystick.js.dwRpos;
+        case 3: axes[2] = (float) joy->pJoystick.js.dwZpos;
+        case 2: axes[1] = (float) joy->pJoystick.js.dwYpos;
+        case 1: axes[0] = (float) joy->pJoystick.js.dwXpos;
+        }
+    }
+}
+
+
+
+/* Inspired by
+   http://msdn.microsoft.com/archive/en-us/dnargame/html/msdn_sidewind3d.asp
+ */
+#  if FREEGLUT_LIB_PRAGMAS
+#      pragma comment (lib, "advapi32.lib")
+#  endif
+
+static int fghJoystickGetOEMProductName ( SFG_Joystick* joy, char *buf, int buf_sz )
+{
+    char buffer [ 256 ];
+
+    char OEMKey [ 256 ];
+
+    HKEY  hKey;
+    DWORD dwcb;
+    LONG  lr;
+
+    if ( joy->error )
+        return 0;
+
+    /* Open .. MediaResources\CurrentJoystickSettings */
+    _snprintf ( buffer, sizeof(buffer), "%s\\%s\\%s",
+                REGSTR_PATH_JOYCONFIG, joy->pJoystick.jsCaps.szRegKey,
+                REGSTR_KEY_JOYCURR );
+
+    lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey);
+
+    if ( lr != ERROR_SUCCESS ) return 0;
+
+    /* Get OEM Key name */
+    dwcb = sizeof(OEMKey);
+
+    /* JOYSTICKID1-16 is zero-based; registry entries for VJOYD are 1-based. */
+    _snprintf ( buffer, sizeof(buffer), "Joystick%d%s", joy->pJoystick.js_id + 1, REGSTR_VAL_JOYOEMNAME );
+
+    lr = RegQueryValueEx ( hKey, buffer, 0, 0, (LPBYTE) OEMKey, &dwcb);
+    RegCloseKey ( hKey );
+
+    if ( lr != ERROR_SUCCESS ) return 0;
+
+    /* Open OEM Key from ...MediaProperties */
+    _snprintf ( buffer, sizeof(buffer), "%s\\%s", REGSTR_PATH_JOYOEM, OEMKey );
+
+    lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, buffer, 0, KEY_QUERY_VALUE, &hKey );
+
+    if ( lr != ERROR_SUCCESS ) return 0;
+
+    /* Get OEM Name */
+    dwcb = buf_sz;
+
+    lr = RegQueryValueEx ( hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, (LPBYTE) buf,
+                             &dwcb );
+    RegCloseKey ( hKey );
+
+    if ( lr != ERROR_SUCCESS ) return 0;
+
+    return 1;
+}
+
+
+void fgPlatformJoystickOpen( SFG_Joystick* joy )
+{
+       int i = 0;
+
+    joy->pJoystick.js.dwFlags = JOY_RETURNALL;
+    joy->pJoystick.js.dwSize  = sizeof( joy->pJoystick.js );
+
+    memset( &joy->pJoystick.jsCaps, 0, sizeof( joy->pJoystick.jsCaps ) );
+
+    joy->error =
+        ( joyGetDevCaps( joy->pJoystick.js_id, &joy->pJoystick.jsCaps, sizeof( joy->pJoystick.jsCaps ) ) !=
+          JOYERR_NOERROR );
+
+    if( joy->pJoystick.jsCaps.wNumAxes == 0 )
+    {
+        joy->num_axes = 0;
+        joy->error = GL_TRUE;
+    }
+    else
+    {
+        /* Device name from jsCaps is often "Microsoft PC-joystick driver",
+         * at least for USB.  Try to get the real name from the registry.
+         */
+        if ( ! fghJoystickGetOEMProductName( joy, joy->name,
+                                             sizeof( joy->name ) ) )
+        {
+            fgWarning( "JS: Failed to read joystick name from registry" );
+            strncpy( joy->name, joy->pJoystick.jsCaps.szPname, sizeof( joy->name ) );
+        }
+
+        /* Windows joystick drivers may provide any combination of
+         * X,Y,Z,R,U,V,POV - not necessarily the first n of these.
+         */
+        if( joy->pJoystick.jsCaps.wCaps & JOYCAPS_HASPOV )
+        {
+            joy->num_axes = _JS_MAX_AXES;
+            joy->min[ 7 ] = -1.0; joy->max[ 7 ] = 1.0;  /* POV Y */
+            joy->min[ 6 ] = -1.0; joy->max[ 6 ] = 1.0;  /* POV X */
+        }
+        else
+            joy->num_axes = 6;
+
+        joy->min[ 5 ] = ( float )joy->pJoystick.jsCaps.wVmin;
+        joy->max[ 5 ] = ( float )joy->pJoystick.jsCaps.wVmax;
+        joy->min[ 4 ] = ( float )joy->pJoystick.jsCaps.wUmin;
+        joy->max[ 4 ] = ( float )joy->pJoystick.jsCaps.wUmax;
+        joy->min[ 3 ] = ( float )joy->pJoystick.jsCaps.wRmin;
+        joy->max[ 3 ] = ( float )joy->pJoystick.jsCaps.wRmax;
+        joy->min[ 2 ] = ( float )joy->pJoystick.jsCaps.wZmin;
+        joy->max[ 2 ] = ( float )joy->pJoystick.jsCaps.wZmax;
+        joy->min[ 1 ] = ( float )joy->pJoystick.jsCaps.wYmin;
+        joy->max[ 1 ] = ( float )joy->pJoystick.jsCaps.wYmax;
+        joy->min[ 0 ] = ( float )joy->pJoystick.jsCaps.wXmin;
+        joy->max[ 0 ] = ( float )joy->pJoystick.jsCaps.wXmax;
+    }
+
+    /* Guess all the rest judging on the axes extremals */
+    for( i = 0; i < joy->num_axes; i++ )
+    {
+        joy->center   [ i ] = ( joy->max[ i ] + joy->min[ i ] ) * 0.5f;
+        joy->dead_band[ i ] = 0.0f;
+        joy->saturate [ i ] = 1.0f;
+    }
+}
+
+
+
+void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )
+{
+    switch( ident )
+    {
+    case 0:
+        fgJoystick[ ident ]->pJoystick.js_id = JOYSTICKID1;
+        fgJoystick[ ident ]->error = GL_FALSE;
+        break;
+    case 1:
+        fgJoystick[ ident ]->pJoystick.js_id = JOYSTICKID2;
+        fgJoystick[ ident ]->error = GL_FALSE;
+        break;
+    default:
+        fgJoystick[ ident ]->num_axes = 0;
+        fgJoystick[ ident ]->error = GL_TRUE;
+        return;
+    }
+}
+
+
+
+void fgPlatformJoystickClose ( int ident )
+{
+    /* Do nothing special */
+}
+#endif
+
index 8ea57b0..290f161 100644 (file)
-/*\r
- * freeglut_main_mswin.c\r
- *\r
- * The Windows-specific mouse cursor related stuff.\r
- *\r
- * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
- * Written by John F. Fay, <fayjf@sourceforge.net>\r
- * Creation date: Sat Jan 21, 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-\r
-extern void fghRedrawWindow ( SFG_Window *window );\r
-\r
-extern void fgNewWGLCreateContext( SFG_Window* window );\r
-extern GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,\r
-                                     unsigned char layer_type );\r
-\r
-#ifdef WM_TOUCH\r
-typedef BOOL (WINAPI *pGetTouchInputInfo)(HTOUCHINPUT,UINT,PTOUCHINPUT,int);\r
-typedef BOOL (WINAPI *pCloseTouchInputHandle)(HTOUCHINPUT);\r
-static pGetTouchInputInfo fghGetTouchInputInfo = (pGetTouchInputInfo)0xDEADBEEF;\r
-static pCloseTouchInputHandle fghCloseTouchInputHandle = (pCloseTouchInputHandle)0xDEADBEEF;\r
-#endif\r
-\r
-/* \r
- * Helper functions for getting client area from the window rect\r
- * and the window rect from the client area given the style of the window\r
- * (or a valid window pointer from which the style can be queried).\r
- */\r
-extern void fghComputeWindowRectFromClientArea_QueryWindow( const SFG_Window *window, RECT *clientRect, BOOL posIsOutside );\r
-extern RECT fghGetClientArea                              ( const SFG_Window *window,                   BOOL wantPosOutside );\r
-\r
-\r
-void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height )\r
-{\r
-    RECT windowRect;\r
-\r
-    /*\r
-     * For windowed mode, get the current position of the\r
-     * window and resize taking the size of the frame\r
-     * decorations into account.\r
-     */\r
-\r
-    /* "GetWindowRect" returns the pixel coordinates of the outside of the window */\r
-    GetWindowRect( window->Window.Handle, &windowRect );\r
-\r
-    /* Create rect in FreeGLUT format, (X,Y) topleft outside window, WxH of client area */\r
-    windowRect.right    = windowRect.left+width;\r
-    windowRect.bottom   = windowRect.top+height;\r
-\r
-    if (window->Parent == NULL)\r
-        /* get the window rect from this to feed to SetWindowPos, correct for window decorations */\r
-        fghComputeWindowRectFromClientArea_QueryWindow(window,&windowRect,TRUE);\r
-    else\r
-    {\r
-        /* correct rect for position client area of parent window\r
-         * (SetWindowPos input for child windows is in coordinates\r
-         * relative to the parent's client area).\r
-         * Child windows don't have decoration, so no need to correct\r
-         * for them.\r
-         */\r
-        RECT parentRect;\r
-        parentRect = fghGetClientArea( window->Parent, FALSE );\r
-        windowRect.left   -= parentRect.left;\r
-        windowRect.right  -= parentRect.left;\r
-        windowRect.top    -= parentRect.top;\r
-        windowRect.bottom -= parentRect.top;\r
-    }\r
-    \r
-    /* Do the actual resizing */\r
-    SetWindowPos( window->Window.Handle,\r
-                  HWND_TOP,\r
-                  windowRect.left, windowRect.top,\r
-                  windowRect.right - windowRect.left,\r
-                  windowRect.bottom- windowRect.top,\r
-                  SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING |\r
-                  SWP_NOZORDER\r
-    );\r
-}\r
-\r
-\r
-void fgPlatformDisplayWindow ( SFG_Window *window )\r
-{\r
-    RedrawWindow(\r
-        window->Window.Handle, NULL, NULL,\r
-        RDW_NOERASE | RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_UPDATENOW\r
-    );\r
-}\r
-\r
-\r
-unsigned long fgPlatformSystemTime ( void )\r
-{\r
-#if defined(_WIN32_WCE)\r
-    return GetTickCount();\r
-#else\r
-    return timeGetTime();\r
-#endif\r
-}\r
-\r
-\r
-void fgPlatformSleepForEvents( long msec )\r
-{\r
-    MsgWaitForMultipleObjects( 0, NULL, FALSE, msec, QS_ALLINPUT );\r
-}\r
-\r
-\r
-void fgPlatformProcessSingleEvent ( void )\r
-{\r
-    MSG stMsg;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMainLoopEvent" );\r
-\r
-    while( PeekMessage( &stMsg, NULL, 0, 0, PM_NOREMOVE ) )\r
-    {\r
-        if( GetMessage( &stMsg, NULL, 0, 0 ) == 0 )\r
-        {\r
-            if( fgState.ActionOnWindowClose == GLUT_ACTION_EXIT )\r
-            {\r
-                fgDeinitialize( );\r
-                exit( 0 );\r
-            }\r
-            else if( fgState.ActionOnWindowClose == GLUT_ACTION_GLUTMAINLOOP_RETURNS )\r
-                fgState.ExecState = GLUT_EXEC_STATE_STOP;\r
-\r
-            return;\r
-        }\r
-\r
-        TranslateMessage( &stMsg );\r
-        DispatchMessage( &stMsg );\r
-    }\r
-}\r
-\r
-\r
-\r
-void fgPlatformMainLoopPreliminaryWork ( void )\r
-{\r
-    SFG_Window *window = (SFG_Window *)fgStructure.Windows.First ;\r
-\r
-    /*\r
-     * Processing before the main loop:  If there is a window which is open and\r
-     * which has a visibility callback, call it.  I know this is an ugly hack,\r
-     * but I'm not sure what else to do about it.  Ideally we should leave\r
-     * something uninitialized in the create window code and initialize it in\r
-     * the main loop, and have that initialization create a "WM_ACTIVATE"\r
-     * message.  Then we would put the visibility callback code in the\r
-     * "case WM_ACTIVATE" block below.         - John Fay -- 10/24/02\r
-     */\r
-    while( window )\r
-    {\r
-        if ( FETCH_WCB( *window, Visibility ) )\r
-        {\r
-            SFG_Window *current_window = fgStructure.CurrentWindow ;\r
-\r
-            INVOKE_WCB( *window, Visibility, ( window->State.Visible ) );\r
-            fgSetWindow( current_window );\r
-        }\r
-\r
-        window = (SFG_Window *)window->Node.Next ;\r
-    }\r
-}\r
-\r
-\r
-/*\r
- * Determine a GLUT modifer mask based on MS-WINDOWS system info.\r
- */\r
-static int fgPlatformGetModifiers (void)\r
-{\r
-    return\r
-        ( ( ( GetKeyState( VK_LSHIFT   ) < 0 ) ||\r
-            ( GetKeyState( VK_RSHIFT   ) < 0 )) ? GLUT_ACTIVE_SHIFT : 0 ) |\r
-        ( ( ( GetKeyState( VK_LCONTROL ) < 0 ) ||\r
-            ( GetKeyState( VK_RCONTROL ) < 0 )) ? GLUT_ACTIVE_CTRL  : 0 ) |\r
-        ( ( ( GetKeyState( VK_LMENU    ) < 0 ) ||\r
-            ( GetKeyState( VK_RMENU    ) < 0 )) ? GLUT_ACTIVE_ALT   : 0 );\r
-}\r
-\r
-/*\r
- * The window procedure for handling Win32 events\r
- */\r
-LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,\r
-                                       LPARAM lParam )\r
-{\r
-    static unsigned char lControl = 0, rControl = 0, lShift = 0,\r
-                         rShift = 0, lAlt = 0, rAlt = 0;\r
-\r
-    SFG_Window* window;\r
-    PAINTSTRUCT ps;\r
-    LRESULT lRet = 1;\r
-\r
-    FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Event Handler" ) ;\r
-\r
-    window = fgWindowByHandle( hWnd );\r
-\r
-    if ( ( window == NULL ) && ( uMsg != WM_CREATE ) )\r
-      return DefWindowProc( hWnd, uMsg, wParam, lParam );\r
-\r
-    /* printf ( "Window %3d message <%04x> %12d %12d\n", window?window->ID:0,\r
-             uMsg, wParam, lParam ); */\r
-\r
-    if ( window )\r
-    {\r
-      /* Checking for CTRL, ALT, and SHIFT key positions:  Key Down! */\r
-      if ( !lControl && GetAsyncKeyState ( VK_LCONTROL ) )\r
-      {\r
-          INVOKE_WCB   ( *window, Special,\r
-                        ( GLUT_KEY_CTRL_L, window->State.MouseX, window->State.MouseY )\r
-                      );\r
-\r
-          lControl = 1;\r
-      }\r
-\r
-      if ( !rControl && GetAsyncKeyState ( VK_RCONTROL ) )\r
-      {\r
-          INVOKE_WCB ( *window, Special,\r
-                       ( GLUT_KEY_CTRL_R, window->State.MouseX, window->State.MouseY )\r
-                     );\r
-\r
-          rControl = 1;\r
-      }\r
-\r
-      if ( !lShift && GetAsyncKeyState ( VK_LSHIFT ) )\r
-      {\r
-          INVOKE_WCB ( *window, Special,\r
-                       ( GLUT_KEY_SHIFT_L, window->State.MouseX, window->State.MouseY )\r
-                     );\r
-\r
-          lShift = 1;\r
-      }\r
-\r
-      if ( !rShift && GetAsyncKeyState ( VK_RSHIFT ) )\r
-      {\r
-          INVOKE_WCB ( *window, Special,\r
-                       ( GLUT_KEY_SHIFT_R, window->State.MouseX, window->State.MouseY )\r
-                     );\r
-\r
-          rShift = 1;\r
-      }\r
-\r
-      if ( !lAlt && GetAsyncKeyState ( VK_LMENU ) )\r
-      {\r
-          INVOKE_WCB ( *window, Special,\r
-                       ( GLUT_KEY_ALT_L, window->State.MouseX, window->State.MouseY )\r
-                     );\r
-\r
-          lAlt = 1;\r
-      }\r
-\r
-      if ( !rAlt && GetAsyncKeyState ( VK_RMENU ) )\r
-      {\r
-          INVOKE_WCB ( *window, Special,\r
-                       ( GLUT_KEY_ALT_R, window->State.MouseX, window->State.MouseY )\r
-                     );\r
-\r
-          rAlt = 1;\r
-      }\r
-\r
-      /* Checking for CTRL, ALT, and SHIFT key positions:  Key Up! */\r
-      if ( lControl && !GetAsyncKeyState ( VK_LCONTROL ) )\r
-      {\r
-          INVOKE_WCB ( *window, SpecialUp,\r
-                       ( GLUT_KEY_CTRL_L, window->State.MouseX, window->State.MouseY )\r
-                     );\r
-\r
-          lControl = 0;\r
-      }\r
-\r
-      if ( rControl && !GetAsyncKeyState ( VK_RCONTROL ) )\r
-      {\r
-          INVOKE_WCB ( *window, SpecialUp,\r
-                       ( GLUT_KEY_CTRL_R, window->State.MouseX, window->State.MouseY )\r
-                     );\r
-\r
-          rControl = 0;\r
-      }\r
-\r
-      if ( lShift && !GetAsyncKeyState ( VK_LSHIFT ) )\r
-      {\r
-          INVOKE_WCB ( *window, SpecialUp,\r
-                       ( GLUT_KEY_SHIFT_L, window->State.MouseX, window->State.MouseY )\r
-                     );\r
-\r
-          lShift = 0;\r
-      }\r
-\r
-      if ( rShift && !GetAsyncKeyState ( VK_RSHIFT ) )\r
-      {\r
-          INVOKE_WCB ( *window, SpecialUp,\r
-                       ( GLUT_KEY_SHIFT_R, window->State.MouseX, window->State.MouseY )\r
-                     );\r
-\r
-          rShift = 0;\r
-      }\r
-\r
-      if ( lAlt && !GetAsyncKeyState ( VK_LMENU ) )\r
-      {\r
-          INVOKE_WCB ( *window, SpecialUp,\r
-                       ( GLUT_KEY_ALT_L, window->State.MouseX, window->State.MouseY )\r
-                     );\r
-\r
-          lAlt = 0;\r
-      }\r
-\r
-      if ( rAlt && !GetAsyncKeyState ( VK_RMENU ) )\r
-      {\r
-          INVOKE_WCB ( *window, SpecialUp,\r
-                       ( GLUT_KEY_ALT_R, window->State.MouseX, window->State.MouseY )\r
-                     );\r
-\r
-          rAlt = 0;\r
-      }\r
-    }\r
-\r
-    switch( uMsg )\r
-    {\r
-    case WM_CREATE:\r
-        /* The window structure is passed as the creation structure parameter... */\r
-        window = (SFG_Window *) (((LPCREATESTRUCT) lParam)->lpCreateParams);\r
-        FREEGLUT_INTERNAL_ERROR_EXIT ( ( window != NULL ), "Cannot create window",\r
-                                       "fgPlatformWindowProc" );\r
-\r
-        window->Window.Handle = hWnd;\r
-        window->Window.pContext.Device = GetDC( hWnd );\r
-        if( window->IsMenu )\r
-        {\r
-            unsigned int current_DisplayMode = fgState.DisplayMode;\r
-            fgState.DisplayMode = GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH;\r
-#if !defined(_WIN32_WCE)\r
-            fgSetupPixelFormat( window, GL_FALSE, PFD_MAIN_PLANE );\r
-#endif\r
-            fgState.DisplayMode = current_DisplayMode;\r
-\r
-            if( fgStructure.MenuContext )\r
-                wglMakeCurrent( window->Window.pContext.Device,\r
-                                fgStructure.MenuContext->MContext\r
-                );\r
-            else\r
-            {\r
-                fgStructure.MenuContext =\r
-                    (SFG_MenuContext *)malloc( sizeof(SFG_MenuContext) );\r
-                fgStructure.MenuContext->MContext =\r
-                    wglCreateContext( window->Window.pContext.Device );\r
-            }\r
-\r
-            /* window->Window.Context = wglGetCurrentContext ();   */\r
-            window->Window.Context = wglCreateContext( window->Window.pContext.Device );\r
-        }\r
-        else\r
-        {\r
-#if !defined(_WIN32_WCE)\r
-            fgSetupPixelFormat( window, GL_FALSE, PFD_MAIN_PLANE );\r
-#endif\r
-\r
-            if( ! fgState.UseCurrentContext )\r
-                window->Window.Context =\r
-                    wglCreateContext( window->Window.pContext.Device );\r
-            else\r
-            {\r
-                window->Window.Context = wglGetCurrentContext( );\r
-                if( ! window->Window.Context )\r
-                    window->Window.Context =\r
-                        wglCreateContext( window->Window.pContext.Device );\r
-            }\r
-\r
-#if !defined(_WIN32_WCE)\r
-            fgNewWGLCreateContext( window );\r
-#endif\r
-        }\r
-\r
-        window->State.NeedToResize = GL_TRUE;\r
-        /* if we used CW_USEDEFAULT (thats a negative value) for the size\r
-         * of the window, query the window now for the size at which it\r
-         * was created.\r
-         */\r
-        if( ( window->State.Width < 0 ) || ( window->State.Height < 0 ) )\r
-        {\r
-            SFG_Window *current_window = fgStructure.CurrentWindow;\r
-\r
-            fgSetWindow( window );\r
-            window->State.Width = glutGet( GLUT_WINDOW_WIDTH );\r
-            window->State.Height = glutGet( GLUT_WINDOW_HEIGHT );\r
-            fgSetWindow( current_window );\r
-        }\r
-\r
-        ReleaseDC( window->Window.Handle, window->Window.pContext.Device );\r
-\r
-#if defined(_WIN32_WCE)\r
-        /* Take over button handling */\r
-        {\r
-            HINSTANCE dxDllLib=LoadLibrary(_T("gx.dll"));\r
-            if (dxDllLib)\r
-            {\r
-                GXGetDefaultKeys_=(GXGETDEFAULTKEYS)GetProcAddress(dxDllLib, _T("?GXGetDefaultKeys@@YA?AUGXKeyList@@H@Z"));\r
-                GXOpenInput_=(GXOPENINPUT)GetProcAddress(dxDllLib, _T("?GXOpenInput@@YAHXZ"));\r
-            }\r
-\r
-            if(GXOpenInput_)\r
-                (*GXOpenInput_)();\r
-            if(GXGetDefaultKeys_)\r
-                gxKeyList = (*GXGetDefaultKeys_)(GX_LANDSCAPEKEYS);\r
-        }\r
-\r
-#endif /* defined(_WIN32_WCE) */\r
-        break;\r
-\r
-    case WM_SIZE:\r
-        /*\r
-         * If the window is visible, then it is the user manually resizing it.\r
-         * If it is not, then it is the system sending us a dummy resize with\r
-         * zero dimensions on a "glutIconifyWindow" call.\r
-         */\r
-        if( window->State.Visible )\r
-        {\r
-            window->State.NeedToResize = GL_TRUE;\r
-#if defined(_WIN32_WCE)\r
-            window->State.Width  = HIWORD(lParam);\r
-            window->State.Height = LOWORD(lParam);\r
-#else\r
-            window->State.Width  = LOWORD(lParam);\r
-            window->State.Height = HIWORD(lParam);\r
-#endif /* defined(_WIN32_WCE) */\r
-        }\r
-\r
-        break;\r
-\r
-    case WM_SETFOCUS:\r
-/*        printf("WM_SETFOCUS: %p\n", window ); */\r
-        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );\r
-        INVOKE_WCB( *window, Entry, ( GLUT_ENTERED ) );\r
-\r
-               UpdateWindow ( hWnd );\r
-        break;\r
-\r
-    case WM_KILLFOCUS:\r
-/*        printf("WM_KILLFOCUS: %p\n", window ); */\r
-        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );\r
-        INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) );\r
-\r
-        if( window->IsMenu &&\r
-            window->ActiveMenu && window->ActiveMenu->IsActive )\r
-            fgUpdateMenuHighlight( window->ActiveMenu );\r
-\r
-        break;\r
-\r
-#if 0\r
-    case WM_ACTIVATE:\r
-        if (LOWORD(wParam) != WA_INACTIVE)\r
-        {\r
-/*            printf("WM_ACTIVATE: fgSetCursor( %p, %d)\n", window,\r
-                   window->State.Cursor ); */\r
-            fgSetCursor( window, window->State.Cursor );\r
-        }\r
-\r
-        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );\r
-        break;\r
-#endif\r
-\r
-    case WM_SETCURSOR:\r
-/*      printf ( "Cursor event %x %x %x %x\n", window, window->State.Cursor, lParam, wParam ) ; */\r
-        if( LOWORD( lParam ) == HTCLIENT )\r
-            fgSetCursor ( window, window->State.Cursor ) ;\r
-        else\r
-            lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );\r
-        break;\r
-\r
-    case WM_SHOWWINDOW:\r
-        window->State.Visible = GL_TRUE;\r
-        window->State.Redisplay = GL_TRUE;\r
-        break;\r
-\r
-    case WM_PAINT:\r
-        /* Turn on the visibility in case it was turned off somehow */\r
-        window->State.Visible = GL_TRUE;\r
-        BeginPaint( hWnd, &ps );\r
-        fghRedrawWindow( window );\r
-        EndPaint( hWnd, &ps );\r
-        break;\r
-\r
-    case WM_CLOSE:\r
-        fgDestroyWindow ( window );\r
-        if ( fgState.ActionOnWindowClose != GLUT_ACTION_CONTINUE_EXECUTION )\r
-            PostQuitMessage(0);\r
-        break;\r
-\r
-    case WM_DESTROY:\r
-        /*\r
-         * The window already got destroyed, so don't bother with it.\r
-         */\r
-        return 0;\r
-\r
-    case WM_MOUSEMOVE:\r
-    {\r
-#if defined(_WIN32_WCE)\r
-        window->State.MouseX = 320-HIWORD( lParam );\r
-        window->State.MouseY = LOWORD( lParam );\r
-#else\r
-        window->State.MouseX = LOWORD( lParam );\r
-        window->State.MouseY = HIWORD( lParam );\r
-#endif /* defined(_WIN32_WCE) */\r
-        /* Restrict to [-32768, 32767] to match X11 behaviour       */\r
-        /* See comment in "freeglut_developer" mailing list 10/4/04 */\r
-        if ( window->State.MouseX > 32767 ) window->State.MouseX -= 65536;\r
-        if ( window->State.MouseY > 32767 ) window->State.MouseY -= 65536;\r
-\r
-        if ( window->ActiveMenu )\r
-        {\r
-            fgUpdateMenuHighlight( window->ActiveMenu );\r
-            break;\r
-        }\r
-        SetFocus(window->Window.Handle);\r
-\r
-        fgState.Modifiers = fgPlatformGetModifiers( );\r
-\r
-        if( ( wParam & MK_LBUTTON ) ||\r
-            ( wParam & MK_MBUTTON ) ||\r
-            ( wParam & MK_RBUTTON ) )\r
-            INVOKE_WCB( *window, Motion, ( window->State.MouseX,\r
-                                           window->State.MouseY ) );\r
-        else\r
-            INVOKE_WCB( *window, Passive, ( window->State.MouseX,\r
-                                            window->State.MouseY ) );\r
-\r
-        fgState.Modifiers = INVALID_MODIFIERS;\r
-    }\r
-    break;\r
-\r
-    case WM_LBUTTONDOWN:\r
-    case WM_MBUTTONDOWN:\r
-    case WM_RBUTTONDOWN:\r
-    case WM_LBUTTONUP:\r
-    case WM_MBUTTONUP:\r
-    case WM_RBUTTONUP:\r
-    {\r
-        GLboolean pressed = GL_TRUE;\r
-        int button;\r
-\r
-#if defined(_WIN32_WCE)\r
-        window->State.MouseX = 320-HIWORD( lParam );\r
-        window->State.MouseY = LOWORD( lParam );\r
-#else\r
-        window->State.MouseX = LOWORD( lParam );\r
-        window->State.MouseY = HIWORD( lParam );\r
-#endif /* defined(_WIN32_WCE) */\r
-\r
-        /* Restrict to [-32768, 32767] to match X11 behaviour       */\r
-        /* See comment in "freeglut_developer" mailing list 10/4/04 */\r
-        if ( window->State.MouseX > 32767 ) window->State.MouseX -= 65536;\r
-        if ( window->State.MouseY > 32767 ) window->State.MouseY -= 65536;\r
-\r
-        switch( uMsg )\r
-        {\r
-        case WM_LBUTTONDOWN:\r
-            pressed = GL_TRUE;\r
-            button = GLUT_LEFT_BUTTON;\r
-            break;\r
-        case WM_MBUTTONDOWN:\r
-            pressed = GL_TRUE;\r
-            button = GLUT_MIDDLE_BUTTON;\r
-            break;\r
-        case WM_RBUTTONDOWN:\r
-            pressed = GL_TRUE;\r
-            button = GLUT_RIGHT_BUTTON;\r
-            break;\r
-        case WM_LBUTTONUP:\r
-            pressed = GL_FALSE;\r
-            button = GLUT_LEFT_BUTTON;\r
-            break;\r
-        case WM_MBUTTONUP:\r
-            pressed = GL_FALSE;\r
-            button = GLUT_MIDDLE_BUTTON;\r
-            break;\r
-        case WM_RBUTTONUP:\r
-            pressed = GL_FALSE;\r
-            button = GLUT_RIGHT_BUTTON;\r
-            break;\r
-        default:\r
-            pressed = GL_FALSE;\r
-            button = -1;\r
-            break;\r
-        }\r
-\r
-#if !defined(_WIN32_WCE)\r
-        if( GetSystemMetrics( SM_SWAPBUTTON ) )\r
-        {\r
-            if( button == GLUT_LEFT_BUTTON )\r
-                button = GLUT_RIGHT_BUTTON;\r
-            else\r
-                if( button == GLUT_RIGHT_BUTTON )\r
-                    button = GLUT_LEFT_BUTTON;\r
-        }\r
-#endif /* !defined(_WIN32_WCE) */\r
-\r
-        if( button == -1 )\r
-            return DefWindowProc( hWnd, uMsg, lParam, wParam );\r
-\r
-        /*\r
-         * Do not execute the application's mouse callback if a menu\r
-         * is hooked to this button.  In that case an appropriate\r
-         * private call should be generated.\r
-         */\r
-        if( fgCheckActiveMenu( window, button, pressed,\r
-                               window->State.MouseX, window->State.MouseY ) )\r
-            break;\r
-\r
-        /* Set capture so that the window captures all the mouse messages */\r
-        /*\r
-         * XXX - Multiple button support:  Under X11, the mouse is not released\r
-         * XXX - from the window until all buttons have been released, even if the\r
-         * XXX - user presses a button in another window.  This will take more\r
-         * XXX - code changes than I am up to at the moment (10/5/04).  The present\r
-         * XXX - is a 90 percent solution.\r
-         */\r
-        if ( pressed == GL_TRUE )\r
-          SetCapture ( window->Window.Handle ) ;\r
-        else\r
-          ReleaseCapture () ;\r
-\r
-        if( ! FETCH_WCB( *window, Mouse ) )\r
-            break;\r
-\r
-        fgSetWindow( window );\r
-        fgState.Modifiers = fgPlatformGetModifiers( );\r
-\r
-        INVOKE_WCB(\r
-            *window, Mouse,\r
-            ( button,\r
-              pressed ? GLUT_DOWN : GLUT_UP,\r
-              window->State.MouseX,\r
-              window->State.MouseY\r
-            )\r
-        );\r
-\r
-        fgState.Modifiers = INVALID_MODIFIERS;\r
-    }\r
-    break;\r
-\r
-    case 0x020a:\r
-        /* Should be WM_MOUSEWHEEL but my compiler doesn't recognize it */\r
-    {\r
-        int wheel_number = LOWORD( wParam );\r
-        short ticks = ( short )HIWORD( wParam );\r
-               fgState.MouseWheelTicks += ticks;\r
-\r
-        /*\r
-         * XXX Should use WHEEL_DELTA instead of 120\r
-         */\r
-               if ( abs ( fgState.MouseWheelTicks ) > 120 )\r
-               {\r
-                       int direction = ( fgState.MouseWheelTicks > 0 ) ? 1 : -1;\r
-\r
-            if( ! FETCH_WCB( *window, MouseWheel ) &&\r
-                ! FETCH_WCB( *window, Mouse ) )\r
-                break;\r
-\r
-            fgSetWindow( window );\r
-            fgState.Modifiers = fgPlatformGetModifiers( );\r
-\r
-            /*\r
-             * XXX Should use WHEEL_DELTA instead of 120\r
-             */\r
-            while( abs ( fgState.MouseWheelTicks ) > 120 )\r
-                       {\r
-                if( FETCH_WCB( *window, MouseWheel ) )\r
-                    INVOKE_WCB( *window, MouseWheel,\r
-                                ( wheel_number,\r
-                                  direction,\r
-                                  window->State.MouseX,\r
-                                  window->State.MouseY\r
-                                )\r
-                    );\r
-                else  /* No mouse wheel, call the mouse button callback twice */\r
-                               {\r
-                    /*\r
-                     * Map wheel zero to button 3 and 4; +1 to 3, -1 to 4\r
-                     *  "    "   one                     +1 to 5, -1 to 6, ...\r
-                     *\r
-                     * XXX The below assumes that you have no more than 3 mouse\r
-                     * XXX buttons.  Sorry.\r
-                     */\r
-                    int button = wheel_number * 2 + 3;\r
-                    if( direction < 0 )\r
-                        ++button;\r
-                    INVOKE_WCB( *window, Mouse,\r
-                                ( button, GLUT_DOWN,\r
-                                  window->State.MouseX, window->State.MouseY )\r
-                    );\r
-                    INVOKE_WCB( *window, Mouse,\r
-                                ( button, GLUT_UP,\r
-                                  window->State.MouseX, window->State.MouseY )\r
-                    );\r
-                               }\r
-\r
-                /*\r
-                 * XXX Should use WHEEL_DELTA instead of 120\r
-                 */\r
-                               fgState.MouseWheelTicks -= 120 * direction;\r
-                       }\r
-\r
-            fgState.Modifiers = INVALID_MODIFIERS;\r
-               }\r
-    }\r
-    break ;\r
-\r
-    case WM_SYSKEYDOWN:\r
-    case WM_KEYDOWN:\r
-    {\r
-        int keypress = -1;\r
-        POINT mouse_pos ;\r
-\r
-        if( ( fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE ) && (HIWORD(lParam) & KF_REPEAT) )\r
-            break;\r
-\r
-        /*\r
-         * Remember the current modifiers state. This is done here in order\r
-         * to make sure the VK_DELETE keyboard callback is executed properly.\r
-         */\r
-        fgState.Modifiers = fgPlatformGetModifiers( );\r
-\r
-        GetCursorPos( &mouse_pos );\r
-        ScreenToClient( window->Window.Handle, &mouse_pos );\r
-\r
-        window->State.MouseX = mouse_pos.x;\r
-        window->State.MouseY = mouse_pos.y;\r
-\r
-        /* Convert the Win32 keystroke codes to GLUTtish way */\r
-#       define KEY(a,b) case a: keypress = b; break;\r
-\r
-        switch( wParam )\r
-        {\r
-            KEY( VK_F1,     GLUT_KEY_F1        );\r
-            KEY( VK_F2,     GLUT_KEY_F2        );\r
-            KEY( VK_F3,     GLUT_KEY_F3        );\r
-            KEY( VK_F4,     GLUT_KEY_F4        );\r
-            KEY( VK_F5,     GLUT_KEY_F5        );\r
-            KEY( VK_F6,     GLUT_KEY_F6        );\r
-            KEY( VK_F7,     GLUT_KEY_F7        );\r
-            KEY( VK_F8,     GLUT_KEY_F8        );\r
-            KEY( VK_F9,     GLUT_KEY_F9        );\r
-            KEY( VK_F10,    GLUT_KEY_F10       );\r
-            KEY( VK_F11,    GLUT_KEY_F11       );\r
-            KEY( VK_F12,    GLUT_KEY_F12       );\r
-            KEY( VK_PRIOR,  GLUT_KEY_PAGE_UP   );\r
-            KEY( VK_NEXT,   GLUT_KEY_PAGE_DOWN );\r
-            KEY( VK_HOME,   GLUT_KEY_HOME      );\r
-            KEY( VK_END,    GLUT_KEY_END       );\r
-            KEY( VK_LEFT,   GLUT_KEY_LEFT      );\r
-            KEY( VK_UP,     GLUT_KEY_UP        );\r
-            KEY( VK_RIGHT,  GLUT_KEY_RIGHT     );\r
-            KEY( VK_DOWN,   GLUT_KEY_DOWN      );\r
-            KEY( VK_INSERT, GLUT_KEY_INSERT    );\r
-            KEY( VK_LCONTROL, GLUT_KEY_CTRL_L  );\r
-            KEY( VK_RCONTROL, GLUT_KEY_CTRL_R  );\r
-            KEY( VK_LSHIFT, GLUT_KEY_SHIFT_L   );\r
-            KEY( VK_RSHIFT, GLUT_KEY_SHIFT_R   );\r
-            KEY( VK_LMENU,  GLUT_KEY_ALT_L     );\r
-            KEY( VK_RMENU,  GLUT_KEY_ALT_R     );\r
-\r
-        case VK_DELETE:\r
-            /* The delete key should be treated as an ASCII keypress: */\r
-            INVOKE_WCB( *window, Keyboard,\r
-                        ( 127, window->State.MouseX, window->State.MouseY )\r
-            );\r
-        }\r
-\r
-#if defined(_WIN32_WCE)\r
-        if(!(lParam & 0x40000000)) /* Prevent auto-repeat */\r
-        {\r
-            if(wParam==(unsigned)gxKeyList.vkRight)\r
-                keypress = GLUT_KEY_RIGHT;\r
-            else if(wParam==(unsigned)gxKeyList.vkLeft)\r
-                keypress = GLUT_KEY_LEFT;\r
-            else if(wParam==(unsigned)gxKeyList.vkUp)\r
-                keypress = GLUT_KEY_UP;\r
-            else if(wParam==(unsigned)gxKeyList.vkDown)\r
-                keypress = GLUT_KEY_DOWN;\r
-            else if(wParam==(unsigned)gxKeyList.vkA)\r
-                keypress = GLUT_KEY_F1;\r
-            else if(wParam==(unsigned)gxKeyList.vkB)\r
-                keypress = GLUT_KEY_F2;\r
-            else if(wParam==(unsigned)gxKeyList.vkC)\r
-                keypress = GLUT_KEY_F3;\r
-            else if(wParam==(unsigned)gxKeyList.vkStart)\r
-                keypress = GLUT_KEY_F4;\r
-        }\r
-#endif\r
-\r
-        if( keypress != -1 )\r
-            INVOKE_WCB( *window, Special,\r
-                        ( keypress,\r
-                          window->State.MouseX, window->State.MouseY )\r
-            );\r
-\r
-        fgState.Modifiers = INVALID_MODIFIERS;\r
-    }\r
-    break;\r
-\r
-    case WM_SYSKEYUP:\r
-    case WM_KEYUP:\r
-    {\r
-        int keypress = -1;\r
-        POINT mouse_pos;\r
-\r
-        /*\r
-         * Remember the current modifiers state. This is done here in order\r
-         * to make sure the VK_DELETE keyboard callback is executed properly.\r
-         */\r
-        fgState.Modifiers = fgPlatformGetModifiers( );\r
-\r
-        GetCursorPos( &mouse_pos );\r
-        ScreenToClient( window->Window.Handle, &mouse_pos );\r
-\r
-        window->State.MouseX = mouse_pos.x;\r
-        window->State.MouseY = mouse_pos.y;\r
-\r
-        /*\r
-         * Convert the Win32 keystroke codes to GLUTtish way.\r
-         * "KEY(a,b)" was defined under "WM_KEYDOWN"\r
-         */\r
-\r
-        switch( wParam )\r
-        {\r
-            KEY( VK_F1,     GLUT_KEY_F1        );\r
-            KEY( VK_F2,     GLUT_KEY_F2        );\r
-            KEY( VK_F3,     GLUT_KEY_F3        );\r
-            KEY( VK_F4,     GLUT_KEY_F4        );\r
-            KEY( VK_F5,     GLUT_KEY_F5        );\r
-            KEY( VK_F6,     GLUT_KEY_F6        );\r
-            KEY( VK_F7,     GLUT_KEY_F7        );\r
-            KEY( VK_F8,     GLUT_KEY_F8        );\r
-            KEY( VK_F9,     GLUT_KEY_F9        );\r
-            KEY( VK_F10,    GLUT_KEY_F10       );\r
-            KEY( VK_F11,    GLUT_KEY_F11       );\r
-            KEY( VK_F12,    GLUT_KEY_F12       );\r
-            KEY( VK_PRIOR,  GLUT_KEY_PAGE_UP   );\r
-            KEY( VK_NEXT,   GLUT_KEY_PAGE_DOWN );\r
-            KEY( VK_HOME,   GLUT_KEY_HOME      );\r
-            KEY( VK_END,    GLUT_KEY_END       );\r
-            KEY( VK_LEFT,   GLUT_KEY_LEFT      );\r
-            KEY( VK_UP,     GLUT_KEY_UP        );\r
-            KEY( VK_RIGHT,  GLUT_KEY_RIGHT     );\r
-            KEY( VK_DOWN,   GLUT_KEY_DOWN      );\r
-            KEY( VK_INSERT, GLUT_KEY_INSERT    );\r
-            KEY( VK_LCONTROL, GLUT_KEY_CTRL_L  );\r
-            KEY( VK_RCONTROL, GLUT_KEY_CTRL_R  );\r
-            KEY( VK_LSHIFT, GLUT_KEY_SHIFT_L   );\r
-            KEY( VK_RSHIFT, GLUT_KEY_SHIFT_R   );\r
-            KEY( VK_LMENU,  GLUT_KEY_ALT_L     );\r
-            KEY( VK_RMENU,  GLUT_KEY_ALT_R     );\r
-\r
-          case VK_DELETE:\r
-              /* The delete key should be treated as an ASCII keypress: */\r
-              INVOKE_WCB( *window, KeyboardUp,\r
-                          ( 127, window->State.MouseX, window->State.MouseY )\r
-              );\r
-              break;\r
-\r
-        default:\r
-        {\r
-#if !defined(_WIN32_WCE)\r
-            BYTE state[ 256 ];\r
-            WORD code[ 2 ];\r
-\r
-            GetKeyboardState( state );\r
-\r
-            if( ToAscii( (UINT)wParam, 0, state, code, 0 ) == 1 )\r
-                wParam=code[ 0 ];\r
-\r
-            INVOKE_WCB( *window, KeyboardUp,\r
-                        ( (char)wParam,\r
-                          window->State.MouseX, window->State.MouseY )\r
-            );\r
-#endif /* !defined(_WIN32_WCE) */\r
-        }\r
-        }\r
-\r
-        if( keypress != -1 )\r
-            INVOKE_WCB( *window, SpecialUp,\r
-                        ( keypress,\r
-                          window->State.MouseX, window->State.MouseY )\r
-            );\r
-\r
-        fgState.Modifiers = INVALID_MODIFIERS;\r
-    }\r
-    break;\r
-\r
-    case WM_SYSCHAR:\r
-    case WM_CHAR:\r
-    {\r
-      if( (fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE) && (HIWORD(lParam) & KF_REPEAT) )\r
-            break;\r
-\r
-        fgState.Modifiers = fgPlatformGetModifiers( );\r
-        INVOKE_WCB( *window, Keyboard,\r
-                    ( (char)wParam,\r
-                      window->State.MouseX, window->State.MouseY )\r
-        );\r
-        fgState.Modifiers = INVALID_MODIFIERS;\r
-    }\r
-    break;\r
-\r
-    case WM_CAPTURECHANGED:\r
-        /* User has finished resizing the window, force a redraw */\r
-        INVOKE_WCB( *window, Display, ( ) );\r
-\r
-        /*lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); */\r
-        break;\r
-\r
-        /* Other messages that I have seen and which are not handled already */\r
-    case WM_SETTEXT:  /* 0x000c */\r
-        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );\r
-        /* Pass it on to "DefWindowProc" to set the window text */\r
-        break;\r
-\r
-    case WM_GETTEXT:  /* 0x000d */\r
-        /* Ideally we would copy the title of the window into "lParam" */\r
-        /* strncpy ( (char *)lParam, "Window Title", wParam );\r
-           lRet = ( wParam > 12 ) ? 12 : wParam;  */\r
-        /* the number of characters copied */\r
-        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );\r
-        break;\r
-\r
-    case WM_GETTEXTLENGTH:  /* 0x000e */\r
-        /* Ideally we would get the length of the title of the window */\r
-        lRet = 12;\r
-        /* the number of characters in "Window Title\0" (see above) */\r
-        break;\r
-\r
-    case WM_ERASEBKGND:  /* 0x0014 */\r
-        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );\r
-        break;\r
-\r
-#if !defined(_WIN32_WCE)\r
-    case WM_SYNCPAINT:  /* 0x0088 */\r
-        /* Another window has moved, need to update this one */\r
-        window->State.Redisplay = GL_TRUE;\r
-        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );\r
-        /* Help screen says this message must be passed to "DefWindowProc" */\r
-        break;\r
-\r
-    case WM_NCPAINT:  /* 0x0085 */\r
-      /* Need to update the border of this window */\r
-        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );\r
-        /* Pass it on to "DefWindowProc" to repaint a standard border */\r
-        break;\r
-\r
-    case WM_SYSCOMMAND :  /* 0x0112 */\r
-        {\r
-          /*\r
-           * We have received a system command message.  Try to act on it.\r
-           * The commands are passed in through the "wParam" parameter:\r
-           * The least significant digit seems to be which edge of the window\r
-           * is being used for a resize event:\r
-           *     4  3  5\r
-           *     1     2\r
-           *     7  6  8\r
-           * Congratulations and thanks to Richard Rauch for figuring this out..\r
-           */\r
-            switch ( wParam & 0xfff0 )\r
-            {\r
-            case SC_SIZE       :\r
-                break ;\r
-\r
-            case SC_MOVE       :\r
-                break ;\r
-\r
-            case SC_MINIMIZE   :\r
-                /* User has clicked on the "-" to minimize the window */\r
-                /* Turn off the visibility */\r
-                window->State.Visible = GL_FALSE ;\r
-\r
-                break ;\r
-\r
-            case SC_MAXIMIZE   :\r
-                break ;\r
-\r
-            case SC_NEXTWINDOW :\r
-                break ;\r
-\r
-            case SC_PREVWINDOW :\r
-                break ;\r
-\r
-            case SC_CLOSE      :\r
-                /* Followed very closely by a WM_CLOSE message */\r
-                break ;\r
-\r
-            case SC_VSCROLL    :\r
-                break ;\r
-\r
-            case SC_HSCROLL    :\r
-                break ;\r
-\r
-            case SC_MOUSEMENU  :\r
-                break ;\r
-\r
-            case SC_KEYMENU    :\r
-                break ;\r
-\r
-            case SC_ARRANGE    :\r
-                break ;\r
-\r
-            case SC_RESTORE    :\r
-                break ;\r
-\r
-            case SC_TASKLIST   :\r
-                break ;\r
-\r
-            case SC_SCREENSAVE :\r
-                break ;\r
-\r
-            case SC_HOTKEY     :\r
-                break ;\r
-\r
-#if(WINVER >= 0x0400)\r
-            case SC_DEFAULT    :\r
-                break ;\r
-\r
-            case SC_MONITORPOWER    :\r
-                break ;\r
-\r
-            case SC_CONTEXTHELP    :\r
-                break ;\r
-#endif /* WINVER >= 0x0400 */\r
-\r
-            default:\r
-#if _DEBUG\r
-                fgWarning( "Unknown wParam type 0x%x", wParam );\r
-#endif\r
-                break;\r
-            }\r
-        }\r
-#endif /* !defined(_WIN32_WCE) */\r
-\r
-        /* We need to pass the message on to the operating system as well */\r
-        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );\r
-        break;\r
-\r
-#ifdef WM_TOUCH\r
-       /* handle multi-touch messages */\r
-       case WM_TOUCH:\r
-       {\r
-               unsigned int numInputs = (unsigned int)wParam;\r
-               unsigned int i = 0;\r
-               TOUCHINPUT* ti = (TOUCHINPUT*)malloc( sizeof(TOUCHINPUT)*numInputs);\r
-\r
-               if (fghGetTouchInputInfo == (pGetTouchInputInfo)0xDEADBEEF) {\r
-                   fghGetTouchInputInfo = (pGetTouchInputInfo)GetProcAddress(GetModuleHandle("user32"),"GetTouchInputInfo");\r
-                   fghCloseTouchInputHandle = (pCloseTouchInputHandle)GetProcAddress(GetModuleHandle("user32"),"CloseTouchInputHandle");\r
-               }\r
-\r
-               if (!fghGetTouchInputInfo) { \r
-                       free( (void*)ti );\r
-                       break;\r
-               }\r
-\r
-               if (fghGetTouchInputInfo( (HTOUCHINPUT)lParam, numInputs, ti, sizeof(TOUCHINPUT) )) {\r
-                       /* Handle each contact point */\r
-                       for (i = 0; i < numInputs; ++i ) {\r
-\r
-                               POINT tp;\r
-                               tp.x = TOUCH_COORD_TO_PIXEL(ti[i].x);\r
-                               tp.y = TOUCH_COORD_TO_PIXEL(ti[i].y);\r
-                               ScreenToClient( hWnd, &tp );\r
-\r
-                               ti[i].dwID = ti[i].dwID * 2;\r
-\r
-                               if (ti[i].dwFlags & TOUCHEVENTF_DOWN) {\r
-                                       INVOKE_WCB( *window, MultiEntry,  ( ti[i].dwID, GLUT_ENTERED ) );\r
-                                       INVOKE_WCB( *window, MultiButton, ( ti[i].dwID, tp.x, tp.y, 0, GLUT_DOWN ) );\r
-                               } else if (ti[i].dwFlags & TOUCHEVENTF_MOVE) {\r
-                                       INVOKE_WCB( *window, MultiMotion, ( ti[i].dwID, tp.x, tp.y ) );\r
-                               } else if (ti[i].dwFlags & TOUCHEVENTF_UP)   { \r
-                                       INVOKE_WCB( *window, MultiButton, ( ti[i].dwID, tp.x, tp.y, 0, GLUT_UP ) );\r
-                                       INVOKE_WCB( *window, MultiEntry,  ( ti[i].dwID, GLUT_LEFT ) );\r
-                               }\r
-                       }\r
-               }\r
-               fghCloseTouchInputHandle((HTOUCHINPUT)lParam);\r
-               free( (void*)ti );\r
-               lRet = 0; /*DefWindowProc( hWnd, uMsg, wParam, lParam );*/\r
-               break;\r
-       }\r
-#endif\r
-    default:\r
-        /* Handle unhandled messages */\r
-        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );\r
-        break;\r
-    }\r
-\r
-    return lRet;\r
-}\r
+/*
+ * freeglut_main_mswin.c
+ *
+ * The Windows-specific mouse cursor related stuff.
+ *
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
+ * Written by John F. Fay, <fayjf@sourceforge.net>
+ * Creation date: Sat Jan 21, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+
+extern void fghRedrawWindow ( SFG_Window *window );
+
+extern void fgNewWGLCreateContext( SFG_Window* window );
+extern GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
+                                     unsigned char layer_type );
+
+#ifdef WM_TOUCH
+typedef BOOL (WINAPI *pGetTouchInputInfo)(HTOUCHINPUT,UINT,PTOUCHINPUT,int);
+typedef BOOL (WINAPI *pCloseTouchInputHandle)(HTOUCHINPUT);
+static pGetTouchInputInfo fghGetTouchInputInfo = (pGetTouchInputInfo)0xDEADBEEF;
+static pCloseTouchInputHandle fghCloseTouchInputHandle = (pCloseTouchInputHandle)0xDEADBEEF;
+#endif
+
+/* 
+ * Helper functions for getting client area from the window rect
+ * and the window rect from the client area given the style of the window
+ * (or a valid window pointer from which the style can be queried).
+ */
+extern void fghComputeWindowRectFromClientArea_QueryWindow( const SFG_Window *window, RECT *clientRect, BOOL posIsOutside );
+extern RECT fghGetClientArea                              ( const SFG_Window *window,                   BOOL wantPosOutside );
+
+
+void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height )
+{
+    RECT windowRect;
+
+    /*
+     * For windowed mode, get the current position of the
+     * window and resize taking the size of the frame
+     * decorations into account.
+     */
+
+    /* "GetWindowRect" returns the pixel coordinates of the outside of the window */
+    GetWindowRect( window->Window.Handle, &windowRect );
+
+    /* Create rect in FreeGLUT format, (X,Y) topleft outside window, WxH of client area */
+    windowRect.right    = windowRect.left+width;
+    windowRect.bottom   = windowRect.top+height;
+
+    if (window->Parent == NULL)
+        /* get the window rect from this to feed to SetWindowPos, correct for window decorations */
+        fghComputeWindowRectFromClientArea_QueryWindow(window,&windowRect,TRUE);
+    else
+    {
+        /* correct rect for position client area of parent window
+         * (SetWindowPos input for child windows is in coordinates
+         * relative to the parent's client area).
+         * Child windows don't have decoration, so no need to correct
+         * for them.
+         */
+        RECT parentRect;
+        parentRect = fghGetClientArea( window->Parent, FALSE );
+        windowRect.left   -= parentRect.left;
+        windowRect.right  -= parentRect.left;
+        windowRect.top    -= parentRect.top;
+        windowRect.bottom -= parentRect.top;
+    }
+    
+    /* Do the actual resizing */
+    SetWindowPos( window->Window.Handle,
+                  HWND_TOP,
+                  windowRect.left, windowRect.top,
+                  windowRect.right - windowRect.left,
+                  windowRect.bottom- windowRect.top,
+                  SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING |
+                  SWP_NOZORDER
+    );
+}
+
+
+void fgPlatformDisplayWindow ( SFG_Window *window )
+{
+    RedrawWindow(
+        window->Window.Handle, NULL, NULL,
+        RDW_NOERASE | RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_UPDATENOW
+    );
+}
+
+
+unsigned long fgPlatformSystemTime ( void )
+{
+#if defined(_WIN32_WCE)
+    return GetTickCount();
+#else
+    return timeGetTime();
+#endif
+}
+
+
+void fgPlatformSleepForEvents( long msec )
+{
+    MsgWaitForMultipleObjects( 0, NULL, FALSE, msec, QS_ALLINPUT );
+}
+
+
+void fgPlatformProcessSingleEvent ( void )
+{
+    MSG stMsg;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMainLoopEvent" );
+
+    while( PeekMessage( &stMsg, NULL, 0, 0, PM_NOREMOVE ) )
+    {
+        if( GetMessage( &stMsg, NULL, 0, 0 ) == 0 )
+        {
+            if( fgState.ActionOnWindowClose == GLUT_ACTION_EXIT )
+            {
+                fgDeinitialize( );
+                exit( 0 );
+            }
+            else if( fgState.ActionOnWindowClose == GLUT_ACTION_GLUTMAINLOOP_RETURNS )
+                fgState.ExecState = GLUT_EXEC_STATE_STOP;
+
+            return;
+        }
+
+        TranslateMessage( &stMsg );
+        DispatchMessage( &stMsg );
+    }
+}
+
+
+
+void fgPlatformMainLoopPreliminaryWork ( void )
+{
+    SFG_Window *window = (SFG_Window *)fgStructure.Windows.First ;
+
+    /*
+     * Processing before the main loop:  If there is a window which is open and
+     * which has a visibility callback, call it.  I know this is an ugly hack,
+     * but I'm not sure what else to do about it.  Ideally we should leave
+     * something uninitialized in the create window code and initialize it in
+     * the main loop, and have that initialization create a "WM_ACTIVATE"
+     * message.  Then we would put the visibility callback code in the
+     * "case WM_ACTIVATE" block below.         - John Fay -- 10/24/02
+     */
+    while( window )
+    {
+        if ( FETCH_WCB( *window, Visibility ) )
+        {
+            SFG_Window *current_window = fgStructure.CurrentWindow ;
+
+            INVOKE_WCB( *window, Visibility, ( window->State.Visible ) );
+            fgSetWindow( current_window );
+        }
+
+        window = (SFG_Window *)window->Node.Next ;
+    }
+}
+
+
+/*
+ * Determine a GLUT modifer mask based on MS-WINDOWS system info.
+ */
+static int fgPlatformGetModifiers (void)
+{
+    return
+        ( ( ( GetKeyState( VK_LSHIFT   ) < 0 ) ||
+            ( GetKeyState( VK_RSHIFT   ) < 0 )) ? GLUT_ACTIVE_SHIFT : 0 ) |
+        ( ( ( GetKeyState( VK_LCONTROL ) < 0 ) ||
+            ( GetKeyState( VK_RCONTROL ) < 0 )) ? GLUT_ACTIVE_CTRL  : 0 ) |
+        ( ( ( GetKeyState( VK_LMENU    ) < 0 ) ||
+            ( GetKeyState( VK_RMENU    ) < 0 )) ? GLUT_ACTIVE_ALT   : 0 );
+}
+
+/*
+ * The window procedure for handling Win32 events
+ */
+LRESULT CALLBACK fgPlatformWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam,
+                                       LPARAM lParam )
+{
+    static unsigned char lControl = 0, rControl = 0, lShift = 0,
+                         rShift = 0, lAlt = 0, rAlt = 0;
+
+    SFG_Window* window;
+    PAINTSTRUCT ps;
+    LRESULT lRet = 1;
+
+    FREEGLUT_INTERNAL_ERROR_EXIT_IF_NOT_INITIALISED ( "Event Handler" ) ;
+
+    window = fgWindowByHandle( hWnd );
+
+    if ( ( window == NULL ) && ( uMsg != WM_CREATE ) )
+      return DefWindowProc( hWnd, uMsg, wParam, lParam );
+
+    /* printf ( "Window %3d message <%04x> %12d %12d\n", window?window->ID:0,
+             uMsg, wParam, lParam ); */
+
+    if ( window )
+    {
+      /* Checking for CTRL, ALT, and SHIFT key positions:  Key Down! */
+      if ( !lControl && GetAsyncKeyState ( VK_LCONTROL ) )
+      {
+          INVOKE_WCB   ( *window, Special,
+                        ( GLUT_KEY_CTRL_L, window->State.MouseX, window->State.MouseY )
+                      );
+
+          lControl = 1;
+      }
+
+      if ( !rControl && GetAsyncKeyState ( VK_RCONTROL ) )
+      {
+          INVOKE_WCB ( *window, Special,
+                       ( GLUT_KEY_CTRL_R, window->State.MouseX, window->State.MouseY )
+                     );
+
+          rControl = 1;
+      }
+
+      if ( !lShift && GetAsyncKeyState ( VK_LSHIFT ) )
+      {
+          INVOKE_WCB ( *window, Special,
+                       ( GLUT_KEY_SHIFT_L, window->State.MouseX, window->State.MouseY )
+                     );
+
+          lShift = 1;
+      }
+
+      if ( !rShift && GetAsyncKeyState ( VK_RSHIFT ) )
+      {
+          INVOKE_WCB ( *window, Special,
+                       ( GLUT_KEY_SHIFT_R, window->State.MouseX, window->State.MouseY )
+                     );
+
+          rShift = 1;
+      }
+
+      if ( !lAlt && GetAsyncKeyState ( VK_LMENU ) )
+      {
+          INVOKE_WCB ( *window, Special,
+                       ( GLUT_KEY_ALT_L, window->State.MouseX, window->State.MouseY )
+                     );
+
+          lAlt = 1;
+      }
+
+      if ( !rAlt && GetAsyncKeyState ( VK_RMENU ) )
+      {
+          INVOKE_WCB ( *window, Special,
+                       ( GLUT_KEY_ALT_R, window->State.MouseX, window->State.MouseY )
+                     );
+
+          rAlt = 1;
+      }
+
+      /* Checking for CTRL, ALT, and SHIFT key positions:  Key Up! */
+      if ( lControl && !GetAsyncKeyState ( VK_LCONTROL ) )
+      {
+          INVOKE_WCB ( *window, SpecialUp,
+                       ( GLUT_KEY_CTRL_L, window->State.MouseX, window->State.MouseY )
+                     );
+
+          lControl = 0;
+      }
+
+      if ( rControl && !GetAsyncKeyState ( VK_RCONTROL ) )
+      {
+          INVOKE_WCB ( *window, SpecialUp,
+                       ( GLUT_KEY_CTRL_R, window->State.MouseX, window->State.MouseY )
+                     );
+
+          rControl = 0;
+      }
+
+      if ( lShift && !GetAsyncKeyState ( VK_LSHIFT ) )
+      {
+          INVOKE_WCB ( *window, SpecialUp,
+                       ( GLUT_KEY_SHIFT_L, window->State.MouseX, window->State.MouseY )
+                     );
+
+          lShift = 0;
+      }
+
+      if ( rShift && !GetAsyncKeyState ( VK_RSHIFT ) )
+      {
+          INVOKE_WCB ( *window, SpecialUp,
+                       ( GLUT_KEY_SHIFT_R, window->State.MouseX, window->State.MouseY )
+                     );
+
+          rShift = 0;
+      }
+
+      if ( lAlt && !GetAsyncKeyState ( VK_LMENU ) )
+      {
+          INVOKE_WCB ( *window, SpecialUp,
+                       ( GLUT_KEY_ALT_L, window->State.MouseX, window->State.MouseY )
+                     );
+
+          lAlt = 0;
+      }
+
+      if ( rAlt && !GetAsyncKeyState ( VK_RMENU ) )
+      {
+          INVOKE_WCB ( *window, SpecialUp,
+                       ( GLUT_KEY_ALT_R, window->State.MouseX, window->State.MouseY )
+                     );
+
+          rAlt = 0;
+      }
+    }
+
+    switch( uMsg )
+    {
+    case WM_CREATE:
+        /* The window structure is passed as the creation structure parameter... */
+        window = (SFG_Window *) (((LPCREATESTRUCT) lParam)->lpCreateParams);
+        FREEGLUT_INTERNAL_ERROR_EXIT ( ( window != NULL ), "Cannot create window",
+                                       "fgPlatformWindowProc" );
+
+        window->Window.Handle = hWnd;
+        window->Window.pContext.Device = GetDC( hWnd );
+        if( window->IsMenu )
+        {
+            unsigned int current_DisplayMode = fgState.DisplayMode;
+            fgState.DisplayMode = GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH;
+#if !defined(_WIN32_WCE)
+            fgSetupPixelFormat( window, GL_FALSE, PFD_MAIN_PLANE );
+#endif
+            fgState.DisplayMode = current_DisplayMode;
+
+            if( fgStructure.MenuContext )
+                wglMakeCurrent( window->Window.pContext.Device,
+                                fgStructure.MenuContext->MContext
+                );
+            else
+            {
+                fgStructure.MenuContext =
+                    (SFG_MenuContext *)malloc( sizeof(SFG_MenuContext) );
+                fgStructure.MenuContext->MContext =
+                    wglCreateContext( window->Window.pContext.Device );
+            }
+
+            /* window->Window.Context = wglGetCurrentContext ();   */
+            window->Window.Context = wglCreateContext( window->Window.pContext.Device );
+        }
+        else
+        {
+#if !defined(_WIN32_WCE)
+            fgSetupPixelFormat( window, GL_FALSE, PFD_MAIN_PLANE );
+#endif
+
+            if( ! fgState.UseCurrentContext )
+                window->Window.Context =
+                    wglCreateContext( window->Window.pContext.Device );
+            else
+            {
+                window->Window.Context = wglGetCurrentContext( );
+                if( ! window->Window.Context )
+                    window->Window.Context =
+                        wglCreateContext( window->Window.pContext.Device );
+            }
+
+#if !defined(_WIN32_WCE)
+            fgNewWGLCreateContext( window );
+#endif
+        }
+
+        window->State.NeedToResize = GL_TRUE;
+        /* if we used CW_USEDEFAULT (thats a negative value) for the size
+         * of the window, query the window now for the size at which it
+         * was created.
+         */
+        if( ( window->State.Width < 0 ) || ( window->State.Height < 0 ) )
+        {
+            SFG_Window *current_window = fgStructure.CurrentWindow;
+
+            fgSetWindow( window );
+            window->State.Width = glutGet( GLUT_WINDOW_WIDTH );
+            window->State.Height = glutGet( GLUT_WINDOW_HEIGHT );
+            fgSetWindow( current_window );
+        }
+
+        ReleaseDC( window->Window.Handle, window->Window.pContext.Device );
+
+#if defined(_WIN32_WCE)
+        /* Take over button handling */
+        {
+            HINSTANCE dxDllLib=LoadLibrary(_T("gx.dll"));
+            if (dxDllLib)
+            {
+                GXGetDefaultKeys_=(GXGETDEFAULTKEYS)GetProcAddress(dxDllLib, _T("?GXGetDefaultKeys@@YA?AUGXKeyList@@H@Z"));
+                GXOpenInput_=(GXOPENINPUT)GetProcAddress(dxDllLib, _T("?GXOpenInput@@YAHXZ"));
+            }
+
+            if(GXOpenInput_)
+                (*GXOpenInput_)();
+            if(GXGetDefaultKeys_)
+                gxKeyList = (*GXGetDefaultKeys_)(GX_LANDSCAPEKEYS);
+        }
+
+#endif /* defined(_WIN32_WCE) */
+        break;
+
+    case WM_SIZE:
+        /*
+         * If the window is visible, then it is the user manually resizing it.
+         * If it is not, then it is the system sending us a dummy resize with
+         * zero dimensions on a "glutIconifyWindow" call.
+         */
+        if( window->State.Visible )
+        {
+            window->State.NeedToResize = GL_TRUE;
+#if defined(_WIN32_WCE)
+            window->State.Width  = HIWORD(lParam);
+            window->State.Height = LOWORD(lParam);
+#else
+            window->State.Width  = LOWORD(lParam);
+            window->State.Height = HIWORD(lParam);
+#endif /* defined(_WIN32_WCE) */
+        }
+
+        break;
+
+    case WM_SETFOCUS:
+/*        printf("WM_SETFOCUS: %p\n", window ); */
+        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
+        INVOKE_WCB( *window, Entry, ( GLUT_ENTERED ) );
+
+               UpdateWindow ( hWnd );
+        break;
+
+    case WM_KILLFOCUS:
+/*        printf("WM_KILLFOCUS: %p\n", window ); */
+        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
+        INVOKE_WCB( *window, Entry, ( GLUT_LEFT ) );
+
+        if( window->IsMenu &&
+            window->ActiveMenu && window->ActiveMenu->IsActive )
+            fgUpdateMenuHighlight( window->ActiveMenu );
+
+        break;
+
+#if 0
+    case WM_ACTIVATE:
+        if (LOWORD(wParam) != WA_INACTIVE)
+        {
+/*            printf("WM_ACTIVATE: fgSetCursor( %p, %d)\n", window,
+                   window->State.Cursor ); */
+            fgSetCursor( window, window->State.Cursor );
+        }
+
+        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
+        break;
+#endif
+
+    case WM_SETCURSOR:
+/*      printf ( "Cursor event %x %x %x %x\n", window, window->State.Cursor, lParam, wParam ) ; */
+        if( LOWORD( lParam ) == HTCLIENT )
+            fgSetCursor ( window, window->State.Cursor ) ;
+        else
+            lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
+        break;
+
+    case WM_SHOWWINDOW:
+        window->State.Visible = GL_TRUE;
+        window->State.Redisplay = GL_TRUE;
+        break;
+
+    case WM_PAINT:
+        /* Turn on the visibility in case it was turned off somehow */
+        window->State.Visible = GL_TRUE;
+        BeginPaint( hWnd, &ps );
+        fghRedrawWindow( window );
+        EndPaint( hWnd, &ps );
+        break;
+
+    case WM_CLOSE:
+        fgDestroyWindow ( window );
+        if ( fgState.ActionOnWindowClose != GLUT_ACTION_CONTINUE_EXECUTION )
+            PostQuitMessage(0);
+        break;
+
+    case WM_DESTROY:
+        /*
+         * The window already got destroyed, so don't bother with it.
+         */
+        return 0;
+
+    case WM_MOUSEMOVE:
+    {
+#if defined(_WIN32_WCE)
+        window->State.MouseX = 320-HIWORD( lParam );
+        window->State.MouseY = LOWORD( lParam );
+#else
+        window->State.MouseX = LOWORD( lParam );
+        window->State.MouseY = HIWORD( lParam );
+#endif /* defined(_WIN32_WCE) */
+        /* Restrict to [-32768, 32767] to match X11 behaviour       */
+        /* See comment in "freeglut_developer" mailing list 10/4/04 */
+        if ( window->State.MouseX > 32767 ) window->State.MouseX -= 65536;
+        if ( window->State.MouseY > 32767 ) window->State.MouseY -= 65536;
+
+        if ( window->ActiveMenu )
+        {
+            fgUpdateMenuHighlight( window->ActiveMenu );
+            break;
+        }
+        SetFocus(window->Window.Handle);
+
+        fgState.Modifiers = fgPlatformGetModifiers( );
+
+        if( ( wParam & MK_LBUTTON ) ||
+            ( wParam & MK_MBUTTON ) ||
+            ( wParam & MK_RBUTTON ) )
+            INVOKE_WCB( *window, Motion, ( window->State.MouseX,
+                                           window->State.MouseY ) );
+        else
+            INVOKE_WCB( *window, Passive, ( window->State.MouseX,
+                                            window->State.MouseY ) );
+
+        fgState.Modifiers = INVALID_MODIFIERS;
+    }
+    break;
+
+    case WM_LBUTTONDOWN:
+    case WM_MBUTTONDOWN:
+    case WM_RBUTTONDOWN:
+    case WM_LBUTTONUP:
+    case WM_MBUTTONUP:
+    case WM_RBUTTONUP:
+    {
+        GLboolean pressed = GL_TRUE;
+        int button;
+
+#if defined(_WIN32_WCE)
+        window->State.MouseX = 320-HIWORD( lParam );
+        window->State.MouseY = LOWORD( lParam );
+#else
+        window->State.MouseX = LOWORD( lParam );
+        window->State.MouseY = HIWORD( lParam );
+#endif /* defined(_WIN32_WCE) */
+
+        /* Restrict to [-32768, 32767] to match X11 behaviour       */
+        /* See comment in "freeglut_developer" mailing list 10/4/04 */
+        if ( window->State.MouseX > 32767 ) window->State.MouseX -= 65536;
+        if ( window->State.MouseY > 32767 ) window->State.MouseY -= 65536;
+
+        switch( uMsg )
+        {
+        case WM_LBUTTONDOWN:
+            pressed = GL_TRUE;
+            button = GLUT_LEFT_BUTTON;
+            break;
+        case WM_MBUTTONDOWN:
+            pressed = GL_TRUE;
+            button = GLUT_MIDDLE_BUTTON;
+            break;
+        case WM_RBUTTONDOWN:
+            pressed = GL_TRUE;
+            button = GLUT_RIGHT_BUTTON;
+            break;
+        case WM_LBUTTONUP:
+            pressed = GL_FALSE;
+            button = GLUT_LEFT_BUTTON;
+            break;
+        case WM_MBUTTONUP:
+            pressed = GL_FALSE;
+            button = GLUT_MIDDLE_BUTTON;
+            break;
+        case WM_RBUTTONUP:
+            pressed = GL_FALSE;
+            button = GLUT_RIGHT_BUTTON;
+            break;
+        default:
+            pressed = GL_FALSE;
+            button = -1;
+            break;
+        }
+
+#if !defined(_WIN32_WCE)
+        if( GetSystemMetrics( SM_SWAPBUTTON ) )
+        {
+            if( button == GLUT_LEFT_BUTTON )
+                button = GLUT_RIGHT_BUTTON;
+            else
+                if( button == GLUT_RIGHT_BUTTON )
+                    button = GLUT_LEFT_BUTTON;
+        }
+#endif /* !defined(_WIN32_WCE) */
+
+        if( button == -1 )
+            return DefWindowProc( hWnd, uMsg, lParam, wParam );
+
+        /*
+         * Do not execute the application's mouse callback if a menu
+         * is hooked to this button.  In that case an appropriate
+         * private call should be generated.
+         */
+        if( fgCheckActiveMenu( window, button, pressed,
+                               window->State.MouseX, window->State.MouseY ) )
+            break;
+
+        /* Set capture so that the window captures all the mouse messages */
+        /*
+         * XXX - Multiple button support:  Under X11, the mouse is not released
+         * XXX - from the window until all buttons have been released, even if the
+         * XXX - user presses a button in another window.  This will take more
+         * XXX - code changes than I am up to at the moment (10/5/04).  The present
+         * XXX - is a 90 percent solution.
+         */
+        if ( pressed == GL_TRUE )
+          SetCapture ( window->Window.Handle ) ;
+        else
+          ReleaseCapture () ;
+
+        if( ! FETCH_WCB( *window, Mouse ) )
+            break;
+
+        fgSetWindow( window );
+        fgState.Modifiers = fgPlatformGetModifiers( );
+
+        INVOKE_WCB(
+            *window, Mouse,
+            ( button,
+              pressed ? GLUT_DOWN : GLUT_UP,
+              window->State.MouseX,
+              window->State.MouseY
+            )
+        );
+
+        fgState.Modifiers = INVALID_MODIFIERS;
+    }
+    break;
+
+    case 0x020a:
+        /* Should be WM_MOUSEWHEEL but my compiler doesn't recognize it */
+    {
+        int wheel_number = LOWORD( wParam );
+        short ticks = ( short )HIWORD( wParam );
+               fgState.MouseWheelTicks += ticks;
+
+        /*
+         * XXX Should use WHEEL_DELTA instead of 120
+         */
+               if ( abs ( fgState.MouseWheelTicks ) > 120 )
+               {
+                       int direction = ( fgState.MouseWheelTicks > 0 ) ? 1 : -1;
+
+            if( ! FETCH_WCB( *window, MouseWheel ) &&
+                ! FETCH_WCB( *window, Mouse ) )
+                break;
+
+            fgSetWindow( window );
+            fgState.Modifiers = fgPlatformGetModifiers( );
+
+            /*
+             * XXX Should use WHEEL_DELTA instead of 120
+             */
+            while( abs ( fgState.MouseWheelTicks ) > 120 )
+                       {
+                if( FETCH_WCB( *window, MouseWheel ) )
+                    INVOKE_WCB( *window, MouseWheel,
+                                ( wheel_number,
+                                  direction,
+                                  window->State.MouseX,
+                                  window->State.MouseY
+                                )
+                    );
+                else  /* No mouse wheel, call the mouse button callback twice */
+                               {
+                    /*
+                     * Map wheel zero to button 3 and 4; +1 to 3, -1 to 4
+                     *  "    "   one                     +1 to 5, -1 to 6, ...
+                     *
+                     * XXX The below assumes that you have no more than 3 mouse
+                     * XXX buttons.  Sorry.
+                     */
+                    int button = wheel_number * 2 + 3;
+                    if( direction < 0 )
+                        ++button;
+                    INVOKE_WCB( *window, Mouse,
+                                ( button, GLUT_DOWN,
+                                  window->State.MouseX, window->State.MouseY )
+                    );
+                    INVOKE_WCB( *window, Mouse,
+                                ( button, GLUT_UP,
+                                  window->State.MouseX, window->State.MouseY )
+                    );
+                               }
+
+                /*
+                 * XXX Should use WHEEL_DELTA instead of 120
+                 */
+                               fgState.MouseWheelTicks -= 120 * direction;
+                       }
+
+            fgState.Modifiers = INVALID_MODIFIERS;
+               }
+    }
+    break ;
+
+    case WM_SYSKEYDOWN:
+    case WM_KEYDOWN:
+    {
+        int keypress = -1;
+        POINT mouse_pos ;
+
+        if( ( fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE ) && (HIWORD(lParam) & KF_REPEAT) )
+            break;
+
+        /*
+         * Remember the current modifiers state. This is done here in order
+         * to make sure the VK_DELETE keyboard callback is executed properly.
+         */
+        fgState.Modifiers = fgPlatformGetModifiers( );
+
+        GetCursorPos( &mouse_pos );
+        ScreenToClient( window->Window.Handle, &mouse_pos );
+
+        window->State.MouseX = mouse_pos.x;
+        window->State.MouseY = mouse_pos.y;
+
+        /* Convert the Win32 keystroke codes to GLUTtish way */
+#       define KEY(a,b) case a: keypress = b; break;
+
+        switch( wParam )
+        {
+            KEY( VK_F1,     GLUT_KEY_F1        );
+            KEY( VK_F2,     GLUT_KEY_F2        );
+            KEY( VK_F3,     GLUT_KEY_F3        );
+            KEY( VK_F4,     GLUT_KEY_F4        );
+            KEY( VK_F5,     GLUT_KEY_F5        );
+            KEY( VK_F6,     GLUT_KEY_F6        );
+            KEY( VK_F7,     GLUT_KEY_F7        );
+            KEY( VK_F8,     GLUT_KEY_F8        );
+            KEY( VK_F9,     GLUT_KEY_F9        );
+            KEY( VK_F10,    GLUT_KEY_F10       );
+            KEY( VK_F11,    GLUT_KEY_F11       );
+            KEY( VK_F12,    GLUT_KEY_F12       );
+            KEY( VK_PRIOR,  GLUT_KEY_PAGE_UP   );
+            KEY( VK_NEXT,   GLUT_KEY_PAGE_DOWN );
+            KEY( VK_HOME,   GLUT_KEY_HOME      );
+            KEY( VK_END,    GLUT_KEY_END       );
+            KEY( VK_LEFT,   GLUT_KEY_LEFT      );
+            KEY( VK_UP,     GLUT_KEY_UP        );
+            KEY( VK_RIGHT,  GLUT_KEY_RIGHT     );
+            KEY( VK_DOWN,   GLUT_KEY_DOWN      );
+            KEY( VK_INSERT, GLUT_KEY_INSERT    );
+            KEY( VK_LCONTROL, GLUT_KEY_CTRL_L  );
+            KEY( VK_RCONTROL, GLUT_KEY_CTRL_R  );
+            KEY( VK_LSHIFT, GLUT_KEY_SHIFT_L   );
+            KEY( VK_RSHIFT, GLUT_KEY_SHIFT_R   );
+            KEY( VK_LMENU,  GLUT_KEY_ALT_L     );
+            KEY( VK_RMENU,  GLUT_KEY_ALT_R     );
+
+        case VK_DELETE:
+            /* The delete key should be treated as an ASCII keypress: */
+            INVOKE_WCB( *window, Keyboard,
+                        ( 127, window->State.MouseX, window->State.MouseY )
+            );
+        }
+
+#if defined(_WIN32_WCE)
+        if(!(lParam & 0x40000000)) /* Prevent auto-repeat */
+        {
+            if(wParam==(unsigned)gxKeyList.vkRight)
+                keypress = GLUT_KEY_RIGHT;
+            else if(wParam==(unsigned)gxKeyList.vkLeft)
+                keypress = GLUT_KEY_LEFT;
+            else if(wParam==(unsigned)gxKeyList.vkUp)
+                keypress = GLUT_KEY_UP;
+            else if(wParam==(unsigned)gxKeyList.vkDown)
+                keypress = GLUT_KEY_DOWN;
+            else if(wParam==(unsigned)gxKeyList.vkA)
+                keypress = GLUT_KEY_F1;
+            else if(wParam==(unsigned)gxKeyList.vkB)
+                keypress = GLUT_KEY_F2;
+            else if(wParam==(unsigned)gxKeyList.vkC)
+                keypress = GLUT_KEY_F3;
+            else if(wParam==(unsigned)gxKeyList.vkStart)
+                keypress = GLUT_KEY_F4;
+        }
+#endif
+
+        if( keypress != -1 )
+            INVOKE_WCB( *window, Special,
+                        ( keypress,
+                          window->State.MouseX, window->State.MouseY )
+            );
+
+        fgState.Modifiers = INVALID_MODIFIERS;
+    }
+    break;
+
+    case WM_SYSKEYUP:
+    case WM_KEYUP:
+    {
+        int keypress = -1;
+        POINT mouse_pos;
+
+        /*
+         * Remember the current modifiers state. This is done here in order
+         * to make sure the VK_DELETE keyboard callback is executed properly.
+         */
+        fgState.Modifiers = fgPlatformGetModifiers( );
+
+        GetCursorPos( &mouse_pos );
+        ScreenToClient( window->Window.Handle, &mouse_pos );
+
+        window->State.MouseX = mouse_pos.x;
+        window->State.MouseY = mouse_pos.y;
+
+        /*
+         * Convert the Win32 keystroke codes to GLUTtish way.
+         * "KEY(a,b)" was defined under "WM_KEYDOWN"
+         */
+
+        switch( wParam )
+        {
+            KEY( VK_F1,     GLUT_KEY_F1        );
+            KEY( VK_F2,     GLUT_KEY_F2        );
+            KEY( VK_F3,     GLUT_KEY_F3        );
+            KEY( VK_F4,     GLUT_KEY_F4        );
+            KEY( VK_F5,     GLUT_KEY_F5        );
+            KEY( VK_F6,     GLUT_KEY_F6        );
+            KEY( VK_F7,     GLUT_KEY_F7        );
+            KEY( VK_F8,     GLUT_KEY_F8        );
+            KEY( VK_F9,     GLUT_KEY_F9        );
+            KEY( VK_F10,    GLUT_KEY_F10       );
+            KEY( VK_F11,    GLUT_KEY_F11       );
+            KEY( VK_F12,    GLUT_KEY_F12       );
+            KEY( VK_PRIOR,  GLUT_KEY_PAGE_UP   );
+            KEY( VK_NEXT,   GLUT_KEY_PAGE_DOWN );
+            KEY( VK_HOME,   GLUT_KEY_HOME      );
+            KEY( VK_END,    GLUT_KEY_END       );
+            KEY( VK_LEFT,   GLUT_KEY_LEFT      );
+            KEY( VK_UP,     GLUT_KEY_UP        );
+            KEY( VK_RIGHT,  GLUT_KEY_RIGHT     );
+            KEY( VK_DOWN,   GLUT_KEY_DOWN      );
+            KEY( VK_INSERT, GLUT_KEY_INSERT    );
+            KEY( VK_LCONTROL, GLUT_KEY_CTRL_L  );
+            KEY( VK_RCONTROL, GLUT_KEY_CTRL_R  );
+            KEY( VK_LSHIFT, GLUT_KEY_SHIFT_L   );
+            KEY( VK_RSHIFT, GLUT_KEY_SHIFT_R   );
+            KEY( VK_LMENU,  GLUT_KEY_ALT_L     );
+            KEY( VK_RMENU,  GLUT_KEY_ALT_R     );
+
+          case VK_DELETE:
+              /* The delete key should be treated as an ASCII keypress: */
+              INVOKE_WCB( *window, KeyboardUp,
+                          ( 127, window->State.MouseX, window->State.MouseY )
+              );
+              break;
+
+        default:
+        {
+#if !defined(_WIN32_WCE)
+            BYTE state[ 256 ];
+            WORD code[ 2 ];
+
+            GetKeyboardState( state );
+
+            if( ToAscii( (UINT)wParam, 0, state, code, 0 ) == 1 )
+                wParam=code[ 0 ];
+
+            INVOKE_WCB( *window, KeyboardUp,
+                        ( (char)wParam,
+                          window->State.MouseX, window->State.MouseY )
+            );
+#endif /* !defined(_WIN32_WCE) */
+        }
+        }
+
+        if( keypress != -1 )
+            INVOKE_WCB( *window, SpecialUp,
+                        ( keypress,
+                          window->State.MouseX, window->State.MouseY )
+            );
+
+        fgState.Modifiers = INVALID_MODIFIERS;
+    }
+    break;
+
+    case WM_SYSCHAR:
+    case WM_CHAR:
+    {
+      if( (fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE) && (HIWORD(lParam) & KF_REPEAT) )
+            break;
+
+        fgState.Modifiers = fgPlatformGetModifiers( );
+        INVOKE_WCB( *window, Keyboard,
+                    ( (char)wParam,
+                      window->State.MouseX, window->State.MouseY )
+        );
+        fgState.Modifiers = INVALID_MODIFIERS;
+    }
+    break;
+
+    case WM_CAPTURECHANGED:
+        /* User has finished resizing the window, force a redraw */
+        INVOKE_WCB( *window, Display, ( ) );
+
+        /*lRet = DefWindowProc( hWnd, uMsg, wParam, lParam ); */
+        break;
+
+        /* Other messages that I have seen and which are not handled already */
+    case WM_SETTEXT:  /* 0x000c */
+        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
+        /* Pass it on to "DefWindowProc" to set the window text */
+        break;
+
+    case WM_GETTEXT:  /* 0x000d */
+        /* Ideally we would copy the title of the window into "lParam" */
+        /* strncpy ( (char *)lParam, "Window Title", wParam );
+           lRet = ( wParam > 12 ) ? 12 : wParam;  */
+        /* the number of characters copied */
+        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
+        break;
+
+    case WM_GETTEXTLENGTH:  /* 0x000e */
+        /* Ideally we would get the length of the title of the window */
+        lRet = 12;
+        /* the number of characters in "Window Title\0" (see above) */
+        break;
+
+    case WM_ERASEBKGND:  /* 0x0014 */
+        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
+        break;
+
+#if !defined(_WIN32_WCE)
+    case WM_SYNCPAINT:  /* 0x0088 */
+        /* Another window has moved, need to update this one */
+        window->State.Redisplay = GL_TRUE;
+        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
+        /* Help screen says this message must be passed to "DefWindowProc" */
+        break;
+
+    case WM_NCPAINT:  /* 0x0085 */
+      /* Need to update the border of this window */
+        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
+        /* Pass it on to "DefWindowProc" to repaint a standard border */
+        break;
+
+    case WM_SYSCOMMAND :  /* 0x0112 */
+        {
+          /*
+           * We have received a system command message.  Try to act on it.
+           * The commands are passed in through the "wParam" parameter:
+           * The least significant digit seems to be which edge of the window
+           * is being used for a resize event:
+           *     4  3  5
+           *     1     2
+           *     7  6  8
+           * Congratulations and thanks to Richard Rauch for figuring this out..
+           */
+            switch ( wParam & 0xfff0 )
+            {
+            case SC_SIZE       :
+                break ;
+
+            case SC_MOVE       :
+                break ;
+
+            case SC_MINIMIZE   :
+                /* User has clicked on the "-" to minimize the window */
+                /* Turn off the visibility */
+                window->State.Visible = GL_FALSE ;
+
+                break ;
+
+            case SC_MAXIMIZE   :
+                break ;
+
+            case SC_NEXTWINDOW :
+                break ;
+
+            case SC_PREVWINDOW :
+                break ;
+
+            case SC_CLOSE      :
+                /* Followed very closely by a WM_CLOSE message */
+                break ;
+
+            case SC_VSCROLL    :
+                break ;
+
+            case SC_HSCROLL    :
+                break ;
+
+            case SC_MOUSEMENU  :
+                break ;
+
+            case SC_KEYMENU    :
+                break ;
+
+            case SC_ARRANGE    :
+                break ;
+
+            case SC_RESTORE    :
+                break ;
+
+            case SC_TASKLIST   :
+                break ;
+
+            case SC_SCREENSAVE :
+                break ;
+
+            case SC_HOTKEY     :
+                break ;
+
+#if(WINVER >= 0x0400)
+            case SC_DEFAULT    :
+                break ;
+
+            case SC_MONITORPOWER    :
+                break ;
+
+            case SC_CONTEXTHELP    :
+                break ;
+#endif /* WINVER >= 0x0400 */
+
+            default:
+#if _DEBUG
+                fgWarning( "Unknown wParam type 0x%x", wParam );
+#endif
+                break;
+            }
+        }
+#endif /* !defined(_WIN32_WCE) */
+
+        /* We need to pass the message on to the operating system as well */
+        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
+        break;
+
+#ifdef WM_TOUCH
+       /* handle multi-touch messages */
+       case WM_TOUCH:
+       {
+               unsigned int numInputs = (unsigned int)wParam;
+               unsigned int i = 0;
+               TOUCHINPUT* ti = (TOUCHINPUT*)malloc( sizeof(TOUCHINPUT)*numInputs);
+
+               if (fghGetTouchInputInfo == (pGetTouchInputInfo)0xDEADBEEF) {
+                   fghGetTouchInputInfo = (pGetTouchInputInfo)GetProcAddress(GetModuleHandle("user32"),"GetTouchInputInfo");
+                   fghCloseTouchInputHandle = (pCloseTouchInputHandle)GetProcAddress(GetModuleHandle("user32"),"CloseTouchInputHandle");
+               }
+
+               if (!fghGetTouchInputInfo) { 
+                       free( (void*)ti );
+                       break;
+               }
+
+               if (fghGetTouchInputInfo( (HTOUCHINPUT)lParam, numInputs, ti, sizeof(TOUCHINPUT) )) {
+                       /* Handle each contact point */
+                       for (i = 0; i < numInputs; ++i ) {
+
+                               POINT tp;
+                               tp.x = TOUCH_COORD_TO_PIXEL(ti[i].x);
+                               tp.y = TOUCH_COORD_TO_PIXEL(ti[i].y);
+                               ScreenToClient( hWnd, &tp );
+
+                               ti[i].dwID = ti[i].dwID * 2;
+
+                               if (ti[i].dwFlags & TOUCHEVENTF_DOWN) {
+                                       INVOKE_WCB( *window, MultiEntry,  ( ti[i].dwID, GLUT_ENTERED ) );
+                                       INVOKE_WCB( *window, MultiButton, ( ti[i].dwID, tp.x, tp.y, 0, GLUT_DOWN ) );
+                               } else if (ti[i].dwFlags & TOUCHEVENTF_MOVE) {
+                                       INVOKE_WCB( *window, MultiMotion, ( ti[i].dwID, tp.x, tp.y ) );
+                               } else if (ti[i].dwFlags & TOUCHEVENTF_UP)   { 
+                                       INVOKE_WCB( *window, MultiButton, ( ti[i].dwID, tp.x, tp.y, 0, GLUT_UP ) );
+                                       INVOKE_WCB( *window, MultiEntry,  ( ti[i].dwID, GLUT_LEFT ) );
+                               }
+                       }
+               }
+               fghCloseTouchInputHandle((HTOUCHINPUT)lParam);
+               free( (void*)ti );
+               lRet = 0; /*DefWindowProc( hWnd, uMsg, wParam, lParam );*/
+               break;
+       }
+#endif
+    default:
+        /* Handle unhandled messages */
+        lRet = DefWindowProc( hWnd, uMsg, wParam, lParam );
+        break;
+    }
+
+    return lRet;
+}
index e280624..b9c7797 100644 (file)
@@ -1,48 +1,48 @@
-/*\r
- * freeglut_menu_mswin.c\r
- *\r
- * The Windows-specific mouse cursor related stuff.\r
- *\r
- * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
- * Written by John F. Fay, <fayjf@sourceforge.net>\r
- * Creation date: Sun Jan 22, 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#define FREEGLUT_BUILDING_LIB\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-\r
-GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y )\r
-{\r
-    *x = glutGet ( GLUT_SCREEN_WIDTH );\r
-    *y = glutGet ( GLUT_SCREEN_HEIGHT );\r
-}\r
-\r
-\r
-\r
-/* -- PLATFORM-SPECIFIC INTERFACE FUNCTION -------------------------------------------------- */\r
-\r
-int FGAPIENTRY __glutCreateMenuWithExit( void(* callback)( int ), void (__cdecl *exit_function)(int) )\r
-{\r
-  __glutExitFunc = exit_function;\r
-  return glutCreateMenu( callback );\r
-}\r
-\r
+/*
+ * freeglut_menu_mswin.c
+ *
+ * The Windows-specific mouse cursor related stuff.
+ *
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
+ * Written by John F. Fay, <fayjf@sourceforge.net>
+ * Creation date: Sun Jan 22, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#define FREEGLUT_BUILDING_LIB
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+
+GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y )
+{
+    *x = glutGet ( GLUT_SCREEN_WIDTH );
+    *y = glutGet ( GLUT_SCREEN_HEIGHT );
+}
+
+
+
+/* -- PLATFORM-SPECIFIC INTERFACE FUNCTION -------------------------------------------------- */
+
+int FGAPIENTRY __glutCreateMenuWithExit( void(* callback)( int ), void (__cdecl *exit_function)(int) )
+{
+  __glutExitFunc = exit_function;
+  return glutCreateMenu( callback );
+}
+
index 72a8d8c..f2b41b3 100644 (file)
@@ -1,58 +1,58 @@
-/*\r
- * freeglut_spaceball_mswin.c\r
- *\r
- * Spaceball support for Windows\r
- *\r
- * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
- * Written by Evan Felix <karcaw at gmail.com>\r
- * Creation date: Sat Feb 4, 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-/*\r
- * This code is a very complicated way of doing nothing.  \r
- * But is needed for mswindows platform builds.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-void fgPlatformInitializeSpaceball(void)\r
-{\r
-       return;\r
-}\r
-\r
-void fgPlatformSpaceballClose(void)\r
-{\r
-       return;\r
-}\r
-\r
-int fgPlatformHasSpaceball(void)\r
-{\r
-       return 0;\r
-}\r
-\r
-int fgPlatformSpaceballNumButtons(void)\r
-{\r
-       return 0;\r
-}\r
-\r
-void fgPlatformSpaceballSetWindow(SFG_Window *window)\r
-{\r
-       return;\r
-}\r
+/*
+ * freeglut_spaceball_mswin.c
+ *
+ * Spaceball support for Windows
+ *
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
+ * Written by Evan Felix <karcaw at gmail.com>
+ * Creation date: Sat Feb 4, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+/*
+ * This code is a very complicated way of doing nothing.  
+ * But is needed for mswindows platform builds.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+void fgPlatformInitializeSpaceball(void)
+{
+       return;
+}
+
+void fgPlatformSpaceballClose(void)
+{
+       return;
+}
+
+int fgPlatformHasSpaceball(void)
+{
+       return 0;
+}
+
+int fgPlatformSpaceballNumButtons(void)
+{
+       return 0;
+}
+
+void fgPlatformSpaceballSetWindow(SFG_Window *window)
+{
+       return;
+}
index 3928579..aa6e30f 100644 (file)
-/*\r
- * freeglut_state_mswin.c\r
- *\r
- * The Windows-specific state query methods.\r
- *\r
- * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
- * Written by John F. Fay, <fayjf@sourceforge.net>\r
- * Creation date: Sun Jan 22, 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-\r
-extern GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,\r
-                                     unsigned char layer_type );\r
-\r
-/* \r
- * Helper functions for getting client area from the window rect\r
- * and the window rect from the client area given the style of the window\r
- * (or a valid window pointer from which the style can be queried).\r
- */\r
-extern RECT fghGetClientArea( const SFG_Window *window, BOOL wantPosOutside );\r
-extern void fghGetBorderWidth(const DWORD windowStyle, int* xBorderWidth, int* yBorderWidth);\r
-\r
-\r
-/* The following include file is available from SGI but is not standard:\r
- *   #include <GL/wglext.h>\r
- * So we copy the necessary parts out of it to support the multisampling query\r
- */\r
-#define WGL_SAMPLES_ARB                0x2042\r
-\r
-\r
-\r
-int fgPlatformGlutGet ( GLenum eWhat )\r
-{\r
-    int returnValue ;\r
-    GLboolean boolValue ;\r
-\r
-    int nsamples = 0;\r
-\r
-    switch( eWhat )\r
-    {\r
-    case GLUT_WINDOW_NUM_SAMPLES:\r
-      glGetIntegerv(WGL_SAMPLES_ARB, &nsamples);\r
-      return nsamples;\r
-\r
-    /* Handle the OpenGL inquiries */\r
-    case GLUT_WINDOW_RGBA:\r
-#if defined(_WIN32_WCE)\r
-      boolValue = (GLboolean)0;  /* WinCE doesn't support this feature */\r
-#else\r
-      glGetBooleanv ( GL_RGBA_MODE, &boolValue );\r
-      returnValue = boolValue ? 1 : 0;\r
-#endif\r
-      return returnValue;\r
-    case GLUT_WINDOW_DOUBLEBUFFER:\r
-#if defined(_WIN32_WCE)\r
-      boolValue = (GLboolean)0;  /* WinCE doesn't support this feature */\r
-#else\r
-      glGetBooleanv ( GL_DOUBLEBUFFER, &boolValue );\r
-      returnValue = boolValue ? 1 : 0;\r
-#endif\r
-      return returnValue;\r
-    case GLUT_WINDOW_STEREO:\r
-#if defined(_WIN32_WCE)\r
-      boolValue = (GLboolean)0;  /* WinCE doesn't support this feature */\r
-#else\r
-      glGetBooleanv ( GL_STEREO, &boolValue );\r
-      returnValue = boolValue ? 1 : 0;\r
-#endif\r
-      return returnValue;\r
-\r
-    case GLUT_WINDOW_RED_SIZE:\r
-      glGetIntegerv ( GL_RED_BITS, &returnValue );\r
-      return returnValue;\r
-    case GLUT_WINDOW_GREEN_SIZE:\r
-      glGetIntegerv ( GL_GREEN_BITS, &returnValue );\r
-      return returnValue;\r
-    case GLUT_WINDOW_BLUE_SIZE:\r
-      glGetIntegerv ( GL_BLUE_BITS, &returnValue );\r
-      return returnValue;\r
-    case GLUT_WINDOW_ALPHA_SIZE:\r
-      glGetIntegerv ( GL_ALPHA_BITS, &returnValue );\r
-      return returnValue;\r
-    case GLUT_WINDOW_ACCUM_RED_SIZE:\r
-#if defined(_WIN32_WCE)\r
-      returnValue = 0;  /* WinCE doesn't support this feature */\r
-#else\r
-      glGetIntegerv ( GL_ACCUM_RED_BITS, &returnValue );\r
-#endif\r
-      return returnValue;\r
-    case GLUT_WINDOW_ACCUM_GREEN_SIZE:\r
-#if defined(_WIN32_WCE)\r
-      returnValue = 0;  /* WinCE doesn't support this feature */\r
-#else\r
-      glGetIntegerv ( GL_ACCUM_GREEN_BITS, &returnValue );\r
-#endif\r
-      return returnValue;\r
-    case GLUT_WINDOW_ACCUM_BLUE_SIZE:\r
-#if defined(_WIN32_WCE)\r
-      returnValue = 0;  /* WinCE doesn't support this feature */\r
-#else\r
-      glGetIntegerv ( GL_ACCUM_BLUE_BITS, &returnValue );\r
-#endif\r
-      return returnValue;\r
-    case GLUT_WINDOW_ACCUM_ALPHA_SIZE:\r
-#if defined(_WIN32_WCE)\r
-      returnValue = 0;  /* WinCE doesn't support this feature */\r
-#else\r
-      glGetIntegerv ( GL_ACCUM_ALPHA_BITS, &returnValue );\r
-#endif\r
-      return returnValue;\r
-    case GLUT_WINDOW_DEPTH_SIZE:\r
-      glGetIntegerv ( GL_DEPTH_BITS, &returnValue );\r
-      return returnValue;\r
-\r
-    case GLUT_WINDOW_BUFFER_SIZE:\r
-      returnValue = 1 ;                                      /* ????? */\r
-      return returnValue;\r
-    case GLUT_WINDOW_STENCIL_SIZE:\r
-      returnValue = 0 ;                                      /* ????? */\r
-      return returnValue;\r
-\r
-    case GLUT_WINDOW_X:\r
-    case GLUT_WINDOW_Y:\r
-    case GLUT_WINDOW_WIDTH:\r
-    case GLUT_WINDOW_HEIGHT:\r
-    {\r
-        /*\r
-         *  There is considerable confusion about the "right thing to\r
-         *  do" concerning window  size and position.  GLUT itself is\r
-         *  not consistent between Windows and UNIX/X11; since\r
-         *  platform independence is a virtue for "freeglut", we\r
-         *  decided to break with GLUT's behaviour.\r
-         *\r
-         *  Under UNIX/X11, it is apparently not possible to get the\r
-         *  window border sizes in order to subtract them off the\r
-         *  window's initial position until some time after the window\r
-         *  has been created.  Therefore we decided on the following\r
-         *  behaviour, both under Windows and under UNIX/X11:\r
-         *  - When you create a window with position (x,y) and size\r
-         *    (w,h), the upper left hand corner of the outside of the\r
-         *    window is at (x,y) and the size of the drawable area  is\r
-         *    (w,h).\r
-         *  - When you query the size and position of the window--as\r
-         *    is happening here for Windows--"freeglut" will return\r
-         *    the size of the drawable area--the (w,h) that you\r
-         *    specified when you created the window--and the coordinates\r
-         *    of the upper left hand corner of the drawable\r
-         *    area--which is NOT the (x,y) you specified.\r
-         */\r
-\r
-        RECT winRect;\r
-\r
-        freeglut_return_val_if_fail( fgStructure.CurrentWindow != NULL, 0 );\r
-\r
-#if defined(_WIN32_WCE)\r
-        GetWindowRect( fgStructure.CurrentWindow->Window.Handle, &winRect );\r
-#else\r
-        winRect = fghGetClientArea(fgStructure.CurrentWindow, FALSE);\r
-#endif /* defined(_WIN32_WCE) */\r
-\r
-        switch( eWhat )\r
-        {\r
-        case GLUT_WINDOW_X:      return winRect.left                ;\r
-        case GLUT_WINDOW_Y:      return winRect.top                 ;\r
-        case GLUT_WINDOW_WIDTH:  return winRect.right - winRect.left;\r
-        case GLUT_WINDOW_HEIGHT: return winRect.bottom - winRect.top;\r
-        }\r
-    }\r
-    break;\r
-\r
-    case GLUT_WINDOW_BORDER_WIDTH :\r
-    case GLUT_WINDOW_HEADER_HEIGHT :\r
-#if defined(_WIN32_WCE)\r
-        return 0;\r
-#else\r
-        {\r
-            DWORD windowStyle;\r
-\r
-            if (fgStructure.CurrentWindow && fgStructure.CurrentWindow->Window.Handle)\r
-                windowStyle = GetWindowLong(fgStructure.CurrentWindow->Window.Handle, GWL_STYLE);\r
-            else\r
-                /* If no window, return sizes for a default window with title bar and border */\r
-                windowStyle = WS_OVERLAPPEDWINDOW;\r
-            \r
-            switch( eWhat )\r
-            {\r
-            case GLUT_WINDOW_BORDER_WIDTH:\r
-                {\r
-                    int xBorderWidth, yBorderWidth;\r
-                    fghGetBorderWidth(windowStyle, &xBorderWidth, &yBorderWidth);\r
-                    return xBorderWidth;\r
-                }\r
-            case GLUT_WINDOW_HEADER_HEIGHT:\r
-                /* Need to query for WS_MAXIMIZEBOX to see if we have a title bar, the WS_CAPTION query is also true for a WS_DLGFRAME only... */\r
-                return (windowStyle & WS_MAXIMIZEBOX)? GetSystemMetrics( SM_CYCAPTION ) : 0;\r
-            }\r
-        }\r
-#endif /* defined(_WIN32_WCE) */\r
-\r
-    case GLUT_DISPLAY_MODE_POSSIBLE:\r
-#if defined(_WIN32_WCE)\r
-        return 0;\r
-#else\r
-        return fgSetupPixelFormat( fgStructure.CurrentWindow, GL_TRUE,\r
-                                    PFD_MAIN_PLANE );\r
-#endif /* defined(_WIN32_WCE) */\r
-\r
-\r
-    case GLUT_WINDOW_FORMAT_ID:\r
-#if !defined(_WIN32_WCE)\r
-        if( fgStructure.CurrentWindow != NULL )\r
-            return GetPixelFormat( fgStructure.CurrentWindow->Window.pContext.Device );\r
-#endif /* defined(_WIN32_WCE) */\r
-        return 0;\r
-\r
-    default:\r
-        fgWarning( "glutGet(): missing enum handle %d", eWhat );\r
-        break;\r
-    }\r
-\r
-       return -1;\r
-}\r
-\r
-\r
-int fgPlatformGlutDeviceGet ( GLenum eWhat )\r
-{\r
-    switch( eWhat )\r
-    {\r
-    case GLUT_HAS_KEYBOARD:\r
-        /*\r
-         * Win32 is assumed a keyboard, and this cannot be queried,\r
-         * except for WindowsCE.\r
-         *\r
-         * X11 has a core keyboard by definition, although it can\r
-         * be present as a virtual/dummy keyboard. For now, there\r
-         * is no reliable way to tell if a real keyboard is present.\r
-         */\r
-#if defined(_WIN32_CE)\r
-        return ( GetKeyboardStatus() & KBDI_KEYBOARD_PRESENT ) ? 1 : 0;\r
-#   if FREEGLUT_LIB_PRAGMAS\r
-#       pragma comment (lib,"Kbdui.lib")\r
-#   endif\r
-\r
-#else\r
-        return 1;\r
-#endif\r
-\r
-    case GLUT_HAS_MOUSE:\r
-        /*\r
-         * MS Windows can be booted without a mouse.\r
-         */\r
-        return GetSystemMetrics( SM_MOUSEPRESENT );\r
-\r
-    case GLUT_NUM_MOUSE_BUTTONS:\r
-#  if defined(_WIN32_WCE)\r
-        return 1;\r
-#  else\r
-        return GetSystemMetrics( SM_CMOUSEBUTTONS );\r
-#  endif\r
-\r
-    default:\r
-        fgWarning( "glutDeviceGet(): missing enum handle %d", eWhat );\r
-        break;\r
-    }\r
-\r
-    /* And now -- the failure. */\r
-    return -1;\r
-}\r
-\r
-\r
-int fgPlatformGlutLayerGet( GLenum eWhat )\r
-{\r
-    /*\r
-     * This is easy as layers are not implemented ;-)\r
-     *\r
-     * XXX Can we merge the UNIX/X11 and WIN32 sections?  Or\r
-     * XXX is overlay support planned?\r
-     */\r
-    switch( eWhat )\r
-    {\r
-\r
-    case GLUT_OVERLAY_POSSIBLE:\r
-/*      return fgSetupPixelFormat( fgStructure.CurrentWindow, GL_TRUE,\r
-                                   PFD_OVERLAY_PLANE ); */\r
-      return 0 ;\r
-\r
-    case GLUT_LAYER_IN_USE:\r
-        return GLUT_NORMAL;\r
-\r
-    case GLUT_HAS_OVERLAY:\r
-        return 0;\r
-\r
-    case GLUT_TRANSPARENT_INDEX:\r
-        /*\r
-         * Return just anything, which is always defined as zero\r
-         *\r
-         * XXX HUH?\r
-         */\r
-        return 0;\r
-\r
-    case GLUT_NORMAL_DAMAGED:\r
-        /* XXX Actually I do not know. Maybe. */\r
-        return 0;\r
-\r
-    case GLUT_OVERLAY_DAMAGED:\r
-        return -1;\r
-\r
-    default:\r
-        fgWarning( "glutLayerGet(): missing enum handle %d", eWhat );\r
-        break;\r
-    }\r
-\r
-    /* And fail. That's good. Programs do love failing. */\r
-    return -1;\r
-}\r
-\r
-\r
-/* MSwin does not currently have any Mode values? */\r
-int *fgPlatformGlutGetModeValues(GLenum eWhat, int *size)\r
-{\r
-  *size = 0;\r
-  return NULL;\r
+/*
+ * freeglut_state_mswin.c
+ *
+ * The Windows-specific state query methods.
+ *
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
+ * Written by John F. Fay, <fayjf@sourceforge.net>
+ * Creation date: Sun Jan 22, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+
+extern GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
+                                     unsigned char layer_type );
+
+/* 
+ * Helper functions for getting client area from the window rect
+ * and the window rect from the client area given the style of the window
+ * (or a valid window pointer from which the style can be queried).
+ */
+extern RECT fghGetClientArea( const SFG_Window *window, BOOL wantPosOutside );
+extern void fghGetBorderWidth(const DWORD windowStyle, int* xBorderWidth, int* yBorderWidth);
+
+
+/* The following include file is available from SGI but is not standard:
+ *   #include <GL/wglext.h>
+ * So we copy the necessary parts out of it to support the multisampling query
+ */
+#define WGL_SAMPLES_ARB                0x2042
+
+
+
+int fgPlatformGlutGet ( GLenum eWhat )
+{
+    int returnValue ;
+    GLboolean boolValue ;
+
+    int nsamples = 0;
+
+    switch( eWhat )
+    {
+    case GLUT_WINDOW_NUM_SAMPLES:
+      glGetIntegerv(WGL_SAMPLES_ARB, &nsamples);
+      return nsamples;
+
+    /* Handle the OpenGL inquiries */
+    case GLUT_WINDOW_RGBA:
+#if defined(_WIN32_WCE)
+      boolValue = (GLboolean)0;  /* WinCE doesn't support this feature */
+#else
+      glGetBooleanv ( GL_RGBA_MODE, &boolValue );
+      returnValue = boolValue ? 1 : 0;
+#endif
+      return returnValue;
+    case GLUT_WINDOW_DOUBLEBUFFER:
+#if defined(_WIN32_WCE)
+      boolValue = (GLboolean)0;  /* WinCE doesn't support this feature */
+#else
+      glGetBooleanv ( GL_DOUBLEBUFFER, &boolValue );
+      returnValue = boolValue ? 1 : 0;
+#endif
+      return returnValue;
+    case GLUT_WINDOW_STEREO:
+#if defined(_WIN32_WCE)
+      boolValue = (GLboolean)0;  /* WinCE doesn't support this feature */
+#else
+      glGetBooleanv ( GL_STEREO, &boolValue );
+      returnValue = boolValue ? 1 : 0;
+#endif
+      return returnValue;
+
+    case GLUT_WINDOW_RED_SIZE:
+      glGetIntegerv ( GL_RED_BITS, &returnValue );
+      return returnValue;
+    case GLUT_WINDOW_GREEN_SIZE:
+      glGetIntegerv ( GL_GREEN_BITS, &returnValue );
+      return returnValue;
+    case GLUT_WINDOW_BLUE_SIZE:
+      glGetIntegerv ( GL_BLUE_BITS, &returnValue );
+      return returnValue;
+    case GLUT_WINDOW_ALPHA_SIZE:
+      glGetIntegerv ( GL_ALPHA_BITS, &returnValue );
+      return returnValue;
+    case GLUT_WINDOW_ACCUM_RED_SIZE:
+#if defined(_WIN32_WCE)
+      returnValue = 0;  /* WinCE doesn't support this feature */
+#else
+      glGetIntegerv ( GL_ACCUM_RED_BITS, &returnValue );
+#endif
+      return returnValue;
+    case GLUT_WINDOW_ACCUM_GREEN_SIZE:
+#if defined(_WIN32_WCE)
+      returnValue = 0;  /* WinCE doesn't support this feature */
+#else
+      glGetIntegerv ( GL_ACCUM_GREEN_BITS, &returnValue );
+#endif
+      return returnValue;
+    case GLUT_WINDOW_ACCUM_BLUE_SIZE:
+#if defined(_WIN32_WCE)
+      returnValue = 0;  /* WinCE doesn't support this feature */
+#else
+      glGetIntegerv ( GL_ACCUM_BLUE_BITS, &returnValue );
+#endif
+      return returnValue;
+    case GLUT_WINDOW_ACCUM_ALPHA_SIZE:
+#if defined(_WIN32_WCE)
+      returnValue = 0;  /* WinCE doesn't support this feature */
+#else
+      glGetIntegerv ( GL_ACCUM_ALPHA_BITS, &returnValue );
+#endif
+      return returnValue;
+    case GLUT_WINDOW_DEPTH_SIZE:
+      glGetIntegerv ( GL_DEPTH_BITS, &returnValue );
+      return returnValue;
+
+    case GLUT_WINDOW_BUFFER_SIZE:
+      returnValue = 1 ;                                      /* ????? */
+      return returnValue;
+    case GLUT_WINDOW_STENCIL_SIZE:
+      returnValue = 0 ;                                      /* ????? */
+      return returnValue;
+
+    case GLUT_WINDOW_X:
+    case GLUT_WINDOW_Y:
+    case GLUT_WINDOW_WIDTH:
+    case GLUT_WINDOW_HEIGHT:
+    {
+        /*
+         *  There is considerable confusion about the "right thing to
+         *  do" concerning window  size and position.  GLUT itself is
+         *  not consistent between Windows and UNIX/X11; since
+         *  platform independence is a virtue for "freeglut", we
+         *  decided to break with GLUT's behaviour.
+         *
+         *  Under UNIX/X11, it is apparently not possible to get the
+         *  window border sizes in order to subtract them off the
+         *  window's initial position until some time after the window
+         *  has been created.  Therefore we decided on the following
+         *  behaviour, both under Windows and under UNIX/X11:
+         *  - When you create a window with position (x,y) and size
+         *    (w,h), the upper left hand corner of the outside of the
+         *    window is at (x,y) and the size of the drawable area  is
+         *    (w,h).
+         *  - When you query the size and position of the window--as
+         *    is happening here for Windows--"freeglut" will return
+         *    the size of the drawable area--the (w,h) that you
+         *    specified when you created the window--and the coordinates
+         *    of the upper left hand corner of the drawable
+         *    area--which is NOT the (x,y) you specified.
+         */
+
+        RECT winRect;
+
+        freeglut_return_val_if_fail( fgStructure.CurrentWindow != NULL, 0 );
+
+#if defined(_WIN32_WCE)
+        GetWindowRect( fgStructure.CurrentWindow->Window.Handle, &winRect );
+#else
+        winRect = fghGetClientArea(fgStructure.CurrentWindow, FALSE);
+#endif /* defined(_WIN32_WCE) */
+
+        switch( eWhat )
+        {
+        case GLUT_WINDOW_X:      return winRect.left                ;
+        case GLUT_WINDOW_Y:      return winRect.top                 ;
+        case GLUT_WINDOW_WIDTH:  return winRect.right - winRect.left;
+        case GLUT_WINDOW_HEIGHT: return winRect.bottom - winRect.top;
+        }
+    }
+    break;
+
+    case GLUT_WINDOW_BORDER_WIDTH :
+    case GLUT_WINDOW_HEADER_HEIGHT :
+#if defined(_WIN32_WCE)
+        return 0;
+#else
+        {
+            DWORD windowStyle;
+
+            if (fgStructure.CurrentWindow && fgStructure.CurrentWindow->Window.Handle)
+                windowStyle = GetWindowLong(fgStructure.CurrentWindow->Window.Handle, GWL_STYLE);
+            else
+                /* If no window, return sizes for a default window with title bar and border */
+                windowStyle = WS_OVERLAPPEDWINDOW;
+            
+            switch( eWhat )
+            {
+            case GLUT_WINDOW_BORDER_WIDTH:
+                {
+                    int xBorderWidth, yBorderWidth;
+                    fghGetBorderWidth(windowStyle, &xBorderWidth, &yBorderWidth);
+                    return xBorderWidth;
+                }
+            case GLUT_WINDOW_HEADER_HEIGHT:
+                /* Need to query for WS_MAXIMIZEBOX to see if we have a title bar, the WS_CAPTION query is also true for a WS_DLGFRAME only... */
+                return (windowStyle & WS_MAXIMIZEBOX)? GetSystemMetrics( SM_CYCAPTION ) : 0;
+            }
+        }
+#endif /* defined(_WIN32_WCE) */
+
+    case GLUT_DISPLAY_MODE_POSSIBLE:
+#if defined(_WIN32_WCE)
+        return 0;
+#else
+        return fgSetupPixelFormat( fgStructure.CurrentWindow, GL_TRUE,
+                                    PFD_MAIN_PLANE );
+#endif /* defined(_WIN32_WCE) */
+
+
+    case GLUT_WINDOW_FORMAT_ID:
+#if !defined(_WIN32_WCE)
+        if( fgStructure.CurrentWindow != NULL )
+            return GetPixelFormat( fgStructure.CurrentWindow->Window.pContext.Device );
+#endif /* defined(_WIN32_WCE) */
+        return 0;
+
+    default:
+        fgWarning( "glutGet(): missing enum handle %d", eWhat );
+        break;
+    }
+
+       return -1;
+}
+
+
+int fgPlatformGlutDeviceGet ( GLenum eWhat )
+{
+    switch( eWhat )
+    {
+    case GLUT_HAS_KEYBOARD:
+        /*
+         * Win32 is assumed a keyboard, and this cannot be queried,
+         * except for WindowsCE.
+         *
+         * X11 has a core keyboard by definition, although it can
+         * be present as a virtual/dummy keyboard. For now, there
+         * is no reliable way to tell if a real keyboard is present.
+         */
+#if defined(_WIN32_CE)
+        return ( GetKeyboardStatus() & KBDI_KEYBOARD_PRESENT ) ? 1 : 0;
+#   if FREEGLUT_LIB_PRAGMAS
+#       pragma comment (lib,"Kbdui.lib")
+#   endif
+
+#else
+        return 1;
+#endif
+
+    case GLUT_HAS_MOUSE:
+        /*
+         * MS Windows can be booted without a mouse.
+         */
+        return GetSystemMetrics( SM_MOUSEPRESENT );
+
+    case GLUT_NUM_MOUSE_BUTTONS:
+#  if defined(_WIN32_WCE)
+        return 1;
+#  else
+        return GetSystemMetrics( SM_CMOUSEBUTTONS );
+#  endif
+
+    default:
+        fgWarning( "glutDeviceGet(): missing enum handle %d", eWhat );
+        break;
+    }
+
+    /* And now -- the failure. */
+    return -1;
+}
+
+
+int fgPlatformGlutLayerGet( GLenum eWhat )
+{
+    /*
+     * This is easy as layers are not implemented ;-)
+     *
+     * XXX Can we merge the UNIX/X11 and WIN32 sections?  Or
+     * XXX is overlay support planned?
+     */
+    switch( eWhat )
+    {
+
+    case GLUT_OVERLAY_POSSIBLE:
+/*      return fgSetupPixelFormat( fgStructure.CurrentWindow, GL_TRUE,
+                                   PFD_OVERLAY_PLANE ); */
+      return 0 ;
+
+    case GLUT_LAYER_IN_USE:
+        return GLUT_NORMAL;
+
+    case GLUT_HAS_OVERLAY:
+        return 0;
+
+    case GLUT_TRANSPARENT_INDEX:
+        /*
+         * Return just anything, which is always defined as zero
+         *
+         * XXX HUH?
+         */
+        return 0;
+
+    case GLUT_NORMAL_DAMAGED:
+        /* XXX Actually I do not know. Maybe. */
+        return 0;
+
+    case GLUT_OVERLAY_DAMAGED:
+        return -1;
+
+    default:
+        fgWarning( "glutLayerGet(): missing enum handle %d", eWhat );
+        break;
+    }
+
+    /* And fail. That's good. Programs do love failing. */
+    return -1;
+}
+
+
+/* MSwin does not currently have any Mode values? */
+int *fgPlatformGlutGetModeValues(GLenum eWhat, int *size)
+{
+  *size = 0;
+  return NULL;
 }
\ No newline at end of file
index 228d618..e64def7 100644 (file)
@@ -1,34 +1,34 @@
-/*\r
- * freeglut_structure_mswin.c\r
- *\r
- * The Windows-specific mouse cursor related stuff.\r
- *\r
- * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
- * Written by John F. Fay, <fayjf@sourceforge.net>\r
- * Creation date: Sun Jan 22, 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-\r
-void fgPlatformCreateWindow ( SFG_Window *window )\r
-{\r
-}\r
+/*
+ * freeglut_structure_mswin.c
+ *
+ * The Windows-specific mouse cursor related stuff.
+ *
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
+ * Written by John F. Fay, <fayjf@sourceforge.net>
+ * Creation date: Sun Jan 22, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+
+void fgPlatformCreateWindow ( SFG_Window *window )
+{
+}
index 93c2dce..783c53d 100644 (file)
-/*\r
- * freeglut_window_mswin.c\r
- *\r
- * The Windows-specific mouse cursor related stuff.\r
- *\r
- * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
- * Written by John F. Fay, <fayjf@sourceforge.net>\r
- * Creation date: Sun Jan 22, 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#define FREEGLUT_BUILDING_LIB\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-\r
-/* The following include file is available from SGI but is not standard:\r
- *   #include <GL/wglext.h>\r
- * So we copy the necessary parts out of it.\r
- * XXX: should local definitions for extensions be put in a separate include file?\r
- */\r
-typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);\r
-\r
-typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);\r
-\r
-#define WGL_DRAW_TO_WINDOW_ARB         0x2001\r
-#define WGL_ACCELERATION_ARB           0x2003\r
-#define WGL_SUPPORT_OPENGL_ARB         0x2010\r
-#define WGL_DOUBLE_BUFFER_ARB          0x2011\r
-#define WGL_COLOR_BITS_ARB             0x2014\r
-#define WGL_ALPHA_BITS_ARB             0x201B\r
-#define WGL_DEPTH_BITS_ARB             0x2022\r
-#define WGL_STENCIL_BITS_ARB           0x2023\r
-#define WGL_FULL_ACCELERATION_ARB      0x2027\r
-\r
-#define WGL_SAMPLE_BUFFERS_ARB         0x2041\r
-#define WGL_SAMPLES_ARB                0x2042\r
-\r
-#define WGL_TYPE_RGBA_FLOAT_ARB        0x21A0\r
-\r
-#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9\r
-\r
-#ifndef WGL_ARB_create_context\r
-#define WGL_ARB_create_context 1\r
-#ifdef WGL_WGLEXT_PROTOTYPES\r
-extern HGLRC WINAPI wglCreateContextAttribsARB (HDC, HGLRC, const int *);\r
-#endif /* WGL_WGLEXT_PROTOTYPES */\r
-typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList);\r
-\r
-#define WGL_CONTEXT_MAJOR_VERSION_ARB  0x2091\r
-#define WGL_CONTEXT_MINOR_VERSION_ARB  0x2092\r
-#define WGL_CONTEXT_LAYER_PLANE_ARB    0x2093\r
-#define WGL_CONTEXT_FLAGS_ARB          0x2094\r
-#define WGL_CONTEXT_PROFILE_MASK_ARB   0x9126\r
-\r
-#define WGL_CONTEXT_DEBUG_BIT_ARB      0x0001\r
-#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002\r
-\r
-#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001\r
-#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002\r
-\r
-#define ERROR_INVALID_VERSION_ARB      0x2095\r
-#define ERROR_INVALID_PROFILE_ARB      0x2096\r
-#endif\r
-/* End of copying the necessary parts out of it. */\r
-\r
-#ifdef WM_TOUCH\r
-typedef BOOL (WINAPI *pRegisterTouchWindow)(HWND,ULONG);\r
-static pRegisterTouchWindow fghRegisterTouchWindow = (pRegisterTouchWindow)0xDEADBEEF;\r
-#endif\r
-\r
-/* \r
- * Helper functions for getting client area from the window rect\r
- * and the window rect from the client area given the style of the window\r
- * (or a valid window pointer from which the style can be queried).\r
- */\r
-extern void fghGetBorderWidth(const DWORD windowStyle, int* xBorderWidth, int* yBorderWidth);\r
-\r
-\r
-/*\r
- * Setup the pixel format for a Win32 window\r
- */\r
-\r
-#if defined(_WIN32_WCE)\r
-static wchar_t* fghWstrFromStr(const char* str)\r
-{\r
-    int i,len=strlen(str);\r
-    wchar_t* wstr = (wchar_t*)malloc(2*len+2);\r
-    for(i=0; i<len; i++)\r
-        wstr[i] = str[i];\r
-    wstr[len] = 0;\r
-    return wstr;\r
-}\r
-#endif /* defined(_WIN32_WCE) */\r
-\r
-\r
-static void fghFillContextAttributes( int *attributes ) {\r
-  int where = 0, contextFlags, contextProfile;\r
-\r
-  if ( !fghIsLegacyContextVersionRequested() ) {\r
-    ATTRIB_VAL( WGL_CONTEXT_MAJOR_VERSION_ARB, fgState.MajorVersion );\r
-    ATTRIB_VAL( WGL_CONTEXT_MINOR_VERSION_ARB, fgState.MinorVersion );\r
-  }\r
-\r
-  contextFlags =\r
-    fghMapBit( fgState.ContextFlags, GLUT_DEBUG, WGL_CONTEXT_DEBUG_BIT_ARB ) |\r
-    fghMapBit( fgState.ContextFlags, GLUT_FORWARD_COMPATIBLE, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB );\r
-  if ( contextFlags != 0 ) {\r
-    ATTRIB_VAL( WGL_CONTEXT_FLAGS_ARB, contextFlags );\r
-  }\r
-\r
-  contextProfile =\r
-    fghMapBit( fgState.ContextProfile, GLUT_CORE_PROFILE, WGL_CONTEXT_CORE_PROFILE_BIT_ARB ) |\r
-    fghMapBit( fgState.ContextProfile, GLUT_COMPATIBILITY_PROFILE, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB );\r
-  if ( contextProfile != 0 ) {\r
-    ATTRIB_VAL( WGL_CONTEXT_PROFILE_MASK_ARB, contextProfile );\r
-  }\r
-\r
-  ATTRIB( 0 );\r
-}\r
-\r
-static int fghIsExtensionSupported( HDC hdc, const char *extension ) {\r
-    const char *pWglExtString;\r
-    PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetEntensionsStringARB =\r
-      (PFNWGLGETEXTENSIONSSTRINGARBPROC) wglGetProcAddress("wglGetExtensionsStringARB");\r
-    if ( wglGetEntensionsStringARB == NULL )\r
-    {\r
-      return FALSE;\r
-    }\r
-    pWglExtString = wglGetEntensionsStringARB( hdc );\r
-    return ( pWglExtString != NULL ) && ( strstr(pWglExtString, extension) != NULL );\r
-}\r
-\r
-void fgNewWGLCreateContext( SFG_Window* window )\r
-{\r
-    HGLRC context;\r
-    int attributes[9];\r
-    PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB;\r
-\r
-    /* If nothing fancy has been required, leave the context as it is */\r
-    if ( fghIsLegacyContextRequested() )\r
-    {\r
-        return;\r
-    }\r
-\r
-    wglMakeCurrent( window->Window.pContext.Device, window->Window.Context );\r
-\r
-    if ( !fghIsExtensionSupported( window->Window.pContext.Device, "WGL_ARB_create_context" ) )\r
-    {\r
-        return;\r
-    }\r
-\r
-    /* new context creation */\r
-    fghFillContextAttributes( attributes );\r
-\r
-    wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) wglGetProcAddress( "wglCreateContextAttribsARB" );\r
-    if ( wglCreateContextAttribsARB == NULL )\r
-    {\r
-        fgError( "wglCreateContextAttribsARB not found" );\r
-    }\r
-\r
-    context = wglCreateContextAttribsARB( window->Window.pContext.Device, 0, attributes );\r
-    if ( context == NULL )\r
-    {\r
-        fghContextCreationError();\r
-    }\r
-\r
-    wglMakeCurrent( NULL, NULL );\r
-    wglDeleteContext( window->Window.Context );\r
-    window->Window.Context = context;\r
-}\r
-\r
-#if !defined(_WIN32_WCE)\r
-\r
-static void fghFillPFD( PIXELFORMATDESCRIPTOR *ppfd, HDC hdc, unsigned char layer_type )\r
-{\r
-  int flags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;\r
-  if ( fgState.DisplayMode & GLUT_DOUBLE ) {\r
-        flags |= PFD_DOUBLEBUFFER;\r
-  }\r
-  if ( fgState.DisplayMode & GLUT_STEREO ) {\r
-    flags |= PFD_STEREO;\r
-  }\r
-\r
-#if defined(_MSC_VER)\r
-#pragma message( "fgSetupPixelFormat(): there is still some work to do here!" )\r
-#endif\r
-\r
-  /* Specify which pixel format do we opt for... */\r
-  ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);\r
-  ppfd->nVersion = 1;\r
-  ppfd->dwFlags = flags;\r
-\r
-  if( fgState.DisplayMode & GLUT_INDEX ) {\r
-    ppfd->iPixelType = PFD_TYPE_COLORINDEX;\r
-    ppfd->cRedBits = 0;\r
-    ppfd->cGreenBits = 0;\r
-    ppfd->cBlueBits = 0;\r
-    ppfd->cAlphaBits = 0;\r
-  } else {\r
-    ppfd->iPixelType = PFD_TYPE_RGBA;\r
-    ppfd->cRedBits = 8;\r
-    ppfd->cGreenBits = 8;\r
-    ppfd->cBlueBits = 8;\r
-    ppfd->cAlphaBits = ( fgState.DisplayMode & GLUT_ALPHA ) ? 8 : 0;\r
-  }\r
-\r
-  ppfd->cColorBits = 24;\r
-  ppfd->cRedShift = 0;\r
-  ppfd->cGreenShift = 0;\r
-  ppfd->cBlueShift = 0;\r
-  ppfd->cAlphaShift = 0;\r
-  ppfd->cAccumBits = ( fgState.DisplayMode & GLUT_ACCUM ) ? 1 : 0;\r
-  ppfd->cAccumRedBits = 0;\r
-  ppfd->cAccumGreenBits = 0;\r
-  ppfd->cAccumBlueBits = 0;\r
-  ppfd->cAccumAlphaBits = 0;\r
-\r
-  /* Hmmm, or 32/0 instead of 24/8? */\r
-  ppfd->cDepthBits = 24;\r
-  ppfd->cStencilBits = 8;\r
-\r
-  ppfd->cAuxBuffers = fghNumberOfAuxBuffersRequested();\r
-  ppfd->iLayerType = layer_type;\r
-  ppfd->bReserved = 0;\r
-  ppfd->dwLayerMask = 0;\r
-  ppfd->dwVisibleMask = 0;\r
-  ppfd->dwDamageMask = 0;\r
-  \r
-  ppfd->cColorBits = (BYTE) GetDeviceCaps( hdc, BITSPIXEL );\r
-}\r
-\r
-static void fghFillPixelFormatAttributes( int *attributes, const PIXELFORMATDESCRIPTOR *ppfd )\r
-{\r
-  int where = 0;\r
-\r
-  ATTRIB_VAL( WGL_DRAW_TO_WINDOW_ARB, GL_TRUE );\r
-  ATTRIB_VAL( WGL_SUPPORT_OPENGL_ARB, GL_TRUE );\r
-  ATTRIB_VAL( WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB );\r
-\r
-  ATTRIB_VAL( WGL_COLOR_BITS_ARB, ppfd->cColorBits );\r
-  ATTRIB_VAL( WGL_ALPHA_BITS_ARB, ppfd->cAlphaBits );\r
-  ATTRIB_VAL( WGL_DEPTH_BITS_ARB, ppfd->cDepthBits );\r
-  ATTRIB_VAL( WGL_STENCIL_BITS_ARB, ppfd->cStencilBits );\r
-\r
-  ATTRIB_VAL( WGL_DOUBLE_BUFFER_ARB, ( fgState.DisplayMode & GLUT_DOUBLE ) != 0 );\r
-\r
-  if ( fgState.DisplayMode & GLUT_SRGB ) {\r
-    ATTRIB_VAL( WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB, TRUE );\r
-  }\r
-\r
-  ATTRIB_VAL( WGL_SAMPLE_BUFFERS_ARB, GL_TRUE );\r
-  ATTRIB_VAL( WGL_SAMPLES_ARB, fgState.SampleNumber );\r
-  ATTRIB( 0 );\r
-}\r
-#endif\r
-\r
-GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,\r
-                              unsigned char layer_type )\r
-{\r
-#if defined(_WIN32_WCE)\r
-    return GL_TRUE;\r
-#else\r
-    PIXELFORMATDESCRIPTOR pfd;\r
-    PIXELFORMATDESCRIPTOR* ppfd = &pfd;\r
-    int pixelformat;\r
-    HDC current_hDC;\r
-    GLboolean success;\r
-\r
-    if (checkOnly)\r
-      current_hDC = CreateDC(TEXT("DISPLAY"), NULL ,NULL ,NULL);\r
-    else\r
-      current_hDC = window->Window.pContext.Device;\r
-\r
-    fghFillPFD( ppfd, current_hDC, layer_type );\r
-    pixelformat = ChoosePixelFormat( current_hDC, ppfd );\r
-\r
-    /* windows hack for multismapling/sRGB */\r
-    if ( ( fgState.DisplayMode & GLUT_MULTISAMPLE ) ||\r
-         ( fgState.DisplayMode & GLUT_SRGB ) )\r
-    {        \r
-        HGLRC rc, rc_before=wglGetCurrentContext();\r
-        HWND hWnd;\r
-        HDC hDC, hDC_before=wglGetCurrentDC();\r
-        WNDCLASS wndCls;\r
-\r
-        /* create a dummy window */\r
-        ZeroMemory(&wndCls, sizeof(wndCls));\r
-        wndCls.lpfnWndProc = DefWindowProc;\r
-        wndCls.hInstance = fgDisplay.pDisplay.Instance;\r
-        wndCls.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;\r
-        wndCls.lpszClassName = _T("FREEGLUT_dummy");\r
-        RegisterClass( &wndCls );\r
-\r
-        hWnd=CreateWindow(_T("FREEGLUT_dummy"), _T(""), WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW , 0,0,0,0, 0, 0, fgDisplay.pDisplay.Instance, 0 );\r
-        hDC=GetDC(hWnd);\r
-        SetPixelFormat( hDC, pixelformat, ppfd );\r
-\r
-        rc = wglCreateContext( hDC );\r
-        wglMakeCurrent(hDC, rc);\r
-\r
-        if ( fghIsExtensionSupported( hDC, "WGL_ARB_multisample" ) )\r
-        {\r
-            PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARBProc =\r
-              (PFNWGLCHOOSEPIXELFORMATARBPROC) wglGetProcAddress("wglChoosePixelFormatARB");\r
-            if ( wglChoosePixelFormatARBProc )\r
-            {\r
-                int attributes[100];\r
-                int iPixelFormat;\r
-                BOOL bValid;\r
-                float fAttributes[] = { 0, 0 };\r
-                UINT numFormats;\r
-                fghFillPixelFormatAttributes( attributes, ppfd );\r
-                bValid = wglChoosePixelFormatARBProc(hDC, attributes, fAttributes, 1, &iPixelFormat, &numFormats);\r
-\r
-                if ( bValid && numFormats > 0 )\r
-                {\r
-                    pixelformat = iPixelFormat;\r
-                }\r
-            }\r
-        }\r
-\r
-        wglMakeCurrent( hDC_before, rc_before);\r
-        wglDeleteContext(rc);\r
-        ReleaseDC(hWnd, hDC);\r
-        DestroyWindow(hWnd);\r
-        UnregisterClass(_T("FREEGLUT_dummy"), fgDisplay.pDisplay.Instance);\r
-    }\r
-\r
-    success = ( pixelformat != 0 ) && ( checkOnly || SetPixelFormat( current_hDC, pixelformat, ppfd ) );\r
-\r
-    if (checkOnly)\r
-        DeleteDC(current_hDC);\r
-\r
-    return success;\r
-#endif /* defined(_WIN32_WCE) */\r
-}\r
-\r
-\r
-\r
-void fgPlatformSetWindow ( SFG_Window *window )\r
-{\r
-    if ( window != fgStructure.CurrentWindow )\r
-    {\r
-        if( fgStructure.CurrentWindow )\r
-            ReleaseDC( fgStructure.CurrentWindow->Window.Handle,\r
-                       fgStructure.CurrentWindow->Window.pContext.Device );\r
-\r
-        if ( window )\r
-        {\r
-            window->Window.pContext.Device = GetDC( window->Window.Handle );\r
-            wglMakeCurrent(\r
-                window->Window.pContext.Device,\r
-                window->Window.Context\r
-            );\r
-        }\r
-    }\r
-}\r
-\r
-\r
-\r
-/* Computes position of corners of window Rect (outer position including\r
- * decorations) based on the provided client rect and based on the style\r
- * of the window in question.\r
- * If posIsOutside is set to true, the input client Rect is taken to follow\r
- * freeGLUT's window specification convention in which the top-left corner\r
- * is at the outside of the window, while the size\r
- * (rect.right-rect.left,rect.bottom-rect.top) is the size of the drawable\r
- * area.\r
- */\r
-void fghComputeWindowRectFromClientArea_UseStyle( const DWORD windowStyle, RECT *clientRect, BOOL posIsOutside )\r
-{\r
-    int xBorderWidth = 0, yBorderWidth = 0;\r
-\r
-    /* If window has title bar, correct rect for it */\r
-    if (windowStyle & WS_MAXIMIZEBOX) /* Need to query for WS_MAXIMIZEBOX to see if we have a title bar, the WS_CAPTION query is also true for a WS_DLGFRAME only... */\r
-        if (posIsOutside)\r
-            clientRect->bottom += GetSystemMetrics( SM_CYCAPTION );\r
-        else\r
-            clientRect->top -= GetSystemMetrics( SM_CYCAPTION );\r
-\r
-    /* get width of window's borders (frame), correct rect for it.\r
-     * Note, borders can be of zero width if style does not specify borders\r
-     */\r
-    fghGetBorderWidth(windowStyle, &xBorderWidth, &yBorderWidth);\r
-    if (posIsOutside)\r
-    {\r
-        clientRect->right  += xBorderWidth * 2;\r
-        clientRect->bottom += yBorderWidth * 2;\r
-    }\r
-    else\r
-    {\r
-        clientRect->left   -= xBorderWidth;\r
-        clientRect->right  += xBorderWidth;\r
-        clientRect->top    -= yBorderWidth;\r
-        clientRect->bottom += yBorderWidth;\r
-    }\r
-}\r
-\r
-/* Computes position of corners of window Rect (outer position including\r
- * decorations) based on the provided client rect and based on the style\r
- * of the window in question. If the window pointer or the window handle\r
- * is NULL, a fully decorated window (caption and border) is assumed.\r
- * Furthermore, if posIsOutside is set to true, the input client Rect is\r
- * taken to follow freeGLUT's window specification convention in which the\r
- * top-left corner is at the outside of the window, while the size\r
- * (rect.right-rect.left,rect.bottom-rect.top) is the size of the drawable\r
- * area.\r
-*/\r
-void fghComputeWindowRectFromClientArea_QueryWindow( const SFG_Window *window, RECT *clientRect, BOOL posIsOutside )\r
-{\r
-    DWORD windowStyle = 0;\r
-\r
-    if (window && window->Window.Handle)\r
-        windowStyle = GetWindowLong(window->Window.Handle, GWL_STYLE);\r
-    else\r
-        windowStyle = WS_OVERLAPPEDWINDOW;\r
-\r
-    fghComputeWindowRectFromClientArea_UseStyle(windowStyle, clientRect, posIsOutside);\r
-}\r
-\r
-/* Computes position of corners of client area (drawable area) of a window\r
- * based on the provided window Rect (outer position including decorations)\r
- * and based on the style of the window in question. If the window pointer\r
- * or the window handle is NULL, a fully decorated window (caption and\r
- * border) is assumed.\r
- * Furthermore, if wantPosOutside is set to true, the output client Rect\r
- * will follow freeGLUT's window specification convention in which the\r
- * top-left corner is at the outside of the window, the size\r
- * (rect.right-rect.left,rect.bottom-rect.top) is the size of the drawable\r
- * area.\r
- */\r
-void fghComputeClientAreaFromWindowRect( const SFG_Window *window, RECT *windowRect, BOOL wantPosOutside )\r
-{\r
-    DWORD windowStyle = 0;\r
-    int xBorderWidth = 0, yBorderWidth = 0;\r
-\r
-    if (window && window->Window.Handle)\r
-        windowStyle = GetWindowLong(window->Window.Handle, GWL_STYLE);\r
-    else\r
-        windowStyle = WS_OVERLAPPEDWINDOW;\r
-\r
-    /* If window has title bar, correct rect for it */\r
-    if (windowStyle & WS_MAXIMIZEBOX) /* Need to query for WS_MAXIMIZEBOX to see if we have a title bar, the WS_CAPTION query is also true for a WS_DLGFRAME only... */\r
-        if (wantPosOutside)\r
-            windowRect->bottom -= GetSystemMetrics( SM_CYCAPTION );\r
-        else\r
-            windowRect->top    += GetSystemMetrics( SM_CYCAPTION );\r
-\r
-    /* get width of window's borders (frame), correct rect for it.\r
-     * Note, borders can be of zero width if style does not specify borders\r
-     */\r
-    fghGetBorderWidth(windowStyle, &xBorderWidth, &yBorderWidth);\r
-    if (wantPosOutside)\r
-    {\r
-        windowRect->right  -= xBorderWidth * 2;\r
-        windowRect->bottom -= yBorderWidth * 2;\r
-    }\r
-    else\r
-    {\r
-        windowRect->left   += xBorderWidth;\r
-        windowRect->right  -= xBorderWidth;\r
-        windowRect->top    += yBorderWidth;\r
-        windowRect->bottom -= yBorderWidth;\r
-    }\r
-}\r
-\r
-/* Gets the rect describing the client area (drawable area) of the\r
- * specified window.\r
- * Returns an empty rect if window pointer or window handle is NULL.\r
- * If wantPosOutside is set to true, the output client Rect\r
- * will follow freeGLUT's window specification convention in which the\r
- * top-left corner is at the outside of the window, while the size\r
- * (rect.right-rect.left,rect.bottom-rect.top) is the size of the drawable\r
- * area.\r
- */\r
-RECT fghGetClientArea( const SFG_Window *window, BOOL wantPosOutside )\r
-{\r
-    RECT windowRect = {0,0,0,0};\r
-\r
-    freeglut_return_val_if_fail((window && window->Window.Handle),windowRect);\r
-    \r
-    /*\r
-     * call GetWindowRect()\r
-     * (this returns the pixel coordinates of the outside of the window)\r
-     */\r
-    GetWindowRect( window->Window.Handle, &windowRect );\r
-\r
-    /* Then correct the results */\r
-    fghComputeClientAreaFromWindowRect(window, &windowRect, wantPosOutside);\r
-\r
-    return windowRect;\r
-}\r
-\r
-/* Returns the width of the window borders based on the window's style.\r
- */\r
-void fghGetBorderWidth(const DWORD windowStyle, int* xBorderWidth, int* yBorderWidth)\r
-{\r
-    if (windowStyle & WS_THICKFRAME)\r
-    {\r
-        *xBorderWidth = GetSystemMetrics(SM_CXSIZEFRAME);\r
-        *yBorderWidth = GetSystemMetrics(SM_CYSIZEFRAME);\r
-    }\r
-    else if (windowStyle & WS_DLGFRAME)\r
-    {\r
-        *xBorderWidth = GetSystemMetrics(SM_CXFIXEDFRAME);\r
-        *yBorderWidth = GetSystemMetrics(SM_CYFIXEDFRAME);\r
-    }\r
-    else\r
-    {\r
-        *xBorderWidth = 0;\r
-        *yBorderWidth = 0;\r
-    }\r
-}\r
-\r
-#if(WINVER >= 0x500)\r
-typedef struct\r
-{\r
-      int *x;\r
-      int *y;\r
-      const char *name;\r
-} m_proc_t;\r
-\r
-static BOOL CALLBACK m_proc(HMONITOR mon,\r
-                           HDC hdc,\r
-                           LPRECT rect,\r
-                           LPARAM data)\r
-{\r
-      m_proc_t *dp=(m_proc_t *)data;\r
-      MONITORINFOEX info;\r
-      BOOL res;\r
-      info.cbSize=sizeof(info);\r
-      res=GetMonitorInfo(mon,(LPMONITORINFO)&info);\r
-      if( res )\r
-      {\r
-          if( strcmp(dp->name,info.szDevice)==0 )\r
-          {\r
-              *(dp->x)=info.rcMonitor.left;\r
-              *(dp->y)=info.rcMonitor.top;\r
-              return FALSE;\r
-          }\r
-      }\r
-      return TRUE;\r
-}\r
-\r
-/* \r
- * this function returns the origin of the screen identified by\r
- * fgDisplay.pDisplay.DisplayName, and 0 otherwise.\r
- * This is used in fgOpenWindow to open the gamemode window on the screen\r
- * identified by the -display command line argument. The function should\r
- * not be called otherwise.\r
- */\r
-\r
-static void get_display_origin(int *xp,int *yp)\r
-{\r
-    *xp = 0;\r
-    *yp = 0;\r
-\r
-    if( fgDisplay.pDisplay.DisplayName )\r
-    {\r
-        m_proc_t st;\r
-        st.x=xp;\r
-        st.y=yp;\r
-        st.name=fgDisplay.pDisplay.DisplayName;\r
-        EnumDisplayMonitors(0,0,m_proc,(LPARAM)&st);\r
-    }\r
-}\r
-#else\r
-#pragma message( "-display parameter only works if compiled with WINVER >= 0x0500")\r
-\r
-static void get_display_origin(int *xp,int *yp)\r
-{\r
-    *xp = 0;\r
-    *yp = 0;\r
-\r
-    if( fgDisplay.pDisplay.DisplayName )\r
-    {\r
-        fgWarning( "for working -display support FreeGLUT must be compiled with WINVER >= 0x0500");\r
-    }\r
-}\r
-#endif\r
-\r
-\r
-\r
-/*\r
- * Opens a window. Requires a SFG_Window object created and attached\r
- * to the freeglut structure. OpenGL context is created here.\r
- */\r
-void fgPlatformOpenWindow( SFG_Window* window, const char* title,\r
-                           GLboolean positionUse, int x, int y,\r
-                           GLboolean sizeUse, int w, int h,\r
-                           GLboolean gameMode, GLboolean isSubWindow )\r
-{\r
-\r
-    WNDCLASS wc;\r
-    DWORD flags   = 0;\r
-    DWORD exFlags = 0;\r
-    ATOM atom;\r
-\r
-    /* Grab the window class we have registered on glutInit(): */\r
-    atom = GetClassInfo( fgDisplay.pDisplay.Instance, _T("FREEGLUT"), &wc );\r
-    FREEGLUT_INTERNAL_ERROR_EXIT ( atom, "Window Class Info Not Found",\r
-                                   "fgOpenWindow" );\r
-\r
-    /* Determine window style flags*/\r
-    if( gameMode )\r
-    {\r
-        FREEGLUT_INTERNAL_ERROR_EXIT ( window->Parent == NULL,\r
-                                       "Game mode being invoked on a subwindow",\r
-                                       "fgOpenWindow" );\r
-\r
-        /*\r
-         * Set the window creation flags appropriately to make the window\r
-         * entirely visible:\r
-         */\r
-        flags = WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE;\r
-    }\r
-    else\r
-    {\r
-        flags = WS_CLIPSIBLINGS | WS_CLIPCHILDREN;\r
-\r
-        /*\r
-         * There's a small difference between creating the top, child and\r
-         * menu windows\r
-         */\r
-        if ( window->IsMenu )\r
-        {\r
-            flags |= WS_POPUP;\r
-            exFlags |= WS_EX_TOOLWINDOW;\r
-        }\r
-#if defined(_WIN32_WCE)\r
-        /* no decorations for windows CE */\r
-#else\r
-        /* if this is not a subwindow (child), set its style based on the requested display mode */\r
-        else if( window->Parent == NULL )\r
-            if ( fgState.DisplayMode & GLUT_BORDERLESS )\r
-            {\r
-                /* no window decorations needed */\r
-            }\r
-            else if ( fgState.DisplayMode & GLUT_CAPTIONLESS )\r
-                /* only window decoration is a border, no title bar or buttons */\r
-                flags |= WS_DLGFRAME;\r
-            else\r
-                /* window decoration are a border, title bar and buttons.\r
-                 * NB: we later query whether the window has a title bar or\r
-                 * not by testing for the maximize button, as the test for\r
-                 * WS_CAPTION can be true without the window having a title\r
-                 * bar. This style WS_OVERLAPPEDWINDOW gives you a maximize\r
-                 * button. */\r
-                flags |= WS_OVERLAPPEDWINDOW;\r
-#endif\r
-        else\r
-            /* subwindows always have no decoration, but are marked as a child window to the OS */\r
-            flags |= WS_CHILD;\r
-    }\r
-\r
-    /* determine window size and position */\r
-    if( gameMode )\r
-    {\r
-        /* if in gamemode, query the origin of specified by the -display\r
-         * command line parameter (if any) and offset the upper-left corner\r
-         * of the window so we create the window on that screen.\r
-         * The -display argument doesn't do anything if not trying to enter\r
-         * gamemode.\r
-         */\r
-        int xoff=0, yoff=0;\r
-        get_display_origin(&xoff,&yoff);\r
-        x += xoff;\r
-        y += yoff;\r
-    }\r
-    if( !positionUse )\r
-    {\r
-        x = CW_USEDEFAULT;\r
-        y = CW_USEDEFAULT;\r
-    }\r
-    if( !sizeUse )\r
-    {\r
-        if( ! window->IsMenu )\r
-        {\r
-            w = CW_USEDEFAULT;\r
-            h = CW_USEDEFAULT;\r
-        }\r
-        else /* fail safe - Windows can make a window of size (0, 0) */\r
-            w = h = 300; /* default window size */\r
-    }\r
-    /* store requested client area width and height */\r
-    window->State.Width = w;\r
-    window->State.Height = h;\r
-\r
-#if !defined(_WIN32_WCE)    /* no decorations for windows CE */\r
-    if( sizeUse )\r
-    {\r
-        RECT windowRect;\r
-        /*\r
-         * Update the window dimensions, taking the window decorations\r
-         * into account.  FreeGLUT is to create the window with the\r
-         * topleft outside corner at (x,y) and with client area\r
-         * dimensions (w,h).\r
-         * note: don't need to do this when w=h=CW_USEDEFAULT, so in the\r
-         * if( sizeUse ) here is convenient.\r
-         */\r
-        windowRect.left     = x;\r
-        windowRect.top      = y;\r
-        windowRect.right    = x+w;\r
-        windowRect.bottom   = y+h;\r
-\r
-        fghComputeWindowRectFromClientArea_UseStyle(flags,&windowRect,TRUE);\r
-\r
-        w = windowRect.right - windowRect.left;\r
-        h = windowRect.bottom- windowRect.top;\r
-    }\r
-#endif /* !defined(_WIN32_WCE) */\r
-\r
-#if defined(_WIN32_WCE)\r
-    {\r
-        wchar_t* wstr = fghWstrFromStr(title);\r
-\r
-        window->Window.Handle = CreateWindow(\r
-            _T("FREEGLUT"),\r
-            wstr,\r
-            WS_VISIBLE | WS_POPUP,\r
-            0,0, 240,320,\r
-            NULL,\r
-            NULL,\r
-            fgDisplay.pDisplay.Instance,\r
-            (LPVOID) window\r
-        );\r
-\r
-        free(wstr);\r
-\r
-        SHFullScreen(window->Window.Handle, SHFS_HIDESTARTICON);\r
-        SHFullScreen(window->Window.Handle, SHFS_HIDESIPBUTTON);\r
-        SHFullScreen(window->Window.Handle, SHFS_HIDETASKBAR);\r
-        MoveWindow(window->Window.Handle, 0, 0, 240, 320, TRUE);\r
-        ShowWindow(window->Window.Handle, SW_SHOW);\r
-        UpdateWindow(window->Window.Handle);\r
-    }\r
-#else\r
-    window->Window.Handle = CreateWindowEx(\r
-        exFlags,\r
-        _T("FREEGLUT"),\r
-        title,\r
-        flags,\r
-        x, y, w, h,\r
-        (HWND) window->Parent == NULL ? NULL : window->Parent->Window.Handle,\r
-        (HMENU) NULL,\r
-        fgDisplay.pDisplay.Instance,\r
-        (LPVOID) window\r
-    );\r
-#endif /* defined(_WIN32_WCE) */\r
-\r
-    if( !( window->Window.Handle ) )\r
-        fgError( "Failed to create a window (%s)!", title );\r
-\r
-#if !defined(_WIN32_WCE)\r
-    /* Need to set requested style again, apparently Windows doesn't listen when requesting windows without title bar or borders */\r
-    SetWindowLong(window->Window.Handle, GWL_STYLE, flags);\r
-    SetWindowPos(window->Window.Handle, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);\r
-#endif /* defined(_WIN32_WCE) */\r
-\r
-    /* Make a menu window always on top - fix Feature Request 947118 */\r
-    if( window->IsMenu || gameMode )\r
-        SetWindowPos(\r
-                        window->Window.Handle,\r
-                        HWND_TOPMOST,\r
-                        0, 0, 0, 0,\r
-                        SWP_NOMOVE | SWP_NOSIZE\r
-                    );\r
-\r
-    /* Enable multitouch: additional flag TWF_FINETOUCH, TWF_WANTPALM */\r
-    #ifdef WM_TOUCH\r
-        if (fghRegisterTouchWindow == (pRegisterTouchWindow)0xDEADBEEF) \r
-                       fghRegisterTouchWindow = (pRegisterTouchWindow)GetProcAddress(GetModuleHandle("user32"),"RegisterTouchWindow");\r
-               if (fghRegisterTouchWindow)\r
-             fghRegisterTouchWindow( window->Window.Handle, TWF_FINETOUCH | TWF_WANTPALM );\r
-    #endif\r
-\r
-#if defined(_WIN32_WCE)\r
-    ShowWindow( window->Window.Handle, SW_SHOW );\r
-#else\r
-    ShowWindow( window->Window.Handle,\r
-                fgState.ForceIconic ? SW_SHOWMINIMIZED : SW_SHOW );\r
-#endif /* defined(_WIN32_WCE) */\r
-\r
-    UpdateWindow( window->Window.Handle );\r
-    ShowCursor( TRUE );  /* XXX Old comments say "hide cursor"! */\r
-\r
-}\r
-\r
-\r
-/*\r
- * Closes a window, destroying the frame and OpenGL context\r
- */\r
-void fgPlatformCloseWindow( SFG_Window* window )\r
-{\r
-    /* Make sure we don't close a window with current context active */\r
-    if( fgStructure.CurrentWindow == window )\r
-        wglMakeCurrent( NULL, NULL );\r
-\r
-    /*\r
-     * Step through the list of windows.  If the rendering context\r
-     * is not being used by another window, then we delete it.\r
-     */\r
-    {\r
-        int used = FALSE ;\r
-        SFG_Window *iter ;\r
-\r
-        for( iter = (SFG_Window *)fgStructure.Windows.First;\r
-             iter;\r
-             iter = (SFG_Window *)iter->Node.Next )\r
-        {\r
-            if( ( iter->Window.Context == window->Window.Context ) &&\r
-                ( iter != window ) )\r
-                used = TRUE;\r
-        }\r
-\r
-        if( ! used )\r
-            wglDeleteContext( window->Window.Context );\r
-    }\r
-\r
-    DestroyWindow( window->Window.Handle );\r
-}\r
-\r
-\r
-\r
-/*\r
- * This function makes the current window visible\r
- */\r
-void fgPlatformGlutShowWindow( void )\r
-{\r
-    ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_SHOW );\r
-}\r
-\r
-/*\r
- * This function hides the current window\r
- */\r
-void fgPlatformGlutHideWindow( void )\r
-{\r
-    ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_HIDE );\r
-}\r
-\r
-/*\r
- * Iconify the current window (top-level windows only)\r
- */\r
-void fgPlatformGlutIconifyWindow( void )\r
-{\r
-    ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_MINIMIZE );\r
-}\r
-\r
-/*\r
- * Set the current window's title\r
- */\r
-void fgPlatformGlutSetWindowTitle( const char* title )\r
-{\r
-#ifdef _WIN32_WCE\r
-    {\r
-        wchar_t* wstr = fghWstrFromStr(title);\r
-        SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr );\r
-        free(wstr);\r
-    }\r
-#else\r
-    SetWindowText( fgStructure.CurrentWindow->Window.Handle, title );\r
-#endif\r
-}\r
-\r
-/*\r
- * Set the current window's iconified title\r
- */\r
-void fgPlatformGlutSetIconTitle( const char* title )\r
-{\r
-#ifdef _WIN32_WCE\r
-    {\r
-        wchar_t* wstr = fghWstrFromStr(title);\r
-        SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr );\r
-        free(wstr);\r
-    }\r
-#else\r
-    SetWindowText( fgStructure.CurrentWindow->Window.Handle, title );\r
-#endif\r
-}\r
-\r
-/*\r
- * Change the current window's position\r
- */\r
-void fgPlatformGlutPositionWindow( int x, int y )\r
-{\r
-    RECT winRect;\r
-\r
-    /* "GetWindowRect" returns the pixel coordinates of the outside of the window */\r
-    GetWindowRect( fgStructure.CurrentWindow->Window.Handle, &winRect );\r
-    MoveWindow(\r
-        fgStructure.CurrentWindow->Window.Handle,\r
-        x,\r
-        y,\r
-        winRect.right - winRect.left,\r
-        winRect.bottom - winRect.top,\r
-        TRUE\r
-    );\r
-}\r
-\r
-/*\r
- * Lowers the current window (by Z order change)\r
- */\r
-void fgPlatformGlutPushWindow( void )\r
-{\r
-    SetWindowPos(\r
-        fgStructure.CurrentWindow->Window.Handle,\r
-        HWND_BOTTOM,\r
-        0, 0, 0, 0,\r
-        SWP_NOSIZE | SWP_NOMOVE\r
-    );\r
-}\r
-\r
-/*\r
- * Raises the current window (by Z order change)\r
- */\r
-void fgPlatformGlutPopWindow( void )\r
-{\r
-    SetWindowPos(\r
-        fgStructure.CurrentWindow->Window.Handle,\r
-        HWND_TOP,\r
-        0, 0, 0, 0,\r
-        SWP_NOSIZE | SWP_NOMOVE\r
-    );\r
-}\r
-\r
-/*\r
- * Resize the current window so that it fits the whole screen\r
- */\r
-void fgPlatformGlutFullScreen( SFG_Window *win )\r
-{\r
-#if !defined(_WIN32_WCE) /* FIXME: what about WinCE */\r
-\r
-    if (glutGet(GLUT_FULL_SCREEN))\r
-    {\r
-        /*  Leave full screen state before entering fullscreen again (resizing?) */\r
-        glutLeaveFullScreen();\r
-    }\r
-\r
-    {\r
-#if(WINVER >= 0x0500) /* Windows 2000 or later */\r
-        DWORD s;\r
-        RECT rect;\r
-        HMONITOR hMonitor;\r
-        MONITORINFO mi;\r
-\r
-        /* For fullscreen mode, first remove all window decoration\r
-         * and set style to popup so it will overlap the taskbar\r
-         * then force to maximize on the screen on which it has the most\r
-         * overlap.\r
-         */\r
-\r
-        \r
-        /* store current window rect */\r
-        GetWindowRect( win->Window.Handle, &win->State.pWState.OldRect );\r
-\r
-        /* store current window style */\r
-        win->State.pWState.OldStyle = s = GetWindowLong(win->Window.Handle, GWL_STYLE);\r
-\r
-        /* remove decorations from style and add popup style*/\r
-        s &= ~WS_OVERLAPPEDWINDOW;\r
-        s |= WS_POPUP;\r
-        SetWindowLong(win->Window.Handle, GWL_STYLE, s);\r
-        SetWindowPos(win->Window.Handle, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);\r
-\r
-        /* For fullscreen mode, find the monitor that is covered the most\r
-         * by the window and get its rect as the resize target.\r
-            */\r
-        hMonitor= MonitorFromRect(&win->State.pWState.OldRect, MONITOR_DEFAULTTONEAREST);\r
-        mi.cbSize = sizeof(mi);\r
-        GetMonitorInfo(hMonitor, &mi);\r
-        rect = mi.rcMonitor;\r
-#else   /* if (WINVER >= 0x0500) */\r
-        RECT rect;\r
-\r
-        /* For fullscreen mode, force the top-left corner to 0,0\r
-         * and adjust the window rectangle so that the client area\r
-         * covers the whole screen.\r
-         */\r
-\r
-        rect.left   = 0;\r
-        rect.top    = 0;\r
-        rect.right  = fgDisplay.ScreenWidth;\r
-        rect.bottom = fgDisplay.ScreenHeight;\r
-\r
-        AdjustWindowRect ( &rect, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS |\r
-                                  WS_CLIPCHILDREN, FALSE );\r
-#endif  /* (WINVER >= 0x0500) */\r
-\r
-        /*\r
-         * then resize window\r
-         * SWP_NOACTIVATE     Do not activate the window\r
-         * SWP_NOOWNERZORDER  Do not change position in z-order\r
-         * SWP_NOSENDCHANGING Suppress WM_WINDOWPOSCHANGING message\r
-         * SWP_NOZORDER       Retains the current Z order (ignore 2nd param)\r
-         */\r
-        SetWindowPos( fgStructure.CurrentWindow->Window.Handle,\r
-                      HWND_TOP,\r
-                      rect.left,\r
-                      rect.top,\r
-                      rect.right  - rect.left,\r
-                      rect.bottom - rect.top,\r
-                      SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING |\r
-                      SWP_NOZORDER\r
-                    );\r
-\r
-        win->State.IsFullscreen = GL_TRUE;\r
-    }\r
-#endif\r
-}\r
-\r
-/*\r
- * If we are fullscreen, resize the current window back to its original size\r
- */\r
-void fgPlatformGlutLeaveFullScreen( SFG_Window *win )\r
-{\r
-#if !defined(_WIN32_WCE) /* FIXME: what about WinCE */\r
-    if (!glutGet(GLUT_FULL_SCREEN))\r
-    {\r
-        /* nothing to do */\r
-        return;\r
-    }\r
-\r
-    /* restore style of window before making it fullscreen */\r
-    SetWindowLong(win->Window.Handle, GWL_STYLE, win->State.pWState.OldStyle);\r
-    SetWindowPos(win->Window.Handle, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);\r
-\r
-    /* Then resize */\r
-    SetWindowPos(win->Window.Handle,\r
-        HWND_TOP,\r
-        win->State.pWState.OldRect.left,\r
-        win->State.pWState.OldRect.top,\r
-        win->State.pWState.OldRect.right  - win->State.pWState.OldRect.left,\r
-        win->State.pWState.OldRect.bottom - win->State.pWState.OldRect.top,\r
-        SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING |\r
-        SWP_NOZORDER\r
-        );\r
-\r
-    win->State.IsFullscreen = GL_FALSE;\r
-#endif\r
-}\r
-\r
-/*\r
- * Toggle the window's full screen state.\r
- */\r
-void fgPlatformGlutFullScreenToggle( SFG_Window *win )\r
-{\r
-    if (!win->State.IsFullscreen)\r
-        glutFullScreen();\r
-    else\r
-        glutLeaveFullScreen();\r
-}\r
-\r
-\r
-/* -- PLATFORM-SPECIFIC INTERFACE FUNCTION -------------------------------------------------- */\r
-\r
-int FGAPIENTRY __glutCreateWindowWithExit( const char *title, void (__cdecl *exit_function)(int) )\r
-{\r
-  __glutExitFunc = exit_function;\r
-  return glutCreateWindow( title );\r
-}\r
-\r
+/*
+ * freeglut_window_mswin.c
+ *
+ * The Windows-specific mouse cursor related stuff.
+ *
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
+ * Written by John F. Fay, <fayjf@sourceforge.net>
+ * Creation date: Sun Jan 22, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#define FREEGLUT_BUILDING_LIB
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+
+/* The following include file is available from SGI but is not standard:
+ *   #include <GL/wglext.h>
+ * So we copy the necessary parts out of it.
+ * XXX: should local definitions for extensions be put in a separate include file?
+ */
+typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);
+
+typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
+
+#define WGL_DRAW_TO_WINDOW_ARB         0x2001
+#define WGL_ACCELERATION_ARB           0x2003
+#define WGL_SUPPORT_OPENGL_ARB         0x2010
+#define WGL_DOUBLE_BUFFER_ARB          0x2011
+#define WGL_COLOR_BITS_ARB             0x2014
+#define WGL_ALPHA_BITS_ARB             0x201B
+#define WGL_DEPTH_BITS_ARB             0x2022
+#define WGL_STENCIL_BITS_ARB           0x2023
+#define WGL_FULL_ACCELERATION_ARB      0x2027
+
+#define WGL_SAMPLE_BUFFERS_ARB         0x2041
+#define WGL_SAMPLES_ARB                0x2042
+
+#define WGL_TYPE_RGBA_FLOAT_ARB        0x21A0
+
+#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9
+
+#ifndef WGL_ARB_create_context
+#define WGL_ARB_create_context 1
+#ifdef WGL_WGLEXT_PROTOTYPES
+extern HGLRC WINAPI wglCreateContextAttribsARB (HDC, HGLRC, const int *);
+#endif /* WGL_WGLEXT_PROTOTYPES */
+typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList);
+
+#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
+
+#define WGL_CONTEXT_DEBUG_BIT_ARB      0x0001
+#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
+
+#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
+#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
+
+#define ERROR_INVALID_VERSION_ARB      0x2095
+#define ERROR_INVALID_PROFILE_ARB      0x2096
+#endif
+/* End of copying the necessary parts out of it. */
+
+#ifdef WM_TOUCH
+typedef BOOL (WINAPI *pRegisterTouchWindow)(HWND,ULONG);
+static pRegisterTouchWindow fghRegisterTouchWindow = (pRegisterTouchWindow)0xDEADBEEF;
+#endif
+
+/* 
+ * Helper functions for getting client area from the window rect
+ * and the window rect from the client area given the style of the window
+ * (or a valid window pointer from which the style can be queried).
+ */
+extern void fghGetBorderWidth(const DWORD windowStyle, int* xBorderWidth, int* yBorderWidth);
+
+
+/*
+ * Setup the pixel format for a Win32 window
+ */
+
+#if defined(_WIN32_WCE)
+static wchar_t* fghWstrFromStr(const char* str)
+{
+    int i,len=strlen(str);
+    wchar_t* wstr = (wchar_t*)malloc(2*len+2);
+    for(i=0; i<len; i++)
+        wstr[i] = str[i];
+    wstr[len] = 0;
+    return wstr;
+}
+#endif /* defined(_WIN32_WCE) */
+
+
+static void fghFillContextAttributes( int *attributes ) {
+  int where = 0, contextFlags, contextProfile;
+
+  if ( !fghIsLegacyContextVersionRequested() ) {
+    ATTRIB_VAL( WGL_CONTEXT_MAJOR_VERSION_ARB, fgState.MajorVersion );
+    ATTRIB_VAL( WGL_CONTEXT_MINOR_VERSION_ARB, fgState.MinorVersion );
+  }
+
+  contextFlags =
+    fghMapBit( fgState.ContextFlags, GLUT_DEBUG, WGL_CONTEXT_DEBUG_BIT_ARB ) |
+    fghMapBit( fgState.ContextFlags, GLUT_FORWARD_COMPATIBLE, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB );
+  if ( contextFlags != 0 ) {
+    ATTRIB_VAL( WGL_CONTEXT_FLAGS_ARB, contextFlags );
+  }
+
+  contextProfile =
+    fghMapBit( fgState.ContextProfile, GLUT_CORE_PROFILE, WGL_CONTEXT_CORE_PROFILE_BIT_ARB ) |
+    fghMapBit( fgState.ContextProfile, GLUT_COMPATIBILITY_PROFILE, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB );
+  if ( contextProfile != 0 ) {
+    ATTRIB_VAL( WGL_CONTEXT_PROFILE_MASK_ARB, contextProfile );
+  }
+
+  ATTRIB( 0 );
+}
+
+static int fghIsExtensionSupported( HDC hdc, const char *extension ) {
+    const char *pWglExtString;
+    PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetEntensionsStringARB =
+      (PFNWGLGETEXTENSIONSSTRINGARBPROC) wglGetProcAddress("wglGetExtensionsStringARB");
+    if ( wglGetEntensionsStringARB == NULL )
+    {
+      return FALSE;
+    }
+    pWglExtString = wglGetEntensionsStringARB( hdc );
+    return ( pWglExtString != NULL ) && ( strstr(pWglExtString, extension) != NULL );
+}
+
+void fgNewWGLCreateContext( SFG_Window* window )
+{
+    HGLRC context;
+    int attributes[9];
+    PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB;
+
+    /* If nothing fancy has been required, leave the context as it is */
+    if ( fghIsLegacyContextRequested() )
+    {
+        return;
+    }
+
+    wglMakeCurrent( window->Window.pContext.Device, window->Window.Context );
+
+    if ( !fghIsExtensionSupported( window->Window.pContext.Device, "WGL_ARB_create_context" ) )
+    {
+        return;
+    }
+
+    /* new context creation */
+    fghFillContextAttributes( attributes );
+
+    wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) wglGetProcAddress( "wglCreateContextAttribsARB" );
+    if ( wglCreateContextAttribsARB == NULL )
+    {
+        fgError( "wglCreateContextAttribsARB not found" );
+    }
+
+    context = wglCreateContextAttribsARB( window->Window.pContext.Device, 0, attributes );
+    if ( context == NULL )
+    {
+        fghContextCreationError();
+    }
+
+    wglMakeCurrent( NULL, NULL );
+    wglDeleteContext( window->Window.Context );
+    window->Window.Context = context;
+}
+
+#if !defined(_WIN32_WCE)
+
+static void fghFillPFD( PIXELFORMATDESCRIPTOR *ppfd, HDC hdc, unsigned char layer_type )
+{
+  int flags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
+  if ( fgState.DisplayMode & GLUT_DOUBLE ) {
+        flags |= PFD_DOUBLEBUFFER;
+  }
+  if ( fgState.DisplayMode & GLUT_STEREO ) {
+    flags |= PFD_STEREO;
+  }
+
+#if defined(_MSC_VER)
+#pragma message( "fgSetupPixelFormat(): there is still some work to do here!" )
+#endif
+
+  /* Specify which pixel format do we opt for... */
+  ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
+  ppfd->nVersion = 1;
+  ppfd->dwFlags = flags;
+
+  if( fgState.DisplayMode & GLUT_INDEX ) {
+    ppfd->iPixelType = PFD_TYPE_COLORINDEX;
+    ppfd->cRedBits = 0;
+    ppfd->cGreenBits = 0;
+    ppfd->cBlueBits = 0;
+    ppfd->cAlphaBits = 0;
+  } else {
+    ppfd->iPixelType = PFD_TYPE_RGBA;
+    ppfd->cRedBits = 8;
+    ppfd->cGreenBits = 8;
+    ppfd->cBlueBits = 8;
+    ppfd->cAlphaBits = ( fgState.DisplayMode & GLUT_ALPHA ) ? 8 : 0;
+  }
+
+  ppfd->cColorBits = 24;
+  ppfd->cRedShift = 0;
+  ppfd->cGreenShift = 0;
+  ppfd->cBlueShift = 0;
+  ppfd->cAlphaShift = 0;
+  ppfd->cAccumBits = ( fgState.DisplayMode & GLUT_ACCUM ) ? 1 : 0;
+  ppfd->cAccumRedBits = 0;
+  ppfd->cAccumGreenBits = 0;
+  ppfd->cAccumBlueBits = 0;
+  ppfd->cAccumAlphaBits = 0;
+
+  /* Hmmm, or 32/0 instead of 24/8? */
+  ppfd->cDepthBits = 24;
+  ppfd->cStencilBits = 8;
+
+  ppfd->cAuxBuffers = fghNumberOfAuxBuffersRequested();
+  ppfd->iLayerType = layer_type;
+  ppfd->bReserved = 0;
+  ppfd->dwLayerMask = 0;
+  ppfd->dwVisibleMask = 0;
+  ppfd->dwDamageMask = 0;
+  
+  ppfd->cColorBits = (BYTE) GetDeviceCaps( hdc, BITSPIXEL );
+}
+
+static void fghFillPixelFormatAttributes( int *attributes, const PIXELFORMATDESCRIPTOR *ppfd )
+{
+  int where = 0;
+
+  ATTRIB_VAL( WGL_DRAW_TO_WINDOW_ARB, GL_TRUE );
+  ATTRIB_VAL( WGL_SUPPORT_OPENGL_ARB, GL_TRUE );
+  ATTRIB_VAL( WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB );
+
+  ATTRIB_VAL( WGL_COLOR_BITS_ARB, ppfd->cColorBits );
+  ATTRIB_VAL( WGL_ALPHA_BITS_ARB, ppfd->cAlphaBits );
+  ATTRIB_VAL( WGL_DEPTH_BITS_ARB, ppfd->cDepthBits );
+  ATTRIB_VAL( WGL_STENCIL_BITS_ARB, ppfd->cStencilBits );
+
+  ATTRIB_VAL( WGL_DOUBLE_BUFFER_ARB, ( fgState.DisplayMode & GLUT_DOUBLE ) != 0 );
+
+  if ( fgState.DisplayMode & GLUT_SRGB ) {
+    ATTRIB_VAL( WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB, TRUE );
+  }
+
+  ATTRIB_VAL( WGL_SAMPLE_BUFFERS_ARB, GL_TRUE );
+  ATTRIB_VAL( WGL_SAMPLES_ARB, fgState.SampleNumber );
+  ATTRIB( 0 );
+}
+#endif
+
+GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
+                              unsigned char layer_type )
+{
+#if defined(_WIN32_WCE)
+    return GL_TRUE;
+#else
+    PIXELFORMATDESCRIPTOR pfd;
+    PIXELFORMATDESCRIPTOR* ppfd = &pfd;
+    int pixelformat;
+    HDC current_hDC;
+    GLboolean success;
+
+    if (checkOnly)
+      current_hDC = CreateDC(TEXT("DISPLAY"), NULL ,NULL ,NULL);
+    else
+      current_hDC = window->Window.pContext.Device;
+
+    fghFillPFD( ppfd, current_hDC, layer_type );
+    pixelformat = ChoosePixelFormat( current_hDC, ppfd );
+
+    /* windows hack for multismapling/sRGB */
+    if ( ( fgState.DisplayMode & GLUT_MULTISAMPLE ) ||
+         ( fgState.DisplayMode & GLUT_SRGB ) )
+    {        
+        HGLRC rc, rc_before=wglGetCurrentContext();
+        HWND hWnd;
+        HDC hDC, hDC_before=wglGetCurrentDC();
+        WNDCLASS wndCls;
+
+        /* create a dummy window */
+        ZeroMemory(&wndCls, sizeof(wndCls));
+        wndCls.lpfnWndProc = DefWindowProc;
+        wndCls.hInstance = fgDisplay.pDisplay.Instance;
+        wndCls.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
+        wndCls.lpszClassName = _T("FREEGLUT_dummy");
+        RegisterClass( &wndCls );
+
+        hWnd=CreateWindow(_T("FREEGLUT_dummy"), _T(""), WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW , 0,0,0,0, 0, 0, fgDisplay.pDisplay.Instance, 0 );
+        hDC=GetDC(hWnd);
+        SetPixelFormat( hDC, pixelformat, ppfd );
+
+        rc = wglCreateContext( hDC );
+        wglMakeCurrent(hDC, rc);
+
+        if ( fghIsExtensionSupported( hDC, "WGL_ARB_multisample" ) )
+        {
+            PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARBProc =
+              (PFNWGLCHOOSEPIXELFORMATARBPROC) wglGetProcAddress("wglChoosePixelFormatARB");
+            if ( wglChoosePixelFormatARBProc )
+            {
+                int attributes[100];
+                int iPixelFormat;
+                BOOL bValid;
+                float fAttributes[] = { 0, 0 };
+                UINT numFormats;
+                fghFillPixelFormatAttributes( attributes, ppfd );
+                bValid = wglChoosePixelFormatARBProc(hDC, attributes, fAttributes, 1, &iPixelFormat, &numFormats);
+
+                if ( bValid && numFormats > 0 )
+                {
+                    pixelformat = iPixelFormat;
+                }
+            }
+        }
+
+        wglMakeCurrent( hDC_before, rc_before);
+        wglDeleteContext(rc);
+        ReleaseDC(hWnd, hDC);
+        DestroyWindow(hWnd);
+        UnregisterClass(_T("FREEGLUT_dummy"), fgDisplay.pDisplay.Instance);
+    }
+
+    success = ( pixelformat != 0 ) && ( checkOnly || SetPixelFormat( current_hDC, pixelformat, ppfd ) );
+
+    if (checkOnly)
+        DeleteDC(current_hDC);
+
+    return success;
+#endif /* defined(_WIN32_WCE) */
+}
+
+
+
+void fgPlatformSetWindow ( SFG_Window *window )
+{
+    if ( window != fgStructure.CurrentWindow )
+    {
+        if( fgStructure.CurrentWindow )
+            ReleaseDC( fgStructure.CurrentWindow->Window.Handle,
+                       fgStructure.CurrentWindow->Window.pContext.Device );
+
+        if ( window )
+        {
+            window->Window.pContext.Device = GetDC( window->Window.Handle );
+            wglMakeCurrent(
+                window->Window.pContext.Device,
+                window->Window.Context
+            );
+        }
+    }
+}
+
+
+
+/* Computes position of corners of window Rect (outer position including
+ * decorations) based on the provided client rect and based on the style
+ * of the window in question.
+ * If posIsOutside is set to true, the input client Rect is taken to follow
+ * freeGLUT's window specification convention in which the top-left corner
+ * is at the outside of the window, while the size
+ * (rect.right-rect.left,rect.bottom-rect.top) is the size of the drawable
+ * area.
+ */
+void fghComputeWindowRectFromClientArea_UseStyle( const DWORD windowStyle, RECT *clientRect, BOOL posIsOutside )
+{
+    int xBorderWidth = 0, yBorderWidth = 0;
+
+    /* If window has title bar, correct rect for it */
+    if (windowStyle & WS_MAXIMIZEBOX) /* Need to query for WS_MAXIMIZEBOX to see if we have a title bar, the WS_CAPTION query is also true for a WS_DLGFRAME only... */
+        if (posIsOutside)
+            clientRect->bottom += GetSystemMetrics( SM_CYCAPTION );
+        else
+            clientRect->top -= GetSystemMetrics( SM_CYCAPTION );
+
+    /* get width of window's borders (frame), correct rect for it.
+     * Note, borders can be of zero width if style does not specify borders
+     */
+    fghGetBorderWidth(windowStyle, &xBorderWidth, &yBorderWidth);
+    if (posIsOutside)
+    {
+        clientRect->right  += xBorderWidth * 2;
+        clientRect->bottom += yBorderWidth * 2;
+    }
+    else
+    {
+        clientRect->left   -= xBorderWidth;
+        clientRect->right  += xBorderWidth;
+        clientRect->top    -= yBorderWidth;
+        clientRect->bottom += yBorderWidth;
+    }
+}
+
+/* Computes position of corners of window Rect (outer position including
+ * decorations) based on the provided client rect and based on the style
+ * of the window in question. If the window pointer or the window handle
+ * is NULL, a fully decorated window (caption and border) is assumed.
+ * Furthermore, if posIsOutside is set to true, the input client Rect is
+ * taken to follow freeGLUT's window specification convention in which the
+ * top-left corner is at the outside of the window, while the size
+ * (rect.right-rect.left,rect.bottom-rect.top) is the size of the drawable
+ * area.
+*/
+void fghComputeWindowRectFromClientArea_QueryWindow( const SFG_Window *window, RECT *clientRect, BOOL posIsOutside )
+{
+    DWORD windowStyle = 0;
+
+    if (window && window->Window.Handle)
+        windowStyle = GetWindowLong(window->Window.Handle, GWL_STYLE);
+    else
+        windowStyle = WS_OVERLAPPEDWINDOW;
+
+    fghComputeWindowRectFromClientArea_UseStyle(windowStyle, clientRect, posIsOutside);
+}
+
+/* Computes position of corners of client area (drawable area) of a window
+ * based on the provided window Rect (outer position including decorations)
+ * and based on the style of the window in question. If the window pointer
+ * or the window handle is NULL, a fully decorated window (caption and
+ * border) is assumed.
+ * Furthermore, if wantPosOutside is set to true, the output client Rect
+ * will follow freeGLUT's window specification convention in which the
+ * top-left corner is at the outside of the window, the size
+ * (rect.right-rect.left,rect.bottom-rect.top) is the size of the drawable
+ * area.
+ */
+void fghComputeClientAreaFromWindowRect( const SFG_Window *window, RECT *windowRect, BOOL wantPosOutside )
+{
+    DWORD windowStyle = 0;
+    int xBorderWidth = 0, yBorderWidth = 0;
+
+    if (window && window->Window.Handle)
+        windowStyle = GetWindowLong(window->Window.Handle, GWL_STYLE);
+    else
+        windowStyle = WS_OVERLAPPEDWINDOW;
+
+    /* If window has title bar, correct rect for it */
+    if (windowStyle & WS_MAXIMIZEBOX) /* Need to query for WS_MAXIMIZEBOX to see if we have a title bar, the WS_CAPTION query is also true for a WS_DLGFRAME only... */
+        if (wantPosOutside)
+            windowRect->bottom -= GetSystemMetrics( SM_CYCAPTION );
+        else
+            windowRect->top    += GetSystemMetrics( SM_CYCAPTION );
+
+    /* get width of window's borders (frame), correct rect for it.
+     * Note, borders can be of zero width if style does not specify borders
+     */
+    fghGetBorderWidth(windowStyle, &xBorderWidth, &yBorderWidth);
+    if (wantPosOutside)
+    {
+        windowRect->right  -= xBorderWidth * 2;
+        windowRect->bottom -= yBorderWidth * 2;
+    }
+    else
+    {
+        windowRect->left   += xBorderWidth;
+        windowRect->right  -= xBorderWidth;
+        windowRect->top    += yBorderWidth;
+        windowRect->bottom -= yBorderWidth;
+    }
+}
+
+/* Gets the rect describing the client area (drawable area) of the
+ * specified window.
+ * Returns an empty rect if window pointer or window handle is NULL.
+ * If wantPosOutside is set to true, the output client Rect
+ * will follow freeGLUT's window specification convention in which the
+ * top-left corner is at the outside of the window, while the size
+ * (rect.right-rect.left,rect.bottom-rect.top) is the size of the drawable
+ * area.
+ */
+RECT fghGetClientArea( const SFG_Window *window, BOOL wantPosOutside )
+{
+    RECT windowRect = {0,0,0,0};
+
+    freeglut_return_val_if_fail((window && window->Window.Handle),windowRect);
+    
+    /*
+     * call GetWindowRect()
+     * (this returns the pixel coordinates of the outside of the window)
+     */
+    GetWindowRect( window->Window.Handle, &windowRect );
+
+    /* Then correct the results */
+    fghComputeClientAreaFromWindowRect(window, &windowRect, wantPosOutside);
+
+    return windowRect;
+}
+
+/* Returns the width of the window borders based on the window's style.
+ */
+void fghGetBorderWidth(const DWORD windowStyle, int* xBorderWidth, int* yBorderWidth)
+{
+    if (windowStyle & WS_THICKFRAME)
+    {
+        *xBorderWidth = GetSystemMetrics(SM_CXSIZEFRAME);
+        *yBorderWidth = GetSystemMetrics(SM_CYSIZEFRAME);
+    }
+    else if (windowStyle & WS_DLGFRAME)
+    {
+        *xBorderWidth = GetSystemMetrics(SM_CXFIXEDFRAME);
+        *yBorderWidth = GetSystemMetrics(SM_CYFIXEDFRAME);
+    }
+    else
+    {
+        *xBorderWidth = 0;
+        *yBorderWidth = 0;
+    }
+}
+
+#if(WINVER >= 0x500)
+typedef struct
+{
+      int *x;
+      int *y;
+      const char *name;
+} m_proc_t;
+
+static BOOL CALLBACK m_proc(HMONITOR mon,
+                           HDC hdc,
+                           LPRECT rect,
+                           LPARAM data)
+{
+      m_proc_t *dp=(m_proc_t *)data;
+      MONITORINFOEX info;
+      BOOL res;
+      info.cbSize=sizeof(info);
+      res=GetMonitorInfo(mon,(LPMONITORINFO)&info);
+      if( res )
+      {
+          if( strcmp(dp->name,info.szDevice)==0 )
+          {
+              *(dp->x)=info.rcMonitor.left;
+              *(dp->y)=info.rcMonitor.top;
+              return FALSE;
+          }
+      }
+      return TRUE;
+}
+
+/* 
+ * this function returns the origin of the screen identified by
+ * fgDisplay.pDisplay.DisplayName, and 0 otherwise.
+ * This is used in fgOpenWindow to open the gamemode window on the screen
+ * identified by the -display command line argument. The function should
+ * not be called otherwise.
+ */
+
+static void get_display_origin(int *xp,int *yp)
+{
+    *xp = 0;
+    *yp = 0;
+
+    if( fgDisplay.pDisplay.DisplayName )
+    {
+        m_proc_t st;
+        st.x=xp;
+        st.y=yp;
+        st.name=fgDisplay.pDisplay.DisplayName;
+        EnumDisplayMonitors(0,0,m_proc,(LPARAM)&st);
+    }
+}
+#else
+#pragma message( "-display parameter only works if compiled with WINVER >= 0x0500")
+
+static void get_display_origin(int *xp,int *yp)
+{
+    *xp = 0;
+    *yp = 0;
+
+    if( fgDisplay.pDisplay.DisplayName )
+    {
+        fgWarning( "for working -display support FreeGLUT must be compiled with WINVER >= 0x0500");
+    }
+}
+#endif
+
+
+
+/*
+ * Opens a window. Requires a SFG_Window object created and attached
+ * to the freeglut structure. OpenGL context is created here.
+ */
+void fgPlatformOpenWindow( SFG_Window* window, const char* title,
+                           GLboolean positionUse, int x, int y,
+                           GLboolean sizeUse, int w, int h,
+                           GLboolean gameMode, GLboolean isSubWindow )
+{
+
+    WNDCLASS wc;
+    DWORD flags   = 0;
+    DWORD exFlags = 0;
+    ATOM atom;
+
+    /* Grab the window class we have registered on glutInit(): */
+    atom = GetClassInfo( fgDisplay.pDisplay.Instance, _T("FREEGLUT"), &wc );
+    FREEGLUT_INTERNAL_ERROR_EXIT ( atom, "Window Class Info Not Found",
+                                   "fgOpenWindow" );
+
+    /* Determine window style flags*/
+    if( gameMode )
+    {
+        FREEGLUT_INTERNAL_ERROR_EXIT ( window->Parent == NULL,
+                                       "Game mode being invoked on a subwindow",
+                                       "fgOpenWindow" );
+
+        /*
+         * Set the window creation flags appropriately to make the window
+         * entirely visible:
+         */
+        flags = WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE;
+    }
+    else
+    {
+        flags = WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
+
+        /*
+         * There's a small difference between creating the top, child and
+         * menu windows
+         */
+        if ( window->IsMenu )
+        {
+            flags |= WS_POPUP;
+            exFlags |= WS_EX_TOOLWINDOW;
+        }
+#if defined(_WIN32_WCE)
+        /* no decorations for windows CE */
+#else
+        /* if this is not a subwindow (child), set its style based on the requested display mode */
+        else if( window->Parent == NULL )
+            if ( fgState.DisplayMode & GLUT_BORDERLESS )
+            {
+                /* no window decorations needed */
+            }
+            else if ( fgState.DisplayMode & GLUT_CAPTIONLESS )
+                /* only window decoration is a border, no title bar or buttons */
+                flags |= WS_DLGFRAME;
+            else
+                /* window decoration are a border, title bar and buttons.
+                 * NB: we later query whether the window has a title bar or
+                 * not by testing for the maximize button, as the test for
+                 * WS_CAPTION can be true without the window having a title
+                 * bar. This style WS_OVERLAPPEDWINDOW gives you a maximize
+                 * button. */
+                flags |= WS_OVERLAPPEDWINDOW;
+#endif
+        else
+            /* subwindows always have no decoration, but are marked as a child window to the OS */
+            flags |= WS_CHILD;
+    }
+
+    /* determine window size and position */
+    if( gameMode )
+    {
+        /* if in gamemode, query the origin of specified by the -display
+         * command line parameter (if any) and offset the upper-left corner
+         * of the window so we create the window on that screen.
+         * The -display argument doesn't do anything if not trying to enter
+         * gamemode.
+         */
+        int xoff=0, yoff=0;
+        get_display_origin(&xoff,&yoff);
+        x += xoff;
+        y += yoff;
+    }
+    if( !positionUse )
+    {
+        x = CW_USEDEFAULT;
+        y = CW_USEDEFAULT;
+    }
+    if( !sizeUse )
+    {
+        if( ! window->IsMenu )
+        {
+            w = CW_USEDEFAULT;
+            h = CW_USEDEFAULT;
+        }
+        else /* fail safe - Windows can make a window of size (0, 0) */
+            w = h = 300; /* default window size */
+    }
+    /* store requested client area width and height */
+    window->State.Width = w;
+    window->State.Height = h;
+
+#if !defined(_WIN32_WCE)    /* no decorations for windows CE */
+    if( sizeUse )
+    {
+        RECT windowRect;
+        /*
+         * Update the window dimensions, taking the window decorations
+         * into account.  FreeGLUT is to create the window with the
+         * topleft outside corner at (x,y) and with client area
+         * dimensions (w,h).
+         * note: don't need to do this when w=h=CW_USEDEFAULT, so in the
+         * if( sizeUse ) here is convenient.
+         */
+        windowRect.left     = x;
+        windowRect.top      = y;
+        windowRect.right    = x+w;
+        windowRect.bottom   = y+h;
+
+        fghComputeWindowRectFromClientArea_UseStyle(flags,&windowRect,TRUE);
+
+        w = windowRect.right - windowRect.left;
+        h = windowRect.bottom- windowRect.top;
+    }
+#endif /* !defined(_WIN32_WCE) */
+
+#if defined(_WIN32_WCE)
+    {
+        wchar_t* wstr = fghWstrFromStr(title);
+
+        window->Window.Handle = CreateWindow(
+            _T("FREEGLUT"),
+            wstr,
+            WS_VISIBLE | WS_POPUP,
+            0,0, 240,320,
+            NULL,
+            NULL,
+            fgDisplay.pDisplay.Instance,
+            (LPVOID) window
+        );
+
+        free(wstr);
+
+        SHFullScreen(window->Window.Handle, SHFS_HIDESTARTICON);
+        SHFullScreen(window->Window.Handle, SHFS_HIDESIPBUTTON);
+        SHFullScreen(window->Window.Handle, SHFS_HIDETASKBAR);
+        MoveWindow(window->Window.Handle, 0, 0, 240, 320, TRUE);
+        ShowWindow(window->Window.Handle, SW_SHOW);
+        UpdateWindow(window->Window.Handle);
+    }
+#else
+    window->Window.Handle = CreateWindowEx(
+        exFlags,
+        _T("FREEGLUT"),
+        title,
+        flags,
+        x, y, w, h,
+        (HWND) window->Parent == NULL ? NULL : window->Parent->Window.Handle,
+        (HMENU) NULL,
+        fgDisplay.pDisplay.Instance,
+        (LPVOID) window
+    );
+#endif /* defined(_WIN32_WCE) */
+
+    if( !( window->Window.Handle ) )
+        fgError( "Failed to create a window (%s)!", title );
+
+#if !defined(_WIN32_WCE)
+    /* Need to set requested style again, apparently Windows doesn't listen when requesting windows without title bar or borders */
+    SetWindowLong(window->Window.Handle, GWL_STYLE, flags);
+    SetWindowPos(window->Window.Handle, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
+#endif /* defined(_WIN32_WCE) */
+
+    /* Make a menu window always on top - fix Feature Request 947118 */
+    if( window->IsMenu || gameMode )
+        SetWindowPos(
+                        window->Window.Handle,
+                        HWND_TOPMOST,
+                        0, 0, 0, 0,
+                        SWP_NOMOVE | SWP_NOSIZE
+                    );
+
+    /* Enable multitouch: additional flag TWF_FINETOUCH, TWF_WANTPALM */
+    #ifdef WM_TOUCH
+        if (fghRegisterTouchWindow == (pRegisterTouchWindow)0xDEADBEEF) 
+                       fghRegisterTouchWindow = (pRegisterTouchWindow)GetProcAddress(GetModuleHandle("user32"),"RegisterTouchWindow");
+               if (fghRegisterTouchWindow)
+             fghRegisterTouchWindow( window->Window.Handle, TWF_FINETOUCH | TWF_WANTPALM );
+    #endif
+
+#if defined(_WIN32_WCE)
+    ShowWindow( window->Window.Handle, SW_SHOW );
+#else
+    ShowWindow( window->Window.Handle,
+                fgState.ForceIconic ? SW_SHOWMINIMIZED : SW_SHOW );
+#endif /* defined(_WIN32_WCE) */
+
+    UpdateWindow( window->Window.Handle );
+    ShowCursor( TRUE );  /* XXX Old comments say "hide cursor"! */
+
+}
+
+
+/*
+ * Closes a window, destroying the frame and OpenGL context
+ */
+void fgPlatformCloseWindow( SFG_Window* window )
+{
+    /* Make sure we don't close a window with current context active */
+    if( fgStructure.CurrentWindow == window )
+        wglMakeCurrent( NULL, NULL );
+
+    /*
+     * Step through the list of windows.  If the rendering context
+     * is not being used by another window, then we delete it.
+     */
+    {
+        int used = FALSE ;
+        SFG_Window *iter ;
+
+        for( iter = (SFG_Window *)fgStructure.Windows.First;
+             iter;
+             iter = (SFG_Window *)iter->Node.Next )
+        {
+            if( ( iter->Window.Context == window->Window.Context ) &&
+                ( iter != window ) )
+                used = TRUE;
+        }
+
+        if( ! used )
+            wglDeleteContext( window->Window.Context );
+    }
+
+    DestroyWindow( window->Window.Handle );
+}
+
+
+
+/*
+ * This function makes the current window visible
+ */
+void fgPlatformGlutShowWindow( void )
+{
+    ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_SHOW );
+}
+
+/*
+ * This function hides the current window
+ */
+void fgPlatformGlutHideWindow( void )
+{
+    ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_HIDE );
+}
+
+/*
+ * Iconify the current window (top-level windows only)
+ */
+void fgPlatformGlutIconifyWindow( void )
+{
+    ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_MINIMIZE );
+}
+
+/*
+ * Set the current window's title
+ */
+void fgPlatformGlutSetWindowTitle( const char* title )
+{
+#ifdef _WIN32_WCE
+    {
+        wchar_t* wstr = fghWstrFromStr(title);
+        SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr );
+        free(wstr);
+    }
+#else
+    SetWindowText( fgStructure.CurrentWindow->Window.Handle, title );
+#endif
+}
+
+/*
+ * Set the current window's iconified title
+ */
+void fgPlatformGlutSetIconTitle( const char* title )
+{
+#ifdef _WIN32_WCE
+    {
+        wchar_t* wstr = fghWstrFromStr(title);
+        SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr );
+        free(wstr);
+    }
+#else
+    SetWindowText( fgStructure.CurrentWindow->Window.Handle, title );
+#endif
+}
+
+/*
+ * Change the current window's position
+ */
+void fgPlatformGlutPositionWindow( int x, int y )
+{
+    RECT winRect;
+
+    /* "GetWindowRect" returns the pixel coordinates of the outside of the window */
+    GetWindowRect( fgStructure.CurrentWindow->Window.Handle, &winRect );
+    MoveWindow(
+        fgStructure.CurrentWindow->Window.Handle,
+        x,
+        y,
+        winRect.right - winRect.left,
+        winRect.bottom - winRect.top,
+        TRUE
+    );
+}
+
+/*
+ * Lowers the current window (by Z order change)
+ */
+void fgPlatformGlutPushWindow( void )
+{
+    SetWindowPos(
+        fgStructure.CurrentWindow->Window.Handle,
+        HWND_BOTTOM,
+        0, 0, 0, 0,
+        SWP_NOSIZE | SWP_NOMOVE
+    );
+}
+
+/*
+ * Raises the current window (by Z order change)
+ */
+void fgPlatformGlutPopWindow( void )
+{
+    SetWindowPos(
+        fgStructure.CurrentWindow->Window.Handle,
+        HWND_TOP,
+        0, 0, 0, 0,
+        SWP_NOSIZE | SWP_NOMOVE
+    );
+}
+
+/*
+ * Resize the current window so that it fits the whole screen
+ */
+void fgPlatformGlutFullScreen( SFG_Window *win )
+{
+#if !defined(_WIN32_WCE) /* FIXME: what about WinCE */
+
+    if (glutGet(GLUT_FULL_SCREEN))
+    {
+        /*  Leave full screen state before entering fullscreen again (resizing?) */
+        glutLeaveFullScreen();
+    }
+
+    {
+#if(WINVER >= 0x0500) /* Windows 2000 or later */
+        DWORD s;
+        RECT rect;
+        HMONITOR hMonitor;
+        MONITORINFO mi;
+
+        /* For fullscreen mode, first remove all window decoration
+         * and set style to popup so it will overlap the taskbar
+         * then force to maximize on the screen on which it has the most
+         * overlap.
+         */
+
+        
+        /* store current window rect */
+        GetWindowRect( win->Window.Handle, &win->State.pWState.OldRect );
+
+        /* store current window style */
+        win->State.pWState.OldStyle = s = GetWindowLong(win->Window.Handle, GWL_STYLE);
+
+        /* remove decorations from style and add popup style*/
+        s &= ~WS_OVERLAPPEDWINDOW;
+        s |= WS_POPUP;
+        SetWindowLong(win->Window.Handle, GWL_STYLE, s);
+        SetWindowPos(win->Window.Handle, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
+
+        /* For fullscreen mode, find the monitor that is covered the most
+         * by the window and get its rect as the resize target.
+            */
+        hMonitor= MonitorFromRect(&win->State.pWState.OldRect, MONITOR_DEFAULTTONEAREST);
+        mi.cbSize = sizeof(mi);
+        GetMonitorInfo(hMonitor, &mi);
+        rect = mi.rcMonitor;
+#else   /* if (WINVER >= 0x0500) */
+        RECT rect;
+
+        /* For fullscreen mode, force the top-left corner to 0,0
+         * and adjust the window rectangle so that the client area
+         * covers the whole screen.
+         */
+
+        rect.left   = 0;
+        rect.top    = 0;
+        rect.right  = fgDisplay.ScreenWidth;
+        rect.bottom = fgDisplay.ScreenHeight;
+
+        AdjustWindowRect ( &rect, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS |
+                                  WS_CLIPCHILDREN, FALSE );
+#endif  /* (WINVER >= 0x0500) */
+
+        /*
+         * then resize window
+         * SWP_NOACTIVATE     Do not activate the window
+         * SWP_NOOWNERZORDER  Do not change position in z-order
+         * SWP_NOSENDCHANGING Suppress WM_WINDOWPOSCHANGING message
+         * SWP_NOZORDER       Retains the current Z order (ignore 2nd param)
+         */
+        SetWindowPos( fgStructure.CurrentWindow->Window.Handle,
+                      HWND_TOP,
+                      rect.left,
+                      rect.top,
+                      rect.right  - rect.left,
+                      rect.bottom - rect.top,
+                      SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING |
+                      SWP_NOZORDER
+                    );
+
+        win->State.IsFullscreen = GL_TRUE;
+    }
+#endif
+}
+
+/*
+ * If we are fullscreen, resize the current window back to its original size
+ */
+void fgPlatformGlutLeaveFullScreen( SFG_Window *win )
+{
+#if !defined(_WIN32_WCE) /* FIXME: what about WinCE */
+    if (!glutGet(GLUT_FULL_SCREEN))
+    {
+        /* nothing to do */
+        return;
+    }
+
+    /* restore style of window before making it fullscreen */
+    SetWindowLong(win->Window.Handle, GWL_STYLE, win->State.pWState.OldStyle);
+    SetWindowPos(win->Window.Handle, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
+
+    /* Then resize */
+    SetWindowPos(win->Window.Handle,
+        HWND_TOP,
+        win->State.pWState.OldRect.left,
+        win->State.pWState.OldRect.top,
+        win->State.pWState.OldRect.right  - win->State.pWState.OldRect.left,
+        win->State.pWState.OldRect.bottom - win->State.pWState.OldRect.top,
+        SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING |
+        SWP_NOZORDER
+        );
+
+    win->State.IsFullscreen = GL_FALSE;
+#endif
+}
+
+/*
+ * Toggle the window's full screen state.
+ */
+void fgPlatformGlutFullScreenToggle( SFG_Window *win )
+{
+    if (!win->State.IsFullscreen)
+        glutFullScreen();
+    else
+        glutLeaveFullScreen();
+}
+
+
+/* -- PLATFORM-SPECIFIC INTERFACE FUNCTION -------------------------------------------------- */
+
+int FGAPIENTRY __glutCreateWindowWithExit( const char *title, void (__cdecl *exit_function)(int) )
+{
+  __glutExitFunc = exit_function;
+  return glutCreateWindow( title );
+}
+
index 420ec78..5c2dd90 100644 (file)
-/*\r
- * freeglut_cursor_x11.c\r
- *\r
- * The Windows-specific mouse cursor related stuff.\r
- *\r
- * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
- * Written by John F. Fay, <fayjf@sourceforge.net>\r
- * Creation date: Sun Feb 5, 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-/* This code is for Posix/X11, Solaris, and OSX */\r
-#include <X11/cursorfont.h>\r
-\r
-/*\r
- * A factory method for an empty cursor\r
- */\r
-static Cursor getEmptyCursor( void )\r
-{\r
-    static Cursor cursorNone = None;\r
-    if( cursorNone == None ) {\r
-        char cursorNoneBits[ 32 ];\r
-        XColor dontCare;\r
-        Pixmap cursorNonePixmap;\r
-        memset( cursorNoneBits, 0, sizeof( cursorNoneBits ) );\r
-        memset( &dontCare, 0, sizeof( dontCare ) );\r
-        cursorNonePixmap = XCreateBitmapFromData ( fgDisplay.pDisplay.Display,\r
-                                                   fgDisplay.pDisplay.RootWindow,\r
-                                                   cursorNoneBits, 16, 16 );\r
-        if( cursorNonePixmap != None ) {\r
-            cursorNone = XCreatePixmapCursor( fgDisplay.pDisplay.Display,\r
-                                              cursorNonePixmap, cursorNonePixmap,\r
-                                              &dontCare, &dontCare, 0, 0 );\r
-            XFreePixmap( fgDisplay.pDisplay.Display, cursorNonePixmap );\r
-        }\r
-    }\r
-    return cursorNone;\r
-}\r
-\r
-typedef struct tag_cursorCacheEntry cursorCacheEntry;\r
-struct tag_cursorCacheEntry {\r
-    unsigned int cursorShape;    /* an XC_foo value */\r
-    Cursor cachedCursor;         /* None if the corresponding cursor has\r
-                                    not been created yet */\r
-};\r
-\r
-/*\r
- * Note: The arrangement of the table below depends on the fact that\r
- * the "normal" GLUT_CURSOR_* values start a 0 and are consecutive.\r
- */ \r
-static cursorCacheEntry cursorCache[] = {\r
-    { XC_arrow,               None }, /* GLUT_CURSOR_RIGHT_ARROW */\r
-    { XC_top_left_arrow,      None }, /* GLUT_CURSOR_LEFT_ARROW */\r
-    { XC_hand1,               None }, /* GLUT_CURSOR_INFO */\r
-    { XC_pirate,              None }, /* GLUT_CURSOR_DESTROY */\r
-    { XC_question_arrow,      None }, /* GLUT_CURSOR_HELP */\r
-    { XC_exchange,            None }, /* GLUT_CURSOR_CYCLE */\r
-    { XC_spraycan,            None }, /* GLUT_CURSOR_SPRAY */\r
-    { XC_watch,               None }, /* GLUT_CURSOR_WAIT */\r
-    { XC_xterm,               None }, /* GLUT_CURSOR_TEXT */\r
-    { XC_crosshair,           None }, /* GLUT_CURSOR_CROSSHAIR */\r
-    { XC_sb_v_double_arrow,   None }, /* GLUT_CURSOR_UP_DOWN */\r
-    { XC_sb_h_double_arrow,   None }, /* GLUT_CURSOR_LEFT_RIGHT */\r
-    { XC_top_side,            None }, /* GLUT_CURSOR_TOP_SIDE */\r
-    { XC_bottom_side,         None }, /* GLUT_CURSOR_BOTTOM_SIDE */\r
-    { XC_left_side,           None }, /* GLUT_CURSOR_LEFT_SIDE */\r
-    { XC_right_side,          None }, /* GLUT_CURSOR_RIGHT_SIDE */\r
-    { XC_top_left_corner,     None }, /* GLUT_CURSOR_TOP_LEFT_CORNER */\r
-    { XC_top_right_corner,    None }, /* GLUT_CURSOR_TOP_RIGHT_CORNER */\r
-    { XC_bottom_right_corner, None }, /* GLUT_CURSOR_BOTTOM_RIGHT_CORNER */\r
-    { XC_bottom_left_corner,  None }  /* GLUT_CURSOR_BOTTOM_LEFT_CORNER */\r
-};\r
-\r
-void fgPlatformSetCursor ( SFG_Window *window, int cursorID )\r
-{\r
-    Cursor cursor;\r
-    /*\r
-     * XXX FULL_CROSSHAIR demotes to plain CROSSHAIR. Old GLUT allows\r
-     * for this, but if there is a system that easily supports a full-\r
-     * window (or full-screen) crosshair, we might consider it.\r
-     */\r
-    int cursorIDToUse =\r
-        ( cursorID == GLUT_CURSOR_FULL_CROSSHAIR ) ? GLUT_CURSOR_CROSSHAIR : cursorID;\r
-\r
-    if( ( cursorIDToUse >= 0 ) &&\r
-        ( cursorIDToUse < sizeof( cursorCache ) / sizeof( cursorCache[0] ) ) ) {\r
-        cursorCacheEntry *entry = &cursorCache[ cursorIDToUse ];\r
-        if( entry->cachedCursor == None ) {\r
-            entry->cachedCursor =\r
-                XCreateFontCursor( fgDisplay.pDisplay.Display, entry->cursorShape );\r
-        }\r
-        cursor = entry->cachedCursor;\r
-    } else {\r
-        switch( cursorIDToUse )\r
-        {\r
-        case GLUT_CURSOR_NONE:\r
-            cursor = getEmptyCursor( );\r
-            break;\r
-\r
-        case GLUT_CURSOR_INHERIT:\r
-            cursor = None;\r
-            break;\r
-\r
-        default:\r
-            fgError( "Unknown cursor type: %d", cursorIDToUse );\r
-            return;\r
-        }\r
-    }\r
-\r
-    if ( cursorIDToUse == GLUT_CURSOR_INHERIT ) {\r
-        XUndefineCursor( fgDisplay.pDisplay.Display, window->Window.Handle );\r
-    } else if ( cursor != None ) {\r
-        XDefineCursor( fgDisplay.pDisplay.Display, window->Window.Handle, cursor );\r
-    } else if ( cursorIDToUse != GLUT_CURSOR_NONE ) {\r
-        fgError( "Failed to create cursor" );\r
-    }\r
-}\r
-\r
-\r
-void fgPlatformWarpPointer ( int x, int y )\r
-{\r
-    XWarpPointer(\r
-        fgDisplay.pDisplay.Display,\r
-        None,\r
-        fgStructure.CurrentWindow->Window.Handle,\r
-        0, 0, 0, 0,\r
-        x, y\r
-    );\r
-    /* Make the warp visible immediately. */\r
-    XFlush( fgDisplay.pDisplay.Display );\r
-}\r
-\r
+/*
+ * freeglut_cursor_x11.c
+ *
+ * The Windows-specific mouse cursor related stuff.
+ *
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
+ * Written by John F. Fay, <fayjf@sourceforge.net>
+ * Creation date: Sun Feb 5, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+/* This code is for Posix/X11, Solaris, and OSX */
+#include <X11/cursorfont.h>
+
+/*
+ * A factory method for an empty cursor
+ */
+static Cursor getEmptyCursor( void )
+{
+    static Cursor cursorNone = None;
+    if( cursorNone == None ) {
+        char cursorNoneBits[ 32 ];
+        XColor dontCare;
+        Pixmap cursorNonePixmap;
+        memset( cursorNoneBits, 0, sizeof( cursorNoneBits ) );
+        memset( &dontCare, 0, sizeof( dontCare ) );
+        cursorNonePixmap = XCreateBitmapFromData ( fgDisplay.pDisplay.Display,
+                                                   fgDisplay.pDisplay.RootWindow,
+                                                   cursorNoneBits, 16, 16 );
+        if( cursorNonePixmap != None ) {
+            cursorNone = XCreatePixmapCursor( fgDisplay.pDisplay.Display,
+                                              cursorNonePixmap, cursorNonePixmap,
+                                              &dontCare, &dontCare, 0, 0 );
+            XFreePixmap( fgDisplay.pDisplay.Display, cursorNonePixmap );
+        }
+    }
+    return cursorNone;
+}
+
+typedef struct tag_cursorCacheEntry cursorCacheEntry;
+struct tag_cursorCacheEntry {
+    unsigned int cursorShape;    /* an XC_foo value */
+    Cursor cachedCursor;         /* None if the corresponding cursor has
+                                    not been created yet */
+};
+
+/*
+ * Note: The arrangement of the table below depends on the fact that
+ * the "normal" GLUT_CURSOR_* values start a 0 and are consecutive.
+ */ 
+static cursorCacheEntry cursorCache[] = {
+    { XC_arrow,               None }, /* GLUT_CURSOR_RIGHT_ARROW */
+    { XC_top_left_arrow,      None }, /* GLUT_CURSOR_LEFT_ARROW */
+    { XC_hand1,               None }, /* GLUT_CURSOR_INFO */
+    { XC_pirate,              None }, /* GLUT_CURSOR_DESTROY */
+    { XC_question_arrow,      None }, /* GLUT_CURSOR_HELP */
+    { XC_exchange,            None }, /* GLUT_CURSOR_CYCLE */
+    { XC_spraycan,            None }, /* GLUT_CURSOR_SPRAY */
+    { XC_watch,               None }, /* GLUT_CURSOR_WAIT */
+    { XC_xterm,               None }, /* GLUT_CURSOR_TEXT */
+    { XC_crosshair,           None }, /* GLUT_CURSOR_CROSSHAIR */
+    { XC_sb_v_double_arrow,   None }, /* GLUT_CURSOR_UP_DOWN */
+    { XC_sb_h_double_arrow,   None }, /* GLUT_CURSOR_LEFT_RIGHT */
+    { XC_top_side,            None }, /* GLUT_CURSOR_TOP_SIDE */
+    { XC_bottom_side,         None }, /* GLUT_CURSOR_BOTTOM_SIDE */
+    { XC_left_side,           None }, /* GLUT_CURSOR_LEFT_SIDE */
+    { XC_right_side,          None }, /* GLUT_CURSOR_RIGHT_SIDE */
+    { XC_top_left_corner,     None }, /* GLUT_CURSOR_TOP_LEFT_CORNER */
+    { XC_top_right_corner,    None }, /* GLUT_CURSOR_TOP_RIGHT_CORNER */
+    { XC_bottom_right_corner, None }, /* GLUT_CURSOR_BOTTOM_RIGHT_CORNER */
+    { XC_bottom_left_corner,  None }  /* GLUT_CURSOR_BOTTOM_LEFT_CORNER */
+};
+
+void fgPlatformSetCursor ( SFG_Window *window, int cursorID )
+{
+    Cursor cursor;
+    /*
+     * XXX FULL_CROSSHAIR demotes to plain CROSSHAIR. Old GLUT allows
+     * for this, but if there is a system that easily supports a full-
+     * window (or full-screen) crosshair, we might consider it.
+     */
+    int cursorIDToUse =
+        ( cursorID == GLUT_CURSOR_FULL_CROSSHAIR ) ? GLUT_CURSOR_CROSSHAIR : cursorID;
+
+    if( ( cursorIDToUse >= 0 ) &&
+        ( cursorIDToUse < sizeof( cursorCache ) / sizeof( cursorCache[0] ) ) ) {
+        cursorCacheEntry *entry = &cursorCache[ cursorIDToUse ];
+        if( entry->cachedCursor == None ) {
+            entry->cachedCursor =
+                XCreateFontCursor( fgDisplay.pDisplay.Display, entry->cursorShape );
+        }
+        cursor = entry->cachedCursor;
+    } else {
+        switch( cursorIDToUse )
+        {
+        case GLUT_CURSOR_NONE:
+            cursor = getEmptyCursor( );
+            break;
+
+        case GLUT_CURSOR_INHERIT:
+            cursor = None;
+            break;
+
+        default:
+            fgError( "Unknown cursor type: %d", cursorIDToUse );
+            return;
+        }
+    }
+
+    if ( cursorIDToUse == GLUT_CURSOR_INHERIT ) {
+        XUndefineCursor( fgDisplay.pDisplay.Display, window->Window.Handle );
+    } else if ( cursor != None ) {
+        XDefineCursor( fgDisplay.pDisplay.Display, window->Window.Handle, cursor );
+    } else if ( cursorIDToUse != GLUT_CURSOR_NONE ) {
+        fgError( "Failed to create cursor" );
+    }
+}
+
+
+void fgPlatformWarpPointer ( int x, int y )
+{
+    XWarpPointer(
+        fgDisplay.pDisplay.Display,
+        None,
+        fgStructure.CurrentWindow->Window.Handle,
+        0, 0, 0, 0,
+        x, y
+    );
+    /* Make the warp visible immediately. */
+    XFlush( fgDisplay.pDisplay.Display );
+}
+
index 86233d8..d19e9d9 100644 (file)
@@ -1,36 +1,36 @@
-/*\r
- * freeglut_display_x11.c\r
- *\r
- * Display message posting, context buffer swapping.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Copied for Platform code by Evan Felix <karcaw at gmail.com>\r
- * Creation date: Thur Feb 2 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-void fgPlatformGlutSwapBuffers( SFG_PlatformDisplay *pDisplayPtr, SFG_Window* CurrentWindow )\r
-{\r
-    glXSwapBuffers( pDisplayPtr->Display, CurrentWindow->Window.Handle );\r
-}\r
-\r
+/*
+ * freeglut_display_x11.c
+ *
+ * Display message posting, context buffer swapping.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Copied for Platform code by Evan Felix <karcaw at gmail.com>
+ * Creation date: Thur Feb 2 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+void fgPlatformGlutSwapBuffers( SFG_PlatformDisplay *pDisplayPtr, SFG_Window* CurrentWindow )
+{
+    glXSwapBuffers( pDisplayPtr->Display, CurrentWindow->Window.Handle );
+}
+
index a5b30b0..eb4b5d3 100644 (file)
@@ -1,60 +1,60 @@
-/*\r
- * freeglut_ext.c\r
- *\r
- * Functions related to OpenGL extensions.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Copied for Platform code by Evan Felix <karcaw at gmail.com>\r
- * Creation date: Thur Feb 2 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#define GLX_GLXEXT_PROTOTYPES\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-GLUTproc fgPlatformGetGLUTProcAddress( const char* procName )\r
-{\r
-    /* optimization: quick initial check */\r
-    if( strncmp( procName, "glut", 4 ) != 0 )\r
-        return NULL;\r
-\r
-#define CHECK_NAME(x) if( strcmp( procName, #x ) == 0) return (GLUTproc)x;\r
-    CHECK_NAME(glutJoystickFunc);\r
-    CHECK_NAME(glutForceJoystickFunc);\r
-    CHECK_NAME(glutGameModeString);\r
-    CHECK_NAME(glutEnterGameMode);\r
-    CHECK_NAME(glutLeaveGameMode);\r
-    CHECK_NAME(glutGameModeGet);\r
-#undef CHECK_NAME\r
-\r
-    return NULL;\r
-}\r
-\r
-\r
-SFG_Proc fgPlatformGetProcAddress( const char *procName )\r
-{\r
-#if defined( GLX_ARB_get_proc_address )\r
-    return (SFG_Proc)glXGetProcAddressARB( ( const GLubyte * )procName );\r
-#else\r
-    return NULL;\r
-#endif\r
-}\r
-\r
+/*
+ * freeglut_ext.c
+ *
+ * Functions related to OpenGL extensions.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Copied for Platform code by Evan Felix <karcaw at gmail.com>
+ * Creation date: Thur Feb 2 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#define GLX_GLXEXT_PROTOTYPES
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+GLUTproc fgPlatformGetGLUTProcAddress( const char* procName )
+{
+    /* optimization: quick initial check */
+    if( strncmp( procName, "glut", 4 ) != 0 )
+        return NULL;
+
+#define CHECK_NAME(x) if( strcmp( procName, #x ) == 0) return (GLUTproc)x;
+    CHECK_NAME(glutJoystickFunc);
+    CHECK_NAME(glutForceJoystickFunc);
+    CHECK_NAME(glutGameModeString);
+    CHECK_NAME(glutEnterGameMode);
+    CHECK_NAME(glutLeaveGameMode);
+    CHECK_NAME(glutGameModeGet);
+#undef CHECK_NAME
+
+    return NULL;
+}
+
+
+SFG_Proc fgPlatformGetProcAddress( const char *procName )
+{
+#if defined( GLX_ARB_get_proc_address )
+    return (SFG_Proc)glXGetProcAddressARB( ( const GLubyte * )procName );
+#else
+    return NULL;
+#endif
+}
+
index ffbf240..7dd4245 100644 (file)
-/*\r
- * freeglut_gamemode_x11.c\r
- *\r
- * The game mode handling code.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Copied for Platform code by Evan Felix <karcaw at gmail.com>\r
- * Creation date: Thur Feb 2 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-static int xrandr_resize(int xsz, int ysz, int rate, int just_checking)\r
-{\r
-#ifdef HAVE_X11_EXTENSIONS_XRANDR_H\r
-    int event_base, error_base, ver_major, ver_minor, use_rate;\r
-    XRRScreenConfiguration *xrr_config = 0;\r
-    Status result = -1;\r
-\r
-    /* must check at runtime for the availability of the extension */\r
-    if(!XRRQueryExtension(fgDisplay.pDisplay.Display, &event_base, &error_base)) {\r
-        return -1;\r
-    }\r
-\r
-    XRRQueryVersion(fgDisplay.pDisplay.Display, &ver_major, &ver_minor);\r
-\r
-    /* we only heed the rate if we CAN actually use it (Xrandr >= 1.1) and\r
-     * the user actually cares about it (rate > 0)\r
-     */\r
-    use_rate = ( rate > 0 ) && ( ( ver_major >= 1 ) ||\r
-                                        ( ( ver_major == 1 ) && ( ver_minor >= 1 ) ) );\r
-\r
-    /* this loop is only so that the whole thing will be repeated if someone\r
-     * else changes video mode between our query of the current information and\r
-     * the attempt to change it.\r
-     */\r
-    do {\r
-        XRRScreenSize *ssizes;\r
-        short *rates;\r
-        Rotation rot;\r
-        int i, ssizes_count, rates_count, curr, res_idx = -1;\r
-        Time timestamp, cfg_timestamp;\r
-\r
-        if(xrr_config) {\r
-            XRRFreeScreenConfigInfo(xrr_config);\r
-        }\r
-\r
-        if(!(xrr_config = XRRGetScreenInfo(fgDisplay.pDisplay.Display, fgDisplay.pDisplay.RootWindow))) {\r
-            fgWarning("XRRGetScreenInfo failed");\r
-            break;\r
-        }\r
-        ssizes = XRRConfigSizes(xrr_config, &ssizes_count);\r
-        curr = XRRConfigCurrentConfiguration(xrr_config, &rot);\r
-        timestamp = XRRConfigTimes(xrr_config, &cfg_timestamp);\r
-\r
-        /* if either of xsz or ysz are unspecified, use the current values */\r
-        if(xsz <= 0)\r
-            xsz = fgState.GameModeSize.X = ssizes[curr].width;\r
-        if(ysz <= 0)\r
-            ysz = fgState.GameModeSize.Y = ssizes[curr].height;\r
-\r
-\r
-        if(xsz == ssizes[curr].width && ysz == ssizes[curr].height) {\r
-            /* no need to switch, we're already in the requested resolution */\r
-            res_idx = curr;\r
-        } else {\r
-            for(i=0; i<ssizes_count; i++) {\r
-                if(ssizes[i].width == xsz && ssizes[i].height == ysz) {\r
-                    res_idx = i;\r
-                    break;  /* found it */\r
-                }\r
-            }\r
-        }\r
-        if(res_idx == -1)\r
-            break;  /* no matching resolution */\r
-\r
-#if ( RANDR_MAJOR >= 1 ) || ( ( RANDR_MAJOR == 1 ) && ( RANDR_MINOR >= 1 ) )\r
-        if(use_rate) {\r
-            rate = fgState.GameModeRefresh;\r
-\r
-            /* for the selected resolution, let's find out if there is\r
-             * a matching refresh rate available.\r
-             */\r
-            rates = XRRConfigRates(xrr_config, res_idx, &rates_count);\r
-\r
-            for(i=0; i<rates_count; i++) {\r
-                if(rates[i] == rate) {\r
-                    break;\r
-                }\r
-            }\r
-            if(i == rates_count) {\r
-                break; /* no matching rate */\r
-            }\r
-        }\r
-#endif\r
-\r
-        if(just_checking) {\r
-            result = 0;\r
-            break;\r
-        }\r
-\r
-#if ( RANDR_MAJOR >= 1 ) || ( ( RANDR_MAJOR == 1 ) && ( RANDR_MINOR >= 1 ) )\r
-        if(use_rate)\r
-            result = XRRSetScreenConfigAndRate(fgDisplay.pDisplay.Display, xrr_config,\r
-                    fgDisplay.pDisplay.RootWindow, res_idx, rot, rate, timestamp);\r
-        else\r
-#endif\r
-            result = XRRSetScreenConfig(fgDisplay.pDisplay.Display, xrr_config,\r
-                    fgDisplay.pDisplay.RootWindow, res_idx, rot, timestamp);\r
-\r
-    } while(result == RRSetConfigInvalidTime);\r
-\r
-    if(xrr_config) {\r
-        XRRFreeScreenConfigInfo(xrr_config);\r
-    }\r
-\r
-    if(result == 0) {\r
-        return 0;\r
-    }\r
-\r
-#endif  /* HAVE_X11_EXTENSIONS_XRANDR_H */\r
-    return -1;\r
-}\r
-\r
-/*\r
- * Remembers the current visual settings, so that\r
- * we can change them and restore later...\r
- */\r
-void fgPlatformRememberState( void )\r
-{\r
-    int event_base, error_base;\r
-\r
-    /*\r
-     * Remember the current pointer location before going fullscreen\r
-     * for restoring it later:\r
-     */\r
-    Window junk_window;\r
-    unsigned int junk_mask;\r
-\r
-    XQueryPointer(fgDisplay.pDisplay.Display, fgDisplay.pDisplay.RootWindow,\r
-            &junk_window, &junk_window,\r
-            &fgDisplay.pDisplay.DisplayPointerX, &fgDisplay.pDisplay.DisplayPointerY,\r
-            &fgDisplay.pDisplay.DisplayPointerX, &fgDisplay.pDisplay.DisplayPointerY, &junk_mask);\r
-\r
-#   ifdef HAVE_X11_EXTENSIONS_XRANDR_H\r
-    if(XRRQueryExtension(fgDisplay.pDisplay.Display, &event_base, &error_base)) {\r
-        XRRScreenConfiguration *xrr_config;\r
-        XRRScreenSize *ssizes;\r
-        Rotation rot;\r
-        int ssize_count, curr;\r
-\r
-        if((xrr_config = XRRGetScreenInfo(fgDisplay.pDisplay.Display, fgDisplay.pDisplay.RootWindow))) {\r
-            ssizes = XRRConfigSizes(xrr_config, &ssize_count);\r
-            curr = XRRConfigCurrentConfiguration(xrr_config, &rot);\r
-\r
-            fgDisplay.pDisplay.prev_xsz = ssizes[curr].width;\r
-            fgDisplay.pDisplay.prev_ysz = ssizes[curr].height;\r
-            fgDisplay.pDisplay.prev_refresh = -1;\r
-\r
-#       if ( RANDR_MAJOR >= 1 ) || ( ( RANDR_MAJOR == 1 ) && ( RANDR_MINOR >= 1 ) )\r
-            if(fgState.GameModeRefresh != -1) {\r
-                fgDisplay.pDisplay.prev_refresh = XRRConfigCurrentRate(xrr_config);\r
-            }\r
-#       endif\r
-\r
-            fgDisplay.pDisplay.prev_size_valid = 1;\r
-\r
-            XRRFreeScreenConfigInfo(xrr_config);\r
-        }\r
-    }\r
-#   endif\r
-\r
-    /*\r
-     * This highly depends on the XFree86 extensions,\r
-     * not approved as X Consortium standards\r
-     */\r
-#   ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H\r
-    if(!XF86VidModeQueryExtension(fgDisplay.pDisplay.Display, &event_base, &error_base)) {\r
-        return;\r
-    }\r
-\r
-    /*\r
-     * Remember the current ViewPort location of the screen to be able to\r
-     * restore the ViewPort on LeaveGameMode():\r
-     */\r
-    if( !XF86VidModeGetViewPort(\r
-             fgDisplay.pDisplay.Display,\r
-             fgDisplay.pDisplay.Screen,\r
-             &fgDisplay.pDisplay.DisplayViewPortX,\r
-             &fgDisplay.pDisplay.DisplayViewPortY ) )\r
-        fgWarning( "XF86VidModeGetViewPort failed" );\r
-\r
-\r
-    /* Query the current display settings: */\r
-    fgDisplay.pDisplay.DisplayModeValid =\r
-      XF86VidModeGetModeLine(\r
-        fgDisplay.pDisplay.Display,\r
-        fgDisplay.pDisplay.Screen,\r
-        &fgDisplay.pDisplay.DisplayModeClock,\r
-        &fgDisplay.pDisplay.DisplayMode\r
-    );\r
-\r
-    if( !fgDisplay.pDisplay.DisplayModeValid )\r
-        fgWarning( "XF86VidModeGetModeLine failed" );\r
-#   endif\r
-\r
-}\r
-\r
-/*\r
- * Restores the previously remembered visual settings\r
- */\r
-void fgPlatformRestoreState( void )\r
-{\r
-    /* Restore the remembered pointer position: */\r
-    XWarpPointer(\r
-        fgDisplay.pDisplay.Display, None, fgDisplay.pDisplay.RootWindow, 0, 0, 0, 0,\r
-        fgDisplay.pDisplay.DisplayPointerX, fgDisplay.pDisplay.DisplayPointerY\r
-    );\r
-\r
-\r
-#   ifdef HAVE_X11_EXTENSIONS_XRANDR_H\r
-    if(fgDisplay.pDisplay.prev_size_valid) {\r
-        if(xrandr_resize(fgDisplay.pDisplay.prev_xsz, fgDisplay.pDisplay.prev_ysz, fgDisplay.pDisplay.prev_refresh, 0) != -1) {\r
-            fgDisplay.pDisplay.prev_size_valid = 0;\r
-#       ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H\r
-            fgDisplay.pDisplay.DisplayModeValid = 0;\r
-#       endif\r
-            return;\r
-        }\r
-    }\r
-#   endif\r
-\r
-\r
-\r
-#   ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H\r
-    /*\r
-     * This highly depends on the XFree86 extensions,\r
-     * not approved as X Consortium standards\r
-     */\r
-\r
-    if( fgDisplay.pDisplay.DisplayModeValid )\r
-    {\r
-        XF86VidModeModeInfo** displayModes;\r
-        int i, displayModesCount;\r
-\r
-        if( !XF86VidModeGetAllModeLines(\r
-                 fgDisplay.pDisplay.Display,\r
-                 fgDisplay.pDisplay.Screen,\r
-                 &displayModesCount,\r
-                 &displayModes ) )\r
-        {\r
-            fgWarning( "XF86VidModeGetAllModeLines failed" );\r
-            return;\r
-        }\r
-\r
-\r
-        /*\r
-         * Check every of the modes looking for one that matches our demands.\r
-         * If we find one, switch to it and restore the remembered viewport.\r
-         */\r
-        for( i = 0; i < displayModesCount; i++ )\r
-        {\r
-            if(displayModes[ i ]->hdisplay == fgDisplay.pDisplay.DisplayMode.hdisplay &&\r
-               displayModes[ i ]->vdisplay == fgDisplay.pDisplay.DisplayMode.vdisplay &&\r
-               displayModes[ i ]->dotclock == fgDisplay.pDisplay.DisplayModeClock )\r
-            {\r
-                if( !XF86VidModeSwitchToMode(\r
-                         fgDisplay.pDisplay.Display,\r
-                         fgDisplay.pDisplay.Screen,\r
-                         displayModes[ i ] ) )\r
-                {\r
-                    fgWarning( "XF86VidModeSwitchToMode failed" );\r
-                    break;\r
-                }\r
-\r
-                if( !XF86VidModeSetViewPort(\r
-                         fgDisplay.pDisplay.Display,\r
-                         fgDisplay.pDisplay.Screen,\r
-                         fgDisplay.pDisplay.DisplayViewPortX,\r
-                         fgDisplay.pDisplay.DisplayViewPortY ) )\r
-                    fgWarning( "XF86VidModeSetViewPort failed" );\r
-\r
-\r
-                /*\r
-                 * For the case this would be the last X11 call the application\r
-                 * calls exit() we've to flush the X11 output queue to have the\r
-                 * commands sent to the X server before the application exits.\r
-                 */\r
-                XFlush( fgDisplay.pDisplay.Display );\r
-\r
-                fgDisplay.pDisplay.DisplayModeValid = 0;\r
-#       ifdef HAVE_X11_EXTENSIONS_XRANDR_H\r
-                fgDisplay.pDisplay.prev_size_valid = 0;\r
-#       endif\r
-\r
-                break;\r
-            }\r
-        }\r
-        XFree( displayModes );\r
-    }\r
-\r
-#   endif\r
-\r
-}\r
-\r
-#ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H\r
-\r
-/*\r
- * Checks a single display mode settings against user's preferences.\r
- */\r
-static GLboolean fghCheckDisplayMode( int width, int height, int depth, int refresh )\r
-{\r
-    /* The desired values should be stored in fgState structure... */\r
-    return ( width == fgState.GameModeSize.X ) &&\r
-           ( height == fgState.GameModeSize.Y ) &&\r
-           ( depth == fgState.GameModeDepth ) &&\r
-           ( refresh == fgState.GameModeRefresh );\r
-}\r
-\r
-/*\r
- * Checks all display modes settings against user's preferences.\r
- * Returns the mode number found or -1 if none could be found.\r
- */\r
-static int fghCheckDisplayModes( GLboolean exactMatch, int displayModesCount, XF86VidModeModeInfo** displayModes )\r
-{\r
-    int i;\r
-    for( i = 0; i < displayModesCount; i++ )\r
-    {\r
-        /* Compute the displays refresh rate, dotclock comes in kHz. */\r
-        int refresh = ( displayModes[ i ]->dotclock * 1000 ) /\r
-                      ( displayModes[ i ]->htotal * displayModes[ i ]->vtotal );\r
-\r
-        if( fghCheckDisplayMode( displayModes[ i ]->hdisplay,\r
-                                 displayModes[ i ]->vdisplay,\r
-                                 fgState.GameModeDepth,\r
-                                 ( exactMatch ? refresh : fgState.GameModeRefresh ) ) ) {\r
-            if (!exactMatch)\r
-            {\r
-                /* Update the chosen refresh rate, otherwise a\r
-                 * glutGameModeGet(GLUT_GAME_MODE_REFRESH_RATE) would not\r
-                 * return the right values\r
-                 */\r
-                fgState.GameModeRefresh = refresh;\r
-            }\r
-\r
-            return i;\r
-        }\r
-    }\r
-    return -1;\r
-}\r
-\r
-#endif\r
-\r
-/*\r
- * Changes the current display mode to match user's settings\r
- */\r
-GLboolean fgPlatformChangeDisplayMode( GLboolean haveToTest )\r
-{\r
-    GLboolean success = GL_FALSE;\r
-    /* first try to use XRandR, then fallback to XF86VidMode */\r
-#   ifdef HAVE_X11_EXTENSIONS_XRANDR_H\r
-    if(xrandr_resize(fgState.GameModeSize.X, fgState.GameModeSize.Y,\r
-                fgState.GameModeRefresh, haveToTest) != -1) {\r
-        return GL_TRUE;\r
-    }\r
-#   endif\r
-\r
-\r
-    /*\r
-     * This highly depends on the XFree86 extensions,\r
-     * not approved as X Consortium standards\r
-     */\r
-#   ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H\r
-\r
-    /*\r
-     * This is also used by applications which check modes by calling\r
-     * glutGameModeGet(GLUT_GAME_MODE_POSSIBLE), so allow the check:\r
-     */\r
-    if( haveToTest || fgDisplay.pDisplay.DisplayModeValid )\r
-    {\r
-        XF86VidModeModeInfo** displayModes;\r
-        int i, displayModesCount;\r
-\r
-        /* If we don't have a valid modeline in the display structure, which\r
-         * can happen if this is called from glutGameModeGet instead of\r
-         * glutEnterGameMode, then we need to query the current mode, to make\r
-         * unspecified settings to default to their current values.\r
-         */\r
-        if(!fgDisplay.pDisplay.DisplayModeValid) {\r
-            if(!XF86VidModeGetModeLine(fgDisplay.pDisplay.Display, fgDisplay.pDisplay.Screen,\r
-                    &fgDisplay.pDisplay.DisplayModeClock, &fgDisplay.pDisplay.DisplayMode)) {\r
-                return success;\r
-            }\r
-        }\r
-\r
-        if (fgState.GameModeSize.X == -1)\r
-        {\r
-            fgState.GameModeSize.X = fgDisplay.pDisplay.DisplayMode.hdisplay;\r
-        }\r
-        if (fgState.GameModeSize.Y == -1)\r
-        {\r
-            fgState.GameModeSize.Y = fgDisplay.pDisplay.DisplayMode.vdisplay;\r
-        }\r
-        if (fgState.GameModeDepth == -1)\r
-        {\r
-            /* can't get color depth from this, nor can we change it, do nothing\r
-             * TODO: get with XGetVisualInfo()? but then how to set?\r
-             */\r
-        }\r
-        if (fgState.GameModeRefresh == -1)\r
-        {\r
-            /* Compute the displays refresh rate, dotclock comes in kHz. */\r
-            int refresh = ( fgDisplay.pDisplay.DisplayModeClock * 1000 ) /\r
-                ( fgDisplay.pDisplay.DisplayMode.htotal * fgDisplay.pDisplay.DisplayMode.vtotal );\r
-\r
-            fgState.GameModeRefresh = refresh;\r
-        }\r
-\r
-        /* query all possible display modes */\r
-        if( !XF86VidModeGetAllModeLines(\r
-                 fgDisplay.pDisplay.Display,\r
-                 fgDisplay.pDisplay.Screen,\r
-                 &displayModesCount,\r
-                 &displayModes ) )\r
-        {\r
-            fgWarning( "XF86VidModeGetAllModeLines failed" );\r
-            return success;\r
-        }\r
-\r
-\r
-        /*\r
-         * Check every of the modes looking for one that matches our demands,\r
-         * ignoring the refresh rate if no exact match could be found.\r
-         */\r
-        i = fghCheckDisplayModes( GL_TRUE, displayModesCount, displayModes );\r
-        if( i < 0 ) {\r
-            i = fghCheckDisplayModes( GL_FALSE, displayModesCount, displayModes );\r
-        }\r
-        success = ( i < 0 ) ? GL_FALSE : GL_TRUE;\r
-\r
-        if( !haveToTest && success ) {\r
-            if( !XF86VidModeSwitchToMode(\r
-                     fgDisplay.pDisplay.Display,\r
-                     fgDisplay.pDisplay.Screen,\r
-                     displayModes[ i ] ) )\r
-                fgWarning( "XF86VidModeSwitchToMode failed" );\r
-        }\r
-\r
-        XFree( displayModes );\r
-    }\r
-\r
-#   endif\r
-\r
-    return success;\r
-}\r
-\r
-\r
-void fgPlatformEnterGameMode( void ) \r
-{\r
-\r
-    /*\r
-     * Sync needed to avoid a real race, the Xserver must have really created\r
-     * the window before we can grab the pointer into it:\r
-     */\r
-    XSync( fgDisplay.pDisplay.Display, False );\r
-    /*\r
-     * Grab the pointer to confine it into the window after the calls to\r
-     * XWrapPointer() which ensure that the pointer really enters the window.\r
-     *\r
-     * We also need to wait here until XGrabPointer() returns GrabSuccess,\r
-     * otherwise the new window is not viewable yet and if the next function\r
-     * (XSetInputFocus) is called with a not yet viewable window, it will exit\r
-     * the application which we have to aviod, so wait until it's viewable:\r
-     */\r
-    while( GrabSuccess != XGrabPointer(\r
-               fgDisplay.pDisplay.Display, fgStructure.GameModeWindow->Window.Handle,\r
-               TRUE,\r
-               ButtonPressMask | ButtonReleaseMask | ButtonMotionMask\r
-               | PointerMotionMask,\r
-               GrabModeAsync, GrabModeAsync,\r
-               fgStructure.GameModeWindow->Window.Handle, None, CurrentTime) )\r
-        usleep( 100 );\r
-    /*\r
-     * Change input focus to the new window. This will exit the application\r
-     * if the new window is not viewable yet, see the XGrabPointer loop above.\r
-     */\r
-    XSetInputFocus(\r
-        fgDisplay.pDisplay.Display,\r
-        fgStructure.GameModeWindow->Window.Handle,\r
-        RevertToNone,\r
-        CurrentTime\r
-    );\r
-\r
-    /* Move the Pointer to the middle of the fullscreen window */\r
-    XWarpPointer(\r
-        fgDisplay.pDisplay.Display,\r
-        None,\r
-        fgDisplay.pDisplay.RootWindow,\r
-        0, 0, 0, 0,\r
-        fgState.GameModeSize.X/2, fgState.GameModeSize.Y/2\r
-    );\r
-\r
-#   ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H\r
-\r
-    if( fgDisplay.pDisplay.DisplayModeValid )\r
-    {\r
-        int x, y;\r
-        Window child;\r
-\r
-        /* Change to viewport to the window topleft edge: */\r
-        if( !XF86VidModeSetViewPort( fgDisplay.pDisplay.Display, fgDisplay.pDisplay.Screen, 0, 0 ) )\r
-            fgWarning( "XF86VidModeSetViewPort failed" );\r
-\r
-        /*\r
-         * Final window repositioning: It could be avoided using an undecorated\r
-         * window using override_redirect, but this * would possily require\r
-         * more changes and investigation.\r
-         */\r
-\r
-        /* Get the current postion of the drawable area on screen */\r
-        XTranslateCoordinates(\r
-            fgDisplay.pDisplay.Display,\r
-            fgStructure.CurrentWindow->Window.Handle,\r
-            fgDisplay.pDisplay.RootWindow,\r
-            0, 0, &x, &y,\r
-            &child\r
-        );\r
-\r
-        /* Move the decorataions out of the topleft corner of the display */\r
-        XMoveWindow( fgDisplay.pDisplay.Display, fgStructure.CurrentWindow->Window.Handle,\r
-                     -x, -y);\r
-    }\r
-\r
-#endif\r
-\r
-    /* Grab the keyboard, too */\r
-    XGrabKeyboard(\r
-        fgDisplay.pDisplay.Display,\r
-        fgStructure.GameModeWindow->Window.Handle,\r
-        FALSE,\r
-        GrabModeAsync, GrabModeAsync,\r
-        CurrentTime\r
-    );\r
-\r
-}\r
-\r
-void fgPlatformLeaveGameMode( void ) \r
-{\r
-    XUngrabPointer( fgDisplay.pDisplay.Display, CurrentTime );\r
-    XUngrabKeyboard( fgDisplay.pDisplay.Display, CurrentTime );\r
-}\r
-\r
+/*
+ * freeglut_gamemode_x11.c
+ *
+ * The game mode handling code.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Copied for Platform code by Evan Felix <karcaw at gmail.com>
+ * Creation date: Thur Feb 2 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+static int xrandr_resize(int xsz, int ysz, int rate, int just_checking)
+{
+#ifdef HAVE_X11_EXTENSIONS_XRANDR_H
+    int event_base, error_base, ver_major, ver_minor, use_rate;
+    XRRScreenConfiguration *xrr_config = 0;
+    Status result = -1;
+
+    /* must check at runtime for the availability of the extension */
+    if(!XRRQueryExtension(fgDisplay.pDisplay.Display, &event_base, &error_base)) {
+        return -1;
+    }
+
+    XRRQueryVersion(fgDisplay.pDisplay.Display, &ver_major, &ver_minor);
+
+    /* we only heed the rate if we CAN actually use it (Xrandr >= 1.1) and
+     * the user actually cares about it (rate > 0)
+     */
+    use_rate = ( rate > 0 ) && ( ( ver_major >= 1 ) ||
+                                        ( ( ver_major == 1 ) && ( ver_minor >= 1 ) ) );
+
+    /* this loop is only so that the whole thing will be repeated if someone
+     * else changes video mode between our query of the current information and
+     * the attempt to change it.
+     */
+    do {
+        XRRScreenSize *ssizes;
+        short *rates;
+        Rotation rot;
+        int i, ssizes_count, rates_count, curr, res_idx = -1;
+        Time timestamp, cfg_timestamp;
+
+        if(xrr_config) {
+            XRRFreeScreenConfigInfo(xrr_config);
+        }
+
+        if(!(xrr_config = XRRGetScreenInfo(fgDisplay.pDisplay.Display, fgDisplay.pDisplay.RootWindow))) {
+            fgWarning("XRRGetScreenInfo failed");
+            break;
+        }
+        ssizes = XRRConfigSizes(xrr_config, &ssizes_count);
+        curr = XRRConfigCurrentConfiguration(xrr_config, &rot);
+        timestamp = XRRConfigTimes(xrr_config, &cfg_timestamp);
+
+        /* if either of xsz or ysz are unspecified, use the current values */
+        if(xsz <= 0)
+            xsz = fgState.GameModeSize.X = ssizes[curr].width;
+        if(ysz <= 0)
+            ysz = fgState.GameModeSize.Y = ssizes[curr].height;
+
+
+        if(xsz == ssizes[curr].width && ysz == ssizes[curr].height) {
+            /* no need to switch, we're already in the requested resolution */
+            res_idx = curr;
+        } else {
+            for(i=0; i<ssizes_count; i++) {
+                if(ssizes[i].width == xsz && ssizes[i].height == ysz) {
+                    res_idx = i;
+                    break;  /* found it */
+                }
+            }
+        }
+        if(res_idx == -1)
+            break;  /* no matching resolution */
+
+#if ( RANDR_MAJOR >= 1 ) || ( ( RANDR_MAJOR == 1 ) && ( RANDR_MINOR >= 1 ) )
+        if(use_rate) {
+            rate = fgState.GameModeRefresh;
+
+            /* for the selected resolution, let's find out if there is
+             * a matching refresh rate available.
+             */
+            rates = XRRConfigRates(xrr_config, res_idx, &rates_count);
+
+            for(i=0; i<rates_count; i++) {
+                if(rates[i] == rate) {
+                    break;
+                }
+            }
+            if(i == rates_count) {
+                break; /* no matching rate */
+            }
+        }
+#endif
+
+        if(just_checking) {
+            result = 0;
+            break;
+        }
+
+#if ( RANDR_MAJOR >= 1 ) || ( ( RANDR_MAJOR == 1 ) && ( RANDR_MINOR >= 1 ) )
+        if(use_rate)
+            result = XRRSetScreenConfigAndRate(fgDisplay.pDisplay.Display, xrr_config,
+                    fgDisplay.pDisplay.RootWindow, res_idx, rot, rate, timestamp);
+        else
+#endif
+            result = XRRSetScreenConfig(fgDisplay.pDisplay.Display, xrr_config,
+                    fgDisplay.pDisplay.RootWindow, res_idx, rot, timestamp);
+
+    } while(result == RRSetConfigInvalidTime);
+
+    if(xrr_config) {
+        XRRFreeScreenConfigInfo(xrr_config);
+    }
+
+    if(result == 0) {
+        return 0;
+    }
+
+#endif  /* HAVE_X11_EXTENSIONS_XRANDR_H */
+    return -1;
+}
+
+/*
+ * Remembers the current visual settings, so that
+ * we can change them and restore later...
+ */
+void fgPlatformRememberState( void )
+{
+    int event_base, error_base;
+
+    /*
+     * Remember the current pointer location before going fullscreen
+     * for restoring it later:
+     */
+    Window junk_window;
+    unsigned int junk_mask;
+
+    XQueryPointer(fgDisplay.pDisplay.Display, fgDisplay.pDisplay.RootWindow,
+            &junk_window, &junk_window,
+            &fgDisplay.pDisplay.DisplayPointerX, &fgDisplay.pDisplay.DisplayPointerY,
+            &fgDisplay.pDisplay.DisplayPointerX, &fgDisplay.pDisplay.DisplayPointerY, &junk_mask);
+
+#   ifdef HAVE_X11_EXTENSIONS_XRANDR_H
+    if(XRRQueryExtension(fgDisplay.pDisplay.Display, &event_base, &error_base)) {
+        XRRScreenConfiguration *xrr_config;
+        XRRScreenSize *ssizes;
+        Rotation rot;
+        int ssize_count, curr;
+
+        if((xrr_config = XRRGetScreenInfo(fgDisplay.pDisplay.Display, fgDisplay.pDisplay.RootWindow))) {
+            ssizes = XRRConfigSizes(xrr_config, &ssize_count);
+            curr = XRRConfigCurrentConfiguration(xrr_config, &rot);
+
+            fgDisplay.pDisplay.prev_xsz = ssizes[curr].width;
+            fgDisplay.pDisplay.prev_ysz = ssizes[curr].height;
+            fgDisplay.pDisplay.prev_refresh = -1;
+
+#       if ( RANDR_MAJOR >= 1 ) || ( ( RANDR_MAJOR == 1 ) && ( RANDR_MINOR >= 1 ) )
+            if(fgState.GameModeRefresh != -1) {
+                fgDisplay.pDisplay.prev_refresh = XRRConfigCurrentRate(xrr_config);
+            }
+#       endif
+
+            fgDisplay.pDisplay.prev_size_valid = 1;
+
+            XRRFreeScreenConfigInfo(xrr_config);
+        }
+    }
+#   endif
+
+    /*
+     * This highly depends on the XFree86 extensions,
+     * not approved as X Consortium standards
+     */
+#   ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
+    if(!XF86VidModeQueryExtension(fgDisplay.pDisplay.Display, &event_base, &error_base)) {
+        return;
+    }
+
+    /*
+     * Remember the current ViewPort location of the screen to be able to
+     * restore the ViewPort on LeaveGameMode():
+     */
+    if( !XF86VidModeGetViewPort(
+             fgDisplay.pDisplay.Display,
+             fgDisplay.pDisplay.Screen,
+             &fgDisplay.pDisplay.DisplayViewPortX,
+             &fgDisplay.pDisplay.DisplayViewPortY ) )
+        fgWarning( "XF86VidModeGetViewPort failed" );
+
+
+    /* Query the current display settings: */
+    fgDisplay.pDisplay.DisplayModeValid =
+      XF86VidModeGetModeLine(
+        fgDisplay.pDisplay.Display,
+        fgDisplay.pDisplay.Screen,
+        &fgDisplay.pDisplay.DisplayModeClock,
+        &fgDisplay.pDisplay.DisplayMode
+    );
+
+    if( !fgDisplay.pDisplay.DisplayModeValid )
+        fgWarning( "XF86VidModeGetModeLine failed" );
+#   endif
+
+}
+
+/*
+ * Restores the previously remembered visual settings
+ */
+void fgPlatformRestoreState( void )
+{
+    /* Restore the remembered pointer position: */
+    XWarpPointer(
+        fgDisplay.pDisplay.Display, None, fgDisplay.pDisplay.RootWindow, 0, 0, 0, 0,
+        fgDisplay.pDisplay.DisplayPointerX, fgDisplay.pDisplay.DisplayPointerY
+    );
+
+
+#   ifdef HAVE_X11_EXTENSIONS_XRANDR_H
+    if(fgDisplay.pDisplay.prev_size_valid) {
+        if(xrandr_resize(fgDisplay.pDisplay.prev_xsz, fgDisplay.pDisplay.prev_ysz, fgDisplay.pDisplay.prev_refresh, 0) != -1) {
+            fgDisplay.pDisplay.prev_size_valid = 0;
+#       ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
+            fgDisplay.pDisplay.DisplayModeValid = 0;
+#       endif
+            return;
+        }
+    }
+#   endif
+
+
+
+#   ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
+    /*
+     * This highly depends on the XFree86 extensions,
+     * not approved as X Consortium standards
+     */
+
+    if( fgDisplay.pDisplay.DisplayModeValid )
+    {
+        XF86VidModeModeInfo** displayModes;
+        int i, displayModesCount;
+
+        if( !XF86VidModeGetAllModeLines(
+                 fgDisplay.pDisplay.Display,
+                 fgDisplay.pDisplay.Screen,
+                 &displayModesCount,
+                 &displayModes ) )
+        {
+            fgWarning( "XF86VidModeGetAllModeLines failed" );
+            return;
+        }
+
+
+        /*
+         * Check every of the modes looking for one that matches our demands.
+         * If we find one, switch to it and restore the remembered viewport.
+         */
+        for( i = 0; i < displayModesCount; i++ )
+        {
+            if(displayModes[ i ]->hdisplay == fgDisplay.pDisplay.DisplayMode.hdisplay &&
+               displayModes[ i ]->vdisplay == fgDisplay.pDisplay.DisplayMode.vdisplay &&
+               displayModes[ i ]->dotclock == fgDisplay.pDisplay.DisplayModeClock )
+            {
+                if( !XF86VidModeSwitchToMode(
+                         fgDisplay.pDisplay.Display,
+                         fgDisplay.pDisplay.Screen,
+                         displayModes[ i ] ) )
+                {
+                    fgWarning( "XF86VidModeSwitchToMode failed" );
+                    break;
+                }
+
+                if( !XF86VidModeSetViewPort(
+                         fgDisplay.pDisplay.Display,
+                         fgDisplay.pDisplay.Screen,
+                         fgDisplay.pDisplay.DisplayViewPortX,
+                         fgDisplay.pDisplay.DisplayViewPortY ) )
+                    fgWarning( "XF86VidModeSetViewPort failed" );
+
+
+                /*
+                 * For the case this would be the last X11 call the application
+                 * calls exit() we've to flush the X11 output queue to have the
+                 * commands sent to the X server before the application exits.
+                 */
+                XFlush( fgDisplay.pDisplay.Display );
+
+                fgDisplay.pDisplay.DisplayModeValid = 0;
+#       ifdef HAVE_X11_EXTENSIONS_XRANDR_H
+                fgDisplay.pDisplay.prev_size_valid = 0;
+#       endif
+
+                break;
+            }
+        }
+        XFree( displayModes );
+    }
+
+#   endif
+
+}
+
+#ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
+
+/*
+ * Checks a single display mode settings against user's preferences.
+ */
+static GLboolean fghCheckDisplayMode( int width, int height, int depth, int refresh )
+{
+    /* The desired values should be stored in fgState structure... */
+    return ( width == fgState.GameModeSize.X ) &&
+           ( height == fgState.GameModeSize.Y ) &&
+           ( depth == fgState.GameModeDepth ) &&
+           ( refresh == fgState.GameModeRefresh );
+}
+
+/*
+ * Checks all display modes settings against user's preferences.
+ * Returns the mode number found or -1 if none could be found.
+ */
+static int fghCheckDisplayModes( GLboolean exactMatch, int displayModesCount, XF86VidModeModeInfo** displayModes )
+{
+    int i;
+    for( i = 0; i < displayModesCount; i++ )
+    {
+        /* Compute the displays refresh rate, dotclock comes in kHz. */
+        int refresh = ( displayModes[ i ]->dotclock * 1000 ) /
+                      ( displayModes[ i ]->htotal * displayModes[ i ]->vtotal );
+
+        if( fghCheckDisplayMode( displayModes[ i ]->hdisplay,
+                                 displayModes[ i ]->vdisplay,
+                                 fgState.GameModeDepth,
+                                 ( exactMatch ? refresh : fgState.GameModeRefresh ) ) ) {
+            if (!exactMatch)
+            {
+                /* Update the chosen refresh rate, otherwise a
+                 * glutGameModeGet(GLUT_GAME_MODE_REFRESH_RATE) would not
+                 * return the right values
+                 */
+                fgState.GameModeRefresh = refresh;
+            }
+
+            return i;
+        }
+    }
+    return -1;
+}
+
+#endif
+
+/*
+ * Changes the current display mode to match user's settings
+ */
+GLboolean fgPlatformChangeDisplayMode( GLboolean haveToTest )
+{
+    GLboolean success = GL_FALSE;
+    /* first try to use XRandR, then fallback to XF86VidMode */
+#   ifdef HAVE_X11_EXTENSIONS_XRANDR_H
+    if(xrandr_resize(fgState.GameModeSize.X, fgState.GameModeSize.Y,
+                fgState.GameModeRefresh, haveToTest) != -1) {
+        return GL_TRUE;
+    }
+#   endif
+
+
+    /*
+     * This highly depends on the XFree86 extensions,
+     * not approved as X Consortium standards
+     */
+#   ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
+
+    /*
+     * This is also used by applications which check modes by calling
+     * glutGameModeGet(GLUT_GAME_MODE_POSSIBLE), so allow the check:
+     */
+    if( haveToTest || fgDisplay.pDisplay.DisplayModeValid )
+    {
+        XF86VidModeModeInfo** displayModes;
+        int i, displayModesCount;
+
+        /* If we don't have a valid modeline in the display structure, which
+         * can happen if this is called from glutGameModeGet instead of
+         * glutEnterGameMode, then we need to query the current mode, to make
+         * unspecified settings to default to their current values.
+         */
+        if(!fgDisplay.pDisplay.DisplayModeValid) {
+            if(!XF86VidModeGetModeLine(fgDisplay.pDisplay.Display, fgDisplay.pDisplay.Screen,
+                    &fgDisplay.pDisplay.DisplayModeClock, &fgDisplay.pDisplay.DisplayMode)) {
+                return success;
+            }
+        }
+
+        if (fgState.GameModeSize.X == -1)
+        {
+            fgState.GameModeSize.X = fgDisplay.pDisplay.DisplayMode.hdisplay;
+        }
+        if (fgState.GameModeSize.Y == -1)
+        {
+            fgState.GameModeSize.Y = fgDisplay.pDisplay.DisplayMode.vdisplay;
+        }
+        if (fgState.GameModeDepth == -1)
+        {
+            /* can't get color depth from this, nor can we change it, do nothing
+             * TODO: get with XGetVisualInfo()? but then how to set?
+             */
+        }
+        if (fgState.GameModeRefresh == -1)
+        {
+            /* Compute the displays refresh rate, dotclock comes in kHz. */
+            int refresh = ( fgDisplay.pDisplay.DisplayModeClock * 1000 ) /
+                ( fgDisplay.pDisplay.DisplayMode.htotal * fgDisplay.pDisplay.DisplayMode.vtotal );
+
+            fgState.GameModeRefresh = refresh;
+        }
+
+        /* query all possible display modes */
+        if( !XF86VidModeGetAllModeLines(
+                 fgDisplay.pDisplay.Display,
+                 fgDisplay.pDisplay.Screen,
+                 &displayModesCount,
+                 &displayModes ) )
+        {
+            fgWarning( "XF86VidModeGetAllModeLines failed" );
+            return success;
+        }
+
+
+        /*
+         * Check every of the modes looking for one that matches our demands,
+         * ignoring the refresh rate if no exact match could be found.
+         */
+        i = fghCheckDisplayModes( GL_TRUE, displayModesCount, displayModes );
+        if( i < 0 ) {
+            i = fghCheckDisplayModes( GL_FALSE, displayModesCount, displayModes );
+        }
+        success = ( i < 0 ) ? GL_FALSE : GL_TRUE;
+
+        if( !haveToTest && success ) {
+            if( !XF86VidModeSwitchToMode(
+                     fgDisplay.pDisplay.Display,
+                     fgDisplay.pDisplay.Screen,
+                     displayModes[ i ] ) )
+                fgWarning( "XF86VidModeSwitchToMode failed" );
+        }
+
+        XFree( displayModes );
+    }
+
+#   endif
+
+    return success;
+}
+
+
+void fgPlatformEnterGameMode( void ) 
+{
+
+    /*
+     * Sync needed to avoid a real race, the Xserver must have really created
+     * the window before we can grab the pointer into it:
+     */
+    XSync( fgDisplay.pDisplay.Display, False );
+    /*
+     * Grab the pointer to confine it into the window after the calls to
+     * XWrapPointer() which ensure that the pointer really enters the window.
+     *
+     * We also need to wait here until XGrabPointer() returns GrabSuccess,
+     * otherwise the new window is not viewable yet and if the next function
+     * (XSetInputFocus) is called with a not yet viewable window, it will exit
+     * the application which we have to aviod, so wait until it's viewable:
+     */
+    while( GrabSuccess != XGrabPointer(
+               fgDisplay.pDisplay.Display, fgStructure.GameModeWindow->Window.Handle,
+               TRUE,
+               ButtonPressMask | ButtonReleaseMask | ButtonMotionMask
+               | PointerMotionMask,
+               GrabModeAsync, GrabModeAsync,
+               fgStructure.GameModeWindow->Window.Handle, None, CurrentTime) )
+        usleep( 100 );
+    /*
+     * Change input focus to the new window. This will exit the application
+     * if the new window is not viewable yet, see the XGrabPointer loop above.
+     */
+    XSetInputFocus(
+        fgDisplay.pDisplay.Display,
+        fgStructure.GameModeWindow->Window.Handle,
+        RevertToNone,
+        CurrentTime
+    );
+
+    /* Move the Pointer to the middle of the fullscreen window */
+    XWarpPointer(
+        fgDisplay.pDisplay.Display,
+        None,
+        fgDisplay.pDisplay.RootWindow,
+        0, 0, 0, 0,
+        fgState.GameModeSize.X/2, fgState.GameModeSize.Y/2
+    );
+
+#   ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
+
+    if( fgDisplay.pDisplay.DisplayModeValid )
+    {
+        int x, y;
+        Window child;
+
+        /* Change to viewport to the window topleft edge: */
+        if( !XF86VidModeSetViewPort( fgDisplay.pDisplay.Display, fgDisplay.pDisplay.Screen, 0, 0 ) )
+            fgWarning( "XF86VidModeSetViewPort failed" );
+
+        /*
+         * Final window repositioning: It could be avoided using an undecorated
+         * window using override_redirect, but this * would possily require
+         * more changes and investigation.
+         */
+
+        /* Get the current postion of the drawable area on screen */
+        XTranslateCoordinates(
+            fgDisplay.pDisplay.Display,
+            fgStructure.CurrentWindow->Window.Handle,
+            fgDisplay.pDisplay.RootWindow,
+            0, 0, &x, &y,
+            &child
+        );
+
+        /* Move the decorataions out of the topleft corner of the display */
+        XMoveWindow( fgDisplay.pDisplay.Display, fgStructure.CurrentWindow->Window.Handle,
+                     -x, -y);
+    }
+
+#endif
+
+    /* Grab the keyboard, too */
+    XGrabKeyboard(
+        fgDisplay.pDisplay.Display,
+        fgStructure.GameModeWindow->Window.Handle,
+        FALSE,
+        GrabModeAsync, GrabModeAsync,
+        CurrentTime
+    );
+
+}
+
+void fgPlatformLeaveGameMode( void ) 
+{
+    XUngrabPointer( fgDisplay.pDisplay.Display, CurrentTime );
+    XUngrabKeyboard( fgDisplay.pDisplay.Display, CurrentTime );
+}
+
index 394c6c1..e4a29a6 100644 (file)
-/*\r
- * freeglut_glutfont_definitions_x11.c\r
- *\r
- * Bitmap and stroke fonts displaying.\r
- *\r
- * Copyright (c) 2003 Stephen J. Baker (whether he wants it or not).\r
- * All Rights Reserved.\r
- * Written by John F. Fay <fayjf@sourceforge.net>, who releases the\r
- * copyright over to the "freeglut" project lead.\r
- * Creation date: Mon July 21 2003\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-/*\r
- * This file is necessary for the *nix version of "freeglut" because the\r
- * original GLUT defined its font variables in rather an unusual way.\r
- * Publicly, in "glut.h", they were defined as "void *".  Privately,\r
- * in one of the source code files, they were defined as pointers to a\r
- * structure.  Most compilers and linkers are satisfied with the "void *"\r
- * and don't go any farther, but some of them balked.  In particular,\r
- * when compiling with "freeglut" and then trying to run using the GLUT\r
- * ".so" library, some of them would give an error.  So we are having to\r
- * create this file to define the variables as pointers to an unusual\r
- * structure to match GLUT.\r
- */\r
-\r
-/*\r
- * freeglut_internal.h uses some GL types, but including the GL header portably\r
- * is a bit tricky, so we include freeglut_std.h here, which contains the\r
- * necessary machinery. But this poses another problem, caused by the ugly\r
- * original defintion of the font constants in "classic" GLUT: They are defined\r
- * as void* externally, so we move them temporarily out of the way by AN EXTREME\r
- * CPP HACK.\r
- */\r
-\r
-#define glutStrokeRoman glutStrokeRomanIGNOREME\r
-#define glutStrokeMonoRoman glutStrokeMonoRomanIGNOREME\r
-#define glutBitmap9By15 glutBitmap9By15IGNOREME\r
-#define glutBitmap8By13 glutBitmap8By13IGNOREME\r
-#define glutBitmapTimesRoman10 glutBitmapTimesRoman10IGNOREME\r
-#define glutBitmapTimesRoman24 glutBitmapTimesRoman24IGNOREME\r
-#define glutBitmapHelvetica10 glutBitmapHelvetica10IGNOREME\r
-#define glutBitmapHelvetica12 glutBitmapHelvetica12IGNOREME\r
-#define glutBitmapHelvetica18 glutBitmapHelvetica18IGNOREME\r
-\r
-#include <GL/freeglut_std.h>\r
-\r
-#undef glutStrokeRoman\r
-#undef glutStrokeMonoRoman\r
-#undef glutBitmap9By15\r
-#undef glutBitmap8By13\r
-#undef glutBitmapTimesRoman10\r
-#undef glutBitmapTimesRoman24\r
-#undef glutBitmapHelvetica10\r
-#undef glutBitmapHelvetica12\r
-#undef glutBitmapHelvetica18\r
-\r
-#include "../Common/freeglut_internal.h"\r
-\r
-struct freeglutStrokeFont\r
-{\r
-  const char *name ;\r
-  int num_chars ;\r
-  void *ch ;\r
-  float top ;\r
-  float bottom ;\r
-};\r
-\r
-struct freeglutBitmapFont\r
-{\r
-  const char *name ;\r
-  const int num_chars ;\r
-  const int first ;\r
-  const void *ch ;\r
-};\r
-\r
-\r
-struct freeglutStrokeFont glutStrokeRoman ;\r
-struct freeglutStrokeFont glutStrokeMonoRoman ;\r
-\r
-struct freeglutBitmapFont glutBitmap9By15 ;\r
-struct freeglutBitmapFont glutBitmap8By13 ;\r
-struct freeglutBitmapFont glutBitmapTimesRoman10 ;\r
-struct freeglutBitmapFont glutBitmapTimesRoman24 ;\r
-struct freeglutBitmapFont glutBitmapHelvetica10 ;\r
-struct freeglutBitmapFont glutBitmapHelvetica12 ;\r
-struct freeglutBitmapFont glutBitmapHelvetica18 ;\r
-\r
+/*
+ * freeglut_glutfont_definitions_x11.c
+ *
+ * Bitmap and stroke fonts displaying.
+ *
+ * Copyright (c) 2003 Stephen J. Baker (whether he wants it or not).
+ * All Rights Reserved.
+ * Written by John F. Fay <fayjf@sourceforge.net>, who releases the
+ * copyright over to the "freeglut" project lead.
+ * Creation date: Mon July 21 2003
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * This file is necessary for the *nix version of "freeglut" because the
+ * original GLUT defined its font variables in rather an unusual way.
+ * Publicly, in "glut.h", they were defined as "void *".  Privately,
+ * in one of the source code files, they were defined as pointers to a
+ * structure.  Most compilers and linkers are satisfied with the "void *"
+ * and don't go any farther, but some of them balked.  In particular,
+ * when compiling with "freeglut" and then trying to run using the GLUT
+ * ".so" library, some of them would give an error.  So we are having to
+ * create this file to define the variables as pointers to an unusual
+ * structure to match GLUT.
+ */
+
+/*
+ * freeglut_internal.h uses some GL types, but including the GL header portably
+ * is a bit tricky, so we include freeglut_std.h here, which contains the
+ * necessary machinery. But this poses another problem, caused by the ugly
+ * original defintion of the font constants in "classic" GLUT: They are defined
+ * as void* externally, so we move them temporarily out of the way by AN EXTREME
+ * CPP HACK.
+ */
+
+#define glutStrokeRoman glutStrokeRomanIGNOREME
+#define glutStrokeMonoRoman glutStrokeMonoRomanIGNOREME
+#define glutBitmap9By15 glutBitmap9By15IGNOREME
+#define glutBitmap8By13 glutBitmap8By13IGNOREME
+#define glutBitmapTimesRoman10 glutBitmapTimesRoman10IGNOREME
+#define glutBitmapTimesRoman24 glutBitmapTimesRoman24IGNOREME
+#define glutBitmapHelvetica10 glutBitmapHelvetica10IGNOREME
+#define glutBitmapHelvetica12 glutBitmapHelvetica12IGNOREME
+#define glutBitmapHelvetica18 glutBitmapHelvetica18IGNOREME
+
+#include <GL/freeglut_std.h>
+
+#undef glutStrokeRoman
+#undef glutStrokeMonoRoman
+#undef glutBitmap9By15
+#undef glutBitmap8By13
+#undef glutBitmapTimesRoman10
+#undef glutBitmapTimesRoman24
+#undef glutBitmapHelvetica10
+#undef glutBitmapHelvetica12
+#undef glutBitmapHelvetica18
+
+#include "../Common/freeglut_internal.h"
+
+struct freeglutStrokeFont
+{
+  const char *name ;
+  int num_chars ;
+  void *ch ;
+  float top ;
+  float bottom ;
+};
+
+struct freeglutBitmapFont
+{
+  const char *name ;
+  const int num_chars ;
+  const int first ;
+  const void *ch ;
+};
+
+
+struct freeglutStrokeFont glutStrokeRoman ;
+struct freeglutStrokeFont glutStrokeMonoRoman ;
+
+struct freeglutBitmapFont glutBitmap9By15 ;
+struct freeglutBitmapFont glutBitmap8By13 ;
+struct freeglutBitmapFont glutBitmapTimesRoman10 ;
+struct freeglutBitmapFont glutBitmapTimesRoman24 ;
+struct freeglutBitmapFont glutBitmapHelvetica10 ;
+struct freeglutBitmapFont glutBitmapHelvetica12 ;
+struct freeglutBitmapFont glutBitmapHelvetica18 ;
+
index 3010943..7c8ba93 100644 (file)
-/*\r
- * freeglut_init_x11.c\r
- *\r
- * Various freeglut initialization functions.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Copied for Platform code by Evan Felix <karcaw at gmail.com>\r
- * Creation date: Thur Feb 2 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#define FREEGLUT_BUILDING_LIB\r
-#include <limits.h>  /* LONG_MAX */\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-/* Return the atom associated with "name". */\r
-static Atom fghGetAtom(const char * name)\r
-{\r
-  return XInternAtom(fgDisplay.pDisplay.Display, name, False);\r
-}\r
-\r
-/*\r
- * Check if "property" is set on "window".  The property's values are returned\r
- * through "data".  If the property is set and is of type "type", return the\r
- * number of elements in "data".  Return zero otherwise.  In both cases, use\r
- * "Xfree()" to free "data".\r
- */\r
-static int fghGetWindowProperty(Window window,\r
-                               Atom property,\r
-                               Atom type,\r
-                               unsigned char ** data)\r
-{\r
-  /*\r
-   * Caller always has to use "Xfree()" to free "data", since\r
-   * "XGetWindowProperty() always allocates one extra byte in prop_return\r
-   * [i.e. "data"] (even if the property is zero length) [..]".\r
-   */\r
-\r
-  int status;  /*  Returned by "XGetWindowProperty". */\r
-\r
-  Atom          type_returned;\r
-  int           temp_format;             /*  Not used. */\r
-  unsigned long number_of_elements;\r
-  unsigned long temp_bytes_after;        /*  Not used. */\r
-\r
-\r
-  status = XGetWindowProperty(fgDisplay.pDisplay.Display,\r
-                             window,\r
-                             property,\r
-                             0,\r
-                             LONG_MAX,\r
-                             False,\r
-                             type,\r
-                             &type_returned,\r
-                             &temp_format,\r
-                             &number_of_elements,\r
-                             &temp_bytes_after,\r
-                             data);\r
-\r
-  FREEGLUT_INTERNAL_ERROR_EXIT(status == Success,\r
-                              "XGetWindowProperty failled",\r
-                              "fghGetWindowProperty");\r
-\r
-  if (type_returned != type)\r
-    {\r
-      number_of_elements = 0;\r
-    }\r
-\r
-  return number_of_elements;\r
-}\r
-\r
-/*  Check if the window manager is NET WM compliant. */\r
-static int fghNetWMSupported(void)\r
-{\r
-  Atom wm_check;\r
-  Window ** window_ptr_1;\r
-\r
-  int number_of_windows;\r
-  int net_wm_supported;\r
-\r
-\r
-  net_wm_supported = 0;\r
-\r
-  wm_check = fghGetAtom("_NET_SUPPORTING_WM_CHECK");\r
-  window_ptr_1 = malloc(sizeof(Window *));\r
-\r
-  /*\r
-   * Check that the window manager has set this property on the root window.\r
-   * The property must be the ID of a child window.\r
-   */\r
-  number_of_windows = fghGetWindowProperty(fgDisplay.pDisplay.RootWindow,\r
-                                           wm_check,\r
-                                           XA_WINDOW,\r
-                                           (unsigned char **) window_ptr_1);\r
-  if (number_of_windows == 1)\r
-    {\r
-      Window ** window_ptr_2;\r
-\r
-      window_ptr_2 = malloc(sizeof(Window *));\r
-\r
-      /* Check that the window has the same property set to the same value. */\r
-      number_of_windows = fghGetWindowProperty(**window_ptr_1,\r
-                                               wm_check,\r
-                                               XA_WINDOW,\r
-                                               (unsigned char **) window_ptr_2);\r
-      if ((number_of_windows == 1) && (**window_ptr_1 == **window_ptr_2))\r
-      {\r
-        /* NET WM compliant */\r
-        net_wm_supported = 1;\r
-      }\r
-\r
-      XFree(*window_ptr_2);\r
-      free(window_ptr_2);\r
-    }\r
-\r
-        XFree(*window_ptr_1);\r
-        free(window_ptr_1);\r
-\r
-        return net_wm_supported;\r
-}\r
-\r
-/*  Check if "hint" is present in "property" for "window". */\r
-int fgHintPresent(Window window, Atom property, Atom hint)\r
-{\r
-  Atom *atoms;\r
-  int number_of_atoms;\r
-  int supported;\r
-  int i;\r
-\r
-  supported = 0;\r
-\r
-  number_of_atoms = fghGetWindowProperty(window,\r
-                                        property,\r
-                                        XA_ATOM,\r
-                                        (unsigned char **) &atoms);\r
-  for (i = 0; i < number_of_atoms; i++)\r
-  {\r
-      if (atoms[i] == hint)\r
-      {\r
-          supported = 1;\r
-          break;\r
-      }\r
-  }\r
-\r
-  XFree(atoms);\r
-  return supported;\r
-}\r
-\r
-/*\r
- * A call to this function should initialize all the display stuff...\r
- */\r
-void fgPlatformInitialize( const char* displayName )\r
-{\r
-    fgDisplay.pDisplay.Display = XOpenDisplay( displayName );\r
-\r
-    if( fgDisplay.pDisplay.Display == NULL )\r
-        fgError( "failed to open display '%s'", XDisplayName( displayName ) );\r
-\r
-    if( !glXQueryExtension( fgDisplay.pDisplay.Display, NULL, NULL ) )\r
-        fgError( "OpenGL GLX extension not supported by display '%s'",\r
-            XDisplayName( displayName ) );\r
-\r
-    fgDisplay.pDisplay.Screen = DefaultScreen( fgDisplay.pDisplay.Display );\r
-    fgDisplay.pDisplay.RootWindow = RootWindow(\r
-        fgDisplay.pDisplay.Display,\r
-        fgDisplay.pDisplay.Screen\r
-    );\r
-\r
-    fgDisplay.ScreenWidth  = DisplayWidth(\r
-        fgDisplay.pDisplay.Display,\r
-        fgDisplay.pDisplay.Screen\r
-    );\r
-    fgDisplay.ScreenHeight = DisplayHeight(\r
-        fgDisplay.pDisplay.Display,\r
-        fgDisplay.pDisplay.Screen\r
-    );\r
-\r
-    fgDisplay.ScreenWidthMM = DisplayWidthMM(\r
-        fgDisplay.pDisplay.Display,\r
-        fgDisplay.pDisplay.Screen\r
-    );\r
-    fgDisplay.ScreenHeightMM = DisplayHeightMM(\r
-        fgDisplay.pDisplay.Display,\r
-        fgDisplay.pDisplay.Screen\r
-    );\r
-\r
-    fgDisplay.pDisplay.Connection = ConnectionNumber( fgDisplay.pDisplay.Display );\r
-\r
-    /* Create the window deletion atom */\r
-    fgDisplay.pDisplay.DeleteWindow = fghGetAtom("WM_DELETE_WINDOW");\r
-\r
-    /* Create the state and full screen atoms */\r
-    fgDisplay.pDisplay.State           = None;\r
-    fgDisplay.pDisplay.StateFullScreen = None;\r
-\r
-    if (fghNetWMSupported())\r
-    {\r
-      const Atom supported = fghGetAtom("_NET_SUPPORTED");\r
-      const Atom state     = fghGetAtom("_NET_WM_STATE");\r
-      \r
-      /* Check if the state hint is supported. */\r
-      if (fgHintPresent(fgDisplay.pDisplay.RootWindow, supported, state))\r
-      {\r
-        const Atom full_screen = fghGetAtom("_NET_WM_STATE_FULLSCREEN");\r
-        \r
-        fgDisplay.pDisplay.State = state;\r
-        \r
-        /* Check if the window manager supports full screen. */\r
-        /**  Check "_NET_WM_ALLOWED_ACTIONS" on our window instead? **/\r
-        if (fgHintPresent(fgDisplay.pDisplay.RootWindow, supported, full_screen))\r
-        {\r
-          fgDisplay.pDisplay.StateFullScreen = full_screen;\r
-        }\r
-      }\r
-    }\r
-\r
-\r
-    fgState.Initialised = GL_TRUE;\r
-\r
-    atexit(fgDeinitialize);\r
-\r
-    /* InputDevice uses GlutTimerFunc(), so fgState.Initialised must be TRUE */\r
-    fgInitialiseInputDevices();\r
-}\r
-\r
-void fgPlatformDeinitialiseInputDevices ( void )\r
-{\r
-       fghCloseInputDevices ();\r
-\r
-    fgState.JoysticksInitialised = GL_FALSE;\r
-    fgState.InputDevsInitialised = GL_FALSE;\r
-}\r
-\r
-\r
-void fgPlatformCloseDisplay ( void )\r
-{\r
-    /*\r
-     * Make sure all X-client data we have created will be destroyed on\r
-     * display closing\r
-     */\r
-    XSetCloseDownMode( fgDisplay.pDisplay.Display, DestroyAll );\r
-\r
-    /*\r
-     * Close the display connection, destroying all windows we have\r
-     * created so far\r
-     */\r
-    XCloseDisplay( fgDisplay.pDisplay.Display );\r
-}\r
-\r
-\r
-void fgPlatformDestroyContext ( SFG_PlatformDisplay pDisplay, SFG_WindowContextType MContext )\r
-{\r
-    /* Note that the MVisualInfo is not owned by the MenuContext! */\r
-    glXDestroyContext( pDisplay.Display, MContext );\r
+/*
+ * freeglut_init_x11.c
+ *
+ * Various freeglut initialization functions.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Copied for Platform code by Evan Felix <karcaw at gmail.com>
+ * Creation date: Thur Feb 2 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#define FREEGLUT_BUILDING_LIB
+#include <limits.h>  /* LONG_MAX */
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+/* Return the atom associated with "name". */
+static Atom fghGetAtom(const char * name)
+{
+  return XInternAtom(fgDisplay.pDisplay.Display, name, False);
+}
+
+/*
+ * Check if "property" is set on "window".  The property's values are returned
+ * through "data".  If the property is set and is of type "type", return the
+ * number of elements in "data".  Return zero otherwise.  In both cases, use
+ * "Xfree()" to free "data".
+ */
+static int fghGetWindowProperty(Window window,
+                               Atom property,
+                               Atom type,
+                               unsigned char ** data)
+{
+  /*
+   * Caller always has to use "Xfree()" to free "data", since
+   * "XGetWindowProperty() always allocates one extra byte in prop_return
+   * [i.e. "data"] (even if the property is zero length) [..]".
+   */
+
+  int status;  /*  Returned by "XGetWindowProperty". */
+
+  Atom          type_returned;
+  int           temp_format;             /*  Not used. */
+  unsigned long number_of_elements;
+  unsigned long temp_bytes_after;        /*  Not used. */
+
+
+  status = XGetWindowProperty(fgDisplay.pDisplay.Display,
+                             window,
+                             property,
+                             0,
+                             LONG_MAX,
+                             False,
+                             type,
+                             &type_returned,
+                             &temp_format,
+                             &number_of_elements,
+                             &temp_bytes_after,
+                             data);
+
+  FREEGLUT_INTERNAL_ERROR_EXIT(status == Success,
+                              "XGetWindowProperty failled",
+                              "fghGetWindowProperty");
+
+  if (type_returned != type)
+    {
+      number_of_elements = 0;
+    }
+
+  return number_of_elements;
+}
+
+/*  Check if the window manager is NET WM compliant. */
+static int fghNetWMSupported(void)
+{
+  Atom wm_check;
+  Window ** window_ptr_1;
+
+  int number_of_windows;
+  int net_wm_supported;
+
+
+  net_wm_supported = 0;
+
+  wm_check = fghGetAtom("_NET_SUPPORTING_WM_CHECK");
+  window_ptr_1 = malloc(sizeof(Window *));
+
+  /*
+   * Check that the window manager has set this property on the root window.
+   * The property must be the ID of a child window.
+   */
+  number_of_windows = fghGetWindowProperty(fgDisplay.pDisplay.RootWindow,
+                                           wm_check,
+                                           XA_WINDOW,
+                                           (unsigned char **) window_ptr_1);
+  if (number_of_windows == 1)
+    {
+      Window ** window_ptr_2;
+
+      window_ptr_2 = malloc(sizeof(Window *));
+
+      /* Check that the window has the same property set to the same value. */
+      number_of_windows = fghGetWindowProperty(**window_ptr_1,
+                                               wm_check,
+                                               XA_WINDOW,
+                                               (unsigned char **) window_ptr_2);
+      if ((number_of_windows == 1) && (**window_ptr_1 == **window_ptr_2))
+      {
+        /* NET WM compliant */
+        net_wm_supported = 1;
+      }
+
+      XFree(*window_ptr_2);
+      free(window_ptr_2);
+    }
+
+        XFree(*window_ptr_1);
+        free(window_ptr_1);
+
+        return net_wm_supported;
+}
+
+/*  Check if "hint" is present in "property" for "window". */
+int fgHintPresent(Window window, Atom property, Atom hint)
+{
+  Atom *atoms;
+  int number_of_atoms;
+  int supported;
+  int i;
+
+  supported = 0;
+
+  number_of_atoms = fghGetWindowProperty(window,
+                                        property,
+                                        XA_ATOM,
+                                        (unsigned char **) &atoms);
+  for (i = 0; i < number_of_atoms; i++)
+  {
+      if (atoms[i] == hint)
+      {
+          supported = 1;
+          break;
+      }
+  }
+
+  XFree(atoms);
+  return supported;
+}
+
+/*
+ * A call to this function should initialize all the display stuff...
+ */
+void fgPlatformInitialize( const char* displayName )
+{
+    fgDisplay.pDisplay.Display = XOpenDisplay( displayName );
+
+    if( fgDisplay.pDisplay.Display == NULL )
+        fgError( "failed to open display '%s'", XDisplayName( displayName ) );
+
+    if( !glXQueryExtension( fgDisplay.pDisplay.Display, NULL, NULL ) )
+        fgError( "OpenGL GLX extension not supported by display '%s'",
+            XDisplayName( displayName ) );
+
+    fgDisplay.pDisplay.Screen = DefaultScreen( fgDisplay.pDisplay.Display );
+    fgDisplay.pDisplay.RootWindow = RootWindow(
+        fgDisplay.pDisplay.Display,
+        fgDisplay.pDisplay.Screen
+    );
+
+    fgDisplay.ScreenWidth  = DisplayWidth(
+        fgDisplay.pDisplay.Display,
+        fgDisplay.pDisplay.Screen
+    );
+    fgDisplay.ScreenHeight = DisplayHeight(
+        fgDisplay.pDisplay.Display,
+        fgDisplay.pDisplay.Screen
+    );
+
+    fgDisplay.ScreenWidthMM = DisplayWidthMM(
+        fgDisplay.pDisplay.Display,
+        fgDisplay.pDisplay.Screen
+    );
+    fgDisplay.ScreenHeightMM = DisplayHeightMM(
+        fgDisplay.pDisplay.Display,
+        fgDisplay.pDisplay.Screen
+    );
+
+    fgDisplay.pDisplay.Connection = ConnectionNumber( fgDisplay.pDisplay.Display );
+
+    /* Create the window deletion atom */
+    fgDisplay.pDisplay.DeleteWindow = fghGetAtom("WM_DELETE_WINDOW");
+
+    /* Create the state and full screen atoms */
+    fgDisplay.pDisplay.State           = None;
+    fgDisplay.pDisplay.StateFullScreen = None;
+
+    if (fghNetWMSupported())
+    {
+      const Atom supported = fghGetAtom("_NET_SUPPORTED");
+      const Atom state     = fghGetAtom("_NET_WM_STATE");
+      
+      /* Check if the state hint is supported. */
+      if (fgHintPresent(fgDisplay.pDisplay.RootWindow, supported, state))
+      {
+        const Atom full_screen = fghGetAtom("_NET_WM_STATE_FULLSCREEN");
+        
+        fgDisplay.pDisplay.State = state;
+        
+        /* Check if the window manager supports full screen. */
+        /**  Check "_NET_WM_ALLOWED_ACTIONS" on our window instead? **/
+        if (fgHintPresent(fgDisplay.pDisplay.RootWindow, supported, full_screen))
+        {
+          fgDisplay.pDisplay.StateFullScreen = full_screen;
+        }
+      }
+    }
+
+
+    fgState.Initialised = GL_TRUE;
+
+    atexit(fgDeinitialize);
+
+    /* InputDevice uses GlutTimerFunc(), so fgState.Initialised must be TRUE */
+    fgInitialiseInputDevices();
+}
+
+void fgPlatformDeinitialiseInputDevices ( void )
+{
+       fghCloseInputDevices ();
+
+    fgState.JoysticksInitialised = GL_FALSE;
+    fgState.InputDevsInitialised = GL_FALSE;
+}
+
+
+void fgPlatformCloseDisplay ( void )
+{
+    /*
+     * Make sure all X-client data we have created will be destroyed on
+     * display closing
+     */
+    XSetCloseDownMode( fgDisplay.pDisplay.Display, DestroyAll );
+
+    /*
+     * Close the display connection, destroying all windows we have
+     * created so far
+     */
+    XCloseDisplay( fgDisplay.pDisplay.Display );
+}
+
+
+void fgPlatformDestroyContext ( SFG_PlatformDisplay pDisplay, SFG_WindowContextType MContext )
+{
+    /* Note that the MVisualInfo is not owned by the MenuContext! */
+    glXDestroyContext( pDisplay.Display, MContext );
 }
\ No newline at end of file
index 15faf4f..e45e02e 100644 (file)
-/*\r
- * freeglut_input_devices_x11.c\r
- *\r
- * Handles miscellaneous input devices via direct serial-port access.\r
- * Proper X11 XInput device support is not yet supported.\r
- * Also lacks Mac support.\r
- *\r
- * Written by Joe Krahn <krahn@niehs.nih.gov> 2005\r
- *\r
- * Copyright (c) 2005 Stephen J. Baker. All Rights Reserved.\r
- * Copied for Platform code by Evan Felix <karcaw at gmail.com>\r
- * Creation date: Thur Feb 2 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA OR STEPHEN J. BAKER BE LIABLE FOR ANY CLAIM, DAMAGES OR\r
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\r
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r
- * DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#ifdef HAVE_CONFIG_H\r
-#    include "config.h"\r
-#endif\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-#ifdef HAVE_ERRNO_H\r
-#include <errno.h>\r
-#endif\r
-#include <sys/ioctl.h>\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <termios.h>\r
-#include <fcntl.h>\r
-\r
-struct _serialport {\r
-   int fd;\r
-   struct termios termio, termio_save;\r
-};\r
-\r
-typedef struct _serialport SERIALPORT;\r
-\r
-void serial_flush ( SERIALPORT *port );\r
-\r
-/* local variables */\r
-static SERIALPORT *dialbox_port=NULL;\r
-\r
-/*****************************************************************/\r
-\r
-/*\r
- * Try initializing the input device(s)\r
- */\r
-void fgPlatformRegisterDialDevice ( const char *dial_device )\r
-{\r
-}\r
-\r
-SERIALPORT *serial_open ( const char *device )\r
-{\r
-    int fd;\r
-    struct termios termio;\r
-    SERIALPORT *port;\r
-\r
-    fd = open(device, O_RDWR | O_NONBLOCK );\r
-    if (fd <0) {\r
-        perror(device);\r
-        return NULL;\r
-    }\r
-\r
-    port = malloc(sizeof(SERIALPORT));\r
-    memset(port, 0, sizeof(SERIALPORT));\r
-    port->fd = fd;\r
-\r
-    /* save current port settings */\r
-    tcgetattr(fd,&port->termio_save);\r
-\r
-    memset(&termio, 0, sizeof(termio));\r
-    termio.c_cflag = CS8 | CREAD | HUPCL ;\r
-    termio.c_iflag = IGNPAR | IGNBRK ;\r
-    termio.c_cc[VTIME]    = 0;   /* inter-character timer */\r
-    termio.c_cc[VMIN]     = 1;   /* block read until 1 chars received, when blocking I/O */\r
-\r
-    cfsetispeed(&termio, B9600);\r
-    cfsetospeed(&termio, B9600);\r
-    tcsetattr(fd,TCSANOW,&termio);\r
-\r
-    serial_flush(port);\r
-    return port;\r
-}\r
-\r
-void serial_close(SERIALPORT *port)\r
-{\r
-    if (port)\r
-    {\r
-        /* restore old port settings */\r
-        tcsetattr(port->fd,TCSANOW,&port->termio_save);\r
-        close(port->fd);\r
-        free(port);\r
-    }\r
-}\r
-\r
-int serial_getchar(SERIALPORT *port)\r
-{\r
-    unsigned char ch;\r
-    if (!port) return EOF;\r
-    if (read(port->fd,&ch,1)) return ch;\r
-    return EOF;\r
-}\r
-\r
-int serial_putchar(SERIALPORT *port, unsigned char ch)\r
-{\r
-    if (!port) return 0;\r
-    return write(port->fd,&ch,1);\r
-}\r
-\r
-void serial_flush ( SERIALPORT *port )\r
-{\r
-    tcflush ( port->fd, TCIOFLUSH );\r
-}\r
+/*
+ * freeglut_input_devices_x11.c
+ *
+ * Handles miscellaneous input devices via direct serial-port access.
+ * Proper X11 XInput device support is not yet supported.
+ * Also lacks Mac support.
+ *
+ * Written by Joe Krahn <krahn@niehs.nih.gov> 2005
+ *
+ * Copyright (c) 2005 Stephen J. Baker. All Rights Reserved.
+ * Copied for Platform code by Evan Felix <karcaw at gmail.com>
+ * Creation date: Thur Feb 2 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA OR STEPHEN J. BAKER BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#    include "config.h"
+#endif
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+#include <sys/ioctl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <termios.h>
+#include <fcntl.h>
+
+struct _serialport {
+   int fd;
+   struct termios termio, termio_save;
+};
+
+typedef struct _serialport SERIALPORT;
+
+void serial_flush ( SERIALPORT *port );
+
+/* local variables */
+static SERIALPORT *dialbox_port=NULL;
+
+/*****************************************************************/
+
+/*
+ * Try initializing the input device(s)
+ */
+void fgPlatformRegisterDialDevice ( const char *dial_device )
+{
+}
+
+SERIALPORT *serial_open ( const char *device )
+{
+    int fd;
+    struct termios termio;
+    SERIALPORT *port;
+
+    fd = open(device, O_RDWR | O_NONBLOCK );
+    if (fd <0) {
+        perror(device);
+        return NULL;
+    }
+
+    port = malloc(sizeof(SERIALPORT));
+    memset(port, 0, sizeof(SERIALPORT));
+    port->fd = fd;
+
+    /* save current port settings */
+    tcgetattr(fd,&port->termio_save);
+
+    memset(&termio, 0, sizeof(termio));
+    termio.c_cflag = CS8 | CREAD | HUPCL ;
+    termio.c_iflag = IGNPAR | IGNBRK ;
+    termio.c_cc[VTIME]    = 0;   /* inter-character timer */
+    termio.c_cc[VMIN]     = 1;   /* block read until 1 chars received, when blocking I/O */
+
+    cfsetispeed(&termio, B9600);
+    cfsetospeed(&termio, B9600);
+    tcsetattr(fd,TCSANOW,&termio);
+
+    serial_flush(port);
+    return port;
+}
+
+void serial_close(SERIALPORT *port)
+{
+    if (port)
+    {
+        /* restore old port settings */
+        tcsetattr(port->fd,TCSANOW,&port->termio_save);
+        close(port->fd);
+        free(port);
+    }
+}
+
+int serial_getchar(SERIALPORT *port)
+{
+    unsigned char ch;
+    if (!port) return EOF;
+    if (read(port->fd,&ch,1)) return ch;
+    return EOF;
+}
+
+int serial_putchar(SERIALPORT *port, unsigned char ch)
+{
+    if (!port) return 0;
+    return write(port->fd,&ch,1);
+}
+
+void serial_flush ( SERIALPORT *port )
+{
+    tcflush ( port->fd, TCIOFLUSH );
+}
index 02472e7..8a8e197 100644 (file)
-/*\r
- * freeglut_internal_x11.h\r
- *\r
- * The freeglut library private include file.\r
- *\r
- * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
- * Written by Diederick C. Niehorster, <dcnieho@gmail.com>\r
- * Creation date: Fri Jan 20, 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#ifndef  FREEGLUT_INTERNAL_X11_H\r
-#define  FREEGLUT_INTERNAL_X11_H\r
-\r
-\r
-/* -- PLATFORM-SPECIFIC INCLUDES ------------------------------------------- */\r
-#include <GL/glx.h>\r
-#include <X11/Xlib.h>\r
-#include <X11/Xatom.h>\r
-#include <X11/keysym.h>\r
-#include <X11/extensions/XInput.h>\r
-#ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H\r
-#    include <X11/extensions/xf86vmode.h>\r
-#endif\r
-#ifdef HAVE_X11_EXTENSIONS_XRANDR_H\r
-#    include <X11/extensions/Xrandr.h>\r
-#endif\r
-/* If GLX is too old, we will fail during runtime when multisampling\r
-   is requested, but at least freeglut compiles. */\r
-#ifndef GLX_SAMPLE_BUFFERS\r
-#    define GLX_SAMPLE_BUFFERS 0x80A8\r
-#endif\r
-#ifndef GLX_SAMPLES\r
-#    define GLX_SAMPLES 0x80A9\r
-#endif\r
-\r
-\r
-\r
-/* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */\r
-/* The structure used by display initialization in freeglut_init.c */\r
-typedef struct tagSFG_PlatformDisplay SFG_PlatformDisplay;\r
-struct tagSFG_PlatformDisplay\r
-{\r
-    Display*        Display;            /* The display we are being run in.  */\r
-    int             Screen;             /* The screen we are about to use.   */\r
-    Window          RootWindow;         /* The screen's root window.         */\r
-    int             Connection;         /* The display's connection number   */\r
-    Atom            DeleteWindow;       /* The window deletion atom          */\r
-    Atom            State;              /* The state atom                    */\r
-    Atom            StateFullScreen;    /* The full screen atom              */\r
-\r
-#ifdef HAVE_X11_EXTENSIONS_XRANDR_H\r
-    int prev_xsz, prev_ysz;\r
-    int prev_refresh;\r
-    int prev_size_valid;\r
-#endif /* HAVE_X11_EXTENSIONS_XRANDR_H */\r
-\r
-#ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H\r
-    /*\r
-     * XF86VidMode may be compilable even if it fails at runtime.  Therefore,\r
-     * the validity of the VidMode has to be tracked\r
-     */\r
-    int             DisplayModeValid;   /* Flag that indicates runtime status*/\r
-    XF86VidModeModeLine DisplayMode;    /* Current screen's display settings */\r
-    int             DisplayModeClock;   /* The display mode's refresh rate   */\r
-    int             DisplayViewPortX;   /* saved X location of the viewport  */\r
-    int             DisplayViewPortY;   /* saved Y location of the viewport  */\r
-#endif /* HAVE_X11_EXTENSIONS_XF86VMODE_H */\r
-\r
-    int             DisplayPointerX;    /* saved X location of the pointer   */\r
-    int             DisplayPointerY;    /* saved Y location of the pointer   */\r
-};\r
-\r
-\r
-/*\r
- * Make "freeglut" window handle and context types so that we don't need so\r
- * much conditionally-compiled code later in the library.\r
- */\r
-typedef Window     SFG_WindowHandleType ;\r
-typedef GLXContext SFG_WindowContextType ;\r
-typedef struct tagSFG_PlatformContext SFG_PlatformContext;\r
-struct tagSFG_PlatformContext\r
-{\r
-    GLXFBConfig*    FBConfig;        /* The window's FBConfig               */\r
-};\r
-\r
-\r
-/* Window's state description. This structure should be kept portable. */\r
-typedef struct tagSFG_PlatformWindowState SFG_PlatformWindowState;\r
-struct tagSFG_PlatformWindowState\r
-{\r
-    int             OldWidth;           /* Window width from before a resize */\r
-    int             OldHeight;          /*   "    height  "    "    "   "    */\r
-};\r
-\r
-\r
-/* -- JOYSTICK-SPECIFIC STRUCTURES AND TYPES ------------------------------- */\r
-/*\r
- * Initial defines from "js.h" starting around line 33 with the existing "freeglut_joystick.c"\r
- * interspersed\r
- */\r
-#    ifdef HAVE_SYS_IOCTL_H\r
-#        include <sys/ioctl.h>\r
-#    endif\r
-#    ifdef HAVE_FCNTL_H\r
-#        include <fcntl.h>\r
-#    endif\r
-#    ifdef HAVE_ERRNO_H\r
-#        include <errno.h>\r
-#        include <string.h>\r
-#    endif\r
-#    if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)\r
-/* XXX The below hack is done until freeglut's autoconf is updated. */\r
-#        define HAVE_USB_JS    1\r
-\r
-#        if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)\r
-#            include <sys/joystick.h>\r
-#        else\r
-/*\r
- * XXX NetBSD/amd64 systems may find that they have to steal the\r
- * XXX /usr/include/machine/joystick.h from a NetBSD/i386 system.\r
- * XXX I cannot comment whether that works for the interface, but\r
- * XXX it lets you compile...(^&  I do not think that we can do away\r
- * XXX with this header.\r
- */\r
-#            include <machine/joystick.h>         /* For analog joysticks */\r
-#        endif\r
-#        define JS_DATA_TYPE joystick\r
-#        define JS_RETURN (sizeof(struct JS_DATA_TYPE))\r
-#    endif\r
-\r
-#    if defined(__linux__)\r
-#        include <linux/joystick.h>\r
-\r
-/* check the joystick driver version */\r
-#        if defined(JS_VERSION) && JS_VERSION >= 0x010000\r
-#            define JS_NEW\r
-#        endif\r
-#    else  /* Not BSD or Linux */\r
-#        ifndef JS_RETURN\r
-\r
-  /*\r
-   * We'll put these values in and that should\r
-   * allow the code to at least compile when there is\r
-   * no support. The JS open routine should error out\r
-   * and shut off all the code downstream anyway and if\r
-   * the application doesn't use a joystick we'll be fine.\r
-   */\r
-\r
-  struct JS_DATA_TYPE\r
-  {\r
-    int buttons;\r
-    int x;\r
-    int y;\r
-  };\r
-\r
-#            define JS_RETURN (sizeof(struct JS_DATA_TYPE))\r
-#        endif\r
-#    endif\r
-\r
-/* XXX It might be better to poll the operating system for the numbers of buttons and\r
- * XXX axes and then dynamically allocate the arrays.\r
- */\r
-#    define _JS_MAX_AXES 16\r
-typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick;\r
-struct tagSFG_PlatformJoystick\r
-{\r
-#   if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)\r
-       struct os_specific_s *os;\r
-#   endif\r
-\r
-#   ifdef JS_NEW\r
-       struct js_event     js;\r
-       int          tmp_buttons;\r
-       float        tmp_axes [ _JS_MAX_AXES ];\r
-#   else\r
-       struct JS_DATA_TYPE js;\r
-#   endif\r
-\r
-    char         fname [ 128 ];\r
-    int          fd;\r
-};\r
-\r
-\r
-/* Menu font and color definitions */\r
-#define  FREEGLUT_MENU_FONT    GLUT_BITMAP_HELVETICA_18\r
-\r
-#define  FREEGLUT_MENU_PEN_FORE_COLORS   {0.0f,  0.0f,  0.0f,  1.0f}\r
-#define  FREEGLUT_MENU_PEN_BACK_COLORS   {0.70f, 0.70f, 0.70f, 1.0f}\r
-#define  FREEGLUT_MENU_PEN_HFORE_COLORS  {0.0f,  0.0f,  0.0f,  1.0f}\r
-#define  FREEGLUT_MENU_PEN_HBACK_COLORS  {1.0f,  1.0f,  1.0f,  1.0f}\r
-\r
-\r
-\r
-\r
-/* -- PRIVATE FUNCTION DECLARATIONS ---------------------------------------- */\r
-/* spaceball device functions, defined in freeglut_spaceball.c */\r
-int             fgIsSpaceballXEvent( const XEvent *ev );\r
-void            fgSpaceballHandleXEvent( const XEvent *ev );\r
-\r
-/*\r
- * Check if "hint" is present in "property" for "window".  See freeglut_init.c\r
- */\r
-int             fgHintPresent(Window window, Atom property, Atom hint);\r
-\r
-/* Handler for X extension Events */\r
-#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H\r
-  void          fgHandleExtensionEvents( XEvent * ev );\r
-  void          fgRegisterDevices( Display* dpy, Window* win );\r
-#endif\r
-\r
-\r
-#endif  /* FREEGLUT_INTERNAL_X11_H */\r
+/*
+ * freeglut_internal_x11.h
+ *
+ * The freeglut library private include file.
+ *
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
+ * Written by Diederick C. Niehorster, <dcnieho@gmail.com>
+ * Creation date: Fri Jan 20, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef  FREEGLUT_INTERNAL_X11_H
+#define  FREEGLUT_INTERNAL_X11_H
+
+
+/* -- PLATFORM-SPECIFIC INCLUDES ------------------------------------------- */
+#include <GL/glx.h>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/keysym.h>
+#include <X11/extensions/XInput.h>
+#ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
+#    include <X11/extensions/xf86vmode.h>
+#endif
+#ifdef HAVE_X11_EXTENSIONS_XRANDR_H
+#    include <X11/extensions/Xrandr.h>
+#endif
+/* If GLX is too old, we will fail during runtime when multisampling
+   is requested, but at least freeglut compiles. */
+#ifndef GLX_SAMPLE_BUFFERS
+#    define GLX_SAMPLE_BUFFERS 0x80A8
+#endif
+#ifndef GLX_SAMPLES
+#    define GLX_SAMPLES 0x80A9
+#endif
+
+
+
+/* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */
+/* The structure used by display initialization in freeglut_init.c */
+typedef struct tagSFG_PlatformDisplay SFG_PlatformDisplay;
+struct tagSFG_PlatformDisplay
+{
+    Display*        Display;            /* The display we are being run in.  */
+    int             Screen;             /* The screen we are about to use.   */
+    Window          RootWindow;         /* The screen's root window.         */
+    int             Connection;         /* The display's connection number   */
+    Atom            DeleteWindow;       /* The window deletion atom          */
+    Atom            State;              /* The state atom                    */
+    Atom            StateFullScreen;    /* The full screen atom              */
+
+#ifdef HAVE_X11_EXTENSIONS_XRANDR_H
+    int prev_xsz, prev_ysz;
+    int prev_refresh;
+    int prev_size_valid;
+#endif /* HAVE_X11_EXTENSIONS_XRANDR_H */
+
+#ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
+    /*
+     * XF86VidMode may be compilable even if it fails at runtime.  Therefore,
+     * the validity of the VidMode has to be tracked
+     */
+    int             DisplayModeValid;   /* Flag that indicates runtime status*/
+    XF86VidModeModeLine DisplayMode;    /* Current screen's display settings */
+    int             DisplayModeClock;   /* The display mode's refresh rate   */
+    int             DisplayViewPortX;   /* saved X location of the viewport  */
+    int             DisplayViewPortY;   /* saved Y location of the viewport  */
+#endif /* HAVE_X11_EXTENSIONS_XF86VMODE_H */
+
+    int             DisplayPointerX;    /* saved X location of the pointer   */
+    int             DisplayPointerY;    /* saved Y location of the pointer   */
+};
+
+
+/*
+ * Make "freeglut" window handle and context types so that we don't need so
+ * much conditionally-compiled code later in the library.
+ */
+typedef Window     SFG_WindowHandleType ;
+typedef GLXContext SFG_WindowContextType ;
+typedef struct tagSFG_PlatformContext SFG_PlatformContext;
+struct tagSFG_PlatformContext
+{
+    GLXFBConfig*    FBConfig;        /* The window's FBConfig               */
+};
+
+
+/* Window's state description. This structure should be kept portable. */
+typedef struct tagSFG_PlatformWindowState SFG_PlatformWindowState;
+struct tagSFG_PlatformWindowState
+{
+    int             OldWidth;           /* Window width from before a resize */
+    int             OldHeight;          /*   "    height  "    "    "   "    */
+};
+
+
+/* -- JOYSTICK-SPECIFIC STRUCTURES AND TYPES ------------------------------- */
+/*
+ * Initial defines from "js.h" starting around line 33 with the existing "freeglut_joystick.c"
+ * interspersed
+ */
+#    ifdef HAVE_SYS_IOCTL_H
+#        include <sys/ioctl.h>
+#    endif
+#    ifdef HAVE_FCNTL_H
+#        include <fcntl.h>
+#    endif
+#    ifdef HAVE_ERRNO_H
+#        include <errno.h>
+#        include <string.h>
+#    endif
+#    if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
+/* XXX The below hack is done until freeglut's autoconf is updated. */
+#        define HAVE_USB_JS    1
+
+#        if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+#            include <sys/joystick.h>
+#        else
+/*
+ * XXX NetBSD/amd64 systems may find that they have to steal the
+ * XXX /usr/include/machine/joystick.h from a NetBSD/i386 system.
+ * XXX I cannot comment whether that works for the interface, but
+ * XXX it lets you compile...(^&  I do not think that we can do away
+ * XXX with this header.
+ */
+#            include <machine/joystick.h>         /* For analog joysticks */
+#        endif
+#        define JS_DATA_TYPE joystick
+#        define JS_RETURN (sizeof(struct JS_DATA_TYPE))
+#    endif
+
+#    if defined(__linux__)
+#        include <linux/joystick.h>
+
+/* check the joystick driver version */
+#        if defined(JS_VERSION) && JS_VERSION >= 0x010000
+#            define JS_NEW
+#        endif
+#    else  /* Not BSD or Linux */
+#        ifndef JS_RETURN
+
+  /*
+   * We'll put these values in and that should
+   * allow the code to at least compile when there is
+   * no support. The JS open routine should error out
+   * and shut off all the code downstream anyway and if
+   * the application doesn't use a joystick we'll be fine.
+   */
+
+  struct JS_DATA_TYPE
+  {
+    int buttons;
+    int x;
+    int y;
+  };
+
+#            define JS_RETURN (sizeof(struct JS_DATA_TYPE))
+#        endif
+#    endif
+
+/* XXX It might be better to poll the operating system for the numbers of buttons and
+ * XXX axes and then dynamically allocate the arrays.
+ */
+#    define _JS_MAX_AXES 16
+typedef struct tagSFG_PlatformJoystick SFG_PlatformJoystick;
+struct tagSFG_PlatformJoystick
+{
+#   if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
+       struct os_specific_s *os;
+#   endif
+
+#   ifdef JS_NEW
+       struct js_event     js;
+       int          tmp_buttons;
+       float        tmp_axes [ _JS_MAX_AXES ];
+#   else
+       struct JS_DATA_TYPE js;
+#   endif
+
+    char         fname [ 128 ];
+    int          fd;
+};
+
+
+/* Menu font and color definitions */
+#define  FREEGLUT_MENU_FONT    GLUT_BITMAP_HELVETICA_18
+
+#define  FREEGLUT_MENU_PEN_FORE_COLORS   {0.0f,  0.0f,  0.0f,  1.0f}
+#define  FREEGLUT_MENU_PEN_BACK_COLORS   {0.70f, 0.70f, 0.70f, 1.0f}
+#define  FREEGLUT_MENU_PEN_HFORE_COLORS  {0.0f,  0.0f,  0.0f,  1.0f}
+#define  FREEGLUT_MENU_PEN_HBACK_COLORS  {1.0f,  1.0f,  1.0f,  1.0f}
+
+
+
+
+/* -- PRIVATE FUNCTION DECLARATIONS ---------------------------------------- */
+/* spaceball device functions, defined in freeglut_spaceball.c */
+int             fgIsSpaceballXEvent( const XEvent *ev );
+void            fgSpaceballHandleXEvent( const XEvent *ev );
+
+/*
+ * Check if "hint" is present in "property" for "window".  See freeglut_init.c
+ */
+int             fgHintPresent(Window window, Atom property, Atom hint);
+
+/* Handler for X extension Events */
+#ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
+  void          fgHandleExtensionEvents( XEvent * ev );
+  void          fgRegisterDevices( Display* dpy, Window* win );
+#endif
+
+
+#endif  /* FREEGLUT_INTERNAL_X11_H */
index 9e2ee0c..962e362 100644 (file)
-/*\r
- * freeglut_joystick_x11.c\r
- *\r
- * Joystick handling code\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Steve Baker, <sjbaker1@airmail.net>\r
- * Copied for Platform code by Evan Felix <karcaw at gmail.com>\r
- * Creation date: Thur Feb 2 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-/*\r
- * FreeBSD port by Stephen Montgomery-Smith <stephen@math.missouri.edu>\r
- *\r
- * Redone by John Fay 2/4/04 with another look from the PLIB "js" library.\r
- *  Many thanks for Steve Baker for permission to pull from that library.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-#ifdef HAVE_SYS_PARAM_H\r
-#    include <sys/param.h>\r
-#endif\r
-\r
-\r
-/*this should be defined in a header file */\r
-#define MAX_NUM_JOYSTICKS  2   \r
-extern SFG_Joystick *fgJoystick [ MAX_NUM_JOYSTICKS ];\r
-\r
-void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes )\r
-{\r
-    int status;\r
-\r
-    int i;\r
-\r
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)\r
-    int len;\r
-\r
-    if ( joy->pJoystick.os->is_analog )\r
-    {\r
-        int status = read ( joy->pJoystick.os->fd, &joy->pJoystick.os->ajs, sizeof(joy->pJoystick.os->ajs) );\r
-        if ( status != sizeof(joy->pJoystick.os->ajs) ) {\r
-            perror ( joy->pJoystick.os->fname );\r
-            joy->error = GL_TRUE;\r
-            return;\r
-        }\r
-        if ( buttons != NULL )\r
-            *buttons = ( joy->pJoystick.os->ajs.b1 ? 1 : 0 ) | ( joy->pJoystick.os->ajs.b2 ? 2 : 0 );\r
-\r
-        if ( axes != NULL )\r
-        {\r
-            axes[0] = (float) joy->pJoystick.os->ajs.x;\r
-            axes[1] = (float) joy->pJoystick.os->ajs.y;\r
-        }\r
-\r
-        return;\r
-    }\r
-\r
-#  ifdef HAVE_USB_JS\r
-    while ( ( len = read ( joy->pJoystick.os->fd, joy->pJoystick.os->hid_data_buf, joy->pJoystick.os->hid_dlen ) ) == joy->pJoystick.os->hid_dlen )\r
-    {\r
-        struct hid_item *h;\r
-\r
-        for  ( h = joy->pJoystick.os->hids; h; h = h->next )\r
-        {\r
-            int d = hid_get_data ( joy->pJoystick.os->hid_data_buf, h );\r
-\r
-            int page = HID_PAGE ( h->usage );\r
-            int usage = HID_USAGE ( h->usage );\r
-\r
-            if ( page == HUP_GENERIC_DESKTOP )\r
-            {\r
-                int i;\r
-                for ( i = 0; i < joy->num_axes; i++ )\r
-                    if (joy->pJoystick.os->axes_usage[i] == usage)\r
-                    {\r
-                        if (usage == HUG_HAT_SWITCH)\r
-                        {\r
-                            if (d < 0 || d > 8)\r
-                                d = 0;  /* safety */\r
-                            joy->pJoystick.os->cache_axes[i] = (float)hatmap_x[d];\r
-                            joy->pJoystick.os->cache_axes[i + 1] = (float)hatmap_y[d];\r
-                        }\r
-                        else\r
-                        {\r
-                            joy->pJoystick.os->cache_axes[i] = (float)d;\r
-                        }\r
-                        break;\r
-                    }\r
-            }\r
-            else if (page == HUP_BUTTON)\r
-            {\r
-               if (usage > 0 && usage < _JS_MAX_BUTTONS + 1)\r
-               {\r
-                   if (d)\r
-                       joy->pJoystick.os->cache_buttons |=  (1 << ( usage - 1 ));\r
-                   else\r
-                       joy->pJoystick.os->cache_buttons &= ~(1 << ( usage - 1 ));\r
-               }\r
-            }\r
-        }\r
-    }\r
-#    ifdef HAVE_ERRNO_H\r
-    if ( len < 0 && errno != EAGAIN )\r
-#    else\r
-    if ( len < 0 )\r
-#    endif\r
-    {\r
-        perror( joy->pJoystick.os->fname );\r
-        joy->error = 1;\r
-    }\r
-    if ( buttons != NULL ) *buttons = joy->pJoystick.os->cache_buttons;\r
-    if ( axes    != NULL )\r
-        memcpy ( axes, joy->pJoystick.os->cache_axes, sizeof(float) * joy->num_axes );\r
-#  endif\r
-#endif\r
-\r
-#ifdef JS_NEW\r
-\r
-    while ( 1 )\r
-    {\r
-        status = read ( joy->pJoystick.fd, &joy->pJoystick.js, sizeof(struct js_event) );\r
-\r
-        if ( status != sizeof( struct js_event ) )\r
-        {\r
-#  ifdef HAVE_ERRNO_H\r
-            if ( errno == EAGAIN )\r
-            {\r
-                /* Use the old values */\r
-                if ( buttons )\r
-                    *buttons = joy->pJoystick.tmp_buttons;\r
-                if ( axes )\r
-                    memcpy( axes, joy->pJoystick.tmp_axes,\r
-                            sizeof( float ) * joy->num_axes );\r
-                return;\r
-            }\r
-#  endif\r
-\r
-            fgWarning ( "%s", joy->pJoystick.fname );\r
-            joy->error = GL_TRUE;\r
-            return;\r
-        }\r
-\r
-        switch ( joy->pJoystick.js.type & ~JS_EVENT_INIT )\r
-        {\r
-        case JS_EVENT_BUTTON:\r
-            if( joy->pJoystick.js.value == 0 ) /* clear the flag */\r
-                joy->pJoystick.tmp_buttons &= ~( 1 << joy->pJoystick.js.number );\r
-            else\r
-                joy->pJoystick.tmp_buttons |= ( 1 << joy->pJoystick.js.number );\r
-            break;\r
-\r
-        case JS_EVENT_AXIS:\r
-            if ( joy->pJoystick.js.number < joy->num_axes )\r
-            {\r
-                joy->pJoystick.tmp_axes[ joy->pJoystick.js.number ] = ( float )joy->pJoystick.js.value;\r
-\r
-                if( axes )\r
-                    memcpy( axes, joy->pJoystick.tmp_axes, sizeof(float) * joy->num_axes );\r
-            }\r
-            break;\r
-\r
-        default:\r
-            fgWarning ( "PLIB_JS: Unrecognised /dev/js return!?!" );\r
-\r
-            /* use the old values */\r
-\r
-            if ( buttons != NULL ) *buttons = joy->pJoystick.tmp_buttons;\r
-            if ( axes    != NULL )\r
-                memcpy ( axes, joy->pJoystick.tmp_axes, sizeof(float) * joy->num_axes );\r
-\r
-            return;\r
-        }\r
-\r
-        if( buttons )\r
-            *buttons = joy->pJoystick.tmp_buttons;\r
-    }\r
-#else\r
-\r
-    status = read( joy->pJoystick.fd, &joy->pJoystick.js, JS_RETURN );\r
-\r
-    if ( status != JS_RETURN )\r
-    {\r
-        fgWarning( "%s", joy->pJoystick.fname );\r
-        joy->error = GL_TRUE;\r
-        return;\r
-    }\r
-\r
-    if ( buttons )\r
-#    if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
-        *buttons = ( joy->pJoystick.js.b1 ? 1 : 0 ) | ( joy->pJoystick.js.b2 ? 2 : 0 );  /* XXX Should not be here -- BSD is handled earlier */\r
-#    else\r
-        *buttons = joy->pJoystick.js.buttons;\r
-#    endif\r
-\r
-    if ( axes )\r
-    {\r
-        axes[ 0 ] = (float) joy->pJoystick.js.x;\r
-        axes[ 1 ] = (float) joy->pJoystick.js.y;\r
-    }\r
-#endif\r
-}\r
-\r
-\r
-void fgPlatformJoystickOpen( SFG_Joystick* joy )\r
-{\r
-#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
-       int i = 0;\r
-       char *cp;\r
-#endif\r
-#ifdef JS_NEW\r
-       unsigned char u;\r
-       int i=0;\r
-#else\r
-#  if defined( __linux__ ) || TARGET_HOST_SOLARIS\r
-       int i = 0;\r
-    int counter = 0;\r
-#  endif\r
-#endif\r
-\r
-#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
-    for( i = 0; i < _JS_MAX_AXES; i++ )\r
-        joy->pJoystick.os->cache_axes[ i ] = 0.0f;\r
-\r
-    joy->pJoystick.os->cache_buttons = 0;\r
-\r
-    joy->pJoystick.os->fd = open( joy->pJoystick.os->fname, O_RDONLY | O_NONBLOCK);\r
-\r
-#ifdef HAVE_ERRNO_H\r
-    if( joy->pJoystick.os->fd < 0 && errno == EACCES )\r
-        fgWarning ( "%s exists but is not readable by you", joy->pJoystick.os->fname );\r
-#endif\r
-\r
-    joy->error =( joy->pJoystick.os->fd < 0 );\r
-\r
-    if( joy->error )\r
-        return;\r
-\r
-    joy->num_axes = 0;\r
-    joy->num_buttons = 0;\r
-    if( joy->pJoystick.os->is_analog )\r
-    {\r
-        FILE *joyfile;\r
-        char joyfname[ 1024 ];\r
-        int noargs, in_no_axes;\r
-\r
-        float axes [ _JS_MAX_AXES ];\r
-        int buttons[ _JS_MAX_AXES ];\r
-\r
-        joy->num_axes    =  2;\r
-        joy->num_buttons = 32;\r
-\r
-        fghJoystickRawRead( joy, buttons, axes );\r
-        joy->error = axes[ 0 ] < -1000000000.0f;\r
-        if( joy->error )\r
-            return;\r
-\r
-        snprintf( joyfname, sizeof(joyfname), "%s/.joy%drc", getenv( "HOME" ), joy->id );\r
-\r
-        joyfile = fopen( joyfname, "r" );\r
-        joy->error =( joyfile == NULL );\r
-        if( joy->error )\r
-            return;\r
-\r
-        noargs = fscanf( joyfile, "%d%f%f%f%f%f%f", &in_no_axes,\r
-                         &joy->min[ 0 ], &joy->center[ 0 ], &joy->max[ 0 ],\r
-                         &joy->min[ 1 ], &joy->center[ 1 ], &joy->max[ 1 ] );\r
-        joy->error = noargs != 7 || in_no_axes != _JS_MAX_AXES;\r
-        fclose( joyfile );\r
-        if( joy->error )\r
-            return;\r
-\r
-        for( i = 0; i < _JS_MAX_AXES; i++ )\r
-        {\r
-            joy->dead_band[ i ] = 0.0f;\r
-            joy->saturate [ i ] = 1.0f;\r
-        }\r
-\r
-        return;    /* End of analog code */\r
-    }\r
-\r
-#    ifdef HAVE_USB_JS\r
-    if( ! fghJoystickInitializeHID( joy->pJoystick.os, &joy->num_axes,\r
-                                    &joy->num_buttons ) )\r
-    {\r
-        close( joy->pJoystick.os->fd );\r
-        joy->error = GL_TRUE;\r
-        return;\r
-    }\r
-\r
-    cp = strrchr( joy->pJoystick.os->fname, '/' );\r
-    if( cp )\r
-    {\r
-        if( fghJoystickFindUSBdev( &cp[1], joy->name, sizeof( joy->name ) ) ==\r
-            0 )\r
-            strcpy( joy->name, &cp[1] );\r
-    }\r
-\r
-    if( joy->num_axes > _JS_MAX_AXES )\r
-        joy->num_axes = _JS_MAX_AXES;\r
-\r
-    for( i = 0; i < _JS_MAX_AXES; i++ )\r
-    {\r
-        /* We really should get this from the HID, but that data seems\r
-         * to be quite unreliable for analog-to-USB converters. Punt for\r
-         * now.\r
-         */\r
-        if( joy->pJoystick.os->axes_usage[ i ] == HUG_HAT_SWITCH )\r
-        {\r
-            joy->max   [ i ] = 1.0f;\r
-            joy->center[ i ] = 0.0f;\r
-            joy->min   [ i ] = -1.0f;\r
-        }\r
-        else\r
-        {\r
-            joy->max   [ i ] = 255.0f;\r
-            joy->center[ i ] = 127.0f;\r
-            joy->min   [ i ] = 0.0f;\r
-        }\r
-\r
-        joy->dead_band[ i ] = 0.0f;\r
-        joy->saturate[ i ] = 1.0f;\r
-    }\r
-#    endif\r
-#endif\r
-\r
-#if defined( __linux__ ) || TARGET_HOST_SOLARIS\r
-    /* Default for older Linux systems. */\r
-    joy->num_axes    =  2;\r
-    joy->num_buttons = 32;\r
-\r
-#    ifdef JS_NEW\r
-    for( i = 0; i < _JS_MAX_AXES; i++ )\r
-        joy->pJoystick.tmp_axes[ i ] = 0.0f;\r
-\r
-    joy->pJoystick.tmp_buttons = 0;\r
-#    endif\r
-\r
-    joy->pJoystick.fd = open( joy->pJoystick.fname, O_RDONLY );\r
-\r
-    joy->error =( joy->pJoystick.fd < 0 );\r
-\r
-    if( joy->error )\r
-        return;\r
-\r
-    /* Set the correct number of axes for the linux driver */\r
-#    ifdef JS_NEW\r
-    /* Melchior Franz's fixes for big-endian Linuxes since writing\r
-     *  to the upper byte of an uninitialized word doesn't work.\r
-     *  9 April 2003\r
-     */\r
-    ioctl( joy->pJoystick.fd, JSIOCGAXES, &u );\r
-    joy->num_axes = u;\r
-    ioctl( joy->pJoystick.fd, JSIOCGBUTTONS, &u );\r
-    joy->num_buttons = u;\r
-    ioctl( joy->pJoystick.fd, JSIOCGNAME( sizeof( joy->name ) ), joy->name );\r
-    fcntl( joy->pJoystick.fd, F_SETFL, O_NONBLOCK );\r
-#    endif\r
-\r
-    /*\r
-     * The Linux driver seems to return 512 for all axes\r
-     * when no stick is present - but there is a chance\r
-     * that could happen by accident - so it's gotta happen\r
-     * on both axes for at least 100 attempts.\r
-     *\r
-     * PWO: shouldn't be that done somehow wiser on the kernel level?\r
-     */\r
-#    ifndef JS_NEW\r
-    counter = 0;\r
-\r
-    do\r
-    {\r
-        fghJoystickRawRead( joy, NULL, joy->center );\r
-        counter++;\r
-    } while( !joy->error &&\r
-             counter < 100 &&\r
-             joy->center[ 0 ] == 512.0f &&\r
-             joy->center[ 1 ] == 512.0f );\r
-\r
-    if ( counter >= 100 )\r
-        joy->error = GL_TRUE;\r
-#    endif\r
-\r
-    for( i = 0; i < _JS_MAX_AXES; i++ )\r
-    {\r
-#    ifdef JS_NEW\r
-        joy->max   [ i ] =  32767.0f;\r
-        joy->center[ i ] =      0.0f;\r
-        joy->min   [ i ] = -32767.0f;\r
-#    else\r
-        joy->max[ i ] = joy->center[ i ] * 2.0f;\r
-        joy->min[ i ] = 0.0f;\r
-#    endif\r
-        joy->dead_band[ i ] = 0.0f;\r
-        joy->saturate [ i ] = 1.0f;\r
-    }\r
-#endif\r
-}\r
-\r
-\r
-void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )\r
-{\r
-#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
-    fgJoystick[ ident ]->id = ident;\r
-    fgJoystick[ ident ]->error = GL_FALSE;\r
-\r
-    fgJoystick[ ident ]->pJoystick.os = calloc( 1, sizeof( struct os_specific_s ) );\r
-    memset( fgJoystick[ ident ]->pJoystick.os, 0, sizeof( struct os_specific_s ) );\r
-    if( ident < USB_IDENT_OFFSET )\r
-        fgJoystick[ ident ]->pJoystick.os->is_analog = 1;\r
-    if( fgJoystick[ ident ]->pJoystick.os->is_analog )\r
-        snprintf( fgJoystick[ ident ]->pJoystick.os->fname, sizeof(fgJoystick[ ident ]->pJoystick.os->fname), "%s%d", AJSDEV, ident );\r
-    else\r
-        snprintf( fgJoystick[ ident ]->pJoystick.os->fname, sizeof(fgJoystick[ ident ]->pJoystick.os->fname), "%s%d", UHIDDEV,\r
-                 ident - USB_IDENT_OFFSET );\r
-#elif defined( __linux__ )\r
-    fgJoystick[ ident ]->id = ident;\r
-    fgJoystick[ ident ]->error = GL_FALSE;\r
-\r
-    snprintf( fgJoystick[ident]->pJoystick.fname, sizeof(fgJoystick[ident]->pJoystick.fname), "/dev/input/js%d", ident );\r
-\r
-    if( access( fgJoystick[ ident ]->pJoystick.fname, F_OK ) != 0 )\r
-        snprintf( fgJoystick[ ident ]->pJoystick.fname, sizeof(fgJoystick[ ident ]->pJoystick.fname), "/dev/js%d", ident );\r
-#endif\r
-}\r
-\r
-\r
-void fgPlatformJoystickClose ( int ident )\r
-{\r
-#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
-    if( fgJoystick[ident]->pJoystick.os )\r
-    {\r
-        if( ! fgJoystick[ ident ]->error )\r
-            close( fgJoystick[ ident ]->pJoystick.os->fd );\r
-#ifdef HAVE_USB_JS\r
-        if( fgJoystick[ ident ]->pJoystick.os->hids )\r
-            free (fgJoystick[ ident ]->pJoystick.os->hids);\r
-        if( fgJoystick[ ident ]->pJoystick.os->hid_data_buf )\r
-            free( fgJoystick[ ident ]->pJoystick.os->hid_data_buf );\r
-#endif\r
-        free( fgJoystick[ident]->pJoystick.os );\r
-       }\r
-#endif\r
-\r
-    if( ! fgJoystick[ident]->error )\r
-         close( fgJoystick[ ident ]->pJoystick.fd );\r
-}\r
-\r
+/*
+ * freeglut_joystick_x11.c
+ *
+ * Joystick handling code
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Steve Baker, <sjbaker1@airmail.net>
+ * Copied for Platform code by Evan Felix <karcaw at gmail.com>
+ * Creation date: Thur Feb 2 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * FreeBSD port by Stephen Montgomery-Smith <stephen@math.missouri.edu>
+ *
+ * Redone by John Fay 2/4/04 with another look from the PLIB "js" library.
+ *  Many thanks for Steve Baker for permission to pull from that library.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+#ifdef HAVE_SYS_PARAM_H
+#    include <sys/param.h>
+#endif
+
+
+/*this should be defined in a header file */
+#define MAX_NUM_JOYSTICKS  2   
+extern SFG_Joystick *fgJoystick [ MAX_NUM_JOYSTICKS ];
+
+void fgPlatformJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes )
+{
+    int status;
+
+    int i;
+
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
+    int len;
+
+    if ( joy->pJoystick.os->is_analog )
+    {
+        int status = read ( joy->pJoystick.os->fd, &joy->pJoystick.os->ajs, sizeof(joy->pJoystick.os->ajs) );
+        if ( status != sizeof(joy->pJoystick.os->ajs) ) {
+            perror ( joy->pJoystick.os->fname );
+            joy->error = GL_TRUE;
+            return;
+        }
+        if ( buttons != NULL )
+            *buttons = ( joy->pJoystick.os->ajs.b1 ? 1 : 0 ) | ( joy->pJoystick.os->ajs.b2 ? 2 : 0 );
+
+        if ( axes != NULL )
+        {
+            axes[0] = (float) joy->pJoystick.os->ajs.x;
+            axes[1] = (float) joy->pJoystick.os->ajs.y;
+        }
+
+        return;
+    }
+
+#  ifdef HAVE_USB_JS
+    while ( ( len = read ( joy->pJoystick.os->fd, joy->pJoystick.os->hid_data_buf, joy->pJoystick.os->hid_dlen ) ) == joy->pJoystick.os->hid_dlen )
+    {
+        struct hid_item *h;
+
+        for  ( h = joy->pJoystick.os->hids; h; h = h->next )
+        {
+            int d = hid_get_data ( joy->pJoystick.os->hid_data_buf, h );
+
+            int page = HID_PAGE ( h->usage );
+            int usage = HID_USAGE ( h->usage );
+
+            if ( page == HUP_GENERIC_DESKTOP )
+            {
+                int i;
+                for ( i = 0; i < joy->num_axes; i++ )
+                    if (joy->pJoystick.os->axes_usage[i] == usage)
+                    {
+                        if (usage == HUG_HAT_SWITCH)
+                        {
+                            if (d < 0 || d > 8)
+                                d = 0;  /* safety */
+                            joy->pJoystick.os->cache_axes[i] = (float)hatmap_x[d];
+                            joy->pJoystick.os->cache_axes[i + 1] = (float)hatmap_y[d];
+                        }
+                        else
+                        {
+                            joy->pJoystick.os->cache_axes[i] = (float)d;
+                        }
+                        break;
+                    }
+            }
+            else if (page == HUP_BUTTON)
+            {
+               if (usage > 0 && usage < _JS_MAX_BUTTONS + 1)
+               {
+                   if (d)
+                       joy->pJoystick.os->cache_buttons |=  (1 << ( usage - 1 ));
+                   else
+                       joy->pJoystick.os->cache_buttons &= ~(1 << ( usage - 1 ));
+               }
+            }
+        }
+    }
+#    ifdef HAVE_ERRNO_H
+    if ( len < 0 && errno != EAGAIN )
+#    else
+    if ( len < 0 )
+#    endif
+    {
+        perror( joy->pJoystick.os->fname );
+        joy->error = 1;
+    }
+    if ( buttons != NULL ) *buttons = joy->pJoystick.os->cache_buttons;
+    if ( axes    != NULL )
+        memcpy ( axes, joy->pJoystick.os->cache_axes, sizeof(float) * joy->num_axes );
+#  endif
+#endif
+
+#ifdef JS_NEW
+
+    while ( 1 )
+    {
+        status = read ( joy->pJoystick.fd, &joy->pJoystick.js, sizeof(struct js_event) );
+
+        if ( status != sizeof( struct js_event ) )
+        {
+#  ifdef HAVE_ERRNO_H
+            if ( errno == EAGAIN )
+            {
+                /* Use the old values */
+                if ( buttons )
+                    *buttons = joy->pJoystick.tmp_buttons;
+                if ( axes )
+                    memcpy( axes, joy->pJoystick.tmp_axes,
+                            sizeof( float ) * joy->num_axes );
+                return;
+            }
+#  endif
+
+            fgWarning ( "%s", joy->pJoystick.fname );
+            joy->error = GL_TRUE;
+            return;
+        }
+
+        switch ( joy->pJoystick.js.type & ~JS_EVENT_INIT )
+        {
+        case JS_EVENT_BUTTON:
+            if( joy->pJoystick.js.value == 0 ) /* clear the flag */
+                joy->pJoystick.tmp_buttons &= ~( 1 << joy->pJoystick.js.number );
+            else
+                joy->pJoystick.tmp_buttons |= ( 1 << joy->pJoystick.js.number );
+            break;
+
+        case JS_EVENT_AXIS:
+            if ( joy->pJoystick.js.number < joy->num_axes )
+            {
+                joy->pJoystick.tmp_axes[ joy->pJoystick.js.number ] = ( float )joy->pJoystick.js.value;
+
+                if( axes )
+                    memcpy( axes, joy->pJoystick.tmp_axes, sizeof(float) * joy->num_axes );
+            }
+            break;
+
+        default:
+            fgWarning ( "PLIB_JS: Unrecognised /dev/js return!?!" );
+
+            /* use the old values */
+
+            if ( buttons != NULL ) *buttons = joy->pJoystick.tmp_buttons;
+            if ( axes    != NULL )
+                memcpy ( axes, joy->pJoystick.tmp_axes, sizeof(float) * joy->num_axes );
+
+            return;
+        }
+
+        if( buttons )
+            *buttons = joy->pJoystick.tmp_buttons;
+    }
+#else
+
+    status = read( joy->pJoystick.fd, &joy->pJoystick.js, JS_RETURN );
+
+    if ( status != JS_RETURN )
+    {
+        fgWarning( "%s", joy->pJoystick.fname );
+        joy->error = GL_TRUE;
+        return;
+    }
+
+    if ( buttons )
+#    if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )
+        *buttons = ( joy->pJoystick.js.b1 ? 1 : 0 ) | ( joy->pJoystick.js.b2 ? 2 : 0 );  /* XXX Should not be here -- BSD is handled earlier */
+#    else
+        *buttons = joy->pJoystick.js.buttons;
+#    endif
+
+    if ( axes )
+    {
+        axes[ 0 ] = (float) joy->pJoystick.js.x;
+        axes[ 1 ] = (float) joy->pJoystick.js.y;
+    }
+#endif
+}
+
+
+void fgPlatformJoystickOpen( SFG_Joystick* joy )
+{
+#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )
+       int i = 0;
+       char *cp;
+#endif
+#ifdef JS_NEW
+       unsigned char u;
+       int i=0;
+#else
+#  if defined( __linux__ ) || TARGET_HOST_SOLARIS
+       int i = 0;
+    int counter = 0;
+#  endif
+#endif
+
+#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )
+    for( i = 0; i < _JS_MAX_AXES; i++ )
+        joy->pJoystick.os->cache_axes[ i ] = 0.0f;
+
+    joy->pJoystick.os->cache_buttons = 0;
+
+    joy->pJoystick.os->fd = open( joy->pJoystick.os->fname, O_RDONLY | O_NONBLOCK);
+
+#ifdef HAVE_ERRNO_H
+    if( joy->pJoystick.os->fd < 0 && errno == EACCES )
+        fgWarning ( "%s exists but is not readable by you", joy->pJoystick.os->fname );
+#endif
+
+    joy->error =( joy->pJoystick.os->fd < 0 );
+
+    if( joy->error )
+        return;
+
+    joy->num_axes = 0;
+    joy->num_buttons = 0;
+    if( joy->pJoystick.os->is_analog )
+    {
+        FILE *joyfile;
+        char joyfname[ 1024 ];
+        int noargs, in_no_axes;
+
+        float axes [ _JS_MAX_AXES ];
+        int buttons[ _JS_MAX_AXES ];
+
+        joy->num_axes    =  2;
+        joy->num_buttons = 32;
+
+        fghJoystickRawRead( joy, buttons, axes );
+        joy->error = axes[ 0 ] < -1000000000.0f;
+        if( joy->error )
+            return;
+
+        snprintf( joyfname, sizeof(joyfname), "%s/.joy%drc", getenv( "HOME" ), joy->id );
+
+        joyfile = fopen( joyfname, "r" );
+        joy->error =( joyfile == NULL );
+        if( joy->error )
+            return;
+
+        noargs = fscanf( joyfile, "%d%f%f%f%f%f%f", &in_no_axes,
+                         &joy->min[ 0 ], &joy->center[ 0 ], &joy->max[ 0 ],
+                         &joy->min[ 1 ], &joy->center[ 1 ], &joy->max[ 1 ] );
+        joy->error = noargs != 7 || in_no_axes != _JS_MAX_AXES;
+        fclose( joyfile );
+        if( joy->error )
+            return;
+
+        for( i = 0; i < _JS_MAX_AXES; i++ )
+        {
+            joy->dead_band[ i ] = 0.0f;
+            joy->saturate [ i ] = 1.0f;
+        }
+
+        return;    /* End of analog code */
+    }
+
+#    ifdef HAVE_USB_JS
+    if( ! fghJoystickInitializeHID( joy->pJoystick.os, &joy->num_axes,
+                                    &joy->num_buttons ) )
+    {
+        close( joy->pJoystick.os->fd );
+        joy->error = GL_TRUE;
+        return;
+    }
+
+    cp = strrchr( joy->pJoystick.os->fname, '/' );
+    if( cp )
+    {
+        if( fghJoystickFindUSBdev( &cp[1], joy->name, sizeof( joy->name ) ) ==
+            0 )
+            strcpy( joy->name, &cp[1] );
+    }
+
+    if( joy->num_axes > _JS_MAX_AXES )
+        joy->num_axes = _JS_MAX_AXES;
+
+    for( i = 0; i < _JS_MAX_AXES; i++ )
+    {
+        /* We really should get this from the HID, but that data seems
+         * to be quite unreliable for analog-to-USB converters. Punt for
+         * now.
+         */
+        if( joy->pJoystick.os->axes_usage[ i ] == HUG_HAT_SWITCH )
+        {
+            joy->max   [ i ] = 1.0f;
+            joy->center[ i ] = 0.0f;
+            joy->min   [ i ] = -1.0f;
+        }
+        else
+        {
+            joy->max   [ i ] = 255.0f;
+            joy->center[ i ] = 127.0f;
+            joy->min   [ i ] = 0.0f;
+        }
+
+        joy->dead_band[ i ] = 0.0f;
+        joy->saturate[ i ] = 1.0f;
+    }
+#    endif
+#endif
+
+#if defined( __linux__ ) || TARGET_HOST_SOLARIS
+    /* Default for older Linux systems. */
+    joy->num_axes    =  2;
+    joy->num_buttons = 32;
+
+#    ifdef JS_NEW
+    for( i = 0; i < _JS_MAX_AXES; i++ )
+        joy->pJoystick.tmp_axes[ i ] = 0.0f;
+
+    joy->pJoystick.tmp_buttons = 0;
+#    endif
+
+    joy->pJoystick.fd = open( joy->pJoystick.fname, O_RDONLY );
+
+    joy->error =( joy->pJoystick.fd < 0 );
+
+    if( joy->error )
+        return;
+
+    /* Set the correct number of axes for the linux driver */
+#    ifdef JS_NEW
+    /* Melchior Franz's fixes for big-endian Linuxes since writing
+     *  to the upper byte of an uninitialized word doesn't work.
+     *  9 April 2003
+     */
+    ioctl( joy->pJoystick.fd, JSIOCGAXES, &u );
+    joy->num_axes = u;
+    ioctl( joy->pJoystick.fd, JSIOCGBUTTONS, &u );
+    joy->num_buttons = u;
+    ioctl( joy->pJoystick.fd, JSIOCGNAME( sizeof( joy->name ) ), joy->name );
+    fcntl( joy->pJoystick.fd, F_SETFL, O_NONBLOCK );
+#    endif
+
+    /*
+     * The Linux driver seems to return 512 for all axes
+     * when no stick is present - but there is a chance
+     * that could happen by accident - so it's gotta happen
+     * on both axes for at least 100 attempts.
+     *
+     * PWO: shouldn't be that done somehow wiser on the kernel level?
+     */
+#    ifndef JS_NEW
+    counter = 0;
+
+    do
+    {
+        fghJoystickRawRead( joy, NULL, joy->center );
+        counter++;
+    } while( !joy->error &&
+             counter < 100 &&
+             joy->center[ 0 ] == 512.0f &&
+             joy->center[ 1 ] == 512.0f );
+
+    if ( counter >= 100 )
+        joy->error = GL_TRUE;
+#    endif
+
+    for( i = 0; i < _JS_MAX_AXES; i++ )
+    {
+#    ifdef JS_NEW
+        joy->max   [ i ] =  32767.0f;
+        joy->center[ i ] =      0.0f;
+        joy->min   [ i ] = -32767.0f;
+#    else
+        joy->max[ i ] = joy->center[ i ] * 2.0f;
+        joy->min[ i ] = 0.0f;
+#    endif
+        joy->dead_band[ i ] = 0.0f;
+        joy->saturate [ i ] = 1.0f;
+    }
+#endif
+}
+
+
+void fgPlatformJoystickInit( SFG_Joystick *fgJoystick[], int ident )
+{
+#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )
+    fgJoystick[ ident ]->id = ident;
+    fgJoystick[ ident ]->error = GL_FALSE;
+
+    fgJoystick[ ident ]->pJoystick.os = calloc( 1, sizeof( struct os_specific_s ) );
+    memset( fgJoystick[ ident ]->pJoystick.os, 0, sizeof( struct os_specific_s ) );
+    if( ident < USB_IDENT_OFFSET )
+        fgJoystick[ ident ]->pJoystick.os->is_analog = 1;
+    if( fgJoystick[ ident ]->pJoystick.os->is_analog )
+        snprintf( fgJoystick[ ident ]->pJoystick.os->fname, sizeof(fgJoystick[ ident ]->pJoystick.os->fname), "%s%d", AJSDEV, ident );
+    else
+        snprintf( fgJoystick[ ident ]->pJoystick.os->fname, sizeof(fgJoystick[ ident ]->pJoystick.os->fname), "%s%d", UHIDDEV,
+                 ident - USB_IDENT_OFFSET );
+#elif defined( __linux__ )
+    fgJoystick[ ident ]->id = ident;
+    fgJoystick[ ident ]->error = GL_FALSE;
+
+    snprintf( fgJoystick[ident]->pJoystick.fname, sizeof(fgJoystick[ident]->pJoystick.fname), "/dev/input/js%d", ident );
+
+    if( access( fgJoystick[ ident ]->pJoystick.fname, F_OK ) != 0 )
+        snprintf( fgJoystick[ ident ]->pJoystick.fname, sizeof(fgJoystick[ ident ]->pJoystick.fname), "/dev/js%d", ident );
+#endif
+}
+
+
+void fgPlatformJoystickClose ( int ident )
+{
+#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )
+    if( fgJoystick[ident]->pJoystick.os )
+    {
+        if( ! fgJoystick[ ident ]->error )
+            close( fgJoystick[ ident ]->pJoystick.os->fd );
+#ifdef HAVE_USB_JS
+        if( fgJoystick[ ident ]->pJoystick.os->hids )
+            free (fgJoystick[ ident ]->pJoystick.os->hids);
+        if( fgJoystick[ ident ]->pJoystick.os->hid_data_buf )
+            free( fgJoystick[ ident ]->pJoystick.os->hid_data_buf );
+#endif
+        free( fgJoystick[ident]->pJoystick.os );
+       }
+#endif
+
+    if( ! fgJoystick[ident]->error )
+         close( fgJoystick[ ident ]->pJoystick.fd );
+}
+
index 94a3cbd..eeb1288 100644 (file)
-/*\r
- * freeglut_main_x11.c\r
- *\r
- * The X11-specific windows message processing methods.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Copied for Platform code by Evan Felix <karcaw at gmail.com>\r
- * Creation date: Thur Feb 2 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-#ifdef HAVE_ERRNO_H\r
-#    include <errno.h>\r
-#endif\r
-#include <stdarg.h>\r
-#ifdef  HAVE_VFPRINTF\r
-#    define VFPRINTF(s,f,a) vfprintf((s),(f),(a))\r
-#elif defined(HAVE__DOPRNT)\r
-#    define VFPRINTF(s,f,a) _doprnt((f),(a),(s))\r
-#else\r
-#    define VFPRINTF(s,f,a)\r
-#endif\r
-\r
-/*\r
- * Try to get the maximum value allowed for ints, falling back to the minimum\r
- * guaranteed by ISO C99 if there is no suitable header.\r
- */\r
-#ifdef HAVE_LIMITS_H\r
-#    include <limits.h>\r
-#endif\r
-#ifndef INT_MAX\r
-#    define INT_MAX 32767\r
-#endif\r
-\r
-#ifndef MIN\r
-#    define MIN(a,b) (((a)<(b)) ? (a) : (b))\r
-#endif\r
-\r
-/*\r
- * TODO BEFORE THE STABLE RELEASE:\r
- *\r
- * There are some issues concerning window redrawing under X11, and maybe\r
- * some events are not handled. The Win32 version lacks some more features,\r
- * but seems acceptable for not demanding purposes.\r
- *\r
- * Need to investigate why the X11 version breaks out with an error when\r
- * closing a window (using the window manager, not glutDestroyWindow)...\r
- */\r
\r
\r
-/*\r
- * Handle a window configuration change. When no reshape\r
- * callback is hooked, the viewport size is updated to\r
- * match the new window size.\r
- */\r
-void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height )\r
-{\r
-    XResizeWindow( fgDisplay.pDisplay.Display, window->Window.Handle,\r
-                   width, height );\r
-    XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */\r
-}\r
-\r
-\r
-/*\r
- * A static helper function to execute display callback for a window\r
- */\r
-void fgPlatformDisplayWindow ( SFG_Window *window )\r
-{\r
-        fghRedrawWindow ( window ) ;\r
-}\r
-\r
-\r
-unsigned long fgPlatformSystemTime ( void )\r
-{\r
-#if TARGET_HOST_SOLARIS || HAVE_GETTIMEOFDAY\r
-    struct timeval now;\r
-    gettimeofday( &now, NULL );\r
-    return now.tv_usec/1000 + now.tv_sec*1000;\r
-#endif\r
-}\r
-\r
-/*\r
- * Does the magic required to relinquish the CPU until something interesting\r
- * happens.\r
- */\r
-\r
-void fgPlatformSleepForEvents( long msec )\r
-{\r
-    /*\r
-     * Possibly due to aggressive use of XFlush() and friends,\r
-     * it is possible to have our socket drained but still have\r
-     * unprocessed events.  (Or, this may just be normal with\r
-     * X, anyway?)  We do non-trivial processing of X events\r
-     * after the event-reading loop, in any case, so we\r
-     * need to allow that we may have an empty socket but non-\r
-     * empty event queue.\r
-     */\r
-    if( ! XPending( fgDisplay.pDisplay.Display ) )\r
-    {\r
-        fd_set fdset;\r
-        int err;\r
-        int socket;\r
-        struct timeval wait;\r
-\r
-        socket = ConnectionNumber( fgDisplay.pDisplay.Display );\r
-        FD_ZERO( &fdset );\r
-        FD_SET( socket, &fdset );\r
-        wait.tv_sec = msec / 1000;\r
-        wait.tv_usec = (msec % 1000) * 1000;\r
-        err = select( socket+1, &fdset, NULL, NULL, &wait );\r
-\r
-#ifdef HAVE_ERRNO_H\r
-        if( ( -1 == err ) && ( errno != EINTR ) )\r
-            fgWarning ( "freeglut select() error: %d", errno );\r
-#endif\r
-    }\r
-}\r
-\r
-\r
-/*\r
- * Returns GLUT modifier mask for the state field of an X11 event.\r
- */\r
-int fgPlatformGetModifiers( int state )\r
-{\r
-    int ret = 0;\r
-\r
-    if( state & ( ShiftMask | LockMask ) )\r
-        ret |= GLUT_ACTIVE_SHIFT;\r
-    if( state & ControlMask )\r
-        ret |= GLUT_ACTIVE_CTRL;\r
-    if( state & Mod1Mask )\r
-        ret |= GLUT_ACTIVE_ALT;\r
-\r
-    return ret;\r
-}\r
-\r
-static const char* fghTypeToString( int type )\r
-{\r
-    switch( type ) {\r
-    case KeyPress: return "KeyPress";\r
-    case KeyRelease: return "KeyRelease";\r
-    case ButtonPress: return "ButtonPress";\r
-    case ButtonRelease: return "ButtonRelease";\r
-    case MotionNotify: return "MotionNotify";\r
-    case EnterNotify: return "EnterNotify";\r
-    case LeaveNotify: return "LeaveNotify";\r
-    case FocusIn: return "FocusIn";\r
-    case FocusOut: return "FocusOut";\r
-    case KeymapNotify: return "KeymapNotify";\r
-    case Expose: return "Expose";\r
-    case GraphicsExpose: return "GraphicsExpose";\r
-    case NoExpose: return "NoExpose";\r
-    case VisibilityNotify: return "VisibilityNotify";\r
-    case CreateNotify: return "CreateNotify";\r
-    case DestroyNotify: return "DestroyNotify";\r
-    case UnmapNotify: return "UnmapNotify";\r
-    case MapNotify: return "MapNotify";\r
-    case MapRequest: return "MapRequest";\r
-    case ReparentNotify: return "ReparentNotify";\r
-    case ConfigureNotify: return "ConfigureNotify";\r
-    case ConfigureRequest: return "ConfigureRequest";\r
-    case GravityNotify: return "GravityNotify";\r
-    case ResizeRequest: return "ResizeRequest";\r
-    case CirculateNotify: return "CirculateNotify";\r
-    case CirculateRequest: return "CirculateRequest";\r
-    case PropertyNotify: return "PropertyNotify";\r
-    case SelectionClear: return "SelectionClear";\r
-    case SelectionRequest: return "SelectionRequest";\r
-    case SelectionNotify: return "SelectionNotify";\r
-    case ColormapNotify: return "ColormapNotify";\r
-    case ClientMessage: return "ClientMessage";\r
-    case MappingNotify: return "MappingNotify";\r
-    default: return "UNKNOWN";\r
-    }\r
-}\r
-\r
-static const char* fghBoolToString( Bool b )\r
-{\r
-    return b == False ? "False" : "True";\r
-}\r
-\r
-static const char* fghNotifyHintToString( char is_hint )\r
-{\r
-    switch( is_hint ) {\r
-    case NotifyNormal: return "NotifyNormal";\r
-    case NotifyHint: return "NotifyHint";\r
-    default: return "UNKNOWN";\r
-    }\r
-}\r
-\r
-static const char* fghNotifyModeToString( int mode )\r
-{\r
-    switch( mode ) {\r
-    case NotifyNormal: return "NotifyNormal";\r
-    case NotifyGrab: return "NotifyGrab";\r
-    case NotifyUngrab: return "NotifyUngrab";\r
-    case NotifyWhileGrabbed: return "NotifyWhileGrabbed";\r
-    default: return "UNKNOWN";\r
-    }\r
-}\r
-\r
-static const char* fghNotifyDetailToString( int detail )\r
-{\r
-    switch( detail ) {\r
-    case NotifyAncestor: return "NotifyAncestor";\r
-    case NotifyVirtual: return "NotifyVirtual";\r
-    case NotifyInferior: return "NotifyInferior";\r
-    case NotifyNonlinear: return "NotifyNonlinear";\r
-    case NotifyNonlinearVirtual: return "NotifyNonlinearVirtual";\r
-    case NotifyPointer: return "NotifyPointer";\r
-    case NotifyPointerRoot: return "NotifyPointerRoot";\r
-    case NotifyDetailNone: return "NotifyDetailNone";\r
-    default: return "UNKNOWN";\r
-    }\r
-}\r
-\r
-static const char* fghVisibilityToString( int state ) {\r
-    switch( state ) {\r
-    case VisibilityUnobscured: return "VisibilityUnobscured";\r
-    case VisibilityPartiallyObscured: return "VisibilityPartiallyObscured";\r
-    case VisibilityFullyObscured: return "VisibilityFullyObscured";\r
-    default: return "UNKNOWN";\r
-    }\r
-}\r
-\r
-static const char* fghConfigureDetailToString( int detail )\r
-{\r
-    switch( detail ) {\r
-    case Above: return "Above";\r
-    case Below: return "Below";\r
-    case TopIf: return "TopIf";\r
-    case BottomIf: return "BottomIf";\r
-    case Opposite: return "Opposite";\r
-    default: return "UNKNOWN";\r
-    }\r
-}\r
-\r
-static const char* fghPlaceToString( int place )\r
-{\r
-    switch( place ) {\r
-    case PlaceOnTop: return "PlaceOnTop";\r
-    case PlaceOnBottom: return "PlaceOnBottom";\r
-    default: return "UNKNOWN";\r
-    }\r
-}\r
-\r
-static const char* fghMappingRequestToString( int request )\r
-{\r
-    switch( request ) {\r
-    case MappingModifier: return "MappingModifier";\r
-    case MappingKeyboard: return "MappingKeyboard";\r
-    case MappingPointer: return "MappingPointer";\r
-    default: return "UNKNOWN";\r
-    }\r
-}\r
-\r
-static const char* fghPropertyStateToString( int state )\r
-{\r
-    switch( state ) {\r
-    case PropertyNewValue: return "PropertyNewValue";\r
-    case PropertyDelete: return "PropertyDelete";\r
-    default: return "UNKNOWN";\r
-    }\r
-}\r
-\r
-static const char* fghColormapStateToString( int state )\r
-{\r
-    switch( state ) {\r
-    case ColormapUninstalled: return "ColormapUninstalled";\r
-    case ColormapInstalled: return "ColormapInstalled";\r
-    default: return "UNKNOWN";\r
-    }\r
-}\r
-\r
-static void fghPrintEvent( XEvent *event )\r
-{\r
-    switch( event->type ) {\r
-\r
-    case KeyPress:\r
-    case KeyRelease: {\r
-        XKeyEvent *e = &event->xkey;\r
-        fgWarning( "%s: window=0x%x, root=0x%x, subwindow=0x%x, time=%lu, "\r
-                   "(x,y)=(%d,%d), (x_root,y_root)=(%d,%d), state=0x%x, "\r
-                   "keycode=%u, same_screen=%s", fghTypeToString( e->type ),\r
-                   e->window, e->root, e->subwindow, (unsigned long)e->time,\r
-                   e->x, e->y, e->x_root, e->y_root, e->state, e->keycode,\r
-                   fghBoolToString( e->same_screen ) );\r
-        break;\r
-    }\r
-\r
-    case ButtonPress:\r
-    case ButtonRelease: {\r
-        XButtonEvent *e = &event->xbutton;\r
-        fgWarning( "%s: window=0x%x, root=0x%x, subwindow=0x%x, time=%lu, "\r
-                   "(x,y)=(%d,%d), (x_root,y_root)=(%d,%d), state=0x%x, "\r
-                   "button=%u, same_screen=%d", fghTypeToString( e->type ),\r
-                   e->window, e->root, e->subwindow, (unsigned long)e->time,\r
-                   e->x, e->y, e->x_root, e->y_root, e->state, e->button,\r
-                   fghBoolToString( e->same_screen ) );\r
-        break;\r
-    }\r
-\r
-    case MotionNotify: {\r
-        XMotionEvent *e = &event->xmotion;\r
-        fgWarning( "%s: window=0x%x, root=0x%x, subwindow=0x%x, time=%lu, "\r
-                   "(x,y)=(%d,%d), (x_root,y_root)=(%d,%d), state=0x%x, "\r
-                   "is_hint=%s, same_screen=%d", fghTypeToString( e->type ),\r
-                   e->window, e->root, e->subwindow, (unsigned long)e->time,\r
-                   e->x, e->y, e->x_root, e->y_root, e->state,\r
-                   fghNotifyHintToString( e->is_hint ),\r
-                   fghBoolToString( e->same_screen ) );\r
-        break;\r
-    }\r
-\r
-    case EnterNotify:\r
-    case LeaveNotify: {\r
-        XCrossingEvent *e = &event->xcrossing;\r
-        fgWarning( "%s: window=0x%x, root=0x%x, subwindow=0x%x, time=%lu, "\r
-                   "(x,y)=(%d,%d), mode=%s, detail=%s, same_screen=%d, "\r
-                   "focus=%d, state=0x%x", fghTypeToString( e->type ),\r
-                   e->window, e->root, e->subwindow, (unsigned long)e->time,\r
-                   e->x, e->y, fghNotifyModeToString( e->mode ),\r
-                   fghNotifyDetailToString( e->detail ), (int)e->same_screen,\r
-                   (int)e->focus, e->state );\r
-        break;\r
-    }\r
-\r
-    case FocusIn:\r
-    case FocusOut: {\r
-        XFocusChangeEvent *e = &event->xfocus;\r
-        fgWarning( "%s: window=0x%x, mode=%s, detail=%s",\r
-                   fghTypeToString( e->type ), e->window,\r
-                   fghNotifyModeToString( e->mode ),\r
-                   fghNotifyDetailToString( e->detail ) );\r
-        break;\r
-    }\r
-\r
-    case KeymapNotify: {\r
-        XKeymapEvent *e = &event->xkeymap;\r
-        char buf[32 * 2 + 1];\r
-        int i;\r
-        for ( i = 0; i < 32; i++ ) {\r
-            snprintf( &buf[ i * 2 ], sizeof( buf ) - i * 2,\r
-                      "%02x", e->key_vector[ i ] );\r
-        }\r
-        buf[ i ] = '\0';\r
-        fgWarning( "%s: window=0x%x, %s", fghTypeToString( e->type ), e->window,\r
-                   buf );\r
-        break;\r
-    }\r
-\r
-    case Expose: {\r
-        XExposeEvent *e = &event->xexpose;\r
-        fgWarning( "%s: window=0x%x, (x,y)=(%d,%d), (width,height)=(%d,%d), "\r
-                   "count=%d", fghTypeToString( e->type ), e->window, e->x,\r
-                   e->y, e->width, e->height, e->count );\r
-        break;\r
-    }\r
-\r
-    case GraphicsExpose: {\r
-        XGraphicsExposeEvent *e = &event->xgraphicsexpose;\r
-        fgWarning( "%s: drawable=0x%x, (x,y)=(%d,%d), (width,height)=(%d,%d), "\r
-                   "count=%d, (major_code,minor_code)=(%d,%d)",\r
-                   fghTypeToString( e->type ), e->drawable, e->x, e->y,\r
-                   e->width, e->height, e->count, e->major_code,\r
-                   e->minor_code );\r
-        break;\r
-    }\r
-\r
-    case NoExpose: {\r
-        XNoExposeEvent *e = &event->xnoexpose;\r
-        fgWarning( "%s: drawable=0x%x, (major_code,minor_code)=(%d,%d)",\r
-                   fghTypeToString( e->type ), e->drawable, e->major_code,\r
-                   e->minor_code );\r
-        break;\r
-    }\r
-\r
-    case VisibilityNotify: {\r
-        XVisibilityEvent *e = &event->xvisibility;\r
-        fgWarning( "%s: window=0x%x, state=%s", fghTypeToString( e->type ),\r
-                   e->window, fghVisibilityToString( e->state) );\r
-        break;\r
-    }\r
-\r
-    case CreateNotify: {\r
-        XCreateWindowEvent *e = &event->xcreatewindow;\r
-        fgWarning( "%s: (x,y)=(%d,%d), (width,height)=(%d,%d), border_width=%d, "\r
-                   "window=0x%x, override_redirect=%s",\r
-                   fghTypeToString( e->type ), e->x, e->y, e->width, e->height,\r
-                   e->border_width, e->window,\r
-                   fghBoolToString( e->override_redirect ) );\r
-        break;\r
-    }\r
-\r
-    case DestroyNotify: {\r
-        XDestroyWindowEvent *e = &event->xdestroywindow;\r
-        fgWarning( "%s: event=0x%x, window=0x%x",\r
-                   fghTypeToString( e->type ), e->event, e->window );\r
-        break;\r
-    }\r
-\r
-    case UnmapNotify: {\r
-        XUnmapEvent *e = &event->xunmap;\r
-        fgWarning( "%s: event=0x%x, window=0x%x, from_configure=%s",\r
-                   fghTypeToString( e->type ), e->event, e->window,\r
-                   fghBoolToString( e->from_configure ) );\r
-        break;\r
-    }\r
-\r
-    case MapNotify: {\r
-        XMapEvent *e = &event->xmap;\r
-        fgWarning( "%s: event=0x%x, window=0x%x, override_redirect=%s",\r
-                   fghTypeToString( e->type ), e->event, e->window,\r
-                   fghBoolToString( e->override_redirect ) );\r
-        break;\r
-    }\r
-\r
-    case MapRequest: {\r
-        XMapRequestEvent *e = &event->xmaprequest;\r
-        fgWarning( "%s: parent=0x%x, window=0x%x",\r
-                   fghTypeToString( event->type ), e->parent, e->window );\r
-        break;\r
-    }\r
-\r
-    case ReparentNotify: {\r
-        XReparentEvent *e = &event->xreparent;\r
-        fgWarning( "%s: event=0x%x, window=0x%x, parent=0x%x, (x,y)=(%d,%d), "\r
-                   "override_redirect=%s", fghTypeToString( e->type ),\r
-                   e->event, e->window, e->parent, e->x, e->y,\r
-                   fghBoolToString( e->override_redirect ) );\r
-        break;\r
-    }\r
-\r
-    case ConfigureNotify: {\r
-        XConfigureEvent *e = &event->xconfigure;\r
-        fgWarning( "%s: event=0x%x, window=0x%x, (x,y)=(%d,%d), "\r
-                   "(width,height)=(%d,%d), border_width=%d, above=0x%x, "\r
-                   "override_redirect=%s", fghTypeToString( e->type ), e->event,\r
-                   e->window, e->x, e->y, e->width, e->height, e->border_width,\r
-                   e->above, fghBoolToString( e->override_redirect ) );\r
-        break;\r
-    }\r
-\r
-    case ConfigureRequest: {\r
-        XConfigureRequestEvent *e = &event->xconfigurerequest;\r
-        fgWarning( "%s: parent=0x%x, window=0x%x, (x,y)=(%d,%d), "\r
-                   "(width,height)=(%d,%d), border_width=%d, above=0x%x, "\r
-                   "detail=%s, value_mask=%lx", fghTypeToString( e->type ),\r
-                   e->parent, e->window, e->x, e->y, e->width, e->height,\r
-                   e->border_width, e->above,\r
-                   fghConfigureDetailToString( e->detail ), e->value_mask );\r
-        break;\r
-    }\r
-\r
-    case GravityNotify: {\r
-        XGravityEvent *e = &event->xgravity;\r
-        fgWarning( "%s: event=0x%x, window=0x%x, (x,y)=(%d,%d)",\r
-                   fghTypeToString( e->type ), e->event, e->window, e->x, e->y );\r
-        break;\r
-    }\r
-\r
-    case ResizeRequest: {\r
-        XResizeRequestEvent *e = &event->xresizerequest;\r
-        fgWarning( "%s: window=0x%x, (width,height)=(%d,%d)",\r
-                   fghTypeToString( e->type ), e->window, e->width, e->height );\r
-        break;\r
-    }\r
-\r
-    case CirculateNotify: {\r
-        XCirculateEvent *e = &event->xcirculate;\r
-        fgWarning( "%s: event=0x%x, window=0x%x, place=%s",\r
-                   fghTypeToString( e->type ), e->event, e->window,\r
-                   fghPlaceToString( e->place ) );\r
-        break;\r
-    }\r
-\r
-    case CirculateRequest: {\r
-        XCirculateRequestEvent *e = &event->xcirculaterequest;\r
-        fgWarning( "%s: parent=0x%x, window=0x%x, place=%s",\r
-                   fghTypeToString( e->type ), e->parent, e->window,\r
-                   fghPlaceToString( e->place ) );\r
-        break;\r
-    }\r
-\r
-    case PropertyNotify: {\r
-        XPropertyEvent *e = &event->xproperty;\r
-        fgWarning( "%s: window=0x%x, atom=%lu, time=%lu, state=%s",\r
-                   fghTypeToString( e->type ), e->window,\r
-                   (unsigned long)e->atom, (unsigned long)e->time,\r
-                   fghPropertyStateToString( e->state ) );\r
-        break;\r
-    }\r
-\r
-    case SelectionClear: {\r
-        XSelectionClearEvent *e = &event->xselectionclear;\r
-        fgWarning( "%s: window=0x%x, selection=%lu, time=%lu",\r
-                   fghTypeToString( e->type ), e->window,\r
-                   (unsigned long)e->selection, (unsigned long)e->time );\r
-        break;\r
-    }\r
-\r
-    case SelectionRequest: {\r
-        XSelectionRequestEvent *e = &event->xselectionrequest;\r
-        fgWarning( "%s: owner=0x%x, requestor=0x%x, selection=0x%x, "\r
-                   "target=0x%x, property=%lu, time=%lu",\r
-                   fghTypeToString( e->type ), e->owner, e->requestor,\r
-                   (unsigned long)e->selection, (unsigned long)e->target,\r
-                   (unsigned long)e->property, (unsigned long)e->time );\r
-        break;\r
-    }\r
-\r
-    case SelectionNotify: {\r
-        XSelectionEvent *e = &event->xselection;\r
-        fgWarning( "%s: requestor=0x%x, selection=0x%x, target=0x%x, "\r
-                   "property=%lu, time=%lu", fghTypeToString( e->type ),\r
-                   e->requestor, (unsigned long)e->selection,\r
-                   (unsigned long)e->target, (unsigned long)e->property,\r
-                   (unsigned long)e->time );\r
-        break;\r
-    }\r
-\r
-    case ColormapNotify: {\r
-        XColormapEvent *e = &event->xcolormap;\r
-        fgWarning( "%s: window=0x%x, colormap=%lu, new=%s, state=%s",\r
-                   fghTypeToString( e->type ), e->window,\r
-                   (unsigned long)e->colormap, fghBoolToString( e->new ),\r
-                   fghColormapStateToString( e->state ) );\r
-        break;\r
-    }\r
-\r
-    case ClientMessage: {\r
-        XClientMessageEvent *e = &event->xclient;\r
-        char buf[ 61 ];\r
-        char* p = buf;\r
-        char* end = buf + sizeof( buf );\r
-        int i;\r
-        switch( e->format ) {\r
-        case 8:\r
-          for ( i = 0; i < 20; i++, p += 3 ) {\r
-                snprintf( p, end - p, " %02x", e->data.b[ i ] );\r
-            }\r
-            break;\r
-        case 16:\r
-            for ( i = 0; i < 10; i++, p += 5 ) {\r
-                snprintf( p, end - p, " %04x", e->data.s[ i ] );\r
-            }\r
-            break;\r
-        case 32:\r
-            for ( i = 0; i < 5; i++, p += 9 ) {\r
-                snprintf( p, end - p, " %08lx", e->data.l[ i ] );\r
-            }\r
-            break;\r
-        }\r
-        *p = '\0';\r
-        fgWarning( "%s: window=0x%x, message_type=%lu, format=%d, data=(%s )",\r
-                   fghTypeToString( e->type ), e->window,\r
-                   (unsigned long)e->message_type, e->format, buf );\r
-        break;\r
-    }\r
-\r
-    case MappingNotify: {\r
-        XMappingEvent *e = &event->xmapping;\r
-        fgWarning( "%s: window=0x%x, request=%s, first_keycode=%d, count=%d",\r
-                   fghTypeToString( e->type ), e->window,\r
-                   fghMappingRequestToString( e->request ), e->first_keycode,\r
-                   e->count );\r
-        break;\r
-    }\r
-\r
-    default: {\r
-        fgWarning( "%s", fghTypeToString( event->type ) );\r
-        break;\r
-    }\r
-    }\r
-}\r
-\r
-\r
-void fgPlatformProcessSingleEvent ( void )\r
-{\r
-    SFG_Window* window;\r
-    XEvent event;\r
-\r
-    /* This code was repeated constantly, so here it goes into a definition: */\r
-#define GETWINDOW(a)                             \\r
-    window = fgWindowByHandle( event.a.window ); \\r
-    if( window == NULL )                         \\r
-        break;\r
-\r
-#define GETMOUSE(a)                              \\r
-    window->State.MouseX = event.a.x;            \\r
-    window->State.MouseY = event.a.y;\r
-\r
-    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMainLoopEvent" );\r
-\r
-    while( XPending( fgDisplay.pDisplay.Display ) )\r
-    {\r
-        XNextEvent( fgDisplay.pDisplay.Display, &event );\r
-#if _DEBUG\r
-        fghPrintEvent( &event );\r
-#endif\r
-\r
-        switch( event.type )\r
-        {\r
-        case ClientMessage:\r
-            if(fgIsSpaceballXEvent(&event)) {\r
-                fgSpaceballHandleXEvent(&event);\r
-                break;\r
-            }\r
-            /* Destroy the window when the WM_DELETE_WINDOW message arrives */\r
-            if( (Atom) event.xclient.data.l[ 0 ] == fgDisplay.pDisplay.DeleteWindow )\r
-            {\r
-                GETWINDOW( xclient );\r
-\r
-                fgDestroyWindow ( window );\r
-\r
-                if( fgState.ActionOnWindowClose == GLUT_ACTION_EXIT )\r
-                {\r
-                    fgDeinitialize( );\r
-                    exit( 0 );\r
-                }\r
-                else if( fgState.ActionOnWindowClose == GLUT_ACTION_GLUTMAINLOOP_RETURNS )\r
-                    fgState.ExecState = GLUT_EXEC_STATE_STOP;\r
-\r
-                return;\r
-            }\r
-            break;\r
-\r
-            /*\r
-             * CreateNotify causes a configure-event so that sub-windows are\r
-             * handled compatibly with GLUT.  Otherwise, your sub-windows\r
-             * (in freeglut only) will not get an initial reshape event,\r
-             * which can break things.\r
-             *\r
-             * GLUT presumably does this because it generally tries to treat\r
-             * sub-windows the same as windows.\r
-             */\r
-        case CreateNotify:\r
-        case ConfigureNotify:\r
-            {\r
-                int width, height;\r
-                if( event.type == CreateNotify ) {\r
-                    GETWINDOW( xcreatewindow );\r
-                    width = event.xcreatewindow.width;\r
-                    height = event.xcreatewindow.height;\r
-                } else {\r
-                    GETWINDOW( xconfigure );\r
-                    width = event.xconfigure.width;\r
-                    height = event.xconfigure.height;\r
-                }\r
-\r
-                if( ( width != window->State.pWState.OldWidth ) ||\r
-                    ( height != window->State.pWState.OldHeight ) )\r
-                {\r
-                    SFG_Window *current_window = fgStructure.CurrentWindow;\r
-\r
-                    window->State.pWState.OldWidth = width;\r
-                    window->State.pWState.OldHeight = height;\r
-                    if( FETCH_WCB( *window, Reshape ) )\r
-                        INVOKE_WCB( *window, Reshape, ( width, height ) );\r
-                    else\r
-                    {\r
-                        fgSetWindow( window );\r
-                        glViewport( 0, 0, width, height );\r
-                    }\r
-                    glutPostRedisplay( );\r
-                    if( window->IsMenu )\r
-                        fgSetWindow( current_window );\r
-                }\r
-            }\r
-            break;\r
-\r
-        case DestroyNotify:\r
-            /*\r
-             * This is sent to confirm the XDestroyWindow call.\r
-             *\r
-             * XXX WHY is this commented out?  Should we re-enable it?\r
-             */\r
-            /* fgAddToWindowDestroyList ( window ); */\r
-            break;\r
-\r
-        case Expose:\r
-            /*\r
-             * We are too dumb to process partial exposes...\r
-             *\r
-             * XXX Well, we could do it.  However, it seems to only\r
-             * XXX be potentially useful for single-buffered (since\r
-             * XXX double-buffered does not respect viewport when we\r
-             * XXX do a buffer-swap).\r
-             *\r
-             */\r
-            if( event.xexpose.count == 0 )\r
-            {\r
-                GETWINDOW( xexpose );\r
-                window->State.Redisplay = GL_TRUE;\r
-            }\r
-            break;\r
-\r
-        case MapNotify:\r
-            break;\r
-\r
-        case UnmapNotify:\r
-            /* We get this when iconifying a window. */ \r
-            GETWINDOW( xunmap );\r
-            INVOKE_WCB( *window, WindowStatus, ( GLUT_HIDDEN ) );\r
-            window->State.Visible = GL_FALSE;\r
-            break;\r
-\r
-        case MappingNotify:\r
-            /*\r
-             * Have the client's keyboard knowledge updated (xlib.ps,\r
-             * page 206, says that's a good thing to do)\r
-             */\r
-            XRefreshKeyboardMapping( (XMappingEvent *) &event );\r
-            break;\r
-\r
-        case VisibilityNotify:\r
-        {\r
-            /*\r
-             * Sending this event, the X server can notify us that the window\r
-             * has just acquired one of the three possible visibility states:\r
-             * VisibilityUnobscured, VisibilityPartiallyObscured or\r
-             * VisibilityFullyObscured. Note that we DO NOT receive a\r
-             * VisibilityNotify event when iconifying a window, we only get an\r
-             * UnmapNotify then.\r
-             */\r
-            GETWINDOW( xvisibility );\r
-            switch( event.xvisibility.state )\r
-            {\r
-            case VisibilityUnobscured:\r
-                INVOKE_WCB( *window, WindowStatus, ( GLUT_FULLY_RETAINED ) );\r
-                window->State.Visible = GL_TRUE;\r
-                break;\r
-\r
-            case VisibilityPartiallyObscured:\r
-                INVOKE_WCB( *window, WindowStatus,\r
-                            ( GLUT_PARTIALLY_RETAINED ) );\r
-                window->State.Visible = GL_TRUE;\r
-                break;\r
-\r
-            case VisibilityFullyObscured:\r
-                INVOKE_WCB( *window, WindowStatus, ( GLUT_FULLY_COVERED ) );\r
-                window->State.Visible = GL_FALSE;\r
-                break;\r
-\r
-            default:\r
-                fgWarning( "Unknown X visibility state: %d",\r
-                           event.xvisibility.state );\r
-                break;\r
-            }\r
-        }\r
-        break;\r
-\r
-        case EnterNotify:\r
-        case LeaveNotify:\r
-            GETWINDOW( xcrossing );\r
-            GETMOUSE( xcrossing );\r
-            if( ( event.type == LeaveNotify ) && window->IsMenu &&\r
-                window->ActiveMenu && window->ActiveMenu->IsActive )\r
-                fgUpdateMenuHighlight( window->ActiveMenu );\r
-\r
-            INVOKE_WCB( *window, Entry, ( ( EnterNotify == event.type ) ?\r
-                                          GLUT_ENTERED :\r
-                                          GLUT_LEFT ) );\r
-            break;\r
-\r
-        case MotionNotify:\r
-        {\r
-            GETWINDOW( xmotion );\r
-            GETMOUSE( xmotion );\r
-\r
-            if( window->ActiveMenu )\r
-            {\r
-                if( window == window->ActiveMenu->ParentWindow )\r
-                {\r
-                    window->ActiveMenu->Window->State.MouseX =\r
-                        event.xmotion.x_root - window->ActiveMenu->X;\r
-                    window->ActiveMenu->Window->State.MouseY =\r
-                        event.xmotion.y_root - window->ActiveMenu->Y;\r
-                }\r
-\r
-                fgUpdateMenuHighlight( window->ActiveMenu );\r
-\r
-                break;\r
-            }\r
-\r
-            /*\r
-             * XXX For more than 5 buttons, just check {event.xmotion.state},\r
-             * XXX rather than a host of bit-masks?  Or maybe we need to\r
-             * XXX track ButtonPress/ButtonRelease events in our own\r
-             * XXX bit-mask?\r
-             */\r
-            fgState.Modifiers = fgPlatformGetModifiers( event.xmotion.state );\r
-            if ( event.xmotion.state & ( Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask ) ) {\r
-                INVOKE_WCB( *window, Motion, ( event.xmotion.x,\r
-                                               event.xmotion.y ) );\r
-            } else {\r
-                INVOKE_WCB( *window, Passive, ( event.xmotion.x,\r
-                                                event.xmotion.y ) );\r
-            }\r
-            fgState.Modifiers = INVALID_MODIFIERS;\r
-        }\r
-        break;\r
-\r
-        case ButtonRelease:\r
-        case ButtonPress:\r
-        {\r
-            GLboolean pressed = GL_TRUE;\r
-            int button;\r
-\r
-            if( event.type == ButtonRelease )\r
-                pressed = GL_FALSE ;\r
-\r
-            /*\r
-             * A mouse button has been pressed or released. Traditionally,\r
-             * break if the window was found within the freeglut structures.\r
-             */\r
-            GETWINDOW( xbutton );\r
-            GETMOUSE( xbutton );\r
-\r
-            /*\r
-             * An X button (at least in XFree86) is numbered from 1.\r
-             * A GLUT button is numbered from 0.\r
-             * Old GLUT passed through buttons other than just the first\r
-             * three, though it only gave symbolic names and official\r
-             * support to the first three.\r
-             */\r
-            button = event.xbutton.button - 1;\r
-\r
-            /*\r
-             * Do not execute the application's mouse callback if a menu\r
-             * is hooked to this button.  In that case an appropriate\r
-             * private call should be generated.\r
-             */\r
-            if( fgCheckActiveMenu( window, button, pressed,\r
-                                   event.xbutton.x_root, event.xbutton.y_root ) )\r
-                break;\r
-\r
-            /*\r
-             * Check if there is a mouse or mouse wheel callback hooked to the\r
-             * window\r
-             */\r
-            if( ! FETCH_WCB( *window, Mouse ) &&\r
-                ! FETCH_WCB( *window, MouseWheel ) )\r
-                break;\r
-\r
-            fgState.Modifiers = fgPlatformGetModifiers( event.xbutton.state );\r
-\r
-            /* Finally execute the mouse or mouse wheel callback */\r
-            if( ( button < glutDeviceGet ( GLUT_NUM_MOUSE_BUTTONS ) ) || ( ! FETCH_WCB( *window, MouseWheel ) ) )\r
-                INVOKE_WCB( *window, Mouse, ( button,\r
-                                              pressed ? GLUT_DOWN : GLUT_UP,\r
-                                              event.xbutton.x,\r
-                                              event.xbutton.y )\r
-                );\r
-            else\r
-            {\r
-                /*\r
-                 * Map 4 and 5 to wheel zero; EVEN to +1, ODD to -1\r
-                 *  "  6 and 7 "    "   one; ...\r
-                 *\r
-                 * XXX This *should* be behind some variables/macros,\r
-                 * XXX since the order and numbering isn't certain\r
-                 * XXX See XFree86 configuration docs (even back in the\r
-                 * XXX 3.x days, and especially with 4.x).\r
-                 *\r
-                 * XXX Note that {button} has already been decremented\r
-                 * XXX in mapping from X button numbering to GLUT.\r
-                                *\r
-                                * XXX Should add support for partial wheel turns as Windows does -- 5/27/11\r
-                 */\r
-                int wheel_number = (button - glutDeviceGet ( GLUT_NUM_MOUSE_BUTTONS )) / 2;\r
-                int direction = -1;\r
-                if( button % 2 )\r
-                    direction = 1;\r
-\r
-                if( pressed )\r
-                    INVOKE_WCB( *window, MouseWheel, ( wheel_number,\r
-                                                       direction,\r
-                                                       event.xbutton.x,\r
-                                                       event.xbutton.y )\r
-                    );\r
-            }\r
-            fgState.Modifiers = INVALID_MODIFIERS;\r
-        }\r
-        break;\r
-\r
-        case KeyRelease:\r
-        case KeyPress:\r
-        {\r
-            FGCBKeyboard keyboard_cb;\r
-            FGCBSpecial special_cb;\r
-\r
-            GETWINDOW( xkey );\r
-            GETMOUSE( xkey );\r
-\r
-            /* Detect auto repeated keys, if configured globally or per-window */\r
-\r
-            if ( fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE )\r
-            {\r
-                if (event.type==KeyRelease)\r
-                {\r
-                    /*\r
-                     * Look at X11 keystate to detect repeat mode.\r
-                     * While X11 says the key is actually held down, we'll ignore KeyRelease/KeyPress pairs.\r
-                     */\r
-\r
-                    char keys[32];\r
-                    XQueryKeymap( fgDisplay.pDisplay.Display, keys ); /* Look at X11 keystate to detect repeat mode */\r
-\r
-                    if ( event.xkey.keycode<256 )            /* XQueryKeymap is limited to 256 keycodes    */\r
-                    {\r
-                        if ( keys[event.xkey.keycode>>3] & (1<<(event.xkey.keycode%8)) )\r
-                            window->State.KeyRepeating = GL_TRUE;\r
-                        else\r
-                            window->State.KeyRepeating = GL_FALSE;\r
-                    }\r
-                }\r
-            }\r
-            else\r
-                window->State.KeyRepeating = GL_FALSE;\r
-\r
-            /* Cease processing this event if it is auto repeated */\r
-\r
-            if (window->State.KeyRepeating)\r
-            {\r
-                if (event.type == KeyPress) window->State.KeyRepeating = GL_FALSE;\r
-                break;\r
-            }\r
-\r
-            if( event.type == KeyPress )\r
-            {\r
-                keyboard_cb = (FGCBKeyboard)( FETCH_WCB( *window, Keyboard ));\r
-                special_cb  = (FGCBSpecial) ( FETCH_WCB( *window, Special  ));\r
-            }\r
-            else\r
-            {\r
-                keyboard_cb = (FGCBKeyboard)( FETCH_WCB( *window, KeyboardUp ));\r
-                special_cb  = (FGCBSpecial) ( FETCH_WCB( *window, SpecialUp  ));\r
-            }\r
-\r
-            /* Is there a keyboard/special callback hooked for this window? */\r
-            if( keyboard_cb || special_cb )\r
-            {\r
-                XComposeStatus composeStatus;\r
-                char asciiCode[ 32 ];\r
-                KeySym keySym;\r
-                int len;\r
-\r
-                /* Check for the ASCII/KeySym codes associated with the event: */\r
-                len = XLookupString( &event.xkey, asciiCode, sizeof(asciiCode),\r
-                                     &keySym, &composeStatus\r
-                );\r
-\r
-                /* GLUT API tells us to have two separate callbacks... */\r
-                if( len > 0 )\r
-                {\r
-                    /* ...one for the ASCII translateable keypresses... */\r
-                    if( keyboard_cb )\r
-                    {\r
-                        fgSetWindow( window );\r
-                        fgState.Modifiers = fgPlatformGetModifiers( event.xkey.state );\r
-                        keyboard_cb( asciiCode[ 0 ],\r
-                                     event.xkey.x, event.xkey.y\r
-                        );\r
-                        fgState.Modifiers = INVALID_MODIFIERS;\r
-                    }\r
-                }\r
-                else\r
-                {\r
-                    int special = -1;\r
-\r
-                    /*\r
-                     * ...and one for all the others, which need to be\r
-                     * translated to GLUT_KEY_Xs...\r
-                     */\r
-                    switch( keySym )\r
-                    {\r
-                    case XK_F1:     special = GLUT_KEY_F1;     break;\r
-                    case XK_F2:     special = GLUT_KEY_F2;     break;\r
-                    case XK_F3:     special = GLUT_KEY_F3;     break;\r
-                    case XK_F4:     special = GLUT_KEY_F4;     break;\r
-                    case XK_F5:     special = GLUT_KEY_F5;     break;\r
-                    case XK_F6:     special = GLUT_KEY_F6;     break;\r
-                    case XK_F7:     special = GLUT_KEY_F7;     break;\r
-                    case XK_F8:     special = GLUT_KEY_F8;     break;\r
-                    case XK_F9:     special = GLUT_KEY_F9;     break;\r
-                    case XK_F10:    special = GLUT_KEY_F10;    break;\r
-                    case XK_F11:    special = GLUT_KEY_F11;    break;\r
-                    case XK_F12:    special = GLUT_KEY_F12;    break;\r
-\r
-                    case XK_KP_Left:\r
-                    case XK_Left:   special = GLUT_KEY_LEFT;   break;\r
-                    case XK_KP_Right:\r
-                    case XK_Right:  special = GLUT_KEY_RIGHT;  break;\r
-                    case XK_KP_Up:\r
-                    case XK_Up:     special = GLUT_KEY_UP;     break;\r
-                    case XK_KP_Down:\r
-                    case XK_Down:   special = GLUT_KEY_DOWN;   break;\r
-\r
-                    case XK_KP_Prior:\r
-                    case XK_Prior:  special = GLUT_KEY_PAGE_UP; break;\r
-                    case XK_KP_Next:\r
-                    case XK_Next:   special = GLUT_KEY_PAGE_DOWN; break;\r
-                    case XK_KP_Home:\r
-                    case XK_Home:   special = GLUT_KEY_HOME;   break;\r
-                    case XK_KP_End:\r
-                    case XK_End:    special = GLUT_KEY_END;    break;\r
-                    case XK_KP_Insert:\r
-                    case XK_Insert: special = GLUT_KEY_INSERT; break;\r
-\r
-                    case XK_Num_Lock :  special = GLUT_KEY_NUM_LOCK;  break;\r
-                    case XK_KP_Begin :  special = GLUT_KEY_BEGIN;     break;\r
-                    case XK_KP_Delete:  special = GLUT_KEY_DELETE;    break;\r
-\r
-                    case XK_Shift_L:   special = GLUT_KEY_SHIFT_L;    break;\r
-                    case XK_Shift_R:   special = GLUT_KEY_SHIFT_R;    break;\r
-                    case XK_Control_L: special = GLUT_KEY_CTRL_L;     break;\r
-                    case XK_Control_R: special = GLUT_KEY_CTRL_R;     break;\r
-                    case XK_Alt_L:     special = GLUT_KEY_ALT_L;      break;\r
-                    case XK_Alt_R:     special = GLUT_KEY_ALT_R;      break;\r
-                    }\r
-\r
-                    /*\r
-                     * Execute the callback (if one has been specified),\r
-                     * given that the special code seems to be valid...\r
-                     */\r
-                    if( special_cb && (special != -1) )\r
-                    {\r
-                        fgSetWindow( window );\r
-                        fgState.Modifiers = fgPlatformGetModifiers( event.xkey.state );\r
-                        special_cb( special, event.xkey.x, event.xkey.y );\r
-                        fgState.Modifiers = INVALID_MODIFIERS;\r
-                    }\r
-                }\r
-            }\r
-        }\r
-        break;\r
-\r
-        case ReparentNotify:\r
-            break; /* XXX Should disable this event */\r
-\r
-        /* Not handled */\r
-        case GravityNotify:\r
-            break;\r
-\r
-        default:\r
-            /* enter handling of Extension Events here */\r
-            #ifdef HAVE_X11_EXTENSIONS_XINPUT2_H\r
-                fgHandleExtensionEvents( &event );\r
-            #endif\r
-            break;\r
-        }\r
-    }\r
-}\r
-\r
-\r
-void fgPlatformMainLoopPreliminaryWork ( void )\r
-{\r
-}\r
-\r
+/*
+ * freeglut_main_x11.c
+ *
+ * The X11-specific windows message processing methods.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Copied for Platform code by Evan Felix <karcaw at gmail.com>
+ * Creation date: Thur Feb 2 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+#ifdef HAVE_ERRNO_H
+#    include <errno.h>
+#endif
+#include <stdarg.h>
+#ifdef  HAVE_VFPRINTF
+#    define VFPRINTF(s,f,a) vfprintf((s),(f),(a))
+#elif defined(HAVE__DOPRNT)
+#    define VFPRINTF(s,f,a) _doprnt((f),(a),(s))
+#else
+#    define VFPRINTF(s,f,a)
+#endif
+
+/*
+ * Try to get the maximum value allowed for ints, falling back to the minimum
+ * guaranteed by ISO C99 if there is no suitable header.
+ */
+#ifdef HAVE_LIMITS_H
+#    include <limits.h>
+#endif
+#ifndef INT_MAX
+#    define INT_MAX 32767
+#endif
+
+#ifndef MIN
+#    define MIN(a,b) (((a)<(b)) ? (a) : (b))
+#endif
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ *
+ * There are some issues concerning window redrawing under X11, and maybe
+ * some events are not handled. The Win32 version lacks some more features,
+ * but seems acceptable for not demanding purposes.
+ *
+ * Need to investigate why the X11 version breaks out with an error when
+ * closing a window (using the window manager, not glutDestroyWindow)...
+ */
+/*
+ * Handle a window configuration change. When no reshape
+ * callback is hooked, the viewport size is updated to
+ * match the new window size.
+ */
+void fgPlatformReshapeWindow ( SFG_Window *window, int width, int height )
+{
+    XResizeWindow( fgDisplay.pDisplay.Display, window->Window.Handle,
+                   width, height );
+    XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */
+}
+
+
+/*
+ * A static helper function to execute display callback for a window
+ */
+void fgPlatformDisplayWindow ( SFG_Window *window )
+{
+        fghRedrawWindow ( window ) ;
+}
+
+
+unsigned long fgPlatformSystemTime ( void )
+{
+#if TARGET_HOST_SOLARIS || HAVE_GETTIMEOFDAY
+    struct timeval now;
+    gettimeofday( &now, NULL );
+    return now.tv_usec/1000 + now.tv_sec*1000;
+#endif
+}
+
+/*
+ * Does the magic required to relinquish the CPU until something interesting
+ * happens.
+ */
+
+void fgPlatformSleepForEvents( long msec )
+{
+    /*
+     * Possibly due to aggressive use of XFlush() and friends,
+     * it is possible to have our socket drained but still have
+     * unprocessed events.  (Or, this may just be normal with
+     * X, anyway?)  We do non-trivial processing of X events
+     * after the event-reading loop, in any case, so we
+     * need to allow that we may have an empty socket but non-
+     * empty event queue.
+     */
+    if( ! XPending( fgDisplay.pDisplay.Display ) )
+    {
+        fd_set fdset;
+        int err;
+        int socket;
+        struct timeval wait;
+
+        socket = ConnectionNumber( fgDisplay.pDisplay.Display );
+        FD_ZERO( &fdset );
+        FD_SET( socket, &fdset );
+        wait.tv_sec = msec / 1000;
+        wait.tv_usec = (msec % 1000) * 1000;
+        err = select( socket+1, &fdset, NULL, NULL, &wait );
+
+#ifdef HAVE_ERRNO_H
+        if( ( -1 == err ) && ( errno != EINTR ) )
+            fgWarning ( "freeglut select() error: %d", errno );
+#endif
+    }
+}
+
+
+/*
+ * Returns GLUT modifier mask for the state field of an X11 event.
+ */
+int fgPlatformGetModifiers( int state )
+{
+    int ret = 0;
+
+    if( state & ( ShiftMask | LockMask ) )
+        ret |= GLUT_ACTIVE_SHIFT;
+    if( state & ControlMask )
+        ret |= GLUT_ACTIVE_CTRL;
+    if( state & Mod1Mask )
+        ret |= GLUT_ACTIVE_ALT;
+
+    return ret;
+}
+
+static const char* fghTypeToString( int type )
+{
+    switch( type ) {
+    case KeyPress: return "KeyPress";
+    case KeyRelease: return "KeyRelease";
+    case ButtonPress: return "ButtonPress";
+    case ButtonRelease: return "ButtonRelease";
+    case MotionNotify: return "MotionNotify";
+    case EnterNotify: return "EnterNotify";
+    case LeaveNotify: return "LeaveNotify";
+    case FocusIn: return "FocusIn";
+    case FocusOut: return "FocusOut";
+    case KeymapNotify: return "KeymapNotify";
+    case Expose: return "Expose";
+    case GraphicsExpose: return "GraphicsExpose";
+    case NoExpose: return "NoExpose";
+    case VisibilityNotify: return "VisibilityNotify";
+    case CreateNotify: return "CreateNotify";
+    case DestroyNotify: return "DestroyNotify";
+    case UnmapNotify: return "UnmapNotify";
+    case MapNotify: return "MapNotify";
+    case MapRequest: return "MapRequest";
+    case ReparentNotify: return "ReparentNotify";
+    case ConfigureNotify: return "ConfigureNotify";
+    case ConfigureRequest: return "ConfigureRequest";
+    case GravityNotify: return "GravityNotify";
+    case ResizeRequest: return "ResizeRequest";
+    case CirculateNotify: return "CirculateNotify";
+    case CirculateRequest: return "CirculateRequest";
+    case PropertyNotify: return "PropertyNotify";
+    case SelectionClear: return "SelectionClear";
+    case SelectionRequest: return "SelectionRequest";
+    case SelectionNotify: return "SelectionNotify";
+    case ColormapNotify: return "ColormapNotify";
+    case ClientMessage: return "ClientMessage";
+    case MappingNotify: return "MappingNotify";
+    default: return "UNKNOWN";
+    }
+}
+
+static const char* fghBoolToString( Bool b )
+{
+    return b == False ? "False" : "True";
+}
+
+static const char* fghNotifyHintToString( char is_hint )
+{
+    switch( is_hint ) {
+    case NotifyNormal: return "NotifyNormal";
+    case NotifyHint: return "NotifyHint";
+    default: return "UNKNOWN";
+    }
+}
+
+static const char* fghNotifyModeToString( int mode )
+{
+    switch( mode ) {
+    case NotifyNormal: return "NotifyNormal";
+    case NotifyGrab: return "NotifyGrab";
+    case NotifyUngrab: return "NotifyUngrab";
+    case NotifyWhileGrabbed: return "NotifyWhileGrabbed";
+    default: return "UNKNOWN";
+    }
+}
+
+static const char* fghNotifyDetailToString( int detail )
+{
+    switch( detail ) {
+    case NotifyAncestor: return "NotifyAncestor";
+    case NotifyVirtual: return "NotifyVirtual";
+    case NotifyInferior: return "NotifyInferior";
+    case NotifyNonlinear: return "NotifyNonlinear";
+    case NotifyNonlinearVirtual: return "NotifyNonlinearVirtual";
+    case NotifyPointer: return "NotifyPointer";
+    case NotifyPointerRoot: return "NotifyPointerRoot";
+    case NotifyDetailNone: return "NotifyDetailNone";
+    default: return "UNKNOWN";
+    }
+}
+
+static const char* fghVisibilityToString( int state ) {
+    switch( state ) {
+    case VisibilityUnobscured: return "VisibilityUnobscured";
+    case VisibilityPartiallyObscured: return "VisibilityPartiallyObscured";
+    case VisibilityFullyObscured: return "VisibilityFullyObscured";
+    default: return "UNKNOWN";
+    }
+}
+
+static const char* fghConfigureDetailToString( int detail )
+{
+    switch( detail ) {
+    case Above: return "Above";
+    case Below: return "Below";
+    case TopIf: return "TopIf";
+    case BottomIf: return "BottomIf";
+    case Opposite: return "Opposite";
+    default: return "UNKNOWN";
+    }
+}
+
+static const char* fghPlaceToString( int place )
+{
+    switch( place ) {
+    case PlaceOnTop: return "PlaceOnTop";
+    case PlaceOnBottom: return "PlaceOnBottom";
+    default: return "UNKNOWN";
+    }
+}
+
+static const char* fghMappingRequestToString( int request )
+{
+    switch( request ) {
+    case MappingModifier: return "MappingModifier";
+    case MappingKeyboard: return "MappingKeyboard";
+    case MappingPointer: return "MappingPointer";
+    default: return "UNKNOWN";
+    }
+}
+
+static const char* fghPropertyStateToString( int state )
+{
+    switch( state ) {
+    case PropertyNewValue: return "PropertyNewValue";
+    case PropertyDelete: return "PropertyDelete";
+    default: return "UNKNOWN";
+    }
+}
+
+static const char* fghColormapStateToString( int state )
+{
+    switch( state ) {
+    case ColormapUninstalled: return "ColormapUninstalled";
+    case ColormapInstalled: return "ColormapInstalled";
+    default: return "UNKNOWN";
+    }
+}
+
+static void fghPrintEvent( XEvent *event )
+{
+    switch( event->type ) {
+
+    case KeyPress:
+    case KeyRelease: {
+        XKeyEvent *e = &event->xkey;
+        fgWarning( "%s: window=0x%x, root=0x%x, subwindow=0x%x, time=%lu, "
+                   "(x,y)=(%d,%d), (x_root,y_root)=(%d,%d), state=0x%x, "
+                   "keycode=%u, same_screen=%s", fghTypeToString( e->type ),
+                   e->window, e->root, e->subwindow, (unsigned long)e->time,
+                   e->x, e->y, e->x_root, e->y_root, e->state, e->keycode,
+                   fghBoolToString( e->same_screen ) );
+        break;
+    }
+
+    case ButtonPress:
+    case ButtonRelease: {
+        XButtonEvent *e = &event->xbutton;
+        fgWarning( "%s: window=0x%x, root=0x%x, subwindow=0x%x, time=%lu, "
+                   "(x,y)=(%d,%d), (x_root,y_root)=(%d,%d), state=0x%x, "
+                   "button=%u, same_screen=%d", fghTypeToString( e->type ),
+                   e->window, e->root, e->subwindow, (unsigned long)e->time,
+                   e->x, e->y, e->x_root, e->y_root, e->state, e->button,
+                   fghBoolToString( e->same_screen ) );
+        break;
+    }
+
+    case MotionNotify: {
+        XMotionEvent *e = &event->xmotion;
+        fgWarning( "%s: window=0x%x, root=0x%x, subwindow=0x%x, time=%lu, "
+                   "(x,y)=(%d,%d), (x_root,y_root)=(%d,%d), state=0x%x, "
+                   "is_hint=%s, same_screen=%d", fghTypeToString( e->type ),
+                   e->window, e->root, e->subwindow, (unsigned long)e->time,
+                   e->x, e->y, e->x_root, e->y_root, e->state,
+                   fghNotifyHintToString( e->is_hint ),
+                   fghBoolToString( e->same_screen ) );
+        break;
+    }
+
+    case EnterNotify:
+    case LeaveNotify: {
+        XCrossingEvent *e = &event->xcrossing;
+        fgWarning( "%s: window=0x%x, root=0x%x, subwindow=0x%x, time=%lu, "
+                   "(x,y)=(%d,%d), mode=%s, detail=%s, same_screen=%d, "
+                   "focus=%d, state=0x%x", fghTypeToString( e->type ),
+                   e->window, e->root, e->subwindow, (unsigned long)e->time,
+                   e->x, e->y, fghNotifyModeToString( e->mode ),
+                   fghNotifyDetailToString( e->detail ), (int)e->same_screen,
+                   (int)e->focus, e->state );
+        break;
+    }
+
+    case FocusIn:
+    case FocusOut: {
+        XFocusChangeEvent *e = &event->xfocus;
+        fgWarning( "%s: window=0x%x, mode=%s, detail=%s",
+                   fghTypeToString( e->type ), e->window,
+                   fghNotifyModeToString( e->mode ),
+                   fghNotifyDetailToString( e->detail ) );
+        break;
+    }
+
+    case KeymapNotify: {
+        XKeymapEvent *e = &event->xkeymap;
+        char buf[32 * 2 + 1];
+        int i;
+        for ( i = 0; i < 32; i++ ) {
+            snprintf( &buf[ i * 2 ], sizeof( buf ) - i * 2,
+                      "%02x", e->key_vector[ i ] );
+        }
+        buf[ i ] = '\0';
+        fgWarning( "%s: window=0x%x, %s", fghTypeToString( e->type ), e->window,
+                   buf );
+        break;
+    }
+
+    case Expose: {
+        XExposeEvent *e = &event->xexpose;
+        fgWarning( "%s: window=0x%x, (x,y)=(%d,%d), (width,height)=(%d,%d), "
+                   "count=%d", fghTypeToString( e->type ), e->window, e->x,
+                   e->y, e->width, e->height, e->count );
+        break;
+    }
+
+    case GraphicsExpose: {
+        XGraphicsExposeEvent *e = &event->xgraphicsexpose;
+        fgWarning( "%s: drawable=0x%x, (x,y)=(%d,%d), (width,height)=(%d,%d), "
+                   "count=%d, (major_code,minor_code)=(%d,%d)",
+                   fghTypeToString( e->type ), e->drawable, e->x, e->y,
+                   e->width, e->height, e->count, e->major_code,
+                   e->minor_code );
+        break;
+    }
+
+    case NoExpose: {
+        XNoExposeEvent *e = &event->xnoexpose;
+        fgWarning( "%s: drawable=0x%x, (major_code,minor_code)=(%d,%d)",
+                   fghTypeToString( e->type ), e->drawable, e->major_code,
+                   e->minor_code );
+        break;
+    }
+
+    case VisibilityNotify: {
+        XVisibilityEvent *e = &event->xvisibility;
+        fgWarning( "%s: window=0x%x, state=%s", fghTypeToString( e->type ),
+                   e->window, fghVisibilityToString( e->state) );
+        break;
+    }
+
+    case CreateNotify: {
+        XCreateWindowEvent *e = &event->xcreatewindow;
+        fgWarning( "%s: (x,y)=(%d,%d), (width,height)=(%d,%d), border_width=%d, "
+                   "window=0x%x, override_redirect=%s",
+                   fghTypeToString( e->type ), e->x, e->y, e->width, e->height,
+                   e->border_width, e->window,
+                   fghBoolToString( e->override_redirect ) );
+        break;
+    }
+
+    case DestroyNotify: {
+        XDestroyWindowEvent *e = &event->xdestroywindow;
+        fgWarning( "%s: event=0x%x, window=0x%x",
+                   fghTypeToString( e->type ), e->event, e->window );
+        break;
+    }
+
+    case UnmapNotify: {
+        XUnmapEvent *e = &event->xunmap;
+        fgWarning( "%s: event=0x%x, window=0x%x, from_configure=%s",
+                   fghTypeToString( e->type ), e->event, e->window,
+                   fghBoolToString( e->from_configure ) );
+        break;
+    }
+
+    case MapNotify: {
+        XMapEvent *e = &event->xmap;
+        fgWarning( "%s: event=0x%x, window=0x%x, override_redirect=%s",
+                   fghTypeToString( e->type ), e->event, e->window,
+                   fghBoolToString( e->override_redirect ) );
+        break;
+    }
+
+    case MapRequest: {
+        XMapRequestEvent *e = &event->xmaprequest;
+        fgWarning( "%s: parent=0x%x, window=0x%x",
+                   fghTypeToString( event->type ), e->parent, e->window );
+        break;
+    }
+
+    case ReparentNotify: {
+        XReparentEvent *e = &event->xreparent;
+        fgWarning( "%s: event=0x%x, window=0x%x, parent=0x%x, (x,y)=(%d,%d), "
+                   "override_redirect=%s", fghTypeToString( e->type ),
+                   e->event, e->window, e->parent, e->x, e->y,
+                   fghBoolToString( e->override_redirect ) );
+        break;
+    }
+
+    case ConfigureNotify: {
+        XConfigureEvent *e = &event->xconfigure;
+        fgWarning( "%s: event=0x%x, window=0x%x, (x,y)=(%d,%d), "
+                   "(width,height)=(%d,%d), border_width=%d, above=0x%x, "
+                   "override_redirect=%s", fghTypeToString( e->type ), e->event,
+                   e->window, e->x, e->y, e->width, e->height, e->border_width,
+                   e->above, fghBoolToString( e->override_redirect ) );
+        break;
+    }
+
+    case ConfigureRequest: {
+        XConfigureRequestEvent *e = &event->xconfigurerequest;
+        fgWarning( "%s: parent=0x%x, window=0x%x, (x,y)=(%d,%d), "
+                   "(width,height)=(%d,%d), border_width=%d, above=0x%x, "
+                   "detail=%s, value_mask=%lx", fghTypeToString( e->type ),
+                   e->parent, e->window, e->x, e->y, e->width, e->height,
+                   e->border_width, e->above,
+                   fghConfigureDetailToString( e->detail ), e->value_mask );
+        break;
+    }
+
+    case GravityNotify: {
+        XGravityEvent *e = &event->xgravity;
+        fgWarning( "%s: event=0x%x, window=0x%x, (x,y)=(%d,%d)",
+                   fghTypeToString( e->type ), e->event, e->window, e->x, e->y );
+        break;
+    }
+
+    case ResizeRequest: {
+        XResizeRequestEvent *e = &event->xresizerequest;
+        fgWarning( "%s: window=0x%x, (width,height)=(%d,%d)",
+                   fghTypeToString( e->type ), e->window, e->width, e->height );
+        break;
+    }
+
+    case CirculateNotify: {
+        XCirculateEvent *e = &event->xcirculate;
+        fgWarning( "%s: event=0x%x, window=0x%x, place=%s",
+                   fghTypeToString( e->type ), e->event, e->window,
+                   fghPlaceToString( e->place ) );
+        break;
+    }
+
+    case CirculateRequest: {
+        XCirculateRequestEvent *e = &event->xcirculaterequest;
+        fgWarning( "%s: parent=0x%x, window=0x%x, place=%s",
+                   fghTypeToString( e->type ), e->parent, e->window,
+                   fghPlaceToString( e->place ) );
+        break;
+    }
+
+    case PropertyNotify: {
+        XPropertyEvent *e = &event->xproperty;
+        fgWarning( "%s: window=0x%x, atom=%lu, time=%lu, state=%s",
+                   fghTypeToString( e->type ), e->window,
+                   (unsigned long)e->atom, (unsigned long)e->time,
+                   fghPropertyStateToString( e->state ) );
+        break;
+    }
+
+    case SelectionClear: {
+        XSelectionClearEvent *e = &event->xselectionclear;
+        fgWarning( "%s: window=0x%x, selection=%lu, time=%lu",
+                   fghTypeToString( e->type ), e->window,
+                   (unsigned long)e->selection, (unsigned long)e->time );
+        break;
+    }
+
+    case SelectionRequest: {
+        XSelectionRequestEvent *e = &event->xselectionrequest;
+        fgWarning( "%s: owner=0x%x, requestor=0x%x, selection=0x%x, "
+                   "target=0x%x, property=%lu, time=%lu",
+                   fghTypeToString( e->type ), e->owner, e->requestor,
+                   (unsigned long)e->selection, (unsigned long)e->target,
+                   (unsigned long)e->property, (unsigned long)e->time );
+        break;
+    }
+
+    case SelectionNotify: {
+        XSelectionEvent *e = &event->xselection;
+        fgWarning( "%s: requestor=0x%x, selection=0x%x, target=0x%x, "
+                   "property=%lu, time=%lu", fghTypeToString( e->type ),
+                   e->requestor, (unsigned long)e->selection,
+                   (unsigned long)e->target, (unsigned long)e->property,
+                   (unsigned long)e->time );
+        break;
+    }
+
+    case ColormapNotify: {
+        XColormapEvent *e = &event->xcolormap;
+        fgWarning( "%s: window=0x%x, colormap=%lu, new=%s, state=%s",
+                   fghTypeToString( e->type ), e->window,
+                   (unsigned long)e->colormap, fghBoolToString( e->new ),
+                   fghColormapStateToString( e->state ) );
+        break;
+    }
+
+    case ClientMessage: {
+        XClientMessageEvent *e = &event->xclient;
+        char buf[ 61 ];
+        char* p = buf;
+        char* end = buf + sizeof( buf );
+        int i;
+        switch( e->format ) {
+        case 8:
+          for ( i = 0; i < 20; i++, p += 3 ) {
+                snprintf( p, end - p, " %02x", e->data.b[ i ] );
+            }
+            break;
+        case 16:
+            for ( i = 0; i < 10; i++, p += 5 ) {
+                snprintf( p, end - p, " %04x", e->data.s[ i ] );
+            }
+            break;
+        case 32:
+            for ( i = 0; i < 5; i++, p += 9 ) {
+                snprintf( p, end - p, " %08lx", e->data.l[ i ] );
+            }
+            break;
+        }
+        *p = '\0';
+        fgWarning( "%s: window=0x%x, message_type=%lu, format=%d, data=(%s )",
+                   fghTypeToString( e->type ), e->window,
+                   (unsigned long)e->message_type, e->format, buf );
+        break;
+    }
+
+    case MappingNotify: {
+        XMappingEvent *e = &event->xmapping;
+        fgWarning( "%s: window=0x%x, request=%s, first_keycode=%d, count=%d",
+                   fghTypeToString( e->type ), e->window,
+                   fghMappingRequestToString( e->request ), e->first_keycode,
+                   e->count );
+        break;
+    }
+
+    default: {
+        fgWarning( "%s", fghTypeToString( event->type ) );
+        break;
+    }
+    }
+}
+
+
+void fgPlatformProcessSingleEvent ( void )
+{
+    SFG_Window* window;
+    XEvent event;
+
+    /* This code was repeated constantly, so here it goes into a definition: */
+#define GETWINDOW(a)                             \
+    window = fgWindowByHandle( event.a.window ); \
+    if( window == NULL )                         \
+        break;
+
+#define GETMOUSE(a)                              \
+    window->State.MouseX = event.a.x;            \
+    window->State.MouseY = event.a.y;
+
+    FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMainLoopEvent" );
+
+    while( XPending( fgDisplay.pDisplay.Display ) )
+    {
+        XNextEvent( fgDisplay.pDisplay.Display, &event );
+#if _DEBUG
+        fghPrintEvent( &event );
+#endif
+
+        switch( event.type )
+        {
+        case ClientMessage:
+            if(fgIsSpaceballXEvent(&event)) {
+                fgSpaceballHandleXEvent(&event);
+                break;
+            }
+            /* Destroy the window when the WM_DELETE_WINDOW message arrives */
+            if( (Atom) event.xclient.data.l[ 0 ] == fgDisplay.pDisplay.DeleteWindow )
+            {
+                GETWINDOW( xclient );
+
+                fgDestroyWindow ( window );
+
+                if( fgState.ActionOnWindowClose == GLUT_ACTION_EXIT )
+                {
+                    fgDeinitialize( );
+                    exit( 0 );
+                }
+                else if( fgState.ActionOnWindowClose == GLUT_ACTION_GLUTMAINLOOP_RETURNS )
+                    fgState.ExecState = GLUT_EXEC_STATE_STOP;
+
+                return;
+            }
+            break;
+
+            /*
+             * CreateNotify causes a configure-event so that sub-windows are
+             * handled compatibly with GLUT.  Otherwise, your sub-windows
+             * (in freeglut only) will not get an initial reshape event,
+             * which can break things.
+             *
+             * GLUT presumably does this because it generally tries to treat
+             * sub-windows the same as windows.
+             */
+        case CreateNotify:
+        case ConfigureNotify:
+            {
+                int width, height;
+                if( event.type == CreateNotify ) {
+                    GETWINDOW( xcreatewindow );
+                    width = event.xcreatewindow.width;
+                    height = event.xcreatewindow.height;
+                } else {
+                    GETWINDOW( xconfigure );
+                    width = event.xconfigure.width;
+                    height = event.xconfigure.height;
+                }
+
+                if( ( width != window->State.pWState.OldWidth ) ||
+                    ( height != window->State.pWState.OldHeight ) )
+                {
+                    SFG_Window *current_window = fgStructure.CurrentWindow;
+
+                    window->State.pWState.OldWidth = width;
+                    window->State.pWState.OldHeight = height;
+                    if( FETCH_WCB( *window, Reshape ) )
+                        INVOKE_WCB( *window, Reshape, ( width, height ) );
+                    else
+                    {
+                        fgSetWindow( window );
+                        glViewport( 0, 0, width, height );
+                    }
+                    glutPostRedisplay( );
+                    if( window->IsMenu )
+                        fgSetWindow( current_window );
+                }
+            }
+            break;
+
+        case DestroyNotify:
+            /*
+             * This is sent to confirm the XDestroyWindow call.
+             *
+             * XXX WHY is this commented out?  Should we re-enable it?
+             */
+            /* fgAddToWindowDestroyList ( window ); */
+            break;
+
+        case Expose:
+            /*
+             * We are too dumb to process partial exposes...
+             *
+             * XXX Well, we could do it.  However, it seems to only
+             * XXX be potentially useful for single-buffered (since
+             * XXX double-buffered does not respect viewport when we
+             * XXX do a buffer-swap).
+             *
+             */
+            if( event.xexpose.count == 0 )
+            {
+                GETWINDOW( xexpose );
+                window->State.Redisplay = GL_TRUE;
+            }
+            break;
+
+        case MapNotify:
+            break;
+
+        case UnmapNotify:
+            /* We get this when iconifying a window. */ 
+            GETWINDOW( xunmap );
+            INVOKE_WCB( *window, WindowStatus, ( GLUT_HIDDEN ) );
+            window->State.Visible = GL_FALSE;
+            break;
+
+        case MappingNotify:
+            /*
+             * Have the client's keyboard knowledge updated (xlib.ps,
+             * page 206, says that's a good thing to do)
+             */
+            XRefreshKeyboardMapping( (XMappingEvent *) &event );
+            break;
+
+        case VisibilityNotify:
+        {
+            /*
+             * Sending this event, the X server can notify us that the window
+             * has just acquired one of the three possible visibility states:
+             * VisibilityUnobscured, VisibilityPartiallyObscured or
+             * VisibilityFullyObscured. Note that we DO NOT receive a
+             * VisibilityNotify event when iconifying a window, we only get an
+             * UnmapNotify then.
+             */
+            GETWINDOW( xvisibility );
+            switch( event.xvisibility.state )
+            {
+            case VisibilityUnobscured:
+                INVOKE_WCB( *window, WindowStatus, ( GLUT_FULLY_RETAINED ) );
+                window->State.Visible = GL_TRUE;
+                break;
+
+            case VisibilityPartiallyObscured:
+                INVOKE_WCB( *window, WindowStatus,
+                            ( GLUT_PARTIALLY_RETAINED ) );
+                window->State.Visible = GL_TRUE;
+                break;
+
+            case VisibilityFullyObscured:
+                INVOKE_WCB( *window, WindowStatus, ( GLUT_FULLY_COVERED ) );
+                window->State.Visible = GL_FALSE;
+                break;
+
+            default:
+                fgWarning( "Unknown X visibility state: %d",
+                           event.xvisibility.state );
+                break;
+            }
+        }
+        break;
+
+        case EnterNotify:
+        case LeaveNotify:
+            GETWINDOW( xcrossing );
+            GETMOUSE( xcrossing );
+            if( ( event.type == LeaveNotify ) && window->IsMenu &&
+                window->ActiveMenu && window->ActiveMenu->IsActive )
+                fgUpdateMenuHighlight( window->ActiveMenu );
+
+            INVOKE_WCB( *window, Entry, ( ( EnterNotify == event.type ) ?
+                                          GLUT_ENTERED :
+                                          GLUT_LEFT ) );
+            break;
+
+        case MotionNotify:
+        {
+            GETWINDOW( xmotion );
+            GETMOUSE( xmotion );
+
+            if( window->ActiveMenu )
+            {
+                if( window == window->ActiveMenu->ParentWindow )
+                {
+                    window->ActiveMenu->Window->State.MouseX =
+                        event.xmotion.x_root - window->ActiveMenu->X;
+                    window->ActiveMenu->Window->State.MouseY =
+                        event.xmotion.y_root - window->ActiveMenu->Y;
+                }
+
+                fgUpdateMenuHighlight( window->ActiveMenu );
+
+                break;
+            }
+
+            /*
+             * XXX For more than 5 buttons, just check {event.xmotion.state},
+             * XXX rather than a host of bit-masks?  Or maybe we need to
+             * XXX track ButtonPress/ButtonRelease events in our own
+             * XXX bit-mask?
+             */
+            fgState.Modifiers = fgPlatformGetModifiers( event.xmotion.state );
+            if ( event.xmotion.state & ( Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask ) ) {
+                INVOKE_WCB( *window, Motion, ( event.xmotion.x,
+                                               event.xmotion.y ) );
+            } else {
+                INVOKE_WCB( *window, Passive, ( event.xmotion.x,
+                                                event.xmotion.y ) );
+            }
+            fgState.Modifiers = INVALID_MODIFIERS;
+        }
+        break;
+
+        case ButtonRelease:
+        case ButtonPress:
+        {
+            GLboolean pressed = GL_TRUE;
+            int button;
+
+            if( event.type == ButtonRelease )
+                pressed = GL_FALSE ;
+
+            /*
+             * A mouse button has been pressed or released. Traditionally,
+             * break if the window was found within the freeglut structures.
+             */
+            GETWINDOW( xbutton );
+            GETMOUSE( xbutton );
+
+            /*
+             * An X button (at least in XFree86) is numbered from 1.
+             * A GLUT button is numbered from 0.
+             * Old GLUT passed through buttons other than just the first
+             * three, though it only gave symbolic names and official
+             * support to the first three.
+             */
+            button = event.xbutton.button - 1;
+
+            /*
+             * Do not execute the application's mouse callback if a menu
+             * is hooked to this button.  In that case an appropriate
+             * private call should be generated.
+             */
+            if( fgCheckActiveMenu( window, button, pressed,
+                                   event.xbutton.x_root, event.xbutton.y_root ) )
+                break;
+
+            /*
+             * Check if there is a mouse or mouse wheel callback hooked to the
+             * window
+             */
+            if( ! FETCH_WCB( *window, Mouse ) &&
+                ! FETCH_WCB( *window, MouseWheel ) )
+                break;
+
+            fgState.Modifiers = fgPlatformGetModifiers( event.xbutton.state );
+
+            /* Finally execute the mouse or mouse wheel callback */
+            if( ( button < glutDeviceGet ( GLUT_NUM_MOUSE_BUTTONS ) ) || ( ! FETCH_WCB( *window, MouseWheel ) ) )
+                INVOKE_WCB( *window, Mouse, ( button,
+                                              pressed ? GLUT_DOWN : GLUT_UP,
+                                              event.xbutton.x,
+                                              event.xbutton.y )
+                );
+            else
+            {
+                /*
+                 * Map 4 and 5 to wheel zero; EVEN to +1, ODD to -1
+                 *  "  6 and 7 "    "   one; ...
+                 *
+                 * XXX This *should* be behind some variables/macros,
+                 * XXX since the order and numbering isn't certain
+                 * XXX See XFree86 configuration docs (even back in the
+                 * XXX 3.x days, and especially with 4.x).
+                 *
+                 * XXX Note that {button} has already been decremented
+                 * XXX in mapping from X button numbering to GLUT.
+                                *
+                                * XXX Should add support for partial wheel turns as Windows does -- 5/27/11
+                 */
+                int wheel_number = (button - glutDeviceGet ( GLUT_NUM_MOUSE_BUTTONS )) / 2;
+                int direction = -1;
+                if( button % 2 )
+                    direction = 1;
+
+                if( pressed )
+                    INVOKE_WCB( *window, MouseWheel, ( wheel_number,
+                                                       direction,
+                                                       event.xbutton.x,
+                                                       event.xbutton.y )
+                    );
+            }
+            fgState.Modifiers = INVALID_MODIFIERS;
+        }
+        break;
+
+        case KeyRelease:
+        case KeyPress:
+        {
+            FGCBKeyboard keyboard_cb;
+            FGCBSpecial special_cb;
+
+            GETWINDOW( xkey );
+            GETMOUSE( xkey );
+
+            /* Detect auto repeated keys, if configured globally or per-window */
+
+            if ( fgState.KeyRepeat==GLUT_KEY_REPEAT_OFF || window->State.IgnoreKeyRepeat==GL_TRUE )
+            {
+                if (event.type==KeyRelease)
+                {
+                    /*
+                     * Look at X11 keystate to detect repeat mode.
+                     * While X11 says the key is actually held down, we'll ignore KeyRelease/KeyPress pairs.
+                     */
+
+                    char keys[32];
+                    XQueryKeymap( fgDisplay.pDisplay.Display, keys ); /* Look at X11 keystate to detect repeat mode */
+
+                    if ( event.xkey.keycode<256 )            /* XQueryKeymap is limited to 256 keycodes    */
+                    {
+                        if ( keys[event.xkey.keycode>>3] & (1<<(event.xkey.keycode%8)) )
+                            window->State.KeyRepeating = GL_TRUE;
+                        else
+                            window->State.KeyRepeating = GL_FALSE;
+                    }
+                }
+            }
+            else
+                window->State.KeyRepeating = GL_FALSE;
+
+            /* Cease processing this event if it is auto repeated */
+
+            if (window->State.KeyRepeating)
+            {
+                if (event.type == KeyPress) window->State.KeyRepeating = GL_FALSE;
+                break;
+            }
+
+            if( event.type == KeyPress )
+            {
+                keyboard_cb = (FGCBKeyboard)( FETCH_WCB( *window, Keyboard ));
+                special_cb  = (FGCBSpecial) ( FETCH_WCB( *window, Special  ));
+            }
+            else
+            {
+                keyboard_cb = (FGCBKeyboard)( FETCH_WCB( *window, KeyboardUp ));
+                special_cb  = (FGCBSpecial) ( FETCH_WCB( *window, SpecialUp  ));
+            }
+
+            /* Is there a keyboard/special callback hooked for this window? */
+            if( keyboard_cb || special_cb )
+            {
+                XComposeStatus composeStatus;
+                char asciiCode[ 32 ];
+                KeySym keySym;
+                int len;
+
+                /* Check for the ASCII/KeySym codes associated with the event: */
+                len = XLookupString( &event.xkey, asciiCode, sizeof(asciiCode),
+                                     &keySym, &composeStatus
+                );
+
+                /* GLUT API tells us to have two separate callbacks... */
+                if( len > 0 )
+                {
+                    /* ...one for the ASCII translateable keypresses... */
+                    if( keyboard_cb )
+                    {
+                        fgSetWindow( window );
+                        fgState.Modifiers = fgPlatformGetModifiers( event.xkey.state );
+                        keyboard_cb( asciiCode[ 0 ],
+                                     event.xkey.x, event.xkey.y
+                        );
+                        fgState.Modifiers = INVALID_MODIFIERS;
+                    }
+                }
+                else
+                {
+                    int special = -1;
+
+                    /*
+                     * ...and one for all the others, which need to be
+                     * translated to GLUT_KEY_Xs...
+                     */
+                    switch( keySym )
+                    {
+                    case XK_F1:     special = GLUT_KEY_F1;     break;
+                    case XK_F2:     special = GLUT_KEY_F2;     break;
+                    case XK_F3:     special = GLUT_KEY_F3;     break;
+                    case XK_F4:     special = GLUT_KEY_F4;     break;
+                    case XK_F5:     special = GLUT_KEY_F5;     break;
+                    case XK_F6:     special = GLUT_KEY_F6;     break;
+                    case XK_F7:     special = GLUT_KEY_F7;     break;
+                    case XK_F8:     special = GLUT_KEY_F8;     break;
+                    case XK_F9:     special = GLUT_KEY_F9;     break;
+                    case XK_F10:    special = GLUT_KEY_F10;    break;
+                    case XK_F11:    special = GLUT_KEY_F11;    break;
+                    case XK_F12:    special = GLUT_KEY_F12;    break;
+
+                    case XK_KP_Left:
+                    case XK_Left:   special = GLUT_KEY_LEFT;   break;
+                    case XK_KP_Right:
+                    case XK_Right:  special = GLUT_KEY_RIGHT;  break;
+                    case XK_KP_Up:
+                    case XK_Up:     special = GLUT_KEY_UP;     break;
+                    case XK_KP_Down:
+                    case XK_Down:   special = GLUT_KEY_DOWN;   break;
+
+                    case XK_KP_Prior:
+                    case XK_Prior:  special = GLUT_KEY_PAGE_UP; break;
+                    case XK_KP_Next:
+                    case XK_Next:   special = GLUT_KEY_PAGE_DOWN; break;
+                    case XK_KP_Home:
+                    case XK_Home:   special = GLUT_KEY_HOME;   break;
+                    case XK_KP_End:
+                    case XK_End:    special = GLUT_KEY_END;    break;
+                    case XK_KP_Insert:
+                    case XK_Insert: special = GLUT_KEY_INSERT; break;
+
+                    case XK_Num_Lock :  special = GLUT_KEY_NUM_LOCK;  break;
+                    case XK_KP_Begin :  special = GLUT_KEY_BEGIN;     break;
+                    case XK_KP_Delete:  special = GLUT_KEY_DELETE;    break;
+
+                    case XK_Shift_L:   special = GLUT_KEY_SHIFT_L;    break;
+                    case XK_Shift_R:   special = GLUT_KEY_SHIFT_R;    break;
+                    case XK_Control_L: special = GLUT_KEY_CTRL_L;     break;
+                    case XK_Control_R: special = GLUT_KEY_CTRL_R;     break;
+                    case XK_Alt_L:     special = GLUT_KEY_ALT_L;      break;
+                    case XK_Alt_R:     special = GLUT_KEY_ALT_R;      break;
+                    }
+
+                    /*
+                     * Execute the callback (if one has been specified),
+                     * given that the special code seems to be valid...
+                     */
+                    if( special_cb && (special != -1) )
+                    {
+                        fgSetWindow( window );
+                        fgState.Modifiers = fgPlatformGetModifiers( event.xkey.state );
+                        special_cb( special, event.xkey.x, event.xkey.y );
+                        fgState.Modifiers = INVALID_MODIFIERS;
+                    }
+                }
+            }
+        }
+        break;
+
+        case ReparentNotify:
+            break; /* XXX Should disable this event */
+
+        /* Not handled */
+        case GravityNotify:
+            break;
+
+        default:
+            /* enter handling of Extension Events here */
+            #ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
+                fgHandleExtensionEvents( &event );
+            #endif
+            break;
+        }
+    }
+}
+
+
+void fgPlatformMainLoopPreliminaryWork ( void )
+{
+}
+
index a09c6eb..36e87ad 100644 (file)
@@ -1,49 +1,49 @@
-/*\r
- * freeglut_menu_x11.c\r
- *\r
- * Pull-down menu creation and handling.\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Copied for Platform code by Evan Felix <karcaw at gmail.com>\r
- * Creation date: Wed Feb 1, 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-/*\r
- *  * Private function to get the virtual maximum screen extent\r
- *   */\r
-GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y )\r
-{\r
-    int wx, wy;\r
-    Window w;\r
-\r
-    XTranslateCoordinates(\r
-        fgDisplay.pDisplay.Display,\r
-        window->Window.Handle,\r
-        fgDisplay.pDisplay.RootWindow,\r
-        0, 0, &wx, &wy, &w);\r
-\r
-    *x = fgState.GameModeSize.X + wx;\r
-    *y = fgState.GameModeSize.Y + wy;\r
-}\r
-\r
+/*
+ * freeglut_menu_x11.c
+ *
+ * Pull-down menu creation and handling.
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Copied for Platform code by Evan Felix <karcaw at gmail.com>
+ * Creation date: Wed Feb 1, 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+/*
+ *  * Private function to get the virtual maximum screen extent
+ *   */
+GLvoid fgPlatformGetGameModeVMaxExtent( SFG_Window* window, int* x, int* y )
+{
+    int wx, wy;
+    Window w;
+
+    XTranslateCoordinates(
+        fgDisplay.pDisplay.Display,
+        window->Window.Handle,
+        fgDisplay.pDisplay.RootWindow,
+        0, 0, &wx, &wy, &w);
+
+    *x = fgState.GameModeSize.X + wx;
+    *y = fgState.GameModeSize.Y + wy;
+}
+
index 84f8511..e0d22d6 100644 (file)
-/* Spaceball support for Linux.\r
- * Written by John Tsiombikas <nuclear@member.fsf.org>\r
- * Copied for Platform code by Evan Felix <karcaw at gmail.com>\r
- * Creation date: Thur Feb 2 2012\r
- *\r
- * This code supports 3Dconnexion's 6-dof space-whatever devices.\r
- * It can communicate with either the proprietary 3Dconnexion daemon (3dxsrv)\r
- * free spacenavd (http://spacenav.sourceforge.net), through the "standard"\r
- * magellan X-based protocol.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-#include <X11/Xlib.h>\r
-\r
-extern int sball_initialized;\r
-\r
-enum {\r
-    SPNAV_EVENT_ANY,  /* used by spnav_remove_events() */\r
-    SPNAV_EVENT_MOTION,\r
-    SPNAV_EVENT_BUTTON  /* includes both press and release */\r
-};\r
-\r
-struct spnav_event_motion {\r
-    int type;\r
-    int x, y, z;\r
-    int rx, ry, rz;\r
-    unsigned int period;\r
-    int *data;\r
-};\r
-\r
-struct spnav_event_button {\r
-    int type;\r
-    int press;\r
-    int bnum;\r
-};\r
-\r
-typedef union spnav_event {\r
-    int type;\r
-    struct spnav_event_motion motion;\r
-    struct spnav_event_button button;\r
-} spnav_event;\r
-\r
-\r
-static int spnav_x11_open(Display *dpy, Window win);\r
-static int spnav_x11_window(Window win);\r
-static int spnav_x11_event(const XEvent *xev, spnav_event *event);\r
-static int spnav_close(void);\r
-static int spnav_fd(void);\r
-static int spnav_remove_events(int type);\r
-\r
-static SFG_Window *spnav_win;\r
-\r
-void fgPlatformInitializeSpaceball(void)\r
-{\r
-    Window w;\r
-\r
-    sball_initialized = 1;\r
-    if(!fgStructure.CurrentWindow)\r
-    {\r
-        sball_initialized = -1;\r
-        return;\r
-    }\r
-\r
-    w = fgStructure.CurrentWindow->Window.Handle;\r
-    if(spnav_x11_open(fgDisplay.pDisplay.Display, w) == -1)\r
-    {\r
-        sball_initialized = -1;\r
-        return;\r
-    }\r
-}\r
-\r
-void fgPlatformSpaceballClose(void) \r
-{\r
-    spnav_close();\r
-}\r
-\r
-int fgPlatformHasSpaceball(void) \r
-{\r
-    /* XXX this function should somehow query the driver if there's a device\r
-     * plugged in, as opposed to just checking if there's a driver to talk to.\r
-     */\r
-    return spnav_fd() == -1 ? 0 : 1;\r
-}\r
-\r
-int fgPlatformSpaceballNumButtons(void) {\r
-    return 2;\r
-}\r
-\r
-void fgPlatformSpaceballSetWindow(SFG_Window *window) \r
-{\r
-       if(spnav_win != window) {\r
-        spnav_x11_window(window->Window.Handle);\r
-        spnav_win = window;\r
-    }\r
-}\r
-\r
-int fgIsSpaceballXEvent(const XEvent *xev)\r
-{\r
-    spnav_event sev;\r
-\r
-    if(spnav_win != fgStructure.CurrentWindow) {\r
-        /* this will also initialize spaceball if needed (first call) */\r
-        fgSpaceballSetWindow(fgStructure.CurrentWindow);\r
-    }\r
-\r
-    if(sball_initialized != 1) {\r
-        return 0;\r
-    }\r
-\r
-    return spnav_x11_event(xev, &sev);\r
-}\r
-\r
-void fgSpaceballHandleXEvent(const XEvent *xev)\r
-{\r
-    spnav_event sev;\r
-\r
-    if(sball_initialized == 0) {\r
-        fgInitialiseSpaceball();\r
-        if(sball_initialized != 1) {\r
-            return;\r
-        }\r
-    }\r
-\r
-    if(spnav_x11_event(xev, &sev)) {\r
-        switch(sev.type) {\r
-        case SPNAV_EVENT_MOTION:\r
-            if(sev.motion.x | sev.motion.y | sev.motion.z) {\r
-                INVOKE_WCB(*spnav_win, SpaceMotion, (sev.motion.x, sev.motion.y, sev.motion.z));\r
-            }\r
-            if(sev.motion.rx | sev.motion.ry | sev.motion.rz) {\r
-                INVOKE_WCB(*spnav_win, SpaceRotation, (sev.motion.rx, sev.motion.ry, sev.motion.rz));\r
-            }\r
-            spnav_remove_events(SPNAV_EVENT_MOTION);\r
-            break;\r
-\r
-        case SPNAV_EVENT_BUTTON:\r
-            INVOKE_WCB(*spnav_win, SpaceButton, (sev.button.bnum, sev.button.press ? GLUT_DOWN : GLUT_UP));\r
-            break;\r
-\r
-        default:\r
-            break;\r
-        }\r
-    }\r
-}\r
-\r
-/*\r
-The following code is part of libspnav, part of the spacenav project (spacenav.sf.net)\r
-Copyright (C) 2007-2009 John Tsiombikas <nuclear@member.fsf.org>\r
-\r
-Redistribution and use in source and binary forms, with or without\r
-modification, are permitted provided that the following conditions are met:\r
-\r
-1. Redistributions of source code must retain the above copyright notice, this\r
-   list of conditions and the following disclaimer.\r
-2. Redistributions in binary form must reproduce the above copyright notice,\r
-   this list of conditions and the following disclaimer in the documentation\r
-   and/or other materials provided with the distribution.\r
-3. The name of the author may not be used to endorse or promote products\r
-   derived from this software without specific prior written permission.\r
-\r
-THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\r
-WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\r
-EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\r
-OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\r
-IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\r
-OF SUCH DAMAGE.\r
-*/\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-\r
-#ifdef HAVE_ERRNO_H\r
-#include <errno.h>\r
-#endif\r
-\r
-#include <X11/Xlib.h>\r
-#include <X11/Xutil.h>\r
-\r
-static Window get_daemon_window(Display *dpy);\r
-static int catch_badwin(Display *dpy, XErrorEvent *err);\r
-\r
-static Display *dpy;\r
-static Window app_win;\r
-static Atom motion_event, button_press_event, button_release_event, command_event;\r
-\r
-enum {\r
-  CMD_APP_WINDOW = 27695,\r
-  CMD_APP_SENS\r
-};\r
-\r
-#define IS_OPEN    dpy\r
-\r
-struct event_node {\r
-  spnav_event event;\r
-  struct event_node *next;\r
-};\r
-\r
-static int spnav_x11_open(Display *display, Window win)\r
-{\r
-  if(IS_OPEN) {\r
-    return -1;\r
-  }\r
-\r
-  dpy = display;\r
-\r
-  motion_event = XInternAtom(dpy, "MotionEvent", True);\r
-  button_press_event = XInternAtom(dpy, "ButtonPressEvent", True);\r
-  button_release_event = XInternAtom(dpy, "ButtonReleaseEvent", True);\r
-  command_event = XInternAtom(dpy, "CommandEvent", True);\r
-\r
-  if(!motion_event || !button_press_event || !button_release_event || !command_event) {\r
-    dpy = 0;\r
-    return -1;  /* daemon not started */\r
-  }\r
-\r
-  if(spnav_x11_window(win) == -1) {\r
-    dpy = 0;\r
-    return -1;  /* daemon not started */\r
-  }\r
-\r
-  app_win = win;\r
-  return 0;\r
-}\r
-\r
-static int spnav_close(void)\r
-{\r
-  if(dpy) {\r
-    spnav_x11_window(DefaultRootWindow(dpy));\r
-    app_win = 0;\r
-    dpy = 0;\r
-    return 0;\r
-  }\r
-  return -1;\r
-}\r
-\r
-static int spnav_x11_window(Window win)\r
-{\r
-  int (*prev_xerr_handler)(Display*, XErrorEvent*);\r
-  XEvent xev;\r
-  Window daemon_win;\r
-\r
-  if(!IS_OPEN) {\r
-    return -1;\r
-  }\r
-\r
-  if(!(daemon_win = get_daemon_window(dpy))) {\r
-    return -1;\r
-  }\r
-\r
-  prev_xerr_handler = XSetErrorHandler(catch_badwin);\r
-\r
-  xev.type = ClientMessage;\r
-  xev.xclient.send_event = False;\r
-  xev.xclient.display = dpy;\r
-  xev.xclient.window = win;\r
-  xev.xclient.message_type = command_event;\r
-  xev.xclient.format = 16;\r
-  xev.xclient.data.s[0] = ((unsigned int)win & 0xffff0000) >> 16;\r
-  xev.xclient.data.s[1] = (unsigned int)win & 0xffff;\r
-  xev.xclient.data.s[2] = CMD_APP_WINDOW;\r
-\r
-  XSendEvent(dpy, daemon_win, False, 0, &xev);\r
-  XSync(dpy, False);\r
-\r
-  XSetErrorHandler(prev_xerr_handler);\r
-  return 0;\r
-}\r
-\r
-static int spnav_fd(void)\r
-{\r
-  if(dpy) {\r
-    return ConnectionNumber(dpy);\r
-  }\r
-  return -1;\r
-}\r
-\r
-/*static int spnav_wait_event(spnav_event *event)\r
-{\r
-  if(dpy) {\r
-    for(;;) {\r
-      XEvent xev;\r
-      XNextEvent(dpy, &xev);\r
-\r
-      if(spnav_x11_event(&xev, event) > 0) {\r
-        return event->type;\r
-      }\r
-    }\r
-  }\r
-  return 0;\r
-}\r
-\r
-static int spnav_poll_event(spnav_event *event)\r
-{\r
-  if(dpy) {\r
-    if(XPending(dpy)) {\r
-      XEvent xev;\r
-      XNextEvent(dpy, &xev);\r
-\r
-      return spnav_x11_event(&xev, event);\r
-    }\r
-  }\r
-  return 0;\r
-}*/\r
-\r
-static Bool match_events(Display *dpy, XEvent *xev, char *arg)\r
-{\r
-  int evtype = *(int*)arg;\r
-\r
-  if(xev->type != ClientMessage) {\r
-    return False;\r
-  }\r
-\r
-  if(xev->xclient.message_type == motion_event) {\r
-    return !evtype || evtype == SPNAV_EVENT_MOTION ? True : False;\r
-  }\r
-  if(xev->xclient.message_type == button_press_event ||\r
-      xev->xclient.message_type == button_release_event) {\r
-    return !evtype || evtype == SPNAV_EVENT_BUTTON ? True : False;\r
-  }\r
-  return False;\r
-}\r
-\r
-static int spnav_remove_events(int type)\r
-{\r
-  int rm_count = 0;\r
-\r
-  if(dpy) {\r
-    XEvent xev;\r
-\r
-    while(XCheckIfEvent(dpy, &xev, match_events, (char*)&type)) {\r
-      rm_count++;\r
-    }\r
-    return rm_count;\r
-  }\r
-  return 0;\r
-}\r
-\r
-static int spnav_x11_event(const XEvent *xev, spnav_event *event)\r
-{\r
-  int i;\r
-  int xmsg_type;\r
-\r
-  if(xev->type != ClientMessage) {\r
-    return 0;\r
-  }\r
-\r
-  xmsg_type = xev->xclient.message_type;\r
-\r
-  if(xmsg_type != motion_event && xmsg_type != button_press_event &&\r
-      xmsg_type != button_release_event) {\r
-    return 0;\r
-  }\r
-\r
-  if(xmsg_type == motion_event) {\r
-    event->type = SPNAV_EVENT_MOTION;\r
-    event->motion.data = &event->motion.x;\r
-\r
-    for(i=0; i<6; i++) {\r
-      event->motion.data[i] = xev->xclient.data.s[i + 2];\r
-    }\r
-    event->motion.period = xev->xclient.data.s[8];\r
-  } else {\r
-    event->type = SPNAV_EVENT_BUTTON;\r
-    event->button.press = xmsg_type == button_press_event ? 1 : 0;\r
-    event->button.bnum = xev->xclient.data.s[2];\r
-  }\r
-  return event->type;\r
-}\r
-\r
-\r
-static Window get_daemon_window(Display *dpy)\r
-{\r
-  Window win, root_win;\r
-  XTextProperty wname;\r
-  Atom type;\r
-  int fmt;\r
-  unsigned long nitems, bytes_after;\r
-  unsigned char *prop;\r
-\r
-  root_win = DefaultRootWindow(dpy);\r
-\r
-  XGetWindowProperty(dpy, root_win, command_event, 0, 1, False, AnyPropertyType, &type, &fmt, &nitems, &bytes_after, &prop);\r
-  if(!prop) {\r
-    return 0;\r
-  }\r
-\r
-  win = *(Window*)prop;\r
-  XFree(prop);\r
-\r
-  if(!XGetWMName(dpy, win, &wname) || strcmp("Magellan Window", (char*)wname.value) != 0) {\r
-    return 0;\r
-  }\r
-\r
-  return win;\r
-}\r
-\r
-static int catch_badwin(Display *dpy, XErrorEvent *err)\r
-{\r
-  char buf[256];\r
-\r
-  if(err->error_code == BadWindow) {\r
-    /* do nothing? */\r
-  } else {\r
-    XGetErrorText(dpy, err->error_code, buf, sizeof buf);\r
-    fprintf(stderr, "Caught unexpected X error: %s\n", buf);\r
-  }\r
-  return 0;\r
-}\r
-\r
+/* Spaceball support for Linux.
+ * Written by John Tsiombikas <nuclear@member.fsf.org>
+ * Copied for Platform code by Evan Felix <karcaw at gmail.com>
+ * Creation date: Thur Feb 2 2012
+ *
+ * This code supports 3Dconnexion's 6-dof space-whatever devices.
+ * It can communicate with either the proprietary 3Dconnexion daemon (3dxsrv)
+ * free spacenavd (http://spacenav.sourceforge.net), through the "standard"
+ * magellan X-based protocol.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+#include <X11/Xlib.h>
+
+extern int sball_initialized;
+
+enum {
+    SPNAV_EVENT_ANY,  /* used by spnav_remove_events() */
+    SPNAV_EVENT_MOTION,
+    SPNAV_EVENT_BUTTON  /* includes both press and release */
+};
+
+struct spnav_event_motion {
+    int type;
+    int x, y, z;
+    int rx, ry, rz;
+    unsigned int period;
+    int *data;
+};
+
+struct spnav_event_button {
+    int type;
+    int press;
+    int bnum;
+};
+
+typedef union spnav_event {
+    int type;
+    struct spnav_event_motion motion;
+    struct spnav_event_button button;
+} spnav_event;
+
+
+static int spnav_x11_open(Display *dpy, Window win);
+static int spnav_x11_window(Window win);
+static int spnav_x11_event(const XEvent *xev, spnav_event *event);
+static int spnav_close(void);
+static int spnav_fd(void);
+static int spnav_remove_events(int type);
+
+static SFG_Window *spnav_win;
+
+void fgPlatformInitializeSpaceball(void)
+{
+    Window w;
+
+    sball_initialized = 1;
+    if(!fgStructure.CurrentWindow)
+    {
+        sball_initialized = -1;
+        return;
+    }
+
+    w = fgStructure.CurrentWindow->Window.Handle;
+    if(spnav_x11_open(fgDisplay.pDisplay.Display, w) == -1)
+    {
+        sball_initialized = -1;
+        return;
+    }
+}
+
+void fgPlatformSpaceballClose(void) 
+{
+    spnav_close();
+}
+
+int fgPlatformHasSpaceball(void) 
+{
+    /* XXX this function should somehow query the driver if there's a device
+     * plugged in, as opposed to just checking if there's a driver to talk to.
+     */
+    return spnav_fd() == -1 ? 0 : 1;
+}
+
+int fgPlatformSpaceballNumButtons(void) {
+    return 2;
+}
+
+void fgPlatformSpaceballSetWindow(SFG_Window *window) 
+{
+       if(spnav_win != window) {
+        spnav_x11_window(window->Window.Handle);
+        spnav_win = window;
+    }
+}
+
+int fgIsSpaceballXEvent(const XEvent *xev)
+{
+    spnav_event sev;
+
+    if(spnav_win != fgStructure.CurrentWindow) {
+        /* this will also initialize spaceball if needed (first call) */
+        fgSpaceballSetWindow(fgStructure.CurrentWindow);
+    }
+
+    if(sball_initialized != 1) {
+        return 0;
+    }
+
+    return spnav_x11_event(xev, &sev);
+}
+
+void fgSpaceballHandleXEvent(const XEvent *xev)
+{
+    spnav_event sev;
+
+    if(sball_initialized == 0) {
+        fgInitialiseSpaceball();
+        if(sball_initialized != 1) {
+            return;
+        }
+    }
+
+    if(spnav_x11_event(xev, &sev)) {
+        switch(sev.type) {
+        case SPNAV_EVENT_MOTION:
+            if(sev.motion.x | sev.motion.y | sev.motion.z) {
+                INVOKE_WCB(*spnav_win, SpaceMotion, (sev.motion.x, sev.motion.y, sev.motion.z));
+            }
+            if(sev.motion.rx | sev.motion.ry | sev.motion.rz) {
+                INVOKE_WCB(*spnav_win, SpaceRotation, (sev.motion.rx, sev.motion.ry, sev.motion.rz));
+            }
+            spnav_remove_events(SPNAV_EVENT_MOTION);
+            break;
+
+        case SPNAV_EVENT_BUTTON:
+            INVOKE_WCB(*spnav_win, SpaceButton, (sev.button.bnum, sev.button.press ? GLUT_DOWN : GLUT_UP));
+            break;
+
+        default:
+            break;
+        }
+    }
+}
+
+/*
+The following code is part of libspnav, part of the spacenav project (spacenav.sf.net)
+Copyright (C) 2007-2009 John Tsiombikas <nuclear@member.fsf.org>
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+2. 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.
+3. The name of the author may not be used to endorse or promote products
+   derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef HAVE_ERRNO_H
+#include <errno.h>
+#endif
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+static Window get_daemon_window(Display *dpy);
+static int catch_badwin(Display *dpy, XErrorEvent *err);
+
+static Display *dpy;
+static Window app_win;
+static Atom motion_event, button_press_event, button_release_event, command_event;
+
+enum {
+  CMD_APP_WINDOW = 27695,
+  CMD_APP_SENS
+};
+
+#define IS_OPEN    dpy
+
+struct event_node {
+  spnav_event event;
+  struct event_node *next;
+};
+
+static int spnav_x11_open(Display *display, Window win)
+{
+  if(IS_OPEN) {
+    return -1;
+  }
+
+  dpy = display;
+
+  motion_event = XInternAtom(dpy, "MotionEvent", True);
+  button_press_event = XInternAtom(dpy, "ButtonPressEvent", True);
+  button_release_event = XInternAtom(dpy, "ButtonReleaseEvent", True);
+  command_event = XInternAtom(dpy, "CommandEvent", True);
+
+  if(!motion_event || !button_press_event || !button_release_event || !command_event) {
+    dpy = 0;
+    return -1;  /* daemon not started */
+  }
+
+  if(spnav_x11_window(win) == -1) {
+    dpy = 0;
+    return -1;  /* daemon not started */
+  }
+
+  app_win = win;
+  return 0;
+}
+
+static int spnav_close(void)
+{
+  if(dpy) {
+    spnav_x11_window(DefaultRootWindow(dpy));
+    app_win = 0;
+    dpy = 0;
+    return 0;
+  }
+  return -1;
+}
+
+static int spnav_x11_window(Window win)
+{
+  int (*prev_xerr_handler)(Display*, XErrorEvent*);
+  XEvent xev;
+  Window daemon_win;
+
+  if(!IS_OPEN) {
+    return -1;
+  }
+
+  if(!(daemon_win = get_daemon_window(dpy))) {
+    return -1;
+  }
+
+  prev_xerr_handler = XSetErrorHandler(catch_badwin);
+
+  xev.type = ClientMessage;
+  xev.xclient.send_event = False;
+  xev.xclient.display = dpy;
+  xev.xclient.window = win;
+  xev.xclient.message_type = command_event;
+  xev.xclient.format = 16;
+  xev.xclient.data.s[0] = ((unsigned int)win & 0xffff0000) >> 16;
+  xev.xclient.data.s[1] = (unsigned int)win & 0xffff;
+  xev.xclient.data.s[2] = CMD_APP_WINDOW;
+
+  XSendEvent(dpy, daemon_win, False, 0, &xev);
+  XSync(dpy, False);
+
+  XSetErrorHandler(prev_xerr_handler);
+  return 0;
+}
+
+static int spnav_fd(void)
+{
+  if(dpy) {
+    return ConnectionNumber(dpy);
+  }
+  return -1;
+}
+
+/*static int spnav_wait_event(spnav_event *event)
+{
+  if(dpy) {
+    for(;;) {
+      XEvent xev;
+      XNextEvent(dpy, &xev);
+
+      if(spnav_x11_event(&xev, event) > 0) {
+        return event->type;
+      }
+    }
+  }
+  return 0;
+}
+
+static int spnav_poll_event(spnav_event *event)
+{
+  if(dpy) {
+    if(XPending(dpy)) {
+      XEvent xev;
+      XNextEvent(dpy, &xev);
+
+      return spnav_x11_event(&xev, event);
+    }
+  }
+  return 0;
+}*/
+
+static Bool match_events(Display *dpy, XEvent *xev, char *arg)
+{
+  int evtype = *(int*)arg;
+
+  if(xev->type != ClientMessage) {
+    return False;
+  }
+
+  if(xev->xclient.message_type == motion_event) {
+    return !evtype || evtype == SPNAV_EVENT_MOTION ? True : False;
+  }
+  if(xev->xclient.message_type == button_press_event ||
+      xev->xclient.message_type == button_release_event) {
+    return !evtype || evtype == SPNAV_EVENT_BUTTON ? True : False;
+  }
+  return False;
+}
+
+static int spnav_remove_events(int type)
+{
+  int rm_count = 0;
+
+  if(dpy) {
+    XEvent xev;
+
+    while(XCheckIfEvent(dpy, &xev, match_events, (char*)&type)) {
+      rm_count++;
+    }
+    return rm_count;
+  }
+  return 0;
+}
+
+static int spnav_x11_event(const XEvent *xev, spnav_event *event)
+{
+  int i;
+  int xmsg_type;
+
+  if(xev->type != ClientMessage) {
+    return 0;
+  }
+
+  xmsg_type = xev->xclient.message_type;
+
+  if(xmsg_type != motion_event && xmsg_type != button_press_event &&
+      xmsg_type != button_release_event) {
+    return 0;
+  }
+
+  if(xmsg_type == motion_event) {
+    event->type = SPNAV_EVENT_MOTION;
+    event->motion.data = &event->motion.x;
+
+    for(i=0; i<6; i++) {
+      event->motion.data[i] = xev->xclient.data.s[i + 2];
+    }
+    event->motion.period = xev->xclient.data.s[8];
+  } else {
+    event->type = SPNAV_EVENT_BUTTON;
+    event->button.press = xmsg_type == button_press_event ? 1 : 0;
+    event->button.bnum = xev->xclient.data.s[2];
+  }
+  return event->type;
+}
+
+
+static Window get_daemon_window(Display *dpy)
+{
+  Window win, root_win;
+  XTextProperty wname;
+  Atom type;
+  int fmt;
+  unsigned long nitems, bytes_after;
+  unsigned char *prop;
+
+  root_win = DefaultRootWindow(dpy);
+
+  XGetWindowProperty(dpy, root_win, command_event, 0, 1, False, AnyPropertyType, &type, &fmt, &nitems, &bytes_after, &prop);
+  if(!prop) {
+    return 0;
+  }
+
+  win = *(Window*)prop;
+  XFree(prop);
+
+  if(!XGetWMName(dpy, win, &wname) || strcmp("Magellan Window", (char*)wname.value) != 0) {
+    return 0;
+  }
+
+  return win;
+}
+
+static int catch_badwin(Display *dpy, XErrorEvent *err)
+{
+  char buf[256];
+
+  if(err->error_code == BadWindow) {
+    /* do nothing? */
+  } else {
+    XGetErrorText(dpy, err->error_code, buf, sizeof buf);
+    fprintf(stderr, "Caught unexpected X error: %s\n", buf);
+  }
+  return 0;
+}
+
index ae785fe..40267e4 100644 (file)
-/*\r
- * freeglut_state_x11.c\r
- *\r
- * X11-specific freeglut state query methods.\r
- *\r
- * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.\r
- * Written by John F. Fay, <fayjf@sourceforge.net>\r
- * Creation date: Sat Feb 4 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-/*\r
- * TODO BEFORE THE STABLE RELEASE:\r
- *\r
- *  fgPlatformChooseFBConfig()      -- OK, but what about glutInitDisplayString()?\r
- */\r
-\r
-/* A helper function to check if a display mode is possible to use */\r
-GLXFBConfig* fgPlatformChooseFBConfig( int* numcfgs );\r
-\r
-/*\r
- * Queries the GL context about some attributes\r
- */\r
-int fgPlatformGetConfig( int attribute )\r
-{\r
-  int returnValue = 0;\r
-  int result;  /*  Not checked  */\r
-\r
-  if( fgStructure.CurrentWindow )\r
-      result = glXGetFBConfigAttrib( fgDisplay.pDisplay.Display,\r
-                                     *(fgStructure.CurrentWindow->Window.pContext.FBConfig),\r
-                                     attribute,\r
-                                     &returnValue );\r
-\r
-  return returnValue;\r
-}\r
-\r
-int fgPlatformGlutGet ( GLenum eWhat )\r
-{\r
-    int nsamples = 0;\r
-\r
-    switch( eWhat )\r
-    {\r
-    /*\r
-     * The window/context specific queries are handled mostly by\r
-     * fgPlatformGetConfig().\r
-     */\r
-    case GLUT_WINDOW_NUM_SAMPLES:\r
-#ifdef GLX_VERSION_1_3\r
-        glGetIntegerv(GL_SAMPLES, &nsamples);\r
-#endif\r
-        return nsamples;\r
-\r
-    /*\r
-     * The rest of GLX queries under X are general enough to use a macro to\r
-     * check them\r
-     */\r
-#   define GLX_QUERY(a,b) case a: return fgPlatformGetConfig( b );\r
-\r
-    GLX_QUERY( GLUT_WINDOW_RGBA,                GLX_RGBA                );\r
-    GLX_QUERY( GLUT_WINDOW_DOUBLEBUFFER,        GLX_DOUBLEBUFFER        );\r
-    GLX_QUERY( GLUT_WINDOW_BUFFER_SIZE,         GLX_BUFFER_SIZE         );\r
-    GLX_QUERY( GLUT_WINDOW_STENCIL_SIZE,        GLX_STENCIL_SIZE        );\r
-    GLX_QUERY( GLUT_WINDOW_DEPTH_SIZE,          GLX_DEPTH_SIZE          );\r
-    GLX_QUERY( GLUT_WINDOW_RED_SIZE,            GLX_RED_SIZE            );\r
-    GLX_QUERY( GLUT_WINDOW_GREEN_SIZE,          GLX_GREEN_SIZE          );\r
-    GLX_QUERY( GLUT_WINDOW_BLUE_SIZE,           GLX_BLUE_SIZE           );\r
-    GLX_QUERY( GLUT_WINDOW_ALPHA_SIZE,          GLX_ALPHA_SIZE          );\r
-    GLX_QUERY( GLUT_WINDOW_ACCUM_RED_SIZE,      GLX_ACCUM_RED_SIZE      );\r
-    GLX_QUERY( GLUT_WINDOW_ACCUM_GREEN_SIZE,    GLX_ACCUM_GREEN_SIZE    );\r
-    GLX_QUERY( GLUT_WINDOW_ACCUM_BLUE_SIZE,     GLX_ACCUM_BLUE_SIZE     );\r
-    GLX_QUERY( GLUT_WINDOW_ACCUM_ALPHA_SIZE,    GLX_ACCUM_ALPHA_SIZE    );\r
-    GLX_QUERY( GLUT_WINDOW_STEREO,              GLX_STEREO              );\r
-\r
-#   undef GLX_QUERY\r
-\r
-    /* Colormap size is handled in a bit different way than all the rest */\r
-    case GLUT_WINDOW_COLORMAP_SIZE:\r
-        if( (fgPlatformGetConfig( GLX_RGBA )) || (fgStructure.CurrentWindow == NULL) )\r
-        {\r
-            /*\r
-             * We've got a RGBA visual, so there is no colormap at all.\r
-             * The other possibility is that we have no current window set.\r
-             */\r
-            return 0;\r
-        }\r
-        else\r
-        {\r
-          const GLXFBConfig * fbconfig =\r
-                fgStructure.CurrentWindow->Window.pContext.FBConfig;\r
-\r
-          XVisualInfo * visualInfo =\r
-                glXGetVisualFromFBConfig( fgDisplay.pDisplay.Display, *fbconfig );\r
-\r
-          const int result = visualInfo->visual->map_entries;\r
-\r
-          XFree(visualInfo);\r
-\r
-          return result;\r
-        }\r
-\r
-    /*\r
-     * Those calls are somewhat similiar, as they use XGetWindowAttributes()\r
-     * function\r
-     */\r
-    case GLUT_WINDOW_X:\r
-    case GLUT_WINDOW_Y:\r
-    case GLUT_WINDOW_BORDER_WIDTH:\r
-    case GLUT_WINDOW_HEADER_HEIGHT:\r
-    {\r
-        int x, y;\r
-        Window w;\r
-\r
-        if( fgStructure.CurrentWindow == NULL )\r
-            return 0;\r
-\r
-        XTranslateCoordinates(\r
-            fgDisplay.pDisplay.Display,\r
-            fgStructure.CurrentWindow->Window.Handle,\r
-            fgDisplay.pDisplay.RootWindow,\r
-            0, 0, &x, &y, &w);\r
-\r
-        switch ( eWhat )\r
-        {\r
-        case GLUT_WINDOW_X: return x;\r
-        case GLUT_WINDOW_Y: return y;\r
-        }\r
-\r
-        if ( w == 0 )\r
-            return 0;\r
-        XTranslateCoordinates(\r
-            fgDisplay.pDisplay.Display,\r
-            fgStructure.CurrentWindow->Window.Handle,\r
-            w, 0, 0, &x, &y, &w);\r
-\r
-        switch ( eWhat )\r
-        {\r
-        case GLUT_WINDOW_BORDER_WIDTH:  return x;\r
-        case GLUT_WINDOW_HEADER_HEIGHT: return y;\r
-        }\r
-    }\r
-\r
-    case GLUT_WINDOW_WIDTH:\r
-    case GLUT_WINDOW_HEIGHT:\r
-    {\r
-        XWindowAttributes winAttributes;\r
-\r
-        if( fgStructure.CurrentWindow == NULL )\r
-            return 0;\r
-        XGetWindowAttributes(\r
-            fgDisplay.pDisplay.Display,\r
-            fgStructure.CurrentWindow->Window.Handle,\r
-            &winAttributes\r
-        );\r
-        switch ( eWhat )\r
-        {\r
-        case GLUT_WINDOW_WIDTH:            return winAttributes.width ;\r
-        case GLUT_WINDOW_HEIGHT:           return winAttributes.height ;\r
-        }\r
-    }\r
-\r
-    /* I do not know yet if there will be a fgChooseVisual() function for Win32 */\r
-    case GLUT_DISPLAY_MODE_POSSIBLE:\r
-    {\r
-        /*  We should not have to call fgPlatformChooseFBConfig again here.  */\r
-        GLXFBConfig * fbconfig;\r
-        int isPossible;\r
-\r
-        fbconfig = fgPlatformChooseFBConfig(NULL);\r
-\r
-        if (fbconfig == NULL)\r
-        {\r
-            isPossible = 0;\r
-        }\r
-        else\r
-        {\r
-            isPossible = 1;\r
-            XFree(fbconfig);\r
-        }\r
-\r
-        return isPossible;\r
-    }\r
-\r
-    /* This is system-dependant */\r
-    case GLUT_WINDOW_FORMAT_ID:\r
-        if( fgStructure.CurrentWindow == NULL )\r
-            return 0;\r
-\r
-        return fgPlatformGetConfig( GLX_VISUAL_ID );\r
-\r
-    default:\r
-        fgWarning( "glutGet(): missing enum handle %d", eWhat );\r
-        break;\r
-    }\r
-\r
-       return -1;\r
-}\r
-\r
-\r
-int fgPlatformGlutDeviceGet ( GLenum eWhat )\r
-{\r
-    switch( eWhat )\r
-    {\r
-    case GLUT_HAS_KEYBOARD:\r
-        /*\r
-         * X11 has a core keyboard by definition, although it can\r
-         * be present as a virtual/dummy keyboard. For now, there\r
-         * is no reliable way to tell if a real keyboard is present.\r
-         */\r
-        return 1;\r
-\r
-    /* X11 has a mouse by definition */\r
-    case GLUT_HAS_MOUSE:\r
-        return 1 ;\r
-\r
-    case GLUT_NUM_MOUSE_BUTTONS:\r
-        /* We should be able to pass NULL when the last argument is zero,\r
-         * but at least one X server has a bug where this causes a segfault.\r
-         *\r
-         * In XFree86/Xorg servers, a mouse wheel is seen as two buttons\r
-         * rather than an Axis; "freeglut_main.c" expects this when\r
-         * checking for a wheel event.\r
-         */\r
-        {\r
-            unsigned char map;\r
-            int nbuttons = XGetPointerMapping(fgDisplay.pDisplay.Display, &map,0);\r
-            return nbuttons;\r
-        }\r
-\r
-    default:\r
-        fgWarning( "glutDeviceGet(): missing enum handle %d", eWhat );\r
-        break;\r
-    }\r
-\r
-    /* And now -- the failure. */\r
-    return -1;\r
-}\r
-\r
-int fgPlatformGlutLayerGet( GLenum eWhat )\r
-{\r
-    /*\r
-     * This is easy as layers are not implemented ;-)\r
-     *\r
-     * XXX Can we merge the UNIX/X11 and WIN32 sections?  Or\r
-     * XXX is overlay support planned?\r
-     */\r
-    switch( eWhat )\r
-    {\r
-    case GLUT_OVERLAY_POSSIBLE:\r
-        return 0;\r
-\r
-    case GLUT_LAYER_IN_USE:\r
-        return GLUT_NORMAL;\r
-\r
-    case GLUT_HAS_OVERLAY:\r
-        return 0;\r
-\r
-    case GLUT_TRANSPARENT_INDEX:\r
-        /*\r
-         * Return just anything, which is always defined as zero\r
-         *\r
-         * XXX HUH?\r
-         */\r
-        return 0;\r
-\r
-    case GLUT_NORMAL_DAMAGED:\r
-        /* XXX Actually I do not know. Maybe. */\r
-        return 0;\r
-\r
-    case GLUT_OVERLAY_DAMAGED:\r
-        return -1;\r
-\r
-    default:\r
-        fgWarning( "glutLayerGet(): missing enum handle %d", eWhat );\r
-        break;\r
-    }\r
-\r
-    /* And fail. That's good. Programs do love failing. */\r
-    return -1;\r
-}\r
-\r
-\r
-int *fgPlatformGlutGetModeValues(GLenum eWhat, int *size)\r
-{\r
-  int *array;\r
-\r
-  int attributes[9];\r
-  GLXFBConfig * fbconfigArray;  /*  Array of FBConfigs  */\r
-  int fbconfigArraySize;        /*  Number of FBConfigs in the array  */\r
-  int attribute_name = 0;\r
-\r
-  array = NULL;\r
-  *size = 0;\r
-\r
-  switch (eWhat)\r
-    {\r
-    case GLUT_AUX:\r
-    case GLUT_MULTISAMPLE:\r
-\r
-      attributes[0] = GLX_BUFFER_SIZE;\r
-      attributes[1] = GLX_DONT_CARE;\r
-\r
-      switch (eWhat)\r
-        {\r
-        case GLUT_AUX:\r
-          /*\r
-            FBConfigs are now sorted by increasing number of auxiliary\r
-            buffers.  We want at least one buffer.\r
-          */\r
-          attributes[2] = GLX_AUX_BUFFERS;\r
-          attributes[3] = 1;\r
-          attributes[4] = None;\r
-\r
-          attribute_name = GLX_AUX_BUFFERS;\r
-\r
-          break;\r
-\r
-\r
-        case GLUT_MULTISAMPLE:\r
-          attributes[2] = GLX_AUX_BUFFERS;\r
-          attributes[3] = GLX_DONT_CARE;\r
-          attributes[4] = GLX_SAMPLE_BUFFERS;\r
-          attributes[5] = 1;\r
-          /*\r
-            FBConfigs are now sorted by increasing number of samples per\r
-            pixel.  We want at least one sample.\r
-          */\r
-          attributes[6] = GLX_SAMPLES;\r
-          attributes[7] = 1;\r
-          attributes[8] = None;\r
-\r
-          attribute_name = GLX_SAMPLES;\r
-\r
-          break;\r
-        }\r
-\r
-      fbconfigArray = glXChooseFBConfig(fgDisplay.pDisplay.Display,\r
-                                        fgDisplay.pDisplay.Screen,\r
-                                        attributes,\r
-                                        &fbconfigArraySize);\r
-\r
-      if (fbconfigArray != NULL)\r
-        {\r
-          int * temp_array;\r
-          int result;   /*  Returned by glXGetFBConfigAttrib. Not checked.  */\r
-          int previous_value;\r
-          int i;\r
-\r
-          temp_array = malloc(sizeof(int) * fbconfigArraySize);\r
-          previous_value = 0;\r
-\r
-          for (i = 0; i < fbconfigArraySize; i++)\r
-            {\r
-              int value;\r
-\r
-              result = glXGetFBConfigAttrib(fgDisplay.pDisplay.Display,\r
-                                            fbconfigArray[i],\r
-                                            attribute_name,\r
-                                            &value);\r
-              if (value > previous_value)\r
-                {\r
-                  temp_array[*size] = value;\r
-                  previous_value = value;\r
-                  (*size)++;\r
-                }\r
-            }\r
-\r
-          array = malloc(sizeof(int) * (*size));\r
-          for (i = 0; i < *size; i++)\r
-            {\r
-              array[i] = temp_array[i];\r
-            }\r
-\r
-          free(temp_array);\r
-          XFree(fbconfigArray);\r
-        }\r
-\r
-      break;\r
-\r
-    default:\r
-      break;\r
-    }\r
-\r
-  return array;\r
-}\r
-\r
-\r
+/*
+ * freeglut_state_x11.c
+ *
+ * X11-specific freeglut state query methods.
+ *
+ * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
+ * Written by John F. Fay, <fayjf@sourceforge.net>
+ * Creation date: Sat Feb 4 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ *
+ *  fgPlatformChooseFBConfig()      -- OK, but what about glutInitDisplayString()?
+ */
+
+/* A helper function to check if a display mode is possible to use */
+GLXFBConfig* fgPlatformChooseFBConfig( int* numcfgs );
+
+/*
+ * Queries the GL context about some attributes
+ */
+int fgPlatformGetConfig( int attribute )
+{
+  int returnValue = 0;
+  int result;  /*  Not checked  */
+
+  if( fgStructure.CurrentWindow )
+      result = glXGetFBConfigAttrib( fgDisplay.pDisplay.Display,
+                                     *(fgStructure.CurrentWindow->Window.pContext.FBConfig),
+                                     attribute,
+                                     &returnValue );
+
+  return returnValue;
+}
+
+int fgPlatformGlutGet ( GLenum eWhat )
+{
+    int nsamples = 0;
+
+    switch( eWhat )
+    {
+    /*
+     * The window/context specific queries are handled mostly by
+     * fgPlatformGetConfig().
+     */
+    case GLUT_WINDOW_NUM_SAMPLES:
+#ifdef GLX_VERSION_1_3
+        glGetIntegerv(GL_SAMPLES, &nsamples);
+#endif
+        return nsamples;
+
+    /*
+     * The rest of GLX queries under X are general enough to use a macro to
+     * check them
+     */
+#   define GLX_QUERY(a,b) case a: return fgPlatformGetConfig( b );
+
+    GLX_QUERY( GLUT_WINDOW_RGBA,                GLX_RGBA                );
+    GLX_QUERY( GLUT_WINDOW_DOUBLEBUFFER,        GLX_DOUBLEBUFFER        );
+    GLX_QUERY( GLUT_WINDOW_BUFFER_SIZE,         GLX_BUFFER_SIZE         );
+    GLX_QUERY( GLUT_WINDOW_STENCIL_SIZE,        GLX_STENCIL_SIZE        );
+    GLX_QUERY( GLUT_WINDOW_DEPTH_SIZE,          GLX_DEPTH_SIZE          );
+    GLX_QUERY( GLUT_WINDOW_RED_SIZE,            GLX_RED_SIZE            );
+    GLX_QUERY( GLUT_WINDOW_GREEN_SIZE,          GLX_GREEN_SIZE          );
+    GLX_QUERY( GLUT_WINDOW_BLUE_SIZE,           GLX_BLUE_SIZE           );
+    GLX_QUERY( GLUT_WINDOW_ALPHA_SIZE,          GLX_ALPHA_SIZE          );
+    GLX_QUERY( GLUT_WINDOW_ACCUM_RED_SIZE,      GLX_ACCUM_RED_SIZE      );
+    GLX_QUERY( GLUT_WINDOW_ACCUM_GREEN_SIZE,    GLX_ACCUM_GREEN_SIZE    );
+    GLX_QUERY( GLUT_WINDOW_ACCUM_BLUE_SIZE,     GLX_ACCUM_BLUE_SIZE     );
+    GLX_QUERY( GLUT_WINDOW_ACCUM_ALPHA_SIZE,    GLX_ACCUM_ALPHA_SIZE    );
+    GLX_QUERY( GLUT_WINDOW_STEREO,              GLX_STEREO              );
+
+#   undef GLX_QUERY
+
+    /* Colormap size is handled in a bit different way than all the rest */
+    case GLUT_WINDOW_COLORMAP_SIZE:
+        if( (fgPlatformGetConfig( GLX_RGBA )) || (fgStructure.CurrentWindow == NULL) )
+        {
+            /*
+             * We've got a RGBA visual, so there is no colormap at all.
+             * The other possibility is that we have no current window set.
+             */
+            return 0;
+        }
+        else
+        {
+          const GLXFBConfig * fbconfig =
+                fgStructure.CurrentWindow->Window.pContext.FBConfig;
+
+          XVisualInfo * visualInfo =
+                glXGetVisualFromFBConfig( fgDisplay.pDisplay.Display, *fbconfig );
+
+          const int result = visualInfo->visual->map_entries;
+
+          XFree(visualInfo);
+
+          return result;
+        }
+
+    /*
+     * Those calls are somewhat similiar, as they use XGetWindowAttributes()
+     * function
+     */
+    case GLUT_WINDOW_X:
+    case GLUT_WINDOW_Y:
+    case GLUT_WINDOW_BORDER_WIDTH:
+    case GLUT_WINDOW_HEADER_HEIGHT:
+    {
+        int x, y;
+        Window w;
+
+        if( fgStructure.CurrentWindow == NULL )
+            return 0;
+
+        XTranslateCoordinates(
+            fgDisplay.pDisplay.Display,
+            fgStructure.CurrentWindow->Window.Handle,
+            fgDisplay.pDisplay.RootWindow,
+            0, 0, &x, &y, &w);
+
+        switch ( eWhat )
+        {
+        case GLUT_WINDOW_X: return x;
+        case GLUT_WINDOW_Y: return y;
+        }
+
+        if ( w == 0 )
+            return 0;
+        XTranslateCoordinates(
+            fgDisplay.pDisplay.Display,
+            fgStructure.CurrentWindow->Window.Handle,
+            w, 0, 0, &x, &y, &w);
+
+        switch ( eWhat )
+        {
+        case GLUT_WINDOW_BORDER_WIDTH:  return x;
+        case GLUT_WINDOW_HEADER_HEIGHT: return y;
+        }
+    }
+
+    case GLUT_WINDOW_WIDTH:
+    case GLUT_WINDOW_HEIGHT:
+    {
+        XWindowAttributes winAttributes;
+
+        if( fgStructure.CurrentWindow == NULL )
+            return 0;
+        XGetWindowAttributes(
+            fgDisplay.pDisplay.Display,
+            fgStructure.CurrentWindow->Window.Handle,
+            &winAttributes
+        );
+        switch ( eWhat )
+        {
+        case GLUT_WINDOW_WIDTH:            return winAttributes.width ;
+        case GLUT_WINDOW_HEIGHT:           return winAttributes.height ;
+        }
+    }
+
+    /* I do not know yet if there will be a fgChooseVisual() function for Win32 */
+    case GLUT_DISPLAY_MODE_POSSIBLE:
+    {
+        /*  We should not have to call fgPlatformChooseFBConfig again here.  */
+        GLXFBConfig * fbconfig;
+        int isPossible;
+
+        fbconfig = fgPlatformChooseFBConfig(NULL);
+
+        if (fbconfig == NULL)
+        {
+            isPossible = 0;
+        }
+        else
+        {
+            isPossible = 1;
+            XFree(fbconfig);
+        }
+
+        return isPossible;
+    }
+
+    /* This is system-dependant */
+    case GLUT_WINDOW_FORMAT_ID:
+        if( fgStructure.CurrentWindow == NULL )
+            return 0;
+
+        return fgPlatformGetConfig( GLX_VISUAL_ID );
+
+    default:
+        fgWarning( "glutGet(): missing enum handle %d", eWhat );
+        break;
+    }
+
+       return -1;
+}
+
+
+int fgPlatformGlutDeviceGet ( GLenum eWhat )
+{
+    switch( eWhat )
+    {
+    case GLUT_HAS_KEYBOARD:
+        /*
+         * X11 has a core keyboard by definition, although it can
+         * be present as a virtual/dummy keyboard. For now, there
+         * is no reliable way to tell if a real keyboard is present.
+         */
+        return 1;
+
+    /* X11 has a mouse by definition */
+    case GLUT_HAS_MOUSE:
+        return 1 ;
+
+    case GLUT_NUM_MOUSE_BUTTONS:
+        /* We should be able to pass NULL when the last argument is zero,
+         * but at least one X server has a bug where this causes a segfault.
+         *
+         * In XFree86/Xorg servers, a mouse wheel is seen as two buttons
+         * rather than an Axis; "freeglut_main.c" expects this when
+         * checking for a wheel event.
+         */
+        {
+            unsigned char map;
+            int nbuttons = XGetPointerMapping(fgDisplay.pDisplay.Display, &map,0);
+            return nbuttons;
+        }
+
+    default:
+        fgWarning( "glutDeviceGet(): missing enum handle %d", eWhat );
+        break;
+    }
+
+    /* And now -- the failure. */
+    return -1;
+}
+
+int fgPlatformGlutLayerGet( GLenum eWhat )
+{
+    /*
+     * This is easy as layers are not implemented ;-)
+     *
+     * XXX Can we merge the UNIX/X11 and WIN32 sections?  Or
+     * XXX is overlay support planned?
+     */
+    switch( eWhat )
+    {
+    case GLUT_OVERLAY_POSSIBLE:
+        return 0;
+
+    case GLUT_LAYER_IN_USE:
+        return GLUT_NORMAL;
+
+    case GLUT_HAS_OVERLAY:
+        return 0;
+
+    case GLUT_TRANSPARENT_INDEX:
+        /*
+         * Return just anything, which is always defined as zero
+         *
+         * XXX HUH?
+         */
+        return 0;
+
+    case GLUT_NORMAL_DAMAGED:
+        /* XXX Actually I do not know. Maybe. */
+        return 0;
+
+    case GLUT_OVERLAY_DAMAGED:
+        return -1;
+
+    default:
+        fgWarning( "glutLayerGet(): missing enum handle %d", eWhat );
+        break;
+    }
+
+    /* And fail. That's good. Programs do love failing. */
+    return -1;
+}
+
+
+int *fgPlatformGlutGetModeValues(GLenum eWhat, int *size)
+{
+  int *array;
+
+  int attributes[9];
+  GLXFBConfig * fbconfigArray;  /*  Array of FBConfigs  */
+  int fbconfigArraySize;        /*  Number of FBConfigs in the array  */
+  int attribute_name = 0;
+
+  array = NULL;
+  *size = 0;
+
+  switch (eWhat)
+    {
+    case GLUT_AUX:
+    case GLUT_MULTISAMPLE:
+
+      attributes[0] = GLX_BUFFER_SIZE;
+      attributes[1] = GLX_DONT_CARE;
+
+      switch (eWhat)
+        {
+        case GLUT_AUX:
+          /*
+            FBConfigs are now sorted by increasing number of auxiliary
+            buffers.  We want at least one buffer.
+          */
+          attributes[2] = GLX_AUX_BUFFERS;
+          attributes[3] = 1;
+          attributes[4] = None;
+
+          attribute_name = GLX_AUX_BUFFERS;
+
+          break;
+
+
+        case GLUT_MULTISAMPLE:
+          attributes[2] = GLX_AUX_BUFFERS;
+          attributes[3] = GLX_DONT_CARE;
+          attributes[4] = GLX_SAMPLE_BUFFERS;
+          attributes[5] = 1;
+          /*
+            FBConfigs are now sorted by increasing number of samples per
+            pixel.  We want at least one sample.
+          */
+          attributes[6] = GLX_SAMPLES;
+          attributes[7] = 1;
+          attributes[8] = None;
+
+          attribute_name = GLX_SAMPLES;
+
+          break;
+        }
+
+      fbconfigArray = glXChooseFBConfig(fgDisplay.pDisplay.Display,
+                                        fgDisplay.pDisplay.Screen,
+                                        attributes,
+                                        &fbconfigArraySize);
+
+      if (fbconfigArray != NULL)
+        {
+          int * temp_array;
+          int result;   /*  Returned by glXGetFBConfigAttrib. Not checked.  */
+          int previous_value;
+          int i;
+
+          temp_array = malloc(sizeof(int) * fbconfigArraySize);
+          previous_value = 0;
+
+          for (i = 0; i < fbconfigArraySize; i++)
+            {
+              int value;
+
+              result = glXGetFBConfigAttrib(fgDisplay.pDisplay.Display,
+                                            fbconfigArray[i],
+                                            attribute_name,
+                                            &value);
+              if (value > previous_value)
+                {
+                  temp_array[*size] = value;
+                  previous_value = value;
+                  (*size)++;
+                }
+            }
+
+          array = malloc(sizeof(int) * (*size));
+          for (i = 0; i < *size; i++)
+            {
+              array[i] = temp_array[i];
+            }
+
+          free(temp_array);
+          XFree(fbconfigArray);
+        }
+
+      break;
+
+    default:
+      break;
+    }
+
+  return array;
+}
+
+
index 6fc0eda..df62a58 100644 (file)
@@ -1,40 +1,40 @@
-/*\r
- * freeglut_structure.c\r
- *\r
- * Windows and menus need tree structure\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Copied for Platform code by Evan Felix <karcaw at gmail.com>\r
- * Creation date: Thur Feb 2 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#include <GL/freeglut.h>\r
-#include "../Common/freeglut_internal.h"\r
-\r
-extern SFG_Structure fgStructure;\r
-\r
-void fgPlatformCreateWindow ( SFG_Window *window )\r
-{\r
-    window->Window.pContext.FBConfig = NULL;\r
-\r
-    window->State.pWState.OldHeight = window->State.pWState.OldWidth = -1;\r
-}\r
-\r
+/*
+ * freeglut_structure.c
+ *
+ * Windows and menus need tree structure
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Copied for Platform code by Evan Felix <karcaw at gmail.com>
+ * Creation date: Thur Feb 2 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <GL/freeglut.h>
+#include "../Common/freeglut_internal.h"
+
+extern SFG_Structure fgStructure;
+
+void fgPlatformCreateWindow ( SFG_Window *window )
+{
+    window->Window.pContext.FBConfig = NULL;
+
+    window->State.pWState.OldHeight = window->State.pWState.OldWidth = -1;
+}
+
index f4d50e1..0fa4105 100644 (file)
-/*\r
- * freeglut_window_x11.c\r
- *\r
- * Window management methods for X11\r
- *\r
- * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.\r
- * Written by Pawel W. Olszta, <olszta@sourceforge.net>\r
- * Copied for Platform code by Evan Felix <karcaw at gmail.com>\r
- * Creation date: Thur Feb 2 2012\r
- *\r
- * Permission is hereby granted, free of charge, to any person obtaining a\r
- * copy of this software and associated documentation files (the "Software"),\r
- * to deal in the Software without restriction, including without limitation\r
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
- * and/or sell copies of the Software, and to permit persons to whom the\r
- * Software is furnished to do so, subject to the following conditions:\r
- *\r
- * The above copyright notice and this permission notice shall be included\r
- * in all copies or substantial portions of the Software.\r
- *\r
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL\r
- * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
- */\r
-\r
-#define FREEGLUT_BUILDING_LIB\r
-#include <GL/freeglut.h>\r
-#include <limits.h>  /* LONG_MAX */\r
-#include <unistd.h>  /* usleep */\r
-#include "../Common/freeglut_internal.h"\r
-\r
-/* pushing attribute/value pairs into an array */\r
-#define ATTRIB(a) attributes[where++]=(a)\r
-#define ATTRIB_VAL(a,v) {ATTRIB(a); ATTRIB(v);}\r
-\r
-\r
-#ifndef GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB\r
-#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2\r
-#endif\r
-\r
-#ifndef GLX_CONTEXT_MAJOR_VERSION_ARB\r
-#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091\r
-#endif\r
-\r
-#ifndef GLX_CONTEXT_MINOR_VERSION_ARB\r
-#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092\r
-#endif\r
-\r
-#ifndef GLX_CONTEXT_FLAGS_ARB\r
-#define GLX_CONTEXT_FLAGS_ARB 0x2094\r
-#endif\r
-\r
-#ifndef GLX_CONTEXT_PROFILE_MASK_ARB\r
-#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126\r
-#endif\r
-\r
-#ifndef GLX_CONTEXT_DEBUG_BIT_ARB\r
-#define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001\r
-#endif\r
-\r
-#ifndef GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB\r
-#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002\r
-#endif\r
-\r
-#ifndef GLX_CONTEXT_CORE_PROFILE_BIT_ARB\r
-#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001\r
-#endif\r
-\r
-#ifndef GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB\r
-#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002\r
-#endif\r
-\r
-#ifndef GLX_RGBA_FLOAT_TYPE\r
-#define GLX_RGBA_FLOAT_TYPE 0x20B9\r
-#endif\r
-\r
-#ifndef GLX_RGBA_FLOAT_BIT\r
-#define GLX_RGBA_FLOAT_BIT 0x00000004\r
-#endif\r
-\r
-\r
-/*\r
- * Chooses a visual basing on the current display mode settings\r
- */\r
-\r
-GLXFBConfig* fgPlatformChooseFBConfig( int *numcfgs )\r
-{\r
-  GLboolean wantIndexedMode = GL_FALSE;\r
-  int attributes[ 100 ];\r
-  int where = 0, numAuxBuffers;\r
-\r
-  /* First we have to process the display mode settings... */\r
-  if( fgState.DisplayMode & GLUT_INDEX ) {\r
-    ATTRIB_VAL( GLX_BUFFER_SIZE, 8 );\r
-    /*  Buffer size is selected later.  */\r
-\r
-    ATTRIB_VAL( GLX_RENDER_TYPE, GLX_COLOR_INDEX_BIT );\r
-    wantIndexedMode = GL_TRUE;\r
-  } else {\r
-    ATTRIB_VAL( GLX_RED_SIZE,   1 );\r
-    ATTRIB_VAL( GLX_GREEN_SIZE, 1 );\r
-    ATTRIB_VAL( GLX_BLUE_SIZE,  1 );\r
-    if( fgState.DisplayMode & GLUT_ALPHA ) {\r
-      ATTRIB_VAL( GLX_ALPHA_SIZE, 1 );\r
-    }\r
-  }\r
-\r
-  if( fgState.DisplayMode & GLUT_DOUBLE ) {\r
-    ATTRIB_VAL( GLX_DOUBLEBUFFER, True );\r
-  }\r
-\r
-  if( fgState.DisplayMode & GLUT_STEREO ) {\r
-    ATTRIB_VAL( GLX_STEREO, True );\r
-  }\r
-\r
-  if( fgState.DisplayMode & GLUT_DEPTH ) {\r
-    ATTRIB_VAL( GLX_DEPTH_SIZE, 1 );\r
-  }\r
-\r
-  if( fgState.DisplayMode & GLUT_STENCIL ) {\r
-    ATTRIB_VAL( GLX_STENCIL_SIZE, 1 );\r
-  }\r
-\r
-  if( fgState.DisplayMode & GLUT_ACCUM ) {\r
-    ATTRIB_VAL( GLX_ACCUM_RED_SIZE, 1 );\r
-    ATTRIB_VAL( GLX_ACCUM_GREEN_SIZE, 1 );\r
-    ATTRIB_VAL( GLX_ACCUM_BLUE_SIZE, 1 );\r
-    if( fgState.DisplayMode & GLUT_ALPHA ) {\r
-      ATTRIB_VAL( GLX_ACCUM_ALPHA_SIZE, 1 );\r
-    }\r
-  }\r
-\r
-  numAuxBuffers = fghNumberOfAuxBuffersRequested();\r
-  if ( numAuxBuffers > 0 ) {\r
-    ATTRIB_VAL( GLX_AUX_BUFFERS, numAuxBuffers );\r
-  }\r
-\r
-  if( fgState.DisplayMode & GLUT_SRGB ) {\r
-    ATTRIB_VAL( GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB, True );\r
-  }\r
-\r
-  if (fgState.DisplayMode & GLUT_MULTISAMPLE) {\r
-    ATTRIB_VAL(GLX_SAMPLE_BUFFERS, 1);\r
-    ATTRIB_VAL(GLX_SAMPLES, fgState.SampleNumber);\r
-  }\r
-\r
-  /* Push a terminator at the end of the list */\r
-  ATTRIB( None );\r
-\r
-    {\r
-        GLXFBConfig * fbconfigArray;  /*  Array of FBConfigs  */\r
-        GLXFBConfig * fbconfig;       /*  The FBConfig we want  */\r
-        int fbconfigArraySize;        /*  Number of FBConfigs in the array  */\r
-\r
-\r
-        /*  Get all FBConfigs that match "attributes".  */\r
-        fbconfigArray = glXChooseFBConfig( fgDisplay.pDisplay.Display,\r
-                                           fgDisplay.pDisplay.Screen,\r
-                                           attributes,\r
-                                           &fbconfigArraySize );\r
-\r
-        if (fbconfigArray != NULL)\r
-        {\r
-            int result;  /* Returned by glXGetFBConfigAttrib, not checked. */\r
-\r
-\r
-            if( wantIndexedMode )\r
-            {\r
-                /*\r
-                 * In index mode, we want the largest buffer size, i.e. visual\r
-                 * depth.  Here, FBConfigs are sorted by increasing buffer size\r
-                 * first, so FBConfigs with the largest size come last.\r
-                 */\r
-\r
-                int bufferSizeMin, bufferSizeMax;\r
-\r
-                /*  Get bufferSizeMin.  */\r
-                result =\r
-                  glXGetFBConfigAttrib( fgDisplay.pDisplay.Display,\r
-                                        fbconfigArray[0],\r
-                                        GLX_BUFFER_SIZE,\r
-                                        &bufferSizeMin );\r
-                /*  Get bufferSizeMax.  */\r
-                result =\r
-                  glXGetFBConfigAttrib( fgDisplay.pDisplay.Display,\r
-                                        fbconfigArray[fbconfigArraySize - 1],\r
-                                        GLX_BUFFER_SIZE,\r
-                                        &bufferSizeMax );\r
-\r
-                if (bufferSizeMax > bufferSizeMin)\r
-                {\r
-                    /* \r
-                     * Free and reallocate fbconfigArray, keeping only FBConfigs\r
-                     * with the largest buffer size.\r
-                     */\r
-                    XFree(fbconfigArray);\r
-\r
-                    /*  Add buffer size token at the end of the list.  */\r
-                    where--;\r
-                    ATTRIB_VAL( GLX_BUFFER_SIZE, bufferSizeMax );\r
-                    ATTRIB( None );\r
-\r
-                    fbconfigArray = glXChooseFBConfig( fgDisplay.pDisplay.Display,\r
-                                                       fgDisplay.pDisplay.Screen,\r
-                                                       attributes,\r
-                                                       &fbconfigArraySize );\r
-                }\r
-            }\r
-\r
-            /*\r
-             * We now have an array of FBConfigs, the first one being the "best"\r
-             * one.  So we should return only this FBConfig:\r
-             *\r
-             * int fbconfigXID;\r
-             *\r
-             *  - pick the XID of the FBConfig we want\r
-             * result = glXGetFBConfigAttrib( fgDisplay.pDisplay.Display,\r
-             *                                fbconfigArray[0],\r
-             *                                GLX_FBCONFIG_ID,\r
-             *                                &fbconfigXID );\r
-             *\r
-             * - free the array\r
-             * XFree(fbconfigArray);\r
-             *\r
-             * - reset "attributes" with the XID\r
-             * where = 0;\r
-             * ATTRIB_VAL( GLX_FBCONFIG_ID, fbconfigXID );\r
-             * ATTRIB( None );\r
-             *\r
-             * - get our FBConfig only\r
-             * fbconfig = glXChooseFBConfig( fgDisplay.pDisplay.Display,\r
-             *                               fgDisplay.pDisplay.Screen,\r
-             *                               attributes,\r
-             *                               &fbconfigArraySize );\r
-             *\r
-             * However, for some configurations (for instance multisampling with\r
-             * Mesa 6.5.2 and ATI drivers), this does not work:\r
-             * glXChooseFBConfig returns NULL, whereas fbconfigXID is a valid\r
-             * XID.  Further investigation is needed.\r
-             *\r
-             * So, for now, we return the whole array of FBConfigs.  This should\r
-             * not produce any side effects elsewhere.\r
-             */\r
-            fbconfig = fbconfigArray;\r
-        }\r
-        else\r
-        {\r
-           fbconfig = NULL;\r
-        }\r
-\r
-       if (numcfgs)\r
-               *numcfgs = fbconfigArraySize;\r
-\r
-        return fbconfig;\r
-    }\r
-}\r
-\r
-\r
-static void fghFillContextAttributes( int *attributes ) {\r
-  int where = 0, contextFlags, contextProfile;\r
-\r
-  if ( !fghIsLegacyContextVersionRequested() ) {\r
-    ATTRIB_VAL( GLX_CONTEXT_MAJOR_VERSION_ARB, fgState.MajorVersion );\r
-    ATTRIB_VAL( GLX_CONTEXT_MINOR_VERSION_ARB, fgState.MinorVersion );\r
-  }\r
-\r
-  contextFlags =\r
-    fghMapBit( fgState.ContextFlags, GLUT_DEBUG, GLX_CONTEXT_DEBUG_BIT_ARB ) |\r
-    fghMapBit( fgState.ContextFlags, GLUT_FORWARD_COMPATIBLE, GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB );\r
-  if ( contextFlags != 0 ) {\r
-    ATTRIB_VAL( GLX_CONTEXT_FLAGS_ARB, contextFlags );\r
-  }\r
-\r
-  contextProfile =\r
-    fghMapBit( fgState.ContextProfile, GLUT_CORE_PROFILE, GLX_CONTEXT_CORE_PROFILE_BIT_ARB ) |\r
-    fghMapBit( fgState.ContextProfile, GLUT_COMPATIBILITY_PROFILE, GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB );\r
-  if ( contextProfile != 0 ) {\r
-    ATTRIB_VAL( GLX_CONTEXT_PROFILE_MASK_ARB, contextProfile );\r
-  }\r
-\r
-  ATTRIB( 0 );\r
-}\r
-\r
-typedef GLXContext (*CreateContextAttribsProc)(Display *dpy, GLXFBConfig config,\r
-                                              GLXContext share_list, Bool direct,\r
-                                              const int *attrib_list);\r
-\r
-static GLXContext fghCreateNewContext( SFG_Window* window )\r
-{\r
-  /* for color model calculation */\r
-  int menu = ( window->IsMenu && !fgStructure.MenuContext );\r
-  int index_mode = ( fgState.DisplayMode & GLUT_INDEX );\r
-\r
-  /* "classic" context creation */\r
-  Display *dpy = fgDisplay.pDisplay.Display;\r
-  GLXFBConfig config = *(window->Window.pContext.FBConfig);\r
-  int render_type = ( !menu && index_mode ) ? GLX_COLOR_INDEX_TYPE : GLX_RGBA_TYPE;\r
-  GLXContext share_list = NULL;\r
-  Bool direct = ( fgState.DirectContext != GLUT_FORCE_INDIRECT_CONTEXT );\r
-  GLXContext context;\r
-\r
-  /* new context creation */\r
-  int attributes[9];\r
-  CreateContextAttribsProc createContextAttribs = (CreateContextAttribsProc) fgPlatformGetProcAddress( "glXCreateContextAttribsARB" );\r
\r
-  /* glXCreateContextAttribsARB not found, yet the user has requested the new context creation */\r
-  if ( !createContextAttribs && !fghIsLegacyContextRequested() ) {\r
-    fgWarning( "OpenGL >2.1 context requested but glXCreateContextAttribsARB is not available! Falling back to legacy context creation" );\r
-       fgState.MajorVersion = 2;\r
-       fgState.MinorVersion = 1;\r
-  }\r
-\r
-  /* If nothing fancy has been required, simply use the old context creation GLX API entry */\r
-  if ( fghIsLegacyContextRequested() || !createContextAttribs )\r
-  {\r
-    context = glXCreateNewContext( dpy, config, render_type, share_list, direct );\r
-    if ( context == NULL ) {\r
-      fghContextCreationError();\r
-    }\r
-    return context;\r
-  }\r
-\r
-  /* color index mode is not available anymore with OpenGL 3.0 */\r
-  if ( render_type == GLX_COLOR_INDEX_TYPE ) {\r
-    fgWarning( "color index mode is deprecated, using RGBA mode" );\r
-  }\r
-\r
-  fghFillContextAttributes( attributes );\r
-\r
-  context = createContextAttribs( dpy, config, share_list, direct, attributes );\r
-  if ( context == NULL ) {\r
-    fghContextCreationError();\r
-  }\r
-  return context;\r
-}\r
-\r
-\r
-#define _NET_WM_STATE_TOGGLE    2\r
-static int fghResizeFullscrToggle(void)\r
-{\r
-    XWindowAttributes attributes;\r
-\r
-    if(glutGet(GLUT_FULL_SCREEN)) {\r
-        /* restore original window size */\r
-        SFG_Window *win = fgStructure.CurrentWindow;\r
-        fgStructure.CurrentWindow->State.NeedToResize = GL_TRUE;\r
-        fgStructure.CurrentWindow->State.Width  = win->State.pWState.OldWidth;\r
-        fgStructure.CurrentWindow->State.Height = win->State.pWState.OldHeight;\r
-\r
-    } else {\r
-        /* resize the window to cover the entire screen */\r
-        XGetWindowAttributes(fgDisplay.pDisplay.Display,\r
-                fgStructure.CurrentWindow->Window.Handle,\r
-                &attributes);\r
-        \r
-        /*\r
-         * The "x" and "y" members of "attributes" are the window's coordinates\r
-         * relative to its parent, i.e. to the decoration window.\r
-         */\r
-        XMoveResizeWindow(fgDisplay.pDisplay.Display,\r
-                fgStructure.CurrentWindow->Window.Handle,\r
-                -attributes.x,\r
-                -attributes.y,\r
-                fgDisplay.ScreenWidth,\r
-                fgDisplay.ScreenHeight);\r
-    }\r
-    return 0;\r
-}\r
-\r
-static int fghEwmhFullscrToggle(void)\r
-{\r
-    XEvent xev;\r
-    long evmask = SubstructureRedirectMask | SubstructureNotifyMask;\r
-\r
-    if(!fgDisplay.pDisplay.State || !fgDisplay.pDisplay.StateFullScreen) {\r
-        return -1;\r
-    }\r
-\r
-    xev.type = ClientMessage;\r
-    xev.xclient.window = fgStructure.CurrentWindow->Window.Handle;\r
-    xev.xclient.message_type = fgDisplay.pDisplay.State;\r
-    xev.xclient.format = 32;\r
-    xev.xclient.data.l[0] = _NET_WM_STATE_TOGGLE;\r
-    xev.xclient.data.l[1] = fgDisplay.pDisplay.StateFullScreen;\r
-    xev.xclient.data.l[2] = 0; /* no second property to toggle */\r
-    xev.xclient.data.l[3] = 1; /* source indication: application */\r
-    xev.xclient.data.l[4] = 0; /* unused */\r
-\r
-    if(!XSendEvent(fgDisplay.pDisplay.Display, fgDisplay.pDisplay.RootWindow, 0, evmask, &xev)) {\r
-        return -1;\r
-    }\r
-    return 0;\r
-}\r
-\r
-static int fghToggleFullscreen(void)\r
-{\r
-    /* first try the EWMH (_NET_WM_STATE) method ... */\r
-    if(fghEwmhFullscrToggle() != -1) {\r
-        return 0;\r
-    }\r
-\r
-    /* fall back to resizing the window */\r
-    if(fghResizeFullscrToggle() != -1) {\r
-        return 0;\r
-    }\r
-    return -1;\r
-}\r
-\r
-void fgPlatformSetWindow ( SFG_Window *window )\r
-{\r
-    if ( window )\r
-    {\r
-        glXMakeContextCurrent(\r
-            fgDisplay.pDisplay.Display,\r
-            window->Window.Handle,\r
-            window->Window.Handle,\r
-            window->Window.Context\r
-        );\r
-    }\r
-}\r
-\r
-static Bool fghWindowIsVisible( Display *display, XEvent *event, XPointer arg)\r
-{\r
-    Window window = (Window)arg;\r
-    return (event->type == MapNotify) && (event->xmap.window == window);\r
-}\r
-\r
-/*\r
- * Opens a window. Requires a SFG_Window object created and attached\r
- * to the freeglut structure. OpenGL context is created here.\r
- */\r
-void fgPlatformOpenWindow( SFG_Window* window, const char* title,\r
-                           GLboolean positionUse, int x, int y,\r
-                           GLboolean sizeUse, int w, int h,\r
-                           GLboolean gameMode, GLboolean isSubWindow )\r
-{\r
-    XVisualInfo * visualInfo = NULL;\r
-    XSetWindowAttributes winAttr;\r
-    XTextProperty textProperty;\r
-    XSizeHints sizeHints;\r
-    XWMHints wmHints;\r
-    XEvent eventReturnBuffer; /* return buffer required for a call */\r
-    unsigned long mask;\r
-    int num_FBConfigs, i;\r
-    unsigned int current_DisplayMode = fgState.DisplayMode ;\r
-\r
-    /* Save the display mode if we are creating a menu window */\r
-    if( window->IsMenu && ( ! fgStructure.MenuContext ) )\r
-        fgState.DisplayMode = GLUT_DOUBLE | GLUT_RGB ;\r
-\r
-    window->Window.pContext.FBConfig = fgPlatformChooseFBConfig( &num_FBConfigs );\r
-\r
-    if( window->IsMenu && ( ! fgStructure.MenuContext ) )\r
-        fgState.DisplayMode = current_DisplayMode ;\r
-\r
-    if( ! window->Window.pContext.FBConfig )\r
-    {\r
-        /*\r
-         * The "fgPlatformChooseFBConfig" returned a null meaning that the visual\r
-         * context is not available.\r
-         * Try a couple of variations to see if they will work.\r
-         */\r
-        if( !( fgState.DisplayMode & GLUT_DOUBLE ) )\r
-        {\r
-            fgState.DisplayMode |= GLUT_DOUBLE ;\r
-            window->Window.pContext.FBConfig = fgPlatformChooseFBConfig( &num_FBConfigs );\r
-            fgState.DisplayMode &= ~GLUT_DOUBLE;\r
-        }\r
-\r
-        if( fgState.DisplayMode & GLUT_MULTISAMPLE )\r
-        {\r
-            fgState.DisplayMode &= ~GLUT_MULTISAMPLE ;\r
-            window->Window.pContext.FBConfig = fgPlatformChooseFBConfig( &num_FBConfigs );\r
-            fgState.DisplayMode |= GLUT_MULTISAMPLE;\r
-        }\r
-    }\r
-\r
-    FREEGLUT_INTERNAL_ERROR_EXIT( window->Window.pContext.FBConfig != NULL,\r
-                                  "FBConfig with necessary capabilities not found", "fgOpenWindow" );\r
-\r
-    /*  Get the X visual.  */\r
-    for (i = 0; i < num_FBConfigs; i++) {\r
-           visualInfo = glXGetVisualFromFBConfig( fgDisplay.pDisplay.Display,\r
-                                                  window->Window.pContext.FBConfig[i] );\r
-           if (visualInfo)\r
-               break;\r
-    }\r
-\r
-    FREEGLUT_INTERNAL_ERROR_EXIT( visualInfo != NULL,\r
-                                  "visualInfo could not be retrieved from FBConfig", "fgOpenWindow" );\r
-\r
-    /*\r
-     * XXX HINT: the masks should be updated when adding/removing callbacks.\r
-     * XXX       This might speed up message processing. Is that true?\r
-     * XXX\r
-     * XXX A: Not appreciably, but it WILL make it easier to debug.\r
-     * XXX    Try tracing old GLUT and try tracing freeglut.  Old GLUT\r
-     * XXX    turns off events that it doesn't need and is a whole lot\r
-     * XXX    more pleasant to trace.  (Think mouse-motion!  Tons of\r
-     * XXX    ``bonus'' GUI events stream in.)\r
-     */\r
-    winAttr.event_mask        =\r
-        StructureNotifyMask | SubstructureNotifyMask | ExposureMask |\r
-        ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyReleaseMask |\r
-        VisibilityChangeMask | EnterWindowMask | LeaveWindowMask |\r
-        PointerMotionMask | ButtonMotionMask;\r
-    winAttr.background_pixmap = None;\r
-    winAttr.background_pixel  = 0;\r
-    winAttr.border_pixel      = 0;\r
-\r
-    winAttr.colormap = XCreateColormap(\r
-        fgDisplay.pDisplay.Display, fgDisplay.pDisplay.RootWindow,\r
-        visualInfo->visual, AllocNone\r
-    );\r
-\r
-    mask = CWBackPixmap | CWBorderPixel | CWColormap | CWEventMask;\r
-\r
-    if( window->IsMenu || ( gameMode == GL_TRUE ) )\r
-    {\r
-        winAttr.override_redirect = True;\r
-        mask |= CWOverrideRedirect;\r
-    }\r
-\r
-    if( ! positionUse )\r
-        x = y = -1; /* default window position */\r
-    if( ! sizeUse )\r
-        w = h = 300; /* default window size */\r
-\r
-    window->Window.Handle = XCreateWindow(\r
-        fgDisplay.pDisplay.Display,\r
-        window->Parent == NULL ? fgDisplay.pDisplay.RootWindow :\r
-        window->Parent->Window.Handle,\r
-        x, y, w, h, 0,\r
-        visualInfo->depth, InputOutput,\r
-        visualInfo->visual, mask,\r
-        &winAttr\r
-    );\r
-\r
-    /*\r
-     * The GLX context creation, possibly trying the direct context rendering\r
-     *  or else use the current context if the user has so specified\r
-     */\r
-\r
-    if( window->IsMenu )\r
-    {\r
-        /*\r
-         * If there isn't already an OpenGL rendering context for menu\r
-         * windows, make one\r
-         */\r
-        if( !fgStructure.MenuContext )\r
-        {\r
-            fgStructure.MenuContext =\r
-                (SFG_MenuContext *)malloc( sizeof(SFG_MenuContext) );\r
-            fgStructure.MenuContext->MContext = fghCreateNewContext( window );\r
-        }\r
-\r
-        /* window->Window.Context = fgStructure.MenuContext->MContext; */\r
-        window->Window.Context = fghCreateNewContext( window );\r
-    }\r
-    else if( fgState.UseCurrentContext )\r
-    {\r
-        window->Window.Context = glXGetCurrentContext( );\r
-\r
-        if( ! window->Window.Context )\r
-            window->Window.Context = fghCreateNewContext( window );\r
-    }\r
-    else\r
-        window->Window.Context = fghCreateNewContext( window );\r
-\r
-#if !defined( __FreeBSD__ ) && !defined( __NetBSD__ )\r
-    if(  !glXIsDirect( fgDisplay.pDisplay.Display, window->Window.Context ) )\r
-    {\r
-      if( fgState.DirectContext == GLUT_FORCE_DIRECT_CONTEXT )\r
-        fgError( "Unable to force direct context rendering for window '%s'",\r
-                 title );\r
-    }\r
-#endif\r
-\r
-    /*\r
-     * XXX Assume the new window is visible by default\r
-     * XXX Is this a  safe assumption?\r
-     */\r
-    window->State.Visible = GL_TRUE;\r
-\r
-    sizeHints.flags = 0;\r
-    if ( positionUse )\r
-        sizeHints.flags |= USPosition;\r
-    if ( sizeUse )\r
-        sizeHints.flags |= USSize;\r
-\r
-    /*\r
-     * Fill in the size hints values now (the x, y, width and height\r
-     * settings are obsolete, are there any more WMs that support them?)\r
-     * Unless the X servers actually stop supporting these, we should\r
-     * continue to fill them in.  It is *not* our place to tell the user\r
-     * that they should replace a window manager that they like, and which\r
-     * works, just because *we* think that it's not "modern" enough.\r
-     */\r
-    sizeHints.x      = x;\r
-    sizeHints.y      = y;\r
-    sizeHints.width  = w;\r
-    sizeHints.height = h;\r
-\r
-    wmHints.flags = StateHint;\r
-    wmHints.initial_state = fgState.ForceIconic ? IconicState : NormalState;\r
-    /* Prepare the window and iconified window names... */\r
-    XStringListToTextProperty( (char **) &title, 1, &textProperty );\r
-\r
-    XSetWMProperties(\r
-        fgDisplay.pDisplay.Display,\r
-        window->Window.Handle,\r
-        &textProperty,\r
-        &textProperty,\r
-        0,\r
-        0,\r
-        &sizeHints,\r
-        &wmHints,\r
-        NULL\r
-    );\r
-    XFree( textProperty.value );\r
-\r
-    XSetWMProtocols( fgDisplay.pDisplay.Display, window->Window.Handle,\r
-                     &fgDisplay.pDisplay.DeleteWindow, 1 );\r
-\r
-    glXMakeContextCurrent(\r
-        fgDisplay.pDisplay.Display,\r
-        window->Window.Handle,\r
-        window->Window.Handle,\r
-        window->Window.Context\r
-    );\r
-\r
-    /* register extension events _before_ window is mapped */\r
-    #ifdef HAVE_X11_EXTENSIONS_XINPUT2_H\r
-       fgRegisterDevices( fgDisplay.pDisplay.Display, &(window->Window.Handle) );\r
-    #endif\r
-\r
-    XMapWindow( fgDisplay.pDisplay.Display, window->Window.Handle );\r
-\r
-    XFree(visualInfo);\r
-\r
-    if( !isSubWindow)\r
-        XPeekIfEvent( fgDisplay.pDisplay.Display, &eventReturnBuffer, &fghWindowIsVisible, (XPointer)(window->Window.Handle) );\r
-}\r
-\r
-\r
-/*\r
- * Closes a window, destroying the frame and OpenGL context\r
- */\r
-void fgPlatformCloseWindow( SFG_Window* window )\r
-{\r
-    if( window->Window.Context )\r
-        glXDestroyContext( fgDisplay.pDisplay.Display, window->Window.Context );\r
-    XFree( window->Window.pContext.FBConfig );\r
-\r
-    if( window->Window.Handle ) {\r
-        XDestroyWindow( fgDisplay.pDisplay.Display, window->Window.Handle );\r
-    }\r
-    /* XFlush( fgDisplay.pDisplay.Display ); */ /* XXX Shouldn't need this */\r
-}\r
-\r
-\r
-/*\r
- * This function makes the current window visible\r
- */\r
-void fgPlatformGlutShowWindow( void )\r
-{\r
-    XMapWindow( fgDisplay.pDisplay.Display, fgStructure.CurrentWindow->Window.Handle );\r
-    XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */\r
-}\r
-\r
-/*\r
- * This function hides the current window\r
- */\r
-void fgPlatformGlutHideWindow( void )\r
-{\r
-    if( fgStructure.CurrentWindow->Parent == NULL )\r
-        XWithdrawWindow( fgDisplay.pDisplay.Display,\r
-                         fgStructure.CurrentWindow->Window.Handle,\r
-                         fgDisplay.pDisplay.Screen );\r
-    else\r
-        XUnmapWindow( fgDisplay.pDisplay.Display,\r
-                      fgStructure.CurrentWindow->Window.Handle );\r
-    XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */\r
-}\r
-\r
-/*\r
- * Iconify the current window (top-level windows only)\r
- */\r
-void fgPlatformGlutIconifyWindow( void )\r
-{\r
-    XIconifyWindow( fgDisplay.pDisplay.Display, fgStructure.CurrentWindow->Window.Handle,\r
-                    fgDisplay.pDisplay.Screen );\r
-    XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */\r
-}\r
-\r
-/*\r
- * Set the current window's title\r
- */\r
-void fgPlatformGlutSetWindowTitle( const char* title )\r
-{\r
-    XTextProperty text;\r
-\r
-    text.value = (unsigned char *) title;\r
-    text.encoding = XA_STRING;\r
-    text.format = 8;\r
-    text.nitems = strlen( title );\r
-\r
-    XSetWMName(\r
-        fgDisplay.pDisplay.Display,\r
-        fgStructure.CurrentWindow->Window.Handle,\r
-        &text\r
-    );\r
-\r
-    XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */\r
-}\r
-\r
-/*\r
- * Set the current window's iconified title\r
- */\r
-void fgPlatformGlutSetIconTitle( const char* title )\r
-{\r
-    XTextProperty text;\r
-\r
-    text.value = (unsigned char *) title;\r
-    text.encoding = XA_STRING;\r
-    text.format = 8;\r
-    text.nitems = strlen( title );\r
-\r
-    XSetWMIconName(\r
-        fgDisplay.pDisplay.Display,\r
-        fgStructure.CurrentWindow->Window.Handle,\r
-        &text\r
-    );\r
-\r
-    XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */\r
-}\r
-\r
-/*\r
- * Change the current window's position\r
- */\r
-void fgPlatformGlutPositionWindow( int x, int y )\r
-{\r
-    XMoveWindow( fgDisplay.pDisplay.Display, fgStructure.CurrentWindow->Window.Handle,\r
-                 x, y );\r
-    XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */\r
-}\r
-\r
-/*\r
- * Lowers the current window (by Z order change)\r
- */\r
-void fgPlatformGlutPushWindow( void )\r
-{\r
-    XLowerWindow( fgDisplay.pDisplay.Display, fgStructure.CurrentWindow->Window.Handle );\r
-}\r
-\r
-/*\r
- * Raises the current window (by Z order change)\r
- */\r
-void fgPlatformGlutPopWindow( void )\r
-{\r
-    XRaiseWindow( fgDisplay.pDisplay.Display, fgStructure.CurrentWindow->Window.Handle );\r
-}\r
-\r
-/*\r
- * Resize the current window so that it fits the whole screen\r
- */\r
-void fgPlatformGlutFullScreen( SFG_Window *win )\r
-{\r
-    if(!glutGet(GLUT_FULL_SCREEN)) {\r
-        if(fghToggleFullscreen() != -1) {\r
-            win->State.IsFullscreen = GL_TRUE;\r
-        }\r
-    }\r
-}\r
-\r
-/*\r
- * If we are fullscreen, resize the current window back to its original size\r
- */\r
-void fgPlatformGlutLeaveFullScreen( SFG_Window *win )\r
-{\r
-    if(glutGet(GLUT_FULL_SCREEN)) {\r
-        if(fghToggleFullscreen() != -1) {\r
-            win->State.IsFullscreen = GL_FALSE;\r
-        }\r
-    }\r
-}\r
-\r
-/*\r
- * Toggle the window's full screen state.\r
- */\r
-void fgPlatformGlutFullScreenToggle( SFG_Window *win )\r
-{\r
-    if(fghToggleFullscreen() != -1) {\r
-        win->State.IsFullscreen = !win->State.IsFullscreen;\r
-    }\r
-}\r
-\r
+/*
+ * freeglut_window_x11.c
+ *
+ * Window management methods for X11
+ *
+ * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved.
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Copied for Platform code by Evan Felix <karcaw at gmail.com>
+ * Creation date: Thur Feb 2 2012
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#define FREEGLUT_BUILDING_LIB
+#include <GL/freeglut.h>
+#include <limits.h>  /* LONG_MAX */
+#include <unistd.h>  /* usleep */
+#include "../Common/freeglut_internal.h"
+
+/* pushing attribute/value pairs into an array */
+#define ATTRIB(a) attributes[where++]=(a)
+#define ATTRIB_VAL(a,v) {ATTRIB(a); ATTRIB(v);}
+
+
+#ifndef GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB
+#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2
+#endif
+
+#ifndef GLX_CONTEXT_MAJOR_VERSION_ARB
+#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091
+#endif
+
+#ifndef GLX_CONTEXT_MINOR_VERSION_ARB
+#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092
+#endif
+
+#ifndef GLX_CONTEXT_FLAGS_ARB
+#define GLX_CONTEXT_FLAGS_ARB 0x2094
+#endif
+
+#ifndef GLX_CONTEXT_PROFILE_MASK_ARB
+#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126
+#endif
+
+#ifndef GLX_CONTEXT_DEBUG_BIT_ARB
+#define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001
+#endif
+
+#ifndef GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB
+#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002
+#endif
+
+#ifndef GLX_CONTEXT_CORE_PROFILE_BIT_ARB
+#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
+#endif
+
+#ifndef GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB
+#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
+#endif
+
+#ifndef GLX_RGBA_FLOAT_TYPE
+#define GLX_RGBA_FLOAT_TYPE 0x20B9
+#endif
+
+#ifndef GLX_RGBA_FLOAT_BIT
+#define GLX_RGBA_FLOAT_BIT 0x00000004
+#endif
+
+
+/*
+ * Chooses a visual basing on the current display mode settings
+ */
+
+GLXFBConfig* fgPlatformChooseFBConfig( int *numcfgs )
+{
+  GLboolean wantIndexedMode = GL_FALSE;
+  int attributes[ 100 ];
+  int where = 0, numAuxBuffers;
+
+  /* First we have to process the display mode settings... */
+  if( fgState.DisplayMode & GLUT_INDEX ) {
+    ATTRIB_VAL( GLX_BUFFER_SIZE, 8 );
+    /*  Buffer size is selected later.  */
+
+    ATTRIB_VAL( GLX_RENDER_TYPE, GLX_COLOR_INDEX_BIT );
+    wantIndexedMode = GL_TRUE;
+  } else {
+    ATTRIB_VAL( GLX_RED_SIZE,   1 );
+    ATTRIB_VAL( GLX_GREEN_SIZE, 1 );
+    ATTRIB_VAL( GLX_BLUE_SIZE,  1 );
+    if( fgState.DisplayMode & GLUT_ALPHA ) {
+      ATTRIB_VAL( GLX_ALPHA_SIZE, 1 );
+    }
+  }
+
+  if( fgState.DisplayMode & GLUT_DOUBLE ) {
+    ATTRIB_VAL( GLX_DOUBLEBUFFER, True );
+  }
+
+  if( fgState.DisplayMode & GLUT_STEREO ) {
+    ATTRIB_VAL( GLX_STEREO, True );
+  }
+
+  if( fgState.DisplayMode & GLUT_DEPTH ) {
+    ATTRIB_VAL( GLX_DEPTH_SIZE, 1 );
+  }
+
+  if( fgState.DisplayMode & GLUT_STENCIL ) {
+    ATTRIB_VAL( GLX_STENCIL_SIZE, 1 );
+  }
+
+  if( fgState.DisplayMode & GLUT_ACCUM ) {
+    ATTRIB_VAL( GLX_ACCUM_RED_SIZE, 1 );
+    ATTRIB_VAL( GLX_ACCUM_GREEN_SIZE, 1 );
+    ATTRIB_VAL( GLX_ACCUM_BLUE_SIZE, 1 );
+    if( fgState.DisplayMode & GLUT_ALPHA ) {
+      ATTRIB_VAL( GLX_ACCUM_ALPHA_SIZE, 1 );
+    }
+  }
+
+  numAuxBuffers = fghNumberOfAuxBuffersRequested();
+  if ( numAuxBuffers > 0 ) {
+    ATTRIB_VAL( GLX_AUX_BUFFERS, numAuxBuffers );
+  }
+
+  if( fgState.DisplayMode & GLUT_SRGB ) {
+    ATTRIB_VAL( GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB, True );
+  }
+
+  if (fgState.DisplayMode & GLUT_MULTISAMPLE) {
+    ATTRIB_VAL(GLX_SAMPLE_BUFFERS, 1);
+    ATTRIB_VAL(GLX_SAMPLES, fgState.SampleNumber);
+  }
+
+  /* Push a terminator at the end of the list */
+  ATTRIB( None );
+
+    {
+        GLXFBConfig * fbconfigArray;  /*  Array of FBConfigs  */
+        GLXFBConfig * fbconfig;       /*  The FBConfig we want  */
+        int fbconfigArraySize;        /*  Number of FBConfigs in the array  */
+
+
+        /*  Get all FBConfigs that match "attributes".  */
+        fbconfigArray = glXChooseFBConfig( fgDisplay.pDisplay.Display,
+                                           fgDisplay.pDisplay.Screen,
+                                           attributes,
+                                           &fbconfigArraySize );
+
+        if (fbconfigArray != NULL)
+        {
+            int result;  /* Returned by glXGetFBConfigAttrib, not checked. */
+
+
+            if( wantIndexedMode )
+            {
+                /*
+                 * In index mode, we want the largest buffer size, i.e. visual
+                 * depth.  Here, FBConfigs are sorted by increasing buffer size
+                 * first, so FBConfigs with the largest size come last.
+                 */
+
+                int bufferSizeMin, bufferSizeMax;
+
+                /*  Get bufferSizeMin.  */
+                result =
+                  glXGetFBConfigAttrib( fgDisplay.pDisplay.Display,
+                                        fbconfigArray[0],
+                                        GLX_BUFFER_SIZE,
+                                        &bufferSizeMin );
+                /*  Get bufferSizeMax.  */
+                result =
+                  glXGetFBConfigAttrib( fgDisplay.pDisplay.Display,
+                                        fbconfigArray[fbconfigArraySize - 1],
+                                        GLX_BUFFER_SIZE,
+                                        &bufferSizeMax );
+
+                if (bufferSizeMax > bufferSizeMin)
+                {
+                    /* 
+                     * Free and reallocate fbconfigArray, keeping only FBConfigs
+                     * with the largest buffer size.
+                     */
+                    XFree(fbconfigArray);
+
+                    /*  Add buffer size token at the end of the list.  */
+                    where--;
+                    ATTRIB_VAL( GLX_BUFFER_SIZE, bufferSizeMax );
+                    ATTRIB( None );
+
+                    fbconfigArray = glXChooseFBConfig( fgDisplay.pDisplay.Display,
+                                                       fgDisplay.pDisplay.Screen,
+                                                       attributes,
+                                                       &fbconfigArraySize );
+                }
+            }
+
+            /*
+             * We now have an array of FBConfigs, the first one being the "best"
+             * one.  So we should return only this FBConfig:
+             *
+             * int fbconfigXID;
+             *
+             *  - pick the XID of the FBConfig we want
+             * result = glXGetFBConfigAttrib( fgDisplay.pDisplay.Display,
+             *                                fbconfigArray[0],
+             *                                GLX_FBCONFIG_ID,
+             *                                &fbconfigXID );
+             *
+             * - free the array
+             * XFree(fbconfigArray);
+             *
+             * - reset "attributes" with the XID
+             * where = 0;
+             * ATTRIB_VAL( GLX_FBCONFIG_ID, fbconfigXID );
+             * ATTRIB( None );
+             *
+             * - get our FBConfig only
+             * fbconfig = glXChooseFBConfig( fgDisplay.pDisplay.Display,
+             *                               fgDisplay.pDisplay.Screen,
+             *                               attributes,
+             *                               &fbconfigArraySize );
+             *
+             * However, for some configurations (for instance multisampling with
+             * Mesa 6.5.2 and ATI drivers), this does not work:
+             * glXChooseFBConfig returns NULL, whereas fbconfigXID is a valid
+             * XID.  Further investigation is needed.
+             *
+             * So, for now, we return the whole array of FBConfigs.  This should
+             * not produce any side effects elsewhere.
+             */
+            fbconfig = fbconfigArray;
+        }
+        else
+        {
+           fbconfig = NULL;
+        }
+
+       if (numcfgs)
+               *numcfgs = fbconfigArraySize;
+
+        return fbconfig;
+    }
+}
+
+
+static void fghFillContextAttributes( int *attributes ) {
+  int where = 0, contextFlags, contextProfile;
+
+  if ( !fghIsLegacyContextVersionRequested() ) {
+    ATTRIB_VAL( GLX_CONTEXT_MAJOR_VERSION_ARB, fgState.MajorVersion );
+    ATTRIB_VAL( GLX_CONTEXT_MINOR_VERSION_ARB, fgState.MinorVersion );
+  }
+
+  contextFlags =
+    fghMapBit( fgState.ContextFlags, GLUT_DEBUG, GLX_CONTEXT_DEBUG_BIT_ARB ) |
+    fghMapBit( fgState.ContextFlags, GLUT_FORWARD_COMPATIBLE, GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB );
+  if ( contextFlags != 0 ) {
+    ATTRIB_VAL( GLX_CONTEXT_FLAGS_ARB, contextFlags );
+  }
+
+  contextProfile =
+    fghMapBit( fgState.ContextProfile, GLUT_CORE_PROFILE, GLX_CONTEXT_CORE_PROFILE_BIT_ARB ) |
+    fghMapBit( fgState.ContextProfile, GLUT_COMPATIBILITY_PROFILE, GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB );
+  if ( contextProfile != 0 ) {
+    ATTRIB_VAL( GLX_CONTEXT_PROFILE_MASK_ARB, contextProfile );
+  }
+
+  ATTRIB( 0 );
+}
+
+typedef GLXContext (*CreateContextAttribsProc)(Display *dpy, GLXFBConfig config,
+                                              GLXContext share_list, Bool direct,
+                                              const int *attrib_list);
+
+static GLXContext fghCreateNewContext( SFG_Window* window )
+{
+  /* for color model calculation */
+  int menu = ( window->IsMenu && !fgStructure.MenuContext );
+  int index_mode = ( fgState.DisplayMode & GLUT_INDEX );
+
+  /* "classic" context creation */
+  Display *dpy = fgDisplay.pDisplay.Display;
+  GLXFBConfig config = *(window->Window.pContext.FBConfig);
+  int render_type = ( !menu && index_mode ) ? GLX_COLOR_INDEX_TYPE : GLX_RGBA_TYPE;
+  GLXContext share_list = NULL;
+  Bool direct = ( fgState.DirectContext != GLUT_FORCE_INDIRECT_CONTEXT );
+  GLXContext context;
+
+  /* new context creation */
+  int attributes[9];
+  CreateContextAttribsProc createContextAttribs = (CreateContextAttribsProc) fgPlatformGetProcAddress( "glXCreateContextAttribsARB" );
+  /* glXCreateContextAttribsARB not found, yet the user has requested the new context creation */
+  if ( !createContextAttribs && !fghIsLegacyContextRequested() ) {
+    fgWarning( "OpenGL >2.1 context requested but glXCreateContextAttribsARB is not available! Falling back to legacy context creation" );
+       fgState.MajorVersion = 2;
+       fgState.MinorVersion = 1;
+  }
+
+  /* If nothing fancy has been required, simply use the old context creation GLX API entry */
+  if ( fghIsLegacyContextRequested() || !createContextAttribs )
+  {
+    context = glXCreateNewContext( dpy, config, render_type, share_list, direct );
+    if ( context == NULL ) {
+      fghContextCreationError();
+    }
+    return context;
+  }
+
+  /* color index mode is not available anymore with OpenGL 3.0 */
+  if ( render_type == GLX_COLOR_INDEX_TYPE ) {
+    fgWarning( "color index mode is deprecated, using RGBA mode" );
+  }
+
+  fghFillContextAttributes( attributes );
+
+  context = createContextAttribs( dpy, config, share_list, direct, attributes );
+  if ( context == NULL ) {
+    fghContextCreationError();
+  }
+  return context;
+}
+
+
+#define _NET_WM_STATE_TOGGLE    2
+static int fghResizeFullscrToggle(void)
+{
+    XWindowAttributes attributes;
+
+    if(glutGet(GLUT_FULL_SCREEN)) {
+        /* restore original window size */
+        SFG_Window *win = fgStructure.CurrentWindow;
+        fgStructure.CurrentWindow->State.NeedToResize = GL_TRUE;
+        fgStructure.CurrentWindow->State.Width  = win->State.pWState.OldWidth;
+        fgStructure.CurrentWindow->State.Height = win->State.pWState.OldHeight;
+
+    } else {
+        /* resize the window to cover the entire screen */
+        XGetWindowAttributes(fgDisplay.pDisplay.Display,
+                fgStructure.CurrentWindow->Window.Handle,
+                &attributes);
+        
+        /*
+         * The "x" and "y" members of "attributes" are the window's coordinates
+         * relative to its parent, i.e. to the decoration window.
+         */
+        XMoveResizeWindow(fgDisplay.pDisplay.Display,
+                fgStructure.CurrentWindow->Window.Handle,
+                -attributes.x,
+                -attributes.y,
+                fgDisplay.ScreenWidth,
+                fgDisplay.ScreenHeight);
+    }
+    return 0;
+}
+
+static int fghEwmhFullscrToggle(void)
+{
+    XEvent xev;
+    long evmask = SubstructureRedirectMask | SubstructureNotifyMask;
+
+    if(!fgDisplay.pDisplay.State || !fgDisplay.pDisplay.StateFullScreen) {
+        return -1;
+    }
+
+    xev.type = ClientMessage;
+    xev.xclient.window = fgStructure.CurrentWindow->Window.Handle;
+    xev.xclient.message_type = fgDisplay.pDisplay.State;
+    xev.xclient.format = 32;
+    xev.xclient.data.l[0] = _NET_WM_STATE_TOGGLE;
+    xev.xclient.data.l[1] = fgDisplay.pDisplay.StateFullScreen;
+    xev.xclient.data.l[2] = 0; /* no second property to toggle */
+    xev.xclient.data.l[3] = 1; /* source indication: application */
+    xev.xclient.data.l[4] = 0; /* unused */
+
+    if(!XSendEvent(fgDisplay.pDisplay.Display, fgDisplay.pDisplay.RootWindow, 0, evmask, &xev)) {
+        return -1;
+    }
+    return 0;
+}
+
+static int fghToggleFullscreen(void)
+{
+    /* first try the EWMH (_NET_WM_STATE) method ... */
+    if(fghEwmhFullscrToggle() != -1) {
+        return 0;
+    }
+
+    /* fall back to resizing the window */
+    if(fghResizeFullscrToggle() != -1) {
+        return 0;
+    }
+    return -1;
+}
+
+void fgPlatformSetWindow ( SFG_Window *window )
+{
+    if ( window )
+    {
+        glXMakeContextCurrent(
+            fgDisplay.pDisplay.Display,
+            window->Window.Handle,
+            window->Window.Handle,
+            window->Window.Context
+        );
+    }
+}
+
+static Bool fghWindowIsVisible( Display *display, XEvent *event, XPointer arg)
+{
+    Window window = (Window)arg;
+    return (event->type == MapNotify) && (event->xmap.window == window);
+}
+
+/*
+ * Opens a window. Requires a SFG_Window object created and attached
+ * to the freeglut structure. OpenGL context is created here.
+ */
+void fgPlatformOpenWindow( SFG_Window* window, const char* title,
+                           GLboolean positionUse, int x, int y,
+                           GLboolean sizeUse, int w, int h,
+                           GLboolean gameMode, GLboolean isSubWindow )
+{
+    XVisualInfo * visualInfo = NULL;
+    XSetWindowAttributes winAttr;
+    XTextProperty textProperty;
+    XSizeHints sizeHints;
+    XWMHints wmHints;
+    XEvent eventReturnBuffer; /* return buffer required for a call */
+    unsigned long mask;
+    int num_FBConfigs, i;
+    unsigned int current_DisplayMode = fgState.DisplayMode ;
+
+    /* Save the display mode if we are creating a menu window */
+    if( window->IsMenu && ( ! fgStructure.MenuContext ) )
+        fgState.DisplayMode = GLUT_DOUBLE | GLUT_RGB ;
+
+    window->Window.pContext.FBConfig = fgPlatformChooseFBConfig( &num_FBConfigs );
+
+    if( window->IsMenu && ( ! fgStructure.MenuContext ) )
+        fgState.DisplayMode = current_DisplayMode ;
+
+    if( ! window->Window.pContext.FBConfig )
+    {
+        /*
+         * The "fgPlatformChooseFBConfig" returned a null meaning that the visual
+         * context is not available.
+         * Try a couple of variations to see if they will work.
+         */
+        if( !( fgState.DisplayMode & GLUT_DOUBLE ) )
+        {
+            fgState.DisplayMode |= GLUT_DOUBLE ;
+            window->Window.pContext.FBConfig = fgPlatformChooseFBConfig( &num_FBConfigs );
+            fgState.DisplayMode &= ~GLUT_DOUBLE;
+        }
+
+        if( fgState.DisplayMode & GLUT_MULTISAMPLE )
+        {
+            fgState.DisplayMode &= ~GLUT_MULTISAMPLE ;
+            window->Window.pContext.FBConfig = fgPlatformChooseFBConfig( &num_FBConfigs );
+            fgState.DisplayMode |= GLUT_MULTISAMPLE;
+        }
+    }
+
+    FREEGLUT_INTERNAL_ERROR_EXIT( window->Window.pContext.FBConfig != NULL,
+                                  "FBConfig with necessary capabilities not found", "fgOpenWindow" );
+
+    /*  Get the X visual.  */
+    for (i = 0; i < num_FBConfigs; i++) {
+           visualInfo = glXGetVisualFromFBConfig( fgDisplay.pDisplay.Display,
+                                                  window->Window.pContext.FBConfig[i] );
+           if (visualInfo)
+               break;
+    }
+
+    FREEGLUT_INTERNAL_ERROR_EXIT( visualInfo != NULL,
+                                  "visualInfo could not be retrieved from FBConfig", "fgOpenWindow" );
+
+    /*
+     * XXX HINT: the masks should be updated when adding/removing callbacks.
+     * XXX       This might speed up message processing. Is that true?
+     * XXX
+     * XXX A: Not appreciably, but it WILL make it easier to debug.
+     * XXX    Try tracing old GLUT and try tracing freeglut.  Old GLUT
+     * XXX    turns off events that it doesn't need and is a whole lot
+     * XXX    more pleasant to trace.  (Think mouse-motion!  Tons of
+     * XXX    ``bonus'' GUI events stream in.)
+     */
+    winAttr.event_mask        =
+        StructureNotifyMask | SubstructureNotifyMask | ExposureMask |
+        ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyReleaseMask |
+        VisibilityChangeMask | EnterWindowMask | LeaveWindowMask |
+        PointerMotionMask | ButtonMotionMask;
+    winAttr.background_pixmap = None;
+    winAttr.background_pixel  = 0;
+    winAttr.border_pixel      = 0;
+
+    winAttr.colormap = XCreateColormap(
+        fgDisplay.pDisplay.Display, fgDisplay.pDisplay.RootWindow,
+        visualInfo->visual, AllocNone
+    );
+
+    mask = CWBackPixmap | CWBorderPixel | CWColormap | CWEventMask;
+
+    if( window->IsMenu || ( gameMode == GL_TRUE ) )
+    {
+        winAttr.override_redirect = True;
+        mask |= CWOverrideRedirect;
+    }
+
+    if( ! positionUse )
+        x = y = -1; /* default window position */
+    if( ! sizeUse )
+        w = h = 300; /* default window size */
+
+    window->Window.Handle = XCreateWindow(
+        fgDisplay.pDisplay.Display,
+        window->Parent == NULL ? fgDisplay.pDisplay.RootWindow :
+        window->Parent->Window.Handle,
+        x, y, w, h, 0,
+        visualInfo->depth, InputOutput,
+        visualInfo->visual, mask,
+        &winAttr
+    );
+
+    /*
+     * The GLX context creation, possibly trying the direct context rendering
+     *  or else use the current context if the user has so specified
+     */
+
+    if( window->IsMenu )
+    {
+        /*
+         * If there isn't already an OpenGL rendering context for menu
+         * windows, make one
+         */
+        if( !fgStructure.MenuContext )
+        {
+            fgStructure.MenuContext =
+                (SFG_MenuContext *)malloc( sizeof(SFG_MenuContext) );
+            fgStructure.MenuContext->MContext = fghCreateNewContext( window );
+        }
+
+        /* window->Window.Context = fgStructure.MenuContext->MContext; */
+        window->Window.Context = fghCreateNewContext( window );
+    }
+    else if( fgState.UseCurrentContext )
+    {
+        window->Window.Context = glXGetCurrentContext( );
+
+        if( ! window->Window.Context )
+            window->Window.Context = fghCreateNewContext( window );
+    }
+    else
+        window->Window.Context = fghCreateNewContext( window );
+
+#if !defined( __FreeBSD__ ) && !defined( __NetBSD__ )
+    if(  !glXIsDirect( fgDisplay.pDisplay.Display, window->Window.Context ) )
+    {
+      if( fgState.DirectContext == GLUT_FORCE_DIRECT_CONTEXT )
+        fgError( "Unable to force direct context rendering for window '%s'",
+                 title );
+    }
+#endif
+
+    /*
+     * XXX Assume the new window is visible by default
+     * XXX Is this a  safe assumption?
+     */
+    window->State.Visible = GL_TRUE;
+
+    sizeHints.flags = 0;
+    if ( positionUse )
+        sizeHints.flags |= USPosition;
+    if ( sizeUse )
+        sizeHints.flags |= USSize;
+
+    /*
+     * Fill in the size hints values now (the x, y, width and height
+     * settings are obsolete, are there any more WMs that support them?)
+     * Unless the X servers actually stop supporting these, we should
+     * continue to fill them in.  It is *not* our place to tell the user
+     * that they should replace a window manager that they like, and which
+     * works, just because *we* think that it's not "modern" enough.
+     */
+    sizeHints.x      = x;
+    sizeHints.y      = y;
+    sizeHints.width  = w;
+    sizeHints.height = h;
+
+    wmHints.flags = StateHint;
+    wmHints.initial_state = fgState.ForceIconic ? IconicState : NormalState;
+    /* Prepare the window and iconified window names... */
+    XStringListToTextProperty( (char **) &title, 1, &textProperty );
+
+    XSetWMProperties(
+        fgDisplay.pDisplay.Display,
+        window->Window.Handle,
+        &textProperty,
+        &textProperty,
+        0,
+        0,
+        &sizeHints,
+        &wmHints,
+        NULL
+    );
+    XFree( textProperty.value );
+
+    XSetWMProtocols( fgDisplay.pDisplay.Display, window->Window.Handle,
+                     &fgDisplay.pDisplay.DeleteWindow, 1 );
+
+    glXMakeContextCurrent(
+        fgDisplay.pDisplay.Display,
+        window->Window.Handle,
+        window->Window.Handle,
+        window->Window.Context
+    );
+
+    /* register extension events _before_ window is mapped */
+    #ifdef HAVE_X11_EXTENSIONS_XINPUT2_H
+       fgRegisterDevices( fgDisplay.pDisplay.Display, &(window->Window.Handle) );
+    #endif
+
+    XMapWindow( fgDisplay.pDisplay.Display, window->Window.Handle );
+
+    XFree(visualInfo);
+
+    if( !isSubWindow)
+        XPeekIfEvent( fgDisplay.pDisplay.Display, &eventReturnBuffer, &fghWindowIsVisible, (XPointer)(window->Window.Handle) );
+}
+
+
+/*
+ * Closes a window, destroying the frame and OpenGL context
+ */
+void fgPlatformCloseWindow( SFG_Window* window )
+{
+    if( window->Window.Context )
+        glXDestroyContext( fgDisplay.pDisplay.Display, window->Window.Context );
+    XFree( window->Window.pContext.FBConfig );
+
+    if( window->Window.Handle ) {
+        XDestroyWindow( fgDisplay.pDisplay.Display, window->Window.Handle );
+    }
+    /* XFlush( fgDisplay.pDisplay.Display ); */ /* XXX Shouldn't need this */
+}
+
+
+/*
+ * This function makes the current window visible
+ */
+void fgPlatformGlutShowWindow( void )
+{
+    XMapWindow( fgDisplay.pDisplay.Display, fgStructure.CurrentWindow->Window.Handle );
+    XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */
+}
+
+/*
+ * This function hides the current window
+ */
+void fgPlatformGlutHideWindow( void )
+{
+    if( fgStructure.CurrentWindow->Parent == NULL )
+        XWithdrawWindow( fgDisplay.pDisplay.Display,
+                         fgStructure.CurrentWindow->Window.Handle,
+                         fgDisplay.pDisplay.Screen );
+    else
+        XUnmapWindow( fgDisplay.pDisplay.Display,
+                      fgStructure.CurrentWindow->Window.Handle );
+    XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */
+}
+
+/*
+ * Iconify the current window (top-level windows only)
+ */
+void fgPlatformGlutIconifyWindow( void )
+{
+    XIconifyWindow( fgDisplay.pDisplay.Display, fgStructure.CurrentWindow->Window.Handle,
+                    fgDisplay.pDisplay.Screen );
+    XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */
+}
+
+/*
+ * Set the current window's title
+ */
+void fgPlatformGlutSetWindowTitle( const char* title )
+{
+    XTextProperty text;
+
+    text.value = (unsigned char *) title;
+    text.encoding = XA_STRING;
+    text.format = 8;
+    text.nitems = strlen( title );
+
+    XSetWMName(
+        fgDisplay.pDisplay.Display,
+        fgStructure.CurrentWindow->Window.Handle,
+        &text
+    );
+
+    XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */
+}
+
+/*
+ * Set the current window's iconified title
+ */
+void fgPlatformGlutSetIconTitle( const char* title )
+{
+    XTextProperty text;
+
+    text.value = (unsigned char *) title;
+    text.encoding = XA_STRING;
+    text.format = 8;
+    text.nitems = strlen( title );
+
+    XSetWMIconName(
+        fgDisplay.pDisplay.Display,
+        fgStructure.CurrentWindow->Window.Handle,
+        &text
+    );
+
+    XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */
+}
+
+/*
+ * Change the current window's position
+ */
+void fgPlatformGlutPositionWindow( int x, int y )
+{
+    XMoveWindow( fgDisplay.pDisplay.Display, fgStructure.CurrentWindow->Window.Handle,
+                 x, y );
+    XFlush( fgDisplay.pDisplay.Display ); /* XXX Shouldn't need this */
+}
+
+/*
+ * Lowers the current window (by Z order change)
+ */
+void fgPlatformGlutPushWindow( void )
+{
+    XLowerWindow( fgDisplay.pDisplay.Display, fgStructure.CurrentWindow->Window.Handle );
+}
+
+/*
+ * Raises the current window (by Z order change)
+ */
+void fgPlatformGlutPopWindow( void )
+{
+    XRaiseWindow( fgDisplay.pDisplay.Display, fgStructure.CurrentWindow->Window.Handle );
+}
+
+/*
+ * Resize the current window so that it fits the whole screen
+ */
+void fgPlatformGlutFullScreen( SFG_Window *win )
+{
+    if(!glutGet(GLUT_FULL_SCREEN)) {
+        if(fghToggleFullscreen() != -1) {
+            win->State.IsFullscreen = GL_TRUE;
+        }
+    }
+}
+
+/*
+ * If we are fullscreen, resize the current window back to its original size
+ */
+void fgPlatformGlutLeaveFullScreen( SFG_Window *win )
+{
+    if(glutGet(GLUT_FULL_SCREEN)) {
+        if(fghToggleFullscreen() != -1) {
+            win->State.IsFullscreen = GL_FALSE;
+        }
+    }
+}
+
+/*
+ * Toggle the window's full screen state.
+ */
+void fgPlatformGlutFullScreenToggle( SFG_Window *win )
+{
+    if(fghToggleFullscreen() != -1) {
+        win->State.IsFullscreen = !win->State.IsFullscreen;
+    }
+}
+