)\r
SET(FREEGLUT_SRCS\r
${FREEGLUT_HEADERS}\r
- src/freeglut_callbacks.c\r
- src/freeglut_cursor.c\r
- src/freeglut_display.c\r
- src/freeglut_ext.c\r
- src/freeglut_font.c\r
- src/freeglut_font_data.c\r
- src/freeglut_gamemode.c\r
- src/freeglut_geometry.c\r
- src/freeglut_glutfont_definitions.c\r
- src/freeglut_init.c\r
- src/freeglut_input_devices.c\r
- src/freeglut_joystick.c\r
- src/freeglut_main.c\r
- src/freeglut_menu.c\r
- src/freeglut_misc.c\r
- src/freeglut_overlay.c\r
- src/freeglut_spaceball.c\r
- src/freeglut_state.c\r
- src/freeglut_stroke_mono_roman.c\r
- src/freeglut_stroke_roman.c\r
- src/freeglut_structure.c\r
- src/freeglut_teapot.c\r
- src/freeglut_videoresize.c\r
- src/freeglut_window.c\r
- src/freeglut_xinput.c\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_glutfont_definitions.c\r
+ src/Common/freeglut_init.c\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
+ src/Common/freeglut_xinput.c\r
)\r
\r
#IF(WIN32)\r
-# LIST(APPEND FREEGLUT_SRCS src/freeglut_windows.c)\r
+# LIST(APPEND FREEGLUT_SRCS src/Windows/freeglut_cursor_windows.c)\r
#ELSE()\r
-# LIST(APPEND FREEGLUT_SRCS src/freeglut_x11.c)\r
+# LIST(APPEND FREEGLUT_SRCS src/X11/freeglut_cursor_x11.c)\r
#ENDIF()\r
\r
# Neatly organize all of the output files in the build directory\r
\r
IF(BUILD_SHARED_LIBS)\r
IF(WIN32)\r
- LIST(APPEND FREEGLUT_SRCS src/freeglutdll.def freeglut.rc)\r
+ LIST(APPEND FREEGLUT_SRCS src/Common/freeglutdll.def freeglut.rc)\r
ENDIF()\r
ADD_DEFINITIONS(-DFREEGLUT_EXPORTS)\r
ELSE()\r
+2012-01-09 John F. Fay <johnffay@cybertron.com>
+ * Released freeglut 2.8.0 a few days ago and am restarting the ChangeLog
+ * Added 'cmake' support
+ * Moved source files from 'src' directory to 'src/Common' directory with
+ an eye to moving platform-specific code to separate files in separate
+ directories
+
2009-08-10 Sven Panne <sven.panne@aedion.de>
* include/GL/freeglut_ext.h,include/GL/freeglut_std.h,src/freeglut_ext.c,
* 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"\r
+#A placer dans le répertoire "src/Common"\r
\r
sources=$(wildcard *.c)\r
objs=$(sources:.c=.o)\r
## Process this file with automake to produce Makefile.in
-SUBDIRS = src include progs doc
+SUBDIRS = src Common include progs doc
AUTOMAKE_OPTIONS = gnu
EXTRA_DIST = \
DEBUG_DYNAMIC_DIR = debug-dynamic\r
\r
INCLUDE_DIR = ..\include\r
-SRC_DIR = ..\src\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
* 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\94\r
+#To place in the directory \93src/Common\94\r
\r
sources=$ (wildcard *.c)\r
objs=$ (sources: .c=.o)\r
Name="VCLinkerTool"\r
OutputFile="$(OutDir)\$(ProjectName).dll"\r
LinkIncremental="2"\r
- ModuleDefinitionFile="..\..\src\freeglutdll.def"\r
+ ModuleDefinitionFile="..\..\src\Common\freeglutdll.def"\r
GenerateDebugInformation="true"\r
RandomizedBaseAddress="1"\r
ImportLibrary="$(OutDir)\$(ProjectName).lib"\r
<Tool\r
Name="VCLinkerTool"\r
OutputFile="$(OutDir)\$(ProjectName).dll"\r
- ModuleDefinitionFile="..\..\src\freeglutdll.def"\r
+ ModuleDefinitionFile="..\..\src\Common\freeglutdll.def"\r
RandomizedBaseAddress="1"\r
ImportLibrary="$(OutDir)\$(ProjectName).lib"\r
TargetMachine="1"\r
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
>\r
<File\r
- RelativePath="..\..\src\freeglut_callbacks.c"\r
+ RelativePath="..\..\src\Common\freeglut_callbacks.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_cursor.c"\r
+ RelativePath="..\..\src\Common\freeglut_cursor.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_display.c"\r
+ RelativePath="..\..\src\Common\freeglut_display.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_ext.c"\r
+ RelativePath="..\..\src\Common\freeglut_ext.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_font.c"\r
+ RelativePath="..\..\src\Common\freeglut_font.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_font_data.c"\r
+ RelativePath="..\..\src\Common\freeglut_font_data.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_gamemode.c"\r
+ RelativePath="..\..\src\Common\freeglut_gamemode.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_geometry.c"\r
+ RelativePath="..\..\src\Common\freeglut_geometry.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_glutfont_definitions.c"\r
+ RelativePath="..\..\src\Common\freeglut_glutfont_definitions.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_init.c"\r
+ RelativePath="..\..\src\Common\freeglut_init.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_input_devices.c"\r
+ RelativePath="..\..\src\Common\freeglut_input_devices.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_joystick.c"\r
+ RelativePath="..\..\src\Common\freeglut_joystick.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_main.c"\r
+ RelativePath="..\..\src\Common\freeglut_main.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_menu.c"\r
+ RelativePath="..\..\src\Common\freeglut_menu.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_misc.c"\r
+ RelativePath="..\..\src\Common\freeglut_misc.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_overlay.c"\r
+ RelativePath="..\..\src\Common\freeglut_overlay.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_spaceball.c"\r
+ RelativePath="..\..\src\Common\freeglut_spaceball.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_state.c"\r
+ RelativePath="..\..\src\Common\freeglut_state.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_stroke_mono_roman.c"\r
+ RelativePath="..\..\src\Common\freeglut_stroke_mono_roman.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_stroke_roman.c"\r
+ RelativePath="..\..\src\Common\freeglut_stroke_roman.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_structure.c"\r
+ RelativePath="..\..\src\Common\freeglut_structure.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_teapot.c"\r
+ RelativePath="..\..\src\Common\freeglut_teapot.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_videoresize.c"\r
+ RelativePath="..\..\src\Common\freeglut_videoresize.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_window.c"\r
+ RelativePath="..\..\src\Common\freeglut_window.c"\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglutdll.def"\r
+ RelativePath="..\..\src\Common\freeglutdll.def"\r
>\r
</File>\r
</Filter>\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_internal.h"\r
+ RelativePath="..\..\src\Common\freeglut_internal.h"\r
>\r
</File>\r
<File\r
>\r
</File>\r
<File\r
- RelativePath="..\..\src\freeglut_teapot_data.h"\r
+ RelativePath="..\..\src\Common\freeglut_teapot_data.h"\r
>\r
</File>\r
<File\r
<DataExecutionPrevention>\r
</DataExecutionPrevention>\r
<TargetMachine>MachineX86</TargetMachine>\r
- <ModuleDefinitionFile>..\..\src\freeglutdll.def</ModuleDefinitionFile>\r
+ <ModuleDefinitionFile>..\..\src\Common\freeglutdll.def</ModuleDefinitionFile>\r
</Link>\r
</ItemDefinitionGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">\r
<DataExecutionPrevention>\r
</DataExecutionPrevention>\r
<TargetMachine>MachineX86</TargetMachine>\r
- <ModuleDefinitionFile>..\..\src\freeglutdll.def</ModuleDefinitionFile>\r
+ <ModuleDefinitionFile>..\..\src\Common\freeglutdll.def</ModuleDefinitionFile>\r
</Link>\r
</ItemDefinitionGroup>\r
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
</Lib>\r
</ItemDefinitionGroup>\r
<ItemGroup>\r
- <ClCompile Include="..\..\src\freeglut_callbacks.c" />\r
- <ClCompile Include="..\..\src\freeglut_cursor.c" />\r
- <ClCompile Include="..\..\src\freeglut_display.c" />\r
- <ClCompile Include="..\..\src\freeglut_ext.c" />\r
- <ClCompile Include="..\..\src\freeglut_font.c" />\r
- <ClCompile Include="..\..\src\freeglut_font_data.c" />\r
- <ClCompile Include="..\..\src\freeglut_gamemode.c" />\r
- <ClCompile Include="..\..\src\freeglut_geometry.c" />\r
- <ClCompile Include="..\..\src\freeglut_glutfont_definitions.c" />\r
- <ClCompile Include="..\..\src\freeglut_init.c" />\r
- <ClCompile Include="..\..\src\freeglut_input_devices.c" />\r
- <ClCompile Include="..\..\src\freeglut_joystick.c" />\r
- <ClCompile Include="..\..\src\freeglut_main.c" />\r
- <ClCompile Include="..\..\src\freeglut_menu.c" />\r
- <ClCompile Include="..\..\src\freeglut_misc.c" />\r
- <ClCompile Include="..\..\src\freeglut_overlay.c" />\r
- <ClCompile Include="..\..\src\freeglut_spaceball.c" />\r
- <ClCompile Include="..\..\src\freeglut_state.c" />\r
- <ClCompile Include="..\..\src\freeglut_stroke_mono_roman.c" />\r
- <ClCompile Include="..\..\src\freeglut_stroke_roman.c" />\r
- <ClCompile Include="..\..\src\freeglut_structure.c" />\r
- <ClCompile Include="..\..\src\freeglut_teapot.c" />\r
- <ClCompile Include="..\..\src\freeglut_videoresize.c" />\r
- <ClCompile Include="..\..\src\freeglut_window.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_callbacks.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_cursor.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_display.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_ext.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_font.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_font_data.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_gamemode.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_geometry.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_glutfont_definitions.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_init.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_input_devices.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_joystick.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_main.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_menu.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_misc.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_overlay.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_spaceball.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_state.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_stroke_mono_roman.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_stroke_roman.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_structure.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_teapot.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_videoresize.c" />\r
+ <ClCompile Include="..\..\src\Common\freeglut_window.c" />\r
</ItemGroup>\r
<ItemGroup>\r
- <None Include="..\..\src\freeglutdll.def" />\r
+ <None Include="..\..\src\Common\freeglutdll.def" />\r
</ItemGroup>\r
<ItemGroup>\r
<ClInclude Include="..\..\include\GL\freeglut.h" />\r
<ClInclude Include="..\..\include\GL\freeglut_ext.h" />\r
- <ClInclude Include="..\..\src\freeglut_internal.h" />\r
+ <ClInclude Include="..\..\src\Common\freeglut_internal.h" />\r
<ClInclude Include="..\..\include\GL\freeglut_std.h" />\r
- <ClInclude Include="..\..\src\freeglut_teapot_data.h" />\r
+ <ClInclude Include="..\..\src\Common\freeglut_teapot_data.h" />\r
<ClInclude Include="..\..\include\GL\glut.h" />\r
</ItemGroup>\r
<ItemGroup>\r
</Filter>\r
</ItemGroup>\r
<ItemGroup>\r
- <ClCompile Include="..\..\src\freeglut_callbacks.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_callbacks.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_cursor.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_cursor.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_display.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_display.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_ext.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_ext.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_font.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_font.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_font_data.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_font_data.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_gamemode.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_gamemode.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_geometry.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_geometry.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_glutfont_definitions.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_glutfont_definitions.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_init.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_init.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_input_devices.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_input_devices.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_joystick.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_joystick.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_main.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_main.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_menu.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_menu.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_misc.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_misc.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_overlay.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_overlay.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_spaceball.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_spaceball.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_state.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_state.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_stroke_mono_roman.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_stroke_mono_roman.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_stroke_roman.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_stroke_roman.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_structure.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_structure.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_teapot.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_teapot.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_videoresize.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_videoresize.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
- <ClCompile Include="..\..\src\freeglut_window.c">\r
+ <ClCompile Include="..\..\src\Common\freeglut_window.c">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
</ItemGroup>\r
<ItemGroup>\r
- <None Include="..\..\src\freeglutdll.def">\r
+ <None Include="..\..\src\Common\freeglutdll.def">\r
<Filter>Source Files</Filter>\r
</None>\r
</ItemGroup>\r
<ClInclude Include="..\..\include\GL\freeglut_ext.h">\r
<Filter>Header Files</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\src\freeglut_internal.h">\r
+ <ClInclude Include="..\..\src\Common\freeglut_internal.h">\r
<Filter>Header Files</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\include\GL\freeglut_std.h">\r
<Filter>Header Files</Filter>\r
</ClInclude>\r
- <ClInclude Include="..\..\src\freeglut_teapot_data.h">\r
+ <ClInclude Include="..\..\src\Common\freeglut_teapot_data.h">\r
<Filter>Header Files</Filter>\r
</ClInclude>\r
<ClInclude Include="..\..\include\GL\glut.h">\r
# Microsoft Developer Studio Generated Dependency File, included by freeglut.mak\r
\r
-.\src\freeglut_callbacks.c : \\r
+.\src\Common\freeglut_callbacks.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_cursor.c : \\r
+.\src\Common\freeglut_cursor.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_display.c : \\r
+.\src\Common\freeglut_display.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_ext.c : \\r
+.\src\Common\freeglut_ext.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_font.c : \\r
+.\src\Common\freeglut_font.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_font_data.c : \\r
+.\src\Common\freeglut_font_data.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_gamemode.c : \\r
+.\src\Common\freeglut_gamemode.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_geometry.c : \\r
+.\src\Common\freeglut_geometry.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_glutfont_definitions.c : \\r
+.\src\Common\freeglut_glutfont_definitions.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_init.c : \\r
+.\src\Common\freeglut_init.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_input_devices.c : \\r
+.\src\Common\freeglut_input_devices.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_joystick.c : \\r
+.\src\Common\freeglut_joystick.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_main.c : \\r
+.\src\Common\freeglut_main.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_menu.c : \\r
+.\src\Common\freeglut_menu.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_misc.c : \\r
+.\src\Common\freeglut_misc.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_overlay.c : \\r
+.\src\Common\freeglut_overlay.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_state.c : \\r
+.\src\Common\freeglut_state.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_stroke_mono_roman.c : \\r
+.\src\Common\freeglut_stroke_mono_roman.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_stroke_roman.c : \\r
+.\src\Common\freeglut_stroke_roman.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_structure.c : \\r
+.\src\Common\freeglut_structure.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_teapot.c : \\r
+.\src\Common\freeglut_teapot.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
- ".\src\freeglut_teapot_data.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_teapot_data.h"\\r
\r
\r
-.\src\freeglut_videoresize.c : \\r
+.\src\Common\freeglut_videoresize.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_window.c : \\r
+.\src\Common\freeglut_window.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
-SOURCE=.\src\freeglut_callbacks.c
+SOURCE=.\src\Common\freeglut_callbacks.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_cursor.c
+SOURCE=.\src\Common\freeglut_cursor.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_display.c
+SOURCE=.\src\Common\freeglut_display.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_ext.c
+SOURCE=.\src\Common\freeglut_ext.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_font.c
+SOURCE=.\src\Common\freeglut_font.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_font_data.c
+SOURCE=.\src\Common\freeglut_font_data.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_gamemode.c
+SOURCE=.\src\Common\freeglut_gamemode.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_geometry.c
+SOURCE=.\src\Common\freeglut_geometry.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_glutfont_definitions.c
+SOURCE=.\src\Common\freeglut_glutfont_definitions.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_init.c
+SOURCE=.\src\Common\freeglut_init.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_input_devices.c
+SOURCE=.\src\Common\freeglut_input_devices.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_joystick.c
+SOURCE=.\src\Common\freeglut_joystick.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_main.c
+SOURCE=.\src\Common\freeglut_main.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_menu.c
+SOURCE=.\src\Common\freeglut_menu.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_misc.c
+SOURCE=.\src\Common\freeglut_misc.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_overlay.c
+SOURCE=.\src\Common\freeglut_overlay.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_spaceball.c
+SOURCE=.\src\Common\freeglut_spaceball.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_state.c
+SOURCE=.\src\Common\freeglut_state.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_stroke_mono_roman.c
+SOURCE=.\src\Common\freeglut_stroke_mono_roman.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_stroke_roman.c
+SOURCE=.\src\Common\freeglut_stroke_roman.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_structure.c
+SOURCE=.\src\Common\freeglut_structure.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_teapot.c
+SOURCE=.\src\Common\freeglut_teapot.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_videoresize.c
+SOURCE=.\src\Common\freeglut_videoresize.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_window.c
+SOURCE=.\src\Common\freeglut_window.c
# End Source File
# End Group
# Begin Group "Header Files"
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_internal.h
+SOURCE=.\src\Common\freeglut_internal.h
# End Source File
# Begin Source File
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_teapot_data.h
+SOURCE=.\src\Common\freeglut_teapot_data.h
# End Source File
# Begin Source File
</general>
<kdevautoproject>
<general>
- <activetarget>src/freeglut</activetarget>
+ <activetarget>src/Common/freeglut</activetarget>
</general>
<run>
- <mainprogram>src/freeglut</mainprogram>
+ <mainprogram>src/Common/freeglut</mainprogram>
</run>
<make>
<envvars>
sub_dirs=
type=normal
[Workspace_1]
-openfiles=Nienazwany.h,Nienazwany.cpp,/home/olszta/freeglut/include/GL/freeglut_internal.h,/home/olszta/freeglut/src/freeglut_callbacks.c,/home/olszta/freeglut/src/freeglut_gamemode.c,/home/olszta/freeglut/src/freeglut_init.c,/home/olszta/freeglut/src/freeglut_main.c,/home/olszta/freeglut/src/freeglut_window.c,/home/olszta/freeglut/src/freeglut_misc.c,/home/olszta/freeglut/include/GL/freeglut.h,/home/olszta/freeglut/src/freeglut_cursor.c,/home/olszta/freeglut/src/freeglut_geometry.c,/home/olszta/freeglut/src/freeglut_font_data.c,/home/olszta/freeglut/src/freeglut_videoresize.c,/home/olszta/freeglut/src/freeglut_teapot.c,/home/olszta/freeglut/src/freeglut_structure.c,/home/olszta/freeglut/src/freeglut_state.c,
+openfiles=Nienazwany.h,Nienazwany.cpp,/home/olszta/freeglut/include/GL/freeglut_internal.h,/home/olszta/freeglut/src/Common/freeglut_callbacks.c,/home/olszta/freeglut/src/Common/freeglut_gamemode.c,/home/olszta/freeglut/src/Common/freeglut_init.c,/home/olszta/freeglut/src/Common/freeglut_main.c,/home/olszta/freeglut/src/Common/freeglut_window.c,/home/olszta/freeglut/src/Common/freeglut_misc.c,/home/olszta/freeglut/include/GL/freeglut.h,/home/olszta/freeglut/src/Common/freeglut_cursor.c,/home/olszta/freeglut/src/Common/freeglut_geometry.c,/home/olszta/freeglut/src/Common/freeglut_font_data.c,/home/olszta/freeglut/src/Common/freeglut_videoresize.c,/home/olszta/freeglut/src/Common/freeglut_teapot.c,/home/olszta/freeglut/src/Common/freeglut_structure.c,/home/olszta/freeglut/src/Common/freeglut_state.c,
show_outputview=true
show_treeview=true
header_file=/home/olszta/freeglut/include/GL/freeglut.h
-cpp_file=/home/olszta/freeglut/src/freeglut_state.c
+cpp_file=/home/olszta/freeglut/src/Common/freeglut_state.c
browser_file=file:/usr/doc/kde/HTML/default/kdevelop/welcome/index.html
[COPYING]
install_location=
dist=true
install=false
type=DATA
-[src/freeglut_videoresize.c]
+[src/Common/freeglut_videoresize.c]
install_location=
dist=true
install=false
type=po
sub_dirs=
[src/Makefile.am]
-files=src/freeglut_callbacks.c,src/freeglut_cursor.c,src/freeglut_display.c,src/freeglut_font.c,src/freeglut_font_data.c,src/freeglut_gamemode.c,src/freeglut_geometry.c,src/freeglut_init.c,src/freeglut_joystick.c,src/freeglut_main.c,src/freeglut_menu.c,src/freeglut_misc.c,src/freeglut_overlay.c,src/freeglut_state.c,src/freeglut_structure.c,src/freeglut_teapot.c,src/freeglut_videoresize.c,src/freeglut_window.c,
+files=src/Common/freeglut_callbacks.c,src/Common/freeglut_cursor.c,src/Common/freeglut_display.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_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_state.c,src/Common/freeglut_structure.c,src/Common/freeglut_teapot.c,src/Common/freeglut_videoresize.c,src/Common/freeglut_window.c,
type=prog_main
sub_dirs=
[freeglut.kdevprj]
dist=true
install=false
type=DATA
-[src/freeglut_gamemode.c]
+[src/Common/freeglut_gamemode.c]
install_location=
dist=true
install=false
type=SOURCE
-[src/freeglut_menu.c]
+[src/Common/freeglut_menu.c]
install_location=
dist=true
install=false
[src/docs/en/Makefile.am]
type=normal
sub_dirs=
-[src/freeglut_font.c]
+[src/Common/freeglut_font.c]
install_location=
dist=true
install=false
type=SOURCE
-[src/freeglut_window.c]
+[src/Common/freeglut_window.c]
install_location=
dist=true
install=false
type=SOURCE
-[src/freeglut_main.c]
+[src/Common/freeglut_main.c]
install_location=
dist=true
install=false
type=SOURCE
-[src/freeglut_state.c]
+[src/Common/freeglut_state.c]
install_location=
dist=true
install=false
type=SOURCE
-[src/freeglut_callbacks.c]
+[src/Common/freeglut_callbacks.c]
install_location=
dist=true
install=false
dist=true
install=false
type=HEADER
-[src/freeglut_structure.c]
+[src/Common/freeglut_structure.c]
install_location=
dist=true
install=false
dist=true
install=false
type=DATA
-[src/freeglut_geometry.c]
+[src/Common/freeglut_geometry.c]
install_location=
dist=true
install=false
dist=true
install=false
type=DATA
-[src/freeglut_init.c]
+[src/Common/freeglut_init.c]
install_location=
dist=true
install=false
type=SOURCE
-[src/freeglut_display.c]
+[src/Common/freeglut_display.c]
install_location=
dist=true
install=false
type=SOURCE
-[src/freeglut_overlay.c]
+[src/Common/freeglut_overlay.c]
install_location=
dist=true
install=false
dist=true
install=false
type=DATA
-[src/freeglut_misc.c]
+[src/Common/freeglut_misc.c]
install_location=
dist=true
install=false
files=freeglut.kdevprj,AUTHORS,COPYING,ChangeLog,INSTALL,README,TODO,freeglut.lsm,
type=normal
sub_dirs=src,include,
-[src/freeglut_cursor.c]
+[src/Common/freeglut_cursor.c]
install_location=
dist=true
install=false
\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release" || "$(CFG)" == "freeglut - Win32 Debug"\r
-SOURCE=.\src\freeglut_callbacks.c\r
+SOURCE=.\src\Common\freeglut_callbacks.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_cursor.c\r
+SOURCE=.\src\Common\freeglut_cursor.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_display.c\r
+SOURCE=.\src\Common\freeglut_display.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_ext.c\r
+SOURCE=.\src\Common\freeglut_ext.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_font.c\r
+SOURCE=.\src\Common\freeglut_font.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_font_data.c\r
+SOURCE=.\src\Common\freeglut_font_data.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_gamemode.c\r
+SOURCE=.\src\Common\freeglut_gamemode.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_geometry.c\r
+SOURCE=.\src\Common\freeglut_geometry.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_glutfont_definitions.c\r
+SOURCE=.\src\Common\freeglut_glutfont_definitions.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_init.c\r
+SOURCE=.\src\Common\freeglut_init.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_input_devices.c\r
+SOURCE=.\src\Common\freeglut_input_devices.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_joystick.c\r
+SOURCE=.\src\Common\freeglut_joystick.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_main.c\r
+SOURCE=.\src\Common\freeglut_main.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_menu.c\r
+SOURCE=.\src\Common\freeglut_menu.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_misc.c\r
+SOURCE=.\src\Common\freeglut_misc.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_overlay.c\r
+SOURCE=.\src\Common\freeglut_overlay.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_state.c\r
+SOURCE=.\src\Common\freeglut_state.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_stroke_mono_roman.c\r
+SOURCE=.\src\Common\freeglut_stroke_mono_roman.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_stroke_roman.c\r
+SOURCE=.\src\Common\freeglut_stroke_roman.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_structure.c\r
+SOURCE=.\src\Common\freeglut_structure.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_teapot.c\r
+SOURCE=.\src\Common\freeglut_teapot.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_videoresize.c\r
+SOURCE=.\src\Common\freeglut_videoresize.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_window.c\r
+SOURCE=.\src\Common\freeglut_window.c\r
\r
!IF "$(CFG)" == "freeglut - Win32 Release"\r
\r
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
-SOURCE=.\src\freeglut_callbacks.c
+SOURCE=.\src\Common\freeglut_callbacks.c
DEP_CPP_FREEG=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
{$(INCLUDE)}"GL\freeglut.h"\
{$(INCLUDE)}"GL\freeglut_ext.h"\
{$(INCLUDE)}"GL\freeglut_std.h"\
NODEP_CPP_FREEG=\
- ".\src\config.h"\
+ ".\src\Common\config.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_cursor.c
+SOURCE=.\src\Common\freeglut_cursor.c
DEP_CPP_FREEGL=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
{$(INCLUDE)}"GL\freeglut.h"\
{$(INCLUDE)}"GL\freeglut_ext.h"\
{$(INCLUDE)}"GL\freeglut_std.h"\
NODEP_CPP_FREEGL=\
- ".\src\config.h"\
+ ".\src\Common\config.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_display.c
+SOURCE=.\src\Common\freeglut_display.c
DEP_CPP_FREEGLU=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
{$(INCLUDE)}"GL\freeglut.h"\
{$(INCLUDE)}"GL\freeglut_ext.h"\
{$(INCLUDE)}"GL\freeglut_std.h"\
NODEP_CPP_FREEGLU=\
- ".\src\config.h"\
+ ".\src\Common\config.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_ext.c
+SOURCE=.\src\Common\freeglut_ext.c
DEP_CPP_FREEGLUT=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
{$(INCLUDE)}"GL\freeglut.h"\
{$(INCLUDE)}"GL\freeglut_ext.h"\
{$(INCLUDE)}"GL\freeglut_std.h"\
NODEP_CPP_FREEGLUT=\
- ".\src\config.h"\
+ ".\src\Common\config.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_font.c
+SOURCE=.\src\Common\freeglut_font.c
DEP_CPP_FREEGLUT_=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
{$(INCLUDE)}"GL\freeglut.h"\
{$(INCLUDE)}"GL\freeglut_ext.h"\
{$(INCLUDE)}"GL\freeglut_std.h"\
NODEP_CPP_FREEGLUT_=\
- ".\src\config.h"\
+ ".\src\Common\config.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_font_data.c
+SOURCE=.\src\Common\freeglut_font_data.c
DEP_CPP_FREEGLUT_F=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
{$(INCLUDE)}"GL\freeglut.h"\
{$(INCLUDE)}"GL\freeglut_ext.h"\
{$(INCLUDE)}"GL\freeglut_std.h"\
NODEP_CPP_FREEGLUT_F=\
- ".\src\config.h"\
+ ".\src\Common\config.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_gamemode.c
+SOURCE=.\src\Common\freeglut_gamemode.c
# PROP Exclude_From_Build 1
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_geometry.c
+SOURCE=.\src\Common\freeglut_geometry.c
DEP_CPP_FREEGLUT_G=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
{$(INCLUDE)}"GL\freeglut.h"\
{$(INCLUDE)}"GL\freeglut_ext.h"\
{$(INCLUDE)}"GL\freeglut_std.h"\
NODEP_CPP_FREEGLUT_G=\
- ".\src\config.h"\
+ ".\src\Common\config.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_glutfont_definitions.c
+SOURCE=.\src\Common\freeglut_glutfont_definitions.c
DEP_CPP_FREEGLUT_GL=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_init.c
+SOURCE=.\src\Common\freeglut_init.c
DEP_CPP_FREEGLUT_I=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
{$(INCLUDE)}"GL\freeglut.h"\
{$(INCLUDE)}"GL\freeglut_ext.h"\
{$(INCLUDE)}"GL\freeglut_std.h"\
NODEP_CPP_FREEGLUT_I=\
- ".\src\config.h"\
+ ".\src\Common\config.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_internal.h
+SOURCE=.\src\Common\freeglut_internal.h
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_joystick.c
+SOURCE=.\src\Common\freeglut_joystick.c
# PROP Exclude_From_Build 1
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_main.c
+SOURCE=.\src\Common\freeglut_main.c
DEP_CPP_FREEGLUT_M=\
- ".\src\freeglut_internal.h"\
- ".\src\my_gx.h"\
+ ".\src\Common\freeglut_internal.h"\
+ ".\src\Common\my_gx.h"\
{$(INCLUDE)}"GL\freeglut.h"\
{$(INCLUDE)}"GL\freeglut_ext.h"\
{$(INCLUDE)}"GL\freeglut_std.h"\
{$(INCLUDE)}"gx.h"\
NODEP_CPP_FREEGLUT_M=\
- ".\src\config.h"\
+ ".\src\Common\config.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_menu.c
+SOURCE=.\src\Common\freeglut_menu.c
DEP_CPP_FREEGLUT_ME=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
{$(INCLUDE)}"GL\freeglut.h"\
{$(INCLUDE)}"GL\freeglut_ext.h"\
{$(INCLUDE)}"GL\freeglut_std.h"\
NODEP_CPP_FREEGLUT_ME=\
- ".\src\config.h"\
+ ".\src\Common\config.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_misc.c
+SOURCE=.\src\Common\freeglut_misc.c
DEP_CPP_FREEGLUT_MI=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
{$(INCLUDE)}"GL\freeglut.h"\
{$(INCLUDE)}"GL\freeglut_ext.h"\
{$(INCLUDE)}"GL\freeglut_std.h"\
NODEP_CPP_FREEGLUT_MI=\
- ".\src\config.h"\
+ ".\src\Common\config.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_overlay.c
+SOURCE=.\src\Common\freeglut_overlay.c
DEP_CPP_FREEGLUT_O=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
{$(INCLUDE)}"GL\freeglut.h"\
{$(INCLUDE)}"GL\freeglut_ext.h"\
{$(INCLUDE)}"GL\freeglut_std.h"\
NODEP_CPP_FREEGLUT_O=\
- ".\src\config.h"\
+ ".\src\Common\config.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_state.c
+SOURCE=.\src\Common\freeglut_state.c
DEP_CPP_FREEGLUT_S=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
{$(INCLUDE)}"GL\freeglut.h"\
{$(INCLUDE)}"GL\freeglut_ext.h"\
{$(INCLUDE)}"GL\freeglut_std.h"\
NODEP_CPP_FREEGLUT_S=\
- ".\src\config.h"\
+ ".\src\Common\config.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_stroke_mono_roman.c
+SOURCE=.\src\Common\freeglut_stroke_mono_roman.c
DEP_CPP_FREEGLUT_ST=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_stroke_roman.c
+SOURCE=.\src\Common\freeglut_stroke_roman.c
DEP_CPP_FREEGLUT_STR=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_structure.c
+SOURCE=.\src\Common\freeglut_structure.c
DEP_CPP_FREEGLUT_STRU=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
{$(INCLUDE)}"GL\freeglut.h"\
{$(INCLUDE)}"GL\freeglut_ext.h"\
{$(INCLUDE)}"GL\freeglut_std.h"\
NODEP_CPP_FREEGLUT_STRU=\
- ".\src\config.h"\
+ ".\src\Common\config.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_teapot.c
+SOURCE=.\src\Common\freeglut_teapot.c
DEP_CPP_FREEGLUT_T=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
{$(INCLUDE)}"GL\freeglut.h"\
{$(INCLUDE)}"GL\freeglut_ext.h"\
{$(INCLUDE)}"GL\freeglut_std.h"\
NODEP_CPP_FREEGLUT_T=\
- ".\src\config.h"\
+ ".\src\Common\config.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_videoresize.c
+SOURCE=.\src\Common\freeglut_videoresize.c
DEP_CPP_FREEGLUT_V=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
{$(INCLUDE)}"GL\freeglut.h"\
{$(INCLUDE)}"GL\freeglut_ext.h"\
{$(INCLUDE)}"GL\freeglut_std.h"\
NODEP_CPP_FREEGLUT_V=\
- ".\src\config.h"\
+ ".\src\Common\config.h"\
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_window.c
+SOURCE=.\src\Common\freeglut_window.c
DEP_CPP_FREEGLUT_W=\
- ".\src\freeglut_internal.h"\
+ ".\src\Common\freeglut_internal.h"\
{$(INCLUDE)}"aygshell.h"\
{$(INCLUDE)}"GL\freeglut.h"\
{$(INCLUDE)}"GL\freeglut_ext.h"\
NODEP_CPP_FREEGLUT_W=\
"..\..\..\..\..\Program Files\Windows CE Tools\wce420\POCKET PC 2003\Include\ARMV4\vibrate.h"\
- ".\src\config.h"\
+ ".\src\Common\config.h"\
# End Source File
# End Group
# Microsoft Developer Studio Generated Dependency File, included by freeglut_static.mak\r
\r
-.\src\freeglut_callbacks.c : \\r
+.\src\Common\freeglut_callbacks.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_cursor.c : \\r
+.\src\Common\freeglut_cursor.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_display.c : \\r
+.\src\Common\freeglut_display.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_ext.c : \\r
+.\src\Common\freeglut_ext.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_font.c : \\r
+.\src\Common\freeglut_font.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_font_data.c : \\r
+.\src\Common\freeglut_font_data.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_gamemode.c : \\r
+.\src\Common\freeglut_gamemode.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_geometry.c : \\r
+.\src\Common\freeglut_geometry.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_glutfont_definitions.c : \\r
+.\src\Common\freeglut_glutfont_definitions.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_init.c : \\r
+.\src\Common\freeglut_init.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_input_devices.c : \\r
+.\src\Common\freeglut_input_devices.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_joystick.c : \\r
+.\src\Common\freeglut_joystick.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_main.c : \\r
+.\src\Common\freeglut_main.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_menu.c : \\r
+.\src\Common\freeglut_menu.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_misc.c : \\r
+.\src\Common\freeglut_misc.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_overlay.c : \\r
+.\src\Common\freeglut_overlay.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_state.c : \\r
+.\src\Common\freeglut_state.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_stroke_mono_roman.c : \\r
+.\src\Common\freeglut_stroke_mono_roman.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_stroke_roman.c : \\r
+.\src\Common\freeglut_stroke_roman.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_structure.c : \\r
+.\src\Common\freeglut_structure.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_teapot.c : \\r
+.\src\Common\freeglut_teapot.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
- ".\src\freeglut_teapot_data.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_teapot_data.h"\\r
\r
\r
-.\src\freeglut_videoresize.c : \\r
+.\src\Common\freeglut_videoresize.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
\r
-.\src\freeglut_window.c : \\r
+.\src\Common\freeglut_window.c : \\r
"..\..\..\..\..\program files\microsoft visual studio\vc98\include\basetsd.h"\\r
".\include\GL\freeglut.h"\\r
".\include\GL\freeglut_ext.h"\\r
".\include\GL\freeglut_std.h"\\r
- ".\src\freeglut_internal.h"\\r
+ ".\src\Common\freeglut_internal.h"\\r
\r
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
-SOURCE=.\src\freeglut_callbacks.c
+SOURCE=.\src\Common\freeglut_callbacks.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_cursor.c
+SOURCE=.\src\Common\freeglut_cursor.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_display.c
+SOURCE=.\src\Common\freeglut_display.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_ext.c
+SOURCE=.\src\Common\freeglut_ext.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_font.c
+SOURCE=.\src\Common\freeglut_font.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_font_data.c
+SOURCE=.\src\Common\freeglut_font_data.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_gamemode.c
+SOURCE=.\src\Common\freeglut_gamemode.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_geometry.c
+SOURCE=.\src\Common\freeglut_geometry.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_glutfont_definitions.c
+SOURCE=.\src\Common\freeglut_glutfont_definitions.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_init.c
+SOURCE=.\src\Common\freeglut_init.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_input_devices.c
+SOURCE=.\src\Common\freeglut_input_devices.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_joystick.c
+SOURCE=.\src\Common\freeglut_joystick.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_main.c
+SOURCE=.\src\Common\freeglut_main.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_menu.c
+SOURCE=.\src\Common\freeglut_menu.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_misc.c
+SOURCE=.\src\Common\freeglut_misc.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_overlay.c
+SOURCE=.\src\Common\freeglut_overlay.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_spaceball.c
+SOURCE=.\src\Common\freeglut_spaceball.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_state.c
+SOURCE=.\src\Common\freeglut_state.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_stroke_mono_roman.c
+SOURCE=.\src\Common\freeglut_stroke_mono_roman.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_stroke_roman.c
+SOURCE=.\src\Common\freeglut_stroke_roman.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_structure.c
+SOURCE=.\src\Common\freeglut_structure.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_teapot.c
+SOURCE=.\src\Common\freeglut_teapot.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_videoresize.c
+SOURCE=.\src\Common\freeglut_videoresize.c
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_window.c
+SOURCE=.\src\Common\freeglut_window.c
# End Source File
# End Group
# Begin Group "Header Files"
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_internal.h
+SOURCE=.\src\Common\freeglut_internal.h
# End Source File
# Begin Source File
# End Source File
# Begin Source File
-SOURCE=.\src\freeglut_teapot_data.h
+SOURCE=.\src\Common\freeglut_teapot_data.h
# End Source File
# Begin Source File
\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release" || "$(CFG)" == "freeglut_static - Win32 Debug"\r
-SOURCE=.\src\freeglut_callbacks.c\r
+SOURCE=.\src\Common\freeglut_callbacks.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_cursor.c\r
+SOURCE=.\src\Common\freeglut_cursor.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_display.c\r
+SOURCE=.\src\Common\freeglut_display.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_ext.c\r
+SOURCE=.\src\Common\freeglut_ext.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_font.c\r
+SOURCE=.\src\Common\freeglut_font.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_font_data.c\r
+SOURCE=.\src\Common\freeglut_font_data.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_gamemode.c\r
+SOURCE=.\src\Common\freeglut_gamemode.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_geometry.c\r
+SOURCE=.\src\Common\freeglut_geometry.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_glutfont_definitions.c\r
+SOURCE=.\src\Common\freeglut_glutfont_definitions.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_init.c\r
+SOURCE=.\src\Common\freeglut_init.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_input_devices.c\r
+SOURCE=.\src\Common\freeglut_input_devices.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_joystick.c\r
+SOURCE=.\src\Common\freeglut_joystick.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_main.c\r
+SOURCE=.\src\Common\freeglut_main.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_menu.c\r
+SOURCE=.\src\Common\freeglut_menu.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_misc.c\r
+SOURCE=.\src\Common\freeglut_misc.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_overlay.c\r
+SOURCE=.\src\Common\freeglut_overlay.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_state.c\r
+SOURCE=.\src\Common\freeglut_state.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_stroke_mono_roman.c\r
+SOURCE=.\src\Common\freeglut_stroke_mono_roman.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_stroke_roman.c\r
+SOURCE=.\src\Common\freeglut_stroke_roman.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_structure.c\r
+SOURCE=.\src\Common\freeglut_structure.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_teapot.c\r
+SOURCE=.\src\Common\freeglut_teapot.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_videoresize.c\r
+SOURCE=.\src\Common\freeglut_videoresize.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
\r
!ENDIF \r
\r
-SOURCE=.\src\freeglut_window.c\r
+SOURCE=.\src\Common\freeglut_window.c\r
\r
!IF "$(CFG)" == "freeglut_static - Win32 Release"\r
\r
--- /dev/null
+/*\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
--- /dev/null
+/*\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
+#if TARGET_HOST_POSIX_X11 || TARGET_HOST_MAC_OSX || TARGET_HOST_SOLARIS\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.Display,\r
+ fgDisplay.RootWindow,\r
+ cursorNoneBits, 16, 16 );\r
+ if( cursorNonePixmap != None ) {\r
+ cursorNone = XCreatePixmapCursor( fgDisplay.Display,\r
+ cursorNonePixmap, cursorNonePixmap,\r
+ &dontCare, &dontCare, 0, 0 );\r
+ XFreePixmap( fgDisplay.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
+static void fghSetCursor ( 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.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.Display, window->Window.Handle );\r
+ } else if ( cursor != None ) {\r
+ XDefineCursor( fgDisplay.Display, window->Window.Handle, cursor );\r
+ } else if ( cursorIDToUse != GLUT_CURSOR_NONE ) {\r
+ fgError( "Failed to create cursor" );\r
+ }\r
+}\r
+\r
+\r
+static void fghWarpPointer ( int x, int y )\r
+{\r
+ XWarpPointer(\r
+ fgDisplay.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.Display );\r
+}\r
+#endif\r
+\r
+\r
+#if TARGET_HOST_MS_WINDOWS\r
+static void fghSetCursor ( 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
+static void fghWarpPointer ( 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
+#endif\r
+\r
+\r
+/* -- INTERNAL FUNCTIONS ---------------------------------------------------- */\r
+void fgSetCursor ( SFG_Window *window, int cursorID )\r
+{\r
+ fghSetCursor ( 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
+ fghSetCursor ( 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
+ fghWarpPointer ( x, y );\r
+}\r
+\r
+/*** END OF FILE ***/\r
--- /dev/null
+/*\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
+/* -- 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
+#if TARGET_HOST_POSIX_X11\r
+ glXSwapBuffers( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle );\r
+#elif TARGET_HOST_MS_WINDOWS\r
+ SwapBuffers( fgStructure.CurrentWindow->Window.Device );\r
+#endif\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
--- /dev/null
+/*\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
+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
+#if !defined(_WIN32_WCE)\r
+ CHECK_NAME(glutJoystickFunc);\r
+#endif /* !defined(_WIN32_WCE) */\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
+#if !defined(_WIN32_WCE)\r
+ CHECK_NAME(glutForceJoystickFunc);\r
+ CHECK_NAME(glutGameModeString);\r
+ CHECK_NAME(glutEnterGameMode);\r
+ CHECK_NAME(glutLeaveGameMode);\r
+ CHECK_NAME(glutGameModeGet);\r
+#endif /* !defined(_WIN32_WCE) */\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
+SFG_Proc fghGetProcAddress( const char *procName )\r
+{\r
+#if TARGET_HOST_MS_WINDOWS\r
+ return (SFG_Proc)wglGetProcAddress( ( LPCSTR )procName );\r
+#elif TARGET_HOST_POSIX_X11 && defined( GLX_ARB_get_proc_address )\r
+ return (SFG_Proc)glXGetProcAddressARB( ( const GLubyte * )procName );\r
+#else\r
+ return NULL;\r
+#endif\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
+ return ( p != NULL ) ? p : fghGetProcAddress( procName );\r
+}\r
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
+\r
+#if TARGET_HOST_POSIX_X11\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.Display, &event_base, &error_base)) {\r
+ return -1;\r
+ }\r
+\r
+ XRRQueryVersion(fgDisplay.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.Display, fgDisplay.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.Display, xrr_config,\r
+ fgDisplay.RootWindow, res_idx, rot, rate, timestamp);\r
+ else\r
+#endif\r
+ result = XRRSetScreenConfig(fgDisplay.Display, xrr_config,\r
+ fgDisplay.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
+#endif /* TARGET_HOST_POSIX_X11 */\r
+\r
+/*\r
+ * Remembers the current visual settings, so that\r
+ * we can change them and restore later...\r
+ */\r
+static void fghRememberState( void )\r
+{\r
+#if TARGET_HOST_POSIX_X11\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.Display, fgDisplay.RootWindow,\r
+ &junk_window, &junk_window,\r
+ &fgDisplay.DisplayPointerX, &fgDisplay.DisplayPointerY,\r
+ &fgDisplay.DisplayPointerX, &fgDisplay.DisplayPointerY, &junk_mask);\r
+\r
+# ifdef HAVE_X11_EXTENSIONS_XRANDR_H\r
+ if(XRRQueryExtension(fgDisplay.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.Display, fgDisplay.RootWindow))) {\r
+ ssizes = XRRConfigSizes(xrr_config, &ssize_count);\r
+ curr = XRRConfigCurrentConfiguration(xrr_config, &rot);\r
+\r
+ fgDisplay.prev_xsz = ssizes[curr].width;\r
+ fgDisplay.prev_ysz = ssizes[curr].height;\r
+ fgDisplay.prev_refresh = -1;\r
+\r
+# if ( RANDR_MAJOR >= 1 ) || ( ( RANDR_MAJOR == 1 ) && ( RANDR_MINOR >= 1 ) )\r
+ if(fgState.GameModeRefresh != -1) {\r
+ fgDisplay.prev_refresh = XRRConfigCurrentRate(xrr_config);\r
+ }\r
+# endif\r
+\r
+ fgDisplay.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.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.Display,\r
+ fgDisplay.Screen,\r
+ &fgDisplay.DisplayViewPortX,\r
+ &fgDisplay.DisplayViewPortY ) )\r
+ fgWarning( "XF86VidModeGetViewPort failed" );\r
+\r
+\r
+ /* Query the current display settings: */\r
+ fgDisplay.DisplayModeValid =\r
+ XF86VidModeGetModeLine(\r
+ fgDisplay.Display,\r
+ fgDisplay.Screen,\r
+ &fgDisplay.DisplayModeClock,\r
+ &fgDisplay.DisplayMode\r
+ );\r
+\r
+ if( !fgDisplay.DisplayModeValid )\r
+ fgWarning( "XF86VidModeGetModeLine failed" );\r
+# endif\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\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.DisplayName, FREEGLUT_ENUM_CURRENT_SETTINGS,\r
+ &fgDisplay.DisplayMode );\r
+\r
+ /* Make sure we will be restoring all settings needed */\r
+ fgDisplay.DisplayMode.dmFields |=\r
+ DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;\r
+\r
+#endif\r
+}\r
+\r
+/*\r
+ * Restores the previously remembered visual settings\r
+ */\r
+static void fghRestoreState( void )\r
+{\r
+#if TARGET_HOST_POSIX_X11\r
+ /* Restore the remembered pointer position: */\r
+ XWarpPointer(\r
+ fgDisplay.Display, None, fgDisplay.RootWindow, 0, 0, 0, 0,\r
+ fgDisplay.DisplayPointerX, fgDisplay.DisplayPointerY\r
+ );\r
+\r
+\r
+# ifdef HAVE_X11_EXTENSIONS_XRANDR_H\r
+ if(fgDisplay.prev_size_valid) {\r
+ if(xrandr_resize(fgDisplay.prev_xsz, fgDisplay.prev_ysz, fgDisplay.prev_refresh, 0) != -1) {\r
+ fgDisplay.prev_size_valid = 0;\r
+# ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H\r
+ fgDisplay.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.DisplayModeValid )\r
+ {\r
+ XF86VidModeModeInfo** displayModes;\r
+ int i, displayModesCount;\r
+\r
+ if( !XF86VidModeGetAllModeLines(\r
+ fgDisplay.Display,\r
+ fgDisplay.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.DisplayMode.hdisplay &&\r
+ displayModes[ i ]->vdisplay == fgDisplay.DisplayMode.vdisplay &&\r
+ displayModes[ i ]->dotclock == fgDisplay.DisplayModeClock )\r
+ {\r
+ if( !XF86VidModeSwitchToMode(\r
+ fgDisplay.Display,\r
+ fgDisplay.Screen,\r
+ displayModes[ i ] ) )\r
+ {\r
+ fgWarning( "XF86VidModeSwitchToMode failed" );\r
+ break;\r
+ }\r
+\r
+ if( !XF86VidModeSetViewPort(\r
+ fgDisplay.Display,\r
+ fgDisplay.Screen,\r
+ fgDisplay.DisplayViewPortX,\r
+ fgDisplay.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.Display );\r
+\r
+ fgDisplay.DisplayModeValid = 0;\r
+# ifdef HAVE_X11_EXTENSIONS_XRANDR_H\r
+ fgDisplay.prev_size_valid = 0;\r
+# endif\r
+\r
+ break;\r
+ }\r
+ }\r
+ XFree( displayModes );\r
+ }\r
+\r
+# endif\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\r
+\r
+ /* Restore the previously remembered desktop display settings */\r
+ ChangeDisplaySettingsEx( fgDisplay.DisplayName,&fgDisplay.DisplayMode, 0,0,0 );\r
+\r
+#endif\r
+}\r
+\r
+#if TARGET_HOST_POSIX_X11\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
+#endif\r
+\r
+/*\r
+ * Changes the current display mode to match user's settings\r
+ */\r
+static GLboolean fghChangeDisplayMode( GLboolean haveToTest )\r
+{\r
+ GLboolean success = GL_FALSE;\r
+#if TARGET_HOST_POSIX_X11\r
+\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.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.DisplayModeValid) {\r
+ if(!XF86VidModeGetModeLine(fgDisplay.Display, fgDisplay.Screen,\r
+ &fgDisplay.DisplayModeClock, &fgDisplay.DisplayMode)) {\r
+ return success;\r
+ }\r
+ }\r
+\r
+ if (fgState.GameModeSize.X == -1)\r
+ {\r
+ fgState.GameModeSize.X = fgDisplay.DisplayMode.hdisplay;\r
+ }\r
+ if (fgState.GameModeSize.Y == -1)\r
+ {\r
+ fgState.GameModeSize.Y = fgDisplay.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.DisplayModeClock * 1000 ) /\r
+ ( fgDisplay.DisplayMode.htotal * fgDisplay.DisplayMode.vtotal );\r
+\r
+ fgState.GameModeRefresh = refresh;\r
+ }\r
+\r
+ /* query all possible display modes */\r
+ if( !XF86VidModeGetAllModeLines(\r
+ fgDisplay.Display,\r
+ fgDisplay.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.Display,\r
+ fgDisplay.Screen,\r
+ displayModes[ i ] ) )\r
+ fgWarning( "XF86VidModeSwitchToMode failed" );\r
+ }\r
+\r
+ XFree( displayModes );\r
+ }\r
+\r
+# endif\r
+\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\r
+\r
+ DEVMODE devMode;\r
+ char *fggmstr = NULL;\r
+ char displayMode[300];\r
+\r
+ success = GL_FALSE;\r
+\r
+ EnumDisplaySettings( fgDisplay.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.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.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
+#endif\r
+\r
+ return success;\r
+}\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
+ * fghChangeDisplayMode() 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
+ fghRememberState( );\r
+\r
+ if( ! fghChangeDisplayMode( 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
+#if TARGET_HOST_POSIX_X11\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.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.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.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.Display,\r
+ None,\r
+ fgDisplay.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.DisplayModeValid )\r
+ {\r
+ int x, y;\r
+ Window child;\r
+\r
+ /* Change to viewport to the window topleft edge: */\r
+ if( !XF86VidModeSetViewPort( fgDisplay.Display, fgDisplay.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.Display,\r
+ fgStructure.CurrentWindow->Window.Handle,\r
+ fgDisplay.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.Display, fgStructure.CurrentWindow->Window.Handle,\r
+ -x, -y);\r
+ }\r
+\r
+#endif\r
+\r
+ /* Grab the keyboard, too */\r
+ XGrabKeyboard(\r
+ fgDisplay.Display,\r
+ fgStructure.GameModeWindow->Window.Handle,\r
+ FALSE,\r
+ GrabModeAsync, GrabModeAsync,\r
+ CurrentTime\r
+ );\r
+\r
+#endif\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
+#if TARGET_HOST_POSIX_X11\r
+\r
+ XUngrabPointer( fgDisplay.Display, CurrentTime );\r
+ XUngrabKeyboard( fgDisplay.Display, CurrentTime );\r
+\r
+#endif\r
+\r
+ fghRestoreState();\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 fghChangeDisplayMode( 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
--- /dev/null
+/*\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
--- /dev/null
+/*\r
+ * freeglut_glutfont_definitions.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 "freeglut_internal.h"\r
+\r
+#if TARGET_HOST_POSIX_X11\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
+#endif\r
+\r
--- /dev/null
+/*\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
+#if TARGET_HOST_POSIX_X11\r
+#include <limits.h> /* LONG_MAX */\r
+#endif\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
+#if TARGET_HOST_POSIX_X11\r
+\r
+/* Return the atom associated with "name". */\r
+static Atom fghGetAtom(const char * name)\r
+{\r
+ return XInternAtom(fgDisplay.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.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.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
+#endif /* TARGET_HOST_POSIX_X11 */\r
+\r
+\r
+/*\r
+ * A call to this function should initialize all the display stuff...\r
+ */\r
+static void fghInitialize( const char* displayName )\r
+{\r
+#if TARGET_HOST_POSIX_X11\r
+ fgDisplay.Display = XOpenDisplay( displayName );\r
+\r
+ if( fgDisplay.Display == NULL )\r
+ fgError( "failed to open display '%s'", XDisplayName( displayName ) );\r
+\r
+ if( !glXQueryExtension( fgDisplay.Display, NULL, NULL ) )\r
+ fgError( "OpenGL GLX extension not supported by display '%s'",\r
+ XDisplayName( displayName ) );\r
+\r
+ fgDisplay.Screen = DefaultScreen( fgDisplay.Display );\r
+ fgDisplay.RootWindow = RootWindow(\r
+ fgDisplay.Display,\r
+ fgDisplay.Screen\r
+ );\r
+\r
+ fgDisplay.ScreenWidth = DisplayWidth(\r
+ fgDisplay.Display,\r
+ fgDisplay.Screen\r
+ );\r
+ fgDisplay.ScreenHeight = DisplayHeight(\r
+ fgDisplay.Display,\r
+ fgDisplay.Screen\r
+ );\r
+\r
+ fgDisplay.ScreenWidthMM = DisplayWidthMM(\r
+ fgDisplay.Display,\r
+ fgDisplay.Screen\r
+ );\r
+ fgDisplay.ScreenHeightMM = DisplayHeightMM(\r
+ fgDisplay.Display,\r
+ fgDisplay.Screen\r
+ );\r
+\r
+ fgDisplay.Connection = ConnectionNumber( fgDisplay.Display );\r
+\r
+ /* Create the window deletion atom */\r
+ fgDisplay.DeleteWindow = fghGetAtom("WM_DELETE_WINDOW");\r
+\r
+ /* Create the state and full screen atoms */\r
+ fgDisplay.State = None;\r
+ fgDisplay.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.RootWindow, supported, state))\r
+ {\r
+ const Atom full_screen = fghGetAtom("_NET_WM_STATE_FULLSCREEN");\r
+ \r
+ fgDisplay.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.RootWindow, supported, full_screen))\r
+ {\r
+ fgDisplay.StateFullScreen = full_screen;\r
+ }\r
+ }\r
+ }\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\r
+\r
+ WNDCLASS wc;\r
+ ATOM atom;\r
+\r
+ /* What we need to do is to initialize the fgDisplay global structure here. */\r
+ fgDisplay.Instance = GetModuleHandle( NULL );\r
+ fgDisplay.DisplayName= displayName ? strdup(displayName) : 0 ;\r
+ atom = GetClassInfo( fgDisplay.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 = fgWindowProc;\r
+ wc.cbClsExtra = 0;\r
+ wc.cbWndExtra = 0;\r
+ wc.hInstance = fgDisplay.Instance;\r
+ wc.hIcon = LoadIcon( fgDisplay.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", "fghInitialize" );\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.DisplayName )\r
+ {\r
+ HDC context = CreateDC(fgDisplay.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("fghInitialize: "\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
+#endif\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
+#if ( TARGET_HOST_MS_WINDOWS == 0 )\r
+ atexit(fgDeinitialize);\r
+#endif\r
+\r
+ /* InputDevice uses GlutTimerFunc(), so fgState.Initialised must be TRUE */\r
+ fgInitialiseInputDevices();\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
+#if TARGET_HOST_POSIX_X11\r
+ /* Note that the MVisualInfo is not owned by the MenuContext! */\r
+ glXDestroyContext( fgDisplay.Display, fgStructure.MenuContext->MContext );\r
+#endif\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
+#if !defined(_WIN32_WCE)\r
+ if ( fgState.JoysticksInitialised )\r
+ fgJoystickClose( );\r
+\r
+ if ( fgState.InputDevsInitialised )\r
+ fgInputDeviceClose( );\r
+#endif /* !defined(_WIN32_WCE) */\r
+ fgState.JoysticksInitialised = GL_FALSE;\r
+ fgState.InputDevsInitialised = GL_FALSE;\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
+#if TARGET_HOST_POSIX_X11\r
+\r
+ /*\r
+ * Make sure all X-client data we have created will be destroyed on\r
+ * display closing\r
+ */\r
+ XSetCloseDownMode( fgDisplay.Display, DestroyAll );\r
+\r
+ /*\r
+ * Close the display connection, destroying all windows we have\r
+ * created so far\r
+ */\r
+ XCloseDisplay( fgDisplay.Display );\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\r
+ if( fgDisplay.DisplayName )\r
+ {\r
+ free( fgDisplay.DisplayName );\r
+ fgDisplay.DisplayName = NULL;\r
+ }\r
+\r
+ /* Reset the timer granularity */\r
+ timeEndPeriod ( 1 );\r
+\r
+#endif\r
+\r
+ fgState.Initialised = GL_FALSE;\r
+}\r
+\r
+/*\r
+ * Everything inside the following #ifndef is copied from the X sources.\r
+ */\r
+\r
+#if TARGET_HOST_MS_WINDOWS\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
+static 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
+#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
+ int i, j, argc = *pargc;\r
+\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
+ /* check if GLUT_FPS env var is set */\r
+#ifndef _WIN32_WCE\r
+ {\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
+ displayName = 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
+ displayName = 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
+ geometry = 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
+ * 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
+ fghInitialize( 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
+#if TARGET_HOST_MS_WINDOWS\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
+#endif\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
--- /dev/null
+/*\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
+#if TARGET_HOST_POSIX_X11\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
+typedef struct {\r
+ int fd;\r
+ struct termios termio, termio_save;\r
+} SERIALPORT;\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\r
+#include <sys/types.h>\r
+#include <winbase.h>\r
+typedef struct {\r
+ HANDLE fh;\r
+ COMMTIMEOUTS timeouts_save;\r
+ DCB dcb_save;\r
+} SERIALPORT;\r
+\r
+#endif\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
+static SERIALPORT *serial_open ( const char *device );\r
+static void serial_close ( SERIALPORT *port );\r
+static int serial_getchar ( SERIALPORT *port );\r
+static int serial_putchar ( SERIALPORT *port, unsigned char ch );\r
+static void serial_flush ( SERIALPORT *port );\r
+\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
+#if TARGET_HOST_MS_WINDOWS\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
+#endif\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
+\r
+/******** OS Specific Serial I/O routines *******/\r
+#if TARGET_HOST_POSIX_X11 /* ==> Linux/BSD/UNIX POSIX serial I/O */\r
+static 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
+static 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
+static 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
+static int serial_putchar(SERIALPORT *port, unsigned char ch){\r
+ if (!port) return 0;\r
+ return write(port->fd,&ch,1);\r
+}\r
+\r
+static void serial_flush ( SERIALPORT *port )\r
+{\r
+ tcflush ( port->fd, TCIOFLUSH );\r
+}\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\r
+\r
+static 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
+static 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
+static 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
+static 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
+static void serial_flush ( SERIALPORT *port )\r
+{\r
+ FlushFileBuffers(port->fh);\r
+}\r
+\r
+#endif\r
--- /dev/null
+/*\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 2\r
+#define VERSION_MINOR 7\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
+/* -- PLATFORM-SPECIFIC INCLUDES ------------------------------------------- */\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 TARGET_HOST_MS_WINDOWS && !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
+#elif TARGET_HOST_POSIX_X11\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
+#endif\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 TARGET_HOST_MS_WINDOWS\r
+# define HAVE_VFPRINTF 1\r
+#endif\r
+\r
+/* MinGW may lack a prototype for ChangeDisplaySettingsEx() (depending on the version?) */\r
+#if TARGET_HOST_MS_WINDOWS && !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
+#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
+/* -- 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
+#if TARGET_HOST_POSIX_X11\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
+#elif TARGET_HOST_MS_WINDOWS\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
+#endif\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
+ * 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
+#if TARGET_HOST_POSIX_X11\r
+\r
+typedef Window SFG_WindowHandleType ;\r
+typedef GLXContext SFG_WindowContextType ;\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\r
+\r
+typedef HWND SFG_WindowHandleType ;\r
+typedef HGLRC SFG_WindowContextType ;\r
+\r
+#endif\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
+#if TARGET_HOST_POSIX_X11\r
+ GLXFBConfig* FBConfig; /* The window's FBConfig */\r
+#elif TARGET_HOST_MS_WINDOWS\r
+ HDC Device; /* The window's device context */\r
+#endif\r
+\r
+ int DoubleBuffered; /* Treat the window as double-buffered */\r
+};\r
+\r
+/* Window's state description. This structure should be kept portable. */\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
+#if TARGET_HOST_POSIX_X11\r
+ int OldWidth; /* Window width from before a resize */\r
+ int OldHeight; /* " height " " " " */\r
+#elif TARGET_HOST_MS_WINDOWS\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
+#endif\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
+/* -- 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
+/* A helper function to check if a display mode is possible to use */\r
+#if TARGET_HOST_POSIX_X11\r
+GLXFBConfig* fgChooseFBConfig( int* numcfgs );\r
+#endif\r
+\r
+/* The window procedure for Win32 events handling */\r
+#if TARGET_HOST_MS_WINDOWS\r
+LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg,\r
+ WPARAM wParam, LPARAM lParam );\r
+void fgNewWGLCreateContext( SFG_Window* window );\r
+GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,\r
+ unsigned char layer_type );\r
+#endif\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
+#if TARGET_HOST_POSIX_X11\r
+int fgIsSpaceballXEvent( const XEvent *ev );\r
+void fgSpaceballHandleXEvent( const XEvent *ev );\r
+#endif\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
+#if TARGET_HOST_MS_WINDOWS\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
+void fghComputeWindowRectFromClientArea_UseStyle ( const DWORD windowStyle , RECT *clientRect, BOOL posIsOutside );\r
+void fghComputeWindowRectFromClientArea_QueryWindow( const SFG_Window *window, RECT *clientRect, BOOL posIsOutside );\r
+void fghComputeClientAreaFromWindowRect ( const SFG_Window *window, RECT *windowRect, BOOL wantPosOutside );\r
+RECT fghGetClientArea ( const SFG_Window *window, BOOL wantPosOutside );\r
+void fghGetBorderWidth(const DWORD windowStyle, int* xBorderWidth, int* yBorderWidth);\r
+#endif\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
+/*\r
+ * Check if "hint" is present in "property" for "window". See freeglut_init.c\r
+ */\r
+#if TARGET_HOST_POSIX_X11\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
+#endif\r
+\r
+SFG_Proc fghGetProcAddress( const char *procName );\r
+\r
+#if TARGET_HOST_MS_WINDOWS\r
+extern void (__cdecl *__glutExitFunc)( int return_value );\r
+#endif\r
+\r
+#endif /* FREEGLUT_INTERNAL_H */\r
+\r
+/*** END OF FILE ***/\r
--- /dev/null
+/*\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
+/*\r
+ * Initial defines from "js.h" starting around line 33 with the existing "freeglut_joystick.c"\r
+ * interspersed\r
+ */\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
+# include <InputSprocket.h>\r
+#endif\r
+\r
+#if TARGET_HOST_MAC_OSX\r
+# define _JS_MAX_AXES 16\r
+# include <mach/mach.h>\r
+# include <IOKit/IOkitLib.h>\r
+# include <IOKit/hid/IOHIDLib.h>\r
+#endif\r
+\r
+#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\r
+# define _JS_MAX_AXES 8\r
+# include <windows.h>\r
+# include <mmsystem.h>\r
+# include <regstr.h>\r
+\r
+#endif\r
+\r
+#if TARGET_HOST_POSIX_X11\r
+# define _JS_MAX_AXES 16\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
+#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
+ * 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
+#if TARGET_HOST_MACINTOSH\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
+#endif\r
+\r
+#if TARGET_HOST_MAC_OSX\r
+ IOHIDDeviceInterface ** hidDev;\r
+ IOHIDElementCookie buttonCookies[41];\r
+ IOHIDElementCookie axisCookies[_JS_MAX_AXES];\r
+ long minReport[_JS_MAX_AXES],\r
+ maxReport[_JS_MAX_AXES];\r
+#endif\r
+\r
+#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\r
+ JOYCAPS jsCaps;\r
+ JOYINFOEX js;\r
+ UINT js_id;\r
+#endif\r
+\r
+\r
+#if TARGET_HOST_POSIX_X11\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
+#endif\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
+ * 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
+/*\r
+ * The static joystick structure pointer\r
+ */\r
+#define MAX_NUM_JOYSTICKS 2\r
+static SFG_Joystick *fgJoystick [ MAX_NUM_JOYSTICKS ];\r
+\r
+\r
+/*\r
+ * Read the raw joystick data\r
+ */\r
+static void fghJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes )\r
+{\r
+#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\r
+ MMRESULT status;\r
+#else\r
+ int status;\r
+#endif\r
+\r
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)\r
+ int len;\r
+#endif\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
+#if TARGET_HOST_MACINTOSH\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 ( 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 ( isp_elem [ i ], &state );\r
+ ISP_CHECK_ERR(err)\r
+\r
+ axes [i] = (float) state;\r
+ }\r
+ }\r
+#endif\r
+\r
+#if TARGET_HOST_MAC_OSX\r
+ if ( buttons != NULL )\r
+ {\r
+ *buttons = 0;\r
+\r
+ for ( i = 0; i < joy->num_buttons; i++ )\r
+ {\r
+ IOHIDEventStruct hidEvent;\r
+ (*(joy->hidDev))->getElementValue ( joy->hidDev, 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->hidDev))->getElementValue ( joy->hidDev, axisCookies[i], &hidEvent );\r
+ axes[i] = hidEvent.value;\r
+ }\r
+ }\r
+#endif\r
+\r
+#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\r
+ status = joyGetPosEx( joy->js_id, &joy->js );\r
+\r
+ if ( status != JOYERR_NOERROR )\r
+ {\r
+ joy->error = GL_TRUE;\r
+ return;\r
+ }\r
+\r
+ if ( buttons )\r
+ *buttons = joy->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->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->js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180.0f ) );\r
+ float c = (float) cos ( ( joy->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->js.dwVpos;\r
+ case 5: axes[4] = (float) joy->js.dwUpos;\r
+ case 4: axes[3] = (float) joy->js.dwRpos;\r
+ case 3: axes[2] = (float) joy->js.dwZpos;\r
+ case 2: axes[1] = (float) joy->js.dwYpos;\r
+ case 1: axes[0] = (float) joy->js.dwXpos;\r
+ }\r
+ }\r
+#endif\r
+\r
+#if TARGET_HOST_POSIX_X11\r
+# if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)\r
+ if ( joy->os->is_analog )\r
+ {\r
+ int status = read ( joy->os->fd, &joy->os->ajs, sizeof(joy->os->ajs) );\r
+ if ( status != sizeof(joy->os->ajs) ) {\r
+ perror ( joy->os->fname );\r
+ joy->error = GL_TRUE;\r
+ return;\r
+ }\r
+ if ( buttons != NULL )\r
+ *buttons = ( joy->os->ajs.b1 ? 1 : 0 ) | ( joy->os->ajs.b2 ? 2 : 0 );\r
+\r
+ if ( axes != NULL )\r
+ {\r
+ axes[0] = (float) joy->os->ajs.x;\r
+ axes[1] = (float) joy->os->ajs.y;\r
+ }\r
+\r
+ return;\r
+ }\r
+\r
+# ifdef HAVE_USB_JS\r
+ while ( ( len = read ( joy->os->fd, joy->os->hid_data_buf, joy->os->hid_dlen ) ) == joy->os->hid_dlen )\r
+ {\r
+ struct hid_item *h;\r
+\r
+ for ( h = joy->os->hids; h; h = h->next )\r
+ {\r
+ int d = hid_get_data ( joy->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->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->os->cache_axes[i] = (float)hatmap_x[d];\r
+ joy->os->cache_axes[i + 1] = (float)hatmap_y[d];\r
+ }\r
+ else\r
+ {\r
+ joy->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->os->cache_buttons |= (1 << ( usage - 1 ));\r
+ else\r
+ joy->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->os->fname );\r
+ joy->error = 1;\r
+ }\r
+ if ( buttons != NULL ) *buttons = joy->os->cache_buttons;\r
+ if ( axes != NULL )\r
+ memcpy ( axes, joy->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->fd, &joy->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->tmp_buttons;\r
+ if ( axes )\r
+ memcpy( axes, joy->tmp_axes,\r
+ sizeof( float ) * joy->num_axes );\r
+ return;\r
+ }\r
+#endif\r
+\r
+ fgWarning ( "%s", joy->fname );\r
+ joy->error = GL_TRUE;\r
+ return;\r
+ }\r
+\r
+ switch ( joy->js.type & ~JS_EVENT_INIT )\r
+ {\r
+ case JS_EVENT_BUTTON:\r
+ if( joy->js.value == 0 ) /* clear the flag */\r
+ joy->tmp_buttons &= ~( 1 << joy->js.number );\r
+ else\r
+ joy->tmp_buttons |= ( 1 << joy->js.number );\r
+ break;\r
+\r
+ case JS_EVENT_AXIS:\r
+ if ( joy->js.number < joy->num_axes )\r
+ {\r
+ joy->tmp_axes[ joy->js.number ] = ( float )joy->js.value;\r
+\r
+ if( axes )\r
+ memcpy( axes, joy->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->tmp_buttons;\r
+ if ( axes != NULL )\r
+ memcpy ( axes, joy->tmp_axes, sizeof(float) * joy->num_axes );\r
+\r
+ return;\r
+ }\r
+\r
+ if( buttons )\r
+ *buttons = joy->tmp_buttons;\r
+ }\r
+# else\r
+\r
+ status = read( joy->fd, &joy->js, JS_RETURN );\r
+\r
+ if ( status != JS_RETURN )\r
+ {\r
+ fgWarning( "%s", joy->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->js.b1 ? 1 : 0 ) | ( joy->js.b2 ? 2 : 0 ); /* XXX Should not be here -- BSD is handled earlier */\r
+# else\r
+ *buttons = joy->js.buttons;\r
+# endif\r
+\r
+ if ( axes )\r
+ {\r
+ axes[ 0 ] = (float) joy->js.x;\r
+ axes[ 1 ] = (float) joy->js.y;\r
+ }\r
+# endif\r
+#endif\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
+ 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->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
+#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\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->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->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
+#endif\r
+\r
+\r
+static void fghJoystickOpen( SFG_Joystick* joy )\r
+{\r
+ int i = 0;\r
+#if TARGET_HOST_MACINTOSH\r
+ OSStatus err;\r
+#endif\r
+#if TARGET_HOST_MAC_OSX\r
+ IOReturn rv;\r
+ SInt32 score;\r
+ IOCFPlugInInterface **plugin;\r
+\r
+ HRESULT pluginResult;\r
+\r
+ CFDictionaryRef props;\r
+ CFTypeRef topLevelElement;\r
+#endif\r
+#if TARGET_HOST_POSIX_X11\r
+# if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
+ char *cp;\r
+# endif\r
+# ifdef JS_NEW\r
+ unsigned char u;\r
+# else\r
+# if defined( __linux__ ) || TARGET_HOST_SOLARIS\r
+ int counter = 0;\r
+# endif\r
+# endif\r
+#endif\r
+\r
+ /* Silence gcc, the correct #ifdefs would be too fragile... */\r
+ (void)i;\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
+#if TARGET_HOST_MACINTOSH\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->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( joy->isp_num_needs,\r
+ joy->isp_needs, joy->isp_elem,\r
+ 0 );\r
+ ISP_CHECK_ERR( err )\r
+\r
+ err = ISpInit( joy->isp_num_needs, joy->isp_needs, joy->isp_elem,\r
+ 'freeglut', nil, 0, 128, 0 );\r
+ ISP_CHECK_ERR( err )\r
+\r
+ joy->num_buttons = joy->isp_num_needs - joy->isp_num_axis;\r
+ joy->num_axes = joy->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
+#endif\r
+\r
+#if TARGET_HOST_MAC_OSX\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->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->hidDev == NULL )\r
+ return;\r
+\r
+ /* store the interface in this instance */\r
+ rv = ( *( joy->hidDev ) )->open( joy->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
+#endif\r
+\r
+#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\r
+ joy->js.dwFlags = JOY_RETURNALL;\r
+ joy->js.dwSize = sizeof( joy->js );\r
+\r
+ memset( &joy->jsCaps, 0, sizeof( joy->jsCaps ) );\r
+\r
+ joy->error =\r
+ ( joyGetDevCaps( joy->js_id, &joy->jsCaps, sizeof( joy->jsCaps ) ) !=\r
+ JOYERR_NOERROR );\r
+\r
+ if( joy->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->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->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->jsCaps.wVmin;\r
+ joy->max[ 5 ] = ( float )joy->jsCaps.wVmax;\r
+ joy->min[ 4 ] = ( float )joy->jsCaps.wUmin;\r
+ joy->max[ 4 ] = ( float )joy->jsCaps.wUmax;\r
+ joy->min[ 3 ] = ( float )joy->jsCaps.wRmin;\r
+ joy->max[ 3 ] = ( float )joy->jsCaps.wRmax;\r
+ joy->min[ 2 ] = ( float )joy->jsCaps.wZmin;\r
+ joy->max[ 2 ] = ( float )joy->jsCaps.wZmax;\r
+ joy->min[ 1 ] = ( float )joy->jsCaps.wYmin;\r
+ joy->max[ 1 ] = ( float )joy->jsCaps.wYmax;\r
+ joy->min[ 0 ] = ( float )joy->jsCaps.wXmin;\r
+ joy->max[ 0 ] = ( float )joy->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
+#endif\r
+\r
+#if TARGET_HOST_POSIX_X11\r
+#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
+ for( i = 0; i < _JS_MAX_AXES; i++ )\r
+ joy->os->cache_axes[ i ] = 0.0f;\r
+\r
+ joy->os->cache_buttons = 0;\r
+\r
+ joy->os->fd = open( joy->os->fname, O_RDONLY | O_NONBLOCK);\r
+\r
+#ifdef HAVE_ERRNO_H\r
+ if( joy->os->fd < 0 && errno == EACCES )\r
+ fgWarning ( "%s exists but is not readable by you", joy->os->fname );\r
+#endif\r
+\r
+ joy->error =( joy->os->fd < 0 );\r
+\r
+ if( joy->error )\r
+ return;\r
+\r
+ joy->num_axes = 0;\r
+ joy->num_buttons = 0;\r
+ if( joy->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->os, &joy->num_axes,\r
+ &joy->num_buttons ) )\r
+ {\r
+ close( joy->os->fd );\r
+ joy->error = GL_TRUE;\r
+ return;\r
+ }\r
+\r
+ cp = strrchr( joy->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->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->tmp_axes[ i ] = 0.0f;\r
+\r
+ joy->tmp_buttons = 0;\r
+# endif\r
+\r
+ joy->fd = open( joy->fname, O_RDONLY );\r
+\r
+ joy->error =( joy->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->fd, JSIOCGAXES, &u );\r
+ joy->num_axes = u;\r
+ ioctl( joy->fd, JSIOCGBUTTONS, &u );\r
+ joy->num_buttons = u;\r
+ ioctl( joy->fd, JSIOCGNAME( sizeof( joy->name ) ), joy->name );\r
+ fcntl( joy->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
+#endif\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
+#if TARGET_HOST_MACINTOSH\r
+ fgJoystick[ ident ]->id = ident;\r
+ snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident ); /* FIXME */\r
+ fgJoystick[ ident ]->error = GL_FALSE;\r
+#endif\r
+\r
+#if TARGET_HOST_MAC_OSX\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
+#endif\r
+\r
+#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\r
+ switch( ident )\r
+ {\r
+ case 0:\r
+ fgJoystick[ ident ]->js_id = JOYSTICKID1;\r
+ fgJoystick[ ident ]->error = GL_FALSE;\r
+ break;\r
+ case 1:\r
+ fgJoystick[ ident ]->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
+#endif\r
+\r
+#if TARGET_HOST_POSIX_X11\r
+# if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
+ fgJoystick[ ident ]->id = ident;\r
+ fgJoystick[ ident ]->error = GL_FALSE;\r
+\r
+ fgJoystick[ ident ]->os = calloc( 1, sizeof( struct os_specific_s ) );\r
+ memset( fgJoystick[ ident ]->os, 0, sizeof( struct os_specific_s ) );\r
+ if( ident < USB_IDENT_OFFSET )\r
+ fgJoystick[ ident ]->os->is_analog = 1;\r
+ if( fgJoystick[ ident ]->os->is_analog )\r
+ snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", AJSDEV, ident );\r
+ else\r
+ snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->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]->fname, sizeof(fgJoystick[ident]->fname), "/dev/input/js%d", ident );\r
+\r
+ if( access( fgJoystick[ ident ]->fname, F_OK ) != 0 )\r
+ snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident );\r
+# endif\r
+#endif\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
+ *\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
+\r
+#if TARGET_HOST_MACINTOSH\r
+ ISpSuspend( );\r
+ ISpStop( );\r
+ ISpShutdown( );\r
+#endif\r
+\r
+#if TARGET_HOST_MAC_OSX\r
+ ( *( fgJoystick[ ident ]->hidDev ) )->\r
+ close( fgJoystick[ ident ]->hidDev );\r
+#endif\r
+\r
+#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\r
+ /* Do nothing special */\r
+#endif\r
+\r
+#if TARGET_HOST_POSIX_X11\r
+#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )\r
+ if( fgJoystick[ident]->os )\r
+ {\r
+ if( ! fgJoystick[ ident ]->error )\r
+ close( fgJoystick[ ident ]->os->fd );\r
+#ifdef HAVE_USB_JS\r
+ if( fgJoystick[ ident ]->os->hids )\r
+ free (fgJoystick[ ident ]->os->hids);\r
+ if( fgJoystick[ ident ]->os->hid_data_buf )\r
+ free( fgJoystick[ ident ]->os->hid_data_buf );\r
+#endif\r
+ free( fgJoystick[ident]->os );\r
+ }\r
+#endif\r
+\r
+ if( ! fgJoystick[ident]->error )\r
+ close( fgJoystick[ ident ]->fd );\r
+#endif\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
--- /dev/null
+/*\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
+#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
+ * 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
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */\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
+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
+#if TARGET_HOST_POSIX_X11\r
+\r
+ XResizeWindow( fgDisplay.Display, window->Window.Handle,\r
+ width, height );\r
+ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
+\r
+#elif TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)\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
+#endif\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
+static 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
+ * A static helper function to execute display callback for a window\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
+\r
+#if TARGET_HOST_POSIX_X11\r
+ fghRedrawWindow ( window ) ;\r
+#elif TARGET_HOST_MS_WINDOWS\r
+\r
+ RedrawWindow(\r
+ window->Window.Handle, NULL, NULL,\r
+ RDW_NOERASE | RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_UPDATENOW\r
+ );\r
+#endif\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
+#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
+#elif TARGET_HOST_MS_WINDOWS\r
+# if defined(_WIN32_WCE)\r
+ return GetTickCount();\r
+# else\r
+ return timeGetTime();\r
+# endif\r
+#endif\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
+ * Does the magic required to relinquish the CPU until something interesting\r
+ * happens.\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
+#if TARGET_HOST_POSIX_X11\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.Display ) )\r
+ {\r
+ fd_set fdset;\r
+ int err;\r
+ int socket;\r
+ struct timeval wait;\r
+\r
+ socket = ConnectionNumber( fgDisplay.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
+#elif TARGET_HOST_MS_WINDOWS\r
+ MsgWaitForMultipleObjects( 0, NULL, FALSE, msec, QS_ALLINPUT );\r
+#endif\r
+}\r
+\r
+#if TARGET_HOST_POSIX_X11\r
+/*\r
+ * Returns GLUT modifier mask for the state field of an X11 event.\r
+ */\r
+int fghGetXModifiers( 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
+#endif\r
+\r
+\r
+#if TARGET_HOST_POSIX_X11 && _DEBUG\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
+#endif\r
+\r
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */\r
+\r
+/*\r
+ * Executes a single iteration in the freeglut processing loop.\r
+ */\r
+void FGAPIENTRY glutMainLoopEvent( void )\r
+{\r
+#if TARGET_HOST_POSIX_X11\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.Display ) )\r
+ {\r
+ XNextEvent( fgDisplay.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.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.OldWidth ) ||\r
+ ( height != window->State.OldHeight ) )\r
+ {\r
+ SFG_Window *current_window = fgStructure.CurrentWindow;\r
+\r
+ window->State.OldWidth = width;\r
+ window->State.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 = fghGetXModifiers( 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 = fghGetXModifiers( 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.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 = fghGetXModifiers( 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 = fghGetXModifiers( 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
+#elif TARGET_HOST_MS_WINDOWS\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
+#endif\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
+#if TARGET_HOST_MS_WINDOWS\r
+ SFG_Window *window = (SFG_Window *)fgStructure.Windows.First ;\r
+#endif\r
+\r
+ FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMainLoop" );\r
+\r
+#if TARGET_HOST_MS_WINDOWS\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
+#endif\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
+#if TARGET_HOST_MS_WINDOWS\r
+/*\r
+ * Determine a GLUT modifer mask based on MS-WINDOWS system info.\r
+ */\r
+static int fghGetWin32Modifiers (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 fgWindowProc( 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
+ "fgWindowProc" );\r
+\r
+ window->Window.Handle = hWnd;\r
+ window->Window.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.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.Device );\r
+ }\r
+\r
+ /* window->Window.Context = wglGetCurrentContext (); */\r
+ window->Window.Context = wglCreateContext( window->Window.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.Device );\r
+ else\r
+ {\r
+ window->Window.Context = wglGetCurrentContext( );\r
+ if( ! window->Window.Context )\r
+ window->Window.Context =\r
+ wglCreateContext( window->Window.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.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
+ 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 = fghGetWin32Modifiers( );\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 = fghGetWin32Modifiers( );\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 = fghGetWin32Modifiers( );\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 = fghGetWin32Modifiers( );\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 = fghGetWin32Modifiers( );\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 = fghGetWin32Modifiers( );\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
+#endif\r
+\r
+/*** END OF FILE ***/\r
--- /dev/null
+/*\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
+#if TARGET_HOST_MS_WINDOWS\r
+#define FREEGLUT_MENU_FONT GLUT_BITMAP_8_BY_13\r
+#else\r
+#define FREEGLUT_MENU_FONT GLUT_BITMAP_HELVETICA_18\r
+#endif\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
+#if TARGET_HOST_MS_WINDOWS\r
+static float menu_pen_fore [4] = {0.0f, 0.0f, 0.0f, 1.0f};\r
+static float menu_pen_back [4] = {0.85f, 0.85f, 0.85f, 1.0f};\r
+static float menu_pen_hfore [4] = {1.0f, 1.0f, 1.0f, 1.0f};\r
+static float menu_pen_hback [4] = {0.15f, 0.15f, 0.45f, 1.0f};\r
+#else\r
+static float menu_pen_fore [4] = {0.0f, 0.0f, 0.0f, 1.0f};\r
+static float menu_pen_back [4] = {0.70f, 0.70f, 0.70f, 1.0f};\r
+static float menu_pen_hfore [4] = {0.0f, 0.0f, 0.0f, 1.0f};\r
+static float menu_pen_hback [4] = {1.0f, 1.0f, 1.0f, 1.0f};\r
+#endif\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
+ {\r
+#if TARGET_HOST_POSIX_X11\r
+ int wx, wy;\r
+ Window w;\r
+\r
+ XTranslateCoordinates(\r
+ fgDisplay.Display,\r
+ window->Window.Handle,\r
+ fgDisplay.RootWindow,\r
+ 0, 0, &wx, &wy, &w);\r
+\r
+ *x = fgState.GameModeSize.X + wx;\r
+ *y = fgState.GameModeSize.Y + wy;\r
+#else\r
+ *x = glutGet ( GLUT_SCREEN_WIDTH );\r
+ *y = glutGet ( GLUT_SCREEN_HEIGHT );\r
+#endif\r
+ }\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
+#if TARGET_HOST_MS_WINDOWS\r
+int FGAPIENTRY __glutCreateMenuWithExit( void(* callback)( int ), void (__cdecl *exit_function)(int) )\r
+{\r
+ __glutExitFunc = exit_function;\r
+ return glutCreateMenu( callback );\r
+}\r
+#endif\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/* 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
+#if TARGET_HOST_POSIX_X11\r
+#include <X11/Xlib.h>\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
+#endif\r
+\r
+/* Flag telling whether we have a spaceball:\r
+ * 0 - haven't tried initializing\r
+ * 1 - have successfully initialized\r
+ * -1 - have tried to initialize but not succeeded\r
+ */\r
+static int sball_initialized = 0;\r
+\r
+\r
+void fgInitialiseSpaceball(void)\r
+{\r
+ if(sball_initialized != 0) {\r
+ return;\r
+ }\r
+\r
+#if TARGET_HOST_POSIX_X11\r
+ {\r
+ Window w;\r
+\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.Display, w) == -1)\r
+ {\r
+ sball_initialized = -1;\r
+ return;\r
+ }\r
+ }\r
+#endif\r
+\r
+ sball_initialized = 1;\r
+}\r
+\r
+void fgSpaceballClose(void)\r
+{\r
+#if TARGET_HOST_POSIX_X11\r
+ spnav_close();\r
+#endif\r
+}\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
+#if TARGET_HOST_POSIX_X11\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
+#else\r
+ return 0;\r
+#endif\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
+#if TARGET_HOST_POSIX_X11\r
+ return 2; /* TODO implement this properly */\r
+#else\r
+ return 0;\r
+#endif\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
+#if TARGET_HOST_POSIX_X11\r
+ if(spnav_win != window) {\r
+ spnav_x11_window(window->Window.Handle);\r
+ spnav_win = window;\r
+ }\r
+#endif\r
+}\r
+\r
+\r
+#if TARGET_HOST_POSIX_X11\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
+#endif /* TARGET_HOST_POSIX_X11 */\r
--- /dev/null
+/*\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
+/* -- LOCAL DEFINITIONS ---------------------------------------------------- */\r
+\r
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */\r
+\r
+#if TARGET_HOST_POSIX_X11\r
+/*\r
+ * Queries the GL context about some attributes\r
+ */\r
+static int fghGetConfig( int attribute )\r
+{\r
+ int returnValue = 0;\r
+ int result; /* Not checked */\r
+\r
+ if( fgStructure.CurrentWindow )\r
+ result = glXGetFBConfigAttrib( fgDisplay.Display,\r
+ *(fgStructure.CurrentWindow->Window.FBConfig),\r
+ attribute,\r
+ &returnValue );\r
+\r
+ return returnValue;\r
+}\r
+#endif\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
+#if TARGET_HOST_MS_WINDOWS\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
+#endif\r
+\r
+\r
+/*\r
+ * General settings query method\r
+ */\r
+int FGAPIENTRY glutGet( GLenum eWhat )\r
+{\r
+#if TARGET_HOST_MS_WINDOWS\r
+ int returnValue ;\r
+ GLboolean boolValue ;\r
+#endif\r
+\r
+ int nsamples = 0;\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
+#if TARGET_HOST_POSIX_X11\r
+ /*\r
+ * The window/context specific queries are handled mostly by\r
+ * fghGetConfig().\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 fghGetConfig( 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( (fghGetConfig( 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.FBConfig;\r
+\r
+ XVisualInfo * visualInfo =\r
+ glXGetVisualFromFBConfig( fgDisplay.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.Display,\r
+ fgStructure.CurrentWindow->Window.Handle,\r
+ fgDisplay.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.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.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 fgChooseFBConfig again here. */\r
+ GLXFBConfig * fbconfig;\r
+ int isPossible;\r
+\r
+ fbconfig = fgChooseFBConfig(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 fghGetConfig( GLX_VISUAL_ID );\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\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.Device );\r
+#endif /* defined(_WIN32_WCE) */\r
+ return 0;\r
+\r
+#endif\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
+ fgWarning( "glutGet(): missing enum handle %d", 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_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
+#if TARGET_HOST_POSIX_X11\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.Display, &map,0);\r
+ return nbuttons;\r
+ }\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\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
+#endif\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
+ fgWarning( "glutDeviceGet(): missing enum handle %d", eWhat );\r
+ break;\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
+#if TARGET_HOST_POSIX_X11\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
+#elif TARGET_HOST_MS_WINDOWS\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
+#endif\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
+int * FGAPIENTRY glutGetModeValues(GLenum eWhat, int * size)\r
+{\r
+ int * array;\r
+\r
+#if TARGET_HOST_POSIX_X11\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
+#endif\r
+\r
+ FREEGLUT_EXIT_IF_NOT_INITIALISED("glutGetModeValues");\r
+\r
+ array = NULL;\r
+ *size = 0;\r
+\r
+ switch (eWhat)\r
+ {\r
+#if TARGET_HOST_POSIX_X11\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.Display,\r
+ fgDisplay.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.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
+#endif \r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return array;\r
+}\r
+\r
+/*** END OF FILE ***/\r
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
+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
+#if TARGET_HOST_UNIX_X11\r
+ window->Window.FBConfig = NULL;\r
+#endif\r
+ fghClearCallBacks( window );\r
+\r
+ /* Initialize the object properties */\r
+ window->ID = ++fgStructure.WindowID;\r
+#if TARGET_HOST_POSIX_X11\r
+ window->State.OldHeight = window->State.OldWidth = -1;\r
+#endif\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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 TARGET_HOST_POSIX_X11\r
+#include <limits.h> /* LONG_MAX */\r
+#include <unistd.h> /* usleep */\r
+#endif\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
+#if TARGET_HOST_POSIX_X11\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
+#endif /* TARGET_HOST_POSIX_X11 */\r
+\r
+\r
+#if TARGET_HOST_MS_WINDOWS\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
+\r
+#endif /* TARGET_HOST_MS_WINDOWS */\r
+\r
+#ifdef WM_TOUCH\r
+ typedef BOOL (WINAPI *pRegisterTouchWindow)(HWND,ULONG);\r
+ static pRegisterTouchWindow fghRegisterTouchWindow = (pRegisterTouchWindow)0xDEADBEEF;\r
+#endif\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
+ * TODO BEFORE THE STABLE RELEASE:\r
+ *\r
+ * fgChooseFBConfig() -- OK, but what about glutInitDisplayString()?\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
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */\r
+\r
+static int fghIsLegacyContextVersionRequested( void )\r
+{\r
+ return fgState.MajorVersion < 2 || (fgState.MajorVersion == 2 && fgState.MinorVersion <= 1);\r
+}\r
+\r
+static int fghIsLegacyContextRequested( void )\r
+{\r
+ return fghIsLegacyContextVersionRequested() &&\r
+ fgState.ContextFlags == 0 &&\r
+ fgState.ContextProfile == 0;\r
+}\r
+\r
+static 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
+static int fghMapBit( int mask, int from, int to )\r
+{\r
+ return ( mask & from ) ? to : 0;\r
+\r
+}\r
+\r
+static 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
+#if TARGET_HOST_POSIX_X11\r
+/*\r
+ * Chooses a visual basing on the current display mode settings\r
+ */\r
+\r
+GLXFBConfig* fgChooseFBConfig( 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.Display,\r
+ fgDisplay.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.Display,\r
+ fbconfigArray[0],\r
+ GLX_BUFFER_SIZE,\r
+ &bufferSizeMin );\r
+ /* Get bufferSizeMax. */\r
+ result =\r
+ glXGetFBConfigAttrib( fgDisplay.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.Display,\r
+ fgDisplay.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.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.Display,\r
+ * fgDisplay.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.Display;\r
+ GLXFBConfig config = *(window->Window.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) fghGetProcAddress( "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.OldWidth;\r
+ fgStructure.CurrentWindow->State.Height = win->State.OldHeight;\r
+\r
+ } else {\r
+ /* resize the window to cover the entire screen */\r
+ XGetWindowAttributes(fgDisplay.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.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.State || !fgDisplay.StateFullScreen) {\r
+ return -1;\r
+ }\r
+\r
+ xev.type = ClientMessage;\r
+ xev.xclient.window = fgStructure.CurrentWindow->Window.Handle;\r
+ xev.xclient.message_type = fgDisplay.State;\r
+ xev.xclient.format = 32;\r
+ xev.xclient.data.l[0] = _NET_WM_STATE_TOGGLE;\r
+ xev.xclient.data.l[1] = fgDisplay.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.Display, fgDisplay.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
+\r
+#endif /* TARGET_HOST_POSIX_X11 */\r
+\r
+\r
+#if TARGET_HOST_MS_WINDOWS\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.Device, window->Window.Context );\r
+\r
+ if ( !fghIsExtensionSupported( window->Window.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.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.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.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.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.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
+#endif /* TARGET_HOST_MS_WINDOWS */\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
+#if TARGET_HOST_POSIX_X11\r
+ if ( window )\r
+ {\r
+ glXMakeContextCurrent(\r
+ fgDisplay.Display,\r
+ window->Window.Handle,\r
+ window->Window.Handle,\r
+ window->Window.Context\r
+ );\r
+ }\r
+#elif TARGET_HOST_MS_WINDOWS\r
+ if ( window != fgStructure.CurrentWindow )\r
+ {\r
+ if( fgStructure.CurrentWindow )\r
+ ReleaseDC( fgStructure.CurrentWindow->Window.Handle,\r
+ fgStructure.CurrentWindow->Window.Device );\r
+\r
+ if ( window )\r
+ {\r
+ window->Window.Device = GetDC( window->Window.Handle );\r
+ wglMakeCurrent(\r
+ window->Window.Device,\r
+ window->Window.Context\r
+ );\r
+ }\r
+ }\r
+#endif\r
+ fgStructure.CurrentWindow = window;\r
+}\r
+\r
+#if TARGET_HOST_MS_WINDOWS\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.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.DisplayName )\r
+ {\r
+ m_proc_t st;\r
+ st.x=xp;\r
+ st.y=yp;\r
+ st.name=fgDisplay.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.DisplayName )\r
+ {\r
+ fgWarning( "for working -display support FreeGLUT must be compiled with WINVER >= 0x0500");\r
+ }\r
+}\r
+#endif\r
+#endif\r
+\r
+\r
+#if TARGET_HOST_POSIX_X11\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
+#endif\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
+#if TARGET_HOST_POSIX_X11\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.FBConfig = fgChooseFBConfig( &num_FBConfigs );\r
+\r
+ if( window->IsMenu && ( ! fgStructure.MenuContext ) )\r
+ fgState.DisplayMode = current_DisplayMode ;\r
+\r
+ if( ! window->Window.FBConfig )\r
+ {\r
+ /*\r
+ * The "fgChooseFBConfig" 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.FBConfig = fgChooseFBConfig( &num_FBConfigs );\r
+ fgState.DisplayMode &= ~GLUT_DOUBLE;\r
+ }\r
+\r
+ if( fgState.DisplayMode & GLUT_MULTISAMPLE )\r
+ {\r
+ fgState.DisplayMode &= ~GLUT_MULTISAMPLE ;\r
+ window->Window.FBConfig = fgChooseFBConfig( &num_FBConfigs );\r
+ fgState.DisplayMode |= GLUT_MULTISAMPLE;\r
+ }\r
+ }\r
+\r
+ FREEGLUT_INTERNAL_ERROR_EXIT( window->Window.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.Display,\r
+ window->Window.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.Display, fgDisplay.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.Display,\r
+ window->Parent == NULL ? fgDisplay.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.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.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.Display, window->Window.Handle,\r
+ &fgDisplay.DeleteWindow, 1 );\r
+\r
+ glXMakeContextCurrent(\r
+ fgDisplay.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.Display, &(window->Window.Handle) );\r
+ #endif\r
+\r
+ XMapWindow( fgDisplay.Display, window->Window.Handle );\r
+\r
+ XFree(visualInfo);\r
+\r
+ if( !isSubWindow)\r
+ XPeekIfEvent( fgDisplay.Display, &eventReturnBuffer, &fghWindowIsVisible, (XPointer)(window->Window.Handle) );\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\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.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.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.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
+#endif\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
+#if TARGET_HOST_POSIX_X11\r
+\r
+ if( window->Window.Context )\r
+ glXDestroyContext( fgDisplay.Display, window->Window.Context );\r
+ XFree( window->Window.FBConfig );\r
+\r
+ if( window->Window.Handle ) {\r
+ XDestroyWindow( fgDisplay.Display, window->Window.Handle );\r
+ }\r
+ /* XFlush( fgDisplay.Display ); */ /* XXX Shouldn't need this */\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\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
+#endif\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
+#if TARGET_HOST_MS_WINDOWS\r
+int FGAPIENTRY __glutCreateWindowWithExit( const char *title, void (__cdecl *exit_function)(int) )\r
+{\r
+ __glutExitFunc = exit_function;\r
+ return glutCreateWindow( title );\r
+}\r
+#endif\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
+#if TARGET_HOST_POSIX_X11\r
+\r
+ XMapWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle );\r
+ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\r
+\r
+ ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_SHOW );\r
+\r
+#endif\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
+#if TARGET_HOST_POSIX_X11\r
+\r
+ if( fgStructure.CurrentWindow->Parent == NULL )\r
+ XWithdrawWindow( fgDisplay.Display,\r
+ fgStructure.CurrentWindow->Window.Handle,\r
+ fgDisplay.Screen );\r
+ else\r
+ XUnmapWindow( fgDisplay.Display,\r
+ fgStructure.CurrentWindow->Window.Handle );\r
+ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\r
+\r
+ ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_HIDE );\r
+\r
+#endif\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
+#if TARGET_HOST_POSIX_X11\r
+\r
+ XIconifyWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle,\r
+ fgDisplay.Screen );\r
+ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\r
+\r
+ ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_MINIMIZE );\r
+\r
+#endif\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
+#if TARGET_HOST_POSIX_X11\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.Display,\r
+ fgStructure.CurrentWindow->Window.Handle,\r
+ &text\r
+ );\r
+\r
+ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\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
+#endif\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
+#if TARGET_HOST_POSIX_X11\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.Display,\r
+ fgStructure.CurrentWindow->Window.Handle,\r
+ &text\r
+ );\r
+\r
+ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\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
+#endif\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
+#if TARGET_HOST_POSIX_X11\r
+\r
+ XMoveWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle,\r
+ x, y );\r
+ XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\r
+\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
+#endif\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
+#if TARGET_HOST_POSIX_X11\r
+\r
+ XLowerWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle );\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\r
+\r
+ SetWindowPos(\r
+ fgStructure.CurrentWindow->Window.Handle,\r
+ HWND_BOTTOM,\r
+ 0, 0, 0, 0,\r
+ SWP_NOSIZE | SWP_NOMOVE\r
+ );\r
+\r
+#endif\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
+#if TARGET_HOST_POSIX_X11\r
+\r
+ XRaiseWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle );\r
+\r
+#elif TARGET_HOST_MS_WINDOWS\r
+\r
+ SetWindowPos(\r
+ fgStructure.CurrentWindow->Window.Handle,\r
+ HWND_TOP,\r
+ 0, 0, 0, 0,\r
+ SWP_NOSIZE | SWP_NOMOVE\r
+ );\r
+\r
+#endif\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
+#if TARGET_HOST_POSIX_X11\r
+ if(!glutGet(GLUT_FULL_SCREEN)) {\r
+ if(fghToggleFullscreen() != -1) {\r
+ win->State.IsFullscreen = GL_TRUE;\r
+ }\r
+ }\r
+\r
+#elif TARGET_HOST_MS_WINDOWS && !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.OldRect );\r
+\r
+ /* store current window style */\r
+ win->State.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.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 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
+#if TARGET_HOST_POSIX_X11\r
+ if(glutGet(GLUT_FULL_SCREEN)) {\r
+ if(fghToggleFullscreen() != -1) {\r
+ win->State.IsFullscreen = GL_FALSE;\r
+ }\r
+ }\r
+\r
+#elif TARGET_HOST_MS_WINDOWS && !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.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.OldRect.left,\r
+ win->State.OldRect.top,\r
+ win->State.OldRect.right - win->State.OldRect.left,\r
+ win->State.OldRect.bottom - win->State.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 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
+#if TARGET_HOST_POSIX_X11\r
+ if(fghToggleFullscreen() != -1) {\r
+ win->State.IsFullscreen = !win->State.IsFullscreen;\r
+ }\r
+#elif TARGET_HOST_MS_WINDOWS\r
+ if (!win->State.IsFullscreen)\r
+ glutFullScreen();\r
+ else\r
+ glutLeaveFullScreen();\r
+#endif\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
--- /dev/null
+/* Written for XI1 by Nikolas Doerfler <doerflen@in.tum.de> (c) 2008 *
+ * Rewritten for XI2 by Florian Echtler <echtler@in.tum.de> (c) 2009 */
+
+#include <GL/freeglut.h>
+
+#include "freeglut_internal.h"
+
+#if TARGET_HOST_POSIX_X11 && HAVE_X11_EXTENSIONS_XINPUT2_H
+
+#include <errno.h>
+#include <stdarg.h>
+
+#include <X11/Xlib.h>
+#include <X11/extensions/XInput2.h>
+
+/* import function from freeglut_main.c */
+int fghGetXModifiers( int state );
+
+/* extension opcode for XInput */
+int xi_opcode = -1;
+
+/**
+ * \brief Sets window up for XI2 events.
+ */
+void fgRegisterDevices( Display* dpy, Window* win ) {
+
+ XIEventMask mask;
+ unsigned char flags[2] = { 0, 0 };
+ int event, error;
+
+ /*Display* dpy = fgDisplay.Display;
+ Window* win = glutGetXWindow();*/
+
+ /* get XInput extension opcode */
+ if (!XQueryExtension( dpy, "XInputExtension", &xi_opcode, &event, &error )) { xi_opcode = -1; }
+
+ /* Select for motion events */
+ mask.deviceid = XIAllMasterDevices;
+ mask.mask_len = 2;
+ mask.mask = flags;
+
+ XISetMask(mask.mask, XI_Enter);
+ XISetMask(mask.mask, XI_Motion);
+ XISetMask(mask.mask, XI_ButtonPress);
+ XISetMask(mask.mask, XI_ButtonRelease);
+ XISetMask(mask.mask, XI_Leave);
+ /*XISetMask(mask.mask, XI_KeyPress);
+ XISetMask(mask.mask, XI_KeyRelease);
+ XISetMask(mask.mask, XI_DeviceChanged);
+ XISetMask(mask.mask, XI_RawEvent);
+ XISetMask(mask.mask, XI_FocusIn);
+ XISetMask(mask.mask, XI_FocusOut);
+ XISetMask(mask.mask, XI_HierarchyChanged);*/
+
+ XISelectEvents( dpy, *win, &mask, 1 );
+}
+
+
+void fgPrintXILeaveEvent(XILeaveEvent* event)
+{
+ char* mode = "";
+ char* detail = "";
+ int i;
+
+ printf(" windows: root 0x%lx event 0x%lx child 0x%ld\n",
+ event->root, event->event, event->child);
+ switch(event->mode)
+ {
+ case NotifyNormal: mode = "NotifyNormal"; break;
+ case NotifyGrab: mode = "NotifyGrab"; break;
+ case NotifyUngrab: mode = "NotifyUngrab"; break;
+ case NotifyWhileGrabbed: mode = "NotifyWhileGrabbed"; break;
+ }
+ switch (event->detail)
+ {
+ case NotifyAncestor: detail = "NotifyAncestor"; break;
+ case NotifyVirtual: detail = "NotifyVirtual"; break;
+ case NotifyInferior: detail = "NotifyInferior"; break;
+ case NotifyNonlinear: detail = "NotifyNonlinear"; break;
+ case NotifyNonlinearVirtual: detail = "NotifyNonlinearVirtual"; break;
+ case NotifyPointer: detail = "NotifyPointer"; break;
+ case NotifyPointerRoot: detail = "NotifyPointerRoot"; break;
+ case NotifyDetailNone: detail = "NotifyDetailNone"; break;
+ }
+ printf(" mode: %s (detail %s)\n", mode, detail);
+ printf(" flags: %s %s\n", event->focus ? "[focus]" : "",
+ event->same_screen ? "[same screen]" : "");
+ printf(" buttons:");
+ for (i = 0; i < event->buttons.mask_len * 8; i++)
+ if (XIMaskIsSet(event->buttons.mask, i))
+ printf(" %d", i);
+ printf("\n");
+
+ printf(" modifiers: locked 0x%x latched 0x%x base 0x%x\n",
+ event->mods.locked, event->mods.latched,
+ event->mods.base);
+ printf(" group: locked 0x%x latched 0x%x base 0x%x\n",
+ event->group.locked, event->group.latched,
+ event->group.base);
+
+ printf(" root x/y: %.2f / %.2f\n", event->root_x, event->root_y);
+ printf(" event x/y: %.2f / %.2f\n", event->event_x, event->event_y);
+
+}
+
+
+void fgPrintXIDeviceEvent(XIDeviceEvent* event)
+{
+ double *val;
+ int i;
+
+ printf(" device: %d (%d)\n", event->deviceid, event->sourceid);
+ printf(" detail: %d\n", event->detail);
+ printf(" buttons:");
+ for (i = 0; i < event->buttons.mask_len * 8; i++)
+ if (XIMaskIsSet(event->buttons.mask, i))
+ printf(" %d", i);
+ printf("\n");
+
+ printf(" modifiers: locked 0x%x latched 0x%x base 0x%x\n",
+ event->mods.locked, event->mods.latched,
+ event->mods.base);
+ printf(" group: locked 0x%x latched 0x%x base 0x%x\n",
+ event->group.locked, event->group.latched,
+ event->group.base);
+ printf(" valuators:");
+
+ val = event->valuators.values;
+ for (i = 0; i < event->valuators.mask_len * 8; i++)
+ if (XIMaskIsSet(event->valuators.mask, i))
+ printf(" %d: %.2f", i, *val++);
+ printf("\n");
+
+ printf(" windows: root 0x%lx event 0x%lx child 0x%ld\n",
+ event->root, event->event, event->child);
+ printf(" root x/y: %.2f / %.2f\n", event->root_x, event->root_y);
+ printf(" event x/y: %.2f / %.2f\n", event->event_x, event->event_y);
+
+}
+
+
+/**
+ * \brief This function is called when an Extension Event is received
+ * and calls the corresponding callback functions for these events.
+ */
+void fgHandleExtensionEvents( XEvent* base_ev ) {
+
+ int i, button = 0;
+ XGenericEventCookie* cookie = (XGenericEventCookie*)&(base_ev->xcookie);
+
+ if ( XGetEventData( fgDisplay.Display, cookie ) && (cookie->type == GenericEvent) && (cookie->extension == xi_opcode) ) {
+
+ XIDeviceEvent* event = (XIDeviceEvent*)(cookie->data);
+ /*printf("XI2 event type: %d - %d\n", cookie->evtype, event->type );*/
+
+ SFG_Window* window = fgWindowByHandle( event->event );
+ if (!window) return;
+
+ switch (cookie->evtype) {
+
+ case XI_Enter:
+ case XI_Leave:
+ fgState.Modifiers = fghGetXModifiers( ((XIEnterEvent*)event)->mods.base );
+ INVOKE_WCB( *window, MultiEntry, (
+ event->deviceid,
+ (event->evtype == XI_Enter ? GLUT_ENTERED : GLUT_LEFT)
+ ));
+ #if _DEBUG
+ fgPrintXILeaveEvent((XILeaveEvent*)event);
+ #endif
+ break;
+
+ case XI_ButtonPress:
+ case XI_ButtonRelease:
+ fgState.Modifiers = fghGetXModifiers( event->mods.base );
+ INVOKE_WCB( *window, MultiButton, (
+ event->deviceid,
+ event->event_x,
+ event->event_y,
+ (event->detail)-1,
+ (event->evtype == XI_ButtonPress ? GLUT_DOWN : GLUT_UP)
+ ));
+ INVOKE_WCB( *window, Mouse, (
+ (event->detail)-1,
+ (event->evtype == XI_ButtonPress ? GLUT_DOWN : GLUT_UP),
+ event->event_x,
+ event->event_y
+ ));
+ break;
+
+ case XI_Motion:
+ fgState.Modifiers = fghGetXModifiers( event->mods.base );
+ for (i = 0; i < event->buttons.mask_len; i++) if (event->buttons.mask[i]) button = 1;
+ if (button) {
+ INVOKE_WCB( *window, MultiMotion, ( event->deviceid, event->event_x, event->event_y ) );
+ INVOKE_WCB( *window, Motion, ( event->event_x, event->event_y ) );
+ } else {
+ INVOKE_WCB( *window, MultiPassive, ( event->deviceid, event->event_x, event->event_y ) );
+ INVOKE_WCB( *window, Passive, ( event->event_x, event->event_y ) );
+ }
+ #if _DEBUG
+ fgPrintXIDeviceEvent(event);
+ #endif
+ break;
+
+ default:
+ #if _DEBUG
+ fgWarning( "Unknown XI2 device event:" );
+ fgPrintXIDeviceEvent( event );
+ #endif
+ break;
+ }
+ fgState.Modifiers = INVALID_MODIFIERS;
+ }
+ XFreeEventData( fgDisplay.Display, cookie );
+}
+
+#endif
+
--- /dev/null
+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
#
# Those source files build the freeglut library
#
-lib@LIBRARY@_la_SOURCES = freeglut_callbacks.c \
- freeglut_cursor.c \
- freeglut_display.c \
- freeglut_ext.c \
- freeglut_font.c \
- freeglut_glutfont_definitions.c \
- freeglut_font_data.c \
- freeglut_stroke_roman.c \
- freeglut_stroke_mono_roman.c \
- freeglut_gamemode.c \
- freeglut_geometry.c \
- freeglut_init.c \
- freeglut_input_devices.c \
- freeglut_spaceball.c \
- freeglut_joystick.c \
- freeglut_main.c \
- freeglut_menu.c \
- freeglut_misc.c \
- freeglut_overlay.c \
- freeglut_state.c \
- freeglut_structure.c \
- freeglut_teapot.c \
- freeglut_videoresize.c \
- freeglut_window.c \
- freeglut_xinput.c
+lib@LIBRARY@_la_SOURCES = Common/freeglut_callbacks.c \
+ Common/freeglut_cursor.c \
+ Common/freeglut_display.c \
+ Common/freeglut_ext.c \
+ Common/freeglut_font.c \
+ Common/freeglut_glutfont_definitions.c \
+ Common/freeglut_font_data.c \
+ Common/freeglut_stroke_roman.c \
+ Common/freeglut_stroke_mono_roman.c \
+ Common/freeglut_gamemode.c \
+ Common/freeglut_geometry.c \
+ Common/freeglut_init.c \
+ Common/freeglut_input_devices.c \
+ Common/freeglut_spaceball.c \
+ Common/freeglut_joystick.c \
+ Common/freeglut_main.c \
+ Common/freeglut_menu.c \
+ Common/freeglut_misc.c \
+ Common/freeglut_overlay.c \
+ Common/freeglut_state.c \
+ Common/freeglut_structure.c \
+ Common/freeglut_teapot.c \
+ Common/freeglut_videoresize.c \
+ Common/freeglut_window.c \
+ Common/freeglut_xinput.c
#
# Additional linker flags
+++ /dev/null
-/*
- * 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 ***/
+++ /dev/null
-/*
- * 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 --------------------------------------------------- */
-
-#if TARGET_HOST_POSIX_X11 || TARGET_HOST_MAC_OSX || TARGET_HOST_SOLARIS
- #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.Display,
- fgDisplay.RootWindow,
- cursorNoneBits, 16, 16 );
- if( cursorNonePixmap != None ) {
- cursorNone = XCreatePixmapCursor( fgDisplay.Display,
- cursorNonePixmap, cursorNonePixmap,
- &dontCare, &dontCare, 0, 0 );
- XFreePixmap( fgDisplay.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 */
-};
-
-static void fghSetCursor ( 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.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.Display, window->Window.Handle );
- } else if ( cursor != None ) {
- XDefineCursor( fgDisplay.Display, window->Window.Handle, cursor );
- } else if ( cursorIDToUse != GLUT_CURSOR_NONE ) {
- fgError( "Failed to create cursor" );
- }
-}
-
-
-static void fghWarpPointer ( int x, int y )
-{
- XWarpPointer(
- fgDisplay.Display,
- None,
- fgStructure.CurrentWindow->Window.Handle,
- 0, 0, 0, 0,
- x, y
- );
- /* Make the warp visible immediately. */
- XFlush( fgDisplay.Display );
-}
-#endif
-
-
-#if TARGET_HOST_MS_WINDOWS
-static void fghSetCursor ( 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;
- }
-}
-
-
-static void fghWarpPointer ( 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 );
-}
-#endif
-
-
-/* -- INTERNAL FUNCTIONS ---------------------------------------------------- */
-void fgSetCursor ( SFG_Window *window, int cursorID )
-{
- fghSetCursor ( 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" );
-
- fghSetCursor ( 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" );
-
- fghWarpPointer ( x, y );
-}
-
-/*** END OF FILE ***/
+++ /dev/null
-/*
- * 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"
-
-/* -- 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;
-
-#if TARGET_HOST_POSIX_X11
- glXSwapBuffers( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle );
-#elif TARGET_HOST_MS_WINDOWS
- SwapBuffers( fgStructure.CurrentWindow->Window.Device );
-#endif
-
- /* 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 ***/
+++ /dev/null
-/*
- * 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"
-
-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);
-#if !defined(_WIN32_WCE)
- CHECK_NAME(glutJoystickFunc);
-#endif /* !defined(_WIN32_WCE) */
- 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);
-#if !defined(_WIN32_WCE)
- CHECK_NAME(glutForceJoystickFunc);
- CHECK_NAME(glutGameModeString);
- CHECK_NAME(glutEnterGameMode);
- CHECK_NAME(glutLeaveGameMode);
- CHECK_NAME(glutGameModeGet);
-#endif /* !defined(_WIN32_WCE) */
- /* 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;
-}
-
-
-SFG_Proc fghGetProcAddress( const char *procName )
-{
-#if TARGET_HOST_MS_WINDOWS
- return (SFG_Proc)wglGetProcAddress( ( LPCSTR )procName );
-#elif TARGET_HOST_POSIX_X11 && defined( GLX_ARB_get_proc_address )
- return (SFG_Proc)glXGetProcAddressARB( ( const GLubyte * )procName );
-#else
- return NULL;
-#endif
-}
-
-
-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 );
- return ( p != NULL ) ? p : fghGetProcAddress( procName );
-}
+++ /dev/null
-/*
- * 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 ***/
+++ /dev/null
-/*
- \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 };
-
+++ /dev/null
-/*
- * 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 ---------------------------------------------------- */
-
-#if TARGET_HOST_POSIX_X11
-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.Display, &event_base, &error_base)) {
- return -1;
- }
-
- XRRQueryVersion(fgDisplay.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.Display, fgDisplay.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.Display, xrr_config,
- fgDisplay.RootWindow, res_idx, rot, rate, timestamp);
- else
-#endif
- result = XRRSetScreenConfig(fgDisplay.Display, xrr_config,
- fgDisplay.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;
-}
-#endif /* TARGET_HOST_POSIX_X11 */
-
-/*
- * Remembers the current visual settings, so that
- * we can change them and restore later...
- */
-static void fghRememberState( void )
-{
-#if TARGET_HOST_POSIX_X11
- 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.Display, fgDisplay.RootWindow,
- &junk_window, &junk_window,
- &fgDisplay.DisplayPointerX, &fgDisplay.DisplayPointerY,
- &fgDisplay.DisplayPointerX, &fgDisplay.DisplayPointerY, &junk_mask);
-
-# ifdef HAVE_X11_EXTENSIONS_XRANDR_H
- if(XRRQueryExtension(fgDisplay.Display, &event_base, &error_base)) {
- XRRScreenConfiguration *xrr_config;
- XRRScreenSize *ssizes;
- Rotation rot;
- int ssize_count, curr;
-
- if((xrr_config = XRRGetScreenInfo(fgDisplay.Display, fgDisplay.RootWindow))) {
- ssizes = XRRConfigSizes(xrr_config, &ssize_count);
- curr = XRRConfigCurrentConfiguration(xrr_config, &rot);
-
- fgDisplay.prev_xsz = ssizes[curr].width;
- fgDisplay.prev_ysz = ssizes[curr].height;
- fgDisplay.prev_refresh = -1;
-
-# if ( RANDR_MAJOR >= 1 ) || ( ( RANDR_MAJOR == 1 ) && ( RANDR_MINOR >= 1 ) )
- if(fgState.GameModeRefresh != -1) {
- fgDisplay.prev_refresh = XRRConfigCurrentRate(xrr_config);
- }
-# endif
-
- fgDisplay.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.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.Display,
- fgDisplay.Screen,
- &fgDisplay.DisplayViewPortX,
- &fgDisplay.DisplayViewPortY ) )
- fgWarning( "XF86VidModeGetViewPort failed" );
-
-
- /* Query the current display settings: */
- fgDisplay.DisplayModeValid =
- XF86VidModeGetModeLine(
- fgDisplay.Display,
- fgDisplay.Screen,
- &fgDisplay.DisplayModeClock,
- &fgDisplay.DisplayMode
- );
-
- if( !fgDisplay.DisplayModeValid )
- fgWarning( "XF86VidModeGetModeLine failed" );
-# endif
-
-#elif TARGET_HOST_MS_WINDOWS
-
-/* DEVMODE devMode; */
-
- /* Grab the current desktop settings... */
-
-/* hack to get around my stupid cross-gcc headers */
-#define FREEGLUT_ENUM_CURRENT_SETTINGS -1
-
- EnumDisplaySettings( fgDisplay.DisplayName, FREEGLUT_ENUM_CURRENT_SETTINGS,
- &fgDisplay.DisplayMode );
-
- /* Make sure we will be restoring all settings needed */
- fgDisplay.DisplayMode.dmFields |=
- DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
-
-#endif
-}
-
-/*
- * Restores the previously remembered visual settings
- */
-static void fghRestoreState( void )
-{
-#if TARGET_HOST_POSIX_X11
- /* Restore the remembered pointer position: */
- XWarpPointer(
- fgDisplay.Display, None, fgDisplay.RootWindow, 0, 0, 0, 0,
- fgDisplay.DisplayPointerX, fgDisplay.DisplayPointerY
- );
-
-
-# ifdef HAVE_X11_EXTENSIONS_XRANDR_H
- if(fgDisplay.prev_size_valid) {
- if(xrandr_resize(fgDisplay.prev_xsz, fgDisplay.prev_ysz, fgDisplay.prev_refresh, 0) != -1) {
- fgDisplay.prev_size_valid = 0;
-# ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
- fgDisplay.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.DisplayModeValid )
- {
- XF86VidModeModeInfo** displayModes;
- int i, displayModesCount;
-
- if( !XF86VidModeGetAllModeLines(
- fgDisplay.Display,
- fgDisplay.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.DisplayMode.hdisplay &&
- displayModes[ i ]->vdisplay == fgDisplay.DisplayMode.vdisplay &&
- displayModes[ i ]->dotclock == fgDisplay.DisplayModeClock )
- {
- if( !XF86VidModeSwitchToMode(
- fgDisplay.Display,
- fgDisplay.Screen,
- displayModes[ i ] ) )
- {
- fgWarning( "XF86VidModeSwitchToMode failed" );
- break;
- }
-
- if( !XF86VidModeSetViewPort(
- fgDisplay.Display,
- fgDisplay.Screen,
- fgDisplay.DisplayViewPortX,
- fgDisplay.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.Display );
-
- fgDisplay.DisplayModeValid = 0;
-# ifdef HAVE_X11_EXTENSIONS_XRANDR_H
- fgDisplay.prev_size_valid = 0;
-# endif
-
- break;
- }
- }
- XFree( displayModes );
- }
-
-# endif
-
-#elif TARGET_HOST_MS_WINDOWS
-
- /* Restore the previously remembered desktop display settings */
- ChangeDisplaySettingsEx( fgDisplay.DisplayName,&fgDisplay.DisplayMode, 0,0,0 );
-
-#endif
-}
-
-#if TARGET_HOST_POSIX_X11
-#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
-#endif
-
-/*
- * Changes the current display mode to match user's settings
- */
-static GLboolean fghChangeDisplayMode( GLboolean haveToTest )
-{
- GLboolean success = GL_FALSE;
-#if TARGET_HOST_POSIX_X11
-
- /* 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.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.DisplayModeValid) {
- if(!XF86VidModeGetModeLine(fgDisplay.Display, fgDisplay.Screen,
- &fgDisplay.DisplayModeClock, &fgDisplay.DisplayMode)) {
- return success;
- }
- }
-
- if (fgState.GameModeSize.X == -1)
- {
- fgState.GameModeSize.X = fgDisplay.DisplayMode.hdisplay;
- }
- if (fgState.GameModeSize.Y == -1)
- {
- fgState.GameModeSize.Y = fgDisplay.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.DisplayModeClock * 1000 ) /
- ( fgDisplay.DisplayMode.htotal * fgDisplay.DisplayMode.vtotal );
-
- fgState.GameModeRefresh = refresh;
- }
-
- /* query all possible display modes */
- if( !XF86VidModeGetAllModeLines(
- fgDisplay.Display,
- fgDisplay.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.Display,
- fgDisplay.Screen,
- displayModes[ i ] ) )
- fgWarning( "XF86VidModeSwitchToMode failed" );
- }
-
- XFree( displayModes );
- }
-
-# endif
-
-
-#elif TARGET_HOST_MS_WINDOWS
-
- DEVMODE devMode;
- char *fggmstr = NULL;
- char displayMode[300];
-
- success = GL_FALSE;
-
- EnumDisplaySettings( fgDisplay.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.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.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);
- }
-#endif
-
- return success;
-}
-
-
-/* -- 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
- * fghChangeDisplayMode() 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
- fghRememberState( );
-
- if( ! fghChangeDisplayMode( 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;
-
-#if TARGET_HOST_POSIX_X11
-
- /*
- * 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.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.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.Display,
- fgStructure.GameModeWindow->Window.Handle,
- RevertToNone,
- CurrentTime
- );
-
- /* Move the Pointer to the middle of the fullscreen window */
- XWarpPointer(
- fgDisplay.Display,
- None,
- fgDisplay.RootWindow,
- 0, 0, 0, 0,
- fgState.GameModeSize.X/2, fgState.GameModeSize.Y/2
- );
-
-# ifdef HAVE_X11_EXTENSIONS_XF86VMODE_H
-
- if( fgDisplay.DisplayModeValid )
- {
- int x, y;
- Window child;
-
- /* Change to viewport to the window topleft edge: */
- if( !XF86VidModeSetViewPort( fgDisplay.Display, fgDisplay.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.Display,
- fgStructure.CurrentWindow->Window.Handle,
- fgDisplay.RootWindow,
- 0, 0, &x, &y,
- &child
- );
-
- /* Move the decorataions out of the topleft corner of the display */
- XMoveWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle,
- -x, -y);
- }
-
-#endif
-
- /* Grab the keyboard, too */
- XGrabKeyboard(
- fgDisplay.Display,
- fgStructure.GameModeWindow->Window.Handle,
- FALSE,
- GrabModeAsync, GrabModeAsync,
- CurrentTime
- );
-
-#endif
-
- 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;
-
-#if TARGET_HOST_POSIX_X11
-
- XUngrabPointer( fgDisplay.Display, CurrentTime );
- XUngrabKeyboard( fgDisplay.Display, CurrentTime );
-
-#endif
-
- fghRestoreState();
-}
-
-/*
- * 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 fghChangeDisplayMode( 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 ***/
+++ /dev/null
-/*
- * 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 ***/
+++ /dev/null
-/*
- * freeglut_glutfont_definitions.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 "freeglut_internal.h"
-
-#if TARGET_HOST_POSIX_X11
-
-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 ;
-
-#endif
-
+++ /dev/null
-/*
- * 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"
-
-#if TARGET_HOST_POSIX_X11
-#include <limits.h> /* LONG_MAX */
-#endif
-
-/*
- * 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 ---------------------------------------------------- */
-
-#if TARGET_HOST_POSIX_X11
-
-/* Return the atom associated with "name". */
-static Atom fghGetAtom(const char * name)
-{
- return XInternAtom(fgDisplay.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.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.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;
-}
-
-#endif /* TARGET_HOST_POSIX_X11 */
-
-
-/*
- * A call to this function should initialize all the display stuff...
- */
-static void fghInitialize( const char* displayName )
-{
-#if TARGET_HOST_POSIX_X11
- fgDisplay.Display = XOpenDisplay( displayName );
-
- if( fgDisplay.Display == NULL )
- fgError( "failed to open display '%s'", XDisplayName( displayName ) );
-
- if( !glXQueryExtension( fgDisplay.Display, NULL, NULL ) )
- fgError( "OpenGL GLX extension not supported by display '%s'",
- XDisplayName( displayName ) );
-
- fgDisplay.Screen = DefaultScreen( fgDisplay.Display );
- fgDisplay.RootWindow = RootWindow(
- fgDisplay.Display,
- fgDisplay.Screen
- );
-
- fgDisplay.ScreenWidth = DisplayWidth(
- fgDisplay.Display,
- fgDisplay.Screen
- );
- fgDisplay.ScreenHeight = DisplayHeight(
- fgDisplay.Display,
- fgDisplay.Screen
- );
-
- fgDisplay.ScreenWidthMM = DisplayWidthMM(
- fgDisplay.Display,
- fgDisplay.Screen
- );
- fgDisplay.ScreenHeightMM = DisplayHeightMM(
- fgDisplay.Display,
- fgDisplay.Screen
- );
-
- fgDisplay.Connection = ConnectionNumber( fgDisplay.Display );
-
- /* Create the window deletion atom */
- fgDisplay.DeleteWindow = fghGetAtom("WM_DELETE_WINDOW");
-
- /* Create the state and full screen atoms */
- fgDisplay.State = None;
- fgDisplay.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.RootWindow, supported, state))
- {
- const Atom full_screen = fghGetAtom("_NET_WM_STATE_FULLSCREEN");
-
- fgDisplay.State = state;
-
- /* Check if the window manager supports full screen. */
- /** Check "_NET_WM_ALLOWED_ACTIONS" on our window instead? **/
- if (fgHintPresent(fgDisplay.RootWindow, supported, full_screen))
- {
- fgDisplay.StateFullScreen = full_screen;
- }
- }
- }
-
-#elif TARGET_HOST_MS_WINDOWS
-
- WNDCLASS wc;
- ATOM atom;
-
- /* What we need to do is to initialize the fgDisplay global structure here. */
- fgDisplay.Instance = GetModuleHandle( NULL );
- fgDisplay.DisplayName= displayName ? strdup(displayName) : 0 ;
- atom = GetClassInfo( fgDisplay.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 = fgWindowProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = fgDisplay.Instance;
- wc.hIcon = LoadIcon( fgDisplay.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", "fghInitialize" );
- }
-
- /* 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.DisplayName )
- {
- HDC context = CreateDC(fgDisplay.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("fghInitialize: "
- "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 );
-
-#endif
-
- 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
- */
-#if ( TARGET_HOST_MS_WINDOWS == 0 )
- atexit(fgDeinitialize);
-#endif
-
- /* InputDevice uses GlutTimerFunc(), so fgState.Initialised must be TRUE */
- fgInitialiseInputDevices();
-}
-
-/*
- * 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 )
- {
-#if TARGET_HOST_POSIX_X11
- /* Note that the MVisualInfo is not owned by the MenuContext! */
- glXDestroyContext( fgDisplay.Display, fgStructure.MenuContext->MContext );
-#endif
- 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 );
- }
-
-#if !defined(_WIN32_WCE)
- if ( fgState.JoysticksInitialised )
- fgJoystickClose( );
-
- if ( fgState.InputDevsInitialised )
- fgInputDeviceClose( );
-#endif /* !defined(_WIN32_WCE) */
- fgState.JoysticksInitialised = GL_FALSE;
- fgState.InputDevsInitialised = GL_FALSE;
-
- 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;
- }
-
-#if TARGET_HOST_POSIX_X11
-
- /*
- * Make sure all X-client data we have created will be destroyed on
- * display closing
- */
- XSetCloseDownMode( fgDisplay.Display, DestroyAll );
-
- /*
- * Close the display connection, destroying all windows we have
- * created so far
- */
- XCloseDisplay( fgDisplay.Display );
-
-#elif TARGET_HOST_MS_WINDOWS
- if( fgDisplay.DisplayName )
- {
- free( fgDisplay.DisplayName );
- fgDisplay.DisplayName = NULL;
- }
-
- /* Reset the timer granularity */
- timeEndPeriod ( 1 );
-
-#endif
-
- fgState.Initialised = GL_FALSE;
-}
-
-/*
- * Everything inside the following #ifndef is copied from the X sources.
- */
-
-#if TARGET_HOST_MS_WINDOWS
-
-/*
-
-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;
-}
-
-static 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;
-}
-#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;
- int i, j, argc = *pargc;
-
- 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();
-
- /* check if GLUT_FPS env var is set */
-#ifndef _WIN32_WCE
- {
- 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;
- }
- }
-
- displayName = 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" );
-
- displayName = 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" );
-
- geometry = 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 */
-
- /*
- * 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):
- */
- fghInitialize( 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;
- }
-}
-
-#if TARGET_HOST_MS_WINDOWS
-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);
-}
-#endif
-
-/*
- * 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 ***/
+++ /dev/null
-/*
- * 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"
-
-#if TARGET_HOST_POSIX_X11
-#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>
-
-typedef struct {
- int fd;
- struct termios termio, termio_save;
-} SERIALPORT;
-
-#elif TARGET_HOST_MS_WINDOWS
-#include <sys/types.h>
-#include <winbase.h>
-typedef struct {
- HANDLE fh;
- COMMTIMEOUTS timeouts_save;
- DCB dcb_save;
-} SERIALPORT;
-
-#endif
-
-/********************* 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)
-
-/*****************************************************************/
-
-static SERIALPORT *serial_open ( const char *device );
-static void serial_close ( SERIALPORT *port );
-static int serial_getchar ( SERIALPORT *port );
-static int serial_putchar ( SERIALPORT *port, unsigned char ch );
-static void serial_flush ( SERIALPORT *port );
-
-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" );
-#if TARGET_HOST_MS_WINDOWS
- 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);
- }
- }
-#endif
- 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 );
-}
-
-
-/******** OS Specific Serial I/O routines *******/
-#if TARGET_HOST_POSIX_X11 /* ==> Linux/BSD/UNIX POSIX serial I/O */
-static 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;
-}
-
-static void serial_close(SERIALPORT *port)
-{
- if (port)
- {
- /* restore old port settings */
- tcsetattr(port->fd,TCSANOW,&port->termio_save);
- close(port->fd);
- free(port);
- }
-}
-
-static int serial_getchar(SERIALPORT *port)
-{
- unsigned char ch;
- if (!port) return EOF;
- if (read(port->fd,&ch,1)) return ch;
- return EOF;
-}
-
-static int serial_putchar(SERIALPORT *port, unsigned char ch){
- if (!port) return 0;
- return write(port->fd,&ch,1);
-}
-
-static void serial_flush ( SERIALPORT *port )
-{
- tcflush ( port->fd, TCIOFLUSH );
-}
-
-#elif TARGET_HOST_MS_WINDOWS
-
-static 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;
-}
-
-static 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);
- }
-}
-
-static 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;
-}
-
-static int serial_putchar(SERIALPORT *port, unsigned char ch){
- DWORD n;
- if (!port) return 0;
- return WriteFile(port->fh,&ch,1,&n,NULL);
-}
-
-static void serial_flush ( SERIALPORT *port )
-{
- FlushFileBuffers(port->fh);
-}
-
-#endif
+++ /dev/null
-/*
- * 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 2
-#define VERSION_MINOR 7
-#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
-
-/* -- PLATFORM-SPECIFIC INCLUDES ------------------------------------------- */
-
-/* All Win32 headers depend on the huge windows.h recursive include.
- * Note: Lower-case header names are used, for best cross-platform
- * compatibility.
- */
-#if TARGET_HOST_MS_WINDOWS && !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
-
-#elif TARGET_HOST_POSIX_X11
-# 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
-
-#endif
-
-/* 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 TARGET_HOST_MS_WINDOWS
-# define HAVE_VFPRINTF 1
-#endif
-
-/* MinGW may lack a prototype for ChangeDisplaySettingsEx() (depending on the version?) */
-#if TARGET_HOST_MS_WINDOWS && !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
-
-#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
-
-/* -- 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
-{
-#if TARGET_HOST_POSIX_X11
- 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 */
-
-#elif TARGET_HOST_MS_WINDOWS
- HINSTANCE Instance; /* The application's instance */
- DEVMODE DisplayMode; /* Desktop's display settings */
- char *DisplayName; /* Display name for multi display support*/
-
-#endif
-
- 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 */
-};
-
-/*
- * Make "freeglut" window handle and context types so that we don't need so
- * much conditionally-compiled code later in the library.
- */
-#if TARGET_HOST_POSIX_X11
-
-typedef Window SFG_WindowHandleType ;
-typedef GLXContext SFG_WindowContextType ;
-
-#elif TARGET_HOST_MS_WINDOWS
-
-typedef HWND SFG_WindowHandleType ;
-typedef HGLRC SFG_WindowContextType ;
-
-#endif
-
-/*
- * 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 */
-
-#if TARGET_HOST_POSIX_X11
- GLXFBConfig* FBConfig; /* The window's FBConfig */
-#elif TARGET_HOST_MS_WINDOWS
- HDC Device; /* The window's device context */
-#endif
-
- int DoubleBuffered; /* Treat the window as double-buffered */
-};
-
-/* Window's state description. This structure should be kept portable. */
-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 */
-#if TARGET_HOST_POSIX_X11
- int OldWidth; /* Window width from before a resize */
- int OldHeight; /* " height " " " " */
-#elif TARGET_HOST_MS_WINDOWS
- RECT OldRect; /* window rect - stored before the window is made fullscreen */
- DWORD OldStyle; /* window style - stored before the window is made fullscreen */
-#endif
-
- 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 */
-};
-
-/* -- 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 );
-
-/* A helper function to check if a display mode is possible to use */
-#if TARGET_HOST_POSIX_X11
-GLXFBConfig* fgChooseFBConfig( int* numcfgs );
-#endif
-
-/* The window procedure for Win32 events handling */
-#if TARGET_HOST_MS_WINDOWS
-LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg,
- WPARAM wParam, LPARAM lParam );
-void fgNewWGLCreateContext( SFG_Window* window );
-GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
- unsigned char layer_type );
-#endif
-
-/*
- * 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 );
-
-#if TARGET_HOST_POSIX_X11
-int fgIsSpaceballXEvent( const XEvent *ev );
-void fgSpaceballHandleXEvent( const XEvent *ev );
-#endif
-
-/* 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 );
-
-#if TARGET_HOST_MS_WINDOWS
-/*
- * 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).
- */
-void fghComputeWindowRectFromClientArea_UseStyle ( const DWORD windowStyle , RECT *clientRect, BOOL posIsOutside );
-void fghComputeWindowRectFromClientArea_QueryWindow( const SFG_Window *window, RECT *clientRect, BOOL posIsOutside );
-void fghComputeClientAreaFromWindowRect ( const SFG_Window *window, RECT *windowRect, BOOL wantPosOutside );
-RECT fghGetClientArea ( const SFG_Window *window, BOOL wantPosOutside );
-void fghGetBorderWidth(const DWORD windowStyle, int* xBorderWidth, int* yBorderWidth);
-#endif
-
-/*
- * 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, ... );
-
-/*
- * Check if "hint" is present in "property" for "window". See freeglut_init.c
- */
-#if TARGET_HOST_POSIX_X11
-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
-
-SFG_Proc fghGetProcAddress( const char *procName );
-
-#if TARGET_HOST_MS_WINDOWS
-extern void (__cdecl *__glutExitFunc)( int return_value );
-#endif
-
-#endif /* FREEGLUT_INTERNAL_H */
-
-/*** END OF FILE ***/
+++ /dev/null
-/*
- * 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
-
-/*
- * Initial defines from "js.h" starting around line 33 with the existing "freeglut_joystick.c"
- * interspersed
- */
-
-/* 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
-# include <InputSprocket.h>
-#endif
-
-#if TARGET_HOST_MAC_OSX
-# define _JS_MAX_AXES 16
-# include <mach/mach.h>
-# include <IOKit/IOkitLib.h>
-# include <IOKit/hid/IOHIDLib.h>
-#endif
-
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)
-# define _JS_MAX_AXES 8
-# include <windows.h>
-# include <mmsystem.h>
-# include <regstr.h>
-
-#endif
-
-#if TARGET_HOST_POSIX_X11
-# define _JS_MAX_AXES 16
-# 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
-#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
-
-/*
- * 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
-{
-#if TARGET_HOST_MACINTOSH
-#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
- IOHIDDeviceInterface ** hidDev;
- IOHIDElementCookie buttonCookies[41];
- IOHIDElementCookie axisCookies[_JS_MAX_AXES];
- long minReport[_JS_MAX_AXES],
- maxReport[_JS_MAX_AXES];
-#endif
-
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)
- JOYCAPS jsCaps;
- JOYINFOEX js;
- UINT js_id;
-#endif
-
-
-#if TARGET_HOST_POSIX_X11
-# 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;
-#endif
-
- 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 ];
-};
-
-/*
- * 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
-
-
-/*
- * The static joystick structure pointer
- */
-#define MAX_NUM_JOYSTICKS 2
-static SFG_Joystick *fgJoystick [ MAX_NUM_JOYSTICKS ];
-
-
-/*
- * Read the raw joystick data
- */
-static void fghJoystickRawRead( SFG_Joystick* joy, int* buttons, float* axes )
-{
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)
- MMRESULT status;
-#else
- int status;
-#endif
-
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
- int len;
-#endif
-
- 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;
-
-#if TARGET_HOST_MACINTOSH
- if ( buttons )
- {
- *buttons = 0;
-
- for ( i = 0; i < joy->num_buttons; i++ )
- {
- UInt32 state;
- int err = ISpElement_GetSimpleState ( 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 ( isp_elem [ i ], &state );
- ISP_CHECK_ERR(err)
-
- axes [i] = (float) state;
- }
- }
-#endif
-
-#if TARGET_HOST_MAC_OSX
- if ( buttons != NULL )
- {
- *buttons = 0;
-
- for ( i = 0; i < joy->num_buttons; i++ )
- {
- IOHIDEventStruct hidEvent;
- (*(joy->hidDev))->getElementValue ( joy->hidDev, buttonCookies[i], &hidEvent );
- if ( hidEvent.value )
- *buttons |= 1 << i;
- }
- }
-
- if ( axes != NULL )
- {
- for ( i = 0; i < joy->num_axes; i++ )
- {
- IOHIDEventStruct hidEvent;
- (*(joy->hidDev))->getElementValue ( joy->hidDev, axisCookies[i], &hidEvent );
- axes[i] = hidEvent.value;
- }
- }
-#endif
-
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)
- status = joyGetPosEx( joy->js_id, &joy->js );
-
- if ( status != JOYERR_NOERROR )
- {
- joy->error = GL_TRUE;
- return;
- }
-
- if ( buttons )
- *buttons = joy->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->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->js.dwPOV & 0xFFFF ) * ( 0.01 * 3.1415926535f / 180.0f ) );
- float c = (float) cos ( ( joy->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->js.dwVpos;
- case 5: axes[4] = (float) joy->js.dwUpos;
- case 4: axes[3] = (float) joy->js.dwRpos;
- case 3: axes[2] = (float) joy->js.dwZpos;
- case 2: axes[1] = (float) joy->js.dwYpos;
- case 1: axes[0] = (float) joy->js.dwXpos;
- }
- }
-#endif
-
-#if TARGET_HOST_POSIX_X11
-# if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
- if ( joy->os->is_analog )
- {
- int status = read ( joy->os->fd, &joy->os->ajs, sizeof(joy->os->ajs) );
- if ( status != sizeof(joy->os->ajs) ) {
- perror ( joy->os->fname );
- joy->error = GL_TRUE;
- return;
- }
- if ( buttons != NULL )
- *buttons = ( joy->os->ajs.b1 ? 1 : 0 ) | ( joy->os->ajs.b2 ? 2 : 0 );
-
- if ( axes != NULL )
- {
- axes[0] = (float) joy->os->ajs.x;
- axes[1] = (float) joy->os->ajs.y;
- }
-
- return;
- }
-
-# ifdef HAVE_USB_JS
- while ( ( len = read ( joy->os->fd, joy->os->hid_data_buf, joy->os->hid_dlen ) ) == joy->os->hid_dlen )
- {
- struct hid_item *h;
-
- for ( h = joy->os->hids; h; h = h->next )
- {
- int d = hid_get_data ( joy->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->os->axes_usage[i] == usage)
- {
- if (usage == HUG_HAT_SWITCH)
- {
- if (d < 0 || d > 8)
- d = 0; /* safety */
- joy->os->cache_axes[i] = (float)hatmap_x[d];
- joy->os->cache_axes[i + 1] = (float)hatmap_y[d];
- }
- else
- {
- joy->os->cache_axes[i] = (float)d;
- }
- break;
- }
- }
- else if (page == HUP_BUTTON)
- {
- if (usage > 0 && usage < _JS_MAX_BUTTONS + 1)
- {
- if (d)
- joy->os->cache_buttons |= (1 << ( usage - 1 ));
- else
- joy->os->cache_buttons &= ~(1 << ( usage - 1 ));
- }
- }
- }
- }
-#ifdef HAVE_ERRNO_H
- if ( len < 0 && errno != EAGAIN )
-#else
- if ( len < 0 )
-#endif
- {
- perror( joy->os->fname );
- joy->error = 1;
- }
- if ( buttons != NULL ) *buttons = joy->os->cache_buttons;
- if ( axes != NULL )
- memcpy ( axes, joy->os->cache_axes, sizeof(float) * joy->num_axes );
-# endif
-# endif
-
-# ifdef JS_NEW
-
- while ( 1 )
- {
- status = read ( joy->fd, &joy->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->tmp_buttons;
- if ( axes )
- memcpy( axes, joy->tmp_axes,
- sizeof( float ) * joy->num_axes );
- return;
- }
-#endif
-
- fgWarning ( "%s", joy->fname );
- joy->error = GL_TRUE;
- return;
- }
-
- switch ( joy->js.type & ~JS_EVENT_INIT )
- {
- case JS_EVENT_BUTTON:
- if( joy->js.value == 0 ) /* clear the flag */
- joy->tmp_buttons &= ~( 1 << joy->js.number );
- else
- joy->tmp_buttons |= ( 1 << joy->js.number );
- break;
-
- case JS_EVENT_AXIS:
- if ( joy->js.number < joy->num_axes )
- {
- joy->tmp_axes[ joy->js.number ] = ( float )joy->js.value;
-
- if( axes )
- memcpy( axes, joy->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->tmp_buttons;
- if ( axes != NULL )
- memcpy ( axes, joy->tmp_axes, sizeof(float) * joy->num_axes );
-
- return;
- }
-
- if( buttons )
- *buttons = joy->tmp_buttons;
- }
-# else
-
- status = read( joy->fd, &joy->js, JS_RETURN );
-
- if ( status != JS_RETURN )
- {
- fgWarning( "%s", joy->fname );
- joy->error = GL_TRUE;
- return;
- }
-
- if ( buttons )
-# if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )
- *buttons = ( joy->js.b1 ? 1 : 0 ) | ( joy->js.b2 ? 2 : 0 ); /* XXX Should not be here -- BSD is handled earlier */
-# else
- *buttons = joy->js.buttons;
-# endif
-
- if ( axes )
- {
- axes[ 0 ] = (float) joy->js.x;
- axes[ 1 ] = (float) joy->js.y;
- }
-# endif
-#endif
-}
-
-/*
- * 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);
-
- 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->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
-
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)
-/* 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->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->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;
-}
-#endif
-
-
-static void fghJoystickOpen( SFG_Joystick* joy )
-{
- int i = 0;
-#if TARGET_HOST_MACINTOSH
- OSStatus err;
-#endif
-#if TARGET_HOST_MAC_OSX
- IOReturn rv;
- SInt32 score;
- IOCFPlugInInterface **plugin;
-
- HRESULT pluginResult;
-
- CFDictionaryRef props;
- CFTypeRef topLevelElement;
-#endif
-#if TARGET_HOST_POSIX_X11
-# if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )
- char *cp;
-# endif
-# ifdef JS_NEW
- unsigned char u;
-# else
-# if defined( __linux__ ) || TARGET_HOST_SOLARIS
- int counter = 0;
-# endif
-# endif
-#endif
-
- /* Silence gcc, the correct #ifdefs would be too fragile... */
- (void)i;
-
- /*
- * 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';
-
-#if TARGET_HOST_MACINTOSH
- /* 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->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( joy->isp_num_needs,
- joy->isp_needs, joy->isp_elem,
- 0 );
- ISP_CHECK_ERR( err )
-
- err = ISpInit( joy->isp_num_needs, joy->isp_needs, joy->isp_elem,
- 'freeglut', nil, 0, 128, 0 );
- ISP_CHECK_ERR( err )
-
- joy->num_buttons = joy->isp_num_needs - joy->isp_num_axis;
- joy->num_axes = joy->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;
-#endif
-
-#if TARGET_HOST_MAC_OSX
- 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->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->hidDev == NULL )
- return;
-
- /* store the interface in this instance */
- rv = ( *( joy->hidDev ) )->open( joy->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 );
-#endif
-
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)
- joy->js.dwFlags = JOY_RETURNALL;
- joy->js.dwSize = sizeof( joy->js );
-
- memset( &joy->jsCaps, 0, sizeof( joy->jsCaps ) );
-
- joy->error =
- ( joyGetDevCaps( joy->js_id, &joy->jsCaps, sizeof( joy->jsCaps ) ) !=
- JOYERR_NOERROR );
-
- if( joy->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->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->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->jsCaps.wVmin;
- joy->max[ 5 ] = ( float )joy->jsCaps.wVmax;
- joy->min[ 4 ] = ( float )joy->jsCaps.wUmin;
- joy->max[ 4 ] = ( float )joy->jsCaps.wUmax;
- joy->min[ 3 ] = ( float )joy->jsCaps.wRmin;
- joy->max[ 3 ] = ( float )joy->jsCaps.wRmax;
- joy->min[ 2 ] = ( float )joy->jsCaps.wZmin;
- joy->max[ 2 ] = ( float )joy->jsCaps.wZmax;
- joy->min[ 1 ] = ( float )joy->jsCaps.wYmin;
- joy->max[ 1 ] = ( float )joy->jsCaps.wYmax;
- joy->min[ 0 ] = ( float )joy->jsCaps.wXmin;
- joy->max[ 0 ] = ( float )joy->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;
- }
-#endif
-
-#if TARGET_HOST_POSIX_X11
-#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )
- for( i = 0; i < _JS_MAX_AXES; i++ )
- joy->os->cache_axes[ i ] = 0.0f;
-
- joy->os->cache_buttons = 0;
-
- joy->os->fd = open( joy->os->fname, O_RDONLY | O_NONBLOCK);
-
-#ifdef HAVE_ERRNO_H
- if( joy->os->fd < 0 && errno == EACCES )
- fgWarning ( "%s exists but is not readable by you", joy->os->fname );
-#endif
-
- joy->error =( joy->os->fd < 0 );
-
- if( joy->error )
- return;
-
- joy->num_axes = 0;
- joy->num_buttons = 0;
- if( joy->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->os, &joy->num_axes,
- &joy->num_buttons ) )
- {
- close( joy->os->fd );
- joy->error = GL_TRUE;
- return;
- }
-
- cp = strrchr( joy->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->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->tmp_axes[ i ] = 0.0f;
-
- joy->tmp_buttons = 0;
-# endif
-
- joy->fd = open( joy->fname, O_RDONLY );
-
- joy->error =( joy->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->fd, JSIOCGAXES, &u );
- joy->num_axes = u;
- ioctl( joy->fd, JSIOCGBUTTONS, &u );
- joy->num_buttons = u;
- ioctl( joy->fd, JSIOCGNAME( sizeof( joy->name ) ), joy->name );
- fcntl( joy->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
-#endif
-}
-
-/*
- * 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;
-
-#if TARGET_HOST_MACINTOSH
- fgJoystick[ ident ]->id = ident;
- snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident ); /* FIXME */
- fgJoystick[ ident ]->error = GL_FALSE;
-#endif
-
-#if TARGET_HOST_MAC_OSX
- 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';
- }
-#endif
-
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)
- switch( ident )
- {
- case 0:
- fgJoystick[ ident ]->js_id = JOYSTICKID1;
- fgJoystick[ ident ]->error = GL_FALSE;
- break;
- case 1:
- fgJoystick[ ident ]->js_id = JOYSTICKID2;
- fgJoystick[ ident ]->error = GL_FALSE;
- break;
- default:
- fgJoystick[ ident ]->num_axes = 0;
- fgJoystick[ ident ]->error = GL_TRUE;
- return;
- }
-#endif
-
-#if TARGET_HOST_POSIX_X11
-# if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )
- fgJoystick[ ident ]->id = ident;
- fgJoystick[ ident ]->error = GL_FALSE;
-
- fgJoystick[ ident ]->os = calloc( 1, sizeof( struct os_specific_s ) );
- memset( fgJoystick[ ident ]->os, 0, sizeof( struct os_specific_s ) );
- if( ident < USB_IDENT_OFFSET )
- fgJoystick[ ident ]->os->is_analog = 1;
- if( fgJoystick[ ident ]->os->is_analog )
- snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", AJSDEV, ident );
- else
- snprintf( fgJoystick[ ident ]->os->fname, sizeof(fgJoystick[ ident ]->os->fname), "%s%d", UHIDDEV,
- ident - USB_IDENT_OFFSET );
-# elif defined( __linux__ )
- fgJoystick[ ident ]->id = ident;
- fgJoystick[ ident ]->error = GL_FALSE;
-
- snprintf( fgJoystick[ident]->fname, sizeof(fgJoystick[ident]->fname), "/dev/input/js%d", ident );
-
- if( access( fgJoystick[ ident ]->fname, F_OK ) != 0 )
- snprintf( fgJoystick[ ident ]->fname, sizeof(fgJoystick[ ident ]->fname), "/dev/js%d", ident );
-# endif
-#endif
-
- 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 ] )
- {
-
-#if TARGET_HOST_MACINTOSH
- ISpSuspend( );
- ISpStop( );
- ISpShutdown( );
-#endif
-
-#if TARGET_HOST_MAC_OSX
- ( *( fgJoystick[ ident ]->hidDev ) )->
- close( fgJoystick[ ident ]->hidDev );
-#endif
-
-#if TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)
- /* Do nothing special */
-#endif
-
-#if TARGET_HOST_POSIX_X11
-#if defined( __FreeBSD__ ) || defined(__FreeBSD_kernel__) || defined( __NetBSD__ )
- if( fgJoystick[ident]->os )
- {
- if( ! fgJoystick[ ident ]->error )
- close( fgJoystick[ ident ]->os->fd );
-#ifdef HAVE_USB_JS
- if( fgJoystick[ ident ]->os->hids )
- free (fgJoystick[ ident ]->os->hids);
- if( fgJoystick[ ident ]->os->hid_data_buf )
- free( fgJoystick[ ident ]->os->hid_data_buf );
-#endif
- free( fgJoystick[ident]->os );
- }
-#endif
-
- if( ! fgJoystick[ident]->error )
- close( fgJoystick[ ident ]->fd );
-#endif
-
- 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 ***/
+++ /dev/null
-/*
- * 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
-
-#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
-
-/*
- * 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)...
- */
-
-/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
-
-/*
- * Handle a window configuration change. When no reshape
- * callback is hooked, the viewport size is updated to
- * match the new window size.
- */
-static void fghReshapeWindow ( SFG_Window *window, int width, int height )
-{
- SFG_Window *current_window = fgStructure.CurrentWindow;
-
- freeglut_return_if_fail( window != NULL );
-
-#if TARGET_HOST_POSIX_X11
-
- XResizeWindow( fgDisplay.Display, window->Window.Handle,
- width, height );
- XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */
-
-#elif TARGET_HOST_MS_WINDOWS && !defined(_WIN32_WCE)
- {
- 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
- );
- }
-#endif
-
- 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.
- */
-static 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 );
-}
-
-/*
- * A static helper function to execute display callback for a window
- */
-static void fghcbDisplayWindow( SFG_Window *window,
- SFG_Enumerator *enumerator )
-{
- if( window->State.Redisplay &&
- window->State.Visible )
- {
- window->State.Redisplay = GL_FALSE;
-
-#if TARGET_HOST_POSIX_X11
- fghRedrawWindow ( window ) ;
-#elif TARGET_HOST_MS_WINDOWS
-
- RedrawWindow(
- window->Window.Handle, NULL, NULL,
- RDW_NOERASE | RDW_INTERNALPAINT | RDW_INVALIDATE | RDW_UPDATENOW
- );
-#endif
- }
-
- 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) {
-#if TARGET_HOST_SOLARIS || HAVE_GETTIMEOFDAY
- struct timeval now;
- gettimeofday( &now, NULL );
- return now.tv_usec/1000 + now.tv_sec*1000;
-#elif TARGET_HOST_MS_WINDOWS
-# if defined(_WIN32_WCE)
- return GetTickCount();
-# else
- return timeGetTime();
-# endif
-#endif
-}
-
-/*
- * 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;
-}
-/*
- * Does the magic required to relinquish the CPU until something interesting
- * happens.
- */
-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;
-
-#if TARGET_HOST_POSIX_X11
- /*
- * 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.Display ) )
- {
- fd_set fdset;
- int err;
- int socket;
- struct timeval wait;
-
- socket = ConnectionNumber( fgDisplay.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
- }
-#elif TARGET_HOST_MS_WINDOWS
- MsgWaitForMultipleObjects( 0, NULL, FALSE, msec, QS_ALLINPUT );
-#endif
-}
-
-#if TARGET_HOST_POSIX_X11
-/*
- * Returns GLUT modifier mask for the state field of an X11 event.
- */
-int fghGetXModifiers( 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;
-}
-#endif
-
-
-#if TARGET_HOST_POSIX_X11 && _DEBUG
-
-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;
- }
- }
-}
-
-#endif
-
-/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
-
-/*
- * Executes a single iteration in the freeglut processing loop.
- */
-void FGAPIENTRY glutMainLoopEvent( void )
-{
-#if TARGET_HOST_POSIX_X11
- 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.Display ) )
- {
- XNextEvent( fgDisplay.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.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.OldWidth ) ||
- ( height != window->State.OldHeight ) )
- {
- SFG_Window *current_window = fgStructure.CurrentWindow;
-
- window->State.OldWidth = width;
- window->State.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 = fghGetXModifiers( 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 = fghGetXModifiers( 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.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 = fghGetXModifiers( 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 = fghGetXModifiers( 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;
- }
- }
-
-#elif TARGET_HOST_MS_WINDOWS
-
- 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 );
- }
-#endif
-
- 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;
-
-#if TARGET_HOST_MS_WINDOWS
- SFG_Window *window = (SFG_Window *)fgStructure.Windows.First ;
-#endif
-
- FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutMainLoop" );
-
-#if TARGET_HOST_MS_WINDOWS
- /*
- * 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 ;
- }
-#endif
-
- 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 ;
-}
-
-
-#if TARGET_HOST_MS_WINDOWS
-/*
- * Determine a GLUT modifer mask based on MS-WINDOWS system info.
- */
-static int fghGetWin32Modifiers (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 fgWindowProc( 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",
- "fgWindowProc" );
-
- window->Window.Handle = hWnd;
- window->Window.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.Device,
- fgStructure.MenuContext->MContext
- );
- else
- {
- fgStructure.MenuContext =
- (SFG_MenuContext *)malloc( sizeof(SFG_MenuContext) );
- fgStructure.MenuContext->MContext =
- wglCreateContext( window->Window.Device );
- }
-
- /* window->Window.Context = wglGetCurrentContext (); */
- window->Window.Context = wglCreateContext( window->Window.Device );
- }
- else
- {
-#if !defined(_WIN32_WCE)
- fgSetupPixelFormat( window, GL_FALSE, PFD_MAIN_PLANE );
-#endif
-
- if( ! fgState.UseCurrentContext )
- window->Window.Context =
- wglCreateContext( window->Window.Device );
- else
- {
- window->Window.Context = wglGetCurrentContext( );
- if( ! window->Window.Context )
- window->Window.Context =
- wglCreateContext( window->Window.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.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 ) );
- 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 = fghGetWin32Modifiers( );
-
- 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 = fghGetWin32Modifiers( );
-
- 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 = fghGetWin32Modifiers( );
-
- /*
- * 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 = fghGetWin32Modifiers( );
-
- 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 = fghGetWin32Modifiers( );
-
- 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 = fghGetWin32Modifiers( );
- 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;
-}
-#endif
-
-/*** END OF FILE ***/
+++ /dev/null
-/*
- * 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.)
- */
-#if TARGET_HOST_MS_WINDOWS
-#define FREEGLUT_MENU_FONT GLUT_BITMAP_8_BY_13
-#else
-#define FREEGLUT_MENU_FONT GLUT_BITMAP_HELVETICA_18
-#endif
-
-#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.
- */
-#if TARGET_HOST_MS_WINDOWS
-static float menu_pen_fore [4] = {0.0f, 0.0f, 0.0f, 1.0f};
-static float menu_pen_back [4] = {0.85f, 0.85f, 0.85f, 1.0f};
-static float menu_pen_hfore [4] = {1.0f, 1.0f, 1.0f, 1.0f};
-static float menu_pen_hback [4] = {0.15f, 0.15f, 0.45f, 1.0f};
-#else
-static float menu_pen_fore [4] = {0.0f, 0.0f, 0.0f, 1.0f};
-static float menu_pen_back [4] = {0.70f, 0.70f, 0.70f, 1.0f};
-static float menu_pen_hfore [4] = {0.0f, 0.0f, 0.0f, 1.0f};
-static float menu_pen_hback [4] = {1.0f, 1.0f, 1.0f, 1.0f};
-#endif
-
-/* -- 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 )
- {
-#if TARGET_HOST_POSIX_X11
- int wx, wy;
- Window w;
-
- XTranslateCoordinates(
- fgDisplay.Display,
- window->Window.Handle,
- fgDisplay.RootWindow,
- 0, 0, &wx, &wy, &w);
-
- *x = fgState.GameModeSize.X + wx;
- *y = fgState.GameModeSize.Y + wy;
-#else
- *x = glutGet ( GLUT_SCREEN_WIDTH );
- *y = glutGet ( GLUT_SCREEN_HEIGHT );
-#endif
- }
- 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;
-}
-
-#if TARGET_HOST_MS_WINDOWS
-int FGAPIENTRY __glutCreateMenuWithExit( void(* callback)( int ), void (__cdecl *exit_function)(int) )
-{
- __glutExitFunc = exit_function;
- return glutCreateMenu( callback );
-}
-#endif
-
-/*
- * 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 ***/
+++ /dev/null
-/*
- * 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 ***/
+++ /dev/null
-/*
- * 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 ***/
+++ /dev/null
-/* 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
-#if TARGET_HOST_POSIX_X11\r
-#include <X11/Xlib.h>\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
-#endif\r
-\r
-/* Flag telling whether we have a spaceball:\r
- * 0 - haven't tried initializing\r
- * 1 - have successfully initialized\r
- * -1 - have tried to initialize but not succeeded\r
- */\r
-static int sball_initialized = 0;\r
-\r
-\r
-void fgInitialiseSpaceball(void)\r
-{\r
- if(sball_initialized != 0) {\r
- return;\r
- }\r
-\r
-#if TARGET_HOST_POSIX_X11\r
- {\r
- Window w;\r
-\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.Display, w) == -1)\r
- {\r
- sball_initialized = -1;\r
- return;\r
- }\r
- }\r
-#endif\r
-\r
- sball_initialized = 1;\r
-}\r
-\r
-void fgSpaceballClose(void)\r
-{\r
-#if TARGET_HOST_POSIX_X11\r
- spnav_close();\r
-#endif\r
-}\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
-#if TARGET_HOST_POSIX_X11\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
-#else\r
- return 0;\r
-#endif\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
-#if TARGET_HOST_POSIX_X11\r
- return 2; /* TODO implement this properly */\r
-#else\r
- return 0;\r
-#endif\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
-#if TARGET_HOST_POSIX_X11\r
- if(spnav_win != window) {\r
- spnav_x11_window(window->Window.Handle);\r
- spnav_win = window;\r
- }\r
-#endif\r
-}\r
-\r
-\r
-#if TARGET_HOST_POSIX_X11\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
-#endif /* TARGET_HOST_POSIX_X11 */\r
+++ /dev/null
-/*
- * 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.
- */
-
-/* -- LOCAL DEFINITIONS ---------------------------------------------------- */
-
-/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
-
-#if TARGET_HOST_POSIX_X11
-/*
- * Queries the GL context about some attributes
- */
-static int fghGetConfig( int attribute )
-{
- int returnValue = 0;
- int result; /* Not checked */
-
- if( fgStructure.CurrentWindow )
- result = glXGetFBConfigAttrib( fgDisplay.Display,
- *(fgStructure.CurrentWindow->Window.FBConfig),
- attribute,
- &returnValue );
-
- return returnValue;
-}
-#endif
-
-/* -- 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;
- }
-}
-
-#if TARGET_HOST_MS_WINDOWS
-/* 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
-#endif
-
-
-/*
- * General settings query method
- */
-int FGAPIENTRY glutGet( GLenum eWhat )
-{
-#if TARGET_HOST_MS_WINDOWS
- int returnValue ;
- GLboolean boolValue ;
-#endif
-
- int nsamples = 0;
-
- 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 ;
-
-#if TARGET_HOST_POSIX_X11
- /*
- * The window/context specific queries are handled mostly by
- * fghGetConfig().
- */
- 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 fghGetConfig( 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( (fghGetConfig( 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.FBConfig;
-
- XVisualInfo * visualInfo =
- glXGetVisualFromFBConfig( fgDisplay.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.Display,
- fgStructure.CurrentWindow->Window.Handle,
- fgDisplay.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.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.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 fgChooseFBConfig again here. */
- GLXFBConfig * fbconfig;
- int isPossible;
-
- fbconfig = fgChooseFBConfig(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 fghGetConfig( GLX_VISUAL_ID );
-
-#elif TARGET_HOST_MS_WINDOWS
-
- 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.Device );
-#endif /* defined(_WIN32_WCE) */
- return 0;
-
-#endif
-
- /* 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:
- fgWarning( "glutGet(): missing enum handle %d", 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_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
-
-#if TARGET_HOST_POSIX_X11
-
- /* 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.Display, &map,0);
- return nbuttons;
- }
-
-#elif TARGET_HOST_MS_WINDOWS
-
- 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
-#endif
-
- 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:
- fgWarning( "glutDeviceGet(): missing enum handle %d", eWhat );
- break;
- }
-
- /* 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 )
- {
-
-#if TARGET_HOST_POSIX_X11
-
- 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;
-
-#elif TARGET_HOST_MS_WINDOWS
-
- 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;
-#endif
-
- default:
- fgWarning( "glutLayerGet(): missing enum handle %d", eWhat );
- break;
- }
-
- /* And fail. That's good. Programs do love failing. */
- return -1;
-}
-
-int * FGAPIENTRY glutGetModeValues(GLenum eWhat, int * size)
-{
- int * array;
-
-#if TARGET_HOST_POSIX_X11
- int attributes[9];
- GLXFBConfig * fbconfigArray; /* Array of FBConfigs */
- int fbconfigArraySize; /* Number of FBConfigs in the array */
- int attribute_name = 0;
-#endif
-
- FREEGLUT_EXIT_IF_NOT_INITIALISED("glutGetModeValues");
-
- array = NULL;
- *size = 0;
-
- switch (eWhat)
- {
-#if TARGET_HOST_POSIX_X11
- 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.Display,
- fgDisplay.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.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;
-#endif
-
- default:
- break;
- }
-
- return array;
-}
-
-/*** END OF FILE ***/
+++ /dev/null
-/*
- * 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};
+++ /dev/null
-/*
- * 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};
+++ /dev/null
-/*
- * 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 ---------------------------------------------------- */
-
-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 );
-
-#if TARGET_HOST_UNIX_X11
- window->Window.FBConfig = NULL;
-#endif
- fghClearCallBacks( window );
-
- /* Initialize the object properties */
- window->ID = ++fgStructure.WindowID;
-#if TARGET_HOST_POSIX_X11
- window->State.OldHeight = window->State.OldWidth = -1;
-#endif
-
- 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 ***/
+++ /dev/null
-/*
- * 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 ***/
-
-
-
-
-
+++ /dev/null
-/*
- * 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 */
-
+++ /dev/null
-/*
- * 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 ***/
-
-
-
-
-
-
-
+++ /dev/null
-/*
- * 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 TARGET_HOST_POSIX_X11
-#include <limits.h> /* LONG_MAX */
-#include <unistd.h> /* usleep */
-#endif
-
-#if defined(_WIN32_WCE)
-# include <Aygshell.h>
-# ifdef FREEGLUT_LIB_PRAGMAS
-# pragma comment( lib, "Aygshell.lib" )
-# endif
-#endif /* defined(_WIN32_WCE) */
-
-
-#if TARGET_HOST_POSIX_X11
-#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
-#endif /* TARGET_HOST_POSIX_X11 */
-
-
-#if TARGET_HOST_MS_WINDOWS
-/* 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
-
-#endif /* TARGET_HOST_MS_WINDOWS */
-
-#ifdef WM_TOUCH
- typedef BOOL (WINAPI *pRegisterTouchWindow)(HWND,ULONG);
- static pRegisterTouchWindow fghRegisterTouchWindow = (pRegisterTouchWindow)0xDEADBEEF;
-#endif
-
-/* pushing attribute/value pairs into an array */
-#define ATTRIB(a) attributes[where++]=(a)
-#define ATTRIB_VAL(a,v) {ATTRIB(a); ATTRIB(v);}
-
-/*
- * TODO BEFORE THE STABLE RELEASE:
- *
- * fgChooseFBConfig() -- OK, but what about glutInitDisplayString()?
- * 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
- */
-
-/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
-
-static int fghIsLegacyContextVersionRequested( void )
-{
- return fgState.MajorVersion < 2 || (fgState.MajorVersion == 2 && fgState.MinorVersion <= 1);
-}
-
-static int fghIsLegacyContextRequested( void )
-{
- return fghIsLegacyContextVersionRequested() &&
- fgState.ContextFlags == 0 &&
- fgState.ContextProfile == 0;
-}
-
-static 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;
-}
-
-static int fghMapBit( int mask, int from, int to )
-{
- return ( mask & from ) ? to : 0;
-
-}
-
-static 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 ------------------------------------ */
-
-#if TARGET_HOST_POSIX_X11
-/*
- * Chooses a visual basing on the current display mode settings
- */
-
-GLXFBConfig* fgChooseFBConfig( 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.Display,
- fgDisplay.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.Display,
- fbconfigArray[0],
- GLX_BUFFER_SIZE,
- &bufferSizeMin );
- /* Get bufferSizeMax. */
- result =
- glXGetFBConfigAttrib( fgDisplay.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.Display,
- fgDisplay.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.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.Display,
- * fgDisplay.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.Display;
- GLXFBConfig config = *(window->Window.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) fghGetProcAddress( "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.OldWidth;
- fgStructure.CurrentWindow->State.Height = win->State.OldHeight;
-
- } else {
- /* resize the window to cover the entire screen */
- XGetWindowAttributes(fgDisplay.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.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.State || !fgDisplay.StateFullScreen) {
- return -1;
- }
-
- xev.type = ClientMessage;
- xev.xclient.window = fgStructure.CurrentWindow->Window.Handle;
- xev.xclient.message_type = fgDisplay.State;
- xev.xclient.format = 32;
- xev.xclient.data.l[0] = _NET_WM_STATE_TOGGLE;
- xev.xclient.data.l[1] = fgDisplay.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.Display, fgDisplay.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;
-}
-
-
-#endif /* TARGET_HOST_POSIX_X11 */
-
-
-#if TARGET_HOST_MS_WINDOWS
-/*
- * 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.Device, window->Window.Context );
-
- if ( !fghIsExtensionSupported( window->Window.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.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.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.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.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.Instance);
- }
-
- success = ( pixelformat != 0 ) && ( checkOnly || SetPixelFormat( current_hDC, pixelformat, ppfd ) );
-
- if (checkOnly)
- DeleteDC(current_hDC);
-
- return success;
-#endif /* defined(_WIN32_WCE) */
-}
-
-#endif /* TARGET_HOST_MS_WINDOWS */
-
-/*
- * Sets the OpenGL context and the fgStructure "Current Window" pointer to
- * the window structure passed in.
- */
-void fgSetWindow ( SFG_Window *window )
-{
-#if TARGET_HOST_POSIX_X11
- if ( window )
- {
- glXMakeContextCurrent(
- fgDisplay.Display,
- window->Window.Handle,
- window->Window.Handle,
- window->Window.Context
- );
- }
-#elif TARGET_HOST_MS_WINDOWS
- if ( window != fgStructure.CurrentWindow )
- {
- if( fgStructure.CurrentWindow )
- ReleaseDC( fgStructure.CurrentWindow->Window.Handle,
- fgStructure.CurrentWindow->Window.Device );
-
- if ( window )
- {
- window->Window.Device = GetDC( window->Window.Handle );
- wglMakeCurrent(
- window->Window.Device,
- window->Window.Context
- );
- }
- }
-#endif
- fgStructure.CurrentWindow = window;
-}
-
-#if TARGET_HOST_MS_WINDOWS
-
-/* 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.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.DisplayName )
- {
- m_proc_t st;
- st.x=xp;
- st.y=yp;
- st.name=fgDisplay.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.DisplayName )
- {
- fgWarning( "for working -display support FreeGLUT must be compiled with WINVER >= 0x0500");
- }
-}
-#endif
-#endif
-
-
-#if TARGET_HOST_POSIX_X11
-static Bool fghWindowIsVisible( Display *display, XEvent *event, XPointer arg)
-{
- Window window = (Window)arg;
- return (event->type == MapNotify) && (event->xmap.window == window);
-}
-#endif
-
-
-/*
- * 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 )
-{
-#if TARGET_HOST_POSIX_X11
- 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.FBConfig = fgChooseFBConfig( &num_FBConfigs );
-
- if( window->IsMenu && ( ! fgStructure.MenuContext ) )
- fgState.DisplayMode = current_DisplayMode ;
-
- if( ! window->Window.FBConfig )
- {
- /*
- * The "fgChooseFBConfig" 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.FBConfig = fgChooseFBConfig( &num_FBConfigs );
- fgState.DisplayMode &= ~GLUT_DOUBLE;
- }
-
- if( fgState.DisplayMode & GLUT_MULTISAMPLE )
- {
- fgState.DisplayMode &= ~GLUT_MULTISAMPLE ;
- window->Window.FBConfig = fgChooseFBConfig( &num_FBConfigs );
- fgState.DisplayMode |= GLUT_MULTISAMPLE;
- }
- }
-
- FREEGLUT_INTERNAL_ERROR_EXIT( window->Window.FBConfig != NULL,
- "FBConfig with necessary capabilities not found", "fgOpenWindow" );
-
- /* Get the X visual. */
- for (i = 0; i < num_FBConfigs; i++) {
- visualInfo = glXGetVisualFromFBConfig( fgDisplay.Display,
- window->Window.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.Display, fgDisplay.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.Display,
- window->Parent == NULL ? fgDisplay.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.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.Display,
- window->Window.Handle,
- &textProperty,
- &textProperty,
- 0,
- 0,
- &sizeHints,
- &wmHints,
- NULL
- );
- XFree( textProperty.value );
-
- XSetWMProtocols( fgDisplay.Display, window->Window.Handle,
- &fgDisplay.DeleteWindow, 1 );
-
- glXMakeContextCurrent(
- fgDisplay.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.Display, &(window->Window.Handle) );
- #endif
-
- XMapWindow( fgDisplay.Display, window->Window.Handle );
-
- XFree(visualInfo);
-
- if( !isSubWindow)
- XPeekIfEvent( fgDisplay.Display, &eventReturnBuffer, &fghWindowIsVisible, (XPointer)(window->Window.Handle) );
-
-#elif TARGET_HOST_MS_WINDOWS
-
- WNDCLASS wc;
- DWORD flags = 0;
- DWORD exFlags = 0;
- ATOM atom;
-
- /* Grab the window class we have registered on glutInit(): */
- atom = GetClassInfo( fgDisplay.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.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.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"! */
-
-#endif
-
- 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();
-
-#if TARGET_HOST_POSIX_X11
-
- if( window->Window.Context )
- glXDestroyContext( fgDisplay.Display, window->Window.Context );
- XFree( window->Window.FBConfig );
-
- if( window->Window.Handle ) {
- XDestroyWindow( fgDisplay.Display, window->Window.Handle );
- }
- /* XFlush( fgDisplay.Display ); */ /* XXX Shouldn't need this */
-
-#elif TARGET_HOST_MS_WINDOWS
-
- /* 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 );
-#endif
-}
-
-
-/* -- 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;
-}
-
-#if TARGET_HOST_MS_WINDOWS
-int FGAPIENTRY __glutCreateWindowWithExit( const char *title, void (__cdecl *exit_function)(int) )
-{
- __glutExitFunc = exit_function;
- return glutCreateWindow( title );
-}
-#endif
-
-/*
- * 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" );
-
-#if TARGET_HOST_POSIX_X11
-
- XMapWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle );
- XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */
-
-#elif TARGET_HOST_MS_WINDOWS
-
- ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_SHOW );
-
-#endif
-
- 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" );
-
-#if TARGET_HOST_POSIX_X11
-
- if( fgStructure.CurrentWindow->Parent == NULL )
- XWithdrawWindow( fgDisplay.Display,
- fgStructure.CurrentWindow->Window.Handle,
- fgDisplay.Screen );
- else
- XUnmapWindow( fgDisplay.Display,
- fgStructure.CurrentWindow->Window.Handle );
- XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */
-
-#elif TARGET_HOST_MS_WINDOWS
-
- ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_HIDE );
-
-#endif
-
- 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;
-#if TARGET_HOST_POSIX_X11
-
- XIconifyWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle,
- fgDisplay.Screen );
- XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */
-
-#elif TARGET_HOST_MS_WINDOWS
-
- ShowWindow( fgStructure.CurrentWindow->Window.Handle, SW_MINIMIZE );
-
-#endif
-
- 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 )
- {
-#if TARGET_HOST_POSIX_X11
-
- XTextProperty text;
-
- text.value = (unsigned char *) title;
- text.encoding = XA_STRING;
- text.format = 8;
- text.nitems = strlen( title );
-
- XSetWMName(
- fgDisplay.Display,
- fgStructure.CurrentWindow->Window.Handle,
- &text
- );
-
- XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */
-
-#elif TARGET_HOST_MS_WINDOWS
-# ifdef _WIN32_WCE
- {
- wchar_t* wstr = fghWstrFromStr(title);
- SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr );
- free(wstr);
- }
-# else
- SetWindowText( fgStructure.CurrentWindow->Window.Handle, title );
-# endif
-
-#endif
- }
-}
-
-/*
- * 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 )
- {
-#if TARGET_HOST_POSIX_X11
-
- XTextProperty text;
-
- text.value = (unsigned char *) title;
- text.encoding = XA_STRING;
- text.format = 8;
- text.nitems = strlen( title );
-
- XSetWMIconName(
- fgDisplay.Display,
- fgStructure.CurrentWindow->Window.Handle,
- &text
- );
-
- XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */
-
-#elif TARGET_HOST_MS_WINDOWS
-# ifdef _WIN32_WCE
- {
- wchar_t* wstr = fghWstrFromStr(title);
- SetWindowText( fgStructure.CurrentWindow->Window.Handle, wstr );
- free(wstr);
- }
-# else
- SetWindowText( fgStructure.CurrentWindow->Window.Handle, title );
-# endif
-
-#endif
- }
-}
-
-/*
- * 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();
- }
-
-#if TARGET_HOST_POSIX_X11
-
- XMoveWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle,
- x, y );
- XFlush( fgDisplay.Display ); /* XXX Shouldn't need this */
-
-#elif TARGET_HOST_MS_WINDOWS
-
- {
- 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
- );
- }
-
-#endif
-}
-
-/*
- * Lowers the current window (by Z order change)
- */
-void FGAPIENTRY glutPushWindow( void )
-{
- FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPushWindow" );
- FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPushWindow" );
-
-#if TARGET_HOST_POSIX_X11
-
- XLowerWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle );
-
-#elif TARGET_HOST_MS_WINDOWS
-
- SetWindowPos(
- fgStructure.CurrentWindow->Window.Handle,
- HWND_BOTTOM,
- 0, 0, 0, 0,
- SWP_NOSIZE | SWP_NOMOVE
- );
-
-#endif
-}
-
-/*
- * Raises the current window (by Z order change)
- */
-void FGAPIENTRY glutPopWindow( void )
-{
- FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutPopWindow" );
- FREEGLUT_EXIT_IF_NO_WINDOW ( "glutPopWindow" );
-
-#if TARGET_HOST_POSIX_X11
-
- XRaiseWindow( fgDisplay.Display, fgStructure.CurrentWindow->Window.Handle );
-
-#elif TARGET_HOST_MS_WINDOWS
-
- SetWindowPos(
- fgStructure.CurrentWindow->Window.Handle,
- HWND_TOP,
- 0, 0, 0, 0,
- SWP_NOSIZE | SWP_NOMOVE
- );
-
-#endif
-}
-
-/*
- * 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;
- }
-
-#if TARGET_HOST_POSIX_X11
- if(!glutGet(GLUT_FULL_SCREEN)) {
- if(fghToggleFullscreen() != -1) {
- win->State.IsFullscreen = GL_TRUE;
- }
- }
-
-#elif TARGET_HOST_MS_WINDOWS && !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.OldRect );
-
- /* store current window style */
- win->State.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.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 FGAPIENTRY glutLeaveFullScreen( void )
-{
- SFG_Window *win;
-
- FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutFullScreen" );
- FREEGLUT_EXIT_IF_NO_WINDOW ( "glutFullScreen" );
-
- win = fgStructure.CurrentWindow;
-
-#if TARGET_HOST_POSIX_X11
- if(glutGet(GLUT_FULL_SCREEN)) {
- if(fghToggleFullscreen() != -1) {
- win->State.IsFullscreen = GL_FALSE;
- }
- }
-
-#elif TARGET_HOST_MS_WINDOWS && !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.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.OldRect.left,
- win->State.OldRect.top,
- win->State.OldRect.right - win->State.OldRect.left,
- win->State.OldRect.bottom - win->State.OldRect.top,
- SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSENDCHANGING |
- SWP_NOZORDER
- );
-
- win->State.IsFullscreen = GL_FALSE;
-#endif
-}
-
-/*
- * 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;
-
-#if TARGET_HOST_POSIX_X11
- if(fghToggleFullscreen() != -1) {
- win->State.IsFullscreen = !win->State.IsFullscreen;
- }
-#elif TARGET_HOST_MS_WINDOWS
- if (!win->State.IsFullscreen)
- glutFullScreen();
- else
- glutLeaveFullScreen();
-#endif
-}
-
-/*
- * 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 ***/
+++ /dev/null
-/* Written for XI1 by Nikolas Doerfler <doerflen@in.tum.de> (c) 2008 *
- * Rewritten for XI2 by Florian Echtler <echtler@in.tum.de> (c) 2009 */
-
-#include <GL/freeglut.h>
-
-#include "freeglut_internal.h"
-
-#if TARGET_HOST_POSIX_X11 && HAVE_X11_EXTENSIONS_XINPUT2_H
-
-#include <errno.h>
-#include <stdarg.h>
-
-#include <X11/Xlib.h>
-#include <X11/extensions/XInput2.h>
-
-/* import function from freeglut_main.c */
-int fghGetXModifiers( int state );
-
-/* extension opcode for XInput */
-int xi_opcode = -1;
-
-/**
- * \brief Sets window up for XI2 events.
- */
-void fgRegisterDevices( Display* dpy, Window* win ) {
-
- XIEventMask mask;
- unsigned char flags[2] = { 0, 0 };
- int event, error;
-
- /*Display* dpy = fgDisplay.Display;
- Window* win = glutGetXWindow();*/
-
- /* get XInput extension opcode */
- if (!XQueryExtension( dpy, "XInputExtension", &xi_opcode, &event, &error )) { xi_opcode = -1; }
-
- /* Select for motion events */
- mask.deviceid = XIAllMasterDevices;
- mask.mask_len = 2;
- mask.mask = flags;
-
- XISetMask(mask.mask, XI_Enter);
- XISetMask(mask.mask, XI_Motion);
- XISetMask(mask.mask, XI_ButtonPress);
- XISetMask(mask.mask, XI_ButtonRelease);
- XISetMask(mask.mask, XI_Leave);
- /*XISetMask(mask.mask, XI_KeyPress);
- XISetMask(mask.mask, XI_KeyRelease);
- XISetMask(mask.mask, XI_DeviceChanged);
- XISetMask(mask.mask, XI_RawEvent);
- XISetMask(mask.mask, XI_FocusIn);
- XISetMask(mask.mask, XI_FocusOut);
- XISetMask(mask.mask, XI_HierarchyChanged);*/
-
- XISelectEvents( dpy, *win, &mask, 1 );
-}
-
-
-void fgPrintXILeaveEvent(XILeaveEvent* event)
-{
- char* mode = "";
- char* detail = "";
- int i;
-
- printf(" windows: root 0x%lx event 0x%lx child 0x%ld\n",
- event->root, event->event, event->child);
- switch(event->mode)
- {
- case NotifyNormal: mode = "NotifyNormal"; break;
- case NotifyGrab: mode = "NotifyGrab"; break;
- case NotifyUngrab: mode = "NotifyUngrab"; break;
- case NotifyWhileGrabbed: mode = "NotifyWhileGrabbed"; break;
- }
- switch (event->detail)
- {
- case NotifyAncestor: detail = "NotifyAncestor"; break;
- case NotifyVirtual: detail = "NotifyVirtual"; break;
- case NotifyInferior: detail = "NotifyInferior"; break;
- case NotifyNonlinear: detail = "NotifyNonlinear"; break;
- case NotifyNonlinearVirtual: detail = "NotifyNonlinearVirtual"; break;
- case NotifyPointer: detail = "NotifyPointer"; break;
- case NotifyPointerRoot: detail = "NotifyPointerRoot"; break;
- case NotifyDetailNone: detail = "NotifyDetailNone"; break;
- }
- printf(" mode: %s (detail %s)\n", mode, detail);
- printf(" flags: %s %s\n", event->focus ? "[focus]" : "",
- event->same_screen ? "[same screen]" : "");
- printf(" buttons:");
- for (i = 0; i < event->buttons.mask_len * 8; i++)
- if (XIMaskIsSet(event->buttons.mask, i))
- printf(" %d", i);
- printf("\n");
-
- printf(" modifiers: locked 0x%x latched 0x%x base 0x%x\n",
- event->mods.locked, event->mods.latched,
- event->mods.base);
- printf(" group: locked 0x%x latched 0x%x base 0x%x\n",
- event->group.locked, event->group.latched,
- event->group.base);
-
- printf(" root x/y: %.2f / %.2f\n", event->root_x, event->root_y);
- printf(" event x/y: %.2f / %.2f\n", event->event_x, event->event_y);
-
-}
-
-
-void fgPrintXIDeviceEvent(XIDeviceEvent* event)
-{
- double *val;
- int i;
-
- printf(" device: %d (%d)\n", event->deviceid, event->sourceid);
- printf(" detail: %d\n", event->detail);
- printf(" buttons:");
- for (i = 0; i < event->buttons.mask_len * 8; i++)
- if (XIMaskIsSet(event->buttons.mask, i))
- printf(" %d", i);
- printf("\n");
-
- printf(" modifiers: locked 0x%x latched 0x%x base 0x%x\n",
- event->mods.locked, event->mods.latched,
- event->mods.base);
- printf(" group: locked 0x%x latched 0x%x base 0x%x\n",
- event->group.locked, event->group.latched,
- event->group.base);
- printf(" valuators:");
-
- val = event->valuators.values;
- for (i = 0; i < event->valuators.mask_len * 8; i++)
- if (XIMaskIsSet(event->valuators.mask, i))
- printf(" %d: %.2f", i, *val++);
- printf("\n");
-
- printf(" windows: root 0x%lx event 0x%lx child 0x%ld\n",
- event->root, event->event, event->child);
- printf(" root x/y: %.2f / %.2f\n", event->root_x, event->root_y);
- printf(" event x/y: %.2f / %.2f\n", event->event_x, event->event_y);
-
-}
-
-
-/**
- * \brief This function is called when an Extension Event is received
- * and calls the corresponding callback functions for these events.
- */
-void fgHandleExtensionEvents( XEvent* base_ev ) {
-
- int i, button = 0;
- XGenericEventCookie* cookie = (XGenericEventCookie*)&(base_ev->xcookie);
-
- if ( XGetEventData( fgDisplay.Display, cookie ) && (cookie->type == GenericEvent) && (cookie->extension == xi_opcode) ) {
-
- XIDeviceEvent* event = (XIDeviceEvent*)(cookie->data);
- /*printf("XI2 event type: %d - %d\n", cookie->evtype, event->type );*/
-
- SFG_Window* window = fgWindowByHandle( event->event );
- if (!window) return;
-
- switch (cookie->evtype) {
-
- case XI_Enter:
- case XI_Leave:
- fgState.Modifiers = fghGetXModifiers( ((XIEnterEvent*)event)->mods.base );
- INVOKE_WCB( *window, MultiEntry, (
- event->deviceid,
- (event->evtype == XI_Enter ? GLUT_ENTERED : GLUT_LEFT)
- ));
- #if _DEBUG
- fgPrintXILeaveEvent((XILeaveEvent*)event);
- #endif
- break;
-
- case XI_ButtonPress:
- case XI_ButtonRelease:
- fgState.Modifiers = fghGetXModifiers( event->mods.base );
- INVOKE_WCB( *window, MultiButton, (
- event->deviceid,
- event->event_x,
- event->event_y,
- (event->detail)-1,
- (event->evtype == XI_ButtonPress ? GLUT_DOWN : GLUT_UP)
- ));
- INVOKE_WCB( *window, Mouse, (
- (event->detail)-1,
- (event->evtype == XI_ButtonPress ? GLUT_DOWN : GLUT_UP),
- event->event_x,
- event->event_y
- ));
- break;
-
- case XI_Motion:
- fgState.Modifiers = fghGetXModifiers( event->mods.base );
- for (i = 0; i < event->buttons.mask_len; i++) if (event->buttons.mask[i]) button = 1;
- if (button) {
- INVOKE_WCB( *window, MultiMotion, ( event->deviceid, event->event_x, event->event_y ) );
- INVOKE_WCB( *window, Motion, ( event->event_x, event->event_y ) );
- } else {
- INVOKE_WCB( *window, MultiPassive, ( event->deviceid, event->event_x, event->event_y ) );
- INVOKE_WCB( *window, Passive, ( event->event_x, event->event_y ) );
- }
- #if _DEBUG
- fgPrintXIDeviceEvent(event);
- #endif
- break;
-
- default:
- #if _DEBUG
- fgWarning( "Unknown XI2 device event:" );
- fgPrintXIDeviceEvent( event );
- #endif
- break;
- }
- fgState.Modifiers = INVALID_MODIFIERS;
- }
- XFreeEventData( fgDisplay.Display, cookie );
-}
-
-#endif
-
+++ /dev/null
-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