From c90e3f21e02020232054f78029ef9071c7359cfb Mon Sep 17 00:00:00 2001 From: Steve Baker Date: Fri, 27 Jul 2001 04:35:54 +0000 Subject: [PATCH 1/1] Initial revision git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@3 7f0cb862-5218-0410-a997-914c9d46530a --- AUTHORS | 13 + COPYING | 27 + INSTALL | 167 +++ Makefile.am | 7 + NEWS | 11 + README | 80 ++ TODO | 3 + acconfig.h | 9 + aclocal.m4 | 536 +++++++ configure | 2375 ++++++++++++++++++++++++++++++++ configure.in | 29 + freeglut-1.3/Makefile.am | 39 + freeglut-1.3/freeglut_callbacks.c | 310 +++++ freeglut-1.3/freeglut_cursor.c | 182 +++ freeglut-1.3/freeglut_display.c | 121 ++ freeglut-1.3/freeglut_font.c | 263 ++++ freeglut-1.3/freeglut_font_data.c | 747 ++++++++++ freeglut-1.3/freeglut_gamemode.c | 511 +++++++ freeglut-1.3/freeglut_geometry.c | 540 ++++++++ freeglut-1.3/freeglut_init.c | 925 +++++++++++++ freeglut-1.3/freeglut_joystick.c | 603 ++++++++ freeglut-1.3/freeglut_main.c | 1294 +++++++++++++++++ freeglut-1.3/freeglut_menu.c | 808 +++++++++++ freeglut-1.3/freeglut_misc.c | 265 ++++ freeglut-1.3/freeglut_overlay.c | 51 + freeglut-1.3/freeglut_state.c | 618 +++++++++ freeglut-1.3/freeglut_structure.c | 643 +++++++++ freeglut-1.3/freeglut_teapot.c | 248 ++++ freeglut-1.3/freeglut_videoresize.c | 56 + freeglut-1.3/freeglut_window.c | 1099 +++++++++++++++ freeglut-1.3/templates/cpp_template | 17 + freeglut-1.3/templates/header_template | 17 + freeglut.dsw | 29 + freeglut.kdevprj | 176 +++ freeglut.lsm | 14 + freeglut13.dsp | 178 +++ freeglut13.plg | 49 + genfonts/.deps/genfonts.P | 64 + genfonts/.deps/genstroke.P | 57 + genfonts/Makefile | 352 +++++ genfonts/Makefile.am | 8 + genfonts/Makefile.in | 352 +++++ genfonts/Roman.src | 603 ++++++++ genfonts/Roman_M.src | 503 +++++++ genfonts/genfonts.c | 473 +++++++ genfonts/genstroke.c | 206 +++ include/GL/Makefile | 233 ++++ include/GL/Makefile.am | 7 + include/GL/Makefile.in | 233 ++++ include/GL/freeglut.h | 526 +++++++ include/GL/freeglut_internal.h | 562 ++++++++ include/Makefile | 288 ++++ include/Makefile.am | 3 + include/Makefile.in | 288 ++++ install-sh | 250 ++++ mkinstalldirs | 40 + stamp-h | 1 + stamp-h.in | 1 + tests/.deps/one.P | 40 + tests/Makefile | 342 +++++ tests/Makefile.am | 6 + tests/Makefile.in | 342 +++++ tests/one.c | 327 +++++ 63 files changed, 19167 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 NEWS create mode 100644 README create mode 100644 TODO create mode 100644 acconfig.h create mode 100644 aclocal.m4 create mode 100755 configure create mode 100644 configure.in create mode 100644 freeglut-1.3/Makefile.am create mode 100644 freeglut-1.3/freeglut_callbacks.c create mode 100644 freeglut-1.3/freeglut_cursor.c create mode 100644 freeglut-1.3/freeglut_display.c create mode 100644 freeglut-1.3/freeglut_font.c create mode 100644 freeglut-1.3/freeglut_font_data.c create mode 100644 freeglut-1.3/freeglut_gamemode.c create mode 100644 freeglut-1.3/freeglut_geometry.c create mode 100644 freeglut-1.3/freeglut_init.c create mode 100644 freeglut-1.3/freeglut_joystick.c create mode 100644 freeglut-1.3/freeglut_main.c create mode 100644 freeglut-1.3/freeglut_menu.c create mode 100644 freeglut-1.3/freeglut_misc.c create mode 100644 freeglut-1.3/freeglut_overlay.c create mode 100644 freeglut-1.3/freeglut_state.c create mode 100644 freeglut-1.3/freeglut_structure.c create mode 100644 freeglut-1.3/freeglut_teapot.c create mode 100644 freeglut-1.3/freeglut_videoresize.c create mode 100644 freeglut-1.3/freeglut_window.c create mode 100644 freeglut-1.3/templates/cpp_template create mode 100644 freeglut-1.3/templates/header_template create mode 100755 freeglut.dsw create mode 100644 freeglut.kdevprj create mode 100644 freeglut.lsm create mode 100755 freeglut13.dsp create mode 100755 freeglut13.plg create mode 100644 genfonts/.deps/genfonts.P create mode 100644 genfonts/.deps/genstroke.P create mode 100644 genfonts/Makefile create mode 100644 genfonts/Makefile.am create mode 100644 genfonts/Makefile.in create mode 100644 genfonts/Roman.src create mode 100644 genfonts/Roman_M.src create mode 100644 genfonts/genfonts.c create mode 100644 genfonts/genstroke.c create mode 100644 include/GL/Makefile create mode 100644 include/GL/Makefile.am create mode 100644 include/GL/Makefile.in create mode 100644 include/GL/freeglut.h create mode 100644 include/GL/freeglut_internal.h create mode 100644 include/Makefile create mode 100644 include/Makefile.am create mode 100644 include/Makefile.in create mode 100755 install-sh create mode 100755 mkinstalldirs create mode 100644 stamp-h create mode 100644 stamp-h.in create mode 100644 tests/.deps/one.P create mode 100644 tests/Makefile create mode 100644 tests/Makefile.am create mode 100644 tests/Makefile.in create mode 100644 tests/one.c diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..8ec7c08 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,13 @@ + +Pawel W. Olszta + the person to be blamed for freeglut + +Andreas Umbach + the first person to contribute to the freeglut project, + contributed the cube and sphere geometry code + +Steve Baker + 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 :) diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..fc36ad9 --- /dev/null +++ b/COPYING @@ -0,0 +1,27 @@ + + 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. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..e69de29 diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..02a4a07 --- /dev/null +++ b/INSTALL @@ -0,0 +1,167 @@ +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. + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..2c25549 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,7 @@ +## 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 diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..a6054fd --- /dev/null +++ b/NEWS @@ -0,0 +1,11 @@ + +Jan 16th 2000: + + First really functional release of freeglut. + + +Jan 13th 2001: + + Steve Baker takes over as maintainer of freeglut. + + diff --git a/README b/README new file mode 100644 index 0000000..268201e --- /dev/null +++ b/README @@ -0,0 +1,80 @@ + + 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, + + + 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 + http://plib.sourceforge.net + + diff --git a/TODO b/TODO new file mode 100644 index 0000000..78c15b4 --- /dev/null +++ b/TODO @@ -0,0 +1,3 @@ + + The up-to-date TODO list can be found under following URL: + http://freeglut.sourceforge.net/progress.html diff --git a/acconfig.h b/acconfig.h new file mode 100644 index 0000000..0a38b07 --- /dev/null +++ b/acconfig.h @@ -0,0 +1,9 @@ +/* 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 diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..228d0f5 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,536 @@ +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>>, <<[^ ]>>, <<>>), <<>>, +<>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, +<>; 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 &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 + diff --git a/configure b/configure new file mode 100755 index 0000000..138edc4 --- /dev/null +++ b/configure @@ -0,0 +1,2375 @@ +#! /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 <> confdefs.h <&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 <&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 <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 <&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 <&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 &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 <&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 < +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 < +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 < +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 < +#include +#include +#include +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 +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 +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 < +#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 +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 <&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 <&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 <&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 <&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 </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 < 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 <> $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 <> $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 <> $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 <> $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 + diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..a899288 --- /dev/null +++ b/configure.in @@ -0,0 +1,29 @@ +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 ) diff --git a/freeglut-1.3/Makefile.am b/freeglut-1.3/Makefile.am new file mode 100644 index 0000000..afab6e1 --- /dev/null +++ b/freeglut-1.3/Makefile.am @@ -0,0 +1,39 @@ +## 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 +# diff --git a/freeglut-1.3/freeglut_callbacks.c b/freeglut-1.3/freeglut_callbacks.c new file mode 100644 index 0000000..f61bfb8 --- /dev/null +++ b/freeglut-1.3/freeglut_callbacks.c @@ -0,0 +1,310 @@ +/* + * freeglut_callbacks.c + * + * The callbacks setting methods. + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * 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 ***/ diff --git a/freeglut-1.3/freeglut_cursor.c b/freeglut-1.3/freeglut_cursor.c new file mode 100644 index 0000000..900e1c9 --- /dev/null +++ b/freeglut-1.3/freeglut_cursor.c @@ -0,0 +1,182 @@ +/* + * freeglut_cursor.c + * + * The mouse cursor related stuff. + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * 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 +#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 ***/ diff --git a/freeglut-1.3/freeglut_display.c b/freeglut-1.3/freeglut_display.c new file mode 100644 index 0000000..0b1f672 --- /dev/null +++ b/freeglut-1.3/freeglut_display.c @@ -0,0 +1,121 @@ +/* + * freeglut_display.c + * + * Display message posting, context buffer swapping. + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * 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 ***/ diff --git a/freeglut-1.3/freeglut_font.c b/freeglut-1.3/freeglut_font.c new file mode 100644 index 0000000..26f7d63 --- /dev/null +++ b/freeglut-1.3/freeglut_font.c @@ -0,0 +1,263 @@ +/* + * freeglut_font.c + * + * Bitmap and stroke fonts displaying. + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * 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 ***/ diff --git a/freeglut-1.3/freeglut_font_data.c b/freeglut-1.3/freeglut_font_data.c new file mode 100644 index 0000000..2796db8 --- /dev/null +++ b/freeglut-1.3/freeglut_font_data.c @@ -0,0 +1,747 @@ +/* + * 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, + * + * 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 ***/ + diff --git a/freeglut-1.3/freeglut_gamemode.c b/freeglut-1.3/freeglut_gamemode.c new file mode 100644 index 0000000..297f80c --- /dev/null +++ b/freeglut-1.3/freeglut_gamemode.c @@ -0,0 +1,511 @@ +/* + * freeglut_gamemode.c + * + * The game mode handling code. + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * 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; ihdisplay == 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; ihdisplay, 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 ***/ + + + + diff --git a/freeglut-1.3/freeglut_geometry.c b/freeglut-1.3/freeglut_geometry.c new file mode 100644 index 0000000..2819d60 --- /dev/null +++ b/freeglut-1.3/freeglut_geometry.c @@ -0,0 +1,540 @@ +/* + * freeglut_geometry.c + * + * Freeglut geometry rendering methods. + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * 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 + */ +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 + */ +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 + */ +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 + */ +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=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 + * 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 ) + 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= 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 ***/ + + + + + diff --git a/freeglut-1.3/freeglut_joystick.c b/freeglut-1.3/freeglut_joystick.c new file mode 100644 index 0000000..369910c --- /dev/null +++ b/freeglut-1.3/freeglut_joystick.c @@ -0,0 +1,603 @@ +/* + * freeglut_joystick.c + * + * Joystick handling code + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Steve Baker, + * + * 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 + */ + +#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 +# if defined( __CYGWIN32__ ) || defined( __CYGWIN__ ) +# define NEAR /* */ +# define FAR /* */ +# endif +# include +# include +#else +# include +# include +# ifdef __FreeBSD__ +# include +# define JS_DATA_TYPE joystick +# define JS_RETURN (sizeof(struct JS_DATA_TYPE)) +# elif defined(__linux__) +# include +# include +# include + + /* + * 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; inum_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; inum_axes ; i++ ) + axes[ i ] = 0.0f ; + } + + fghJoystickRawRead( joy, buttons, raw_axes ); + + if( axes ) + for( i=0 ; inum_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 ; inum_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 ***/ + + + + diff --git a/freeglut-1.3/freeglut_main.c b/freeglut-1.3/freeglut_main.c new file mode 100644 index 0000000..227a943 --- /dev/null +++ b/freeglut-1.3/freeglut_main.c @@ -0,0 +1,1294 @@ +/* + * freeglut_main.c + * + * The windows message processing methods. + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * 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; idata + ); + } + + /* + * Now feel free to execute all the hooked and timed out timer callbacks + */ + for( i=0; iCallback != NULL ) + timer->Callback( timer->ID ); + } + + /* + * Finally, delete the timed out timers... + */ + for( i=0; idata ); + + /* + * 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 ***/ + + + + + + diff --git a/freeglut-1.3/freeglut_menu.c b/freeglut-1.3/freeglut_menu.c new file mode 100644 index 0000000..58430dc --- /dev/null +++ b/freeglut-1.3/freeglut_menu.c @@ -0,0 +1,808 @@ +/* + * freeglut_menu.c + * + * Pull-down menu creation and handling. + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * 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; jText->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; iMenu[ 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; iMenu[ 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 ***/ diff --git a/freeglut-1.3/freeglut_misc.c b/freeglut-1.3/freeglut_misc.c new file mode 100644 index 0000000..4be9a3b --- /dev/null +++ b/freeglut-1.3/freeglut_misc.c @@ -0,0 +1,265 @@ +/* + * 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, + * 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 ***/ diff --git a/freeglut-1.3/freeglut_overlay.c b/freeglut-1.3/freeglut_overlay.c new file mode 100644 index 0000000..6477744 --- /dev/null +++ b/freeglut-1.3/freeglut_overlay.c @@ -0,0 +1,51 @@ +/* + * 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, + * 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 ***/ diff --git a/freeglut-1.3/freeglut_state.c b/freeglut-1.3/freeglut_state.c new file mode 100644 index 0000000..44347d6 --- /dev/null +++ b/freeglut-1.3/freeglut_state.c @@ -0,0 +1,618 @@ +/* + * freeglut_state.c + * + * Freeglut state query methods. + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * 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 ***/ diff --git a/freeglut-1.3/freeglut_structure.c b/freeglut-1.3/freeglut_structure.c new file mode 100644 index 0000000..af851f1 --- /dev/null +++ b/freeglut-1.3/freeglut_structure.c @@ -0,0 +1,643 @@ +/* + * freeglut_structure.c + * + * Windows and menus need tree structure + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * 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 ***/ + + + + + + + + + diff --git a/freeglut-1.3/freeglut_teapot.c b/freeglut-1.3/freeglut_teapot.c new file mode 100644 index 0000000..d910a08 --- /dev/null +++ b/freeglut-1.3/freeglut_teapot.c @@ -0,0 +1,248 @@ +/* + * freeglut_teapot.c + * + * Teapot(tm) rendering code. + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * 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 ***/ + + + + + diff --git a/freeglut-1.3/freeglut_videoresize.c b/freeglut-1.3/freeglut_videoresize.c new file mode 100644 index 0000000..d0a00ba --- /dev/null +++ b/freeglut-1.3/freeglut_videoresize.c @@ -0,0 +1,56 @@ +/* + * 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, + * 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 ***/ + + + + + + + diff --git a/freeglut-1.3/freeglut_window.c b/freeglut-1.3/freeglut_window.c new file mode 100644 index 0000000..5cd3876 --- /dev/null +++ b/freeglut-1.3/freeglut_window.c @@ -0,0 +1,1099 @@ +/* + * freeglut_window.c + * + * Window management methods. + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * 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 ***/ + + + + + + + + + diff --git a/freeglut-1.3/templates/cpp_template b/freeglut-1.3/templates/cpp_template new file mode 100644 index 0000000..9d4d4fa --- /dev/null +++ b/freeglut-1.3/templates/cpp_template @@ -0,0 +1,17 @@ +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. + */ + diff --git a/freeglut-1.3/templates/header_template b/freeglut-1.3/templates/header_template new file mode 100644 index 0000000..9d4d4fa --- /dev/null +++ b/freeglut-1.3/templates/header_template @@ -0,0 +1,17 @@ +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. + */ + diff --git a/freeglut.dsw b/freeglut.dsw new file mode 100755 index 0000000..1040dd6 --- /dev/null +++ b/freeglut.dsw @@ -0,0 +1,29 @@ +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> +{{{ +}}} + +############################################################################### + diff --git a/freeglut.kdevprj b/freeglut.kdevprj new file mode 100644 index 0000000..88edf33 --- /dev/null +++ b/freeglut.kdevprj @@ -0,0 +1,176 @@ +# 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 diff --git a/freeglut.lsm b/freeglut.lsm new file mode 100644 index 0000000..ccefe17 --- /dev/null +++ b/freeglut.lsm @@ -0,0 +1,14 @@ +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 +Maintained-by: Pawel W. Olszta +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 diff --git a/freeglut13.dsp b/freeglut13.dsp new file mode 100755 index 0000000..c585da1 --- /dev/null +++ b/freeglut13.dsp @@ -0,0 +1,178 @@ +# 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 diff --git a/freeglut13.plg b/freeglut13.plg new file mode 100755 index 0000000..f8c5ceb --- /dev/null +++ b/freeglut13.plg @@ -0,0 +1,49 @@ +--------------------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 "" + "" with flags "" + +Creating temp file "C:\WINDOWS\TEMP\RSP170.TMP" with contents +Creating command line "cl.exe @C:\WINDOWS\TEMP\RSP170.TMP" +Creating temp file "C:\WINDOWS\TEMP\RSP0171.TMP" with contents +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) diff --git a/genfonts/.deps/genfonts.P b/genfonts/.deps/genfonts.P new file mode 100644 index 0000000..ea9c815 --- /dev/null +++ b/genfonts/.deps/genfonts.P @@ -0,0 +1,64 @@ +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 : diff --git a/genfonts/.deps/genstroke.P b/genfonts/.deps/genstroke.P new file mode 100644 index 0000000..14ed4de --- /dev/null +++ b/genfonts/.deps/genstroke.P @@ -0,0 +1,57 @@ +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 : diff --git a/genfonts/Makefile b/genfonts/Makefile new file mode 100644 index 0000000..5e81687 --- /dev/null +++ b/genfonts/Makefile @@ -0,0 +1,352 @@ +# 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: diff --git a/genfonts/Makefile.am b/genfonts/Makefile.am new file mode 100644 index 0000000..e698fc4 --- /dev/null +++ b/genfonts/Makefile.am @@ -0,0 +1,8 @@ +## 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 diff --git a/genfonts/Makefile.in b/genfonts/Makefile.in new file mode 100644 index 0000000..22e90e4 --- /dev/null +++ b/genfonts/Makefile.in @@ -0,0 +1,352 @@ +# 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: diff --git a/genfonts/Roman.src b/genfonts/Roman.src new file mode 100644 index 0000000..f1e3fce --- /dev/null +++ b/genfonts/Roman.src @@ -0,0 +1,603 @@ +## +# $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 + diff --git a/genfonts/Roman_M.src b/genfonts/Roman_M.src new file mode 100644 index 0000000..45717a5 --- /dev/null +++ b/genfonts/Roman_M.src @@ -0,0 +1,503 @@ +## +# $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) diff --git a/genfonts/genfonts.c b/genfonts/genfonts.c new file mode 100644 index 0000000..83cd3b3 --- /dev/null +++ b/genfonts/genfonts.c @@ -0,0 +1,473 @@ +/* + * 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, + * 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 +#endif + +#include +#include +#include + +#include +#include +#include + +/* + * 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, \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; charactermin_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=0; x-- ) + for( y=0; 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 -- the display to connect to + * -file -- 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\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 + * 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 +#endif + +#include + +#include +#include +#include + +/* + * 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, \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 -- 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 ***/ diff --git a/include/GL/Makefile b/include/GL/Makefile new file mode 100644 index 0000000..0a889bf --- /dev/null +++ b/include/GL/Makefile @@ -0,0 +1,233 @@ +# 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: diff --git a/include/GL/Makefile.am b/include/GL/Makefile.am new file mode 100644 index 0000000..6b12e46 --- /dev/null +++ b/include/GL/Makefile.am @@ -0,0 +1,7 @@ +## Process this file with automake to produce Makefile.in + +GLincludedir = $(includedir)/GL + +EXTRA_DIST = freeglut.h freeglut_internal.h +GLinclude_HEADERS = freeglut.h + diff --git a/include/GL/Makefile.in b/include/GL/Makefile.in new file mode 100644 index 0000000..0cecf12 --- /dev/null +++ b/include/GL/Makefile.in @@ -0,0 +1,233 @@ +# 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: diff --git a/include/GL/freeglut.h b/include/GL/freeglut.h new file mode 100644 index 0000000..b4d6acb --- /dev/null +++ b/include/GL/freeglut.h @@ -0,0 +1,526 @@ +/* + * freeglut.h + * + * The freeglut library include file + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * 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 +#include + +/* + * 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 ***/ + + + + diff --git a/include/GL/freeglut_internal.h b/include/GL/freeglut_internal.h new file mode 100644 index 0000000..9438888 --- /dev/null +++ b/include/GL/freeglut_internal.h @@ -0,0 +1,562 @@ +/* + * freeglut_internal.h + * + * The freeglut library private include file. + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * 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 + #include +#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 +#include +#include +#include +#include +#include + +/* + * The system-dependant include files should go here: + */ +#if TARGET_HOST_UNIX_X11 + #include + #include + #include + #include + + /* + * This will generate errors, but I don't have any idea how to fix it (will autoconf help?) + */ + #include +#endif + +/* + * Microsoft VisualC++ 5.0's 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 ***/ + + + + diff --git a/include/Makefile b/include/Makefile new file mode 100644 index 0000000..44565b0 --- /dev/null +++ b/include/Makefile @@ -0,0 +1,288 @@ +# 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: diff --git a/include/Makefile.am b/include/Makefile.am new file mode 100644 index 0000000..90f2094 --- /dev/null +++ b/include/Makefile.am @@ -0,0 +1,3 @@ +## Process this file with automake to produce Makefile.in + +SUBDIRS = GL diff --git a/include/Makefile.in b/include/Makefile.in new file mode 100644 index 0000000..aa95680 --- /dev/null +++ b/include/Makefile.in @@ -0,0 +1,288 @@ +# 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: diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..e843669 --- /dev/null +++ b/install-sh @@ -0,0 +1,250 @@ +#!/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 diff --git a/mkinstalldirs b/mkinstalldirs new file mode 100755 index 0000000..d0fd194 --- /dev/null +++ b/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# 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 diff --git a/stamp-h b/stamp-h new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/stamp-h @@ -0,0 +1 @@ +timestamp diff --git a/stamp-h.in b/stamp-h.in new file mode 100644 index 0000000..9788f70 --- /dev/null +++ b/stamp-h.in @@ -0,0 +1 @@ +timestamp diff --git a/tests/.deps/one.P b/tests/.deps/one.P new file mode 100644 index 0000000..fafa85c --- /dev/null +++ b/tests/.deps/one.P @@ -0,0 +1,40 @@ +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 : diff --git a/tests/Makefile b/tests/Makefile new file mode 100644 index 0000000..fba95dd --- /dev/null +++ b/tests/Makefile @@ -0,0 +1,342 @@ +# 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: diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 0000000..cf66858 --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,6 @@ +## 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 + diff --git a/tests/Makefile.in b/tests/Makefile.in new file mode 100644 index 0000000..ab06b5f --- /dev/null +++ b/tests/Makefile.in @@ -0,0 +1,342 @@ +# 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: diff --git a/tests/one.c b/tests/one.c new file mode 100644 index 0000000..6b22673 --- /dev/null +++ b/tests/one.c @@ -0,0 +1,327 @@ +/* + * 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, + * Creation date: czw gru 2 11:58:41 CET 1999 + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#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 ***/ -- 1.7.10.4