--- /dev/null
+
+Pawel W. Olszta <olszta@sourceforge.net>
+ the person to be blamed for freeglut
+
+Andreas Umbach <marvin@dataway.ch>
+ the first person to contribute to the freeglut project,
+ contributed the cube and sphere geometry code
+
+Steve Baker <sjbaker1@airmail.net>
+ joystick code (from his great PLIB), numerous hints
+ and tips on the freeglut usability
+
+...and all the opengl-gamedev-l people that made me to start this project :)
--- /dev/null
+
+ Freeglut Copyright
+ ------------------
+
+ Freeglut code without an explicit copyright is covered by the following
+ copyright:
+
+ Copyright (c) 1999-2000 Pawel W. Olszta. 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 or substantial portions of the Software.
+
+ 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.
+
+ Except as contained in this notice, the name of Pawel W. Olszta shall not be
+ used in advertising or otherwise to promote the sale, use or other dealings
+ in this Software without prior written authorization from Pawel W. Olszta.
--- /dev/null
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes a while. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 4. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
--- /dev/null
+## Process this file with automake to produce makefile.im
+
+SUBDIRS = freeglut-1.3 include genfonts tests
+AUTOMAKE_OPTIONS = gnu
+
+EXTRA_DIST = AUTHORS COPYING ChangeLog INSTALL NEWS README TODO freeglut.lsm \
+ freeglut.kdevprj
--- /dev/null
+
+Jan 16th 2000:
+
+ First really functional release of freeglut.
+
+
+Jan 13th 2001:
+
+ Steve Baker takes over as maintainer of freeglut.
+
+
--- /dev/null
+
+ BRIEF OVERVIEW
+ ==============
+
+ This is an alpha release of the freeglut package. Currently only
+ the alpha version of freeglut-1.3 library is available.
+
+ Freeglut, the Free openGL Utility Toolkit, is meant to be a free alter-
+ native to Mark Kilgard's GLUT library. It is distributed under an X-Consor-
+ tium style license (see COPYING for details), to offer you a chance to use
+ and/or modify the source.
+
+ It makes use of OpenGL, GLU, GLib and pthreads-win32 libraries. GLib is
+ LGPL'ed and I hope I do not violate it's license by using it. In case this
+ is true, please notify me so that I remove GLib usage from the project.
+
+ The library does not make use of any GLUT code and is not 100% compatible.
+ Code recompilation and/or slight modifications might be required for your
+ applications to work with freeglut.
+
+
+ PORTS
+ =====
+
+ Both X11 and Win32 ports are in an advanced alpha stage, which means that
+ they provide limited functionality of GLUT API 3. There is an investigation
+ en course to check if the BeOS port could be easily done using the current
+ freeglut structure.
+
+
+ INSTALLATION
+ ============
+
+ See the INSTALL file.
+
+
+ CONTRIBUTING
+ ============
+
+ Bug and missing features patches are certainly welcome. Just as comments
+ and FREEGLUT API 1 propositions are.
+
+ Just please to make the fixes look visually just as the rest of the code
+ does (tabs converted 4 white spaces). Comments are really welcome, as I
+ believe it would be nice for people fresh new to OpenGL see how the things
+ are done...
+
+
+ WEB SITE AND CONTACTING THE AUTHOR
+ ==================================
+
+ Freeglut project has moved to the SourceForge:
+ http://freeglut.sourceforge.net
+
+
+ THE HOPE
+ ========
+
+ Hope you find my work somehow useful.
+ Pawel W. Olszta, <olszta@sourceforge.net>
+
+
+ PASSING THE BATON
+ =================
+
+ In late December 2000, Pawel decided that he no longer
+ wished to maintain freeglut because he has moved out of
+ the graphics field. I volunteered to take over from him
+ and have been running the project since Jan 13th 2001.
+
+ I'm also the author and maintainer of the PLIB library suite
+ and 'freeglut' really fits in well with that work.
+
+ I just hope I can live up to Pawel's high standards. Pawel
+ remains on the active developers list.
+
+ Steve Baker <sjbaker1@airmail.net>
+ http://plib.sourceforge.net
+
+
--- /dev/null
+
+ The up-to-date TODO list can be found under following URL:
+ http://freeglut.sourceforge.net/progress.html
--- /dev/null
+/* Define if the C compiler supports BOOL */
+#undef HAVE_BOOL
+
+#undef VERSION
+
+#undef PACKAGE
+
+/* Define if you need the GNU extensions to compile */
+#undef _GNU_SOURCE
--- /dev/null
+dnl aclocal.m4 generated automatically by aclocal 1.4
+
+dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+# Do all the work for Automake. This macro actually does too much --
+# some checks are only needed if your package does certain things.
+# But this isn't really a big deal.
+
+# serial 1
+
+dnl Usage:
+dnl AM_INIT_AUTOMAKE(package,version, [no-define])
+
+AC_DEFUN(AM_INIT_AUTOMAKE,
+[AC_REQUIRE([AC_PROG_INSTALL])
+PACKAGE=[$1]
+AC_SUBST(PACKAGE)
+VERSION=[$2]
+AC_SUBST(VERSION)
+dnl test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+ifelse([$3],,
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package]))
+AC_REQUIRE([AM_SANITY_CHECK])
+AC_REQUIRE([AC_ARG_PROGRAM])
+dnl FIXME This is truly gross.
+missing_dir=`cd $ac_aux_dir && pwd`
+AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
+AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
+AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
+AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
+AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
+AC_REQUIRE([AC_PROG_MAKE_SET])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+AC_DEFUN(AM_SANITY_CHECK,
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+ if test "[$]*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftestfile`
+ fi
+ if test "[$]*" != "X $srcdir/configure conftestfile" \
+ && test "[$]*" != "X conftestfile $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "[$]2" = conftestfile
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+rm -f conftest*
+AC_MSG_RESULT(yes)])
+
+dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
+dnl The program must properly implement --version.
+AC_DEFUN(AM_MISSING_PROG,
+[AC_MSG_CHECKING(for working $2)
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if ($2 --version) < /dev/null > /dev/null 2>&1; then
+ $1=$2
+ AC_MSG_RESULT(found)
+else
+ $1="$3/missing $2"
+ AC_MSG_RESULT(missing)
+fi
+AC_SUBST($1)])
+
+# Like AC_CONFIG_HEADER, but automatically create stamp file.
+
+AC_DEFUN(AM_CONFIG_HEADER,
+[AC_PREREQ([2.12])
+AC_CONFIG_HEADER([$1])
+dnl When config.status generates a header, we must update the stamp-h file.
+dnl This file resides in the same directory as the config header
+dnl that is generated. We must strip everything past the first ":",
+dnl and everything past the last "/".
+AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl
+ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>,
+<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>,
+<<am_indx=1
+for am_file in <<$1>>; do
+ case " <<$>>CONFIG_HEADERS " in
+ *" <<$>>am_file "*<<)>>
+ echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx
+ ;;
+ esac
+ am_indx=`expr "<<$>>am_indx" + 1`
+done<<>>dnl>>)
+changequote([,]))])
+
+
+# serial 40 AC_PROG_LIBTOOL
+AC_DEFUN(AC_PROG_LIBTOOL,
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+
+# Save cache, so that ltconfig can load it
+AC_CACHE_SAVE
+
+# Actually configure libtool. ac_aux_dir is where install-sh is found.
+CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
+LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \
+LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \
+DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \
+${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
+$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \
+|| AC_MSG_ERROR([libtool configure failed])
+
+# Reload cache, that may have been modified by ltconfig
+AC_CACHE_LOAD
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Redirect the config.log output again, so that the ltconfig log is not
+# clobbered by the next message.
+exec 5>>./config.log
+])
+
+AC_DEFUN(AC_LIBTOOL_SETUP,
+[AC_PREREQ(2.13)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_RANLIB])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+dnl
+
+case "$target" in
+NONE) lt_target="$host" ;;
+*) lt_target="$target" ;;
+esac
+
+# Check for any special flags to pass to ltconfig.
+libtool_flags="--cache-file=$cache_file"
+test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
+test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
+test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install"
+test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
+test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
+ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN],
+[libtool_flags="$libtool_flags --enable-dlopen"])
+ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],
+[libtool_flags="$libtool_flags --enable-win32-dll"])
+AC_ARG_ENABLE(libtool-lock,
+ [ --disable-libtool-lock avoid locking (might break parallel builds)])
+test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock"
+test x"$silent" = xyes && libtool_flags="$libtool_flags --silent"
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case "$lt_target" in
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case "`/usr/bin/file conftest.o`" in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+ [AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])])
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+
+ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],
+[*-*-cygwin* | *-*-mingw*)
+ AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+ AC_CHECK_TOOL(AS, as, false)
+ AC_CHECK_TOOL(OBJDUMP, objdump, false)
+ ;;
+])
+esac
+])
+
+# AC_LIBTOOL_DLOPEN - enable checks for dlopen support
+AC_DEFUN(AC_LIBTOOL_DLOPEN, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])])
+
+# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's
+AC_DEFUN(AC_LIBTOOL_WIN32_DLL, [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])])
+
+# AC_ENABLE_SHARED - implement the --enable-shared flag
+# Usage: AC_ENABLE_SHARED[(DEFAULT)]
+# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
+# `yes'.
+AC_DEFUN(AC_ENABLE_SHARED, [dnl
+define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(shared,
+changequote(<<, >>)dnl
+<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_shared=yes ;;
+no) enable_shared=no ;;
+*)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac],
+enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl
+])
+
+# AC_DISABLE_SHARED - set the default shared flag to --disable-shared
+AC_DEFUN(AC_DISABLE_SHARED, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_SHARED(no)])
+
+# AC_ENABLE_STATIC - implement the --enable-static flag
+# Usage: AC_ENABLE_STATIC[(DEFAULT)]
+# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
+# `yes'.
+AC_DEFUN(AC_ENABLE_STATIC, [dnl
+define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(static,
+changequote(<<, >>)dnl
+<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_static=yes ;;
+no) enable_static=no ;;
+*)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac],
+enable_static=AC_ENABLE_STATIC_DEFAULT)dnl
+])
+
+# AC_DISABLE_STATIC - set the default static flag to --disable-static
+AC_DEFUN(AC_DISABLE_STATIC, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_STATIC(no)])
+
+
+# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag
+# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)]
+# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
+# `yes'.
+AC_DEFUN(AC_ENABLE_FAST_INSTALL, [dnl
+define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(fast-install,
+changequote(<<, >>)dnl
+<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT],
+changequote([, ])dnl
+[p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_fast_install=yes ;;
+no) enable_fast_install=no ;;
+*)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac],
+enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl
+])
+
+# AC_ENABLE_FAST_INSTALL - set the default to --disable-fast-install
+AC_DEFUN(AC_DISABLE_FAST_INSTALL, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_FAST_INSTALL(no)])
+
+# AC_PROG_LD - find the path to the GNU or non-GNU linker
+AC_DEFUN(AC_PROG_LD,
+[AC_ARG_WITH(gnu-ld,
+[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+ac_prog=ld
+if test "$ac_cv_prog_gcc" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by GCC])
+ ac_prog=`($CC -print-prog-name=ld) 2>&5`
+ case "$ac_prog" in
+ # Accept absolute paths.
+changequote(,)dnl
+ [\\/]* | [A-Za-z]:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+changequote([,])dnl
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(ac_cv_path_LD,
+[if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ ac_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" != no && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ ac_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$ac_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_PROG_LD_GNU
+])
+
+AC_DEFUN(AC_PROG_LD_GNU,
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+ ac_cv_prog_gnu_ld=yes
+else
+ ac_cv_prog_gnu_ld=no
+fi])
+])
+
+# AC_PROG_NM - find the path to a BSD-compatible name lister
+AC_DEFUN(AC_PROG_NM,
+[AC_MSG_CHECKING([for BSD-compatible nm])
+AC_CACHE_VAL(ac_cv_path_NM,
+[if test -n "$NM"; then
+ # Let the user override the test.
+ ac_cv_path_NM="$NM"
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+ for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -B"
+ break
+ elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -p"
+ break
+ else
+ ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
+fi])
+NM="$ac_cv_path_NM"
+AC_MSG_RESULT([$NM])
+])
+
+# AC_CHECK_LIBM - check for math library
+AC_DEFUN(AC_CHECK_LIBM,
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case "$lt_target" in
+*-*-beos* | *-*-cygwin*)
+ # These system don't have libm
+ ;;
+*-ncr-sysv4.3*)
+ AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+ AC_CHECK_LIB(m, main, LIBM="$LIBM -lm")
+ ;;
+*)
+ AC_CHECK_LIB(m, main, LIBM="-lm")
+ ;;
+esac
+])
+
+# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for
+# the libltdl convenience library, adds --enable-ltdl-convenience to
+# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor
+# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed
+# to be `${top_builddir}/libltdl'. Make sure you start DIR with
+# '${top_builddir}/' (note the single quotes!) if your package is not
+# flat, and, if you're not using automake, define top_builddir as
+# appropriate in the Makefiles.
+AC_DEFUN(AC_LIBLTDL_CONVENIENCE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ case "$enable_ltdl_convenience" in
+ no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+ "") enable_ltdl_convenience=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+ esac
+ LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdlc.la
+ INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl'])
+])
+
+# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for
+# the libltdl installable library, and adds --enable-ltdl-install to
+# the configure arguments. Note that LIBLTDL is not AC_SUBSTed, nor
+# is AC_CONFIG_SUBDIRS called. If DIR is not provided, it is assumed
+# to be `${top_builddir}/libltdl'. Make sure you start DIR with
+# '${top_builddir}/' (note the single quotes!) if your package is not
+# flat, and, if you're not using automake, define top_builddir as
+# appropriate in the Makefiles.
+# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
+AC_DEFUN(AC_LIBLTDL_INSTALLABLE, [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ AC_CHECK_LIB(ltdl, main,
+ [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
+ [if test x"$enable_ltdl_install" = xno; then
+ AC_MSG_WARN([libltdl not installed, but installation disabled])
+ else
+ enable_ltdl_install=yes
+ fi
+ ])
+ if test x"$enable_ltdl_install" = x"yes"; then
+ ac_configure_args="$ac_configure_args --enable-ltdl-install"
+ LIBLTDL=ifelse($#,1,$1,['${top_builddir}/libltdl'])/libltdl.la
+ INCLTDL=ifelse($#,1,-I$1,['-I${top_builddir}/libltdl'])
+ else
+ ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
+ LIBLTDL="-lltdl"
+ INCLTDL=
+ fi
+])
+
+dnl old names
+AC_DEFUN(AM_PROG_LIBTOOL, [indir([AC_PROG_LIBTOOL])])dnl
+AC_DEFUN(AM_ENABLE_SHARED, [indir([AC_ENABLE_SHARED], $@)])dnl
+AC_DEFUN(AM_ENABLE_STATIC, [indir([AC_ENABLE_STATIC], $@)])dnl
+AC_DEFUN(AM_DISABLE_SHARED, [indir([AC_DISABLE_SHARED], $@)])dnl
+AC_DEFUN(AM_DISABLE_STATIC, [indir([AC_DISABLE_STATIC], $@)])dnl
+AC_DEFUN(AM_PROG_LD, [indir([AC_PROG_LD])])dnl
+AC_DEFUN(AM_PROG_NM, [indir([AC_PROG_NM])])dnl
+
+dnl This is just to silence aclocal about the macro not being used
+ifelse([AC_DISABLE_FAST_INSTALL])dnl
+
--- /dev/null
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+ --enable-shared[=PKGS] build shared libraries [default=yes]"
+ac_help="$ac_help
+ --enable-static[=PKGS] build static libraries [default=yes]"
+ac_help="$ac_help
+ --enable-fast-install[=PKGS] optimize for fast installation [default=yes]"
+ac_help="$ac_help
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]"
+ac_help="$ac_help
+ --disable-libtool-lock avoid locking (might break parallel builds)"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=Makefile.am
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:567: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
+echo "configure:620: checking whether build environment is sane" >&5
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftestfile`
+ fi
+ if test "$*" != "X $srcdir/configure conftestfile" \
+ && test "$*" != "X conftestfile $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { echo "configure: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" 1>&2; exit 1; }
+ fi
+
+ test "$2" = conftestfile
+ )
+then
+ # Ok.
+ :
+else
+ { echo "configure: error: newly created file is older than distributed files!
+Check your system clock" 1>&2; exit 1; }
+fi
+rm -f conftest*
+echo "$ac_t""yes" 1>&6
+if test "$program_transform_name" = s,x,x,; then
+ program_transform_name=
+else
+ # Double any \ or $. echo might interpret backslashes.
+ cat <<\EOF_SED > conftestsed
+s,\\,\\\\,g; s,\$,$$,g
+EOF_SED
+ program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
+ rm -f conftestsed
+fi
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,${program_prefix},; $program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
+
+# sed with no file args requires a program.
+test "$program_transform_name" = "" && program_transform_name="s,x,x,"
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:677: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftestmake <<\EOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ SET_MAKE=
+else
+ echo "$ac_t""no" 1>&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+PACKAGE=freeglut
+
+VERSION=0.1
+
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+ { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
+fi
+cat >> confdefs.h <<EOF
+#define PACKAGE "$PACKAGE"
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION "$VERSION"
+EOF
+
+
+
+missing_dir=`cd $ac_aux_dir && pwd`
+echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
+echo "configure:723: checking for working aclocal" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (aclocal --version) < /dev/null > /dev/null 2>&1; then
+ ACLOCAL=aclocal
+ echo "$ac_t""found" 1>&6
+else
+ ACLOCAL="$missing_dir/missing aclocal"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
+echo "configure:736: checking for working autoconf" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (autoconf --version) < /dev/null > /dev/null 2>&1; then
+ AUTOCONF=autoconf
+ echo "$ac_t""found" 1>&6
+else
+ AUTOCONF="$missing_dir/missing autoconf"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working automake""... $ac_c" 1>&6
+echo "configure:749: checking for working automake" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (automake --version) < /dev/null > /dev/null 2>&1; then
+ AUTOMAKE=automake
+ echo "$ac_t""found" 1>&6
+else
+ AUTOMAKE="$missing_dir/missing automake"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
+echo "configure:762: checking for working autoheader" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (autoheader --version) < /dev/null > /dev/null 2>&1; then
+ AUTOHEADER=autoheader
+ echo "$ac_t""found" 1>&6
+else
+ AUTOHEADER="$missing_dir/missing autoheader"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
+echo "configure:775: checking for working makeinfo" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
+ MAKEINFO=makeinfo
+ echo "$ac_t""found" 1>&6
+else
+ MAKEINFO="$missing_dir/missing makeinfo"
+ echo "$ac_t""missing" 1>&6
+fi
+
+
+
+
+
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:795: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:825: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test -z "$CC"; then
+ case "`uname -s`" in
+ *win32* | *WIN32*)
+ # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:876: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="cl"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ ;;
+ esac
+ fi
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:908: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 919 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:924: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:950: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:955: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:964: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:983: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:1015: checking for working const" >&5
+if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1020 "configure"
+#include "confdefs.h"
+
+int main() {
+
+/* Ultrix mips cc rejects this. */
+typedef int charset[2]; const charset x;
+/* SunOS 4.1.1 cc rejects this. */
+char const *const *ccp;
+char **p;
+/* NEC SVR4.0.2 mips cc rejects this. */
+struct point {int x, y;};
+static struct point const zero = {0,0};
+/* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in an arm
+ of an if-expression whose if-part is not a constant expression */
+const char *g = "string";
+ccp = &g + (g ? g-g : 0);
+/* HPUX 7.0 cc rejects these. */
+++ccp;
+p = (char**) ccp;
+ccp = (char const *const *) p;
+{ /* SCO 3.2v4 cc rejects this. */
+ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+}
+{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+}
+{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+}
+{ /* AIX XL C 1.02.0.0 rejects this saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; };
+ struct s *b; b->j = 5;
+}
+{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+}
+
+; return 0; }
+EOF
+if { (eval echo configure:1069: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_const=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_c_const=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_c_const" 1>&6
+if test $ac_cv_c_const = no; then
+ cat >> confdefs.h <<\EOF
+#define const
+EOF
+
+fi
+
+echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
+echo "configure:1090: checking for Cygwin environment" >&5
+if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1095 "configure"
+#include "confdefs.h"
+
+int main() {
+
+#ifndef __CYGWIN__
+#define __CYGWIN__ __CYGWIN32__
+#endif
+return __CYGWIN__;
+; return 0; }
+EOF
+if { (eval echo configure:1106: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_cygwin=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_cygwin=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_cygwin" 1>&6
+CYGWIN=
+test "$ac_cv_cygwin" = yes && CYGWIN=yes
+echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
+echo "configure:1123: checking for mingw32 environment" >&5
+if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1128 "configure"
+#include "confdefs.h"
+
+int main() {
+return __MINGW32__;
+; return 0; }
+EOF
+if { (eval echo configure:1135: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_mingw32=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_mingw32=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_mingw32" 1>&6
+MINGW32=
+test "$ac_cv_mingw32" = yes && MINGW32=yes
+
+
+echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
+echo "configure:1154: checking for executable suffix" >&5
+if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
+ ac_cv_exeext=.exe
+else
+ rm -f conftest*
+ echo 'int main () { return 0; }' > conftest.$ac_ext
+ ac_cv_exeext=
+ if { (eval echo configure:1164: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+ for file in conftest.*; do
+ case $file in
+ *.c | *.o | *.obj) ;;
+ *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
+ esac
+ done
+ else
+ { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
+ fi
+ rm -f conftest*
+ test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
+fi
+fi
+
+EXEEXT=""
+test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
+echo "$ac_t""${ac_cv_exeext}" 1>&6
+ac_exeext=$EXEEXT
+
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1187: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+# Check whether --enable-shared or --disable-shared was given.
+if test "${enable_shared+set}" = set; then
+ enableval="$enable_shared"
+ p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_shared=yes ;;
+no) enable_shared=no ;;
+*)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+else
+ enable_shared=yes
+fi
+
+# Check whether --enable-static or --disable-static was given.
+if test "${enable_static+set}" = set; then
+ enableval="$enable_static"
+ p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_static=yes ;;
+no) enable_static=no ;;
+*)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+else
+ enable_static=yes
+fi
+
+# Check whether --enable-fast-install or --disable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then
+ enableval="$enable_fast_install"
+ p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_fast_install=yes ;;
+no) enable_fast_install=no ;;
+*)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+else
+ enable_fast_install=yes
+fi
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:1291: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:1312: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+ case $nonopt in
+ NONE) build_alias=$host_alias ;;
+ *) build_alias=$nonopt ;;
+ esac ;;
+esac
+
+build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+ withval="$with_gnu_ld"
+ test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$ac_cv_prog_gcc" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
+echo "configure:1341: checking for ld used by GCC" >&5
+ ac_prog=`($CC -print-prog-name=ld) 2>&5`
+ case "$ac_prog" in
+ # Accept absolute paths.
+ [\\/]* | [A-Za-z]:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
+echo "configure:1365: checking for GNU ld" >&5
+else
+ echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
+echo "configure:1368: checking for non-GNU ld" >&5
+fi
+if eval "test \"`echo '$''{'ac_cv_path_LD'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ ac_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" != no && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ ac_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$ac_cv_path_LD"
+if test -n "$LD"; then
+ echo "$ac_t""$LD" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; }
+echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6
+echo "configure:1403: checking if the linker ($LD) is GNU ld" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gnu_ld'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+ ac_cv_prog_gnu_ld=yes
+else
+ ac_cv_prog_gnu_ld=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gnu_ld" 1>&6
+
+
+echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6
+echo "configure:1419: checking for BSD-compatible nm" >&5
+if eval "test \"`echo '$''{'ac_cv_path_NM'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$NM"; then
+ # Let the user override the test.
+ ac_cv_path_NM="$NM"
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+ for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext ; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -B"
+ break
+ elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -p"
+ break
+ else
+ ac_cv_path_NM=${ac_cv_path_NM="$ac_dir/nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
+fi
+fi
+
+NM="$ac_cv_path_NM"
+echo "$ac_t""$NM" 1>&6
+
+echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
+echo "configure:1455: checking whether ln -s works" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ rm -f conftestdata
+if ln -s X conftestdata 2>/dev/null
+then
+ rm -f conftestdata
+ ac_cv_prog_LN_S="ln -s"
+else
+ ac_cv_prog_LN_S=ln
+fi
+fi
+LN_S="$ac_cv_prog_LN_S"
+if test "$ac_cv_prog_LN_S" = "ln -s"; then
+ echo "$ac_t""yes" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+case "$target" in
+NONE) lt_target="$host" ;;
+*) lt_target="$target" ;;
+esac
+
+# Check for any special flags to pass to ltconfig.
+libtool_flags="--cache-file=$cache_file"
+test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
+test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
+test "$enable_fast_install" = no && libtool_flags="$libtool_flags --disable-fast-install"
+test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
+test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
+libtool_flags="$libtool_flags --enable-dlopen"
+
+# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then
+ enableval="$enable_libtool_lock"
+ :
+fi
+
+test "x$enable_libtool_lock" = xno && libtool_flags="$libtool_flags --disable-lock"
+test x"$silent" = xyes && libtool_flags="$libtool_flags --silent"
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case "$lt_target" in
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '#line 1504 "configure"' > conftest.$ac_ext
+ if { (eval echo configure:1505: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ case "`/usr/bin/file conftest.o`" in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
+echo "configure:1526: checking whether the C compiler needs -belf" >&5
+if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1531 "configure"
+#include "confdefs.h"
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1538: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ lt_cv_cc_needs_belf=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ lt_cv_cc_needs_belf=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$lt_cv_cc_needs_belf" 1>&6
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+
+
+esac
+
+
+# Save cache, so that ltconfig can load it
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+
+# Actually configure libtool. ac_aux_dir is where install-sh is found.
+CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
+LD="$LD" LDFLAGS="$LDFLAGS" LIBS="$LIBS" \
+LN_S="$LN_S" NM="$NM" RANLIB="$RANLIB" \
+DLLTOOL="$DLLTOOL" AS="$AS" OBJDUMP="$OBJDUMP" \
+${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \
+$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $lt_target \
+|| { echo "configure: error: libtool configure failed" 1>&2; exit 1; }
+
+# Reload cache, that may have been modified by ltconfig
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltconfig $ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Redirect the config.log output again, so that the ltconfig log is not
+# clobbered by the next message.
+exec 5>>./config.log
+
+
+
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1643: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 1658 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1664: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 1675 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1681: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -nologo -E"
+ cat > conftest.$ac_ext <<EOF
+#line 1692 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1698: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:1723: checking for ANSI C header files" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1728 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1736: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ ac_cv_header_stdc=yes
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1753 "configure"
+#include "confdefs.h"
+#include <string.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "memchr" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1771 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "free" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+if test "$cross_compiling" = yes; then
+ :
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1792 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int main () { int i; for (i = 0; i < 256; i++)
+if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+exit (0); }
+
+EOF
+if { (eval echo configure:1803: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ :
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_header_stdc=no
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_header_stdc" 1>&6
+if test $ac_cv_header_stdc = yes; then
+ cat >> confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+for ac_hdr in GL/gl.h GL/glu.h GL/glx.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1830: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1835 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1840: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+
+
+LIBM=
+case "$lt_target" in
+*-*-beos* | *-*-cygwin*)
+ # These system don't have libm
+ ;;
+*-ncr-sysv4.3*)
+ echo $ac_n "checking for _mwvalidcheckl in -lmw""... $ac_c" 1>&6
+echo "configure:1876: checking for _mwvalidcheckl in -lmw" >&5
+ac_lib_var=`echo mw'_'_mwvalidcheckl | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lmw $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1884 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char _mwvalidcheckl();
+
+int main() {
+_mwvalidcheckl()
+; return 0; }
+EOF
+if { (eval echo configure:1895: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBM="-lmw"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
+echo "configure:1916: checking for main in -lm" >&5
+ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lm $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1924 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:1931: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBM="$LIBM -lm"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ ;;
+*)
+ echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
+echo "configure:1954: checking for main in -lm" >&5
+ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lm $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1962 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:1969: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBM="-lm"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ ;;
+esac
+
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile freeglut-1.3/Makefile include/Makefile include/GL/Makefile genfonts/Makefile tests/Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@PACKAGE@%$PACKAGE%g
+s%@VERSION@%$VERSION%g
+s%@ACLOCAL@%$ACLOCAL%g
+s%@AUTOCONF@%$AUTOCONF%g
+s%@AUTOMAKE@%$AUTOMAKE%g
+s%@AUTOHEADER@%$AUTOHEADER%g
+s%@MAKEINFO@%$MAKEINFO%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@CC@%$CC%g
+s%@EXEEXT@%$EXEEXT%g
+s%@RANLIB@%$RANLIB%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@LN_S@%$LN_S%g
+s%@LIBTOOL@%$LIBTOOL%g
+s%@LIBTOOL_DEPS@%$LIBTOOL_DEPS%g
+s%@CPP@%$CPP%g
+s%@LIBM@%$LIBM%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile freeglut-1.3/Makefile include/Makefile include/GL/Makefile genfonts/Makefile tests/Makefile "}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='\([ ][ ]*\)[^ ]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='\([ ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+ CONFIG_HEADERS="config.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ echo creating $ac_file
+
+ rm -f conftest.frag conftest.in conftest.out
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h. And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+ ac_lines=`grep -c . conftest.vals`
+ # grep -c gives empty output for an empty file on some AIX systems.
+ if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+ # Write a limited-size here document to conftest.frag.
+ echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+ echo 'CEOF
+ sed -f conftest.frag conftest.in > conftest.out
+ rm -f conftest.in
+ mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+ rm -f conftest.vals
+ mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+ rm -f conftest.frag conftest.h
+ echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
+ cat conftest.in >> conftest.h
+ rm -f conftest.in
+ if cmp -s $ac_file conftest.h 2>/dev/null; then
+ echo "$ac_file is unchanged"
+ rm -f conftest.h
+ else
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ fi
+ rm -f $ac_file
+ mv conftest.h $ac_file
+ fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
--- /dev/null
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(Makefile.am)
+
+AM_INIT_AUTOMAKE(freeglut,0.1)
+AM_CONFIG_HEADER(config.h)
+
+dnl Checks for programs.
+AC_PROG_CC
+AC_C_CONST
+AC_EXEEXT
+AC_PROG_RANLIB
+AC_LIBTOOL_DLOPEN
+AM_PROG_LIBTOOL
+AC_SUBST(LIBTOOL_DEPS)
+
+dnl Checks for libraries.
+
+dnl Checks for header files.
+AC_STDC_HEADERS
+AC_HAVE_HEADERS( GL/gl.h GL/glu.h GL/glx.h )
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+
+dnl Checks for library functions.
+
+AC_CHECK_LIBM
+AC_SUBST(LIBM)
+
+AC_OUTPUT(Makefile freeglut-1.3/Makefile include/Makefile include/GL/Makefile genfonts/Makefile tests/Makefile )
--- /dev/null
+## Process this file with automake to produce Makefile.im
+
+#
+# The library we want to build
+#
+lib_LTLIBRARIES = libfreeglut-1.3.la
+
+#
+# Those source files build the freeglut library
+#
+libfreeglut_1_3_la_SOURCES = freeglut_callbacks.c \
+ freeglut_cursor.c \
+ freeglut_display.c \
+ freeglut_font.c \
+ freeglut_font_data.c \
+ freeglut_gamemode.c \
+ freeglut_geometry.c \
+ freeglut_init.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
+
+
+#
+# Additional linker flags
+#
+libfreeglut_1_3_la_LIBADD = $(LIBM) -L/usr/X11R6/lib -lGL -lGLU -lXext -lX11 -lXxf86vm -lglib
+libfreeglut_1_3_la_LDFLAGS = -version-info 0:0:0
+
+#
+# End of file
+#
--- /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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "freeglut-callbacks"
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/freeglut_internal.h"
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * All of the callbacks setting methods can be generalized to this:
+ */
+#define SET_CALLBACK(a) if( fgStructure.Window == NULL ) return;\
+ fgStructure.Window->Callbacks.a = callback;
+
+/*
+ * Sets the Display callback for the current window
+ */
+void FGAPIENTRY glutDisplayFunc( void (* callback)( void ) )
+{
+ SET_CALLBACK( Display );
+}
+
+/*
+ * Sets the Reshape callback for the current window
+ */
+void FGAPIENTRY glutReshapeFunc( void (* callback)( int, int ) )
+{
+ SET_CALLBACK( Reshape );
+}
+
+/*
+ * Sets the Keyboard callback for the current window
+ */
+void FGAPIENTRY glutKeyboardFunc( void (* callback)( unsigned char, int, int ) )
+{
+ SET_CALLBACK( Keyboard );
+}
+
+/*
+ * Sets the Special callback for the current window
+ */
+void FGAPIENTRY glutSpecialFunc( void (* callback)( int, int, int ) )
+{
+ SET_CALLBACK( Special );
+}
+
+/*
+ * Sets the global idle callback
+ */
+void FGAPIENTRY glutIdleFunc( void (* callback)( void ) )
+{
+ freeglut_assert_ready;
+
+ /*
+ * The global idle callback pointer is stored in fgState structure
+ */
+ 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;
+
+ freeglut_assert_ready;
+
+ /*
+ * Create a new freeglut timer hook structure
+ */
+ timer = g_new0( SFG_Timer, 1 );
+
+ /*
+ * Remember the callback address and timer hook's ID
+ */
+ timer->Callback = callback;
+ timer->ID = timerID;
+
+ /*
+ * When will the time out happen (in terms of window's timer)
+ */
+ timer->TriggerTime =
+ g_timer_elapsed( fgState.Timer, NULL ) + (((double) timeOut) / 1000.0);
+
+ /*
+ * Have the new hook attached to the current window
+ */
+ fgState.Timers = g_list_append( fgState.Timers, timer );
+}
+
+/*
+ * Sets the Visibility callback for the current window.
+ *
+ * I had to peer to GLUT sources to clean up the mess.
+ * Can anyone please explain me what is going on here?!?
+ */
+static void fghVisibility( gint status )
+{
+ freeglut_assert_ready; freeglut_return_if_fail( fgStructure.Window != NULL );
+ freeglut_return_if_fail( fgStructure.Window->Callbacks.Visibility != NULL );
+
+ if( status == GLUT_HIDDEN || status == GLUT_FULLY_COVERED )
+ fgStructure.Window->Callbacks.Visibility( GLUT_NOT_VISIBLE );
+ else
+ fgStructure.Window->Callbacks.Visibility( GLUT_VISIBLE );
+}
+
+void FGAPIENTRY glutVisibilityFunc( void (* callback)( int ) )
+{
+ 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 ) )
+{
+ SET_CALLBACK( KeyboardUp );
+}
+
+/*
+ * Sets the special key release callback for the current window
+ */
+void FGAPIENTRY glutSpecialUpFunc( void (* callback)( int, int, int ) )
+{
+ 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 )
+{
+ SET_CALLBACK( Joystick );
+
+ freeglut_return_if_fail( fgStructure.Window != NULL );
+
+ /*
+ * Do not forget setting the joystick poll rate
+ */
+ fgStructure.Window->State.JoystickPollRate = ((double) pollInterval) / 1000.0;
+
+ /*
+ * Make sure the joystick polling routine gets called as early as possible:
+ */
+ fgStructure.Window->State.JoystickLastPoll =
+ g_timer_elapsed( fgState.Timer, NULL ) - fgStructure.Window->State.JoystickPollRate;
+
+ if( fgStructure.Window->State.JoystickLastPoll < 0.0 )
+ fgStructure.Window->State.JoystickLastPoll = 0.0;
+}
+
+/*
+ * Sets the mouse callback for the current window
+ */
+void FGAPIENTRY glutMouseFunc( void (* callback)( int, int, int, int ) )
+{
+ SET_CALLBACK( Mouse );
+}
+
+/*
+ * Sets the mouse motion callback for the current window (one or more buttons are pressed)
+ */
+void FGAPIENTRY glutMotionFunc( void (* callback)( int, int ) )
+{
+ 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 ) )
+{
+ SET_CALLBACK( Passive );
+}
+
+/*
+ * Window mouse entry/leave callback
+ */
+void FGAPIENTRY glutEntryFunc( void (* callback)( int ) )
+{
+ SET_CALLBACK( Entry );
+}
+
+/*
+ * Deprecated version of glutMenuStatusFunc callback setting method
+ */
+void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) )
+{
+ SET_CALLBACK( MenuState );
+}
+
+/*
+ * Sets the global menu status callback for the current window
+ */
+void FGAPIENTRY glutMenuStatusFunc( void (* callback)( int, int, int ) )
+{
+ SET_CALLBACK( MenuStatus );
+}
+
+/*
+ * Sets the overlay display callback for the current window
+ */
+void FGAPIENTRY glutOverlayDisplayFunc( void (* callback)( void ) )
+{
+ SET_CALLBACK( OverlayDisplay );
+}
+
+/*
+ * Sets the window status callback for the current window
+ */
+void FGAPIENTRY glutWindowStatusFunc( void (* callback)( int ) )
+{
+ SET_CALLBACK( WindowStatus );
+}
+
+/*
+ * Sets the spaceball motion callback for the current window
+ */
+void FGAPIENTRY glutSpaceballMotionFunc( void (* callback)( int, int, int ) )
+{
+ SET_CALLBACK( SpaceMotion );
+}
+
+/*
+ * Sets the spaceball rotate callback for the current window
+ */
+void FGAPIENTRY glutSpaceballRotateFunc( void (* callback)( int, int, int ) )
+{
+ SET_CALLBACK( SpaceRotation );
+}
+
+/*
+ * Sets the spaceball button callback for the current window
+ */
+void FGAPIENTRY glutSpaceballButtonFunc( void (* callback)( int, int ) )
+{
+ SET_CALLBACK( SpaceButton );
+}
+
+/*
+ * Sets the button box callback for the current window
+ */
+void FGAPIENTRY glutButtonBoxFunc( void (* callback)( int, int ) )
+{
+ SET_CALLBACK( ButtonBox );
+}
+
+/*
+ * Sets the dials box callback for the current window
+ */
+void FGAPIENTRY glutDialsFunc( void (* callback)( int, int ) )
+{
+ SET_CALLBACK( Dials );
+}
+
+/*
+ * Sets the tablet motion callback for the current window
+ */
+void FGAPIENTRY glutTabletMotionFunc( void (* callback)( int, int ) )
+{
+ SET_CALLBACK( TabletMotion );
+}
+
+/*
+ * Sets the tablet buttons callback for the current window
+ */
+void FGAPIENTRY glutTabletButtonFunc( void (* callback)( int, int, int, int ) )
+{
+ SET_CALLBACK( TabletButton );
+}
+
+/*** 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "freeglut-cursor"
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/freeglut_internal.h"
+
+#if TARGET_HOST_UNIX_X11
+ #include <X11/cursorfont.h>
+#endif
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ *
+ * fgDisplayCursor() -- this waits for better times
+ * glutSetCursor() -- both X and Win32 mappings are incomplete
+ * glutWarpPointer() -- check the Win32 version
+ *
+ * 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.
+ */
+
+/* -- INTERNAL FUNCTIONS --------------------------------------------------- */
+
+/*
+ * Display the mouse cursor using OpenGL calls
+ */
+void fgDisplayCursor( void )
+{
+ /*
+ * Do nothing for the moment
+ */
+}
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Set the cursor image to be used for the current window
+ */
+void FGAPIENTRY glutSetCursor( int cursorID )
+{
+ /*
+ * Make sure freeglut is ready and there is a current window set
+ */
+ freeglut_assert_ready; freeglut_assert_window;
+
+#if TARGET_HOST_UNIX_X11
+ {
+ Cursor cursor;
+
+ /*
+ * For now we'll limit ourselves to the X cursor fonts...
+ */
+# define MAP_CURSOR(a,b) case a: cursor = XCreateFontCursor( fgDisplay.Display, b ); break;
+
+ switch( cursorID )
+ {
+ MAP_CURSOR( GLUT_CURSOR_RIGHT_ARROW, XC_left_ptr );
+ MAP_CURSOR( GLUT_CURSOR_LEFT_ARROW, XC_right_ptr );
+ MAP_CURSOR( GLUT_CURSOR_INFO, XC_question_arrow );
+ MAP_CURSOR( GLUT_CURSOR_DESTROY, XC_target );
+ MAP_CURSOR( GLUT_CURSOR_HELP, XC_question_arrow );
+ MAP_CURSOR( GLUT_CURSOR_CYCLE, XC_circle );
+ MAP_CURSOR( GLUT_CURSOR_SPRAY, XC_spraycan );
+ MAP_CURSOR( GLUT_CURSOR_WAIT, XC_watch );
+ MAP_CURSOR( GLUT_CURSOR_TEXT, XC_draft_large );
+ MAP_CURSOR( GLUT_CURSOR_CROSSHAIR, XC_crosshair );
+ MAP_CURSOR( GLUT_CURSOR_NONE, XC_trek );
+
+ default:
+ MAP_CURSOR( GLUT_CURSOR_UP_DOWN, XC_arrow );
+ }
+
+ /*
+ * Define a window's cursor now
+ */
+ XDefineCursor( fgDisplay.Display, fgStructure.Window->Window.Handle, cursor );
+ }
+
+#elif TARGET_HOST_WIN32
+ /*
+ * This is a temporary solution only...
+ */
+# define MAP_CURSOR(a,b) case a: SetCursor( LoadCursor( NULL, b ) ); break;
+
+ 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_UPARROW );
+ MAP_CURSOR( GLUT_CURSOR_CROSSHAIR, IDC_CROSS );
+ MAP_CURSOR( GLUT_CURSOR_NONE, IDC_NO );
+
+ default:
+ MAP_CURSOR( GLUT_CURSOR_UP_DOWN, IDC_UPARROW );
+ }
+
+#endif
+
+ /*
+ * Remember the currently selected cursor
+ */
+ fgStructure.Window->State.Cursor = cursorID;
+}
+
+/*
+ * Moves the mouse pointer to given window coordinates
+ */
+void FGAPIENTRY glutWarpPointer( int x, int y )
+{
+ freeglut_assert_ready; freeglut_assert_window;
+
+#if TARGET_HOST_UNIX_X11
+ /*
+ * Move the mouse pointer to given window coordinates
+ */
+ XWarpPointer(
+ fgDisplay.Display,
+ None,
+ fgStructure.Window->Window.Handle,
+ 0, 0, 0, 0,
+ x, y
+ );
+
+ XFlush( fgDisplay.Display );
+
+#elif TARGET_HOST_WIN32
+ {
+ POINT coords = { x, y };
+
+ /*
+ * First of all, we need to find the new screen-relative coordinates of the mouse cursor
+ */
+ ClientToScreen( fgStructure.Window->Window.Handle, &coords );
+
+ /*
+ * Now set the new mouse cursor position...
+ */
+ SetCursorPos( coords.x, coords.y );
+ }
+
+#endif
+}
+
+/*** 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
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "freeglut-display"
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/freeglut_internal.h"
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Marks the current window to have the redisplay performed when possible...
+ */
+void FGAPIENTRY glutPostRedisplay( void )
+{
+ /*
+ * Is there a current window set?
+ */
+ freeglut_assert_ready; freeglut_assert_window;
+
+ /*
+ * Just mark the window as one that we need to redisplay...
+ */
+ fgStructure.Window->State.Redisplay = TRUE;
+}
+
+/*
+ * Swaps the buffers for the current window (if any)
+ */
+void FGAPIENTRY glutSwapBuffers( void )
+{
+ /*
+ * As long as we've got a current window set...
+ */
+ freeglut_assert_ready; freeglut_assert_window;
+
+ /*
+ * Have the mouse cursor and/or the menus drawn for the current window
+ */
+ fgDisplayMenu();
+ fgDisplayCursor();
+
+ /*
+ * Make sure the current context is flushed
+ */
+ glFlush();
+
+#if TARGET_HOST_UNIX_X11
+ /*
+ * Issue the glXSwapBuffers call and be done with it
+ */
+ glXSwapBuffers( fgDisplay.Display, fgStructure.Window->Window.Handle );
+
+#elif TARGET_HOST_WIN32
+ /*
+ * Swap the window's buffers
+ */
+ SwapBuffers( fgStructure.Window->Window.Device );
+
+#endif
+}
+
+/*
+ * Mark appropriate window to be displayed
+ */
+void FGAPIENTRY glutPostWindowRedisplay( int windowID )
+{
+ SFG_Window* window;
+
+ freeglut_assert_ready;
+
+ /*
+ * Try looking for the window
+ */
+ window = fgWindowByID( windowID );
+
+ /*
+ * If failed, return
+ */
+ freeglut_return_if_fail( window != NULL );
+
+ /*
+ * Otherwise mark the window for being redisplayed
+ */
+ window->State.Redisplay = TRUE;
+}
+
+/*** END OF FILE ***/
--- /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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "freeglut-font"
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/freeglut_internal.h"
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ *
+ * glutStrokeCharacter() -- stroke fonts not implemented, uses a bitmap font instead
+ * glutStrokeWidth() -- stroke fonts not implemented, uses a bitmap font instead
+ */
+
+/* -- 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;
+
+/*
+ * This is for GLUT binary compatibility, as suggested by Steve Baker
+ */
+#if TARGET_HOST_UNIX_X11
+ void* glutStrokeRoman;
+ void* glutStrokeMonoRoman;
+ void* glutBitmap9By15;
+ void* glutBitmap8By13;
+ void* glutBitmapTimesRoman10;
+ void* glutBitmapTimesRoman24;
+ void* glutBitmapHelvetica10;
+ void* glutBitmapHelvetica12;
+ void* glutBitmapHelvetica18;
+#endif
+
+
+/* -- 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 )
+{
+ /*
+ * Try matching the font ID and the font data structure
+ */
+ 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 );
+
+ /*
+ * This probably is the library user's fault
+ */
+ g_error( "font 0x%08x not found", font );
+}
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Draw a bitmap character
+ */
+void FGAPIENTRY glutBitmapCharacter( void* fontID, int character )
+{
+ const guchar* face;
+
+ /*
+ * First of all we'll need a font to use
+ */
+ SFG_Font* font = fghFontByID( fontID );
+
+ /*
+ * Make sure the character we want to output is valid
+ */
+ freeglut_return_if_fail( character > 0 && character < 256 );
+
+ /*
+ * Then find the character we want to draw
+ */
+ face = font->Characters[ character - 1 ];
+
+ /*
+ * Save the old pixel store settings
+ */
+ glPushClientAttrib( GL_CLIENT_PIXEL_STORE_BIT );
+
+ /*
+ * Set up the pixel unpacking ways
+ */
+ 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 );
+
+ /*
+ * We'll use a glBitmap call to draw the font.
+ */
+ glBitmap(
+ face[ 0 ], font->Height, /* The bitmap's width and height */
+ 0, 0, /* The origin -- what the hell? */
+ face[ 0 ] + 1, 0, /* The raster advance -- inc. x */
+ (face + 1) /* The packed bitmap data... */
+ );
+
+ /*
+ * Restore the old pixel store settings
+ */
+ glPopClientAttrib();
+}
+
+/*
+ * Returns the width in pixels of a font's character
+ */
+int FGAPIENTRY glutBitmapWidth( void* fontID, int character )
+{
+ /*
+ * First of all, grab the font we need
+ */
+ SFG_Font* font = fghFontByID( fontID );
+
+ /*
+ * Make sure the character we want to output is valid
+ */
+ freeglut_return_val_if_fail( character > 0 && character < 256, 0 );
+
+ /*
+ * Scan the font looking for the specified character
+ */
+ return( *(font->Characters[ character - 1 ]) + 1 );
+}
+
+/*
+ * Draw a stroke character
+ */
+void FGAPIENTRY glutStrokeCharacter( void* fontID, int character )
+{
+ /*
+ * Stroke fonts are not supported yet, use a bitmap font instead
+ */
+ glutBitmapCharacter( GLUT_BITMAP_8_BY_13, character );
+}
+
+/*
+ * Return the width in pixels of a stroke character
+ */
+int FGAPIENTRY glutStrokeWidth( void* fontID, int character )
+{
+ /*
+ * Stroke fonts are not supported yet, use a bitmap font instead
+ */
+ return( glutBitmapWidth( GLUT_BITMAP_8_BY_13, character ) );
+}
+
+/*
+ * Return the width of a string drawn using a bitmap font
+ */
+int FGAPIENTRY glutBitmapLength( void* fontID, const char* string )
+{
+ gint i, length = 0;
+
+ /*
+ * Using glutBitmapWidth() function to calculate the result
+ */
+ for( i=0; i<(gint) strlen( string ); i++ )
+ length += glutBitmapWidth( fontID, string[ i ] );
+
+ /*
+ * Return the result now
+ */
+ return( length );
+}
+
+/*
+ * Return the width of a string drawn using a stroke font
+ */
+int FGAPIENTRY glutStrokeLength( void* fontID, const char* string )
+{
+ gint i, length = 0;
+
+ /*
+ * Using glutStrokeWidth() function to calculate the result
+ */
+ for( i=0; i<(gint) strlen( string ); i++ )
+ length += glutStrokeWidth( fontID, string[ i ] );
+
+ /*
+ * Return the result now
+ */
+ return( length );
+}
+
+/*
+ * Returns the height of a bitmap font
+ */
+int FGAPIENTRY glutBitmapHeight( void* fontID )
+{
+ /*
+ * See which font are we queried about
+ */
+ SFG_Font* font = fghFontByID( fontID );
+
+ /*
+ * Return the character set's height
+ */
+ return( font->Height );
+}
+
+/*
+ * Returns the height of a stroke font
+ */
+int FGAPIENTRY glutStrokeHeight( void* font )
+{
+ /*
+ * Stroke fonts are currently not implemented.
+ * Using GLUT_BITMAP_8_BY_13 bitmap font instead
+ */
+ return( glutBitmapHeight( GLUT_BITMAP_8_BY_13 ) );
+}
+
+/*** END OF FILE ***/
--- /dev/null
+/*
+ * freeglut_font_data.c
+ *
+ * This file has been automatically generated by the genfonts utility.
+ *
+ * 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/freeglut_internal.h"
+
+/*
+ * Following 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 guchar Fixed8x13_Character_032[] = { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_097[] = { 6, 0, 0,116,140,132,124, 4,120, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_098[] = { 6, 0, 0,184,196,132,132,196,184,128,128,128, 0, 0};
+static const guchar Fixed8x13_Character_099[] = { 6, 0, 0,120,132,128,128,132,120, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_100[] = { 6, 0, 0,116,140,132,132,140,116, 4, 4, 4, 0, 0};
+static const guchar Fixed8x13_Character_101[] = { 6, 0, 0,120,132,128,252,132,120, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_102[] = { 6, 0, 0, 64, 64, 64, 64,248, 64, 64, 68, 56, 0, 0};
+static const guchar Fixed8x13_Character_103[] = { 6,120,132,120,128,112,136,136,116, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_104[] = { 6, 0, 0,132,132,132,132,196,184,128,128,128, 0, 0};
+static const guchar Fixed8x13_Character_105[] = { 5, 0, 0,248, 32, 32, 32, 32, 96, 0, 32, 0, 0, 0};
+static const guchar Fixed8x13_Character_106[] = { 5,112,136,136, 8, 8, 8, 8, 24, 0, 8, 0, 0, 0};
+static const guchar Fixed8x13_Character_107[] = { 6, 0, 0,132,136,144,224,144,136,128,128,128, 0, 0};
+static const guchar Fixed8x13_Character_108[] = { 5, 0, 0,248, 32, 32, 32, 32, 32, 32, 32, 96, 0, 0};
+static const guchar Fixed8x13_Character_109[] = { 7, 0, 0,130,146,146,146,146,236, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_110[] = { 6, 0, 0,132,132,132,132,196,184, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_111[] = { 6, 0, 0,120,132,132,132,132,120, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_112[] = { 6,128,128,128,184,196,132,196,184, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_113[] = { 6, 4, 4, 4,116,140,132,140,116, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_114[] = { 6, 0, 0, 64, 64, 64, 64, 68,184, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_115[] = { 6, 0, 0,120,132, 24, 96,132,120, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_116[] = { 6, 0, 0, 56, 68, 64, 64, 64,248, 64, 64, 0, 0, 0};
+static const guchar Fixed8x13_Character_117[] = { 6, 0, 0,116,136,136,136,136,136, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_119[] = { 7, 0, 0, 68,170,146,146,130,130, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_118[] = { 5, 0, 0, 32, 80, 80,136,136,136, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_120[] = { 6, 0, 0,132, 72, 48, 48, 72,132, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_121[] = { 6,120,132, 4,116,140,132,132,132, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_122[] = { 6, 0, 0,252, 64, 32, 16, 8,252, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_065[] = { 6, 0, 0,132,132,132,252,132,132,132, 72, 48, 0, 0};
+static const guchar Fixed8x13_Character_066[] = { 7, 0, 0,252, 66, 66, 66,124, 66, 66, 66,252, 0, 0};
+static const guchar Fixed8x13_Character_067[] = { 6, 0, 0,120,132,128,128,128,128,128,132,120, 0, 0};
+static const guchar Fixed8x13_Character_068[] = { 7, 0, 0,252, 66, 66, 66, 66, 66, 66, 66,252, 0, 0};
+static const guchar Fixed8x13_Character_069[] = { 6, 0, 0,252,128,128,128,240,128,128,128,252, 0, 0};
+static const guchar Fixed8x13_Character_070[] = { 6, 0, 0,128,128,128,128,240,128,128,128,252, 0, 0};
+static const guchar Fixed8x13_Character_071[] = { 6, 0, 0,116,140,132,156,128,128,128,132,120, 0, 0};
+static const guchar Fixed8x13_Character_072[] = { 6, 0, 0,132,132,132,132,252,132,132,132,132, 0, 0};
+static const guchar Fixed8x13_Character_073[] = { 5, 0, 0,248, 32, 32, 32, 32, 32, 32, 32,248, 0, 0};
+static const guchar Fixed8x13_Character_074[] = { 6, 0, 0,112,136, 8, 8, 8, 8, 8, 8, 60, 0, 0};
+static const guchar Fixed8x13_Character_075[] = { 6, 0, 0,132,136,144,160,192,160,144,136,132, 0, 0};
+static const guchar Fixed8x13_Character_076[] = { 6, 0, 0,252,128,128,128,128,128,128,128,128, 0, 0};
+static const guchar Fixed8x13_Character_077[] = { 7, 0, 0,130,130,130,146,146,170,198,130,130, 0, 0};
+static const guchar Fixed8x13_Character_078[] = { 6, 0, 0,132,132,132,140,148,164,196,132,132, 0, 0};
+static const guchar Fixed8x13_Character_079[] = { 6, 0, 0,120,132,132,132,132,132,132,132,120, 0, 0};
+static const guchar Fixed8x13_Character_080[] = { 6, 0, 0,128,128,128,128,248,132,132,132,248, 0, 0};
+static const guchar Fixed8x13_Character_081[] = { 6, 0, 4,120,148,164,132,132,132,132,132,120, 0, 0};
+static const guchar Fixed8x13_Character_082[] = { 6, 0, 0,132,136,144,160,248,132,132,132,248, 0, 0};
+static const guchar Fixed8x13_Character_083[] = { 6, 0, 0,120,132, 4, 4,120,128,128,132,120, 0, 0};
+static const guchar Fixed8x13_Character_084[] = { 7, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16,254, 0, 0};
+static const guchar Fixed8x13_Character_085[] = { 6, 0, 0,120,132,132,132,132,132,132,132,132, 0, 0};
+static const guchar Fixed8x13_Character_087[] = { 7, 0, 0, 68,170,146,146,146,130,130,130,130, 0, 0};
+static const guchar Fixed8x13_Character_086[] = { 7, 0, 0, 16, 40, 40, 40, 68, 68, 68,130,130, 0, 0};
+static const guchar Fixed8x13_Character_088[] = { 7, 0, 0,130,130, 68, 40, 16, 40, 68,130,130, 0, 0};
+static const guchar Fixed8x13_Character_089[] = { 7, 0, 0, 16, 16, 16, 16, 16, 40, 68,130,130, 0, 0};
+static const guchar Fixed8x13_Character_090[] = { 6, 0, 0,252,128,128, 64, 32, 16, 8, 4,252, 0, 0};
+static const guchar Fixed8x13_Character_048[] = { 6, 0, 0, 48, 72,132,132,132,132,132, 72, 48, 0, 0};
+static const guchar Fixed8x13_Character_049[] = { 5, 0, 0,248, 32, 32, 32, 32, 32,160, 96, 32, 0, 0};
+static const guchar Fixed8x13_Character_050[] = { 6, 0, 0,252,128, 64, 48, 8, 4,132,132,120, 0, 0};
+static const guchar Fixed8x13_Character_051[] = { 6, 0, 0,120,132, 4, 4, 56, 16, 8, 4,252, 0, 0};
+static const guchar Fixed8x13_Character_052[] = { 6, 0, 0, 8, 8,252,136,136, 72, 40, 24, 8, 0, 0};
+static const guchar Fixed8x13_Character_053[] = { 6, 0, 0,120,132, 4, 4,196,184,128,128,252, 0, 0};
+static const guchar Fixed8x13_Character_054[] = { 6, 0, 0,120,132,132,196,184,128,128, 64, 56, 0, 0};
+static const guchar Fixed8x13_Character_055[] = { 6, 0, 0, 64, 64, 32, 32, 16, 16, 8, 4,252, 0, 0};
+static const guchar Fixed8x13_Character_056[] = { 6, 0, 0,120,132,132,132,120,132,132,132,120, 0, 0};
+static const guchar Fixed8x13_Character_057[] = { 6, 0, 0,112, 8, 4, 4,116,140,132,132,120, 0, 0};
+static const guchar Fixed8x13_Character_096[] = { 4, 0, 0, 0, 0, 0, 0, 0, 0, 16, 96,224, 0, 0};
+static const guchar Fixed8x13_Character_126[] = { 5, 0, 0, 0, 0, 0, 0, 0, 0,144,168, 72, 0, 0};
+static const guchar Fixed8x13_Character_033[] = { 1, 0, 0,128, 0,128,128,128,128,128,128,128, 0, 0};
+static const guchar Fixed8x13_Character_064[] = { 6, 0, 0,120,128,148,172,164,156,132,132,120, 0, 0};
+static const guchar Fixed8x13_Character_035[] = { 6, 0, 0, 0, 72, 72,252, 72,252, 72, 72, 0, 0, 0};
+static const guchar Fixed8x13_Character_036[] = { 5, 0, 0, 0, 32,240, 40,112,160,120, 32, 0, 0, 0};
+static const guchar Fixed8x13_Character_037[] = { 6, 0, 0,136, 84, 72, 32, 16, 16, 72,164, 68, 0, 0};
+static const guchar Fixed8x13_Character_094[] = { 5, 0, 0, 0, 0, 0, 0, 0, 0,136, 80, 32, 0, 0};
+static const guchar Fixed8x13_Character_038[] = { 6, 0, 0,116,136,148, 96,144,144, 96, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_042[] = { 6, 0, 0, 0, 0, 72, 48,252, 48, 72, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_040[] = { 3, 0, 0, 32, 64, 64,128,128,128, 64, 64, 32, 0, 0};
+static const guchar Fixed8x13_Character_041[] = { 3, 0, 0,128, 64, 64, 32, 32, 32, 64, 64,128, 0, 0};
+static const guchar Fixed8x13_Character_045[] = { 6, 0, 0, 0, 0, 0, 0,252, 0, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_095[] = { 7, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_061[] = { 6, 0, 0, 0, 0,252, 0, 0,252, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_043[] = { 5, 0, 0, 0, 0, 32, 32,248, 32, 32, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_091[] = { 4, 0, 0,240,128,128,128,128,128,128,128,240, 0, 0};
+static const guchar Fixed8x13_Character_123[] = { 5, 0, 0, 56, 64, 64, 32,192, 32, 64, 64, 56, 0, 0};
+static const guchar Fixed8x13_Character_125[] = { 5, 0, 0,224, 16, 16, 32, 24, 32, 16, 16,224, 0, 0};
+static const guchar Fixed8x13_Character_093[] = { 4, 0, 0,240, 16, 16, 16, 16, 16, 16, 16,240, 0, 0};
+static const guchar Fixed8x13_Character_059[] = { 4, 0,128, 96,112, 0, 0, 32,112, 32, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_058[] = { 3, 0, 64,224, 64, 0, 0, 64,224, 64, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_044[] = { 4, 0,128, 96,112, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_046[] = { 3, 0, 64,224, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Fixed8x13_Character_060[] = { 5, 0, 0, 8, 16, 32, 64,128, 64, 32, 16, 8, 0, 0};
+static const guchar Fixed8x13_Character_062[] = { 5, 0, 0,128, 64, 32, 16, 8, 16, 32, 64,128, 0, 0};
+static const guchar Fixed8x13_Character_047[] = { 7, 0, 0,128,128, 64, 32, 16, 8, 4, 2, 2, 0, 0};
+static const guchar Fixed8x13_Character_063[] = { 6, 0, 0, 16, 0, 16, 16, 8, 4,132,132,120, 0, 0};
+static const guchar Fixed8x13_Character_092[] = { 7, 0, 0, 2, 2, 4, 8, 16, 32, 64,128,128, 0, 0};
+static const guchar Fixed8x13_Character_034[] = { 4, 0, 0, 0, 0, 0, 0, 0, 0,144,144,144, 0, 0};
+
+/* The font characters mapping: */
+static const guchar* Fixed8x13_Character_Map[] = {Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_032,Fixed8x13_Character_033,Fixed8x13_Character_034,Fixed8x13_Character_035,Fixed8x13_Character_036,Fixed8x13_Character_037,Fixed8x13_Character_038,Fixed8x13_Character_042,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_042,Fixed8x13_Character_125,Fixed8x13_Character_126,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,Fixed8x13_Character_042,NULL};
+
+/* The font structure: */
+const SFG_Font fgFontFixed8x13 = { "-misc-fixed-medium-r-normal--13-120-75-75-C-80-iso8859-1", 93, 13, Fixed8x13_Character_Map };
+
+static const guchar Fixed9x15_Character_032[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_097[] = { 7, 0, 0, 0,122,134,130,126, 2, 2,124, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_098[] = { 7, 0, 0, 0,188,194,130,130,130,194,188,128,128,128, 0, 0};
+static const guchar Fixed9x15_Character_099[] = { 7, 0, 0, 0,124,130,128,128,128,130,124, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_100[] = { 7, 0, 0, 0,122,134,130,130,130,134,122, 2, 2, 2, 0, 0};
+static const guchar Fixed9x15_Character_101[] = { 7, 0, 0, 0,124,128,128,254,130,130,124, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_102[] = { 7, 0, 0, 0, 32, 32, 32, 32,248, 32, 32, 34, 34, 28, 0, 0};
+static const guchar Fixed9x15_Character_103[] = { 7,124,130,130,124,128,120,132,132,132,122, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_104[] = { 7, 0, 0, 0,130,130,130,130,130,194,188,128,128,128, 0, 0};
+static const guchar Fixed9x15_Character_105[] = { 5, 0, 0, 0,248, 32, 32, 32, 32, 32,224, 0, 0, 96, 0, 0};
+static const guchar Fixed9x15_Character_106[] = { 6,120,132,132,132, 4, 4, 4, 4, 4, 28, 0, 0, 12, 0, 0};
+static const guchar Fixed9x15_Character_107[] = { 7, 0, 0, 0,130,140,176,192,176,140,130,128,128,128, 0, 0};
+static const guchar Fixed9x15_Character_108[] = { 5, 0, 0, 0,248, 32, 32, 32, 32, 32, 32, 32, 32,224, 0, 0};
+static const guchar Fixed9x15_Character_109[] = { 7, 0, 0, 0,130,146,146,146,146,146,236, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_110[] = { 7, 0, 0, 0,130,130,130,130,130,194,188, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_111[] = { 7, 0, 0, 0,124,130,130,130,130,130,124, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_112[] = { 7,128,128,128,188,194,130,130,130,194,188, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_113[] = { 7, 2, 2, 2,122,134,130,130,130,134,122, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_114[] = { 7, 0, 0, 0, 64, 64, 64, 64, 66, 98,156, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_115[] = { 7, 0, 0, 0,124,130, 2,124,128,130,124, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_116[] = { 7, 0, 0, 0, 28, 34, 32, 32, 32, 32,252, 32, 32, 0, 0, 0};
+static const guchar Fixed9x15_Character_117[] = { 7, 0, 0, 0,122,132,132,132,132,132,132, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_119[] = { 7, 0, 0, 0, 68,170,146,146,146,130,130, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_118[] = { 7, 0, 0, 0, 16, 40, 40, 68, 68,130,130, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_120[] = { 7, 0, 0, 0,130, 68, 40, 16, 40, 68,130, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_121[] = { 6,120,132, 4,116,140,132,132,132,132,132, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_122[] = { 7, 0, 0, 0,254, 64, 32, 16, 8, 4,254, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_065[] = { 7, 0, 0, 0,130,130,130,254,130,130,130, 68, 40, 16, 0, 0};
+static const guchar Fixed9x15_Character_066[] = { 7, 0, 0, 0,252, 66, 66, 66, 66,124, 66, 66, 66,252, 0, 0};
+static const guchar Fixed9x15_Character_067[] = { 7, 0, 0, 0,124,130,128,128,128,128,128,128,130,124, 0, 0};
+static const guchar Fixed9x15_Character_068[] = { 7, 0, 0, 0,252, 66, 66, 66, 66, 66, 66, 66, 66,252, 0, 0};
+static const guchar Fixed9x15_Character_069[] = { 7, 0, 0, 0,254, 64, 64, 64, 64,120, 64, 64, 64,254, 0, 0};
+static const guchar Fixed9x15_Character_070[] = { 7, 0, 0, 0, 64, 64, 64, 64, 64,120, 64, 64, 64,254, 0, 0};
+static const guchar Fixed9x15_Character_071[] = { 7, 0, 0, 0,124,130,130,130,142,128,128,128,130,124, 0, 0};
+static const guchar Fixed9x15_Character_072[] = { 7, 0, 0, 0,130,130,130,130,130,254,130,130,130,130, 0, 0};
+static const guchar Fixed9x15_Character_073[] = { 5, 0, 0, 0,248, 32, 32, 32, 32, 32, 32, 32, 32,248, 0, 0};
+static const guchar Fixed9x15_Character_074[] = { 7, 0, 0, 0,120,132, 4, 4, 4, 4, 4, 4, 4, 30, 0, 0};
+static const guchar Fixed9x15_Character_075[] = { 7, 0, 0, 0,130,132,136,144,160,224,144,136,132,130, 0, 0};
+static const guchar Fixed9x15_Character_076[] = { 7, 0, 0, 0,254,128,128,128,128,128,128,128,128,128, 0, 0};
+static const guchar Fixed9x15_Character_077[] = { 7, 0, 0, 0,130,130,130,146,146,170,170,198,130,130, 0, 0};
+static const guchar Fixed9x15_Character_078[] = { 7, 0, 0, 0,130,130,130,134,138,146,162,194,130,130, 0, 0};
+static const guchar Fixed9x15_Character_079[] = { 7, 0, 0, 0,124,130,130,130,130,130,130,130,130,124, 0, 0};
+static const guchar Fixed9x15_Character_080[] = { 7, 0, 0, 0,128,128,128,128,128,252,130,130,130,252, 0, 0};
+static const guchar Fixed9x15_Character_081[] = { 7, 0, 6, 8,124,146,162,130,130,130,130,130,130,124, 0, 0};
+static const guchar Fixed9x15_Character_082[] = { 7, 0, 0, 0,130,130,132,136,144,252,130,130,130,252, 0, 0};
+static const guchar Fixed9x15_Character_083[] = { 7, 0, 0, 0,124,130,130, 2, 12,112,128,130,130,124, 0, 0};
+static const guchar Fixed9x15_Character_084[] = { 7, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16, 16,254, 0, 0};
+static const guchar Fixed9x15_Character_085[] = { 7, 0, 0, 0,124,130,130,130,130,130,130,130,130,130, 0, 0};
+static const guchar Fixed9x15_Character_087[] = { 7, 0, 0, 0, 68,170,146,146,146,146,130,130,130,130, 0, 0};
+static const guchar Fixed9x15_Character_086[] = { 7, 0, 0, 0, 16, 40, 40, 40, 68, 68, 68,130,130,130, 0, 0};
+static const guchar Fixed9x15_Character_088[] = { 7, 0, 0, 0,130,130, 68, 40, 16, 16, 40, 68,130,130, 0, 0};
+static const guchar Fixed9x15_Character_089[] = { 7, 0, 0, 0, 16, 16, 16, 16, 16, 16, 40, 68,130,130, 0, 0};
+static const guchar Fixed9x15_Character_090[] = { 7, 0, 0, 0,254,128,128, 64, 32, 16, 8, 4, 2,254, 0, 0};
+static const guchar Fixed9x15_Character_048[] = { 7, 0, 0, 0, 56, 68,130,130,130,130,130,130, 68, 56, 0, 0};
+static const guchar Fixed9x15_Character_049[] = { 7, 0, 0, 0,254, 16, 16, 16, 16, 16,144, 80, 48, 16, 0, 0};
+static const guchar Fixed9x15_Character_050[] = { 7, 0, 0, 0,254,128, 64, 48, 8, 4, 2,130,130,124, 0, 0};
+static const guchar Fixed9x15_Character_051[] = { 7, 0, 0, 0,124,130, 2, 2, 2, 28, 8, 4, 2,254, 0, 0};
+static const guchar Fixed9x15_Character_052[] = { 7, 0, 0, 0, 4, 4, 4,254,132, 68, 36, 20, 12, 4, 0, 0};
+static const guchar Fixed9x15_Character_053[] = { 7, 0, 0, 0,124,130, 2, 2, 2,194,188,128,128,254, 0, 0};
+static const guchar Fixed9x15_Character_054[] = { 7, 0, 0, 0,124,130,130,130,194,188,128,128, 64, 60, 0, 0};
+static const guchar Fixed9x15_Character_055[] = { 7, 0, 0, 0, 64, 64, 32, 32, 16, 8, 4, 2, 2,254, 0, 0};
+static const guchar Fixed9x15_Character_056[] = { 7, 0, 0, 0, 56, 68,130,130, 68, 56, 68,130, 68, 56, 0, 0};
+static const guchar Fixed9x15_Character_057[] = { 7, 0, 0, 0,120, 4, 2, 2,122,134,130,130,130,124, 0, 0};
+static const guchar Fixed9x15_Character_096[] = { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 32, 64,192, 0, 0};
+static const guchar Fixed9x15_Character_126[] = { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,146, 98, 0, 0};
+static const guchar Fixed9x15_Character_033[] = { 1, 0, 0, 0,128,128, 0, 0,128,128,128,128,128,128,128, 0};
+static const guchar Fixed9x15_Character_064[] = { 7, 0, 0, 0,124,128,128,154,166,162,158,130,130,124, 0, 0};
+static const guchar Fixed9x15_Character_035[] = { 6, 0, 0, 0, 0, 72, 72,252, 72, 72,252, 72, 72, 0, 0, 0};
+static const guchar Fixed9x15_Character_036[] = { 7, 0, 0, 16,124,146, 18, 18, 20, 56, 80,144,146,124, 16, 0};
+static const guchar Fixed9x15_Character_037[] = { 7, 0, 0, 0,132, 74, 74, 36, 16, 16, 72,164,164, 66, 0, 0};
+static const guchar Fixed9x15_Character_094[] = { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0,130, 68, 40, 16, 0, 0};
+static const guchar Fixed9x15_Character_038[] = { 7, 0, 0, 0, 98,148,136,148, 98, 96,144,144,144, 96, 0, 0};
+static const guchar Fixed9x15_Character_042[] = { 7, 0, 0, 0, 0, 16,146, 84, 56, 84,146, 16, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_040[] = { 3, 0, 0, 32, 64, 64,128,128,128,128,128,128, 64, 64, 32, 0};
+static const guchar Fixed9x15_Character_041[] = { 3, 0, 0,128, 64, 64, 32, 32, 32, 32, 32, 32, 64, 64,128, 0};
+static const guchar Fixed9x15_Character_045[] = { 7, 0, 0, 0, 0, 0, 0, 0,254, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_095[] = { 8, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_061[] = { 7, 0, 0, 0, 0, 0,254, 0, 0,254, 0, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_043[] = { 7, 0, 0, 0, 0, 16, 16, 16,254, 16, 16, 16, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_091[] = { 4, 0, 0,240,128,128,128,128,128,128,128,128,128,128,240, 0};
+static const guchar Fixed9x15_Character_123[] = { 5, 0, 0, 56, 64, 64, 64, 32,192,192, 32, 64, 64, 64, 56, 0};
+static const guchar Fixed9x15_Character_125[] = { 5, 0, 0,224, 16, 16, 16, 32, 24, 24, 32, 16, 16, 16,224, 0};
+static const guchar Fixed9x15_Character_093[] = { 4, 0, 0,240, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,240, 0};
+static const guchar Fixed9x15_Character_059[] = { 2,128, 64, 64,192,192, 0, 0, 0,192,192, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_058[] = { 2, 0, 0, 0,192,192, 0, 0, 0,192,192, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_044[] = { 2,128, 64, 64,192,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_046[] = { 2, 0, 0, 0,192,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Fixed9x15_Character_060[] = { 5, 0, 0, 0, 8, 16, 32, 64,128,128, 64, 32, 16, 8, 0, 0};
+static const guchar Fixed9x15_Character_062[] = { 5, 0, 0, 0,128, 64, 32, 16, 8, 8, 16, 32, 64,128, 0, 0};
+static const guchar Fixed9x15_Character_047[] = { 7, 0, 0, 0,128, 64, 64, 32, 16, 16, 8, 4, 4, 2, 0, 0};
+static const guchar Fixed9x15_Character_063[] = { 7, 0, 0, 0, 16, 0, 16, 16, 8, 4, 2,130,130,124, 0, 0};
+static const guchar Fixed9x15_Character_092[] = { 7, 0, 0, 0, 2, 4, 4, 8, 16, 16, 32, 64, 64,128, 0, 0};
+static const guchar Fixed9x15_Character_034[] = { 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,144,144, 0, 0};
+
+/* The font characters mapping: */
+static const guchar* Fixed9x15_Character_Map[] = {Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_032,Fixed9x15_Character_033,Fixed9x15_Character_034,Fixed9x15_Character_035,Fixed9x15_Character_036,Fixed9x15_Character_037,Fixed9x15_Character_038,Fixed9x15_Character_042,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_042,Fixed9x15_Character_125,Fixed9x15_Character_126,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,Fixed9x15_Character_042,NULL};
+
+/* The font structure: */
+const SFG_Font fgFontFixed9x15 = { "-misc-fixed-medium-r-normal--15-140-75-75-C-90-iso8859-1", 93, 15, Fixed9x15_Character_Map };
+
+static const guchar Helvetica10_Character_032[] = { 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};
+static const guchar Helvetica10_Character_097[] = { 5, 0, 0,104,144,144,112, 16,224, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_098[] = { 5, 0, 0,176,200,136,136,200,176,128,128, 0, 0, 0};
+static const guchar Helvetica10_Character_099[] = { 4, 0, 0, 96,144,128,128,144, 96, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_100[] = { 5, 0, 0,104,152,136,136,152,104, 8, 8, 0, 0, 0};
+static const guchar Helvetica10_Character_101[] = { 4, 0, 0, 96,144,128,240,144, 96, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_102[] = { 4, 0, 0, 64, 64, 64, 64, 64,224, 64, 48, 0, 0, 0};
+static const guchar Helvetica10_Character_103[] = { 5,112, 8,104,152,136,136,152,104, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_104[] = { 5, 0, 0,136,136,136,136,200,176,128,128, 0, 0, 0};
+static const guchar Helvetica10_Character_105[] = { 1, 0, 0,128,128,128,128,128,128, 0,128, 0, 0, 0};
+static const guchar Helvetica10_Character_106[] = { 1, 0,128,128,128,128,128,128,128, 0,128, 0, 0, 0};
+static const guchar Helvetica10_Character_107[] = { 4, 0, 0,144,144,160,192,160,144,128,128, 0, 0, 0};
+static const guchar Helvetica10_Character_108[] = { 1, 0, 0,128,128,128,128,128,128,128,128, 0, 0, 0};
+static const guchar Helvetica10_Character_109[] = { 7, 0, 0,146,146,146,146,146,236, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_110[] = { 5, 0, 0,136,136,136,136,200,176, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_111[] = { 5, 0, 0,112,136,136,136,136,112, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_112[] = { 5,128,128,176,200,136,136,200,176, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_113[] = { 5, 8, 8,104,152,136,136,152,104, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_114[] = { 3, 0, 0,128,128,128,128,192,160, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_115[] = { 4, 0, 0, 96,144, 16, 96,144, 96, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_116[] = { 3, 0, 0, 96, 64, 64, 64, 64,224, 64, 64, 0, 0, 0};
+static const guchar Helvetica10_Character_117[] = { 4, 0, 0,112,144,144,144,144,144, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_119[] = { 7, 0, 0, 40, 40, 84, 84,146,146, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_118[] = { 5, 0, 0, 32, 32, 80, 80,136,136, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_120[] = { 5, 0, 0,136,136, 80, 32, 80,136, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_121[] = { 4,128, 64, 64, 96,160,160,144,144, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_122[] = { 4, 0, 0,240,128, 64, 32, 16,240, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_065[] = { 7, 0, 0,130,130,124, 68, 40, 40, 16, 16, 0, 0, 0};
+static const guchar Helvetica10_Character_066[] = { 5, 0, 0,240,136,136,136,240,136,136,240, 0, 0, 0};
+static const guchar Helvetica10_Character_067[] = { 6, 0, 0,120,132,128,128,128,128,132,120, 0, 0, 0};
+static const guchar Helvetica10_Character_068[] = { 6, 0, 0,240,136,132,132,132,132,136,240, 0, 0, 0};
+static const guchar Helvetica10_Character_069[] = { 5, 0, 0,248,128,128,128,248,128,128,248, 0, 0, 0};
+static const guchar Helvetica10_Character_070[] = { 5, 0, 0,128,128,128,128,240,128,128,248, 0, 0, 0};
+static const guchar Helvetica10_Character_071[] = { 6, 0, 0,116,140,132,140,128,128,132,120, 0, 0, 0};
+static const guchar Helvetica10_Character_072[] = { 6, 0, 0,132,132,132,132,252,132,132,132, 0, 0, 0};
+static const guchar Helvetica10_Character_073[] = { 1, 0, 0,128,128,128,128,128,128,128,128, 0, 0, 0};
+static const guchar Helvetica10_Character_074[] = { 4, 0, 0, 96,144, 16, 16, 16, 16, 16, 16, 0, 0, 0};
+static const guchar Helvetica10_Character_075[] = { 5, 0, 0,136,136,144,144,224,160,144,136, 0, 0, 0};
+static const guchar Helvetica10_Character_076[] = { 4, 0, 0,240,128,128,128,128,128,128,128, 0, 0, 0};
+static const guchar Helvetica10_Character_077[] = { 7, 0, 0,146,146,146,170,170,198,198,130, 0, 0, 0};
+static const guchar Helvetica10_Character_078[] = { 6, 0, 0,140,140,148,148,164,164,196,196, 0, 0, 0};
+static const guchar Helvetica10_Character_079[] = { 6, 0, 0,120,132,132,132,132,132,132,120, 0, 0, 0};
+static const guchar Helvetica10_Character_080[] = { 5, 0, 0,128,128,128,128,240,136,136,240, 0, 0, 0};
+static const guchar Helvetica10_Character_081[] = { 7, 0, 2,124,140,148,132,132,132,132,120, 0, 0, 0};
+static const guchar Helvetica10_Character_082[] = { 5, 0, 0,136,136,136,136,240,136,136,240, 0, 0, 0};
+static const guchar Helvetica10_Character_083[] = { 5, 0, 0,112,136,136, 8,112,128,136,112, 0, 0, 0};
+static const guchar Helvetica10_Character_084[] = { 5, 0, 0, 32, 32, 32, 32, 32, 32, 32,248, 0, 0, 0};
+static const guchar Helvetica10_Character_085[] = { 6, 0, 0,120,132,132,132,132,132,132,132, 0, 0, 0};
+static const guchar Helvetica10_Character_087[] = { 9, 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 guchar Helvetica10_Character_086[] = { 7, 0, 0, 16, 40, 40, 68, 68, 68,130,130, 0, 0, 0};
+static const guchar Helvetica10_Character_088[] = { 5, 0, 0,136,136, 80, 80, 32, 80,136,136, 0, 0, 0};
+static const guchar Helvetica10_Character_089[] = { 7, 0, 0, 16, 16, 16, 40, 40, 68, 68,130, 0, 0, 0};
+static const guchar Helvetica10_Character_090[] = { 5, 0, 0,248,128, 64, 32, 32, 16, 8,248, 0, 0, 0};
+static const guchar Helvetica10_Character_048[] = { 5, 0, 0,112,136,136,136,136,136,136,112, 0, 0, 0};
+static const guchar Helvetica10_Character_049[] = { 2, 0, 0, 64, 64, 64, 64, 64, 64,192, 64, 0, 0, 0};
+static const guchar Helvetica10_Character_050[] = { 5, 0, 0,248,128, 64, 48, 8, 8,136,112, 0, 0, 0};
+static const guchar Helvetica10_Character_051[] = { 5, 0, 0,112,136, 8, 8, 48, 8,136,112, 0, 0, 0};
+static const guchar Helvetica10_Character_052[] = { 5, 0, 0, 16, 16,248,144, 80, 80, 48, 16, 0, 0, 0};
+static const guchar Helvetica10_Character_053[] = { 5, 0, 0,112,136, 8, 8,240,128,128,248, 0, 0, 0};
+static const guchar Helvetica10_Character_054[] = { 5, 0, 0,112,136,136,200,176,128,136,112, 0, 0, 0};
+static const guchar Helvetica10_Character_055[] = { 5, 0, 0, 64, 64, 32, 32, 16, 16, 8,248, 0, 0, 0};
+static const guchar Helvetica10_Character_056[] = { 5, 0, 0,112,136,136,136,112,136,136,112, 0, 0, 0};
+static const guchar Helvetica10_Character_057[] = { 5, 0, 0,112,136, 8,104,152,136,136,112, 0, 0, 0};
+static const guchar Helvetica10_Character_096[] = { 2, 0, 0, 0, 0, 0, 0, 0,128,128, 64, 0, 0, 0};
+static const guchar Helvetica10_Character_126[] = { 6, 0, 0, 0, 0, 0,152,100, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_033[] = { 1, 0, 0,128, 0,128,128,128,128,128,128, 0, 0, 0};
+static const guchar Helvetica10_Character_064[] = { 10, 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 guchar Helvetica10_Character_035[] = { 6, 0, 0, 80, 80,248, 40,124, 40, 40, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_036[] = { 5, 0, 32,112,168, 40,112,160,168,112, 32, 0, 0, 0};
+static const guchar Helvetica10_Character_037[] = { 8, 0, 0, 38, 41, 22, 16, 8,104,148,100, 0, 0, 0};
+static const guchar Helvetica10_Character_094[] = { 5, 0, 0, 0, 0, 0,136, 80, 80, 32, 32, 0, 0, 0};
+static const guchar Helvetica10_Character_038[] = { 6, 0, 0,100,152,152,164, 96, 80, 80, 32, 0, 0, 0};
+static const guchar Helvetica10_Character_042[] = { 3, 0, 0, 0, 0, 0, 0, 0,160, 64,160, 0, 0, 0};
+static const guchar Helvetica10_Character_040[] = { 3, 32, 64, 64,128,128,128,128, 64, 64, 32, 0, 0, 0};
+static const guchar Helvetica10_Character_041[] = { 3,128, 64, 64, 32, 32, 32, 32, 64, 64,128, 0, 0, 0};
+static const guchar Helvetica10_Character_045[] = { 5, 0, 0, 0, 0, 0,248, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_095[] = { 6,252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_061[] = { 4, 0, 0, 0, 0,240, 0,240, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_043[] = { 5, 0, 0, 0, 32, 32,248, 32, 32, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_091[] = { 2,192,128,128,128,128,128,128,128,128,192, 0, 0, 0};
+static const guchar Helvetica10_Character_123[] = { 3, 32, 64, 64, 64, 64,128, 64, 64, 64, 32, 0, 0, 0};
+static const guchar Helvetica10_Character_125[] = { 3,128, 64, 64, 64, 64, 32, 64, 64, 64,128, 0, 0, 0};
+static const guchar Helvetica10_Character_093[] = { 2,192, 64, 64, 64, 64, 64, 64, 64, 64,192, 0, 0, 0};
+static const guchar Helvetica10_Character_059[] = { 2,128, 64, 64, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_058[] = { 1, 0, 0,128, 0, 0, 0, 0,128, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_044[] = { 2,128, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_046[] = { 1, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_060[] = { 3, 0, 0, 0, 32, 64,128, 64, 32, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_062[] = { 3, 0, 0, 0,128, 64, 32, 64,128, 0, 0, 0, 0, 0};
+static const guchar Helvetica10_Character_047[] = { 3, 0, 0,128,128, 64, 64, 64, 64, 32, 32, 0, 0, 0};
+static const guchar Helvetica10_Character_063[] = { 4, 0, 0, 64, 0, 64, 64, 32, 16,144, 96, 0, 0, 0};
+static const guchar Helvetica10_Character_092[] = { 3, 0, 0, 32, 32, 64, 64, 64, 64,128,128, 0, 0, 0};
+static const guchar Helvetica10_Character_034[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0,160,160, 0, 0, 0};
+
+/* The font characters mapping: */
+static const guchar* Helvetica10_Character_Map[] = {Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_032,Helvetica10_Character_033,Helvetica10_Character_034,Helvetica10_Character_035,Helvetica10_Character_036,Helvetica10_Character_037,Helvetica10_Character_038,Helvetica10_Character_042,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_042,Helvetica10_Character_125,Helvetica10_Character_126,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,Helvetica10_Character_042,NULL};
+
+/* The font structure: */
+const SFG_Font fgFontHelvetica10 = { "-adobe-helvetica-medium-r-normal--10-100-75-75-p-56-iso8859-1", 93, 13, Helvetica10_Character_Map };
+
+static const guchar Helvetica12_Character_032[] = { 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};
+static const guchar Helvetica12_Character_097[] = { 6, 0, 0, 0,116,136,136,120, 8,136,112, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_098[] = { 5, 0, 0, 0,176,200,136,136,136,200,176,128,128, 0, 0, 0};
+static const guchar Helvetica12_Character_099[] = { 5, 0, 0, 0,112,136,128,128,128,136,112, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_100[] = { 5, 0, 0, 0,104,152,136,136,136,152,104, 8, 8, 0, 0, 0};
+static const guchar Helvetica12_Character_101[] = { 5, 0, 0, 0,112,136,128,248,136,136,112, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_102[] = { 4, 0, 0, 0, 64, 64, 64, 64, 64, 64,224, 64, 48, 0, 0, 0};
+static const guchar Helvetica12_Character_103[] = { 5,112,136, 8,104,152,136,136,136,152,104, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_104[] = { 5, 0, 0, 0,136,136,136,136,136,200,176,128,128, 0, 0, 0};
+static const guchar Helvetica12_Character_105[] = { 1, 0, 0, 0,128,128,128,128,128,128,128, 0,128, 0, 0, 0};
+static const guchar Helvetica12_Character_106[] = { 2,128, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64, 0, 0, 0};
+static const guchar Helvetica12_Character_107[] = { 5, 0, 0, 0,136,144,160,192,192,160,144,128,128, 0, 0, 0};
+static const guchar Helvetica12_Character_108[] = { 1, 0, 0, 0,128,128,128,128,128,128,128,128,128, 0, 0, 0};
+static const guchar Helvetica12_Character_109[] = { 7, 0, 0, 0,146,146,146,146,146,218,164, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_110[] = { 5, 0, 0, 0,136,136,136,136,136,200,176, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_111[] = { 5, 0, 0, 0,112,136,136,136,136,136,112, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_112[] = { 5,128,128,128,176,200,136,136,136,200,176, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_113[] = { 5, 8, 8, 8,104,152,136,136,136,152,104, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_114[] = { 3, 0, 0, 0,128,128,128,128,128,192,160, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_115[] = { 4, 0, 0, 0, 96,144, 16, 96,128,144, 96, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_116[] = { 3, 0, 0, 0, 96, 64, 64, 64, 64, 64,224, 64, 64, 0, 0, 0};
+static const guchar Helvetica12_Character_117[] = { 5, 0, 0, 0,104,152,136,136,136,136,136, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_119[] = { 9, 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 guchar Helvetica12_Character_118[] = { 5, 0, 0, 0, 32, 32, 80, 80,136,136,136, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_120[] = { 6, 0, 0, 0,132,132, 72, 48, 48, 72,132, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_121[] = { 5,128, 64, 32, 32, 80, 80,144,136,136,136, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_122[] = { 4, 0, 0, 0,240,128, 64, 64, 32, 16,240, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_065[] = { 7, 0, 0, 0,130,130,130,124, 68, 68, 40, 40, 16, 0, 0, 0};
+static const guchar Helvetica12_Character_066[] = { 6, 0, 0, 0,248,132,132,132,248,132,132,132,248, 0, 0, 0};
+static const guchar Helvetica12_Character_067[] = { 7, 0, 0, 0, 60, 66,128,128,128,128,128, 66, 60, 0, 0, 0};
+static const guchar Helvetica12_Character_068[] = { 7, 0, 0, 0,248,132,130,130,130,130,130,132,248, 0, 0, 0};
+static const guchar Helvetica12_Character_069[] = { 6, 0, 0, 0,252,128,128,128,252,128,128,128,252, 0, 0, 0};
+static const guchar Helvetica12_Character_070[] = { 6, 0, 0, 0,128,128,128,128,248,128,128,128,252, 0, 0, 0};
+static const guchar Helvetica12_Character_071[] = { 7, 0, 0, 0, 58, 70,130,130,142,128,128, 66, 60, 0, 0, 0};
+static const guchar Helvetica12_Character_072[] = { 7, 0, 0, 0,130,130,130,130,254,130,130,130,130, 0, 0, 0};
+static const guchar Helvetica12_Character_073[] = { 1, 0, 0, 0,128,128,128,128,128,128,128,128,128, 0, 0, 0};
+static const guchar Helvetica12_Character_074[] = { 5, 0, 0, 0,112,136,136, 8, 8, 8, 8, 8, 8, 0, 0, 0};
+static const guchar Helvetica12_Character_075[] = { 7, 0, 0, 0,130,132,136,144,224,160,144,136,132, 0, 0, 0};
+static const guchar Helvetica12_Character_076[] = { 5, 0, 0, 0,248,128,128,128,128,128,128,128,128, 0, 0, 0};
+static const guchar Helvetica12_Character_077[] = { 9, 0, 0, 0, 0, 0, 0,136,128,136,128,148,128,148,128,162,128,162,128,193,128,193,128,128,128, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_078[] = { 7, 0, 0, 0,130,134,138,138,146,162,162,194,130, 0, 0, 0};
+static const guchar Helvetica12_Character_079[] = { 8, 0, 0, 0, 60, 66,129,129,129,129,129, 66, 60, 0, 0, 0};
+static const guchar Helvetica12_Character_080[] = { 6, 0, 0, 0,128,128,128,128,248,132,132,132,248, 0, 0, 0};
+static const guchar Helvetica12_Character_081[] = { 8, 0, 0, 0, 61, 66,133,137,129,129,129, 66, 60, 0, 0, 0};
+static const guchar Helvetica12_Character_082[] = { 6, 0, 0, 0,132,132,132,136,248,132,132,132,248, 0, 0, 0};
+static const guchar Helvetica12_Character_083[] = { 6, 0, 0, 0,120,132,132, 4, 24, 96,128,132,120, 0, 0, 0};
+static const guchar Helvetica12_Character_084[] = { 7, 0, 0, 0, 16, 16, 16, 16, 16, 16, 16, 16,254, 0, 0, 0};
+static const guchar Helvetica12_Character_085[] = { 6, 0, 0, 0,120,132,132,132,132,132,132,132,132, 0, 0, 0};
+static const guchar Helvetica12_Character_087[] = { 9, 0, 0, 0, 0, 0, 0, 34, 0, 34, 0, 34, 0, 85, 0, 85, 0, 73, 0,136,128,136,128,136,128, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_086[] = { 7, 0, 0, 0, 16, 16, 40, 40, 68, 68, 68,130,130, 0, 0, 0};
+static const guchar Helvetica12_Character_088[] = { 7, 0, 0, 0,130, 68, 68, 40, 16, 40, 68, 68,130, 0, 0, 0};
+static const guchar Helvetica12_Character_089[] = { 7, 0, 0, 0, 16, 16, 16, 16, 40, 68, 68,130,130, 0, 0, 0};
+static const guchar Helvetica12_Character_090[] = { 7, 0, 0, 0,254,128, 64, 32, 16, 8, 4, 2,254, 0, 0, 0};
+static const guchar Helvetica12_Character_048[] = { 5, 0, 0, 0,112,136,136,136,136,136,136,136,112, 0, 0, 0};
+static const guchar Helvetica12_Character_049[] = { 3, 0, 0, 0, 32, 32, 32, 32, 32, 32, 32,224, 32, 0, 0, 0};
+static const guchar Helvetica12_Character_050[] = { 5, 0, 0, 0,248,128,128, 64, 32, 16, 8,136,112, 0, 0, 0};
+static const guchar Helvetica12_Character_051[] = { 5, 0, 0, 0,112,136,136, 8, 8, 48, 8,136,112, 0, 0, 0};
+static const guchar Helvetica12_Character_052[] = { 6, 0, 0, 0, 8, 8,252,136, 72, 40, 40, 24, 8, 0, 0, 0};
+static const guchar Helvetica12_Character_053[] = { 5, 0, 0, 0,112,136,136, 8, 8,240,128,128,248, 0, 0, 0};
+static const guchar Helvetica12_Character_054[] = { 5, 0, 0, 0,112,136,136,136,200,176,128,136,112, 0, 0, 0};
+static const guchar Helvetica12_Character_055[] = { 5, 0, 0, 0, 64, 64, 32, 32, 32, 16, 16, 8,248, 0, 0, 0};
+static const guchar Helvetica12_Character_056[] = { 5, 0, 0, 0,112,136,136,136,136,112,136,136,112, 0, 0, 0};
+static const guchar Helvetica12_Character_057[] = { 5, 0, 0, 0,112,136, 8, 8,120,136,136,136,112, 0, 0, 0};
+static const guchar Helvetica12_Character_096[] = { 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,128, 64, 0, 0, 0};
+static const guchar Helvetica12_Character_126[] = { 6, 0, 0, 0, 0, 0, 0,152,100, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_033[] = { 1, 0, 0, 0,128, 0,128,128,128,128,128,128,128, 0, 0, 0};
+static const guchar Helvetica12_Character_064[] = { 10, 0, 0, 0, 0, 62, 0, 64, 0,155, 0,166,128,162, 64,162, 64,146, 64, 77, 64, 96,128, 31, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_035[] = { 6, 0, 0, 0, 80, 80, 80,252, 40,252, 40, 40, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_036[] = { 5, 0, 0, 32,112,168,168, 40,112,160,168,112, 32, 0, 0, 0};
+static const guchar Helvetica12_Character_037[] = { 9, 0, 0, 0, 0, 0, 0, 35, 0, 20,128, 20,128, 19, 0, 8, 0,104, 0,148, 0,148, 0, 98, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_094[] = { 5, 0, 0, 0, 0, 0, 0, 0, 0,136, 80, 32, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_038[] = { 7, 0, 0, 0,114,140,132,138, 80, 48, 72, 72, 48, 0, 0, 0};
+static const guchar Helvetica12_Character_042[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 64,160, 0, 0, 0};
+static const guchar Helvetica12_Character_040[] = { 3, 32, 64, 64,128,128,128,128,128,128, 64, 64, 32, 0, 0, 0};
+static const guchar Helvetica12_Character_041[] = { 3,128, 64, 64, 32, 32, 32, 32, 32, 32, 64, 64,128, 0, 0, 0};
+static const guchar Helvetica12_Character_045[] = { 5, 0, 0, 0, 0, 0, 0,248, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_095[] = { 7, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_061[] = { 5, 0, 0, 0, 0, 0,248, 0,248, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_043[] = { 5, 0, 0, 0, 0, 32, 32,248, 32, 32, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_091[] = { 2,192,128,128,128,128,128,128,128,128,128,128,192, 0, 0, 0};
+static const guchar Helvetica12_Character_123[] = { 4, 48, 64, 64, 64, 64, 64,128, 64, 64, 64, 64, 48, 0, 0, 0};
+static const guchar Helvetica12_Character_125[] = { 4,192, 32, 32, 32, 32, 32, 16, 32, 32, 32, 32,192, 0, 0, 0};
+static const guchar Helvetica12_Character_093[] = { 2,192, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,192, 0, 0, 0};
+static const guchar Helvetica12_Character_059[] = { 2, 0,128, 64, 64, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_058[] = { 1, 0, 0, 0,128, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_044[] = { 2, 0,128, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_046[] = { 1, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_060[] = { 6, 0, 0, 0, 0, 12, 48,192, 48, 12, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_062[] = { 6, 0, 0, 0, 0,192, 48, 12, 48,192, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica12_Character_047[] = { 4, 0, 0, 0,128,128, 64, 64, 64, 32, 32, 16, 16, 0, 0, 0};
+static const guchar Helvetica12_Character_063[] = { 5, 0, 0, 0, 32, 0, 32, 32, 16, 16,136,136,112, 0, 0, 0};
+static const guchar Helvetica12_Character_092[] = { 4, 0, 0, 0, 16, 16, 32, 32, 32, 64, 64,128,128, 0, 0, 0};
+static const guchar Helvetica12_Character_034[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,160,160, 0, 0, 0};
+
+/* The font characters mapping: */
+static const guchar* Helvetica12_Character_Map[] = {Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_032,Helvetica12_Character_033,Helvetica12_Character_034,Helvetica12_Character_035,Helvetica12_Character_036,Helvetica12_Character_037,Helvetica12_Character_038,Helvetica12_Character_042,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_042,Helvetica12_Character_125,Helvetica12_Character_126,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,Helvetica12_Character_042,NULL};
+
+/* The font structure: */
+const SFG_Font fgFontHelvetica12 = { "-adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1", 93, 15, Helvetica12_Character_Map };
+
+static const guchar Helvetica18_Character_032[] = { 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 guchar Helvetica18_Character_097[] = { 7, 0, 0, 0, 0,118,238,198,198,230,126, 14,198,238,124, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_098[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,222, 0,255, 0,227, 0,193,128,193,128,193,128,193,128,227, 0,255, 0,222, 0,192, 0,192, 0,192, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_099[] = { 8, 0, 0, 0, 0, 62,127, 99,192,192,192,192, 99,127, 62, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_100[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 61,128,127,128, 99,128,193,128,193,128,193,128,193,128, 99,128,127,128, 61,128, 1,128, 1,128, 1,128, 1,128, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_101[] = { 8, 0, 0, 0, 0, 60,127,227,192,192,255,195,195,126, 60, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_102[] = { 6, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48,252,252, 48, 48, 60, 28, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_103[] = { 9, 28, 0,127, 0, 99, 0, 1,128, 61,128,127,128, 99,128,193,128,193,128,193,128,193,128, 97,128,127,128, 61,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_104[] = { 8, 0, 0, 0, 0,195,195,195,195,195,195,195,227,223,206,192,192,192,192, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_105[] = { 2, 0, 0, 0, 0,192,192,192,192,192,192,192,192,192,192, 0, 0,192,192, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_106[] = { 4,224,240, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 0, 0, 48, 48, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_107[] = { 8, 0, 0, 0, 0,199,198,206,204,216,248,240,216,204,198,192,192,192,192, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_108[] = { 2, 0, 0, 0, 0,192,192,192,192,192,192,192,192,192,192,192,192,192,192, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_109[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0,198, 48,198, 48,198, 48,198, 48,198, 48,198, 48,198, 48,231, 48,222,240,204, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_110[] = { 8, 0, 0, 0, 0,195,195,195,195,195,195,195,227,223,206, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_111[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0,127, 0, 99, 0,193,128,193,128,193,128,193,128, 99, 0,127, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_112[] = { 9,192, 0,192, 0,192, 0,192, 0,222, 0,255, 0,227, 0,193,128,193,128,193,128,193,128,227, 0,255, 0,222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_113[] = { 9, 1,128, 1,128, 1,128, 1,128, 61,128,127,128, 99,128,193,128,193,128,193,128,193,128, 99,128,127,128, 61,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_114[] = { 5, 0, 0, 0, 0,192,192,192,192,192,192,192,224,216,216, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_115[] = { 7, 0, 0, 0, 0,120,252,198, 6, 62,252,192,198,126, 60, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_116[] = { 6, 0, 0, 0, 0, 24, 56, 48, 48, 48, 48, 48, 48,252,252, 48, 48, 48, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_117[] = { 8, 0, 0, 0, 0,115,251,199,195,195,195,195,195,195,195, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_119[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 25,128, 25,128, 57,192, 41, 64,105, 96,102, 96,102, 96,198, 48,198, 48,198, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_118[] = { 8, 0, 0, 0, 0, 24, 24, 60, 36,102,102,102,195,195,195, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_120[] = { 8, 0, 0, 0, 0,195,231,102, 60, 24, 24, 60,102,231,195, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_121[] = { 8,112,112, 24, 24, 24, 24, 60, 36,102,102,102,195,195,195, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_122[] = { 7, 0, 0, 0, 0,254,254,192, 96, 48, 24, 12, 6,254,254, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_065[] = { 12, 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 guchar Helvetica18_Character_066[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0,255,128,255,192,192,224,192, 96,192, 96,192,224,255,192,255,128,193,128,192,192,192,192,193,192,255,128,255, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_067[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 15,128, 63,224,112,112, 96, 48,224, 0,192, 0,192, 0,192, 0,192, 0,224, 0, 96, 48,112,112, 63,224, 15,128, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_068[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0,255, 0,255,128,193,192,192,192,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192,192,193,192,255,128,255, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_069[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,255,128,255,128,192, 0,192, 0,192, 0,192, 0,255, 0,255, 0,192, 0,192, 0,192, 0,192, 0,255,128,255,128, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_070[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0,192, 0,192, 0,192, 0,192, 0,192, 0,192, 0,255, 0,255, 0,192, 0,192, 0,192, 0,192, 0,255,128,255,128, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_071[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 15,176, 63,240,112,112, 96, 48,224, 48,193,240,193,240,192, 0,192, 0,224, 48, 96, 48,112,112, 63,224, 15,128, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_072[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,255,224,255,224,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_073[] = { 2, 0, 0, 0, 0,192,192,192,192,192,192,192,192,192,192,192,192,192,192, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_074[] = { 8, 0, 0, 0, 0, 60,126,231,195,195, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_075[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0,192,112,192,224,193,192,195,128,199, 0,206, 0,252, 0,248, 0,220, 0,206, 0,199, 0,195,128,193,192,192,224, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_076[] = { 8, 0, 0, 0, 0,255,255,192,192,192,192,192,192,192,192,192,192,192,192, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_077[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0,195, 12,195, 12,199,140,196,140,204,204,204,204,216,108,216,108,240, 60,240, 60,224, 28,224, 28,192, 12,192, 12, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_078[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0,192, 96,192,224,193,224,193,224,195, 96,198, 96,198, 96,204, 96,204, 96,216, 96,240, 96,240, 96,224, 96,192, 96, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_079[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 15,128, 63,224,112,112, 96, 48,224, 56,192, 24,192, 24,192, 24,192, 24,224, 56, 96, 48,112,112, 63,224, 15,128, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_080[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0,192, 0,192, 0,192, 0,192, 0,192, 0,192, 0,255, 0,255,128,193,192,192,192,192,192,193,192,255,128,255, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_081[] = { 13, 0, 0, 0, 0, 0, 0, 0, 48, 15,176, 63,224,112,240, 97,176,225,184,192, 24,192, 24,192, 24,192, 24,224, 56, 96, 48,112,112, 63,224, 15,128, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_082[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0,192,192,192,192,192,192,192,192,193,128,193,128,255, 0,255,128,193,192,192,192,192,192,193,192,255,128,255, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_083[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0,127,192,224,224,192, 96, 0, 96, 0,224, 3,192, 31, 0,124, 0,224, 0,192, 96,224,224,127,192, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_084[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0, 12, 0,255,192,255,192, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_085[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0,127,192, 96,192,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_087[] = { 16, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, 28, 56, 52, 44, 54,108, 54,108,102,102,102,102, 98, 70, 99,198,195,195,193,131,193,131,193,131, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_086[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 15, 0, 15, 0, 25,128, 25,128, 25,128, 48,192, 48,192, 48,192, 96, 96, 96, 96, 96, 96,192, 48,192, 48, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_088[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0,192, 96,224,224, 96,192,113,192, 49,128, 27, 0, 14, 0, 14, 0, 27, 0, 49,128,113,192, 96,192,224,224,192, 96, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_089[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 15, 0, 25,128, 48,192, 48,192, 96, 96, 96, 96,192, 48,192, 48, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_090[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0,255,192,255,192,192, 0, 96, 0, 48, 0, 24, 0, 28, 0, 12, 0, 6, 0, 3, 0, 1,128, 0,192,255,192,255,192, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_048[] = { 8, 0, 0, 0, 0, 60,126,102,195,195,195,195,195,195,195,102,126, 60, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_049[] = { 5, 0, 0, 0, 0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,248,248, 24, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_050[] = { 8, 0, 0, 0, 0,255,255,192,224,112, 56, 28, 14, 7, 3,195,254, 60, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_051[] = { 8, 0, 0, 0, 0, 60,126,199,195, 3, 7, 30, 28, 6,195,195,126, 60, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_052[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 0,255,128,255,128,195, 0, 99, 0, 51, 0, 51, 0, 27, 0, 15, 0, 7, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_053[] = { 8, 0, 0, 0, 0,124,254,199,195, 3, 3,199,254,252,192,192,254,254, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_054[] = { 8, 0, 0, 0, 0, 60,126,227,195,195,195,254,220,192,192, 99,127, 60, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_055[] = { 8, 0, 0, 0, 0, 96, 96, 48, 48, 48, 24, 24, 12, 12, 6, 3,255,255, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_056[] = { 8, 0, 0, 0, 0, 60,126,231,195,195,102,126,102,195,195,231,126, 60, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_057[] = { 8, 0, 0, 0, 0,124,254,198, 3, 3, 59,127,195,195,195,199,126, 60, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_096[] = { 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,192,128,128, 64, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_126[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0,204,126, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_033[] = { 2, 0, 0, 0, 0,192,192, 0, 0,128,128,192,192,192,192,192,192,192,192, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_064[] = { 16, 0, 0, 7,224, 31,240, 56, 0,112, 0,103,112,207,248,204,204,204,102,204,102,204, 99,198, 51,103,115, 99,179, 48, 6, 28, 14, 15,252, 3,240, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_035[] = { 10, 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 guchar Helvetica18_Character_036[] = { 9, 0, 0, 0, 0, 8, 0, 8, 0, 62, 0,127, 0,235,128,201,128, 9,128, 15, 0, 62, 0,120, 0,232, 0,200, 0,203, 0,127, 0, 62, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_037[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 24,120, 24,252, 12,204, 12,204, 6,252, 6,120, 3, 0,123, 0,253,128,205,128,204,192,252,192,120, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_094[] = { 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,130,198,108, 56, 16, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_038[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 60,112,126,224,231,192,195,128,195,192,198,192,238,192,124, 0, 60, 0,102, 0,102, 0,126, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_042[] = { 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,112,112,248, 32, 32, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_040[] = { 4, 16, 48, 96, 96,192,192,192,192,192,192,192,192,192,192, 96, 96, 48, 16, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_041[] = { 4,128,192, 96, 96, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 96, 96,192,128, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_045[] = { 8, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_095[] = { 10,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 guchar Helvetica18_Character_061[] = { 7, 0, 0, 0, 0, 0, 0,254,254, 0, 0,254,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_043[] = { 8, 0, 0, 0, 0, 24, 24, 24, 24,255,255, 24, 24, 24, 24, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_091[] = { 4,240,240,192,192,192,192,192,192,192,192,192,192,192,192,192,192,240,240, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_123[] = { 6, 12, 24, 48, 48, 48, 48, 48, 48, 96,192, 96, 48, 48, 48, 48, 48, 24, 12, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_125[] = { 6,192, 96, 48, 48, 48, 48, 48, 48, 24, 12, 24, 48, 48, 48, 48, 48, 96,192, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_093[] = { 4,240,240, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,240,240, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_059[] = { 2, 0,128, 64, 64,192,192, 0, 0, 0, 0, 0, 0,192,192, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_058[] = { 2, 0, 0, 0, 0,192,192, 0, 0, 0, 0, 0, 0,192,192, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_044[] = { 2, 0,128, 64, 64,192,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_046[] = { 2, 0, 0, 0, 0,192,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_060[] = { 8, 0, 0, 0, 0, 3, 15, 60,112,192,112, 60, 15, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_062[] = { 8, 0, 0, 0, 0,192,240, 60, 14, 3, 14, 60,240,192, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_047[] = { 5, 0, 0, 0, 0,192,192, 64, 64, 96, 96, 32, 32, 48, 48, 16, 16, 24, 24, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_063[] = { 7, 0, 0, 0, 0, 48, 48, 0, 0, 48, 48, 48, 56, 28, 14,198,198,254,124, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_092[] = { 5, 0, 0, 0, 0, 24, 24, 16, 16, 48, 48, 32, 32, 96, 96, 64, 64,192,192, 0, 0, 0, 0};
+static const guchar Helvetica18_Character_034[] = { 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,144,216,216,216, 0, 0, 0, 0};
+
+/* The font characters mapping: */
+static const guchar* Helvetica18_Character_Map[] = {Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_032,Helvetica18_Character_033,Helvetica18_Character_034,Helvetica18_Character_035,Helvetica18_Character_036,Helvetica18_Character_037,Helvetica18_Character_038,Helvetica18_Character_042,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_042,Helvetica18_Character_125,Helvetica18_Character_126,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,Helvetica18_Character_042,NULL};
+
+/* The font structure: */
+const SFG_Font fgFontHelvetica18 = { "-adobe-helvetica-medium-r-normal--18-180-75-75-p-98-iso8859-1", 93, 22, Helvetica18_Character_Map };
+
+static const guchar TimesRoman10_Character_032[] = { 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};
+static const guchar TimesRoman10_Character_097[] = { 3, 0, 0, 0,224,160, 96, 32,192, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_098[] = { 4, 0, 0, 0,224,144,144,144,224,128,128, 0, 0, 0};
+static const guchar TimesRoman10_Character_099[] = { 3, 0, 0, 0, 96,128,128,128, 96, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_100[] = { 5, 0, 0, 0,104,144,144,144,112, 16, 48, 0, 0, 0};
+static const guchar TimesRoman10_Character_101[] = { 3, 0, 0, 0, 96,128,192,160, 96, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_102[] = { 4, 0, 0, 0,224, 64, 64, 64,224, 64, 48, 0, 0, 0};
+static const guchar TimesRoman10_Character_103[] = { 4, 0,224,144, 96, 64,160,160,112, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_104[] = { 5, 0, 0, 0,216,144,144,144,224,128,128, 0, 0, 0};
+static const guchar TimesRoman10_Character_105[] = { 2, 0, 0, 0, 64, 64, 64, 64,192, 0, 64, 0, 0, 0};
+static const guchar TimesRoman10_Character_106[] = { 2, 0,128, 64, 64, 64, 64, 64,192, 0, 64, 0, 0, 0};
+static const guchar TimesRoman10_Character_107[] = { 5, 0, 0, 0,152,144,224,160,144,128,128, 0, 0, 0};
+static const guchar TimesRoman10_Character_108[] = { 3, 0, 0, 0,224, 64, 64, 64, 64, 64,192, 0, 0, 0};
+static const guchar TimesRoman10_Character_109[] = { 8, 0, 0, 0,219,146,146,146,236, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_110[] = { 5, 0, 0, 0,216,144,144,144,224, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_111[] = { 4, 0, 0, 0, 96,144,144,144, 96, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_112[] = { 4, 0,192,128,224,144,144,144,224, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_113[] = { 5, 0, 56, 16,112,144,144,144,112, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_114[] = { 3, 0, 0, 0,224, 64, 64, 96,160, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_115[] = { 3, 0, 0, 0,224, 32, 96,128,224, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_116[] = { 4, 0, 0, 0, 48, 64, 64, 64,224, 64, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_117[] = { 5, 0, 0, 0,104,144,144,144,144, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_119[] = { 8, 0, 0, 0, 40,108, 84,146,219, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_118[] = { 5, 0, 0, 0, 32, 96, 80,144,216, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_120[] = { 5, 0, 0, 0,216, 80, 32, 80,216, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_121[] = { 6, 0, 64, 64, 32, 48, 80, 72,220, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_122[] = { 4, 0, 0, 0,240,144, 64, 32,240, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_065[] = { 7, 0, 0, 0,238, 68,124, 40, 40, 56, 16, 0, 0, 0};
+static const guchar TimesRoman10_Character_066[] = { 5, 0, 0, 0,240, 72, 72,112, 72, 72,240, 0, 0, 0};
+static const guchar TimesRoman10_Character_067[] = { 6, 0, 0, 0,120,196,128,128,128,196,124, 0, 0, 0};
+static const guchar TimesRoman10_Character_068[] = { 6, 0, 0, 0,248, 76, 68, 68, 68, 76,248, 0, 0, 0};
+static const guchar TimesRoman10_Character_069[] = { 5, 0, 0, 0,248, 72, 64,112, 64, 72,248, 0, 0, 0};
+static const guchar TimesRoman10_Character_070[] = { 5, 0, 0, 0,224, 64, 64,112, 64, 72,248, 0, 0, 0};
+static const guchar TimesRoman10_Character_071[] = { 6, 0, 0, 0,120,196,132,156,128,196,124, 0, 0, 0};
+static const guchar TimesRoman10_Character_072[] = { 7, 0, 0, 0,238, 68, 68,124, 68, 68,238, 0, 0, 0};
+static const guchar TimesRoman10_Character_073[] = { 3, 0, 0, 0,224, 64, 64, 64, 64, 64,224, 0, 0, 0};
+static const guchar TimesRoman10_Character_074[] = { 4, 0, 0, 0,192,160, 32, 32, 32, 32,112, 0, 0, 0};
+static const guchar TimesRoman10_Character_075[] = { 6, 0, 0, 0,236, 72, 80, 96, 80, 72,236, 0, 0, 0};
+static const guchar TimesRoman10_Character_076[] = { 5, 0, 0, 0,248, 72, 64, 64, 64, 64,224, 0, 0, 0};
+static const guchar TimesRoman10_Character_077[] = { 9, 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 guchar TimesRoman10_Character_078[] = { 7, 0, 0, 0,228, 76, 76, 84, 84,100,238, 0, 0, 0};
+static const guchar TimesRoman10_Character_079[] = { 6, 0, 0, 0,120,204,132,132,132,204,120, 0, 0, 0};
+static const guchar TimesRoman10_Character_080[] = { 5, 0, 0, 0,224, 64, 64,112, 72, 72,240, 0, 0, 0};
+static const guchar TimesRoman10_Character_081[] = { 6, 0, 12, 24,112,204,132,132,132,204,120, 0, 0, 0};
+static const guchar TimesRoman10_Character_082[] = { 6, 0, 0, 0,236, 72, 80,112, 72, 72,240, 0, 0, 0};
+static const guchar TimesRoman10_Character_083[] = { 4, 0, 0, 0,224,144, 16, 96,192,144,112, 0, 0, 0};
+static const guchar TimesRoman10_Character_084[] = { 5, 0, 0, 0,112, 32, 32, 32, 32,168,248, 0, 0, 0};
+static const guchar TimesRoman10_Character_085[] = { 7, 0, 0, 0, 56,108, 68, 68, 68, 68,238, 0, 0, 0};
+static const guchar TimesRoman10_Character_087[] = { 10, 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 guchar TimesRoman10_Character_086[] = { 7, 0, 0, 0, 16, 16, 40, 40,108, 68,238, 0, 0, 0};
+static const guchar TimesRoman10_Character_088[] = { 7, 0, 0, 0,238, 68, 40, 16, 40, 68,238, 0, 0, 0};
+static const guchar TimesRoman10_Character_089[] = { 7, 0, 0, 0, 56, 16, 16, 40, 40, 68,238, 0, 0, 0};
+static const guchar TimesRoman10_Character_090[] = { 5, 0, 0, 0,248,136, 64, 32, 16,136,248, 0, 0, 0};
+static const guchar TimesRoman10_Character_048[] = { 4, 0, 0, 0, 96,144,144,144,144,144, 96, 0, 0, 0};
+static const guchar TimesRoman10_Character_049[] = { 3, 0, 0, 0,224, 64, 64, 64, 64,192, 64, 0, 0, 0};
+static const guchar TimesRoman10_Character_050[] = { 4, 0, 0, 0,240, 64, 32, 32, 16,144, 96, 0, 0, 0};
+static const guchar TimesRoman10_Character_051[] = { 4, 0, 0, 0,224, 16, 16, 96, 16,144, 96, 0, 0, 0};
+static const guchar TimesRoman10_Character_052[] = { 5, 0, 0, 0, 16, 16,248,144, 80, 48, 16, 0, 0, 0};
+static const guchar TimesRoman10_Character_053[] = { 4, 0, 0, 0,224,144, 16, 16,224, 64,112, 0, 0, 0};
+static const guchar TimesRoman10_Character_054[] = { 4, 0, 0, 0, 96,144,144,144,224, 64, 48, 0, 0, 0};
+static const guchar TimesRoman10_Character_055[] = { 4, 0, 0, 0, 64, 64, 64, 32, 32,144,240, 0, 0, 0};
+static const guchar TimesRoman10_Character_056[] = { 4, 0, 0, 0, 96,144,144, 96,144,144, 96, 0, 0, 0};
+static const guchar TimesRoman10_Character_057[] = { 4, 0, 0, 0,192, 32,112,144,144,144, 96, 0, 0, 0};
+static const guchar TimesRoman10_Character_096[] = { 2, 0, 0, 0, 0, 0, 0, 0, 0,192,128, 0, 0, 0};
+static const guchar TimesRoman10_Character_126[] = { 6, 0, 0, 0, 0, 0,152,100, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_033[] = { 1, 0, 0, 0,128, 0,128,128,128,128,128, 0, 0, 0};
+static const guchar TimesRoman10_Character_064[] = { 8, 0, 62, 64,146,173,165,165,157, 66, 60, 0, 0, 0};
+static const guchar TimesRoman10_Character_035[] = { 5, 0, 0, 0, 80, 80,248, 80,248, 80, 80, 0, 0, 0};
+static const guchar TimesRoman10_Character_036[] = { 4, 0, 0, 32,224,144, 16, 96,128,144,112, 32, 0, 0};
+static const guchar TimesRoman10_Character_037[] = { 7, 0, 0, 0, 68, 42, 42, 86,168,164,126, 0, 0, 0};
+static const guchar TimesRoman10_Character_094[] = { 3, 0, 0, 0, 0, 0, 0, 0,160,160, 64, 0, 0, 0};
+static const guchar TimesRoman10_Character_038[] = { 8, 0, 0, 0,118,141,152,116,110, 80, 48, 0, 0, 0};
+static const guchar TimesRoman10_Character_042[] = { 3, 0, 0, 0, 0, 0, 0, 0,160, 64,160, 0, 0, 0};
+static const guchar TimesRoman10_Character_040[] = { 3, 0, 32, 64, 64,128,128,128, 64, 64, 32, 0, 0, 0};
+static const guchar TimesRoman10_Character_041[] = { 3, 0,128, 64, 64, 32, 32, 32, 64, 64,128, 0, 0, 0};
+static const guchar TimesRoman10_Character_045[] = { 4, 0, 0, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_095[] = { 5,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_061[] = { 5, 0, 0, 0, 0,248, 0,248, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_043[] = { 5, 0, 0, 0, 32, 32,248, 32, 32, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_091[] = { 2, 0,192,128,128,128,128,128,128,128,192, 0, 0, 0};
+static const guchar TimesRoman10_Character_123[] = { 3, 0, 32, 64, 64, 64,128, 64, 64, 64, 32, 0, 0, 0};
+static const guchar TimesRoman10_Character_125[] = { 3, 0,128, 64, 64, 64, 32, 64, 64, 64,128, 0, 0, 0};
+static const guchar TimesRoman10_Character_093[] = { 2, 0,192, 64, 64, 64, 64, 64, 64, 64,192, 0, 0, 0};
+static const guchar TimesRoman10_Character_059[] = { 1, 0,128,128,128, 0, 0, 0,128, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_058[] = { 1, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_044[] = { 1, 0,128,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_046[] = { 1, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_060[] = { 3, 0, 0, 0, 32, 64,128, 64, 32, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_062[] = { 3, 0, 0, 0,128, 64, 32, 64,128, 0, 0, 0, 0, 0};
+static const guchar TimesRoman10_Character_047[] = { 3, 0, 0, 0,128,128, 64, 64, 64, 32, 32, 0, 0, 0};
+static const guchar TimesRoman10_Character_063[] = { 3, 0, 0, 0, 64, 0, 64, 64, 32,160,224, 0, 0, 0};
+static const guchar TimesRoman10_Character_092[] = { 3, 0, 0, 0, 32, 32, 64, 64, 64,128,128, 0, 0, 0};
+static const guchar TimesRoman10_Character_034[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0,160,160, 0, 0, 0};
+
+/* The font characters mapping: */
+static const guchar* TimesRoman10_Character_Map[] = {TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_032,TimesRoman10_Character_033,TimesRoman10_Character_034,TimesRoman10_Character_035,TimesRoman10_Character_036,TimesRoman10_Character_037,TimesRoman10_Character_038,TimesRoman10_Character_042,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_042,TimesRoman10_Character_125,TimesRoman10_Character_126,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,TimesRoman10_Character_042,NULL};
+
+/* The font structure: */
+const SFG_Font fgFontTimesRoman10 = { "-adobe-times-medium-r-normal--10-100-75-75-p-54-iso8859-1", 93, 13, TimesRoman10_Character_Map };
+
+static const guchar TimesRoman24_Character_032[] = { 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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 guchar TimesRoman24_Character_097[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,113,128,251, 0,199, 0,195, 0,195, 0, 99, 0, 59, 0, 15, 0, 3, 0, 99, 0,103, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_098[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 0,115,128, 97,128, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 97,128,115,128,110, 0, 96, 0, 96, 0, 96, 0, 96, 0,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_099[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,127, 0,112,128,224, 0,192, 0,192, 0,192, 0,192, 0,192, 0, 65,128, 99,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 guchar TimesRoman24_Character_100[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30,192,115,128, 97,128,193,128,193,128,193,128,193,128,193,128,193,128, 97,128,115,128, 29,128, 1,128, 1,128, 1,128, 1,128, 3,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_101[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,127, 0,112,128,224, 0,192, 0,192, 0,192, 0,255,128,193,128, 65,128, 99, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_102[] = { 7, 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 guchar TimesRoman24_Character_103[] = { 11, 0, 0, 63, 0,241,192,192, 96,192, 32, 96, 96, 63,192,127, 0, 96, 0, 48, 0, 62, 0, 51, 0, 97,128, 97,128, 97,128, 97,128, 51, 0, 31,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_104[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241,224, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192,113,192,111,128,103, 0, 96, 0, 96, 0, 96, 0, 96, 0,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_105[] = { 4, 0, 0, 0, 0, 0, 0,240, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,224, 0, 0, 0, 96, 96, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_106[] = { 4, 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 guchar TimesRoman24_Character_107[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243,224, 97,192, 99,128,103, 0,110, 0,108, 0,120, 0,104, 0,100, 0,102, 0, 99, 0,103,192, 96, 0, 96, 0, 96, 0, 96, 0,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_108[] = { 4, 0, 0, 0, 0, 0, 0,240, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,224, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_109[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241,227,192, 96,193,128, 96,193,128, 96,193,128, 96,193,128, 96,193,128, 96,193,128, 96,193,128, 96,193,128,113,227,128,111,159, 0,231, 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, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_110[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241,224, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192,113,192,111,128,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_111[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,115,128, 97,128,192,192,192,192,192,192,192,192,192,192,192,192, 97,128,115,128, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_112[] = { 10, 0, 0,240, 0, 96, 0, 96, 0, 96, 0, 96, 0,110, 0,115,128, 97,128, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 97,128,115,128,238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_113[] = { 10, 0, 0, 3,192, 1,128, 1,128, 1,128, 1,128, 29,128,115,128, 97,128,193,128,193,128,193,128,193,128,193,128,193,128, 97,128,115,128, 29,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_114[] = { 7, 0, 0, 0, 0, 0, 0,240, 96, 96, 96, 96, 96, 96, 96, 96,118,110,230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_115[] = { 8, 0, 0, 0, 0, 0, 0,248,198,131, 3, 7, 30,124,112,224,194,102, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_116[] = { 7, 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 guchar TimesRoman24_Character_117[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,224, 62,192,113,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192, 96,192,225,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_119[] = { 17, 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 guchar TimesRoman24_Character_118[] = { 11, 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 guchar TimesRoman24_Character_120[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241,224, 96,192, 33,128, 51,128, 27, 0, 14, 0, 12, 0, 26, 0, 57, 0, 49,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 guchar TimesRoman24_Character_121[] = { 11, 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 guchar TimesRoman24_Character_122[] = { 8, 0, 0, 0, 0, 0, 0,255,195, 97,112, 48, 56, 24, 28, 14,134,195,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_065[] = { 17, 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 guchar TimesRoman24_Character_066[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,224, 48,120, 48, 24, 48, 12, 48, 12, 48, 12, 48, 24, 48, 56, 63,224, 48, 64, 48, 48, 48, 24, 48, 24, 48, 24, 48, 48, 48,112,255,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_067[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,224, 30, 56, 56, 8, 96, 4, 96, 0,192, 0,192, 0,192, 0,192, 0,192, 0,192, 0,192, 0, 96, 4, 96, 4, 56, 12, 28, 60, 7,228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_068[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,192, 48,112, 48, 56, 48, 12, 48, 12, 48, 6, 48, 6, 48, 6, 48, 6, 48, 6, 48, 6, 48, 6, 48, 12, 48, 12, 48, 56, 48,112,255,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_069[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,248, 48, 24, 48, 8, 48, 8, 48, 0, 48, 0, 48, 64, 48, 64, 63,192, 48, 64, 48, 64, 48, 0, 48, 0, 48, 16, 48, 16, 48, 48,255,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_070[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 32, 48, 32, 63,224, 48, 32, 48, 32, 48, 0, 48, 0, 48, 16, 48, 16, 48, 48,255,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_071[] = { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,224, 30, 56, 56, 28, 96, 12, 96, 12,192, 12,192, 12,192, 63,192, 0,192, 0,192, 0,192, 0, 96, 4, 96, 4, 56, 12, 28, 60, 7,228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_072[] = { 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 31,128, 48, 6, 0, 48, 6, 0, 48, 6, 0, 48, 6, 0, 48, 6, 0, 48, 6, 0, 48, 6, 0, 63,254, 0, 48, 6, 0, 48, 6, 0, 48, 6, 0, 48, 6, 0, 48, 6, 0, 48, 6, 0, 48, 6, 0,252, 31,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_073[] = { 6, 0, 0, 0, 0, 0, 0,252, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,252, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_074[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 0,204, 0,198, 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, 6, 0, 31,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_075[] = { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 31, 48, 14, 48, 28, 48, 56, 48,112, 48,224, 49,192, 51,128, 63, 0, 62, 0, 51, 0, 49,128, 48,192, 48, 96, 48, 48, 48, 24,252,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_076[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,248, 48, 24, 48, 8, 48, 8, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0,252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_077[] = { 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 33,248, 32, 96, 96, 32, 96, 96, 32,208, 96, 32,208, 96, 33,136, 96, 33,136, 96, 35, 8, 96, 35, 4, 96, 38, 4, 96, 38, 2, 96, 44, 2, 96, 44, 2, 96, 56, 1, 96, 56, 1, 96, 48, 0,224,240, 0,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_078[] = { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 12, 32, 28, 32, 28, 32, 52, 32,100, 32,100, 32,196, 33,132, 33,132, 35, 4, 38, 4, 38, 4, 44, 4, 56, 4, 56, 4, 48, 4,240, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_079[] = { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,224, 28, 56, 56, 28, 96, 6, 96, 6,192, 3,192, 3,192, 3,192, 3,192, 3,192, 3,192, 3, 96, 6, 96, 6, 56, 28, 28, 56, 7,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_080[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0, 63,192, 48,112, 48, 48, 48, 24, 48, 24, 48, 24, 48, 48, 48,112,255,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_081[] = { 16, 0, 0, 0, 15, 0, 56, 0,112, 0,224, 1,192, 7,224, 28, 56, 56, 28, 96, 6, 96, 6,192, 3,192, 3,192, 3,192, 3,192, 3,192, 3,192, 3, 96, 6, 96, 6, 56, 28, 28, 56, 7,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_082[] = { 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 30, 48, 28, 48, 56, 48,112, 48, 96, 48,192, 49,192, 51,128, 63,192, 48,112, 48, 48, 48, 56, 48, 24, 48, 56, 48, 48, 48,112,255,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_083[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,158, 0,241,128,192,192,128, 96,128, 96, 0, 96, 0,224, 3,192, 15,128, 30, 0,120, 0,224, 0,192, 64,192, 64,192,192, 99,192, 30, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_084[] = { 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15,192, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 0,131, 4,131, 4,195, 12,255,252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_085[] = { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,224, 28, 48, 24, 8, 48, 8, 48, 4, 48, 4, 48, 4, 48, 4, 48, 4, 48, 4, 48, 4, 48, 4, 48, 4, 48, 4, 48, 4, 48, 4,252, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_087[] = { 23, 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 guchar TimesRoman24_Character_086[] = { 17, 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 guchar TimesRoman24_Character_088[] = { 18, 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 guchar TimesRoman24_Character_089[] = { 16, 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 guchar TimesRoman24_Character_090[] = { 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,248,224, 24,112, 8, 48, 8, 56, 0, 24, 0, 28, 0, 14, 0, 6, 0, 7, 0, 3, 0, 3,128, 1,192,128,192,128,224,192,112,255,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_048[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 51, 0, 97,128, 97,128,225,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192, 97,128, 97,128, 51, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_049[] = { 8, 0, 0, 0, 0, 0, 0,255, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,120, 24, 8, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_050[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,128,255,192, 96, 64, 48, 0, 24, 0, 12, 0, 4, 0, 6, 0, 3, 0, 3, 0, 1,128, 1,128,129,128,129,128, 67,128,127, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_051[] = { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 0,230, 0,195, 0, 1, 0, 1,128, 1,128, 1,128, 3,128, 7, 0, 30, 0, 12, 0, 6, 0,131, 0,131, 0, 71, 0,126, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_052[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 0, 3, 0,255,192,255,192,195, 0, 67, 0, 99, 0, 35, 0, 51, 0, 19, 0, 27, 0, 11, 0, 7, 0, 7, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_053[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 0,227,128,193,128, 0,192, 0,192, 0,192, 0,192, 1,192, 3,128, 15,128,126, 0,120, 0, 96, 0, 32, 0, 32, 0, 31,128, 31,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_054[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,123,128, 97,128,224,192,192,192,192,192,192,192,192,192,193,128,243,128,238, 0, 96, 0,112, 0, 48, 0, 24, 0, 14, 0, 3,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_055[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 24, 0, 12, 0, 12, 0, 12, 0, 4, 0, 6, 0, 6, 0, 2, 0, 3, 0, 3, 0, 1, 0, 1,128,129,128,192,192,255,192,127,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_056[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,115,128,225,128,192,192,192,192,192,192, 65,192, 97,128, 55, 0, 30, 0, 30, 0, 51, 0, 97,128, 97,128, 97,128, 51, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_057[] = { 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 28, 0, 6, 0, 3, 0, 3,128, 1,128, 29,128,115,192, 97,192,192,192,192,192,192,192,192,192,193,192, 97,128,119,128, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_096[] = { 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,224,128,192, 96, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_126[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,131,128,199,192,124, 96, 56, 32, 0, 0, 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 guchar TimesRoman24_Character_033[] = { 2, 0, 0, 0, 0, 0, 0,192,192, 0, 0, 0,192,192,192,192,192,192,192,192,192,192,192,192, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_064[] = { 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 0, 14, 12, 0, 24, 0, 0, 48, 0, 0, 97,222, 0, 99,123, 0,198, 57,128,198, 24,128,198, 24,192,198, 24, 64,198, 12, 64,195, 12, 64,195,140, 64,225,252, 64, 96,236,192,112, 0,128, 56, 1,128, 28, 3, 0, 15, 14, 0, 3,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_035[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 34, 0, 34, 0, 34, 0, 34, 0,255,192,255,192, 17, 0, 17, 0, 17, 0,127,224,127,224, 8,128, 8,128, 8,128, 8,128, 8,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_036[] = { 11, 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 guchar TimesRoman24_Character_037[] = { 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 60, 0, 24,114, 0, 12, 97, 0, 4, 96,128, 6, 96,128, 3, 48,128, 1, 25,128, 1,143, 0,120,192, 0,228, 64, 0,194, 96, 0,193, 48, 0,193, 16, 0, 97, 24, 0, 51,252, 0, 30, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_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, 0, 0,128,128,193,128, 65, 0, 99, 0, 34, 0, 54, 0, 20, 0, 28, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_038[] = { 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 60,127,126,225,225,192,192,193,192,193,160, 99, 32, 55, 16, 30, 24, 14, 62, 15, 0, 29,128, 24,192, 24, 64, 24, 64, 12,192, 7,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_042[] = { 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, 8, 0, 28, 0,201,128,235,128, 28, 0,235,128,201,128, 28, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_040[] = { 6, 0, 4, 8, 16, 48, 32, 96, 96,192,192,192,192,192,192,192,192, 96, 96, 32, 48, 16, 8, 4, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_041[] = { 6, 0,128, 64, 32, 48, 16, 24, 24, 12, 12, 12, 12, 12, 12, 12, 12, 24, 24, 16, 48, 32, 64,128, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_045[] = { 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,255,240,255,240, 0, 0, 0, 0, 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 guchar TimesRoman24_Character_095[] = { 13, 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 guchar TimesRoman24_Character_061[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,240,255,240, 0, 0, 0, 0,255,240,255,240, 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 guchar TimesRoman24_Character_043[] = { 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0,255,240,255,240, 6, 0, 6, 0, 6, 0, 6, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_091[] = { 5, 0, 0,248,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,192,248, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_123[] = { 8, 0, 7, 12, 24, 24, 24, 24, 24, 24, 16, 48, 32,192, 32, 48, 16, 24, 24, 24, 24, 24, 12, 7, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_125[] = { 8, 0,224, 48, 24, 24, 24, 24, 24, 24, 8, 12, 4, 3, 4, 12, 8, 24, 24, 24, 24, 24, 48,224, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_093[] = { 5, 0, 0,248, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,248, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_059[] = { 3, 0, 0, 0,192, 96, 32,224,192, 0, 0, 0, 0, 0, 0, 0,192,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_058[] = { 2, 0, 0, 0, 0, 0, 0,192,192, 0, 0, 0, 0, 0, 0, 0,192,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_044[] = { 3, 0, 0, 0,192, 96, 32,224,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_046[] = { 2, 0, 0, 0, 0, 0, 0,192,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_060[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 1,192, 7, 0, 28, 0,112, 0,192, 0,112, 0, 28, 0, 7, 0, 1,192, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_062[] = { 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 0,112, 0, 28, 0, 7, 0, 1,192, 0, 96, 1,192, 7, 0, 28, 0,112, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_047[] = { 8, 0, 0, 0,192,192,192, 96, 96, 32, 48, 48, 16, 24, 24, 8, 12, 12, 4, 6, 6, 3, 3, 3, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_063[] = { 8, 0, 0, 0, 0, 0, 0, 48, 48, 0, 0, 16, 16, 16, 24, 24, 12, 14, 7,195,195,131,198,124, 0, 0, 0, 0, 0};
+static const guchar TimesRoman24_Character_092[] = { 7, 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 guchar TimesRoman24_Character_034[] = { 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,204,204,204,204, 0, 0, 0, 0, 0};
+
+/* The font characters mapping: */
+static const guchar* TimesRoman24_Character_Map[] = {TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_032,TimesRoman24_Character_033,TimesRoman24_Character_034,TimesRoman24_Character_035,TimesRoman24_Character_036,TimesRoman24_Character_037,TimesRoman24_Character_038,TimesRoman24_Character_042,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_042,TimesRoman24_Character_125,TimesRoman24_Character_126,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,TimesRoman24_Character_042,NULL};
+
+/* The font structure: */
+const SFG_Font fgFontTimesRoman24 = { "-adobe-times-medium-r-normal--24-240-75-75-p-124-iso8859-1", 93, 28, TimesRoman24_Character_Map };
+
+/*** END OF FILE ***/
+
--- /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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "freeglut-gamemode"
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/freeglut_internal.h"
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ *
+ * glutGameModeString() -- missing
+ * glutEnterGameMode() -- X11 version
+ * glutLeaveGameMode() -- is that correct?
+ * glutGameModeGet() -- is that correct?
+ */
+
+
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
+
+/*
+ * Remembers the current visual settings, so that
+ * we can change them and restore later...
+ */
+void fghRememberState( void )
+{
+#if TARGET_HOST_UNIX_X11
+
+ /*
+ * This highly depends on the XFree86 extensions, not approved as X Consortium standards
+ */
+# ifdef X_XF86VidModeGetModeLine
+
+ /*
+ * Query the current display settings:
+ */
+ XF86VidModeGetModeLine(
+ fgDisplay.Display,
+ fgDisplay.Screen,
+ &fgDisplay.DisplayModeClock,
+ &fgDisplay.DisplayMode
+ );
+
+# else
+# warning fghRememberState: missing XFree86 video mode extensions, game mode will not change screen resolution when activated
+# endif
+
+#elif TARGET_HOST_WIN32
+
+ DEVMODE devMode;
+
+ /*
+ * Grab the current desktop settings...
+ */
+ EnumDisplaySettings( NULL, 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
+ */
+void fghRestoreState( void )
+{
+#if TARGET_HOST_UNIX_X11
+
+ /*
+ * This highly depends on the XFree86 extensions, not approved as X Consortium standards
+ */
+# ifdef X_XF86VidModeGetAllModeLines
+
+ XF86VidModeModeInfo** displayModes;
+ gint i, displayModesCount;
+
+ /*
+ * Query for all the display available...
+ */
+ XF86VidModeGetAllModeLines(
+ fgDisplay.Display,
+ fgDisplay.Screen,
+ &displayModesCount,
+ &displayModes
+ );
+
+ /*
+ * Check every of the modes looking for one that matches our demands
+ */
+ for( i=0; i<displayModesCount; i++ )
+ {
+ if( displayModes[ i ]->hdisplay == fgDisplay.DisplayMode.hdisplay &&
+ displayModes[ i ]->vdisplay == fgDisplay.DisplayMode.vdisplay &&
+ displayModes[ i ]->dotclock == fgDisplay.DisplayModeClock )
+ {
+ /*
+ * OKi, this is the display mode we have been looking for...
+ */
+ XF86VidModeSwitchToMode(
+ fgDisplay.Display,
+ fgDisplay.Screen,
+ displayModes[ i ]
+ );
+
+ return;
+ }
+ }
+
+# else
+# warning fghRestoreState: missing XFree86 video mode extensions, game mode will not change screen resolution when activated
+# endif
+
+#elif TARGET_HOST_WIN32
+
+ /*
+ * Restore the previously rememebered desktop display settings
+ */
+ ChangeDisplaySettings( &fgDisplay.DisplayMode, 0 );
+
+#endif
+}
+
+/*
+ * Checks the display mode settings against user's preferences
+ */
+gboolean fghCheckDisplayMode( gint width, gint height, gint depth, gint 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) );
+}
+
+/*
+ * Changes the current display mode to match user's settings
+ */
+gboolean fghChangeDisplayMode( gboolean haveToTest )
+{
+#if TARGET_HOST_UNIX_X11
+
+ /*
+ * This highly depends on the XFree86 extensions, not approved as X Consortium standards
+ */
+# ifdef X_XF86VidModeGetAllModeLines
+
+ XF86VidModeModeInfo** displayModes;
+ gint i, displayModesCount;
+
+ /*
+ * Query for all the display available...
+ */
+ XF86VidModeGetAllModeLines(
+ fgDisplay.Display,
+ fgDisplay.Screen,
+ &displayModesCount,
+ &displayModes
+ );
+
+ /*
+ * Check every of the modes looking for one that matches our demands
+ */
+ for( i=0; i<displayModesCount; i++ )
+ {
+ if( fghCheckDisplayMode( displayModes[ i ]->hdisplay, displayModes[ i ]->vdisplay,
+ fgState.GameModeDepth, fgState.GameModeRefresh ) )
+ {
+ /*
+ * OKi, this is the display mode we have been looking for...
+ */
+ XF86VidModeSwitchToMode(
+ fgDisplay.Display,
+ fgDisplay.Screen,
+ displayModes[ i ]
+ );
+
+ /*
+ * Set the viewport's origin to (0,0) (the game mode window's top-left corner)
+ */
+ XF86VidModeSetViewPort(
+ fgDisplay.Display,
+ fgDisplay.Screen,
+ 0,
+ 0
+ );
+
+ /*
+ * Return successfull...
+ */
+ return( TRUE );
+ }
+ }
+
+ /*
+ * Something must have went wrong
+ */
+ return( FALSE );
+
+# else
+# warning fghChangeDisplayMode: missing XFree86 video mode extensions, game mode will not change screen resolution when activated
+# endif
+
+#elif TARGET_HOST_WIN32
+
+ guint displayModes = 0, mode = 0xffffffff;
+ gboolean success = FALSE;
+ HDC desktopDC;
+ DEVMODE devMode;
+
+ /*
+ * Enumerate the available display modes
+ */
+ while( EnumDisplaySettings( NULL, displayModes, &devMode ) == TRUE )
+ {
+ /*
+ * Does the enumerated display mode match the user's preferences?
+ */
+ if( fghCheckDisplayMode( devMode.dmPelsWidth, devMode.dmPelsHeight,
+ devMode.dmBitsPerPel, fgState.GameModeRefresh ) )
+ {
+ /*
+ * OKi, we've found a matching display mode, remember it's number and break
+ */
+ mode = displayModes;
+ break;
+ }
+
+ /*
+ * Switch to the next display mode, if any
+ */
+ displayModes++;
+ }
+
+ /*
+ * Did we find a matching display mode?
+ */
+ if( mode != 0xffffffff )
+ {
+ gint retVal = DISP_CHANGE_SUCCESSFUL;
+
+ /*
+ * Mark the values we want to modify in the display change call
+ */
+ devMode.dmFields |= DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY;
+
+ /*
+ * Change the current display mode (possibly in test mode only)
+ */
+ retVal = ChangeDisplaySettings( &devMode, haveToTest ? CDS_TEST : 0 );
+
+ /*
+ * I don't know if it's really needed, but looks nice:
+ */
+ success = (retVal == DISP_CHANGE_SUCCESSFUL) || (retVal == DISP_CHANGE_NOTUPDATED);
+
+ /*
+ * If it was not a test, remember the current screen settings
+ */
+ if( !haveToTest && success )
+ {
+ fgState.GameModeSize.X = devMode.dmPelsWidth;
+ fgState.GameModeSize.Y = devMode.dmPelsHeight;
+ fgState.GameModeDepth = devMode.dmBitsPerPel;
+ fgState.GameModeRefresh = devMode.dmDisplayFrequency;
+ }
+ }
+
+ /*
+ * Otherwise we must have failed somewhere
+ */
+ return( success );
+
+#endif
+}
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Sets the game mode display string
+ */
+void FGAPIENTRY glutGameModeString( const gchar* string )
+{
+ gint width = 640, height = 480, depth = 16, refresh = 72;
+
+ /*
+ * 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 )
+ g_warning( "unable to parse game mode string `%s'", string );
+
+ /*
+ * Hopefully it worked, and if not, we still have the default values
+ */
+ fgState.GameModeSize.X = width;
+ fgState.GameModeSize.Y = height;
+ fgState.GameModeDepth = depth;
+ fgState.GameModeRefresh = refresh;
+}
+
+/*
+ * Enters the game mode
+ */
+int FGAPIENTRY glutEnterGameMode( void )
+{
+ /*
+ * Check if a game mode window already exists...
+ */
+ if( fgStructure.GameMode != NULL )
+ {
+ /*
+ * ...if so, delete it before proceeding...
+ */
+ fgDestroyWindow( fgStructure.GameMode, TRUE );
+ }
+ else
+ {
+ /*
+ * ...otherwise remember the current resolution, etc.
+ */
+ fghRememberState();
+ }
+
+ /*
+ * We are ready to change the current screen's resolution now
+ */
+ if( fghChangeDisplayMode( FALSE ) == FALSE )
+ {
+ g_warning( "failed to change screen settings" );
+ return( FALSE );
+ }
+
+ /*
+ * Finally, have the game mode window created
+ */
+ fgStructure.GameMode = fgCreateWindow(
+ NULL, "FREEGLUT", 0, 0, fgState.GameModeSize.X, fgState.GameModeSize.Y, TRUE
+ );
+
+#if TARGET_HOST_UNIX_X11
+
+ /*
+ * Move the mouse pointer over the game mode window
+ */
+ XSetInputFocus(
+ fgDisplay.Display,
+ fgStructure.GameMode->Window.Handle,
+ RevertToNone,
+ CurrentTime
+ );
+
+ /*
+ * Confine the mouse pointer to the window's client area
+ */
+ XGrabPointer(
+ fgDisplay.Display,
+ fgStructure.GameMode->Window.Handle,
+ TRUE,
+ ButtonPressMask|ButtonReleaseMask|ButtonMotionMask|PointerMotionMask,
+ GrabModeAsync, GrabModeAsync,
+ fgStructure.GameMode->Window.Handle,
+ None,
+ CurrentTime
+ );
+
+ /*
+ * Grab the keyboard, too
+ */
+ XGrabKeyboard(
+ fgDisplay.Display,
+ fgStructure.GameMode->Window.Handle,
+ FALSE,
+ GrabModeAsync, GrabModeAsync,
+ CurrentTime
+ );
+
+#endif
+
+ /*
+ * Return successfull
+ */
+ return( TRUE );
+}
+
+/*
+ * Leaves the game mode
+ */
+void FGAPIENTRY glutLeaveGameMode( void )
+{
+ freeglut_return_if_fail( fgStructure.GameMode != NULL );
+
+ /*
+ * First of all, have the game mode window created
+ */
+ fgDestroyWindow( fgStructure.GameMode, TRUE );
+
+#if TARGET_HOST_UNIX_X11
+
+ /*
+ * Ungrab the mouse and keyboard
+ */
+ XUngrabPointer( fgDisplay.Display, CurrentTime );
+ XUngrabKeyboard( fgDisplay.Display, CurrentTime );
+
+#endif
+
+ /*
+ * Then, have the desktop visual settings restored
+ */
+ fghRestoreState();
+}
+
+/*
+ * Returns information concerning the freeglut game mode
+ */
+int FGAPIENTRY glutGameModeGet( GLenum eWhat )
+{
+ /*
+ * See why are we bothered
+ */
+ switch( eWhat )
+ {
+ case GLUT_GAME_MODE_ACTIVE:
+ /*
+ * Check if the game mode is currently active
+ */
+ return( fgStructure.GameMode != NULL );
+
+ case GLUT_GAME_MODE_POSSIBLE:
+ /*
+ * Check if the current game mode settings are valid
+ */
+ return( fghChangeDisplayMode( TRUE ) );
+
+ case GLUT_GAME_MODE_WIDTH:
+ /*
+ * The game mode screen width
+ */
+ return( fgState.GameModeSize.X );
+
+ case GLUT_GAME_MODE_HEIGHT:
+ /*
+ * The game mode screen height
+ */
+ return( fgState.GameModeSize.Y );
+
+ case GLUT_GAME_MODE_PIXEL_DEPTH:
+ /*
+ * The game mode pixel depth
+ */
+ return( fgState.GameModeDepth );
+
+ case GLUT_GAME_MODE_REFRESH_RATE:
+ /*
+ * The 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.GameMode != NULL );
+ }
+}
+
+/*** 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "freeglut-geometry"
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/freeglut_internal.h"
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ *
+ * Following functions have been contributed by Andreas Umbach. I modified
+ * them a bit to make them use GLib (for memory allocation).
+ *
+ * glutWireCube() -- could add normal vectors so that lighting works
+ * glutSolidCube() -- OK
+ * glutWireSphere() -- OK
+ * glutSolidSphere() -- OK
+ *
+ * Following functions have been implemented by me:
+ *
+ * glutWireCone() -- looks OK
+ * glutSolidCone() -- normals are missing, there are holes in the thing
+ *
+ * Those functions need to be implemented, as nothing has been done yet.
+ * For now all of them draw a wire or solid cube, just to mark their presence.
+ *
+ * glutWireTorus() --
+ * glutSolidTorus() --
+ * glutWireDodecahedron() --
+ * glutSolidDodecahedron() --
+ * glutWireOctahedron() --
+ * glutSolidOctahedron() --
+ * glutWireTetrahedron() --
+ * glutSolidTetrahedron() --
+ * glutWireIcosahedron() --
+ * glutSolidIcosahedron() --
+ */
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Draws a wireframed cube. Code contributed by Andreas Umbach <marvin@dataway.ch>
+ */
+void FGAPIENTRY glutWireCube( GLdouble dSize )
+{
+ float size = (float) dSize * 0.5f;
+
+# define V(a,b,c) glVertex3f( a size, b size, c size );
+
+ /*
+ * PWO: I dared to convert the code to use macros...
+ */
+ glBegin( GL_LINE_LOOP ); V(-,-,+); V(+,-,+); V(+,+,+); V(-,+,+); glEnd();
+ glBegin( GL_LINE_LOOP ); V(-,-,-); V(-,+,-); V(+,+,-); V(+,-,-); glEnd();
+ glBegin( GL_LINES );
+ V(-,-,+); V(-,-,-); V(-,+,+); V(-,+,-);
+ V(+,-,+); V(+,-,-); V(+,+,+); V(+,+,-);
+ glEnd();
+
+# undef V
+}
+
+/*
+ * Draws a solid cube. Code contributed by Andreas Umbach <marvin@dataway.ch>
+ */
+void FGAPIENTRY glutSolidCube( GLdouble dSize )
+{
+ float size = (float) dSize * 0.5f;
+
+# define V(a,b,c) glVertex3f( a size, b size, c size );
+# define N(a,b,c) glNormal3f( a, b, c );
+
+ /*
+ * PWO: Again, I dared to convert the code to use macros...
+ */
+ glBegin( GL_QUADS );
+ N( 1, 0, 0); V(+,-,+); V(+,-,-); V(+,+,-); V(+,+,+);
+ N( 0, 1, 0); V(+,+,+); V(+,+,-); V(-,+,-); V(-,+,+);
+ N( 0, 0, 1); V(+,+,+); V(-,+,+); V(-,-,+); V(+,-,+);
+ N(-1, 0, 0); V(-,-,+); V(-,+,+); V(-,+,-); V(-,-,-);
+ N( 0,-1, 0); V(-,-,+); V(-,-,-); V(+,-,-); V(+,-,+);
+ N( 0, 0,-1); V(-,-,-); V(-,+,-); V(+,+,-); V(+,-,-);
+ glEnd();
+
+# undef V
+# undef N
+}
+
+/*
+ * Draws a wire sphere. Code contributed by Andreas Umbach <marvin@dataway.ch>
+ */
+void FGAPIENTRY glutWireSphere( GLdouble dRadius, GLint slices, GLint stacks )
+{
+ float radius = (float) dRadius, phi, psi, dpsi, dphi;
+ float* vertex;
+ gint i, j;
+
+ /*
+ * Allocate the vertices array
+ */
+ vertex = g_new0( float, 3 * slices * (stacks - 1) );
+
+ glPushMatrix();
+ glScalef( radius, radius, radius );
+
+ dpsi = M_PI / (stacks + 1);
+ dphi = 2 * M_PI / slices;
+ psi = dpsi;
+
+ for( j=0; j<stacks-1; j++ )
+ {
+ phi = 0;
+
+ for( i=0; i<slices; i++ )
+ {
+ *(vertex + 3 * j * slices + 3 * i + 0) = sin( phi ) * sin( psi );
+ *(vertex + 3 * j * slices + 3 * i + 1) = cos( phi ) * sin( psi );
+ *(vertex + 3 * j * slices + 3 * i + 2) = cos( psi );
+ phi += dphi;
+ glVertex3fv( vertex + 3 * j * slices + 3 * i );
+ }
+
+ psi += dpsi;
+ }
+
+ for( i=0; i<slices; i++ )
+ {
+ glBegin( GL_LINE_STRIP );
+ glNormal3f( 0, 0, 1 );
+ glVertex3f( 0, 0, 1 );
+
+ for( j=0; j<stacks - 1; j++ )
+ {
+ glNormal3fv( vertex + 3 * j * slices + 3 * i );
+ glVertex3fv( vertex + 3 * j * slices + 3 * i );
+ }
+
+ glNormal3f(0, 0, -1);
+ glVertex3f(0, 0, -1);
+ glEnd();
+ }
+
+ for( j=0; j<stacks-1; j++ )
+ {
+ glBegin(GL_LINE_LOOP);
+
+ for( i=0; i<slices; i++ )
+ {
+ glNormal3fv( vertex + 3 * j * slices + 3 * i );
+ glVertex3fv( vertex + 3 * j * slices + 3 * i );
+ }
+
+ glEnd();
+ }
+
+ g_free( vertex );
+ glPopMatrix();
+}
+
+/*
+ * Draws a solid sphere. Code contributed by Andreas Umbach <marvin@dataway.ch>
+ */
+void FGAPIENTRY glutSolidSphere( GLdouble dRadius, GLint slices, GLint stacks )
+{
+ float radius = (float) dRadius, phi, psi, dpsi, dphi;
+ float *next, *tmp, *row;
+ gint i, j;
+
+ glPushMatrix();
+ //glScalef( radius, radius, radius );
+
+ row = g_new0( float, slices * 3 );
+ next = g_new0( float, slices * 3 );
+
+ dpsi = M_PI / (stacks + 1);
+ dphi = 2 * M_PI / slices;
+ psi = dpsi;
+ phi = 0;
+
+ /* init first line + do polar cap */
+ glBegin( GL_TRIANGLE_FAN );
+ glNormal3f( 0, 0, 1 );
+ glVertex3f( 0, 0, radius );
+
+ for( i=0; i<slices; i++ )
+ {
+ row[ i * 3 + 0 ] = sin( phi ) * sin( psi );
+ row[ i * 3 + 1 ] = cos( phi ) * sin( psi );
+ row[ i * 3 + 2 ] = cos( psi );
+
+ glNormal3fv( row + 3 * i );
+ glVertex3f(
+ radius * *(row + 3 * i + 0),
+ radius * *(row + 3 * i + 1),
+ radius * *(row + 3 * i + 2)
+ );
+
+ phi += dphi;
+ }
+
+ glNormal3fv( row );
+ glVertex3f( radius * *(row + 0), radius * *(row + 1), radius * *(row + 2) );
+ glEnd();
+
+ for( j=0; j<stacks-1; j++ )
+ {
+ phi = 0;
+ psi += dpsi;
+
+ /* get coords */
+ glBegin( GL_QUAD_STRIP );
+
+ /* glBegin(GL_LINE_LOOP); */
+ for( i=0; i<slices; i++ )
+ {
+ next[ i * 3 + 0 ] = sin( phi ) * sin( psi );
+ next[ i * 3 + 1 ] = cos( phi ) * sin( psi );
+ next[ i * 3 + 2 ] = cos( psi );
+
+ glNormal3fv( row + i * 3 );
+ glVertex3f(
+ radius * *(row + 3 * i + 0),
+ radius * *(row + 3 * i + 1),
+ radius * *(row + 3 * i + 2)
+ );
+
+ glNormal3fv( next + i * 3 );
+ glVertex3f(
+ radius * *(next + 3 * i + 0),
+ radius * *(next + 3 * i + 1),
+ radius * *(next + 3 * i + 2)
+ );
+
+ phi += dphi;
+ }
+
+ glNormal3fv( row );
+ glVertex3f( radius * *(row + 0), radius * *(row + 1), radius * *(row + 2) );
+ glNormal3fv( next );
+ glVertex3f( radius * *(next + 0), radius * *(next + 1), radius * *(next + 2) );
+ glEnd();
+
+ tmp = row;
+ row = next;
+ next = tmp;
+ }
+
+ /* south pole */
+ glBegin( GL_TRIANGLE_FAN );
+ glNormal3f( 0, 0, -1 );
+ glVertex3f( 0, 0, -radius );
+ glNormal3fv( row );
+ glVertex3f( radius * *(row + 0), radius * *(row + 1), radius * *(row + 2) );
+
+ for( i=slices-1; i>=0; i-- )
+ {
+ glNormal3fv(row + 3 * i);
+ glVertex3f(
+ radius * *(row + 3 * i + 0),
+ radius * *(row + 3 * i + 1),
+ radius * *(row + 3 * i + 2)
+ );
+ }
+
+ glEnd();
+
+ g_free(row);
+ g_free(next);
+ glPopMatrix();
+}
+
+/*
+ * Draws a wire cone
+ */
+void FGAPIENTRY glutWireCone( GLdouble base, GLdouble height, GLint slices, GLint stacks )
+{
+ float alt = (float) height / (float) (stacks + 1);
+ float angle = (float) M_PI / (float) slices * 2.0f;
+ float slope = (float) tan( height / base );
+ float* vertices = NULL;
+ gint i, j;
+
+ /*
+ * We need 'slices' points on a circle
+ */
+ vertices = g_new0( float, 2 * (slices + 1) );
+
+ for( i=0; i<slices+1; i++ )
+ {
+ vertices[ i*2 + 0 ] = cos( angle * i );
+ vertices[ i*2 + 1 ] = sin( angle * i );
+ }
+
+ /*
+ * First the cone's bottom...
+ */
+ for( i=0; i<slices; i++ )
+ {
+ float scl = height / slope;
+
+ glBegin( GL_LINE_LOOP );
+ glNormal3f( 0, 0, -1 );
+ glVertex3f( vertices[ (i+0)*2+0 ] * scl, vertices[ (i+0)*2+1 ] * scl, 0 );
+ glVertex3f( vertices[ (i+1)*2+0 ] * scl, vertices[ (i+1)*2+1 ] * scl, 0 );
+ glVertex3f( 0, 0, 0 );
+ glEnd();
+ }
+
+ /*
+ * Then all the stacks between the bottom and the top
+ *
+ * ekhm jak wektor normalny z trojkata?
+ */
+ for( i=0; i<stacks; i++ )
+ {
+ float alt_a = i * alt, alt_b = (i + 1) * alt;
+ float scl_a = (height - alt_a) / slope;
+ float scl_b = (height - alt_b) / slope;
+
+ for( j=0; j<slices; j++ )
+ {
+ glBegin( GL_LINE_LOOP );
+ glVertex3f( vertices[(j+0)*2+0] * scl_a, vertices[(j+0)*2+1] * scl_a, alt_a );
+ glVertex3f( vertices[(j+1)*2+0] * scl_a, vertices[(j+1)*2+1] * scl_a, alt_a );
+ glVertex3f( vertices[(j+0)*2+0] * scl_b, vertices[(j+0)*2+1] * scl_b, alt_b );
+ glEnd();
+
+ glBegin( GL_LINE_LOOP );
+ glVertex3f( vertices[(j+0)*2+0] * scl_b, vertices[(j+0)*2+1] * scl_b, alt_b );
+ glVertex3f( vertices[(j+1)*2+0] * scl_b, vertices[(j+1)*2+1] * scl_b, alt_b );
+ glVertex3f( vertices[(j+1)*2+0] * scl_a, vertices[(j+1)*2+1] * scl_a, alt_a );
+ glEnd();
+ }
+ }
+
+ /*
+ * Finally have the top part drawn...
+ */
+ for( i=0; i<slices; i++ )
+ {
+ float scl = alt / slope;
+
+ glBegin( GL_LINE_LOOP );
+ glVertex3f( vertices[ (i+0)*2+0 ] * scl, vertices[ (i+0)*2+1 ] * scl, height - alt );
+ glVertex3f( vertices[ (i+1)*2+0 ] * scl, vertices[ (i+1)*2+1 ] * scl, height - alt );
+ glVertex3f( 0, 0, height );
+ glEnd();
+ }
+}
+
+/*
+ * Draws a solid cone
+ */
+void FGAPIENTRY glutSolidCone( GLdouble base, GLdouble height, GLint slices, GLint stacks )
+{
+ float alt = (float) height / (float) (stacks + 1);
+ float angle = (float) M_PI / (float) slices * 2.0f;
+ float slope = (float) tan( height / base );
+ float* vertices = NULL;
+ gint i, j;
+
+ /*
+ * We need 'slices' points on a circle
+ */
+ vertices = g_new0( float, 2 * (slices + 1) );
+
+ for( i=0; i<slices+1; i++ )
+ {
+ vertices[ i*2 + 0 ] = cos( angle * i );
+ vertices[ i*2 + 1 ] = sin( angle * i );
+ }
+
+ /*
+ * First the cone's bottom...
+ */
+ for( i=0; i<slices; i++ )
+ {
+ float scl = height / slope;
+
+ glBegin( GL_TRIANGLES );
+ glNormal3f( 0, 0, -1 );
+ glVertex3f( vertices[ (i+0)*2+0 ] * scl, vertices[ (i+0)*2+1 ] * scl, 0 );
+ glVertex3f( vertices[ (i+1)*2+0 ] * scl, vertices[ (i+1)*2+1 ] * scl, 0 );
+ glVertex3f( 0, 0, 0 );
+ glEnd();
+ }
+
+ /*
+ * Then all the stacks between the bottom and the top
+ *
+ * ekhm jak wektor normalny z trojkata?
+ */
+ for( i=0; i<stacks; i++ )
+ {
+ float alt_a = i * alt, alt_b = (i + 1) * alt;
+ float scl_a = (height - alt_a) / slope;
+ float scl_b = (height - alt_b) / slope;
+
+ for( j=0; j<slices; j++ )
+ {
+ glBegin( GL_TRIANGLES );
+ glVertex3f( vertices[(j+0)*2+0] * scl_a, vertices[(j+0)*2+1] * scl_a, alt_a );
+ glVertex3f( vertices[(j+1)*2+0] * scl_a, vertices[(j+1)*2+1] * scl_a, alt_a );
+ glVertex3f( vertices[(j+0)*2+0] * scl_b, vertices[(j+0)*2+1] * scl_b, alt_b );
+ glEnd();
+
+ glBegin( GL_TRIANGLES );
+ glVertex3f( vertices[(j+1)*2+0] * scl_a, vertices[(j+1)*2+1] * scl_a, alt_a );
+ glVertex3f( vertices[(j+1)*2+0] * scl_b, vertices[(j+1)*2+1] * scl_b, alt_b );
+ glVertex3f( vertices[(j+0)*2+0] * scl_b, vertices[(j+0)*2+1] * scl_b, alt_b );
+ glEnd();
+ }
+ }
+
+ /*
+ * Finally have the top part drawn...
+ */
+ for( i=0; i<slices; i++ )
+ {
+ float scl = alt / slope;
+
+ glBegin( GL_TRIANGLES );
+ glVertex3f( vertices[ (i+0)*2+0 ] * scl, vertices[ (i+0)*2+1 ] * scl, height - alt );
+ glVertex3f( vertices[ (i+1)*2+0 ] * scl, vertices[ (i+1)*2+1 ] * scl, height - alt );
+ glVertex3f( 0, 0, height );
+ glEnd();
+ }
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutWireTorus( GLdouble dInnerRadius, GLdouble dOuterRadius, GLint nSides, GLint nRings )
+{
+ glutWireSphere( dOuterRadius, 5, 5 );
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutSolidTorus( GLdouble dInnerRadius, GLdouble dOuterRadius, GLint nSides, GLint nRings )
+{
+ glutSolidSphere( dOuterRadius, 5, 5 );
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutWireDodecahedron( void )
+{
+ glutWireSphere( 1.0, 5, 5 );
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutSolidDodecahedron( void )
+{
+ glutSolidSphere( 1.0, 5, 5 );
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutWireOctahedron( void )
+{
+ glutWireSphere( 1.0, 5, 5 );
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutSolidOctahedron( void )
+{
+ glutSolidSphere( 1.0, 5, 5 );
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutWireTetrahedron( void )
+{
+ glutWireSphere( 1.0, 5, 5 );
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutSolidTetrahedron( void )
+{
+ glutSolidSphere( 1.0, 5, 5 );
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutWireIcosahedron( void )
+{
+ glutWireSphere( 1.0, 5, 5 );
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutSolidIcosahedron( void )
+{
+ glutSolidSphere( 1.0, 5, 5 );
+}
+
+/*** END OF FILE ***/
--- /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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "freeglut-init"
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/freeglut_internal.h"
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ *
+ * fgDeinitialize() -- Win32's OK, X11 needs the OS-specific deinitialization done
+ * glutInitDisplayString() -- display mode string parsing
+ *
+ * Wouldn't it be cool to use gettext() for error messages? I just love bash saying
+ * "nie znaleziono pliku" instead of "file not found" :) Is gettext easily portable?
+ */
+
+/* -- GLOBAL VARIABLES ----------------------------------------------------- */
+
+/*
+ * A structure pointed by g_pDisplay holds all information
+ * regarding the display, screen, root window etc.
+ */
+SFG_Display fgDisplay;
+
+/*
+ * The settings for the current freeglut session
+ */
+SFG_State fgState;
+
+
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
+
+/*
+ * A call to this function should initialize all the display stuff...
+ */
+void fgInitialize( const gchar* displayName )
+{
+#if TARGET_HOST_UNIX_X11
+ /*
+ * Have the display created
+ */
+ fgDisplay.Display = XOpenDisplay( displayName );
+
+ if( fgDisplay.Display == NULL )
+ {
+ /*
+ * Failed to open a display. That's no good.
+ */
+ g_error( "failed to open display '%s'", XDisplayName( displayName ) );
+ }
+
+ /*
+ * Check for the OpenGL GLX extension availability:
+ */
+ if( !glXQueryExtension( fgDisplay.Display, NULL, NULL ) )
+ {
+ /*
+ * GLX extensions have not been found...
+ */
+ g_error( "OpenGL GLX extension not supported by display '%s'", XDisplayName( displayName ) );
+ }
+
+ /*
+ * Grab the default screen for the display we have just opened
+ */
+ fgDisplay.Screen = DefaultScreen( fgDisplay.Display );
+
+ /*
+ * The same applying to the root window
+ */
+ fgDisplay.RootWindow = RootWindow(
+ fgDisplay.Display,
+ fgDisplay.Screen
+ );
+
+ /*
+ * Grab the logical screen's geometry
+ */
+ fgDisplay.ScreenWidth = DisplayWidth(
+ fgDisplay.Display,
+ fgDisplay.Screen
+ );
+
+ fgDisplay.ScreenHeight = DisplayHeight(
+ fgDisplay.Display,
+ fgDisplay.Screen
+ );
+
+ /*
+ * Grab the physical screen's geometry
+ */
+ fgDisplay.ScreenWidthMM = DisplayWidthMM(
+ fgDisplay.Display,
+ fgDisplay.Screen
+ );
+
+ fgDisplay.ScreenHeightMM = DisplayHeightMM(
+ fgDisplay.Display,
+ fgDisplay.Screen
+ );
+
+ /*
+ * The display's connection number
+ */
+ fgDisplay.Connection = ConnectionNumber( fgDisplay.Display );
+
+ /*
+ * Create the window deletion atom
+ */
+ fgDisplay.DeleteWindow = XInternAtom(
+ fgDisplay.Display,
+ "WM_DELETE_WINDOW",
+ FALSE
+ );
+
+#elif TARGET_HOST_WIN32
+
+ WNDCLASS wc;
+ ATOM atom;
+
+ /*
+ * What we need to do is to initialize the fgDisplay global structure here...
+ */
+ fgDisplay.Instance = GetModuleHandle( NULL );
+
+ /*
+ * Check if the freeglut window class has been registered before...
+ */
+ atom = GetClassInfo( fgDisplay.Instance, "FREEGLUT", &wc );
+
+ /*
+ * ...nope, it has not, and we have to do it right now:
+ */
+ if( atom == 0 )
+ {
+ gboolean retval;
+
+ /*
+ * Make sure the unitialized fields are reset to zero
+ */
+ ZeroMemory( &wc, sizeof(WNDCLASS) );
+
+ /*
+ * Each of the windows should have it's own device context...
+ */
+ wc.style = CS_OWNDC;
+ wc.lpfnWndProc = fgWindowProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 0;
+ wc.hInstance = fgDisplay.Instance;
+ wc.hIcon = LoadIcon( NULL, IDI_WINLOGO );
+ wc.hCursor = LoadCursor( NULL, IDC_ARROW );
+ wc.hbrBackground = NULL;
+ wc.lpszMenuName = NULL;
+ wc.lpszClassName = "FREEGLUT";
+
+ /*
+ * Register the window class
+ */
+ retval = RegisterClass( &wc );
+ g_assert( retval != FALSE );
+ }
+
+ /*
+ * The screen dimensions can be obtained via GetSystemMetrics() calls
+ */
+ fgDisplay.ScreenWidth = GetSystemMetrics( SM_CXSCREEN );
+ fgDisplay.ScreenHeight = GetSystemMetrics( SM_CYSCREEN );
+
+ {
+ /*
+ * Checking the display's size in millimeters isn't too hard, too:
+ */
+ HWND desktop = GetDesktopWindow();
+ HDC context = GetDC( desktop );
+
+ /*
+ * Grab the appropriate values now (HORZSIZE and VERTSIZE respectably):
+ */
+ fgDisplay.ScreenWidthMM = GetDeviceCaps( context, HORZSIZE );
+ fgDisplay.ScreenHeightMM = GetDeviceCaps( context, VERTSIZE );
+
+ /*
+ * Whoops, forgot to release the device context :)
+ */
+ ReleaseDC( desktop, context );
+ }
+
+#endif
+
+ /*
+ * Have the joystick device initialized now
+ */
+ fgJoystickInit( 0 );
+}
+
+/*
+ * Perform the freeglut deinitialization...
+ */
+void fgDeinitialize( void )
+{
+ gint i;
+
+ /*
+ * Check if initialization has been performed before
+ */
+ if( fgState.Timer == NULL )
+ {
+ g_warning( "fgDeinitialize(): fgState.Timer is null => no valid initialization has been performed" );
+ return;
+ }
+
+ /*
+ * Perform the freeglut structure deinitialization
+ */
+ fgDestroyStructure();
+
+ /*
+ * Delete all the timers and their storage list
+ */
+ for( i=0; i<(gint) g_list_length( fgState.Timers ); i++ )
+ g_free( g_list_nth( fgState.Timers, i )->data );
+
+ g_list_free( fgState.Timers );
+ fgState.Timers = NULL;
+
+ /*
+ * Destroy the timer itself
+ */
+ g_timer_stop( fgState.Timer );
+ g_timer_destroy( fgState.Timer );
+ fgState.Timer = NULL;
+
+ /*
+ * Deinitialize the joystick device
+ */
+ fgJoystickClose();
+
+#if TARGET_HOST_UNIX_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 );
+
+#endif
+}
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Perform initialization. This usually happens on the program startup
+ * and restarting after glutMainLoop termination...
+ */
+void FGAPIENTRY glutInit( int* pargc, char** argv )
+{
+ gchar* geometrySettings = NULL;
+ gchar* displayName = NULL;
+ gint i, j, argc = *pargc;
+
+ /*
+ * Do not allow multiple initialization of the library
+ */
+ if( fgState.Timer != NULL )
+ {
+ /*
+ * We can't have multiple initialization performed
+ */
+ g_error( "illegal glutInit() reinitialization attemp" );
+ }
+
+ /*
+ * Have the internal freeglut structure initialized now
+ */
+ fgCreateStructure();
+
+ /*
+ * Fill in the default values that have not been passed in yet.
+ */
+ if( fgState.Position.Use == FALSE )
+ {
+ fgState.Position.X = -1;
+ fgState.Position.Y = -1;
+ }
+
+ if( fgState.Size.Use == FALSE )
+ {
+ fgState.Size.X = 300;
+ fgState.Size.Y = 300;
+ fgState.Size.Use = TRUE;
+ }
+
+ /*
+ * Some more settings to come
+ */
+ fgState.ForceDirectContext = FALSE;
+ fgState.TryDirectContext = TRUE;
+ fgState.ForceIconic = FALSE;
+ fgState.GLDebugSwitch = FALSE;
+ fgState.XSyncSwitch = FALSE;
+
+ /*
+ * Assume we want to ignore the automatic key repeat
+ */
+ fgState.IgnoreKeyRepeat = TRUE;
+
+ /*
+ * The default display mode to be used
+ */
+ fgState.DisplayMode = GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH;
+
+ /*
+ * Set the default game mode settings
+ */
+ fgState.GameModeSize.X = 640;
+ fgState.GameModeSize.Y = 480;
+ fgState.GameModeDepth = 16;
+ fgState.GameModeRefresh = 72;
+
+ /*
+ * Remember the function's call time
+ */
+ fgState.Timer = g_timer_new();
+ g_timer_start( fgState.Timer );
+
+ /*
+ * Grab the environment variable indicating the X display to use.
+ * This is harmless under Win32, so let's let it stay here...
+ */
+ displayName = (gchar *) strdup( (gchar *) g_getenv( "DISPLAY" ) );
+
+ /*
+ * Have the program arguments parsed.
+ */
+ for( i=1; i<argc; i++ )
+ {
+ /*
+ * The X display name settings
+ */
+ if( strcmp( argv[ i ], "-display" ) == 0 )
+ {
+ /*
+ * Check for possible lack of the next argument
+ */
+ if( ++i >= argc )
+ g_error( "-display parameter must be followed by display name" );
+
+ /*
+ * Release the previous display name (the one from app's environment)
+ */
+ g_free( displayName );
+
+ /*
+ * Make a working copy of the name for us to use
+ */
+ displayName = strdup( argv[ i ] );
+
+ /*
+ * Have both arguments removed
+ */
+ argv[ i - 1 ] = NULL;
+ argv[ i ] = NULL;
+ (* pargc) -= 2;
+ }
+
+ /*
+ * The geometry settings
+ */
+ else if( strcmp( argv[ i ], "-geometry" ) == 0 )
+ {
+ /*
+ * Again, check if there is at least one more argument
+ */
+ if( ++i >= argc )
+ g_error( "-geometry parameter must be followed by window geometry settings" );
+
+ /*
+ * Otherwise make a duplicate of the geometry settings...
+ */
+ geometrySettings = strdup( argv[ i ] );
+
+ /*
+ * Have both arguments removed
+ */
+ argv[ i - 1 ] = NULL;
+ argv[ i ] = NULL;
+ (* pargc) -= 2;
+ }
+
+ /*
+ * The direct/indirect OpenGL contexts settings
+ */
+ else if( strcmp( argv[ i ], "-direct" ) == 0)
+ {
+ /*
+ * We try to force direct rendering...
+ */
+ if( fgState.TryDirectContext == FALSE )
+ g_error( "parameters ambiguity, -direct and -indirect cannot be both specified" );
+
+ fgState.ForceDirectContext = TRUE;
+ argv[ i ] = NULL;
+ (* pargc)--;
+ }
+ else if( strcmp( argv[ i ], "-indirect" ) == 0 )
+ {
+ /*
+ * We try to force indirect rendering...
+ */
+ if( fgState.ForceDirectContext == TRUE )
+ g_error( "parameters ambiguity, -direct and -indirect cannot be both specified" );
+
+ fgState.TryDirectContext = FALSE;
+ argv[ i ] = NULL;
+ (* pargc)--;
+ }
+
+ /*
+ * The '-iconic' parameter makes all new top-level
+ * windows created in iconified state...
+ */
+ else if( strcmp( argv[ i ], "-iconic" ) == 0 )
+ {
+ fgState.ForceIconic = TRUE;
+ argv[ i ] = NULL;
+ (* pargc)--;
+ }
+
+ /*
+ * The '-gldebug' option activates some OpenGL state debugging features
+ */
+ else if( strcmp( argv[ i ], "-gldebug" ) == 0 )
+ {
+ fgState.GLDebugSwitch = TRUE;
+ argv[ i ] = NULL;
+ (* pargc)--;
+ }
+
+ /*
+ * The '-sync' option activates X protocol synchronization (for debugging purposes)
+ */
+ else if( strcmp( argv[ i ], "-sync" ) == 0 )
+ {
+ fgState.XSyncSwitch = TRUE;
+ argv[ i ] = NULL;
+ (* pargc)--;
+ }
+ }
+
+ /*
+ * Have the arguments list compacted now
+ */
+ for( i=1; i<argc; i++ )
+ {
+ if( argv[ i ] == NULL )
+ {
+ for( j=i; j<argc; j++ )
+ {
+ if( argv[ j ] != NULL )
+ {
+ argv[ i ] = argv[ j ];
+ argv[ j ] = NULL;
+ }
+ }
+ }
+ }
+
+ /*
+ * Have the display created now. As I am too lazy to implement
+ * the program arguments parsing, we will have the DISPLAY
+ * environment variable used for opening the X display:
+ */
+ fgInitialize( displayName );
+
+#if TARGET_HOST_UNIX_X11
+ /*
+ * We can process the default window geometry settings safely now
+ *
+ * WARNING: have this rewritten to be portable. That won't be hard.
+ */
+ if( geometrySettings != NULL )
+ {
+ gint result, x, y, w, h;
+
+ /*
+ * Have the settings parsed now. This is easy.
+ * We will use the XParseGeometry function.
+ */
+ result = XParseGeometry( geometrySettings, &x, &y, (guint *) &w, (guint *) &h );
+
+ /*
+ * Check what we have been supplied with...
+ */
+ if( (result & WidthValue) && (w >= 0) )
+ fgState.Size.X = w;
+
+ if( (result & HeightValue) && (h >= 0) )
+ fgState.Size.Y = h;
+
+ if( result & XValue )
+ if( result & XNegative )
+ fgState.Position.X = fgDisplay.ScreenWidth + x - fgState.Size.X;
+ else
+ fgState.Position.X = x;
+
+ if( result & YValue )
+ if( result & YNegative )
+ fgState.Position.Y = fgDisplay.ScreenHeight + y - fgState.Size.Y;
+ else
+ fgState.Position.Y = y;
+
+ /*
+ * Free the geometry settings string
+ */
+ g_free( geometrySettings );
+ }
+#endif
+
+ /*
+ * Check for the minus one settings for both position and size...
+ */
+ if( fgState.Position.X < 0 || fgState.Position.Y < 0 )
+ fgState.Position.Use = FALSE;
+
+ if( fgState.Size.X < 0 || fgState.Size.Y < 0 )
+ fgState.Size.Use = FALSE;
+
+ /*
+ * Do not forget about releasing the display name string
+ */
+ g_free( displayName );
+}
+
+/*
+ * Sets the default initial window position for new windows
+ */
+void FGAPIENTRY glutInitWindowPosition( int x, int y )
+{
+ /*
+ * The settings can be disables when both coordinates are negative
+ */
+ if( (x >= 0) && (y >= 0) )
+ {
+ /*
+ * We want to specify the initial position of each of the windows
+ */
+ fgState.Position.X = x;
+ fgState.Position.Y = y;
+ fgState.Position.Use = TRUE;
+ }
+ else
+ {
+ /*
+ * The initial position of each of the windows is specified by the wm
+ */
+ fgState.Position.X = -1;
+ fgState.Position.Y = -1;
+ fgState.Position.Use = FALSE;
+ }
+}
+
+/*
+ * Sets the default initial window size for new windows
+ */
+void FGAPIENTRY glutInitWindowSize( int width, int height )
+{
+ /*
+ * The settings can be disables when both values are negative
+ */
+ if( (width >= 0) && (height >= 0) )
+ {
+ /*
+ * We want to specify the initial size of each of the windows
+ */
+ fgState.Size.X = width;
+ fgState.Size.Y = height;
+ fgState.Size.Use = TRUE;
+ }
+ else
+ {
+ /*
+ * The initial size of each of the windows is specified by the wm
+ */
+ fgState.Size.X = -1;
+ fgState.Size.Y = -1;
+ fgState.Size.Use = FALSE;
+ }
+}
+
+/*
+ * Sets the default display mode for all new windows
+ */
+void FGAPIENTRY glutInitDisplayMode( int displayMode )
+{
+ /*
+ * We will make use of this value when creating a new OpenGL context...
+ */
+ fgState.DisplayMode = displayMode;
+}
+
+
+/* -- INIT DISPLAY STRING PARSING ------------------------------------------ */
+
+/*
+ * There is a discrete number of comparison operators we can encounter:
+ *
+ * comparison ::= "=" | "!=" | "<" | ">" | "<=" | ">=" | "~"
+ */
+#define FG_NONE 0x0000
+#define FG_EQUAL 0x0001
+#define FG_NOT_EQUAL 0x0002
+#define FG_LESS 0x0003
+#define FG_MORE 0x0004
+#define FG_LESS_OR_EQUAL 0x0005
+#define FG_MORE_OR_EQUAL 0x0006
+#define FG_CLOSEST 0x0007
+
+/*
+ * The caller can feed us with a number of capability tokens:
+ *
+ * capability ::= "alpha" | "acca" | "acc" | "blue" | "buffer" | "conformant" | "depth" | "double" |
+ * "green" | "index" | "num" | "red" | "rgba" | "rgb" | "luminance" | "stencil" |
+ * "single" | "stereo" | "samples" | "slow" | "win32pdf" | "xvisual" | "xstaticgray" |
+ * "xgrayscale" | "xstaticcolor" | "xpseudocolor" | "xtruecolor" | "xdirectcolor"
+ */
+static gchar* g_Tokens[] =
+{
+ "none", "alpha", "acca", "acc", "blue", "buffer", "conformant", "depth", "double", "green",
+ "index", "num", "red", "rgba", "rgb", "luminance", "stencil", "single", "stereo", "samples",
+ "slow", "win32pdf", "xvisual", "xstaticgray", "xgrayscale", "xstaticcolor", "xpseudocolor",
+ "xtruecolor", "xdirectcolor", NULL
+};
+
+/*
+ * The structure to hold the parsed display string tokens
+ */
+typedef struct tagSFG_Capability SFG_Capability;
+struct tagSFG_Capability
+{
+ gint capability; /* the capability token enumerator */
+ gint comparison; /* the comparison operator used */
+ gint value; /* the value we're comparing to */
+};
+
+/*
+ * The scanner configuration for the init display string
+ */
+static GScannerConfig fgInitDisplayStringScannerConfig =
+{
+ ( " \t\r\n" ) /* cset_skip_characters */,
+ (
+ G_CSET_a_2_z
+ "_"
+ G_CSET_A_2_Z
+ ) /* cset_identifier_first */,
+ (
+ G_CSET_a_2_z
+ "_0123456789"
+ G_CSET_A_2_Z
+ G_CSET_LATINS
+ G_CSET_LATINC
+ "<>!=~"
+ ) /* cset_identifier_nth */,
+ ( "#\n" ) /* cpair_comment_single */,
+ FALSE /* case_sensitive */,
+ TRUE /* skip_comment_multi */,
+ TRUE /* skip_comment_single */,
+ TRUE /* scan_comment_multi */,
+ TRUE /* scan_identifier */,
+ FALSE /* scan_identifier_1char */,
+ FALSE /* scan_identifier_NULL */,
+ TRUE /* scan_symbols */,
+ FALSE /* scan_binary */,
+ TRUE /* scan_octal */,
+ TRUE /* scan_float */,
+ TRUE /* scan_hex */,
+ FALSE /* scan_hex_dollar */,
+ TRUE /* scan_string_sq */,
+ TRUE /* scan_string_dq */,
+ TRUE /* numbers_2_int */,
+ FALSE /* int_2_float */,
+ FALSE /* identifier_2_string */,
+ TRUE /* char_2_token */,
+ FALSE /* symbol_2_token */,
+ FALSE /* scope_0_fallback */,
+};
+
+/*
+ * Sets the default display mode for all new windows using a string
+ */
+void FGAPIENTRY glutInitDisplayString( char* displayMode )
+{
+ /*
+ * display_string ::= (switch)
+ * switch ::= capability [comparison value]
+ * comparison ::= "=" | "!=" | "<" | ">" | "<=" | ">=" | "~"
+ * capability ::= "alpha" | "acca" | "acc" | "blue" | "buffer" | "conformant" |
+ * "depth" | "double" | "green" | "index" | "num" | "red" | "rgba" |
+ * "rgb" | "luminance" | "stencil" | "single" | "stereo" |
+ * "samples" | "slow" | "win32pdf" | "xvisual" | "xstaticgray" |
+ * "xgrayscale" | "xstaticcolor" | "xpseudocolor" |
+ * "xtruecolor" | "xdirectcolor"
+ * value ::= 0..9 [value]
+ *
+ * The display string grammar. This should be EBNF, but I couldn't find the definitions so, to
+ * clarify: (expr) means 0 or more times the expression, [expr] means 0 or 1 times expr.
+ *
+ * Create a new GLib lexical analyzer to process the display mode string
+ */
+ GScanner* scanner = g_scanner_new( &fgInitDisplayStringScannerConfig );
+ GList* caps = NULL;
+ gint i;
+
+ /*
+ * Fail if the display mode string is empty or the scanner failed to initialize
+ */
+ freeglut_return_if_fail( (scanner != NULL) && (strlen( displayMode ) > 0) );
+
+ /*
+ * Set the scanner's input name (for debugging)
+ */
+ scanner->input_name = "glutInitDisplayString";
+
+ /*
+ * Start the lexical analysis of the extensions string
+ */
+ g_scanner_input_text( scanner, displayMode, strlen( displayMode ) );
+
+ /*
+ * While there are any more tokens to be checked...
+ */
+ while( !g_scanner_eof( scanner ) )
+ {
+ /*
+ * Actually we're expecting only string tokens
+ */
+ GTokenType tokenType = g_scanner_get_next_token( scanner );
+
+ /*
+ * We are looking for identifiers
+ */
+ if( tokenType == G_TOKEN_IDENTIFIER )
+ {
+ gchar* capability = NULL; /* the capability identifier string (always present) */
+ gint capID = 0; /* the capability identifier value (from g_Tokens) */
+ gint comparison = 0; /* the comparison operator value, see definitions */
+ gchar* valueString = NULL; /* if the previous one is present, this is needed */
+ gint value = 0; /* the integer value converted using a strtol call */
+ SFG_Capability* capStruct; /* the capability description structure */
+
+ /*
+ * OK. The general rule of thumb that we always should be getting a capability identifier
+ * string (see the grammar description). If it is followed by a comparison identifier, then
+ * there must follow an integer value we're comparing the capability to...
+ *
+ * Have the current token analyzed with that in mind...
+ */
+ for( i=0; i<(gint) strlen( scanner->value.v_identifier ); i++ )
+ {
+ gchar c = scanner->value.v_identifier[ i ];
+
+ if( (c == '=') || (c == '!') || (c == '<') || (c == '>') || (c == '~') )
+ break;
+ }
+
+ /*
+ * Here we go with the length of the capability identifier string.
+ * In the worst of cases, it is as long as the token identifier.
+ */
+ capability = g_strndup( scanner->value.v_identifier, i );
+
+ /*
+ * OK. Is there a chance for comparison and value identifiers to follow?
+ * Note: checking against i+1 as this handles two cases: single character
+ * comparison operator and first of value's digits, which must always be
+ * there, or the two-character comparison operators.
+ */
+ if( (i + 1) < (gint) strlen( scanner->value.v_identifier ) )
+ {
+ /*
+ * Yeah, indeed, it is the i-th character to start the identifier, then.
+ */
+ gchar c1 = scanner->value.v_identifier[ i + 0 ];
+ gchar c2 = scanner->value.v_identifier[ i + 1 ];
+
+ if( (c1 == '=') ) { i += 1; comparison = FG_EQUAL; } else
+ if( (c1 == '!') && (c2 == '=') ) { i += 2; comparison = FG_NOT_EQUAL; } else
+ if( (c1 == '<') && (c2 == '=') ) { i += 2; comparison = FG_LESS_OR_EQUAL; } else
+ if( (c1 == '>') && (c2 == '=') ) { i += 2; comparison = FG_MORE_OR_EQUAL; } else
+ if( (c1 == '<') ) { i += 1; comparison = FG_LESS; } else
+ if( (c1 == '>') ) { i += 1; comparison = FG_MORE; } else
+ if( (c1 == '~') ) { i += 1; comparison = FG_CLOSEST; } else
+ g_warning( "invalid comparison operator in token `%s'", scanner->value.v_identifier );
+ }
+
+ /*
+ * Grab the value string that must follow the comparison operator...
+ */
+ if( comparison != FG_NONE && i < (gint) strlen( scanner->value.v_identifier ) )
+ valueString = g_strdup( scanner->value.v_identifier + i );
+
+ /*
+ * If there was a value string, convert it to integer...
+ */
+ if( comparison != FG_NONE && strlen( valueString ) > 0 )
+ value = strtol( valueString, NULL, 0 );
+
+ /*
+ * Now we need to match the capability string and it's ID
+ */
+ for( i=0; g_Tokens[ i ]!=NULL; i++ )
+ {
+ if( strcmp( capability, g_Tokens[ i ] ) == 0 )
+ {
+ /*
+ * Looks like we've found the one we were looking for
+ */
+ capID = i;
+ break;
+ }
+ }
+
+ /*
+ * Create a new capability description structure
+ */
+ capStruct = g_new0( SFG_Capability, 1 );
+
+ /*
+ * Fill in the cap's values, as we have parsed it:
+ */
+ capStruct->capability = capID;
+ capStruct->comparison = comparison;
+ capStruct->value = value;
+
+ /*
+ * Add the new capabaility to the caps list
+ */
+ caps = g_list_append( caps, capStruct );
+
+ /*
+ * Clean up the local mess and keep rolling on
+ */
+ g_free( valueString );
+ g_free( capability );
+ }
+ }
+
+ /*
+ * Now that we have converted the string into somewhat more machine-friendly
+ * form, proceed with matching the frame buffer configuration...
+ *
+ * The caps list could be passed to a function that would try finding the closest
+ * matching pixel format, visual, frame buffer configuration or whatever. It would
+ * be good to convert the glutInitDisplayMode() to use the same method.
+ */
+#if 0
+ g_message( "found %i capability preferences", g_list_length( caps ) );
+
+ g_message( "token `%s': cap: %i, com: %i, val: %i",
+ scanner->value.v_identifier,
+ capStruct->capability,
+ capStruct->comparison,
+ capStruct->value
+ );
+#endif
+
+ /*
+ * Free the capabilities we have parsed
+ */
+ for( i=0; i<(gint) g_list_length( caps ); i++ )
+ g_free( g_list_nth( caps, i )->data );
+
+ /*
+ * Destroy the capabilities list itself
+ */
+ g_list_free( caps );
+
+ /*
+ * Free the lexical scanner now...
+ */
+ g_scanner_destroy( scanner );
+}
+
+/*** 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>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 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.
+ */
+
+/*
+ * PWO: this is not exactly what Steve Baker has done for PLIB, as I had to convert
+ * it from C++ to C. And I've also reformatted it a bit (that's my little
+ * personal deviation :]) I don't really know if it is still portable...
+ * Steve: could you please add some comments to the code? :)
+ *
+ * FreeBSD port - courtesy of Stephen Montgomery-Smith <stephen@math.missouri.edu>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "freeglut-joystick"
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/freeglut_internal.h"
+
+/*
+ * PWO: I don't like it at all. It's a mess. Could it be cleared?
+ */
+#ifdef WIN32
+# include <windows.h>
+# if defined( __CYGWIN32__ ) || defined( __CYGWIN__ )
+# define NEAR /* */
+# define FAR /* */
+# endif
+# include <mmsystem.h>
+# include <string.h>
+#else
+# include <unistd.h>
+# include <fcntl.h>
+# ifdef __FreeBSD__
+# include <machine/joystick.h>
+# define JS_DATA_TYPE joystick
+# define JS_RETURN (sizeof(struct JS_DATA_TYPE))
+# elif defined(__linux__)
+# include <sys/ioctl.h>
+# include <linux/joystick.h>
+# include <errno.h>
+
+ /*
+ * Check the joystick driver version
+ */
+# ifdef JS_VERSION
+# if JS_VERSION >= 0x010000
+# define JS_NEW
+# endif
+# endif
+# else
+# ifndef JS_DATA_TYPE
+
+ /*
+ * Not Windoze and no joystick driver...
+ *
+ * Well - we'll put these values in and that should
+ * allow the code to at least compile. The JS open
+ * routine should error out and shut off all the code
+ * downstream anyway
+ */
+ struct JS_DATA_TYPE
+ {
+ int buttons;
+ int x;
+ int y;
+ };
+
+# define JS_RETURN (sizeof(struct JS_DATA_TYPE))
+# endif
+# endif
+#endif
+
+#ifdef WIN32
+# define _JS_MAX_AXES 6
+#else
+# ifdef __FreeBSD__
+# define _JS_MAX_AXES 2
+# else
+# define _JS_MAX_AXES 6
+# endif
+#endif
+
+typedef struct tagSFG_Joystick SFG_Joystick;
+struct tagSFG_Joystick
+{
+#ifdef __FreeBSD__
+ gint id;
+#endif
+
+#ifdef WIN32
+ JOYINFOEX js;
+ UINT js_id;
+#else
+# ifdef JS_NEW
+ struct js_event js;
+ gint tmp_buttons;
+ float tmp_axes[ _JS_MAX_AXES ];
+# else
+ JS_DATA_TYPE js;
+# endif
+
+ gchar fname[ 128 ];
+ gint fd;
+#endif
+
+ gboolean error;
+ gint num_axes;
+ gint 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 ];
+};
+
+/*
+ * The static joystick structure pointer
+ */
+static SFG_Joystick* fgJoystick = NULL;
+
+/*
+ * Read the raw joystick data
+ */
+static void fghJoystickRawRead ( SFG_Joystick* joy, gint* buttons, float* axes )
+{
+#ifdef WIN32
+ MMRESULT status;
+#else
+ gint status;
+#endif
+
+ gint i;
+
+ if( joy->error )
+ {
+ if( buttons )
+ *buttons = 0 ;
+
+ if( axes )
+ for( i=0; i<joy->num_axes; i++ )
+ axes[ i ] = 1500.0f;
+
+ return;
+ }
+
+#ifdef WIN32
+ status = joyGetPosEx( joy->js_id, &joy->js );
+
+ if( status != JOYERR_NOERROR )
+ {
+ joy->error = TRUE;
+ return;
+ }
+
+ if( buttons )
+ *buttons = (int) joy->js.dwButtons;
+
+ if( axes )
+ {
+ /*
+ * WARNING - Fall through case clauses!!
+ */
+ switch( joy->num_axes )
+ {
+ 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;
+ }
+ }
+#else
+# ifdef JS_NEW
+
+ while( 1 )
+ {
+ gint status = read( joy->fd, &joy->js, sizeof(struct js_event) );
+
+ if( status != sizeof(struct js_event) )
+ {
+ 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;
+ }
+
+ g_warning( joy->fname );
+ joy->error = 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:
+ joy->tmp_axes[ joy->js.number ] = (float) joy->js.value;
+
+ if( axes )
+ memcpy( axes, joy->tmp_axes, sizeof(float) * joy->num_axes );
+ break;
+ }
+
+ if( buttons )
+ *buttons = joy->tmp_buttons;
+ }
+# else
+
+ status = read( joy->fd, &joy->js, JS_RETURN );
+
+ if( status != JS_RETURN )
+ {
+ g_warning( fname );
+ joy->error = TRUE;
+ return;
+ }
+
+ if( buttons )
+# ifdef __FreeBSD__
+ *buttons = (joy->js.b1 ? 1 : 0) | (joy->js.b2 ? 2 : 0);
+# 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, gint 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, gint* buttons, float* axes )
+{
+ float raw_axes[ _JS_MAX_AXES ];
+ gint 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)
+ */
+static void fghJoystickOpen( SFG_Joystick* joy )
+{
+#ifdef WIN32
+ JOYCAPS jsCaps;
+ gint i;
+
+ joy->js.dwFlags = JOY_RETURNALL;
+ joy->js.dwSize = sizeof( joy->js );
+
+ memset( &jsCaps, 0, sizeof(jsCaps) );
+
+ joy->error = (joyGetDevCaps( joy->js_id, &jsCaps, sizeof(jsCaps) ) != JOYERR_NOERROR);
+ joy->num_axes = (jsCaps.wNumAxes < _JS_MAX_AXES ) ? jsCaps.wNumAxes : _JS_MAX_AXES;
+
+ /*
+ * WARNING - Fall through case clauses!!
+ */
+ switch( joy->num_axes )
+ {
+ case 6 : joy->min[ 5 ] = (float) jsCaps.wVmin; joy->max[ 5 ] = (float) jsCaps.wVmax;
+ case 5 : joy->min[ 4 ] = (float) jsCaps.wUmin; joy->max[ 4 ] = (float) jsCaps.wUmax;
+ case 4 : joy->min[ 3 ] = (float) jsCaps.wRmin; joy->max[ 3 ] = (float) jsCaps.wRmax;
+ case 3 : joy->min[ 2 ] = (float) jsCaps.wZmin; joy->max[ 2 ] = (float) jsCaps.wZmax;
+ case 2 : joy->min[ 1 ] = (float) jsCaps.wYmin; joy->max[ 1 ] = (float) jsCaps.wYmax;
+ case 1 : joy->min[ 0 ] = (float) jsCaps.wXmin; joy->max[ 0 ] = (float) jsCaps.wXmax; break;
+
+ /*
+ * I guess we have no axes at all
+ */
+ default: joy->error = TRUE; break;
+ }
+
+ /*
+ * 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;
+ }
+
+#else
+# ifdef __FreeBSD__
+ gint buttons[ _JS_MAX_AXES ];
+ float axes[ _JS_MAX_AXES ];
+ gint noargs, in_no_axes;
+ gchar joyfname[ 1024 ];
+ FILE* joyfile;
+# endif
+
+ gint i, counter;
+
+ /*
+ * 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;
+
+# ifdef __FreeBSD__
+ fghJoystickRawRead( buttons, axes );
+ joy->error = axes[ 0 ] < -1000000000.0f;
+ if( joy->error )
+ return ;
+
+ sprintf( joyfname, "%s/.joy%drc", g_getenv( "HOME" ), 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++ )
+ {
+ dead_band[ i ] = 0.0f;
+ saturate [ i ] = 1.0f;
+ }
+# else
+
+ /*
+ * Set the correct number of axes for the linux driver
+ */
+# ifdef JS_NEW
+ ioctl( joy->fd, JSIOCGAXES , &joy->num_axes );
+ ioctl( joy->fd, JSIOCGBUTTONS, &joy->num_buttons );
+ 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, center );
+ counter++;
+ } while( !joy->error && counter < 100 && center[ 0 ] == 512.0f && center[ 1 ] == 512.0f );
+
+ if( counter >= 100 )
+ joy->error = 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 ] = center[ i ] * 2.0f;
+ joy->min[ i ] = 0.0f;
+# endif
+ joy->dead_band[ i ] = 0.0f ;
+ joy->saturate [ i ] = 1.0f ;
+ }
+# endif
+#endif
+}
+
+/*
+ *
+ */
+void fgJoystickInit( gint ident )
+{
+ /*
+ * Make sure we don't get reinitialized
+ */
+ if( fgJoystick != NULL )
+ g_error( "illegal attemp to initialize joystick device" );
+
+ /*
+ * Have the global joystick structure created
+ */
+ fgJoystick = g_new0( SFG_Joystick, 1 );
+
+#ifdef WIN32
+ switch( ident )
+ {
+ case 0: fgJoystick->js_id = JOYSTICKID1; fghJoystickOpen( fgJoystick ); break;
+ case 1: fgJoystick->js_id = JOYSTICKID2; fghJoystickOpen( fgJoystick ); break;
+ default: fgJoystick->num_axes = 0; fgJoystick->error = TRUE; break;
+ }
+#else
+
+# ifdef __FreeBSD__
+ fgJoystick->id = ident;
+ sprintf( fgJoystick->fname, "/dev/joy%d", ident );
+# else
+ sprintf( fgJoystick->fname, "/dev/js%d", ident );
+# endif
+
+ /*
+ * Let's try opening the joystick device now:
+ */
+ fghJoystickOpen( fgJoystick );
+#endif
+}
+
+/*
+ *
+ */
+void fgJoystickClose( void )
+{
+ if( fgJoystick == NULL )
+ g_error( "illegal attempt to deinitialize joystick device" );
+
+#ifndef WIN32
+ if( fgJoystick->error != TRUE )
+ close( fgJoystick->fd );
+#endif
+}
+
+/*
+ * 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 ];
+ gint buttons;
+
+ /*
+ * Make sure the joystick device is initialized, the window seems valid
+ * and that there is a joystick callback hooked to it:
+ */
+ freeglut_return_if_fail( fgJoystick == NULL || window == NULL );
+ freeglut_return_if_fail( window->Callbacks.Joystick == NULL );
+
+ /*
+ * Poll the joystick now:
+ */
+ fghJoystickRead( fgJoystick, &buttons, axes );
+
+ /*
+ * Execute the freeglut joystick callback now
+ */
+ window->Callbacks.Joystick(
+ buttons,
+ (gint) (axes[ 0 ] * 1000.0f),
+ (gint) (axes[ 1 ] * 1000.0f),
+ (gint) (axes[ 2 ] * 1000.0f)
+ );
+}
+
+/*
+ * PWO: These jsJoystick class methods have not been implemented.
+ * We might consider adding such functions to freeglut-2.0.
+ */
+#if 0
+ int getNumAxes () { return num_axes ; }
+ int notWorking () { return error ; }
+
+ float getDeadBand ( int axis ) { return dead_band [ axis ] ; }
+ void setDeadBand ( int axis, float db ) { dead_band [ axis ] = db ; }
+
+ float getSaturation ( int axis ) { return saturate [ axis ] ; }
+ void setSaturation ( int axis, float st ) { saturate [ axis ] = st ; }
+
+ void setMinRange ( float *axes ) { memcpy ( min , axes, num_axes * sizeof(float) ) ; }
+ void setMaxRange ( float *axes ) { memcpy ( max , axes, num_axes * sizeof(float) ) ; }
+ void setCenter ( float *axes ) { memcpy ( center, axes, num_axes * sizeof(float) ) ; }
+
+ void getMinRange ( float *axes ) { memcpy ( axes, min , num_axes * sizeof(float) ) ; }
+ void getMaxRange ( float *axes ) { memcpy ( axes, max , num_axes * sizeof(float) ) ; }
+ void getCenter ( float *axes ) { memcpy ( axes, center, num_axes * sizeof(float) ) ; }
+#endif
+
+/*** 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "freeglut-main"
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/freeglut_internal.h"
+
+/*
+ * 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 ---------------------------------------------------- */
+
+/*
+ * Calls a window's redraw method. This is used when
+ * a redraw is forced by the incoming window messages.
+ */
+static void fghRedrawWindowByHandle
+#if TARGET_HOST_UNIX_X11
+ ( Window handle )
+#elif TARGET_HOST_WIN32
+ ( HWND handle )
+#endif
+{
+ /*
+ * Find the window we have to redraw...
+ */
+ SFG_Window* window = fgWindowByHandle( handle );
+ freeglut_return_if_fail( window != NULL );
+
+ /*
+ * Check if there is a display callback hooked to it
+ */
+ freeglut_return_if_fail( window->Callbacks.Display != NULL );
+
+ /*
+ * Return if the window is not visible
+ */
+ freeglut_return_if_fail( window->State.Visible != TRUE );
+
+ /*
+ * Set the window as the current one. Calling glutSetWindow()
+ * might seem slow and generally redundant, but it is portable.
+ */
+ glutSetWindow( window->ID );
+
+ /*
+ * Have the callback executed now. The buffers should
+ * be swapped by the glutSwapBuffers() execution inside
+ * the callback itself.
+ */
+ window->Callbacks.Display();
+}
+
+/*
+ * Handle a window configuration change. When no reshape
+ * callback is hooked, the viewport size is updated to
+ * match the new window size.
+ */
+static void fghReshapeWindowByHandle
+#if TARGET_HOST_UNIX_X11
+ ( Window handle, gint width, gint height )
+#elif TARGET_HOST_WIN32
+ ( HWND handle, gint width, gint height )
+#endif
+{
+ /*
+ * Find the window that received the reshape event
+ */
+ SFG_Window* window = fgWindowByHandle( handle );
+ freeglut_return_if_fail( window != NULL );
+
+ /*
+ * Remember about setting the current window...
+ */
+ glutSetWindow( window->ID );
+
+ /*
+ * Check if there is a reshape callback hooked
+ */
+ if( window->Callbacks.Reshape != NULL )
+ {
+ /*
+ * OKi, have it called immediately
+ */
+ window->Callbacks.Reshape( width, height );
+ }
+ else
+ {
+ /*
+ * Otherwise just resize the viewport
+ */
+ glViewport( 0, 0, width, height );
+ }
+}
+
+/*
+ * A static helper function to execute display callback for a window
+ */
+static void fghcbDisplayWindow( gpointer window, gpointer enumerator )
+{
+#if TARGET_HOST_UNIX_X11
+ /*
+ * Check if there is an idle callback hooked
+ */
+# warning there is a redisplay hack here (see the code commented out)
+ if( (((SFG_Window *) window)->Callbacks.Display != NULL) /*&&
+ /*(((SFG_Window *) window)->State.Redisplay == TRUE)*/ &&
+ (((SFG_Window *) window)->State.Visible == TRUE) )
+ {
+ /*
+ * OKi, this is the case: have the window set as the current one
+ */
+ glutSetWindow( ((SFG_Window *) window)->ID );
+
+ /*
+ * Do not exagerate with the redisplaying
+ */
+ ((SFG_Window *) window)->State.Redisplay = FALSE;
+
+ /*
+ * And execute the display callback immediately after
+ */
+ ((SFG_Window *) window)->Callbacks.Display();
+ }
+
+#elif TARGET_HOST_WIN32
+
+ /*
+ * Do we need to explicitly resize the window?
+ */
+ if( ((SFG_Window *) window)->State.NeedToResize )
+ {
+ glutSetWindow( ((SFG_Window *) window)->ID );
+
+ fghReshapeWindowByHandle(
+ ((SFG_Window *) window)->Window.Handle,
+ glutGet( GLUT_WINDOW_WIDTH ),
+ glutGet( GLUT_WINDOW_HEIGHT )
+ );
+
+ /*
+ * Never ever do that again:
+ */
+ ((SFG_Window *) window)->State.NeedToResize = FALSE;
+ }
+
+ /*
+ * This is done in a bit different way under Windows
+ */
+ RedrawWindow(
+ ((SFG_Window *) window)->Window.Handle, NULL, NULL,
+ RDW_NOERASE | RDW_INTERNALPAINT | RDW_INVALIDATE
+ );
+
+#endif
+
+ /*
+ * Process this window's children (if any)
+ */
+ fgEnumSubWindows( (SFG_Window *) window, fghcbDisplayWindow, enumerator );
+}
+
+/*
+ * Make all windows perform a display call
+ */
+static void fghDisplayAll( void )
+{
+ SFG_Enumerator enumerator;
+
+ /*
+ * Uses a method very similiar for fgWindowByHandle...
+ */
+ enumerator.found = FALSE;
+ enumerator.data = NULL;
+
+ /*
+ * Start the enumeration now:
+ */
+ fgEnumWindows( fghcbDisplayWindow, &enumerator );
+}
+
+/*
+ * Window enumerator callback to check for the joystick polling code
+ */
+static void fghcbCheckJoystickPolls( gpointer window, gpointer enumerator )
+{
+ double checkTime = g_timer_elapsed( fgState.Timer, NULL );
+ SFG_Window* win = (SFG_Window *) window;
+
+ /*
+ * Check if actually need to do the poll for the currently enumerated window:
+ */
+ if( win->State.JoystickLastPoll + win->State.JoystickPollRate >= checkTime )
+ {
+ /*
+ * Yeah, that's it. Poll the joystick...
+ */
+ fgJoystickPollWindow( (SFG_Window *) window );
+
+ /*
+ * ...and reset the polling counters:
+ */
+ win->State.JoystickLastPoll = checkTime;
+ }
+
+ /*
+ * Process this window's children (if any)
+ */
+ fgEnumSubWindows( (SFG_Window *) window, fghcbCheckJoystickPolls, enumerator );
+}
+
+/*
+ * Check all windows for joystick polling
+ */
+static void fghCheckJoystickPolls( void )
+{
+ SFG_Enumerator enumerator;
+
+ /*
+ * Uses a method very similiar for fgWindowByHandle...
+ */
+ enumerator.found = FALSE;
+ enumerator.data = NULL;
+
+ /*
+ * Start the enumeration now:
+ */
+ fgEnumWindows( fghcbCheckJoystickPolls, &enumerator );
+}
+
+/*
+ * Check the global timers
+ */
+static void fghCheckTimers( void )
+{
+ double checkTime = g_timer_elapsed( fgState.Timer, NULL );
+ SFG_Timer* timer = NULL;
+ GList* timedOut = NULL;
+ gint i, length;
+
+ /*
+ * For every timer that is waiting for triggering
+ */
+ for( i=0; i<(gint) g_list_length( fgState.Timers ); i++ )
+ {
+ /*
+ * ...grab the appropriate timer hook structure pointer
+ */
+ timer = (SFG_Timer *) g_list_nth( fgState.Timers, i )->data;
+ g_assert( timer != NULL );
+
+ /*
+ * Check for the timeout:
+ */
+ if( timer->TriggerTime <= checkTime )
+ {
+ /*
+ * Add the timer to the timed out timers list
+ */
+ timedOut = g_list_append( timedOut, timer );
+ }
+ }
+
+ /*
+ * Now, have all the timed out timers removed from the window hooks
+ */
+ length = g_list_length( timedOut );
+
+ for( i=0; i<length; i++ )
+ {
+ fgState.Timers = g_list_remove(
+ fgState.Timers,
+ g_list_nth( timedOut, i )->data
+ );
+ }
+
+ /*
+ * Now feel free to execute all the hooked and timed out timer callbacks
+ */
+ for( i=0; i<length; i++ )
+ {
+ if( timer->Callback != NULL )
+ timer->Callback( timer->ID );
+ }
+
+ /*
+ * Finally, delete the timed out timers...
+ */
+ for( i=0; i<length; i++ )
+ g_free( g_list_nth( timedOut, i )->data );
+
+ /*
+ * Finally, have the timed out timers list released
+ */
+ if( timedOut != NULL )
+ g_list_free( timedOut );
+}
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Enters the FreeGLUT processing loop. Never returns.
+ */
+void FGAPIENTRY glutMainLoop( void )
+{
+#if TARGET_HOST_UNIX_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;
+
+ /*
+ * Make sure the display has been created etc.
+ */
+ freeglut_assert_ready;
+
+ /*
+ * Enter the loop. Iterate as long as there are
+ * any windows in the freeglut structure.
+ */
+ while( fgStructure.Windows != NULL )
+ {
+ /*
+ * Do we have any event messages pending?
+ */
+ if( XPending( fgDisplay.Display ) )
+ {
+ /*
+ * Grab the next event to be processed...
+ */
+ XNextEvent( fgDisplay.Display, &event );
+
+ /*
+ * Check the event's type
+ */
+ switch( event.type )
+ {
+ case CreateNotify:
+ /*
+ * The window creation confirmation
+ */
+ break;
+
+ case DestroyNotify:
+ /*
+ * This is sent to confirm the XDestroyWindow call. Ignore it.
+ */
+ break;
+
+ case ClientMessage:
+ /*
+ * Destroy the window when the WM_DELETE_WINDOW message arrives
+ */
+ if( (Atom) event.xclient.data.l[ 0 ] == fgDisplay.DeleteWindow )
+ {
+ /*
+ * I wonder if the window still exists ;-)
+ */
+ fgDestroyWindow( fgWindowByHandle( event.xclient.window ), TRUE );
+ }
+ break;
+
+ case UnmapNotify:
+ /*
+ * A window of ours has been unmapped...
+ */
+ break;
+
+ case Expose:
+ /*
+ * We are too dumb to process partial exposes...
+ */
+ if( event.xexpose.count == 0 )
+ fghRedrawWindowByHandle( event.xexpose.window );
+ break;
+
+ case ConfigureNotify:
+ /*
+ * The window gets resized
+ */
+ fghReshapeWindowByHandle(
+ event.xconfigure.window,
+ event.xconfigure.width,
+ event.xconfigure.height
+ );
+ 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:
+ {
+ /*
+ * The window's visiblity might have changed
+ */
+ GETWINDOW( xvisibility );
+
+ /*
+ * Break now if no window status callback has been hooked to that window
+ */
+ if( window->Callbacks.WindowStatus == NULL )
+ break;
+
+ /*
+ * We're going to send a callback to a window. Make it current.
+ */
+ glutSetWindow( window->ID );
+
+ /*
+ * 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
+ */
+ switch( event.xvisibility.state )
+ {
+ case VisibilityUnobscured:
+ /*
+ * We are fully visible...
+ */
+ window->Callbacks.WindowStatus( GLUT_FULLY_RETAINED );
+ window->State.Visible = TRUE;
+ break;
+
+ case VisibilityPartiallyObscured:
+ /*
+ * The window is partially visible
+ */
+ window->Callbacks.WindowStatus( GLUT_PARTIALLY_RETAINED );
+ window->State.Visible = TRUE;
+ break;
+
+ case VisibilityFullyObscured:
+ /*
+ * The window is totally obscured
+ */
+ window->Callbacks.WindowStatus( GLUT_FULLY_COVERED );
+ window->State.Visible = FALSE;
+ break;
+ }
+ }
+ break;
+
+ case EnterNotify:
+ {
+ /*
+ * Mouse is over one of our windows
+ */
+ GETWINDOW( xcrossing ); GETMOUSE( xcrossing );
+
+ /*
+ * Is there an entry callback hooked to the window?
+ */
+ if( window->Callbacks.Entry != NULL )
+ {
+ /*
+ * Yeah. Notify the window about having the mouse cursor over
+ */
+ window->Callbacks.Entry( GLUT_ENTERED );
+ }
+ }
+ break;
+
+ case LeaveNotify:
+ {
+ /*
+ * Mouse is no longer over one of our windows
+ */
+ GETWINDOW( xcrossing ); GETMOUSE( xcrossing );
+
+ /*
+ * Is there an entry callback hooked to the window?
+ */
+ if( window->Callbacks.Entry != NULL )
+ {
+ /*
+ * Yeah. Notify the window about having the mouse cursor over
+ */
+ window->Callbacks.Entry( GLUT_LEFT );
+ }
+ }
+ break;
+
+ case MotionNotify:
+ {
+ /*
+ * The mouse cursor was moved...
+ */
+ GETWINDOW( xmotion ); GETMOUSE( xmotion );
+
+ /*
+ * What kind of a movement was it?
+ */
+ if( (event.xmotion.state & Button1Mask) || (event.xmotion.state & Button2Mask) ||
+ (event.xmotion.state & Button3Mask) || (event.xmotion.state & Button4Mask) ||
+ (event.xmotion.state & Button5Mask) )
+ {
+ /*
+ * A mouse button was pressed during the movement...
+ * Is there a motion callback hooked to the window?
+ */
+ if( window->Callbacks.Motion != NULL )
+ {
+ /*
+ * Yup. Have it executed immediately
+ */
+ window->Callbacks.Motion( event.xmotion.x, event.xmotion.y );
+ }
+ }
+ else
+ {
+ /*
+ * Otherwise it was a passive movement...
+ */
+ if( window->Callbacks.Passive != NULL )
+ {
+ /*
+ * That's right, and there is a passive callback, too.
+ */
+ window->Callbacks.Passive( event.xmotion.x, event.xmotion.y );
+ }
+ }
+ }
+ break;
+
+ case ButtonRelease:
+ case ButtonPress:
+ {
+ gint button;
+
+ /*
+ * A mouse button has been pressed or released. Traditionally,
+ * break if the window was found within the freeglut structures.
+ */
+ GETWINDOW( xbutton ); GETMOUSE( xbutton );
+
+ /*
+ * GLUT API assumes that you can't have more than three mouse buttons, so:
+ */
+ switch( event.xbutton.button )
+ {
+ /*
+ * WARNING: this might be wrong, if we only have two mouse buttons,
+ * Button2 might mean the right button, isn't that right?
+ */
+ case Button1: button = GLUT_LEFT_BUTTON; break;
+ case Button2: button = GLUT_MIDDLE_BUTTON; break;
+ case Button3: button = GLUT_RIGHT_BUTTON; break;
+ default: button = -1; break;
+ }
+
+ /*
+ * Skip the unwanted mouse buttons...
+ */
+ if( button == -1 )
+ break;
+
+ /*
+ * Do not execute the callback if a menu is hooked to this key.
+ * In that case an appropriate private call should be generated
+ */
+ if( window->Menu[ button ] != NULL )
+ {
+ /*
+ * Set the current window
+ */
+ glutSetWindow( window->ID );
+
+ if( event.type == ButtonPress )
+ {
+ /*
+ * Activate the appropriate menu structure...
+ */
+ fgActivateMenu( button );
+ }
+ else
+ {
+ /*
+ * There are two general cases generated when a menu button
+ * is released -- it can provoke a menu call (when released
+ * over a menu area) or just deactivate the menu (when released
+ * somewhere else). Unfortunately, both cases must be checked
+ * recursively due to the submenu possibilities.
+ */
+ fgDeactivateMenu( button );
+ }
+ break;
+ }
+
+ /*
+ * Check if there is a mouse callback hooked to the window
+ */
+ if( window->Callbacks.Mouse == NULL )
+ break;
+
+ /*
+ * Set the current window
+ */
+ glutSetWindow( window->ID );
+
+ /*
+ * Remember the current modifiers state
+ */
+ window->State.Modifiers = event.xbutton.state;
+
+ /*
+ * Finally execute the mouse callback
+ */
+ window->Callbacks.Mouse(
+ button,
+ event.type == ButtonPress ? GLUT_DOWN : GLUT_UP,
+ event.xbutton.x,
+ event.xbutton.y
+ );
+
+ /*
+ * Trash the modifiers state
+ */
+ window->State.Modifiers = 0xffffffff;
+ }
+ break;
+
+ case KeyPress:
+ {
+ /*
+ * A key has been pressed, find the window that had the focus:
+ */
+ GETWINDOW( xkey ); GETMOUSE( xkey );
+
+ /*
+ * Is there a keyboard/special callback hooked for this window?
+ */
+ if( (window->Callbacks.Keyboard != NULL) || (window->Callbacks.Special != NULL) )
+ {
+ XComposeStatus composeStatus;
+ gchar asciiCode[ 32 ];
+ KeySym keySym;
+ gint len;
+
+ /*
+ * Check for the ASCII/KeySym codes associated with the event:
+ */
+ len = XLookupString( &event.xkey, asciiCode, sizeof(asciiCode), &keySym, &composeStatus );
+
+ /*
+ * Get ready to calling the keyboard/special callbacks
+ */
+ glutSetWindow( window->ID );
+
+ /*
+ * GLUT API tells us to have two separate callbacks...
+ */
+ if( len > 0 )
+ {
+ /*
+ * ...one for the ASCII translateable keypresses...
+ */
+ if( window->Callbacks.Keyboard != NULL )
+ {
+ /*
+ * Remember the current modifiers state
+ */
+ window->State.Modifiers = event.xkey.state;
+
+ /*
+ * Execute the callback
+ */
+ window->Callbacks.Keyboard( asciiCode[ 0 ], event.xkey.x, event.xkey.y );
+
+ /*
+ * Trash the modifiers state
+ */
+ window->State.Modifiers = 0xffffffff;
+ }
+ }
+ else
+ {
+ gint special = -1;
+
+ /*
+ * ...and one for all the others, which need to be translated to GLUT_KEY_Xs...
+ */
+ switch( keySym )
+ {
+ /*
+ * First the function keys come:
+ */
+ 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;
+
+ /*
+ * Then the arrows and stuff:
+ */
+ case XK_Left: special = GLUT_KEY_LEFT; break;
+ case XK_Right: special = GLUT_KEY_RIGHT; break;
+ case XK_Up: special = GLUT_KEY_UP; break;
+ case XK_Down: special = GLUT_KEY_DOWN; break;
+ }
+
+ /*
+ * Execute the callback (if one has been specified),
+ * given that the special code seems to be valid...
+ */
+ if( (window->Callbacks.Special != NULL) && (special != -1) )
+ {
+ /*
+ * Remember the current modifiers state
+ */
+ window->State.Modifiers = event.xkey.state;
+
+ window->Callbacks.Special( special, event.xkey.x, event.xkey.y );
+
+ /*
+ * Trash the modifiers state
+ */
+ window->State.Modifiers = 0xffffffff;
+ }
+ }
+ }
+ }
+ break;
+ }
+ }
+ else
+ {
+ /*
+ * Have all the timers checked.
+ */
+ fghCheckTimers();
+
+ /*
+ * Poll the joystick and notify all windows that want to be notified...
+ */
+ fghCheckJoystickPolls();
+
+ /*
+ * No messages in the queue, which means we are idling...
+ */
+ if( fgState.IdleCallback != NULL )
+ fgState.IdleCallback();
+
+ /*
+ * Remember about displaying all the windows that have
+ * been marked for a redisplay (possibly in the idle call):
+ */
+ fghDisplayAll();
+ }
+ }
+
+#elif TARGET_HOST_WIN32
+
+ gboolean bLoop = TRUE;
+ MSG stMsg;
+
+ /*
+ * The windows main loop is considerably smaller
+ */
+ while( bLoop )
+ {
+ if( PeekMessage( &stMsg, NULL, 0, 0, PM_NOREMOVE ) )
+ {
+ /*
+ * Grab the message now, checking for WM_QUIT
+ */
+ if( GetMessage( &stMsg, NULL, 0, 0 ) == 0 )
+ bLoop = FALSE;
+
+ /*
+ * Translate virtual-key messages and send them to the window...
+ */
+ TranslateMessage( &stMsg );
+ DispatchMessage( &stMsg );
+ }
+ else
+ {
+ /*
+ * Have all the timers checked.
+ */
+ fghCheckTimers();
+
+ /*
+ * Poll the joystick and notify all windows that want to be notified...
+ */
+ fghCheckJoystickPolls();
+
+ /*
+ * No messages in the queue, which means we are idling...
+ */
+ if( fgState.IdleCallback != NULL )
+ fgState.IdleCallback();
+
+ /*
+ * Remember about displaying all the windows that have
+ * been marked for a redisplay (possibly in the idle call):
+ */
+ fghDisplayAll();
+
+ /*
+ * We need to terminate the main loop if no windows are left
+ */
+ bLoop = (g_list_length( fgStructure.Windows ) != 0);
+ }
+ }
+
+#endif
+
+ /*
+ * When this loop terminates, destroy the display, state and structure
+ * of a freeglut session, so that another glutInit() call can happen
+ */
+ fgDeinitialize();
+}
+
+/*
+ * The window procedure for handling Win32 events
+ */
+#if TARGET_HOST_WIN32
+LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ SFG_Window* window = fgWindowByHandle( hWnd );
+ PAINTSTRUCT ps;
+ LONG lRet = 1;
+
+# define assert_window_registered if( window == NULL ) return( DefWindowProc( hWnd, uMsg, wParam, lParam ) );
+
+ /*
+ * Check what type of message are we receiving
+ */
+ switch( uMsg )
+ {
+ case WM_CREATE:
+ /*
+ * The window structure is passed as the creation structure paramter...
+ */
+ window = (SFG_Window *) (((LPCREATESTRUCT) lParam)->lpCreateParams);
+ g_assert( window != NULL );
+
+ /*
+ * We can safely store the window's handle now:
+ */
+ window->Window.Handle = hWnd;
+
+ /*
+ * Get the window's device context
+ */
+ window->Window.Device = GetDC( hWnd );
+
+ /*
+ * Setup the pixel format of our window
+ */
+ fgSetupPixelFormat( window, FALSE );
+
+ /*
+ * Create the OpenGL rendering context now
+ */
+ window->Window.Context = wglCreateContext( window->Window.Device );
+
+ /*
+ * Still, we'll be needing to explicitly resize the window
+ */
+ window->State.NeedToResize = TRUE;
+
+ /*
+ * Finally, have the window's device context released
+ */
+ ReleaseDC( window->Window.Handle, window->Window.Device );
+ break;
+
+ case WM_SIZE:
+ /*
+ * We got resized... But check if the window has been already added...
+ */
+ fghReshapeWindowByHandle( hWnd, LOWORD(lParam), HIWORD(lParam) );
+ break;
+
+ case WM_PAINT:
+ /*
+ * Start the painting job
+ */
+ BeginPaint( hWnd, &ps );
+
+ /*
+ * Call the engine's main frame drawing method
+ */
+ fghRedrawWindowByHandle( hWnd );
+
+ /*
+ * End the painting job, release the device context
+ */
+ EndPaint( hWnd, &ps );
+ break;
+
+ case WM_CLOSE:
+ /*
+ * Make sure we don't close a window with current context active
+ */
+ if( fgStructure.Window == window )
+ {
+ wglMakeCurrent( NULL, NULL );
+ wglDeleteContext( window->Window.Context );
+ }
+
+ /*
+ * Proceed with the window destruction
+ */
+ DestroyWindow( window->Window.Handle );
+ break;
+
+ case WM_DESTROY:
+ /*
+ * The window already got destroyed, so forget about it's existence:
+ */
+ fgDestroyWindow( window, FALSE );
+ return( 0 );
+
+ case WM_MOUSEMOVE:
+ {
+ assert_window_registered;
+
+ /*
+ * The mouse cursor has moved. Remember the new mouse cursor's position
+ */
+ window->State.MouseX = LOWORD( lParam );
+ window->State.MouseY = HIWORD( lParam );
+
+ /*
+ * Fallback if there's an active menu hooked to this window
+ */
+ if( window->MenuActive[ 0 ] || window->MenuActive[ 1 ] || window->MenuActive[ 2 ] )
+ break;
+
+ /*
+ * Remember the current modifiers state.
+ */
+ window->State.Modifiers =
+ (GetKeyState( VK_LSHIFT ) || GetKeyState( VK_RSHIFT )) ? GLUT_ACTIVE_SHIFT : 0 |
+ (GetKeyState( VK_LCONTROL ) || GetKeyState( VK_RCONTROL )) ? GLUT_ACTIVE_CTRL : 0 |
+ (GetKeyState( VK_LMENU ) || GetKeyState( VK_RMENU )) ? GLUT_ACTIVE_ALT : 0;
+
+ /*
+ * Check if any of the mouse buttons is pressed...
+ */
+ if( (wParam & MK_LBUTTON) || (wParam & MK_MBUTTON) || (wParam & MK_RBUTTON) )
+ {
+ /*
+ * Yeah, indeed. We need to use the motion callback then:
+ */
+ if( window->Callbacks.Motion != NULL )
+ {
+ /*
+ * Make sure the current window is set...
+ */
+ glutSetWindow( window->ID );
+
+ /*
+ * Execute the active mouse motion callback now
+ */
+ window->Callbacks.Motion( window->State.MouseX, window->State.MouseY );
+ }
+ }
+ else
+ {
+ /*
+ * All mouse buttons are up, execute the passive mouse motion callback
+ */
+ if( window->Callbacks.Passive != NULL )
+ {
+ /*
+ * Make sure the current window is set
+ */
+ glutSetWindow( window->ID );
+
+ /*
+ * Execute the passive mouse motion callback
+ */
+ window->Callbacks.Passive( window->State.MouseX, window->State.MouseY );
+ }
+ }
+
+ /*
+ * Thrash the current modifiers state now
+ */
+ window->State.Modifiers = 0xffffffff;
+ }
+ break;
+
+ case WM_LBUTTONDOWN:
+ case WM_MBUTTONDOWN:
+ case WM_RBUTTONDOWN:
+ case WM_LBUTTONUP:
+ case WM_MBUTTONUP:
+ case WM_RBUTTONUP:
+ {
+ gboolean pressed = TRUE;
+ gint button;
+
+ /*
+ * A mouse button has been pressed *or* released. Again, break off
+ * if the message was not directed towards a freeglut window...
+ */
+ assert_window_registered;
+
+ /*
+ * The mouse cursor has moved. Remember the new mouse cursor's position
+ */
+ window->State.MouseX = LOWORD( lParam );
+ window->State.MouseY = HIWORD( lParam );
+
+ /*
+ * We're curious about the GLUT API button name...
+ */
+ switch( uMsg )
+ {
+ case WM_LBUTTONDOWN: pressed = TRUE; button = GLUT_LEFT_BUTTON; break;
+ case WM_MBUTTONDOWN: pressed = TRUE; button = GLUT_MIDDLE_BUTTON; break;
+ case WM_RBUTTONDOWN: pressed = TRUE; button = GLUT_RIGHT_BUTTON; break;
+ case WM_LBUTTONUP: pressed = FALSE; button = GLUT_LEFT_BUTTON; break;
+ case WM_MBUTTONUP: pressed = FALSE; button = GLUT_MIDDLE_BUTTON; break;
+ case WM_RBUTTONUP: pressed = FALSE; button = GLUT_RIGHT_BUTTON; break;
+ default: pressed = FALSE; button = -1; break;
+ }
+
+ /*
+ * The left and right mouse buttons might have been swapped...
+ */
+ if( GetSystemMetrics( SM_SWAPBUTTON ) )
+ if( button == GLUT_LEFT_BUTTON ) button = GLUT_RIGHT_BUTTON;
+ else if( button == GLUT_RIGHT_BUTTON ) button = GLUT_LEFT_BUTTON;
+
+ /*
+ * Hey, what's up with you?
+ */
+ if( button == -1 )
+ return( DefWindowProc( hWnd, uMsg, lParam, wParam ) );
+
+ /*
+ * Do not execute the callback if a menu is hooked to this key.
+ * In that case an appropriate private call should be generated
+ */
+ if( window->Menu[ button ] != NULL )
+ {
+ /*
+ * Set the current window
+ */
+ glutSetWindow( window->ID );
+
+ if( pressed == TRUE )
+ {
+ /*
+ * Activate the appropriate menu structure...
+ */
+ fgActivateMenu( button );
+ }
+ else
+ {
+ /*
+ * There are two general cases generated when a menu button
+ * is released -- it can provoke a menu call (when released
+ * over a menu area) or just deactivate the menu (when released
+ * somewhere else). Unfortunately, both cases must be checked
+ * recursively due to the submenu possibilities.
+ */
+ fgDeactivateMenu( button );
+ }
+ break;
+ }
+
+ /*
+ * Check if there is a mouse callback hooked to the window
+ */
+ if( window->Callbacks.Mouse == NULL )
+ break;
+
+ /*
+ * Set the current window
+ */
+ glutSetWindow( window->ID );
+
+ /*
+ * Remember the current modifiers state.
+ */
+ window->State.Modifiers =
+ (GetKeyState( VK_LSHIFT ) || GetKeyState( VK_RSHIFT )) ? GLUT_ACTIVE_SHIFT : 0 |
+ (GetKeyState( VK_LCONTROL ) || GetKeyState( VK_RCONTROL )) ? GLUT_ACTIVE_CTRL : 0 |
+ (GetKeyState( VK_LMENU ) || GetKeyState( VK_RMENU )) ? GLUT_ACTIVE_ALT : 0;
+
+ /*
+ * Finally execute the mouse callback
+ */
+ window->Callbacks.Mouse(
+ button,
+ pressed == TRUE ? GLUT_DOWN : GLUT_UP,
+ window->State.MouseX,
+ window->State.MouseY
+ );
+
+ /*
+ * Trash the modifiers state
+ */
+ window->State.Modifiers = 0xffffffff;
+ }
+ break;
+
+ case WM_SYSKEYDOWN:
+ case WM_KEYDOWN:
+ {
+ gint keypress = -1;
+
+ /*
+ * First of all, make sure that there is a window to be notified of this
+ */
+ assert_window_registered;
+
+ /*
+ * Ignore the automatic key repetition if needed:
+ */
+ if( fgState.IgnoreKeyRepeat && (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.
+ */
+ window->State.Modifiers =
+ (GetKeyState( VK_LSHIFT ) || GetKeyState( VK_RSHIFT )) ? GLUT_ACTIVE_SHIFT : 0 |
+ (GetKeyState( VK_LCONTROL ) || GetKeyState( VK_RCONTROL )) ? GLUT_ACTIVE_CTRL : 0 |
+ (GetKeyState( VK_LMENU ) || GetKeyState( VK_RMENU )) ? GLUT_ACTIVE_ALT : 0;
+
+ /*
+ * Convert the Win32 keystroke codes to GLUTtish way
+ */
+# define KEY(a,b) case a: keypress = b; break;
+
+ switch( wParam )
+ {
+ /*
+ * Most of the special characters can be handled automagically...
+ */
+ 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 );
+
+ /*
+ * ...yet there is a small exception we need to have handled...
+ */
+ case VK_DELETE:
+ /*
+ * The delete key should be treated as an ASCII keypress:
+ */
+ if( window->Callbacks.Keyboard != NULL )
+ window->Callbacks.Keyboard( 127, window->State.MouseX, window->State.MouseY );
+ }
+
+ /*
+ * Execute the special callback, if present, given the conversion was a success:
+ */
+ if( (keypress != -1) && (window->Callbacks.Special != NULL) )
+ {
+ /*
+ * Have the special callback executed:
+ */
+ window->Callbacks.Special( keypress, window->State.MouseX, window->State.MouseY );
+ }
+
+ /*
+ * Thrash the modifiers register now
+ */
+ window->State.Modifiers = 0xffffffff;
+ }
+ break;
+
+ case WM_SYSCHAR:
+ case WM_CHAR:
+ {
+ /*
+ * First of all, make sure that there is a window to be notified of this
+ */
+ assert_window_registered;
+
+ /*
+ * Ignore the automatic key repetition if needed:
+ */
+ if( fgState.IgnoreKeyRepeat && (lParam & KF_REPEAT) )
+ break;
+
+ /*
+ * Clear to go with the keyboard callback, if registered:
+ */
+ if( window->Callbacks.Keyboard != NULL )
+ {
+ /*
+ * Remember the current modifiers state
+ */
+ window->State.Modifiers =
+ (GetKeyState( VK_LSHIFT ) || GetKeyState( VK_RSHIFT )) ? GLUT_ACTIVE_SHIFT : 0 |
+ (GetKeyState( VK_LCONTROL ) || GetKeyState( VK_RCONTROL )) ? GLUT_ACTIVE_CTRL : 0 |
+ (GetKeyState( VK_LMENU ) || GetKeyState( VK_RMENU )) ? GLUT_ACTIVE_ALT : 0;
+
+ /*
+ * Have the special callback executed:
+ */
+ window->Callbacks.Keyboard( wParam, window->State.MouseX, window->State.MouseY );
+
+ /*
+ * Thrash the modifiers register now
+ */
+ window->State.Modifiers = 0xffffffff;
+ }
+ }
+ break;
+
+ 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "freeglut-menu"
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/freeglut_internal.h"
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ *
+ * It would be cool if the submenu entries were somehow marked, for example with a dings
+ * on the right menu border or something like that. Think about the possibility of doing
+ * the menu on layers *or* using the native window system instead of OpenGL.
+ */
+
+/* -- DEFINITIONS ---------------------------------------------------------- */
+
+/*
+ * We'll be using freeglut fonts to draw the menu
+ */
+#define FREEGLUT_MENU_FONT GLUT_BITMAP_8_BY_13
+#define FREEGLUT_MENU_HEIGHT 15
+
+
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
+
+/*
+ * Private static function to check for the current menu/sub menu activity state
+ */
+static gboolean fghCheckMenuStatus( SFG_Menu* menu )
+{
+ SFG_Window* window = fgStructure.Window;
+ gint i, x, y;
+
+ /*
+ * First of all check any of the active sub menus...
+ */
+ for( i=0; i<(gint) g_list_length( menu->Entries ); i++ )
+ {
+ SFG_MenuEntry* menuEntry = (SFG_MenuEntry *) g_list_nth( menu->Entries, i )->data;
+
+ /*
+ * Is that an active sub menu by any case?
+ */
+ if( menuEntry->SubMenu != NULL && menuEntry->IsActive == TRUE )
+ {
+ /*
+ * OKi, have the sub-menu checked, too. If it returns 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...
+ */
+ if( fghCheckMenuStatus( menuEntry->SubMenu ) == TRUE )
+ return( TRUE );
+ }
+ }
+
+ /*
+ * That much about our sub menus, let's get to checking the current menu:
+ */
+ x = window->State.MouseX - menu->X;
+ y = window->State.MouseY - menu->Y;
+
+ /*
+ * Mark all menu entries inactive...
+ */
+ for( i=0; i<(gint) g_list_length( menu->Entries ); i++ )
+ {
+ SFG_MenuEntry* menuEntry = (SFG_MenuEntry *) g_list_nth( menu->Entries, i )->data;
+
+ menuEntry->IsActive = FALSE;
+ }
+
+ menu->IsActive = FALSE;
+
+ /*
+ * Check if the mouse cursor is contained within the current menu box
+ */
+ if( x >= 0 && x < menu->Width && y >= 0 && y < menu->Height )
+ {
+ /*
+ * Calculation of the highlighted menu item is easy enough now:
+ */
+ gint menuID = y / FREEGLUT_MENU_HEIGHT;
+
+ /*
+ * The mouse cursor is somewhere over our box, check it out.
+ */
+ SFG_MenuEntry* menuEntry = (SFG_MenuEntry *) g_list_nth( menu->Entries, menuID )->data;
+ g_assert( menuEntry != NULL );
+
+ /*
+ * Mark the menu as active...
+ */
+ menuEntry->IsActive = TRUE;
+ menuEntry->Ordinal = menuID;
+
+ /*
+ * Don't forget about marking the current menu as active, too:
+ */
+ menu->IsActive = TRUE;
+
+ /*
+ * OKi, we have marked that entry as active, but it would be also
+ * nice to have it's contents updated, in case it's a sub menu.
+ * Also, ignore the return value of the check function:
+ */
+ if( menuEntry->SubMenu != NULL )
+ {
+ gint x = window->State.MouseX;
+ gint y = window->State.MouseY;
+
+ /*
+ * Set up the initial menu position now...
+ */
+
+ if( x > 15 ) menuEntry->SubMenu->X = x - 15; else menuEntry->SubMenu->X = 15;
+ if( y > 15 ) menuEntry->SubMenu->Y = y - 15; else menuEntry->SubMenu->Y = 15;
+
+ if( x > (glutGet( GLUT_WINDOW_WIDTH ) - menuEntry->SubMenu->Width - 15) )
+ menuEntry->SubMenu->X = glutGet( GLUT_WINDOW_WIDTH ) - menuEntry->SubMenu->Width - 15;
+ if( y > (glutGet( GLUT_WINDOW_HEIGHT ) - menuEntry->SubMenu->Height - 15) )
+ menuEntry->SubMenu->Y = glutGet( GLUT_WINDOW_HEIGHT ) - menuEntry->SubMenu->Height - 15;
+
+ /*
+ * ...then check the submenu's state:
+ */
+ fghCheckMenuStatus( menuEntry->SubMenu );
+ }
+
+ /*
+ * Report back that we have caught the menu cursor
+ */
+ return( TRUE );
+ }
+
+ /*
+ * Looks like the menu cursor is somewhere else...
+ */
+ return( FALSE );
+}
+
+/*
+ * Displays a menu box and all of it's submenus (if they are active)
+ */
+static void fghDisplayMenuBox( SFG_Menu* menu )
+{
+ SFG_Window* window = fgStructure.Window;
+ gint i, j, x, y;
+
+ /*
+ * Have the menu box drawn first. The +- values are
+ * here just to make it more nice-looking...
+ */
+ glColor4f( 0.0, 0.0, 0.0, 1.0 );
+ glBegin( GL_QUADS );
+ glVertex2f( menu->X - 8 , menu->Y - 1 );
+ glVertex2f( menu->X + 8 + menu->Width, menu->Y - 1 );
+ glVertex2f( menu->X + 8 + menu->Width, menu->Y + 4 + menu->Height );
+ glVertex2f( menu->X - 8 , menu->Y + 4 + menu->Height );
+ glEnd();
+
+ glColor4f( 0.3, 0.4, 0.5, 1.0 );
+ glBegin( GL_QUADS );
+ glVertex2f( menu->X - 6 , menu->Y + 1 );
+ glVertex2f( menu->X + 6 + menu->Width, menu->Y + 1 );
+ glVertex2f( menu->X + 6 + menu->Width, menu->Y + 2 + menu->Height );
+ glVertex2f( menu->X - 6 , menu->Y + 2 + menu->Height );
+ glEnd();
+
+ /*
+ * Check if any of the submenus is currently active...
+ */
+ for( i=0; i<(gint) g_list_length( menu->Entries ); i++ )
+ {
+ SFG_MenuEntry* menuEntry = (SFG_MenuEntry *) g_list_nth( menu->Entries, i )->data;
+
+ /*
+ * Has the menu been marked as active, maybe?
+ */
+ if( menuEntry->IsActive == TRUE )
+ {
+ /*
+ * 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:
+ */
+ gint menuID = menuEntry->Ordinal;
+
+ /*
+ * So have the highlight drawn...
+ */
+ glColor4f( 0.2, 0.3, 0.4, 1.0 );
+ glBegin( GL_QUADS );
+ glVertex2f( menu->X - 6 , menu->Y + (menuID + 0)*FREEGLUT_MENU_HEIGHT + 1 );
+ glVertex2f( menu->X + 6 + menu->Width, menu->Y + (menuID + 0)*FREEGLUT_MENU_HEIGHT + 1 );
+ glVertex2f( menu->X + 6 + menu->Width, menu->Y + (menuID + 1)*FREEGLUT_MENU_HEIGHT + 2 );
+ glVertex2f( menu->X - 6 , menu->Y + (menuID + 1)*FREEGLUT_MENU_HEIGHT + 2 );
+ glEnd();
+ }
+ }
+
+ /*
+ * Print the menu entries now...
+ */
+ glColor4f( 1, 1, 1, 1 );
+
+ for( i=0; i<(gint) g_list_length( menu->Entries ); i++ )
+ {
+ SFG_MenuEntry* menuEntry = (SFG_MenuEntry *) g_list_nth( menu->Entries, i )->data;
+
+ /*
+ * Move the raster into position...
+ */
+ glRasterPos2i(
+ menu->X,
+ menu->Y + (i + 1)*FREEGLUT_MENU_HEIGHT
+ );
+
+ /*
+ * Have the label drawn, character after character:
+ */
+ for( j=0; j<menuEntry->Text->len; j++ )
+ glutBitmapCharacter( FREEGLUT_MENU_FONT, (gint) menuEntry->Text->str[ j ] );
+ }
+
+ /*
+ * Now we are ready to check if any of our children needs to be redrawn:
+ */
+ for( i=0; i<(gint) g_list_length( menu->Entries ); i++ )
+ {
+ SFG_MenuEntry* menuEntry = (SFG_MenuEntry *) g_list_nth( menu->Entries, i )->data;
+
+ /*
+ * Is that an active sub menu by any case?
+ */
+ if( menuEntry->SubMenu != NULL && menuEntry->IsActive == TRUE )
+ {
+ /*
+ * Yeah, indeed. Have it redrawn now:
+ */
+ fghDisplayMenuBox( menuEntry->SubMenu );
+ }
+ }
+}
+
+/*
+ * Displays the currently active menu for the current window
+ */
+void fgDisplayMenu( void )
+{
+ SFG_Window* window = fgStructure.Window;
+ SFG_Menu* menu = NULL;
+ gint i;
+
+ /*
+ * Make sure there is a current window available
+ */
+ freeglut_assert_window;
+
+ /*
+ * Check if there is an active menu attached to this window...
+ */
+ for( i=0; i<FREEGLUT_MAX_MENUS; i++ )
+ {
+ if( window->Menu[ i ] != NULL && window->MenuActive[ i ] == TRUE )
+ menu = window->Menu[ i ];
+ };
+
+ /*
+ * Did we find an active window?
+ */
+ freeglut_return_if_fail( menu != NULL );
+
+ /*
+ * Prepare the OpenGL state to do the rendering first:
+ */
+ 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 );
+
+ /*
+ * We'll use an orthogonal projection matrix to draw the menu:
+ */
+ glMatrixMode( GL_PROJECTION );
+ glPushMatrix();
+ glLoadIdentity();
+ glOrtho(
+ 0, glutGet( GLUT_WINDOW_WIDTH ),
+ glutGet( GLUT_WINDOW_HEIGHT ), 0,
+ -1, 1
+ );
+
+ /*
+ * Model-view matix gets reset to identity:
+ */
+ glMatrixMode( GL_MODELVIEW );
+ glPushMatrix();
+ glLoadIdentity();
+
+ /*
+ * First of all, have the exact menu status check:
+ */
+ fghCheckMenuStatus( menu );
+
+ /*
+ * The status has been updated and we're ready to have the menu drawn now:
+ */
+ fghDisplayMenuBox( menu );
+
+ /*
+ * Restore the old OpenGL settings now
+ */
+ glPopAttrib();
+
+ glMatrixMode( GL_MODELVIEW );
+ glPopMatrix();
+ glMatrixMode( GL_PROJECTION );
+ glPopMatrix();
+}
+
+/*
+ * Activates a menu pointed by the function argument
+ */
+void fgActivateMenu( gint button )
+{
+ SFG_Window* window = fgStructure.Window;
+ SFG_Menu* menu = NULL;
+ gint x, y;
+
+ freeglut_assert_window;
+
+ /*
+ * Mark the menu as active, so that it gets displayed:
+ */
+ window->MenuActive[ button ] = TRUE;
+
+ /*
+ * We'll be referencing this menu a lot, so remember it's address:
+ */
+ menu = window->Menu[ button ];
+
+ /*
+ * Grab the mouse cursor position respective to the current window
+ */
+ x = window->State.MouseX;
+ y = window->State.MouseY;
+
+ /*
+ * Set up the initial menu position now:
+ */
+ if( x > 10 ) menu->X = x - 10; else menu->X = 5;
+ if( y > 10 ) menu->Y = y - 10; else menu->Y = 5;
+
+ if( x > (glutGet( GLUT_WINDOW_WIDTH ) - menu->Width ) )
+ menu->X = glutGet( GLUT_WINDOW_WIDTH ) - menu->Width;
+ if( y > (glutGet( GLUT_WINDOW_HEIGHT ) - menu->Height) )
+ menu->Y = glutGet( GLUT_WINDOW_HEIGHT ) - menu->Height;
+}
+
+/*
+ * Private static function to check for menu entry selection on menu deactivation
+ */
+static void fghCheckMenuSelect( SFG_Menu* menu )
+{
+ gint i;
+
+ /*
+ * First of all check any of the active sub menus...
+ */
+ for( i=0; i<(gint) g_list_length( menu->Entries ); i++ )
+ {
+ SFG_MenuEntry* menuEntry = (SFG_MenuEntry *) g_list_nth( menu->Entries, i )->data;
+
+ /*
+ * Is this menu entry active?
+ */
+ if( menuEntry->IsActive == TRUE )
+ {
+ /*
+ * If this is not a sub menu, execute the menu callback and return...
+ */
+ if( menuEntry->SubMenu == NULL )
+ {
+ /*
+ * ...certainly given that there is one...
+ */
+ if( menu->Callback != NULL )
+ menu->Callback( menuEntry->ID );
+
+ return;
+ }
+
+ /*
+ * Otherwise recurse into the submenu.
+ */
+ fghCheckMenuSelect( menuEntry->SubMenu );
+
+ /*
+ * There is little sense in dwelling the search on
+ */
+ return;
+ }
+ }
+}
+
+/*
+ * Deactivates a menu pointed by the function argument.
+ */
+void fgDeactivateMenu( gint button )
+{
+ SFG_Window* window = fgStructure.Window;
+ SFG_Menu* menu = NULL;
+ gint i, x, y;
+
+ /*
+ * Make sure there is a current window available...
+ */
+ freeglut_assert_window;
+
+ /*
+ * Check if there is an active menu attached to this window...
+ */
+ for( i=0; i<FREEGLUT_MAX_MENUS; i++ )
+ {
+ if( window->Menu[ i ] != NULL && window->MenuActive[ i ] == TRUE )
+ menu = window->Menu[ i ];
+ };
+
+ /*
+ * Did we find an active window?
+ */
+ freeglut_return_if_fail( menu != NULL );
+
+ /*
+ * Check if there was any menu entry active. This would
+ * mean the user has selected a menu entry...
+ */
+ fghCheckMenuSelect( menu );
+
+ /*
+ * Forget about having that menu active anymore, now:
+ */
+ fgStructure.Window->MenuActive[ button ] = FALSE;
+}
+
+/*
+ * Recalculates current menu's box size
+ */
+void fghCalculateMenuBoxSize( void )
+{
+ gint i, width;
+
+ /*
+ * Make sure there is a current menu set
+ */
+ freeglut_assert_ready; freeglut_return_if_fail( fgStructure.Menu != NULL );
+
+ /*
+ * The menu's box size depends on the menu entries:
+ */
+ for( i=0, width=0; i<(gint) g_list_length( fgStructure.Menu->Entries ); i++ )
+ {
+ SFG_MenuEntry* menuEntry = (SFG_MenuEntry *) g_list_nth( fgStructure.Menu->Entries, i )->data;
+
+ /*
+ * Update the menu entry's width value
+ */
+ menuEntry->Width = glutBitmapLength( FREEGLUT_MENU_FONT, menuEntry->Text->str );
+
+ /*
+ * Check if it's the biggest we've found
+ */
+ if( menuEntry->Width > width )
+ width = menuEntry->Width;
+ }
+
+ /*
+ * Store the menu's box size now:
+ */
+ fgStructure.Menu->Height = i * FREEGLUT_MENU_HEIGHT;
+ fgStructure.Menu->Width = width;
+}
+
+
+/* -- 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
+ */
+ return( fgCreateMenu( callback )->ID );
+}
+
+/*
+ * Destroys a menu object, removing all references to it
+ */
+void FGAPIENTRY glutDestroyMenu( int menuID )
+{
+ SFG_Menu* menu = fgMenuByID( menuID );
+
+ freeglut_assert_ready; freeglut_return_if_fail( menu != NULL );
+
+ /*
+ * 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_assert_ready;
+
+ /*
+ * Is there a current menu set?
+ */
+ if( fgStructure.Menu != NULL )
+ {
+ /*
+ * Yes, there is indeed...
+ */
+ return( fgStructure.Menu->ID );
+ }
+
+ /*
+ * No, there is no current menu at all
+ */
+ return( 0 );
+}
+
+/*
+ * Sets the current menu given it's menu ID
+ */
+void FGAPIENTRY glutSetMenu( int menuID )
+{
+ SFG_Menu* menu = fgMenuByID( menuID );
+
+ freeglut_assert_ready; freeglut_return_if_fail( menu != NULL );
+
+ /*
+ * The current menu pointer is stored in fgStructure.Menu
+ */
+ fgStructure.Menu = menu;
+}
+
+/*
+ * Adds a menu entry to the bottom of the current menu
+ */
+void FGAPIENTRY glutAddMenuEntry( const char* label, int value )
+{
+ SFG_MenuEntry* menuEntry = g_new0( SFG_MenuEntry, 1 );
+
+ /*
+ * Make sure there is a current menu set
+ */
+ freeglut_assert_ready; freeglut_return_if_fail( fgStructure.Menu != NULL );
+
+ /*
+ * Fill in the appropriate values...
+ */
+ menuEntry->Text = g_string_new( label );
+ menuEntry->ID = value;
+
+ /*
+ * Have the new menu entry attached to the current menu
+ */
+ fgStructure.Menu->Entries = g_list_append( fgStructure.Menu->Entries, menuEntry );
+
+ /*
+ * Update the menu's dimensions now
+ */
+ fghCalculateMenuBoxSize();
+}
+
+/*
+ * Add a sub menu to the bottom of the current menu
+ */
+void FGAPIENTRY glutAddSubMenu( const char* label, int subMenuID )
+{
+ SFG_MenuEntry* menuEntry = g_new0( SFG_MenuEntry, 1 );
+ SFG_Menu* subMenu = fgMenuByID( subMenuID );
+
+ /*
+ * Make sure there is a current menu and the sub menu
+ * we want to attach actually exists...
+ */
+ freeglut_assert_ready; freeglut_return_if_fail( fgStructure.Menu != NULL );
+ freeglut_return_if_fail( subMenu != NULL );
+
+ /*
+ * Fill in the appropriate values
+ */
+ menuEntry->Text = g_string_new( label );
+ menuEntry->SubMenu = subMenu;
+ menuEntry->ID = -1;
+
+ /*
+ * Have the new menu entry attached to the current menu
+ */
+ fgStructure.Menu->Entries = g_list_append( fgStructure.Menu->Entries, menuEntry );
+
+ /*
+ * Update the menu's dimensions now
+ */
+ 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;
+
+ /*
+ * Make sure there is a current menu set...
+ */
+ freeglut_assert_ready; freeglut_return_if_fail( fgStructure.Menu != NULL );
+
+ /*
+ * Make sure the item counter seems valid
+ */
+ freeglut_return_if_fail( (item > 0) && (item <= (gint) g_list_length( fgStructure.Menu->Entries ) ) );
+
+ /*
+ * Get n-th menu entry in the current menu, starting from one:
+ */
+ menuEntry = (SFG_MenuEntry *) g_list_nth( fgStructure.Menu->Entries, item - 1 )->data;
+
+ /*
+ * We want it to become a normal menu entry, so:
+ */
+ if( menuEntry->Text != NULL )
+ g_string_free( menuEntry->Text, TRUE );
+
+ menuEntry->Text = g_string_new( label );
+ menuEntry->ID = value;
+ menuEntry->SubMenu = NULL;
+
+ /*
+ * Update the menu's dimensions now
+ */
+ 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 = fgMenuByID( subMenuID );
+ SFG_MenuEntry* menuEntry = NULL;
+
+ /*
+ * Make sure there is a current menu set and the sub menu exists...
+ */
+ freeglut_assert_ready; freeglut_return_if_fail( fgStructure.Menu != NULL );
+ freeglut_return_if_fail( subMenu != NULL );
+
+ /*
+ * Make sure the item counter seems valid
+ */
+ freeglut_return_if_fail( (item > 0) && (item <= (gint) g_list_length( fgStructure.Menu->Entries ) ) );
+
+ /*
+ * Get n-th menu entry in the current menu, starting from one:
+ */
+ menuEntry = (SFG_MenuEntry *) g_list_nth( fgStructure.Menu->Entries, item - 1 )->data;
+
+ /*
+ * We want it to become a sub menu entry, so:
+ */
+ if( menuEntry->Text != NULL )
+ g_string_free( menuEntry->Text, TRUE );
+
+ menuEntry->Text = g_string_new( label );
+ menuEntry->SubMenu = subMenu;
+ menuEntry->ID = -1;
+
+ /*
+ * Update the menu's dimensions now
+ */
+ fghCalculateMenuBoxSize();
+}
+
+/*
+ * Removes the specified menu item from the current menu
+ */
+void FGAPIENTRY glutRemoveMenuItem( int item )
+{
+ SFG_MenuEntry* menuEntry;
+
+ /*
+ * Make sure there is a current menu set
+ */
+ freeglut_assert_ready; freeglut_return_if_fail( fgStructure.Menu != NULL );
+
+ /*
+ * Make sure the item counter seems valid
+ */
+ freeglut_return_if_fail( (item > 0) && (item <= (gint) g_list_length( fgStructure.Menu->Entries ) ) );
+
+ /*
+ * Removing a menu entry is quite simple...
+ */
+ menuEntry = (SFG_MenuEntry *) g_list_nth( fgStructure.Menu->Entries, item - 1 )->data;
+
+ fgStructure.Menu->Entries = g_list_remove(
+ fgStructure.Menu->Entries,
+ menuEntry
+ );
+
+ /*
+ * Free the entry label string, too
+ */
+ g_string_free( menuEntry->Text, TRUE );
+
+ /*
+ * Update the menu's dimensions now
+ */
+ fghCalculateMenuBoxSize();
+}
+
+/*
+ * Attaches a menu to the current window
+ */
+void FGAPIENTRY glutAttachMenu( int button )
+{
+ freeglut_assert_ready;
+
+ /*
+ * There must be a current window and a current menu set:
+ */
+ freeglut_return_if_fail( fgStructure.Window != NULL || fgStructure.Menu != NULL );
+
+ /*
+ * Make sure the button value is valid (0, 1 or 2, see freeglut.h)
+ */
+ freeglut_return_if_fail( button == GLUT_LEFT_BUTTON || button == GLUT_MIDDLE_BUTTON || button == GLUT_RIGHT_BUTTON );
+
+ /*
+ * It is safe now to attach the menu
+ */
+ fgStructure.Window->Menu[ button ] = fgStructure.Menu;
+}
+
+/*
+ * Detaches a menu from the current window
+ */
+void FGAPIENTRY glutDetachMenu( int button )
+{
+ freeglut_assert_ready;
+
+ /*
+ * There must be a current window set:
+ */
+ freeglut_return_if_fail( fgStructure.Window != NULL );
+
+ /*
+ * Make sure the button value is valid (0, 1 or 2, see freeglut.h)
+ */
+ freeglut_return_if_fail( button != 0 && button != 1 && button != 2 );
+
+ /*
+ * It is safe now to detach the menu
+ */
+ fgStructure.Window->Menu[ button ] = NULL;
+}
+
+/*** 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "freeglut-misc"
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/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
+ */
+int FGAPIENTRY glutExtensionSupported( const char* extension )
+{
+ /*
+ * Grab the current context's OpenGL extensions
+ * and create a new GLib lexical analyzer...
+ */
+ gchar *glExtensions = (gchar *) glGetString( GL_EXTENSIONS );
+ GScanner* scanner = g_scanner_new( NULL );
+ gint i;
+
+ /*
+ * Make sure there is a current window, and thus -- a current context available
+ */
+ freeglut_assert_ready; freeglut_return_val_if_fail( fgStructure.Window != NULL, 0 );
+
+ /*
+ * Fail if there is no extension, extensions or scanner available
+ */
+ freeglut_return_val_if_fail( (scanner != NULL) && (strlen( extension ) > 0)
+ && (strlen( glExtensions ) > 0), 0 );
+
+ /*
+ * Check if the extension itself looks valid
+ */
+ for( i=0; i<(gint) strlen( extension ); i++ )
+ if( extension[ i ] == ' ' )
+ return( 0 );
+
+ /*
+ * Set the scanner's input name (for debugging)
+ */
+ scanner->input_name = "glutExtensionSupported()";
+
+ /*
+ * Start the lexical analysis of the extensions string
+ */
+ g_scanner_input_text( scanner, glExtensions, strlen( glExtensions ) );
+
+ /*
+ * While there are any more tokens to be checked...
+ */
+ while( !g_scanner_eof( scanner ) )
+ {
+ /*
+ * Actually we're expecting only string tokens
+ */
+ GTokenType tokenType = g_scanner_get_next_token( scanner );
+
+ /*
+ * We are looking for identifiers
+ */
+ if( tokenType == G_TOKEN_IDENTIFIER )
+ {
+ /*
+ * Compare the token and the extension string
+ */
+ if( strcmp( scanner->value.v_identifier, extension ) == 0 )
+ {
+ /*
+ * OKi, we have found the extension string we've been looking for
+ */
+ g_scanner_destroy( scanner );
+ return( 1 );
+ }
+ }
+ }
+
+ /*
+ * Well, looks like we have failed to find the extension string
+ */
+ g_scanner_destroy( scanner );
+ return( 0 );
+}
+
+/*
+ * This function reports all the errors that happened till now
+ */
+void FGAPIENTRY glutReportErrors( void )
+{
+ GLenum error = glGetError();
+
+ /*
+ * Keep reporting errors as long as there are any...
+ */
+ while( error != GL_NO_ERROR )
+ {
+ /*
+ * Print the current error
+ */
+# undef G_LOG_DOMAIN
+# define G_LOG_DOMAIN ((gchar *) 0)
+
+ g_warning( "GL error: %s", gluErrorString( error ) );
+
+# undef G_LOG_DOMAIN
+# define G_LOG_DOMAIN "freeglut_misc.c"
+
+ /*
+ * Grab the next error value
+ */
+ error = glGetError();
+ };
+}
+
+/*
+ * Turns the ignore key auto repeat feature on and off
+ */
+void FGAPIENTRY glutIgnoreKeyRepeat( int ignore )
+{
+ /*
+ * This is simple and not demanging...
+ */
+ fgState.IgnoreKeyRepeat = ignore ? TRUE : FALSE;
+}
+
+/*
+ * Hints the window system whether to generate key auto repeat, or not. This is evil.
+ */
+void FGAPIENTRY glutSetKeyRepeat( int repeatMode )
+{
+#if TARGET_HOST_UNIX_X11
+
+ freeglut_assert_ready;
+
+ /*
+ * This is really evil, but let's have this done.
+ */
+ switch( repeatMode )
+ {
+ case GLUT_KEY_REPEAT_OFF: XAutoRepeatOff( fgDisplay.Display ); break;
+ case GLUT_KEY_REPEAT_ON: XAutoRepeatOn( fgDisplay.Display ); break;
+ case GLUT_KEY_REPEAT_DEFAULT:
+ {
+ XKeyboardState keyboardState;
+
+ /*
+ * Query the current keyboard state
+ */
+ XGetKeyboardControl( fgDisplay.Display, &keyboardState );
+
+ /*
+ * Set the auto key repeat basing on the global settings
+ */
+ glutSetKeyRepeat(
+ keyboardState.global_auto_repeat == AutoRepeatModeOn ?
+ GLUT_KEY_REPEAT_ON : GLUT_KEY_REPEAT_OFF
+ );
+ }
+ break;
+
+ default:
+ /*
+ * Whoops, this was not expected at all
+ */
+ g_assert_not_reached();
+ }
+
+#endif
+}
+
+/*
+ * Forces the joystick callback to be executed
+ */
+void FGAPIENTRY glutForceJoystickFunc( void )
+{
+ freeglut_assert_ready;
+
+ /*
+ * Is there a current window selected?
+ */
+ freeglut_return_if_fail( fgStructure.Window != NULL );
+
+ /*
+ * Check if there is a joystick callback hooked to the current window
+ */
+ freeglut_return_if_fail( fgStructure.Window->Callbacks.Joystick != NULL );
+
+ /*
+ * Poll the joystick now, using the current window's joystick callback
+ */
+ fgJoystickPollWindow( fgStructure.Window );
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutSetColor( int nColor, GLfloat red, GLfloat green, GLfloat blue )
+{
+ /*
+ *
+ */
+}
+
+/*
+ *
+ */
+GLfloat FGAPIENTRY glutGetColor( int color, int component )
+{
+ /*
+ *
+ */
+ return( 0.0f );
+}
+
+/*
+ *
+ */
+void FGAPIENTRY glutCopyColormap( int window )
+{
+ /*
+ *
+ */
+}
+
+/*** 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "freeglut-overlay"
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/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
+/*
+ * 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "freeglut-state"
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/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 ---------------------------------------------------- */
+
+/*
+ * Those are definitions introduced to make the glutGet() more easy,
+ * however they might introduce errors if someone ports GLX to Win32 :)
+ *
+ * Btw. this is not that a bad idea (wrapping WGL around GLX)...
+ */
+#if TARGET_HOST_WIN32
+# define GLX_RGBA 0x01
+# define GLX_DOUBLEBUFFER 0x02
+# define GLX_BUFFER_SIZE 0x03
+# define GLX_STENCIL_SIZE 0x04
+# define GLX_DEPTH_SIZE 0x05
+# define GLX_RED_SIZE 0x06
+# define GLX_GREEN_SIZE 0x07
+# define GLX_BLUE_SIZE 0x08
+# define GLX_ALPHA_SIZE 0x09
+# define GLX_ACCUM_RED_SIZE 0x0A
+# define GLX_ACCUM_GREEN_SIZE 0x0B
+# define GLX_ACCUM_BLUE_SIZE 0x0C
+# define GLX_ACCUM_ALPHA_SIZE 0x0D
+# define GLX_STEREO 0x0E
+#endif
+
+
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
+
+/*
+ * Queries the GL context about some attributes
+ */
+static gint fghGetConfig( gint attribute )
+{
+ gint returnValue;
+
+ /*
+ * Return nothing if there is no current window set
+ */
+ if( fgStructure.Window == NULL )
+ return( 0 );
+
+#if TARGET_HOST_UNIX_X11
+ /*
+ * glXGetConfig should work fine
+ */
+ glXGetConfig( fgDisplay.Display, fgStructure.Window->Window.VisualInfo, attribute, &returnValue );
+
+#elif TARGET_HOST_WIN32
+ /*
+ * This is going to be a bit harder than the X11 version...
+ */
+# pragma message( "freeglut_state.c::fghGetConfig() says hello world my name is not implemented!" )
+ switch( attribute )
+ {
+ case GLX_RGBA:
+ case GLX_DOUBLEBUFFER:
+ case GLX_BUFFER_SIZE:
+ case GLX_RED_SIZE:
+ case GLX_GREEN_SIZE:
+ case GLX_BLUE_SIZE:
+ case GLX_DEPTH_SIZE:
+ return( 1 );
+
+ case GLX_STENCIL_SIZE:
+ case GLX_ALPHA_SIZE:
+ case GLX_ACCUM_RED_SIZE:
+ case GLX_ACCUM_GREEN_SIZE:
+ case GLX_ACCUM_BLUE_SIZE:
+ case GLX_ACCUM_ALPHA_SIZE:
+ case GLX_STEREO:
+ default:
+ /*
+ * Well, this looks like not implemented to me :)
+ */
+ return( 0 );
+ }
+
+#endif
+
+ /*
+ * Have the query results returned
+ */
+ return( returnValue );
+}
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * General settings query method
+ */
+int FGAPIENTRY glutGet( GLenum eWhat )
+{
+ gint returnValue;
+
+ freeglut_assert_ready;
+
+ /*
+ * Check what is the caller querying for. In chronological code add order.
+ */
+ switch( eWhat )
+ {
+ case GLUT_ELAPSED_TIME:
+ /*
+ * This is easy and nicely portable, as we are using GLib...
+ */
+ return( (int) (g_timer_elapsed( fgState.Timer, NULL ) * 1000.0) );
+
+ /*
+ * 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.X );
+ case GLUT_INIT_WINDOW_Y: return( fgState.Position.Y );
+ case GLUT_INIT_WINDOW_WIDTH: return( fgState.Size.X );
+ case GLUT_INIT_WINDOW_HEIGHT: return( fgState.Size.Y );
+ case GLUT_INIT_DISPLAY_MODE: return( fgState.DisplayMode );
+
+ /*
+ * The window/context specific queries are handled mostly by fghGetConfig().
+ */
+ case GLUT_WINDOW_NUM_SAMPLES:
+ /*
+ * Multisampling. Return what I know about multisampling.
+ */
+ return( 0 );
+
+ /*
+ * The rest of GLX queries is 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
+
+#if TARGET_HOST_UNIX_X11
+ /*
+ * Colormap size is handled in a bit different way than all the rest
+ */
+ case GLUT_WINDOW_COLORMAP_SIZE:
+ /*
+ * Check for the visual type
+ */
+ if( (fghGetConfig( GLX_RGBA )) || (fgStructure.Window == 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 );
+ }
+
+ /*
+ * Otherwise return the number of entries in the colormap
+ */
+ return( fgStructure.Window->Window.VisualInfo->visual->map_entries );
+
+ /*
+ * Those calls are somewhat similiar, as they use XGetWindowAttributes() function
+ */
+ case GLUT_WINDOW_X:
+ case GLUT_WINDOW_Y:
+ {
+ XWindowAttributes winAttributes;
+ Window another, window;
+ gint x, y;
+
+ /*
+ * Return zero if there is no current window set
+ */
+ if( fgStructure.Window == NULL )
+ return( 0 );
+
+ /*
+ * So, grab the current window's position
+ */
+ window = fgStructure.Window->Window.Handle;
+
+ /*
+ * Grab the current window's attributes now
+ */
+ XGetWindowAttributes(
+ fgDisplay.Display,
+ window,
+ &winAttributes
+ );
+
+ /*
+ * Correct the results for the parental relation and border size
+ */
+ XTranslateCoordinates(
+ fgDisplay.Display,
+ window,
+ winAttributes.root,
+ -winAttributes.border_width,
+ -winAttributes.border_width,
+ &x, &y,
+ &another
+ );
+
+ /*
+ * See if we have to return the X or Y coordinate
+ */
+ return( eWhat == GLUT_WINDOW_X ? x : y );
+ }
+
+ case GLUT_WINDOW_WIDTH:
+ case GLUT_WINDOW_HEIGHT:
+ {
+ XWindowAttributes winAttributes;
+
+ /*
+ * Return zero if there is no current window set
+ */
+ if( fgStructure.Window == NULL )
+ return( 0 );
+
+ /*
+ * Checking for window's size is much easier:
+ */
+ XGetWindowAttributes(
+ fgDisplay.Display,
+ fgStructure.Window->Window.Handle,
+ &winAttributes
+ );
+
+ /*
+ * See if to return the window's width or height
+ */
+ return( eWhat == GLUT_WINDOW_WIDTH ? winAttributes.width : winAttributes.height );
+ }
+
+ /*
+ * I do not know yet if there will be a fgChooseVisual() function for Win32
+ */
+ case GLUT_DISPLAY_MODE_POSSIBLE:
+ /*
+ * Check if the current display mode is possible
+ */
+ return( fgChooseVisual() == NULL ? 0 : 1 );
+
+ /*
+ * This is system-dependant
+ */
+ case GLUT_WINDOW_FORMAT_ID:
+ /*
+ * Return the visual ID, if there is a current window naturally:
+ */
+ if( fgStructure.Window == NULL )
+ return( 0 );
+
+ return( fgStructure.Window->Window.VisualInfo->visualid );
+
+#elif TARGET_HOST_WIN32
+
+ case GLUT_WINDOW_X:
+ case GLUT_WINDOW_Y:
+ case GLUT_WINDOW_WIDTH:
+ case GLUT_WINDOW_HEIGHT:
+ {
+ RECT winRect;
+
+ /*
+ * Check if there is a window to be queried for dimensions:
+ */
+ freeglut_return_val_if_fail( fgStructure.Window != NULL, 0 );
+
+ /*
+ * We need to call GetWindowRect() first...
+ */
+ GetWindowRect( fgStructure.Window->Window.Handle, &winRect );
+
+ /*
+ * ...then we've got to correct the results we've just received...
+ */
+ winRect.left += GetSystemMetrics( SM_CXSIZEFRAME ) - 1;
+ winRect.right -= GetSystemMetrics( SM_CXSIZEFRAME ) - 1;
+ winRect.top += GetSystemMetrics( SM_CYSIZEFRAME ) - 1 + GetSystemMetrics( SM_CYCAPTION );
+ winRect.bottom -= GetSystemMetrics( SM_CYSIZEFRAME ) + 1;
+
+ /*
+ * ...and finally return the caller the desired value:
+ */
+ 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_DISPLAY_MODE_POSSIBLE:
+ /*
+ * Check if the current display mode is possible
+ */
+ return( fgSetupPixelFormat( fgStructure.Window, TRUE ) );
+
+ case GLUT_WINDOW_FORMAT_ID:
+ /*
+ * Return the pixel format of the current window
+ */
+ if( fgStructure.Window != NULL )
+ return( GetPixelFormat( fgStructure.Window->Window.Device ) );
+
+ /*
+ * If the current window does not exist, fail:
+ */
+ return( 0 );
+
+#endif
+
+ /*
+ * The window structure queries
+ */
+ case GLUT_WINDOW_PARENT:
+ /*
+ * Return the ID number of current window's parent, if any
+ */
+ if( fgStructure.Window == NULL ) return( 0 );
+ if( fgStructure.Window->Parent == NULL ) return( 0 );
+
+ return( fgStructure.Window->Parent->ID );
+
+ case GLUT_WINDOW_NUM_CHILDREN:
+ /*
+ * Return the number of children attached to the current window
+ */
+ if( fgStructure.Window == NULL )
+ return( 0 );
+
+ return( g_list_length( fgStructure.Window->Children ) );
+
+ case GLUT_WINDOW_CURSOR:
+ /*
+ * Return the currently selected window cursor
+ */
+ if( fgStructure.Window == NULL )
+ return( 0 );
+
+ return( fgStructure.Window->State.Cursor );
+
+ case GLUT_MENU_NUM_ITEMS:
+ /*
+ * Return the number of menu entries in the current menu
+ */
+ if( fgStructure.Menu == NULL )
+ return( 0 );
+
+ return( g_list_length( fgStructure.Menu->Entries ) );
+
+ default:
+ /*
+ * Just have it reported, so that we can see what needs to be implemented
+ */
+ g_warning( "glutGet(): missing enum handle %i\n", eWhat );
+ break;
+ }
+
+ /*
+ * If nothing happens, then we are in deep trouble...
+ */
+ g_assert_not_reached();
+}
+
+/*
+ * Returns various device information.
+ */
+int FGAPIENTRY glutDeviceGet( GLenum eWhat )
+{
+ freeglut_assert_ready;
+
+ /*
+ * See why are we bothered...
+ *
+ * WARNING: we are mostly lying in this function.
+ */
+ switch( eWhat )
+ {
+ case GLUT_HAS_KEYBOARD:
+ /*
+ * We always have a keyboard present on PC machines...
+ */
+ return( TRUE );
+
+#if TARGET_HOST_UNIX_X11
+
+ case GLUT_HAS_MOUSE:
+ /*
+ * Hey, my Atari 65XE hasn't had a mouse!
+ */
+ return( TRUE );
+
+ case GLUT_NUM_MOUSE_BUTTONS:
+ /*
+ * Return the number of mouse buttons available. This is a big guess.
+ */
+ return( 3 );
+
+#elif TARGET_HOST_WIN32
+
+ case GLUT_HAS_MOUSE:
+ /*
+ * The Windows can be booted without a mouse.
+ * It would be nice to have this reported.
+ */
+ return( GetSystemMetrics( SM_MOUSEPRESENT ) );
+
+ case GLUT_NUM_MOUSE_BUTTONS:
+ /*
+ * We are much more fortunate under Win32 about this...
+ */
+ return( GetSystemMetrics( SM_CMOUSEBUTTONS ) );
+
+#endif
+
+ case GLUT_JOYSTICK_POLL_RATE:
+ case GLUT_HAS_JOYSTICK:
+ case GLUT_JOYSTICK_BUTTONS:
+ case GLUT_JOYSTICK_AXES:
+ /*
+ * WARNING: THIS IS A BIG LIE!
+ */
+ return( 0 );
+
+ case GLUT_HAS_SPACEBALL:
+ case GLUT_HAS_DIAL_AND_BUTTON_BOX:
+ case GLUT_HAS_TABLET:
+ /*
+ * Sounds cool. And unuseful.
+ */
+ return( FALSE );
+
+ case GLUT_NUM_SPACEBALL_BUTTONS:
+ case GLUT_NUM_BUTTON_BOX_BUTTONS:
+ case GLUT_NUM_DIALS:
+ case GLUT_NUM_TABLET_BUTTONS:
+ /*
+ * Zero is not the answer. Zero is the question. Continuum is the answer.
+ */
+ return( 0 );
+
+ case GLUT_DEVICE_IGNORE_KEY_REPEAT:
+ /*
+ * Return what we think about the key auto repeat settings
+ */
+ return( fgState.IgnoreKeyRepeat );
+
+ case GLUT_DEVICE_KEY_REPEAT:
+ /*
+ * WARNING: THIS IS A BIG LIE!
+ */
+ return( GLUT_KEY_REPEAT_DEFAULT );
+
+ default:
+ /*
+ * Complain.
+ */
+ g_warning( "glutDeviceGet(): missing enum handle %i\n", eWhat );
+ break;
+ }
+
+ /*
+ * And now -- the failure.
+ */
+ g_assert_not_reached();
+}
+
+/*
+ * This should return the current state of ALT, SHIFT and CTRL keys.
+ */
+int FGAPIENTRY glutGetModifiers( void )
+{
+ /*
+ * Fail if there is no current window or called outside an input callback
+ */
+ if( fgStructure.Window == NULL )
+ return( 0 );
+
+ if( fgStructure.Window->State.Modifiers == 0xffffffff )
+ {
+ g_warning( "glutGetModifiers() called outside an input callback" );
+ return( 0 );
+ }
+
+ /*
+ * Return the current modifiers state otherwise
+ */
+ return( fgStructure.Window->State.Modifiers );
+}
+
+/*
+ * Return the state of the GLUT API overlay subsystem. A misery ;-)
+ */
+int FGAPIENTRY glutLayerGet( GLenum eWhat )
+{
+ freeglut_assert_ready;
+
+ /*
+ * This is easy as layers are not implemented ;-)
+ */
+ switch( eWhat )
+ {
+ case GLUT_OVERLAY_POSSIBLE:
+ /*
+ * Nope, overlays are not possible.
+ */
+ return( FALSE );
+
+ case GLUT_LAYER_IN_USE:
+ /*
+ * The normal plane is always in use
+ */
+ return( GLUT_NORMAL );
+
+ case GLUT_HAS_OVERLAY:
+ /*
+ * No window is allowed to have an overlay
+ */
+ return( FALSE );
+
+ case GLUT_TRANSPARENT_INDEX:
+ /*
+ * Return just anything, which is always defined as zero
+ */
+ return( 0 );
+
+ case GLUT_NORMAL_DAMAGED:
+ /*
+ * Actually I do not know. Maybe.
+ */
+ return( FALSE );
+
+ case GLUT_OVERLAY_DAMAGED:
+ /*
+ * Return minus one to mark that no layer is in use
+ */
+ return( -1 );
+
+ default:
+ /*
+ * Complain to the user about the obvious bug
+ */
+ g_warning( "glutLayerGet(): missing enum handle %i\n", eWhat );
+ break;
+ }
+
+ /*
+ * And fail. That's good. Programs do love failing.
+ */
+ g_assert_not_reached();
+}
+
+/*** END OF FILE ***/
--- /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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "freeglut-structure"
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/freeglut_internal.h"
+
+
+/* -- GLOBAL EXPORTS ------------------------------------------------------- */
+
+/*
+ * The SFG_Structure container holds information about windows and menus
+ * created between glutInit() and glutMainLoop() return.
+ */
+SFG_Structure fgStructure;
+
+
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
+
+/*
+ * 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 gchar* title, gint x, gint y, gint w, gint h, gboolean gameMode )
+{
+ /*
+ * Have the window object created
+ */
+ SFG_Window* window = g_new0( SFG_Window, 1 );
+ gint fakeArgc = 0;
+
+ /*
+ * If the freeglut internals haven't been initialized yet,
+ * do it now. Hack's idea courtesy of Chris Purnell...
+ */
+ if( fgState.Timer == NULL )
+ glutInit( &fakeArgc, NULL );
+
+ /*
+ * Initialize the object properties
+ */
+ window->ID = ++fgStructure.WindowID;
+
+ /*
+ * Does this window have a parent?
+ */
+ if( parent != NULL )
+ {
+ /*
+ * That's quite right, attach this windows as a child window
+ */
+ parent->Children = g_list_append( parent->Children, window );
+ window->Parent = parent;
+ }
+ else
+ {
+ /*
+ * Otherwise add the newly created window to the topmost windows list
+ */
+ fgStructure.Windows = g_list_append( fgStructure.Windows, window );
+ }
+
+ /*
+ * Set the default mouse cursor and reset the modifiers value
+ */
+ window->State.Cursor = GLUT_CURSOR_INHERIT;
+ window->State.Modifiers = 0xffffffff;
+
+ /*
+ * Open the window now. The fgOpenWindow() function is system
+ * dependant, and resides in freeglut_window.c. Uses fgState.
+ */
+ fgOpenWindow( window, title, x, y, w, h, gameMode );
+
+ /*
+ * Return a pointer to the newly created window
+ */
+ return( window );
+}
+
+/*
+ * This private function creates a menu and adds it to the menus list
+ */
+SFG_Menu* fgCreateMenu( FGCBmenu menuCallback )
+{
+ /*
+ * Have the menu object created
+ */
+ SFG_Menu* menu = g_new0( SFG_Menu, 1 );
+ gint fakeArgc = 0;
+
+ /*
+ * If the freeglut internals haven't been initialized yet,
+ * do it now. Hack's idea courtesy of Chris Purnell...
+ */
+ if( fgState.Timer == NULL )
+ glutInit( &fakeArgc, NULL );
+
+ /*
+ * Initialize the object properties:
+ */
+ menu->ID = ++fgStructure.MenuID;
+ menu->Callback = menuCallback;
+
+ /*
+ * Add it to the menu structure hierarchy
+ */
+ fgStructure.Menus = g_list_append( fgStructure.Menus, menu );
+
+ /*
+ * Newly created menus implicitly become current ones
+ */
+ fgStructure.Menu = menu;
+
+ /*
+ * Return the result to the caller
+ */
+ return( menu );
+}
+
+/*
+ * This function destroys a window and all of it's subwindows. Actually,
+ * another function, defined in freeglut_window.c is called, but this is
+ * a whole different story...
+ */
+void fgDestroyWindow( SFG_Window* window, gboolean needToClose )
+{
+ int i;
+
+ g_assert( window != NULL );
+ freeglut_assert_ready;
+
+ /*
+ * Does this window have any subwindows?
+ */
+ if( window->Children != NULL )
+ {
+ /*
+ * OKi, while there are any subwindows left...
+ */
+ while( g_list_first( window->Children ) != NULL )
+ {
+ SFG_Window* subWindow = g_list_first( window->Children )->data;
+
+ /*
+ * Destroy the first window in the list (possibly destroying
+ * it's subwindows too. This is not very effective, but works
+ */
+ fgDestroyWindow( subWindow, TRUE );
+
+ /*
+ * Remove the just destroyed node from the subwindows list
+ */
+ window->Children = g_list_remove( window->Children, subWindow );
+ }
+
+ /*
+ * Have the list freed now (probably it already is, but you can
+ * never be sure with no GLib documentation on your hdd...)
+ */
+ g_list_free( window->Children );
+ window->Children = NULL;
+ }
+
+ /*
+ * Now we should remove the reference to this window from it's parent
+ */
+ if( window->Parent != NULL )
+ window->Parent->Children = g_list_remove( window->Parent->Children, window );
+
+ /*
+ * OK, this window seems disconnected from the structure enough
+ * in order to be closed without any bigger risks...
+ */
+ if( needToClose == TRUE )
+ fgCloseWindow( window );
+
+ /*
+ * Try removing the window from the parents list in fgStructure.
+ * This might fail as the window is not guaranteed to be there:
+ */
+ fgStructure.Windows = g_list_remove( fgStructure.Windows, window );
+
+ /*
+ * Check if the window is the current one...
+ */
+ if( fgStructure.Window == window )
+ fgStructure.Window = NULL;
+
+ /*
+ * Finally, we can delete the window's object. It hopefully does
+ * have everything inside it freed and we do not have to care...
+ */
+ g_free( window );
+}
+
+/*
+ * This is a helper static function that removes a menu (given it's pointer)
+ * from any windows that can be accessed from a given parent...
+ */
+static void fghRemoveMenuFromWindow( SFG_Window* window, SFG_Menu* menu )
+{
+ gint i;
+
+ /*
+ * Check if the menu is attached to the current window,
+ * if so, have it detached (by overwriting with a NULL):
+ */
+ for( i=0; i<3; i++ )
+ if( window->Menu[ i ] == menu )
+ window->Menu[ i ] = NULL;
+
+ /*
+ * Call this function for all of the window's children recursively:
+ */
+ for( i=0; i<(gint) g_list_length( window->Children ); i++ )
+ fghRemoveMenuFromWindow(
+ (SFG_Window *) g_list_nth( window->Children, i )->data,
+ 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 )
+{
+ gboolean found = FALSE;
+
+ /*
+ * Do not allow removing a menu from itself...
+ */
+ if( from == menu )
+ return;
+
+ /*
+ * Look up for the first entry that matches the given
+ * menu and have it removed, then search again and again:
+ */
+ do
+ {
+ /*
+ * Try searching for the incriminated menu entry
+ */
+ GList* where = g_list_find( from->Entries, menu );
+
+ /*
+ * Make sure we still have a list to be searched
+ */
+ if( where != NULL )
+ {
+ /*
+ * Did we actually find the menu entry we want to remove?
+ */
+ found = ((SFG_Menu *) where->data == menu);
+
+ /*
+ * Need to check that, as the search might have failed
+ */
+ if( found )
+ from->Entries = g_list_remove( from->Entries, menu );
+ }
+ else
+ {
+ /*
+ * It would be nice if we had a stop rule ;-)
+ */
+ found = FALSE;
+ }
+ } while( found == TRUE );
+}
+
+/*
+ * 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 )
+{
+ gint i;
+
+ g_assert( menu != NULL );
+ freeglut_assert_ready;
+
+ /*
+ * First of all, have all references to this menu removed from all windows:
+ */
+ for( i=0; i<(gint) g_list_length( fgStructure.Windows ); i++ )
+ fghRemoveMenuFromWindow(
+ (SFG_Window *) g_list_nth( fgStructure.Windows, i )->data,
+ menu
+ );
+
+ /*
+ * Now proceed with removing menu entries that lead to this menu
+ */
+ for( i=0; i<(gint) g_list_length( fgStructure.Menus ); i++ )
+ fghRemoveMenuFromMenu(
+ (SFG_Menu *) g_list_nth( fgStructure.Menus, i )->data,
+ menu
+ );
+
+ /*
+ * Now we are pretty sure the menu is not used anywhere
+ * and that we can remove all of it's entries
+ */
+ for( i=0; i<(gint) g_list_length( menu->Entries ); i++ )
+ {
+ SFG_MenuEntry* entry = (SFG_MenuEntry *) g_list_nth( menu->Entries, i )->data;
+
+ /*
+ * There might be a string allocated, have it freed:
+ */
+ g_string_free( entry->Text, TRUE );
+
+ /*
+ * Deallocate the entry itself:
+ */
+ g_free( entry );
+ }
+
+ /*
+ * Deallocate the entries list
+ */
+ g_list_free( menu->Entries );
+ menu->Entries = NULL;
+
+ /*
+ * Remove the menu from the menus list
+ */
+ fgStructure.Menus = g_list_remove( fgStructure.Menus, menu );
+
+ /*
+ * If that menu was the current one...
+ */
+ if( fgStructure.Menu == menu )
+ fgStructure.Menu = NULL;
+
+ /*
+ * Have the menu structure freed
+ */
+ g_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. However we do not need allocating anything,
+ * as it is done automagically by GLib when appending new entries to both of them.
+ * Also, no current window/menu is set, as none has been created yet.
+ */
+}
+
+/*
+ * This function is automatically called on glutMainLoop() return. It should deallocate
+ * and destroy all remnants of previous glutInit()-enforced structure initialization...
+ */
+void fgDestroyStructure( void )
+{
+ /*
+ * Just make sure we are not called in vain...
+ */
+ freeglut_assert_ready;
+
+ /*
+ * Make sure all windows and menus have been deallocated
+ */
+ while( fgStructure.Windows != NULL )
+ fgDestroyWindow( (SFG_Window *) g_list_first( fgStructure.Windows )->data, TRUE );
+
+ while( fgStructure.Menus != NULL )
+ fgDestroyMenu( (SFG_Menu *) g_list_first( fgStructure.Menus )->data );
+}
+
+/*
+ * Helper function to enumerate through all registered top-level windows
+ */
+void fgEnumWindows( GFunc enumCallback, SFG_Enumerator* enumerator )
+{
+ gint i;
+
+ g_assert( (enumCallback != NULL) && (enumerator != NULL) );
+ freeglut_assert_ready;
+
+ /*
+ * Check every of the top-level windows
+ */
+ for( i=0; i<(gint) g_list_length( fgStructure.Windows ); i++ )
+ {
+ /*
+ * Execute the callback...
+ */
+ enumCallback( (gpointer) g_list_nth( fgStructure.Windows, i )->data, (gpointer) enumerator );
+
+ /*
+ * If it has been marked as 'found', stop searching
+ */
+ if( enumerator->found == TRUE )
+ return;
+ }
+}
+
+/*
+ * Helper function to enumerate through all a window's subwindows (single level descent)
+ */
+void fgEnumSubWindows( SFG_Window* window, GFunc enumCallback, SFG_Enumerator* enumerator )
+{
+ gint i;
+
+ g_assert( (enumCallback != NULL) && (enumerator != NULL) );
+ freeglut_assert_ready;
+
+ /*
+ * Check every of the window's children:
+ */
+ for( i=0; i<(gint) g_list_length( window->Children ); i++ )
+ {
+ /*
+ * Execute the callback...
+ */
+ enumCallback( (gpointer) g_list_nth( window->Children, i )->data, (gpointer) enumerator );
+
+ /*
+ * If it has been marked as 'found', stop searching
+ */
+ if( enumerator->found == TRUE )
+ return;
+ }
+}
+
+/*
+ * A static helper function to look for a window given it's handle
+ */
+static void fghcbWindowByHandle( gpointer window, gpointer enumerator )
+{
+ /*
+ * Make sure we do not overwrite our precious results...
+ */
+ freeglut_return_if_fail( ((SFG_Enumerator *) enumerator)->found == FALSE );
+
+#if TARGET_HOST_UNIX_X11
+ #define WBHANDLE (Window)
+#elif TARGET_HOST_WIN32
+ #define WBHANDLE (HWND)
+#endif
+
+ /*
+ * Check the window's handle. Hope this works. Looks ugly. That's for sure.
+ */
+ if( ((SFG_Window *) window)->Window.Handle == (WBHANDLE ((SFG_Enumerator *) enumerator)->data) )
+ {
+ ((SFG_Enumerator *) enumerator)->found = TRUE;
+ ((SFG_Enumerator *) enumerator)->data = (gpointer) window;
+
+ return;
+ }
+
+ /*
+ * Otherwise, check this window's children
+ */
+ fgEnumSubWindows( (SFG_Window *) window, fghcbWindowByHandle, enumerator );
+
+#undef WBHANDLE
+}
+
+/*
+ * 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
+#if TARGET_HOST_UNIX_X11
+( Window hWindow )
+#elif TARGET_HOST_WIN32
+( HWND hWindow )
+#endif
+{
+ SFG_Enumerator enumerator;
+
+ /*
+ * This is easy and makes use of the windows enumeration defined above
+ */
+ enumerator.found = FALSE;
+ enumerator.data = (gpointer) hWindow;
+
+ /*
+ * Start the enumeration now:
+ */
+ fgEnumWindows( fghcbWindowByHandle, &enumerator );
+
+ /*
+ * Check if the window has been found or not:
+ */
+ if( enumerator.found == TRUE )
+ return( (SFG_Window *) enumerator.data );
+
+ /*
+ * Otherwise return NULL to mark the failure
+ */
+ return( NULL );
+}
+
+/*
+ * A static helper function to look for a window given it's ID
+ */
+static void fghcbWindowByID( gpointer window, gpointer enumerator )
+{
+ /*
+ * Make sure we do not overwrite our precious results...
+ */
+ g_return_if_fail( ((SFG_Enumerator *) enumerator)->found == FALSE );
+
+ /*
+ * Check the window's handle. Hope this works. Looks ugly. That's for sure.
+ */
+ if( ((SFG_Window *) window)->ID == (gint) (((SFG_Enumerator *) enumerator)->data) )
+ {
+ ((SFG_Enumerator *) enumerator)->found = TRUE;
+ ((SFG_Enumerator *) enumerator)->data = (gpointer) window;
+
+ return;
+ }
+
+ /*
+ * Otherwise, check this window's children
+ */
+ fgEnumSubWindows( (SFG_Window *) 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( gint windowID )
+{
+ SFG_Enumerator enumerator;
+
+ /*
+ * Uses a method very similiar for fgWindowByHandle...
+ */
+ enumerator.found = FALSE;
+ enumerator.data = (gpointer) windowID;
+
+ /*
+ * Start the enumeration now:
+ */
+ fgEnumWindows( fghcbWindowByID, &enumerator );
+
+ /*
+ * Check if the window has been found or not:
+ */
+ if( enumerator.found == TRUE )
+ return( (SFG_Window *) enumerator.data );
+
+ /*
+ * Otherwise return NULL to mark the failure
+ */
+ return( NULL );
+}
+
+/*
+ * Looks up a menu given it's ID. This is easier that fgWindowByXXX
+ * as all menus are placed in a single doubly linked list...
+ */
+SFG_Menu* fgMenuByID( gint menuID )
+{
+ SFG_Menu *menu = NULL;
+ gint i;
+
+ freeglut_assert_ready;
+
+ /*
+ * It's enough to check all entries in fgStructure.Menus...
+ */
+ for( i=0; i<(gint) g_list_length( fgStructure.Menus ); i++ )
+ {
+ /*
+ * Grab the n-th element of the menu objects list...
+ */
+ menu = (SFG_Menu *) g_list_nth( fgStructure.Menus, i )->data;
+
+ /*
+ * Does the ID number match?
+ */
+ if( menu->ID == menuID )
+ return( menu );
+ }
+
+ /*
+ * We have not found the requested menu ID
+ */
+ return( NULL );
+}
+
+/*** 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "freeglut-teapot"
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/freeglut_internal.h"
+
+
+/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */
+
+/*
+ * 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 float 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 float tex[2][2][2] =
+{
+ { {0, 0}, {1, 0} },
+ { {0, 1}, {1, 1} }
+};
+
+static void teapot( GLint grid, GLdouble scale, GLenum type )
+{
+ float p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3];
+ long i, j, k, l;
+
+ 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();
+ glRotatef(270.0, 1.0, 0.0, 0.0);
+ glScalef(0.5 * scale, 0.5 * scale, 0.5 * scale);
+ glTranslatef(0.0, 0.0, -1.5);
+
+ 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;
+ }
+ }
+ }
+ }
+
+ glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2,
+ &tex[0][0][0]);
+ glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
+ &p[0][0][0]);
+ glMapGrid2f(grid, 0.0, 1.0, grid, 0.0, 1.0);
+ glEvalMesh2(type, 0, grid, 0, grid);
+ glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
+ &q[0][0][0]);
+ glEvalMesh2(type, 0, grid, 0, grid);
+ if (i < 6) {
+ glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
+ &r[0][0][0]);
+ glEvalMesh2(type, 0, grid, 0, grid);
+ glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,
+ &s[0][0][0]);
+ glEvalMesh2(type, 0, grid, 0, grid);
+ }
+ }
+
+ glPopMatrix();
+ glPopAttrib();
+}
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Renders a beautiful wired teapot...
+ */
+void FGAPIENTRY glutWireTeapot( GLdouble size )
+{
+ /*
+ * We will use the general teapot rendering code
+ */
+ teapot( 10, size, GL_LINE );
+}
+
+/*
+ * Renders a beautiful filled teapot...
+ */
+void FGAPIENTRY glutSolidTeapot( GLdouble size )
+{
+ /*
+ * We will use the general teapot rendering code
+ */
+ teapot( 7, size, GL_FILL );
+}
+
+/*** END OF FILE ***/
+
+
+
+
+
--- /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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "freeglut-videoresize"
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "freeglut-window"
+
+#include "../include/GL/freeglut.h"
+#include "../include/GL/freeglut_internal.h"
+
+/*
+ * TODO BEFORE THE STABLE RELEASE:
+ *
+ * fgChooseVisual() -- OK, but what about glutInitDisplayString()?
+ * fgSetupPixelFormat -- ignores the display mode settings
+ * fgOpenWindow() -- check the Win32 version, -iconic handling!
+ * fgCloseWindow() -- check the Win32 version
+ * glutCreateWindow() -- see what happens when default position and size is {-1,-1}
+ * glutCreateSubWindow() -- see what happens 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 ---------------------------------------------------- */
+
+/*
+ * Chooses a visual basing on the current display mode settings
+ */
+#if TARGET_HOST_UNIX_X11
+XVisualInfo* fgChooseVisual( void )
+{
+ gint bufferSize[] = { 16, 12, 8, 4, 2, 1 };
+ gboolean wantIndexedMode = FALSE;
+ gint attributes[ 32 ];
+ gint where = 0;
+
+ /*
+ * First we have to process the display mode settings...
+ */
+# define ATTRIB(a) attributes[where++]=a;
+
+ /*
+ * Decide if we want a true or indexed color visual:
+ */
+ if( !(fgState.DisplayMode & GLUT_INDEX) )
+ {
+ /*
+ * We are sure that there will be R, B and B components requested:
+ */
+ ATTRIB( GLX_RGBA );
+ ATTRIB( GLX_RED_SIZE ); ATTRIB( 1 );
+ ATTRIB( GLX_GREEN_SIZE ); ATTRIB( 1 );
+ ATTRIB( GLX_BLUE_SIZE ); ATTRIB( 1 );
+
+ /*
+ * Check if the A component is required, too:
+ */
+ if( fgState.DisplayMode & GLUT_ALPHA )
+ {
+ ATTRIB( GLX_ALPHA_SIZE ); ATTRIB( 1 );
+ }
+ }
+ else
+ {
+ /*
+ * We've got an indexed color request
+ */
+ ATTRIB( GLX_BUFFER_SIZE ); ATTRIB( 8 );
+
+ /*
+ * Set the 'I want indexed mode' switch
+ */
+ wantIndexedMode = TRUE;
+ }
+
+ /*
+ * We can have double or single buffered contexts created
+ */
+ if( fgState.DisplayMode & GLUT_DOUBLE )
+ {
+ ATTRIB( GLX_DOUBLEBUFFER );
+ }
+
+ /*
+ * Stereoscopy seems a nice thing to have
+ */
+ if( fgState.DisplayMode & GLUT_STEREO )
+ {
+ ATTRIB( GLX_STEREO );
+ }
+
+ /*
+ * Depth buffer is almost always required
+ */
+ if( fgState.DisplayMode & GLUT_DEPTH )
+ {
+ ATTRIB( GLX_DEPTH_SIZE ); ATTRIB( 1 );
+ }
+
+ /*
+ * Stenciling support
+ */
+ if( fgState.DisplayMode & GLUT_STENCIL )
+ {
+ ATTRIB( GLX_STENCIL_SIZE ); ATTRIB( 1 );
+ }
+
+ /*
+ * And finally the accumulation buffers
+ */
+ if( fgState.DisplayMode & GLUT_ACCUM )
+ {
+ ATTRIB( GLX_ACCUM_RED_SIZE ); ATTRIB( 1 );
+ ATTRIB( GLX_ACCUM_GREEN_SIZE ); ATTRIB( 1 );
+ ATTRIB( GLX_ACCUM_BLUE_SIZE ); ATTRIB( 1 );
+
+ /*
+ * Check if the A component is required, too:
+ */
+ if( fgState.DisplayMode & GLUT_ALPHA )
+ {
+ ATTRIB( GLX_ACCUM_ALPHA_SIZE ); ATTRIB( 1 );
+ }
+ }
+
+ /*
+ * Push a null at the end of the list
+ */
+ ATTRIB( None );
+
+ /*
+ * OKi now, we've got two cases -- RGB(A) and index mode visuals
+ */
+ if( wantIndexedMode == FALSE )
+ {
+ /*
+ * The easier one. And more common, too.
+ */
+ return( glXChooseVisual( fgDisplay.Display, fgDisplay.Screen, attributes ) );
+ }
+ else
+ {
+ XVisualInfo* visualInfo;
+ int i;
+
+ /*
+ * In indexed mode, we need to check how many bits of depth can we achieve
+ */
+ for( i=0; i<6; i++ )
+ {
+
+ /*
+ * The GLX_BUFFER_SIZE value comes always first, so:
+ */
+ attributes[ 1 ] = bufferSize[ i ];
+
+ /*
+ * Check if such visual is possible
+ */
+ visualInfo = glXChooseVisual( fgDisplay.Display, fgDisplay.Screen, attributes );
+
+ /*
+ * The buffer size are sorted in descendant order, so choose the first:
+ */
+ if( visualInfo != NULL )
+ return( visualInfo );
+ }
+
+ /*
+ * If we are still here, it means that the visual info was not found
+ */
+ return( NULL );
+ }
+}
+#endif
+
+/*
+ * Setup the pixel format for a Win32 window
+ */
+#if TARGET_HOST_WIN32
+gboolean fgSetupPixelFormat( SFG_Window* window, gboolean checkOnly )
+{
+ PIXELFORMATDESCRIPTOR* ppfd, pfd;
+ gint flags, pixelformat;
+
+ /*
+ * Check if the window seems valid
+ */
+ freeglut_return_val_if_fail( window != NULL, 0 );
+
+ /*
+ * The pixel format should allow us to draw to the window using OpenGL
+ */
+ flags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
+
+ /*
+ * It might be the case for us to use double buffering
+ */
+ if( fgState.DisplayMode & GLUT_DOUBLE )
+ flags |= PFD_DOUBLEBUFFER;
+
+ /*
+ * Specify which pixel format do we opt for...
+ */
+# pragma message( "fgSetupPixelFormat(): there is still some work to do here!" )
+
+ pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
+ pfd.nVersion = 1;
+ pfd.dwFlags = flags;
+ pfd.iPixelType = PFD_TYPE_RGBA;
+ pfd.cColorBits = 24;
+ pfd.cRedBits = 0;
+ pfd.cRedShift = 0;
+ pfd.cGreenBits = 0;
+ pfd.cGreenShift = 0;
+ pfd.cBlueBits = 0;
+ pfd.cBlueShift = 0;
+ pfd.cAlphaBits = 0;
+ pfd.cAlphaShift = 0;
+ pfd.cAccumBits = 0;
+ pfd.cAccumRedBits = 0;
+ pfd.cAccumGreenBits = 0;
+ pfd.cAccumBlueBits = 0;
+ pfd.cAccumAlphaBits = 0;
+ pfd.cDepthBits = 32;
+ pfd.cStencilBits = 0;
+ pfd.cAuxBuffers = 0;
+ pfd.iLayerType = PFD_MAIN_PLANE;
+ pfd.bReserved = 0;
+ pfd.dwLayerMask = 0;
+ pfd.dwVisibleMask = 0;
+ pfd.dwDamageMask = 0;
+
+ /*
+ * Fill in the color bits...
+ */
+ pfd.cColorBits = (BYTE) GetDeviceCaps( window->Window.Device, BITSPIXEL );
+ ppfd = &pfd;
+
+ /*
+ * Choose the pixel format that matches our demand
+ */
+ pixelformat = ChoosePixelFormat( window->Window.Device, ppfd );
+ if( pixelformat == 0 )
+ return( FALSE );
+
+ /*
+ * We might have been called to check if the pixel format exists only
+ */
+ if( checkOnly )
+ return( TRUE );
+
+ /*
+ * Finally, set the window's pixel format
+ */
+ if( SetPixelFormat( window->Window.Device, pixelformat, ppfd ) == FALSE )
+ return( FALSE );
+
+ return( TRUE );
+}
+#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 gchar* title, gint x, gint y, gint w, gint h, gboolean gameMode )
+{
+#if TARGET_HOST_UNIX_X11
+ XSetWindowAttributes winAttr;
+ XTextProperty textProperty;
+ XSizeHints sizeHints;
+ XWMHints wmHints;
+ guint32 mask;
+
+ freeglut_assert_ready;
+
+ /*
+ * Here we are upon the stage. Have the visual selected.
+ */
+ window->Window.VisualInfo = fgChooseVisual();
+ g_assert( window->Window.VisualInfo != NULL );
+
+ /*
+ * Have the windows attributes set
+ *
+ * HINT: the masks should be updated when adding/removing callbacks.
+ * This might speed up message processing. Is that true?
+ */
+ winAttr.event_mask = StructureNotifyMask | SubstructureNotifyMask | ExposureMask |
+ ButtonPressMask | ButtonReleaseMask | KeyPressMask |
+ VisibilityChangeMask | EnterWindowMask | LeaveWindowMask |
+ PointerMotionMask | ButtonMotionMask;
+ winAttr.background_pixmap = None;
+ winAttr.background_pixel = 0;
+ winAttr.border_pixel = 0;
+
+ /*
+ * The color map is required, too
+ */
+ winAttr.colormap = XCreateColormap(
+ fgDisplay.Display, fgDisplay.RootWindow,
+ window->Window.VisualInfo->visual, AllocNone
+ );
+
+ /*
+ * This tells the XCreateWindow() what attributes are we supplying it with
+ */
+ mask = CWBackPixmap | CWBorderPixel | CWColormap | CWEventMask;
+
+ /*
+ * Have the window created now
+ */
+ window->Window.Handle = XCreateWindow(
+ fgDisplay.Display,
+ window->Parent == NULL ? fgDisplay.RootWindow : window->Parent->Window.Handle,
+ x, y, w, h, 0,
+ window->Window.VisualInfo->depth, InputOutput,
+ window->Window.VisualInfo->visual, mask,
+ &winAttr
+ );
+
+ /*
+ * The GLX context creation, possibly trying the direct context rendering
+ */
+ window->Window.Context = glXCreateContext(
+ fgDisplay.Display, window->Window.VisualInfo,
+ NULL, fgState.ForceDirectContext | fgState.TryDirectContext
+ );
+
+ /*
+ * Make sure the context is direct when the user wants it forced
+ */
+ if( fgState.ForceDirectContext && !glXIsDirect( fgDisplay.Display, window->Window.Context ) )
+ g_error( "unable to force direct context rendering for window '%s'", title );
+
+ /*
+ * Set the new context as the current one. That's all about the window creation.
+ */
+ glXMakeCurrent(
+ fgDisplay.Display,
+ window->Window.Handle,
+ window->Window.Context
+ );
+
+ /*
+ * Assume the new window is visible by default
+ */
+ window->State.Visible = TRUE;
+
+ /*
+ * For the position and size hints -- make sure we are passing valid values
+ */
+ sizeHints.flags = 0;
+
+ sizeHints.flags |= (fgState.Position.Use == TRUE) ? USPosition : PPosition;
+ sizeHints.flags |= (fgState.Size.Use == TRUE) ? USSize : PSize;
+
+ /*
+ * Fill in the size hints values now (the x, y, width and height
+ * settings are obsolote, are there any more WMs that support them?)
+ */
+ sizeHints.x = x; sizeHints.y = y;
+ sizeHints.width = w; sizeHints.height = h;
+
+ /*
+ * We can have forced all new windows start in iconified state:
+ */
+ wmHints.flags = StateHint;
+ wmHints.initial_state = (fgState.ForceIconic == FALSE) ? NormalState : IconicState;
+
+ /*
+ * Prepare the window and iconified window names...
+ */
+ XStringListToTextProperty( (char **) &title, 1, &textProperty );
+
+ /*
+ * Set the window's properties now
+ */
+ XSetWMProperties(
+ fgDisplay.Display,
+ window->Window.Handle,
+ &textProperty,
+ &textProperty,
+ 0,
+ 0,
+ &sizeHints,
+ &wmHints,
+ NULL
+ );
+
+ /*
+ * Make sure we are informed about the window deletion commands
+ */
+ XSetWMProtocols( fgDisplay.Display, window->Window.Handle, &fgDisplay.DeleteWindow, 1 );
+
+ /*
+ * Finally, have the window mapped to our display
+ */
+ XMapWindow( fgDisplay.Display, window->Window.Handle );
+
+ /*
+ * This somehow fixes the glutGet() GLUT_WINDOW_X and GLUT_WINDOW_Y problem...
+ */
+ XMoveWindow( fgDisplay.Display, window->Window.Handle, x, y );
+
+ /*
+ * In game mode, move the viewport a bit to hide the decorations.
+ * This code depends on the XFree86 video mode extensions.
+ */
+ if( gameMode == TRUE )
+ {
+# ifdef X_XF86VidModeSetViewPort
+
+ /*
+ * Set the newly created window as the current one...
+ */
+ glutSetWindow( window->ID );
+
+ /*
+ * Move the viewport a bit down and right from top-left corner to hide the decorations
+ */
+ XF86VidModeSetViewPort(
+ fgDisplay.Display,
+ fgDisplay.Screen,
+ glutGet( GLUT_WINDOW_X ),
+ glutGet( GLUT_WINDOW_Y )
+ );
+
+# endif
+ }
+
+#elif TARGET_HOST_WIN32
+
+ WNDCLASS wc;
+ gint flags;
+ ATOM atom;
+ HWND hWnd;
+
+ freeglut_assert_ready;
+
+ /*
+ * Grab the window class we have registered on glutInit():
+ */
+ atom = GetClassInfo( fgDisplay.Instance, "FREEGLUT", &wc );
+ g_assert( atom != 0 );
+
+ if( gameMode == FALSE )
+ {
+ /*
+ * Update the window position and dimensions, taking account of window decorations
+ */
+ x -= (GetSystemMetrics( SM_CXSIZEFRAME ) - 1);
+ y -= (GetSystemMetrics( SM_CYSIZEFRAME ) - 1);
+ w += (GetSystemMetrics( SM_CXSIZEFRAME ) - 1)*2;
+ h += (GetSystemMetrics( SM_CYSIZEFRAME ) - 1)*2 + GetSystemMetrics( SM_CYCAPTION );
+
+ /*
+ * Check if the user wants us to use the default position/size
+ */
+ if( fgState.Position.Use == FALSE ) { x = CW_USEDEFAULT; y = CW_USEDEFAULT; }
+ if( fgState.Size .Use == FALSE ) { w = CW_USEDEFAULT; h = CW_USEDEFAULT; }
+
+ /*
+ * There's a small difference between creating the top, child and game mode windows
+ */
+ flags = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE;
+
+ if( window->Parent == NULL )
+ flags |= WS_OVERLAPPEDWINDOW;
+ else
+ flags |= WS_CHILD;
+ }
+ else
+ {
+ /*
+ * In game mode, the story is a little bit different...
+ */
+ g_assert( window->Parent == NULL );
+
+ /*
+ * Set the window creation flags appropriately to make the window entirely visible:
+ */
+ flags = WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE;
+ }
+
+ /*
+ * Create the window now, passing the freeglut window structure as the parameter
+ */
+ window->Window.Handle = CreateWindow(
+ "FREEGLUT",
+ title,
+ flags,
+ x, y, w, h,
+ (HWND) window->Parent == NULL ? NULL : window->Parent->Window.Handle,
+ (HMENU) NULL,
+ fgDisplay.Instance,
+ (LPVOID) window
+ );
+
+ /*
+ * Make sure window was created
+ */
+ g_assert( window->Window.Handle != NULL );
+
+ /*
+ * Show and update the main window. Hide the mouse cursor.
+ */
+ ShowWindow( window->Window.Handle, fgState.ForceIconic ? SW_SHOWMINIMIZED : SW_SHOW );
+ UpdateWindow( window->Window.Handle );
+ ShowCursor( TRUE );
+
+#endif
+
+ /*
+ * Set the newly created window as the current one
+ */
+ glutSetWindow( window->ID );
+}
+
+/*
+ * Closes a window, destroying the frame and OpenGL context
+ */
+void fgCloseWindow( SFG_Window* window )
+{
+ freeglut_assert_ready;
+
+#if TARGET_HOST_UNIX_X11
+ /*
+ * As easy as kill bunnies with axes. Destroy the context first:
+ */
+ glXDestroyContext( fgDisplay.Display, window->Window.Context );
+
+ /*
+ * Then have the window killed:
+ */
+ XDestroyWindow( fgDisplay.Display, window->Window.Handle );
+
+ /*
+ * Finally, flush the rests down the stream
+ */
+ XFlush( fgDisplay.Display );
+
+#elif TARGET_HOST_WIN32
+ /*
+ * Send the WM_CLOSE message to the window now
+ */
+ SendMessage(
+ window->Window.Handle,
+ WM_CLOSE,
+ 0,
+ 0
+ );
+
+#endif
+}
+
+
+/* -- INTERFACE FUNCTIONS -------------------------------------------------- */
+
+/*
+ * Creates a new top-level freeglut window
+ */
+int FGAPIENTRY glutCreateWindow( const char* title )
+{
+ /*
+ * Create a new window and return it's unique ID number
+ */
+ return( fgCreateWindow( NULL, title, fgState.Position.X, fgState.Position.Y,
+ fgState.Size.X, fgState.Size.Y, FALSE )->ID );
+}
+
+/*
+ * This function creates a sub window.
+ */
+int FGAPIENTRY glutCreateSubWindow( int parentID, int x, int y, int w, int h )
+{
+ SFG_Window* window = NULL;
+ SFG_Window* parent = NULL;
+
+ freeglut_assert_ready;
+
+ /*
+ * Find a parent to the newly created window...
+ */
+ parent = fgWindowByID( parentID );
+
+ /*
+ * Fail if the parent has not been found
+ */
+ g_return_val_if_fail( parent != NULL, 0 );
+
+ /*
+ * Create the new window
+ */
+ window = fgCreateWindow( parent, "", x, y, w, h, FALSE );
+
+ /*
+ * Return the new window's ID
+ */
+ return( window->ID );
+}
+
+/*
+ * Destroys a window and all of it's subwindows
+ */
+void FGAPIENTRY glutDestroyWindow( int windowID )
+{
+ /*
+ * Grab the freeglut window pointer from the structure
+ */
+ SFG_Window* window = fgWindowByID( windowID );
+ freeglut_return_if_fail( window != NULL );
+
+ /*
+ * There is a function that performs all needed steps
+ * defined in freeglut_structure.c. Let's use it:
+ */
+ fgDestroyWindow( window, TRUE );
+}
+
+/*
+ * This function selects the current window
+ */
+void FGAPIENTRY glutSetWindow( int ID )
+{
+ SFG_Window* window = NULL;
+
+ /*
+ * Make sure we don't get called too early
+ */
+ freeglut_assert_ready;
+
+ /*
+ * Be wise. Be wise. Be wise. Be quick.
+ */
+ if( fgStructure.Window != NULL )
+ if( fgStructure.Window->ID == ID )
+ return;
+
+ /*
+ * Now we are sure there is sense in looking for the window
+ */
+ window = fgWindowByID( ID );
+
+ /*
+ * In the case of an utter failure...
+ */
+ if( window == NULL )
+ {
+ /*
+ * ...issue a warning message and keep rolling on
+ */
+ g_warning( "glutSetWindow(): window ID %i not found!", ID );
+ return;
+ }
+
+#if TARGET_HOST_UNIX_X11
+ /*
+ * Make the selected window's GLX context the current one
+ */
+ glXMakeCurrent(
+ fgDisplay.Display,
+ window->Window.Handle,
+ window->Window.Context
+ );
+
+#elif TARGET_HOST_WIN32
+ /*
+ * Release the previous' context's device context
+ */
+ if( fgStructure.Window != NULL )
+ ReleaseDC( fgStructure.Window->Window.Handle, fgStructure.Window->Window.Device );
+
+ /*
+ * We will care about releasing the device context later
+ */
+ window->Window.Device = GetDC( window->Window.Handle );
+
+ /*
+ * Set the new current context:
+ */
+ wglMakeCurrent(
+ window->Window.Device,
+ window->Window.Context
+ );
+
+#endif
+
+ /*
+ * Remember that we have changed the current window state
+ */
+ fgStructure.Window = window;
+}
+
+/*
+ * This function returns the ID number of the current window, 0 if none exists
+ */
+int FGAPIENTRY glutGetWindow( void )
+{
+ freeglut_assert_ready;
+
+ /*
+ * Do we have a current window selected?
+ */
+ if( fgStructure.Window == NULL )
+ {
+ /*
+ * Nope. Return zero to mark the state.
+ */
+ return( 0 );
+ }
+
+ /*
+ * Otherwise, return the ID of the current window
+ */
+ return( fgStructure.Window->ID );
+}
+
+/*
+ * This function makes the current window visible
+ */
+void FGAPIENTRY glutShowWindow( void )
+{
+ freeglut_assert_ready; freeglut_assert_window;
+
+#if TARGET_HOST_UNIX_X11
+ /*
+ * Showing the window is done via mapping under X
+ */
+ XMapWindow( fgDisplay.Display, fgStructure.Window->Window.Handle );
+ XFlush( fgDisplay.Display );
+
+#elif TARGET_HOST_WIN32
+ /*
+ * Restore the window's originial position and size
+ */
+ ShowWindow( fgStructure.Window->Window.Handle, SW_SHOW );
+
+#endif
+}
+
+/*
+ * This function hides the current window
+ */
+void FGAPIENTRY glutHideWindow( void )
+{
+ freeglut_assert_ready; freeglut_assert_window;
+
+#if TARGET_HOST_UNIX_X11
+ /*
+ * The way we hide a window depends on if we're dealing
+ * with a top-level or children one...
+ */
+ if( fgStructure.Window->Parent == NULL )
+ {
+ /*
+ * This is a top-level window
+ */
+ XWithdrawWindow( fgDisplay.Display, fgStructure.Window->Window.Handle, fgDisplay.Screen );
+ }
+ else
+ {
+ /*
+ * Nope, it's a child window
+ */
+ XUnmapWindow( fgDisplay.Display, fgStructure.Window->Window.Handle );
+ }
+
+ /*
+ * Flush the X state now
+ */
+ XFlush( fgDisplay.Display );
+
+#elif TARGET_HOST_WIN32
+ /*
+ * Hide the window
+ */
+ ShowWindow( fgStructure.Window->Window.Handle, SW_HIDE );
+
+#endif
+}
+
+/*
+ * Iconify the current window (top-level windows only)
+ */
+void FGAPIENTRY glutIconifyWindow( void )
+{
+ freeglut_assert_ready; freeglut_assert_window;
+
+#if TARGET_HOST_UNIX_X11
+ /*
+ * Iconify the window and flush the X state
+ */
+ XIconifyWindow( fgDisplay.Display, fgStructure.Window->Window.Handle, fgDisplay.Screen );
+ XFlush( fgDisplay.Display );
+
+#elif TARGET_HOST_WIN32
+ /*
+ * Minimize the current window (this should be the same as X window iconifying)
+ */
+ ShowWindow( fgStructure.Window->Window.Handle, SW_MINIMIZE );
+
+#endif
+}
+
+/*
+ * Set the current window's title
+ */
+void FGAPIENTRY glutSetWindowTitle( char* title )
+{
+ freeglut_assert_ready; freeglut_assert_window;
+
+ /*
+ * Works only for top-level windows
+ */
+ if( fgStructure.Window->Parent != NULL )
+ return;
+
+#if TARGET_HOST_UNIX_X11
+ {
+ XTextProperty text;
+
+ /*
+ * Prepare the text properties
+ */
+ text.value = (unsigned char *) title;
+ text.encoding = XA_STRING;
+ text.format = 8;
+ text.nitems = strlen( title );
+
+ /*
+ * Set the title now
+ */
+ XSetWMName(
+ fgDisplay.Display,
+ fgStructure.Window->Window.Handle,
+ &text
+ );
+
+ /*
+ * Have the X display state flushed
+ */
+ XFlush( fgDisplay.Display );
+ }
+
+#elif TARGET_HOST_WIN32
+ /*
+ * This seems to be a bit easier under Win32
+ */
+ SetWindowText( fgStructure.Window->Window.Handle, title );
+
+#endif
+}
+
+/*
+ * Set the current window's iconified title
+ */
+void FGAPIENTRY glutSetIconTitle( char* title )
+{
+ freeglut_assert_ready; freeglut_assert_window;
+
+ /*
+ * Works only for top-level windows
+ */
+ if( fgStructure.Window->Parent != NULL )
+ return;
+
+#if TARGET_HOST_UNIX_X11
+ {
+ XTextProperty text;
+
+ /*
+ * Prepare the text properties
+ */
+ text.value = (unsigned char *) title;
+ text.encoding = XA_STRING;
+ text.format = 8;
+ text.nitems = strlen( title );
+
+ /*
+ * Set the title now
+ */
+ XSetWMIconName(
+ fgDisplay.Display,
+ fgStructure.Window->Window.Handle,
+ &text
+ );
+
+ /*
+ * Have the X display state flushed
+ */
+ XFlush( fgDisplay.Display );
+ }
+
+#elif TARGET_HOST_WIN32
+ /*
+ * This seems to be a bit easier under Win32
+ */
+ SetWindowText( fgStructure.Window->Window.Handle, title );
+
+#endif
+}
+
+/*
+ * Change the current window's size
+ */
+void FGAPIENTRY glutReshapeWindow( int width, int height )
+{
+ freeglut_assert_ready; freeglut_assert_window;
+
+#if TARGET_HOST_UNIX_X11
+ /*
+ * Resize the window and flush the X state
+ */
+ XResizeWindow( fgDisplay.Display, fgStructure.Window->Window.Handle, width, height );
+ XFlush( fgDisplay.Display );
+
+#elif TARGET_HOST_WIN32
+ {
+ RECT winRect;
+
+ /*
+ * First off, grab the current window's position
+ */
+ GetWindowRect( fgStructure.Window->Window.Handle, &winRect );
+
+ /*
+ * Resize the window, forcing a redraw to happen
+ */
+ MoveWindow(
+ fgStructure.Window->Window.Handle,
+ winRect.left,
+ winRect.top,
+ width,
+ height,
+ TRUE
+ );
+ }
+#endif
+}
+
+/*
+ * Change the current window's position
+ */
+void FGAPIENTRY glutPositionWindow( int x, int y )
+{
+ freeglut_assert_ready; freeglut_assert_window;
+
+#if TARGET_HOST_UNIX_X11
+ /*
+ * Reposition the window and flush the X state
+ */
+ XMoveWindow( fgDisplay.Display, fgStructure.Window->Window.Handle, x, y );
+ XFlush( fgDisplay.Display );
+
+#elif TARGET_HOST_WIN32
+ {
+ RECT winRect;
+
+ /*
+ * First off, grab the current window's position
+ */
+ GetWindowRect( fgStructure.Window->Window.Handle, &winRect );
+
+ /*
+ * Reposition the window, forcing a redraw to happen
+ */
+ MoveWindow(
+ fgStructure.Window->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_assert_ready; freeglut_assert_window;
+
+#if TARGET_HOST_UNIX_X11
+ /*
+ * Lower the current window
+ */
+ XLowerWindow( fgDisplay.Display, fgStructure.Window->Window.Handle );
+
+#elif TARGET_HOST_WIN32
+ /*
+ * Set the new window's Z position, not affecting the rest of the settings:
+ */
+ SetWindowPos(
+ fgStructure.Window->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_assert_ready; freeglut_assert_window;
+
+#if TARGET_HOST_UNIX_X11
+ /*
+ * Raise the current window
+ */
+ XRaiseWindow( fgDisplay.Display, fgStructure.Window->Window.Handle );
+
+#elif TARGET_HOST_WIN32
+ /*
+ * Set the new window's Z position, not affecting the rest of the settings:
+ */
+ SetWindowPos(
+ fgStructure.Window->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 )
+{
+ freeglut_assert_ready; freeglut_assert_window;
+
+ /*
+ * Just have the window repositioned and resized
+ */
+ glutPositionWindow( 0, 0 );
+
+ glutReshapeWindow(
+ fgDisplay.ScreenWidth,
+ fgDisplay.ScreenHeight
+ );
+}
+
+/*** END OF FILE ***/
+
+
+
+
+
+
+
+
+
--- /dev/null
+INVALID TEMPLATE, MOVED TO XFREE86-STYLE LICENSE
+
+/*
+ * |FILENAME|
+ *
+ * Here comes the file's contents description.
+ *
+ * Copyright (c) |YEAR| by |AUTHOR|
+ * Written by |AUTHOR|, <|EMAIL|>
+ * Creation date: |DATE|
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
--- /dev/null
+INVALID TEMPLATE, MOVED TO XFREE86-STYLE LICENSE
+
+/*
+ * |FILENAME|
+ *
+ * Here comes the file's contents description.
+ *
+ * Copyright (c) |YEAR| by |AUTHOR|
+ * Written by |AUTHOR|, <|EMAIL|>
+ * Creation date: |DATE|
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
--- /dev/null
+Microsoft Developer Studio Workspace File, Format Version 5.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freeglut13"=.\freeglut13.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
--- /dev/null
+# KDE Config File
+[include/freeglut.h]
+install_location=
+dist=true
+install=false
+type=HEADER
+[include/Makefile.am]
+files=include/GL/freeglut.h,include/GL/freeglut_internal.h,
+sub_dirs=
+type=normal
+[Workspace_1]
+openfiles=Nienazwany.h,Nienazwany.cpp,/home/olszta/freeglut/include/GL/freeglut_internal.h,/home/olszta/freeglut/freeglut-1.3/freeglut_callbacks.c,/home/olszta/freeglut/freeglut-1.3/freeglut_gamemode.c,/home/olszta/freeglut/freeglut-1.3/freeglut_init.c,/home/olszta/freeglut/freeglut-1.3/freeglut_main.c,/home/olszta/freeglut/freeglut-1.3/freeglut_window.c,/home/olszta/freeglut/freeglut-1.3/freeglut_misc.c,/home/olszta/freeglut/include/GL/freeglut.h,/home/olszta/freeglut/freeglut-1.3/freeglut_cursor.c,/home/olszta/freeglut/freeglut-1.3/freeglut_geometry.c,/home/olszta/freeglut/freeglut-1.3/freeglut_font_data.c,/home/olszta/freeglut/freeglut-1.3/freeglut_videoresize.c,/home/olszta/freeglut/freeglut-1.3/freeglut_teapot.c,/home/olszta/freeglut/freeglut-1.3/freeglut_structure.c,/home/olszta/freeglut/freeglut-1.3/freeglut_state.c,
+show_outputview=true
+show_treeview=true
+header_file=/home/olszta/freeglut/include/GL/freeglut.h
+cpp_file=/home/olszta/freeglut/freeglut-1.3/freeglut_state.c
+browser_file=file:/usr/doc/kde/HTML/default/kdevelop/welcome/index.html
+[COPYING]
+install_location=
+dist=true
+install=false
+type=DATA
+[freeglut-1.3/freeglut_videoresize.c]
+install_location=
+dist=true
+install=false
+type=SOURCE
+[freeglut-1.3/docs/Makefile.am]
+type=normal
+sub_dirs=
+[Config for BinMakefileAm]
+ldflags=
+bin_program=freeglut
+cxxflags=-O0 -g3 -Wall
+[po/Makefile.am]
+type=po
+sub_dirs=
+[freeglut-1.3/Makefile.am]
+files=freeglut-1.3/freeglut_callbacks.c,freeglut-1.3/freeglut_cursor.c,freeglut-1.3/freeglut_display.c,freeglut-1.3/freeglut_font.c,freeglut-1.3/freeglut_font_data.c,freeglut-1.3/freeglut_gamemode.c,freeglut-1.3/freeglut_geometry.c,freeglut-1.3/freeglut_init.c,freeglut-1.3/freeglut_joystick.c,freeglut-1.3/freeglut_main.c,freeglut-1.3/freeglut_menu.c,freeglut-1.3/freeglut_misc.c,freeglut-1.3/freeglut_overlay.c,freeglut-1.3/freeglut_state.c,freeglut-1.3/freeglut_structure.c,freeglut-1.3/freeglut_teapot.c,freeglut-1.3/freeglut_videoresize.c,freeglut-1.3/freeglut_window.c,
+type=prog_main
+sub_dirs=
+[freeglut.kdevprj]
+install_location=
+dist=true
+install=false
+type=DATA
+[README]
+install_location=
+dist=true
+install=false
+type=DATA
+[freeglut-1.3/freeglut_gamemode.c]
+install_location=
+dist=true
+install=false
+type=SOURCE
+[freeglut-1.3/freeglut_menu.c]
+install_location=
+dist=true
+install=false
+type=SOURCE
+[LFV Groups]
+GNU=AUTHORS,COPYING,ChangeLog,INSTALL,README,TODO,NEWS,
+Others=*,
+groups=Headers,Sources,GNU,Others,
+Sources=*.cpp,*.c,*.cc,*.C,*.cxx,*.ec,*.ecpp,*.lxx,*.l++,*.ll,*.l,
+Headers=*.h,*.hxx,*.hpp,*.H,
+[freeglut-1.3/docs/en/Makefile.am]
+type=normal
+sub_dirs=
+[freeglut-1.3/freeglut_font.c]
+install_location=
+dist=true
+install=false
+type=SOURCE
+[freeglut-1.3/freeglut_window.c]
+install_location=
+dist=true
+install=false
+type=SOURCE
+[freeglut-1.3/freeglut_main.c]
+install_location=
+dist=true
+install=false
+type=SOURCE
+[freeglut-1.3/freeglut_state.c]
+install_location=
+dist=true
+install=false
+type=SOURCE
+[freeglut-1.3/freeglut_callbacks.c]
+install_location=
+dist=true
+install=false
+type=SOURCE
+[include/GL/freeglut_internal.h]
+install_location=
+dist=true
+install=false
+type=HEADER
+[freeglut-1.3/freeglut_structure.c]
+install_location=
+dist=true
+install=false
+type=SOURCE
+[ChangeLog]
+install_location=
+dist=true
+install=false
+type=DATA
+[freeglut-1.3/freeglut_geometry.c]
+install_location=
+dist=true
+install=false
+type=SOURCE
+[General]
+makefiles=Makefile.am,freeglut-1.3/Makefile.am,freeglut-1.3/docs/Makefile.am,freeglut-1.3/docs/en/Makefile.am,po/Makefile.am,include/Makefile.am,
+version_control=None
+project_type=normal_empty
+author=Pawel W. Olszta
+sub_dir=freeglut-1.3/
+lfv_open_groups=Headers,Sources,
+workspace=1
+project_name=freeglut
+version=0.1
+email=olszta@sourceforge.net
+kdevprj_version=1.0beta2
+[INSTALL]
+install_location=
+dist=true
+install=false
+type=DATA
+[TODO]
+install_location=
+dist=true
+install=false
+type=DATA
+[freeglut-1.3/freeglut_init.c]
+install_location=
+dist=true
+install=false
+type=SOURCE
+[freeglut-1.3/freeglut_display.c]
+install_location=
+dist=true
+install=false
+type=SOURCE
+[freeglut-1.3/freeglut_overlay.c]
+install_location=
+dist=true
+install=false
+type=SOURCE
+[freeglut.lsm]
+install_location=
+dist=true
+install=false
+type=DATA
+[freeglut-1.3/freeglut_misc.c]
+install_location=
+dist=true
+install=false
+type=SOURCE
+[Makefile.am]
+files=freeglut.kdevprj,AUTHORS,COPYING,ChangeLog,INSTALL,README,TODO,freeglut.lsm,
+type=normal
+sub_dirs=freeglut-1.3,include,
+[freeglut-1.3/freeglut_cursor.c]
+install_location=
+dist=true
+install=false
+type=SOURCE
+[AUTHORS]
+install_location=
+dist=true
+install=false
+type=DATA
--- /dev/null
+Begin3
+Title: freeglut-1.3
+Version: 0.1 alpha
+Entered-date:
+Description: The free OpenGL utility toolkit, alternative to the GLUT library
+Keywords:
+Author: Pawel W. Olszta <olszta@users.sourceforge.net>
+Maintained-by: Pawel W. Olszta <olszta@users.sourceforge.net>
+Primary-site: http://freeglut.sourceforge.net
+Home-page: http://freeglut.sourceforge.net
+Original-site:
+Platforms: Linux and other Unices
+Copying-policy: X-Consortium style license
+End
--- /dev/null
+# Microsoft Developer Studio Project File - Name="freeglut13" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=freeglut13 - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "freeglut13.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "freeglut13.mak" CFG="freeglut13 - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "freeglut13 - Win32 Release" (based on\
+ "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "freeglut13 - Win32 Debug" (based on\
+ "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "freeglut13 - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x415 /d "NDEBUG"
+# ADD RSC /l 0x415 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+
+!ELSEIF "$(CFG)" == "freeglut13 - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x415 /d "_DEBUG"
+# ADD RSC /l 0x415 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
+
+!ENDIF
+
+# Begin Target
+
+# Name "freeglut13 - Win32 Release"
+# Name "freeglut13 - Win32 Debug"
+# Begin Group "Sources"
+
+# PROP Default_Filter "*.c"
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_callbacks.c"
+# End Source File
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_cursor.c"
+# End Source File
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_display.c"
+# End Source File
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_font.c"
+# End Source File
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_font_data.c"
+# End Source File
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_gamemode.c"
+# End Source File
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_geometry.c"
+# End Source File
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_init.c"
+# End Source File
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_joystick.c"
+# End Source File
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_main.c"
+# End Source File
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_menu.c"
+# End Source File
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_misc.c"
+# End Source File
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_overlay.c"
+# End Source File
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_state.c"
+# End Source File
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_structure.c"
+# End Source File
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_teapot.c"
+# End Source File
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_videoresize.c"
+# End Source File
+# Begin Source File
+
+SOURCE=".\freeglut-1.3\freeglut_window.c"
+# End Source File
+# End Group
+# Begin Group "Headers"
+
+# PROP Default_Filter "*.h"
+# Begin Source File
+
+SOURCE=.\include\Gl\freeglut.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\include\Gl\freeglut_internal.h
+# End Source File
+# End Group
+# End Target
+# End Project
--- /dev/null
+--------------------Configuration: freeglut13 - Win32 Debug--------------------
+Begining build with project "c:\project\freeglut\freeglut13.dsp", at root.
+Active configuration is Win32 (x86) Dynamic-Link Library (based on Win32 (x86) Dynamic-Link Library)
+
+Project's tools are:
+ "32-bit C/C++ Compiler for 80x86" with flags "/nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /Fp"Debug/freeglut13.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /c "
+ "OLE Type Library Maker" with flags "/nologo /D "_DEBUG" /mktyplib203 /o NUL /win32 "
+ "Win32 Resource Compiler" with flags "/l 0x415 /d "_DEBUG" "
+ "Browser Database Maker" with flags "/nologo /o"Debug/freeglut13.bsc" "
+ "COFF Linker for 80x86" with flags "kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /incremental:yes /pdb:"Debug/freeglut13.pdb" /debug /machine:I386 /out:"Debug/freeglut13.dll" /implib:"Debug/freeglut13.lib" /pdbtype:sept "
+ "Custom Build" with flags ""
+ "<Component 0xa>" with flags ""
+
+Creating temp file "C:\WINDOWS\TEMP\RSP170.TMP" with contents </nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /Fp"Debug/freeglut13.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /c
+"C:\Project\freeglut\freeglut-1.3\freeglut_display.c"
+"C:\Project\freeglut\freeglut-1.3\freeglut_font.c"
+"C:\Project\freeglut\freeglut-1.3\freeglut_main.c"
+>
+Creating command line "cl.exe @C:\WINDOWS\TEMP\RSP170.TMP"
+Creating temp file "C:\WINDOWS\TEMP\RSP0171.TMP" with contents <kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /incremental:yes /pdb:"Debug/freeglut13.pdb" /debug /machine:I386 /out:"Debug/freeglut13.dll" /implib:"Debug/freeglut13.lib" /pdbtype:sept
+.\Debug\freeglut_window.obj
+.\Debug\freeglut_cursor.obj
+.\Debug\freeglut_display.obj
+.\Debug\freeglut_font.obj
+.\Debug\freeglut_font_data.obj
+.\Debug\freeglut_gamemode.obj
+.\Debug\freeglut_geometry.obj
+.\Debug\freeglut_init.obj
+.\Debug\freeglut_joystick.obj
+.\Debug\freeglut_main.obj
+.\Debug\freeglut_menu.obj
+.\Debug\freeglut_misc.obj
+.\Debug\freeglut_overlay.obj
+.\Debug\freeglut_state.obj
+.\Debug\freeglut_structure.obj
+.\Debug\freeglut_teapot.obj
+.\Debug\freeglut_videoresize.obj
+.\Debug\freeglut_callbacks.obj>
+Creating command line "link.exe @C:\WINDOWS\TEMP\RSP0171.TMP"
+Compiling...
+freeglut_display.c
+freeglut_font.c
+C:\Project\freeglut\freeglut-1.3\freeglut_font.c(133) : fatal error C1189: #error : glPushClientAttrib declaration missing
+freeglut_main.c
+Error executing cl.exe.
+
+
+
+freeglut13.dll - 1 error(s), 0 warning(s)
--- /dev/null
+genfonts.o: genfonts.c ../config.h /usr/include/X11/Xlib.h \
+ /usr/include/sys/types.h /usr/include/features.h \
+ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \
+ /usr/include/bits/types.h \
+ /usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/stddef.h \
+ /usr/include/time.h /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/sys/select.h /usr/include/bits/select.h \
+ /usr/include/bits/sigset.h /usr/include/sys/sysmacros.h \
+ /usr/include/X11/X.h /usr/include/X11/Xfuncproto.h \
+ /usr/include/X11/Xosdefs.h /usr/include/X11/Xutil.h \
+ /usr/include/glib.h /usr/include/glibconfig.h \
+ /usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/limits.h \
+ /usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/syslimits.h \
+ /usr/include/limits.h /usr/include/bits/posix1_lim.h \
+ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \
+ /usr/include/bits/posix2_lim.h \
+ /usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/float.h \
+ /usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/stdarg.h \
+ /usr/include/string.h /usr/include/bits/string.h \
+ /usr/include/bits/string2.h /usr/include/stdlib.h \
+ /usr/include/alloca.h /usr/include/stdio.h /usr/include/libio.h \
+ /usr/include/_G_config.h /usr/include/bits/stdio_lim.h \
+ /usr/include/bits/stdio.h
+genfonts.c :
+../config.h :
+/usr/include/X11/Xlib.h :
+/usr/include/sys/types.h :
+/usr/include/features.h :
+/usr/include/sys/cdefs.h :
+/usr/include/gnu/stubs.h :
+/usr/include/bits/types.h :
+/usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/stddef.h :
+/usr/include/time.h :
+/usr/include/endian.h :
+/usr/include/bits/endian.h :
+/usr/include/sys/select.h :
+/usr/include/bits/select.h :
+/usr/include/bits/sigset.h :
+/usr/include/sys/sysmacros.h :
+/usr/include/X11/X.h :
+/usr/include/X11/Xfuncproto.h :
+/usr/include/X11/Xosdefs.h :
+/usr/include/X11/Xutil.h :
+/usr/include/glib.h :
+/usr/include/glibconfig.h :
+/usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/limits.h :
+/usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/syslimits.h :
+/usr/include/limits.h :
+/usr/include/bits/posix1_lim.h :
+/usr/include/bits/local_lim.h :
+/usr/include/linux/limits.h :
+/usr/include/bits/posix2_lim.h :
+/usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/float.h :
+/usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/stdarg.h :
+/usr/include/string.h :
+/usr/include/bits/string.h :
+/usr/include/bits/string2.h :
+/usr/include/stdlib.h :
+/usr/include/alloca.h :
+/usr/include/stdio.h :
+/usr/include/libio.h :
+/usr/include/_G_config.h :
+/usr/include/bits/stdio_lim.h :
+/usr/include/bits/stdio.h :
--- /dev/null
+genstroke.o: genstroke.c ../config.h /usr/include/glib.h \
+ /usr/include/glibconfig.h \
+ /usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/limits.h \
+ /usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/syslimits.h \
+ /usr/include/limits.h /usr/include/features.h \
+ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \
+ /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h \
+ /usr/include/linux/limits.h /usr/include/bits/posix2_lim.h \
+ /usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/float.h \
+ /usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/stdarg.h \
+ /usr/include/string.h \
+ /usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/stddef.h \
+ /usr/include/bits/string.h /usr/include/bits/string2.h \
+ /usr/include/endian.h /usr/include/bits/endian.h \
+ /usr/include/bits/types.h /usr/include/stdlib.h \
+ /usr/include/sys/types.h /usr/include/time.h \
+ /usr/include/sys/select.h /usr/include/bits/select.h \
+ /usr/include/bits/sigset.h /usr/include/sys/sysmacros.h \
+ /usr/include/alloca.h /usr/include/stdio.h /usr/include/libio.h \
+ /usr/include/_G_config.h /usr/include/bits/stdio_lim.h \
+ /usr/include/bits/stdio.h
+genstroke.c :
+../config.h :
+/usr/include/glib.h :
+/usr/include/glibconfig.h :
+/usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/limits.h :
+/usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/syslimits.h :
+/usr/include/limits.h :
+/usr/include/features.h :
+/usr/include/sys/cdefs.h :
+/usr/include/gnu/stubs.h :
+/usr/include/bits/posix1_lim.h :
+/usr/include/bits/local_lim.h :
+/usr/include/linux/limits.h :
+/usr/include/bits/posix2_lim.h :
+/usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/float.h :
+/usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/stdarg.h :
+/usr/include/string.h :
+/usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/stddef.h :
+/usr/include/bits/string.h :
+/usr/include/bits/string2.h :
+/usr/include/endian.h :
+/usr/include/bits/endian.h :
+/usr/include/bits/types.h :
+/usr/include/stdlib.h :
+/usr/include/sys/types.h :
+/usr/include/time.h :
+/usr/include/sys/select.h :
+/usr/include/bits/select.h :
+/usr/include/bits/sigset.h :
+/usr/include/sys/sysmacros.h :
+/usr/include/alloca.h :
+/usr/include/stdio.h :
+/usr/include/libio.h :
+/usr/include/_G_config.h :
+/usr/include/bits/stdio_lim.h :
+/usr/include/bits/stdio.h :
--- /dev/null
+# Generated automatically from Makefile.in by configure.
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = /bin/sh
+
+srcdir = .
+top_srcdir = ..
+prefix = /usr/local
+exec_prefix = ${prefix}
+
+bindir = ${exec_prefix}/bin
+sbindir = ${exec_prefix}/sbin
+libexecdir = ${exec_prefix}/libexec
+datadir = ${prefix}/share
+sysconfdir = ${prefix}/etc
+sharedstatedir = ${prefix}/com
+localstatedir = ${prefix}/var
+libdir = ${exec_prefix}/lib
+infodir = ${prefix}/info
+mandir = ${prefix}/man
+includedir = ${prefix}/include
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/freeglut
+pkglibdir = $(libdir)/freeglut
+pkgincludedir = $(includedir)/freeglut
+
+top_builddir = ..
+
+ACLOCAL = aclocal
+AUTOCONF = autoconf
+AUTOMAKE = automake
+AUTOHEADER = autoheader
+
+INSTALL = /usr/bin/ginstall -c
+INSTALL_PROGRAM = ${INSTALL} $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+transform = s,x,x,
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = i686-suse-linux
+host_triplet = i686-suse-linux-gnu
+AS = @AS@
+CC = gcc
+DLLTOOL = @DLLTOOL@
+EXEEXT =
+LIBM = -lm
+LIBTOOL = $(SHELL) $(top_builddir)/libtool
+LIBTOOL_DEPS = ./ltconfig ./ltmain.sh
+LN_S = ln -s
+MAKEINFO = makeinfo
+OBJDUMP = @OBJDUMP@
+PACKAGE = freeglut
+RANLIB = ranlib
+VERSION = 0.1
+
+bin_PROGRAMS = genfonts genstroke
+genfonts_SOURCES = genfonts.c
+genstroke_SOURCES = genstroke.c
+genfonts_LDADD = -L/usr/X11R6/lib -lglib -lX11 -lXext
+genstroke_LDADD = -lglib
+EXTRA_DIST = genfonts.c genstroke.c
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+bin_PROGRAMS = genfonts$(EXEEXT) genstroke$(EXEEXT)
+PROGRAMS = $(bin_PROGRAMS)
+
+
+DEFS = -DHAVE_CONFIG_H -I. -I$(srcdir) -I..
+CPPFLAGS =
+LDFLAGS =
+LIBS =
+genfonts_OBJECTS = genfonts.o
+genfonts_DEPENDENCIES =
+genfonts_LDFLAGS =
+genstroke_OBJECTS = genstroke.o
+genstroke_DEPENDENCIES =
+genstroke_LDFLAGS =
+CFLAGS = -g -O2
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+DEP_FILES = .deps/genfonts.P .deps/genstroke.P
+SOURCES = $(genfonts_SOURCES) $(genstroke_SOURCES)
+OBJECTS = $(genfonts_OBJECTS) $(genstroke_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .lo .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu genfonts/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-binPROGRAMS:
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+distclean-binPROGRAMS:
+
+maintainer-clean-binPROGRAMS:
+
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ if test -f $$p; then \
+ echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+ $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ list='$(bin_PROGRAMS)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ done
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.s.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+genfonts$(EXEEXT): $(genfonts_OBJECTS) $(genfonts_DEPENDENCIES)
+ @rm -f genfonts$(EXEEXT)
+ $(LINK) $(genfonts_LDFLAGS) $(genfonts_OBJECTS) $(genfonts_LDADD) $(LIBS)
+
+genstroke$(EXEEXT): $(genstroke_OBJECTS) $(genstroke_DEPENDENCIES)
+ @rm -f genstroke$(EXEEXT)
+ $(LINK) $(genstroke_LDFLAGS) $(genstroke_OBJECTS) $(genstroke_LDADD) $(LIBS)
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = genfonts
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu genfonts/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+ -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+ @echo '$(COMPILE) -c $<'; \
+ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.c
+ @echo '$(LTCOMPILE) -c $<'; \
+ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-binPROGRAMS
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-binPROGRAMS
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \
+ mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-binPROGRAMS clean-compile clean-libtool clean-tags \
+ clean-depend clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-binPROGRAMS distclean-compile distclean-libtool \
+ distclean-tags distclean-depend distclean-generic \
+ clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-binPROGRAMS \
+ maintainer-clean-compile maintainer-clean-libtool \
+ maintainer-clean-tags maintainer-clean-depend \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
+maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir \
+mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+## Process this file with automake to produce Makefile.im
+
+bin_PROGRAMS = genfonts genstroke
+genfonts_SOURCES = genfonts.c
+genstroke_SOURCES = genstroke.c
+genfonts_LDADD = -L/usr/X11R6/lib -lglib -lX11 -lXext
+genstroke_LDADD = -lglib
+EXTRA_DIST = genfonts.c genstroke.c
--- /dev/null
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+DLLTOOL = @DLLTOOL@
+EXEEXT = @EXEEXT@
+LIBM = @LIBM@
+LIBTOOL = @LIBTOOL@
+LIBTOOL_DEPS = @LIBTOOL_DEPS@
+LN_S = @LN_S@
+MAKEINFO = @MAKEINFO@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+VERSION = @VERSION@
+
+bin_PROGRAMS = genfonts genstroke
+genfonts_SOURCES = genfonts.c
+genstroke_SOURCES = genstroke.c
+genfonts_LDADD = -L/usr/X11R6/lib -lglib -lX11 -lXext
+genstroke_LDADD = -lglib
+EXTRA_DIST = genfonts.c genstroke.c
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+bin_PROGRAMS = genfonts$(EXEEXT) genstroke$(EXEEXT)
+PROGRAMS = $(bin_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+genfonts_OBJECTS = genfonts.o
+genfonts_DEPENDENCIES =
+genfonts_LDFLAGS =
+genstroke_OBJECTS = genstroke.o
+genstroke_DEPENDENCIES =
+genstroke_LDFLAGS =
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+DEP_FILES = .deps/genfonts.P .deps/genstroke.P
+SOURCES = $(genfonts_SOURCES) $(genstroke_SOURCES)
+OBJECTS = $(genfonts_OBJECTS) $(genstroke_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .lo .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu genfonts/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-binPROGRAMS:
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+distclean-binPROGRAMS:
+
+maintainer-clean-binPROGRAMS:
+
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ if test -f $$p; then \
+ echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+ $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ list='$(bin_PROGRAMS)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ done
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.s.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+genfonts$(EXEEXT): $(genfonts_OBJECTS) $(genfonts_DEPENDENCIES)
+ @rm -f genfonts$(EXEEXT)
+ $(LINK) $(genfonts_LDFLAGS) $(genfonts_OBJECTS) $(genfonts_LDADD) $(LIBS)
+
+genstroke$(EXEEXT): $(genstroke_OBJECTS) $(genstroke_DEPENDENCIES)
+ @rm -f genstroke$(EXEEXT)
+ $(LINK) $(genstroke_LDFLAGS) $(genstroke_OBJECTS) $(genstroke_LDADD) $(LIBS)
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = genfonts
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu genfonts/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+ -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+ @echo '$(COMPILE) -c $<'; \
+ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.c
+ @echo '$(LTCOMPILE) -c $<'; \
+ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-binPROGRAMS
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-binPROGRAMS
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \
+ mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-binPROGRAMS clean-compile clean-libtool clean-tags \
+ clean-depend clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-binPROGRAMS distclean-compile distclean-libtool \
+ distclean-tags distclean-depend distclean-generic \
+ clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-binPROGRAMS \
+ maintainer-clean-compile maintainer-clean-libtool \
+ maintainer-clean-tags maintainer-clean-depend \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
+maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir \
+mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+##
+# $XConsortium: Roman.src,v 5.3 94/04/17 20:10:05 rws Exp $
+##
+## Copyright (c) 1989,1990, 1991 by Sun Microsystems, Inc. and the X Consortium.
+##
+## All Rights Reserved
+##
+## Permission to use, copy, modify, and distribute this software and its
+## documentation for any purpose and without fee is hereby granted,
+## provided that the above copyright notice appear in all copies and that
+## both that copyright notice and this permission notice appear in
+## supporting documentation, and that the names of Sun Microsystems
+## and the X Consortium not be used in advertising or publicity
+## pertaining to distribution of the software without specific, written
+## prior permission.
+##
+## SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+## INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+## EVENT SHALL SUN MICROSYSTEMS OR THE X CONSORTIUM BE LIABLE FOR ANY SPECIAL,
+## INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+## FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+## NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+## WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+# Roman Simplex font.
+
+ FONTNAME Roman
+ TOP 119.0476
+ BOTTOM -33.3333
+ NUM_CH 128
+ PROPERTIES 3
+
+ (CHARSET_REGISTRY ISO8859)
+ (CHARSET_ENCODING "1")
+ (SPACING P)
+
+INDEX 32 STROKE 0 CENTER 52.3810 RIGHT 104.7619
+INDEX 33 STROKE 2 CENTER 4.7619 RIGHT 9.5238
+ OPEN 2 (4.7619 100.0000) (4.7619 33.3333)
+ OPEN 5 (4.7619 9.5238) (0.0000 4.7619) (4.7619 0.0000)
+ (9.5238 4.7619) (4.7619 9.5238)
+INDEX 34 STROKE 2 CENTER 19.0476 RIGHT 38.0952
+ OPEN 2 (0.0000 100.0000) (0.0000 66.6667)
+ OPEN 2 (38.0952 100.0000) (38.0952 66.6667)
+INDEX 35 STROKE 4 CENTER 33.3333 RIGHT 71.4286
+ OPEN 2 (38.0952 119.0476) (4.7619 -33.3333)
+ OPEN 2 (66.6667 119.0476) (33.3333 -33.3333)
+ OPEN 2 (4.7619 57.1429) (71.4286 57.1429)
+ OPEN 2 (0.0000 28.5714) (66.6667 28.5714)
+INDEX 36 STROKE 3 CENTER 33.3333 RIGHT 66.6667
+ OPEN 2 (23.8095 119.0476) (23.8095 -19.0476)
+ OPEN 2 (42.8571 119.0476) (42.8571 -19.0476)
+ OPEN 20 (66.6667 85.7143) (57.1429 95.2381) (42.8571 100.0000)
+ (23.8095 100.0000) (9.5238 95.2381) (0.0000 85.7143) (0.0000 76.1905)
+ (4.7619 66.6667) (9.5238 61.9048) (19.0476 57.1429) (47.6190 47.6190)
+ (57.1429 42.8571) (61.9048 38.0952) (66.6667 28.5714) (66.6667 14.2857)
+ (57.1429 4.7619) (42.8571 0.0000) (23.8095 0.0000) (9.5238 4.7619)
+ (0.0000 14.2857)
+INDEX 37 STROKE 3 CENTER 42.8571 RIGHT 85.7143
+ OPEN 2 (85.7143 100.0000) (0.0000 0.0000)
+ OPEN 16 (23.8095 100.0000) (33.3333 90.4762) (33.3333 80.9524)
+ (28.5714 71.4286) (19.0476 66.6667) (9.5238 66.6667) (0.0000 76.1905)
+ (0.0000 85.7143) (4.7619 95.2381) (14.2857 100.0000) (23.8095 100.0000)
+ (33.3333 95.2381) (47.6190 90.4762) (61.9048 90.4762) (76.1905 95.2381)
+ (85.7143 100.0000)
+ OPEN 11 (66.6667 33.3333) (57.1429 28.5714) (52.3810 19.0476)
+ (52.3810 9.5238) (61.9048 0.0000) (71.4286 0.0000) (80.9524 4.7619)
+ (85.7143 14.2857) (85.7143 23.8095) (76.1905 33.3333) (66.6667 33.3333)
+INDEX 38 STROKE 1 CENTER 47.6190 RIGHT 95.2381
+ OPEN 34 (95.2381 57.1429) (95.2381 61.9048) (90.4762 66.6667)
+ (85.7143 66.6667) (80.9524 61.9048) (76.1905 52.3810) (66.6667 28.5714)
+ (57.1429 14.2857) (47.6190 4.7619) (38.0952 0.0000) (19.0476 0.0000)
+ (9.5238 4.7619) (4.7619 9.5238) (0.0000 19.0476) (0.0000 28.5714)
+ (4.7619 38.0952) (9.5238 42.8571) (42.8571 61.9048) (47.6190 66.6667)
+ (52.3810 76.1905) (52.3810 85.7143) (47.6190 95.2381) (38.0952 100.0000)
+ (28.5714 95.2381) (23.8095 85.7143) (23.8095 76.1905) (28.5714 61.9048)
+ (38.0952 47.6190) (61.9048 14.2857) (71.4286 4.7619) (80.9524 0.0000)
+ (90.4762 0.0000) (95.2381 4.7619) (95.2381 9.5238)
+INDEX 39 STROKE 1 CENTER 0.0000 RIGHT 0.0000
+ OPEN 2 (0.0000 100.0000) (0.0000 66.6667)
+INDEX 40 STROKE 1 CENTER 14.2857 RIGHT 33.3333
+ OPEN 10 (33.3333 119.0476) (23.8095 109.5238) (14.2857 95.2381)
+ (4.7619 76.1905) (0.0000 52.3810) (0.0000 33.3333) (4.7619 9.5238)
+ (14.2857 -9.5238) (23.8095 -23.8095) (33.3333 -33.3333)
+INDEX 41 STROKE 1 CENTER 19.0476 RIGHT 33.3333
+ OPEN 10 (0.0000 119.0476) (9.5238 109.5238) (19.0476 95.2381)
+ (28.5714 76.1905) (33.3333 52.3810) (33.3333 33.3333) (28.5714 9.5238)
+ (19.0476 -9.5238) (9.5238 -23.8095) (0.0000 -33.3333)
+INDEX 42 STROKE 3 CENTER 23.8095 RIGHT 47.6190
+ OPEN 2 (23.8095 71.4286) (23.8095 14.2857)
+ OPEN 2 (0.0000 57.1429) (47.6190 28.5714)
+ OPEN 2 (47.6190 57.1429) (0.0000 28.5714)
+INDEX 43 STROKE 2 CENTER 42.8571 RIGHT 85.7143
+ OPEN 2 (42.8571 85.7143) (42.8571 0.0000)
+ OPEN 2 (0.0000 42.8571) (85.7143 42.8571)
+INDEX 44 STROKE 1 CENTER 4.7619 RIGHT 9.5238
+ OPEN 8 (9.5238 4.7619) (4.7619 0.0000) (0.0000 4.7619)
+ (4.7619 9.5238) (9.5238 4.7619) (9.5238 -4.7619) (4.7619 -14.2857)
+ (0.0000 -19.0476)
+INDEX 45 STROKE 1 CENTER 42.8571 RIGHT 85.7143
+ OPEN 2 (0.0000 42.8571) (85.7143 42.8571)
+INDEX 46 STROKE 1 CENTER 4.7619 RIGHT 9.5238
+ OPEN 5 (4.7619 9.5238) (0.0000 4.7619) (4.7619 0.0000)
+ (9.5238 4.7619) (4.7619 9.5238)
+INDEX 47 STROKE 1 CENTER 33.3333 RIGHT 66.6667
+ OPEN 2 (0.0000 -14.2857) (66.6667 100.0000)
+INDEX 48 STROKE 1 CENTER 33.3333 RIGHT 66.6667
+ OPEN 17 (28.5714 100.0000) (14.2857 95.2381) (4.7619 80.9524)
+ (0.0000 57.1429) (0.0000 42.8571) (4.7619 19.0476) (14.2857 4.7619)
+ (28.5714 0.0000) (38.0952 0.0000) (52.3810 4.7619) (61.9048 19.0476)
+ (66.6667 42.8571) (66.6667 57.1429) (61.9048 80.9524) (52.3810 95.2381)
+ (38.0952 100.0000) (28.5714 100.0000)
+INDEX 49 STROKE 1 CENTER 19.0476 RIGHT 23.8095
+ OPEN 4 (0.0000 80.9524) (9.5238 85.7143) (23.8095 100.0000)
+ (23.8095 0.0000)
+INDEX 50 STROKE 1 CENTER 33.3333 RIGHT 66.6667
+ OPEN 14 (4.7619 76.1905) (4.7619 80.9524) (9.5238 90.4762)
+ (14.2857 95.2381) (23.8095 100.0000) (42.8571 100.0000) (52.3810 95.2381)
+ (57.1429 90.4762) (61.9048 80.9524) (61.9048 71.4286) (57.1429 61.9048)
+ (47.6190 47.6190) (0.0000 0.0000) (66.6667 0.0000)
+INDEX 51 STROKE 1 CENTER 33.3333 RIGHT 66.6667
+ OPEN 15 (9.5238 100.0000) (61.9048 100.0000) (33.3333 61.9048)
+ (47.6190 61.9048) (57.1429 57.1429) (61.9048 52.3810) (66.6667 38.0952)
+ (66.6667 28.5714) (61.9048 14.2857) (52.3810 4.7619) (38.0952 0.0000)
+ (23.8095 0.0000) (9.5238 4.7619) (4.7619 9.5238) (0.0000 19.0476)
+INDEX 52 STROKE 2 CENTER 33.3333 RIGHT 71.4286
+ OPEN 3 (47.6190 100.0000) (0.0000 33.3333) (71.4286 33.3333)
+ OPEN 2 (47.6190 100.0000) (47.6190 0.0000)
+INDEX 53 STROKE 1 CENTER 33.3333 RIGHT 66.6667
+ OPEN 17 (57.1429 100.0000) (9.5238 100.0000) (4.7619 57.1429)
+ (9.5238 61.9048) (23.8095 66.6667) (38.0952 66.6667) (52.3810 61.9048)
+ (61.9048 52.3810) (66.6667 38.0952) (66.6667 28.5714) (61.9048 14.2857)
+ (52.3810 4.7619) (38.0952 0.0000) (23.8095 0.0000) (9.5238 4.7619)
+ (4.7619 9.5238) (0.0000 19.0476)
+INDEX 54 STROKE 1 CENTER 28.5714 RIGHT 61.9048
+ OPEN 23 (57.1429 85.7143) (52.3810 95.2381) (38.0952 100.0000)
+ (28.5714 100.0000) (14.2857 95.2381) (4.7619 80.9524) (0.0000 57.1429)
+ (0.0000 33.3333) (4.7619 14.2857) (14.2857 4.7619) (28.5714 0.0000)
+ (33.3333 0.0000) (47.6190 4.7619) (57.1429 14.2857) (61.9048 28.5714)
+ (61.9048 33.3333) (57.1429 47.6190) (47.6190 57.1429) (33.3333 61.9048)
+ (28.5714 61.9048) (14.2857 57.1429) (4.7619 47.6190) (0.0000 33.3333)
+INDEX 55 STROKE 2 CENTER 33.3333 RIGHT 66.6667
+ OPEN 2 (66.6667 100.0000) (19.0476 0.0000)
+ OPEN 2 (0.0000 100.0000) (66.6667 100.0000)
+INDEX 56 STROKE 1 CENTER 33.3333 RIGHT 66.6667
+ OPEN 29 (23.8095 100.0000) (9.5238 95.2381) (4.7619 85.7143)
+ (4.7619 76.1905) (9.5238 66.6667) (19.0476 61.9048) (38.0952 57.1429)
+ (52.3810 52.3810) (61.9048 42.8571) (66.6667 33.3333) (66.6667 19.0476)
+ (61.9048 9.5238) (57.1429 4.7619) (42.8571 0.0000) (23.8095 0.0000)
+ (9.5238 4.7619) (4.7619 9.5238) (0.0000 19.0476) (0.0000 33.3333)
+ (4.7619 42.8571) (14.2857 52.3810) (28.5714 57.1429) (47.6190 61.9048)
+ (57.1429 66.6667) (61.9048 76.1905) (61.9048 85.7143) (57.1429 95.2381)
+ (42.8571 100.0000) (23.8095 100.0000)
+INDEX 57 STROKE 1 CENTER 33.3333 RIGHT 61.9048
+ OPEN 23 (61.9048 66.6667) (57.1429 52.3810) (47.6190 42.8571)
+ (33.3333 38.0952) (28.5714 38.0952) (14.2857 42.8571) (4.7619 52.3810)
+ (0.0000 66.6667) (0.0000 71.4286) (4.7619 85.7143) (14.2857 95.2381)
+ (28.5714 100.0000) (33.3333 100.0000) (47.6190 95.2381) (57.1429 85.7143)
+ (61.9048 66.6667) (61.9048 42.8571) (57.1429 19.0476) (47.6190 4.7619)
+ (33.3333 0.0000) (23.8095 0.0000) (9.5238 4.7619) (4.7619 14.2857)
+INDEX 58 STROKE 2 CENTER 4.7619 RIGHT 9.5238
+ OPEN 5 (4.7619 66.6667) (0.0000 61.9048) (4.7619 57.1429)
+ (9.5238 61.9048) (4.7619 66.6667)
+ OPEN 5 (4.7619 9.5238) (0.0000 4.7619) (4.7619 0.0000)
+ (9.5238 4.7619) (4.7619 9.5238)
+INDEX 59 STROKE 2 CENTER 4.7619 RIGHT 9.5238
+ OPEN 5 (4.7619 66.6667) (0.0000 61.9048) (4.7619 57.1429)
+ (9.5238 61.9048) (4.7619 66.6667)
+ OPEN 8 (9.5238 4.7619) (4.7619 0.0000) (0.0000 4.7619)
+ (4.7619 9.5238) (9.5238 4.7619) (9.5238 -4.7619) (4.7619 -14.2857)
+ (0.0000 -19.0476)
+INDEX 60 STROKE 1 CENTER 38.0952 RIGHT 76.1905
+ OPEN 3 (76.1905 85.7143) (0.0000 42.8571) (76.1905 0.0000)
+INDEX 61 STROKE 2 CENTER 42.8571 RIGHT 85.7143
+ OPEN 2 (0.0000 57.1429) (85.7143 57.1429)
+ OPEN 2 (0.0000 28.5714) (85.7143 28.5714)
+INDEX 62 STROKE 1 CENTER 38.0952 RIGHT 76.1905
+ OPEN 3 (0.0000 85.7143) (76.1905 42.8571) (0.0000 0.0000)
+INDEX 63 STROKE 2 CENTER 28.5714 RIGHT 57.1429
+ OPEN 14 (0.0000 76.1905) (0.0000 80.9524) (4.7619 90.4762)
+ (9.5238 95.2381) (19.0476 100.0000) (38.0952 100.0000) (47.6190 95.2381)
+ (52.3810 90.4762) (57.1429 80.9524) (57.1429 71.4286) (52.3810 61.9048)
+ (47.6190 57.1429) (28.5714 47.6190) (28.5714 33.3333)
+ OPEN 5 (28.5714 9.5238) (23.8095 4.7619) (28.5714 0.0000)
+ (33.3333 4.7619) (28.5714 9.5238)
+INDEX 64 STROKE 2 CENTER 28.5714 RIGHT 61.9048
+ OPEN 8 (42.8571 52.3810) (33.3333 57.1429) (23.8095 57.1429)
+ (19.0476 47.6190) (19.0476 42.8571) (23.8095 33.3333) (33.3333 33.3333)
+ (42.8571 38.0952)
+ OPEN 19 (42.8571 57.1429) (42.8571 38.0952) (47.6190 33.3333)
+ (57.1429 33.3333) (61.9048 42.8571) (61.9048 47.6190) (57.1429 61.9048)
+ (47.6190 71.4286) (33.3333 76.1905) (28.5714 76.1905) (14.2857 71.4286)
+ (4.7619 61.9048) (0.0000 47.6190) (0.0000 42.8571) (4.7619 28.5714)
+ (14.2857 19.0476) (28.5714 14.2857) (33.3333 14.2857) (47.6190 19.0476)
+INDEX 65 STROKE 3 CENTER 38.0952 RIGHT 76.1905
+ OPEN 2 (38.0952 100.0000) (0.0000 0.0000)
+ OPEN 2 (38.0952 100.0000) (76.1905 0.0000)
+ OPEN 2 (14.2857 33.3333) (61.9048 33.3333)
+INDEX 66 STROKE 3 CENTER 33.3333 RIGHT 66.6667
+ OPEN 2 (0.0000 100.0000) (0.0000 0.0000)
+ OPEN 9 (0.0000 100.0000) (42.8571 100.0000) (57.1429 95.2381)
+ (61.9048 90.4762) (66.6667 80.9524) (66.6667 71.4286) (61.9048 61.9048)
+ (57.1429 57.1429) (42.8571 52.3810)
+ OPEN 10 (0.0000 52.3810) (42.8571 52.3810) (57.1429 47.6190)
+ (61.9048 42.8571) (66.6667 33.3333) (66.6667 19.0476) (61.9048 9.5238)
+ (57.1429 4.7619) (42.8571 0.0000) (0.0000 0.0000)
+INDEX 67 STROKE 1 CENTER 33.3333 RIGHT 71.4286
+ OPEN 18 (71.4286 76.1905) (66.6667 85.7143) (57.1429 95.2381)
+ (47.6190 100.0000) (28.5714 100.0000) (19.0476 95.2381) (9.5238 85.7143)
+ (4.7619 76.1905) (0.0000 61.9048) (0.0000 38.0952) (4.7619 23.8095)
+ (9.5238 14.2857) (19.0476 4.7619) (28.5714 0.0000) (47.6190 0.0000)
+ (57.1429 4.7619) (66.6667 14.2857) (71.4286 23.8095)
+INDEX 68 STROKE 2 CENTER 33.3333 RIGHT 66.6667
+ OPEN 2 (0.0000 100.0000) (0.0000 0.0000)
+ OPEN 12 (0.0000 100.0000) (33.3333 100.0000) (47.6190 95.2381)
+ (57.1429 85.7143) (61.9048 76.1905) (66.6667 61.9048) (66.6667 38.0952)
+ (61.9048 23.8095) (57.1429 14.2857) (47.6190 4.7619) (33.3333 0.0000)
+ (0.0000 0.0000)
+INDEX 69 STROKE 4 CENTER 28.5714 RIGHT 61.9048
+ OPEN 2 (0.0000 100.0000) (0.0000 0.0000)
+ OPEN 2 (0.0000 100.0000) (61.9048 100.0000)
+ OPEN 2 (0.0000 52.3810) (38.0952 52.3810)
+ OPEN 2 (0.0000 0.0000) (61.9048 0.0000)
+INDEX 70 STROKE 3 CENTER 28.5714 RIGHT 61.9048
+ OPEN 2 (0.0000 100.0000) (0.0000 0.0000)
+ OPEN 2 (0.0000 100.0000) (61.9048 100.0000)
+ OPEN 2 (0.0000 52.3810) (38.0952 52.3810)
+INDEX 71 STROKE 2 CENTER 33.3333 RIGHT 71.4286
+ OPEN 19 (71.4286 76.1905) (66.6667 85.7143) (57.1429 95.2381)
+ (47.6190 100.0000) (28.5714 100.0000) (19.0476 95.2381) (9.5238 85.7143)
+ (4.7619 76.1905) (0.0000 61.9048) (0.0000 38.0952) (4.7619 23.8095)
+ (9.5238 14.2857) (19.0476 4.7619) (28.5714 0.0000) (47.6190 0.0000)
+ (57.1429 4.7619) (66.6667 14.2857) (71.4286 23.8095) (71.4286 38.0952)
+ OPEN 2 (47.6190 38.0952) (71.4286 38.0952)
+INDEX 72 STROKE 3 CENTER 33.3333 RIGHT 66.6667
+ OPEN 2 (0.0000 100.0000) (0.0000 0.0000)
+ OPEN 2 (66.6667 100.0000) (66.6667 0.0000)
+ OPEN 2 (0.0000 52.3810) (66.6667 52.3810)
+INDEX 73 STROKE 1 CENTER 0.0000 RIGHT 0.0000
+ OPEN 2 (0.0000 100.0000) (0.0000 0.0000)
+INDEX 74 STROKE 1 CENTER 28.5714 RIGHT 47.6190
+ OPEN 10 (47.6190 100.0000) (47.6190 23.8095) (42.8571 9.5238)
+ (38.0952 4.7619) (28.5714 0.0000) (19.0476 0.0000) (9.5238 4.7619)
+ (4.7619 9.5238) (0.0000 23.8095) (0.0000 33.3333)
+INDEX 75 STROKE 3 CENTER 33.3333 RIGHT 66.6667
+ OPEN 2 (0.0000 100.0000) (0.0000 0.0000)
+ OPEN 2 (66.6667 100.0000) (0.0000 33.3333)
+ OPEN 2 (23.8095 57.1429) (66.6667 0.0000)
+INDEX 76 STROKE 2 CENTER 28.5714 RIGHT 57.1429
+ OPEN 2 (0.0000 100.0000) (0.0000 0.0000)
+ OPEN 2 (0.0000 0.0000) (57.1429 0.0000)
+INDEX 77 STROKE 4 CENTER 38.0952 RIGHT 76.1905
+ OPEN 2 (0.0000 100.0000) (0.0000 0.0000)
+ OPEN 2 (0.0000 100.0000) (38.0952 0.0000)
+ OPEN 2 (76.1905 100.0000) (38.0952 0.0000)
+ OPEN 2 (76.1905 100.0000) (76.1905 0.0000)
+INDEX 78 STROKE 3 CENTER 33.3333 RIGHT 66.6667
+ OPEN 2 (0.0000 100.0000) (0.0000 0.0000)
+ OPEN 2 (0.0000 100.0000) (66.6667 0.0000)
+ OPEN 2 (66.6667 100.0000) (66.6667 0.0000)
+INDEX 79 STROKE 1 CENTER 38.0952 RIGHT 76.1905
+ OPEN 21 (28.5714 100.0000) (19.0476 95.2381) (9.5238 85.7143)
+ (4.7619 76.1905) (0.0000 61.9048) (0.0000 38.0952) (4.7619 23.8095)
+ (9.5238 14.2857) (19.0476 4.7619) (28.5714 0.0000) (47.6190 0.0000)
+ (57.1429 4.7619) (66.6667 14.2857) (71.4286 23.8095) (76.1905 38.0952)
+ (76.1905 61.9048) (71.4286 76.1905) (66.6667 85.7143) (57.1429 95.2381)
+ (47.6190 100.0000) (28.5714 100.0000)
+INDEX 80 STROKE 2 CENTER 33.3333 RIGHT 66.6667
+ OPEN 2 (0.0000 100.0000) (0.0000 0.0000)
+ OPEN 10 (0.0000 100.0000) (42.8571 100.0000) (57.1429 95.2381)
+ (61.9048 90.4762) (66.6667 80.9524) (66.6667 66.6667) (61.9048 57.1429)
+ (57.1429 52.3810) (42.8571 47.6190) (0.0000 47.6190)
+INDEX 81 STROKE 2 CENTER 38.0952 RIGHT 76.1905
+ OPEN 21 (28.5714 100.0000) (19.0476 95.2381) (9.5238 85.7143)
+ (4.7619 76.1905) (0.0000 61.9048) (0.0000 38.0952) (4.7619 23.8095)
+ (9.5238 14.2857) (19.0476 4.7619) (28.5714 0.0000) (47.6190 0.0000)
+ (57.1429 4.7619) (66.6667 14.2857) (71.4286 23.8095) (76.1905 38.0952)
+ (76.1905 61.9048) (71.4286 76.1905) (66.6667 85.7143) (57.1429 95.2381)
+ (47.6190 100.0000) (28.5714 100.0000)
+ OPEN 2 (42.8571 19.0476) (71.4286 -9.5238)
+INDEX 82 STROKE 3 CENTER 33.3333 RIGHT 66.6667
+ OPEN 2 (0.0000 100.0000) (0.0000 0.0000)
+ OPEN 10 (0.0000 100.0000) (42.8571 100.0000) (57.1429 95.2381)
+ (61.9048 90.4762) (66.6667 80.9524) (66.6667 71.4286) (61.9048 61.9048)
+ (57.1429 57.1429) (42.8571 52.3810) (0.0000 52.3810)
+ OPEN 2 (33.3333 52.3810) (66.6667 0.0000)
+INDEX 83 STROKE 1 CENTER 33.3333 RIGHT 66.6667
+ OPEN 20 (66.6667 85.7143) (57.1429 95.2381) (42.8571 100.0000)
+ (23.8095 100.0000) (9.5238 95.2381) (0.0000 85.7143) (0.0000 76.1905)
+ (4.7619 66.6667) (9.5238 61.9048) (19.0476 57.1429) (47.6190 47.6190)
+ (57.1429 42.8571) (61.9048 38.0952) (66.6667 28.5714) (66.6667 14.2857)
+ (57.1429 4.7619) (42.8571 0.0000) (23.8095 0.0000) (9.5238 4.7619)
+ (0.0000 14.2857)
+INDEX 84 STROKE 2 CENTER 33.3333 RIGHT 66.6667
+ OPEN 2 (33.3333 100.0000) (33.3333 0.0000)
+ OPEN 2 (0.0000 100.0000) (66.6667 100.0000)
+INDEX 85 STROKE 1 CENTER 33.3333 RIGHT 66.6667
+ OPEN 10 (0.0000 100.0000) (0.0000 28.5714) (4.7619 14.2857)
+ (14.2857 4.7619) (28.5714 0.0000) (38.0952 0.0000) (52.3810 4.7619)
+ (61.9048 14.2857) (66.6667 28.5714) (66.6667 100.0000)
+INDEX 86 STROKE 2 CENTER 38.0952 RIGHT 76.1905
+ OPEN 2 (0.0000 100.0000) (38.0952 0.0000)
+ OPEN 2 (76.1905 100.0000) (38.0952 0.0000)
+INDEX 87 STROKE 4 CENTER 47.6190 RIGHT 95.2381
+ OPEN 2 (0.0000 100.0000) (23.8095 0.0000)
+ OPEN 2 (47.6190 100.0000) (23.8095 0.0000)
+ OPEN 2 (47.6190 100.0000) (71.4286 0.0000)
+ OPEN 2 (95.2381 100.0000) (71.4286 0.0000)
+INDEX 88 STROKE 2 CENTER 33.3333 RIGHT 66.6667
+ OPEN 2 (0.0000 100.0000) (66.6667 0.0000)
+ OPEN 2 (66.6667 100.0000) (0.0000 0.0000)
+INDEX 89 STROKE 2 CENTER 38.0952 RIGHT 76.1905
+ OPEN 3 (0.0000 100.0000) (38.0952 52.3810) (38.0952 0.0000)
+ OPEN 2 (76.1905 100.0000) (38.0952 52.3810)
+INDEX 90 STROKE 3 CENTER 33.3333 RIGHT 66.6667
+ OPEN 2 (66.6667 100.0000) (0.0000 0.0000)
+ OPEN 2 (0.0000 100.0000) (66.6667 100.0000)
+ OPEN 2 (0.0000 0.0000) (66.6667 0.0000)
+INDEX 91 STROKE 4 CENTER 14.2857 RIGHT 33.3333
+ OPEN 2 (0.0000 119.0476) (0.0000 -33.3333)
+ OPEN 2 (4.7619 119.0476) (4.7619 -33.3333)
+ OPEN 2 (0.0000 119.0476) (33.3333 119.0476)
+ OPEN 2 (0.0000 -33.3333) (33.3333 -33.3333)
+INDEX 92 STROKE 1 CENTER 33.3333 RIGHT 66.6667
+ OPEN 2 (0.0000 100.0000) (66.6667 -14.2857)
+INDEX 93 STROKE 4 CENTER 19.0476 RIGHT 33.3333
+ OPEN 2 (28.5714 119.0476) (28.5714 -33.3333)
+ OPEN 2 (33.3333 119.0476) (33.3333 -33.3333)
+ OPEN 2 (0.0000 119.0476) (33.3333 119.0476)
+ OPEN 2 (0.0000 -33.3333) (33.3333 -33.3333)
+INDEX 94 STROKE 2 CENTER 38.0952 RIGHT 76.1905
+ OPEN 2 (38.0952 109.5238) (0.0000 42.8571)
+ OPEN 2 (38.0952 109.5238) (76.1905 42.8571)
+INDEX 95 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 5 (0.0000 -33.3333) (104.7619 -33.3333) (104.7619 -28.5714)
+ (0.0000 -28.5714) (0.0000 -33.3333)
+INDEX 96 STROKE 2 CENTER 14.2857 RIGHT 28.5714
+ OPEN 2 (4.7619 100.0000) (28.5714 71.4286)
+ OPEN 3 (4.7619 100.0000) (0.0000 95.2381) (28.5714 71.4286)
+INDEX 97 STROKE 2 CENTER 28.5714 RIGHT 57.1429
+ OPEN 2 (57.1429 66.6667) (57.1429 0.0000)
+ OPEN 14 (57.1429 52.3810) (47.6190 61.9048) (38.0952 66.6667)
+ (23.8095 66.6667) (14.2857 61.9048) (4.7619 52.3810) (0.0000 38.0952)
+ (0.0000 28.5714) (4.7619 14.2857) (14.2857 4.7619) (23.8095 0.0000)
+ (38.0952 0.0000) (47.6190 4.7619) (57.1429 14.2857)
+INDEX 98 STROKE 2 CENTER 28.5714 RIGHT 57.1429
+ OPEN 2 (0.0000 100.0000) (0.0000 0.0000)
+ OPEN 14 (0.0000 52.3810) (9.5238 61.9048) (19.0476 66.6667)
+ (33.3333 66.6667) (42.8571 61.9048) (52.3810 52.3810) (57.1429 38.0952)
+ (57.1429 28.5714) (52.3810 14.2857) (42.8571 4.7619) (33.3333 0.0000)
+ (19.0476 0.0000) (9.5238 4.7619) (0.0000 14.2857)
+INDEX 99 STROKE 1 CENTER 28.5714 RIGHT 57.1429
+ OPEN 14 (57.1429 52.3810) (47.6190 61.9048) (38.0952 66.6667)
+ (23.8095 66.6667) (14.2857 61.9048) (4.7619 52.3810) (0.0000 38.0952)
+ (0.0000 28.5714) (4.7619 14.2857) (14.2857 4.7619) (23.8095 0.0000)
+ (38.0952 0.0000) (47.6190 4.7619) (57.1429 14.2857)
+INDEX 100 STROKE 2 CENTER 28.5714 RIGHT 57.1429
+ OPEN 2 (57.1429 100.0000) (57.1429 0.0000)
+ OPEN 14 (57.1429 52.3810) (47.6190 61.9048) (38.0952 66.6667)
+ (23.8095 66.6667) (14.2857 61.9048) (4.7619 52.3810) (0.0000 38.0952)
+ (0.0000 28.5714) (4.7619 14.2857) (14.2857 4.7619) (23.8095 0.0000)
+ (38.0952 0.0000) (47.6190 4.7619) (57.1429 14.2857)
+INDEX 101 STROKE 1 CENTER 28.5714 RIGHT 57.1429
+ OPEN 17 (0.0000 38.0952) (57.1429 38.0952) (57.1429 47.6190)
+ (52.3810 57.1429) (47.6190 61.9048) (38.0952 66.6667) (23.8095 66.6667)
+ (14.2857 61.9048) (4.7619 52.3810) (0.0000 38.0952) (0.0000 28.5714)
+ (4.7619 14.2857) (14.2857 4.7619) (23.8095 0.0000) (38.0952 0.0000)
+ (47.6190 4.7619) (57.1429 14.2857)
+INDEX 102 STROKE 2 CENTER 14.2857 RIGHT 38.0952
+ OPEN 5 (38.0952 100.0000) (28.5714 100.0000) (19.0476 95.2381)
+ (14.2857 80.9524) (14.2857 0.0000)
+ OPEN 2 (0.0000 66.6667) (33.3333 66.6667)
+INDEX 103 STROKE 2 CENTER 28.5714 RIGHT 57.1429
+ OPEN 7 (57.1429 66.6667) (57.1429 -9.5238) (52.3810 -23.8095)
+ (47.6190 -28.5714) (38.0952 -33.3333) (23.8095 -33.3333) (14.2857 -28.5714)
+ OPEN 14 (57.1429 52.3810) (47.6190 61.9048) (38.0952 66.6667)
+ (23.8095 66.6667) (14.2857 61.9048) (4.7619 52.3810) (0.0000 38.0952)
+ (0.0000 28.5714) (4.7619 14.2857) (14.2857 4.7619) (23.8095 0.0000)
+ (38.0952 0.0000) (47.6190 4.7619) (57.1429 14.2857)
+INDEX 104 STROKE 2 CENTER 23.8095 RIGHT 52.3810
+ OPEN 2 (0.0000 100.0000) (0.0000 0.0000)
+ OPEN 7 (0.0000 47.6190) (14.2857 61.9048) (23.8095 66.6667)
+ (38.0952 66.6667) (47.6190 61.9048) (52.3810 47.6190) (52.3810 0.0000)
+INDEX 105 STROKE 2 CENTER 4.7619 RIGHT 9.5238
+ OPEN 5 (0.0000 100.0000) (4.7619 95.2381) (9.5238 100.0000)
+ (4.7619 104.7619) (0.0000 100.0000)
+ OPEN 2 (4.7619 66.6667) (4.7619 0.0000)
+INDEX 106 STROKE 2 CENTER 19.0476 RIGHT 28.5714
+ OPEN 5 (19.0476 100.0000) (23.8095 95.2381) (28.5714 100.0000)
+ (23.8095 104.7619) (19.0476 100.0000)
+ OPEN 5 (23.8095 66.6667) (23.8095 -14.2857) (19.0476 -28.5714)
+ (9.5238 -33.3333) (0.0000 -33.3333)
+INDEX 107 STROKE 3 CENTER 23.8095 RIGHT 52.3810
+ OPEN 2 (0.0000 100.0000) (0.0000 0.0000)
+ OPEN 2 (47.6190 66.6667) (0.0000 19.0476)
+ OPEN 2 (19.0476 38.0952) (52.3810 0.0000)
+INDEX 108 STROKE 1 CENTER 0.0000 RIGHT 0.0000
+ OPEN 2 (0.0000 100.0000) (0.0000 0.0000)
+INDEX 109 STROKE 3 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (0.0000 66.6667) (0.0000 0.0000)
+ OPEN 7 (0.0000 47.6190) (14.2857 61.9048) (23.8095 66.6667)
+ (38.0952 66.6667) (47.6190 61.9048) (52.3810 47.6190) (52.3810 0.0000)
+ OPEN 7 (52.3810 47.6190) (66.6667 61.9048) (76.1905 66.6667)
+ (90.4762 66.6667) (100.0000 61.9048) (104.7619 47.6190) (104.7619 0.0000)
+INDEX 110 STROKE 2 CENTER 23.8095 RIGHT 52.3810
+ OPEN 2 (0.0000 66.6667) (0.0000 0.0000)
+ OPEN 7 (0.0000 47.6190) (14.2857 61.9048) (23.8095 66.6667)
+ (38.0952 66.6667) (47.6190 61.9048) (52.3810 47.6190) (52.3810 0.0000)
+INDEX 111 STROKE 1 CENTER 28.5714 RIGHT 61.9048
+ OPEN 17 (23.8095 66.6667) (14.2857 61.9048) (4.7619 52.3810)
+ (0.0000 38.0952) (0.0000 28.5714) (4.7619 14.2857) (14.2857 4.7619)
+ (23.8095 0.0000) (38.0952 0.0000) (47.6190 4.7619) (57.1429 14.2857)
+ (61.9048 28.5714) (61.9048 38.0952) (57.1429 52.3810) (47.6190 61.9048)
+ (38.0952 66.6667) (23.8095 66.6667)
+INDEX 112 STROKE 2 CENTER 28.5714 RIGHT 57.1429
+ OPEN 2 (0.0000 66.6667) (0.0000 -33.3333)
+ OPEN 14 (0.0000 52.3810) (9.5238 61.9048) (19.0476 66.6667)
+ (33.3333 66.6667) (42.8571 61.9048) (52.3810 52.3810) (57.1429 38.0952)
+ (57.1429 28.5714) (52.3810 14.2857) (42.8571 4.7619) (33.3333 0.0000)
+ (19.0476 0.0000) (9.5238 4.7619) (0.0000 14.2857)
+INDEX 113 STROKE 2 CENTER 28.5714 RIGHT 57.1429
+ OPEN 2 (57.1429 66.6667) (57.1429 -33.3333)
+ OPEN 14 (57.1429 52.3810) (47.6190 61.9048) (38.0952 66.6667)
+ (23.8095 66.6667) (14.2857 61.9048) (4.7619 52.3810) (0.0000 38.0952)
+ (0.0000 28.5714) (4.7619 14.2857) (14.2857 4.7619) (23.8095 0.0000)
+ (38.0952 0.0000) (47.6190 4.7619) (57.1429 14.2857)
+INDEX 114 STROKE 2 CENTER 14.2857 RIGHT 38.0952
+ OPEN 2 (0.0000 66.6667) (0.0000 0.0000)
+ OPEN 5 (0.0000 38.0952) (4.7619 52.3810) (14.2857 61.9048)
+ (23.8095 66.6667) (38.0952 66.6667)
+INDEX 115 STROKE 1 CENTER 23.8095 RIGHT 52.3810
+ OPEN 17 (52.3810 52.3810) (47.6190 61.9048) (33.3333 66.6667)
+ (19.0476 66.6667) (4.7619 61.9048) (0.0000 52.3810) (4.7619 42.8571)
+ (14.2857 38.0952) (38.0952 33.3333) (47.6190 28.5714) (52.3810 19.0476)
+ (52.3810 14.2857) (47.6190 4.7619) (33.3333 0.0000) (19.0476 0.0000)
+ (4.7619 4.7619) (0.0000 14.2857)
+INDEX 116 STROKE 2 CENTER 14.2857 RIGHT 38.0952
+ OPEN 5 (14.2857 100.0000) (14.2857 19.0476) (19.0476 4.7619)
+ (28.5714 0.0000) (38.0952 0.0000)
+ OPEN 2 (0.0000 66.6667) (33.3333 66.6667)
+INDEX 117 STROKE 2 CENTER 23.8095 RIGHT 52.3810
+ OPEN 7 (0.0000 66.6667) (0.0000 19.0476) (4.7619 4.7619)
+ (14.2857 0.0000) (28.5714 0.0000) (38.0952 4.7619) (52.3810 19.0476)
+ OPEN 2 (52.3810 66.6667) (52.3810 0.0000)
+INDEX 118 STROKE 2 CENTER 28.5714 RIGHT 57.1429
+ OPEN 2 (0.0000 66.6667) (28.5714 0.0000)
+ OPEN 2 (57.1429 66.6667) (28.5714 0.0000)
+INDEX 119 STROKE 4 CENTER 38.0952 RIGHT 76.1905
+ OPEN 2 (0.0000 66.6667) (19.0476 0.0000)
+ OPEN 2 (38.0952 66.6667) (19.0476 0.0000)
+ OPEN 2 (38.0952 66.6667) (57.1429 0.0000)
+ OPEN 2 (76.1905 66.6667) (57.1429 0.0000)
+INDEX 120 STROKE 2 CENTER 23.8095 RIGHT 52.3810
+ OPEN 2 (0.0000 66.6667) (52.3810 0.0000)
+ OPEN 2 (52.3810 66.6667) (0.0000 0.0000)
+INDEX 121 STROKE 2 CENTER 33.3333 RIGHT 61.9048
+ OPEN 2 (4.7619 66.6667) (33.3333 0.0000)
+ OPEN 6 (61.9048 66.6667) (33.3333 0.0000) (23.8095 -19.0476)
+ (14.2857 -28.5714) (4.7619 -33.3333) (0.0000 -33.3333)
+INDEX 122 STROKE 3 CENTER 23.8095 RIGHT 52.3810
+ OPEN 2 (52.3810 66.6667) (0.0000 0.0000)
+ OPEN 2 (0.0000 66.6667) (52.3810 66.6667)
+ OPEN 2 (0.0000 0.0000) (52.3810 0.0000)
+INDEX 123 STROKE 3 CENTER 14.2857 RIGHT 23.8095
+ OPEN 10 (23.8095 119.0476) (14.2857 114.2857) (9.5238 109.5238)
+ (4.7619 100.0000) (4.7619 90.4762) (9.5238 80.9524) (14.2857 76.1905)
+ (19.0476 66.6667) (19.0476 57.1429) (9.5238 47.6190)
+ OPEN 17 (14.2857 114.2857) (9.5238 104.7619) (9.5238 95.2381)
+ (14.2857 85.7143) (19.0476 80.9524) (23.8095 71.4286) (23.8095 61.9048)
+ (19.0476 52.3810) (0.0000 42.8571) (19.0476 33.3333) (23.8095 23.8095)
+ (23.8095 14.2857) (19.0476 4.7619) (14.2857 0.0000) (9.5238 -9.5238)
+ (9.5238 -19.0476) (14.2857 -28.5714)
+ OPEN 10 (9.5238 38.0952) (19.0476 28.5714) (19.0476 19.0476)
+ (14.2857 9.5238) (9.5238 4.7619) (4.7619 -4.7619) (4.7619 -14.2857)
+ (9.5238 -23.8095) (14.2857 -28.5714) (23.8095 -33.3333)
+INDEX 124 STROKE 1 CENTER 0.0000 RIGHT 0.0000
+ OPEN 2 (0.0000 119.0476) (0.0000 -33.3333)
+INDEX 125 STROKE 3 CENTER 9.5238 RIGHT 23.8095
+ OPEN 10 (0.0000 119.0476) (9.5238 114.2857) (14.2857 109.5238)
+ (19.0476 100.0000) (19.0476 90.4762) (14.2857 80.9524) (9.5238 76.1905)
+ (4.7619 66.6667) (4.7619 57.1429) (14.2857 47.6190)
+ OPEN 17 (9.5238 114.2857) (14.2857 104.7619) (14.2857 95.2381)
+ (9.5238 85.7143) (4.7619 80.9524) (0.0000 71.4286) (0.0000 61.9048)
+ (4.7619 52.3810) (23.8095 42.8571) (4.7619 33.3333) (0.0000 23.8095)
+ (0.0000 14.2857) (4.7619 4.7619) (9.5238 0.0000) (14.2857 -9.5238)
+ (14.2857 -19.0476) (9.5238 -28.5714)
+ OPEN 10 (14.2857 38.0952) (4.7619 28.5714) (4.7619 19.0476)
+ (9.5238 9.5238) (14.2857 4.7619) (19.0476 -4.7619) (19.0476 -14.2857)
+ (14.2857 -23.8095) (9.5238 -28.5714) (0.0000 -33.3333)
+INDEX 126 STROKE 2 CENTER 42.8571 RIGHT 85.7143
+ OPEN 11 (0.0000 28.5714) (0.0000 38.0952) (4.7619 52.3810)
+ (14.2857 57.1429) (23.8095 57.1429) (33.3333 52.3810) (52.3810 38.0952)
+ (61.9048 33.3333) (71.4286 33.3333) (80.9524 38.0952) (85.7143 47.6190)
+ OPEN 11 (0.0000 38.0952) (4.7619 47.6190) (14.2857 52.3810)
+ (23.8095 52.3810) (33.3333 47.6190) (52.3810 33.3333) (61.9048 28.5714)
+ (71.4286 28.5714) (80.9524 33.3333) (85.7143 47.6190) (85.7143 57.1429)
+INDEX 127 STROKE 2 CENTER 33.3333 RIGHT 66.6667
+ OPEN 2 (52.3810 100.0000) (14.2857 -33.3333)
+ OPEN 17 (28.5714 66.6667) (14.2857 61.9048) (4.7619 52.3810)
+ (0.0000 38.0952) (0.0000 23.8095) (4.7619 14.2857) (14.2857 4.7619)
+ (28.5714 0.0000) (38.0952 0.0000) (52.3810 4.7619) (61.9048 14.2857)
+ (66.6667 28.5714) (66.6667 42.8571) (61.9048 52.3810) (52.3810 61.9048)
+ (38.0952 66.6667) (28.5714 66.6667)
+
+
+
+#/* NCGA GRAFNET:SANS-SERIF NORMAL*/
+
+BEARING 32 L_SPACE 0.0 WIDTH 20.0 R_SPACE 0.0
+BEARING 33 L_SPACE 8.62 WIDTH 13.64 R_SPACE 8.48
+BEARING 34 L_SPACE 4.02 WIDTH 32.86 R_SPACE 9.32
+BEARING 35 L_SPACE 3.2 WIDTH 68.94 R_SPACE 4.86
+BEARING 36 L_SPACE 4.82 WIDTH 67.44 R_SPACE 4.72
+BEARING 37 L_SPACE 6.36 WIDTH 112.38 R_SPACE 4.5
+BEARING 38 L_SPACE 5.98 WIDTH 82.02 R_SPACE 0.54
+BEARING 39 L_SPACE 4.44 WIDTH 13.36 R_SPACE 9.18
+BEARING 40 L_SPACE 7.58 WIDTH 24.72 R_SPACE 6.26
+BEARING 41 L_SPACE 5.28 WIDTH 24.34 R_SPACE 8.92
+BEARING 42 L_SPACE 6.96 WIDTH 42.06 R_SPACE 4.86
+BEARING 43 L_SPACE 5.98 WIDTH 96.36 R_SPACE 5.56
+BEARING 44 L_SPACE 8.76 WIDTH 14.2 R_SPACE 7.78
+BEARING 45 L_SPACE 7.38 WIDTH 38.84 R_SPACE 7.66
+BEARING 46 L_SPACE 8.34 WIDTH 13.78 R_SPACE 8.62
+BEARING 47 L_SPACE 7.24 WIDTH 38.44 R_SPACE 8.2
+BEARING 48 L_SPACE 4.98 WIDTH 66.58 R_SPACE 5.42
+BEARING 49 L_SPACE 11.82 WIDTH 34.26 R_SPACE 30.9
+BEARING 50 L_SPACE 5.42 WIDTH 66.0 R_SPACE 5.56
+BEARING 51 L_SPACE 5.0 WIDTH 66.62 R_SPACE 5.38
+BEARING 52 L_SPACE 3.88 WIDTH 68.24 R_SPACE 4.86
+BEARING 53 L_SPACE 4.86 WIDTH 65.96 R_SPACE 6.16
+BEARING 54 L_SPACE 5.58 WIDTH 65.08 R_SPACE 6.32
+BEARING 55 L_SPACE 5.56 WIDTH 66.42 R_SPACE 5.0
+BEARING 56 L_SPACE 5.6 WIDTH 65.98 R_SPACE 5.4
+BEARING 57 L_SPACE 6.6 WIDTH 64.82 R_SPACE 5.56
+BEARING 58 L_SPACE 9.32 WIDTH 14.06 R_SPACE 7.38
+BEARING 59 L_SPACE 8.2 WIDTH 13.96 R_SPACE 8.58
+BEARING 60 L_SPACE 3.06 WIDTH 102.5 R_SPACE 2.36
+BEARING 61 L_SPACE 5.7 WIDTH 96.36 R_SPACE 5.84
+BEARING 62 L_SPACE 2.78 WIDTH 102.5 R_SPACE 2.64
+BEARING 63 L_SPACE 8.42 WIDTH 60.22 R_SPACE 8.34
+BEARING 64 L_SPACE 6.36 WIDTH 126.24 R_SPACE 6.1
+BEARING 65 L_SPACE 2.5 WIDTH 88.16 R_SPACE 1.8
+BEARING 66 L_SPACE 11.42 WIDTH 75.5 R_SPACE 5.54
+BEARING 67 L_SPACE 6.66 WIDTH 87.06 R_SPACE 6.4
+BEARING 68 L_SPACE 11.96 WIDTH 81.48 R_SPACE 6.66
+BEARING 69 L_SPACE 11.42 WIDTH 72.28 R_SPACE 4.86
+BEARING 70 L_SPACE 11.42 WIDTH 67.96 R_SPACE 5.42
+BEARING 71 L_SPACE 7.06 WIDTH 89.56 R_SPACE 11.28
+BEARING 72 L_SPACE 11.42 WIDTH 77.7 R_SPACE 11.0
+BEARING 73 L_SPACE 10.86 WIDTH 13.36 R_SPACE 10.44
+BEARING 74 L_SPACE 2.5 WIDTH 56.96 R_SPACE 9.88
+BEARING 75 L_SPACE 11.28 WIDTH 79.8 R_SPACE 1.38
+BEARING 76 L_SPACE 11.68 WIDTH 62.8 R_SPACE 2.5
+BEARING 77 L_SPACE 10.86 WIDTH 94.56 R_SPACE 10.16
+BEARING 78 L_SPACE 11.14 WIDTH 77.98 R_SPACE 11.0
+BEARING 79 L_SPACE 6.24 WIDTH 95.28 R_SPACE 6.4
+BEARING 80 L_SPACE 12.1 WIDTH 73.44 R_SPACE 6.9
+BEARING 81 L_SPACE 5.3 WIDTH 96.0 R_SPACE 6.6
+BEARING 82 L_SPACE 11.68 WIDTH 80.64 R_SPACE 4.02
+BEARING 83 L_SPACE 8.0 WIDTH 78.28 R_SPACE 6.16
+BEARING 84 L_SPACE 2.36 WIDTH 79.52 R_SPACE 2.92
+BEARING 85 L_SPACE 11.54 WIDTH 77.28 R_SPACE 11.28
+BEARING 86 L_SPACE 2.36 WIDTH 87.04 R_SPACE 3.06
+BEARING 87 L_SPACE 2.22 WIDTH 125.76 R_SPACE 3.06
+BEARING 88 L_SPACE 2.5 WIDTH 86.76 R_SPACE 3.2
+BEARING 89 L_SPACE 1.52 WIDTH 88.98 R_SPACE 1.94
+BEARING 90 L_SPACE 2.5 WIDTH 77.7 R_SPACE 4.58
+BEARING 91 L_SPACE 7.78 WIDTH 25.76 R_SPACE 5.0
+BEARING 92 L_SPACE 5.84 WIDTH 73.24 R_SPACE 5.7
+BEARING 93 L_SPACE 4.44 WIDTH 25.48 R_SPACE 8.62
+BEARING 94 L_SPACE 5.98 WIDTH 55.28 R_SPACE 8.06
+BEARING 95 L_SPACE -1.1 WIDTH 70.04 R_SPACE 0.4
+BEARING 96 L_SPACE 28.26 WIDTH 25.9 R_SPACE 26.74
+BEARING 97 L_SPACE 6.68 WIDTH 67.54 R_SPACE 2.78
+BEARING 98 L_SPACE 8.76 WIDTH 63.66 R_SPACE 4.56
+BEARING 99 L_SPACE 5.52 WIDTH 61.46 R_SPACE 6.26
+BEARING 100 L_SPACE 4.64 WIDTH 63.88 R_SPACE 8.48
+BEARING 101 L_SPACE 5.72 WIDTH 65.62 R_SPACE 5.66
+BEARING 102 L_SPACE 0.68 WIDTH 34.12 R_SPACE -0.12
+BEARING 103 L_SPACE 5.36 WIDTH 63.16 R_SPACE 8.48
+BEARING 104 L_SPACE 9.6 WIDTH 58.34 R_SPACE 9.04
+BEARING 105 L_SPACE 10.02 WIDTH 11.42 R_SPACE 9.32
+BEARING 106 L_SPACE -1.66 WIDTH 23.1 R_SPACE 9.32
+BEARING 107 L_SPACE 9.6 WIDTH 59.18 R_SPACE 0.54
+BEARING 108 L_SPACE 10.02 WIDTH 11.42 R_SPACE 9.32
+BEARING 109 L_SPACE 9.6 WIDTH 96.36 R_SPACE 9.6
+BEARING 110 L_SPACE 9.18 WIDTH 58.48 R_SPACE 9.32
+BEARING 111 L_SPACE 4.98 WIDTH 67.14 R_SPACE 4.86
+BEARING 112 L_SPACE 9.46 WIDTH 63.34 R_SPACE 4.2
+BEARING 113 L_SPACE 4.84 WIDTH 63.38 R_SPACE 8.76
+BEARING 114 L_SPACE 9.46 WIDTH 34.8 R_SPACE 1.94
+BEARING 115 L_SPACE 4.7 WIDTH 59.4 R_SPACE 5.24
+BEARING 116 L_SPACE 0.54 WIDTH 33.42 R_SPACE 0.68
+BEARING 117 L_SPACE 9.46 WIDTH 58.2 R_SPACE 9.32
+BEARING 118 L_SPACE 1.8 WIDTH 65.86 R_SPACE 1.66
+BEARING 119 L_SPACE 2.5 WIDTH 95.82 R_SPACE 1.8
+BEARING 120 L_SPACE 1.66 WIDTH 65.32 R_SPACE 2.36
+BEARING 121 L_SPACE 1.8 WIDTH 65.18 R_SPACE 2.36
+BEARING 122 L_SPACE 4.44 WIDTH 59.88 R_SPACE 5.0
+BEARING 123 L_SPACE 7.38 WIDTH 36.06 R_SPACE 10.44
+BEARING 124 L_SPACE 11.54 WIDTH 6.96 R_SPACE 12.24
+BEARING 125 L_SPACE 9.18 WIDTH 36.2 R_SPACE 8.48
+BEARING 126 L_SPACE 2.92 WIDTH 102.36 R_SPACE 2.64
+
--- /dev/null
+##
+# $XConsortium: Roman_M.src,v 5.3 94/04/17 20:10:06 rws Exp $
+##
+## Copyright (c) 1989,1990, 1991 by Sun Microsystems, Inc. and the X Consortium.
+##
+## All Rights Reserved
+##
+## Permission to use, copy, modify, and distribute this software and its
+## documentation for any purpose and without fee is hereby granted,
+## provided that the above copyright notice appear in all copies and that
+## both that copyright notice and this permission notice appear in
+## supporting documentation, and that the names of Sun Microsystems
+## and the X Consortium not be used in advertising or publicity
+## pertaining to distribution of the software without specific, written
+## prior permission.
+##
+## SUN MICROSYSTEMS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+## INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+## EVENT SHALL SUN MICROSYSTEMS OR THE X CONSORTIUM BE LIABLE FOR ANY SPECIAL,
+## INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+## FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+## NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+## WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+# Mono-spaced version of Roman Simplex font.
+
+ FONTNAME Roman
+ TOP 119.0476
+ BOTTOM -33.3333
+ NUM_CH 128
+ PROPERTIES 3
+
+ (CHARSET_REGISTRY ISO8859)
+ (CHARSET_ENCODING "1")
+ (SPACING M)
+
+INDEX 32 STROKE 0 CENTER 52.3810 RIGHT 104.7619
+INDEX 33 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (52.3810 100.0000) (52.3810 33.3333)
+ OPEN 5 (52.3810 9.5238) (47.6191 4.7619) (52.3810 0.0000)
+ (57.1429 4.7619) (52.3810 9.5238)
+INDEX 34 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (33.3334 100.0000) (33.3334 66.6667)
+ OPEN 2 (71.4286 100.0000) (71.4286 66.6667)
+INDEX 35 STROKE 4 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (54.7619 119.0476) (21.4286 -33.3333)
+ OPEN 2 (83.3334 119.0476) (50.0000 -33.3333)
+ OPEN 2 (21.4286 57.1429) (88.0952 57.1429)
+ OPEN 2 (16.6667 28.5714) (83.3334 28.5714)
+INDEX 36 STROKE 3 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (42.8571 119.0476) (42.8571 -19.0476)
+ OPEN 2 (61.9047 119.0476) (61.9047 -19.0476)
+ OPEN 20 (85.7143 85.7143) (76.1905 95.2381) (61.9047 100.0000)
+ (42.8571 100.0000) (28.5714 95.2381) (19.0476 85.7143) (19.0476 76.1905)
+ (23.8095 66.6667) (28.5714 61.9048) (38.0952 57.1429) (66.6666 47.6190)
+ (76.1905 42.8571) (80.9524 38.0952) (85.7143 28.5714) (85.7143 14.2857)
+ (76.1905 4.7619) (61.9047 0.0000) (42.8571 0.0000) (28.5714 4.7619)
+ (19.0476 14.2857)
+INDEX 37 STROKE 3 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (95.2381 100.0000) (9.5238 0.0000)
+ OPEN 16 (33.3333 100.0000) (42.8571 90.4762) (42.8571 80.9524)
+ (38.0952 71.4286) (28.5714 66.6667) (19.0476 66.6667) (9.5238 76.1905)
+ (9.5238 85.7143) (14.2857 95.2381) (23.8095 100.0000) (33.3333 100.0000)
+ (42.8571 95.2381) (57.1428 90.4762) (71.4286 90.4762) (85.7143 95.2381)
+ (95.2381 100.0000)
+ OPEN 11 (76.1905 33.3333) (66.6667 28.5714) (61.9048 19.0476)
+ (61.9048 9.5238) (71.4286 0.0000) (80.9524 0.0000) (90.4762 4.7619)
+ (95.2381 14.2857) (95.2381 23.8095) (85.7143 33.3333) (76.1905 33.3333)
+INDEX 38 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 34 (100.0000 57.1429) (100.0000 61.9048) (95.2381 66.6667)
+ (90.4762 66.6667) (85.7143 61.9048) (80.9524 52.3810) (71.4286 28.5714)
+ (61.9048 14.2857) (52.3809 4.7619) (42.8571 0.0000) (23.8095 0.0000)
+ (14.2857 4.7619) (9.5238 9.5238) (4.7619 19.0476) (4.7619 28.5714)
+ (9.5238 38.0952) (14.2857 42.8571) (47.6190 61.9048) (52.3809 66.6667)
+ (57.1429 76.1905) (57.1429 85.7143) (52.3809 95.2381) (42.8571 100.0000)
+ (33.3333 95.2381) (28.5714 85.7143) (28.5714 76.1905) (33.3333 61.9048)
+ (42.8571 47.6190) (66.6667 14.2857) (76.1905 4.7619) (85.7143 0.0000)
+ (95.2381 0.0000) (100.0000 4.7619) (100.0000 9.5238)
+INDEX 39 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (52.3810 100.0000) (52.3810 66.6667)
+INDEX 40 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 10 (69.0476 119.0476) (59.5238 109.5238) (50.0000 95.2381)
+ (40.4762 76.1905) (35.7143 52.3810) (35.7143 33.3333) (40.4762 9.5238)
+ (50.0000 -9.5238) (59.5238 -23.8095) (69.0476 -33.3333)
+INDEX 41 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 10 (35.7143 119.0476) (45.2381 109.5238) (54.7619 95.2381)
+ (64.2857 76.1905) (69.0476 52.3810) (69.0476 33.3333) (64.2857 9.5238)
+ (54.7619 -9.5238) (45.2381 -23.8095) (35.7143 -33.3333)
+INDEX 42 STROKE 3 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (52.3810 71.4286) (52.3810 14.2857)
+ OPEN 2 (28.5715 57.1429) (76.1905 28.5714)
+ OPEN 2 (76.1905 57.1429) (28.5715 28.5714)
+INDEX 43 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (52.3809 85.7143) (52.3809 0.0000)
+ OPEN 2 (9.5238 42.8571) (95.2381 42.8571)
+INDEX 44 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 8 (57.1429 4.7619) (52.3810 0.0000) (47.6191 4.7619)
+ (52.3810 9.5238) (57.1429 4.7619) (57.1429 -4.7619) (52.3810 -14.2857)
+ (47.6191 -19.0476)
+INDEX 45 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (9.5238 42.8571) (95.2381 42.8571)
+INDEX 46 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 5 (52.3810 9.5238) (47.6191 4.7619) (52.3810 0.0000)
+ (57.1429 4.7619) (52.3810 9.5238)
+INDEX 47 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (19.0476 -14.2857) (85.7143 100.0000)
+INDEX 48 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 17 (47.6190 100.0000) (33.3333 95.2381) (23.8095 80.9524)
+ (19.0476 57.1429) (19.0476 42.8571) (23.8095 19.0476) (33.3333 4.7619)
+ (47.6190 0.0000) (57.1428 0.0000) (71.4286 4.7619) (80.9524 19.0476)
+ (85.7143 42.8571) (85.7143 57.1429) (80.9524 80.9524) (71.4286 95.2381)
+ (57.1428 100.0000) (47.6190 100.0000)
+INDEX 49 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 4 (40.4762 80.9524) (50.0000 85.7143) (64.2857 100.0000)
+ (64.2857 0.0000)
+INDEX 50 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 14 (23.8095 76.1905) (23.8095 80.9524) (28.5714 90.4762)
+ (33.3333 95.2381) (42.8571 100.0000) (61.9047 100.0000) (71.4286 95.2381)
+ (76.1905 90.4762) (80.9524 80.9524) (80.9524 71.4286) (76.1905 61.9048)
+ (66.6666 47.6190) (19.0476 0.0000) (85.7143 0.0000)
+INDEX 51 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 15 (28.5714 100.0000) (80.9524 100.0000) (52.3809 61.9048)
+ (66.6666 61.9048) (76.1905 57.1429) (80.9524 52.3810) (85.7143 38.0952)
+ (85.7143 28.5714) (80.9524 14.2857) (71.4286 4.7619) (57.1428 0.0000)
+ (42.8571 0.0000) (28.5714 4.7619) (23.8095 9.5238) (19.0476 19.0476)
+INDEX 52 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 3 (64.2857 100.0000) (16.6667 33.3333) (88.0952 33.3333)
+ OPEN 2 (64.2857 100.0000) (64.2857 0.0000)
+INDEX 53 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 17 (76.1905 100.0000) (28.5714 100.0000) (23.8095 57.1429)
+ (28.5714 61.9048) (42.8571 66.6667) (57.1428 66.6667) (71.4286 61.9048)
+ (80.9524 52.3810) (85.7143 38.0952) (85.7143 28.5714) (80.9524 14.2857)
+ (71.4286 4.7619) (57.1428 0.0000) (42.8571 0.0000) (28.5714 4.7619)
+ (23.8095 9.5238) (19.0476 19.0476)
+INDEX 54 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 23 (78.5714 85.7143) (73.8096 95.2381) (59.5238 100.0000)
+ (50.0000 100.0000) (35.7143 95.2381) (26.1905 80.9524) (21.4286 57.1429)
+ (21.4286 33.3333) (26.1905 14.2857) (35.7143 4.7619) (50.0000 0.0000)
+ (54.7619 0.0000) (69.0476 4.7619) (78.5714 14.2857) (83.3334 28.5714)
+ (83.3334 33.3333) (78.5714 47.6190) (69.0476 57.1429) (54.7619 61.9048)
+ (50.0000 61.9048) (35.7143 57.1429) (26.1905 47.6190) (21.4286 33.3333)
+INDEX 55 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (85.7143 100.0000) (38.0952 0.0000)
+ OPEN 2 (19.0476 100.0000) (85.7143 100.0000)
+INDEX 56 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 29 (42.8571 100.0000) (28.5714 95.2381) (23.8095 85.7143)
+ (23.8095 76.1905) (28.5714 66.6667) (38.0952 61.9048) (57.1428 57.1429)
+ (71.4286 52.3810) (80.9524 42.8571) (85.7143 33.3333) (85.7143 19.0476)
+ (80.9524 9.5238) (76.1905 4.7619) (61.9047 0.0000) (42.8571 0.0000)
+ (28.5714 4.7619) (23.8095 9.5238) (19.0476 19.0476) (19.0476 33.3333)
+ (23.8095 42.8571) (33.3333 52.3810) (47.6190 57.1429) (66.6666 61.9048)
+ (76.1905 66.6667) (80.9524 76.1905) (80.9524 85.7143) (76.1905 95.2381)
+ (61.9047 100.0000) (42.8571 100.0000)
+INDEX 57 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 23 (83.3334 66.6667) (78.5714 52.3810) (69.0476 42.8571)
+ (54.7619 38.0952) (50.0000 38.0952) (35.7143 42.8571) (26.1905 52.3810)
+ (21.4286 66.6667) (21.4286 71.4286) (26.1905 85.7143) (35.7143 95.2381)
+ (50.0000 100.0000) (54.7619 100.0000) (69.0476 95.2381) (78.5714 85.7143)
+ (83.3334 66.6667) (83.3334 42.8571) (78.5714 19.0476) (69.0476 4.7619)
+ (54.7619 0.0000) (45.2381 0.0000) (30.9524 4.7619) (26.1905 14.2857)
+INDEX 58 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 5 (52.3810 66.6667) (47.6191 61.9048) (52.3810 57.1429)
+ (57.1429 61.9048) (52.3810 66.6667)
+ OPEN 5 (52.3810 9.5238) (47.6191 4.7619) (52.3810 0.0000)
+ (57.1429 4.7619) (52.3810 9.5238)
+INDEX 59 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 5 (52.3810 66.6667) (47.6191 61.9048) (52.3810 57.1429)
+ (57.1429 61.9048) (52.3810 66.6667)
+ OPEN 8 (57.1429 4.7619) (52.3810 0.0000) (47.6191 4.7619)
+ (52.3810 9.5238) (57.1429 4.7619) (57.1429 -4.7619) (52.3810 -14.2857)
+ (47.6191 -19.0476)
+INDEX 60 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 3 (90.4762 85.7143) (14.2857 42.8571) (90.4762 0.0000)
+INDEX 61 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (9.5238 57.1429) (95.2381 57.1429)
+ OPEN 2 (9.5238 28.5714) (95.2381 28.5714)
+INDEX 62 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 3 (14.2857 85.7143) (90.4762 42.8571) (14.2857 0.0000)
+INDEX 63 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 14 (23.8095 76.1905) (23.8095 80.9524) (28.5714 90.4762)
+ (33.3333 95.2381) (42.8571 100.0000) (61.9047 100.0000) (71.4285 95.2381)
+ (76.1905 90.4762) (80.9524 80.9524) (80.9524 71.4286) (76.1905 61.9048)
+ (71.4285 57.1429) (52.3809 47.6190) (52.3809 33.3333)
+ OPEN 5 (52.3809 9.5238) (47.6190 4.7619) (52.3809 0.0000)
+ (57.1428 4.7619) (52.3809 9.5238)
+INDEX 64 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 8 (64.2857 52.3810) (54.7619 57.1429) (45.2381 57.1429)
+ (40.4762 47.6190) (40.4762 42.8571) (45.2381 33.3333) (54.7619 33.3333)
+ (64.2857 38.0952)
+ OPEN 19 (64.2857 57.1429) (64.2857 38.0952) (69.0476 33.3333)
+ (78.5714 33.3333) (83.3334 42.8571) (83.3334 47.6190) (78.5714 61.9048)
+ (69.0476 71.4286) (54.7619 76.1905) (50.0000 76.1905) (35.7143 71.4286)
+ (26.1905 61.9048) (21.4286 47.6190) (21.4286 42.8571) (26.1905 28.5714)
+ (35.7143 19.0476) (50.0000 14.2857) (54.7619 14.2857) (69.0476 19.0476)
+INDEX 65 STROKE 3 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (52.3809 100.0000) (14.2857 0.0000)
+ OPEN 2 (52.3809 100.0000) (90.4762 0.0000)
+ OPEN 2 (28.5714 33.3333) (76.1905 33.3333)
+INDEX 66 STROKE 3 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (19.0476 100.0000) (19.0476 0.0000)
+ OPEN 9 (19.0476 100.0000) (61.9047 100.0000) (76.1905 95.2381)
+ (80.9524 90.4762) (85.7143 80.9524) (85.7143 71.4286) (80.9524 61.9048)
+ (76.1905 57.1429) (61.9047 52.3810)
+ OPEN 10 (19.0476 52.3810) (61.9047 52.3810) (76.1905 47.6190)
+ (80.9524 42.8571) (85.7143 33.3333) (85.7143 19.0476) (80.9524 9.5238)
+ (76.1905 4.7619) (61.9047 0.0000) (19.0476 0.0000)
+INDEX 67 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 18 (88.0952 76.1905) (83.3334 85.7143) (73.8096 95.2381)
+ (64.2857 100.0000) (45.2381 100.0000) (35.7143 95.2381) (26.1905 85.7143)
+ (21.4286 76.1905) (16.6667 61.9048) (16.6667 38.0952) (21.4286 23.8095)
+ (26.1905 14.2857) (35.7143 4.7619) (45.2381 0.0000) (64.2857 0.0000)
+ (73.8096 4.7619) (83.3334 14.2857) (88.0952 23.8095)
+INDEX 68 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (19.0476 100.0000) (19.0476 0.0000)
+ OPEN 12 (19.0476 100.0000) (52.3809 100.0000) (66.6666 95.2381)
+ (76.1905 85.7143) (80.9524 76.1905) (85.7143 61.9048) (85.7143 38.0952)
+ (80.9524 23.8095) (76.1905 14.2857) (66.6666 4.7619) (52.3809 0.0000)
+ (19.0476 0.0000)
+INDEX 69 STROKE 4 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (21.4286 100.0000) (21.4286 0.0000)
+ OPEN 2 (21.4286 100.0000) (83.3334 100.0000)
+ OPEN 2 (21.4286 52.3810) (59.5238 52.3810)
+ OPEN 2 (21.4286 0.0000) (83.3334 0.0000)
+INDEX 70 STROKE 3 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (21.4286 100.0000) (21.4286 0.0000)
+ OPEN 2 (21.4286 100.0000) (83.3334 100.0000)
+ OPEN 2 (21.4286 52.3810) (59.5238 52.3810)
+INDEX 71 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 19 (88.0952 76.1905) (83.3334 85.7143) (73.8096 95.2381)
+ (64.2857 100.0000) (45.2381 100.0000) (35.7143 95.2381) (26.1905 85.7143)
+ (21.4286 76.1905) (16.6667 61.9048) (16.6667 38.0952) (21.4286 23.8095)
+ (26.1905 14.2857) (35.7143 4.7619) (45.2381 0.0000) (64.2857 0.0000)
+ (73.8096 4.7619) (83.3334 14.2857) (88.0952 23.8095) (88.0952 38.0952)
+ OPEN 2 (64.2857 38.0952) (88.0952 38.0952)
+INDEX 72 STROKE 3 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (19.0476 100.0000) (19.0476 0.0000)
+ OPEN 2 (85.7143 100.0000) (85.7143 0.0000)
+ OPEN 2 (19.0476 52.3810) (85.7143 52.3810)
+INDEX 73 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (52.3810 100.0000) (52.3810 0.0000)
+INDEX 74 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 10 (76.1905 100.0000) (76.1905 23.8095) (71.4286 9.5238)
+ (66.6667 4.7619) (57.1429 0.0000) (47.6191 0.0000) (38.0953 4.7619)
+ (33.3334 9.5238) (28.5715 23.8095) (28.5715 33.3333)
+INDEX 75 STROKE 3 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (19.0476 100.0000) (19.0476 0.0000)
+ OPEN 2 (85.7143 100.0000) (19.0476 33.3333)
+ OPEN 2 (42.8571 57.1429) (85.7143 0.0000)
+INDEX 76 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (23.8095 100.0000) (23.8095 0.0000)
+ OPEN 2 (23.8095 0.0000) (80.9524 0.0000)
+INDEX 77 STROKE 4 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (14.2857 100.0000) (14.2857 0.0000)
+ OPEN 2 (14.2857 100.0000) (52.3809 0.0000)
+ OPEN 2 (90.4762 100.0000) (52.3809 0.0000)
+ OPEN 2 (90.4762 100.0000) (90.4762 0.0000)
+INDEX 78 STROKE 3 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (19.0476 100.0000) (19.0476 0.0000)
+ OPEN 2 (19.0476 100.0000) (85.7143 0.0000)
+ OPEN 2 (85.7143 100.0000) (85.7143 0.0000)
+INDEX 79 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 21 (42.8571 100.0000) (33.3333 95.2381) (23.8095 85.7143)
+ (19.0476 76.1905) (14.2857 61.9048) (14.2857 38.0952) (19.0476 23.8095)
+ (23.8095 14.2857) (33.3333 4.7619) (42.8571 0.0000) (61.9047 0.0000)
+ (71.4286 4.7619) (80.9524 14.2857) (85.7143 23.8095) (90.4762 38.0952)
+ (90.4762 61.9048) (85.7143 76.1905) (80.9524 85.7143) (71.4286 95.2381)
+ (61.9047 100.0000) (42.8571 100.0000)
+INDEX 80 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (19.0476 100.0000) (19.0476 0.0000)
+ OPEN 10 (19.0476 100.0000) (61.9047 100.0000) (76.1905 95.2381)
+ (80.9524 90.4762) (85.7143 80.9524) (85.7143 66.6667) (80.9524 57.1429)
+ (76.1905 52.3810) (61.9047 47.6190) (19.0476 47.6190)
+INDEX 81 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 21 (42.8571 100.0000) (33.3333 95.2381) (23.8095 85.7143)
+ (19.0476 76.1905) (14.2857 61.9048) (14.2857 38.0952) (19.0476 23.8095)
+ (23.8095 14.2857) (33.3333 4.7619) (42.8571 0.0000) (61.9047 0.0000)
+ (71.4286 4.7619) (80.9524 14.2857) (85.7143 23.8095) (90.4762 38.0952)
+ (90.4762 61.9048) (85.7143 76.1905) (80.9524 85.7143) (71.4286 95.2381)
+ (61.9047 100.0000) (42.8571 100.0000)
+ OPEN 2 (57.1428 19.0476) (85.7143 -9.5238)
+INDEX 82 STROKE 3 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (19.0476 100.0000) (19.0476 0.0000)
+ OPEN 10 (19.0476 100.0000) (61.9047 100.0000) (76.1905 95.2381)
+ (80.9524 90.4762) (85.7143 80.9524) (85.7143 71.4286) (80.9524 61.9048)
+ (76.1905 57.1429) (61.9047 52.3810) (19.0476 52.3810)
+ OPEN 2 (52.3809 52.3810) (85.7143 0.0000)
+INDEX 83 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 20 (85.7143 85.7143) (76.1905 95.2381) (61.9047 100.0000)
+ (42.8571 100.0000) (28.5714 95.2381) (19.0476 85.7143) (19.0476 76.1905)
+ (23.8095 66.6667) (28.5714 61.9048) (38.0952 57.1429) (66.6666 47.6190)
+ (76.1905 42.8571) (80.9524 38.0952) (85.7143 28.5714) (85.7143 14.2857)
+ (76.1905 4.7619) (61.9047 0.0000) (42.8571 0.0000) (28.5714 4.7619)
+ (19.0476 14.2857)
+INDEX 84 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (52.3809 100.0000) (52.3809 0.0000)
+ OPEN 2 (19.0476 100.0000) (85.7143 100.0000)
+INDEX 85 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 10 (19.0476 100.0000) (19.0476 28.5714) (23.8095 14.2857)
+ (33.3333 4.7619) (47.6190 0.0000) (57.1428 0.0000) (71.4286 4.7619)
+ (80.9524 14.2857) (85.7143 28.5714) (85.7143 100.0000)
+INDEX 86 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (14.2857 100.0000) (52.3809 0.0000)
+ OPEN 2 (90.4762 100.0000) (52.3809 0.0000)
+INDEX 87 STROKE 4 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (4.7619 100.0000) (28.5714 0.0000)
+ OPEN 2 (52.3809 100.0000) (28.5714 0.0000)
+ OPEN 2 (52.3809 100.0000) (76.1905 0.0000)
+ OPEN 2 (100.0000 100.0000) (76.1905 0.0000)
+INDEX 88 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (19.0476 100.0000) (85.7143 0.0000)
+ OPEN 2 (85.7143 100.0000) (19.0476 0.0000)
+INDEX 89 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 3 (14.2857 100.0000) (52.3809 52.3810) (52.3809 0.0000)
+ OPEN 2 (90.4762 100.0000) (52.3809 52.3810)
+INDEX 90 STROKE 3 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (85.7143 100.0000) (19.0476 0.0000)
+ OPEN 2 (19.0476 100.0000) (85.7143 100.0000)
+ OPEN 2 (19.0476 0.0000) (85.7143 0.0000)
+INDEX 91 STROKE 4 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (35.7143 119.0476) (35.7143 -33.3333)
+ OPEN 2 (40.4762 119.0476) (40.4762 -33.3333)
+ OPEN 2 (35.7143 119.0476) (69.0476 119.0476)
+ OPEN 2 (35.7143 -33.3333) (69.0476 -33.3333)
+INDEX 92 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (19.0476 100.0000) (85.7143 -14.2857)
+INDEX 93 STROKE 4 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (64.2857 119.0476) (64.2857 -33.3333)
+ OPEN 2 (69.0476 119.0476) (69.0476 -33.3333)
+ OPEN 2 (35.7143 119.0476) (69.0476 119.0476)
+ OPEN 2 (35.7143 -33.3333) (69.0476 -33.3333)
+INDEX 94 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (52.3809 109.5238) (14.2857 42.8571)
+ OPEN 2 (52.3809 109.5238) (90.4762 42.8571)
+INDEX 95 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 5 (0.0000 -33.3333) (104.7619 -33.3333) (104.7619 -28.5714)
+ (0.0000 -28.5714) (0.0000 -33.3333)
+INDEX 96 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (42.8572 100.0000) (66.6667 71.4286)
+ OPEN 3 (42.8572 100.0000) (38.0953 95.2381) (66.6667 71.4286)
+INDEX 97 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (80.9524 66.6667) (80.9524 0.0000)
+ OPEN 14 (80.9524 52.3810) (71.4285 61.9048) (61.9047 66.6667)
+ (47.6190 66.6667) (38.0952 61.9048) (28.5714 52.3810) (23.8095 38.0952)
+ (23.8095 28.5714) (28.5714 14.2857) (38.0952 4.7619) (47.6190 0.0000)
+ (61.9047 0.0000) (71.4285 4.7619) (80.9524 14.2857)
+INDEX 98 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (23.8095 100.0000) (23.8095 0.0000)
+ OPEN 14 (23.8095 52.3810) (33.3333 61.9048) (42.8571 66.6667)
+ (57.1428 66.6667) (66.6666 61.9048) (76.1905 52.3810) (80.9524 38.0952)
+ (80.9524 28.5714) (76.1905 14.2857) (66.6666 4.7619) (57.1428 0.0000)
+ (42.8571 0.0000) (33.3333 4.7619) (23.8095 14.2857)
+INDEX 99 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 14 (80.9524 52.3810) (71.4285 61.9048) (61.9047 66.6667)
+ (47.6190 66.6667) (38.0952 61.9048) (28.5714 52.3810) (23.8095 38.0952)
+ (23.8095 28.5714) (28.5714 14.2857) (38.0952 4.7619) (47.6190 0.0000)
+ (61.9047 0.0000) (71.4285 4.7619) (80.9524 14.2857)
+INDEX 100 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (80.9524 100.0000) (80.9524 0.0000)
+ OPEN 14 (80.9524 52.3810) (71.4285 61.9048) (61.9047 66.6667)
+ (47.6190 66.6667) (38.0952 61.9048) (28.5714 52.3810) (23.8095 38.0952)
+ (23.8095 28.5714) (28.5714 14.2857) (38.0952 4.7619) (47.6190 0.0000)
+ (61.9047 0.0000) (71.4285 4.7619) (80.9524 14.2857)
+INDEX 101 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 17 (23.8095 38.0952) (80.9524 38.0952) (80.9524 47.6190)
+ (76.1905 57.1429) (71.4285 61.9048) (61.9047 66.6667) (47.6190 66.6667)
+ (38.0952 61.9048) (28.5714 52.3810) (23.8095 38.0952) (23.8095 28.5714)
+ (28.5714 14.2857) (38.0952 4.7619) (47.6190 0.0000) (61.9047 0.0000)
+ (71.4285 4.7619) (80.9524 14.2857)
+INDEX 102 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 5 (71.4286 100.0000) (61.9048 100.0000) (52.3810 95.2381)
+ (47.6191 80.9524) (47.6191 0.0000)
+ OPEN 2 (33.3334 66.6667) (66.6667 66.6667)
+INDEX 103 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 7 (80.9524 66.6667) (80.9524 -9.5238) (76.1905 -23.8095)
+ (71.4285 -28.5714) (61.9047 -33.3333) (47.6190 -33.3333) (38.0952 -28.5714)
+ OPEN 14 (80.9524 52.3810) (71.4285 61.9048) (61.9047 66.6667)
+ (47.6190 66.6667) (38.0952 61.9048) (28.5714 52.3810) (23.8095 38.0952)
+ (23.8095 28.5714) (28.5714 14.2857) (38.0952 4.7619) (47.6190 0.0000)
+ (61.9047 0.0000) (71.4285 4.7619) (80.9524 14.2857)
+INDEX 104 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (26.1905 100.0000) (26.1905 0.0000)
+ OPEN 7 (26.1905 47.6190) (40.4762 61.9048) (50.0000 66.6667)
+ (64.2857 66.6667) (73.8095 61.9048) (78.5715 47.6190) (78.5715 0.0000)
+INDEX 105 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 5 (47.6191 100.0000) (52.3810 95.2381) (57.1429 100.0000)
+ (52.3810 104.7619) (47.6191 100.0000)
+ OPEN 2 (52.3810 66.6667) (52.3810 0.0000)
+INDEX 106 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 5 (57.1429 100.0000) (61.9048 95.2381) (66.6667 100.0000)
+ (61.9048 104.7619) (57.1429 100.0000)
+ OPEN 5 (61.9048 66.6667) (61.9048 -14.2857) (57.1429 -28.5714)
+ (47.6191 -33.3333) (38.0953 -33.3333)
+INDEX 107 STROKE 3 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (26.1905 100.0000) (26.1905 0.0000)
+ OPEN 2 (73.8095 66.6667) (26.1905 19.0476)
+ OPEN 2 (45.2381 38.0952) (78.5715 0.0000)
+INDEX 108 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (52.3810 100.0000) (52.3810 0.0000)
+INDEX 109 STROKE 3 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (0.0000 66.6667) (0.0000 0.0000)
+ OPEN 7 (0.0000 47.6190) (14.2857 61.9048) (23.8095 66.6667)
+ (38.0952 66.6667) (47.6190 61.9048) (52.3810 47.6190) (52.3810 0.0000)
+ OPEN 7 (52.3810 47.6190) (66.6667 61.9048) (76.1905 66.6667)
+ (90.4762 66.6667) (100.0000 61.9048) (104.7619 47.6190) (104.7619 0.0000)
+INDEX 110 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (26.1905 66.6667) (26.1905 0.0000)
+ OPEN 7 (26.1905 47.6190) (40.4762 61.9048) (50.0000 66.6667)
+ (64.2857 66.6667) (73.8095 61.9048) (78.5715 47.6190) (78.5715 0.0000)
+INDEX 111 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 17 (45.2381 66.6667) (35.7143 61.9048) (26.1905 52.3810)
+ (21.4286 38.0952) (21.4286 28.5714) (26.1905 14.2857) (35.7143 4.7619)
+ (45.2381 0.0000) (59.5238 0.0000) (69.0476 4.7619) (78.5714 14.2857)
+ (83.3334 28.5714) (83.3334 38.0952) (78.5714 52.3810) (69.0476 61.9048)
+ (59.5238 66.6667) (45.2381 66.6667)
+INDEX 112 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (23.8095 66.6667) (23.8095 -33.3333)
+ OPEN 14 (23.8095 52.3810) (33.3333 61.9048) (42.8571 66.6667)
+ (57.1428 66.6667) (66.6666 61.9048) (76.1905 52.3810) (80.9524 38.0952)
+ (80.9524 28.5714) (76.1905 14.2857) (66.6666 4.7619) (57.1428 0.0000)
+ (42.8571 0.0000) (33.3333 4.7619) (23.8095 14.2857)
+INDEX 113 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (80.9524 66.6667) (80.9524 -33.3333)
+ OPEN 14 (80.9524 52.3810) (71.4285 61.9048) (61.9047 66.6667)
+ (47.6190 66.6667) (38.0952 61.9048) (28.5714 52.3810) (23.8095 38.0952)
+ (23.8095 28.5714) (28.5714 14.2857) (38.0952 4.7619) (47.6190 0.0000)
+ (61.9047 0.0000) (71.4285 4.7619) (80.9524 14.2857)
+INDEX 114 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (33.3334 66.6667) (33.3334 0.0000)
+ OPEN 5 (33.3334 38.0952) (38.0953 52.3810) (47.6191 61.9048)
+ (57.1429 66.6667) (71.4286 66.6667)
+INDEX 115 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 17 (78.5715 52.3810) (73.8095 61.9048) (59.5238 66.6667)
+ (45.2381 66.6667) (30.9524 61.9048) (26.1905 52.3810) (30.9524 42.8571)
+ (40.4762 38.0952) (64.2857 33.3333) (73.8095 28.5714) (78.5715 19.0476)
+ (78.5715 14.2857) (73.8095 4.7619) (59.5238 0.0000) (45.2381 0.0000)
+ (30.9524 4.7619) (26.1905 14.2857)
+INDEX 116 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 5 (47.6191 100.0000) (47.6191 19.0476) (52.3810 4.7619)
+ (61.9048 0.0000) (71.4286 0.0000)
+ OPEN 2 (33.3334 66.6667) (66.6667 66.6667)
+INDEX 117 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 7 (26.1905 66.6667) (26.1905 19.0476) (30.9524 4.7619)
+ (40.4762 0.0000) (54.7619 0.0000) (64.2857 4.7619) (78.5715 19.0476)
+ OPEN 2 (78.5715 66.6667) (78.5715 0.0000)
+INDEX 118 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (23.8095 66.6667) (52.3809 0.0000)
+ OPEN 2 (80.9524 66.6667) (52.3809 0.0000)
+INDEX 119 STROKE 4 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (14.2857 66.6667) (33.3333 0.0000)
+ OPEN 2 (52.3809 66.6667) (33.3333 0.0000)
+ OPEN 2 (52.3809 66.6667) (71.4286 0.0000)
+ OPEN 2 (90.4762 66.6667) (71.4286 0.0000)
+INDEX 120 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (26.1905 66.6667) (78.5715 0.0000)
+ OPEN 2 (78.5715 66.6667) (26.1905 0.0000)
+INDEX 121 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (26.1905 66.6667) (54.7619 0.0000)
+ OPEN 6 (83.3334 66.6667) (54.7619 0.0000) (45.2381 -19.0476)
+ (35.7143 -28.5714) (26.1905 -33.3333) (21.4286 -33.3333)
+INDEX 122 STROKE 3 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (78.5715 66.6667) (26.1905 0.0000)
+ OPEN 2 (26.1905 66.6667) (78.5715 66.6667)
+ OPEN 2 (26.1905 0.0000) (78.5715 0.0000)
+INDEX 123 STROKE 3 CENTER 52.3810 RIGHT 104.7619
+ OPEN 10 (64.2857 119.0476) (54.7619 114.2857) (50.0000 109.5238)
+ (45.2381 100.0000) (45.2381 90.4762) (50.0000 80.9524) (54.7619 76.1905)
+ (59.5238 66.6667) (59.5238 57.1429) (50.0000 47.6190)
+ OPEN 17 (54.7619 114.2857) (50.0000 104.7619) (50.0000 95.2381)
+ (54.7619 85.7143) (59.5238 80.9524) (64.2857 71.4286) (64.2857 61.9048)
+ (59.5238 52.3810) (40.4762 42.8571) (59.5238 33.3333) (64.2857 23.8095)
+ (64.2857 14.2857) (59.5238 4.7619) (54.7619 0.0000) (50.0000 -9.5238)
+ (50.0000 -19.0476) (54.7619 -28.5714)
+ OPEN 10 (50.0000 38.0952) (59.5238 28.5714) (59.5238 19.0476)
+ (54.7619 9.5238) (50.0000 4.7619) (45.2381 -4.7619) (45.2381 -14.2857)
+ (50.0000 -23.8095) (54.7619 -28.5714) (64.2857 -33.3333)
+INDEX 124 STROKE 1 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (52.3810 119.0476) (52.3810 -33.3333)
+INDEX 125 STROKE 3 CENTER 52.3810 RIGHT 104.7619
+ OPEN 10 (40.4762 119.0476) (50.0000 114.2857) (54.7619 109.5238)
+ (59.5238 100.0000) (59.5238 90.4762) (54.7619 80.9524) (50.0000 76.1905)
+ (45.2381 66.6667) (45.2381 57.1429) (54.7619 47.6190)
+ OPEN 17 (50.0000 114.2857) (54.7619 104.7619) (54.7619 95.2381)
+ (50.0000 85.7143) (45.2381 80.9524) (40.4762 71.4286) (40.4762 61.9048)
+ (45.2381 52.3810) (64.2857 42.8571) (45.2381 33.3333) (40.4762 23.8095)
+ (40.4762 14.2857) (45.2381 4.7619) (50.0000 0.0000) (54.7619 -9.5238)
+ (54.7619 -19.0476) (50.0000 -28.5714)
+ OPEN 10 (54.7619 38.0952) (45.2381 28.5714) (45.2381 19.0476)
+ (50.0000 9.5238) (54.7619 4.7619) (59.5238 -4.7619) (59.5238 -14.2857)
+ (54.7619 -23.8095) (50.0000 -28.5714) (40.4762 -33.3333)
+INDEX 126 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 11 (9.5238 28.5714) (9.5238 38.0952) (14.2857 52.3810)
+ (23.8095 57.1429) (33.3333 57.1429) (42.8571 52.3810) (61.9048 38.0952)
+ (71.4286 33.3333) (80.9524 33.3333) (90.4762 38.0952) (95.2381 47.6190)
+ OPEN 11 (9.5238 38.0952) (14.2857 47.6190) (23.8095 52.3810)
+ (33.3333 52.3810) (42.8571 47.6190) (61.9048 33.3333) (71.4286 28.5714)
+ (80.9524 28.5714) (90.4762 33.3333) (95.2381 47.6190) (95.2381 57.1429)
+INDEX 127 STROKE 2 CENTER 52.3810 RIGHT 104.7619
+ OPEN 2 (71.4286 100.0000) (33.3333 -33.3333)
+ OPEN 17 (47.6190 66.6667) (33.3333 61.9048) (23.8095 52.3810)
+ (19.0476 38.0952) (19.0476 23.8095) (23.8095 14.2857) (33.3333 4.7619)
+ (47.6190 0.0000) (57.1428 0.0000) (71.4286 4.7619) (80.9524 14.2857)
+ (85.7143 28.5714) (85.7143 42.8571) (80.9524 52.3810) (71.4286 61.9048)
+ (57.1428 66.6667) (47.6190 66.6667)
--- /dev/null
+/*
+ * main.c
+ *
+ * A simple utility to generate the bitmap fonts to be used in freeglut.
+ *
+ * Copyright (c) 1999-2000 by Pawel W. Olszta
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: nie gru 26 21:52:36 CET 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 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+ #include <config.h>
+#endif
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <glib.h>
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+/*
+ * Define the log domain
+ */
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "genfonts"
+
+/*
+ * The alphabet we want to export.
+ */
+gchar* g_Alphabet = " abcdefghijklmnopqrstuwvxyzABCDEFGHIJKLMNOPQRSTUWVXYZ0123456789`~!@#$%^&*()-_=+[{}];:,.<>/?\\\"";
+gint g_AlphabetLength = 0;
+
+/*
+ * All undefined characters will get replaced by this one:
+ */
+gchar g_NoChar = '*';
+
+/*
+ * The stream we want to redirect our output to
+ */
+FILE* g_Output = NULL;
+
+/*
+ * The display we're getting the fonts from
+ */
+Display* g_Display;
+
+/*
+ * This function outputs the font file prologue
+ */
+void OutputPrologue( gchar* fileName )
+{
+ /*
+ * Output the copyright and permission notices:
+ */
+ fprintf( g_Output, "/*\n * %s\n *\n * This file has been automatically generated by the genfonts utility.\n *\n", fileName );
+ fprintf( g_Output, " * Copyright (c) 1999-2000 by Pawel W. Olszta\n * Written by Pawel W. Olszta, <olszta@sourceforge.net>\n * \n" );
+ fprintf( g_Output, " * Permission is hereby granted, free of charge, to any person obtaining a\n" );
+ fprintf( g_Output, " * copy of this software and associated documentation files (the \"Software\"),\n" );
+ fprintf( g_Output, " * to deal in the Software without restriction, including without limitation\n" );
+ fprintf( g_Output, " * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n" );
+ fprintf( g_Output, " * and/or sell copies of the Software, and to permit persons to whom the\n" );
+ fprintf( g_Output, " * Software is furnished to do so, subject to the following conditions:\n *\n" );
+ fprintf( g_Output, " * The above copyright notice and this permission notice shall be included\n" );
+ fprintf( g_Output, " * in all copies or substantial portions of the Sotware.\n *\n" );
+ fprintf( g_Output, " * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n" );
+ fprintf( g_Output, " * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n" );
+ fprintf( g_Output, " * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n" );
+ fprintf( g_Output, " * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n" );
+ fprintf( g_Output, " * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n" );
+ fprintf( g_Output, " * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n" );
+
+ /*
+ * The obvious include headers
+ */
+ fprintf( g_Output, "\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"../include/GL/freeglut.h\"\n#include \"../include/GL/freeglut_internal.h\"\n" );
+}
+
+/*
+ * This function outputs a font set
+ */
+void OutputFont( gchar* freeglutFontName, gchar* fontName )
+{
+ gint character, lineWidth, maxWidth = 0, maxHeight = 0;
+ XFontStruct* fontStruct = NULL;
+ XGCValues contextValues;
+ XImage* image = NULL;
+ guchar* lineBuffer;
+ Pixmap buffer;
+ GC context;
+
+ /*
+ * Check if there is a font that meets our requirements
+ */
+ fontStruct = XLoadQueryFont( g_Display, fontName );
+
+ if( fontStruct == NULL )
+ {
+ /*
+ * Whoops, the font was not found
+ */
+ g_error( "couldn't get font `%s' using local display", fontName );
+ }
+
+ /*
+ * Get the maximum size of the font characters
+ */
+ maxWidth = fontStruct->max_bounds.rbearing - fontStruct->min_bounds.lbearing;
+ maxHeight = fontStruct->max_bounds.ascent + fontStruct->max_bounds.descent;
+
+ /*
+ * Allocate the line buffer for storing the font bitmap lines
+ */
+ lineBuffer = g_new0( guchar, maxWidth );
+
+ /*
+ * Create a pixmap buffer where we'll be rendering our fonts to.
+ */
+ buffer = XCreatePixmap(
+ g_Display,
+ RootWindow( g_Display, DefaultScreen( g_Display ) ),
+ maxWidth,
+ maxHeight,
+ 1
+ );
+
+ /*
+ * We'll need a graphics context to handle the font writes and buffer clears
+ */
+ context = XCreateGC(
+ g_Display,
+ buffer,
+ 0,
+ &contextValues
+ );
+
+ /*
+ * Have the font assigned to the graphics context
+ */
+ XSetFont( g_Display, context, fontStruct->fid );
+
+ /*
+ * For every character we want to have outputted...
+ */
+ for( character=0; character<g_AlphabetLength; character++ )
+ {
+ gint x, y, start_x, stop_x;
+
+ /*
+ * Clear the context black (0 is black in our case)...
+ */
+ XSetForeground( g_Display, context, 0x00 );
+ XFillRectangle( g_Display, buffer, context, 0, 0, maxWidth, maxHeight );
+
+ /*
+ * Be kind and draw the characters white (which is 1 for us)
+ */
+ XSetForeground( g_Display, context, 0xff );
+
+ /*
+ * Draw the n-th character of the alphabet
+ */
+ XDrawString(
+ g_Display,
+ buffer,
+ context,
+ -fontStruct->min_bounds.lbearing,
+ fontStruct->max_bounds.ascent,
+ (g_Alphabet + character),
+ 1
+ );
+
+ /*
+ * We need some a way to access the font we've just drawn:
+ */
+ image = XGetImage(
+ g_Display,
+ buffer,
+ 0, 0,
+ maxWidth, maxHeight,
+ 1, XYPixmap
+ );
+
+ /*
+ * Find the first non-empty column:
+ */
+ start_x = -1; stop_x = -1;
+
+ for( x=0; x<maxWidth; x++ )
+ for( y=0; y<maxHeight; y++ )
+ if( (XGetPixel( image, x, y ) == 1) && (start_x == -1) )
+ start_x = x;
+
+ /*
+ * Find the last empty column
+ */
+ for( x=maxWidth-1; x>=0; x-- )
+ for( y=0; y<maxHeight; y++ )
+ if( (XGetPixel( image, x, y) == 1) && (stop_x == -1) )
+ stop_x = x + 1;
+
+ /*
+ * If the size is too little, enhance it a bit
+ */
+ if( stop_x - start_x < 1 )
+ {
+ start_x = 0; stop_x = maxWidth - 1;
+ }
+
+ /*
+ * Output the character we have just grabbed
+ */
+ fprintf( g_Output, "static const guchar %s_Character_%03i[] = {%3i",
+ freeglutFontName, (gint) g_Alphabet[ character ], stop_x-start_x
+ );
+
+ for( y=maxHeight-1; y>=0; y-- )
+ {
+ /*
+ * Prepare the line buffer for being used again
+ */
+ memset( lineBuffer, 0, maxWidth );
+
+ /*
+ * Grab the rasterized character face into the line buffer
+ */
+ for( x=start_x, lineWidth=0; x<stop_x; x++, lineWidth++ )
+ if( XGetPixel( image, x, y ) )
+ lineBuffer[ lineWidth / 8 ] |= 1 << (7 - (lineWidth % 8));
+
+ /*
+ * Feel free to output the final line bitmap now
+ */
+ for( x=0; x<(stop_x - start_x + 7) / 8; x++ )
+ fprintf( g_Output, ",%3i", lineBuffer[ x ] );
+ }
+
+ fprintf( g_Output, "};\n" );
+
+ /*
+ * Free the image, and get to the next character...
+ */
+ XDestroyImage( image );
+ }
+
+ /*
+ * Now we are ready to output the final data concerning the font charset
+ */
+ fprintf( g_Output, "\n/* The font characters mapping: */\n" );
+ fprintf( g_Output, "static const guchar* %s_Character_Map[] = {", freeglutFontName );
+
+ /*
+ * I have decided to change the characters mapping a bit...
+ */
+ for( character=1; character<256; character++ )
+ {
+ gchar ourCharacter[ 2 ] = { 0, 0 };
+
+ /*
+ * Do we have the character defined or not?
+ */
+ ourCharacter[ 0 ] = (gchar) character;
+
+ if( strstr( g_Alphabet, ourCharacter ) == NULL )
+ {
+ /*
+ * Nope, output the g_NoChar character instead:
+ */
+ fprintf( g_Output, "%s_Character_%03i,", freeglutFontName, (gint) g_NoChar );
+ }
+ else
+ {
+ /*
+ * Otherwise we're welcome to output the character:
+ */
+ fprintf( g_Output, "%s_Character_%03i,", freeglutFontName, (gint) ourCharacter[ 0 ] );
+ }
+ }
+
+ fprintf( g_Output, "NULL};\n\n" );
+
+ /*
+ * And finally have the font structure written to the output stream
+ */
+ fprintf( g_Output, "/* The font structure: */\n" );
+ fprintf( g_Output, "const SFG_Font fgFont%s = { \"%s\", %i, %i, %s_Character_Map };\n\n",
+ freeglutFontName, fontName, g_AlphabetLength, maxHeight, freeglutFontName
+ );
+
+ /*
+ * Done, clean up behind...
+ */
+ XFreeGC( g_Display, context );
+ XFreePixmap( g_Display, buffer );
+ g_free( lineBuffer );
+}
+
+/*
+ * This function outputs the font file epilogue
+ */
+void OutputEpilogue( void )
+{
+ fprintf( g_Output, "/*** END OF FILE ***/\n" );
+}
+
+/*
+ * The main function processes the command line arguments
+ * and outputs all the fonts we need to have rasterized.
+ */
+int main( int argc, char** argv )
+{
+ gchar ourCharacter[ 2 ] = { 0, 0 };
+ gchar* outputFileName = NULL;
+ gchar* displayName = NULL;
+ gint i = 1;
+
+ /*
+ * The fonts that are going to be rasterized and added to the output file:
+ */
+ gint fontsQuantity = 7;
+ gchar* fontsList[] = {
+ "Fixed8x13", "-misc-fixed-medium-r-normal--13-120-75-75-C-80-iso8859-1",
+ "Fixed9x15", "-misc-fixed-medium-r-normal--15-140-75-75-C-90-iso8859-1",
+ "Helvetica10", "-adobe-helvetica-medium-r-normal--10-100-75-75-p-56-iso8859-1",
+ "Helvetica12", "-adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1",
+ "Helvetica18", "-adobe-helvetica-medium-r-normal--18-180-75-75-p-98-iso8859-1",
+ "TimesRoman10", "-adobe-times-medium-r-normal--10-100-75-75-p-54-iso8859-1",
+ "TimesRoman24", "-adobe-times-medium-r-normal--24-240-75-75-p-124-iso8859-1"
+ };
+
+ /*
+ * Initialize the alphabet's length
+ */
+ g_AlphabetLength = strlen( g_Alphabet );
+
+ /*
+ * Make sure that the no-character character is in the alphabet
+ */
+ ourCharacter[ 0 ] = g_NoChar;
+
+ if( strstr( g_Alphabet, ourCharacter ) == NULL )
+ g_error( "the g_NoChar `%c' character not found in the alphabet `%s'", g_NoChar, g_Alphabet );
+
+ /*
+ * Grab the display name to be used
+ */
+ displayName = g_strdup( (gchar *) g_getenv( "DISPLAY" ) );
+
+ /*
+ * Define the default output file name
+ */
+ outputFileName = g_strdup( "freeglut_font_data.c" );
+
+ /*
+ * Process the command line arguments now. Command line arguments expected:
+ *
+ * -display <DISPLAYNAME> -- the display to connect to
+ * -file <FILENAME> -- the destination file name
+ */
+ while( i < argc )
+ {
+ /*
+ * See what the current token is
+ */
+ if( g_strcasecmp( argv[ i ], "-display" ) == 0 )
+ {
+ g_assert( (i + 1) < argc );
+ g_free( displayName );
+
+ /*
+ * The next token is expected to contain the X display name to use
+ */
+ displayName = g_strdup( (gchar *) argv[ ++i ] );
+ }
+ else if( g_strcasecmp( argv[ i ], "-file" ) == 0 )
+ {
+ g_assert( (i + 1) < argc );
+ g_free( outputFileName );
+
+ /*
+ * The next token is expected to contain the destination file name
+ */
+ outputFileName = g_strdup( (gchar *) argv[ ++i ] );
+ }
+
+ /*
+ * Get to the next argument
+ */
+ i++;
+ }
+
+ /*
+ * Connect to the X display
+ */
+ g_Display = XOpenDisplay( displayName );
+ g_assert( g_Display != NULL );
+
+ /*
+ * Have the destination file opened
+ */
+ g_Output = fopen( outputFileName, "wt" );
+ g_assert( g_Output != NULL );
+
+ /*
+ * Output the file header first
+ */
+ OutputPrologue( outputFileName );
+
+ /*
+ * In the file header, have the list of the fonts written:
+ */
+ fprintf( g_Output, "\n/*\n * Following fonts are defined in this file:\n * \n" );
+
+ for( i=0; i<fontsQuantity; i++ )
+ fprintf( g_Output, " * %i. fgFont%s <%s>\n",
+ i + 1, fontsList[ i*2 + 0 ], fontsList[ i*2 + 1 ]
+ );
+
+ fprintf( g_Output, " */\n\n" );
+
+ /*
+ * Output all of the fonts we want to output
+ */
+ for( i=0; i<fontsQuantity; i++ )
+ OutputFont( fontsList[ i*2 + 0 ], fontsList[ i*2 + 1 ] );
+
+ /*
+ * Finally, have the file epilogue outputted
+ */
+ OutputEpilogue();
+
+ /*
+ * Close the output stream
+ */
+ fclose( g_Output );
+
+ /*
+ * Close the X display
+ */
+ XCloseDisplay( g_Display );
+
+ /*
+ * Clean up all the rest of the mess
+ */
+ g_free( outputFileName );
+ g_free( displayName );
+
+ /*
+ * Return successful!
+ */
+ return( EXIT_SUCCESS );
+}
+
+/*** END OF FILE ***/
--- /dev/null
+/*
+ * main.c
+ *
+ * A simple utility to generate the stroke fonts to be used in freeglut.
+ *
+ * Copyright (c) 1999-2000 by Pawel W. Olszta
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: czw sty 06 19:42:30 CET 2000
+ *
+ * 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.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+ #include <config.h>
+#endif
+
+#include <glib.h>
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+/*
+ * Define the log domain
+ */
+#undef G_LOG_DOMAIN
+#define G_LOG_DOMAIN "genstroke"
+
+/*
+ * The alphabet we want to export.
+ */
+gchar* g_Alphabet = " abcdefghijklmnopqrstuwvxyzABCDEFGHIJKLMNOPQRSTUWVXYZ0123456789`~!@#$%^&*()-_=+[{}];:,.<>/?\\\"";
+gint g_AlphabetLength = 0;
+
+/*
+ * All undefined characters will get replaced by this one:
+ */
+gchar g_NoChar = '*';
+
+/*
+ * The stream we want to redirect our output to
+ */
+FILE* g_Output = NULL;
+
+/*
+ * This function outputs the font file prologue
+ */
+void OutputPrologue( gchar* fileName )
+{
+ /*
+ * Output the copyright and permission notices:
+ */
+ fprintf( g_Output, "/*\n * %s\n *\n * This file has been automatically generated by the genfonts utility.\n *\n", fileName );
+ fprintf( g_Output, " * Copyright (c) 1999-2000 by Pawel W. Olszta\n * Written by Pawel W. Olszta, <olszta@sourceforge.net>\n * \n" );
+ fprintf( g_Output, " * Permission is hereby granted, free of charge, to any person obtaining a\n" );
+ fprintf( g_Output, " * copy of this software and associated documentation files (the \"Software\"),\n" );
+ fprintf( g_Output, " * to deal in the Software without restriction, including without limitation\n" );
+ fprintf( g_Output, " * the rights to use, copy, modify, merge, publish, distribute, sublicense,\n" );
+ fprintf( g_Output, " * and/or sell copies of the Software, and to permit persons to whom the\n" );
+ fprintf( g_Output, " * Software is furnished to do so, subject to the following conditions:\n *\n" );
+ fprintf( g_Output, " * The above copyright notice and this permission notice shall be included\n" );
+ fprintf( g_Output, " * in all copies or substantial portions of the Sotware.\n *\n" );
+ fprintf( g_Output, " * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n" );
+ fprintf( g_Output, " * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n" );
+ fprintf( g_Output, " * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n" );
+ fprintf( g_Output, " * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n" );
+ fprintf( g_Output, " * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n" );
+ fprintf( g_Output, " * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n" );
+
+ /*
+ * The obvious include headers
+ */
+ fprintf( g_Output, "\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"../include/GL/freeglut.h\"\n#include \"../include/GL/freeglut_internal.h\"\n" );
+}
+
+/*
+ * This function outputs a font set
+ */
+void OutputFont( gchar* freeglutFontName, gchar* fontName )
+{
+ /*
+ * This is an easy one. I just have to write a parser for the SRC files
+ * and dump their contents to the output file. Expect this to be done
+ * this weekend. The output data should be organized just like the bitmap
+ * fonts data, as it shown to be good.
+ */
+}
+
+/*
+ * This function outputs the font file epilogue
+ */
+void OutputEpilogue( void )
+{
+ fprintf( g_Output, "/*** END OF FILE ***/\n" );
+}
+
+/*
+ * The main function processes the command line arguments
+ * and outputs all the fonts we need to have rasterized.
+ */
+int main( int argc, char** argv )
+{
+ gchar ourCharacter[ 2 ] = { 0, 0 };
+ gchar* outputFileName = NULL;
+ gint i = 1;
+
+ /*
+ * Initialize the alphabet's length
+ */
+ g_AlphabetLength = strlen( g_Alphabet );
+
+ /*
+ * Make sure that the no-character character is in the alphabet
+ */
+ ourCharacter[ 0 ] = g_NoChar;
+
+ if( strstr( g_Alphabet, ourCharacter ) == NULL )
+ g_error( "the g_NoChar `%c' character not found in the alphabet `%s'", g_NoChar, g_Alphabet );
+
+ /*
+ * Define the default output file name
+ */
+ outputFileName = g_strdup( "freeglut_font_stroke.c" );
+
+ /*
+ * Process the command line arguments now. Command line arguments expected:
+ *
+ * -file <FILENAME> -- the destination file name
+ */
+ while( i < argc )
+ {
+ /*
+ * See what the current token is
+ */
+ if( g_strcasecmp( argv[ i ], "-file" ) == 0 )
+ {
+ g_assert( (i + 1) < argc );
+ g_free( outputFileName );
+
+ /*
+ * The next token is expected to contain the destination file name
+ */
+ outputFileName = g_strdup( (gchar *) argv[ ++i ] );
+ }
+
+ /*
+ * Get to the next argument
+ */
+ i++;
+ }
+
+ /*
+ * Have the destination file opened
+ */
+ g_Output = fopen( outputFileName, "wt" );
+ g_assert( g_Output != NULL );
+
+ /*
+ * Output the file header first
+ */
+ OutputPrologue( outputFileName );
+
+ /*
+ * Output all of the fonts we want to output
+ */
+ OutputFont( "Roman", "Roman.src" );
+ OutputFont( "RomanMono", "Roman_M.src" );
+
+ /*
+ * Finally, have the file epilogue outputted
+ */
+ OutputEpilogue();
+
+ /*
+ * Close the output stream
+ */
+ fclose( g_Output );
+
+ /*
+ * Clean up all the rest of the mess
+ */
+ g_free( outputFileName );
+
+ /*
+ * Return successful!
+ */
+ return( EXIT_SUCCESS );
+}
+
+/*** END OF FILE ***/
--- /dev/null
+# Generated automatically from Makefile.in by configure.
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = /bin/sh
+
+srcdir = .
+top_srcdir = ../..
+prefix = /usr/local
+exec_prefix = ${prefix}
+
+bindir = ${exec_prefix}/bin
+sbindir = ${exec_prefix}/sbin
+libexecdir = ${exec_prefix}/libexec
+datadir = ${prefix}/share
+sysconfdir = ${prefix}/etc
+sharedstatedir = ${prefix}/com
+localstatedir = ${prefix}/var
+libdir = ${exec_prefix}/lib
+infodir = ${prefix}/info
+mandir = ${prefix}/man
+includedir = ${prefix}/include
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/freeglut
+pkglibdir = $(libdir)/freeglut
+pkgincludedir = $(includedir)/freeglut
+
+top_builddir = ../..
+
+ACLOCAL = aclocal
+AUTOCONF = autoconf
+AUTOMAKE = automake
+AUTOHEADER = autoheader
+
+INSTALL = /usr/bin/ginstall -c
+INSTALL_PROGRAM = ${INSTALL} $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+transform = s,x,x,
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = i686-suse-linux
+host_triplet = i686-suse-linux-gnu
+AS = @AS@
+CC = gcc
+DLLTOOL = @DLLTOOL@
+EXEEXT =
+LIBM = -lm
+LIBTOOL = $(SHELL) $(top_builddir)/libtool
+LIBTOOL_DEPS = ./ltconfig ./ltmain.sh
+LN_S = ln -s
+MAKEINFO = makeinfo
+OBJDUMP = @OBJDUMP@
+PACKAGE = freeglut
+RANLIB = ranlib
+VERSION = 0.1
+
+GLincludedir = $(includedir)/GL
+
+EXTRA_DIST = freeglut.h freeglut_internal.h
+GLinclude_HEADERS = freeglut.h
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES =
+HEADERS = $(GLinclude_HEADERS)
+
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu include/GL/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+install-GLincludeHEADERS: $(GLinclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(GLincludedir)
+ @list='$(GLinclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d= ; else d="$(srcdir)/"; fi; \
+ echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(GLincludedir)/$$p"; \
+ $(INSTALL_DATA) $$d$$p $(DESTDIR)$(GLincludedir)/$$p; \
+ done
+
+uninstall-GLincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ list='$(GLinclude_HEADERS)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(GLincludedir)/$$p; \
+ done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = include/GL
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu include/GL/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-GLincludeHEADERS
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-GLincludeHEADERS
+uninstall: uninstall-am
+all-am: Makefile $(HEADERS)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(GLincludedir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-tags clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-tags distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \
+ distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: uninstall-GLincludeHEADERS install-GLincludeHEADERS tags \
+mostlyclean-tags distclean-tags clean-tags maintainer-clean-tags \
+distdir info-am info dvi-am dvi check check-am installcheck-am \
+installcheck install-exec-am install-exec install-data-am install-data \
+install-am install uninstall-am uninstall all-redirect all-am all \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+## Process this file with automake to produce Makefile.in
+
+GLincludedir = $(includedir)/GL
+
+EXTRA_DIST = freeglut.h freeglut_internal.h
+GLinclude_HEADERS = freeglut.h
+
--- /dev/null
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+DLLTOOL = @DLLTOOL@
+EXEEXT = @EXEEXT@
+LIBM = @LIBM@
+LIBTOOL = @LIBTOOL@
+LIBTOOL_DEPS = @LIBTOOL_DEPS@
+LN_S = @LN_S@
+MAKEINFO = @MAKEINFO@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+VERSION = @VERSION@
+
+GLincludedir = $(includedir)/GL
+
+EXTRA_DIST = freeglut.h freeglut_internal.h
+GLinclude_HEADERS = freeglut.h
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES =
+HEADERS = $(GLinclude_HEADERS)
+
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu include/GL/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+install-GLincludeHEADERS: $(GLinclude_HEADERS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(GLincludedir)
+ @list='$(GLinclude_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d= ; else d="$(srcdir)/"; fi; \
+ echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(GLincludedir)/$$p"; \
+ $(INSTALL_DATA) $$d$$p $(DESTDIR)$(GLincludedir)/$$p; \
+ done
+
+uninstall-GLincludeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ list='$(GLinclude_HEADERS)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(GLincludedir)/$$p; \
+ done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = include/GL
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu include/GL/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am: install-GLincludeHEADERS
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-GLincludeHEADERS
+uninstall: uninstall-am
+all-am: Makefile $(HEADERS)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(GLincludedir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-tags clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-tags distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \
+ distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: uninstall-GLincludeHEADERS install-GLincludeHEADERS tags \
+mostlyclean-tags distclean-tags clean-tags maintainer-clean-tags \
+distdir info-am info dvi-am dvi check check-am installcheck-am \
+installcheck install-exec-am install-exec install-data-am install-data \
+install-am install uninstall-am uninstall all-redirect all-am all \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+/*
+ * freeglut.h
+ *
+ * The freeglut library 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_H
+#define FREEGLUT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/*
+ * Under windows, we've got some issues to solve
+ */
+#if defined(WIN32)
+# if defined(FREEGLUT_LIBRARY_BUILD)
+# define FGAPI __declspec(dllexport)
+# else
+# define FGAPI __declspec(dllimport)
+# endif
+# define FGAPIENTRY __stdcall
+#else
+# define FGAPI
+# define FGAPIENTRY
+#endif
+
+/*
+ * The freeglut and GLUT API versions
+ */
+#define FREEGLUT 1
+#define GLUT_API_VERSION 4
+
+/*
+ * Always include OpenGL and GLU headers
+ */
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+/*
+ * GLUT API macro definitions -- the special key codes:
+ */
+#define GLUT_KEY_F1 0x0001
+#define GLUT_KEY_F2 0x0002
+#define GLUT_KEY_F3 0x0003
+#define GLUT_KEY_F4 0x0004
+#define GLUT_KEY_F5 0x0005
+#define GLUT_KEY_F6 0x0006
+#define GLUT_KEY_F7 0x0007
+#define GLUT_KEY_F8 0x0008
+#define GLUT_KEY_F9 0x0009
+#define GLUT_KEY_F10 0x000A
+#define GLUT_KEY_F11 0x000B
+#define GLUT_KEY_F12 0x000C
+#define GLUT_KEY_LEFT 0x0064
+#define GLUT_KEY_UP 0x0065
+#define GLUT_KEY_RIGHT 0x0066
+#define GLUT_KEY_DOWN 0x0067
+#define GLUT_KEY_PAGE_UP 0x0068
+#define GLUT_KEY_PAGE_DOWN 0x0069
+#define GLUT_KEY_HOME 0x006A
+#define GLUT_KEY_END 0x006B
+#define GLUT_KEY_INSERT 0x006C
+
+/*
+ * GLUT API macro definitions -- mouse state definitions
+ */
+#define GLUT_LEFT_BUTTON 0x0000
+#define GLUT_MIDDLE_BUTTON 0x0001
+#define GLUT_RIGHT_BUTTON 0x0002
+#define GLUT_DOWN 0x0000
+#define GLUT_UP 0x0001
+#define GLUT_LEFT 0x0000
+#define GLUT_ENTERED 0x0001
+
+/*
+ * GLUT API macro definitions -- the display mode definitions
+ */
+#define GLUT_RGB 0x0000
+#define GLUT_RGBA 0x0000
+#define GLUT_INDEX 0x0001
+#define GLUT_SINGLE 0x0000
+#define GLUT_DOUBLE 0x0002
+#define GLUT_ACCUM 0x0004
+#define GLUT_ALPHA 0x0008
+#define GLUT_DEPTH 0x0010
+#define GLUT_STENCIL 0x0020
+#define GLUT_MULTISAMPLE 0x0080
+#define GLUT_STEREO 0x0100
+#define GLUT_LUMINANCE 0x0200
+
+/*
+ * GLUT API macro definitions -- windows and menu related definitions
+ */
+#define GLUT_MENU_NOT_IN_USE 0x0000
+#define GLUT_MENU_IN_USE 0x0001
+#define GLUT_NOT_VISIBLE 0x0000
+#define GLUT_VISIBLE 0x0001
+#define GLUT_HIDDEN 0x0000
+#define GLUT_FULLY_RETAINED 0x0001
+#define GLUT_PARTIALLY_RETAINED 0x0002
+#define GLUT_FULLY_COVERED 0x0003
+
+/*
+ * GLUT API macro definitions -- fonts definitions
+ *
+ * Steve Baker suggested to make it binary compatible with GLUT:
+ */
+#if defined(WIN32)
+# define GLUT_STROKE_ROMAN ((void *)0x0000)
+# define GLUT_STROKE_MONO_ROMAN ((void *)0x0001)
+# define GLUT_BITMAP_9_BY_15 ((void *)0x0002)
+# define GLUT_BITMAP_8_BY_13 ((void *)0x0003)
+# define GLUT_BITMAP_TIMES_ROMAN_10 ((void *)0x0004)
+# define GLUT_BITMAP_TIMES_ROMAN_24 ((void *)0x0005)
+# define GLUT_BITMAP_HELVETICA_10 ((void *)0x0006)
+# define GLUT_BITMAP_HELVETICA_12 ((void *)0x0007)
+# define GLUT_BITMAP_HELVETICA_18 ((void *)0x0008)
+#else
+ /*
+ * I don't really know if it's a good idea... But here it goes:
+ */
+ extern void* glutStrokeRoman;
+ extern void* glutStrokeMonoRoman;
+ extern void* glutBitmap9By15;
+ extern void* glutBitmap8By13;
+ extern void* glutBitmapTimesRoman10;
+ extern void* glutBitmapTimesRoman24;
+ extern void* glutBitmapHelvetica10;
+ extern void* glutBitmapHelvetica12;
+ extern void* glutBitmapHelvetica18;
+
+ /*
+ * Those pointers will be used by following definitions:
+ */
+# define GLUT_STROKE_ROMAN ((void *) &glutStrokeRoman)
+# define GLUT_STROKE_MONO_ROMAN ((void *) &glutStrokeMonoRoman)
+# define GLUT_BITMAP_9_BY_15 ((void *) &glutBitmap9By15)
+# define GLUT_BITMAP_8_BY_13 ((void *) &glutBitmap8By13)
+# define GLUT_BITMAP_TIMES_ROMAN_10 ((void *) &glutBitmapTimesRoman10)
+# define GLUT_BITMAP_TIMES_ROMAN_24 ((void *) &glutBitmapTimesRoman24)
+# define GLUT_BITMAP_HELVETICA_10 ((void *) &glutBitmapHelvetica10)
+# define GLUT_BITMAP_HELVETICA_12 ((void *) &glutBitmapHelvetica12)
+# define GLUT_BITMAP_HELVETICA_18 ((void *) &glutBitmapHelvetica18)
+#endif
+
+/*
+ * GLUT API macro definitions -- the glutGet parameters
+ */
+#define GLUT_WINDOW_X 0x0064
+#define GLUT_WINDOW_Y 0x0065
+#define GLUT_WINDOW_WIDTH 0x0066
+#define GLUT_WINDOW_HEIGHT 0x0067
+#define GLUT_WINDOW_BUFFER_SIZE 0x0068
+#define GLUT_WINDOW_STENCIL_SIZE 0x0069
+#define GLUT_WINDOW_DEPTH_SIZE 0x006A
+#define GLUT_WINDOW_RED_SIZE 0x006B
+#define GLUT_WINDOW_GREEN_SIZE 0x006C
+#define GLUT_WINDOW_BLUE_SIZE 0x006D
+#define GLUT_WINDOW_ALPHA_SIZE 0x006E
+#define GLUT_WINDOW_ACCUM_RED_SIZE 0x006F
+#define GLUT_WINDOW_ACCUM_GREEN_SIZE 0x0070
+#define GLUT_WINDOW_ACCUM_BLUE_SIZE 0x0071
+#define GLUT_WINDOW_ACCUM_ALPHA_SIZE 0x0072
+#define GLUT_WINDOW_DOUBLEBUFFER 0x0073
+#define GLUT_WINDOW_RGBA 0x0074
+#define GLUT_WINDOW_PARENT 0x0075
+#define GLUT_WINDOW_NUM_CHILDREN 0x0076
+#define GLUT_WINDOW_COLORMAP_SIZE 0x0077
+#define GLUT_WINDOW_NUM_SAMPLES 0x0078
+#define GLUT_WINDOW_STEREO 0x0079
+#define GLUT_WINDOW_CURSOR 0x007A
+
+#define GLUT_SCREEN_WIDTH 0x00C8
+#define GLUT_SCREEN_HEIGHT 0x00C9
+#define GLUT_SCREEN_WIDTH_MM 0x00CA
+#define GLUT_SCREEN_HEIGHT_MM 0x00CB
+#define GLUT_MENU_NUM_ITEMS 0x012C
+#define GLUT_DISPLAY_MODE_POSSIBLE 0x0190
+#define GLUT_INIT_WINDOW_X 0x01F4
+#define GLUT_INIT_WINDOW_Y 0x01F5
+#define GLUT_INIT_WINDOW_WIDTH 0x01F6
+#define GLUT_INIT_WINDOW_HEIGHT 0x01F7
+#define GLUT_INIT_DISPLAY_MODE 0x01F8
+#define GLUT_ELAPSED_TIME 0x02BC
+#define GLUT_WINDOW_FORMAT_ID 0x007B
+
+/*
+ * GLUT API macro definitions -- the glutDeviceGet parameters
+ */
+#define GLUT_HAS_KEYBOARD 0x0258
+#define GLUT_HAS_MOUSE 0x0259
+#define GLUT_HAS_SPACEBALL 0x025A
+#define GLUT_HAS_DIAL_AND_BUTTON_BOX 0x025B
+#define GLUT_HAS_TABLET 0x025C
+#define GLUT_NUM_MOUSE_BUTTONS 0x025D
+#define GLUT_NUM_SPACEBALL_BUTTONS 0x025E
+#define GLUT_NUM_BUTTON_BOX_BUTTONS 0x025F
+#define GLUT_NUM_DIALS 0x0260
+#define GLUT_NUM_TABLET_BUTTONS 0x0261
+#define GLUT_DEVICE_IGNORE_KEY_REPEAT 0x0262
+#define GLUT_DEVICE_KEY_REPEAT 0x0263
+#define GLUT_HAS_JOYSTICK 0x0264
+#define GLUT_OWNS_JOYSTICK 0x0265
+#define GLUT_JOYSTICK_BUTTONS 0x0266
+#define GLUT_JOYSTICK_AXES 0x0267
+#define GLUT_JOYSTICK_POLL_RATE 0x0268
+
+/*
+ * GLUT API macro definitions -- the glutLayerGet parameters
+ */
+#define GLUT_OVERLAY_POSSIBLE 0x0320
+#define GLUT_LAYER_IN_USE 0x0321
+#define GLUT_HAS_OVERLAY 0x0322
+#define GLUT_TRANSPARENT_INDEX 0x0323
+#define GLUT_NORMAL_DAMAGED 0x0324
+#define GLUT_OVERLAY_DAMAGED 0x0325
+
+/*
+ * GLUT API macro definitions -- the glutVideoResizeGet parameters
+ */
+#define GLUT_VIDEO_RESIZE_POSSIBLE 0x0384
+#define GLUT_VIDEO_RESIZE_IN_USE 0x0385
+#define GLUT_VIDEO_RESIZE_X_DELTA 0x0386
+#define GLUT_VIDEO_RESIZE_Y_DELTA 0x0387
+#define GLUT_VIDEO_RESIZE_WIDTH_DELTA 0x0388
+#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA 0x0389
+#define GLUT_VIDEO_RESIZE_X 0x038A
+#define GLUT_VIDEO_RESIZE_Y 0x038B
+#define GLUT_VIDEO_RESIZE_WIDTH 0x038C
+#define GLUT_VIDEO_RESIZE_HEIGHT 0x038D
+
+/*
+ * GLUT API macro definitions -- the glutUseLayer parameters
+ */
+#define GLUT_NORMAL 0x0000
+#define GLUT_OVERLAY 0x0001
+
+/*
+ * GLUT API macro definitions -- the glutGetModifiers parameters
+ */
+#define GLUT_ACTIVE_SHIFT 0x0001
+#define GLUT_ACTIVE_CTRL 0x0004
+#define GLUT_ACTIVE_ALT 0x0008
+
+/*
+ * GLUT API macro definitions -- the glutSetCursor parameters
+ */
+#define GLUT_CURSOR_RIGHT_ARROW 0x0000
+#define GLUT_CURSOR_LEFT_ARROW 0x0001
+#define GLUT_CURSOR_INFO 0x0002
+#define GLUT_CURSOR_DESTROY 0x0003
+#define GLUT_CURSOR_HELP 0x0004
+#define GLUT_CURSOR_CYCLE 0x0005
+#define GLUT_CURSOR_SPRAY 0x0006
+#define GLUT_CURSOR_WAIT 0x0007
+#define GLUT_CURSOR_TEXT 0x0008
+#define GLUT_CURSOR_CROSSHAIR 0x0009
+#define GLUT_CURSOR_UP_DOWN 0x000A
+#define GLUT_CURSOR_LEFT_RIGHT 0x000B
+#define GLUT_CURSOR_TOP_SIDE 0x000C
+#define GLUT_CURSOR_BOTTOM_SIDE 0x000D
+#define GLUT_CURSOR_LEFT_SIDE 0x000E
+#define GLUT_CURSOR_RIGHT_SIDE 0x000F
+#define GLUT_CURSOR_TOP_LEFT_CORNER 0x0010
+#define GLUT_CURSOR_TOP_RIGHT_CORNER 0x0011
+#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER 0x0012
+#define GLUT_CURSOR_BOTTOM_LEFT_CORNER 0x0013
+#define GLUT_CURSOR_INHERIT 0x0064
+#define GLUT_CURSOR_NONE 0x0065
+#define GLUT_CURSOR_FULL_CROSSHAIR 0x0066
+
+/*
+ * GLUT API macro definitions -- RGB color component specification definitions
+ */
+#define GLUT_RED 0x0000
+#define GLUT_GREEN 0x0001
+#define GLUT_BLUE 0x0002
+
+/*
+ * GLUT API macro definitions -- additional keyboard and joystick definitions
+ */
+#define GLUT_KEY_REPEAT_OFF 0x0000
+#define GLUT_KEY_REPEAT_ON 0x0001
+#define GLUT_KEY_REPEAT_DEFAULT 0x0002
+
+#define GLUT_JOYSTICK_BUTTON_A 0x0001
+#define GLUT_JOYSTICK_BUTTON_B 0x0002
+#define GLUT_JOYSTICK_BUTTON_C 0x0004
+#define GLUT_JOYSTICK_BUTTON_D 0x0008
+
+/*
+ * GLUT API macro definitions -- game mode definitions
+ */
+#define GLUT_GAME_MODE_ACTIVE 0x0000
+#define GLUT_GAME_MODE_POSSIBLE 0x0001
+#define GLUT_GAME_MODE_WIDTH 0x0002
+#define GLUT_GAME_MODE_HEIGHT 0x0003
+#define GLUT_GAME_MODE_PIXEL_DEPTH 0x0004
+#define GLUT_GAME_MODE_REFRESH_RATE 0x0005
+#define GLUT_GAME_MODE_DISPLAY_CHANGED 0x0006
+
+/*
+ * Initialization functions, see fglut_init.c
+ */
+FGAPI void FGAPIENTRY glutInit( int* pargc, char** argv );
+FGAPI void FGAPIENTRY glutInitWindowPosition( int x, int y );
+FGAPI void FGAPIENTRY glutInitWindowSize( int width, int height );
+FGAPI void FGAPIENTRY glutInitDisplayMode( int displayMode );
+FGAPI void FGAPIENTRY glutInitDisplayString( char* displayMode );
+
+/*
+ * Process loop function, see freeglut_main.c
+ */
+FGAPI void FGAPIENTRY glutMainLoop( void );
+
+/*
+ * Window management functions, see freeglut_window.c
+ */
+FGAPI int FGAPIENTRY glutCreateWindow( const char* title );
+FGAPI int FGAPIENTRY glutCreateSubWindow( int window, int x, int y, int width, int height );
+FGAPI void FGAPIENTRY glutDestroyWindow( int window );
+FGAPI void FGAPIENTRY glutSetWindow( int window );
+FGAPI int FGAPIENTRY glutGetWindow( void );
+FGAPI void FGAPIENTRY glutSetWindowTitle( char* title );
+FGAPI void FGAPIENTRY glutSetIconTitle( char* title );
+FGAPI void FGAPIENTRY glutReshapeWindow( int width, int height );
+FGAPI void FGAPIENTRY glutPositionWindow( int x, int y );
+FGAPI void FGAPIENTRY glutShowWindow( void );
+FGAPI void FGAPIENTRY glutHideWindow( void );
+FGAPI void FGAPIENTRY glutIconifyWindow( void );
+FGAPI void FGAPIENTRY glutPushWindow( void );
+FGAPI void FGAPIENTRY glutPopWindow( void );
+FGAPI void FGAPIENTRY glutFullScreen( void );
+
+/*
+ * Display-connected functions, see freeglut_display.c
+ */
+FGAPI void FGAPIENTRY glutPostWindowRedisplay( int window );
+FGAPI void FGAPIENTRY glutPostRedisplay( void );
+FGAPI void FGAPIENTRY glutSwapBuffers( void );
+
+/*
+ * Mouse cursor functions, see freeglut_cursor.c
+ */
+FGAPI void FGAPIENTRY glutWarpPointer( int x, int y );
+FGAPI void FGAPIENTRY glutSetCursor( int cursor );
+
+/*
+ * Overlay stuff, see freeglut_overlay.c
+ */
+FGAPI void FGAPIENTRY glutEstablishOverlay( void );
+FGAPI void FGAPIENTRY glutRemoveOverlay( void );
+FGAPI void FGAPIENTRY glutUseLayer( GLenum layer );
+FGAPI void FGAPIENTRY glutPostOverlayRedisplay( void );
+FGAPI void FGAPIENTRY glutPostWindowOverlayRedisplay( int window );
+FGAPI void FGAPIENTRY glutShowOverlay( void );
+FGAPI void FGAPIENTRY glutHideOverlay( void );
+
+/*
+ * Menu stuff, see freeglut_menu.c
+ */
+FGAPI int FGAPIENTRY glutCreateMenu( void (* callback)( int menu ) );
+FGAPI void FGAPIENTRY glutDestroyMenu( int menu );
+FGAPI int FGAPIENTRY glutGetMenu( void );
+FGAPI void FGAPIENTRY glutSetMenu( int menu );
+FGAPI void FGAPIENTRY glutAddMenuEntry( const char* label, int value );
+FGAPI void FGAPIENTRY glutAddSubMenu( const char* label, int subMenu );
+FGAPI void FGAPIENTRY glutChangeToMenuEntry( int item, const char* label, int value );
+FGAPI void FGAPIENTRY glutChangeToSubMenu( int item, const char* label, int value );
+FGAPI void FGAPIENTRY glutRemoveMenuItem( int item );
+FGAPI void FGAPIENTRY glutAttachMenu( int button );
+FGAPI void FGAPIENTRY glutDetachMenu( int button );
+
+/*
+ * Global callback functions, see freeglut_callbacks.c
+ */
+FGAPI void FGAPIENTRY glutTimerFunc( unsigned int time, void (* callback)( int ), int value );
+FGAPI void FGAPIENTRY glutIdleFunc( void (* callback)( void ) );
+
+/*
+ * Window-specific callback functions, see freeglut_callbacks.c
+ */
+FGAPI void FGAPIENTRY glutKeyboardFunc( void (* callback)( unsigned char, int, int ) );
+FGAPI void FGAPIENTRY glutSpecialFunc( void (* callback)( int, int, int ) );
+FGAPI void FGAPIENTRY glutReshapeFunc( void (* callback)( int, int ) );
+FGAPI void FGAPIENTRY glutVisibilityFunc( void (* callback)( int ) );
+FGAPI void FGAPIENTRY glutDisplayFunc( void (* callback)( void ) );
+FGAPI void FGAPIENTRY glutMouseFunc( void (* callback)( int, int, int, int ) );
+FGAPI void FGAPIENTRY glutMotionFunc( void (* callback)( int, int ) );
+FGAPI void FGAPIENTRY glutPassiveMotionFunc( void (* callback)( int, int ) );
+FGAPI void FGAPIENTRY glutEntryFunc( void (* callback)( int ) );
+
+FGAPI void FGAPIENTRY glutKeyboardUpFunc( void (* callback)( unsigned char, int, int ) );
+FGAPI void FGAPIENTRY glutSpecialUpFunc( void (* callback)( int, int, int ) );
+FGAPI void FGAPIENTRY glutJoystickFunc( void (* callback)( unsigned int, int, int, int ), int pollInterval );
+FGAPI void FGAPIENTRY glutMenuStateFunc( void (* callback)( int ) );
+FGAPI void FGAPIENTRY glutMenuStatusFunc( void (* callback)( int, int, int ) );
+FGAPI void FGAPIENTRY glutOverlayDisplayFunc( void (* callback)( void ) );
+FGAPI void FGAPIENTRY glutWindowStatusFunc( void (* callback)( int ) );
+
+FGAPI void FGAPIENTRY glutSpaceballMotionFunc( void (* callback)( int, int, int ) );
+FGAPI void FGAPIENTRY glutSpaceballRotateFunc( void (* callback)( int, int, int ) );
+FGAPI void FGAPIENTRY glutSpaceballButtonFunc( void (* callback)( int, int ) );
+FGAPI void FGAPIENTRY glutBottonBoxFunc( void (* callback)( int, int ) );
+FGAPI void FGAPIENTRY glutDialsFunc( void (* callback)( int, int ) );
+FGAPI void FGAPIENTRY glutTabletMotionFunc( void (* callback)( int, int ) );
+FGAPI void FGAPIENTRY glutTabletButtonFunc( void (* callback)( int, int, int, int ) );
+
+/*
+ * State retrieval functions, see freeglut_state.c
+ */
+FGAPI int FGAPIENTRY glutGet( GLenum query );
+FGAPI int FGAPIENTRY glutDeviceGet( GLenum query );
+FGAPI int FGAPIENTRY glutGetModifiers( void );
+FGAPI int FGAPIENTRY glutLayerGet( GLenum query );
+
+/*
+ * Font stuff, see freeglut_font.c
+ */
+FGAPI void FGAPIENTRY glutBitmapCharacter( void* font, int character );
+FGAPI int FGAPIENTRY glutBitmapWidth( void* font, int character );
+FGAPI void FGAPIENTRY glutStrokeCharacter( void* font, int character );
+FGAPI int FGAPIENTRY glutStrokeWidth( void* font, int character );
+FGAPI int FGAPIENTRY glutBitmapLength( void* font, const char* string );
+FGAPI int FGAPIENTRY glutStrokeLength( void* font, const char* string );
+FGAPI int FGAPIENTRY glutBitmapHeight( void* font );
+FGAPI int FGAPIENTRY glutStrokeHeight( void* font );
+
+/*
+ * Geometry functions, see freeglut_geometry.c
+ */
+FGAPI void FGAPIENTRY glutWireCube( GLdouble size );
+FGAPI void FGAPIENTRY glutSolidCube( GLdouble size );
+FGAPI void FGAPIENTRY glutWireSphere( GLdouble radius, GLint slices, GLint stacks );
+FGAPI void FGAPIENTRY glutSolidSphere( GLdouble radius, GLint slices, GLint stacks );
+FGAPI void FGAPIENTRY glutWireCone( GLdouble base, GLdouble height, GLint slices, GLint stacks );
+FGAPI void FGAPIENTRY glutSolidCone( GLdouble base, GLdouble height, GLint slices, GLint stacks );
+
+FGAPI void FGAPIENTRY glutWireTorus( GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings );
+FGAPI void FGAPIENTRY glutSolidTorus( GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings );
+FGAPI void FGAPIENTRY glutWireDodecahedron( void );
+FGAPI void FGAPIENTRY glutSolidDodecahedron( void );
+FGAPI void FGAPIENTRY glutWireOctahedron( void );
+FGAPI void FGAPIENTRY glutSolidOctahedron( void );
+FGAPI void FGAPIENTRY glutWireTetrahedron( void );
+FGAPI void FGAPIENTRY glutSolidTetrahedron( void );
+FGAPI void FGAPIENTRY glutWireIcosahedron( void );
+FGAPI void FGAPIENTRY glutSolidIcosahedron( void );
+
+/*
+ * Teapot rendering functions, found in freeglut_teapot.c
+ */
+FGAPI void FGAPIENTRY glutWireTeapot( GLdouble size );
+FGAPI void FGAPIENTRY glutSolidTeapot( GLdouble size );
+
+/*
+ * Game mode functions, see freeglut_gamemode.c
+ */
+FGAPI void FGAPIENTRY glutGameModeString( const char* string );
+FGAPI int FGAPIENTRY glutEnterGameMode( void );
+FGAPI void FGAPIENTRY glutLeaveGameMode( void );
+FGAPI int FGAPIENTRY glutGameModeGet( GLenum query );
+
+/*
+ * Video resize functions, see freeglut_videoresize.c
+ */
+FGAPI int FGAPIENTRY glutVideoResizeGet( GLenum query );
+FGAPI void FGAPIENTRY glutSetupVideoResizing( void );
+FGAPI void FGAPIENTRY glutStopVideoResizing( void );
+FGAPI void FGAPIENTRY glutVideoResize( int x, int y, int width, int height );
+FGAPI void FGAPIENTRY glutVideoPan( int x, int y, int width, int height );
+
+/*
+ * Colormap functions, see freeglut_misc.c
+ */
+FGAPI void FGAPIENTRY glutSetColor( int color, GLfloat red, GLfloat green, GLfloat blue );
+FGAPI GLfloat FGAPIENTRY glutGetColor( int color, int component );
+FGAPI void FGAPIENTRY glutCopyColormap( int window );
+
+/*
+ * Misc keyboard and joystick functions, see freeglut_misc.c
+ */
+FGAPI void FGAPIENTRY glutIgnoreKeyRepeat( int ignore );
+FGAPI void FGAPIENTRY glutSetKeyRepeat( int repeatMode );
+FGAPI void FGAPIENTRY glutForceJoystickFunc( void );
+
+/*
+ * Misc functions, see freeglut_misc.c
+ */
+FGAPI int FGAPIENTRY glutExtensionSupported( const char* extension );
+FGAPI void FGAPIENTRY glutReportErrors( void );
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* FREEGLUT_H */
+
+/*** END OF FILE ***/
+
+
+
+
--- /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
+
+/*
+ * Freeglut is meant to be available under all Unix/X11 and Win32 platforms.
+ */
+#if !defined(_WIN32)
+# define TARGET_HOST_UNIX_X11 1
+# define TARGET_HOST_WIN32 0
+#else
+# define TARGET_HOST_UNIX_X11 0
+# define TARGET_HOST_WIN32 1
+#endif
+
+#define FREEGLUT_MAX_MENUS 3
+#define FREEGLUT_DEBUG 1
+
+#if FREEGLUT_DEBUG
+ #undef G_DISABLE_ASSERT
+ #undef G_DISABLE_CHECKS
+#else
+ #define G_DISABLE_ASSERT
+ #define G_DISABLE_CHECKS
+#endif
+
+/*
+ * Somehow all Win32 include headers depend on this one:
+ */
+#if TARGET_HOST_WIN32
+ #include <windows.h>
+ #include <windowsx.h>
+#endif
+
+/*
+ * Those files should be available on every platform. GLib can be
+ * downloaded from ftp.gtk.org. Ports are available for most Unix
+ * systems and Win32 (for both native and posix-emulation modes).
+ */
+#include <GL/gl.h>
+#include <GL/glu.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <glib.h>
+
+/*
+ * The system-dependant include files should go here:
+ */
+#if TARGET_HOST_UNIX_X11
+ #include <GL/glx.h>
+ #include <X11/Xlib.h>
+ #include <X11/Xatom.h>
+ #include <X11/keysym.h>
+
+ /*
+ * This will generate errors, but I don't have any idea how to fix it (will autoconf help?)
+ */
+ #include <X11/extensions/xf86vmode.h>
+#endif
+
+/*
+ * Microsoft VisualC++ 5.0's <math.h> does not define the PI
+ */
+#ifndef M_PI
+# define M_PI 3.14159265358979323846
+#endif
+
+
+/* -- GLOBAL TYPE DEFINITIONS ---------------------------------------------- */
+
+/*
+ * Freeglut callbacks type definitions
+ */
+typedef void (* FGCBdisplay )( void );
+typedef void (* FGCBreshape )( int, int );
+typedef void (* FGCBvisibility )( int );
+typedef void (* FGCBkeyboard )( unsigned char, int, int );
+typedef void (* FGCBspecial )( int, int, int );
+typedef void (* FGCBmouse )( int, int, int, int );
+typedef void (* FGCBmotion )( int, int );
+typedef void (* FGCBpassive )( int, int );
+typedef void (* FGCBentry )( int );
+typedef void (* FGCBwindowStatus )( int );
+typedef void (* FGCBmenuState )( int );
+typedef void (* FGCBmenuStatus )( int, int, 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 (* FGCBspaceRotate )( 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 );
+
+/*
+ * The global callbacks type definitions
+ */
+typedef void (* FGCBidle )( void );
+typedef void (* FGCBtimer )( int );
+
+/*
+ * The callback used when creating/using menus
+ */
+typedef void (* FGCBmenu )( int );
+
+/*
+ * A helper structure holding two ints and a boolean
+ */
+typedef struct tagSFG_XYUse SFG_XYUse;
+struct tagSFG_XYUse
+{
+ gint X, Y; /* The two integers... */
+ gboolean Use; /* ...and a single boolean. */
+};
+
+/*
+ * 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 */
+ guint DisplayMode; /* The display mode for new windows */
+
+ gboolean ForceDirectContext; /* Should we force direct contexts? */
+ gboolean TryDirectContext; /* What about giving a try to? */
+
+ gboolean ForceIconic; /* All new top windows are iconified */
+
+ gboolean GLDebugSwitch; /* OpenGL state debugging switch */
+ gboolean XSyncSwitch; /* X11 sync protocol switch */
+
+ gboolean IgnoreKeyRepeat; /* Whether to ignore key repeat... */
+
+ GTimer* Timer; /* This timer is started on glutInit */
+ GList* Timers; /* The freeglut timer hooks */
+
+ FGCBidle IdleCallback; /* The global idle callback */
+
+ SFG_XYUse GameModeSize; /* The game mode screen's dimensions */
+ gint GameModeDepth; /* The pixel depth for game mode */
+ gint GameModeRefresh; /* The refresh rate for game mode */
+};
+
+/*
+ * The structure used by display initialization in freeglut_init.c
+ */
+typedef struct tagSFG_Display SFG_Display;
+struct tagSFG_Display
+{
+#if TARGET_HOST_UNIX_X11
+ Display* Display; /* The display we are being run in. */
+ gint Screen; /* The screen we are about to use. */
+ Window RootWindow; /* The screen's root window. */
+ gint Connection; /* The display's connection number */
+ Atom DeleteWindow; /* The window deletion atom */
+
+#ifdef X_XF86VidModeGetModeLine
+ XF86VidModeModeLine DisplayMode; /* Current screen's display settings */
+ gint DisplayModeClock; /* The display mode's refresh rate */
+#endif
+
+#elif TARGET_HOST_WIN32
+ HINSTANCE Instance; /* The application's instance */
+ DEVMODE DisplayMode; /* Desktop's display settings */
+
+#endif
+
+ gint ScreenWidth; /* The screen's width in pixels */
+ gint ScreenHeight; /* The screen's height in pixels */
+ gint ScreenWidthMM; /* The screen's width in milimeters */
+ gint 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
+{
+ gint32 ID; /* The timer ID integer */
+ FGCBtimer Callback; /* The timer callback */
+ double TriggerTime; /* The timer trigger time */
+};
+
+/*
+ * A window and it's 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
+{
+#if TARGET_HOST_UNIX_X11
+ Window Handle; /* The window's handle */
+ GLXContext Context; /* The OpenGL context */
+ XVisualInfo* VisualInfo; /* The window's visual information */
+
+#elif TARGET_HOST_WIN32
+ HWND Handle; /* The window's handle */
+ HDC Device; /* The window's device context */
+ HGLRC Context; /* The window's WGL context */
+
+#endif
+};
+
+/*
+ * Window's state description. This structure should be kept portable.
+ */
+typedef struct tagSFG_WindowState SFG_WindowState;
+struct tagSFG_WindowState
+{
+ gint Width; /* Window's width in pixels */
+ gint Height; /* The same about the height */
+
+ gboolean Redisplay; /* Do we have to redisplay? */
+ gboolean Visible; /* Is the window visible now */
+
+ gint Cursor; /* The currently selected cursor */
+ guint32 Modifiers; /* The current ALT/SHIFT/CTRL state */
+
+ double JoystickPollRate; /* The joystick polling rate */
+ double JoystickLastPoll; /* When the last poll has happened */
+
+ gint MouseX, MouseY; /* The most recent mouse position */
+
+ gboolean IsGameMode; /* Is this the game mode window? */
+
+#if TARGET_HOST_WIN32
+ gboolean NeedToResize; /* Do we need to explicitly resize? */
+#endif
+};
+
+/*
+ * The window callbacks the user can supply us with. Should be kept portable.
+ */
+typedef struct tagSFG_WindowCallbacks SFG_WindowCallbacks;
+struct tagSFG_WindowCallbacks
+{
+ /*
+ * Following callbacks are fully supported right now
+ * and are ready to be tested for GLUT conformance:
+ */
+ FGCBdisplay Display;
+ FGCBreshape Reshape;
+ FGCBkeyboard Keyboard;
+ FGCBspecial Special;
+ FGCBmouse Mouse;
+ FGCBmotion Motion;
+ FGCBpassive Passive;
+ FGCBentry Entry;
+ FGCBvisibility Visibility;
+ FGCBwindowStatus WindowStatus;
+
+ /*
+ * Those callbacks are required for the initial version
+ */
+ FGCBmenuState MenuState;
+ FGCBmenuStatus MenuStatus;
+ FGCBselect Select;
+ FGCBjoystick Joystick;
+ FGCBkeyboardUp KeyboardUp;
+ FGCBspecialUp SpecialUp;
+
+ /*
+ * Those callbacks are being ignored for the moment
+ */
+ FGCBoverlayDisplay OverlayDisplay;
+ FGCBspaceMotion SpaceMotion;
+ FGCBspaceRotate SpaceRotation;
+ FGCBspaceButton SpaceButton;
+ FGCBdials Dials;
+ FGCBbuttonBox ButtonBox;
+ FGCBtabletMotion TabletMotion;
+ FGCBtabletButton TabletButton;
+};
+
+/*
+ * This structure describes a menu
+ */
+typedef struct tagSFG_Menu SFG_Menu;
+struct tagSFG_Menu
+{
+ gint ID; /* The global menu ID */
+ GList* Entries; /* The menu entries list */
+ FGCBmenu Callback; /* The menu callback */
+ gboolean IsActive; /* Is the menu selected? */
+ gint Width; /* Menu box width in pixels */
+ gint Height; /* Menu box height in pixels */
+ gint X, Y; /* Menu box raster position */
+};
+
+/*
+ * This is a menu entry
+ */
+typedef struct tagSFG_MenuEntry SFG_MenuEntry;
+struct tagSFG_MenuEntry
+{
+ gint ID; /* The menu entry ID (local) */
+ gint Ordinal; /* The menu's ordinal number */
+ GString* Text; /* The text to be displayed */
+ SFG_Menu* SubMenu; /* Optional sub-menu tree */
+ gboolean IsActive; /* Is the entry highlighted? */
+ gint Width; /* Label's width in pixels */
+};
+
+/*
+ * A window, making part of FreeGLUT windows hierarchy. Should be kept portable.
+ */
+typedef struct tagSFG_Window SFG_Window;
+struct tagSFG_Window
+{
+ gint ID; /* Window's ID number */
+
+ SFG_Context Window; /* Window and OpenGL context */
+ SFG_WindowState State; /* The window state */
+ SFG_WindowCallbacks Callbacks; /* The window callbacks */
+
+ SFG_Menu* Menu[ FREEGLUT_MAX_MENUS ]; /* Menus appended to window */
+ gboolean MenuActive[ FREEGLUT_MAX_MENUS ]; /* The menus activity flags */
+
+ SFG_Window* Parent; /* The parent to this window */
+ GList* Children; /* The subwindows d.l. list */
+};
+
+/*
+ * This holds information about all the windows, menus etc.
+ */
+typedef struct tagSFG_Structure SFG_Structure;
+struct tagSFG_Structure
+{
+ GList* Windows; /* The global windows list */
+ GList* Menus; /* The global menus list */
+
+ SFG_Window* Window; /* The currently active win. */
+ SFG_Menu* Menu; /* Same, but menu... */
+
+ SFG_Window* GameMode; /* The game mode window */
+
+ gint WindowID; /* The new current window ID */
+ gint MenuID; /* The new current menu ID */
+};
+
+/*
+ * This structure is used for the enumeration purposes.
+ * You can easily extend it's functionalities by declaring
+ * a structure containing enumerator's contents and custom
+ * data, then casting it's pointer to (SFG_Enumerator *).
+ */
+typedef struct tagSFG_Enumerator SFG_Enumerator;
+struct tagSFG_Enumerator
+{
+ gboolean found; /* Used to terminate search */
+ gpointer data; /* Custom data pointer */
+};
+
+/*
+ * The bitmap font structure
+ */
+typedef struct tagSFG_Font SFG_Font;
+struct tagSFG_Font
+{
+ gchar* Name; /* The source font name */
+ gint Quantity; /* Number of chars in font */
+ gint Height; /* Height of the characters */
+ const guchar** 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_assert_ready g_assert( fgState.Timer != NULL );
+
+/*
+ * 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 and menu set, respectively:
+ */
+#define freeglut_assert_window g_assert( fgStructure.Window != NULL );
+#define freeglut_assert_menu g_assert( fgStructure.Menu != NULL );
+
+/*
+ * The initialize and deinitialize functions get called on glutInit()
+ * and glutMainLoop() end respectively. They should create/clean up
+ * everything inside of the freeglut
+ */
+void fgInitialize( const gchar* displayName );
+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_UNIX_X11
+XVisualInfo* fgChooseVisual( void );
+#endif
+
+/*
+ * The window procedure for Win32 events handling
+ */
+#if TARGET_HOST_WIN32
+LRESULT CALLBACK fgWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+gboolean fgSetupPixelFormat( SFG_Window* window, gboolean checkOnly );
+#endif
+
+/*
+ * Window creation, opening, closing and destruction.
+ * Defined in freeglut_structure.c, freeglut_window.c.
+ */
+SFG_Window* fgCreateWindow( SFG_Window* parent, const gchar* title, gint x, gint y, gint w, gint h, gboolean gameMode );
+void fgOpenWindow( SFG_Window* window, const gchar* title, gint x, gint y, gint w, gint h, gboolean gameMode );
+void fgCloseWindow( SFG_Window* window );
+void fgDestroyWindow( SFG_Window* window, gboolean needToClose );
+
+/*
+ * 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
+ */
+void fgJoystickInit( gint ident );
+void fgJoystickClose( void );
+void fgJoystickPollWindow( SFG_Window* window );
+
+/*
+ * 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( GFunc enumCallback, SFG_Enumerator* enumerator );
+void fgEnumSubWindows( SFG_Window* window, GFunc enumCallback, SFG_Enumerator* enumerator );
+
+/*
+ * fgWindowByHandle returns a (SFG_Window *) value pointing to the
+ * first window in the queue matching the specified window handle.
+ * The function is defined in freeglut_structure.c file.
+ */
+#if TARGET_HOST_UNIX_X11
+ SFG_Window* fgWindowByHandle( Window hWindow );
+#elif TARGET_HOST_WIN32
+
+ SFG_Window* fgWindowByHandle( HWND hWindow );
+#endif
+
+/*
+ * 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( gint windowID );
+
+/*
+ * Looks up a menu given it's ID. This is easier that fgWindowByXXX
+ * as all menus are placed in a single doubly linked list...
+ */
+SFG_Menu* fgMenuByID( gint menuID );
+
+/*
+ * The menu activation and deactivation the code. This is the meat
+ * of the menu user interface handling code...
+ */
+void fgActivateMenu( gint button );
+void fgDeactivateMenu( gint button );
+
+/*
+ * 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 );
+
+/*
+ * Display the mouse cursor using OpenGL calls. The function
+ * is defined in freeglut_cursor.c file.
+ */
+void fgDisplayCursor( void );
+
+#endif /* FREEGLUT_INTERNAL_H */
+
+/*** END OF FILE ***/
+
+
+
+
--- /dev/null
+# Generated automatically from Makefile.in by configure.
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = /bin/sh
+
+srcdir = .
+top_srcdir = ..
+prefix = /usr/local
+exec_prefix = ${prefix}
+
+bindir = ${exec_prefix}/bin
+sbindir = ${exec_prefix}/sbin
+libexecdir = ${exec_prefix}/libexec
+datadir = ${prefix}/share
+sysconfdir = ${prefix}/etc
+sharedstatedir = ${prefix}/com
+localstatedir = ${prefix}/var
+libdir = ${exec_prefix}/lib
+infodir = ${prefix}/info
+mandir = ${prefix}/man
+includedir = ${prefix}/include
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/freeglut
+pkglibdir = $(libdir)/freeglut
+pkgincludedir = $(includedir)/freeglut
+
+top_builddir = ..
+
+ACLOCAL = aclocal
+AUTOCONF = autoconf
+AUTOMAKE = automake
+AUTOHEADER = autoheader
+
+INSTALL = /usr/bin/ginstall -c
+INSTALL_PROGRAM = ${INSTALL} $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+transform = s,x,x,
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = i686-suse-linux
+host_triplet = i686-suse-linux-gnu
+AS = @AS@
+CC = gcc
+DLLTOOL = @DLLTOOL@
+EXEEXT =
+LIBM = -lm
+LIBTOOL = $(SHELL) $(top_builddir)/libtool
+LIBTOOL_DEPS = ./ltconfig ./ltmain.sh
+LN_S = ln -s
+MAKEINFO = makeinfo
+OBJDUMP = @OBJDUMP@
+PACKAGE = freeglut
+RANLIB = ranlib
+VERSION = 0.1
+
+SUBDIRS = GL
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu include/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+ rev="$$subdir $$rev"; \
+ test "$$subdir" = "." && dot_seen=yes; \
+ done; \
+ test "$$dot_seen" = "no" && rev=". $$rev"; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = include
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu include/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+ for subdir in $(SUBDIRS); do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ chmod 777 $(distdir)/$$subdir; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
+ || exit 1; \
+ fi; \
+ done
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am:
+uninstall: uninstall-recursive
+all-am: Makefile
+all-redirect: all-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am: clean-tags clean-generic mostlyclean-am
+
+clean: clean-recursive
+
+distclean-am: distclean-tags distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-recursive
+
+maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \
+ distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+
+.PHONY: install-data-recursive uninstall-data-recursive \
+install-exec-recursive uninstall-exec-recursive installdirs-recursive \
+uninstalldirs-recursive all-recursive check-recursive \
+installcheck-recursive info-recursive dvi-recursive \
+mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs-am \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = GL
--- /dev/null
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+DLLTOOL = @DLLTOOL@
+EXEEXT = @EXEEXT@
+LIBM = @LIBM@
+LIBTOOL = @LIBTOOL@
+LIBTOOL_DEPS = @LIBTOOL_DEPS@
+LN_S = @LN_S@
+MAKEINFO = @MAKEINFO@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+VERSION = @VERSION@
+
+SUBDIRS = GL
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu include/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+@SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+ rev="$$subdir $$rev"; \
+ test "$$subdir" = "." && dot_seen=yes; \
+ done; \
+ test "$$dot_seen" = "no" && rev=". $$rev"; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = include
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu include/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+ for subdir in $(SUBDIRS); do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ chmod 777 $(distdir)/$$subdir; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
+ || exit 1; \
+ fi; \
+ done
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am:
+uninstall: uninstall-recursive
+all-am: Makefile
+all-redirect: all-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am: clean-tags clean-generic mostlyclean-am
+
+clean: clean-recursive
+
+distclean-am: distclean-tags distclean-generic clean-am
+ -rm -f libtool
+
+distclean: distclean-recursive
+
+maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \
+ distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+
+.PHONY: install-data-recursive uninstall-data-recursive \
+install-exec-recursive uninstall-exec-recursive installdirs-recursive \
+uninstalldirs-recursive all-recursive check-recursive \
+installcheck-recursive info-recursive dvi-recursive \
+mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs-am \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# 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, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
--- /dev/null
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id$
+
+errstatus=0
+
+for file
+do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d
+ do
+ pathcomp="$pathcomp$d"
+ case "$pathcomp" in
+ -* ) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp" 1>&2
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ fi
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
--- /dev/null
+one.o: one.c ../config.h /usr/include/stdio.h /usr/include/features.h \
+ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \
+ /usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/stddef.h \
+ /usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/stdarg.h \
+ /usr/include/bits/types.h /usr/include/libio.h \
+ /usr/include/_G_config.h /usr/include/bits/stdio_lim.h \
+ /usr/include/bits/stdio.h /usr/include/stdlib.h \
+ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \
+ /usr/include/bits/endian.h /usr/include/sys/select.h \
+ /usr/include/bits/select.h /usr/include/bits/sigset.h \
+ /usr/include/sys/sysmacros.h /usr/include/alloca.h \
+ ../include/GL/freeglut.h /usr/include/GL/gl.h /usr/include/GL/glext.h \
+ /usr/include/GL/glu.h
+one.c :
+../config.h :
+/usr/include/stdio.h :
+/usr/include/features.h :
+/usr/include/sys/cdefs.h :
+/usr/include/gnu/stubs.h :
+/usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/stddef.h :
+/usr/lib/gcc-lib/i486-suse-linux/2.95.2/include/stdarg.h :
+/usr/include/bits/types.h :
+/usr/include/libio.h :
+/usr/include/_G_config.h :
+/usr/include/bits/stdio_lim.h :
+/usr/include/bits/stdio.h :
+/usr/include/stdlib.h :
+/usr/include/sys/types.h :
+/usr/include/time.h :
+/usr/include/endian.h :
+/usr/include/bits/endian.h :
+/usr/include/sys/select.h :
+/usr/include/bits/select.h :
+/usr/include/bits/sigset.h :
+/usr/include/sys/sysmacros.h :
+/usr/include/alloca.h :
+../include/GL/freeglut.h :
+/usr/include/GL/gl.h :
+/usr/include/GL/glext.h :
+/usr/include/GL/glu.h :
--- /dev/null
+# Generated automatically from Makefile.in by configure.
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = /bin/sh
+
+srcdir = .
+top_srcdir = ..
+prefix = /usr/local
+exec_prefix = ${prefix}
+
+bindir = ${exec_prefix}/bin
+sbindir = ${exec_prefix}/sbin
+libexecdir = ${exec_prefix}/libexec
+datadir = ${prefix}/share
+sysconfdir = ${prefix}/etc
+sharedstatedir = ${prefix}/com
+localstatedir = ${prefix}/var
+libdir = ${exec_prefix}/lib
+infodir = ${prefix}/info
+mandir = ${prefix}/man
+includedir = ${prefix}/include
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/freeglut
+pkglibdir = $(libdir)/freeglut
+pkgincludedir = $(includedir)/freeglut
+
+top_builddir = ..
+
+ACLOCAL = aclocal
+AUTOCONF = autoconf
+AUTOMAKE = automake
+AUTOHEADER = autoheader
+
+INSTALL = /usr/bin/ginstall -c
+INSTALL_PROGRAM = ${INSTALL} $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+transform = s,x,x,
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = i686-suse-linux
+host_triplet = i686-suse-linux-gnu
+AS = @AS@
+CC = gcc
+DLLTOOL = @DLLTOOL@
+EXEEXT =
+LIBM = -lm
+LIBTOOL = $(SHELL) $(top_builddir)/libtool
+LIBTOOL_DEPS = ./ltconfig ./ltmain.sh
+LN_S = ln -s
+MAKEINFO = makeinfo
+OBJDUMP = @OBJDUMP@
+PACKAGE = freeglut
+RANLIB = ranlib
+VERSION = 0.1
+
+bin_PROGRAMS = one
+one_SOURCES = one.c
+one_LDFLAGS = -export-dynamic -dlpreopen ../freeglut-1.3/libfreeglut-1.3.la
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+bin_PROGRAMS = one$(EXEEXT)
+PROGRAMS = $(bin_PROGRAMS)
+
+
+DEFS = -DHAVE_CONFIG_H -I. -I$(srcdir) -I..
+CPPFLAGS =
+LDFLAGS =
+LIBS =
+one_OBJECTS = one.o
+one_LDADD = $(LDADD)
+one_DEPENDENCIES =
+CFLAGS = -g -O2
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+DEP_FILES = .deps/one.P
+SOURCES = $(one_SOURCES)
+OBJECTS = $(one_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .lo .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-binPROGRAMS:
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+distclean-binPROGRAMS:
+
+maintainer-clean-binPROGRAMS:
+
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ if test -f $$p; then \
+ echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+ $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ list='$(bin_PROGRAMS)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ done
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.s.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+one$(EXEEXT): $(one_OBJECTS) $(one_DEPENDENCIES)
+ @rm -f one$(EXEEXT)
+ $(LINK) $(one_LDFLAGS) $(one_OBJECTS) $(one_LDADD) $(LIBS)
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = tests
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu tests/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+ -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+ @echo '$(COMPILE) -c $<'; \
+ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.c
+ @echo '$(LTCOMPILE) -c $<'; \
+ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-binPROGRAMS
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-binPROGRAMS
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \
+ mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-binPROGRAMS clean-compile clean-libtool clean-tags \
+ clean-depend clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-binPROGRAMS distclean-compile distclean-libtool \
+ distclean-tags distclean-depend distclean-generic \
+ clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-binPROGRAMS \
+ maintainer-clean-compile maintainer-clean-libtool \
+ maintainer-clean-tags maintainer-clean-depend \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
+maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir \
+mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+## Process this file with automake to produce Makefile.im
+
+bin_PROGRAMS = one
+one_SOURCES = one.c
+one_LDFLAGS = -export-dynamic -dlpreopen ../freeglut-1.3/libfreeglut-1.3.la
+
--- /dev/null
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+host_alias = @host_alias@
+host_triplet = @host@
+AS = @AS@
+CC = @CC@
+DLLTOOL = @DLLTOOL@
+EXEEXT = @EXEEXT@
+LIBM = @LIBM@
+LIBTOOL = @LIBTOOL@
+LIBTOOL_DEPS = @LIBTOOL_DEPS@
+LN_S = @LN_S@
+MAKEINFO = @MAKEINFO@
+OBJDUMP = @OBJDUMP@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+VERSION = @VERSION@
+
+bin_PROGRAMS = one
+one_SOURCES = one.c
+one_LDFLAGS = -export-dynamic -dlpreopen ../freeglut-1.3/libfreeglut-1.3.la
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+bin_PROGRAMS = one$(EXEEXT)
+PROGRAMS = $(bin_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+one_OBJECTS = one.o
+one_LDADD = $(LDADD)
+one_DEPENDENCIES =
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+DEP_FILES = .deps/one.P
+SOURCES = $(one_SOURCES)
+OBJECTS = $(one_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .lo .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-binPROGRAMS:
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+distclean-binPROGRAMS:
+
+maintainer-clean-binPROGRAMS:
+
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ if test -f $$p; then \
+ echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+ $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ list='$(bin_PROGRAMS)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ done
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+.s.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+.S.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) -c $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+
+maintainer-clean-libtool:
+
+one$(EXEEXT): $(one_OBJECTS) $(one_DEPENDENCIES)
+ @rm -f one$(EXEEXT)
+ $(LINK) $(one_LDFLAGS) $(one_OBJECTS) $(one_LDADD) $(LIBS)
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = tests
+
+distdir: $(DISTFILES)
+ here=`cd $(top_builddir) && pwd`; \
+ top_distdir=`cd $(top_distdir) && pwd`; \
+ distdir=`cd $(distdir) && pwd`; \
+ cd $(top_srcdir) \
+ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu tests/Makefile
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+ -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+ @echo '$(COMPILE) -c $<'; \
+ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-cp .deps/$(*F).pp .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm .deps/$(*F).pp
+
+%.lo: %.c
+ @echo '$(LTCOMPILE) -c $<'; \
+ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
+ < .deps/$(*F).pp > .deps/$(*F).P; \
+ tr ' ' '\012' < .deps/$(*F).pp \
+ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+ >> .deps/$(*F).P; \
+ rm -f .deps/$(*F).pp
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-binPROGRAMS
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-binPROGRAMS
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \
+ mostlyclean-libtool mostlyclean-tags mostlyclean-depend \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-binPROGRAMS clean-compile clean-libtool clean-tags \
+ clean-depend clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-binPROGRAMS distclean-compile distclean-libtool \
+ distclean-tags distclean-depend distclean-generic \
+ clean-am
+ -rm -f libtool
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-binPROGRAMS \
+ maintainer-clean-compile maintainer-clean-libtool \
+ maintainer-clean-tags maintainer-clean-depend \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
+maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-libtool distclean-libtool \
+clean-libtool maintainer-clean-libtool tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir \
+mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
--- /dev/null
+/*
+ * one.c
+ *
+ * Hey! This was the original file where freeglut development started. Just
+ * note what I have written here at the time. And see the creation date :)
+ *
+ * : This is a wrapper. I still have to figure out
+ * : how to build shared libraries under *nix :)
+ *
+ * Copyright (c) 1999 by Pawel W. Olszta
+ * Written by Pawel W. Olszta, <olszta@sourceforge.net>
+ * Creation date: czw gru 2 11:58:41 CET 1999
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "../include/GL/freeglut.h"
+
+int g_LeaveGameMode = 0;
+int g_InGameMode = 1;
+
+/*
+ * Call this function to have some text drawn at given coordinates
+ */
+void PrintText( int nX, int nY, char* pszText )
+{
+ int lines;
+ char *p;
+
+ /*
+ * Prepare the OpenGL state
+ */
+ glDisable( GL_DEPTH_TEST );
+ glMatrixMode( GL_PROJECTION );
+ glPushMatrix();
+ glLoadIdentity();
+
+ /*
+ * Have an orthogonal projection matrix set
+ */
+ glOrtho( 0, glutGet( GLUT_WINDOW_WIDTH ),
+ 0, glutGet( GLUT_WINDOW_HEIGHT ),
+ -1, +1
+ );
+
+ /*
+ * Now the matrix mode
+ */
+ glMatrixMode( GL_MODELVIEW );
+ glPushMatrix();
+ glLoadIdentity();
+
+ /*
+ * Now the main text
+ */
+ glColor3ub( 0, 0, 0 );
+ glRasterPos2i( nX, nY );
+
+ for( p=pszText, lines=0; *p; p++ )
+ {
+ if( *p == '\n' )
+ {
+ lines++;
+ glRasterPos2i( nX, nY-(lines*18) );
+ }
+
+ glutBitmapCharacter( GLUT_BITMAP_HELVETICA_18, *p );
+ }
+
+ /*
+ * Revert to the old matrix modes
+ */
+ glMatrixMode( GL_PROJECTION );
+ glPopMatrix();
+
+ glMatrixMode( GL_MODELVIEW );
+ glPopMatrix();
+
+ /*
+ * Restore the old OpenGL states
+ */
+ glColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
+ glEnable( GL_DEPTH_TEST );
+}
+
+/*
+ * This is the display routine for our sample FreeGLUT windows
+ */
+static float g_fTime = 0.0f;
+
+void SampleDisplay( void )
+{
+ /*
+ * Clear the screen
+ */
+ glClearColor( 0, 0.5, 1, 1 );
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ /*
+ * Have the cube rotated
+ */
+ glMatrixMode( GL_MODELVIEW );
+ glPushMatrix();
+
+ glRotatef( g_fTime, 0, 0, 1 );
+ glRotatef( g_fTime, 0, 1, 0 );
+ glRotatef( g_fTime, 1, 0, 0 );
+
+ /*
+ * And then drawn...
+ */
+ glColor3f( 1, 1, 0 );
+ //glutWireCube( 20.0 );
+ glutWireTeapot( 20.0 );
+ //glutWireSpher( 15.0, 15, 15 );
+ //glColor3f( 0, 1, 0 );
+ //glutWireCube( 30.0 );
+ //glutSolidCone( 10, 20, 10, 2 );
+
+ /*
+ * Don't forget about the model-view matrix
+ */
+ glPopMatrix();
+
+ /*
+ * Draw a silly text
+ */
+ if( g_InGameMode == 0 )
+ PrintText( 20, 20, "Hello there cruel world!" );
+ else
+ PrintText( 20, 20, "Press ESC to leave the game mode!" );
+
+ /*
+ * And swap this context's buffers
+ */
+ glutSwapBuffers();
+}
+
+/*
+ * This is a sample idle function
+ */
+void SampleIdle( void )
+{
+ g_fTime += 0.5f;
+
+ if( g_LeaveGameMode == 1 )
+ {
+ glutLeaveGameMode();
+ g_LeaveGameMode = 0;
+ g_InGameMode = 0;
+ }
+}
+
+/*
+ * The reshape function
+ */
+void SampleReshape( int nWidth, int nHeight )
+{
+ GLfloat fAspect = (GLfloat) nHeight / (GLfloat) nWidth;
+ GLfloat fPos[ 4 ] = { 0.0f, 0.0f, 10.0f, 0.0f };
+ GLfloat fCol[ 4 ] = { 0.5f, 1.0f, 0.0f, 1.0f };
+
+ /*
+ * Update the viewport first
+ */
+ glViewport( 0, 0, nWidth, nHeight );
+
+ /*
+ * Then the projection matrix
+ */
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glFrustum( -1.0, 1.0, -fAspect, fAspect, 1.0, 80.0 );
+
+ /*
+ * Move back the camera a bit
+ */
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -40.0f );
+
+ /*
+ * Enable some features...
+ */
+ glEnable( GL_CULL_FACE );
+ glEnable( GL_DEPTH_TEST );
+ glEnable( GL_NORMALIZE );
+
+ /*
+ * Set up some lighting
+ */
+ glLightfv( GL_LIGHT0, GL_POSITION, fPos );
+ glEnable( GL_LIGHTING );
+ glEnable( GL_LIGHT0 );
+
+ /*
+ * Set up a sample material
+ */
+ glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, fCol );
+}
+
+/*
+ * A sample keyboard callback
+ */
+void SampleKeyboard( unsigned char cChar, int nMouseX, int nMouseY )
+{
+ printf( "SampleKeyboard(): keypress '%c' at (%i,%i)\n", cChar, nMouseX, nMouseY );
+}
+
+/*
+ * A sample keyboard callback (for game mode window)
+ */
+void SampleGameModeKeyboard( unsigned char cChar, int nMouseX, int nMouseY )
+{
+ if( cChar == 27 )
+ g_LeaveGameMode = 1;
+}
+
+
+/*
+ * A sample special callback
+ */
+void SampleSpecial( int nSpecial, int nMouseX, int nMouseY )
+{
+ printf( "SampleSpecial(): special keypress %i at (%i,%i)\n", nSpecial, nMouseX, nMouseY );
+}
+
+/*
+ * A sample menu callback
+ */
+void SampleMenu( int menuID )
+{
+ /*
+ * Just print something funny
+ */
+ printf( "SampleMenu() callback executed, menuID is %i\n", menuID );
+}
+
+/*
+ * The sample's entry point
+ */
+int main( int argc, char** argv )
+{
+ int menuID, subMenuA, subMenuB;
+
+ glutInit( &argc, argv );
+
+ glutInitDisplayString( "stencil~2 rgb double depth>=16 samples" );
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
+ glutInitWindowPosition( 100, 100 );
+
+ subMenuA = glutCreateMenu( SampleMenu );
+ glutAddMenuEntry( "Sub menu A1 (01)", 1 );
+ glutAddMenuEntry( "Sub menu A2 (02)", 2 );
+ glutAddMenuEntry( "Sub menu A3 (03)", 3 );
+
+ subMenuB = glutCreateMenu( SampleMenu );
+ glutAddMenuEntry( "Sub menu B1 (04)", 4 );
+ glutAddMenuEntry( "Sub menu B2 (05)", 5 );
+ glutAddMenuEntry( "Sub menu B3 (06)", 6 );
+ glutAddSubMenu( "Going to sub menu A", subMenuA );
+
+ menuID = glutCreateMenu( SampleMenu );
+ glutAddMenuEntry( "Entry one", 1 );
+ glutAddMenuEntry( "Entry two", 2 );
+ glutAddMenuEntry( "Entry three", 3 );
+ glutAddMenuEntry( "Entry four", 4 );
+ glutAddMenuEntry( "Entry five", 5 );
+ glutAddSubMenu( "Enter sub menu A", subMenuA );
+ glutAddSubMenu( "Enter sub menu B", subMenuB );
+
+ glutCreateWindow( "Hello world!" );
+ glutDisplayFunc( SampleDisplay );
+ glutReshapeFunc( SampleReshape );
+ glutKeyboardFunc( SampleKeyboard );
+ glutSpecialFunc( SampleSpecial );
+ glutIdleFunc( SampleIdle );
+ glutAttachMenu( GLUT_LEFT_BUTTON );
+
+ glutInitWindowPosition( 200, 200 );
+ glutCreateWindow( "I am not Jan B." );
+ glutDisplayFunc( SampleDisplay );
+ glutReshapeFunc( SampleReshape );
+ glutKeyboardFunc( SampleKeyboard );
+ glutSpecialFunc( SampleSpecial );
+ glutIdleFunc( SampleIdle );
+ glutAttachMenu( GLUT_LEFT_BUTTON );
+
+ printf( "Testing game mode string parsing, don't panic!\n" );
+ glutGameModeString( "320x240:32@100" );
+ glutGameModeString( "640x480:16@72" );
+ glutGameModeString( "1024x768" );
+ glutGameModeString( ":32@120" );
+ glutGameModeString( "Toudi glupcze, Danwin bedzie moj!" );
+ glutGameModeString( "640x480:16@72" );
+
+ glutEnterGameMode();
+ glutDisplayFunc( SampleDisplay );
+ glutReshapeFunc( SampleReshape );
+ glutKeyboardFunc( SampleGameModeKeyboard );
+ glutIdleFunc( SampleIdle );
+ glutAttachMenu( GLUT_LEFT_BUTTON );
+
+ printf( "current window is %ix%i+%i+%i",
+ glutGet( GLUT_WINDOW_X ), glutGet( GLUT_WINDOW_Y ),
+ glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT )
+ );
+
+ /*
+ * Enter the main FreeGLUT processing loop
+ */
+ glutMainLoop();
+
+ printf( "glutMainLoop() termination works fine!\n" );
+
+ /*
+ * This is never reached in FreeGLUT. Is that good?
+ */
+ return( EXIT_SUCCESS );
+}
+
+/*** END OF FILE ***/