summaryrefslogtreecommitdiff
path: root/src/glut
diff options
context:
space:
mode:
authorJulien Cristau <jcristau@debian.org>2007-02-01 11:50:36 +0100
committerJulien Cristau <jcristau@debian.org>2007-02-01 11:50:36 +0100
commit2634f06c2095b79d4252bb81c0b0272139dad890 (patch)
tree855ba634812939982daa999dc44365a4d889d11e /src/glut
parent7549426a168f3803d6023622dd9e630a5fa2faf6 (diff)
parenteb667b979bc941f05b8f40a2fc39af6fac960ac5 (diff)
Merge branch 'upstream-experimental' into debian-experimental
Conflicts: progs/util/README progs/util/glstate.c progs/util/glstate.h progs/util/sampleMakefile src/glu/sgi/libnurbs/interface/bezierEval.h src/glu/sgi/libnurbs/interface/bezierPatch.cc src/glu/sgi/libnurbs/interface/bezierPatch.h src/glu/sgi/libnurbs/interface/bezierPatchMesh.cc src/glu/sgi/libnurbs/interface/bezierPatchMesh.h src/glu/sgi/libnurbs/interface/glcurveval.cc src/glu/sgi/libnurbs/interface/glimports.h src/glu/sgi/libnurbs/interface/glinterface.cc src/glu/sgi/libnurbs/interface/glrenderer.h src/glu/sgi/libnurbs/interface/incurveeval.cc src/glu/sgi/libnurbs/interface/insurfeval.cc src/glu/sgi/libnurbs/interface/mystdio.h src/glu/sgi/libnurbs/interface/mystdlib.h src/glu/sgi/libnurbs/internals/arc.h src/glu/sgi/libnurbs/internals/arcsorter.cc src/glu/sgi/libnurbs/internals/arcsorter.h src/glu/sgi/libnurbs/internals/arctess.h src/glu/sgi/libnurbs/internals/backend.cc src/glu/sgi/libnurbs/internals/backend.h src/glu/sgi/libnurbs/internals/basiccrveval.h src/glu/sgi/libnurbs/internals/basicsurfeval.h src/glu/sgi/libnurbs/internals/bezierarc.h src/glu/sgi/libnurbs/internals/bin.cc src/glu/sgi/libnurbs/internals/bin.h src/glu/sgi/libnurbs/internals/bufpool.cc src/glu/sgi/libnurbs/internals/bufpool.h src/glu/sgi/libnurbs/internals/cachingeval.cc src/glu/sgi/libnurbs/internals/cachingeval.h src/glu/sgi/libnurbs/internals/ccw.cc src/glu/sgi/libnurbs/internals/coveandtiler.h src/glu/sgi/libnurbs/internals/curve.cc src/glu/sgi/libnurbs/internals/curve.h src/glu/sgi/libnurbs/internals/curvelist.cc src/glu/sgi/libnurbs/internals/curvelist.h src/glu/sgi/libnurbs/internals/curvesub.cc src/glu/sgi/libnurbs/internals/dataTransform.cc src/glu/sgi/libnurbs/internals/dataTransform.h src/glu/sgi/libnurbs/internals/defines.h src/glu/sgi/libnurbs/internals/displaylist.cc src/glu/sgi/libnurbs/internals/displaylist.h src/glu/sgi/libnurbs/internals/displaymode.h src/glu/sgi/libnurbs/internals/flist.cc src/glu/sgi/libnurbs/internals/flist.h src/glu/sgi/libnurbs/internals/flistsorter.cc src/glu/sgi/libnurbs/internals/flistsorter.h src/glu/sgi/libnurbs/internals/gridline.h src/glu/sgi/libnurbs/internals/gridtrimvertex.h src/glu/sgi/libnurbs/internals/gridvertex.h src/glu/sgi/libnurbs/internals/hull.cc src/glu/sgi/libnurbs/internals/hull.h src/glu/sgi/libnurbs/internals/intersect.cc src/glu/sgi/libnurbs/internals/jarcloc.h src/glu/sgi/libnurbs/internals/knotvector.h src/glu/sgi/libnurbs/internals/mapdesc.cc src/glu/sgi/libnurbs/internals/mapdesc.h src/glu/sgi/libnurbs/internals/mapdescv.cc src/glu/sgi/libnurbs/internals/maplist.cc src/glu/sgi/libnurbs/internals/maplist.h src/glu/sgi/libnurbs/internals/mesher.cc src/glu/sgi/libnurbs/internals/mesher.h src/glu/sgi/libnurbs/internals/monoTriangulationBackend.cc src/glu/sgi/libnurbs/internals/monotonizer.cc src/glu/sgi/libnurbs/internals/monotonizer.h src/glu/sgi/libnurbs/internals/myassert.h src/glu/sgi/libnurbs/internals/mycode.cc src/glu/sgi/libnurbs/internals/mystring.h src/glu/sgi/libnurbs/internals/nurbsconsts.h src/glu/sgi/libnurbs/internals/nurbstess.cc src/glu/sgi/libnurbs/internals/patch.cc src/glu/sgi/libnurbs/internals/patch.h src/glu/sgi/libnurbs/internals/patchlist.cc src/glu/sgi/libnurbs/internals/patchlist.h src/glu/sgi/libnurbs/internals/pwlarc.h src/glu/sgi/libnurbs/internals/quilt.cc src/glu/sgi/libnurbs/internals/quilt.h src/glu/sgi/libnurbs/internals/reader.cc src/glu/sgi/libnurbs/internals/reader.h src/glu/sgi/libnurbs/internals/renderhints.cc src/glu/sgi/libnurbs/internals/renderhints.h src/glu/sgi/libnurbs/internals/simplemath.h src/glu/sgi/libnurbs/internals/slicer.cc src/glu/sgi/libnurbs/internals/slicer.h src/glu/sgi/libnurbs/internals/sorter.cc src/glu/sgi/libnurbs/internals/sorter.h src/glu/sgi/libnurbs/internals/splitarcs.cc src/glu/sgi/libnurbs/internals/subdivider.h src/glu/sgi/libnurbs/internals/tobezier.cc src/glu/sgi/libnurbs/internals/trimline.cc src/glu/sgi/libnurbs/internals/trimline.h src/glu/sgi/libnurbs/internals/trimregion.cc src/glu/sgi/libnurbs/internals/trimregion.h src/glu/sgi/libnurbs/internals/trimvertex.h src/glu/sgi/libnurbs/internals/trimvertpool.cc src/glu/sgi/libnurbs/internals/trimvertpool.h src/glu/sgi/libnurbs/internals/types.h src/glu/sgi/libnurbs/internals/uarray.cc src/glu/sgi/libnurbs/internals/uarray.h src/glu/sgi/libnurbs/internals/varray.cc src/glu/sgi/libnurbs/internals/varray.h src/glu/sgi/libnurbs/nurbtess/definitions.h src/glu/sgi/libnurbs/nurbtess/directedLine.h src/glu/sgi/libnurbs/nurbtess/glimports.h src/glu/sgi/libnurbs/nurbtess/gridWrap.cc src/glu/sgi/libnurbs/nurbtess/gridWrap.h src/glu/sgi/libnurbs/nurbtess/monoChain.cc src/glu/sgi/libnurbs/nurbtess/monoChain.h src/glu/sgi/libnurbs/nurbtess/monoTriangulation.cc src/glu/sgi/libnurbs/nurbtess/monoTriangulation.h src/glu/sgi/libnurbs/nurbtess/mystdio.h src/glu/sgi/libnurbs/nurbtess/mystdlib.h src/glu/sgi/libnurbs/nurbtess/partitionX.cc src/glu/sgi/libnurbs/nurbtess/partitionX.h src/glu/sgi/libnurbs/nurbtess/partitionY.cc src/glu/sgi/libnurbs/nurbtess/partitionY.h src/glu/sgi/libnurbs/nurbtess/polyDBG.h src/glu/sgi/libnurbs/nurbtess/polyUtil.cc src/glu/sgi/libnurbs/nurbtess/polyUtil.h src/glu/sgi/libnurbs/nurbtess/primitiveStream.cc src/glu/sgi/libnurbs/nurbtess/primitiveStream.h src/glu/sgi/libnurbs/nurbtess/quicksort.cc src/glu/sgi/libnurbs/nurbtess/quicksort.h src/glu/sgi/libnurbs/nurbtess/rectBlock.cc src/glu/sgi/libnurbs/nurbtess/rectBlock.h src/glu/sgi/libnurbs/nurbtess/sampleComp.cc src/glu/sgi/libnurbs/nurbtess/sampleComp.h src/glu/sgi/libnurbs/nurbtess/sampleCompBot.cc src/glu/sgi/libnurbs/nurbtess/sampleCompBot.h src/glu/sgi/libnurbs/nurbtess/sampleCompRight.cc src/glu/sgi/libnurbs/nurbtess/sampleCompRight.h src/glu/sgi/libnurbs/nurbtess/sampleCompTop.cc src/glu/sgi/libnurbs/nurbtess/sampleCompTop.h src/glu/sgi/libnurbs/nurbtess/sampleMonoPoly.cc src/glu/sgi/libnurbs/nurbtess/sampleMonoPoly.h src/glu/sgi/libnurbs/nurbtess/sampledLine.cc src/glu/sgi/libnurbs/nurbtess/sampledLine.h src/glu/sgi/libnurbs/nurbtess/searchTree.cc src/glu/sgi/libnurbs/nurbtess/searchTree.h src/glu/sgi/libnurbs/nurbtess/zlassert.h src/glu/sgi/libtess/README src/glu/sgi/libtess/alg-outline src/glu/sgi/libtess/dict-list.h src/glu/sgi/libtess/dict.c src/glu/sgi/libtess/dict.h src/glu/sgi/libtess/geom.c src/glu/sgi/libtess/memalloc.c src/glu/sgi/libtess/memalloc.h src/glu/sgi/libtess/mesh.c src/glu/sgi/libtess/mesh.h src/glu/sgi/libtess/normal.h src/glu/sgi/libtess/priorityq-heap.c src/glu/sgi/libtess/priorityq-heap.h src/glu/sgi/libtess/priorityq-sort.h src/glu/sgi/libtess/priorityq.c src/glu/sgi/libtess/priorityq.h src/glu/sgi/libtess/render.c src/glu/sgi/libtess/render.h src/glu/sgi/libtess/sweep.h src/glu/sgi/libtess/tess.h src/glu/sgi/libtess/tessmono.c src/glu/sgi/libtess/tessmono.h src/glu/sgi/libutil/error.c src/glu/sgi/libutil/glue.c src/glu/sgi/libutil/gluint.h src/glu/sgi/libutil/project.c src/glu/sgi/libutil/registry.c
Diffstat (limited to 'src/glut')
-rw-r--r--src/glut/directfb/Makefile86
-rw-r--r--src/glut/directfb/NOTES9
-rw-r--r--src/glut/directfb/callback.c278
-rw-r--r--src/glut/directfb/color.c39
-rw-r--r--src/glut/directfb/cursor.c175
-rw-r--r--src/glut/directfb/cursors.h306
-rw-r--r--src/glut/directfb/events.c485
-rw-r--r--src/glut/directfb/ext.c202
-rw-r--r--src/glut/directfb/font.c213
-rw-r--r--src/glut/directfb/font.h58
-rw-r--r--src/glut/directfb/game.c153
-rw-r--r--src/glut/directfb/globals.c63
-rw-r--r--src/glut/directfb/init.c128
-rw-r--r--src/glut/directfb/internal.h184
-rw-r--r--src/glut/directfb/menu.c87
-rw-r--r--src/glut/directfb/models.c599
-rw-r--r--src/glut/directfb/overlay.c62
-rw-r--r--src/glut/directfb/state.c219
-rw-r--r--src/glut/directfb/teapot.c212
-rw-r--r--src/glut/directfb/window.c581
-rw-r--r--src/glut/fbdev/glut_fbdev.c2199
-rw-r--r--src/glut/mini/Makefile80
-rw-r--r--src/glut/os2/Makefile420
-rw-r--r--src/glut/os2/WarpWin.cpp420
-rw-r--r--src/glut/os2/glutOverlay.cpp133
-rw-r--r--src/glut/os2/glut_8x13.cpp2076
-rw-r--r--src/glut/os2/glut_9x15.cpp2077
-rw-r--r--src/glut/os2/glut_bitmap.cpp57
-rw-r--r--src/glut/os2/glut_cindex.cpp259
-rw-r--r--src/glut/os2/glut_cmap.cpp399
-rw-r--r--src/glut/os2/glut_cursor.cpp210
-rw-r--r--src/glut/os2/glut_event.cpp1399
-rw-r--r--src/glut/os2/glut_ext.cpp204
-rw-r--r--src/glut/os2/glut_fullscrn.cpp38
-rw-r--r--src/glut/os2/glut_gamemode.cpp680
-rw-r--r--src/glut/os2/glut_get.cpp232
-rw-r--r--src/glut/os2/glut_hel10.cpp1781
-rw-r--r--src/glut/os2/glut_hel12.cpp1791
-rw-r--r--src/glut/os2/glut_hel18.cpp1900
-rw-r--r--src/glut/os2/glut_init.cpp451
-rw-r--r--src/glut/os2/glut_input.cpp628
-rw-r--r--src/glut/os2/glut_key.cpp29
-rw-r--r--src/glut/os2/glut_keyctrl.cpp29
-rw-r--r--src/glut/os2/glut_keyup.cpp29
-rw-r--r--src/glut/os2/glut_mesa.cpp57
-rw-r--r--src/glut/os2/glut_modifier.cpp31
-rw-r--r--src/glut/os2/glut_roman.cpp2451
-rw-r--r--src/glut/os2/glut_shapes.cpp595
-rw-r--r--src/glut/os2/glut_stroke.cpp42
-rw-r--r--src/glut/os2/glut_swap.cpp67
-rw-r--r--src/glut/os2/glut_teapot.cpp210
-rw-r--r--src/glut/os2/glut_tr24.cpp2063
-rw-r--r--src/glut/os2/glut_util.cpp90
-rw-r--r--src/glut/os2/glut_vidresize.cpp232
-rw-r--r--src/glut/os2/glut_warp.cpp29
-rw-r--r--src/glut/os2/glut_win.cpp1221
-rw-r--r--src/glut/os2/glut_winmisc.cpp127
-rw-r--r--src/glut/os2/glutbitmap.h32
-rw-r--r--src/glut/os2/glutos2.h36
-rw-r--r--src/glut/os2/glutstroke.h42
-rw-r--r--src/glut/os2/layerutil.h59
-rw-r--r--src/glut/os2/libGlut.DEF94
-rw-r--r--src/glut/os2/os2_glx.cpp146
-rw-r--r--src/glut/os2/os2_menu.cpp533
-rw-r--r--src/glut/os2/os2_winproc.cpp1297
-rw-r--r--src/glut/os2/src-glut_os2pm.zipbin0 -> 141239 bytes
66 files changed, 31114 insertions, 0 deletions
diff --git a/src/glut/directfb/Makefile b/src/glut/directfb/Makefile
new file mode 100644
index 00000000000..3791b16df89
--- /dev/null
+++ b/src/glut/directfb/Makefile
@@ -0,0 +1,86 @@
+# subset glut
+
+TOP = ../../..
+include $(TOP)/configs/current
+
+MARK = $(TOP)/src/glut/glx
+
+GLUT_MAJOR = 3
+GLUT_MINOR = 7
+GLUT_TINY = 1
+
+INCLUDES = -I$(TOP)/include -I$(MARK) $(shell pkg-config --cflags directfb)
+
+GLUT_LIB_DEPS += $(shell pkg-config --libs directfb)
+
+CORE_SOURCES = \
+ callback.c \
+ color.c \
+ cursor.c \
+ ext.c \
+ events.c \
+ font.c \
+ game.c \
+ globals.c \
+ init.c \
+ menu.c \
+ models.c \
+ overlay.c \
+ state.c \
+ teapot.c \
+ window.c \
+
+
+MARK_SOURCES = \
+ $(MARK)/glut_8x13.c \
+ $(MARK)/glut_9x15.c \
+ $(MARK)/glut_hel10.c \
+ $(MARK)/glut_hel12.c \
+ $(MARK)/glut_hel18.c \
+ $(MARK)/glut_tr10.c \
+ $(MARK)/glut_tr24.c
+
+SOURCES = $(CORE_SOURCES) $(MARK_SOURCES)
+
+OBJECTS = $(SOURCES:.c=.o)
+
+
+##### RULES #####
+
+.c.o:
+ $(CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@
+
+.S.o:
+ $(CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@
+
+
+##### TARGETS #####
+
+default: depend $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME)
+
+
+# Make the library
+$(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME): depend $(OBJECTS)
+ $(TOP)/bin/mklib -o $(GLUT_LIB) -linker '$(CC)' \
+ -major $(GLUT_MAJOR) -minor $(GLUT_MINOR) -patch $(GLUT_TINY) \
+ $(GLUT_LIB_DEPS) -install $(TOP)/$(LIB_DIR) \
+ $(MKLIB_OPTIONS) $(OBJECTS)
+
+
+# Run 'make -f Makefile.solo dep' to update the dependencies if you change
+# what's included by any source file.
+depend: $(SOURCES)
+ touch depend
+ $(MKDEP) $(MKDEP_OPTIONS) $(INCLUDES) $(SOURCES) > /dev/null
+
+# Emacs tags
+tags:
+ etags `find . -name \*.[ch]` `find ../include`
+
+
+# Remove .o and backup files
+clean: depend
+ -rm -f depend
+ -rm -f *.o *~ *.o *~ *.so libglut.so.3.7
+
+include depend
diff --git a/src/glut/directfb/NOTES b/src/glut/directfb/NOTES
new file mode 100644
index 00000000000..af917c6667d
--- /dev/null
+++ b/src/glut/directfb/NOTES
@@ -0,0 +1,9 @@
+DirectFB GLUT Implementation NOTES
+----------------------------------
+
+* To have high performance rendering, it's really important to
+ use glutEnterGameMode() instead of glutCreateWindow()/glutFullScreen().
+ You can also force a windowed application to game mode by setting
+ the environment variable "__GLUT_GAME_MODE".
+
+
diff --git a/src/glut/directfb/callback.c b/src/glut/directfb/callback.c
new file mode 100644
index 00000000000..38cfccbd4f8
--- /dev/null
+++ b/src/glut/directfb/callback.c
@@ -0,0 +1,278 @@
+/*
+ * Copyright (C) 2006 Claudio Ciccani <klan@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/time.h>
+
+#include "internal.h"
+
+
+typedef void (GLUTCALLBACK *__GlutTimerCallback) ( int value );
+
+typedef struct __GlutTimer_s {
+ unsigned int interval;
+ struct timeval expire;
+
+ __GlutTimerCallback func;
+ int value;
+
+ struct __GlutTimer_s *next;
+ struct __GlutTimer_s *prev;
+} __GlutTimer;
+
+/*****************************************************************************/
+
+static __GlutTimer *g_timers = NULL;
+
+/*****************************************************************************/
+
+
+void GLUTAPIENTRY
+glutDisplayFunc( void (GLUTCALLBACK *func) (void) )
+{
+ display_func = func;
+}
+
+
+void GLUTAPIENTRY
+glutReshapeFunc( void (GLUTCALLBACK *func) (int width, int height) )
+{
+ reshape_func = func;
+}
+
+
+void GLUTAPIENTRY
+glutKeyboardFunc( void (GLUTCALLBACK *func) (unsigned char key, int x, int y) )
+{
+ keyboard_func = func;
+}
+
+
+void GLUTAPIENTRY
+glutMouseFunc( void (GLUTCALLBACK *func) (int button, int state, int x, int y) )
+{
+ mouse_func = func;
+}
+
+
+void GLUTAPIENTRY
+glutMotionFunc( void (GLUTCALLBACK *func) (int x, int y) )
+{
+ motion_func = func;
+}
+
+
+void GLUTAPIENTRY
+glutPassiveMotionFunc( void (GLUTCALLBACK *func) (int x, int y) )
+{
+ passive_motion_func = func;
+}
+
+
+void GLUTAPIENTRY
+glutEntryFunc( void (GLUTCALLBACK *func) (int state) )
+{
+ entry_func = func;
+}
+
+
+void GLUTAPIENTRY
+glutVisibilityFunc( void (GLUTCALLBACK *func) (int state) )
+{
+ visibility_func = func;
+}
+
+
+void GLUTAPIENTRY
+glutMenuStateFunc( void (GLUTCALLBACK *func) (int state) )
+{
+ menu_state_func = func;
+}
+
+
+void GLUTAPIENTRY
+glutSpecialFunc( void (GLUTCALLBACK *func) (int key, int x, int y) )
+{
+ special_func = func;
+}
+
+
+void GLUTAPIENTRY
+glutSpaceballMotionFunc( void (GLUTCALLBACK *func) (int x, int y, int z) )
+{
+}
+
+
+void GLUTAPIENTRY
+glutSpaceballRotateFunc( void (GLUTCALLBACK *func) (int x, int y, int z) )
+{
+}
+
+
+void GLUTAPIENTRY
+glutSpaceballButtonFunc( void (GLUTCALLBACK *func) (int button, int state) )
+{
+}
+
+
+void GLUTAPIENTRY
+glutButtonBoxFunc( void (GLUTCALLBACK *func) (int button, int state) )
+{
+}
+
+
+void GLUTAPIENTRY
+glutDialsFunc( void (GLUTCALLBACK *func) (int dial, int value) )
+{
+}
+
+
+void GLUTAPIENTRY
+glutTabletMotionFunc( void (GLUTCALLBACK *func) (int x, int y) )
+{
+}
+
+
+void GLUTAPIENTRY
+glutTabletButtonFunc( void (GLUTCALLBACK *func) (int button, int state, int x, int y) )
+{
+}
+
+
+void GLUTAPIENTRY
+glutMenuStatusFunc( void (GLUTCALLBACK *func) (int status, int x, int y) )
+{
+}
+
+
+void GLUTAPIENTRY
+glutOverlayDisplayFunc( void (GLUTCALLBACK *func) (void) )
+{
+}
+
+
+void GLUTAPIENTRY
+glutWindowStatusFunc( void (GLUTCALLBACK *func) (int state) )
+{
+}
+
+
+void GLUTAPIENTRY
+glutKeyboardUpFunc( void (GLUTCALLBACK *func) (unsigned char key, int x, int y) )
+{
+ keyboard_up_func = func;
+}
+
+
+void GLUTAPIENTRY
+glutSpecialUpFunc( void (GLUTCALLBACK *func) (int key, int x, int y) )
+{
+ special_up_func = func;
+}
+
+
+void GLUTAPIENTRY
+glutJoystickFunc( void (GLUTCALLBACK *func)(unsigned int buttons, int x, int y, int z), int pollInterval )
+{
+ joystick_func = func;
+ /* FIXME: take care of pollInterval */
+}
+
+
+void GLUTAPIENTRY
+glutIdleFunc( void (GLUTCALLBACK *func) (void) )
+{
+ idle_func = func;
+}
+
+
+void GLUTAPIENTRY
+glutTimerFunc( unsigned int msec, void (GLUTCALLBACK *func) (int value), int value )
+{
+ __GlutTimer *timer;
+ struct timeval now;
+
+ if (!func)
+ return;
+
+ timer = calloc( 1, sizeof(__GlutTimer) );
+ if (!timer)
+ __glutFatalError( "out of memory" );
+
+ gettimeofday( &now, NULL );
+
+ timer->interval = msec;
+ timer->expire.tv_sec = now.tv_sec + (now.tv_usec/1000 + msec) / 1000;
+ timer->expire.tv_usec = (now.tv_usec + msec*1000) % 1000000;
+
+ timer->func = func;
+ timer->value = value;
+
+ if (g_timers) {
+ timer->prev = g_timers->prev;
+ g_timers->prev->next = timer;
+ g_timers->prev = timer;
+ }
+ else {
+ g_timers = timer;
+ g_timers->prev = timer;
+ }
+}
+
+
+void
+__glutHandleTimers( void )
+{
+ __GlutTimer *cur;
+ struct timeval now;
+
+ for (cur = g_timers; cur; cur = cur->next ) {
+ gettimeofday( &now, NULL );
+
+ if (cur->expire.tv_sec > now.tv_sec ||
+ (cur->expire.tv_sec == now.tv_sec &&
+ cur->expire.tv_usec >= now.tv_usec))
+ {
+ g_idle = GL_FALSE;
+
+ cur->func( cur->value );
+
+ cur->expire.tv_sec += (cur->expire.tv_usec/1000 + cur->interval) / 1000;
+ cur->expire.tv_usec = (cur->expire.tv_usec + cur->interval*1000) % 1000000;
+ }
+ }
+}
+
+
+void
+__glutFreeTimers( void )
+{
+ __GlutTimer *cur = g_timers;
+
+ while (cur) {
+ __GlutTimer *next = cur->next;
+ free( cur );
+ cur = next;
+ }
+
+ g_timers = NULL;
+}
+
diff --git a/src/glut/directfb/color.c b/src/glut/directfb/color.c
new file mode 100644
index 00000000000..26c514c6d5f
--- /dev/null
+++ b/src/glut/directfb/color.c
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2006 Claudio Ciccani <klan@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "internal.h"
+
+
+void GLUTAPIENTRY
+glutSetColor( int index, GLfloat red, GLfloat green, GLfloat blue )
+{
+}
+
+
+GLfloat GLUTAPIENTRY
+glutGetColor( int index, int component )
+{
+ return 0.0;
+}
+
+
+void GLUTAPIENTRY
+glutCopyColormap( int win )
+{
+}
diff --git a/src/glut/directfb/cursor.c b/src/glut/directfb/cursor.c
new file mode 100644
index 00000000000..aca3fcc9215
--- /dev/null
+++ b/src/glut/directfb/cursor.c
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2006 Claudio Ciccani <klan@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "internal.h"
+
+#include "cursors.h"
+
+
+void GLUTAPIENTRY
+glutSetCursor( int type )
+{
+ const unsigned char *cursor;
+ DFBSurfaceDescription dsc;
+ IDirectFBSurface *shape;
+
+ if (!g_current || !g_current->window)
+ return;
+
+ if (g_current->cursor == type)
+ return;
+
+ switch (type) {
+ case GLUT_CURSOR_RIGHT_ARROW:
+ cursor = &cur_right_arrow[0];
+ break;
+ case GLUT_CURSOR_LEFT_ARROW:
+ cursor = &cur_left_arrow[0];
+ break;
+ case GLUT_CURSOR_INFO:
+ cursor = &cur_info[0];
+ break;
+ case GLUT_CURSOR_DESTROY:
+ cursor = &cur_destroy[0];
+ break;
+ case GLUT_CURSOR_HELP:
+ cursor = &cur_help[0];
+ break;
+ case GLUT_CURSOR_CYCLE:
+ cursor = &cur_cycle[0];
+ break;
+ case GLUT_CURSOR_SPRAY:
+ cursor = &cur_spray[0];
+ break;
+ case GLUT_CURSOR_WAIT:
+ cursor = &cur_wait[0];
+ break;
+ case GLUT_CURSOR_TEXT:
+ cursor = &cur_text[0];
+ break;
+ case GLUT_CURSOR_CROSSHAIR:
+ cursor = &cur_crosshair[0];
+ break;
+ case GLUT_CURSOR_UP_DOWN:
+ cursor = &cur_up_down[0];
+ break;
+ case GLUT_CURSOR_LEFT_RIGHT:
+ cursor = &cur_left_right[0];
+ break;
+ case GLUT_CURSOR_TOP_SIDE:
+ cursor = &cur_top_side[0];
+ break;
+ case GLUT_CURSOR_BOTTOM_SIDE:
+ cursor = &cur_bottom_side[0];
+ break;
+ case GLUT_CURSOR_LEFT_SIDE:
+ cursor = &cur_left_side[0];
+ break;
+ case GLUT_CURSOR_RIGHT_SIDE:
+ cursor = &cur_right_side[0];
+ break;
+ case GLUT_CURSOR_TOP_LEFT_CORNER:
+ cursor = &cur_top_left[0];
+ break;
+ case GLUT_CURSOR_TOP_RIGHT_CORNER:
+ cursor = &cur_top_right[0];
+ break;
+ case GLUT_CURSOR_BOTTOM_RIGHT_CORNER:
+ cursor = &cur_bottom_right[0];
+ break;
+ case GLUT_CURSOR_BOTTOM_LEFT_CORNER:
+ cursor = &cur_bottom_left[0];
+ break;
+ case GLUT_CURSOR_NONE:
+ cursor = NULL;
+ break;
+ default:
+ cursor = &cur_right_arrow[0];
+ break;
+ }
+
+ dsc.flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT;
+ dsc.width =
+ dsc.height = cursor ? cursor[0] : 8;
+ dsc.pixelformat = DSPF_ARGB;
+
+ if (dfb->CreateSurface( dfb, &dsc, &shape ))
+ return;
+
+ if (cursor) {
+ __u8 *src = (__u8*) &cursor[3];
+ __u8 *msk = src + cursor[0]*cursor[0]/8;
+ void *dst;
+ int pitch;
+ int x, y;
+
+ if (shape->Lock( shape, DSLF_WRITE, &dst, &pitch )) {
+ shape->Release( shape );
+ return;
+ }
+
+ for (y = 0; y < cursor[0]; y++) {
+ for (x = 0; x < cursor[0]; x++) {
+ ((__u32*)dst)[x] =
+ ((src[x>>3] & (0x80 >> (x&7))) ? 0 : 0x00ffffff) |
+ ((msk[x>>3] & (0x80 >> (x&7))) ? 0xff000000 : 0);
+ }
+
+ dst += pitch;
+ src += cursor[0]/8;
+ msk += cursor[0]/8;
+ }
+
+ shape->Unlock( shape );
+ }
+ else {
+ /* Invisible cursor */
+ shape->Clear( shape, 0, 0, 0, 0 );
+ }
+
+ g_current->window->SetCursorShape( g_current->window, shape,
+ cursor ? cursor[1] : 0,
+ cursor ? cursor[2] : 0 );
+ g_current->cursor = type;
+
+ shape->Release( shape );
+}
+
+
+void GLUTAPIENTRY
+glutWarpPointer( int x, int y )
+{
+ if (g_current) {
+ if (!g_game) {
+ int wx, wy;
+ g_current->window->GetPosition( g_current->window, &wx, &wy );
+ primary->WarpCursor( primary, wx+x, wy+y );
+ }
+ else {
+ g_current->cx = x;
+ g_current->cy = y;
+ }
+ }
+}
+
+
diff --git a/src/glut/directfb/cursors.h b/src/glut/directfb/cursors.h
new file mode 100644
index 00000000000..30ab7c348e6
--- /dev/null
+++ b/src/glut/directfb/cursors.h
@@ -0,0 +1,306 @@
+#ifndef __GLUT_CURSORS_H__
+#define __GLUT_CURSORS_H__
+
+
+static const unsigned char cur_right_arrow[] = {
+ 16, /* size */
+ 1, 2, /* hotspot */
+ /* data */
+ 0x00, 0x00, 0x60, 0x00, 0x78, 0x00, 0x3e, 0x00,
+ 0x3f, 0x80, 0x1f, 0xe0, 0x1f, 0xf8, 0x0f, 0x80,
+ 0x0f, 0xc0, 0x06, 0xe0, 0x06, 0x70, 0x02, 0x38,
+ 0x02, 0x1c, 0x00, 0x0e, 0x00, 0x04, 0x00, 0x00,
+ /* mask */
+ 0xe0, 0x00, 0xf8, 0x00, 0xfe, 0x00, 0x7f, 0x80,
+ 0x7f, 0xe0, 0x3f, 0xf8, 0x3f, 0xfc, 0x1f, 0xfc,
+ 0x1f, 0xe0, 0x0f, 0xf0, 0x0f, 0xf8, 0x07, 0x7c,
+ 0x07, 0x3e, 0x02, 0x1f, 0x00, 0x0e, 0x00, 0x04,
+};
+
+static const unsigned char cur_left_arrow[] = {
+ 16, /* size */
+ 1, 15, /* hotspot */
+ /* data */
+ 0x00, 0x00, 0x80, 0x06, 0x00, 0x1e, 0x00, 0x7c,
+ 0x01, 0xfc, 0x07, 0xf8, 0x1f, 0xf8, 0x01, 0xf0,
+ 0x01, 0xf0, 0x02, 0x60, 0x04, 0x60, 0x08, 0x40,
+ 0x10, 0x40, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00,
+ /* mask */
+ 0x00, 0x07, 0x00, 0x1f, 0x00, 0x7f, 0x01, 0xfe,
+ 0x07, 0xfe, 0x3f, 0xfc, 0x3f, 0xfc, 0x3f, 0xf8,
+ 0x03, 0xf8, 0x07, 0xf0, 0x0e, 0xf0, 0x1c, 0xe0,
+ 0x38, 0xe0, 0x70, 0xe0, 0xe0, 0x00, 0xc0, 0x00,
+};
+
+static const unsigned char cur_info[] = {
+ 16, /* size */
+ 0, 2, /* hotspot */
+ /* data */
+ 0x30, 0x00, 0x3c, 0x00, 0x0f, 0x00, 0x07, 0x80,
+ 0x03, 0xc0, 0x07, 0xe0, 0x0f, 0xf0, 0x07, 0xf4,
+ 0x0f, 0xfe, 0x0f, 0xfa, 0x07, 0xe0, 0x03, 0xe0,
+ 0x00, 0x52, 0x00, 0x46, 0x00, 0x2c, 0x00, 0x18,
+ /* mask */
+ 0xb8, 0x00, 0x3e, 0x00, 0x1f, 0x80, 0x0f, 0xc0,
+ 0x07, 0xe0, 0x0f, 0xf0, 0x1f, 0xfc, 0x1f, 0xfe,
+ 0x1f, 0xfe, 0x1f, 0xfe, 0x0f, 0xfe, 0x07, 0xfe,
+ 0x03, 0xfe, 0x00, 0xfe, 0x00, 0x7e, 0x00, 0x3c,
+};
+
+static const unsigned char cur_destroy[] = {
+ 16, /* size */
+ 12, 8, /* hotspot */
+ /* data */
+ 0x01, 0xe0, 0x03, 0xf0, 0x07, 0xf8, 0x0c, 0xcc,
+ 0x0c, 0xcc, 0x07, 0xf8, 0x03, 0xf0, 0x01, 0xe0,
+ 0x21, 0xe1, 0x61, 0xe1, 0x10, 0xc2, 0x0e, 0x1c,
+ 0x01, 0xe0, 0x47, 0xf8, 0x7c, 0x0f, 0x20, 0x01,
+ /* mask */
+ 0x03, 0xf0, 0x07, 0xf8, 0x0f, 0xfc, 0x1f, 0xfe,
+ 0x1f, 0xfe, 0x0f, 0xfc, 0x07, 0xf8, 0x83, 0xf1,
+ 0xe3, 0xf1, 0xf3, 0xf3, 0x39, 0xef, 0x1e, 0x1e,
+ 0x01, 0xe0, 0xc7, 0xfe, 0xff, 0xff, 0x7c, 0x0f,
+};
+
+static const unsigned char cur_help[] = {
+ 16, /* size */
+ 7, 8, /* hotspot */
+ /* data */
+ 0x83, 0xe0, 0x07, 0xf0, 0x0e, 0x38, 0x0c, 0x18,
+ 0x0c, 0x38, 0x0e, 0x30, 0x07, 0x00, 0x03, 0xc0,
+ 0x01, 0xc0, 0x01, 0x40, 0x01, 0x40, 0x07, 0x70,
+ 0x03, 0x60, 0x01, 0xc0, 0x00, 0x80, 0x00, 0x00,
+ /* mask */
+ 0x03, 0xe0, 0x07, 0xf0, 0x0f, 0xf8, 0x1f, 0xfc,
+ 0x1e, 0x3c, 0x1e, 0x7c, 0x1f, 0x78, 0x0f, 0xf0,
+ 0x07, 0xe0, 0x03, 0xe0, 0x03, 0xe0, 0x07, 0xf0,
+ 0x0f, 0xf8, 0x07, 0xf0, 0x03, 0xe0, 0x01, 0xc0,
+};
+
+static const unsigned char cur_cycle[] = {
+ 16, /* size */
+ 7, 9, /* hotspot */
+ /* data */
+ 0x00, 0x00, 0x07, 0xe2, 0x0f, 0xf6, 0x18, 0x3e,
+ 0x10, 0x12, 0x00, 0x32, 0x00, 0x7e, 0x00, 0x00,
+ 0x00, 0x00, 0x7e, 0x00, 0x4c, 0x00, 0x48, 0x08,
+ 0x7c, 0x18, 0x6f, 0xf0, 0x47, 0xe0, 0x00, 0x00,
+ /* mask */
+ 0x07, 0xe3, 0x0f, 0xf7, 0x1f, 0xff, 0x3f, 0xff,
+ 0x38, 0x3f, 0x30, 0xff, 0x00, 0xff, 0x00, 0xff,
+ 0xff, 0x00, 0xff, 0x00, 0xfe, 0x0c, 0xfc, 0x1c,
+ 0xff, 0xfc, 0xff, 0xf8, 0xef, 0xf0, 0xc7, 0xe0,
+};
+
+static const unsigned char cur_spray[] = {
+ 16, /* size */
+ 2, 4, /* hotspot */
+ /* data */
+ 0x98, 0x00, 0x02, 0x00, 0x18, 0xb0, 0x02, 0x78,
+ 0x18, 0x58, 0x00, 0xfc, 0x00, 0x84, 0x00, 0x9c,
+ 0x00, 0x94, 0x00, 0x9c, 0x00, 0x94, 0x00, 0x9c,
+ 0x00, 0x9c, 0x00, 0x84, 0x00, 0x84, 0x00, 0xfc,
+ /* mask */
+ 0x30, 0x00, 0x34, 0x60, 0x35, 0xf0, 0x35, 0xf0,
+ 0x35, 0xf8, 0x03, 0xfc, 0x03, 0xfc, 0x03, 0xfc,
+ 0x03, 0xfc, 0x03, 0xfc, 0x03, 0xfc, 0x03, 0xfc,
+ 0x03, 0xfc, 0x03, 0xfc, 0x03, 0xfc, 0x03, 0xfc,
+};
+
+static const unsigned char cur_wait[] = {
+ 16, /* size */
+ 9, 1, /* hotspot */
+ /* data */
+ 0x07, 0xf8, 0x07, 0xf8, 0x07, 0xf8, 0x0f, 0xfc,
+ 0x18, 0x86, 0x30, 0x83, 0xe0, 0x81, 0xe1, 0xc1,
+ 0xe1, 0xc1, 0xe0, 0x21, 0x30, 0x13, 0x18, 0x06,
+ 0x0f, 0xfc, 0x07, 0xf8, 0x07, 0xf8, 0x07, 0xf8,
+ /* mask */
+ 0x0f, 0xfc, 0x0f, 0xfc, 0x0f, 0xfc, 0x1f, 0xfe,
+ 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff,
+ 0x1f, 0xfe, 0x0f, 0xfc, 0x0f, 0xfc, 0x0f, 0xfc,
+};
+
+static const unsigned char cur_text[] = {
+ 16, /* size */
+ 8, 8, /* hotspot */
+ /* data */
+ 0x00, 0x00, 0x0f, 0x70, 0x09, 0xc0, 0x00, 0x80,
+ 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
+ 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
+ 0x00, 0x80, 0x01, 0xc0, 0x07, 0x70, 0x00, 0x00,
+ /* mask */
+ 0x0f, 0x78, 0x0f, 0xf8, 0x0f, 0xf8, 0x03, 0xe0,
+ 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0,
+ 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0,
+ 0x03, 0xe0, 0x0f, 0xf8, 0x0f, 0xf8, 0x0f, 0x78,
+};
+
+static const unsigned char cur_crosshair[] = {
+ 16, /* size */
+ 7, 9, /* hotspot */
+ /* data */
+ 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
+ 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0xff, 0x7f,
+ 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
+ 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00,
+ /* mask */
+ 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0,
+ 0x01, 0xc0, 0x01, 0xc0, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0,
+ 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0,
+};
+
+static const unsigned char cur_up_down[] = {
+ 16, /* size */
+ 7, 8, /* hotspot */
+ /* data */
+ 0x00, 0x80, 0x09, 0xc0, 0x03, 0xe0, 0x07, 0xf0,
+ 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40,
+ 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x07, 0xf0,
+ 0x03, 0xe0, 0x01, 0xc0, 0x00, 0x80, 0x00, 0x00,
+ /* mask */
+ 0x01, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f, 0xf8,
+ 0x0f, 0xf8, 0x03, 0xe0, 0x03, 0xe0, 0x03, 0xe0,
+ 0x03, 0xe0, 0x03, 0xe0, 0x0f, 0xf8, 0x0f, 0xf8,
+ 0x07, 0xf0, 0x03, 0xe0, 0x01, 0xc0, 0x00, 0x00,
+};
+
+static const unsigned char cur_left_right[] = {
+ 16, /* size */
+ 7, 8, /* hotspot */
+ /* data */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x08, 0x18, 0x0c, 0x3f, 0xfe, 0x78, 0x0f,
+ 0x3f, 0xfe, 0x18, 0x0c, 0x08, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ /* mask */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x18,
+ 0x1c, 0x1c, 0x3f, 0xfe, 0x7f, 0xff, 0x7f, 0xff,
+ 0x7f, 0xff, 0x3f, 0xfe, 0x1c, 0x1c, 0x0c, 0x18,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+static const unsigned char cur_top_side[] = {
+ 16, /* size */
+ 1, 8, /* hotspot */
+ /* data */
+ 0x00, 0x00, 0xff, 0xfe, 0x3f, 0xfe, 0x00, 0x00,
+ 0x00, 0x80, 0x01, 0xc0, 0x02, 0xa0, 0x04, 0x90,
+ 0x08, 0x88, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
+ 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00,
+ /* mask */
+ 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff,
+ 0x01, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f, 0xf8,
+ 0x1d, 0xdc, 0x19, 0xcc, 0x01, 0xc0, 0x01, 0xc0,
+ 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0,
+};
+
+static const unsigned char cur_bottom_side[] = {
+ 16, /* size */
+ 14, 8, /* hotspot */
+ /* data */
+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80,
+ 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x08, 0x88,
+ 0x04, 0x90, 0x02, 0xa0, 0x01, 0xc0, 0x00, 0x80,
+ 0x00, 0x00, 0x3f, 0xfe, 0x3f, 0xfe, 0x00, 0x00,
+ /* mask */
+ 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0, 0x01, 0xc0,
+ 0x01, 0xc0, 0x01, 0xc0, 0x19, 0xcc, 0x1d, 0xdc,
+ 0x0f, 0xf8, 0x07, 0xf0, 0x03, 0xe0, 0x01, 0xc0,
+ 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xff,
+};
+
+static const unsigned char cur_left_side[] = {
+ 16, /* size */
+ 7, 15, /* hotspot */
+ /* data */
+ 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x01, 0x06,
+ 0x00, 0x86, 0x00, 0x46, 0x00, 0x26, 0x7f, 0xf6,
+ 0x00, 0x26, 0x00, 0x46, 0x00, 0x86, 0x01, 0x06,
+ 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+ /* mask */
+ 0x00, 0x0f, 0x00, 0x0f, 0x03, 0x0f, 0x03, 0x8f,
+ 0x01, 0xcf, 0x00, 0xef, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x00, 0xef, 0x01, 0xcf, 0x03, 0x8f,
+ 0x03, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x00,
+};
+
+static const unsigned char cur_right_side[] = {
+ 16, /* size */
+ 7, 2, /* hotspot */
+ /* data */
+ 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x80,
+ 0x61, 0x00, 0x62, 0x00, 0x64, 0x00, 0x6f, 0xfe,
+ 0x64, 0x00, 0x62, 0x00, 0x61, 0x00, 0x60, 0x80,
+ 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+ /* mask */
+ 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0xc0, 0xf1, 0xc0,
+ 0xf3, 0x80, 0xf7, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xf7, 0x00, 0xf3, 0x80, 0xf1, 0xc0,
+ 0xf0, 0xc0, 0xf0, 0x00, 0xf0, 0x00, 0x00, 0x00,
+};
+
+static const unsigned char cur_top_left[] = {
+ 16, /* size */
+ 1, 15, /* hotspot */
+ /* data */
+ 0x00, 0x00, 0xff, 0xfe, 0x7f, 0xfe, 0x00, 0x06,
+ 0x00, 0x06, 0x00, 0x06, 0x1f, 0xc6, 0x00, 0xc6,
+ 0x01, 0x46, 0x02, 0x46, 0x04, 0x46, 0x08, 0x46,
+ 0x10, 0x46, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00,
+ /* mask */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x0f, 0x3f, 0xef, 0x3f, 0xef, 0x3f, 0xef,
+ 0x03, 0xef, 0x07, 0xef, 0x0e, 0xef, 0x1c, 0xef,
+ 0x38, 0xef, 0x30, 0xef, 0x00, 0x0f, 0x00, 0x0f,
+};
+
+static const unsigned char cur_top_right[] = {
+ 16, /* size */
+ 1, 2, /* hotspot */
+ /* data */
+ 0x00, 0x00, 0xff, 0xfe, 0x7f, 0xfe, 0x60, 0x00,
+ 0x60, 0x00, 0x60, 0x00, 0x63, 0xf8, 0x63, 0x00,
+ 0x62, 0x80, 0x62, 0x40, 0x62, 0x20, 0x62, 0x10,
+ 0x62, 0x08, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00,
+ /* mask */
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xf0, 0x00, 0xf7, 0xfc, 0xf7, 0xfc, 0xf7, 0xfc,
+ 0xf7, 0xc0, 0xf7, 0xe0, 0xf7, 0x70, 0xf7, 0x38,
+ 0xf7, 0x1c, 0xf7, 0x0c, 0xf0, 0x00, 0xf0, 0x00,
+};
+
+static const unsigned char cur_bottom_right[] = {
+ 16, /* size */
+ 14, 2, /* hotspot */
+ /* data */
+ 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x62, 0x08,
+ 0x62, 0x10, 0x62, 0x20, 0x62, 0x40, 0x62, 0x80,
+ 0x63, 0x00, 0x63, 0xf8, 0x60, 0x00, 0x60, 0x00,
+ 0x60, 0x00, 0x7f, 0xfe, 0x7f, 0xfe, 0x00, 0x00,
+ /* mask */
+ 0xf0, 0x00, 0xf0, 0x00, 0xf7, 0x0c, 0xf7, 0x1c,
+ 0xf7, 0x38, 0xf7, 0x70, 0xf7, 0xe0, 0xf7, 0xc0,
+ 0xf7, 0xfc, 0xf7, 0xfc, 0xf7, 0xfc, 0xf0, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+};
+
+static const unsigned char cur_bottom_left[] = {
+ 16, /* size */
+ 14, 15, /* hotspot */
+ /* data */
+ 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x10, 0x46,
+ 0x08, 0x46, 0x04, 0x46, 0x02, 0x46, 0x01, 0x46,
+ 0x00, 0xc6, 0x1f, 0xc6, 0x00, 0x06, 0x00, 0x06,
+ 0x00, 0x06, 0x7f, 0xfe, 0x7f, 0xfe, 0x00, 0x00,
+ /* mask */
+ 0x00, 0x0f, 0x00, 0x0f, 0x30, 0xef, 0x38, 0xef,
+ 0x1c, 0xef, 0x0e, 0xef, 0x07, 0xef, 0x03, 0xef,
+ 0x3f, 0xef, 0x3f, 0xef, 0x3f, 0xef, 0x00, 0x0f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+};
+
+
+#endif /* __GLUT_CURSORS_H__ */
diff --git a/src/glut/directfb/events.c b/src/glut/directfb/events.c
new file mode 100644
index 00000000000..4c474710abe
--- /dev/null
+++ b/src/glut/directfb/events.c
@@ -0,0 +1,485 @@
+/*
+ * Copyright (C) 2006 Claudio Ciccani <klan@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "internal.h"
+
+
+/*****************************************************************************/
+
+static int g_ignore_key_repeat = 0;
+
+/*****************************************************************************/
+
+
+int GLUTAPIENTRY
+glutDeviceGet( GLenum type )
+{
+ switch (type) {
+ case GLUT_HAS_KEYBOARD:
+ return (keyboard != NULL);
+ case GLUT_HAS_MOUSE:
+ return (mouse != NULL);
+ case GLUT_NUM_MOUSE_BUTTONS:
+ if (mouse) {
+ DFBInputDeviceDescription dsc;
+ mouse->GetDescription( mouse, &dsc );
+ return dsc.max_button+1;
+ }
+ break;
+ case GLUT_DEVICE_IGNORE_KEY_REPEAT:
+ return g_ignore_key_repeat;
+ case GLUT_DEVICE_KEY_REPEAT:
+ return (g_ignore_key_repeat) ? GLUT_KEY_REPEAT_OFF
+ : GLUT_KEY_REPEAT_ON;
+ case GLUT_HAS_JOYSTICK:
+ case GLUT_OWNS_JOYSTICK:
+ return (g_game && joystick); /* only available in game mode */
+ case GLUT_JOYSTICK_BUTTONS:
+ if (joystick) {
+ DFBInputDeviceDescription dsc;
+ joystick->GetDescription( joystick, &dsc );
+ return dsc.max_button+1;
+ }
+ break;
+ case GLUT_JOYSTICK_AXES:
+ if (joystick) {
+ DFBInputDeviceDescription dsc;
+ joystick->GetDescription( joystick, &dsc );
+ return dsc.max_axis+1;
+ }
+ break;
+ case GLUT_JOYSTICK_POLL_RATE:
+ if (joystick)
+ return 1; /* hack */
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+
+int GLUTAPIENTRY
+glutGetModifiers( void )
+{
+ if (g_current)
+ return g_current->modifiers;
+ return 0;
+}
+
+
+void GLUTAPIENTRY
+glutIgnoreKeyRepeat( int ignore )
+{
+ g_ignore_key_repeat = ignore;
+}
+
+
+void GLUTAPIENTRY
+glutSetKeyRepeat( int mode )
+{
+ g_ignore_key_repeat = (mode == GLUT_KEY_REPEAT_OFF);
+}
+
+
+void GLUTAPIENTRY
+glutForceJoystickFunc( void )
+{
+ if (g_game && joystick && joystick_func) {
+ joystick_func( g_game->buttons,
+ g_game->jx, g_game->jy, g_game->jz );
+ }
+}
+
+
+static int
+__glutSpecialKey( DFBInputDeviceKeySymbol key )
+{
+ switch (key) {
+ case DIKS_F1:
+ return GLUT_KEY_F1;
+ case DIKS_F2:
+ return GLUT_KEY_F2;
+ case DIKS_F3:
+ return GLUT_KEY_F3;
+ case DIKS_F4:
+ return GLUT_KEY_F4;
+ case DIKS_F5:
+ return GLUT_KEY_F5;
+ case DIKS_F6:
+ return GLUT_KEY_F6;
+ case DIKS_F7:
+ return GLUT_KEY_F7;
+ case DIKS_F8:
+ return GLUT_KEY_F8;
+ case DIKS_F9:
+ return GLUT_KEY_F9;
+ case DIKS_F10:
+ return GLUT_KEY_F10;
+ case DIKS_F11:
+ return GLUT_KEY_F11;
+ case DIKS_F12:
+ return GLUT_KEY_F12;
+ case DIKS_CURSOR_LEFT:
+ return GLUT_KEY_LEFT;
+ case DIKS_CURSOR_UP:
+ return GLUT_KEY_UP;
+ case DIKS_CURSOR_RIGHT:
+ return GLUT_KEY_RIGHT;
+ case DIKS_CURSOR_DOWN:
+ return GLUT_KEY_DOWN;
+ case DIKS_PAGE_UP:
+ return GLUT_KEY_PAGE_UP;
+ case DIKS_PAGE_DOWN:
+ return GLUT_KEY_PAGE_DOWN;
+ case DIKS_HOME:
+ return GLUT_KEY_HOME;
+ case DIKS_END:
+ return GLUT_KEY_END;
+ case DIKS_INSERT:
+ return GLUT_KEY_INSERT;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+
+static int
+__glutButton( DFBInputDeviceButtonIdentifier button )
+{
+ switch (button) {
+ case DIBI_LEFT:
+ return GLUT_LEFT_BUTTON;
+ case DIBI_MIDDLE:
+ return GLUT_MIDDLE_BUTTON;
+ case DIBI_RIGHT:
+ return GLUT_RIGHT_BUTTON;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+
+static int
+__glutModifiers( DFBInputDeviceModifierMask mask )
+{
+ return ((mask & DIMM_SHIFT) ? GLUT_ACTIVE_SHIFT : 0) |
+ ((mask & DIMM_CONTROL) ? GLUT_ACTIVE_CTRL : 0) |
+ ((mask & DIMM_ALT) ? GLUT_ACTIVE_ALT : 0);
+}
+
+
+static void
+__glutWindowEvent( DFBWindowEvent *e, DFBWindowEvent *p )
+{
+ __GlutWindow *window;
+
+ window = __glutFindWindow( e->window_id );
+ if (!window) /* window was destroyed */
+ return;
+
+ switch (e->type) {
+ case DWET_KEYDOWN:
+ window->modifiers = __glutModifiers( e->modifiers );
+ if (g_ignore_key_repeat && p) {
+ if (p->type == DWET_KEYDOWN &&
+ p->window_id == e->window_id &&
+ p->key_symbol == e->key_symbol)
+ break;
+ }
+ if (DFB_KEY_IS_ASCII( e->key_symbol )) {
+ if (keyboard_func) {
+ __glutSetWindow( window );
+ keyboard_func( e->key_symbol, e->x, e->y );
+ }
+ }
+ else {
+ int key = __glutSpecialKey( e->key_symbol );
+ if (key && special_func) {
+ __glutSetWindow( window );
+ special_func( key, e->x, e->y );
+ }
+ }
+ break;
+ case DWET_KEYUP:
+ window->modifiers = __glutModifiers( e->modifiers );
+ if (DFB_KEY_IS_ASCII( e->key_symbol )) {
+ if (keyboard_up_func) {
+ __glutSetWindow( window );
+ keyboard_up_func( e->key_symbol, e->x, e->y );
+ }
+ }
+ else {
+ int key = __glutSpecialKey( e->key_symbol );
+ if (key && special_up_func) {
+ __glutSetWindow( window );
+ special_up_func( key, e->x, e->y );
+ }
+ }
+ break;
+ case DWET_BUTTONDOWN:
+ if (mouse_func) {
+ __glutSetWindow( window );
+ mouse_func( __glutButton( e->button ), GLUT_DOWN, e->x, e->y );
+ }
+ break;
+ case DWET_BUTTONUP:
+ if (mouse_func) {
+ __glutSetWindow( window );
+ mouse_func( __glutButton( e->button ), GLUT_UP, e->x, e->y );
+ }
+ break;
+ case DWET_MOTION:
+ if (e->buttons) {
+ if (motion_func) {
+ __glutSetWindow( window );
+ motion_func( e->cx, e->cy );
+ }
+ }
+ else {
+ if (passive_motion_func) {
+ __glutSetWindow( window );
+ passive_motion_func( e->cx, e->cy );
+ }
+ }
+ break;
+ case DWET_ENTER:
+ if (entry_func) {
+ __glutSetWindow( window );
+ entry_func( GLUT_ENTERED );
+ }
+ break;
+ case DWET_LEAVE:
+ if (entry_func) {
+ __glutSetWindow( window );
+ entry_func( GLUT_LEFT );
+ }
+ break;
+ case DWET_SIZE:
+ window->reshape = GL_TRUE;
+ window->redisplay = GL_TRUE;
+ break;
+ default:
+ break;
+ }
+}
+
+
+static void
+__glutInputEvent( DFBInputEvent *e, DFBInputEvent *p )
+{
+ __glutAssert( g_game != NULL );
+
+ switch (e->type) {
+ case DIET_KEYPRESS:
+ g_game->modifiers = __glutModifiers( e->modifiers );
+ if (g_ignore_key_repeat && p) {
+ if (p->type == DIET_KEYPRESS &&
+ p->key_symbol == e->key_symbol)
+ break;
+ }
+ if (DFB_KEY_IS_ASCII( e->key_symbol )) {
+ if (keyboard_func) {
+ __glutSetWindow( g_game );
+ keyboard_func( e->key_symbol, g_game->cx, g_game->cy );
+ }
+ }
+ else {
+ int key = __glutSpecialKey( e->key_symbol );
+ if (key && special_func) {
+ __glutSetWindow( g_game );
+ special_func( key, g_game->cx, g_game->cy );
+ }
+ }
+ break;
+ case DIET_KEYRELEASE:
+ g_game->modifiers = __glutModifiers( e->modifiers );
+ if (DFB_KEY_IS_ASCII( e->key_symbol )) {
+ if (keyboard_up_func) {
+ __glutSetWindow( g_game );
+ keyboard_up_func( e->key_symbol, g_game->cx, g_game->cy );
+ }
+ }
+ else {
+ int key = __glutSpecialKey( e->key_symbol );
+ if (key && special_up_func) {
+ __glutSetWindow( g_game );
+ special_up_func( key, g_game->cx, g_game->cy );
+ }
+ }
+ break;
+ case DIET_BUTTONPRESS:
+ if (e->device_id == DIDID_JOYSTICK) {
+ g_game->buttons = e->buttons;
+ if (joystick_func) {
+ __glutSetWindow( g_game );
+ joystick_func( g_game->buttons,
+ g_game->jx, g_game->jy, g_game->jz );
+ }
+ }
+ else {
+ if (mouse_func) {
+ __glutSetWindow( g_game );
+ mouse_func( __glutButton( e->button ),
+ GLUT_DOWN, g_game->cx, g_game->cy );
+ }
+ }
+ break;
+ case DIET_BUTTONRELEASE:
+ if (e->device_id == DIDID_JOYSTICK) {
+ g_game->buttons = e->buttons;
+ if (joystick_func) {
+ __glutSetWindow( g_game );
+ joystick_func( g_game->buttons,
+ g_game->jx, g_game->jy, g_game->jz );
+ }
+ }
+ else {
+ if (mouse_func) {
+ __glutSetWindow( g_game );
+ mouse_func( __glutButton( e->button ),
+ GLUT_UP, g_game->cx, g_game->cy );
+ }
+ }
+ break;
+ case DIET_AXISMOTION:
+ if (e->device_id == DIDID_JOYSTICK) {
+ switch (e->axis) {
+ case DIAI_X:
+ if (e->flags & DIEF_AXISABS)
+ g_game->jx = e->axisabs;
+ else if (e->flags & DIEF_AXISREL)
+ g_game->jx += e->axisrel;
+ break;
+ case DIAI_Y:
+ if (e->flags & DIEF_AXISABS)
+ g_game->jy = e->axisabs;
+ else if (e->flags & DIEF_AXISREL)
+ g_game->jy += e->axisrel;
+ break;
+ case DIAI_Z:
+ if (e->flags & DIEF_AXISABS)
+ g_game->jz = e->axisabs;
+ else if (e->flags & DIEF_AXISREL)
+ g_game->jz += e->axisrel;
+ break;
+ default:
+ break;
+ }
+ if (joystick_func) {
+ __glutSetWindow( g_game );
+ joystick_func( g_game->buttons,
+ g_game->jx, g_game->jy, g_game->jz );
+ }
+ }
+ else {
+ switch (e->axis) {
+ case DIAI_X:
+ if (e->flags & DIEF_AXISABS)
+ g_game->cx = e->axisabs;
+ else if (e->flags & DIEF_AXISREL)
+ g_game->cx += e->axisrel;
+ break;
+ case DIAI_Y:
+ if (e->flags & DIEF_AXISABS)
+ g_game->cy = e->axisabs;
+ else if (e->flags & DIEF_AXISREL)
+ g_game->cy += e->axisrel;
+ break;
+ default:
+ return;
+ }
+ if (e->buttons && motion_func) {
+ __glutSetWindow( g_game );
+ motion_func( g_game->cx, g_game->cy );
+ }
+ else if (!e->buttons && passive_motion_func) {
+ __glutSetWindow( g_game );
+ passive_motion_func( g_game->cx, g_game->cy );
+ }
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+
+void GLUTAPIENTRY
+glutMainLoop( void )
+{
+ __glutAssert( events != NULL );
+
+ while (GL_TRUE) {
+ DFBEvent evt, prev;
+
+ g_idle = GL_TRUE;
+
+ __glutHandleTimers();
+ __glutHandleWindows();
+
+ prev.clazz = DFEC_NONE;
+
+ while (events->GetEvent( events, &evt ) == DFB_OK) {
+ g_idle = GL_FALSE;
+
+ switch (evt.clazz) {
+ case DFEC_WINDOW:
+ if (prev.clazz == DFEC_WINDOW)
+ __glutWindowEvent( &evt.window, &prev.window );
+ else
+ __glutWindowEvent( &evt.window, NULL );
+ break;
+ case DFEC_INPUT:
+ if (prev.clazz == DFEC_INPUT)
+ __glutInputEvent( &evt.input, &prev.input );
+ else
+ __glutInputEvent( &evt.input, NULL );
+ break;
+ default:
+ __glutWarning( "unexpected event class %d!\n", evt.clazz );
+ break;
+ }
+
+ prev = evt;
+
+ __glutHandleTimers();
+ }
+
+ if (g_idle) {
+ if (idle_func) {
+ idle_func();
+ }
+ else {
+ __glutSetWindow( NULL );
+ usleep( 500 );
+ }
+ }
+ }
+}
+
diff --git a/src/glut/directfb/ext.c b/src/glut/directfb/ext.c
new file mode 100644
index 00000000000..e37ecf5afad
--- /dev/null
+++ b/src/glut/directfb/ext.c
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2006 Claudio Ciccani <klan@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "internal.h"
+
+
+static const struct {
+ const char *name;
+ const GLUTproc address;
+} glut_functions[] = {
+ { "glutInit", (const GLUTproc) glutInit },
+ { "glutInitDisplayMode", (const GLUTproc) glutInitDisplayMode },
+ { "glutInitDisplayString", (const GLUTproc) glutInitDisplayString },
+ { "glutInitWindowPosition", (const GLUTproc) glutInitWindowPosition },
+ { "glutInitWindowSize", (const GLUTproc) glutInitWindowSize },
+ { "glutMainLoop", (const GLUTproc) glutMainLoop },
+ { "glutCreateWindow", (const GLUTproc) glutCreateWindow },
+ { "glutCreateSubWindow", (const GLUTproc) glutCreateSubWindow },
+ { "glutDestroyWindow", (const GLUTproc) glutDestroyWindow },
+ { "glutPostRedisplay", (const GLUTproc) glutPostRedisplay },
+ { "glutPostWindowRedisplay", (const GLUTproc) glutPostWindowRedisplay },
+ { "glutSwapBuffers", (const GLUTproc) glutSwapBuffers },
+ { "glutGetWindow", (const GLUTproc) glutGetWindow },
+ { "glutSetWindow", (const GLUTproc) glutSetWindow },
+ { "glutSetWindowTitle", (const GLUTproc) glutSetWindowTitle },
+ { "glutSetIconTitle", (const GLUTproc) glutSetIconTitle },
+ { "glutPositionWindow", (const GLUTproc) glutPositionWindow },
+ { "glutReshapeWindow", (const GLUTproc) glutReshapeWindow },
+ { "glutPopWindow", (const GLUTproc) glutPopWindow },
+ { "glutPushWindow", (const GLUTproc) glutPushWindow },
+ { "glutIconifyWindow", (const GLUTproc) glutIconifyWindow },
+ { "glutShowWindow", (const GLUTproc) glutShowWindow },
+ { "glutHideWindow", (const GLUTproc) glutHideWindow },
+ { "glutFullScreen", (const GLUTproc) glutFullScreen },
+ { "glutSetCursor", (const GLUTproc) glutSetCursor },
+ { "glutWarpPointer", (const GLUTproc) glutWarpPointer },
+ { "glutEstablishOverlay", (const GLUTproc) glutEstablishOverlay },
+ { "glutRemoveOverlay", (const GLUTproc) glutRemoveOverlay },
+ { "glutUseLayer", (const GLUTproc) glutUseLayer },
+ { "glutPostOverlayRedisplay", (const GLUTproc) glutPostOverlayRedisplay },
+ { "glutPostWindowOverlayRedisplay", (const GLUTproc) glutPostWindowOverlayRedisplay },
+ { "glutShowOverlay", (const GLUTproc) glutShowOverlay },
+ { "glutHideOverlay", (const GLUTproc) glutHideOverlay },
+ { "glutCreateMenu", (const GLUTproc) glutCreateMenu },
+ { "glutDestroyMenu", (const GLUTproc) glutDestroyMenu },
+ { "glutGetMenu", (const GLUTproc) glutGetMenu },
+ { "glutSetMenu", (const GLUTproc) glutSetMenu },
+ { "glutAddMenuEntry", (const GLUTproc) glutAddMenuEntry },
+ { "glutAddSubMenu", (const GLUTproc) glutAddSubMenu },
+ { "glutChangeToMenuEntry", (const GLUTproc) glutChangeToMenuEntry },
+ { "glutChangeToSubMenu", (const GLUTproc) glutChangeToSubMenu },
+ { "glutRemoveMenuItem", (const GLUTproc) glutRemoveMenuItem },
+ { "glutAttachMenu", (const GLUTproc) glutAttachMenu },
+ { "glutDetachMenu", (const GLUTproc) glutDetachMenu },
+ { "glutDisplayFunc", (const GLUTproc) glutDisplayFunc },
+ { "glutReshapeFunc", (const GLUTproc) glutReshapeFunc },
+ { "glutKeyboardFunc", (const GLUTproc) glutKeyboardFunc },
+ { "glutMouseFunc", (const GLUTproc) glutMouseFunc },
+ { "glutMotionFunc", (const GLUTproc) glutMotionFunc },
+ { "glutPassiveMotionFunc", (const GLUTproc) glutPassiveMotionFunc },
+ { "glutEntryFunc", (const GLUTproc) glutEntryFunc },
+ { "glutVisibilityFunc", (const GLUTproc) glutVisibilityFunc },
+ { "glutIdleFunc", (const GLUTproc) glutIdleFunc },
+ { "glutTimerFunc", (const GLUTproc) glutTimerFunc },
+ { "glutMenuStateFunc", (const GLUTproc) glutMenuStateFunc },
+ { "glutSpecialFunc", (const GLUTproc) glutSpecialFunc },
+ { "glutSpaceballMotionFunc", (const GLUTproc) glutSpaceballMotionFunc },
+ { "glutSpaceballRotateFunc", (const GLUTproc) glutSpaceballRotateFunc },
+ { "glutSpaceballButtonFunc", (const GLUTproc) glutSpaceballButtonFunc },
+ { "glutButtonBoxFunc", (const GLUTproc) glutButtonBoxFunc },
+ { "glutDialsFunc", (const GLUTproc) glutDialsFunc },
+ { "glutTabletMotionFunc", (const GLUTproc) glutTabletMotionFunc },
+ { "glutTabletButtonFunc", (const GLUTproc) glutTabletButtonFunc },
+ { "glutMenuStatusFunc", (const GLUTproc) glutMenuStatusFunc },
+ { "glutOverlayDisplayFunc", (const GLUTproc) glutOverlayDisplayFunc },
+ { "glutWindowStatusFunc", (const GLUTproc) glutWindowStatusFunc },
+ { "glutKeyboardUpFunc", (const GLUTproc) glutKeyboardUpFunc },
+ { "glutSpecialUpFunc", (const GLUTproc) glutSpecialUpFunc },
+ { "glutJoystickFunc", (const GLUTproc) glutJoystickFunc },
+ { "glutSetColor", (const GLUTproc) glutSetColor },
+ { "glutGetColor", (const GLUTproc) glutGetColor },
+ { "glutCopyColormap", (const GLUTproc) glutCopyColormap },
+ { "glutGet", (const GLUTproc) glutGet },
+ { "glutDeviceGet", (const GLUTproc) glutDeviceGet },
+ { "glutExtensionSupported", (const GLUTproc) glutExtensionSupported },
+ { "glutGetModifiers", (const GLUTproc) glutGetModifiers },
+ { "glutLayerGet", (const GLUTproc) glutLayerGet },
+ { "glutGetProcAddress", (const GLUTproc) glutGetProcAddress },
+ { "glutBitmapCharacter", (const GLUTproc) glutBitmapCharacter },
+ { "glutBitmapWidth", (const GLUTproc) glutBitmapWidth },
+ { "glutStrokeCharacter", (const GLUTproc) glutStrokeCharacter },
+ { "glutStrokeWidth", (const GLUTproc) glutStrokeWidth },
+ { "glutBitmapLength", (const GLUTproc) glutBitmapLength },
+ { "glutStrokeLength", (const GLUTproc) glutStrokeLength },
+ { "glutWireSphere", (const GLUTproc) glutWireSphere },
+ { "glutSolidSphere", (const GLUTproc) glutSolidSphere },
+ { "glutWireCone", (const GLUTproc) glutWireCone },
+ { "glutSolidCone", (const GLUTproc) glutSolidCone },
+ { "glutWireCube", (const GLUTproc) glutWireCube },
+ { "glutSolidCube", (const GLUTproc) glutSolidCube },
+ { "glutWireTorus", (const GLUTproc) glutWireTorus },
+ { "glutSolidTorus", (const GLUTproc) glutSolidTorus },
+ { "glutWireDodecahedron", (const GLUTproc) glutWireDodecahedron },
+ { "glutSolidDodecahedron", (const GLUTproc) glutSolidDodecahedron },
+ { "glutWireTeapot", (const GLUTproc) glutWireTeapot },
+ { "glutSolidTeapot", (const GLUTproc) glutSolidTeapot },
+ { "glutWireOctahedron", (const GLUTproc) glutWireOctahedron },
+ { "glutSolidOctahedron", (const GLUTproc) glutSolidOctahedron },
+ { "glutWireTetrahedron", (const GLUTproc) glutWireTetrahedron },
+ { "glutSolidTetrahedron", (const GLUTproc) glutSolidTetrahedron },
+ { "glutWireIcosahedron", (const GLUTproc) glutWireIcosahedron },
+ { "glutSolidIcosahedron", (const GLUTproc) glutSolidIcosahedron },
+// { "glutVideoResizeGet", (const GLUTproc) glutVideoResizeGet },
+// { "glutSetupVideoResizing", (const GLUTproc) glutSetupVideoResizing },
+// { "glutStopVideoResizing", (const GLUTproc) glutStopVideoResizing },
+// { "glutVideoResize", (const GLUTproc) glutVideoResize },
+// { "glutVideoPan", (const GLUTproc) glutVideoPan },
+ { "glutReportErrors", (const GLUTproc) glutReportErrors },
+ { "glutIgnoreKeyRepeat", (const GLUTproc) glutIgnoreKeyRepeat },
+ { "glutSetKeyRepeat", (const GLUTproc) glutSetKeyRepeat },
+ { "glutForceJoystickFunc", (const GLUTproc) glutForceJoystickFunc },
+ { "glutGameModeString", (const GLUTproc) glutGameModeString },
+ { "glutEnterGameMode", (const GLUTproc) glutEnterGameMode },
+ { "glutLeaveGameMode", (const GLUTproc) glutLeaveGameMode },
+ { "glutGameModeGet", (const GLUTproc) glutGameModeGet },
+};
+
+
+GLUTproc GLUTAPIENTRY
+glutGetProcAddress( const char *name )
+{
+ int i;
+
+ for (i = 0; i < sizeof(glut_functions)/sizeof(glut_functions[0]); i++) {
+ if (!strcmp( name, glut_functions[i].name ))
+ return glut_functions[i].address;
+ }
+
+#if DIRECTFBGL_INTERFACE_VERSION >= 1
+ if (g_current) {
+ void *address = NULL;
+ g_current->gl->GetProcAddress( g_current->gl, name, &address );
+ return address;
+ }
+#endif
+ return NULL;
+}
+
+
+int GLUTAPIENTRY
+glutExtensionSupported( const char *name )
+{
+ GLubyte *extensions;
+ int length;
+
+ if (!name || !*name)
+ return 0;
+
+ length = strlen( name );
+ extensions = (GLubyte*) glGetString( GL_EXTENSIONS );
+
+ while (extensions && *extensions) {
+ GLubyte *next;
+
+ next = strchr( extensions, ' ' );
+ if (next) {
+ if (length == (int)(next - extensions)) {
+ if (!strncmp( extensions, name, length ))
+ return 1;
+ }
+ extensions = next+1;
+ }
+ else {
+ if (!strcmp( extensions, name ))
+ return 1;
+ break;
+ }
+ }
+
+ return 0;
+}
+
diff --git a/src/glut/directfb/font.c b/src/glut/directfb/font.c
new file mode 100644
index 00000000000..0139cddbecd
--- /dev/null
+++ b/src/glut/directfb/font.c
@@ -0,0 +1,213 @@
+/* Copyright (c) Mark J. Kilgard, 1994, 1998.
+
+ This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include "internal.h"
+#include "font.h"
+
+
+#if defined(_WIN32) || defined (GLUT_IMPORT_LIB)
+
+static inline void*
+__glutFont( void *font )
+{
+ switch((long)font) {
+ case (long)GLUT_STROKE_ROMAN:
+ return &glutStrokeRoman;
+ case (long)GLUT_STROKE_MONO_ROMAN:
+ return &glutStrokeMonoRoman;
+ case (long)GLUT_BITMAP_9_BY_15:
+ return &glutBitmap9By15;
+ case (long)GLUT_BITMAP_8_BY_13:
+ return &glutBitmap8By13;
+ case (long)GLUT_BITMAP_TIMES_ROMAN_10:
+ return &glutBitmapTimesRoman10;
+ case (long)GLUT_BITMAP_TIMES_ROMAN_24:
+ return &glutBitmapTimesRoman24;
+ case (long)GLUT_BITMAP_HELVETICA_10:
+ return &glutBitmapHelvetica10;
+ case (long)GLUT_BITMAP_HELVETICA_12:
+ return &glutBitmapHelvetica12;
+ case (long)GLUT_BITMAP_HELVETICA_18:
+ return &glutBitmapHelvetica18;
+ }
+
+ return NULL;
+}
+
+#else
+
+static inline void*
+__glutFont( void *font )
+{
+ return font;
+}
+
+#endif
+
+
+void GLUTAPIENTRY
+glutBitmapCharacter( GLUTbitmapFont font, int c )
+{
+ const BitmapCharRec *ch;
+ BitmapFontPtr fontinfo;
+ GLint swapbytes, lsbfirst, rowlength;
+ GLint skiprows, skippixels, alignment;
+
+ fontinfo = (BitmapFontPtr) __glutFont( font );
+
+ if (!fontinfo || c < fontinfo->first ||
+ c >= fontinfo->first + fontinfo->num_chars)
+ return;
+
+ ch = fontinfo->ch[c - fontinfo->first];
+ if (ch) {
+ /* Save current modes. */
+ glGetIntegerv(GL_UNPACK_SWAP_BYTES, &swapbytes);
+ glGetIntegerv(GL_UNPACK_LSB_FIRST, &lsbfirst);
+ glGetIntegerv(GL_UNPACK_ROW_LENGTH, &rowlength);
+ glGetIntegerv(GL_UNPACK_SKIP_ROWS, &skiprows);
+ glGetIntegerv(GL_UNPACK_SKIP_PIXELS, &skippixels);
+ glGetIntegerv(GL_UNPACK_ALIGNMENT, &alignment);
+ /* Little endian machines (DEC Alpha for example) could
+ benefit from setting GL_UNPACK_LSB_FIRST to GL_TRUE
+ instead of GL_FALSE, but this would require changing the
+ generated bitmaps too. */
+ glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
+ glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+ glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
+ glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glBitmap(ch->width, ch->height, ch->xorig, ch->yorig,
+ ch->advance, 0, ch->bitmap);
+ /* Restore saved modes. */
+ glPixelStorei(GL_UNPACK_SWAP_BYTES, swapbytes);
+ glPixelStorei(GL_UNPACK_LSB_FIRST, lsbfirst);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, rowlength);
+ glPixelStorei(GL_UNPACK_SKIP_ROWS, skiprows);
+ glPixelStorei(GL_UNPACK_SKIP_PIXELS, skippixels);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);
+ }
+}
+
+
+int GLUTAPIENTRY
+glutBitmapWidth( GLUTbitmapFont font, int c )
+{
+ BitmapFontPtr fontinfo;
+ const BitmapCharRec *ch;
+
+ fontinfo = (BitmapFontPtr) __glutFont( font );
+
+ if (!fontinfo || c < fontinfo->first ||
+ c >= fontinfo->first + fontinfo->num_chars)
+ return 0;
+
+ ch = fontinfo->ch[c - fontinfo->first];
+ if (ch)
+ return ch->advance;
+
+ return 0;
+}
+
+
+int GLUTAPIENTRY
+glutBitmapLength( GLUTbitmapFont font, const unsigned char *string )
+{
+ int c, length;
+ BitmapFontPtr fontinfo;
+ const BitmapCharRec *ch;
+
+ fontinfo = (BitmapFontPtr) __glutFont( font );
+ if (!fontinfo)
+ return 0;
+
+ for (length = 0; *string != '\0'; string++) {
+ c = *string;
+ if (c >= fontinfo->first &&
+ c < fontinfo->first + fontinfo->num_chars) {
+ ch = fontinfo->ch[c - fontinfo->first];
+ if (ch)
+ length += ch->advance;
+ }
+ }
+
+ return length;
+}
+
+
+void GLUTAPIENTRY
+glutStrokeCharacter( GLUTstrokeFont font, int c )
+{
+ const StrokeCharRec *ch;
+ const StrokeRec *stroke;
+ const CoordRec *coord;
+ StrokeFontPtr fontinfo;
+ int i, j;
+
+ fontinfo = (StrokeFontPtr) __glutFont( font );
+
+ if (!fontinfo || c < 0 || c >= fontinfo->num_chars)
+ return;
+
+ ch = &(fontinfo->ch[c]);
+ if (ch) {
+ for (i = ch->num_strokes, stroke = ch->stroke;
+ i > 0; i--, stroke++) {
+ glBegin(GL_LINE_STRIP);
+ for (j = stroke->num_coords, coord = stroke->coord;
+ j > 0; j--, coord++) {
+ glVertex2f(coord->x, coord->y);
+ }
+ glEnd();
+ }
+ glTranslatef(ch->right, 0.0, 0.0);
+ }
+}
+
+
+int GLUTAPIENTRY
+glutStrokeWidth( GLUTstrokeFont font, int c )
+{
+ StrokeFontPtr fontinfo;
+ const StrokeCharRec *ch;
+
+ fontinfo = (StrokeFontPtr) __glutFont( font );
+
+ if (!fontinfo || c < 0 || c >= fontinfo->num_chars)
+ return 0;
+
+ ch = &(fontinfo->ch[c]);
+ if (ch)
+ return ch->right;
+
+ return 0;
+}
+
+
+int GLUTAPIENTRY
+glutStrokeLength( GLUTstrokeFont font, const unsigned char *string )
+{
+ int c, length;
+ StrokeFontPtr fontinfo;
+ const StrokeCharRec *ch;
+
+ fontinfo = (StrokeFontPtr) __glutFont( font );
+ if (!fontinfo)
+ return 0;
+
+ for (length = 0; *string != '\0'; string++) {
+ c = *string;
+ if (c >= 0 && c < fontinfo->num_chars) {
+ ch = &(fontinfo->ch[c]);
+ if (ch)
+ length += ch->right;
+ }
+ }
+
+ return length;
+}
+
diff --git a/src/glut/directfb/font.h b/src/glut/directfb/font.h
new file mode 100644
index 00000000000..b1e76838a0f
--- /dev/null
+++ b/src/glut/directfb/font.h
@@ -0,0 +1,58 @@
+/* Copyright (c) Mark J. Kilgard, 1994, 1998. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#ifndef __GLUT_FONT_H__
+#define __GLUT_FONT_H__
+
+
+typedef struct {
+ const GLsizei width;
+ const GLsizei height;
+ const GLfloat xorig;
+ const GLfloat yorig;
+ const GLfloat advance;
+ const GLubyte *bitmap;
+} BitmapCharRec, *BitmapCharPtr;
+
+typedef struct {
+ const char *name;
+ const int num_chars;
+ const int first;
+ const BitmapCharRec * const *ch;
+} BitmapFontRec, *BitmapFontPtr;
+
+typedef void *GLUTbitmapFont;
+
+
+typedef struct {
+ float x;
+ float y;
+} CoordRec, *CoordPtr;
+
+typedef struct {
+ int num_coords;
+ const CoordRec *coord;
+} StrokeRec, *StrokePtr;
+
+typedef struct {
+ int num_strokes;
+ const StrokeRec *stroke;
+ float center;
+ float right;
+} StrokeCharRec, *StrokeCharPtr;
+
+typedef struct {
+ const char *name;
+ int num_chars;
+ const StrokeCharRec *ch;
+ float top;
+ float bottom;
+} StrokeFontRec, *StrokeFontPtr;
+
+typedef void *GLUTstrokeFont;
+
+
+#endif /* __GLUT_FONT_H__ */
diff --git a/src/glut/directfb/game.c b/src/glut/directfb/game.c
new file mode 100644
index 00000000000..4c027a68f65
--- /dev/null
+++ b/src/glut/directfb/game.c
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2006 Claudio Ciccani <klan@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "internal.h"
+
+
+/*****************************************************************************/
+
+static int g_display_changed = 0;
+
+/*****************************************************************************/
+
+
+void GLUTAPIENTRY
+glutGameModeString( const char *string )
+{
+ int x, y, bpp;
+ char *tmp;
+
+ if (!string)
+ return;
+
+ tmp = strchr( string, 'x' );
+ if (tmp) {
+ x = strtol( string, NULL, 10 );
+ y = strtol( tmp+1, NULL, 10 );
+
+ if (x > 0 && y > 0) {
+ g_width = x;
+ g_height = y;
+ }
+ }
+
+ tmp = strchr( string, ':' );
+ if (tmp) {
+ bpp = strtol( tmp+1, NULL, 10 );
+
+ if (bpp > 0)
+ g_bpp = bpp;
+ }
+}
+
+
+int GLUTAPIENTRY
+glutEnterGameMode( void )
+{
+ DFBDisplayLayerConfig prev, cur;
+
+ glutInit( NULL, NULL );
+
+ primary->GetConfiguration( primary, &prev );
+ primary->SetCooperativeLevel( primary, DLSCL_EXCLUSIVE );
+
+ if (g_game)
+ __glutDestroyWindow( g_game );
+
+ g_game = __glutCreateWindow( GL_TRUE );
+ if (!g_game)
+ return 0;
+
+ __glutSetWindow( g_game );
+ g_game->cursor = GLUT_CURSOR_NONE;
+
+ primary->GetConfiguration( primary, &cur );
+ g_display_changed = (cur.width != prev.width ||
+ cur.height != prev.height ||
+ cur.pixelformat != prev.pixelformat);
+
+ return g_game->id;
+}
+
+
+void GLUTAPIENTRY
+glutLeaveGameMode( void )
+{
+ if (g_game)
+ __glutDestroyWindow( g_game );
+
+ primary->SetCooperativeLevel( primary, DLSCL_ADMINISTRATIVE );
+}
+
+
+int GLUTAPIENTRY
+glutGameModeGet( GLenum type )
+{
+ switch (type) {
+ case GLUT_GAME_MODE_ACTIVE:
+ return (g_game != NULL);
+ case GLUT_GAME_MODE_POSSIBLE:
+ if (primary) {
+ DFBDisplayLayerConfig c;
+ c.flags = DLCONF_WIDTH | DLCONF_HEIGHT;
+ c.width = g_width;
+ c.height = g_height;
+ /* XXX: bpp */
+ if (primary->TestConfiguration( primary, &c, 0 ) == DFB_OK)
+ return 1;
+ }
+ break;
+ case GLUT_GAME_MODE_WIDTH:
+ if (g_game) {
+ int w;
+ g_game->surface->GetSize( g_game->surface, &w, 0 );
+ return w;
+ }
+ break;
+ case GLUT_GAME_MODE_HEIGHT:
+ if (g_game) {
+ int h;
+ g_game->surface->GetSize( g_game->surface, 0, &h );
+ return h;
+ }
+ break;
+ case GLUT_GAME_MODE_PIXEL_DEPTH:
+ if (g_game) {
+ DFBSurfacePixelFormat f;
+ g_game->surface->GetPixelFormat( g_game->surface, &f );
+ return DFB_COLOR_BITS_PER_PIXEL( f );
+ }
+ break;
+ case GLUT_GAME_MODE_REFRESH_RATE:
+ return 60; /* assume 60hz */
+ case GLUT_GAME_MODE_DISPLAY_CHANGED:
+ return g_display_changed;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+
+
diff --git a/src/glut/directfb/globals.c b/src/glut/directfb/globals.c
new file mode 100644
index 00000000000..2a5291137e2
--- /dev/null
+++ b/src/glut/directfb/globals.c
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2006 Claudio Ciccani <klan@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "internal.h"
+
+IDirectFB *dfb = NULL;
+IDirectFBDisplayLayer *primary = NULL;
+IDirectFBEventBuffer *events = NULL;
+IDirectFBInputDevice *keyboard = NULL;
+IDirectFBInputDevice *mouse = NULL;
+IDirectFBInputDevice *joystick = NULL;
+
+GLenum g_display_mode = 0;
+GLuint g_width = DEFAULT_WIDTH;
+GLuint g_height = DEFAULT_HEIGHT;
+GLint g_xpos = 0;
+GLint g_ypos = 0;
+GLint g_bpp = 0;
+GLboolean g_idle = GL_TRUE;
+__GlutWindow *g_current = NULL;
+__GlutWindow *g_game = NULL;
+
+
+void (GLUTCALLBACK *display_func) (void) = 0;
+void (GLUTCALLBACK *reshape_func) (int width, int height) = 0;
+void (GLUTCALLBACK *keyboard_func) (unsigned char key, int x, int y) = 0;
+void (GLUTCALLBACK *mouse_func) (int button, int state, int x, int y) = 0;
+void (GLUTCALLBACK *motion_func) (int x, int y) = 0;
+void (GLUTCALLBACK *passive_motion_func) (int x, int y) = 0;
+void (GLUTCALLBACK *entry_func) (int state) = 0;
+void (GLUTCALLBACK *visibility_func) (int state) = 0;
+void (GLUTCALLBACK *idle_func) (void) = 0;
+void (GLUTCALLBACK *menu_state_func) (int state) = 0;
+void (GLUTCALLBACK *special_func) (int key, int x, int y) = 0;
+void (GLUTCALLBACK *spaceball_motion_func) (int x, int y, int z) = 0;
+void (GLUTCALLBACK *spaceball_rotate_func) (int x, int y, int z) = 0;
+void (GLUTCALLBACK *spaceball_button_func) (int button, int state) = 0;
+void (GLUTCALLBACK *button_box_func) (int button, int state) = 0;
+void (GLUTCALLBACK *dials_func) (int dial, int value) = 0;
+void (GLUTCALLBACK *tablet_motion_func) (int x, int y) = 0;
+void (GLUTCALLBACK *tabled_button_func) (int button, int state, int x, int y) = 0;
+void (GLUTCALLBACK *menu_status_func) (int status, int x, int y) = 0;
+void (GLUTCALLBACK *overlay_display_func) (void) = 0;
+void (GLUTCALLBACK *window_status_func) (int state) = 0;
+void (GLUTCALLBACK *keyboard_up_func) (unsigned char key, int x, int y) = 0;
+void (GLUTCALLBACK *special_up_func) (int key, int x, int y) = 0;
+void (GLUTCALLBACK *joystick_func) (unsigned int buttons, int x, int y, int z) = 0;
diff --git a/src/glut/directfb/init.c b/src/glut/directfb/init.c
new file mode 100644
index 00000000000..ba1a49adf2c
--- /dev/null
+++ b/src/glut/directfb/init.c
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2006 Claudio Ciccani <klan@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "internal.h"
+
+
+static void
+__glutExit( void )
+{
+ __glutFreeTimers();
+ __glutDestroyWindows();
+
+ if (events) {
+ events->Release( events );
+ events = NULL;
+ }
+
+ if (joystick) {
+ joystick->Release( joystick );
+ joystick = NULL;
+ }
+
+ if (mouse) {
+ mouse->Release( mouse );
+ mouse = NULL;
+ }
+
+ if (keyboard) {
+ keyboard->Release( keyboard );
+ keyboard = NULL;
+ }
+
+ if (primary) {
+ primary->Release( primary );
+ primary = NULL;
+ }
+
+ if (dfb) {
+ dfb->Release( dfb );
+ dfb = NULL;
+ }
+}
+
+
+void GLUTAPIENTRY
+glutInit( int *argcp, char **argv )
+{
+ DFBResult ret;
+
+ if (dfb)
+ return;
+
+ glutGet( GLUT_ELAPSED_TIME );
+
+ ret = DirectFBInit( argcp, argv ? &argv : NULL );
+ if (ret)
+ DirectFBErrorFatal( "DirectFBInit()", ret );
+
+ ret = DirectFBCreate( &dfb );
+ if (ret)
+ DirectFBErrorFatal( "DirectFBCreate()", ret );
+
+ ret = dfb->GetDisplayLayer( dfb, DLID_PRIMARY, &primary );
+ if (ret)
+ DirectFBErrorFatal( "IDirectFB::GetDisplayLayer()", ret );
+
+ ret = dfb->CreateEventBuffer( dfb, &events );
+ if (ret)
+ DirectFBErrorFatal( "IDirectFB::CreateEventBuffer()", ret );
+
+ dfb->GetInputDevice( dfb, DIDID_KEYBOARD, &keyboard );
+ dfb->GetInputDevice( dfb, DIDID_MOUSE, &mouse );
+ dfb->GetInputDevice( dfb, DIDID_JOYSTICK, &joystick );
+
+ primary->SetCooperativeLevel( primary, DLSCL_ADMINISTRATIVE );
+
+ atexit( __glutExit );
+}
+
+
+void GLUTAPIENTRY
+glutInitDisplayMode( unsigned int mode )
+{
+ g_display_mode = mode;
+}
+
+
+void GLUTAPIENTRY
+glutInitWindowPosition( int x, int y )
+{
+ g_xpos = x;
+ g_ypos = y;
+}
+
+
+void GLUTAPIENTRY
+glutInitWindowSize( int width, int height )
+{
+ g_width = width;
+ g_height = height;
+}
+
+
+void GLUTAPIENTRY
+glutInitDisplayString( const char *string )
+{
+}
+
diff --git a/src/glut/directfb/internal.h b/src/glut/directfb/internal.h
new file mode 100644
index 00000000000..bc3e20e93e7
--- /dev/null
+++ b/src/glut/directfb/internal.h
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2006 Claudio Ciccani <klan@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#ifndef __GLUT_INTERNAL_H__
+#define __GLUT_INTERNAL_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <directfb.h>
+#include <directfb_version.h>
+
+#include <directfbgl.h>
+
+#include "GL/glut.h"
+
+
+#define VERSION_CODE( M, m, r ) (((M) << 16) | ((m) << 8) | ((r)))
+
+#define DIRECTFB_VERSION_CODE VERSION_CODE( DIRECTFB_MAJOR_VERSION, \
+ DIRECTFB_MINOR_VERSION, \
+ DIRECTFB_MICRO_VERSION )
+
+
+#define DEFAULT_WIDTH 640
+#define DEFAULT_HEIGHT 480
+
+/*
+ * Window request flags
+ */
+#define WINDOW_REQUEST_POSITION 0x00000001
+#define WINDOW_REQUEST_RESIZE 0x00000002
+#define WINDOW_REQUEST_RESTACK 0x00000004
+#define WINDOW_REQUEST_SHOW 0x00000008
+#define WINDOW_REQUEST_HIDE 0x00000010
+#define WINDOW_REQUEST_DESTROY 0x00000020
+
+/*
+ * GLUT Window implementation
+ */
+typedef struct __GlutWindow_s {
+ int id;
+ DFBWindowID wid;
+
+ IDirectFBWindow *window; /* NULL = fullscreen (game mode) */
+ IDirectFBSurface *surface;
+ IDirectFBGL *gl;
+
+ /* cursor position in fullscreen mode */
+ int cx;
+ int cy;
+ /* joystick position */
+ int jx;
+ int jy;
+ int jz;
+ /* pressed modifiers */
+ int modifiers;
+ /* pressed buttons */
+ int buttons;
+ /* current cursor shape */
+ int cursor;
+
+ struct {
+ int flags;
+ int x;
+ int y;
+ int w;
+ int h;
+ int z;
+ } req;
+
+ GLboolean visible;
+ GLboolean redisplay;
+ GLboolean reshape;
+ GLboolean visibility;
+
+ struct __GlutWindow_s *next;
+ struct __GlutWindow_s *prev;
+} __GlutWindow;
+
+
+/* Global Vars */
+extern IDirectFB *dfb;
+extern IDirectFBDisplayLayer *primary;
+extern IDirectFBEventBuffer *events;
+extern IDirectFBInputDevice *keyboard;
+extern IDirectFBInputDevice *mouse;
+extern IDirectFBInputDevice *joystick;
+
+extern GLenum g_display_mode;
+extern GLuint g_width;
+extern GLuint g_height;
+extern GLint g_xpos;
+extern GLint g_ypos;
+extern GLint g_bpp;
+extern GLboolean g_idle;
+extern __GlutWindow *g_current;
+extern __GlutWindow *g_game;
+
+
+/* Global Funcs */
+/* window.c */
+extern __GlutWindow* __glutCreateWindow( GLboolean fullscreen );
+extern __GlutWindow* __glutFindWindow( DFBWindowID id );
+extern void __glutSetWindow( __GlutWindow *window );
+extern void __glutHandleWindows( void );
+extern void __glutDestroyWindow( __GlutWindow *window );
+extern void __glutDestroyWindows( void );
+/* callback.c */
+extern void __glutHandleTimers( void );
+extern void __glutFreeTimers( void );
+
+
+/* Global Callbacks */
+extern void (GLUTCALLBACK *display_func) (void);
+extern void (GLUTCALLBACK *reshape_func) (int width, int height);
+extern void (GLUTCALLBACK *keyboard_func) (unsigned char key, int x, int y);
+extern void (GLUTCALLBACK *mouse_func) (int button, int state, int x, int y);
+extern void (GLUTCALLBACK *motion_func) (int x, int y);
+extern void (GLUTCALLBACK *passive_motion_func) (int x, int y);
+extern void (GLUTCALLBACK *entry_func) (int state);
+extern void (GLUTCALLBACK *visibility_func) (int state);
+extern void (GLUTCALLBACK *idle_func) (void);
+extern void (GLUTCALLBACK *menu_state_func) (int state);
+extern void (GLUTCALLBACK *special_func) (int key, int x, int y);
+extern void (GLUTCALLBACK *spaceball_motion_func) (int x, int y, int z);
+extern void (GLUTCALLBACK *spaceball_rotate_func) (int x, int y, int z);
+extern void (GLUTCALLBACK *spaceball_button_func) (int button, int state);
+extern void (GLUTCALLBACK *button_box_func) (int button, int state);
+extern void (GLUTCALLBACK *dials_func) (int dial, int value);
+extern void (GLUTCALLBACK *tablet_motion_func) (int x, int y);
+extern void (GLUTCALLBACK *tabled_button_func) (int button, int state, int x, int y);
+extern void (GLUTCALLBACK *menu_status_func) (int status, int x, int y);
+extern void (GLUTCALLBACK *overlay_display_func) (void);
+extern void (GLUTCALLBACK *window_status_func) (int state);
+extern void (GLUTCALLBACK *keyboard_up_func) (unsigned char key, int x, int y);
+extern void (GLUTCALLBACK *special_up_func) (int key, int x, int y);
+extern void (GLUTCALLBACK *joystick_func) (unsigned int buttons, int x, int y, int z);
+
+
+#ifdef DEBUG
+# define __glutAssert( exp ) {\
+ if (!(exp)) {\
+ fprintf( stderr, "(!!) *** Assertion [%s] failed in %s() ***\n",\
+ #exp, __FUNCTION__ );
+ fflush( stderr );\
+ exit( -1 );\
+ }\
+ }
+#else
+# define __glutAssert( exp )
+#endif
+
+#define __glutWarning( format, ... ) {\
+ fprintf( stderr, "(!) GLUT: " format "!\n", ## __VA_ARGS__ );\
+ fflush( stderr );\
+}
+
+#define __glutFatalError( format, ... ) {\
+ fprintf( stderr, "(!) GLUT: " format "!\n", ## __VA_ARGS__ );\
+ fprintf( stderr, "\t-> from %s() at line %d\n", __FUNCTION__, __LINE__ );\
+ fflush( stderr );\
+ exit( -1 );\
+}
+
+
+#endif /* __GLUT_INTERNAL_H__ */
+
diff --git a/src/glut/directfb/menu.c b/src/glut/directfb/menu.c
new file mode 100644
index 00000000000..400e966bbbe
--- /dev/null
+++ b/src/glut/directfb/menu.c
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2006 Claudio Ciccani <klan@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "internal.h"
+
+
+int GLUTAPIENTRY
+glutCreateMenu( void (GLUTCALLBACK *func) (int) )
+{
+ return 0;
+}
+
+void GLUTAPIENTRY
+glutDestroyMenu( int menu )
+{
+}
+
+
+int GLUTAPIENTRY
+glutGetMenu( void )
+{
+ return 0;
+}
+
+
+void GLUTAPIENTRY
+glutSetMenu( int menu )
+{
+}
+
+
+void GLUTAPIENTRY
+glutAddMenuEntry( const char *label, int value )
+{
+}
+
+
+void GLUTAPIENTRY
+glutAddSubMenu( const char *label, int submenu )
+{
+}
+
+
+void GLUTAPIENTRY
+glutChangeToMenuEntry( int item, const char *label, int value )
+{
+}
+
+
+void GLUTAPIENTRY
+glutChangeToSubMenu( int item, const char *label, int submenu )
+{
+}
+
+
+void GLUTAPIENTRY
+glutRemoveMenuItem( int item )
+{
+}
+
+
+void GLUTAPIENTRY
+glutAttachMenu( int button )
+{
+}
+
+
+void GLUTAPIENTRY
+glutDetachMenu( int button )
+{
+}
diff --git a/src/glut/directfb/models.c b/src/glut/directfb/models.c
new file mode 100644
index 00000000000..d96a8f50776
--- /dev/null
+++ b/src/glut/directfb/models.c
@@ -0,0 +1,599 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1997. */
+
+/**
+(c) Copyright 1993, Silicon Graphics, Inc.
+
+ALL RIGHTS RESERVED
+
+Permission to use, copy, modify, and distribute this software
+for any purpose and without fee is hereby granted, provided
+that the above copyright notice appear in all copies and that
+both the copyright notice and this permission notice appear in
+supporting documentation, and that the name of Silicon
+Graphics, Inc. not be used in advertising or publicity
+pertaining to distribution of the software without specific,
+written prior permission.
+
+THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU
+"AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR
+OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO
+EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE
+ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
+INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,
+SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR
+NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY
+OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+US Government Users Restricted Rights
+
+Use, duplication, or disclosure by the Government is subject to
+restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+(c)(1)(ii) of the Rights in Technical Data and Computer
+Software clause at DFARS 252.227-7013 and/or in similar or
+successor clauses in the FAR or the DOD or NASA FAR
+Supplement. Unpublished-- rights reserved under the copyright
+laws of the United States. Contractor/manufacturer is Silicon
+Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA
+94039-7311.
+
+OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+*/
+
+#include <math.h>
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+#include "internal.h"
+
+/* Some <math.h> files do not define M_PI... */
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+static GLUquadricObj *quadObj;
+
+#define QUAD_OBJ_INIT() { if(!quadObj) initQuadObj(); }
+
+static void
+initQuadObj(void)
+{
+ quadObj = gluNewQuadric();
+ if (!quadObj)
+ __glutFatalError("out of memory");
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutWireSphere(GLdouble radius, GLint slices, GLint stacks)
+{
+ QUAD_OBJ_INIT();
+ gluQuadricDrawStyle(quadObj, GLU_LINE);
+ gluQuadricNormals(quadObj, GLU_SMOOTH);
+ /* If we ever changed/used the texture or orientation state
+ of quadObj, we'd need to change it to the defaults here
+ with gluQuadricTexture and/or gluQuadricOrientation. */
+ gluSphere(quadObj, radius, slices, stacks);
+}
+
+void GLUTAPIENTRY
+glutSolidSphere(GLdouble radius, GLint slices, GLint stacks)
+{
+ QUAD_OBJ_INIT();
+ gluQuadricDrawStyle(quadObj, GLU_FILL);
+ gluQuadricNormals(quadObj, GLU_SMOOTH);
+ /* If we ever changed/used the texture or orientation state
+ of quadObj, we'd need to change it to the defaults here
+ with gluQuadricTexture and/or gluQuadricOrientation. */
+ gluSphere(quadObj, radius, slices, stacks);
+}
+
+void GLUTAPIENTRY
+glutWireCone(GLdouble base, GLdouble height,
+ GLint slices, GLint stacks)
+{
+ QUAD_OBJ_INIT();
+ gluQuadricDrawStyle(quadObj, GLU_LINE);
+ gluQuadricNormals(quadObj, GLU_SMOOTH);
+ /* If we ever changed/used the texture or orientation state
+ of quadObj, we'd need to change it to the defaults here
+ with gluQuadricTexture and/or gluQuadricOrientation. */
+ gluCylinder(quadObj, base, 0.0, height, slices, stacks);
+}
+
+void GLUTAPIENTRY
+glutSolidCone(GLdouble base, GLdouble height,
+ GLint slices, GLint stacks)
+{
+ QUAD_OBJ_INIT();
+ gluQuadricDrawStyle(quadObj, GLU_FILL);
+ gluQuadricNormals(quadObj, GLU_SMOOTH);
+ /* If we ever changed/used the texture or orientation state
+ of quadObj, we'd need to change it to the defaults here
+ with gluQuadricTexture and/or gluQuadricOrientation. */
+ gluCylinder(quadObj, base, 0.0, height, slices, stacks);
+}
+
+/* ENDCENTRY */
+
+static void
+drawBox(GLfloat size, GLenum type)
+{
+ static GLfloat n[6][3] =
+ {
+ {-1.0, 0.0, 0.0},
+ {0.0, 1.0, 0.0},
+ {1.0, 0.0, 0.0},
+ {0.0, -1.0, 0.0},
+ {0.0, 0.0, 1.0},
+ {0.0, 0.0, -1.0}
+ };
+ static GLint faces[6][4] =
+ {
+ {0, 1, 2, 3},
+ {3, 2, 6, 7},
+ {7, 6, 5, 4},
+ {4, 5, 1, 0},
+ {5, 6, 2, 1},
+ {7, 4, 0, 3}
+ };
+ GLfloat v[8][3];
+ GLint i;
+
+ v[0][0] = v[1][0] = v[2][0] = v[3][0] = -size / 2;
+ v[4][0] = v[5][0] = v[6][0] = v[7][0] = size / 2;
+ v[0][1] = v[1][1] = v[4][1] = v[5][1] = -size / 2;
+ v[2][1] = v[3][1] = v[6][1] = v[7][1] = size / 2;
+ v[0][2] = v[3][2] = v[4][2] = v[7][2] = -size / 2;
+ v[1][2] = v[2][2] = v[5][2] = v[6][2] = size / 2;
+
+ for (i = 5; i >= 0; i--) {
+ glBegin(type);
+/* glNormal3fv(&n[i][0]); */
+ glVertex3fv(&v[faces[i][0]][0]);
+ glVertex3fv(&v[faces[i][1]][0]);
+ glVertex3fv(&v[faces[i][2]][0]);
+ glVertex3fv(&v[faces[i][3]][0]);
+ glEnd();
+ }
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutWireCube(GLdouble size)
+{
+ drawBox(size, GL_LINE_LOOP);
+}
+
+void GLUTAPIENTRY
+glutSolidCube(GLdouble size)
+{
+ drawBox(size, GL_QUADS);
+}
+
+/* ENDCENTRY */
+
+static void
+doughnut(GLfloat r, GLfloat R, GLint nsides, GLint rings)
+{
+ int i, j;
+ GLfloat theta, phi, theta1;
+ GLfloat cosTheta, sinTheta;
+ GLfloat cosTheta1, sinTheta1;
+ GLfloat ringDelta, sideDelta;
+
+ ringDelta = 2.0 * M_PI / rings;
+ sideDelta = 2.0 * M_PI / nsides;
+
+ theta = 0.0;
+ cosTheta = 1.0;
+ sinTheta = 0.0;
+ for (i = rings - 1; i >= 0; i--) {
+ theta1 = theta + ringDelta;
+ cosTheta1 = cos(theta1);
+ sinTheta1 = sin(theta1);
+ glBegin(GL_QUAD_STRIP);
+ phi = 0.0;
+ for (j = nsides; j >= 0; j--) {
+ GLfloat cosPhi, sinPhi, dist;
+
+ phi += sideDelta;
+ cosPhi = cos(phi);
+ sinPhi = sin(phi);
+ dist = R + r * cosPhi;
+
+/* glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi); */
+ glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi);
+/* glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi); */
+ glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi);
+ }
+ glEnd();
+ theta = theta1;
+ cosTheta = cosTheta1;
+ sinTheta = sinTheta1;
+ }
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutWireTorus(GLdouble innerRadius, GLdouble outerRadius,
+ GLint nsides, GLint rings)
+{
+/* glPushAttrib(GL_POLYGON_BIT); */
+/* glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); */
+ doughnut(innerRadius, outerRadius, nsides, rings);
+/* glPopAttrib(); */
+}
+
+void GLUTAPIENTRY
+glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius,
+ GLint nsides, GLint rings)
+{
+ doughnut(innerRadius, outerRadius, nsides, rings);
+}
+
+/* ENDCENTRY */
+
+static GLfloat dodec[20][3];
+
+static void
+initDodecahedron(void)
+{
+ GLfloat alpha, beta;
+
+ alpha = sqrt(2.0 / (3.0 + sqrt(5.0)));
+ beta = 1.0 + sqrt(6.0 / (3.0 + sqrt(5.0)) -
+ 2.0 + 2.0 * sqrt(2.0 / (3.0 + sqrt(5.0))));
+ /* *INDENT-OFF* */
+ dodec[0][0] = -alpha; dodec[0][1] = 0; dodec[0][2] = beta;
+ dodec[1][0] = alpha; dodec[1][1] = 0; dodec[1][2] = beta;
+ dodec[2][0] = -1; dodec[2][1] = -1; dodec[2][2] = -1;
+ dodec[3][0] = -1; dodec[3][1] = -1; dodec[3][2] = 1;
+ dodec[4][0] = -1; dodec[4][1] = 1; dodec[4][2] = -1;
+ dodec[5][0] = -1; dodec[5][1] = 1; dodec[5][2] = 1;
+ dodec[6][0] = 1; dodec[6][1] = -1; dodec[6][2] = -1;
+ dodec[7][0] = 1; dodec[7][1] = -1; dodec[7][2] = 1;
+ dodec[8][0] = 1; dodec[8][1] = 1; dodec[8][2] = -1;
+ dodec[9][0] = 1; dodec[9][1] = 1; dodec[9][2] = 1;
+ dodec[10][0] = beta; dodec[10][1] = alpha; dodec[10][2] = 0;
+ dodec[11][0] = beta; dodec[11][1] = -alpha; dodec[11][2] = 0;
+ dodec[12][0] = -beta; dodec[12][1] = alpha; dodec[12][2] = 0;
+ dodec[13][0] = -beta; dodec[13][1] = -alpha; dodec[13][2] = 0;
+ dodec[14][0] = -alpha; dodec[14][1] = 0; dodec[14][2] = -beta;
+ dodec[15][0] = alpha; dodec[15][1] = 0; dodec[15][2] = -beta;
+ dodec[16][0] = 0; dodec[16][1] = beta; dodec[16][2] = alpha;
+ dodec[17][0] = 0; dodec[17][1] = beta; dodec[17][2] = -alpha;
+ dodec[18][0] = 0; dodec[18][1] = -beta; dodec[18][2] = alpha;
+ dodec[19][0] = 0; dodec[19][1] = -beta; dodec[19][2] = -alpha;
+ /* *INDENT-ON* */
+
+}
+
+#define DIFF3(_a,_b,_c) { \
+ (_c)[0] = (_a)[0] - (_b)[0]; \
+ (_c)[1] = (_a)[1] - (_b)[1]; \
+ (_c)[2] = (_a)[2] - (_b)[2]; \
+}
+
+static void
+crossprod(GLfloat v1[3], GLfloat v2[3], GLfloat prod[3])
+{
+ GLfloat p[3]; /* in case prod == v1 or v2 */
+
+ p[0] = v1[1] * v2[2] - v2[1] * v1[2];
+ p[1] = v1[2] * v2[0] - v2[2] * v1[0];
+ p[2] = v1[0] * v2[1] - v2[0] * v1[1];
+ prod[0] = p[0];
+ prod[1] = p[1];
+ prod[2] = p[2];
+}
+
+static void
+normalize(GLfloat v[3])
+{
+ GLfloat d;
+
+ d = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
+ if (d == 0.0) {
+/* __glutWarning("normalize: zero length vector"); */
+ v[0] = d = 1.0;
+ }
+ d = 1 / d;
+ v[0] *= d;
+ v[1] *= d;
+ v[2] *= d;
+}
+
+static void
+pentagon(int a, int b, int c, int d, int e, GLenum shadeType)
+{
+ GLfloat n0[3], d1[3], d2[3];
+
+ DIFF3(dodec[a], dodec[b], d1);
+ DIFF3(dodec[b], dodec[c], d2);
+ crossprod(d1, d2, n0);
+ normalize(n0);
+
+ glBegin(shadeType);
+/* glNormal3fv(n0); */
+ glVertex3fv(&dodec[a][0]);
+ glVertex3fv(&dodec[b][0]);
+ glVertex3fv(&dodec[c][0]);
+ glVertex3fv(&dodec[d][0]);
+ glVertex3fv(&dodec[e][0]);
+ glEnd();
+}
+
+static void
+dodecahedron(GLenum type)
+{
+ static int inited = 0;
+
+ if (inited == 0) {
+ inited = 1;
+ initDodecahedron();
+ }
+ pentagon(0, 1, 9, 16, 5, type);
+ pentagon(1, 0, 3, 18, 7, type);
+ pentagon(1, 7, 11, 10, 9, type);
+ pentagon(11, 7, 18, 19, 6, type);
+ pentagon(8, 17, 16, 9, 10, type);
+ pentagon(2, 14, 15, 6, 19, type);
+ pentagon(2, 13, 12, 4, 14, type);
+ pentagon(2, 19, 18, 3, 13, type);
+ pentagon(3, 0, 5, 12, 13, type);
+ pentagon(6, 15, 8, 10, 11, type);
+ pentagon(4, 17, 8, 15, 14, type);
+ pentagon(4, 12, 5, 16, 17, type);
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutWireDodecahedron(void)
+{
+ dodecahedron(GL_LINE_LOOP);
+}
+
+void GLUTAPIENTRY
+glutSolidDodecahedron(void)
+{
+ dodecahedron(GL_TRIANGLE_FAN);
+}
+
+/* ENDCENTRY */
+
+static void
+recorditem(GLfloat * n1, GLfloat * n2, GLfloat * n3,
+ GLenum shadeType)
+{
+ GLfloat q0[3], q1[3];
+
+ DIFF3(n1, n2, q0);
+ DIFF3(n2, n3, q1);
+ crossprod(q0, q1, q1);
+ normalize(q1);
+
+ glBegin(shadeType);
+/* glNormal3fv(q1); */
+ glVertex3fv(n1);
+ glVertex3fv(n2);
+ glVertex3fv(n3);
+ glEnd();
+}
+
+static void
+subdivide(GLfloat * v0, GLfloat * v1, GLfloat * v2,
+ GLenum shadeType)
+{
+ int depth;
+ GLfloat w0[3], w1[3], w2[3];
+ GLfloat l;
+ int i, j, k, n;
+
+ depth = 1;
+ for (i = 0; i < depth; i++) {
+ for (j = 0; i + j < depth; j++) {
+ k = depth - i - j;
+ for (n = 0; n < 3; n++) {
+ w0[n] = (i * v0[n] + j * v1[n] + k * v2[n]) / depth;
+ w1[n] = ((i + 1) * v0[n] + j * v1[n] + (k - 1) * v2[n])
+ / depth;
+ w2[n] = (i * v0[n] + (j + 1) * v1[n] + (k - 1) * v2[n])
+ / depth;
+ }
+ l = sqrt(w0[0] * w0[0] + w0[1] * w0[1] + w0[2] * w0[2]);
+ w0[0] /= l;
+ w0[1] /= l;
+ w0[2] /= l;
+ l = sqrt(w1[0] * w1[0] + w1[1] * w1[1] + w1[2] * w1[2]);
+ w1[0] /= l;
+ w1[1] /= l;
+ w1[2] /= l;
+ l = sqrt(w2[0] * w2[0] + w2[1] * w2[1] + w2[2] * w2[2]);
+ w2[0] /= l;
+ w2[1] /= l;
+ w2[2] /= l;
+ recorditem(w1, w0, w2, shadeType);
+ }
+ }
+}
+
+static void
+drawtriangle(int i, GLfloat data[][3], int ndx[][3],
+ GLenum shadeType)
+{
+ GLfloat *x0, *x1, *x2;
+
+ x0 = data[ndx[i][0]];
+ x1 = data[ndx[i][1]];
+ x2 = data[ndx[i][2]];
+ subdivide(x0, x1, x2, shadeType);
+}
+
+/* octahedron data: The octahedron produced is centered at the
+ origin and has radius 1.0 */
+static GLfloat odata[6][3] =
+{
+ {1.0, 0.0, 0.0},
+ {-1.0, 0.0, 0.0},
+ {0.0, 1.0, 0.0},
+ {0.0, -1.0, 0.0},
+ {0.0, 0.0, 1.0},
+ {0.0, 0.0, -1.0}
+};
+
+static int ondex[8][3] =
+{
+ {0, 4, 2},
+ {1, 2, 4},
+ {0, 3, 4},
+ {1, 4, 3},
+ {0, 2, 5},
+ {1, 5, 2},
+ {0, 5, 3},
+ {1, 3, 5}
+};
+
+static void
+octahedron(GLenum shadeType)
+{
+ int i;
+
+ for (i = 7; i >= 0; i--) {
+ drawtriangle(i, odata, ondex, shadeType);
+ }
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutWireOctahedron(void)
+{
+ octahedron(GL_LINE_LOOP);
+}
+
+void GLUTAPIENTRY
+glutSolidOctahedron(void)
+{
+ octahedron(GL_TRIANGLES);
+}
+
+/* ENDCENTRY */
+
+/* icosahedron data: These numbers are rigged to make an
+ icosahedron of radius 1.0 */
+
+#define X .525731112119133606
+#define Z .850650808352039932
+
+static GLfloat idata[12][3] =
+{
+ {-X, 0, Z},
+ {X, 0, Z},
+ {-X, 0, -Z},
+ {X, 0, -Z},
+ {0, Z, X},
+ {0, Z, -X},
+ {0, -Z, X},
+ {0, -Z, -X},
+ {Z, X, 0},
+ {-Z, X, 0},
+ {Z, -X, 0},
+ {-Z, -X, 0}
+};
+
+static int index[20][3] =
+{
+ {0, 4, 1},
+ {0, 9, 4},
+ {9, 5, 4},
+ {4, 5, 8},
+ {4, 8, 1},
+ {8, 10, 1},
+ {8, 3, 10},
+ {5, 3, 8},
+ {5, 2, 3},
+ {2, 7, 3},
+ {7, 10, 3},
+ {7, 6, 10},
+ {7, 11, 6},
+ {11, 0, 6},
+ {0, 1, 6},
+ {6, 1, 10},
+ {9, 0, 11},
+ {9, 11, 2},
+ {9, 2, 5},
+ {7, 2, 11},
+};
+
+static void
+icosahedron(GLenum shadeType)
+{
+ int i;
+
+ for (i = 19; i >= 0; i--) {
+ drawtriangle(i, idata, index, shadeType);
+ }
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutWireIcosahedron(void)
+{
+ icosahedron(GL_LINE_LOOP);
+}
+
+void GLUTAPIENTRY
+glutSolidIcosahedron(void)
+{
+ icosahedron(GL_TRIANGLES);
+}
+
+/* ENDCENTRY */
+
+/* tetrahedron data: */
+
+#define T 1.73205080756887729
+
+static GLfloat tdata[4][3] =
+{
+ {T, T, T},
+ {T, -T, -T},
+ {-T, T, -T},
+ {-T, -T, T}
+};
+
+static int tndex[4][3] =
+{
+ {0, 1, 3},
+ {2, 1, 0},
+ {3, 2, 0},
+ {1, 2, 3}
+};
+
+static void
+tetrahedron(GLenum shadeType)
+{
+ int i;
+
+ for (i = 3; i >= 0; i--)
+ drawtriangle(i, tdata, tndex, shadeType);
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutWireTetrahedron(void)
+{
+ tetrahedron(GL_LINE_LOOP);
+}
+
+void GLUTAPIENTRY
+glutSolidTetrahedron(void)
+{
+ tetrahedron(GL_TRIANGLES);
+}
+
+/* ENDCENTRY */
diff --git a/src/glut/directfb/overlay.c b/src/glut/directfb/overlay.c
new file mode 100644
index 00000000000..714be5f1a28
--- /dev/null
+++ b/src/glut/directfb/overlay.c
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2006 Claudio Ciccani <klan@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "internal.h"
+
+
+void GLUTAPIENTRY
+glutEstablishOverlay( void )
+{
+}
+
+
+void GLUTAPIENTRY
+glutRemoveOverlay( void )
+{
+}
+
+
+void GLUTAPIENTRY
+glutUseLayer( GLenum layer )
+{
+}
+
+
+void GLUTAPIENTRY
+glutPostOverlayRedisplay( void )
+{
+}
+
+
+void GLUTAPIENTRY
+glutPostWindowOverlayRedisplay( int win )
+{
+}
+
+
+void GLUTAPIENTRY
+glutShowOverlay( void )
+{
+}
+
+
+void GLUTAPIENTRY
+glutHideOverlay( void )
+{
+}
diff --git a/src/glut/directfb/state.c b/src/glut/directfb/state.c
new file mode 100644
index 00000000000..194d5bbb626
--- /dev/null
+++ b/src/glut/directfb/state.c
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2006 Claudio Ciccani <klan@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+
+#include "GL/glu.h"
+
+#include "internal.h"
+
+
+int GLUTAPIENTRY
+glutGet( GLenum type )
+{
+ switch (type) {
+ case GLUT_WINDOW_X:
+ if (g_current && g_current->window) {
+ int x;
+ g_current->window->GetPosition( g_current->window, &x, 0 );
+ return x;
+ }
+ break;
+ case GLUT_WINDOW_Y:
+ if (g_current && g_current->window) {
+ int y;
+ g_current->window->GetPosition( g_current->window, 0, &y );
+ return y;
+ }
+ break;
+
+ case GLUT_WINDOW_WIDTH:
+ if (g_current) {
+ int w;
+ g_current->surface->GetSize( g_current->surface, &w, 0 );
+ return w;
+ }
+ break;
+ case GLUT_WINDOW_HEIGHT:
+ if (g_current) {
+ int h;
+ g_current->surface->GetSize( g_current->surface, 0, &h );
+ return h;
+ }
+ break;
+
+ case GLUT_WINDOW_BUFFER_SIZE:
+ if (g_current) {
+ DFBGLAttributes a;
+ g_current->gl->GetAttributes( g_current->gl, &a );
+ return a.buffer_size;
+ }
+ break;
+ case GLUT_WINDOW_STENCIL_SIZE:
+ if (g_current) {
+ DFBGLAttributes a;
+ g_current->gl->GetAttributes( g_current->gl, &a );
+ return a.stencil_size;
+ }
+ break;
+ case GLUT_WINDOW_DEPTH_SIZE:
+ if (g_current) {
+ DFBGLAttributes a;
+ g_current->gl->GetAttributes( g_current->gl, &a );
+ return a.depth_size;
+ }
+ break;
+ case GLUT_WINDOW_RED_SIZE:
+ if (g_current) {
+ DFBGLAttributes a;
+ g_current->gl->GetAttributes( g_current->gl, &a );
+ return a.red_size;
+ }
+ break;
+ case GLUT_WINDOW_GREEN_SIZE:
+ if (g_current) {
+ DFBGLAttributes a;
+ g_current->gl->GetAttributes( g_current->gl, &a );
+ return a.green_size;
+ }
+ break;
+ case GLUT_WINDOW_BLUE_SIZE:
+ if (g_current) {
+ DFBGLAttributes a;
+ g_current->gl->GetAttributes( g_current->gl, &a );
+ return a.blue_size;
+ }
+ break;
+ case GLUT_WINDOW_ALPHA_SIZE:
+ if (g_current) {
+ DFBGLAttributes a;
+ g_current->gl->GetAttributes( g_current->gl, &a );
+ return a.alpha_size;
+ }
+ break;
+ case GLUT_WINDOW_ACCUM_RED_SIZE:
+ if (g_current) {
+ DFBGLAttributes a;
+ g_current->gl->GetAttributes( g_current->gl, &a );
+ return a.accum_red_size;
+ }
+ break;
+ case GLUT_WINDOW_ACCUM_GREEN_SIZE:
+ if (g_current) {
+ DFBGLAttributes a;
+ g_current->gl->GetAttributes( g_current->gl, &a );
+ return a.accum_green_size;
+ }
+ break;
+ case GLUT_WINDOW_ACCUM_BLUE_SIZE:
+ if (g_current) {
+ DFBGLAttributes a;
+ g_current->gl->GetAttributes( g_current->gl, &a );
+ return a.accum_blue_size;
+ }
+ break;
+ case GLUT_WINDOW_ACCUM_ALPHA_SIZE:
+ if (g_current) {
+ DFBGLAttributes a;
+ g_current->gl->GetAttributes( g_current->gl, &a );
+ return a.accum_alpha_size;
+ }
+ break;
+ case GLUT_WINDOW_DOUBLEBUFFER:
+ if (g_current) {
+ DFBGLAttributes a;
+ g_current->gl->GetAttributes( g_current->gl, &a );
+ return a.double_buffer;
+ }
+ break;
+
+ case GLUT_WINDOW_RGBA:
+ return 1;
+
+ case GLUT_WINDOW_CURSOR:
+ if (g_current)
+ return g_current->cursor;
+ break;
+
+ case GLUT_SCREEN_WIDTH:
+ if (primary) {
+ DFBDisplayLayerConfig c;
+ primary->GetConfiguration( primary, &c );
+ return c.width;
+ }
+ break;
+ case GLUT_SCREEN_HEIGHT:
+ if (primary) {
+ DFBDisplayLayerConfig c;
+ primary->GetConfiguration( primary, &c );
+ return c.height;
+ }
+ break;
+
+ case GLUT_INIT_DISPLAY_MODE:
+ return g_display_mode;
+ case GLUT_INIT_WINDOW_X:
+ return g_xpos;
+ case GLUT_INIT_WINDOW_Y:
+ return g_ypos;
+ case GLUT_INIT_WINDOW_WIDTH:
+ return g_width;
+ case GLUT_INIT_WINDOW_HEIGHT:
+ return g_height;
+
+ case GLUT_ELAPSED_TIME:
+ {
+ static long long start = -1;
+ struct timeval t;
+
+ gettimeofday( &t, NULL );
+ if (start == -1) {
+ start = t.tv_sec * 1000ll + t.tv_usec / 1000ll;
+ return 0;
+ }
+ return (t.tv_sec * 1000ll + t.tv_usec / 1000ll - start);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+
+int GLUTAPIENTRY
+glutLayerGet( GLenum type )
+{
+ return 0;
+}
+
+void GLUTAPIENTRY
+glutReportErrors( void )
+{
+ GLenum error;
+
+ while ((error = glGetError()) != GL_NO_ERROR)
+ __glutWarning( "**OpenGL Error** %s", gluErrorString( error ) );
+}
+
+
diff --git a/src/glut/directfb/teapot.c b/src/glut/directfb/teapot.c
new file mode 100644
index 00000000000..e7f1ee812fa
--- /dev/null
+++ b/src/glut/directfb/teapot.c
@@ -0,0 +1,212 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/**
+(c) Copyright 1993, Silicon Graphics, Inc.
+
+ALL RIGHTS RESERVED
+
+Permission to use, copy, modify, and distribute this software
+for any purpose and without fee is hereby granted, provided
+that the above copyright notice appear in all copies and that
+both the copyright notice and this permission notice appear in
+supporting documentation, and that the name of Silicon
+Graphics, Inc. not be used in advertising or publicity
+pertaining to distribution of the software without specific,
+written prior permission.
+
+THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU
+"AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR
+OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO
+EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE
+ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
+INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,
+SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR
+NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY
+OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+US Government Users Restricted Rights
+
+Use, duplication, or disclosure by the Government is subject to
+restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+(c)(1)(ii) of the Rights in Technical Data and Computer
+Software clause at DFARS 252.227-7013 and/or in similar or
+successor clauses in the FAR or the DOD or NASA FAR
+Supplement. Unpublished-- rights reserved under the copyright
+laws of the United States. Contractor/manufacturer is Silicon
+Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA
+94039-7311.
+
+OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+*/
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+#include "GL/glut.h"
+
+/* 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] =
+{
+ /* rim */
+ {102, 103, 104, 105, 4, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15},
+ /* body */
+ {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27},
+ {24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36,
+ 37, 38, 39, 40},
+ /* lid */
+ {96, 96, 96, 96, 97, 98, 99, 100, 101, 101, 101,
+ 101, 0, 1, 2, 3,},
+ {0, 1, 2, 3, 106, 107, 108, 109, 110, 111, 112,
+ 113, 114, 115, 116, 117},
+ /* bottom */
+ {118, 118, 118, 118, 124, 122, 119, 121, 123, 126,
+ 125, 120, 40, 39, 38, 37},
+ /* handle */
+ {41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
+ 53, 54, 55, 56},
+ {53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
+ 28, 65, 66, 67},
+ /* spout */
+ {68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83},
+ {80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
+ 92, 93, 94, 95}
+};
+/* *INDENT-OFF* */
+
+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}}
+};
+
+/* *INDENT-ON* */
+
+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();
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutSolidTeapot(GLdouble scale)
+{
+ teapot(7, scale, GL_FILL);
+}
+
+void GLUTAPIENTRY
+glutWireTeapot(GLdouble scale)
+{
+ teapot(10, scale, GL_LINE);
+}
+
+/* ENDCENTRY */
diff --git a/src/glut/directfb/window.c b/src/glut/directfb/window.c
new file mode 100644
index 00000000000..c8174d795e7
--- /dev/null
+++ b/src/glut/directfb/window.c
@@ -0,0 +1,581 @@
+/*
+ * Copyright (C) 2006 Claudio Ciccani <klan@users.sf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "internal.h"
+
+
+/*****************************************************************************/
+
+static __GlutWindow *g_stack = NULL;
+
+/*****************************************************************************/
+
+
+__GlutWindow*
+__glutCreateWindow( GLboolean fullscreen )
+{
+ __GlutWindow *new;
+ DFBResult ret;
+ static int curid = 1;
+
+ new = calloc( 1, sizeof(__GlutWindow) );
+ if (!new)
+ __glutFatalError( "out of memory" );
+
+ new->id = curid++;
+
+ if (fullscreen) {
+ DFBDisplayLayerConfig config;
+ DFBDisplayLayerConfigFlags fail = 0;
+
+ config.flags = DLCONF_WIDTH | DLCONF_HEIGHT |
+ DLCONF_BUFFERMODE;
+ config.width = g_width;
+ config.height = g_height;
+
+ if (g_display_mode & GLUT_DOUBLE)
+ config.buffermode = DLBM_BACKVIDEO;
+ else
+ config.buffermode = DLBM_FRONTONLY;
+
+ if (g_bpp) {
+ config.flags |= DLCONF_PIXELFORMAT;
+
+ switch (g_bpp) {
+ case 8:
+ config.pixelformat = DSPF_RGB332;
+ break;
+ case 15:
+ config.pixelformat = DSPF_ARGB1555;
+ break;
+ case 16:
+ config.pixelformat = DSPF_RGB16;
+ break;
+ case 24:
+ case 32:
+ config.pixelformat = DSPF_RGB32;
+ break;
+ default:
+ config.flags &= ~DLCONF_PIXELFORMAT;
+ break;
+ }
+ }
+
+ primary->TestConfiguration( primary, &config, &fail );
+ config.flags &= ~fail;
+ primary->SetConfiguration( primary, &config );
+
+ ret = primary->GetSurface( primary, &new->surface );
+ if (ret) {
+ DirectFBError( "IDirectFBDisplayLayer::GetSurface()", ret );
+ free( new );
+ return NULL;
+ }
+
+ ret = new->surface->GetGL( new->surface, &new->gl );
+ if (ret) {
+ DirectFBError( "IDirectFBSurface::GetGL()", ret );
+ new->surface->Release( new->surface );
+ free( new );
+ return NULL;
+ }
+
+ events->Reset( events );
+ if (keyboard)
+ keyboard->AttachEventBuffer( keyboard, events );
+ if (mouse)
+ mouse->AttachEventBuffer( mouse, events );
+ if (joystick)
+ joystick->AttachEventBuffer( joystick, events );
+
+ new->visible = GL_TRUE;
+ }
+ else {
+ DFBWindowDescription dsc;
+
+ dsc.flags = DWDESC_CAPS | DWDESC_POSX | DWDESC_POSY |
+ DWDESC_WIDTH | DWDESC_HEIGHT;
+ dsc.caps = DWCAPS_NONE;
+ dsc.posx = g_xpos;
+ dsc.posy = g_ypos;
+ dsc.width = g_width;
+ dsc.height = g_height;
+
+ if (g_display_mode & GLUT_DOUBLE)
+ dsc.caps |= DWCAPS_DOUBLEBUFFER;
+ if (g_display_mode & GLUT_ALPHA)
+ dsc.caps |= DWCAPS_ALPHACHANNEL;
+
+ ret = primary->CreateWindow( primary, &dsc, &new->window );
+ if (ret) {
+ DirectFBError( "IDirectFBDisplayLayer::CreateWindow()", ret );
+ free( new );
+ return NULL;
+ }
+
+ new->window->GetID( new->window, &new->wid );
+
+ ret = new->window->GetSurface( new->window, &new->surface );
+ if (ret) {
+ DirectFBError( "IDirectFBWindow::GetSurface()", ret );
+ new->window->Release( new->window );
+ free( new );
+ return NULL;
+ }
+
+ ret = new->surface->GetGL( new->surface, &new->gl );
+ if (ret) {
+ DirectFBError( "IDirectFBSurface::GetGl()", ret );
+ new->surface->Release( new->surface );
+ new->window->Release( new->window );
+ free( new );
+ return NULL;
+ }
+
+ new->window->AttachEventBuffer( new->window, events );
+ /* enable only handled events */
+ new->window->DisableEvents( new->window, DWET_ALL );
+ new->window->EnableEvents( new->window, DWET_KEYDOWN | DWET_KEYUP |
+ DWET_BUTTONDOWN | DWET_BUTTONUP |
+ DWET_ENTER | DWET_LEAVE |
+ DWET_MOTION | DWET_SIZE );
+
+
+ new->req.flags |= WINDOW_REQUEST_SHOW;
+ }
+
+ new->reshape = GL_TRUE;
+ new->visibility = GL_TRUE;
+ new->redisplay = GL_TRUE;
+
+ if (g_stack) {
+ new->prev = g_stack->prev;
+ g_stack->prev->next = new;
+ g_stack->prev = new;
+ }
+ else {
+ new->prev = new;
+ g_stack = new;
+ }
+
+ return new;
+}
+
+
+__GlutWindow*
+__glutFindWindow( DFBWindowID id )
+{
+ __GlutWindow *cur;
+
+ for (cur = g_stack; cur; cur = cur->next) {
+ if (cur->wid == id)
+ return cur;
+ }
+
+ __glutFatalError( "Window %d not found", id );
+
+ return NULL;
+}
+
+
+void
+__glutSetWindow( __GlutWindow *window )
+{
+ if (g_current) {
+ if (g_current == window)
+ return;
+ g_current->gl->Unlock( g_current->gl );
+ }
+
+ if (window)
+ window->gl->Lock( window->gl );
+ g_current = window;
+}
+
+
+void
+__glutHandleWindows( void )
+{
+ __GlutWindow *cur = g_stack;
+
+ while (cur) {
+ __GlutWindow *next = cur->next;
+
+ if (cur->window && cur->req.flags) {
+ if (cur == g_current)
+ cur->gl->Unlock( cur->gl );
+
+ if (cur->req.flags & WINDOW_REQUEST_DESTROY) {
+ __glutDestroyWindow( cur );
+ cur = next;
+ continue;
+ }
+
+ if (cur->req.flags & WINDOW_REQUEST_POSITION) {
+ cur->window->MoveTo( cur->window,
+ cur->req.x, cur->req.y );
+ }
+
+ if (cur->req.flags & WINDOW_REQUEST_RESIZE) {
+ cur->window->Resize( cur->window,
+ cur->req.w, cur->req.h );
+ cur->reshape = GL_TRUE;
+ cur->redisplay = GL_TRUE;
+ }
+
+ if (cur->req.flags & WINDOW_REQUEST_RESTACK) {
+ while (cur->req.z > 0) {
+ if (cur->req.z >= +1000) {
+ cur->window->RaiseToTop( cur->window );
+ cur->req.z = 0;
+ break;
+ }
+
+ cur->window->Raise( cur->window );
+ cur->req.z--;
+ }
+
+ while (cur->req.z < 0) {
+ if (cur->req.z <= -1000) {
+ cur->window->LowerToBottom( cur->window );
+ cur->req.z = 0;
+ break;
+ }
+
+ cur->window->Lower( cur->window );
+ cur->req.z++;
+ }
+ }
+
+ if (cur->req.flags & WINDOW_REQUEST_SHOW) {
+ cur->window->SetOpacity( cur->window, 0xff );
+ cur->visible = GL_TRUE;
+ cur->visibility = GL_TRUE;
+ }
+ else if (cur->req.flags & WINDOW_REQUEST_HIDE) {
+ cur->window->SetOpacity( cur->window, 0x00 );
+ cur->visible = GL_FALSE;
+ cur->visibility = GL_TRUE;
+ }
+
+ cur->req.flags = 0;
+
+ if (cur == g_current)
+ cur->gl->Lock( cur->gl );
+ }
+
+ if (cur->reshape && reshape_func) {
+ int w, h;
+ g_idle = GL_FALSE;
+ cur->surface->GetSize( cur->surface, &w, &h );
+ __glutSetWindow( cur );
+ reshape_func( w, h );
+ }
+
+ if (cur->visibility && visibility_func) {
+ g_idle = GL_FALSE;
+ __glutSetWindow( cur );
+ visibility_func( cur->visible ? GLUT_VISIBLE : GLUT_NOT_VISIBLE );
+ }
+
+ if (cur->redisplay && display_func) {
+ g_idle = GL_FALSE;
+ __glutSetWindow( cur );
+ display_func();
+ }
+
+ cur->reshape = GL_FALSE;
+ cur->visibility = GL_FALSE;
+ cur->redisplay = GL_FALSE;
+
+ cur = next;
+ }
+}
+
+
+void
+__glutDestroyWindow( __GlutWindow *window )
+{
+ __GlutWindow *next = window->next;
+ __GlutWindow *prev = window->prev;
+
+ __glutAssert( window != NULL );
+
+ if (window == g_current)
+ g_current = NULL;
+ if (window == g_game)
+ g_game = NULL;
+
+ window->gl->Unlock( window->gl );
+ window->gl->Release( window->gl );
+ window->surface->Release( window->surface );
+
+ if (window->window) {
+#if DIRECTFB_VERSION_CODE >= VERSION_CODE(0,9,26)
+ window->window->DetachEventBuffer( window->window, events );
+#else
+ window->window->Destroy( window->window );
+#endif
+ window->window->Release( window->window );
+ }
+ else {
+#if DIRECTFB_VERSION_CODE >= VERSION_CODE(0,9,26)
+ if (joystick)
+ joystick->DetachEventBuffer( joystick, events );
+ if (mouse)
+ mouse->DetachEventBuffer( mouse, events );
+ if (keyboard)
+ keyboard->DetachEventBuffer( keyboard, events );
+#endif
+ events->Reset( events );
+ }
+
+ free( window );
+
+ if (next)
+ next->prev = prev;
+ else
+ g_stack->prev = prev;
+
+ if (window == g_stack)
+ g_stack = next;
+ else
+ prev->next = next;
+}
+
+
+void
+__glutDestroyWindows( void )
+{
+ __GlutWindow *cur = g_stack;
+
+ while (cur) {
+ __GlutWindow *next = cur->next;
+ __glutDestroyWindow( cur );
+ cur = next;
+ }
+}
+
+
+int GLUTAPIENTRY
+glutCreateWindow( const char *title )
+{
+ __GlutWindow *window;
+
+ if (getenv( "__GLUT_GAME_MODE" ))
+ return glutEnterGameMode();
+
+ glutInit( NULL, NULL );
+
+ window = __glutCreateWindow( GL_FALSE );
+ if (!window)
+ return 0;
+
+ __glutSetWindow( window );
+ glutSetCursor( GLUT_CURSOR_INHERIT );
+
+ return window->id;
+}
+
+
+int GLUTAPIENTRY
+glutCreateSubWindow( int win, int x, int y, int width, int height )
+{
+ return GL_FALSE;
+}
+
+
+void GLUTAPIENTRY
+glutDestroyWindow( int win )
+{
+ __GlutWindow *cur;
+
+ for (cur = g_stack; cur; cur = cur->next) {
+ if (cur->id == win) {
+ if (cur->window)
+ cur->window->Destroy( cur->window );
+
+ cur->req.flags |= WINDOW_REQUEST_DESTROY;
+ break;
+ }
+ }
+}
+
+
+void GLUTAPIENTRY
+glutPostRedisplay( void )
+{
+ if (g_current)
+ g_current->redisplay = GL_TRUE;
+}
+
+
+void GLUTAPIENTRY
+glutPostWindowRedisplay( int win )
+{
+ __GlutWindow *cur;
+
+ for (cur = g_stack; cur; cur = cur->next) {
+ if (cur->id == win) {
+ cur->redisplay = GL_TRUE;
+ break;
+ }
+ }
+}
+
+
+void GLUTAPIENTRY
+glutSwapBuffers( void )
+{
+ if (g_current) {
+ g_current->gl->Unlock( g_current->gl );
+ g_current->surface->Flip( g_current->surface, NULL, 0 );
+ g_current->gl->Lock( g_current->gl );
+ }
+}
+
+
+int GLUTAPIENTRY
+glutGetWindow( void )
+{
+ return (g_current) ? g_current->id : 0;
+}
+
+
+void GLUTAPIENTRY
+glutSetWindow( int win )
+{
+ __GlutWindow *cur;
+
+ if (g_current && g_current->id == win)
+ return;
+
+ for (cur = g_stack; cur; cur = cur->next) {
+ if (cur->id == win) {
+ __glutSetWindow( cur );
+ break;
+ }
+ }
+}
+
+
+void GLUTAPIENTRY
+glutSetWindowTitle( const char *title )
+{
+}
+
+
+void GLUTAPIENTRY
+glutSetIconTitle( const char *title )
+{
+}
+
+
+void GLUTAPIENTRY
+glutFullScreen( void )
+{
+ if (g_current && !g_game) {
+ DFBDisplayLayerConfig config;
+
+ primary->GetConfiguration( primary, &config );
+
+ g_current->req.flags |= WINDOW_REQUEST_POSITION |
+ WINDOW_REQUEST_RESIZE |
+ WINDOW_REQUEST_RESTACK;
+ g_current->req.x = 0;
+ g_current->req.y = 0;
+ g_current->req.w = config.width;
+ g_current->req.h = config.height;
+ g_current->req.z = 1000;
+ }
+}
+
+
+void GLUTAPIENTRY
+glutPositionWindow( int x, int y )
+{
+ if (g_current && !g_game) {
+ g_current->req.flags |= WINDOW_REQUEST_POSITION;
+ g_current->req.x = x;
+ g_current->req.y = y;
+ }
+}
+
+
+void GLUTAPIENTRY
+glutReshapeWindow( int width, int height )
+{
+ if (g_current && !g_game) {
+ g_current->req.flags |= WINDOW_REQUEST_RESIZE;
+ g_current->req.w = width;
+ g_current->req.h = height;
+ }
+}
+
+
+void GLUTAPIENTRY
+glutPopWindow( void )
+{
+ if (g_current && !g_game) {
+ g_current->req.flags |= WINDOW_REQUEST_RESTACK;
+ g_current->req.z--;
+ }
+}
+
+
+void GLUTAPIENTRY
+glutPushWindow( void )
+{
+ if (g_current && !g_game) {
+ g_current->req.flags |= WINDOW_REQUEST_RESTACK;
+ g_current->req.z++;
+ }
+}
+
+
+void GLUTAPIENTRY
+glutIconifyWindow( void )
+{
+}
+
+
+void GLUTAPIENTRY
+glutShowWindow( void )
+{
+ if (g_current && !g_game) {
+ g_current->req.flags |= WINDOW_REQUEST_SHOW;
+ g_current->req.flags &= ~WINDOW_REQUEST_HIDE;
+ }
+}
+
+
+void GLUTAPIENTRY
+glutHideWindow( void )
+{
+ if (g_current && !g_game) {
+ g_current->req.flags |= WINDOW_REQUEST_HIDE;
+ g_current->req.flags &= ~WINDOW_REQUEST_SHOW;
+ }
+}
+
diff --git a/src/glut/fbdev/glut_fbdev.c b/src/glut/fbdev/glut_fbdev.c
new file mode 100644
index 00000000000..3ed8fe90e33
--- /dev/null
+++ b/src/glut/fbdev/glut_fbdev.c
@@ -0,0 +1,2199 @@
+/*
+ * Mesa 3-D graphics library
+ * Version: 6.5
+ * Copyright (C) 1995-2006 Brian Paul
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * Library for glut using mesa fbdev driver
+ *
+ * Written by Sean D'Epagnier (c) 2006
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <termios.h>
+#include <inttypes.h>
+
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/poll.h>
+#include <sys/types.h>
+#include <sys/kd.h>
+
+#include <linux/fb.h>
+#include <linux/keyboard.h>
+#include <linux/vt.h>
+
+#include <GL/gl.h>
+#include <GL/glfbdev.h>
+#include <GL/glut.h>
+
+#include <math.h>
+
+#include "../../mesa/main/config.h"
+
+#define MULTIHEAD /* enable multihead hacks,
+ it allows the program to continue drawing
+ without reading input when a second fbdev
+ has keyboard focus it can cause
+ screen corruption that requires C-l to fix */
+
+#define FBMODES "/etc/fb.modes"
+
+#define HAVE_GPM
+
+#ifdef HAVE_GPM
+#include <gpm.h>
+static int GpmMouse;
+#endif
+
+#define MOUSEDEV "/dev/gpmdata"
+
+static int CurrentVT;
+static int ConsoleFD = - 1;
+
+/* save settings to restore on exit */
+static int OldKDMode = -1;
+static int OldMode;
+struct vt_mode OldVTMode;
+struct termios OldTermios;
+
+static struct fb_fix_screeninfo FixedInfo;
+static struct fb_var_screeninfo VarInfo, OrigVarInfo;
+struct fb_cmap ColorMap;
+
+static int DesiredDepth = 0;
+
+static int FrameBufferFD = -1;
+static caddr_t FrameBuffer = (caddr_t) -1;
+static caddr_t BackBuffer = NULL;
+static int DisplayMode;
+
+static int AccumSize = 16; /* per channel size of accumulation buffer */
+static int DepthSize = DEFAULT_SOFTWARE_DEPTH_BITS;
+static int StencilSize = STENCIL_BITS;
+
+#define MENU_FONT_WIDTH 9
+#define MENU_FONT_HEIGHT 15
+#define MENU_FONT GLUT_BITMAP_9_BY_15
+#define SUBMENU_OFFSET 20
+
+static int AttachedMenus[3];
+static int ActiveMenu;
+static int SelectedMenu;
+static int CurrentMenu;
+static int NumMenus = 1;
+
+static struct {
+ int NumItems;
+ int x, y;
+ int width;
+ int selected;
+ struct {
+ int value;
+ int submenu;
+ char *name;
+ } *Items;
+ void (*func)(int);
+} *Menus = NULL;
+
+struct GlutTimer {
+ int time;
+ void (*func)(int);
+ int value;
+ struct GlutTimer *next;
+};
+
+struct GlutTimer *GlutTimers = NULL;
+
+static struct timeval StartTime;
+
+static int KeyboardModifiers;
+static int KeyboardLedState;
+
+static int MouseFD;
+static int NumMouseButtons;
+static int MouseX;
+static int MouseY;
+static double MouseSpeed = 0;
+static int CurrentCursor = GLUT_CURSOR_LEFT_ARROW;
+/* only display the mouse if there is a registered callback for it */
+static int MouseEnabled = 0;
+
+/* per window data */
+static GLFBDevContextPtr Context;
+static GLFBDevBufferPtr Buffer;
+static GLFBDevVisualPtr Visual;
+static void (*DisplayFunc)(void) = NULL;
+static void (*ReshapeFunc)(int width, int height) = NULL;
+static void (*KeyboardFunc)(unsigned char key, int x, int y) = NULL;
+static void (*MouseFunc)(int key, int state, int x, int y) = NULL;
+static void (*MotionFunc)(int x, int y) = NULL;
+static void (*PassiveMotionFunc)(int x, int y) = NULL;
+static void (*VisibilityFunc)(int state) = NULL;
+static void (*SpecialFunc)(int key, int x, int y) = NULL;
+static void (*IdleFunc)(void) = NULL;
+static void (*MenuStatusFunc)(int state, int x, int y) = NULL;
+static void (*MenuStateFunc)(int state) = NULL;
+
+static int Redisplay;
+static int Visible;
+static int VisibleSwitch;
+static int Active;
+/* we have to poll to see if we are visible
+ on a framebuffer that is not active */
+static int VisiblePoll;
+static int FramebufferIndex;
+
+static int RequiredWidth;
+static int RequiredHeight;
+static int InitialWidthHint;
+static int InitialHeightHint;
+
+static char exiterror[256];
+
+/* --------- Initialization ------------*/
+/* test if the active console is attached to the same framebuffer */
+static void TestVisible(void) {
+ struct fb_con2fbmap confb;
+ struct vt_stat st;
+ int ret;
+ ioctl(ConsoleFD, VT_GETSTATE, &st);
+ confb.console = st.v_active;
+
+ ret = ioctl(FrameBufferFD, FBIOGET_CON2FBMAP, &confb);
+
+ if(ret == -1 || confb.framebuffer == FramebufferIndex) {
+ VisibleSwitch = 1;
+ Visible = 0;
+ VisiblePoll = 0;
+ }
+}
+
+static void VTSwitchHandler(int sig)
+{
+ struct vt_stat st;
+ switch(sig) {
+ case SIGUSR1:
+ ioctl(ConsoleFD, VT_RELDISP, 1);
+ Active = 0;
+#ifdef MULTIHEAD
+ VisiblePoll = 1;
+ TestVisible();
+#else
+ VisibleSwitch = 1;
+ Visible = 0;
+#endif
+ break;
+ case SIGUSR2:
+ ioctl(ConsoleFD, VT_GETSTATE, &st);
+ if(st.v_active)
+ ioctl(ConsoleFD, VT_RELDISP, VT_ACKACQ);
+
+ /* this is a hack to turn the cursor off */
+ ioctl(FrameBufferFD, FBIOPUT_VSCREENINFO, &VarInfo);
+
+ /* restore color map */
+ if(DisplayMode & GLUT_INDEX) {
+ ColorMap.start = 0;
+ ColorMap.len = 256;
+
+ if (ioctl(FrameBufferFD, FBIOPUTCMAP, (void *) &ColorMap) < 0)
+ fprintf(stderr, "ioctl(FBIOPUTCMAP) failed!\n");
+ }
+
+ Active = 1;
+ Visible = 1;
+ VisibleSwitch = 1;
+
+ Redisplay = 1;
+
+ break;
+ }
+}
+
+static void Cleanup(void)
+{
+ if(ConsoleFD >= 0)
+ if (tcsetattr(0, TCSANOW, &OldTermios) < 0)
+ fprintf(stderr, "tcsetattr failed\n");
+
+ if(ConsoleFD > 0) {
+ /* restore keyboard state */
+ if (ioctl(ConsoleFD, VT_SETMODE, &OldVTMode) < 0)
+ fprintf(stderr, "Failed to set vtmode\n");
+
+ if (ioctl(ConsoleFD, KDSKBMODE, OldKDMode) < 0)
+ fprintf(stderr, "ioctl KDSKBMODE failed!\n");
+
+ if(ioctl(ConsoleFD, KDSETMODE, OldMode) < 0)
+ fprintf(stderr, "ioctl KDSETMODE failed!\n");
+
+ close(ConsoleFD);
+ }
+
+ /* close mouse */
+#ifdef HAVE_GPM
+ if(GpmMouse) {
+ if(NumMouseButtons)
+ Gpm_Close();
+ } else
+#endif
+ if(MouseFD >= 0)
+ close(MouseFD);
+
+ glFBDevMakeCurrent( NULL, NULL, NULL);
+
+ glFBDevDestroyContext(Context);
+ glFBDevDestroyBuffer(Buffer);
+ glFBDevDestroyVisual(Visual);
+
+ struct vt_mode VT;
+
+ /* restore original variable screen info */
+ if(FrameBufferFD != -1) {
+ if (ioctl(FrameBufferFD, FBIOPUT_VSCREENINFO, &OrigVarInfo))
+ fprintf(stderr, "ioctl(FBIOPUT_VSCREENINFO failed): %s\n",
+ strerror(errno));
+
+ munmap(FrameBuffer, FixedInfo.smem_len);
+ close(FrameBufferFD);
+ }
+
+ /* free allocated back buffer */
+ if(DisplayMode & GLUT_DOUBLE)
+ free(BackBuffer);
+
+ /* free menu items */
+ int i, j;
+
+ for(i = 1; i<NumMenus; i++) {
+ for(i = 1; i<Menus[i].NumItems; i++)
+ free(Menus[i].Items[j].name);
+ free(Menus[i].Items);
+ }
+ free(Menus);
+
+ if(exiterror[0])
+ fprintf(stderr, "[glfbdev glut] %s", exiterror);
+}
+
+static void CrashHandler(int sig)
+{
+ sprintf(exiterror, "Caught signal %d, cleaning up\n", sig);
+ exit(0);
+}
+
+static void InitializeVT(int usestdin)
+{
+ /* terminos settings for straight-through mode */
+ if (tcgetattr(0, &OldTermios) < 0) {
+ sprintf(exiterror, "tcgetattr failed\n");
+ exit(0);
+ }
+
+ struct termios tio = OldTermios;
+
+ tio.c_lflag &= ~(ICANON | ECHO | ISIG);
+ tio.c_iflag &= ~(ISTRIP | IGNCR | ICRNL | INLCR | IXOFF | IXON);
+ tio.c_iflag |= IGNBRK;
+ tio.c_cc[VMIN] = 0;
+ tio.c_cc[VTIME] = 0;
+
+ if (tcsetattr(0, TCSANOW, &tio) < 0) {
+ sprintf(exiterror, "tcsetattr failed\n");
+ exit(0);
+ }
+
+ if(fcntl(0, F_SETFL, O_NONBLOCK) < 0) {
+ sprintf(exiterror, "Failed to set keyboard to non-blocking\n");
+ exit(0);
+ }
+
+ Active = 1;
+
+ if(usestdin) {
+ ConsoleFD = 0;
+ return;
+ }
+
+ /* detect the current vt if it was not specified */
+ if(CurrentVT == 0) {
+ int fd = open("/dev/tty", O_RDWR | O_NDELAY, 0);
+ struct vt_stat st;
+ if(fd == -1) {
+ sprintf(exiterror, "Failed to open /dev/tty\n");
+ exit(0);
+ }
+ if(ioctl(fd, VT_GETSTATE, &st) == -1) {
+ fprintf(stderr, "Could not detect current vt, specify with -vt\n");
+ fprintf(stderr, "Defaulting to stdin input\n");
+ ConsoleFD = 0;
+ close(fd);
+ return;
+ } else
+ CurrentVT = st.v_active;
+
+ close(fd);
+ }
+
+ /* open the console tty */
+ char console[128];
+ sprintf(console, "/dev/tty%d", CurrentVT);
+ ConsoleFD = open(console, O_RDWR | O_NDELAY, 0);
+ if (ConsoleFD < 0) {
+ sprintf(exiterror, "error couldn't open %s,"
+ " defaulting to stdin \n", console);
+ ConsoleFD = 0;
+ return;
+ }
+
+ signal(SIGUSR1, VTSwitchHandler);
+ signal(SIGUSR2, VTSwitchHandler);
+
+ struct vt_mode vt;
+
+ if (ioctl(ConsoleFD, VT_GETMODE, &OldVTMode) < 0) {
+ sprintf(exiterror,"Failed to grab %s, defaulting to stdin\n", console);
+ close(ConsoleFD);
+ ConsoleFD = 0;
+ return;
+ }
+
+ vt = OldVTMode;
+
+ vt.mode = VT_PROCESS;
+ vt.waitv = 0;
+ vt.relsig = SIGUSR1;
+ vt.acqsig = SIGUSR2;
+ if (ioctl(ConsoleFD, VT_SETMODE, &vt) < 0) {
+ sprintf(exiterror, "error: ioctl(VT_SETMODE) failed: %s\n",
+ strerror(errno));
+ close(ConsoleFD);
+ ConsoleFD = 0;
+ exit(1);
+ }
+
+ if (ioctl(ConsoleFD, KDGKBMODE, &OldKDMode) < 0) {
+ fprintf(stderr, "warning: ioctl KDGKBMODE failed!\n");
+ OldKDMode = K_XLATE;
+ }
+
+ if(ioctl(ConsoleFD, KDGETMODE, &OldMode) < 0)
+ sprintf(exiterror, "Warning: Failed to get terminal mode\n");
+
+#ifdef HAVE_GPM
+ if(!GpmMouse)
+#endif
+ if(ioctl(ConsoleFD, KDSETMODE, KD_GRAPHICS) < 0)
+ sprintf(exiterror,"Warning: Failed to set terminal to graphics\n");
+
+
+ if (ioctl(ConsoleFD, KDSKBMODE, K_MEDIUMRAW) < 0) {
+ sprintf(exiterror, "ioctl KDSKBMODE failed!\n");
+ tcsetattr(0, TCSANOW, &OldTermios);
+ exit(0);
+ }
+
+ if( ioctl(ConsoleFD, KDGKBLED, &KeyboardLedState) < 0) {
+ sprintf(exiterror, "ioctl KDGKBLED failed!\n");
+ exit(0);
+ }
+}
+
+static void InitializeMouse(void)
+{
+#ifdef HAVE_GPM
+ if(GpmMouse) {
+ Gpm_Connect conn;
+ int c;
+ conn.eventMask = ~0; /* Want to know about all the events */
+ conn.defaultMask = 0; /* don't handle anything by default */
+ conn.minMod = 0; /* want everything */
+ conn.maxMod = ~0; /* all modifiers included */
+ if(Gpm_Open(&conn, 0) == -1) {
+ fprintf(stderr, "Cannot open gpmctl. Continuing without Mouse\n");
+ return;
+ }
+
+ if(!MouseSpeed)
+ MouseSpeed = 5;
+ } else
+#endif
+ {
+ const char *mousedev = getenv("MOUSE");
+ if(!mousedev)
+ mousedev = MOUSEDEV;
+ if((MouseFD = open(mousedev, O_RDONLY)) < 0) {
+ fprintf(stderr,"Cannot open %s.\n"
+ "Continuing without Mouse\n", MOUSEDEV);
+ return;
+ }
+
+ if(!MouseSpeed)
+ MouseSpeed = 1;
+ }
+
+ NumMouseButtons = 3;
+}
+
+static void removeArgs(int *argcp, char **argv, int num)
+{
+ int i;
+ for (i = 0; argv[i+num]; i++)
+ argv[i] = argv[i+num];
+
+ argv[i] = NULL;
+ *argcp -= num;
+}
+
+#define REQPARAM(PARAM) \
+ if (i >= *argcp - 1) { \
+ fprintf(stderr, PARAM" requires a parameter\n"); \
+ exit(0); \
+ }
+
+void glutInit (int *argcp, char **argv)
+{
+ int i;
+ int nomouse = 0;
+ int nokeyboard = 0;
+ int usestdin = 0;
+
+ /* parse out args */
+ for (i = 1; i < *argcp;) {
+ if (!strcmp(argv[i], "-geometry")) {
+ REQPARAM("geometry");
+ if(sscanf(argv[i+1], "%dx%d", &RequiredWidth,
+ &RequiredHeight) != 2) {
+ fprintf(stderr,"Please specify geometry as widthxheight\n");
+ exit(0);
+ }
+ removeArgs(argcp, &argv[i], 2);
+ } else
+ if (!strcmp(argv[i], "-bpp")) {
+ REQPARAM("bpp");
+ if(sscanf(argv[i+1], "%d", &DesiredDepth) != 1) {
+ fprintf(stderr, "Please specify a parameter for bpp\n");
+ exit(0);
+ }
+
+ removeArgs(argcp, &argv[i], 2);
+ } else
+ if (!strcmp(argv[i], "-vt")) {
+ REQPARAM("vt");
+ if(sscanf(argv[i+1], "%d", &CurrentVT) != 1) {
+ fprintf(stderr, "Please specify a parameter for vt\n");
+ exit(0);
+ }
+ removeArgs(argcp, &argv[i], 2);
+ } else
+ if (!strcmp(argv[i], "-mousespeed")) {
+ REQPARAM("mousespeed");
+ if(sscanf(argv[i+1], "%lf", &MouseSpeed) != 1) {
+ fprintf(stderr, "Please specify a mouse speed, eg: 2.5\n");
+ exit(0);
+ }
+ removeArgs(argcp, &argv[i], 2);
+ } else
+ if (!strcmp(argv[i], "-nomouse")) {
+ nomouse = 1;
+ removeArgs(argcp, &argv[i], 1);
+ } else
+ if (!strcmp(argv[i], "-nokeyboard")) {
+ nokeyboard = 1;
+ removeArgs(argcp, &argv[i], 1);
+ } else
+ if (!strcmp(argv[i], "-stdin")) {
+ usestdin = 1;
+ removeArgs(argcp, &argv[i], 1);
+ } else
+ if (!strcmp(argv[i], "-gpmmouse")) {
+#ifdef HAVE_GPM
+ GpmMouse = 1;
+#else
+ fprintf(stderr, "gpm support was not compiled\n");
+ exit(0);
+#endif
+ removeArgs(argcp, &argv[i], 1);
+ } else
+ if (!strcmp(argv[i], "--")) {
+ removeArgs(argcp, &argv[i], 1);
+ break;
+ } else
+ i++;
+ }
+
+ gettimeofday(&StartTime, 0);
+ atexit(Cleanup);
+
+ signal(SIGSEGV, CrashHandler);
+ signal(SIGINT, CrashHandler);
+ signal(SIGTERM, CrashHandler);
+
+ if(nomouse == 0)
+ InitializeMouse();
+ if(nokeyboard == 0)
+ InitializeVT(usestdin);
+}
+
+void glutInitDisplayMode (unsigned int mode)
+{
+ DisplayMode = mode;
+}
+
+void glutInitWindowPosition (int x, int y)
+{
+}
+
+void glutInitWindowSize (int width, int height)
+{
+ InitialWidthHint = width;
+ InitialHeightHint = height;
+}
+
+/* --------- Mouse Rendering ------------*/
+#include "cursors.h"
+static int LastMouseX;
+static int LastMouseY;
+static unsigned char *MouseBuffer;
+
+static void EraseCursor(void)
+{
+ int off = LastMouseY * FixedInfo.line_length
+ + LastMouseX * VarInfo.bits_per_pixel / 8;
+ int stride = CURSOR_WIDTH * VarInfo.bits_per_pixel / 8;
+ int i;
+
+ unsigned char *src = MouseBuffer;
+
+ for(i = 0; i<CURSOR_HEIGHT; i++) {
+ memcpy(BackBuffer + off, src, stride);
+ src += stride;
+ off += FixedInfo.line_length;
+ }
+}
+
+static void SaveCursor(int x, int y)
+{
+ if(x < 0)
+ LastMouseX = 0;
+ else
+ if(x > (int)VarInfo.xres - CURSOR_WIDTH)
+ LastMouseX = VarInfo.xres - CURSOR_WIDTH;
+ else
+ LastMouseX = x;
+
+ if(y < 0)
+ LastMouseY = 0;
+ else
+ if(y > (int)VarInfo.yres - CURSOR_HEIGHT)
+ LastMouseY = VarInfo.yres - CURSOR_HEIGHT;
+ else
+ LastMouseY = y;
+
+ int off = LastMouseY * FixedInfo.line_length
+ + LastMouseX * VarInfo.bits_per_pixel / 8;
+ int stride = CURSOR_WIDTH * VarInfo.bits_per_pixel / 8;
+ int i;
+ unsigned char *src = MouseBuffer;
+ for(i = 0; i<CURSOR_HEIGHT; i++) {
+ memcpy(src, BackBuffer + off, stride);
+ src += stride;
+ off += FixedInfo.line_length;
+ }
+}
+
+static void DrawCursor(void)
+{
+ if(CurrentCursor < 0 || CurrentCursor >= NUM_CURSORS)
+ return;
+
+ int px = MouseX - CursorsXOffset[CurrentCursor];
+ int py = MouseY - CursorsYOffset[CurrentCursor];
+
+ SaveCursor(px, py);
+
+ int xoff = 0;
+ if(px < 0)
+ xoff = -px;
+
+ int xlen = CURSOR_WIDTH;
+ if(px + CURSOR_WIDTH > VarInfo.xres)
+ xlen = VarInfo.xres - px;
+
+ int yoff = 0;
+ if(py < 0)
+ yoff = -py;
+
+ int ylen = CURSOR_HEIGHT;
+ if(py + CURSOR_HEIGHT > VarInfo.yres)
+ ylen = VarInfo.yres - py;
+
+ int bypp = VarInfo.bits_per_pixel / 8;
+
+ unsigned char *c = BackBuffer + FixedInfo.line_length * (py + yoff)
+ + (px + xoff) * bypp;
+
+ unsigned char *d = Cursors[CurrentCursor] + (CURSOR_WIDTH * yoff + xoff)*4;
+ int i, j;
+
+ int dstride = (CURSOR_WIDTH - xlen + xoff) * 4;
+ int cstride = FixedInfo.line_length - bypp * (xlen - xoff);
+
+ switch(bypp) {
+ case 1: /* no support for 8bpp mouse yet */
+ break;
+ case 2:
+ {
+ uint16_t *e = (void*)c;
+ cstride /= 2;
+ for(i = yoff; i < ylen; i++) {
+ for(j = xoff; j < xlen; j++) {
+ e[0] = ((((d[0] + (((int)(((e[0] >> 8) & 0xf8)
+ | ((c[0] >> 11) & 0x7)) * d[3]) >> 8)) & 0xf8) << 8)
+ | (((d[1] + (((int)(((e[0] >> 3) & 0xfc)
+ | ((e[0] >> 5) & 0x3)) * d[3]) >> 8)) & 0xfc) << 3)
+ | ((d[2] + (((int)(((e[0] << 3) & 0xf8)
+ | (e[0] & 0x7)) * d[3]) >> 8)) >> 3));
+
+ e++;
+ d+=4;
+ }
+ d += dstride;
+ e += cstride;
+ }
+ }
+ break;
+ case 3:
+ case 4:
+ for(i = yoff; i < ylen; i++) {
+ for(j = xoff; j < xlen; j++) {
+ c[0] = d[0] + (((int)c[0] * d[3]) >> 8);
+ c[1] = d[1] + (((int)c[1] * d[3]) >> 8);
+ c[2] = d[2] + (((int)c[2] * d[3]) >> 8);
+
+ c+=bypp;
+ d+=4;
+ }
+ d += dstride;
+ c += cstride;
+ } break;
+ }
+}
+
+#define MIN(x, y) x < y ? x : y
+static void SwapCursor(void)
+{
+ int px = MouseX - CursorsXOffset[CurrentCursor];
+ int py = MouseY - CursorsYOffset[CurrentCursor];
+
+ int minx = MIN(px, LastMouseX);
+ int sizex = abs(px - LastMouseX);
+
+ int miny = MIN(py, LastMouseY);
+ int sizey = abs(py - LastMouseY);
+
+ DrawCursor();
+ /* now update the portion of the screen that has changed */
+
+ if(DisplayMode & GLUT_DOUBLE && (sizex || sizey)) {
+ if(minx < 0)
+ minx = 0;
+ if(miny < 0)
+ miny = 0;
+
+ if(minx + sizex > VarInfo.xres)
+ sizex = VarInfo.xres - minx;
+ if(miny + sizey > VarInfo.yres)
+ sizey = VarInfo.yres - miny;
+ int off = FixedInfo.line_length * miny
+ + minx * VarInfo.bits_per_pixel / 8;
+ int stride = (sizex + CURSOR_WIDTH) * VarInfo.bits_per_pixel / 8;
+ int i;
+ for(i = 0; i< sizey + CURSOR_HEIGHT; i++) {
+ memcpy(FrameBuffer+off, BackBuffer+off, stride);
+ off += FixedInfo.line_length;
+ }
+ }
+}
+
+/* --------- Menu Rendering ------------*/
+static double MenuProjection[16];
+static double MenuModelview[16];
+
+static void InitMenuMatrices(void)
+{
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(0.0,VarInfo.xres,VarInfo.yres,0.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glViewport(0,0,VarInfo.xres,VarInfo.yres);
+ glGetDoublev(GL_PROJECTION_MATRIX, MenuProjection);
+ glGetDoublev(GL_MODELVIEW_MATRIX, MenuModelview);
+}
+
+static int DrawMenu(int menu, int x, int *y)
+{
+ int i;
+ int ret = 1;
+ for(i=0; i < Menus[menu].NumItems; i++) {
+ char *s = Menus[menu].Items[i].name;
+ int a =0;
+ if(MouseY >= *y && MouseY < *y + MENU_FONT_HEIGHT &&
+ MouseX >= x && MouseX < x + Menus[menu].width) {
+ a = 1;
+ SelectedMenu = menu;
+ ret = 0;
+ Menus[menu].selected = i;
+ glColor3f(1,0,0);
+ } else
+ glColor3f(0,0,1);
+
+ *y += MENU_FONT_HEIGHT;
+ glRasterPos2i(x, *y);
+ for(; *s; s++)
+ glutBitmapCharacter(MENU_FONT, *s);
+
+ if(Menus[menu].selected == i)
+ if(Menus[menu].Items[i].submenu)
+ if(DrawMenu(Menus[menu].Items[i].submenu, x
+ + SUBMENU_OFFSET, y)) {
+ if(!a)
+ Menus[menu].selected = -1;
+ } else
+ ret = 0;
+ }
+ return ret;
+}
+
+static void DrawMenus(void)
+{
+ /* save old settings */
+ glPushAttrib(-1);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glLoadMatrixd(MenuModelview);
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadMatrixd(MenuProjection);
+
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_ALPHA_TEST);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_FOG);
+ glDisable(GL_TEXTURE_2D);
+ // glEnable(GL_LOGIC_OP);
+ //glEnable(GL_COLOR_LOGIC_OP);
+ // glLogicOp(GL_XOR);
+
+ int x = Menus[ActiveMenu].x;
+ int y = Menus[ActiveMenu].y;
+
+ if(DrawMenu(ActiveMenu, x, &y))
+ Menus[ActiveMenu].selected = -1;
+
+ /* restore settings */
+
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+
+ glPopAttrib();
+}
+
+/* --------- Event Processing ------------*/
+#define MODIFIER(mod) \
+ KeyboardModifiers = release ? KeyboardModifiers & ~mod \
+ : KeyboardModifiers | mod;
+
+#define READKEY read(ConsoleFD, &code, 1)
+
+static void LedModifier(int led, int release)
+{
+ static int releaseflag = K_CAPS | K_NUM;
+ if(release)
+ releaseflag |= led;
+ else
+ if(releaseflag & led) {
+ KeyboardLedState ^= led;
+ releaseflag &= ~led;
+ }
+ ioctl(ConsoleFD, KDSKBLED, KeyboardLedState);
+ ioctl(ConsoleFD, KDSETLED, 0x80);
+}
+
+static int ReadKey(void)
+{
+ int x;
+ unsigned char code;
+ int specialkey = 0;
+ if(READKEY == 0)
+ return 0;
+
+ if(code == 0)
+ return 0;
+
+ /* stdin input escape code based */
+ if(ConsoleFD == 0) {
+ KeyboardModifiers = 0;
+ altset:
+ if(code == 27 && READKEY == 1) {
+ switch(code) {
+ case 79: /* function key */
+ READKEY;
+ if(code == 50) {
+ READKEY;
+ shiftfunc:
+ KeyboardModifiers |= GLUT_ACTIVE_SHIFT;
+ specialkey = GLUT_KEY_F1 + code - 53;
+ READKEY;
+ } else {
+ READKEY;
+ specialkey = GLUT_KEY_F1 + code - 80;
+ }
+ break;
+ case 91:
+ READKEY;
+ switch(code) {
+ case 68:
+ specialkey = GLUT_KEY_LEFT; break;
+ case 65:
+ specialkey = GLUT_KEY_UP; break;
+ case 67:
+ specialkey = GLUT_KEY_RIGHT; break;
+ case 66:
+ specialkey = GLUT_KEY_DOWN; break;
+ case 53:
+ specialkey = GLUT_KEY_PAGE_UP; READKEY; break;
+ case 54:
+ specialkey = GLUT_KEY_PAGE_DOWN; READKEY; break;
+ case 49:
+ specialkey = GLUT_KEY_HOME; READKEY; break;
+ case 52:
+ specialkey = GLUT_KEY_END; READKEY; break;
+ case 50:
+ READKEY;
+ if(code != 126)
+ goto shiftfunc;
+ specialkey = GLUT_KEY_INSERT;
+ break;
+ case 51:
+ code = '\b'; goto stdkey;
+ case 91:
+ READKEY;
+ specialkey = GLUT_KEY_F1 + code - 65;
+ break;
+ default:
+ return 0;
+ }
+ break;
+ default:
+ KeyboardModifiers |= GLUT_ACTIVE_ALT;
+ goto altset;
+ }
+ }
+ stdkey:
+ if(specialkey) {
+ if(SpecialFunc)
+ SpecialFunc(specialkey, MouseX, MouseY);
+ } else {
+ if(code >= 1 && code <= 26) {
+ KeyboardModifiers |= GLUT_ACTIVE_CTRL;
+ code += 'a' - 1;
+ }
+ if((code >= 43 && code <= 34) || (code == 60)
+ || (code >= 62 && code <= 90) || (code == 94)
+ || (code == 95) || (code >= 123 && code <= 126))
+ KeyboardModifiers |= GLUT_ACTIVE_SHIFT;
+
+ if(KeyboardFunc)
+ KeyboardFunc(code, MouseX, MouseY);
+ }
+ return 1;
+ }
+
+ /* linux kbd reading */
+ struct kbentry entry;
+ entry.kb_table = 0;
+ if(KeyboardModifiers & GLUT_ACTIVE_SHIFT)
+ entry.kb_table |= K_SHIFTTAB;
+
+ int release = code & 0x80;
+ code &= 0x7F;
+
+ entry.kb_index = code;
+
+ if (ioctl(ConsoleFD, KDGKBENT, &entry) < 0) {
+ sprintf(exiterror, "ioctl(KDGKBENT) failed.\n");
+ exit(0);
+ }
+
+ int labelval = entry.kb_value;
+
+ switch(labelval) {
+ case K_SHIFT:
+ case K_SHIFTL:
+ MODIFIER(GLUT_ACTIVE_SHIFT);
+ return 0;
+ case K_CTRL:
+ MODIFIER(GLUT_ACTIVE_CTRL);
+ return 0;
+ case K_ALT:
+ case K_ALTGR:
+ MODIFIER(GLUT_ACTIVE_ALT);
+ return 0;
+ }
+
+ if(!release && labelval >= K_F1 && labelval <= K_F12)
+ if(KeyboardModifiers & GLUT_ACTIVE_ALT) {
+ /* VT switch, we must do it */
+ if(ioctl(ConsoleFD, VT_ACTIVATE, labelval - K_F1 + 1) < 0)
+ sprintf(exiterror, "Error switching console\n");
+ return 0;
+ }
+
+ switch(labelval) {
+ case K_CAPS:
+ LedModifier(LED_CAP, release);
+ return 0;
+ case K_NUM:
+ LedModifier(LED_NUM, release);
+ return 0;
+ case K_HOLD: /* scroll lock suspends glut */
+ LedModifier(LED_SCR, release);
+ while(KeyboardLedState & LED_SCR) {
+ usleep(10000);
+ ReadKey();
+ }
+ return 0;
+ }
+
+ /* we could queue keypresses here */
+ if(KeyboardLedState & LED_SCR)
+ return 0;
+
+ if(release)
+ return 0;
+
+ if(labelval >= K_F1 && labelval <= K_F12)
+ specialkey = GLUT_KEY_F1 + labelval - K_F1;
+ else
+ switch(labelval) {
+ case K_LEFT:
+ specialkey = GLUT_KEY_LEFT; break;
+ case K_UP:
+ specialkey = GLUT_KEY_UP; break;
+ case K_RIGHT:
+ specialkey = GLUT_KEY_RIGHT; break;
+ case K_DOWN:
+ specialkey = GLUT_KEY_DOWN; break;
+ case K_PGUP:
+ specialkey = GLUT_KEY_PAGE_UP; break;
+ case K_PGDN:
+ specialkey = GLUT_KEY_PAGE_DOWN; break;
+ case K_FIND:
+ specialkey = GLUT_KEY_HOME; break;
+ case K_SELECT:
+ specialkey = GLUT_KEY_END; break;
+ case K_INSERT:
+ specialkey = GLUT_KEY_INSERT; break;
+ case K_REMOVE:
+ labelval = '\b'; break;
+ case K_ENTER:
+ labelval = '\n'; break;
+ }
+
+ if(specialkey) {
+ if(SpecialFunc)
+ SpecialFunc(specialkey, MouseX, MouseY);
+ } else
+ if(KeyboardFunc) {
+ char c = labelval;
+ if(KeyboardLedState & LED_CAP) {
+ if(c >= 'A' && c <= 'Z')
+ c += 'a' - 'A';
+ else
+ if(c >= 'a' && c <= 'z')
+ c += 'A' - 'a';
+ }
+ KeyboardFunc(c, MouseX, MouseY);
+ }
+ return 1;
+}
+
+static void HandleMousePress(int button, int pressed)
+{
+ if(ActiveMenu && !pressed) {
+ if(MenuStatusFunc)
+ MenuStatusFunc(GLUT_MENU_NOT_IN_USE, MouseX, MouseY);
+ if(MenuStateFunc)
+ MenuStateFunc(GLUT_MENU_NOT_IN_USE);
+ if(SelectedMenu > 0) {
+ int selected = Menus[SelectedMenu].selected;
+ if(selected >= 0)
+ if(Menus[SelectedMenu].Items[selected].submenu == 0)
+ Menus[SelectedMenu].func(Menus[SelectedMenu].Items
+ [selected].value);
+ }
+ ActiveMenu = 0;
+ Redisplay = 1;
+ return;
+ }
+
+ if(AttachedMenus[button] && pressed) {
+ ActiveMenu = AttachedMenus[button];
+ if(MenuStatusFunc)
+ MenuStatusFunc(GLUT_MENU_IN_USE, MouseX, MouseY);
+ if(MenuStateFunc)
+ MenuStateFunc(GLUT_MENU_IN_USE);
+ Menus[ActiveMenu].x = MouseX - Menus[ActiveMenu].width/2;
+ Menus[ActiveMenu].y = MouseY - Menus[ActiveMenu].NumItems*MENU_FONT_HEIGHT/2;
+ Menus[ActiveMenu].selected = -1;
+ Redisplay = 1;
+ return;
+ }
+
+ if(MouseFunc)
+ MouseFunc(button, pressed ? GLUT_DOWN : GLUT_UP, MouseX, MouseY);
+}
+
+static int ReadMouse(void)
+{
+ int l, r, m;
+ static int ll, lm, lr;
+ signed char dx, dy;
+
+#ifdef HAVE_GPM
+ if(GpmMouse) {
+ Gpm_Event event;
+ struct pollfd pfd;
+ pfd.fd = gpm_fd;
+ pfd.events = POLLIN;
+ if(poll(&pfd, 1, 1) != 1)
+ return 0;
+
+ if(Gpm_GetEvent(&event) != 1)
+ return 0;
+
+ l = event.buttons & GPM_B_LEFT;
+ m = event.buttons & GPM_B_MIDDLE;
+ r = event.buttons & GPM_B_RIGHT;
+
+ /* gpm is weird in that it gives a button number when the button
+ is released, with type set to GPM_UP, this is only a problem
+ if it is the last button released */
+
+ if(event.type & GPM_UP)
+ if(event.buttons == GPM_B_LEFT || event.buttons == GPM_B_MIDDLE ||
+ event.buttons == GPM_B_RIGHT || event.buttons == GPM_B_FOURTH)
+ l = m = r = 0;
+
+ dx = event.dx;
+ dy = event.dy;
+ } else
+#endif
+ {
+ if(MouseFD == -1)
+ return 0;
+
+ if(fcntl(MouseFD, F_SETFL, O_NONBLOCK) == -1) {
+ close(MouseFD);
+ MouseFD = -1;
+ return 0;
+ }
+
+ char data[4];
+ if(read(MouseFD, data, 4) != 4)
+ return 0;
+
+ l = ((data[0] & 0x20) >> 3);
+ m = ((data[3] & 0x10) >> 3);
+ r = ((data[0] & 0x10) >> 4);
+
+ dx = (((data[0] & 0x03) << 6) | (data[1] & 0x3F));
+ dy = (((data[0] & 0x0C) << 4) | (data[2] & 0x3F));
+ }
+
+ MouseX += dx * MouseSpeed;
+ if(MouseX < 0)
+ MouseX = 0;
+ else
+ if(MouseX >= VarInfo.xres)
+ MouseX = VarInfo.xres - 1;
+
+ MouseY += dy * MouseSpeed;
+ if(MouseY < 0)
+ MouseY = 0;
+ else
+ if(MouseY >= VarInfo.yres)
+ MouseY = VarInfo.yres - 1;
+
+ if(l != ll)
+ HandleMousePress(GLUT_LEFT_BUTTON, l);
+ if(m != lm)
+ HandleMousePress(GLUT_MIDDLE_BUTTON, m);
+ if(r != lr)
+ HandleMousePress(GLUT_RIGHT_BUTTON, r);
+
+ ll = l, lm = m, lr = r;
+
+ if(dx || dy) {
+ if(l || m || r) {
+ if(MotionFunc)
+ MotionFunc(MouseX, MouseY);
+ } else
+ if(PassiveMotionFunc)
+ PassiveMotionFunc(MouseX, MouseY);
+
+ EraseCursor();
+ if(ActiveMenu)
+ Redisplay = 1;
+ else
+ SwapCursor();
+ }
+
+ return 1;
+}
+
+static void RecieveEvents(void)
+{
+ while(ReadKey());
+
+ if(MouseEnabled)
+ while(ReadMouse());
+}
+
+static void ProcessTimers(void)
+{
+ if(GlutTimers && GlutTimers->time < glutGet(GLUT_ELAPSED_TIME)) {
+ struct GlutTimer *timer = GlutTimers;
+ timer->func(timer->value);
+ GlutTimers = timer->next;
+ free(timer);
+ }
+}
+
+void glutMainLoop(void)
+{
+ if(ReshapeFunc)
+ ReshapeFunc(VarInfo.xres, VarInfo.yres);
+
+ if(!DisplayFunc) {
+ sprintf(exiterror, "Fatal Error: No Display Function registered\n");
+ exit(0);
+ }
+
+ for(;;) {
+ ProcessTimers();
+
+ if(Active)
+ RecieveEvents();
+ else
+ if(VisiblePoll)
+ TestVisible();
+
+ if(IdleFunc)
+ IdleFunc();
+
+ if(VisibleSwitch) {
+ VisibleSwitch = 0;
+ if(VisibilityFunc)
+ VisibilityFunc(Visible ? GLUT_VISIBLE : GLUT_NOT_VISIBLE);
+ }
+
+ if(Visible && Redisplay) {
+ Redisplay = 0;
+ if(MouseEnabled)
+ EraseCursor();
+ DisplayFunc();
+ if(!(DisplayMode & GLUT_DOUBLE)) {
+ if(ActiveMenu)
+ DrawMenus();
+ if(MouseEnabled)
+ DrawCursor();
+ }
+ }
+ }
+}
+
+/* ---------- Window Management ----------*/
+static void ParseFBModes(void)
+{
+ char buf[1024];
+ struct fb_var_screeninfo vi = VarInfo;
+
+ FILE *fbmodes = fopen(FBMODES, "r");
+
+ if(!fbmodes) {
+ sprintf(exiterror, "Warning: could not open "
+ FBMODES" using current mode\n");
+ return;
+ }
+
+ if(InitialWidthHint == 0 && InitialHeightHint == 0
+ && RequiredWidth == 0)
+ return; /* use current mode */
+
+ while(fgets(buf, sizeof buf, fbmodes)) {
+ char *c;
+ int v;
+
+ if(!(c = strstr(buf, "geometry")))
+ continue;
+ v = sscanf(c, "geometry %d %d %d %d %d", &vi.xres, &vi.yres,
+ &vi.xres_virtual, &vi.yres_virtual, &vi.bits_per_pixel);
+ if(v != 5)
+ continue;
+
+ /* now we have to decide what is best */
+ if(RequiredWidth) {
+ if(RequiredWidth != vi.xres || RequiredHeight != vi.yres)
+ continue;
+ } else {
+ if(VarInfo.xres < vi.xres && VarInfo.xres < InitialWidthHint)
+ v++;
+ if(VarInfo.xres > vi.xres && vi.xres > InitialWidthHint)
+ v++;
+
+ if(VarInfo.yres < vi.yres && VarInfo.yres < InitialHeightHint)
+ v++;
+ if(VarInfo.yres > vi.yres && vi.yres > InitialHeightHint)
+ v++;
+
+ if(v < 7)
+ continue;
+ }
+
+ fgets(buf, sizeof buf, fbmodes);
+ if(!(c = strstr(buf, "timings")))
+ continue;
+
+ v = sscanf(c, "timings %d %d %d %d %d %d %d", &vi.pixclock,
+ &vi.left_margin, &vi.right_margin, &vi.upper_margin,
+ &vi.lower_margin, &vi.hsync_len, &vi.vsync_len);
+ if(v != 7)
+ continue;
+
+ VarInfo = vi; /* finally found a better mode */
+ if(RequiredWidth) {
+ fclose(fbmodes);
+ return;
+ }
+ }
+
+ fclose(fbmodes);
+
+ if(RequiredWidth) {
+ sprintf(exiterror, "No mode (%dx%d) found in "FBMODES"\n",
+ RequiredWidth, RequiredHeight);
+ exit(0);
+ }
+}
+
+int glutCreateWindow (const char *title)
+{
+ if(ConsoleFD == -1) {
+ int argc = 0;
+ char *argv[] = {NULL};
+ glutInit(&argc, argv);
+ }
+
+ if(Context)
+ return 0;
+
+ char *fbdev = getenv("FRAMEBUFFER");
+ if(fbdev) {
+#ifdef MULTIHEAD
+ if(!sscanf(fbdev, "/dev/fb%d", &FramebufferIndex))
+ if(!sscanf(fbdev, "/dev/fb/%d", &FramebufferIndex))
+ sprintf(exiterror, "Could not determine Framebuffer index!\n");
+#endif
+ } else {
+ static char fb[128];
+ FramebufferIndex = 0;
+ struct fb_con2fbmap confb;
+ int fd = open("/dev/fb0", O_RDWR);
+ confb.console = CurrentVT;
+ if(ioctl(fd, FBIOGET_CON2FBMAP, &confb) != -1)
+ FramebufferIndex = confb.framebuffer;
+ sprintf(fb, "/dev/fb%d", FramebufferIndex);
+ fbdev = fb;
+ close(fd);
+ }
+
+ /* open the framebuffer device */
+ FrameBufferFD = open(fbdev, O_RDWR);
+ if (FrameBufferFD < 0) {
+ sprintf(exiterror, "Error opening %s: %s\n", fbdev, strerror(errno));
+ exit(0);
+ }
+
+ /* Get the fixed screen info */
+ if (ioctl(FrameBufferFD, FBIOGET_FSCREENINFO, &FixedInfo)) {
+ sprintf(exiterror, "error: ioctl(FBIOGET_FSCREENINFO) failed: %s\n",
+ strerror(errno));
+ exit(0);
+ }
+
+ /* get the variable screen info */
+ if (ioctl(FrameBufferFD, FBIOGET_VSCREENINFO, &OrigVarInfo)) {
+ sprintf(exiterror, "error: ioctl(FBIOGET_VSCREENINFO) failed: %s\n",
+ strerror(errno));
+ exit(0);
+ }
+
+ /* operate on a copy */
+ VarInfo = OrigVarInfo;
+
+ /* set the depth, resolution, etc */
+ ParseFBModes();
+
+ if(DisplayMode & GLUT_INDEX)
+ VarInfo.bits_per_pixel = 8;
+ else
+ if(VarInfo.bits_per_pixel == 8)
+ VarInfo.bits_per_pixel = 32;
+
+ if (DesiredDepth)
+ VarInfo.bits_per_pixel = DesiredDepth;
+
+ VarInfo.xoffset = 0;
+ VarInfo.yoffset = 0;
+ VarInfo.nonstd = 0;
+ VarInfo.vmode &= ~FB_VMODE_YWRAP; /* turn off scrolling */
+
+ /* set new variable screen info */
+ if (ioctl(FrameBufferFD, FBIOPUT_VSCREENINFO, &VarInfo)) {
+ sprintf(exiterror, "ioctl(FBIOPUT_VSCREENINFO failed): %s\n",
+ strerror(errno));
+ exit(0);
+ }
+
+ /* reload the screen info to update offsets */
+ if (ioctl(FrameBufferFD, FBIOGET_VSCREENINFO, &VarInfo)) {
+ sprintf(exiterror, "error: ioctl(FBIOGET_VSCREENINFO) failed: %s\n",
+ strerror(errno));
+ exit(0);
+ }
+
+ /* reload the fixed info to update color mode */
+ if (ioctl(FrameBufferFD, FBIOGET_FSCREENINFO, &FixedInfo)) {
+ sprintf(exiterror, "error: ioctl(FBIOGET_FSCREENINFO) failed: %s\n",
+ strerror(errno));
+ exit(0);
+ }
+
+ if(DisplayMode & GLUT_INDEX) {
+ /* initialize colormap */
+ if (FixedInfo.visual != FB_VISUAL_DIRECTCOLOR) {
+ static unsigned short red[256], green[256], blue[256];
+ /* we're assuming 256 entries here */
+
+ ColorMap.start = 0;
+ ColorMap.len = 256;
+ ColorMap.red = red;
+ ColorMap.green = green;
+ ColorMap.blue = blue;
+ ColorMap.transp = NULL;
+
+ if (ioctl(FrameBufferFD, FBIOGETCMAP, (void *) &ColorMap) < 0)
+ sprintf(exiterror, "ioctl(FBIOGETCMAP) failed!\n");
+
+ } else {
+ sprintf(exiterror, "error: Could not set 8 bit color mode\n");
+ exit(0);
+ }
+ }
+
+ /* mmap the framebuffer into our address space */
+ FrameBuffer = mmap(0, FixedInfo.smem_len, PROT_READ | PROT_WRITE,
+ MAP_SHARED, FrameBufferFD, 0);
+ if (FrameBuffer == MAP_FAILED) {
+ sprintf(exiterror, "error: unable to mmap framebuffer: %s\n",
+ strerror(errno));
+ exit(0);
+ }
+
+ int attribs[9];
+ int i;
+
+ int mask = DisplayMode;
+ for(i=0; i<8 && mask; i++) {
+ if(mask & GLUT_DOUBLE) {
+ attribs[i] = GLFBDEV_DOUBLE_BUFFER;
+ mask &= ~GLUT_DOUBLE;
+ continue;
+ }
+
+ if(mask & GLUT_INDEX) {
+ attribs[i] = GLFBDEV_COLOR_INDEX;
+ mask &= ~GLUT_INDEX;
+ continue;
+ }
+
+ if(mask & GLUT_DEPTH) {
+ attribs[i] = GLFBDEV_DEPTH_SIZE;
+ attribs[++i] = DepthSize;
+ mask &= ~GLUT_DEPTH;
+ continue;
+ }
+
+ if(mask & GLUT_STENCIL) {
+ attribs[i] = GLFBDEV_STENCIL_SIZE;
+ attribs[++i] = StencilSize;
+ mask &= ~GLUT_STENCIL;
+ continue;
+ }
+
+ if(mask & GLUT_ACCUM) {
+ attribs[i] = GLFBDEV_ACCUM_SIZE;
+ attribs[++i] = AccumSize;
+ mask &= ~GLUT_ACCUM;
+ continue;
+ }
+
+ if(mask & GLUT_ALPHA)
+ if(!(DisplayMode & GLUT_INDEX)) {
+ mask &= ~GLUT_ALPHA;
+ i--;
+ continue;
+ }
+
+ sprintf(exiterror, "Invalid mode from glutInitDisplayMode\n");
+ exit(0);
+ }
+
+ attribs[i] = GLFBDEV_NONE;
+
+ if(!(Visual = glFBDevCreateVisual( &FixedInfo, &VarInfo, attribs ))) {
+ sprintf(exiterror, "Failure to create Visual\n");
+ exit(0);
+ }
+
+ int size = VarInfo.xres_virtual * VarInfo.yres_virtual
+ * VarInfo.bits_per_pixel / 8;
+ if(DisplayMode & GLUT_DOUBLE) {
+ if(!(BackBuffer = malloc(size))) {
+ sprintf(exiterror, "Failed to allocate double buffer\n");
+ exit(0);
+ }
+ } else
+ BackBuffer = FrameBuffer;
+
+ if(!(Buffer = glFBDevCreateBuffer( &FixedInfo, &VarInfo, Visual,
+ FrameBuffer, BackBuffer, size))) {
+ sprintf(exiterror, "Failure to create Buffer\n");
+ exit(0);
+ }
+
+ if(!(Context = glFBDevCreateContext(Visual, NULL))) {
+ sprintf(exiterror, "Failure to create Context\n");
+ exit(0);
+ }
+
+ if(!glFBDevMakeCurrent( Context, Buffer, Buffer )) {
+ sprintf(exiterror, "Failure to Make Current\n");
+ exit(0);
+ }
+
+ Visible = 1;
+ VisibleSwitch = 1;
+ Redisplay = 1;
+
+ /* set up mouse */
+ if((MouseBuffer = malloc(CURSOR_WIDTH * CURSOR_HEIGHT
+ * VarInfo.bits_per_pixel / 8)) == NULL) {
+ sprintf(exiterror, "malloc failure\n");
+ exit(0);
+ }
+
+ MouseX = VarInfo.xres / 2;
+ MouseY = VarInfo.yres / 2;
+
+ /* set up menus */
+ InitMenuMatrices();
+ return 1;
+}
+
+int glutCreateSubWindow(int win, int x, int y, int width, int height)
+{
+ return 0;
+}
+
+void glutSetWindow(int win)
+{
+}
+
+int glutGetWindow(void)
+{
+ return 1;
+}
+
+void glutDestroyWindow(int win)
+{
+}
+
+void glutPostRedisplay(void)
+{
+ Redisplay = 1;
+}
+
+void glutSwapBuffers(void)
+{
+ glFlush();
+
+ if(DisplayMode & GLUT_DOUBLE) {
+ if(ActiveMenu)
+ DrawMenus();
+ if(MouseEnabled)
+ DrawCursor();
+ glFBDevSwapBuffers(Buffer);
+ }
+}
+
+void glutPositionWindow(int x, int y)
+{
+}
+
+void glutReshapeWindow(int width, int height)
+{
+}
+
+void glutFullScreen(void)
+{
+}
+
+void glutPopWindow(void)
+{
+}
+
+void glutPushWindow(void)
+{
+}
+
+void glutShowWindow(void)
+{
+}
+
+void glutHideWindow(void)
+{
+}
+
+void glutIconifyWindow(void)
+{
+}
+
+void glutSetWindowTitle(const char *name)
+{
+}
+
+void glutSetIconTitle(const char *name)
+{
+}
+
+void glutSetCursor(int cursor)
+{
+ if(cursor == GLUT_CURSOR_FULL_CROSSHAIR)
+ cursor = GLUT_CURSOR_CROSSHAIR;
+ CurrentCursor = cursor;
+ MouseEnabled = 1;
+ EraseCursor();
+ SwapCursor();
+}
+
+/* --------- Overlays ------------*/
+void glutEstablishOverlay(void)
+{
+ exit(0);
+}
+
+void glutUseLayer(GLenum layer)
+{
+}
+
+void glutRemoveOverlay(void)
+{
+}
+
+void glutPostOverlayRedisplay(void)
+{
+}
+
+void glutShowOverlay(void)
+{
+}
+
+void glutHideOverlay(void)
+{
+}
+
+/* --------- Menus ------------*/
+int glutCreateMenu(void (*func)(int value))
+{
+ MouseEnabled = 1;
+ CurrentMenu = NumMenus;
+ NumMenus++;
+ Menus = realloc(Menus, sizeof(*Menus) * NumMenus);
+ Menus[CurrentMenu].NumItems = 0;
+ Menus[CurrentMenu].Items = NULL;
+ Menus[CurrentMenu].func = func;
+ Menus[CurrentMenu].width = 0;
+ return CurrentMenu;
+}
+
+void glutSetMenu(int menu)
+{
+ CurrentMenu = menu;
+}
+
+int glutGetMenu(void)
+{
+ return CurrentMenu;
+}
+
+void glutDestroyMenu(int menu)
+{
+ if(menu == CurrentMenu)
+ CurrentMenu = 0;
+}
+
+static void NameMenuEntry(int entry, const char *name)
+{
+ int cm = CurrentMenu;
+ if(!(Menus[cm].Items[entry-1].name = realloc(Menus[cm].Items[entry-1].name,
+ strlen(name) + 1))) {
+ sprintf(exiterror, "realloc failed in NameMenuEntry\n");
+ exit(0);
+ }
+ strcpy(Menus[cm].Items[entry-1].name, name);
+ if(strlen(name) * MENU_FONT_WIDTH > Menus[cm].width)
+ Menus[cm].width = strlen(name) * MENU_FONT_WIDTH;
+}
+
+static int AddMenuItem(const char *name)
+{
+ int cm = CurrentMenu;
+ int item = Menus[cm].NumItems++;
+ if(!(Menus[cm].Items = realloc(Menus[cm].Items,
+ Menus[cm].NumItems * sizeof(*Menus[0].Items)))) {
+ sprintf(exiterror, "realloc failed in AddMenuItem\n");
+ exit(0);
+ }
+ Menus[cm].Items[item].name = NULL;
+ NameMenuEntry(item+1, name);
+ return item;
+}
+
+void glutAddMenuEntry(const char *name, int value)
+{
+ int item = AddMenuItem(name);
+ Menus[CurrentMenu].Items[item].value = value;
+ Menus[CurrentMenu].Items[item].submenu = 0;
+}
+
+void glutAddSubMenu(const char *name, int menu)
+{
+ int item = AddMenuItem(name);
+ if(menu == CurrentMenu) {
+ sprintf(exiterror, "Recursive menus not supported\n");
+ exit(0);
+ }
+ Menus[CurrentMenu].Items[item].submenu = menu;
+}
+
+void glutChangeToMenuEntry(int entry, const char *name, int value)
+{
+ NameMenuEntry(entry, name);
+ Menus[CurrentMenu].Items[entry-1].value = value;
+ Menus[CurrentMenu].Items[entry-1].submenu = 0;
+}
+
+void glutChangeToSubMenu(int entry, const char *name, int menu)
+{
+ NameMenuEntry(entry, name);
+ Menus[CurrentMenu].Items[entry-1].submenu = menu;
+}
+
+void glutRemoveMenuItem(int entry)
+{
+ memmove(Menus[CurrentMenu].Items + entry - 1,
+ Menus[CurrentMenu].Items + entry,
+ sizeof(*Menus[0].Items) * (Menus[CurrentMenu].NumItems - entry));
+ Menus[CurrentMenu].NumItems--;
+}
+
+void glutAttachMenu(int button)
+{
+ AttachedMenus[button] = CurrentMenu;
+}
+
+void glutDetachMenu(int button)
+{
+ AttachedMenus[button] = 0;
+}
+
+/* --------- Callbacks ------------ */
+void glutDisplayFunc(void (*func)(void))
+{
+ DisplayFunc = func;
+}
+
+void glutOverlayDisplayFunc(void (*func)(void))
+{
+}
+
+void glutReshapeFunc(void (*func)(int width, int height))
+{
+ ReshapeFunc = func;
+}
+
+void glutKeyboardFunc(void (*func)(unsigned char key, int x, int y))
+{
+ KeyboardFunc = func;
+}
+
+void glutMouseFunc(void (*func)(int button, int state, int x, int y))
+{
+ MouseEnabled = 1;
+ MouseFunc = func;
+}
+
+void glutMotionFunc(void (*func)(int x, int y))
+{
+ MouseEnabled = 1;
+ MotionFunc = func;
+}
+
+void glutPassiveMotionFunc(void (*func)(int x, int y))
+{
+ MouseEnabled = 1;
+ PassiveMotionFunc = func;
+}
+
+void glutVisibilityFunc(void (*func)(int state))
+{
+ VisibilityFunc = func;
+}
+
+void glutEntryFunc(void (*func)(int state))
+{
+}
+
+void glutSpecialFunc(void (*func)(int key, int x, int y))
+{
+ SpecialFunc = func;
+}
+
+void glutSpaceballMotionFunc(void (*func)(int x, int y, int z))
+{
+}
+
+void glutSpaceballRotateFunc(void (*func)(int x, int y, int z))
+{
+}
+
+void glutButtonBoxFunc(void (*func)(int button, int state))
+{
+}
+
+void glutDialsFunc(void (*func)(int dial, int value))
+{
+}
+
+void glutTabletMotionFunc(void (*func)(int x, int y))
+{
+}
+
+void glutTabletButtonFunc(void (*func)(int button, int state,
+ int x, int y))
+{
+}
+
+void glutMenuStatusFunc(void (*func)(int status, int x, int y))
+{
+ MenuStatusFunc = func;
+}
+
+void glutMenuStateFunc(void (*func)(int status))
+{
+ MenuStateFunc = func;
+}
+
+void glutIdleFunc(void (*func)(void))
+{
+ IdleFunc = func;
+}
+
+void glutTimerFunc(unsigned int msecs,
+ void (*func)(int value), int value)
+{
+ struct GlutTimer *timer = malloc(sizeof *timer);
+ timer->time = glutGet(GLUT_ELAPSED_TIME) + msecs;
+ timer->func = func;
+ timer->value = value;
+
+ struct GlutTimer **head = &GlutTimers;
+ while(*head && (*head)->time < timer->time)
+ head = &(*head)->next;
+
+ timer->next = *head;
+ *head = timer;
+}
+
+/* --------- Color Map ------------*/
+#define TOCMAP(x) (unsigned short)((x<0?0:x>1?1:x) * (GLfloat) (2<<16))
+#define FROMCMAP(x) (GLfloat)x / (GLfloat)(2<<16)
+
+void glutSetColor(int cell, GLfloat red, GLfloat green, GLfloat blue)
+{
+ if(cell >=0 && cell < 256) {
+
+ ColorMap.red[cell] = TOCMAP(red);
+ ColorMap.green[cell] = TOCMAP(green);
+ ColorMap.blue[cell] = TOCMAP(blue);
+
+ ColorMap.start = cell;
+ ColorMap.len = 1;
+
+ if (ioctl(FrameBufferFD, FBIOPUTCMAP, (void *) &ColorMap) < 0)
+ fprintf(stderr, "ioctl(FBIOPUTCMAP) failed [%d]\n", cell);
+ }
+}
+
+GLfloat glutGetColor(int cell, int component)
+{
+ if(!(DisplayMode & GLUT_INDEX))
+ return -1.0;
+
+ if(cell < 0 || cell > 256)
+ return -1.0;
+
+ switch(component) {
+ case GLUT_RED:
+ return FROMCMAP(ColorMap.red[cell]);
+ case GLUT_GREEN:
+ return FROMCMAP(ColorMap.green[cell]);
+ case GLUT_BLUE:
+ return FROMCMAP(ColorMap.blue[cell]);
+ }
+ return -1.0;
+}
+
+void glutCopyColormap(int win)
+{
+}
+
+/* --------- State ------------*/
+void glutWarpPointer(int x, int y)
+{
+ if(x < 0)
+ x = 0;
+ if(x >= VarInfo.xres)
+ x = VarInfo.xres - 1;
+ MouseX = x;
+
+ if(y < 0)
+ y = 0;
+ if(y >= VarInfo.yres)
+ y = VarInfo.yres - 1;
+ MouseY = y;
+
+ EraseCursor();
+ SwapCursor();
+}
+
+int glutGet(GLenum state)
+{
+ switch(state) {
+ case GLUT_WINDOW_X:
+ return 0;
+ case GLUT_WINDOW_Y:
+ return 0;
+ case GLUT_INIT_WINDOW_WIDTH:
+ case GLUT_WINDOW_WIDTH:
+ case GLUT_SCREEN_WIDTH:
+ return VarInfo.xres;
+ case GLUT_INIT_WINDOW_HEIGHT:
+ case GLUT_WINDOW_HEIGHT:
+ case GLUT_SCREEN_HEIGHT:
+ return VarInfo.yres;
+ case GLUT_WINDOW_BUFFER_SIZE:
+ return VarInfo.bits_per_pixel;
+ case GLUT_WINDOW_STENCIL_SIZE:
+ return StencilSize;
+ case GLUT_WINDOW_DEPTH_SIZE:
+ return DepthSize;
+ case GLUT_WINDOW_RED_SIZE:
+ return VarInfo.red.length;
+ case GLUT_WINDOW_GREEN_SIZE:
+ return VarInfo.green.length;
+ case GLUT_WINDOW_BLUE_SIZE:
+ return VarInfo.green.length;
+ case GLUT_WINDOW_ALPHA_SIZE:
+ return VarInfo.transp.length;
+ case GLUT_WINDOW_ACCUM_RED_SIZE:
+ case GLUT_WINDOW_ACCUM_GREEN_SIZE:
+ case GLUT_WINDOW_ACCUM_BLUE_SIZE:
+ case GLUT_WINDOW_ACCUM_ALPHA_SIZE:
+ return AccumSize;
+ case GLUT_WINDOW_DOUBLEBUFFER:
+ if(DisplayMode & GLUT_DOUBLE)
+ return 1;
+ return 0;
+ case GLUT_WINDOW_RGBA:
+ if(DisplayMode & GLUT_INDEX)
+ return 0;
+ return 1;
+ case GLUT_WINDOW_PARENT:
+ return 0;
+ case GLUT_WINDOW_NUM_CHILDREN:
+ return 0;
+ case GLUT_WINDOW_COLORMAP_SIZE:
+ if(DisplayMode & GLUT_INDEX)
+ return 256;
+ return 0;
+ case GLUT_WINDOW_NUM_SAMPLES:
+ return 0;
+ case GLUT_WINDOW_STEREO:
+ return 0;
+ case GLUT_WINDOW_CURSOR:
+ return CurrentCursor;
+ case GLUT_SCREEN_WIDTH_MM:
+ return VarInfo.width;
+ case GLUT_SCREEN_HEIGHT_MM:
+ return VarInfo.height;
+ case GLUT_MENU_NUM_ITEMS:
+ if(CurrentMenu)
+ return Menus[CurrentMenu].NumItems;
+ return 0;
+ case GLUT_DISPLAY_MODE_POSSIBLE:
+ if((DisplayMode & GLUT_MULTISAMPLE)
+ || (DisplayMode & GLUT_STEREO)
+ || (DisplayMode & GLUT_LUMINANCE)
+ || (DisplayMode & GLUT_ALPHA) && (DisplayMode & GLUT_INDEX))
+ return 0;
+ return 1;
+ case GLUT_INIT_DISPLAY_MODE:
+ return DisplayMode;
+ case GLUT_INIT_WINDOW_X:
+ case GLUT_INIT_WINDOW_Y:
+ return 0;
+ case GLUT_ELAPSED_TIME:
+ {
+ static struct timeval tv;
+ gettimeofday(&tv, 0);
+ return 1000 * (tv.tv_sec - StartTime.tv_sec)
+ + (tv.tv_usec - StartTime.tv_usec) / 1000;
+ }
+ }
+}
+
+int glutLayerGet(GLenum info)
+{
+ switch(info) {
+ case GLUT_OVERLAY_POSSIBLE:
+ return 0;
+ case GLUT_LAYER_IN_USE:
+ return GLUT_NORMAL;
+ case GLUT_HAS_OVERLAY:
+ return 0;
+ case GLUT_TRANSPARENT_INDEX:
+ return -1;
+ case GLUT_NORMAL_DAMAGED:
+ return Redisplay;
+ case GLUT_OVERLAY_DAMAGED:
+ return -1;
+ }
+ return -1;
+}
+
+int glutDeviceGet(GLenum info)
+{
+ switch(info) {
+ case GLUT_HAS_KEYBOARD:
+ return 1;
+ case GLUT_HAS_MOUSE:
+ case GLUT_NUM_MOUSE_BUTTONS:
+ return NumMouseButtons;
+ case GLUT_HAS_SPACEBALL:
+ case GLUT_HAS_DIAL_AND_BUTTON_BOX:
+ case GLUT_HAS_TABLET:
+ return 0;
+ case GLUT_NUM_SPACEBALL_BUTTONS:
+ case GLUT_NUM_BUTTON_BOX_BUTTONS:
+ case GLUT_NUM_DIALS:
+ case GLUT_NUM_TABLET_BUTTONS:
+ return 0;
+ }
+ return -1;
+}
+
+int glutGetModifiers(void){
+ return KeyboardModifiers;
+}
+
+/* ------------- extensions ------------ */
+int glutExtensionSupported(const char *extension)
+{
+ const char *exts = (const char *) glGetString(GL_EXTENSIONS);
+ const char *start = exts;
+ int len = strlen(extension);
+
+ for(;;) {
+ const char *p = strstr(exts, extension);
+ if(!p)
+ break;
+ if((p == start || p[-1] == ' ') && (p[len] == ' ' || p[len] == 0))
+ return 1;
+ exts = p + len;
+ }
+ return 0;
+}
+
+void glutReportErrors(void)
+{
+ GLenum error;
+
+ while ((error = glGetError()) != GL_NO_ERROR)
+ fprintf(stderr, "GL error: %s", gluErrorString(error));
+}
+
+static struct {
+ const char *name;
+ const GLUTproc address;
+} glut_functions[] = {
+ { "glutInit", (const GLUTproc) glutInit },
+ { "glutInitDisplayMode", (const GLUTproc) glutInitDisplayMode },
+ { "glutInitWindowPosition", (const GLUTproc) glutInitWindowPosition },
+ { "glutInitWindowSize", (const GLUTproc) glutInitWindowSize },
+ { "glutMainLoop", (const GLUTproc) glutMainLoop },
+ { "glutCreateWindow", (const GLUTproc) glutCreateWindow },
+ { "glutCreateSubWindow", (const GLUTproc) glutCreateSubWindow },
+ { "glutDestroyWindow", (const GLUTproc) glutDestroyWindow },
+ { "glutPostRedisplay", (const GLUTproc) glutPostRedisplay },
+ { "glutSwapBuffers", (const GLUTproc) glutSwapBuffers },
+ { "glutGetWindow", (const GLUTproc) glutGetWindow },
+ { "glutSetWindow", (const GLUTproc) glutSetWindow },
+ { "glutSetWindowTitle", (const GLUTproc) glutSetWindowTitle },
+ { "glutSetIconTitle", (const GLUTproc) glutSetIconTitle },
+ { "glutPositionWindow", (const GLUTproc) glutPositionWindow },
+ { "glutReshapeWindow", (const GLUTproc) glutReshapeWindow },
+ { "glutPopWindow", (const GLUTproc) glutPopWindow },
+ { "glutPushWindow", (const GLUTproc) glutPushWindow },
+ { "glutIconifyWindow", (const GLUTproc) glutIconifyWindow },
+ { "glutShowWindow", (const GLUTproc) glutShowWindow },
+ { "glutHideWindow", (const GLUTproc) glutHideWindow },
+ { "glutFullScreen", (const GLUTproc) glutFullScreen },
+ { "glutSetCursor", (const GLUTproc) glutSetCursor },
+ { "glutWarpPointer", (const GLUTproc) glutWarpPointer },
+ { "glutEstablishOverlay", (const GLUTproc) glutEstablishOverlay },
+ { "glutRemoveOverlay", (const GLUTproc) glutRemoveOverlay },
+ { "glutUseLayer", (const GLUTproc) glutUseLayer },
+ { "glutPostOverlayRedisplay", (const GLUTproc) glutPostOverlayRedisplay },
+ { "glutShowOverlay", (const GLUTproc) glutShowOverlay },
+ { "glutHideOverlay", (const GLUTproc) glutHideOverlay },
+ { "glutCreateMenu", (const GLUTproc) glutCreateMenu },
+ { "glutDestroyMenu", (const GLUTproc) glutDestroyMenu },
+ { "glutGetMenu", (const GLUTproc) glutGetMenu },
+ { "glutSetMenu", (const GLUTproc) glutSetMenu },
+ { "glutAddMenuEntry", (const GLUTproc) glutAddMenuEntry },
+ { "glutAddSubMenu", (const GLUTproc) glutAddSubMenu },
+ { "glutChangeToMenuEntry", (const GLUTproc) glutChangeToMenuEntry },
+ { "glutChangeToSubMenu", (const GLUTproc) glutChangeToSubMenu },
+ { "glutRemoveMenuItem", (const GLUTproc) glutRemoveMenuItem },
+ { "glutAttachMenu", (const GLUTproc) glutAttachMenu },
+ { "glutDetachMenu", (const GLUTproc) glutDetachMenu },
+ { "glutDisplayFunc", (const GLUTproc) glutDisplayFunc },
+ { "glutReshapeFunc", (const GLUTproc) glutReshapeFunc },
+ { "glutKeyboardFunc", (const GLUTproc) glutKeyboardFunc },
+ { "glutMouseFunc", (const GLUTproc) glutMouseFunc },
+ { "glutMotionFunc", (const GLUTproc) glutMotionFunc },
+ { "glutPassiveMotionFunc", (const GLUTproc) glutPassiveMotionFunc },
+ { "glutEntryFunc", (const GLUTproc) glutEntryFunc },
+ { "glutVisibilityFunc", (const GLUTproc) glutVisibilityFunc },
+ { "glutIdleFunc", (const GLUTproc) glutIdleFunc },
+ { "glutTimerFunc", (const GLUTproc) glutTimerFunc },
+ { "glutMenuStateFunc", (const GLUTproc) glutMenuStateFunc },
+ { "glutSpecialFunc", (const GLUTproc) glutSpecialFunc },
+ { "glutSpaceballRotateFunc", (const GLUTproc) glutSpaceballRotateFunc },
+ { "glutButtonBoxFunc", (const GLUTproc) glutButtonBoxFunc },
+ { "glutDialsFunc", (const GLUTproc) glutDialsFunc },
+ { "glutTabletMotionFunc", (const GLUTproc) glutTabletMotionFunc },
+ { "glutTabletButtonFunc", (const GLUTproc) glutTabletButtonFunc },
+ { "glutMenuStatusFunc", (const GLUTproc) glutMenuStatusFunc },
+ { "glutOverlayDisplayFunc", (const GLUTproc) glutOverlayDisplayFunc },
+ { "glutSetColor", (const GLUTproc) glutSetColor },
+ { "glutGetColor", (const GLUTproc) glutGetColor },
+ { "glutCopyColormap", (const GLUTproc) glutCopyColormap },
+ { "glutGet", (const GLUTproc) glutGet },
+ { "glutDeviceGet", (const GLUTproc) glutDeviceGet },
+ { "glutExtensionSupported", (const GLUTproc) glutExtensionSupported },
+ { "glutGetModifiers", (const GLUTproc) glutGetModifiers },
+ { "glutLayerGet", (const GLUTproc) glutLayerGet },
+ { "glutGetProcAddress", (const GLUTproc) glutGetProcAddress },
+ { "glutBitmapCharacter", (const GLUTproc) glutBitmapCharacter },
+ { "glutBitmapWidth", (const GLUTproc) glutBitmapWidth },
+ { "glutStrokeCharacter", (const GLUTproc) glutStrokeCharacter },
+ { "glutStrokeWidth", (const GLUTproc) glutStrokeWidth },
+ { "glutBitmapLength", (const GLUTproc) glutBitmapLength },
+ { "glutStrokeLength", (const GLUTproc) glutStrokeLength },
+ { "glutWireSphere", (const GLUTproc) glutWireSphere },
+ { "glutSolidSphere", (const GLUTproc) glutSolidSphere },
+ { "glutWireCone", (const GLUTproc) glutWireCone },
+ { "glutSolidCone", (const GLUTproc) glutSolidCone },
+ { "glutWireCube", (const GLUTproc) glutWireCube },
+ { "glutSolidCube", (const GLUTproc) glutSolidCube },
+ { "glutWireTorus", (const GLUTproc) glutWireTorus },
+ { "glutSolidTorus", (const GLUTproc) glutSolidTorus },
+ { "glutWireDodecahedron", (const GLUTproc) glutWireDodecahedron },
+ { "glutSolidDodecahedron", (const GLUTproc) glutSolidDodecahedron },
+ { "glutWireTeapot", (const GLUTproc) glutWireTeapot },
+ { "glutSolidTeapot", (const GLUTproc) glutSolidTeapot },
+ { "glutWireOctahedron", (const GLUTproc) glutWireOctahedron },
+ { "glutSolidOctahedron", (const GLUTproc) glutSolidOctahedron },
+ { "glutWireTetrahedron", (const GLUTproc) glutWireTetrahedron },
+ { "glutSolidTetrahedron", (const GLUTproc) glutSolidTetrahedron },
+ { "glutWireIcosahedron", (const GLUTproc) glutWireIcosahedron },
+ { "glutSolidIcosahedron", (const GLUTproc) glutSolidIcosahedron },
+ { "glutReportErrors", (const GLUTproc) glutReportErrors },
+ { NULL, NULL }
+};
+
+GLUTproc glutGetProcAddress(const char *procName)
+{
+ /* Try GLUT functions first */
+ int i;
+ for (i = 0; glut_functions[i].name; i++) {
+ if (strcmp(glut_functions[i].name, procName) == 0)
+ return glut_functions[i].address;
+ }
+
+ /* Try core GL functions */
+ return (GLUTproc) glFBDevGetProcAddress(procName);
+}
diff --git a/src/glut/mini/Makefile b/src/glut/mini/Makefile
new file mode 100644
index 00000000000..177bfe2d2bf
--- /dev/null
+++ b/src/glut/mini/Makefile
@@ -0,0 +1,80 @@
+# subset glut
+
+TOP = ../../..
+include $(TOP)/configs/current
+
+MARK = $(TOP)/src/glut/glx
+
+GLUT_MAJOR = 3
+GLUT_MINOR = 7
+GLUT_TINY = 1
+
+INCLUDES = -I$(TOP)/include -I$(MARK)
+
+CORE_SOURCES = \
+ bitmap.c \
+ callback.c \
+ color.c \
+ globals.c \
+ init.c \
+ menu.c \
+ models.c \
+ overlay.c \
+ state.c \
+ teapot.c \
+ window.c
+
+
+MARK_SOURCES = \
+ $(MARK)/glut_8x13.c \
+ $(MARK)/glut_9x15.c \
+ $(MARK)/glut_hel10.c \
+ $(MARK)/glut_hel12.c \
+ $(MARK)/glut_hel18.c \
+ $(MARK)/glut_tr10.c \
+ $(MARK)/glut_tr24.c
+
+SOURCES = $(CORE_SOURCES) $(MARK_SOURCES)
+
+OBJECTS = $(SOURCES:.c=.o)
+
+
+##### RULES #####
+
+.c.o:
+ $(CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@
+
+.S.o:
+ $(CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@
+
+
+##### TARGETS #####
+
+default: depend $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME)
+
+
+# Make the library
+$(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME): depend $(OBJECTS)
+ $(TOP)/bin/mklib -o $(GLUT_LIB) -linker '$(CC)' \
+ -major $(GLUT_MAJOR) -minor $(GLUT_MINOR) -patch $(GLUT_TINY) \
+ $(GLUT_LIB_DEPS) -install $(TOP)/$(LIB_DIR) \
+ $(MKLIB_OPTIONS) $(OBJECTS)
+
+
+# Run 'make -f Makefile.solo dep' to update the dependencies if you change
+# what's included by any source file.
+depend: $(SOURCES)
+ touch depend
+ $(MKDEP) $(MKDEP_OPTIONS) $(INCLUDES) $(SOURCES) > /dev/null
+
+# Emacs tags
+tags:
+ etags `find . -name \*.[ch]` `find ../include`
+
+
+# Remove .o and backup files
+clean: depend
+ -rm -f depend
+ -rm -f *.o *~ *.o *~ *.so libglut.so.3.7
+
+include depend
diff --git a/src/glut/os2/Makefile b/src/glut/os2/Makefile
new file mode 100644
index 00000000000..56ad4e4c47f
--- /dev/null
+++ b/src/glut/os2/Makefile
@@ -0,0 +1,420 @@
+# Makefile
+# Created by IBM WorkFrame/2 MakeMake at 12:46:25 on 3 June 2003
+#
+# The actions included in this make file are:
+# Compile::C++ Compiler
+# Link::Linker
+# Lib::Import Lib
+
+.SUFFIXES:
+
+.SUFFIXES: \
+ .LIB .cpp .dll .obj
+
+.cpp.obj:
+ @echo " Compile::C++ Compiler "
+ icc.exe /I..\ /I..\X86 /I..\GL /I..\swrast /I..\swrast_setup /Ss /Wcmpcndcnscnvcpydclenuextgeninilanobsordparporppcprorearettrdtruund /Tx /O /Gm /Ge- /G5 /Gf /Gi /Oi /C %s
+
+{G:\EVGEN\MESA5\src-glut.os2pm}.cpp.obj:
+ @echo " Compile::C++ Compiler "
+ icc.exe /I..\ /I..\X86 /I..\GL /I..\swrast /I..\swrast_setup /Ss /Wcmpcndcnscnvcpydclenuextgeninilanobsordparporppcprorearettrdtruund /Tx /O /Gm /Ge- /G5 /Gf /Gi /Oi /C %s
+
+.dll.LIB:
+ @echo " Lib::Import Lib "
+ implib.exe %|dpfF.LIB %s
+
+{G:\EVGEN\MESA5\src-glut.os2pm}.dll.LIB:
+ @echo " Lib::Import Lib "
+ implib.exe %|dpfF.LIB %s
+
+all: \
+ .\libGlut.LIB
+
+.\libGlut.dll: \
+ .\os2_winproc.obj \
+ .\WarpWin.obj \
+ .\glutOverlay.obj \
+ .\glut_8x13.obj \
+ .\glut_9x15.obj \
+ .\glut_bitmap.obj \
+ .\glut_cindex.obj \
+ .\glut_cmap.obj \
+ .\glut_cursor.obj \
+ .\glut_event.obj \
+ .\glut_ext.obj \
+ .\glut_fullscrn.obj \
+ .\glut_gamemode.obj \
+ .\glut_get.obj \
+ .\glut_hel10.obj \
+ .\glut_hel12.obj \
+ .\glut_hel18.obj \
+ .\glut_init.obj \
+ .\glut_input.obj \
+ .\glut_key.obj \
+ .\glut_keyctrl.obj \
+ .\glut_keyup.obj \
+ .\glut_mesa.obj \
+ .\glut_modifier.obj \
+ .\glut_roman.obj \
+ .\glut_shapes.obj \
+ .\glut_stroke.obj \
+ .\glut_swap.obj \
+ .\glut_teapot.obj \
+ .\glut_tr24.obj \
+ .\glut_util.obj \
+ .\glut_vidresize.obj \
+ .\glut_warp.obj \
+ .\glut_win.obj \
+ .\glut_winmisc.obj \
+ .\os2_glx.obj \
+ .\os2_menu.obj \
+ ..\si-glu\libGLU.lib \
+ ..\MesaDll\MesaGL2.lib \
+ ..\drv\DrvLoad\MesaDrvLoad.lib \
+ {$(LIB)}libGlut.DEF
+ @echo " Link::Linker "
+ icc.exe @<<
+ /B" /dbgpack /exepack:2 /st:200000 /packd /optfunc"
+ /FelibGlut.dll
+ ..\si-glu\libGLU.lib
+ ..\MesaDll\MesaGL2.lib
+ ..\drv\DrvLoad\MesaDrvLoad.lib
+ libGlut.DEF
+ .\os2_winproc.obj
+ .\WarpWin.obj
+ .\glutOverlay.obj
+ .\glut_8x13.obj
+ .\glut_9x15.obj
+ .\glut_bitmap.obj
+ .\glut_cindex.obj
+ .\glut_cmap.obj
+ .\glut_cursor.obj
+ .\glut_event.obj
+ .\glut_ext.obj
+ .\glut_fullscrn.obj
+ .\glut_gamemode.obj
+ .\glut_get.obj
+ .\glut_hel10.obj
+ .\glut_hel12.obj
+ .\glut_hel18.obj
+ .\glut_init.obj
+ .\glut_input.obj
+ .\glut_key.obj
+ .\glut_keyctrl.obj
+ .\glut_keyup.obj
+ .\glut_mesa.obj
+ .\glut_modifier.obj
+ .\glut_roman.obj
+ .\glut_shapes.obj
+ .\glut_stroke.obj
+ .\glut_swap.obj
+ .\glut_teapot.obj
+ .\glut_tr24.obj
+ .\glut_util.obj
+ .\glut_vidresize.obj
+ .\glut_warp.obj
+ .\glut_win.obj
+ .\glut_winmisc.obj
+ .\os2_glx.obj
+ .\os2_menu.obj
+<<
+
+.\os2_winproc.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\os2_winproc.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h \
+ gl\os2mesa.h \
+ gl\gl.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}gl_mangle.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}GL/os2_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}os2_config.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}os2mesadef.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}context.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glapi.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}mtypes.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glheader.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}config.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glapitable.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glthread.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}math/m_matrix.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}Trace/tr_context.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}dd.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}conf.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}GL/os2_config.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}GL/glext.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}Xthreads.h
+
+.\os2_menu.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\os2_menu.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\os2_glx.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\os2_glx.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ gl\os2mesa.h \
+ gl\gl.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}gl_mangle.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}GL/os2_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}os2_config.h
+
+.\glut_winmisc.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_winmisc.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_win.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_win.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutos2.h \
+ gl\os2mesa.h \
+ gl\gl.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}gl_mangle.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}GL/os2_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}os2_config.h
+
+.\glut_warp.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_warp.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_vidresize.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_vidresize.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_util.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_util.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_tr24.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_tr24.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutbitmap.h
+
+.\glut_teapot.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_teapot.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_swap.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_swap.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_stroke.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_stroke.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutstroke.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_shapes.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_shapes.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_roman.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_roman.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutstroke.h
+
+.\glut_modifier.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_modifier.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_mesa.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_mesa.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_keyup.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_keyup.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_keyctrl.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_keyctrl.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_key.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_key.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_input.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_input.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_init.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_init.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_hel18.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_hel18.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutbitmap.h
+
+.\glut_hel12.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_hel12.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutbitmap.h
+
+.\glut_hel10.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_hel10.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutbitmap.h
+
+.\glut_get.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_get.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_gamemode.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_gamemode.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_fullscrn.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_fullscrn.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_ext.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_ext.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_event.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_event.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_cursor.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_cursor.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_cmap.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_cmap.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}layerutil.h
+
+.\glut_cindex.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_cindex.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_bitmap.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_bitmap.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutbitmap.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\glut_9x15.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_9x15.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutbitmap.h
+
+.\glut_8x13.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glut_8x13.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutbitmap.h
+
+.\glutOverlay.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\glutOverlay.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutint.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutbitmap.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutstroke.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}glutwin32.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_x11.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}win32_glx.h
+
+.\WarpWin.obj: \
+ G:\EVGEN\MESA5\src-glut.os2pm\WarpWin.cpp \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpWin.h \
+ {G:\EVGEN\MESA5\src-glut.os2pm;..\;..\X86;..\GL;..\swrast;..\swrast_setup;$(INCLUDE);}WarpGL.h
+
+.\libGlut.LIB: \
+ .\libGlut.dll
diff --git a/src/glut/os2/WarpWin.cpp b/src/glut/os2/WarpWin.cpp
new file mode 100644
index 00000000000..ee746ecc764
--- /dev/null
+++ b/src/glut/os2/WarpWin.cpp
@@ -0,0 +1,420 @@
+/* WarpWin.c */
+/* glut for Warp */
+#include <stdio.h>
+#include <string.h>
+
+#include "WarpWin.h"
+#include "WarpGL.h"
+
+#define POKA 0
+
+/* global variables that must be set for some functions to operate
+ correctly. */
+HDC XHDC;
+HWND XHWND;
+
+
+void
+XStoreColor(Display* display, Colormap colormap, XColor* color)
+{
+ /* KLUDGE: set XHDC to 0 if the palette should NOT be realized after
+ setting the color. set XHDC to the correct HDC if it should. */
+
+ LONG pe;
+ ULONG cclr;
+ int r,g,b;
+ /* X11 stores color from 0-65535, Win32 expects them to be 0-256, so
+ twiddle the bits ( / 256). */
+ r = color->red / 256;
+ g = color->green / 256;
+ b = color->blue / 256;
+ pe = LONGFromRGB(r,g,b);
+ /* make sure we use this flag, otherwise the colors might get mapped
+ to another place in the colormap, and when we glIndex() that
+ color, it may have moved (argh!!) */
+ pe |= (PC_NOCOLLAPSE<<24);
+/* This function changes the entries in a palette. */
+#if POKA
+OS2:
+ rc = GpiSetPaletteEntries(colormap,LCOLF_CONSECRGB, color->pixel, 1, &pe);
+ GpiSelectPalette(hps,colormap);
+ WinRealizePalette(hwnd,hps,&cclr);
+source Win:
+ if (XHDC) {
+ UnrealizeObject(colormap);
+ SelectPalette(XHDC, colormap, FALSE);
+ RealizePalette(XHDC);
+
+ }
+#endif
+}
+
+void
+XSetWindowColormap(Display* display, Window window, Colormap colormap)
+{
+#if POKA
+ HDC hdc = GetDC(window);
+
+ /* if the third parameter is FALSE, the logical colormap is copied
+ into the device palette when the application is in the
+ foreground, if it is TRUE, the colors are mapped into the current
+ palette in the best possible way. */
+ SelectPalette(hdc, colormap, FALSE);
+ RealizePalette(hdc);
+
+ /* note that we don't have to release the DC, since our window class
+ uses the WC_OWNDC flag! */
+#endif
+}
+
+
+/* display, root and visual - don't used at all */
+Colormap
+XCreateColormap(Display* display, Window root, Visual* visual, int alloc)
+{
+ /* KLUDGE: this function needs XHDC to be set to the HDC currently
+ being operated on before it is invoked! */
+
+ HPAL palette;
+ int n;
+#if POKA
+ PIXELFORMATDESCRIPTOR pfd;
+ LOGPALETTE *logical;
+
+ /* grab the pixel format */
+ memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
+ DescribePixelFormat(XHDC, GetPixelFormat(XHDC),
+ sizeof(PIXELFORMATDESCRIPTOR), &pfd);
+
+ if (!(pfd.dwFlags & PFD_NEED_PALETTE ||
+ pfd.iPixelType == PFD_TYPE_COLORINDEX))
+ {
+ return 0;
+ }
+
+ n = 1 << pfd.cColorBits;
+
+ /* allocate a bunch of memory for the logical palette (assume 256
+ colors in a Win32 palette */
+ logical = (LOGPALETTE*)malloc(sizeof(LOGPALETTE) +
+ sizeof(PALETTEENTRY) * n);
+ memset(logical, 0, sizeof(LOGPALETTE) + sizeof(PALETTEENTRY) * n);
+
+ /* set the entries in the logical palette */
+ logical->palVersion = 0x300;
+ logical->palNumEntries = n;
+
+ /* start with a copy of the current system palette */
+ GetSystemPaletteEntries(XHDC, 0, 256, &logical->palPalEntry[0]);
+
+ if (pfd.iPixelType == PFD_TYPE_RGBA) {
+ int redMask = (1 << pfd.cRedBits) - 1;
+ int greenMask = (1 << pfd.cGreenBits) - 1;
+ int blueMask = (1 << pfd.cBlueBits) - 1;
+ int i;
+
+ /* fill in an RGBA color palette */
+ for (i = 0; i < n; ++i) {
+ logical->palPalEntry[i].peRed =
+ (((i >> pfd.cRedShift) & redMask) * 255) / redMask;
+ logical->palPalEntry[i].peGreen =
+ (((i >> pfd.cGreenShift) & greenMask) * 255) / greenMask;
+ logical->palPalEntry[i].peBlue =
+ (((i >> pfd.cBlueShift) & blueMask) * 255) / blueMask;
+ logical->palPalEntry[i].peFlags = 0;
+ }
+ }
+
+ palette = CreatePalette(logical);
+ free(logical);
+
+ SelectPalette(XHDC, palette, FALSE);
+ RealizePalette(XHDC);
+#endif /* POKA */
+
+ return palette;
+}
+
+
+
+int GetSystemMetrics( int mode)
+{ RECTL rect;
+
+ switch(mode)
+ { case SM_CXSCREEN:
+ WinQueryWindowRect(HWND_DESKTOP,&rect);
+ return (rect.xRight-rect.xLeft);
+ break;
+ case SM_CYSCREEN:
+ WinQueryWindowRect(HWND_DESKTOP,&rect);
+ return (rect.yTop-rect.yBottom);
+ break;
+ default: ;
+ }
+ return 0;
+}
+/*
+ * XParseGeometry parses strings of the form
+ * "=<width>x<height>{+-}<xoffset>{+-}<yoffset>", where
+ * width, height, xoffset, and yoffset are unsigned integers.
+ * Example: "=80x24+300-49"
+ * The equal sign is optional.
+ * It returns a bitmask that indicates which of the four values
+ * were actually found in the string. For each value found,
+ * the corresponding argument is updated; for each value
+ * not found, the corresponding argument is left unchanged.
+ */
+
+static int
+ReadInteger(char *string, char **NextString)
+{
+ register int Result = 0;
+ int Sign = 1;
+
+ if (*string == '+')
+ string++;
+ else if (*string == '-')
+ {
+ string++;
+ Sign = -1;
+ }
+ for (; (*string >= '0') && (*string <= '9'); string++)
+ {
+ Result = (Result * 10) + (*string - '0');
+ }
+ *NextString = string;
+ if (Sign >= 0)
+ return (Result);
+ else
+ return (-Result);
+}
+
+int XParseGeometry(char *string, int *x, int *y, unsigned int *width, unsigned int *height)
+{
+ int mask = NoValue;
+ register char *strind;
+ unsigned int tempWidth, tempHeight;
+ int tempX, tempY;
+ char *nextCharacter;
+
+ if ( (string == NULL) || (*string == '\0')) return(mask);
+ if (*string == '=')
+ string++; /* ignore possible '=' at beg of geometry spec */
+
+ strind = (char *)string;
+ if (*strind != '+' && *strind != '-' && *strind != 'x') {
+ tempWidth = ReadInteger(strind, &nextCharacter);
+ if (strind == nextCharacter)
+ return (0);
+ strind = nextCharacter;
+ mask |= WidthValue;
+ }
+
+ if (*strind == 'x' || *strind == 'X') {
+ strind++;
+ tempHeight = ReadInteger(strind, &nextCharacter);
+ if (strind == nextCharacter)
+ return (0);
+ strind = nextCharacter;
+ mask |= HeightValue;
+ }
+
+ if ((*strind == '+') || (*strind == '-')) {
+ if (*strind == '-') {
+ strind++;
+ tempX = -ReadInteger(strind, &nextCharacter);
+ if (strind == nextCharacter)
+ return (0);
+ strind = nextCharacter;
+ mask |= XNegative;
+
+ }
+ else
+ { strind++;
+ tempX = ReadInteger(strind, &nextCharacter);
+ if (strind == nextCharacter)
+ return(0);
+ strind = nextCharacter;
+ }
+ mask |= XValue;
+ if ((*strind == '+') || (*strind == '-')) {
+ if (*strind == '-') {
+ strind++;
+ tempY = -ReadInteger(strind, &nextCharacter);
+ if (strind == nextCharacter)
+ return(0);
+ strind = nextCharacter;
+ mask |= YNegative;
+
+ }
+ else
+ {
+ strind++;
+ tempY = ReadInteger(strind, &nextCharacter);
+ if (strind == nextCharacter)
+ return(0);
+ strind = nextCharacter;
+ }
+ mask |= YValue;
+ }
+ }
+
+ /* If strind isn't at the end of the string the it's an invalid
+ geometry specification. */
+
+ if (*strind != '\0') return (0);
+
+ if (mask & XValue)
+ *x = tempX;
+ if (mask & YValue)
+ *y = tempY;
+ if (mask & WidthValue)
+ *width = tempWidth;
+ if (mask & HeightValue)
+ *height = tempHeight;
+ return (mask);
+}
+
+int gettimeofday(struct timeval* tp, void* tzp)
+{
+ DATETIME DateTime;
+ APIRET ulrc; /* Return Code. */
+
+ ulrc = DosGetDateTime(&DateTime);
+ tp->tv_sec = 60 * (60*DateTime.hours + DateTime.minutes) + DateTime.seconds;
+ tp->tv_usec = DateTime.hundredths * 10000;
+ return 0;
+}
+
+
+int
+XPending(Display* display)
+{
+ /* similar functionality...I don't think that it is exact, but this
+ will have to do. */
+ QMSG msg;
+ extern HAB hab; /* PM anchor block handle */
+
+//?? WinPeekMsg(hab
+ return WinPeekMsg(hab, &msg, NULLHANDLE, 0, 0, PM_NOREMOVE);
+}
+
+void
+__glutAdjustCoords(Window parent, int* x, int* y, int* width, int* height)
+{
+ RECTL rect;
+
+ /* adjust the window rectangle because Win32 thinks that the x, y,
+ width & height are the WHOLE window (including decorations),
+ whereas GLUT treats the x, y, width & height as only the CLIENT
+ area of the window. */
+ rect.xLeft = *x; rect.yTop = *y;
+ rect.xRight = *x + *width; rect.yBottom = *y + *height;
+
+ /* must adjust the coordinates according to the correct style
+ because depending on the style, there may or may not be
+ borders. */
+//?? AdjustWindowRect(&rect, WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
+//?? (parent ? WS_CHILD : WS_OVERLAPPEDWINDOW),
+//?? FALSE);
+ /* FALSE in the third parameter = window has no menu bar */
+
+ /* readjust if the x and y are offscreen */
+ if(rect.xLeft < 0) {
+ *x = 0;
+ } else {
+ *x = rect.xLeft;
+ }
+
+ if(rect.yTop < 0) {
+ *y = 0;
+ } else {
+ *y = rect.yTop;
+ }
+
+ *width = rect.xRight - rect.xLeft; /* adjusted width */
+ *height = -(rect.yBottom - rect.yTop); /* adjusted height */
+}
+
+
+int
+__glutGetTransparentPixel(Display * dpy, XVisualInfo * vinfo)
+{
+ /* the transparent pixel on Win32 is always index number 0. So if
+ we put this routine in this file, we can avoid compiling the
+ whole of layerutil.c which is where this routine normally comes
+ from. */
+ return 0;
+}
+
+/* Translate point coordinates src_x and src_y from src to dst */
+
+Bool
+XTranslateCoordinates(Display *display, Window src, Window dst,
+ int src_x, int src_y,
+ int* dest_x_return, int* dest_y_return,
+ Window* child_return)
+{
+ SWP swp_src,swp_dst;
+
+ WinQueryWindowPos(src,&swp_src);
+ WinQueryWindowPos(dst,&swp_dst);
+
+ *dest_x_return = src_x + swp_src.x - swp_dst.x;
+ *dest_y_return = src_y + swp_src.y - swp_dst.y;
+
+ /* just to make compilers happy...we don't use the return value. */
+ return True;
+}
+
+Status
+XGetGeometry(Display* display, Window window, Window* root_return,
+ int* x_return, int* y_return,
+ unsigned int* width_return, unsigned int* height_return,
+ unsigned int *border_width_return, unsigned int* depth_return)
+{
+ /* KLUDGE: doesn't return the border_width or depth or root, x & y
+ are in screen coordinates. */
+ SWP swp_src;
+ WinQueryWindowPos(window,&swp_src);
+
+ *x_return = swp_src.x;
+ *y_return = swp_src.y;
+ *width_return = swp_src.cx;
+ *height_return = swp_src.cy;
+
+ /* just to make compilers happy...we don't use the return value. */
+ return 1;
+}
+
+/* Get Display Width in millimeters */
+int
+DisplayWidthMM(Display* display, int screen)
+{
+ int width;
+ LONG *pVC_Caps;
+ pVC_Caps = GetVideoConfig(NULLHANDLE);
+ width = (int)( 0.001 * pVC_Caps[CAPS_WIDTH] / pVC_Caps[CAPS_HORIZONTAL_RESOLUTION]);/* mm */
+ return width;
+}
+
+/* Get Display Height in millimeters */
+int
+DisplayHeightMM(Display* display, int screen)
+{
+ int height;
+ LONG *pVC_Caps;
+ pVC_Caps = GetVideoConfig(NULLHANDLE);
+ height = (int)( 0.001 * pVC_Caps[CAPS_HEIGHT] / pVC_Caps[CAPS_VERTICAL_RESOLUTION]); /* mm */
+ return height;
+}
+
+void ScreenToClient( HWND hwnd, POINTL *point)
+{
+ SWP swp_src;
+ WinQueryWindowPos(hwnd,&swp_src);
+ point->x -= swp_src.x;
+ point->y -= swp_src.y;
+}
+
+ \ No newline at end of file
diff --git a/src/glut/os2/glutOverlay.cpp b/src/glut/os2/glutOverlay.cpp
new file mode 100644
index 00000000000..563708de2db
--- /dev/null
+++ b/src/glut/os2/glutOverlay.cpp
@@ -0,0 +1,133 @@
+/***********************************************************
+ * Copyright (C) 1997, Be Inc. All rights reserved.
+ *
+ * FILE: glutOverlay.cpp
+ *
+ * DESCRIPTION: we don't support overlays, so this code is
+ * really simple
+ ***********************************************************/
+
+/***********************************************************
+ * Headers
+ ***********************************************************/
+#include <GL/glut.h>
+#include "glutint.h"
+#include "glutbitmap.h"
+#include "glutstroke.h"
+
+GLUTAPI void GLUTAPIENTRY
+glutEstablishOverlay(void)
+{
+ __glutFatalError("OS2PM lacks overlay support.");
+}
+
+GLUTAPI void GLUTAPIENTRY
+glutUseLayer(GLenum layer) {
+ // ignore
+}
+
+GLUTAPI void GLUTAPIENTRY
+glutRemoveOverlay(void) {
+ // ignore
+}
+
+GLUTAPI void GLUTAPIENTRY
+glutPostOverlayRedisplay(void) {
+ // ignore
+}
+
+GLUTAPI void GLUTAPIENTRY
+glutShowOverlay(void) {
+ // ignore
+}
+
+GLUTAPI void GLUTAPIENTRY glutHideOverlay(void)
+{
+ // ignore
+}
+
+int GLUTAPIENTRY
+glutLayerGet(GLenum param)
+{
+ // ignore
+}
+
+/***********************************************************
+ * Unsupported callbacks
+ ***********************************************************/
+GLUTAPI void GLUTAPIENTRY
+glutOverlayDisplayFunc(GLUTdisplayCB displayFunc)
+{
+}
+
+GLUTAPI void GLUTAPIENTRY
+glutSpaceballMotionFunc(GLUTspaceMotionCB spaceMotionFunc)
+{
+}
+
+GLUTAPI void GLUTAPIENTRY
+glutSpaceballRotateFunc(GLUTspaceRotateCB spaceRotateFunc)
+{
+}
+
+GLUTAPI void GLUTAPIENTRY
+glutSpaceballButtonFunc(GLUTspaceButtonCB spaceButtonFunc)
+{
+}
+
+GLUTAPI void GLUTAPIENTRY
+glutButtonBoxFunc(GLUTbuttonBoxCB buttonBoxFunc)
+{
+}
+
+GLUTAPI void GLUTAPIENTRY
+glutDialsFunc(GLUTdialsCB dialsFunc)
+{
+}
+
+GLUTAPI void GLUTAPIENTRY
+glutTabletMotionFunc(GLUTtabletMotionCB tabletMotionFunc)
+{
+}
+
+GLUTAPI void GLUTAPIENTRY
+glutTabletButtonFunc(GLUTtabletButtonCB tabletButtonFunc)
+{
+}
+GLUTAPI void GLUTAPIENTRY
+glutPostWindowOverlayRedisplay(int win)
+{ //
+}
+
+void GLUTAPIENTRY
+glutInitDisplayString(const char *string)
+{ //
+}
+void GLUTAPIENTRY
+glutJoystickFunc(GLUTjoystickCB joystickFunc, int pollInterval)
+{ //
+}
+
+void GLUTAPIENTRY
+glutForceJoystickFunc(void)
+{ //
+}
+
+
+int GLUTAPIENTRY
+glutBitmapWidth(GLUTbitmapFont font, int c)
+{ return 0;
+}
+int GLUTAPIENTRY
+glutBitmapLength(GLUTbitmapFont font, const unsigned char *string)
+{ //
+ return 0;
+}
+int GLUTAPIENTRY
+glutStrokeWidth(GLUTstrokeFont font, int c)
+{ return 0;
+}
+int GLUTAPIENTRY
+glutStrokeLength(GLUTstrokeFont font, const unsigned char *string)
+{ return 0;
+}
diff --git a/src/glut/os2/glut_8x13.cpp b/src/glut/os2/glut_8x13.cpp
new file mode 100644
index 00000000000..e361e17cbfd
--- /dev/null
+++ b/src/glut/os2/glut_8x13.cpp
@@ -0,0 +1,2076 @@
+
+/* GENERATED FILE -- DO NOT MODIFY */
+
+#define glutBitmap8By13 XXX
+#include "glutbitmap.h"
+#undef glutBitmap8By13
+
+#ifdef _WIN32
+/* XXX Work around Microsoft OpenGL 1.1 bug where glBitmap with
+ a height or width of zero does not advance the raster position
+ as specified by OpenGL. (Cosmo OpenGL does not have this bug.) */
+static const GLubyte ch0data[] = { 0x0 };
+static const BitmapCharRec ch0 = {1,1,0,0,8,ch0data};
+#else
+static const BitmapCharRec ch0 = {0,0,0,0,8,0};
+#endif
+
+#ifdef _WIN32
+/* XXX Work around Microsoft OpenGL 1.1 bug where glBitmap with
+ a height or width of zero does not advance the raster position
+ as specified by OpenGL. (Cosmo OpenGL does not have this bug.) */
+static const GLubyte ch32data[] = { 0x0 };
+static const BitmapCharRec ch32 = {1,1,0,0,8,ch32data};
+#else
+static const BitmapCharRec ch32 = {0,0,0,0,8,0};
+#endif
+
+#ifdef _WIN32
+/* XXX Work around Microsoft OpenGL 1.1 bug where glBitmap with
+ a height or width of zero does not advance the raster position
+ as specified by OpenGL. (Cosmo OpenGL does not have this bug.) */
+static const GLubyte ch127data[] = { 0x0 };
+static const BitmapCharRec ch127 = {1,1,0,0,8,ch127data};
+#else
+static const BitmapCharRec ch127 = {0,0,0,0,8,0};
+#endif
+
+#ifdef _WIN32
+/* XXX Work around Microsoft OpenGL 1.1 bug where glBitmap with
+ a height or width of zero does not advance the raster position
+ as specified by OpenGL. (Cosmo OpenGL does not have this bug.) */
+static const GLubyte ch160data[] = { 0x0 };
+static const BitmapCharRec ch160 = {1,1,0,0,8,ch160data};
+#else
+static const BitmapCharRec ch160 = {0,0,0,0,8,0};
+#endif
+
+/* char: 0xff */
+
+static const GLubyte ch255data[] = {
+0x78,0x84,0x4,0x74,0x8c,0x84,0x84,0x84,0x0,0x0,0x48,0x48,
+};
+
+static const BitmapCharRec ch255 = {6,12,-1,2,8,ch255data};
+
+/* char: 0xfe */
+
+static const GLubyte ch254data[] = {
+0x80,0x80,0xb8,0xc4,0x84,0x84,0xc4,0xb8,0x80,0x80,
+};
+
+static const BitmapCharRec ch254 = {6,10,-1,2,8,ch254data};
+
+/* char: 0xfd */
+
+static const GLubyte ch253data[] = {
+0x78,0x84,0x4,0x74,0x8c,0x84,0x84,0x84,0x0,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch253 = {6,12,-1,2,8,ch253data};
+
+/* char: 0xfc */
+
+static const GLubyte ch252data[] = {
+0x74,0x88,0x88,0x88,0x88,0x88,0x0,0x0,0x48,0x48,
+};
+
+static const BitmapCharRec ch252 = {6,10,-1,0,8,ch252data};
+
+/* char: 0xfb */
+
+static const GLubyte ch251data[] = {
+0x74,0x88,0x88,0x88,0x88,0x88,0x0,0x0,0x48,0x30,
+};
+
+static const BitmapCharRec ch251 = {6,10,-1,0,8,ch251data};
+
+/* char: 0xfa */
+
+static const GLubyte ch250data[] = {
+0x74,0x88,0x88,0x88,0x88,0x88,0x0,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch250 = {6,10,-1,0,8,ch250data};
+
+/* char: 0xf9 */
+
+static const GLubyte ch249data[] = {
+0x74,0x88,0x88,0x88,0x88,0x88,0x0,0x0,0x10,0x20,
+};
+
+static const BitmapCharRec ch249 = {6,10,-1,0,8,ch249data};
+
+/* char: 0xf8 */
+
+static const GLubyte ch248data[] = {
+0x80,0x78,0xc4,0xa4,0x94,0x8c,0x78,0x4,
+};
+
+static const BitmapCharRec ch248 = {6,8,-1,1,8,ch248data};
+
+/* char: 0xf7 */
+
+static const GLubyte ch247data[] = {
+0x20,0x20,0x0,0xf8,0x0,0x20,0x20,
+};
+
+static const BitmapCharRec ch247 = {5,7,-1,-1,8,ch247data};
+
+/* char: 0xf6 */
+
+static const GLubyte ch246data[] = {
+0x78,0x84,0x84,0x84,0x84,0x78,0x0,0x0,0x48,0x48,
+};
+
+static const BitmapCharRec ch246 = {6,10,-1,0,8,ch246data};
+
+/* char: 0xf5 */
+
+static const GLubyte ch245data[] = {
+0x78,0x84,0x84,0x84,0x84,0x78,0x0,0x0,0x50,0x28,
+};
+
+static const BitmapCharRec ch245 = {6,10,-1,0,8,ch245data};
+
+/* char: 0xf4 */
+
+static const GLubyte ch244data[] = {
+0x78,0x84,0x84,0x84,0x84,0x78,0x0,0x0,0x48,0x30,
+};
+
+static const BitmapCharRec ch244 = {6,10,-1,0,8,ch244data};
+
+/* char: 0xf3 */
+
+static const GLubyte ch243data[] = {
+0x78,0x84,0x84,0x84,0x84,0x78,0x0,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch243 = {6,10,-1,0,8,ch243data};
+
+/* char: 0xf2 */
+
+static const GLubyte ch242data[] = {
+0x78,0x84,0x84,0x84,0x84,0x78,0x0,0x0,0x10,0x20,
+};
+
+static const BitmapCharRec ch242 = {6,10,-1,0,8,ch242data};
+
+/* char: 0xf1 */
+
+static const GLubyte ch241data[] = {
+0x84,0x84,0x84,0x84,0xc4,0xb8,0x0,0x0,0x50,0x28,
+};
+
+static const BitmapCharRec ch241 = {6,10,-1,0,8,ch241data};
+
+/* char: 0xf0 */
+
+static const GLubyte ch240data[] = {
+0x78,0x84,0x84,0x84,0x84,0x78,0x8,0x50,0x30,0x48,
+};
+
+static const BitmapCharRec ch240 = {6,10,-1,0,8,ch240data};
+
+/* char: 0xef */
+
+static const GLubyte ch239data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x60,0x0,0x0,0x50,0x50,
+};
+
+static const BitmapCharRec ch239 = {5,10,-1,0,8,ch239data};
+
+/* char: 0xee */
+
+static const GLubyte ch238data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x60,0x0,0x0,0x90,0x60,
+};
+
+static const BitmapCharRec ch238 = {5,10,-1,0,8,ch238data};
+
+/* char: 0xed */
+
+static const GLubyte ch237data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x60,0x0,0x0,0x40,0x20,
+};
+
+static const BitmapCharRec ch237 = {5,10,-1,0,8,ch237data};
+
+/* char: 0xec */
+
+static const GLubyte ch236data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x60,0x0,0x0,0x20,0x40,
+};
+
+static const BitmapCharRec ch236 = {5,10,-1,0,8,ch236data};
+
+/* char: 0xeb */
+
+static const GLubyte ch235data[] = {
+0x78,0x84,0x80,0xfc,0x84,0x78,0x0,0x0,0x48,0x48,
+};
+
+static const BitmapCharRec ch235 = {6,10,-1,0,8,ch235data};
+
+/* char: 0xea */
+
+static const GLubyte ch234data[] = {
+0x78,0x84,0x80,0xfc,0x84,0x78,0x0,0x0,0x48,0x30,
+};
+
+static const BitmapCharRec ch234 = {6,10,-1,0,8,ch234data};
+
+/* char: 0xe9 */
+
+static const GLubyte ch233data[] = {
+0x78,0x84,0x80,0xfc,0x84,0x78,0x0,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch233 = {6,10,-1,0,8,ch233data};
+
+/* char: 0xe8 */
+
+static const GLubyte ch232data[] = {
+0x78,0x84,0x80,0xfc,0x84,0x78,0x0,0x0,0x10,0x20,
+};
+
+static const BitmapCharRec ch232 = {6,10,-1,0,8,ch232data};
+
+/* char: 0xe7 */
+
+static const GLubyte ch231data[] = {
+0x20,0x10,0x78,0x84,0x80,0x80,0x84,0x78,
+};
+
+static const BitmapCharRec ch231 = {6,8,-1,2,8,ch231data};
+
+/* char: 0xe6 */
+
+static const GLubyte ch230data[] = {
+0x6c,0x92,0x90,0x7c,0x12,0x6c,
+};
+
+static const BitmapCharRec ch230 = {7,6,0,0,8,ch230data};
+
+/* char: 0xe5 */
+
+static const GLubyte ch229data[] = {
+0x74,0x8c,0x84,0x7c,0x4,0x78,0x0,0x30,0x48,0x30,
+};
+
+static const BitmapCharRec ch229 = {6,10,-1,0,8,ch229data};
+
+/* char: 0xe4 */
+
+static const GLubyte ch228data[] = {
+0x74,0x8c,0x84,0x7c,0x4,0x78,0x0,0x0,0x48,0x48,
+};
+
+static const BitmapCharRec ch228 = {6,10,-1,0,8,ch228data};
+
+/* char: 0xe3 */
+
+static const GLubyte ch227data[] = {
+0x74,0x8c,0x84,0x7c,0x4,0x78,0x0,0x0,0x50,0x28,
+};
+
+static const BitmapCharRec ch227 = {6,10,-1,0,8,ch227data};
+
+/* char: 0xe2 */
+
+static const GLubyte ch226data[] = {
+0x74,0x8c,0x84,0x7c,0x4,0x78,0x0,0x0,0x48,0x30,
+};
+
+static const BitmapCharRec ch226 = {6,10,-1,0,8,ch226data};
+
+/* char: 0xe1 */
+
+static const GLubyte ch225data[] = {
+0x74,0x8c,0x84,0x7c,0x4,0x78,0x0,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch225 = {6,10,-1,0,8,ch225data};
+
+/* char: 0xe0 */
+
+static const GLubyte ch224data[] = {
+0x74,0x8c,0x84,0x7c,0x4,0x78,0x0,0x0,0x10,0x20,
+};
+
+static const BitmapCharRec ch224 = {6,10,-1,0,8,ch224data};
+
+/* char: 0xdf */
+
+static const GLubyte ch223data[] = {
+0x80,0xb8,0xc4,0x84,0x84,0xf8,0x84,0x84,0x78,
+};
+
+static const BitmapCharRec ch223 = {6,9,-1,1,8,ch223data};
+
+/* char: 0xde */
+
+static const GLubyte ch222data[] = {
+0x80,0x80,0x80,0xf8,0x84,0x84,0x84,0xf8,0x80,
+};
+
+static const BitmapCharRec ch222 = {6,9,-1,0,8,ch222data};
+
+/* char: 0xdd */
+
+static const GLubyte ch221data[] = {
+0x20,0x20,0x20,0x20,0x50,0x88,0x88,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch221 = {5,10,-1,0,8,ch221data};
+
+/* char: 0xdc */
+
+static const GLubyte ch220data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x0,0x48,0x48,
+};
+
+static const BitmapCharRec ch220 = {6,10,-1,0,8,ch220data};
+
+/* char: 0xdb */
+
+static const GLubyte ch219data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x0,0x48,0x30,
+};
+
+static const BitmapCharRec ch219 = {6,10,-1,0,8,ch219data};
+
+/* char: 0xda */
+
+static const GLubyte ch218data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch218 = {6,10,-1,0,8,ch218data};
+
+/* char: 0xd9 */
+
+static const GLubyte ch217data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x0,0x10,0x20,
+};
+
+static const BitmapCharRec ch217 = {6,10,-1,0,8,ch217data};
+
+/* char: 0xd8 */
+
+static const GLubyte ch216data[] = {
+0x80,0x78,0xc4,0xa4,0xa4,0xa4,0x94,0x94,0x8c,0x78,0x4,
+};
+
+static const BitmapCharRec ch216 = {6,11,-1,1,8,ch216data};
+
+/* char: 0xd7 */
+
+static const GLubyte ch215data[] = {
+0x84,0x48,0x30,0x30,0x48,0x84,
+};
+
+static const BitmapCharRec ch215 = {6,6,-1,-1,8,ch215data};
+
+/* char: 0xd6 */
+
+static const GLubyte ch214data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x0,0x28,0x28,
+};
+
+static const BitmapCharRec ch214 = {7,10,0,0,8,ch214data};
+
+/* char: 0xd5 */
+
+static const GLubyte ch213data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x0,0x28,0x14,
+};
+
+static const BitmapCharRec ch213 = {7,10,0,0,8,ch213data};
+
+/* char: 0xd4 */
+
+static const GLubyte ch212data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x0,0x24,0x18,
+};
+
+static const BitmapCharRec ch212 = {7,10,0,0,8,ch212data};
+
+/* char: 0xd3 */
+
+static const GLubyte ch211data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x0,0x10,0x8,
+};
+
+static const BitmapCharRec ch211 = {7,10,0,0,8,ch211data};
+
+/* char: 0xd2 */
+
+static const GLubyte ch210data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x0,0x8,0x10,
+};
+
+static const BitmapCharRec ch210 = {7,10,0,0,8,ch210data};
+
+/* char: 0xd1 */
+
+static const GLubyte ch209data[] = {
+0x82,0x86,0x8a,0x92,0xa2,0xc2,0x82,0x0,0x28,0x14,
+};
+
+static const BitmapCharRec ch209 = {7,10,0,0,8,ch209data};
+
+/* char: 0xd0 */
+
+static const GLubyte ch208data[] = {
+0xfc,0x42,0x42,0x42,0xe2,0x42,0x42,0x42,0xfc,
+};
+
+static const BitmapCharRec ch208 = {7,9,0,0,8,ch208data};
+
+/* char: 0xcf */
+
+static const GLubyte ch207data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0xf8,0x0,0x50,0x50,
+};
+
+static const BitmapCharRec ch207 = {5,10,-1,0,8,ch207data};
+
+/* char: 0xce */
+
+static const GLubyte ch206data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0xf8,0x0,0x48,0x30,
+};
+
+static const BitmapCharRec ch206 = {5,10,-1,0,8,ch206data};
+
+/* char: 0xcd */
+
+static const GLubyte ch205data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0xf8,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch205 = {5,10,-1,0,8,ch205data};
+
+/* char: 0xcc */
+
+static const GLubyte ch204data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0xf8,0x0,0x10,0x20,
+};
+
+static const BitmapCharRec ch204 = {5,10,-1,0,8,ch204data};
+
+/* char: 0xcb */
+
+static const GLubyte ch203data[] = {
+0xfc,0x80,0x80,0xf0,0x80,0x80,0xfc,0x0,0x48,0x48,
+};
+
+static const BitmapCharRec ch203 = {6,10,-1,0,8,ch203data};
+
+/* char: 0xca */
+
+static const GLubyte ch202data[] = {
+0xfc,0x80,0x80,0xf0,0x80,0x80,0xfc,0x0,0x48,0x30,
+};
+
+static const BitmapCharRec ch202 = {6,10,-1,0,8,ch202data};
+
+/* char: 0xc9 */
+
+static const GLubyte ch201data[] = {
+0xfc,0x80,0x80,0xf0,0x80,0x80,0xfc,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch201 = {6,10,-1,0,8,ch201data};
+
+/* char: 0xc8 */
+
+static const GLubyte ch200data[] = {
+0xfc,0x80,0x80,0xf0,0x80,0x80,0xfc,0x0,0x10,0x20,
+};
+
+static const BitmapCharRec ch200 = {6,10,-1,0,8,ch200data};
+
+/* char: 0xc7 */
+
+static const GLubyte ch199data[] = {
+0x20,0x10,0x78,0x84,0x80,0x80,0x80,0x80,0x80,0x84,0x78,
+};
+
+static const BitmapCharRec ch199 = {6,11,-1,2,8,ch199data};
+
+/* char: 0xc6 */
+
+static const GLubyte ch198data[] = {
+0x9e,0x90,0x90,0xf0,0x9c,0x90,0x90,0x90,0x6e,
+};
+
+static const BitmapCharRec ch198 = {7,9,0,0,8,ch198data};
+
+/* char: 0xc5 */
+
+static const GLubyte ch197data[] = {
+0x84,0x84,0xfc,0x84,0x84,0x48,0x30,0x30,0x48,0x30,
+};
+
+static const BitmapCharRec ch197 = {6,10,-1,0,8,ch197data};
+
+/* char: 0xc4 */
+
+static const GLubyte ch196data[] = {
+0x84,0x84,0xfc,0x84,0x84,0x48,0x30,0x0,0x48,0x48,
+};
+
+static const BitmapCharRec ch196 = {6,10,-1,0,8,ch196data};
+
+/* char: 0xc3 */
+
+static const GLubyte ch195data[] = {
+0x84,0x84,0xfc,0x84,0x84,0x48,0x30,0x0,0x50,0x28,
+};
+
+static const BitmapCharRec ch195 = {6,10,-1,0,8,ch195data};
+
+/* char: 0xc2 */
+
+static const GLubyte ch194data[] = {
+0x84,0x84,0xfc,0x84,0x84,0x48,0x30,0x0,0x48,0x30,
+};
+
+static const BitmapCharRec ch194 = {6,10,-1,0,8,ch194data};
+
+/* char: 0xc1 */
+
+static const GLubyte ch193data[] = {
+0x84,0x84,0xfc,0x84,0x84,0x48,0x30,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch193 = {6,10,-1,0,8,ch193data};
+
+/* char: 0xc0 */
+
+static const GLubyte ch192data[] = {
+0x84,0x84,0xfc,0x84,0x84,0x48,0x30,0x0,0x10,0x20,
+};
+
+static const BitmapCharRec ch192 = {6,10,-1,0,8,ch192data};
+
+/* char: 0xbf */
+
+static const GLubyte ch191data[] = {
+0x78,0x84,0x84,0x80,0x40,0x20,0x20,0x0,0x20,
+};
+
+static const BitmapCharRec ch191 = {6,9,-1,0,8,ch191data};
+
+/* char: 0xbe */
+
+static const GLubyte ch190data[] = {
+0x6,0x1a,0x12,0xa,0x66,0x92,0x10,0x20,0x90,0x60,
+};
+
+static const BitmapCharRec ch190 = {7,10,0,0,8,ch190data};
+
+/* char: 0xbd */
+
+static const GLubyte ch189data[] = {
+0x1e,0x10,0xc,0x2,0xf2,0x4c,0x40,0x40,0xc0,0x40,
+};
+
+static const BitmapCharRec ch189 = {7,10,0,0,8,ch189data};
+
+/* char: 0xbc */
+
+static const GLubyte ch188data[] = {
+0x6,0x1a,0x12,0xa,0xe6,0x42,0x40,0x40,0xc0,0x40,
+};
+
+static const BitmapCharRec ch188 = {7,10,0,0,8,ch188data};
+
+/* char: 0xbb */
+
+static const GLubyte ch187data[] = {
+0x90,0x48,0x24,0x12,0x24,0x48,0x90,
+};
+
+static const BitmapCharRec ch187 = {7,7,0,-1,8,ch187data};
+
+/* char: 0xba */
+
+static const GLubyte ch186data[] = {
+0xf0,0x0,0x60,0x90,0x90,0x60,
+};
+
+static const BitmapCharRec ch186 = {4,6,-1,-3,8,ch186data};
+
+/* char: 0xb9 */
+
+static const GLubyte ch185data[] = {
+0xe0,0x40,0x40,0x40,0xc0,0x40,
+};
+
+static const BitmapCharRec ch185 = {3,6,-1,-4,8,ch185data};
+
+/* char: 0xb8 */
+
+static const GLubyte ch184data[] = {
+0xc0,0x40,
+};
+
+static const BitmapCharRec ch184 = {2,2,-3,2,8,ch184data};
+
+/* char: 0xb7 */
+
+static const GLubyte ch183data[] = {
+0xc0,
+};
+
+static const BitmapCharRec ch183 = {2,1,-3,-4,8,ch183data};
+
+/* char: 0xb6 */
+
+static const GLubyte ch182data[] = {
+0x28,0x28,0x28,0x28,0x68,0xe8,0xe8,0xe8,0x7c,
+};
+
+static const BitmapCharRec ch182 = {6,9,-1,0,8,ch182data};
+
+/* char: 0xb5 */
+
+static const GLubyte ch181data[] = {
+0x80,0xb4,0xcc,0x84,0x84,0x84,0x84,
+};
+
+static const BitmapCharRec ch181 = {6,7,-1,1,8,ch181data};
+
+/* char: 0xb4 */
+
+static const GLubyte ch180data[] = {
+0x80,0x40,
+};
+
+static const BitmapCharRec ch180 = {2,2,-3,-8,8,ch180data};
+
+/* char: 0xb3 */
+
+static const GLubyte ch179data[] = {
+0x60,0x90,0x10,0x20,0x90,0x60,
+};
+
+static const BitmapCharRec ch179 = {4,6,-1,-4,8,ch179data};
+
+/* char: 0xb2 */
+
+static const GLubyte ch178data[] = {
+0xf0,0x80,0x60,0x10,0x90,0x60,
+};
+
+static const BitmapCharRec ch178 = {4,6,-1,-4,8,ch178data};
+
+/* char: 0xb1 */
+
+static const GLubyte ch177data[] = {
+0xf8,0x0,0x20,0x20,0xf8,0x20,0x20,
+};
+
+static const BitmapCharRec ch177 = {5,7,-1,-1,8,ch177data};
+
+/* char: 0xb0 */
+
+static const GLubyte ch176data[] = {
+0x60,0x90,0x90,0x60,
+};
+
+static const BitmapCharRec ch176 = {4,4,-2,-5,8,ch176data};
+
+/* char: 0xaf */
+
+static const GLubyte ch175data[] = {
+0xfc,
+};
+
+static const BitmapCharRec ch175 = {6,1,-1,-8,8,ch175data};
+
+/* char: 0xae */
+
+static const GLubyte ch174data[] = {
+0x38,0x44,0xaa,0xb2,0xaa,0xaa,0x92,0x44,0x38,
+};
+
+static const BitmapCharRec ch174 = {7,9,0,-1,8,ch174data};
+
+/* char: 0xad */
+
+static const GLubyte ch173data[] = {
+0xfc,
+};
+
+static const BitmapCharRec ch173 = {6,1,-1,-4,8,ch173data};
+
+/* char: 0xac */
+
+static const GLubyte ch172data[] = {
+0x4,0x4,0x4,0xfc,
+};
+
+static const BitmapCharRec ch172 = {6,4,-1,-1,8,ch172data};
+
+/* char: 0xab */
+
+static const GLubyte ch171data[] = {
+0x12,0x24,0x48,0x90,0x48,0x24,0x12,
+};
+
+static const BitmapCharRec ch171 = {7,7,0,-1,8,ch171data};
+
+/* char: 0xaa */
+
+static const GLubyte ch170data[] = {
+0xf8,0x0,0x78,0x88,0x78,0x8,0x70,
+};
+
+static const BitmapCharRec ch170 = {5,7,-1,-2,8,ch170data};
+
+/* char: 0xa9 */
+
+static const GLubyte ch169data[] = {
+0x38,0x44,0x92,0xaa,0xa2,0xaa,0x92,0x44,0x38,
+};
+
+static const BitmapCharRec ch169 = {7,9,0,-1,8,ch169data};
+
+/* char: 0xa8 */
+
+static const GLubyte ch168data[] = {
+0xd8,
+};
+
+static const BitmapCharRec ch168 = {5,1,-1,-8,8,ch168data};
+
+/* char: 0xa7 */
+
+static const GLubyte ch167data[] = {
+0x60,0x90,0x10,0x60,0x90,0x90,0x60,0x80,0x90,0x60,
+};
+
+static const BitmapCharRec ch167 = {4,10,-2,0,8,ch167data};
+
+/* char: 0xa6 */
+
+static const GLubyte ch166data[] = {
+0x80,0x80,0x80,0x80,0x0,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch166 = {1,9,-3,0,8,ch166data};
+
+/* char: 0xa5 */
+
+static const GLubyte ch165data[] = {
+0x10,0x10,0x7c,0x10,0x7c,0x28,0x44,0x82,0x82,
+};
+
+static const BitmapCharRec ch165 = {7,9,0,0,8,ch165data};
+
+/* char: 0xa4 */
+
+static const GLubyte ch164data[] = {
+0x84,0x78,0x48,0x48,0x78,0x84,
+};
+
+static const BitmapCharRec ch164 = {6,6,-1,-1,8,ch164data};
+
+/* char: 0xa3 */
+
+static const GLubyte ch163data[] = {
+0xdc,0x62,0x20,0x20,0x20,0x70,0x20,0x22,0x1c,
+};
+
+static const BitmapCharRec ch163 = {7,9,0,0,8,ch163data};
+
+/* char: 0xa2 */
+
+static const GLubyte ch162data[] = {
+0x20,0x70,0xa8,0xa0,0xa0,0xa8,0x70,0x20,
+};
+
+static const BitmapCharRec ch162 = {5,8,-1,-1,8,ch162data};
+
+/* char: 0xa1 */
+
+static const GLubyte ch161data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x0,0x80,
+};
+
+static const BitmapCharRec ch161 = {1,9,-3,0,8,ch161data};
+
+/* char: 0x7e '~' */
+
+static const GLubyte ch126data[] = {
+0x90,0xa8,0x48,
+};
+
+static const BitmapCharRec ch126 = {5,3,-1,-6,8,ch126data};
+
+/* char: 0x7d '}' */
+
+static const GLubyte ch125data[] = {
+0xe0,0x10,0x10,0x20,0x18,0x20,0x10,0x10,0xe0,
+};
+
+static const BitmapCharRec ch125 = {5,9,-1,0,8,ch125data};
+
+/* char: 0x7c '|' */
+
+static const GLubyte ch124data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch124 = {1,9,-3,0,8,ch124data};
+
+/* char: 0x7b '{' */
+
+static const GLubyte ch123data[] = {
+0x38,0x40,0x40,0x20,0xc0,0x20,0x40,0x40,0x38,
+};
+
+static const BitmapCharRec ch123 = {5,9,-2,0,8,ch123data};
+
+/* char: 0x7a 'z' */
+
+static const GLubyte ch122data[] = {
+0xfc,0x40,0x20,0x10,0x8,0xfc,
+};
+
+static const BitmapCharRec ch122 = {6,6,-1,0,8,ch122data};
+
+/* char: 0x79 'y' */
+
+static const GLubyte ch121data[] = {
+0x78,0x84,0x4,0x74,0x8c,0x84,0x84,0x84,
+};
+
+static const BitmapCharRec ch121 = {6,8,-1,2,8,ch121data};
+
+/* char: 0x78 'x' */
+
+static const GLubyte ch120data[] = {
+0x84,0x48,0x30,0x30,0x48,0x84,
+};
+
+static const BitmapCharRec ch120 = {6,6,-1,0,8,ch120data};
+
+/* char: 0x77 'w' */
+
+static const GLubyte ch119data[] = {
+0x44,0xaa,0x92,0x92,0x82,0x82,
+};
+
+static const BitmapCharRec ch119 = {7,6,0,0,8,ch119data};
+
+/* char: 0x76 'v' */
+
+static const GLubyte ch118data[] = {
+0x20,0x50,0x50,0x88,0x88,0x88,
+};
+
+static const BitmapCharRec ch118 = {5,6,-1,0,8,ch118data};
+
+/* char: 0x75 'u' */
+
+static const GLubyte ch117data[] = {
+0x74,0x88,0x88,0x88,0x88,0x88,
+};
+
+static const BitmapCharRec ch117 = {6,6,-1,0,8,ch117data};
+
+/* char: 0x74 't' */
+
+static const GLubyte ch116data[] = {
+0x38,0x44,0x40,0x40,0x40,0xf8,0x40,0x40,
+};
+
+static const BitmapCharRec ch116 = {6,8,-1,0,8,ch116data};
+
+/* char: 0x73 's' */
+
+static const GLubyte ch115data[] = {
+0x78,0x84,0x18,0x60,0x84,0x78,
+};
+
+static const BitmapCharRec ch115 = {6,6,-1,0,8,ch115data};
+
+/* char: 0x72 'r' */
+
+static const GLubyte ch114data[] = {
+0x40,0x40,0x40,0x40,0x44,0xb8,
+};
+
+static const BitmapCharRec ch114 = {6,6,-1,0,8,ch114data};
+
+/* char: 0x71 'q' */
+
+static const GLubyte ch113data[] = {
+0x4,0x4,0x4,0x74,0x8c,0x84,0x8c,0x74,
+};
+
+static const BitmapCharRec ch113 = {6,8,-1,2,8,ch113data};
+
+/* char: 0x70 'p' */
+
+static const GLubyte ch112data[] = {
+0x80,0x80,0x80,0xb8,0xc4,0x84,0xc4,0xb8,
+};
+
+static const BitmapCharRec ch112 = {6,8,-1,2,8,ch112data};
+
+/* char: 0x6f 'o' */
+
+static const GLubyte ch111data[] = {
+0x78,0x84,0x84,0x84,0x84,0x78,
+};
+
+static const BitmapCharRec ch111 = {6,6,-1,0,8,ch111data};
+
+/* char: 0x6e 'n' */
+
+static const GLubyte ch110data[] = {
+0x84,0x84,0x84,0x84,0xc4,0xb8,
+};
+
+static const BitmapCharRec ch110 = {6,6,-1,0,8,ch110data};
+
+/* char: 0x6d 'm' */
+
+static const GLubyte ch109data[] = {
+0x82,0x92,0x92,0x92,0x92,0xec,
+};
+
+static const BitmapCharRec ch109 = {7,6,0,0,8,ch109data};
+
+/* char: 0x6c 'l' */
+
+static const GLubyte ch108data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x60,
+};
+
+static const BitmapCharRec ch108 = {5,9,-1,0,8,ch108data};
+
+/* char: 0x6b 'k' */
+
+static const GLubyte ch107data[] = {
+0x84,0x88,0x90,0xe0,0x90,0x88,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch107 = {6,9,-1,0,8,ch107data};
+
+/* char: 0x6a 'j' */
+
+static const GLubyte ch106data[] = {
+0x70,0x88,0x88,0x8,0x8,0x8,0x8,0x18,0x0,0x8,
+};
+
+static const BitmapCharRec ch106 = {5,10,-1,2,8,ch106data};
+
+/* char: 0x69 'i' */
+
+static const GLubyte ch105data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x60,0x0,0x20,
+};
+
+static const BitmapCharRec ch105 = {5,8,-1,0,8,ch105data};
+
+/* char: 0x68 'h' */
+
+static const GLubyte ch104data[] = {
+0x84,0x84,0x84,0x84,0xc4,0xb8,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch104 = {6,9,-1,0,8,ch104data};
+
+/* char: 0x67 'g' */
+
+static const GLubyte ch103data[] = {
+0x78,0x84,0x78,0x80,0x70,0x88,0x88,0x74,
+};
+
+static const BitmapCharRec ch103 = {6,8,-1,2,8,ch103data};
+
+/* char: 0x66 'f' */
+
+static const GLubyte ch102data[] = {
+0x40,0x40,0x40,0x40,0xf8,0x40,0x40,0x44,0x38,
+};
+
+static const BitmapCharRec ch102 = {6,9,-1,0,8,ch102data};
+
+/* char: 0x65 'e' */
+
+static const GLubyte ch101data[] = {
+0x78,0x84,0x80,0xfc,0x84,0x78,
+};
+
+static const BitmapCharRec ch101 = {6,6,-1,0,8,ch101data};
+
+/* char: 0x64 'd' */
+
+static const GLubyte ch100data[] = {
+0x74,0x8c,0x84,0x84,0x8c,0x74,0x4,0x4,0x4,
+};
+
+static const BitmapCharRec ch100 = {6,9,-1,0,8,ch100data};
+
+/* char: 0x63 'c' */
+
+static const GLubyte ch99data[] = {
+0x78,0x84,0x80,0x80,0x84,0x78,
+};
+
+static const BitmapCharRec ch99 = {6,6,-1,0,8,ch99data};
+
+/* char: 0x62 'b' */
+
+static const GLubyte ch98data[] = {
+0xb8,0xc4,0x84,0x84,0xc4,0xb8,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch98 = {6,9,-1,0,8,ch98data};
+
+/* char: 0x61 'a' */
+
+static const GLubyte ch97data[] = {
+0x74,0x8c,0x84,0x7c,0x4,0x78,
+};
+
+static const BitmapCharRec ch97 = {6,6,-1,0,8,ch97data};
+
+/* char: 0x60 '`' */
+
+static const GLubyte ch96data[] = {
+0x10,0x60,0xe0,
+};
+
+static const BitmapCharRec ch96 = {4,3,-2,-6,8,ch96data};
+
+/* char: 0x5f '_' */
+
+static const GLubyte ch95data[] = {
+0xfe,
+};
+
+static const BitmapCharRec ch95 = {7,1,0,1,8,ch95data};
+
+/* char: 0x5e '^' */
+
+static const GLubyte ch94data[] = {
+0x88,0x50,0x20,
+};
+
+static const BitmapCharRec ch94 = {5,3,-1,-6,8,ch94data};
+
+/* char: 0x5d ']' */
+
+static const GLubyte ch93data[] = {
+0xf0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xf0,
+};
+
+static const BitmapCharRec ch93 = {4,9,-1,0,8,ch93data};
+
+/* char: 0x5c '\' */
+
+static const GLubyte ch92data[] = {
+0x2,0x2,0x4,0x8,0x10,0x20,0x40,0x80,0x80,
+};
+
+static const BitmapCharRec ch92 = {7,9,0,0,8,ch92data};
+
+/* char: 0x5b '[' */
+
+static const GLubyte ch91data[] = {
+0xf0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xf0,
+};
+
+static const BitmapCharRec ch91 = {4,9,-2,0,8,ch91data};
+
+/* char: 0x5a 'Z' */
+
+static const GLubyte ch90data[] = {
+0xfc,0x80,0x80,0x40,0x20,0x10,0x8,0x4,0xfc,
+};
+
+static const BitmapCharRec ch90 = {6,9,-1,0,8,ch90data};
+
+/* char: 0x59 'Y' */
+
+static const GLubyte ch89data[] = {
+0x10,0x10,0x10,0x10,0x10,0x28,0x44,0x82,0x82,
+};
+
+static const BitmapCharRec ch89 = {7,9,0,0,8,ch89data};
+
+/* char: 0x58 'X' */
+
+static const GLubyte ch88data[] = {
+0x82,0x82,0x44,0x28,0x10,0x28,0x44,0x82,0x82,
+};
+
+static const BitmapCharRec ch88 = {7,9,0,0,8,ch88data};
+
+/* char: 0x57 'W' */
+
+static const GLubyte ch87data[] = {
+0x44,0xaa,0x92,0x92,0x92,0x82,0x82,0x82,0x82,
+};
+
+static const BitmapCharRec ch87 = {7,9,0,0,8,ch87data};
+
+/* char: 0x56 'V' */
+
+static const GLubyte ch86data[] = {
+0x10,0x28,0x28,0x28,0x44,0x44,0x44,0x82,0x82,
+};
+
+static const BitmapCharRec ch86 = {7,9,0,0,8,ch86data};
+
+/* char: 0x55 'U' */
+
+static const GLubyte ch85data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,
+};
+
+static const BitmapCharRec ch85 = {6,9,-1,0,8,ch85data};
+
+/* char: 0x54 'T' */
+
+static const GLubyte ch84data[] = {
+0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xfe,
+};
+
+static const BitmapCharRec ch84 = {7,9,0,0,8,ch84data};
+
+/* char: 0x53 'S' */
+
+static const GLubyte ch83data[] = {
+0x78,0x84,0x4,0x4,0x78,0x80,0x80,0x84,0x78,
+};
+
+static const BitmapCharRec ch83 = {6,9,-1,0,8,ch83data};
+
+/* char: 0x52 'R' */
+
+static const GLubyte ch82data[] = {
+0x84,0x88,0x90,0xa0,0xf8,0x84,0x84,0x84,0xf8,
+};
+
+static const BitmapCharRec ch82 = {6,9,-1,0,8,ch82data};
+
+/* char: 0x51 'Q' */
+
+static const GLubyte ch81data[] = {
+0x4,0x78,0x94,0xa4,0x84,0x84,0x84,0x84,0x84,0x78,
+};
+
+static const BitmapCharRec ch81 = {6,10,-1,1,8,ch81data};
+
+/* char: 0x50 'P' */
+
+static const GLubyte ch80data[] = {
+0x80,0x80,0x80,0x80,0xf8,0x84,0x84,0x84,0xf8,
+};
+
+static const BitmapCharRec ch80 = {6,9,-1,0,8,ch80data};
+
+/* char: 0x4f 'O' */
+
+static const GLubyte ch79data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x78,
+};
+
+static const BitmapCharRec ch79 = {6,9,-1,0,8,ch79data};
+
+/* char: 0x4e 'N' */
+
+static const GLubyte ch78data[] = {
+0x84,0x84,0x84,0x8c,0x94,0xa4,0xc4,0x84,0x84,
+};
+
+static const BitmapCharRec ch78 = {6,9,-1,0,8,ch78data};
+
+/* char: 0x4d 'M' */
+
+static const GLubyte ch77data[] = {
+0x82,0x82,0x82,0x92,0x92,0xaa,0xc6,0x82,0x82,
+};
+
+static const BitmapCharRec ch77 = {7,9,0,0,8,ch77data};
+
+/* char: 0x4c 'L' */
+
+static const GLubyte ch76data[] = {
+0xfc,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch76 = {6,9,-1,0,8,ch76data};
+
+/* char: 0x4b 'K' */
+
+static const GLubyte ch75data[] = {
+0x84,0x88,0x90,0xa0,0xc0,0xa0,0x90,0x88,0x84,
+};
+
+static const BitmapCharRec ch75 = {6,9,-1,0,8,ch75data};
+
+/* char: 0x4a 'J' */
+
+static const GLubyte ch74data[] = {
+0x70,0x88,0x8,0x8,0x8,0x8,0x8,0x8,0x3c,
+};
+
+static const BitmapCharRec ch74 = {6,9,-1,0,8,ch74data};
+
+/* char: 0x49 'I' */
+
+static const GLubyte ch73data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xf8,
+};
+
+static const BitmapCharRec ch73 = {5,9,-1,0,8,ch73data};
+
+/* char: 0x48 'H' */
+
+static const GLubyte ch72data[] = {
+0x84,0x84,0x84,0x84,0xfc,0x84,0x84,0x84,0x84,
+};
+
+static const BitmapCharRec ch72 = {6,9,-1,0,8,ch72data};
+
+/* char: 0x47 'G' */
+
+static const GLubyte ch71data[] = {
+0x74,0x8c,0x84,0x9c,0x80,0x80,0x80,0x84,0x78,
+};
+
+static const BitmapCharRec ch71 = {6,9,-1,0,8,ch71data};
+
+/* char: 0x46 'F' */
+
+static const GLubyte ch70data[] = {
+0x80,0x80,0x80,0x80,0xf0,0x80,0x80,0x80,0xfc,
+};
+
+static const BitmapCharRec ch70 = {6,9,-1,0,8,ch70data};
+
+/* char: 0x45 'E' */
+
+static const GLubyte ch69data[] = {
+0xfc,0x80,0x80,0x80,0xf0,0x80,0x80,0x80,0xfc,
+};
+
+static const BitmapCharRec ch69 = {6,9,-1,0,8,ch69data};
+
+/* char: 0x44 'D' */
+
+static const GLubyte ch68data[] = {
+0xfc,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xfc,
+};
+
+static const BitmapCharRec ch68 = {7,9,0,0,8,ch68data};
+
+/* char: 0x43 'C' */
+
+static const GLubyte ch67data[] = {
+0x78,0x84,0x80,0x80,0x80,0x80,0x80,0x84,0x78,
+};
+
+static const BitmapCharRec ch67 = {6,9,-1,0,8,ch67data};
+
+/* char: 0x42 'B' */
+
+static const GLubyte ch66data[] = {
+0xfc,0x42,0x42,0x42,0x7c,0x42,0x42,0x42,0xfc,
+};
+
+static const BitmapCharRec ch66 = {7,9,0,0,8,ch66data};
+
+/* char: 0x41 'A' */
+
+static const GLubyte ch65data[] = {
+0x84,0x84,0x84,0xfc,0x84,0x84,0x84,0x48,0x30,
+};
+
+static const BitmapCharRec ch65 = {6,9,-1,0,8,ch65data};
+
+/* char: 0x40 '@' */
+
+static const GLubyte ch64data[] = {
+0x78,0x80,0x94,0xac,0xa4,0x9c,0x84,0x84,0x78,
+};
+
+static const BitmapCharRec ch64 = {6,9,-1,0,8,ch64data};
+
+/* char: 0x3f '?' */
+
+static const GLubyte ch63data[] = {
+0x10,0x0,0x10,0x10,0x8,0x4,0x84,0x84,0x78,
+};
+
+static const BitmapCharRec ch63 = {6,9,-1,0,8,ch63data};
+
+/* char: 0x3e '>' */
+
+static const GLubyte ch62data[] = {
+0x80,0x40,0x20,0x10,0x8,0x10,0x20,0x40,0x80,
+};
+
+static const BitmapCharRec ch62 = {5,9,-1,0,8,ch62data};
+
+/* char: 0x3d '=' */
+
+static const GLubyte ch61data[] = {
+0xfc,0x0,0x0,0xfc,
+};
+
+static const BitmapCharRec ch61 = {6,4,-1,-2,8,ch61data};
+
+/* char: 0x3c '<' */
+
+static const GLubyte ch60data[] = {
+0x8,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x8,
+};
+
+static const BitmapCharRec ch60 = {5,9,-2,0,8,ch60data};
+
+/* char: 0x3b ';' */
+
+static const GLubyte ch59data[] = {
+0x80,0x60,0x70,0x0,0x0,0x20,0x70,0x20,
+};
+
+static const BitmapCharRec ch59 = {4,8,-1,1,8,ch59data};
+
+/* char: 0x3a ':' */
+
+static const GLubyte ch58data[] = {
+0x40,0xe0,0x40,0x0,0x0,0x40,0xe0,0x40,
+};
+
+static const BitmapCharRec ch58 = {3,8,-2,1,8,ch58data};
+
+/* char: 0x39 '9' */
+
+static const GLubyte ch57data[] = {
+0x70,0x8,0x4,0x4,0x74,0x8c,0x84,0x84,0x78,
+};
+
+static const BitmapCharRec ch57 = {6,9,-1,0,8,ch57data};
+
+/* char: 0x38 '8' */
+
+static const GLubyte ch56data[] = {
+0x78,0x84,0x84,0x84,0x78,0x84,0x84,0x84,0x78,
+};
+
+static const BitmapCharRec ch56 = {6,9,-1,0,8,ch56data};
+
+/* char: 0x37 '7' */
+
+static const GLubyte ch55data[] = {
+0x40,0x40,0x20,0x20,0x10,0x10,0x8,0x4,0xfc,
+};
+
+static const BitmapCharRec ch55 = {6,9,-1,0,8,ch55data};
+
+/* char: 0x36 '6' */
+
+static const GLubyte ch54data[] = {
+0x78,0x84,0x84,0xc4,0xb8,0x80,0x80,0x40,0x38,
+};
+
+static const BitmapCharRec ch54 = {6,9,-1,0,8,ch54data};
+
+/* char: 0x35 '5' */
+
+static const GLubyte ch53data[] = {
+0x78,0x84,0x4,0x4,0xc4,0xb8,0x80,0x80,0xfc,
+};
+
+static const BitmapCharRec ch53 = {6,9,-1,0,8,ch53data};
+
+/* char: 0x34 '4' */
+
+static const GLubyte ch52data[] = {
+0x8,0x8,0xfc,0x88,0x88,0x48,0x28,0x18,0x8,
+};
+
+static const BitmapCharRec ch52 = {6,9,-1,0,8,ch52data};
+
+/* char: 0x33 '3' */
+
+static const GLubyte ch51data[] = {
+0x78,0x84,0x4,0x4,0x38,0x10,0x8,0x4,0xfc,
+};
+
+static const BitmapCharRec ch51 = {6,9,-1,0,8,ch51data};
+
+/* char: 0x32 '2' */
+
+static const GLubyte ch50data[] = {
+0xfc,0x80,0x40,0x30,0x8,0x4,0x84,0x84,0x78,
+};
+
+static const BitmapCharRec ch50 = {6,9,-1,0,8,ch50data};
+
+/* char: 0x31 '1' */
+
+static const GLubyte ch49data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0xa0,0x60,0x20,
+};
+
+static const BitmapCharRec ch49 = {5,9,-1,0,8,ch49data};
+
+/* char: 0x30 '0' */
+
+static const GLubyte ch48data[] = {
+0x30,0x48,0x84,0x84,0x84,0x84,0x84,0x48,0x30,
+};
+
+static const BitmapCharRec ch48 = {6,9,-1,0,8,ch48data};
+
+/* char: 0x2f '/' */
+
+static const GLubyte ch47data[] = {
+0x80,0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x2,
+};
+
+static const BitmapCharRec ch47 = {7,9,0,0,8,ch47data};
+
+/* char: 0x2e '.' */
+
+static const GLubyte ch46data[] = {
+0x40,0xe0,0x40,
+};
+
+static const BitmapCharRec ch46 = {3,3,-2,1,8,ch46data};
+
+/* char: 0x2d '-' */
+
+static const GLubyte ch45data[] = {
+0xfc,
+};
+
+static const BitmapCharRec ch45 = {6,1,-1,-4,8,ch45data};
+
+/* char: 0x2c ',' */
+
+static const GLubyte ch44data[] = {
+0x80,0x60,0x70,
+};
+
+static const BitmapCharRec ch44 = {4,3,-1,1,8,ch44data};
+
+/* char: 0x2b '+' */
+
+static const GLubyte ch43data[] = {
+0x20,0x20,0xf8,0x20,0x20,
+};
+
+static const BitmapCharRec ch43 = {5,5,-1,-2,8,ch43data};
+
+/* char: 0x2a '*' */
+
+static const GLubyte ch42data[] = {
+0x48,0x30,0xfc,0x30,0x48,
+};
+
+static const BitmapCharRec ch42 = {6,5,-1,-2,8,ch42data};
+
+/* char: 0x29 ')' */
+
+static const GLubyte ch41data[] = {
+0x80,0x40,0x40,0x20,0x20,0x20,0x40,0x40,0x80,
+};
+
+static const BitmapCharRec ch41 = {3,9,-2,0,8,ch41data};
+
+/* char: 0x28 '(' */
+
+static const GLubyte ch40data[] = {
+0x20,0x40,0x40,0x80,0x80,0x80,0x40,0x40,0x20,
+};
+
+static const BitmapCharRec ch40 = {3,9,-3,0,8,ch40data};
+
+/* char: 0x27 ''' */
+
+static const GLubyte ch39data[] = {
+0x80,0x60,0x70,
+};
+
+static const BitmapCharRec ch39 = {4,3,-1,-6,8,ch39data};
+
+/* char: 0x26 '&' */
+
+static const GLubyte ch38data[] = {
+0x74,0x88,0x94,0x60,0x90,0x90,0x60,
+};
+
+static const BitmapCharRec ch38 = {6,7,-1,0,8,ch38data};
+
+/* char: 0x25 '%' */
+
+static const GLubyte ch37data[] = {
+0x88,0x54,0x48,0x20,0x10,0x10,0x48,0xa4,0x44,
+};
+
+static const BitmapCharRec ch37 = {6,9,-1,0,8,ch37data};
+
+/* char: 0x24 '$' */
+
+static const GLubyte ch36data[] = {
+0x20,0xf0,0x28,0x70,0xa0,0x78,0x20,
+};
+
+static const BitmapCharRec ch36 = {5,7,-1,-1,8,ch36data};
+
+/* char: 0x23 '#' */
+
+static const GLubyte ch35data[] = {
+0x48,0x48,0xfc,0x48,0xfc,0x48,0x48,
+};
+
+static const BitmapCharRec ch35 = {6,7,-1,-1,8,ch35data};
+
+/* char: 0x22 '"' */
+
+static const GLubyte ch34data[] = {
+0x90,0x90,0x90,
+};
+
+static const BitmapCharRec ch34 = {4,3,-2,-6,8,ch34data};
+
+/* char: 0x21 '!' */
+
+static const GLubyte ch33data[] = {
+0x80,0x0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch33 = {1,9,-3,0,8,ch33data};
+
+/* char: 0x1f */
+
+static const GLubyte ch31data[] = {
+0x80,
+};
+
+static const BitmapCharRec ch31 = {1,1,-3,-3,8,ch31data};
+
+/* char: 0x1e */
+
+static const GLubyte ch30data[] = {
+0xdc,0x62,0x20,0x20,0x20,0x70,0x20,0x22,0x1c,
+};
+
+static const BitmapCharRec ch30 = {7,9,0,0,8,ch30data};
+
+/* char: 0x1d */
+
+static const GLubyte ch29data[] = {
+0x80,0x40,0xfe,0x10,0xfe,0x4,0x2,
+};
+
+static const BitmapCharRec ch29 = {7,7,0,0,8,ch29data};
+
+/* char: 0x1c */
+
+static const GLubyte ch28data[] = {
+0x88,0x48,0x48,0x48,0x48,0xfc,
+};
+
+static const BitmapCharRec ch28 = {6,6,-1,0,8,ch28data};
+
+/* char: 0x1b */
+
+static const GLubyte ch27data[] = {
+0xfe,0x80,0x20,0x8,0x2,0x8,0x20,0x80,
+};
+
+static const BitmapCharRec ch27 = {7,8,0,0,8,ch27data};
+
+/* char: 0x1a */
+
+static const GLubyte ch26data[] = {
+0xfe,0x2,0x8,0x20,0x80,0x20,0x8,0x2,
+};
+
+static const BitmapCharRec ch26 = {7,8,0,0,8,ch26data};
+
+/* char: 0x19 */
+
+static const GLubyte ch25data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch25 = {1,13,-3,2,8,ch25data};
+
+/* char: 0x18 */
+
+static const GLubyte ch24data[] = {
+0x10,0x10,0x10,0x10,0x10,0xff,
+};
+
+static const BitmapCharRec ch24 = {8,6,0,2,8,ch24data};
+
+/* char: 0x17 */
+
+static const GLubyte ch23data[] = {
+0xff,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
+};
+
+static const BitmapCharRec ch23 = {8,8,0,-3,8,ch23data};
+
+/* char: 0x16 */
+
+static const GLubyte ch22data[] = {
+0x10,0x10,0x10,0x10,0x10,0xf0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
+};
+
+static const BitmapCharRec ch22 = {4,13,0,2,8,ch22data};
+
+/* char: 0x15 */
+
+static const GLubyte ch21data[] = {
+0x80,0x80,0x80,0x80,0x80,0xf8,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch21 = {5,13,-3,2,8,ch21data};
+
+/* char: 0x14 */
+
+static const GLubyte ch20data[] = {
+0xff,
+};
+
+static const BitmapCharRec ch20 = {8,1,0,1,8,ch20data};
+
+/* char: 0x13 */
+
+static const GLubyte ch19data[] = {
+0xff,
+};
+
+static const BitmapCharRec ch19 = {8,1,0,-1,8,ch19data};
+
+/* char: 0x12 */
+
+static const GLubyte ch18data[] = {
+0xff,
+};
+
+static const BitmapCharRec ch18 = {8,1,0,-3,8,ch18data};
+
+/* char: 0x11 */
+
+static const GLubyte ch17data[] = {
+0xff,
+};
+
+static const BitmapCharRec ch17 = {8,1,0,-5,8,ch17data};
+
+/* char: 0x10 */
+
+static const GLubyte ch16data[] = {
+0xff,
+};
+
+static const BitmapCharRec ch16 = {8,1,0,-7,8,ch16data};
+
+/* char: 0xf */
+
+static const GLubyte ch15data[] = {
+0x10,0x10,0x10,0x10,0x10,0xff,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
+};
+
+static const BitmapCharRec ch15 = {8,13,0,2,8,ch15data};
+
+/* char: 0xe */
+
+static const GLubyte ch14data[] = {
+0xf8,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch14 = {5,8,-3,-3,8,ch14data};
+
+/* char: 0xd */
+
+static const GLubyte ch13data[] = {
+0x80,0x80,0x80,0x80,0x80,0xf8,
+};
+
+static const BitmapCharRec ch13 = {5,6,-3,2,8,ch13data};
+
+/* char: 0xc */
+
+static const GLubyte ch12data[] = {
+0x10,0x10,0x10,0x10,0x10,0xf0,
+};
+
+static const BitmapCharRec ch12 = {4,6,0,2,8,ch12data};
+
+/* char: 0xb */
+
+static const GLubyte ch11data[] = {
+0xf0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
+};
+
+static const BitmapCharRec ch11 = {4,8,0,-3,8,ch11data};
+
+/* char: 0xa */
+
+static const GLubyte ch10data[] = {
+0x8,0x8,0x8,0x8,0x3e,0x20,0x50,0x88,0x88,
+};
+
+static const BitmapCharRec ch10 = {7,9,0,2,8,ch10data};
+
+/* char: 0x9 */
+
+static const GLubyte ch9data[] = {
+0x3e,0x20,0x20,0x20,0x88,0x98,0xa8,0xc8,0x88,
+};
+
+static const BitmapCharRec ch9 = {7,9,0,2,8,ch9data};
+
+/* char: 0x8 */
+
+static const GLubyte ch8data[] = {
+0xfe,0x10,0x10,0xfe,0x10,0x10,
+};
+
+static const BitmapCharRec ch8 = {7,6,0,0,8,ch8data};
+
+/* char: 0x7 */
+
+static const GLubyte ch7data[] = {
+0x70,0x88,0x88,0x70,
+};
+
+static const BitmapCharRec ch7 = {5,4,-1,-5,8,ch7data};
+
+/* char: 0x6 */
+
+static const GLubyte ch6data[] = {
+0x20,0x20,0x3c,0x20,0x3e,0xf8,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch6 = {7,9,0,2,8,ch6data};
+
+/* char: 0x5 */
+
+static const GLubyte ch5data[] = {
+0x22,0x22,0x3c,0x22,0x3c,0x78,0x80,0x80,0x78,
+};
+
+static const BitmapCharRec ch5 = {7,9,0,2,8,ch5data};
+
+/* char: 0x4 */
+
+static const GLubyte ch4data[] = {
+0x10,0x10,0x1c,0x10,0x9e,0x80,0xe0,0x80,0xf0,
+};
+
+static const BitmapCharRec ch4 = {7,9,0,2,8,ch4data};
+
+/* char: 0x3 */
+
+static const GLubyte ch3data[] = {
+0x8,0x8,0x8,0x3e,0x88,0x88,0xf8,0x88,0x88,
+};
+
+static const BitmapCharRec ch3 = {7,9,0,2,8,ch3data};
+
+/* char: 0x2 */
+
+static const GLubyte ch2data[] = {
+0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,
+};
+
+static const BitmapCharRec ch2 = {8,12,0,2,8,ch2data};
+
+/* char: 0x1 */
+
+static const GLubyte ch1data[] = {
+0x10,0x38,0x7c,0xfe,0x7c,0x38,0x10,
+};
+
+static const BitmapCharRec ch1 = {7,7,0,-1,8,ch1data};
+
+static const BitmapCharRec * const chars[] = {
+&ch0,
+&ch1,
+&ch2,
+&ch3,
+&ch4,
+&ch5,
+&ch6,
+&ch7,
+&ch8,
+&ch9,
+&ch10,
+&ch11,
+&ch12,
+&ch13,
+&ch14,
+&ch15,
+&ch16,
+&ch17,
+&ch18,
+&ch19,
+&ch20,
+&ch21,
+&ch22,
+&ch23,
+&ch24,
+&ch25,
+&ch26,
+&ch27,
+&ch28,
+&ch29,
+&ch30,
+&ch31,
+&ch32,
+&ch33,
+&ch34,
+&ch35,
+&ch36,
+&ch37,
+&ch38,
+&ch39,
+&ch40,
+&ch41,
+&ch42,
+&ch43,
+&ch44,
+&ch45,
+&ch46,
+&ch47,
+&ch48,
+&ch49,
+&ch50,
+&ch51,
+&ch52,
+&ch53,
+&ch54,
+&ch55,
+&ch56,
+&ch57,
+&ch58,
+&ch59,
+&ch60,
+&ch61,
+&ch62,
+&ch63,
+&ch64,
+&ch65,
+&ch66,
+&ch67,
+&ch68,
+&ch69,
+&ch70,
+&ch71,
+&ch72,
+&ch73,
+&ch74,
+&ch75,
+&ch76,
+&ch77,
+&ch78,
+&ch79,
+&ch80,
+&ch81,
+&ch82,
+&ch83,
+&ch84,
+&ch85,
+&ch86,
+&ch87,
+&ch88,
+&ch89,
+&ch90,
+&ch91,
+&ch92,
+&ch93,
+&ch94,
+&ch95,
+&ch96,
+&ch97,
+&ch98,
+&ch99,
+&ch100,
+&ch101,
+&ch102,
+&ch103,
+&ch104,
+&ch105,
+&ch106,
+&ch107,
+&ch108,
+&ch109,
+&ch110,
+&ch111,
+&ch112,
+&ch113,
+&ch114,
+&ch115,
+&ch116,
+&ch117,
+&ch118,
+&ch119,
+&ch120,
+&ch121,
+&ch122,
+&ch123,
+&ch124,
+&ch125,
+&ch126,
+&ch127,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+&ch160,
+&ch161,
+&ch162,
+&ch163,
+&ch164,
+&ch165,
+&ch166,
+&ch167,
+&ch168,
+&ch169,
+&ch170,
+&ch171,
+&ch172,
+&ch173,
+&ch174,
+&ch175,
+&ch176,
+&ch177,
+&ch178,
+&ch179,
+&ch180,
+&ch181,
+&ch182,
+&ch183,
+&ch184,
+&ch185,
+&ch186,
+&ch187,
+&ch188,
+&ch189,
+&ch190,
+&ch191,
+&ch192,
+&ch193,
+&ch194,
+&ch195,
+&ch196,
+&ch197,
+&ch198,
+&ch199,
+&ch200,
+&ch201,
+&ch202,
+&ch203,
+&ch204,
+&ch205,
+&ch206,
+&ch207,
+&ch208,
+&ch209,
+&ch210,
+&ch211,
+&ch212,
+&ch213,
+&ch214,
+&ch215,
+&ch216,
+&ch217,
+&ch218,
+&ch219,
+&ch220,
+&ch221,
+&ch222,
+&ch223,
+&ch224,
+&ch225,
+&ch226,
+&ch227,
+&ch228,
+&ch229,
+&ch230,
+&ch231,
+&ch232,
+&ch233,
+&ch234,
+&ch235,
+&ch236,
+&ch237,
+&ch238,
+&ch239,
+&ch240,
+&ch241,
+&ch242,
+&ch243,
+&ch244,
+&ch245,
+&ch246,
+&ch247,
+&ch248,
+&ch249,
+&ch250,
+&ch251,
+&ch252,
+&ch253,
+&ch254,
+&ch255,
+};
+
+#if !defined(__IBMCPP__)
+const
+#endif
+BitmapFontRec glutBitmap8By13 = {
+"-misc-fixed-medium-r-normal--13-120-75-75-C-80-iso8859-1",
+256,
+0,
+chars
+};
+
diff --git a/src/glut/os2/glut_9x15.cpp b/src/glut/os2/glut_9x15.cpp
new file mode 100644
index 00000000000..a3a02a4c5ff
--- /dev/null
+++ b/src/glut/os2/glut_9x15.cpp
@@ -0,0 +1,2077 @@
+
+/* GENERATED FILE -- DO NOT MODIFY */
+
+#define glutBitmap9By15 XXX
+#include "glutbitmap.h"
+#undef glutBitmap9By15
+
+#ifdef _WIN32
+/* XXX Work around Microsoft OpenGL 1.1 bug where glBitmap with
+ a height or width of zero does not advance the raster position
+ as specified by OpenGL. (Cosmo OpenGL does not have this bug.) */
+static const GLubyte ch0data[] = { 0x0 };
+static const BitmapCharRec ch0 = {1,1,0,0,9,ch0data};
+#else
+static const BitmapCharRec ch0 = {0,0,0,0,9,0};
+#endif
+
+#ifdef _WIN32
+/* XXX Work around Microsoft OpenGL 1.1 bug where glBitmap with
+ a height or width of zero does not advance the raster position
+ as specified by OpenGL. (Cosmo OpenGL does not have this bug.) */
+static const GLubyte ch32data[] = { 0x0 };
+static const BitmapCharRec ch32 = {1,1,0,0,9,ch32data};
+#else
+static const BitmapCharRec ch32 = {0,0,0,0,9,0};
+#endif
+
+#ifdef _WIN32
+/* XXX Work around Microsoft OpenGL 1.1 bug where glBitmap with
+ a height or width of zero does not advance the raster position
+ as specified by OpenGL. (Cosmo OpenGL does not have this bug.) */
+static const GLubyte ch127data[] = { 0x0 };
+static const BitmapCharRec ch127 = {1,1,0,0,9,ch127data};
+#else
+static const BitmapCharRec ch127 = {0,0,0,0,9,0};
+#endif
+
+#ifdef _WIN32
+/* XXX Work around Microsoft OpenGL 1.1 bug where glBitmap with
+ a height or width of zero does not advance the raster position
+ as specified by OpenGL. (Cosmo OpenGL does not have this bug.) */
+static const GLubyte ch160data[] = { 0x0 };
+static const BitmapCharRec ch160 = {1,1,0,0,9,ch160data};
+#else
+static const BitmapCharRec ch160 = {0,0,0,0,9,0};
+#endif
+
+/* char: 0xff */
+
+static const GLubyte ch255data[] = {
+0x78,0x84,0x4,0x74,0x8c,0x84,0x84,0x84,0x84,0x84,0x0,0x0,0x28,0x28,
+};
+
+static const BitmapCharRec ch255 = {6,14,-1,3,9,ch255data};
+
+/* char: 0xfe */
+
+static const GLubyte ch254data[] = {
+0x80,0x80,0x80,0xbc,0xc2,0x82,0x82,0x82,0xc2,0xbc,0x80,0x80,
+};
+
+static const BitmapCharRec ch254 = {7,12,-1,3,9,ch254data};
+
+/* char: 0xfd */
+
+static const GLubyte ch253data[] = {
+0x78,0x84,0x4,0x74,0x8c,0x84,0x84,0x84,0x84,0x84,0x0,0x0,0x30,0x8,
+};
+
+static const BitmapCharRec ch253 = {6,14,-1,3,9,ch253data};
+
+/* char: 0xfc */
+
+static const GLubyte ch252data[] = {
+0x7a,0x84,0x84,0x84,0x84,0x84,0x84,0x0,0x0,0x28,0x28,
+};
+
+static const BitmapCharRec ch252 = {7,11,-1,0,9,ch252data};
+
+/* char: 0xfb */
+
+static const GLubyte ch251data[] = {
+0x7a,0x84,0x84,0x84,0x84,0x84,0x84,0x0,0x0,0x44,0x38,
+};
+
+static const BitmapCharRec ch251 = {7,11,-1,0,9,ch251data};
+
+/* char: 0xfa */
+
+static const GLubyte ch250data[] = {
+0x7a,0x84,0x84,0x84,0x84,0x84,0x84,0x0,0x0,0x30,0x8,
+};
+
+static const BitmapCharRec ch250 = {7,11,-1,0,9,ch250data};
+
+/* char: 0xf9 */
+
+static const GLubyte ch249data[] = {
+0x7a,0x84,0x84,0x84,0x84,0x84,0x84,0x0,0x0,0x18,0x20,
+};
+
+static const BitmapCharRec ch249 = {7,11,-1,0,9,ch249data};
+
+/* char: 0xf8 */
+
+static const GLubyte ch248data[] = {
+0x80,0x7c,0xa2,0xa2,0x92,0x8a,0x8a,0x7c,0x2,
+};
+
+static const BitmapCharRec ch248 = {7,9,-1,1,9,ch248data};
+
+/* char: 0xf7 */
+
+static const GLubyte ch247data[] = {
+0x10,0x38,0x10,0x0,0xfe,0x0,0x10,0x38,0x10,
+};
+
+static const BitmapCharRec ch247 = {7,9,-1,0,9,ch247data};
+
+/* char: 0xf6 */
+
+static const GLubyte ch246data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x0,0x0,0x28,0x28,
+};
+
+static const BitmapCharRec ch246 = {7,11,-1,0,9,ch246data};
+
+/* char: 0xf5 */
+
+static const GLubyte ch245data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x0,0x0,0x50,0x28,
+};
+
+static const BitmapCharRec ch245 = {7,11,-1,0,9,ch245data};
+
+/* char: 0xf4 */
+
+static const GLubyte ch244data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x0,0x0,0x44,0x38,
+};
+
+static const BitmapCharRec ch244 = {7,11,-1,0,9,ch244data};
+
+/* char: 0xf3 */
+
+static const GLubyte ch243data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x0,0x0,0x30,0x8,
+};
+
+static const BitmapCharRec ch243 = {7,11,-1,0,9,ch243data};
+
+/* char: 0xf2 */
+
+static const GLubyte ch242data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x0,0x0,0x18,0x20,
+};
+
+static const BitmapCharRec ch242 = {7,11,-1,0,9,ch242data};
+
+/* char: 0xf1 */
+
+static const GLubyte ch241data[] = {
+0x82,0x82,0x82,0x82,0x82,0xc2,0xbc,0x0,0x0,0x50,0x28,
+};
+
+static const BitmapCharRec ch241 = {7,11,-1,0,9,ch241data};
+
+/* char: 0xf0 */
+
+static const GLubyte ch240data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x8,0x50,0x30,0x48,
+};
+
+static const BitmapCharRec ch240 = {7,11,-1,0,9,ch240data};
+
+/* char: 0xef */
+
+static const GLubyte ch239data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0xe0,0x0,0x0,0x50,0x50,
+};
+
+static const BitmapCharRec ch239 = {5,11,-2,0,9,ch239data};
+
+/* char: 0xee */
+
+static const GLubyte ch238data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0xe0,0x0,0x0,0x90,0x60,
+};
+
+static const BitmapCharRec ch238 = {5,11,-2,0,9,ch238data};
+
+/* char: 0xed */
+
+static const GLubyte ch237data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0xe0,0x0,0x0,0x60,0x10,
+};
+
+static const BitmapCharRec ch237 = {5,11,-2,0,9,ch237data};
+
+/* char: 0xec */
+
+static const GLubyte ch236data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0xe0,0x0,0x0,0x30,0x40,
+};
+
+static const BitmapCharRec ch236 = {5,11,-2,0,9,ch236data};
+
+/* char: 0xeb */
+
+static const GLubyte ch235data[] = {
+0x7c,0x80,0x80,0xfe,0x82,0x82,0x7c,0x0,0x0,0x28,0x28,
+};
+
+static const BitmapCharRec ch235 = {7,11,-1,0,9,ch235data};
+
+/* char: 0xea */
+
+static const GLubyte ch234data[] = {
+0x7c,0x80,0x80,0xfe,0x82,0x82,0x7c,0x0,0x0,0x44,0x38,
+};
+
+static const BitmapCharRec ch234 = {7,11,-1,0,9,ch234data};
+
+/* char: 0xe9 */
+
+static const GLubyte ch233data[] = {
+0x7c,0x80,0x80,0xfe,0x82,0x82,0x7c,0x0,0x0,0x30,0x8,
+};
+
+static const BitmapCharRec ch233 = {7,11,-1,0,9,ch233data};
+
+/* char: 0xe8 */
+
+static const GLubyte ch232data[] = {
+0x7c,0x80,0x80,0xfe,0x82,0x82,0x7c,0x0,0x0,0x18,0x20,
+};
+
+static const BitmapCharRec ch232 = {7,11,-1,0,9,ch232data};
+
+/* char: 0xe7 */
+
+static const GLubyte ch231data[] = {
+0x30,0x48,0x18,0x7c,0x82,0x80,0x80,0x80,0x82,0x7c,
+};
+
+static const BitmapCharRec ch231 = {7,10,-1,3,9,ch231data};
+
+/* char: 0xe6 */
+
+static const GLubyte ch230data[] = {
+0x6e,0x92,0x90,0x7c,0x12,0x92,0x6c,
+};
+
+static const BitmapCharRec ch230 = {7,7,-1,0,9,ch230data};
+
+/* char: 0xe5 */
+
+static const GLubyte ch229data[] = {
+0x7a,0x86,0x82,0x7e,0x2,0x2,0x7c,0x0,0x18,0x24,0x18,
+};
+
+static const BitmapCharRec ch229 = {7,11,-1,0,9,ch229data};
+
+/* char: 0xe4 */
+
+static const GLubyte ch228data[] = {
+0x7a,0x86,0x82,0x7e,0x2,0x2,0x7c,0x0,0x0,0x28,0x28,
+};
+
+static const BitmapCharRec ch228 = {7,11,-1,0,9,ch228data};
+
+/* char: 0xe3 */
+
+static const GLubyte ch227data[] = {
+0x7a,0x86,0x82,0x7e,0x2,0x2,0x7c,0x0,0x0,0x50,0x28,
+};
+
+static const BitmapCharRec ch227 = {7,11,-1,0,9,ch227data};
+
+/* char: 0xe2 */
+
+static const GLubyte ch226data[] = {
+0x7a,0x86,0x82,0x7e,0x2,0x2,0x7c,0x0,0x0,0x44,0x38,
+};
+
+static const BitmapCharRec ch226 = {7,11,-1,0,9,ch226data};
+
+/* char: 0xe1 */
+
+static const GLubyte ch225data[] = {
+0x7a,0x86,0x82,0x7e,0x2,0x2,0x7c,0x0,0x0,0x30,0x8,
+};
+
+static const BitmapCharRec ch225 = {7,11,-1,0,9,ch225data};
+
+/* char: 0xe0 */
+
+static const GLubyte ch224data[] = {
+0x7a,0x86,0x82,0x7e,0x2,0x2,0x7c,0x0,0x0,0x18,0x20,
+};
+
+static const BitmapCharRec ch224 = {7,11,-1,0,9,ch224data};
+
+/* char: 0xdf */
+
+static const GLubyte ch223data[] = {
+0x80,0xbc,0xc2,0x82,0x82,0xfc,0x82,0x82,0x7c,
+};
+
+static const BitmapCharRec ch223 = {7,9,-1,1,9,ch223data};
+
+/* char: 0xde */
+
+static const GLubyte ch222data[] = {
+0x80,0x80,0x80,0xfc,0x82,0x82,0x82,0xfc,0x80,0x80,
+};
+
+static const BitmapCharRec ch222 = {7,10,-1,0,9,ch222data};
+
+/* char: 0xdd */
+
+static const GLubyte ch221data[] = {
+0x10,0x10,0x10,0x10,0x28,0x44,0x82,0x82,0x0,0x30,0x8,
+};
+
+static const BitmapCharRec ch221 = {7,11,-1,0,9,ch221data};
+
+/* char: 0xdc */
+
+static const GLubyte ch220data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x0,0x28,0x28,
+};
+
+static const BitmapCharRec ch220 = {7,11,-1,0,9,ch220data};
+
+/* char: 0xdb */
+
+static const GLubyte ch219data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x0,0x44,0x38,
+};
+
+static const BitmapCharRec ch219 = {7,11,-1,0,9,ch219data};
+
+/* char: 0xda */
+
+static const GLubyte ch218data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x0,0x30,0x8,
+};
+
+static const BitmapCharRec ch218 = {7,11,-1,0,9,ch218data};
+
+/* char: 0xd9 */
+
+static const GLubyte ch217data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x0,0x18,0x20,
+};
+
+static const BitmapCharRec ch217 = {7,11,-1,0,9,ch217data};
+
+/* char: 0xd8 */
+
+static const GLubyte ch216data[] = {
+0x80,0x7c,0xc2,0xa2,0xa2,0x92,0x92,0x8a,0x8a,0x86,0x7c,0x2,
+};
+
+static const BitmapCharRec ch216 = {7,12,-1,1,9,ch216data};
+
+/* char: 0xd7 */
+
+static const GLubyte ch215data[] = {
+0x82,0x44,0x28,0x10,0x28,0x44,0x82,
+};
+
+static const BitmapCharRec ch215 = {7,7,-1,-1,9,ch215data};
+
+/* char: 0xd6 */
+
+static const GLubyte ch214data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x0,0x28,0x28,
+};
+
+static const BitmapCharRec ch214 = {7,11,-1,0,9,ch214data};
+
+/* char: 0xd5 */
+
+static const GLubyte ch213data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x0,0x50,0x28,
+};
+
+static const BitmapCharRec ch213 = {7,11,-1,0,9,ch213data};
+
+/* char: 0xd4 */
+
+static const GLubyte ch212data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x0,0x44,0x38,
+};
+
+static const BitmapCharRec ch212 = {7,11,-1,0,9,ch212data};
+
+/* char: 0xd3 */
+
+static const GLubyte ch211data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x0,0x30,0x8,
+};
+
+static const BitmapCharRec ch211 = {7,11,-1,0,9,ch211data};
+
+/* char: 0xd2 */
+
+static const GLubyte ch210data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x0,0x18,0x20,
+};
+
+static const BitmapCharRec ch210 = {7,11,-1,0,9,ch210data};
+
+/* char: 0xd1 */
+
+static const GLubyte ch209data[] = {
+0x82,0x86,0x8a,0x92,0x92,0xa2,0xc2,0x82,0x0,0x50,0x28,
+};
+
+static const BitmapCharRec ch209 = {7,11,-1,0,9,ch209data};
+
+/* char: 0xd0 */
+
+static const GLubyte ch208data[] = {
+0xfc,0x42,0x42,0x42,0x42,0xf2,0x42,0x42,0x42,0xfc,
+};
+
+static const BitmapCharRec ch208 = {7,10,-1,0,9,ch208data};
+
+/* char: 0xcf */
+
+static const GLubyte ch207data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0xf8,0x0,0x50,0x50,
+};
+
+static const BitmapCharRec ch207 = {5,11,-2,0,9,ch207data};
+
+/* char: 0xce */
+
+static const GLubyte ch206data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0xf8,0x0,0x88,0x70,
+};
+
+static const BitmapCharRec ch206 = {5,11,-2,0,9,ch206data};
+
+/* char: 0xcd */
+
+static const GLubyte ch205data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0xf8,0x0,0x60,0x10,
+};
+
+static const BitmapCharRec ch205 = {5,11,-2,0,9,ch205data};
+
+/* char: 0xcc */
+
+static const GLubyte ch204data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0xf8,0x0,0x30,0x40,
+};
+
+static const BitmapCharRec ch204 = {5,11,-2,0,9,ch204data};
+
+/* char: 0xcb */
+
+static const GLubyte ch203data[] = {
+0xfe,0x40,0x40,0x40,0x78,0x40,0x40,0xfe,0x0,0x28,0x28,
+};
+
+static const BitmapCharRec ch203 = {7,11,-1,0,9,ch203data};
+
+/* char: 0xca */
+
+static const GLubyte ch202data[] = {
+0xfe,0x40,0x40,0x40,0x78,0x40,0x40,0xfe,0x0,0x44,0x38,
+};
+
+static const BitmapCharRec ch202 = {7,11,-1,0,9,ch202data};
+
+/* char: 0xc9 */
+
+static const GLubyte ch201data[] = {
+0xfe,0x40,0x40,0x40,0x78,0x40,0x40,0xfe,0x0,0x30,0x8,
+};
+
+static const BitmapCharRec ch201 = {7,11,-1,0,9,ch201data};
+
+/* char: 0xc8 */
+
+static const GLubyte ch200data[] = {
+0xfe,0x40,0x40,0x40,0x78,0x40,0x40,0xfe,0x0,0x18,0x20,
+};
+
+static const BitmapCharRec ch200 = {7,11,-1,0,9,ch200data};
+
+/* char: 0xc7 */
+
+static const GLubyte ch199data[] = {
+0x30,0x48,0x18,0x7c,0x82,0x80,0x80,0x80,0x80,0x80,0x80,0x82,0x7c,
+};
+
+static const BitmapCharRec ch199 = {7,13,-1,3,9,ch199data};
+
+/* char: 0xc6 */
+
+static const GLubyte ch198data[] = {
+0x9e,0x90,0x90,0x90,0xfc,0x90,0x90,0x90,0x90,0x6e,
+};
+
+static const BitmapCharRec ch198 = {7,10,-1,0,9,ch198data};
+
+/* char: 0xc5 */
+
+static const GLubyte ch197data[] = {
+0x82,0x82,0x82,0xfe,0x82,0x82,0x44,0x38,0x10,0x28,0x10,
+};
+
+static const BitmapCharRec ch197 = {7,11,-1,0,9,ch197data};
+
+/* char: 0xc4 */
+
+static const GLubyte ch196data[] = {
+0x82,0x82,0x82,0xfe,0x82,0x82,0x44,0x38,0x0,0x28,0x28,
+};
+
+static const BitmapCharRec ch196 = {7,11,-1,0,9,ch196data};
+
+/* char: 0xc3 */
+
+static const GLubyte ch195data[] = {
+0x82,0x82,0x82,0xfe,0x82,0x82,0x44,0x38,0x0,0x50,0x28,
+};
+
+static const BitmapCharRec ch195 = {7,11,-1,0,9,ch195data};
+
+/* char: 0xc2 */
+
+static const GLubyte ch194data[] = {
+0x82,0x82,0x82,0xfe,0x82,0x82,0x44,0x38,0x0,0x44,0x38,
+};
+
+static const BitmapCharRec ch194 = {7,11,-1,0,9,ch194data};
+
+/* char: 0xc1 */
+
+static const GLubyte ch193data[] = {
+0x82,0x82,0x82,0xfe,0x82,0x82,0x44,0x38,0x0,0x30,0x8,
+};
+
+static const BitmapCharRec ch193 = {7,11,-1,0,9,ch193data};
+
+/* char: 0xc0 */
+
+static const GLubyte ch192data[] = {
+0x82,0x82,0x82,0xfe,0x82,0x82,0x44,0x38,0x0,0x18,0x20,
+};
+
+static const BitmapCharRec ch192 = {7,11,-1,0,9,ch192data};
+
+/* char: 0xbf */
+
+static const GLubyte ch191data[] = {
+0x7c,0x82,0x82,0x80,0x40,0x20,0x10,0x10,0x0,0x10,
+};
+
+static const BitmapCharRec ch191 = {7,10,-1,0,9,ch191data};
+
+/* char: 0xbe */
+
+static const GLubyte ch190data[] = {
+0x6,0x1a,0x12,0xa,0x66,0x92,0x10,0x20,0x90,0x60,
+};
+
+static const BitmapCharRec ch190 = {7,10,-1,0,9,ch190data};
+
+/* char: 0xbd */
+
+static const GLubyte ch189data[] = {
+0x1e,0x10,0xc,0x2,0xf2,0x4c,0x40,0x40,0xc0,0x40,
+};
+
+static const BitmapCharRec ch189 = {7,10,-1,0,9,ch189data};
+
+/* char: 0xbc */
+
+static const GLubyte ch188data[] = {
+0x6,0x1a,0x12,0xa,0xe6,0x42,0x40,0x40,0xc0,0x40,
+};
+
+static const BitmapCharRec ch188 = {7,10,-1,0,9,ch188data};
+
+/* char: 0xbb */
+
+static const GLubyte ch187data[] = {
+0x90,0x48,0x24,0x12,0x12,0x24,0x48,0x90,
+};
+
+static const BitmapCharRec ch187 = {7,8,-1,-1,9,ch187data};
+
+/* char: 0xba */
+
+static const GLubyte ch186data[] = {
+0xf8,0x0,0x70,0x88,0x88,0x70,
+};
+
+static const BitmapCharRec ch186 = {5,6,-1,-5,9,ch186data};
+
+/* char: 0xb9 */
+
+static const GLubyte ch185data[] = {
+0xe0,0x40,0x40,0x40,0xc0,0x40,
+};
+
+static const BitmapCharRec ch185 = {3,6,-1,-4,9,ch185data};
+
+/* char: 0xb8 */
+
+static const GLubyte ch184data[] = {
+0x60,0x90,0x30,
+};
+
+static const BitmapCharRec ch184 = {4,3,-2,3,9,ch184data};
+
+/* char: 0xb7 */
+
+static const GLubyte ch183data[] = {
+0xc0,0xc0,
+};
+
+static const BitmapCharRec ch183 = {2,2,-4,-4,9,ch183data};
+
+/* char: 0xb6 */
+
+static const GLubyte ch182data[] = {
+0xa,0xa,0xa,0xa,0xa,0x7a,0x8a,0x8a,0x8a,0x7e,
+};
+
+static const BitmapCharRec ch182 = {7,10,-1,0,9,ch182data};
+
+/* char: 0xb5 */
+
+static const GLubyte ch181data[] = {
+0x80,0x80,0xba,0xc6,0x82,0x82,0x82,0x82,0x82,
+};
+
+static const BitmapCharRec ch181 = {7,9,-1,2,9,ch181data};
+
+/* char: 0xb4 */
+
+static const GLubyte ch180data[] = {
+0xc0,0x20,
+};
+
+static const BitmapCharRec ch180 = {3,2,-3,-9,9,ch180data};
+
+/* char: 0xb3 */
+
+static const GLubyte ch179data[] = {
+0x60,0x90,0x10,0x20,0x90,0x60,
+};
+
+static const BitmapCharRec ch179 = {4,6,-1,-4,9,ch179data};
+
+/* char: 0xb2 */
+
+static const GLubyte ch178data[] = {
+0xf0,0x80,0x60,0x10,0x90,0x60,
+};
+
+static const BitmapCharRec ch178 = {4,6,-1,-4,9,ch178data};
+
+/* char: 0xb1 */
+
+static const GLubyte ch177data[] = {
+0xfe,0x0,0x10,0x10,0x10,0xfe,0x10,0x10,0x10,
+};
+
+static const BitmapCharRec ch177 = {7,9,-1,-1,9,ch177data};
+
+/* char: 0xb0 */
+
+static const GLubyte ch176data[] = {
+0x60,0x90,0x90,0x60,
+};
+
+static const BitmapCharRec ch176 = {4,4,-3,-6,9,ch176data};
+
+/* char: 0xaf */
+
+static const GLubyte ch175data[] = {
+0xfc,
+};
+
+static const BitmapCharRec ch175 = {6,1,-1,-9,9,ch175data};
+
+/* char: 0xae */
+
+static const GLubyte ch174data[] = {
+0x3c,0x42,0xa5,0xa9,0xbd,0xa5,0xb9,0x42,0x3c,
+};
+
+static const BitmapCharRec ch174 = {8,9,0,-1,9,ch174data};
+
+/* char: 0xad */
+
+static const GLubyte ch173data[] = {
+0xfc,
+};
+
+static const BitmapCharRec ch173 = {6,1,-1,-4,9,ch173data};
+
+/* char: 0xac */
+
+static const GLubyte ch172data[] = {
+0x4,0x4,0x4,0xfc,
+};
+
+static const BitmapCharRec ch172 = {6,4,-1,-2,9,ch172data};
+
+/* char: 0xab */
+
+static const GLubyte ch171data[] = {
+0x12,0x24,0x48,0x90,0x90,0x48,0x24,0x12,
+};
+
+static const BitmapCharRec ch171 = {7,8,-1,-1,9,ch171data};
+
+/* char: 0xaa */
+
+static const GLubyte ch170data[] = {
+0xf8,0x0,0x78,0x90,0x70,0x90,0x60,
+};
+
+static const BitmapCharRec ch170 = {5,7,-3,-3,9,ch170data};
+
+/* char: 0xa9 */
+
+static const GLubyte ch169data[] = {
+0x3c,0x42,0x99,0xa5,0xa1,0xa5,0x99,0x42,0x3c,
+};
+
+static const BitmapCharRec ch169 = {8,9,0,-1,9,ch169data};
+
+/* char: 0xa8 */
+
+static const GLubyte ch168data[] = {
+0xa0,0xa0,
+};
+
+static const BitmapCharRec ch168 = {3,2,-3,-9,9,ch168data};
+
+/* char: 0xa7 */
+
+static const GLubyte ch167data[] = {
+0x70,0x88,0x8,0x70,0x88,0x88,0x88,0x70,0x80,0x88,0x70,
+};
+
+static const BitmapCharRec ch167 = {5,11,-2,1,9,ch167data};
+
+/* char: 0xa6 */
+
+static const GLubyte ch166data[] = {
+0x80,0x80,0x80,0x80,0x80,0x0,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch166 = {1,11,-4,1,9,ch166data};
+
+/* char: 0xa5 */
+
+static const GLubyte ch165data[] = {
+0x10,0x10,0x10,0x7c,0x10,0x7c,0x28,0x44,0x82,0x82,
+};
+
+static const BitmapCharRec ch165 = {7,10,-1,0,9,ch165data};
+
+/* char: 0xa4 */
+
+static const GLubyte ch164data[] = {
+0x82,0x7c,0x44,0x44,0x7c,0x82,
+};
+
+static const BitmapCharRec ch164 = {7,6,-1,-3,9,ch164data};
+
+/* char: 0xa3 */
+
+static const GLubyte ch163data[] = {
+0x5c,0xa2,0x60,0x20,0x20,0xf8,0x20,0x20,0x22,0x1c,
+};
+
+static const BitmapCharRec ch163 = {7,10,-1,0,9,ch163data};
+
+/* char: 0xa2 */
+
+static const GLubyte ch162data[] = {
+0x40,0x78,0xa4,0xa0,0x90,0x94,0x78,0x8,
+};
+
+static const BitmapCharRec ch162 = {6,8,-1,0,9,ch162data};
+
+/* char: 0xa1 */
+
+static const GLubyte ch161data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x0,0x0,0x80,0x80,
+};
+
+static const BitmapCharRec ch161 = {1,11,-4,0,9,ch161data};
+
+/* char: 0x7e '~' */
+
+static const GLubyte ch126data[] = {
+0x8c,0x92,0x62,
+};
+
+static const BitmapCharRec ch126 = {7,3,-1,-7,9,ch126data};
+
+/* char: 0x7d '}' */
+
+static const GLubyte ch125data[] = {
+0xe0,0x10,0x10,0x10,0x20,0x18,0x18,0x20,0x10,0x10,0x10,0xe0,
+};
+
+static const BitmapCharRec ch125 = {5,12,-1,1,9,ch125data};
+
+/* char: 0x7c '|' */
+
+static const GLubyte ch124data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch124 = {1,12,-4,1,9,ch124data};
+
+/* char: 0x7b '{' */
+
+static const GLubyte ch123data[] = {
+0x38,0x40,0x40,0x40,0x20,0xc0,0xc0,0x20,0x40,0x40,0x40,0x38,
+};
+
+static const BitmapCharRec ch123 = {5,12,-3,1,9,ch123data};
+
+/* char: 0x7a 'z' */
+
+static const GLubyte ch122data[] = {
+0xfe,0x40,0x20,0x10,0x8,0x4,0xfe,
+};
+
+static const BitmapCharRec ch122 = {7,7,-1,0,9,ch122data};
+
+/* char: 0x79 'y' */
+
+static const GLubyte ch121data[] = {
+0x78,0x84,0x4,0x74,0x8c,0x84,0x84,0x84,0x84,0x84,
+};
+
+static const BitmapCharRec ch121 = {6,10,-1,3,9,ch121data};
+
+/* char: 0x78 'x' */
+
+static const GLubyte ch120data[] = {
+0x82,0x44,0x28,0x10,0x28,0x44,0x82,
+};
+
+static const BitmapCharRec ch120 = {7,7,-1,0,9,ch120data};
+
+/* char: 0x77 'w' */
+
+static const GLubyte ch119data[] = {
+0x44,0xaa,0x92,0x92,0x92,0x82,0x82,
+};
+
+static const BitmapCharRec ch119 = {7,7,-1,0,9,ch119data};
+
+/* char: 0x76 'v' */
+
+static const GLubyte ch118data[] = {
+0x10,0x28,0x28,0x44,0x44,0x82,0x82,
+};
+
+static const BitmapCharRec ch118 = {7,7,-1,0,9,ch118data};
+
+/* char: 0x75 'u' */
+
+static const GLubyte ch117data[] = {
+0x7a,0x84,0x84,0x84,0x84,0x84,0x84,
+};
+
+static const BitmapCharRec ch117 = {7,7,-1,0,9,ch117data};
+
+/* char: 0x74 't' */
+
+static const GLubyte ch116data[] = {
+0x1c,0x22,0x20,0x20,0x20,0x20,0xfc,0x20,0x20,
+};
+
+static const BitmapCharRec ch116 = {7,9,-1,0,9,ch116data};
+
+/* char: 0x73 's' */
+
+static const GLubyte ch115data[] = {
+0x7c,0x82,0x2,0x7c,0x80,0x82,0x7c,
+};
+
+static const BitmapCharRec ch115 = {7,7,-1,0,9,ch115data};
+
+/* char: 0x72 'r' */
+
+static const GLubyte ch114data[] = {
+0x40,0x40,0x40,0x40,0x42,0x62,0x9c,
+};
+
+static const BitmapCharRec ch114 = {7,7,-1,0,9,ch114data};
+
+/* char: 0x71 'q' */
+
+static const GLubyte ch113data[] = {
+0x2,0x2,0x2,0x7a,0x86,0x82,0x82,0x82,0x86,0x7a,
+};
+
+static const BitmapCharRec ch113 = {7,10,-1,3,9,ch113data};
+
+/* char: 0x70 'p' */
+
+static const GLubyte ch112data[] = {
+0x80,0x80,0x80,0xbc,0xc2,0x82,0x82,0x82,0xc2,0xbc,
+};
+
+static const BitmapCharRec ch112 = {7,10,-1,3,9,ch112data};
+
+/* char: 0x6f 'o' */
+
+static const GLubyte ch111data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,
+};
+
+static const BitmapCharRec ch111 = {7,7,-1,0,9,ch111data};
+
+/* char: 0x6e 'n' */
+
+static const GLubyte ch110data[] = {
+0x82,0x82,0x82,0x82,0x82,0xc2,0xbc,
+};
+
+static const BitmapCharRec ch110 = {7,7,-1,0,9,ch110data};
+
+/* char: 0x6d 'm' */
+
+static const GLubyte ch109data[] = {
+0x82,0x92,0x92,0x92,0x92,0x92,0xec,
+};
+
+static const BitmapCharRec ch109 = {7,7,-1,0,9,ch109data};
+
+/* char: 0x6c 'l' */
+
+static const GLubyte ch108data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xe0,
+};
+
+static const BitmapCharRec ch108 = {5,10,-2,0,9,ch108data};
+
+/* char: 0x6b 'k' */
+
+static const GLubyte ch107data[] = {
+0x82,0x8c,0xb0,0xc0,0xb0,0x8c,0x82,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch107 = {7,10,-1,0,9,ch107data};
+
+/* char: 0x6a 'j' */
+
+static const GLubyte ch106data[] = {
+0x78,0x84,0x84,0x84,0x4,0x4,0x4,0x4,0x4,0x1c,0x0,0x0,0xc,
+};
+
+static const BitmapCharRec ch106 = {6,13,-1,3,9,ch106data};
+
+/* char: 0x69 'i' */
+
+static const GLubyte ch105data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0xe0,0x0,0x0,0x60,
+};
+
+static const BitmapCharRec ch105 = {5,10,-2,0,9,ch105data};
+
+/* char: 0x68 'h' */
+
+static const GLubyte ch104data[] = {
+0x82,0x82,0x82,0x82,0x82,0xc2,0xbc,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch104 = {7,10,-1,0,9,ch104data};
+
+/* char: 0x67 'g' */
+
+static const GLubyte ch103data[] = {
+0x7c,0x82,0x82,0x7c,0x80,0x78,0x84,0x84,0x84,0x7a,
+};
+
+static const BitmapCharRec ch103 = {7,10,-1,3,9,ch103data};
+
+/* char: 0x66 'f' */
+
+static const GLubyte ch102data[] = {
+0x20,0x20,0x20,0x20,0xf8,0x20,0x20,0x22,0x22,0x1c,
+};
+
+static const BitmapCharRec ch102 = {7,10,-1,0,9,ch102data};
+
+/* char: 0x65 'e' */
+
+static const GLubyte ch101data[] = {
+0x7c,0x80,0x80,0xfe,0x82,0x82,0x7c,
+};
+
+static const BitmapCharRec ch101 = {7,7,-1,0,9,ch101data};
+
+/* char: 0x64 'd' */
+
+static const GLubyte ch100data[] = {
+0x7a,0x86,0x82,0x82,0x82,0x86,0x7a,0x2,0x2,0x2,
+};
+
+static const BitmapCharRec ch100 = {7,10,-1,0,9,ch100data};
+
+/* char: 0x63 'c' */
+
+static const GLubyte ch99data[] = {
+0x7c,0x82,0x80,0x80,0x80,0x82,0x7c,
+};
+
+static const BitmapCharRec ch99 = {7,7,-1,0,9,ch99data};
+
+/* char: 0x62 'b' */
+
+static const GLubyte ch98data[] = {
+0xbc,0xc2,0x82,0x82,0x82,0xc2,0xbc,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch98 = {7,10,-1,0,9,ch98data};
+
+/* char: 0x61 'a' */
+
+static const GLubyte ch97data[] = {
+0x7a,0x86,0x82,0x7e,0x2,0x2,0x7c,
+};
+
+static const BitmapCharRec ch97 = {7,7,-1,0,9,ch97data};
+
+/* char: 0x60 '`' */
+
+static const GLubyte ch96data[] = {
+0x10,0x20,0x40,0xc0,
+};
+
+static const BitmapCharRec ch96 = {4,4,-3,-6,9,ch96data};
+
+/* char: 0x5f '_' */
+
+static const GLubyte ch95data[] = {
+0xff,
+};
+
+static const BitmapCharRec ch95 = {8,1,0,1,9,ch95data};
+
+/* char: 0x5e '^' */
+
+static const GLubyte ch94data[] = {
+0x82,0x44,0x28,0x10,
+};
+
+static const BitmapCharRec ch94 = {7,4,-1,-6,9,ch94data};
+
+/* char: 0x5d ']' */
+
+static const GLubyte ch93data[] = {
+0xf0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xf0,
+};
+
+static const BitmapCharRec ch93 = {4,12,-2,1,9,ch93data};
+
+/* char: 0x5c '\' */
+
+static const GLubyte ch92data[] = {
+0x2,0x4,0x4,0x8,0x10,0x10,0x20,0x40,0x40,0x80,
+};
+
+static const BitmapCharRec ch92 = {7,10,-1,0,9,ch92data};
+
+/* char: 0x5b '[' */
+
+static const GLubyte ch91data[] = {
+0xf0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xf0,
+};
+
+static const BitmapCharRec ch91 = {4,12,-3,1,9,ch91data};
+
+/* char: 0x5a 'Z' */
+
+static const GLubyte ch90data[] = {
+0xfe,0x80,0x80,0x40,0x20,0x10,0x8,0x4,0x2,0xfe,
+};
+
+static const BitmapCharRec ch90 = {7,10,-1,0,9,ch90data};
+
+/* char: 0x59 'Y' */
+
+static const GLubyte ch89data[] = {
+0x10,0x10,0x10,0x10,0x10,0x10,0x28,0x44,0x82,0x82,
+};
+
+static const BitmapCharRec ch89 = {7,10,-1,0,9,ch89data};
+
+/* char: 0x58 'X' */
+
+static const GLubyte ch88data[] = {
+0x82,0x82,0x44,0x28,0x10,0x10,0x28,0x44,0x82,0x82,
+};
+
+static const BitmapCharRec ch88 = {7,10,-1,0,9,ch88data};
+
+/* char: 0x57 'W' */
+
+static const GLubyte ch87data[] = {
+0x44,0xaa,0x92,0x92,0x92,0x92,0x82,0x82,0x82,0x82,
+};
+
+static const BitmapCharRec ch87 = {7,10,-1,0,9,ch87data};
+
+/* char: 0x56 'V' */
+
+static const GLubyte ch86data[] = {
+0x10,0x28,0x28,0x28,0x44,0x44,0x44,0x82,0x82,0x82,
+};
+
+static const BitmapCharRec ch86 = {7,10,-1,0,9,ch86data};
+
+/* char: 0x55 'U' */
+
+static const GLubyte ch85data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
+};
+
+static const BitmapCharRec ch85 = {7,10,-1,0,9,ch85data};
+
+/* char: 0x54 'T' */
+
+static const GLubyte ch84data[] = {
+0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xfe,
+};
+
+static const BitmapCharRec ch84 = {7,10,-1,0,9,ch84data};
+
+/* char: 0x53 'S' */
+
+static const GLubyte ch83data[] = {
+0x7c,0x82,0x82,0x2,0xc,0x70,0x80,0x82,0x82,0x7c,
+};
+
+static const BitmapCharRec ch83 = {7,10,-1,0,9,ch83data};
+
+/* char: 0x52 'R' */
+
+static const GLubyte ch82data[] = {
+0x82,0x82,0x84,0x88,0x90,0xfc,0x82,0x82,0x82,0xfc,
+};
+
+static const BitmapCharRec ch82 = {7,10,-1,0,9,ch82data};
+
+/* char: 0x51 'Q' */
+
+static const GLubyte ch81data[] = {
+0x6,0x8,0x7c,0x92,0xa2,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,
+};
+
+static const BitmapCharRec ch81 = {7,12,-1,2,9,ch81data};
+
+/* char: 0x50 'P' */
+
+static const GLubyte ch80data[] = {
+0x80,0x80,0x80,0x80,0x80,0xfc,0x82,0x82,0x82,0xfc,
+};
+
+static const BitmapCharRec ch80 = {7,10,-1,0,9,ch80data};
+
+/* char: 0x4f 'O' */
+
+static const GLubyte ch79data[] = {
+0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,
+};
+
+static const BitmapCharRec ch79 = {7,10,-1,0,9,ch79data};
+
+/* char: 0x4e 'N' */
+
+static const GLubyte ch78data[] = {
+0x82,0x82,0x82,0x86,0x8a,0x92,0xa2,0xc2,0x82,0x82,
+};
+
+static const BitmapCharRec ch78 = {7,10,-1,0,9,ch78data};
+
+/* char: 0x4d 'M' */
+
+static const GLubyte ch77data[] = {
+0x82,0x82,0x82,0x92,0x92,0xaa,0xaa,0xc6,0x82,0x82,
+};
+
+static const BitmapCharRec ch77 = {7,10,-1,0,9,ch77data};
+
+/* char: 0x4c 'L' */
+
+static const GLubyte ch76data[] = {
+0xfe,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch76 = {7,10,-1,0,9,ch76data};
+
+/* char: 0x4b 'K' */
+
+static const GLubyte ch75data[] = {
+0x82,0x84,0x88,0x90,0xa0,0xe0,0x90,0x88,0x84,0x82,
+};
+
+static const BitmapCharRec ch75 = {7,10,-1,0,9,ch75data};
+
+/* char: 0x4a 'J' */
+
+static const GLubyte ch74data[] = {
+0x78,0x84,0x4,0x4,0x4,0x4,0x4,0x4,0x4,0x1e,
+};
+
+static const BitmapCharRec ch74 = {7,10,-1,0,9,ch74data};
+
+/* char: 0x49 'I' */
+
+static const GLubyte ch73data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xf8,
+};
+
+static const BitmapCharRec ch73 = {5,10,-2,0,9,ch73data};
+
+/* char: 0x48 'H' */
+
+static const GLubyte ch72data[] = {
+0x82,0x82,0x82,0x82,0x82,0xfe,0x82,0x82,0x82,0x82,
+};
+
+static const BitmapCharRec ch72 = {7,10,-1,0,9,ch72data};
+
+/* char: 0x47 'G' */
+
+static const GLubyte ch71data[] = {
+0x7c,0x82,0x82,0x82,0x8e,0x80,0x80,0x80,0x82,0x7c,
+};
+
+static const BitmapCharRec ch71 = {7,10,-1,0,9,ch71data};
+
+/* char: 0x46 'F' */
+
+static const GLubyte ch70data[] = {
+0x40,0x40,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0xfe,
+};
+
+static const BitmapCharRec ch70 = {7,10,-1,0,9,ch70data};
+
+/* char: 0x45 'E' */
+
+static const GLubyte ch69data[] = {
+0xfe,0x40,0x40,0x40,0x40,0x78,0x40,0x40,0x40,0xfe,
+};
+
+static const BitmapCharRec ch69 = {7,10,-1,0,9,ch69data};
+
+/* char: 0x44 'D' */
+
+static const GLubyte ch68data[] = {
+0xfc,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xfc,
+};
+
+static const BitmapCharRec ch68 = {7,10,-1,0,9,ch68data};
+
+/* char: 0x43 'C' */
+
+static const GLubyte ch67data[] = {
+0x7c,0x82,0x80,0x80,0x80,0x80,0x80,0x80,0x82,0x7c,
+};
+
+static const BitmapCharRec ch67 = {7,10,-1,0,9,ch67data};
+
+/* char: 0x42 'B' */
+
+static const GLubyte ch66data[] = {
+0xfc,0x42,0x42,0x42,0x42,0x7c,0x42,0x42,0x42,0xfc,
+};
+
+static const BitmapCharRec ch66 = {7,10,-1,0,9,ch66data};
+
+/* char: 0x41 'A' */
+
+static const GLubyte ch65data[] = {
+0x82,0x82,0x82,0xfe,0x82,0x82,0x82,0x44,0x28,0x10,
+};
+
+static const BitmapCharRec ch65 = {7,10,-1,0,9,ch65data};
+
+/* char: 0x40 '@' */
+
+static const GLubyte ch64data[] = {
+0x7c,0x80,0x80,0x9a,0xa6,0xa2,0x9e,0x82,0x82,0x7c,
+};
+
+static const BitmapCharRec ch64 = {7,10,-1,0,9,ch64data};
+
+/* char: 0x3f '?' */
+
+static const GLubyte ch63data[] = {
+0x10,0x0,0x10,0x10,0x8,0x4,0x2,0x82,0x82,0x7c,
+};
+
+static const BitmapCharRec ch63 = {7,10,-1,0,9,ch63data};
+
+/* char: 0x3e '>' */
+
+static const GLubyte ch62data[] = {
+0x80,0x40,0x20,0x10,0x8,0x8,0x10,0x20,0x40,0x80,
+};
+
+static const BitmapCharRec ch62 = {5,10,-2,0,9,ch62data};
+
+/* char: 0x3d '=' */
+
+static const GLubyte ch61data[] = {
+0xfe,0x0,0x0,0xfe,
+};
+
+static const BitmapCharRec ch61 = {7,4,-1,-2,9,ch61data};
+
+/* char: 0x3c '<' */
+
+static const GLubyte ch60data[] = {
+0x8,0x10,0x20,0x40,0x80,0x80,0x40,0x20,0x10,0x8,
+};
+
+static const BitmapCharRec ch60 = {5,10,-2,0,9,ch60data};
+
+/* char: 0x3b ';' */
+
+static const GLubyte ch59data[] = {
+0x80,0x40,0x40,0xc0,0xc0,0x0,0x0,0x0,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch59 = {2,10,-4,3,9,ch59data};
+
+/* char: 0x3a ':' */
+
+static const GLubyte ch58data[] = {
+0xc0,0xc0,0x0,0x0,0x0,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch58 = {2,7,-4,0,9,ch58data};
+
+/* char: 0x39 '9' */
+
+static const GLubyte ch57data[] = {
+0x78,0x4,0x2,0x2,0x7a,0x86,0x82,0x82,0x82,0x7c,
+};
+
+static const BitmapCharRec ch57 = {7,10,-1,0,9,ch57data};
+
+/* char: 0x38 '8' */
+
+static const GLubyte ch56data[] = {
+0x38,0x44,0x82,0x82,0x44,0x38,0x44,0x82,0x44,0x38,
+};
+
+static const BitmapCharRec ch56 = {7,10,-1,0,9,ch56data};
+
+/* char: 0x37 '7' */
+
+static const GLubyte ch55data[] = {
+0x40,0x40,0x20,0x20,0x10,0x8,0x4,0x2,0x2,0xfe,
+};
+
+static const BitmapCharRec ch55 = {7,10,-1,0,9,ch55data};
+
+/* char: 0x36 '6' */
+
+static const GLubyte ch54data[] = {
+0x7c,0x82,0x82,0x82,0xc2,0xbc,0x80,0x80,0x40,0x3c,
+};
+
+static const BitmapCharRec ch54 = {7,10,-1,0,9,ch54data};
+
+/* char: 0x35 '5' */
+
+static const GLubyte ch53data[] = {
+0x7c,0x82,0x2,0x2,0x2,0xc2,0xbc,0x80,0x80,0xfe,
+};
+
+static const BitmapCharRec ch53 = {7,10,-1,0,9,ch53data};
+
+/* char: 0x34 '4' */
+
+static const GLubyte ch52data[] = {
+0x4,0x4,0x4,0xfe,0x84,0x44,0x24,0x14,0xc,0x4,
+};
+
+static const BitmapCharRec ch52 = {7,10,-1,0,9,ch52data};
+
+/* char: 0x33 '3' */
+
+static const GLubyte ch51data[] = {
+0x7c,0x82,0x2,0x2,0x2,0x1c,0x8,0x4,0x2,0xfe,
+};
+
+static const BitmapCharRec ch51 = {7,10,-1,0,9,ch51data};
+
+/* char: 0x32 '2' */
+
+static const GLubyte ch50data[] = {
+0xfe,0x80,0x40,0x30,0x8,0x4,0x2,0x82,0x82,0x7c,
+};
+
+static const BitmapCharRec ch50 = {7,10,-1,0,9,ch50data};
+
+/* char: 0x31 '1' */
+
+static const GLubyte ch49data[] = {
+0xfe,0x10,0x10,0x10,0x10,0x10,0x90,0x50,0x30,0x10,
+};
+
+static const BitmapCharRec ch49 = {7,10,-1,0,9,ch49data};
+
+/* char: 0x30 '0' */
+
+static const GLubyte ch48data[] = {
+0x38,0x44,0x82,0x82,0x82,0x82,0x82,0x82,0x44,0x38,
+};
+
+static const BitmapCharRec ch48 = {7,10,-1,0,9,ch48data};
+
+/* char: 0x2f '/' */
+
+static const GLubyte ch47data[] = {
+0x80,0x40,0x40,0x20,0x10,0x10,0x8,0x4,0x4,0x2,
+};
+
+static const BitmapCharRec ch47 = {7,10,-1,0,9,ch47data};
+
+/* char: 0x2e '.' */
+
+static const GLubyte ch46data[] = {
+0xc0,0xc0,
+};
+
+static const BitmapCharRec ch46 = {2,2,-4,0,9,ch46data};
+
+/* char: 0x2d '-' */
+
+static const GLubyte ch45data[] = {
+0xfe,
+};
+
+static const BitmapCharRec ch45 = {7,1,-1,-4,9,ch45data};
+
+/* char: 0x2c ',' */
+
+static const GLubyte ch44data[] = {
+0x80,0x40,0x40,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch44 = {2,5,-4,3,9,ch44data};
+
+/* char: 0x2b '+' */
+
+static const GLubyte ch43data[] = {
+0x10,0x10,0x10,0xfe,0x10,0x10,0x10,
+};
+
+static const BitmapCharRec ch43 = {7,7,-1,-1,9,ch43data};
+
+/* char: 0x2a '*' */
+
+static const GLubyte ch42data[] = {
+0x10,0x92,0x54,0x38,0x54,0x92,0x10,
+};
+
+static const BitmapCharRec ch42 = {7,7,-1,-1,9,ch42data};
+
+/* char: 0x29 ')' */
+
+static const GLubyte ch41data[] = {
+0x80,0x40,0x40,0x20,0x20,0x20,0x20,0x20,0x20,0x40,0x40,0x80,
+};
+
+static const BitmapCharRec ch41 = {3,12,-3,1,9,ch41data};
+
+/* char: 0x28 '(' */
+
+static const GLubyte ch40data[] = {
+0x20,0x40,0x40,0x80,0x80,0x80,0x80,0x80,0x80,0x40,0x40,0x20,
+};
+
+static const BitmapCharRec ch40 = {3,12,-3,1,9,ch40data};
+
+/* char: 0x27 ''' */
+
+static const GLubyte ch39data[] = {
+0x80,0x40,0x20,0x30,
+};
+
+static const BitmapCharRec ch39 = {4,4,-3,-6,9,ch39data};
+
+/* char: 0x26 '&' */
+
+static const GLubyte ch38data[] = {
+0x62,0x94,0x88,0x94,0x62,0x60,0x90,0x90,0x90,0x60,
+};
+
+static const BitmapCharRec ch38 = {7,10,-1,0,9,ch38data};
+
+/* char: 0x25 '%' */
+
+static const GLubyte ch37data[] = {
+0x84,0x4a,0x4a,0x24,0x10,0x10,0x48,0xa4,0xa4,0x42,
+};
+
+static const BitmapCharRec ch37 = {7,10,-1,0,9,ch37data};
+
+/* char: 0x24 '$' */
+
+static const GLubyte ch36data[] = {
+0x10,0x7c,0x92,0x12,0x12,0x14,0x38,0x50,0x90,0x92,0x7c,0x10,
+};
+
+static const BitmapCharRec ch36 = {7,12,-1,1,9,ch36data};
+
+/* char: 0x23 '#' */
+
+static const GLubyte ch35data[] = {
+0x48,0x48,0xfc,0x48,0x48,0xfc,0x48,0x48,
+};
+
+static const BitmapCharRec ch35 = {6,8,-1,-1,9,ch35data};
+
+/* char: 0x22 '"' */
+
+static const GLubyte ch34data[] = {
+0x90,0x90,0x90,
+};
+
+static const BitmapCharRec ch34 = {4,3,-3,-7,9,ch34data};
+
+/* char: 0x21 '!' */
+
+static const GLubyte ch33data[] = {
+0x80,0x80,0x0,0x0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch33 = {1,11,-4,0,9,ch33data};
+
+/* char: 0x1f */
+
+static const GLubyte ch31data[] = {
+0xc0,0xc0,
+};
+
+static const BitmapCharRec ch31 = {2,2,-4,-2,9,ch31data};
+
+/* char: 0x1e */
+
+static const GLubyte ch30data[] = {
+0x5c,0xa2,0x60,0x20,0x20,0xf8,0x20,0x20,0x22,0x1c,
+};
+
+static const BitmapCharRec ch30 = {7,10,-1,0,9,ch30data};
+
+/* char: 0x1d */
+
+static const GLubyte ch29data[] = {
+0x80,0x40,0xfe,0x10,0xfe,0x4,0x2,
+};
+
+static const BitmapCharRec ch29 = {7,7,-1,0,9,ch29data};
+
+/* char: 0x1c */
+
+static const GLubyte ch28data[] = {
+0x44,0x24,0x24,0x24,0x24,0x24,0xfe,
+};
+
+static const BitmapCharRec ch28 = {7,7,-1,0,9,ch28data};
+
+/* char: 0x1b */
+
+static const GLubyte ch27data[] = {
+0xfe,0x0,0x80,0x40,0x20,0x10,0x8,0x8,0x10,0x20,0x40,0x80,
+};
+
+static const BitmapCharRec ch27 = {7,12,-1,2,9,ch27data};
+
+/* char: 0x1a */
+
+static const GLubyte ch26data[] = {
+0xfc,0x0,0x4,0x8,0x10,0x20,0x40,0x40,0x20,0x10,0x8,0x4,
+};
+
+static const BitmapCharRec ch26 = {6,12,-2,2,9,ch26data};
+
+/* char: 0x19 */
+
+static const GLubyte ch25data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch25 = {1,15,-4,3,9,ch25data};
+
+/* char: 0x18 */
+
+static const GLubyte ch24data[] = {
+0x8,0x0,0x8,0x0,0x8,0x0,0x8,0x0,0x8,0x0,0x8,0x0,0xff,0x80,
+};
+
+static const BitmapCharRec ch24 = {9,7,0,3,9,ch24data};
+
+/* char: 0x17 */
+
+static const GLubyte ch23data[] = {
+0xff,0x80,0x8,0x0,0x8,0x0,0x8,0x0,0x8,0x0,0x8,0x0,0x8,0x0,0x8,0x0,
+0x8,0x0,
+};
+
+static const BitmapCharRec ch23 = {9,9,0,-3,9,ch23data};
+
+/* char: 0x16 */
+
+static const GLubyte ch22data[] = {
+0x8,0x8,0x8,0x8,0x8,0x8,0xf8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,
+};
+
+static const BitmapCharRec ch22 = {5,15,0,3,9,ch22data};
+
+/* char: 0x15 */
+
+static const GLubyte ch21data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0xf8,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch21 = {5,15,-4,3,9,ch21data};
+
+/* char: 0x14 */
+
+static const GLubyte ch20data[] = {
+0xff,0x80,
+};
+
+static const BitmapCharRec ch20 = {9,1,0,1,9,ch20data};
+
+/* char: 0x13 */
+
+static const GLubyte ch19data[] = {
+0xff,0x80,
+};
+
+static const BitmapCharRec ch19 = {9,1,0,-1,9,ch19data};
+
+/* char: 0x12 */
+
+static const GLubyte ch18data[] = {
+0xff,0x80,
+};
+
+static const BitmapCharRec ch18 = {9,1,0,-3,9,ch18data};
+
+/* char: 0x11 */
+
+static const GLubyte ch17data[] = {
+0xff,0x80,
+};
+
+static const BitmapCharRec ch17 = {9,1,0,-5,9,ch17data};
+
+/* char: 0x10 */
+
+static const GLubyte ch16data[] = {
+0xff,0x80,
+};
+
+static const BitmapCharRec ch16 = {9,1,0,-7,9,ch16data};
+
+/* char: 0xf */
+
+static const GLubyte ch15data[] = {
+0x8,0x0,0x8,0x0,0x8,0x0,0x8,0x0,0x8,0x0,0x8,0x0,0xff,0x80,0x8,0x0,
+0x8,0x0,0x8,0x0,0x8,0x0,0x8,0x0,0x8,0x0,0x8,0x0,0x8,0x0,
+};
+
+static const BitmapCharRec ch15 = {9,15,0,3,9,ch15data};
+
+/* char: 0xe */
+
+static const GLubyte ch14data[] = {
+0xf8,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch14 = {5,9,-4,-3,9,ch14data};
+
+/* char: 0xd */
+
+static const GLubyte ch13data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0xf8,
+};
+
+static const BitmapCharRec ch13 = {5,7,-4,3,9,ch13data};
+
+/* char: 0xc */
+
+static const GLubyte ch12data[] = {
+0x8,0x8,0x8,0x8,0x8,0x8,0xf8,
+};
+
+static const BitmapCharRec ch12 = {5,7,0,3,9,ch12data};
+
+/* char: 0xb */
+
+static const GLubyte ch11data[] = {
+0xf8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,
+};
+
+static const BitmapCharRec ch11 = {5,9,0,-3,9,ch11data};
+
+/* char: 0xa */
+
+static const GLubyte ch10data[] = {
+0x8,0x8,0x8,0x8,0x3e,0x0,0x20,0x50,0x88,0x88,
+};
+
+static const BitmapCharRec ch10 = {7,10,-1,2,9,ch10data};
+
+/* char: 0x9 */
+
+static const GLubyte ch9data[] = {
+0x3e,0x20,0x20,0x20,0x20,0x88,0x98,0xa8,0xc8,0x88,
+};
+
+static const BitmapCharRec ch9 = {7,10,-1,2,9,ch9data};
+
+/* char: 0x8 */
+
+static const GLubyte ch8data[] = {
+0xfe,0x10,0x10,0xfe,0x10,0x10,
+};
+
+static const BitmapCharRec ch8 = {7,6,-1,0,9,ch8data};
+
+/* char: 0x7 */
+
+static const GLubyte ch7data[] = {
+0x70,0x88,0x88,0x70,
+};
+
+static const BitmapCharRec ch7 = {5,4,-2,-6,9,ch7data};
+
+/* char: 0x6 */
+
+static const GLubyte ch6data[] = {
+0x20,0x20,0x3c,0x20,0x3e,0x0,0xf8,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch6 = {7,10,-1,2,9,ch6data};
+
+/* char: 0x5 */
+
+static const GLubyte ch5data[] = {
+0x22,0x22,0x3c,0x22,0x3c,0x0,0x78,0x80,0x80,0x78,
+};
+
+static const BitmapCharRec ch5 = {7,10,-1,2,9,ch5data};
+
+/* char: 0x4 */
+
+static const GLubyte ch4data[] = {
+0x10,0x10,0x1c,0x10,0x1e,0x80,0x80,0xe0,0x80,0xf0,
+};
+
+static const BitmapCharRec ch4 = {7,10,-1,2,9,ch4data};
+
+/* char: 0x3 */
+
+static const GLubyte ch3data[] = {
+0x8,0x8,0x8,0x3e,0x0,0x88,0x88,0xf8,0x88,0x88,
+};
+
+static const BitmapCharRec ch3 = {7,10,-1,2,9,ch3data};
+
+/* char: 0x2 */
+
+static const GLubyte ch2data[] = {
+0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,
+};
+
+static const BitmapCharRec ch2 = {8,14,0,3,9,ch2data};
+
+/* char: 0x1 */
+
+static const GLubyte ch1data[] = {
+0x10,0x38,0x7c,0xfe,0x7c,0x38,0x10,
+};
+
+static const BitmapCharRec ch1 = {7,7,-1,0,9,ch1data};
+
+static const BitmapCharRec * const chars[] = {
+&ch0,
+&ch1,
+&ch2,
+&ch3,
+&ch4,
+&ch5,
+&ch6,
+&ch7,
+&ch8,
+&ch9,
+&ch10,
+&ch11,
+&ch12,
+&ch13,
+&ch14,
+&ch15,
+&ch16,
+&ch17,
+&ch18,
+&ch19,
+&ch20,
+&ch21,
+&ch22,
+&ch23,
+&ch24,
+&ch25,
+&ch26,
+&ch27,
+&ch28,
+&ch29,
+&ch30,
+&ch31,
+&ch32,
+&ch33,
+&ch34,
+&ch35,
+&ch36,
+&ch37,
+&ch38,
+&ch39,
+&ch40,
+&ch41,
+&ch42,
+&ch43,
+&ch44,
+&ch45,
+&ch46,
+&ch47,
+&ch48,
+&ch49,
+&ch50,
+&ch51,
+&ch52,
+&ch53,
+&ch54,
+&ch55,
+&ch56,
+&ch57,
+&ch58,
+&ch59,
+&ch60,
+&ch61,
+&ch62,
+&ch63,
+&ch64,
+&ch65,
+&ch66,
+&ch67,
+&ch68,
+&ch69,
+&ch70,
+&ch71,
+&ch72,
+&ch73,
+&ch74,
+&ch75,
+&ch76,
+&ch77,
+&ch78,
+&ch79,
+&ch80,
+&ch81,
+&ch82,
+&ch83,
+&ch84,
+&ch85,
+&ch86,
+&ch87,
+&ch88,
+&ch89,
+&ch90,
+&ch91,
+&ch92,
+&ch93,
+&ch94,
+&ch95,
+&ch96,
+&ch97,
+&ch98,
+&ch99,
+&ch100,
+&ch101,
+&ch102,
+&ch103,
+&ch104,
+&ch105,
+&ch106,
+&ch107,
+&ch108,
+&ch109,
+&ch110,
+&ch111,
+&ch112,
+&ch113,
+&ch114,
+&ch115,
+&ch116,
+&ch117,
+&ch118,
+&ch119,
+&ch120,
+&ch121,
+&ch122,
+&ch123,
+&ch124,
+&ch125,
+&ch126,
+&ch127,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+&ch160,
+&ch161,
+&ch162,
+&ch163,
+&ch164,
+&ch165,
+&ch166,
+&ch167,
+&ch168,
+&ch169,
+&ch170,
+&ch171,
+&ch172,
+&ch173,
+&ch174,
+&ch175,
+&ch176,
+&ch177,
+&ch178,
+&ch179,
+&ch180,
+&ch181,
+&ch182,
+&ch183,
+&ch184,
+&ch185,
+&ch186,
+&ch187,
+&ch188,
+&ch189,
+&ch190,
+&ch191,
+&ch192,
+&ch193,
+&ch194,
+&ch195,
+&ch196,
+&ch197,
+&ch198,
+&ch199,
+&ch200,
+&ch201,
+&ch202,
+&ch203,
+&ch204,
+&ch205,
+&ch206,
+&ch207,
+&ch208,
+&ch209,
+&ch210,
+&ch211,
+&ch212,
+&ch213,
+&ch214,
+&ch215,
+&ch216,
+&ch217,
+&ch218,
+&ch219,
+&ch220,
+&ch221,
+&ch222,
+&ch223,
+&ch224,
+&ch225,
+&ch226,
+&ch227,
+&ch228,
+&ch229,
+&ch230,
+&ch231,
+&ch232,
+&ch233,
+&ch234,
+&ch235,
+&ch236,
+&ch237,
+&ch238,
+&ch239,
+&ch240,
+&ch241,
+&ch242,
+&ch243,
+&ch244,
+&ch245,
+&ch246,
+&ch247,
+&ch248,
+&ch249,
+&ch250,
+&ch251,
+&ch252,
+&ch253,
+&ch254,
+&ch255,
+};
+#if !defined(__IBMCPP__)
+const
+#endif
+ BitmapFontRec glutBitmap9By15 = {
+"-misc-fixed-medium-r-normal--15-140-75-75-C-90-iso8859-1",
+256,
+0,
+chars
+};
+
diff --git a/src/glut/os2/glut_bitmap.cpp b/src/glut/os2/glut_bitmap.cpp
new file mode 100644
index 00000000000..789a89ae73e
--- /dev/null
+++ b/src/glut/os2/glut_bitmap.cpp
@@ -0,0 +1,57 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include "glutint.h"
+#include "glutbitmap.h"
+
+void GLUTAPIENTRY
+glutBitmapCharacter(GLUTbitmapFont font, int c)
+{
+ const BitmapCharRec *ch;
+ BitmapFontPtr fontinfo;
+ GLint swapbytes, lsbfirst, rowlength;
+ GLint skiprows, skippixels, alignment;
+
+#if defined(_WIN32)
+ fontinfo = (BitmapFontPtr) __glutFont(font);
+#else
+ fontinfo = (BitmapFontPtr) font;
+#endif
+
+ if (c < fontinfo->first ||
+ c >= fontinfo->first + fontinfo->num_chars)
+ return;
+ ch = fontinfo->ch[c - fontinfo->first];
+ if (ch) {
+ /* Save current modes. */
+ glGetIntegerv(GL_UNPACK_SWAP_BYTES, &swapbytes);
+ glGetIntegerv(GL_UNPACK_LSB_FIRST, &lsbfirst);
+ glGetIntegerv(GL_UNPACK_ROW_LENGTH, &rowlength);
+ glGetIntegerv(GL_UNPACK_SKIP_ROWS, &skiprows);
+ glGetIntegerv(GL_UNPACK_SKIP_PIXELS, &skippixels);
+ glGetIntegerv(GL_UNPACK_ALIGNMENT, &alignment);
+ /* Little endian machines (DEC Alpha for example) could
+ benefit from setting GL_UNPACK_LSB_FIRST to GL_TRUE
+ instead of GL_FALSE, but this would require changing the
+ generated bitmaps too. */
+ glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE);
+ glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+ glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
+ glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glBitmap(ch->width, ch->height, ch->xorig, ch->yorig,
+ ch->advance, 0, ch->bitmap);
+ /* Restore saved modes. */
+ glPixelStorei(GL_UNPACK_SWAP_BYTES, swapbytes);
+ glPixelStorei(GL_UNPACK_LSB_FIRST, lsbfirst);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, rowlength);
+ glPixelStorei(GL_UNPACK_SKIP_ROWS, skiprows);
+ glPixelStorei(GL_UNPACK_SKIP_PIXELS, skippixels);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);
+ }
+}
diff --git a/src/glut/os2/glut_cindex.cpp b/src/glut/os2/glut_cindex.cpp
new file mode 100644
index 00000000000..0897a3cf85c
--- /dev/null
+++ b/src/glut/os2/glut_cindex.cpp
@@ -0,0 +1,259 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1996, 1997. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include <stdlib.h>
+#include "glutint.h"
+
+#if defined(__OS2PM__)
+ #define IsWindowVisible WinIsWindowVisible
+#endif
+
+#define CLAMP(i) ((i) > 1.0 ? 1.0 : ((i) < 0.0 ? 0.0 : (i)))
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutSetColor(int ndx, GLfloat red, GLfloat green, GLfloat blue)
+{
+ GLUTcolormap *cmap, *newcmap;
+ XVisualInfo *vis;
+ XColor color;
+ int i;
+
+ if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
+ cmap = __glutCurrentWindow->colormap;
+ vis = __glutCurrentWindow->vis;
+ } else {
+ cmap = __glutCurrentWindow->overlay->colormap;
+ vis = __glutCurrentWindow->overlay->vis;
+ if (ndx == __glutCurrentWindow->overlay->transparentPixel) {
+ __glutWarning(
+ "glutSetColor: cannot set color of overlay transparent index %d\n",
+ ndx);
+ return;
+ }
+ }
+
+ if (!cmap) {
+ __glutWarning("glutSetColor: current window is RGBA");
+ return;
+ }
+#if defined(_WIN32) || defined(__OS2PM__)
+ if (ndx >= 256 || /* always assume 256 colors on Win32 */
+#else
+ if (ndx >= vis->visual->map_entries ||
+#endif
+ ndx < 0) {
+ __glutWarning("glutSetColor: index %d out of range", ndx);
+ return;
+ }
+ if (cmap->refcnt > 1) {
+ newcmap = __glutAssociateNewColormap(vis);
+ cmap->refcnt--;
+ /* Wouldn't it be nice if XCopyColormapAndFree could be
+ told not to free the old colormap's entries! */
+ for (i = cmap->size - 1; i >= 0; i--) {
+ if (i == ndx) {
+ /* We are going to set this cell shortly! */
+ continue;
+ }
+ if (cmap->cells[i].component[GLUT_RED] >= 0.0) {
+ color.pixel = i;
+ newcmap->cells[i].component[GLUT_RED] =
+ cmap->cells[i].component[GLUT_RED];
+ color.red = (GLfloat) 0xffff *
+ cmap->cells[i].component[GLUT_RED];
+ newcmap->cells[i].component[GLUT_GREEN] =
+ cmap->cells[i].component[GLUT_GREEN];
+ color.green = (GLfloat) 0xffff *
+ cmap->cells[i].component[GLUT_GREEN];
+ newcmap->cells[i].component[GLUT_BLUE] =
+ cmap->cells[i].component[GLUT_BLUE];
+ color.blue = (GLfloat) 0xffff *
+ cmap->cells[i].component[GLUT_BLUE];
+ color.flags = DoRed | DoGreen | DoBlue;
+#if defined(_WIN32) || defined(__OS2PM__)
+ if (IsWindowVisible(__glutCurrentWindow->win)) {
+ XHDC = __glutCurrentWindow->hdc;
+ } else {
+ XHDC = 0;
+ }
+#endif
+ XStoreColor(__glutDisplay, newcmap->cmap, &color);
+ } else {
+ /* Leave unallocated entries unallocated. */
+ }
+ }
+ cmap = newcmap;
+ if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
+ __glutCurrentWindow->colormap = cmap;
+ __glutCurrentWindow->cmap = cmap->cmap;
+ } else {
+ __glutCurrentWindow->overlay->colormap = cmap;
+ __glutCurrentWindow->overlay->cmap = cmap->cmap;
+ }
+ XSetWindowColormap(__glutDisplay,
+ __glutCurrentWindow->renderWin, cmap->cmap);
+
+#if !defined(_WIN32) && !defined(__OS2PM__)
+ {
+ GLUTwindow *toplevel;
+
+ toplevel = __glutToplevelOf(__glutCurrentWindow);
+ if (toplevel->cmap != cmap->cmap) {
+ __glutPutOnWorkList(toplevel, GLUT_COLORMAP_WORK);
+ }
+ }
+#endif
+ }
+ color.pixel = ndx;
+ red = CLAMP(red);
+ cmap->cells[ndx].component[GLUT_RED] = red;
+ color.red = (GLfloat) 0xffff *red;
+ green = CLAMP(green);
+ cmap->cells[ndx].component[GLUT_GREEN] = green;
+ color.green = (GLfloat) 0xffff *green;
+ blue = CLAMP(blue);
+ cmap->cells[ndx].component[GLUT_BLUE] = blue;
+ color.blue = (GLfloat) 0xffff *blue;
+ color.flags = DoRed | DoGreen | DoBlue;
+#if defined(_WIN32) || defined(__OS2PM__)
+ if (IsWindowVisible(__glutCurrentWindow->win)) {
+ XHDC = __glutCurrentWindow->hdc;
+ } else {
+ XHDC = 0;
+ }
+#endif
+ XStoreColor(__glutDisplay, cmap->cmap, &color);
+}
+
+GLfloat GLUTAPIENTRY
+glutGetColor(int ndx, int comp)
+{
+ GLUTcolormap *colormap;
+ XVisualInfo *vis;
+
+ if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
+ colormap = __glutCurrentWindow->colormap;
+ vis = __glutCurrentWindow->vis;
+ } else {
+ colormap = __glutCurrentWindow->overlay->colormap;
+ vis = __glutCurrentWindow->overlay->vis;
+ if (ndx == __glutCurrentWindow->overlay->transparentPixel) {
+ __glutWarning("glutGetColor: requesting overlay transparent index %d\n",
+ ndx);
+ return -1.0;
+ }
+ }
+
+ if (!colormap) {
+ __glutWarning("glutGetColor: current window is RGBA");
+ return -1.0;
+ }
+#if defined(_WIN32) || defined(__OS2PM__)
+#define OUT_OF_RANGE_NDX(ndx) (ndx >= 256 || ndx < 0)
+#else
+#define OUT_OF_RANGE_NDX(ndx) (ndx >= vis->visual->map_entries || ndx < 0)
+#endif
+ if (OUT_OF_RANGE_NDX(ndx)) {
+ __glutWarning("glutGetColor: index %d out of range", ndx);
+ return -1.0;
+ }
+ return colormap->cells[ndx].component[comp];
+}
+
+void GLUTAPIENTRY
+glutCopyColormap(int winnum)
+{
+ GLUTwindow *window = __glutWindowList[winnum - 1];
+ GLUTcolormap *oldcmap, *newcmap;
+ XVisualInfo *dstvis;
+
+ if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
+ oldcmap = __glutCurrentWindow->colormap;
+ dstvis = __glutCurrentWindow->vis;
+ newcmap = window->colormap;
+ } else {
+ oldcmap = __glutCurrentWindow->overlay->colormap;
+ dstvis = __glutCurrentWindow->overlay->vis;
+ if (!window->overlay) {
+ __glutWarning("glutCopyColormap: window %d has no overlay", winnum);
+ return;
+ }
+ newcmap = window->overlay->colormap;
+ }
+
+ if (!oldcmap) {
+ __glutWarning("glutCopyColormap: destination colormap must be color index");
+ return;
+ }
+ if (!newcmap) {
+ __glutWarning(
+ "glutCopyColormap: source colormap of window %d must be color index",
+ winnum);
+ return;
+ }
+ if (newcmap == oldcmap) {
+ /* Source and destination are the same; now copy needed. */
+ return;
+ }
+#if !defined(_WIN32) && !defined(__OS2PM__)
+ /* Play safe: compare visual IDs, not Visual*'s. */
+ if (newcmap->visual->visualid == oldcmap->visual->visualid) {
+#endif
+ /* Visuals match! "Copy" by reference... */
+ __glutFreeColormap(oldcmap);
+ newcmap->refcnt++;
+ if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
+ __glutCurrentWindow->colormap = newcmap;
+ __glutCurrentWindow->cmap = newcmap->cmap;
+ } else {
+ __glutCurrentWindow->overlay->colormap = newcmap;
+ __glutCurrentWindow->overlay->cmap = newcmap->cmap;
+ }
+ XSetWindowColormap(__glutDisplay, __glutCurrentWindow->renderWin,
+ newcmap->cmap);
+#if !defined(_WIN32) && !defined(__OS2PM__)
+ __glutPutOnWorkList(__glutToplevelOf(window), GLUT_COLORMAP_WORK);
+bla bla bla
+
+ } else {
+ GLUTcolormap *copycmap;
+ XColor color;
+ int i, last;
+
+ /* Visuals different - need a distinct X colormap! */
+ copycmap = __glutAssociateNewColormap(dstvis);
+ /* Wouldn't it be nice if XCopyColormapAndFree could be
+ told not to free the old colormap's entries! */
+ last = newcmap->size;
+ if (last > copycmap->size) {
+ last = copycmap->size;
+ }
+ for (i = last - 1; i >= 0; i--) {
+ if (newcmap->cells[i].component[GLUT_RED] >= 0.0) {
+ color.pixel = i;
+ copycmap->cells[i].component[GLUT_RED] =
+ newcmap->cells[i].component[GLUT_RED];
+ color.red = (GLfloat) 0xffff *
+ newcmap->cells[i].component[GLUT_RED];
+ copycmap->cells[i].component[GLUT_GREEN] =
+ newcmap->cells[i].component[GLUT_GREEN];
+ color.green = (GLfloat) 0xffff *
+ newcmap->cells[i].component[GLUT_GREEN];
+ copycmap->cells[i].component[GLUT_BLUE] =
+ newcmap->cells[i].component[GLUT_BLUE];
+ color.blue = (GLfloat) 0xffff *
+ newcmap->cells[i].component[GLUT_BLUE];
+ color.flags = DoRed | DoGreen | DoBlue;
+ XStoreColor(__glutDisplay, copycmap->cmap, &color);
+ }
+ }
+ }
+#endif
+}
+/* ENDCENTRY */
+ \ No newline at end of file
diff --git a/src/glut/os2/glut_cmap.cpp b/src/glut/os2/glut_cmap.cpp
new file mode 100644
index 00000000000..d5b8d436a5d
--- /dev/null
+++ b/src/glut/os2/glut_cmap.cpp
@@ -0,0 +1,399 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1996, 1997. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#ifdef __VMS
+//EK#include <GL/vms_x_fix.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h> /* SunOS multithreaded assert() needs <stdio.h>. Lame. */
+#include <assert.h>
+#if !defined(_WIN32) && !defined(__OS2__)
+ #include <X11/Xlib.h>
+ #include <X11/Xutil.h>
+ #include <X11/Xatom.h> /* for XA_RGB_DEFAULT_MAP atom */
+ #if defined(__vms)
+ #include <Xmu/StdCmap.h> /* for XmuLookupStandardColormap */
+ #else
+ #include <X11/Xmu/StdCmap.h> /* for XmuLookupStandardColormap */
+ #endif
+#endif
+
+/* SGI optimization introduced in IRIX 6.3 to avoid X server
+ round trips for interning common X atoms. */
+#if defined(_SGI_EXTRA_PREDEFINES) && !defined(NO_FAST_ATOMS)
+#include <X11/SGIFastAtom.h>
+#else
+#define XSGIFastInternAtom(dpy,string,fast_name,how) XInternAtom(dpy,string,how)
+#endif
+
+#include "glutint.h"
+#include "layerutil.h"
+
+GLUTcolormap *__glutColormapList = NULL;
+
+GLUTcolormap *
+__glutAssociateNewColormap(XVisualInfo * vis)
+{
+ GLUTcolormap *cmap;
+ int transparentPixel, i;
+ unsigned long pixels[255];
+
+ cmap = (GLUTcolormap *) malloc(sizeof(GLUTcolormap));
+ if (!cmap)
+ __glutFatalError("out of memory.");
+#if defined(_WIN32) || defined(__OS2__)
+ pixels[0] = 0; /* avoid compilation warnings on win32 */
+ cmap->visual = 0;
+ cmap->size = 256; /* always assume 256 on Win32 */
+#else
+ cmap->visual = vis->visual;
+ cmap->size = vis->visual->map_entries;
+#endif
+ cmap->refcnt = 1;
+ cmap->cells = (GLUTcolorcell *)
+ malloc(sizeof(GLUTcolorcell) * cmap->size);
+ if (!cmap->cells)
+ __glutFatalError("out of memory.");
+ /* make all color cell entries be invalid */
+ for (i = cmap->size - 1; i >= 0; i--) {
+ cmap->cells[i].component[GLUT_RED] = -1.0;
+ cmap->cells[i].component[GLUT_GREEN] = -1.0;
+ cmap->cells[i].component[GLUT_BLUE] = -1.0;
+ }
+ transparentPixel = __glutGetTransparentPixel(__glutDisplay, vis);
+ if (transparentPixel == -1 || transparentPixel >= cmap->size) {
+
+ /* If there is no transparent pixel or if the transparent
+ pixel is outside the range of valid colormap cells (HP
+ can implement their overlays this smart way since their
+ transparent pixel is 255), we can AllocAll the colormap.
+ See note below. */
+
+ cmap->cmap = XCreateColormap(__glutDisplay,
+ __glutRoot, cmap->visual, AllocAll);
+ } else {
+
+ /* On machines where zero (or some other value in the range
+ of 0 through map_entries-1), BadAlloc may be generated
+ when an AllocAll overlay colormap is allocated since the
+ transparent pixel precludes all the cells in the colormap
+ being allocated (the transparent pixel is pre-allocated).
+ So in this case, use XAllocColorCells to allocate
+ map_entries-1 pixels (that is, all but the transparent
+ pixel. */
+
+#if defined(_WIN32) || defined(__OS2__)
+ cmap->cmap = XCreateColormap(__glutDisplay,
+ __glutRoot, 0, AllocNone);
+#else
+ cmap->cmap = XCreateColormap(__glutDisplay,
+ __glutRoot, vis->visual, AllocNone);
+ XAllocColorCells(__glutDisplay, cmap->cmap, False, 0, 0,
+ pixels, cmap->size - 1);
+#endif
+ }
+ cmap->next = __glutColormapList;
+ __glutColormapList = cmap;
+ return cmap;
+}
+
+static GLUTcolormap *
+associateColormap(XVisualInfo * vis)
+{
+#if !defined(_WIN32) && !defined(__OS2__)
+ GLUTcolormap *cmap = __glutColormapList;
+
+ while (cmap != NULL) {
+ /* Play safe: compare visual IDs, not Visual*'s. */
+ if (cmap->visual->visualid == vis->visual->visualid) {
+ /* Already have created colormap for the visual. */
+ cmap->refcnt++;
+ return cmap;
+ }
+ cmap = cmap->next;
+ }
+#endif
+ return __glutAssociateNewColormap(vis);
+}
+
+void
+__glutSetupColormap(XVisualInfo * vi, GLUTcolormap ** colormap, Colormap * cmap)
+{
+#if defined(_WIN32) || defined(__OS2__)
+ if (vi->dwFlags & PFD_NEED_PALETTE || vi->iPixelType == PFD_TYPE_COLORINDEX) {
+ *colormap = associateColormap(vi);
+ *cmap = (*colormap)->cmap;
+ } else {
+ *colormap = NULL;
+ *cmap = 0;
+ }
+#else
+ Status status;
+ XStandardColormap *standardCmaps;
+ int i, numCmaps;
+ static Atom hpColorRecoveryAtom = -1;
+ int isRGB, visualClass, rc;
+
+#if defined(__cplusplus) || defined(c_plusplus)
+ visualClass = vi->c_class;
+#else
+ visualClass = vi->class;
+#endif
+ switch (visualClass) {
+ case PseudoColor:
+ /* Mesa might return a PseudoColor visual for RGB mode. */
+ rc = glXGetConfig(__glutDisplay, vi, GLX_RGBA, &isRGB);
+ if (rc == 0 && isRGB) {
+ /* Must be Mesa. */
+ *colormap = NULL;
+ if (MaxCmapsOfScreen(DefaultScreenOfDisplay(__glutDisplay)) == 1
+ && vi->visual == DefaultVisual(__glutDisplay, __glutScreen)) {
+ char *privateCmap = getenv("MESA_PRIVATE_CMAP");
+
+ if (privateCmap) {
+ /* User doesn't want to share colormaps. */
+ *cmap = XCreateColormap(__glutDisplay, __glutRoot,
+ vi->visual, AllocNone);
+ } else {
+ /* Share the root colormap. */
+ *cmap = DefaultColormap(__glutDisplay, __glutScreen);
+ }
+ } else {
+ /* Get our own PseudoColor colormap. */
+ *cmap = XCreateColormap(__glutDisplay, __glutRoot,
+ vi->visual, AllocNone);
+ }
+ } else {
+ /* CI mode, real GLX never returns a PseudoColor visual
+ for RGB mode. */
+ *colormap = associateColormap(vi);
+ *cmap = (*colormap)->cmap;
+ }
+ break;
+ case TrueColor:
+ case DirectColor:
+ *colormap = NULL; /* NULL if RGBA */
+
+ /* Hewlett-Packard supports a feature called "HP Color
+ Recovery". Mesa has code to use HP Color Recovery. For
+ Mesa to use this feature, the atom
+ _HP_RGB_SMOOTH_MAP_LIST must be defined on the root
+ window AND the colormap obtainable by XGetRGBColormaps
+ for that atom must be set on the window. If that
+ colormap is not set, the output will look stripy. */
+
+ if (hpColorRecoveryAtom == -1) {
+ char *xvendor;
+
+#define VENDOR_HP "Hewlett-Packard"
+
+ /* Only makes sense to make XInternAtom round-trip if we
+ know that we are connected to an HP X server. */
+ xvendor = ServerVendor(__glutDisplay);
+ if (!strncmp(xvendor, VENDOR_HP, sizeof(VENDOR_HP) - 1)) {
+ hpColorRecoveryAtom = XInternAtom(__glutDisplay, "_HP_RGB_SMOOTH_MAP_LIST", True);
+ } else {
+ hpColorRecoveryAtom = None;
+ }
+ }
+ if (hpColorRecoveryAtom != None) {
+ status = XGetRGBColormaps(__glutDisplay, __glutRoot,
+ &standardCmaps, &numCmaps, hpColorRecoveryAtom);
+ if (status == 1) {
+ for (i = 0; i < numCmaps; i++) {
+ if (standardCmaps[i].visualid == vi->visualid) {
+ *cmap = standardCmaps[i].colormap;
+ XFree(standardCmaps);
+ return;
+ }
+ }
+ XFree(standardCmaps);
+ }
+ }
+#ifndef SOLARIS_2_4_BUG
+ /* Solaris 2.4 and 2.5 have a bug in their
+ XmuLookupStandardColormap implementations. Please
+ compile your Solaris 2.4 or 2.5 version of GLUT with
+ -DSOLARIS_2_4_BUG to work around this bug. The symptom
+ of the bug is that programs will get a BadMatch error
+ from X_CreateWindow when creating a GLUT window because
+ Solaris 2.4 and 2.5 create a corrupted RGB_DEFAULT_MAP
+ property. Note that this workaround prevents Colormap
+ sharing between applications, perhaps leading
+ unnecessary colormap installations or colormap flashing.
+ Sun fixed this bug in Solaris 2.6. */
+ status = XmuLookupStandardColormap(__glutDisplay,
+ vi->screen, vi->visualid, vi->depth, XA_RGB_DEFAULT_MAP,
+ /* replace */ False, /* retain */ True);
+ if (status == 1) {
+ status = XGetRGBColormaps(__glutDisplay, __glutRoot,
+ &standardCmaps, &numCmaps, XA_RGB_DEFAULT_MAP);
+ if (status == 1) {
+ for (i = 0; i < numCmaps; i++) {
+ if (standardCmaps[i].visualid == vi->visualid) {
+ *cmap = standardCmaps[i].colormap;
+ XFree(standardCmaps);
+ return;
+ }
+ }
+ XFree(standardCmaps);
+ }
+ }
+#endif
+ /* If no standard colormap but TrueColor, just make a
+ private one. */
+ /* XXX Should do a better job of internal sharing for
+ privately allocated TrueColor colormaps. */
+ /* XXX DirectColor probably needs ramps hand initialized! */
+ *cmap = XCreateColormap(__glutDisplay, __glutRoot,
+ vi->visual, AllocNone);
+ break;
+ case StaticColor:
+ case StaticGray:
+ case GrayScale:
+ /* Mesa supports these visuals */
+ *colormap = NULL;
+ *cmap = XCreateColormap(__glutDisplay, __glutRoot,
+ vi->visual, AllocNone);
+ break;
+ default:
+ __glutFatalError(
+ "could not allocate colormap for visual type: %d.",
+ visualClass);
+ }
+ return;
+#endif
+}
+
+#if !defined(_WIN32) && !defined(__OS2__)
+static int
+findColormaps(GLUTwindow * window,
+ Window * winlist, Colormap * cmaplist, int num, int max)
+{
+ GLUTwindow *child;
+ int i;
+
+ /* Do not allow more entries that maximum number of
+ colormaps! */
+ if (num >= max)
+ return num;
+ /* Is cmap for this window already on the list? */
+ for (i = 0; i < num; i++) {
+ if (cmaplist[i] == window->cmap)
+ goto normalColormapAlreadyListed;
+ }
+ /* Not found on the list; add colormap and window. */
+ winlist[num] = window->win;
+ cmaplist[num] = window->cmap;
+ num++;
+
+normalColormapAlreadyListed:
+
+ /* Repeat above but for the overlay colormap if there one. */
+ if (window->overlay) {
+ if (num >= max)
+ return num;
+ for (i = 0; i < num; i++) {
+ if (cmaplist[i] == window->overlay->cmap)
+ goto overlayColormapAlreadyListed;
+ }
+ winlist[num] = window->overlay->win;
+ cmaplist[num] = window->overlay->cmap;
+ num++;
+ }
+overlayColormapAlreadyListed:
+
+ /* Recursively search children. */
+ child = window->children;
+ while (child) {
+ num = findColormaps(child, winlist, cmaplist, num, max);
+ child = child->siblings;
+ }
+ return num;
+}
+
+void
+__glutEstablishColormapsProperty(GLUTwindow * window)
+{
+ /* this routine is strictly X. Win32 doesn't need to do
+ anything of this sort (but has to do other wacky stuff
+ later). */
+ static Atom wmColormapWindows = None;
+ Window *winlist;
+ Colormap *cmaplist;
+ Status status;
+ int maxcmaps, num;
+
+ assert(!window->parent);
+ maxcmaps = MaxCmapsOfScreen(ScreenOfDisplay(__glutDisplay,
+ __glutScreen));
+ /* For portability reasons we don't use alloca for winlist
+ and cmaplist, but we could. */
+ winlist = (Window *) malloc(maxcmaps * sizeof(Window));
+ cmaplist = (Colormap *) malloc(maxcmaps * sizeof(Colormap));
+ num = findColormaps(window, winlist, cmaplist, 0, maxcmaps);
+ if (num < 2) {
+ /* Property no longer needed; remove it. */
+ wmColormapWindows = XSGIFastInternAtom(__glutDisplay,
+ "WM_COLORMAP_WINDOWS", SGI_XA_WM_COLORMAP_WINDOWS, False);
+ if (wmColormapWindows == None) {
+ __glutWarning("Could not intern X atom for WM_COLORMAP_WINDOWS.");
+ return;
+ }
+ XDeleteProperty(__glutDisplay, window->win, wmColormapWindows);
+ } else {
+ status = XSetWMColormapWindows(__glutDisplay, window->win,
+ winlist, num);
+ /* XSetWMColormapWindows should always work unless the
+ WM_COLORMAP_WINDOWS property cannot be intern'ed. We
+ check to be safe. */
+ if (status == False)
+ __glutFatalError("XSetWMColormapWindows returned False.");
+ }
+ /* For portability reasons we don't use alloca for winlist
+ and cmaplist, but we could. */
+ free(winlist);
+ free(cmaplist);
+}
+
+GLUTwindow *
+__glutToplevelOf(GLUTwindow * window)
+{
+ while (window->parent) {
+ window = window->parent;
+ }
+ return window;
+}
+#endif
+
+void
+__glutFreeColormap(GLUTcolormap * cmap)
+{
+ GLUTcolormap *cur, **prev;
+
+ cmap->refcnt--;
+ if (cmap->refcnt == 0) {
+ /* remove from colormap list */
+ cur = __glutColormapList;
+ prev = &__glutColormapList;
+ while (cur) {
+ if (cur == cmap) {
+ *prev = cmap->next;
+ break;
+ }
+ prev = &(cur->next);
+ cur = cur->next;
+ }
+ /* actually free colormap */
+ XFreeColormap(__glutDisplay, cmap->cmap);
+ free(cmap->cells);
+ free(cmap);
+ }
+}
+
diff --git a/src/glut/os2/glut_cursor.cpp b/src/glut/os2/glut_cursor.cpp
new file mode 100644
index 00000000000..9784e9b6226
--- /dev/null
+++ b/src/glut/os2/glut_cursor.cpp
@@ -0,0 +1,210 @@
+
+/* Copyright (c) Mark J. Kilgard, 1995, 1998. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include "glutint.h"
+
+#if !defined(_WIN32) && !defined(__OS2PM__)
+#include <X11/Xatom.h> /* For XA_CURSOR */
+#include <X11/cursorfont.h>
+#endif
+
+typedef struct _CursorTable {
+#if defined(_WIN32)
+ char* glyph;
+#else
+ int glyph;
+#endif
+ Cursor cursor;
+} CursorTable;
+/* *INDENT-OFF* */
+
+static CursorTable cursorTable[] = {
+ {XC_arrow, None}, /* GLUT_CURSOR_RIGHT_ARROW */
+ {XC_top_left_arrow, None}, /* GLUT_CURSOR_LEFT_ARROW */
+ {XC_hand1, None}, /* GLUT_CURSOR_INFO */
+ {XC_pirate, None}, /* GLUT_CURSOR_DESTROY */
+ {XC_question_arrow, None}, /* GLUT_CURSOR_HELP */
+ {XC_exchange, None}, /* GLUT_CURSOR_CYCLE */
+ {XC_spraycan, None}, /* GLUT_CURSOR_SPRAY */
+ {XC_watch, None}, /* GLUT_CURSOR_WAIT */
+ {XC_xterm, None}, /* GLUT_CURSOR_TEXT */
+ {XC_crosshair, None}, /* GLUT_CURSOR_CROSSHAIR */
+ {XC_sb_v_double_arrow, None}, /* GLUT_CURSOR_UP_DOWN */
+ {XC_sb_h_double_arrow, None}, /* GLUT_CURSOR_LEFT_RIGHT */
+ {XC_top_side, None}, /* GLUT_CURSOR_TOP_SIDE */
+ {XC_bottom_side, None}, /* GLUT_CURSOR_BOTTOM_SIDE */
+ {XC_left_side, None}, /* GLUT_CURSOR_LEFT_SIDE */
+ {XC_right_side, None}, /* GLUT_CURSOR_RIGHT_SIDE */
+ {XC_top_left_corner, None}, /* GLUT_CURSOR_TOP_LEFT_CORNER */
+ {XC_top_right_corner, None}, /* GLUT_CURSOR_TOP_RIGHT_CORNER */
+ {XC_bottom_right_corner, None}, /* GLUT_CURSOR_BOTTOM_RIGHT_CORNER */
+ {XC_bottom_left_corner, None}, /* GLUT_CURSOR_BOTTOM_LEFT_CORNER */
+};
+/* *INDENT-ON* */
+
+#if !defined(_WIN32) && !defined(__OS2PM__)
+static Cursor blankCursor = None;
+static Cursor fullCrosshairCusor = None;
+
+/* SGI X server's support a special property called the
+ _SGI_CROSSHAIR_CURSOR that when installed as a window's
+ cursor, becomes a full screen crosshair cursor. SGI
+ has special cursor generation hardware for this case. */
+static Cursor
+getFullCrosshairCursor(void)
+{
+ Cursor cursor;
+ Atom crosshairAtom, actualType;
+ int rc, actualFormat;
+ unsigned long n, left;
+ unsigned long *value;
+
+ if (fullCrosshairCusor == None) {
+ crosshairAtom = XInternAtom(__glutDisplay,
+ "_SGI_CROSSHAIR_CURSOR", True);
+ if (crosshairAtom != None) {
+ value = 0; /* Make compiler happy. */
+ rc = XGetWindowProperty(__glutDisplay, __glutRoot,
+ crosshairAtom, 0, 1, False, XA_CURSOR, &actualType,
+ &actualFormat, &n, &left, (unsigned char **) &value);
+ if (rc == Success && actualFormat == 32 && n >= 1) {
+ cursor = value[0];
+ XFree(value);
+ return cursor;
+ }
+ }
+ }
+ return XCreateFontCursor(__glutDisplay, XC_crosshair);
+}
+
+/* X11 forces you to create a blank cursor if you want
+ to disable the cursor. */
+static Cursor
+makeBlankCursor(void)
+{
+ static char data[1] =
+ {0};
+ Cursor cursor;
+ Pixmap blank;
+ XColor dummy;
+
+ blank = XCreateBitmapFromData(__glutDisplay, __glutRoot,
+ data, 1, 1);
+ if (blank == None)
+ __glutFatalError("out of memory.");
+ cursor = XCreatePixmapCursor(__glutDisplay, blank, blank,
+ &dummy, &dummy, 0, 0);
+ XFreePixmap(__glutDisplay, blank);
+
+ return cursor;
+}
+#endif /* !_WIN32 && !__OS2PM__*/
+
+/* Win32 and X11 use this same function to accomplish
+ fairly different tasks. X11 lets you just define the
+ cursor for a window and the window system takes care
+ of making sure that the window's cursor is installed
+ when the mouse is in the window. Win32 requires the
+ application to handle a WM_SETCURSOR message to install
+ the right cursor when windows are entered. Think of
+ the Win32 __glutSetCursor (called from __glutWindowProc)
+ as "install cursor". Think of the X11 __glutSetCursor
+ (called from glutSetCursor) as "define cursor". */
+void
+__glutSetCursor(GLUTwindow *window)
+{
+ int cursor = window->cursor;
+ Cursor xcursor = 0;
+
+ if (cursor >= 0 &&
+ cursor < sizeof(cursorTable) / sizeof(cursorTable[0])) {
+ if (cursorTable[cursor].cursor == None) {
+ cursorTable[cursor].cursor = XCreateFontCursor(__glutDisplay,
+ cursorTable[cursor].glyph);
+ }
+ xcursor = cursorTable[cursor].cursor;
+ } else {
+ /* Special cases. */
+ switch (cursor) {
+ case GLUT_CURSOR_INHERIT:
+#if defined(_WIN32)
+ while (window->parent) {
+ window = window->parent;
+ if (window->cursor != GLUT_CURSOR_INHERIT) {
+ __glutSetCursor(window);
+ return;
+ }
+ }
+ /* XXX Default to an arrow cursor. Is this
+ right or should we be letting the default
+ window proc be installing some system cursor? */
+ xcursor = cursorTable[0].cursor;
+ if (xcursor == NULL) {
+ xcursor =
+ cursorTable[0].cursor =
+ LoadCursor(NULL, cursorTable[0].glyph);
+ }
+
+#elif defined(__OS2PM__)
+//todo
+ xcursor = None;
+
+#else
+ xcursor = None;
+#endif
+ break;
+ case GLUT_CURSOR_NONE:
+#if defined(_WIN32) || defined(__OS2PM__)
+ xcursor = NULL;
+#else
+ if (blankCursor == None) {
+ blankCursor = makeBlankCursor();
+ }
+ xcursor = blankCursor;
+#endif
+ break;
+ case GLUT_CURSOR_FULL_CROSSHAIR:
+#if defined(_WIN32)
+ xcursor = (HICON) IDC_CROSS;
+#elif defined(__OS2PM__)
+//todo
+#else
+ if (fullCrosshairCusor == None) {
+ fullCrosshairCusor = getFullCrosshairCursor();
+ }
+ xcursor = fullCrosshairCusor;
+#endif
+ break;
+ }
+ }
+ XDefineCursor(__glutDisplay,
+ window->win, xcursor);
+ XFlush(__glutDisplay);
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutSetCursor(int cursor)
+{
+#ifdef _WIN32
+ POINT point;
+
+ __glutCurrentWindow->cursor = cursor;
+ /* Are we in the window right now? If so,
+ install the cursor. */
+ GetCursorPos(&point);
+ if (__glutCurrentWindow->win == WindowFromPoint(point)) {
+ __glutSetCursor(__glutCurrentWindow);
+ }
+#elif defined(__OS2PM__)
+//todo
+#else
+ __glutCurrentWindow->cursor = cursor;
+ __glutSetCursor(__glutCurrentWindow);
+#endif
+}
+/* ENDCENTRY */
diff --git a/src/glut/os2/glut_event.cpp b/src/glut/os2/glut_event.cpp
new file mode 100644
index 00000000000..c556ef28265
--- /dev/null
+++ b/src/glut/os2/glut_event.cpp
@@ -0,0 +1,1399 @@
+/* glut_event.c */
+/* Copyright (c) Mark J. Kilgard, 1994, 1995, 1996, 1997, 1998. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#ifdef __VMS
+#include <GL/vms_x_fix.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <assert.h>
+#include <string.h> /* Some FD_ZERO macros use memset without
+ prototyping memset. */
+
+/* Much of the following #ifdef logic to include the proper
+ prototypes for the select system call is based on logic
+ from the X11R6.3 version of <X11/Xpoll.h>. */
+
+#if !defined(_WIN32)
+# ifdef __sgi
+# include <bstring.h> /* prototype for bzero used by FD_ZERO */
+# endif
+# if (defined(SVR4) || defined(CRAY) || defined(AIXV3)) && !defined(FD_SETSIZE)
+# include <sys/select.h> /* select system call interface */
+# ifdef luna
+# include <sysent.h>
+# endif
+# endif
+ /* AIX 4.2 fubar-ed <sys/select.h>, so go to heroic measures to get it */
+# if defined(AIXV4) && !defined(NFDBITS)
+# include <sys/select.h>
+# endif
+#endif /* !_WIN32 */
+
+#include <sys/types.h>
+
+#if defined(__OS2__)
+//??? нафига ?? # include <sys/time.h>
+#elif !defined(_WIN32)
+# if defined(__vms) && ( __VMS_VER < 70000000 )
+# include <sys/time.h>
+# else
+# ifndef __vms
+# include <sys/time.h>
+# endif
+# endif
+# include <unistd.h>
+# include <X11/Xlib.h>
+# include <X11/keysym.h>
+#else
+# ifdef __CYGWIN32__
+# include <sys/time.h>
+# else
+# include <sys/timeb.h>
+# endif
+# ifdef __hpux
+ /* XXX Bert Gijsbers <bert@mc.bio.uva.nl> reports that HP-UX
+ needs different keysyms for the End, Insert, and Delete keys
+ to work on an HP 715. It would be better if HP generated
+ standard keysyms for standard keys. */
+# include <X11/HPkeysym.h>
+# endif
+#endif /* !_WIN32 */
+
+#include "glutint.h"
+
+#if defined(__vms) && ( __VMS_VER < 70000000 )
+#include <ssdef.h>
+#include <psldef.h>
+extern int SYS$CLREF(int efn);
+extern int SYS$SETIMR(unsigned int efn, struct timeval6 *timeout, void *ast,
+ unsigned int request_id, unsigned int flags);
+extern int SYS$WFLOR(unsigned int efn, unsigned int mask);
+extern int SYS$CANTIM(unsigned int request_id, unsigned int mode);
+#endif /* __vms, VMs 6.2 or earlier */
+
+static GLUTtimer *freeTimerList = NULL;
+
+GLUTidleCB __glutIdleFunc = NULL;
+GLUTtimer *__glutTimerList = NULL;
+#ifdef SUPPORT_FORTRAN
+GLUTtimer *__glutNewTimer;
+#endif
+GLUTwindow *__glutWindowWorkList = NULL;
+GLUTmenu *__glutMappedMenu;
+GLUTmenu *__glutCurrentMenu = NULL;
+
+void (*__glutUpdateInputDeviceMaskFunc) (GLUTwindow *);
+#if !defined(_WIN32) && !defined(__OS2__)
+void (*__glutMenuItemEnterOrLeave)(GLUTmenuItem * item, int num, int type) = NULL;
+void (*__glutFinishMenu)(Window win, int x, int y);
+void (*__glutPaintMenu)(GLUTmenu * menu);
+void (*__glutStartMenu)(GLUTmenu * menu, GLUTwindow * window, int x, int y, int x_win, int y_win);
+GLUTmenu * (*__glutGetMenuByNum)(int menunum);
+GLUTmenuItem * (*__glutGetMenuItem)(GLUTmenu * menu, Window win, int *which);
+GLUTmenu * (*__glutGetMenu)(Window win);
+#endif
+
+Atom __glutMotifHints = None;
+/* Modifier mask of ~0 implies not in core input callback. */
+unsigned int __glutModifierMask = (unsigned int) ~0;
+int __glutWindowDamaged = 0;
+
+void GLUTAPIENTRY
+glutIdleFunc(GLUTidleCB idleFunc)
+{
+ __glutIdleFunc = idleFunc;
+}
+
+void GLUTAPIENTRY
+glutTimerFunc(unsigned int interval, GLUTtimerCB timerFunc, int value)
+{
+ GLUTtimer *timer, *other;
+ GLUTtimer **prevptr;
+#ifdef OLD_VMS
+ struct timeval6 now;
+#else
+ struct timeval now;
+#endif
+
+ if (!timerFunc)
+ return;
+
+ if (freeTimerList) {
+ timer = freeTimerList;
+ freeTimerList = timer->next;
+ } else {
+ timer = (GLUTtimer *) malloc(sizeof(GLUTtimer));
+ if (!timer)
+ __glutFatalError("out of memory.");
+ }
+
+ timer->func = timerFunc;
+#if defined(__vms) && ( __VMS_VER < 70000000 )
+ /* VMS time is expressed in units of 100 ns */
+ timer->timeout.val = interval * TICKS_PER_MILLISECOND;
+#else
+ timer->timeout.tv_sec = (int) interval / 1000;
+ timer->timeout.tv_usec = (int) (interval % 1000) * 1000;
+#endif
+ timer->value = value;
+ timer->next = NULL;
+ GETTIMEOFDAY(&now);
+ ADD_TIME(timer->timeout, timer->timeout, now);
+ prevptr = &__glutTimerList;
+ other = *prevptr;
+ while (other && IS_AFTER(other->timeout, timer->timeout)) {
+ prevptr = &other->next;
+ other = *prevptr;
+ }
+ timer->next = other;
+#ifdef SUPPORT_FORTRAN
+ __glutNewTimer = timer; /* for Fortran binding! */
+#endif
+ *prevptr = timer;
+}
+
+void
+handleTimeouts(void)
+{
+#ifdef OLD_VMS
+ struct timeval6 now;
+#else
+ struct timeval now;
+#endif
+ GLUTtimer *timer;
+
+ /* Assumption is that __glutTimerList is already determined
+ to be non-NULL. */
+ GETTIMEOFDAY(&now);
+ while (IS_AT_OR_AFTER(__glutTimerList->timeout, now)) {
+ timer = __glutTimerList;
+ timer->func(timer->value);
+ __glutTimerList = timer->next;
+ timer->next = freeTimerList;
+ freeTimerList = timer;
+ if (!__glutTimerList)
+ break;
+ }
+}
+
+void
+__glutPutOnWorkList(GLUTwindow * window, int workMask)
+{
+ if (window->workMask) {
+ /* Already on list; just OR in new workMask. */
+ window->workMask |= workMask;
+ } else {
+ /* Update work mask and add to window work list. */
+ window->workMask = workMask;
+ /* Assert that if the window does not have a
+ workMask already, the window should definitely
+ not be the head of the work list. */
+ assert(window != __glutWindowWorkList);
+ window->prevWorkWin = __glutWindowWorkList;
+ __glutWindowWorkList = window;
+ }
+}
+
+void
+__glutPostRedisplay(GLUTwindow * window, int layerMask)
+{
+ int shown = (layerMask & (GLUT_REDISPLAY_WORK | GLUT_REPAIR_WORK)) ?
+ window->shownState : window->overlay->shownState;
+
+ /* Post a redisplay if the window is visible (or the
+ visibility of the window is unknown, ie. window->visState
+ == -1) _and_ the layer is known to be shown. */
+ if (window->visState != GLUT_HIDDEN
+ && window->visState != GLUT_FULLY_COVERED && shown) {
+ __glutPutOnWorkList(window, layerMask);
+ }
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutPostRedisplay(void)
+{
+ __glutPostRedisplay(__glutCurrentWindow, GLUT_REDISPLAY_WORK);
+}
+
+/* The advantage of this routine is that it saves the cost of a
+ glutSetWindow call (entailing an expensive OpenGL context switch),
+ particularly useful when multiple windows need redisplays posted at
+ the same times. See also glutPostWindowOverlayRedisplay. */
+void GLUTAPIENTRY
+glutPostWindowRedisplay(int win)
+{
+ __glutPostRedisplay(__glutWindowList[win - 1], GLUT_REDISPLAY_WORK);
+}
+
+/* ENDCENTRY */
+static GLUTeventParser *eventParserList = NULL;
+
+/* __glutRegisterEventParser allows another module to register
+ to intercept X events types not otherwise acted on by the
+ GLUT processEventsAndTimeouts routine. The X Input
+ extension support code uses an event parser for handling X
+ Input extension events. */
+
+void
+__glutRegisterEventParser(GLUTeventParser * parser)
+{
+ parser->next = eventParserList;
+ eventParserList = parser;
+}
+
+static void
+markWindowHidden(GLUTwindow * window)
+{
+ if (GLUT_HIDDEN != window->visState) {
+ GLUTwindow *child;
+
+ if (window->windowStatus) {
+ window->visState = GLUT_HIDDEN;
+ __glutSetWindow(window);
+ window->windowStatus(GLUT_HIDDEN);
+ }
+ /* An unmap is only reported on a single window; its
+ descendents need to know they are no longer visible. */
+ child = window->children;
+ while (child) {
+ markWindowHidden(child);
+ child = child->siblings;
+ }
+ }
+}
+
+#if !defined(_WIN32) && !defined(__OS2__)
+
+static void
+purgeStaleWindow(Window win)
+{
+ GLUTstale **pEntry = &__glutStaleWindowList;
+ GLUTstale *entry = __glutStaleWindowList;
+
+ /* Tranverse singly-linked stale window list look for the
+ window ID. */
+ while (entry) {
+ if (entry->win == win) {
+ /* Found it; delete it. */
+ *pEntry = entry->next;
+ free(entry);
+ return;
+ } else {
+ pEntry = &entry->next;
+ entry = *pEntry;
+ }
+ }
+}
+
+/* Unlike XNextEvent, if a signal arrives,
+ interruptibleXNextEvent will return (with a zero return
+ value). This helps GLUT drop out of XNextEvent if a signal
+ is delivered. The intent is so that a GLUT program can call
+ glutIdleFunc in a signal handler to register an idle func
+ and then immediately get dropped into the idle func (after
+ returning from the signal handler). The idea is to make
+ GLUT's main loop reliably interruptible by signals. */
+static int
+interruptibleXNextEvent(Display * dpy, XEvent * event)
+{
+ fd_set fds;
+ int rc;
+
+ /* Flush X protocol since XPending does not do this
+ implicitly. */
+ XFlush(__glutDisplay);
+ for (;;) {
+ if (XPending(__glutDisplay)) {
+ XNextEvent(dpy, event);
+ return 1;
+ }
+#ifndef VMS
+ /* the combination ConectionNumber-select is buggy on VMS. Sometimes it
+ * fails. This part of the code hangs the program on VMS7.2. But even
+ * without it the program seems to run correctly.
+ * Note that this is a bug in the VMS/DECWindows run-time-libraries.
+ * Compaq engeneering does not want or is not able to make a fix.
+ * (last sentence is a quotation from Compaq when I reported the
+ * problem January 2000) */
+ FD_ZERO(&fds);
+ FD_SET(__glutConnectionFD, &fds);
+ rc = select(__glutConnectionFD + 1, &fds, NULL, NULL, NULL);
+ if (rc < 0) {
+ if (errno == EINTR) {
+ return 0;
+ } else {
+ __glutFatalError("select error.");
+ }
+ }
+#endif
+ }
+}
+
+#endif
+
+static void
+processEventsAndTimeouts(void)
+{
+ do {
+#if defined(__OS2__)
+ QMSG qmsg; /* message from message queue */
+ extern HAB hab; /* PM anchor block handle */
+
+ if(! WinGetMsg( hab, &qmsg, 0UL, 0UL, 0UL ) )
+ exit(0);
+ WinDispatchMsg( hab, /* PM anchor block handle */
+ &qmsg ); /* pointer to message */
+
+#elif defined(_WIN32)
+ MSG event;
+
+ if(!GetMessage(&event, NULL, 0, 0)) /* bail if no more messages */
+ exit(0);
+ TranslateMessage(&event); /* translate virtual-key messages */
+ DispatchMessage(&event); /* call the window proc */
+ /* see win32_event.c for event (message) processing procedures */
+#else
+ static int mappedMenuButton;
+ GLUTeventParser *parser;
+ XEvent event, ahead;
+ GLUTwindow *window;
+ GLUTkeyboardCB keyboard;
+ GLUTspecialCB special;
+ int gotEvent, width, height;
+
+ gotEvent = interruptibleXNextEvent(__glutDisplay, &event);
+ if (gotEvent) {
+ switch (event.type) {
+ case MappingNotify:
+ XRefreshKeyboardMapping((XMappingEvent *) & event);
+ break;
+ case ConfigureNotify:
+ window = __glutGetWindow(event.xconfigure.window);
+ if (window) {
+ if (window->win != event.xconfigure.window) {
+ /* Ignore ConfigureNotify sent to the overlay
+ planes. GLUT could get here because overlays
+ select for StructureNotify events to receive
+ DestroyNotify. */
+ break;
+ }
+ width = event.xconfigure.width;
+ height = event.xconfigure.height;
+ if (width != window->width || height != window->height) {
+ if (window->overlay) {
+ XResizeWindow(__glutDisplay, window->overlay->win, width, height);
+ }
+ window->width = width;
+ window->height = height;
+ __glutSetWindow(window);
+ /* Do not execute OpenGL out of sequence with
+ respect to the XResizeWindow request! */
+ glXWaitX();
+ window->reshape(width, height);
+ window->forceReshape = False;
+ /* A reshape should be considered like posting a
+ repair; this is necessary for the "Mesa
+ glXSwapBuffers to repair damage" hack to operate
+ correctly. Without it, there's not an initial
+ back buffer render from which to blit from when
+ damage happens to the window. */
+ __glutPostRedisplay(window, GLUT_REPAIR_WORK);
+ }
+ }
+ break;
+ case Expose:
+ /* compress expose events */
+ while (XEventsQueued(__glutDisplay, QueuedAfterReading)
+ > 0) {
+ XPeekEvent(__glutDisplay, &ahead);
+ if (ahead.type != Expose ||
+ ahead.xexpose.window != event.xexpose.window) {
+ break;
+ }
+ XNextEvent(__glutDisplay, &event);
+ }
+ if (event.xexpose.count == 0) {
+ GLUTmenu *menu;
+
+ if (__glutMappedMenu &&
+ (menu = __glutGetMenu(event.xexpose.window))) {
+ __glutPaintMenu(menu);
+ } else {
+ window = __glutGetWindow(event.xexpose.window);
+ if (window) {
+ if (window->win == event.xexpose.window) {
+ __glutPostRedisplay(window, GLUT_REPAIR_WORK);
+ } else if (window->overlay && window->overlay->win == event.xexpose.window) {
+ __glutPostRedisplay(window, GLUT_OVERLAY_REPAIR_WORK);
+ }
+ }
+ }
+ } else {
+ /* there are more exposes to read; wait to redisplay */
+ }
+ break;
+ case ButtonPress:
+ case ButtonRelease:
+ if (__glutMappedMenu && event.type == ButtonRelease
+ && mappedMenuButton == event.xbutton.button) {
+ /* Menu is currently popped up and its button is
+ released. */
+ __glutFinishMenu(event.xbutton.window, event.xbutton.x, event.xbutton.y);
+ } else {
+ window = __glutGetWindow(event.xbutton.window);
+ if (window) {
+ GLUTmenu *menu;
+ int menuNum;
+
+ menuNum = window->menu[event.xbutton.button - 1];
+ /* Make sure that __glutGetMenuByNum is only called if there
+ really is a menu present. */
+ if ((menuNum > 0) && (menu = __glutGetMenuByNum(menuNum))) {
+ if (event.type == ButtonPress && !__glutMappedMenu) {
+ __glutStartMenu(menu, window,
+ event.xbutton.x_root, event.xbutton.y_root,
+ event.xbutton.x, event.xbutton.y);
+ mappedMenuButton = event.xbutton.button;
+ } else {
+ /* Ignore a release of a button with a menu
+ attatched to it when no menu is popped up,
+ or ignore a press when another menu is
+ already popped up. */
+ }
+ } else if (window->mouse) {
+ __glutSetWindow(window);
+ __glutModifierMask = event.xbutton.state;
+ window->mouse(event.xbutton.button - 1,
+ event.type == ButtonRelease ?
+ GLUT_UP : GLUT_DOWN,
+ event.xbutton.x, event.xbutton.y);
+ __glutModifierMask = ~0;
+ } else {
+ /* Stray mouse events. Ignore. */
+ }
+ } else {
+ /* Window might have been destroyed and all the
+ events for the window may not yet be received. */
+ }
+ }
+ break;
+ case MotionNotify:
+ if (!__glutMappedMenu) {
+ window = __glutGetWindow(event.xmotion.window);
+ if (window) {
+ /* If motion function registered _and_ buttons held
+ * down, call motion function... */
+ if (window->motion && event.xmotion.state &
+ (Button1Mask | Button2Mask | Button3Mask)) {
+ __glutSetWindow(window);
+ window->motion(event.xmotion.x, event.xmotion.y);
+ }
+ /* If passive motion function registered _and_
+ buttons not held down, call passive motion
+ function... */
+ else if (window->passive &&
+ ((event.xmotion.state &
+ (Button1Mask | Button2Mask | Button3Mask)) ==
+ 0)) {
+ __glutSetWindow(window);
+ window->passive(event.xmotion.x,
+ event.xmotion.y);
+ }
+ }
+ } else {
+ /* Motion events are thrown away when a pop up menu
+ is active. */
+ }
+ break;
+ case KeyPress:
+ case KeyRelease:
+ window = __glutGetWindow(event.xkey.window);
+ if (!window) {
+ break;
+ }
+ if (event.type == KeyPress) {
+ keyboard = window->keyboard;
+ } else {
+
+ /* If we are ignoring auto repeated keys for this window,
+ check if the next event in the X event queue is a KeyPress
+ for the exact same key (and at the exact same time) as the
+ key being released. The X11 protocol will send auto
+ repeated keys as such KeyRelease/KeyPress pairs. */
+
+ if (window->ignoreKeyRepeat) {
+ if (XEventsQueued(__glutDisplay, QueuedAfterReading)) {
+ XPeekEvent(__glutDisplay, &ahead);
+ if (ahead.type == KeyPress
+ && ahead.xkey.window == event.xkey.window
+ && ahead.xkey.keycode == event.xkey.keycode
+ && ahead.xkey.time == event.xkey.time) {
+ /* Pop off the repeated KeyPress and ignore
+ the auto repeated KeyRelease/KeyPress pair. */
+ XNextEvent(__glutDisplay, &event);
+ break;
+ }
+ }
+ }
+ keyboard = window->keyboardUp;
+ }
+ if (keyboard) {
+ char tmp[1];
+ int rc;
+
+ rc = XLookupString(&event.xkey, tmp, sizeof(tmp),
+ NULL, NULL);
+ if (rc) {
+ __glutSetWindow(window);
+ __glutModifierMask = event.xkey.state;
+ keyboard(tmp[0],
+ event.xkey.x, event.xkey.y);
+ __glutModifierMask = ~0;
+ break;
+ }
+ }
+ if (event.type == KeyPress) {
+ special = window->special;
+ } else {
+ special = window->specialUp;
+ }
+ if (special) {
+ KeySym ks;
+ int key;
+
+/* Introduced in X11R6: (Partial list of) Keypad Functions. Define
+ in place in case compiling against an older pre-X11R6
+ X11/keysymdef.h file. */
+#ifndef XK_KP_Home
+#define XK_KP_Home 0xFF95
+#endif
+#ifndef XK_KP_Left
+#define XK_KP_Left 0xFF96
+#endif
+#ifndef XK_KP_Up
+#define XK_KP_Up 0xFF97
+#endif
+#ifndef XK_KP_Right
+#define XK_KP_Right 0xFF98
+#endif
+#ifndef XK_KP_Down
+#define XK_KP_Down 0xFF99
+#endif
+#ifndef XK_KP_Prior
+#define XK_KP_Prior 0xFF9A
+#endif
+#ifndef XK_KP_Next
+#define XK_KP_Next 0xFF9B
+#endif
+#ifndef XK_KP_End
+#define XK_KP_End 0xFF9C
+#endif
+#ifndef XK_KP_Insert
+#define XK_KP_Insert 0xFF9E
+#endif
+#ifndef XK_KP_Delete
+#define XK_KP_Delete 0xFF9F
+#endif
+
+ ks = XLookupKeysym((XKeyEvent *) & event, 0);
+ /* XXX Verbose, but makes no assumptions about keysym
+ layout. */
+ switch (ks) {
+/* *INDENT-OFF* */
+ /* function keys */
+ case XK_F1: key = GLUT_KEY_F1; break;
+ case XK_F2: key = GLUT_KEY_F2; break;
+ case XK_F3: key = GLUT_KEY_F3; break;
+ case XK_F4: key = GLUT_KEY_F4; break;
+ case XK_F5: key = GLUT_KEY_F5; break;
+ case XK_F6: key = GLUT_KEY_F6; break;
+ case XK_F7: key = GLUT_KEY_F7; break;
+ case XK_F8: key = GLUT_KEY_F8; break;
+ case XK_F9: key = GLUT_KEY_F9; break;
+ case XK_F10: key = GLUT_KEY_F10; break;
+ case XK_F11: key = GLUT_KEY_F11; break;
+ case XK_F12: key = GLUT_KEY_F12; break;
+ /* directional keys */
+ case XK_KP_Left:
+ case XK_Left: key = GLUT_KEY_LEFT; break;
+ case XK_KP_Up: /* Introduced in X11R6. */
+ case XK_Up: key = GLUT_KEY_UP; break;
+ case XK_KP_Right: /* Introduced in X11R6. */
+ case XK_Right: key = GLUT_KEY_RIGHT; break;
+ case XK_KP_Down: /* Introduced in X11R6. */
+ case XK_Down: key = GLUT_KEY_DOWN; break;
+/* *INDENT-ON* */
+
+ case XK_KP_Prior: /* Introduced in X11R6. */
+ case XK_Prior:
+ /* XK_Prior same as X11R6's XK_Page_Up */
+ key = GLUT_KEY_PAGE_UP;
+ break;
+ case XK_KP_Next: /* Introduced in X11R6. */
+ case XK_Next:
+ /* XK_Next same as X11R6's XK_Page_Down */
+ key = GLUT_KEY_PAGE_DOWN;
+ break;
+ case XK_KP_Home: /* Introduced in X11R6. */
+ case XK_Home:
+ key = GLUT_KEY_HOME;
+ break;
+#ifdef __hpux
+ case XK_Select:
+#endif
+ case XK_KP_End: /* Introduced in X11R6. */
+ case XK_End:
+ key = GLUT_KEY_END;
+ break;
+#ifdef __hpux
+ case XK_InsertChar:
+#endif
+ case XK_KP_Insert: /* Introduced in X11R6. */
+ case XK_Insert:
+ key = GLUT_KEY_INSERT;
+ break;
+#ifdef __hpux
+ case XK_DeleteChar:
+#endif
+ case XK_KP_Delete: /* Introduced in X11R6. */
+ /* The Delete character is really an ASCII key. */
+ __glutSetWindow(window);
+ keyboard(127, /* ASCII Delete character. */
+ event.xkey.x, event.xkey.y);
+ goto skip;
+ default:
+ goto skip;
+ }
+ __glutSetWindow(window);
+ __glutModifierMask = event.xkey.state;
+ special(key, event.xkey.x, event.xkey.y);
+ __glutModifierMask = ~0;
+ skip:;
+ }
+ break;
+ case EnterNotify:
+ case LeaveNotify:
+ if (event.xcrossing.mode != NotifyNormal ||
+ event.xcrossing.detail == NotifyNonlinearVirtual ||
+ event.xcrossing.detail == NotifyVirtual) {
+
+ /* Careful to ignore Enter/LeaveNotify events that
+ come from the pop-up menu pointer grab and ungrab.
+ Also, ignore "virtual" Enter/LeaveNotify events
+ since they represent the pointer passing through
+ the window hierarchy without actually entering or
+ leaving the actual real estate of a window. */
+
+ break;
+ }
+ if (__glutMappedMenu) {
+ GLUTmenuItem *item;
+ int num;
+
+ item = __glutGetMenuItem(__glutMappedMenu,
+ event.xcrossing.window, &num);
+ if (item) {
+ __glutMenuItemEnterOrLeave(item, num, event.type);
+ break;
+ }
+ }
+ window = __glutGetWindow(event.xcrossing.window);
+ if (window) {
+ if (window->entry) {
+ if (event.type == EnterNotify) {
+
+ /* With overlays established, X can report two
+ enter events for both the overlay and normal
+ plane window. Do not generate a second enter
+ callback if we reported one without an
+ intervening leave. */
+
+ if (window->entryState != EnterNotify) {
+ int num = window->num;
+ Window xid = window->win;
+
+ window->entryState = EnterNotify;
+ __glutSetWindow(window);
+ window->entry(GLUT_ENTERED);
+
+ if (__glutMappedMenu) {
+
+ /* Do not generate any passive motion events
+ when menus are in use. */
+
+ } else {
+
+ /* An EnterNotify event can result in a
+ "compound" callback if a passive motion
+ callback is also registered. In this case,
+ be a little paranoid about the possibility
+ the window could have been destroyed in the
+ entry callback. */
+
+ window = __glutWindowList[num];
+ if (window && window->passive && window->win == xid) {
+ __glutSetWindow(window);
+ window->passive(event.xcrossing.x, event.xcrossing.y);
+ }
+ }
+ }
+ } else {
+ if (window->entryState != LeaveNotify) {
+
+ /* When an overlay is established for a window
+ already mapped and with the pointer in it,
+ the X server will generate a leave/enter
+ event pair as the pointer leaves (without
+ moving) from the normal plane X window to
+ the newly mapped overlay X window (or vice
+ versa). This enter/leave pair should not be
+ reported to the GLUT program since the pair
+ is a consequence of creating (or destroying)
+ the overlay, not an actual leave from the
+ GLUT window. */
+
+ if (XEventsQueued(__glutDisplay, QueuedAfterReading)) {
+ XPeekEvent(__glutDisplay, &ahead);
+ if (ahead.type == EnterNotify &&
+ __glutGetWindow(ahead.xcrossing.window) == window) {
+ XNextEvent(__glutDisplay, &event);
+ break;
+ }
+ }
+ window->entryState = LeaveNotify;
+ __glutSetWindow(window);
+ window->entry(GLUT_LEFT);
+ }
+ }
+ } else if (window->passive) {
+ __glutSetWindow(window);
+ window->passive(event.xcrossing.x, event.xcrossing.y);
+ }
+ }
+ break;
+ case UnmapNotify:
+ /* MapNotify events are not needed to maintain
+ visibility state since VisibilityNotify events will
+ be delivered when a window becomes visible from
+ mapping. However, VisibilityNotify events are not
+ delivered when a window is unmapped (for the window
+ or its children). */
+ window = __glutGetWindow(event.xunmap.window);
+ if (window) {
+ if (window->win != event.xconfigure.window) {
+ /* Ignore UnmapNotify sent to the overlay planes.
+ GLUT could get here because overlays select for
+ StructureNotify events to receive DestroyNotify.
+ */
+ break;
+ }
+ markWindowHidden(window);
+ }
+ break;
+ case VisibilityNotify:
+ window = __glutGetWindow(event.xvisibility.window);
+ if (window) {
+ /* VisibilityUnobscured+1 = GLUT_FULLY_RETAINED,
+ VisibilityPartiallyObscured+1 =
+ GLUT_PARTIALLY_RETAINED, VisibilityFullyObscured+1
+ = GLUT_FULLY_COVERED. */
+ int visState = event.xvisibility.state + 1;
+
+ if (visState != window->visState) {
+ if (window->windowStatus) {
+ window->visState = visState;
+ __glutSetWindow(window);
+ window->windowStatus(visState);
+ }
+ }
+ }
+ break;
+ case ClientMessage:
+ if (event.xclient.data.l[0] == __glutWMDeleteWindow)
+ exit(0);
+ break;
+ case DestroyNotify:
+ purgeStaleWindow(event.xdestroywindow.window);
+ break;
+ case CirculateNotify:
+ case CreateNotify:
+ case GravityNotify:
+ case ReparentNotify:
+ /* Uninteresting to GLUT (but possible for GLUT to
+ receive). */
+ break;
+ default:
+ /* Pass events not directly handled by the GLUT main
+ event loop to any event parsers that have been
+ registered. In this way, X Input extension events
+ are passed to the correct handler without forcing
+ all GLUT programs to support X Input event handling.
+ */
+ parser = eventParserList;
+ while (parser) {
+ if (parser->func(&event))
+ break;
+ parser = parser->next;
+ }
+ break;
+ }
+ }
+#endif /* _WIN32 */
+ if (__glutTimerList) {
+ handleTimeouts();
+ }
+ }
+ while (XPending(__glutDisplay));
+}
+
+static void
+waitForSomething(void)
+{
+#if defined(__vms) && ( __VMS_VER < 70000000 )
+ static struct timeval6 zerotime =
+ {0};
+ unsigned int timer_efn;
+#define timer_id 'glut' /* random :-) number */
+ unsigned int wait_mask;
+#else
+ static struct timeval zerotime =
+ {0, 0};
+#if defined(__OS2__)
+
+#elif !defined(_WIN32)
+ fd_set fds;
+#endif
+#endif
+#ifdef OLD_VMS
+ struct timeval6 now, timeout, waittime;
+#else
+ struct timeval now, timeout, waittime;
+#endif
+#if !defined(_WIN32)
+ int rc;
+#endif
+
+ /* Flush X protocol since XPending does not do this
+ implicitly. */
+ XFlush(__glutDisplay);
+ if (XPending(__glutDisplay)) {
+ /* It is possible (but quite rare) that XFlush may have
+ needed to wait for a writable X connection file
+ descriptor, and in the process, may have had to read off
+ X protocol from the file descriptor. If XPending is true,
+ this case occured and we should avoid waiting in select
+ since X protocol buffered within Xlib is due to be
+ processed and potentially no more X protocol is on the
+ file descriptor, so we would risk waiting improperly in
+ select. */
+ goto immediatelyHandleXinput;
+ }
+#if defined(__vms) && ( __VMS_VER < 70000000 )
+ timeout = __glutTimerList->timeout;
+ GETTIMEOFDAY(&now);
+ wait_mask = 1 << (__glutConnectionFD & 31);
+ if (IS_AFTER(now, timeout)) {
+ /* We need an event flag for the timer. */
+ /* XXX The `right' way to do this is to use LIB$GET_EF, but
+ since it needs to be in the same cluster as the EFN for
+ the display, we will have hack it. */
+ timer_efn = __glutConnectionFD - 1;
+ if ((timer_efn / 32) != (__glutConnectionFD / 32)) {
+ timer_efn = __glutConnectionFD + 1;
+ }
+ rc = SYS$CLREF(timer_efn);
+ rc = SYS$SETIMR(timer_efn, &timeout, NULL, timer_id, 0);
+ wait_mask |= 1 << (timer_efn & 31);
+ } else {
+ timer_efn = 0;
+ }
+ rc = SYS$WFLOR(__glutConnectionFD, wait_mask);
+ if (timer_efn != 0 && SYS$CLREF(timer_efn) == SS$_WASCLR) {
+ rc = SYS$CANTIM(timer_id, PSL$C_USER);
+ }
+ /* XXX There does not seem to be checking of "rc" in the code
+ above. Can any of the SYS$ routines above fail? */
+#else /* not vms6.2 or lower */
+#if defined(__OS2__)
+
+#elif !defined(_WIN32)
+ FD_ZERO(&fds);
+ FD_SET(__glutConnectionFD, &fds);
+#endif
+ timeout = __glutTimerList->timeout;
+ GETTIMEOFDAY(&now);
+ if (IS_AFTER(now, timeout)) {
+ TIMEDELTA(waittime, timeout, now);
+ } else {
+ waittime = zerotime;
+ }
+
+#if defined(__OS2__)
+ DosSleep(0);
+#elif !defined(_WIN32)
+ rc = select(__glutConnectionFD + 1, &fds,
+ NULL, NULL, &waittime);
+ if (rc < 0 && errno != EINTR)
+ __glutFatalError("select error.");
+#else
+
+ MsgWaitForMultipleObjects(0, NULL, FALSE,
+ waittime.tv_sec*1000 + waittime.tv_usec/1000, QS_ALLINPUT);
+
+#endif
+#endif /* not vms6.2 or lower */
+ /* Without considering the cause of select unblocking, check
+ for pending X events and handle any timeouts (by calling
+ processEventsAndTimeouts). We always look for X events
+ even if select returned with 0 (indicating a timeout);
+ otherwise we risk starving X event processing by continous
+ timeouts. */
+ if (XPending(__glutDisplay)) {
+ immediatelyHandleXinput:
+ processEventsAndTimeouts();
+ } else {
+ if (__glutTimerList)
+ handleTimeouts();
+ }
+}
+
+static void
+idleWait(void)
+{
+ if (XPending(__glutDisplay)) {
+ processEventsAndTimeouts();
+ } else {
+ if (__glutTimerList) {
+ handleTimeouts();
+ }
+ }
+ /* Make sure idle func still exists! */
+ if (__glutIdleFunc) {
+ __glutIdleFunc();
+ }
+}
+
+static GLUTwindow **beforeEnd;
+
+static GLUTwindow *
+processWindowWorkList(GLUTwindow * window)
+{
+ int workMask;
+
+ if (window->prevWorkWin) {
+ window->prevWorkWin = processWindowWorkList(window->prevWorkWin);
+ } else {
+ beforeEnd = &window->prevWorkWin;
+ }
+
+ /* Capture work mask for work that needs to be done to this
+ window, then clear the window's work mask (excepting the
+ dummy work bit, see below). Then, process the captured
+ work mask. This allows callbacks in the processing the
+ captured work mask to set the window's work mask for
+ subsequent processing. */
+
+ workMask = window->workMask;
+ assert((workMask & GLUT_DUMMY_WORK) == 0);
+
+ /* Set the dummy work bit, clearing all other bits, to
+ indicate that the window is currently on the window work
+ list _and_ that the window's work mask is currently being
+ processed. This convinces __glutPutOnWorkList that this
+ window is on the work list still. */
+ window->workMask = GLUT_DUMMY_WORK;
+
+ /* Optimization: most of the time, the work to do is a
+ redisplay and not these other types of work. Check for
+ the following cases as a group to before checking each one
+ individually one by one. This saves about 25 MIPS
+ instructions in the common redisplay only case. */
+ if (workMask & (GLUT_EVENT_MASK_WORK | GLUT_DEVICE_MASK_WORK |
+ GLUT_CONFIGURE_WORK | GLUT_COLORMAP_WORK | GLUT_MAP_WORK)) {
+
+#if !defined(_WIN32) && !defined(__OS2__)
+ /* Be sure to set event mask BEFORE map window is done. */
+ if (workMask & GLUT_EVENT_MASK_WORK) {
+ long eventMask;
+
+ /* Make sure children are not propogating events this
+ window is selecting for. Be sure to do this before
+ enabling events on the children's parent. */
+ if (window->children) {
+ GLUTwindow *child = window->children;
+ unsigned long attribMask = CWDontPropagate;
+ XSetWindowAttributes wa;
+
+ wa.do_not_propagate_mask = window->eventMask & GLUT_DONT_PROPAGATE_FILTER_MASK;
+ if (window->eventMask & GLUT_HACK_STOP_PROPAGATE_MASK) {
+ wa.event_mask = child->eventMask | (window->eventMask & GLUT_HACK_STOP_PROPAGATE_MASK);
+ attribMask |= CWEventMask;
+ }
+ do {
+ XChangeWindowAttributes(__glutDisplay, child->win,
+ attribMask, &wa);
+ child = child->siblings;
+ } while (child);
+ }
+ eventMask = window->eventMask;
+ if (window->parent && window->parent->eventMask & GLUT_HACK_STOP_PROPAGATE_MASK)
+ eventMask |= (window->parent->eventMask & GLUT_HACK_STOP_PROPAGATE_MASK);
+ XSelectInput(__glutDisplay, window->win, eventMask);
+ if (window->overlay)
+ XSelectInput(__glutDisplay, window->overlay->win,
+ window->eventMask & GLUT_OVERLAY_EVENT_FILTER_MASK);
+ }
+#endif /* !_WIN32 */
+ /* Be sure to set device mask BEFORE map window is done. */
+ if (workMask & GLUT_DEVICE_MASK_WORK) {
+ __glutUpdateInputDeviceMaskFunc(window);
+ }
+ /* Be sure to configure window BEFORE map window is done. */
+ if (workMask & GLUT_CONFIGURE_WORK) {
+#if defined(__OS2__)
+ RECTL changes;
+
+#elif defined(_WIN32)
+ RECT changes;
+ POINT point;
+ UINT flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER
+ | SWP_NOSENDCHANGING | SWP_NOSIZE | SWP_NOZORDER;
+
+ GetClientRect(window->win, &changes);
+
+ /* If this window is a toplevel window, translate the 0,0 client
+ coordinate into a screen coordinate for proper placement. */
+ if (!window->parent) {
+ point.x = 0;
+ point.y = 0;
+ ClientToScreen(window->win, &point);
+ changes.left = point.x;
+ changes.top = point.y;
+ }
+ if (window->desiredConfMask & (CWX | CWY)) {
+ changes.left = window->desiredX;
+ changes.top = window->desiredY;
+ flags &= ~SWP_NOMOVE;
+ }
+ if (window->desiredConfMask & (CWWidth | CWHeight)) {
+ changes.right = changes.left + window->desiredWidth;
+ changes.bottom = changes.top + window->desiredHeight;
+ flags &= ~SWP_NOSIZE;
+ /* XXX If overlay exists, resize the overlay here, ie.
+ if (window->overlay) ... */
+ }
+ if (window->desiredConfMask & CWStackMode) {
+ flags &= ~SWP_NOZORDER;
+ /* XXX Overlay support might require something special here. */
+ }
+
+ /* Adjust the window rectangle because Win32 thinks that the x, y,
+ width & height are the WHOLE window (including decorations),
+ whereas GLUT treats the x, y, width & height as only the CLIENT
+ area of the window. Only do this to top level windows
+ that are not in game mode (since game mode windows do
+ not have any decorations). */
+ if (!window->parent && window != __glutGameModeWindow) {
+ AdjustWindowRect(&changes,
+ WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
+ FALSE);
+ }
+
+ /* Do the repositioning, moving, and push/pop. */
+ SetWindowPos(window->win,
+ window->desiredStack == Above ? HWND_TOP : HWND_NOTOPMOST,
+ changes.left, changes.top,
+ changes.right - changes.left, changes.bottom - changes.top,
+ flags);
+
+ /* Zero out the mask. */
+ window->desiredConfMask = 0;
+
+ /* This hack causes the window to go back to the right position
+ when it is taken out of fullscreen mode. */
+ if (workMask & GLUT_FULL_SCREEN_WORK) {
+ window->desiredConfMask |= CWX | CWY;
+ window->desiredX = point.x;
+ window->desiredY = point.y;
+ }
+#else /* !_WIN32 */
+ XWindowChanges changes;
+
+ changes.x = window->desiredX;
+ changes.y = window->desiredY;
+ if (window->desiredConfMask & (CWWidth | CWHeight)) {
+ changes.width = window->desiredWidth;
+ changes.height = window->desiredHeight;
+ if (window->overlay)
+ XResizeWindow(__glutDisplay, window->overlay->win,
+ window->desiredWidth, window->desiredHeight);
+ if (__glutMotifHints != None) {
+ if (workMask & GLUT_FULL_SCREEN_WORK) {
+ MotifWmHints hints;
+
+ hints.flags = MWM_HINTS_DECORATIONS;
+ hints.decorations = 0; /* Absolutely no
+ decorations. */
+ XChangeProperty(__glutDisplay, window->win,
+ __glutMotifHints, __glutMotifHints, 32,
+ PropModeReplace, (unsigned char *) &hints, 4);
+ if (workMask & GLUT_MAP_WORK) {
+ /* Handle case where glutFullScreen is called
+ before the first time that the window is
+ mapped. Some window managers will randomly or
+ interactively position the window the first
+ time it is mapped if the window's
+ WM_NORMAL_HINTS property does not request an
+ explicit position. We don't want any such
+ window manager interaction when going
+ fullscreen. Overwrite the WM_NORMAL_HINTS
+ property installed by glutCreateWindow's
+ XSetWMProperties property with one explicitly
+ requesting a fullscreen window. */
+ XSizeHints hints;
+
+ hints.flags = USPosition | USSize;
+ hints.x = 0;
+ hints.y = 0;
+ hints.width = window->desiredWidth;
+ hints.height = window->desiredHeight;
+ XSetWMNormalHints(__glutDisplay, window->win, &hints);
+ }
+ } else {
+ XDeleteProperty(__glutDisplay, window->win, __glutMotifHints);
+ }
+ }
+ }
+ if (window->desiredConfMask & CWStackMode) {
+ changes.stack_mode = window->desiredStack;
+ /* Do not let glutPushWindow push window beneath the
+ underlay. */
+ if (window->parent && window->parent->overlay
+ && window->desiredStack == Below) {
+ changes.stack_mode = Above;
+ changes.sibling = window->parent->overlay->win;
+ window->desiredConfMask |= CWSibling;
+ }
+ }
+ XConfigureWindow(__glutDisplay, window->win,
+ window->desiredConfMask, &changes);
+ window->desiredConfMask = 0;
+#endif
+ }
+#if !defined(_WIN32) && !defined(__OS2__)
+ /* Be sure to establish the colormaps BEFORE map window is
+ done. */
+ if (workMask & GLUT_COLORMAP_WORK) {
+ __glutEstablishColormapsProperty(window);
+ }
+#endif
+ if (workMask & GLUT_MAP_WORK) {
+ switch (window->desiredMapState) {
+ case WithdrawnState:
+ if (window->parent) {
+ XUnmapWindow(__glutDisplay, window->win);
+ } else {
+ XWithdrawWindow(__glutDisplay, window->win,
+ __glutScreen);
+ }
+ window->shownState = 0;
+ break;
+ case NormalState:
+ XMapWindow(__glutDisplay, window->win);
+ window->shownState = 1;
+ break;
+#ifdef _WIN32
+ case GameModeState: /* Not an Xlib value. */
+ ShowWindow(window->win, SW_SHOW);
+ window->shownState = 1;
+ break;
+#endif
+ case IconicState:
+ XIconifyWindow(__glutDisplay, window->win, __glutScreen);
+ window->shownState = 0;
+ break;
+ }
+ }
+ }
+ if (workMask & (GLUT_REDISPLAY_WORK | GLUT_OVERLAY_REDISPLAY_WORK | GLUT_REPAIR_WORK | GLUT_OVERLAY_REPAIR_WORK)) {
+ if (window->forceReshape) {
+ /* Guarantee that before a display callback is generated
+ for a window, a reshape callback must be generated. */
+ __glutSetWindow(window);
+ window->reshape(window->width, window->height);
+ window->forceReshape = False;
+
+ /* Setting the redisplay bit on the first reshape is
+ necessary to make the "Mesa glXSwapBuffers to repair
+ damage" hack operate correctly. Without indicating a
+ redisplay is necessary, there's not an initial back
+ buffer render from which to blit from when damage
+ happens to the window. */
+ workMask |= GLUT_REDISPLAY_WORK;
+ }
+ /* The code below is more involved than otherwise necessary
+ because it is paranoid about the overlay or entire window
+ being removed or destroyed in the course of the callbacks.
+ Notice how the global __glutWindowDamaged is used to record
+ the layers' damage status. See the code in glutLayerGet for
+ how __glutWindowDamaged is used. The point is to not have to
+ update the "damaged" field after the callback since the
+ window (or overlay) may be destroyed (or removed) when the
+ callback returns. */
+
+ if (window->overlay && window->overlay->display) {
+ int num = window->num;
+ Window xid = window->overlay ? window->overlay->win : None;
+
+ /* If an overlay display callback is registered, we
+ differentiate between a redisplay needed for the
+ overlay and/or normal plane. If there is no overlay
+ display callback registered, we simply use the
+ standard display callback. */
+
+ if (workMask & (GLUT_REDISPLAY_WORK | GLUT_REPAIR_WORK)) {
+ if (__glutMesaSwapHackSupport) {
+ if (window->usedSwapBuffers) {
+ if ((workMask & (GLUT_REPAIR_WORK | GLUT_REDISPLAY_WORK)) == GLUT_REPAIR_WORK) {
+ SWAP_BUFFERS_WINDOW(window);
+ goto skippedDisplayCallback1;
+ }
+ }
+ }
+ /* Render to normal plane. */
+#ifdef _WIN32
+ window->renderDc = window->hdc;
+#endif
+ window->renderWin = window->win;
+ window->renderCtx = window->ctx;
+ __glutWindowDamaged = (workMask & GLUT_REPAIR_WORK);
+ __glutSetWindow(window);
+ window->usedSwapBuffers = 0;
+ window->display();
+ __glutWindowDamaged = 0;
+
+ skippedDisplayCallback1:;
+ }
+ if (workMask & (GLUT_OVERLAY_REDISPLAY_WORK | GLUT_OVERLAY_REPAIR_WORK)) {
+ window = __glutWindowList[num];
+ if (window && window->overlay &&
+ window->overlay->win == xid && window->overlay->display) {
+
+ /* Render to overlay. */
+#ifdef _WIN32
+ window->renderDc = window->overlay->hdc;
+#endif
+ window->renderWin = window->overlay->win;
+ window->renderCtx = window->overlay->ctx;
+ __glutWindowDamaged = (workMask & GLUT_OVERLAY_REPAIR_WORK);
+ __glutSetWindow(window);
+ window->overlay->display();
+ __glutWindowDamaged = 0;
+ } else {
+ /* Overlay may have since been destroyed or the
+ overlay callback may have been disabled during
+ normal display callback. */
+ }
+ }
+ } else {
+ if (__glutMesaSwapHackSupport) {
+ if (!window->overlay && window->usedSwapBuffers) {
+ if ((workMask & (GLUT_REPAIR_WORK | GLUT_REDISPLAY_WORK)) == GLUT_REPAIR_WORK) {
+ SWAP_BUFFERS_WINDOW(window);
+ goto skippedDisplayCallback2;
+ }
+ }
+ }
+ /* Render to normal plane (and possibly overlay). */
+ __glutWindowDamaged = (workMask & (GLUT_OVERLAY_REPAIR_WORK | GLUT_REPAIR_WORK));
+ __glutSetWindow(window);
+ window->usedSwapBuffers = 0;
+ window->display();
+ __glutWindowDamaged = 0;
+
+ skippedDisplayCallback2:;
+ }
+ }
+ /* Combine workMask with window->workMask to determine what
+ finish and debug work there is. */
+ workMask |= window->workMask;
+
+ if (workMask & GLUT_FINISH_WORK) {
+ /* Finish work makes sure a glFinish gets done to indirect
+ rendering contexts. Indirect contexts tend to have much
+ longer latency because lots of OpenGL extension requests
+ can queue up in the X protocol stream. __glutSetWindow
+ is where the finish works gets queued for indirect
+ contexts. */
+ __glutSetWindow(window);
+ glFinish();
+ }
+ if (workMask & GLUT_DEBUG_WORK) {
+ __glutSetWindow(window);
+ glutReportErrors();
+ }
+ /* Strip out dummy, finish, and debug work bits. */
+ window->workMask &= ~(GLUT_DUMMY_WORK | GLUT_FINISH_WORK | GLUT_DEBUG_WORK);
+ if (window->workMask) {
+ /* Leave on work list. */
+ return window;
+ } else {
+ /* Remove current window from work list. */
+ return window->prevWorkWin;
+ }
+}
+
+#ifndef _WIN32
+static /* X11 implementations do not need this global. */
+#endif
+void
+__glutProcessWindowWorkLists(void)
+{
+ if (__glutWindowWorkList) {
+ GLUTwindow *remainder, *work;
+
+ work = __glutWindowWorkList;
+ __glutWindowWorkList = NULL;
+ if (work) {
+ remainder = processWindowWorkList(work);
+ if (remainder) {
+ *beforeEnd = __glutWindowWorkList;
+ __glutWindowWorkList = remainder;
+ }
+ }
+ }
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutMainLoop(void)
+{
+#if !defined(_WIN32)
+ if (!__glutDisplay)
+ __glutFatalUsage("main loop entered with out proper initialization.");
+#endif
+ if (!__glutWindowListSize)
+ __glutFatalUsage(
+ "main loop entered with no windows created.");
+ for (;;) {
+ __glutProcessWindowWorkLists();
+ if (__glutIdleFunc || __glutWindowWorkList) {
+ idleWait();
+ } else {
+ if (__glutTimerList) {
+ waitForSomething();
+ } else {
+ processEventsAndTimeouts();
+ }
+ }
+ }
+}
+/* ENDCENTRY */
diff --git a/src/glut/os2/glut_ext.cpp b/src/glut/os2/glut_ext.cpp
new file mode 100644
index 00000000000..feb6fbfa20b
--- /dev/null
+++ b/src/glut/os2/glut_ext.cpp
@@ -0,0 +1,204 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1997. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "glutint.h"
+
+/* CENTRY */
+int GLUTAPIENTRY
+glutExtensionSupported(const char *extension)
+{
+ static const GLubyte *extensions = NULL;
+ const GLubyte *start;
+ GLubyte *where, *terminator;
+
+ /* Extension names should not have spaces. */
+ where = (GLubyte *) strchr(extension, ' ');
+ if (where || *extension == '\0')
+ return 0;
+
+ if (!extensions) {
+ extensions = glGetString(GL_EXTENSIONS);
+ }
+ /* It takes a bit of care to be fool-proof about parsing the
+ OpenGL extensions string. Don't be fooled by sub-strings,
+ etc. */
+ start = extensions;
+ for (;;) {
+ /* If your application crashes in the strstr routine below,
+ you are probably calling glutExtensionSupported without
+ having a current window. Calling glGetString without
+ a current OpenGL context has unpredictable results.
+ Please fix your program. */
+ where = (GLubyte *) strstr((const char *) start, extension);
+ if (!where)
+ break;
+ terminator = where + strlen(extension);
+ if (where == start || *(where - 1) == ' ') {
+ if (*terminator == ' ' || *terminator == '\0') {
+ return 1;
+ }
+ }
+ start = terminator;
+ }
+ return 0;
+}
+
+
+struct name_address_pair {
+ const char *name;
+ const void *address;
+};
+
+static struct name_address_pair glut_functions[] = {
+ { "glutInit", (const void *) glutInit },
+ { "glutInitDisplayMode", (const void *) glutInitDisplayMode },
+ { "glutInitDisplayString", (const void *) glutInitDisplayString },
+ { "glutInitWindowPosition", (const void *) glutInitWindowPosition },
+ { "glutInitWindowSize", (const void *) glutInitWindowSize },
+ { "glutMainLoop", (const void *) glutMainLoop },
+ { "glutCreateWindow", (const void *) glutCreateWindow },
+ { "glutCreateSubWindow", (const void *) glutCreateSubWindow },
+ { "glutDestroyWindow", (const void *) glutDestroyWindow },
+ { "glutPostRedisplay", (const void *) glutPostRedisplay },
+ { "glutPostWindowRedisplay", (const void *) glutPostWindowRedisplay },
+ { "glutSwapBuffers", (const void *) glutSwapBuffers },
+ { "glutGetWindow", (const void *) glutGetWindow },
+ { "glutSetWindow", (const void *) glutSetWindow },
+ { "glutSetWindowTitle", (const void *) glutSetWindowTitle },
+ { "glutSetIconTitle", (const void *) glutSetIconTitle },
+ { "glutPositionWindow", (const void *) glutPositionWindow },
+ { "glutReshapeWindow", (const void *) glutReshapeWindow },
+ { "glutPopWindow", (const void *) glutPopWindow },
+ { "glutPushWindow", (const void *) glutPushWindow },
+ { "glutIconifyWindow", (const void *) glutIconifyWindow },
+ { "glutShowWindow", (const void *) glutShowWindow },
+ { "glutHideWindow", (const void *) glutHideWindow },
+ { "glutFullScreen", (const void *) glutFullScreen },
+ { "glutSetCursor", (const void *) glutSetCursor },
+ { "glutWarpPointer", (const void *) glutWarpPointer },
+ { "glutEstablishOverlay", (const void *) glutEstablishOverlay },
+ { "glutRemoveOverlay", (const void *) glutRemoveOverlay },
+ { "glutUseLayer", (const void *) glutUseLayer },
+ { "glutPostOverlayRedisplay", (const void *) glutPostOverlayRedisplay },
+ { "glutPostWindowOverlayRedisplay", (const void *) glutPostWindowOverlayRedisplay },
+ { "glutShowOverlay", (const void *) glutShowOverlay },
+ { "glutHideOverlay", (const void *) glutHideOverlay },
+ { "glutCreateMenu", (const void *) glutCreateMenu },
+ { "glutDestroyMenu", (const void *) glutDestroyMenu },
+ { "glutGetMenu", (const void *) glutGetMenu },
+ { "glutSetMenu", (const void *) glutSetMenu },
+ { "glutAddMenuEntry", (const void *) glutAddMenuEntry },
+ { "glutAddSubMenu", (const void *) glutAddSubMenu },
+ { "glutChangeToMenuEntry", (const void *) glutChangeToMenuEntry },
+ { "glutChangeToSubMenu", (const void *) glutChangeToSubMenu },
+ { "glutRemoveMenuItem", (const void *) glutRemoveMenuItem },
+ { "glutAttachMenu", (const void *) glutAttachMenu },
+ { "glutDetachMenu", (const void *) glutDetachMenu },
+ { "glutDisplayFunc", (const void *) glutDisplayFunc },
+ { "glutReshapeFunc", (const void *) glutReshapeFunc },
+ { "glutKeyboardFunc", (const void *) glutKeyboardFunc },
+ { "glutMouseFunc", (const void *) glutMouseFunc },
+ { "glutMotionFunc", (const void *) glutMotionFunc },
+ { "glutPassiveMotionFunc", (const void *) glutPassiveMotionFunc },
+ { "glutEntryFunc", (const void *) glutEntryFunc },
+ { "glutVisibilityFunc", (const void *) glutVisibilityFunc },
+ { "glutIdleFunc", (const void *) glutIdleFunc },
+ { "glutTimerFunc", (const void *) glutTimerFunc },
+ { "glutMenuStateFunc", (const void *) glutMenuStateFunc },
+ { "glutSpecialFunc", (const void *) glutSpecialFunc },
+ { "glutSpaceballMotionFunc", (const void *) glutSpaceballMotionFunc },
+ { "glutSpaceballRotateFunc", (const void *) glutSpaceballRotateFunc },
+ { "glutSpaceballButtonFunc", (const void *) glutSpaceballButtonFunc },
+ { "glutButtonBoxFunc", (const void *) glutButtonBoxFunc },
+ { "glutDialsFunc", (const void *) glutDialsFunc },
+ { "glutTabletMotionFunc", (const void *) glutTabletMotionFunc },
+ { "glutTabletButtonFunc", (const void *) glutTabletButtonFunc },
+ { "glutMenuStatusFunc", (const void *) glutMenuStatusFunc },
+ { "glutOverlayDisplayFunc", (const void *) glutOverlayDisplayFunc },
+ { "glutWindowStatusFunc", (const void *) glutWindowStatusFunc },
+ { "glutKeyboardUpFunc", (const void *) glutKeyboardUpFunc },
+ { "glutSpecialUpFunc", (const void *) glutSpecialUpFunc },
+ { "glutJoystickFunc", (const void *) glutJoystickFunc },
+ { "glutSetColor", (const void *) glutSetColor },
+ { "glutGetColor", (const void *) glutGetColor },
+ { "glutCopyColormap", (const void *) glutCopyColormap },
+ { "glutGet", (const void *) glutGet },
+ { "glutDeviceGet", (const void *) glutDeviceGet },
+ { "glutExtensionSupported", (const void *) glutExtensionSupported },
+ { "glutGetModifiers", (const void *) glutGetModifiers },
+ { "glutLayerGet", (const void *) glutLayerGet },
+ { "glutGetProcAddress", (const void *) glutGetProcAddress },
+ { "glutBitmapCharacter", (const void *) glutBitmapCharacter },
+ { "glutBitmapWidth", (const void *) glutBitmapWidth },
+ { "glutStrokeCharacter", (const void *) glutStrokeCharacter },
+ { "glutStrokeWidth", (const void *) glutStrokeWidth },
+ { "glutBitmapLength", (const void *) glutBitmapLength },
+ { "glutStrokeLength", (const void *) glutStrokeLength },
+ { "glutWireSphere", (const void *) glutWireSphere },
+ { "glutSolidSphere", (const void *) glutSolidSphere },
+ { "glutWireCone", (const void *) glutWireCone },
+ { "glutSolidCone", (const void *) glutSolidCone },
+ { "glutWireCube", (const void *) glutWireCube },
+ { "glutSolidCube", (const void *) glutSolidCube },
+ { "glutWireTorus", (const void *) glutWireTorus },
+ { "glutSolidTorus", (const void *) glutSolidTorus },
+ { "glutWireDodecahedron", (const void *) glutWireDodecahedron },
+ { "glutSolidDodecahedron", (const void *) glutSolidDodecahedron },
+ { "glutWireTeapot", (const void *) glutWireTeapot },
+ { "glutSolidTeapot", (const void *) glutSolidTeapot },
+ { "glutWireOctahedron", (const void *) glutWireOctahedron },
+ { "glutSolidOctahedron", (const void *) glutSolidOctahedron },
+ { "glutWireTetrahedron", (const void *) glutWireTetrahedron },
+ { "glutSolidTetrahedron", (const void *) glutSolidTetrahedron },
+ { "glutWireIcosahedron", (const void *) glutWireIcosahedron },
+ { "glutSolidIcosahedron", (const void *) glutSolidIcosahedron },
+ { "glutVideoResizeGet", (const void *) glutVideoResizeGet },
+ { "glutSetupVideoResizing", (const void *) glutSetupVideoResizing },
+ { "glutStopVideoResizing", (const void *) glutStopVideoResizing },
+ { "glutVideoResize", (const void *) glutVideoResize },
+ { "glutVideoPan", (const void *) glutVideoPan },
+ { "glutReportErrors", (const void *) glutReportErrors },
+ { "glutIgnoreKeyRepeat", (const void *) glutIgnoreKeyRepeat },
+ { "glutSetKeyRepeat", (const void *) glutSetKeyRepeat },
+ { "glutForceJoystickFunc", (const void *) glutForceJoystickFunc },
+ { "glutGameModeString", (const void *) glutGameModeString },
+ { "glutEnterGameMode", (const void *) glutEnterGameMode },
+ { "glutLeaveGameMode", (const void *) glutLeaveGameMode },
+ { "glutGameModeGet", (const void *) glutGameModeGet },
+ { NULL, NULL }
+};
+
+
+/* XXX This isn't an official GLUT function, yet */
+void * GLUTAPIENTRY
+glutGetProcAddress(const char *procName)
+{
+ /* Try GLUT functions first */
+ int i;
+ for (i = 0; glut_functions[i].name; i++) {
+ if (strcmp(glut_functions[i].name, procName) == 0)
+ return (void *) glut_functions[i].address;
+ }
+
+ /* Try core GL functions */
+#if defined(_WIN32)
+ return (void *) wglGetProcAddress((LPCSTR) procName);
+
+#elif defined(__OS2PM__)
+ return (void *) wglGetProcAddress((char *) procName);
+#elif defined(GLX_ARB_get_proc_address)
+ return (void *) glXGetProcAddressARB((const GLubyte *) procName);
+#else
+ return NULL;
+#endif
+}
+
+
+/* ENDCENTRY */
diff --git a/src/glut/os2/glut_fullscrn.cpp b/src/glut/os2/glut_fullscrn.cpp
new file mode 100644
index 00000000000..d6efb68b3a5
--- /dev/null
+++ b/src/glut/os2/glut_fullscrn.cpp
@@ -0,0 +1,38 @@
+
+/* Copyright (c) Mark J. Kilgard, 1995, 1998. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include <assert.h>
+
+#include "glutint.h"
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutFullScreen(void)
+{
+ assert(!__glutCurrentWindow->parent);
+ IGNORE_IN_GAME_MODE();
+#if !defined(_WIN32) && !defined(__OS2PM__)
+ if (__glutMotifHints == None) {
+ __glutMotifHints = XSGIFastInternAtom(__glutDisplay, "_MOTIF_WM_HINTS",
+ SGI_XA__MOTIF_WM_HINTS, 0);
+ if (__glutMotifHints == None) {
+ __glutWarning("Could not intern X atom for _MOTIF_WM_HINTS.");
+ }
+ }
+#endif
+
+ __glutCurrentWindow->desiredX = 0;
+ __glutCurrentWindow->desiredY = 0;
+ __glutCurrentWindow->desiredWidth = __glutScreenWidth;
+ __glutCurrentWindow->desiredHeight = __glutScreenHeight;
+ __glutCurrentWindow->desiredConfMask |= CWX | CWY | CWWidth | CWHeight;
+
+ __glutPutOnWorkList(__glutCurrentWindow,
+ GLUT_CONFIGURE_WORK | GLUT_FULL_SCREEN_WORK);
+}
+
+/* ENDCENTRY */
diff --git a/src/glut/os2/glut_gamemode.cpp b/src/glut/os2/glut_gamemode.cpp
new file mode 100644
index 00000000000..50185d7b9d4
--- /dev/null
+++ b/src/glut/os2/glut_gamemode.cpp
@@ -0,0 +1,680 @@
+
+/* Copyright (c) Mark J. Kilgard, 1998. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "glutint.h"
+
+#if !defined(_WIN32) && !defined(__OS2__)
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+
+/* SGI optimization introduced in IRIX 6.3 to avoid X server
+ round trips for interning common X atoms. */
+#if defined(_SGI_EXTRA_PREDEFINES) && !defined(NO_FAST_ATOMS)
+#include <X11/SGIFastAtom.h>
+#else
+#define XSGIFastInternAtom(dpy,string,fast_name,how) XInternAtom(dpy,string,how)
+#endif
+#endif /* not _WIN32 */
+
+int __glutDisplaySettingsChanged = 0;
+static DisplayMode *dmodes, *currentDm = NULL;
+static int ndmodes = -1;
+GLUTwindow *__glutGameModeWindow = NULL;
+
+#ifdef TEST
+static char *compstr[] =
+{
+ "none", "=", "!=", "<=", ">=", ">", "<", "~"
+};
+static char *capstr[] =
+{
+ "width", "height", "bpp", "hertz", "num"
+};
+#endif
+
+#if defined(__OS2__)
+void
+#else
+void __cdecl
+#endif
+__glutCloseDownGameMode(void)
+{
+ if (__glutDisplaySettingsChanged) {
+#ifdef _WIN32
+ /* Assumes that display settings have been changed, that
+ is __glutDisplaySettingsChanged is true. */
+ ChangeDisplaySettings(NULL, 0);
+#endif
+ __glutDisplaySettingsChanged = 0;
+ }
+ __glutGameModeWindow = NULL;
+}
+
+void GLUTAPIENTRY
+glutLeaveGameMode(void)
+{
+ if (__glutGameModeWindow == NULL) {
+ __glutWarning("not in game mode so cannot leave game mode");
+ return;
+ }
+ __glutDestroyWindow(__glutGameModeWindow,
+ __glutGameModeWindow);
+ XFlush(__glutDisplay);
+ __glutGameModeWindow = NULL;
+}
+
+#ifdef _WIN32
+
+/* Same values as from MSDN's SetDisp.c example. */
+#define MIN_WIDTH 400
+#define MIN_FREQUENCY 60
+
+static void
+initGameModeSupport(void)
+{
+ DEVMODE dm;
+ DWORD mode;
+ int i;
+
+ if (ndmodes >= 0) {
+ /* ndmodes is initially -1 to indicate no
+ dmodes allocated yet. */
+ return;
+ }
+
+ /* Determine how many display modes there are. */
+ ndmodes = 0;
+ mode = 0;
+ while (EnumDisplaySettings(NULL, mode, &dm)) {
+ if (dm.dmPelsWidth >= MIN_WIDTH &&
+ (dm.dmDisplayFrequency == 0 ||
+ dm.dmDisplayFrequency >= MIN_FREQUENCY)) {
+ ndmodes++;
+ }
+ mode++;
+ }
+
+ /* Allocate memory for a list of all the display modes. */
+ dmodes = (DisplayMode*)
+ malloc(ndmodes * sizeof(DisplayMode));
+
+ /* Now that we know how many display modes to expect,
+ enumerate them again and save the information in
+ the list we allocated above. */
+ i = 0;
+ mode = 0;
+ while (EnumDisplaySettings(NULL, mode, &dm)) {
+ /* Try to reject any display settings that seem unplausible. */
+ if (dm.dmPelsWidth >= MIN_WIDTH &&
+ (dm.dmDisplayFrequency == 0 ||
+ dm.dmDisplayFrequency >= MIN_FREQUENCY)) {
+ dmodes[i].devmode = dm;
+ dmodes[i].valid = 1; /* XXX Not used for now. */
+ dmodes[i].cap[DM_WIDTH] = dm.dmPelsWidth;
+ dmodes[i].cap[DM_HEIGHT] = dm.dmPelsHeight;
+ dmodes[i].cap[DM_PIXEL_DEPTH] = dm.dmBitsPerPel;
+ if (dm.dmDisplayFrequency == 0) {
+ /* Guess a reasonable guess. */
+ /* Lame Windows 95 version of EnumDisplaySettings. */
+ dmodes[i].cap[DM_HERTZ] = 60;
+ } else {
+ dmodes[i].cap[DM_HERTZ] = dm.dmDisplayFrequency;
+ }
+ i++;
+ }
+ mode++;
+ }
+
+ assert(i == ndmodes);
+}
+
+#else
+
+/* X Windows version of initGameModeSupport. */
+static void
+initGameModeSupport(void)
+{
+ if (ndmodes >= 0) {
+ /* ndmodes is initially -1 to indicate no
+ dmodes allocated yet. */
+ return;
+ }
+
+ /* Determine how many display modes there are. */
+ ndmodes = 0;
+}
+
+#endif
+
+/* This routine is based on similiar code in glut_dstr.c */
+static DisplayMode *
+findMatch(DisplayMode * dmodes, int ndmodes,
+ Criterion * criteria, int ncriteria)
+{
+ DisplayMode *found;
+ int *bestScore, *thisScore;
+ int i, j, numok, result = 0, worse, better;
+
+ found = NULL;
+ numok = 1; /* "num" capability is indexed from 1,
+ not 0. */
+
+ /* XXX alloca canidate. */
+ bestScore = (int *) malloc(ncriteria * sizeof(int));
+ if (!bestScore) {
+ __glutFatalError("out of memory.");
+ }
+ for (j = 0; j < ncriteria; j++) {
+ /* Very negative number. */
+ bestScore[j] = -32768;
+ }
+
+ /* XXX alloca canidate. */
+ thisScore = (int *) malloc(ncriteria * sizeof(int));
+ if (!thisScore) {
+ __glutFatalError("out of memory.");
+ }
+
+ for (i = 0; i < ndmodes; i++) {
+ if (dmodes[i].valid) {
+ worse = 0;
+ better = 0;
+
+ for (j = 0; j < ncriteria; j++) {
+ int cap, cvalue, dvalue;
+
+ cap = criteria[j].capability;
+ cvalue = criteria[j].value;
+ if (cap == NUM) {
+ dvalue = numok;
+ } else {
+ dvalue = dmodes[i].cap[cap];
+ }
+#ifdef TEST
+ if (verbose)
+ printf(" %s %s %d to %d\n",
+ capstr[cap], compstr[criteria[j].comparison], cvalue, dvalue);
+#endif
+ switch (criteria[j].comparison) {
+ case EQ:
+ result = cvalue == dvalue;
+ thisScore[j] = 1;
+ break;
+ case NEQ:
+ result = cvalue != dvalue;
+ thisScore[j] = 1;
+ break;
+ case LT:
+ result = dvalue < cvalue;
+ thisScore[j] = dvalue - cvalue;
+ break;
+ case GT:
+ result = dvalue > cvalue;
+ thisScore[j] = dvalue - cvalue;
+ break;
+ case LTE:
+ result = dvalue <= cvalue;
+ thisScore[j] = dvalue - cvalue;
+ break;
+ case GTE:
+ result = (dvalue >= cvalue);
+ thisScore[j] = dvalue - cvalue;
+ break;
+ case MIN:
+ result = dvalue >= cvalue;
+ thisScore[j] = cvalue - dvalue;
+ break;
+ }
+
+#ifdef TEST
+ if (verbose)
+ printf(" result=%d score=%d bestScore=%d\n", result, thisScore[j], bestScore[j]);
+#endif
+
+ if (result) {
+ if (better || thisScore[j] > bestScore[j]) {
+ better = 1;
+ } else if (thisScore[j] == bestScore[j]) {
+ /* Keep looking. */
+ } else {
+ goto nextDM;
+ }
+ } else {
+ if (cap == NUM) {
+ worse = 1;
+ } else {
+ goto nextDM;
+ }
+ }
+
+ }
+
+ if (better && !worse) {
+ found = &dmodes[i];
+ for (j = 0; j < ncriteria; j++) {
+ bestScore[j] = thisScore[j];
+ }
+ }
+ numok++;
+
+ nextDM:;
+
+ }
+ }
+ free(bestScore);
+ free(thisScore);
+ return found;
+}
+
+/**
+ * Parses strings in the form of:
+ * 800x600
+ * 800x600:16
+ * 800x600@60
+ * 800x600:16@60
+ * @60
+ * :16
+ * :16@60
+ * NOTE that @ before : is not parsed.
+ */
+static int
+specialCaseParse(char *word, Criterion * criterion, int mask)
+{
+ char *xstr, *response;
+ int got;
+ int width, height, bpp, hertz;
+
+ switch(word[0]) {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ /* The WWWxHHH case. */
+ if (mask & (1 << DM_WIDTH)) {
+ return -1;
+ }
+ xstr = strpbrk(&word[1], "x");
+ if (xstr) {
+ width = (int) strtol(word, &response, 0);
+ if (response == word || response[0] != 'x') {
+ /* Not a valid number OR needs to be followed by 'x'. */
+ return -1;
+ }
+ height = (int) strtol(&xstr[1], &response, 0);
+ if (response == &xstr[1]) {
+ /* Not a valid number. */
+ return -1;
+ }
+ criterion[0].capability = DM_WIDTH;
+ criterion[0].comparison = EQ;
+ criterion[0].value = width;
+ criterion[1].capability = DM_HEIGHT;
+ criterion[1].comparison = EQ;
+ criterion[1].value = height;
+ got = specialCaseParse(response,
+ &criterion[2], 1 << DM_WIDTH);
+ if (got >= 0) {
+ return got + 2;
+ } else {
+ return -1;
+ }
+ }
+ return -1;
+ case ':':
+ /* The :BPP case. */
+ if (mask & (1 << DM_PIXEL_DEPTH)) {
+ return -1;
+ }
+ bpp = (int) strtol(&word[1], &response, 0);
+ if (response == &word[1]) {
+ /* Not a valid number. */
+ return -1;
+ }
+ criterion[0].capability = DM_PIXEL_DEPTH;
+ criterion[0].comparison = EQ;
+ criterion[0].value = bpp;
+ got = specialCaseParse(response,
+ &criterion[1], (1 << DM_WIDTH) | (1 << DM_PIXEL_DEPTH));
+ if (got >= 0) {
+ return got + 1;
+ } else {
+ return -1;
+ }
+ case '@':
+ /* The @HZ case. */
+ if (mask & (1 << DM_HERTZ)) {
+ return -1;
+ }
+ hertz = (int) strtol(&word[1], &response, 0);
+ if (response == &word[1]) {
+ /* Not a valid number. */
+ return -1;
+ }
+ criterion[0].capability = DM_HERTZ;
+ criterion[0].comparison = EQ;
+ criterion[0].value = hertz;
+ got = specialCaseParse(response,
+ &criterion[1], ~DM_HERTZ);
+ if (got >= 0) {
+ return got + 1;
+ } else {
+ return -1;
+ }
+ case '\0':
+ return 0;
+ }
+ return -1;
+}
+
+/* This routine is based on similiar code in glut_dstr.c */
+static int
+parseCriteria(char *word, Criterion * criterion)
+{
+ char *cstr, *vstr, *response;
+ int comparator, value = 0;
+
+ cstr = strpbrk(word, "=><!~");
+ if (cstr) {
+ switch (cstr[0]) {
+ case '=':
+ comparator = EQ;
+ vstr = &cstr[1];
+ break;
+ case '~':
+ comparator = MIN;
+ vstr = &cstr[1];
+ break;
+ case '>':
+ if (cstr[1] == '=') {
+ comparator = GTE;
+ vstr = &cstr[2];
+ } else {
+ comparator = GT;
+ vstr = &cstr[1];
+ }
+ break;
+ case '<':
+ if (cstr[1] == '=') {
+ comparator = LTE;
+ vstr = &cstr[2];
+ } else {
+ comparator = LT;
+ vstr = &cstr[1];
+ }
+ break;
+ case '!':
+ if (cstr[1] == '=') {
+ comparator = NEQ;
+ vstr = &cstr[2];
+ } else {
+ return -1;
+ }
+ break;
+ default:
+ return -1;
+ }
+ value = (int) strtol(vstr, &response, 0);
+ if (response == vstr) {
+ /* Not a valid number. */
+ return -1;
+ }
+ *cstr = '\0';
+ } else {
+ comparator = NONE;
+ }
+ switch (word[0]) {
+ case 'b':
+ if (!strcmp(word, "bpp")) {
+ criterion[0].capability = DM_PIXEL_DEPTH;
+ if (comparator == NONE) {
+ return -1;
+ } else {
+ criterion[0].comparison = comparator;
+ criterion[0].value = value;
+ return 1;
+ }
+ }
+ return -1;
+ case 'h':
+ if (!strcmp(word, "height")) {
+ criterion[0].capability = DM_HEIGHT;
+ if (comparator == NONE) {
+ return -1;
+ } else {
+ criterion[0].comparison = comparator;
+ criterion[0].value = value;
+ return 1;
+ }
+ }
+ if (!strcmp(word, "hertz")) {
+ criterion[0].capability = DM_HERTZ;
+ if (comparator == NONE) {
+ return -1;
+ } else {
+ criterion[0].comparison = comparator;
+ criterion[0].value = value;
+ return 1;
+ }
+ }
+ return -1;
+ case 'n':
+ if (!strcmp(word, "num")) {
+ criterion[0].capability = DM_NUM;
+ if (comparator == NONE) {
+ return -1;
+ } else {
+ criterion[0].comparison = comparator;
+ criterion[0].value = value;
+ return 1;
+ }
+ }
+ return -1;
+ case 'w':
+ if (!strcmp(word, "width")) {
+ criterion[0].capability = DM_WIDTH;
+ if (comparator == NONE) {
+ return -1;
+ } else {
+ criterion[0].comparison = comparator;
+ criterion[0].value = value;
+ return 1;
+ }
+ }
+ return -1;
+ }
+ if (comparator == NONE) {
+ return specialCaseParse(word, criterion, 0);
+ }
+ return -1;
+}
+
+/* This routine is based on similiar code in glut_dstr.c */
+static Criterion *
+parseDisplayString(const char *display, int *ncriteria)
+{
+ Criterion *criteria = NULL;
+ int n, parsed;
+ char *copy, *word;
+
+ copy = __glutStrdup(display);
+ /* Attempt to estimate how many criteria entries should be
+ needed. */
+ n = 0;
+ word = strtok(copy, " \t");
+ while (word) {
+ n++;
+ word = strtok(NULL, " \t");
+ }
+ /* Allocate number of words of criteria. A word
+ could contain as many as four criteria in the
+ worst case. Example: 800x600:16@60 */
+ criteria = (Criterion *) malloc(4 * n * sizeof(Criterion));
+ if (!criteria) {
+ __glutFatalError("out of memory.");
+ }
+
+ /* Re-copy the copy of the display string. */
+ strcpy(copy, display);
+
+ n = 0;
+ word = strtok(copy, " \t");
+ while (word) {
+ parsed = parseCriteria(word, &criteria[n]);
+ if (parsed >= 0) {
+ n += parsed;
+ } else {
+ __glutWarning("Unrecognized game mode string word: %s (ignoring)\n", word);
+ }
+ word = strtok(NULL, " \t");
+ }
+
+ free(copy);
+ *ncriteria = n;
+ return criteria;
+}
+
+void GLUTAPIENTRY
+glutGameModeString(const char *string)
+{
+ Criterion *criteria;
+ int ncriteria;
+
+ initGameModeSupport();
+ criteria = parseDisplayString(string, &ncriteria);
+ currentDm = findMatch(dmodes, ndmodes, criteria, ncriteria);
+ free(criteria);
+}
+
+int GLUTAPIENTRY
+glutEnterGameMode(void)
+{
+ GLUTwindow *window;
+ int width, height;
+ Window win;
+
+ if (__glutMappedMenu) {
+ __glutFatalUsage("entering game mode not allowed while menus in use");
+ }
+ if (__glutGameModeWindow) {
+ /* Already in game mode, so blow away game mode
+ window so apps can change resolutions. */
+ window = __glutGameModeWindow;
+ /* Setting the game mode window to NULL tricks
+ the window destroy code into not undoing the
+ screen display change since we plan on immediately
+ doing another mode change. */
+ __glutGameModeWindow = NULL;
+ __glutDestroyWindow(window, window);
+ }
+
+ /* Assume default screen size until we find out if we
+ can actually change the display settings. */
+ width = __glutScreenWidth;
+ height = __glutScreenHeight;
+
+ if (currentDm) {
+#ifdef _WIN32
+ LONG status;
+ static int registered = 0;
+
+ status = ChangeDisplaySettings(&currentDm->devmode,
+ CDS_FULLSCREEN);
+ if (status == DISP_CHANGE_SUCCESSFUL) {
+ __glutDisplaySettingsChanged = 1;
+ width = currentDm->cap[DM_WIDTH];
+ height = currentDm->cap[DM_HEIGHT];
+ if (!registered) {
+ atexit(__glutCloseDownGameMode);
+ registered = 1;
+ }
+ } else {
+ /* Switch back to default resolution. */
+ ChangeDisplaySettings(NULL, 0);
+ }
+#endif
+ }
+
+ window = __glutCreateWindow(NULL, 0, 0,
+ width, height, /* game mode */ 1);
+ win = window->win;
+
+#if !defined(_WIN32) && !defined(__OS2__)
+ if (__glutMotifHints == None) {
+ __glutMotifHints = XSGIFastInternAtom(__glutDisplay, "_MOTIF_WM_HINTS",
+ SGI_XA__MOTIF_WM_HINTS, 0);
+ if (__glutMotifHints == None) {
+ __glutWarning("Could not intern X atom for _MOTIF_WM_HINTS.");
+ }
+ }
+
+ /* Game mode window is a toplevel window. */
+ XSetWMProtocols(__glutDisplay, win, &__glutWMDeleteWindow, 1);
+#endif
+
+ /* Schedule the fullscreen property to be added and to
+ make sure the window is configured right. Win32
+ doesn't need this. */
+ window->desiredX = 0;
+ window->desiredY = 0;
+ window->desiredWidth = width;
+ window->desiredHeight = height;
+ window->desiredConfMask |= CWX | CWY | CWWidth | CWHeight;
+#ifdef _WIN32
+ /* Win32 does not want to use GLUT_FULL_SCREEN_WORK
+ for game mode because we need to be maximizing
+ the window in game mode, not just sizing it to
+ take up the full screen. The Win32-ness of game
+ mode happens when you pass 1 in the gameMode parameter
+ to __glutCreateWindow above. A gameMode of creates
+ a WS_POPUP window, not a standard WS_OVERLAPPEDWINDOW
+ window. WS_POPUP ensures the taskbar is hidden. */
+ __glutPutOnWorkList(window,
+ GLUT_CONFIGURE_WORK);
+#else
+ __glutPutOnWorkList(window,
+ GLUT_CONFIGURE_WORK | GLUT_FULL_SCREEN_WORK);
+#endif
+
+ __glutGameModeWindow = window;
+ return window->num + 1;
+}
+
+int GLUTAPIENTRY
+glutGameModeGet(GLenum mode)
+{
+ switch (mode) {
+ case GLUT_GAME_MODE_ACTIVE:
+ return __glutGameModeWindow != NULL;
+ case GLUT_GAME_MODE_POSSIBLE:
+ return currentDm != NULL;
+ case GLUT_GAME_MODE_WIDTH:
+ return currentDm ? currentDm->cap[DM_WIDTH] : -1;
+ case GLUT_GAME_MODE_HEIGHT:
+ return currentDm ? currentDm->cap[DM_HEIGHT] : -1;
+ case GLUT_GAME_MODE_PIXEL_DEPTH:
+ return currentDm ? currentDm->cap[DM_PIXEL_DEPTH] : -1;
+ case GLUT_GAME_MODE_REFRESH_RATE:
+ return currentDm ? currentDm->cap[DM_HERTZ] : -1;
+ case GLUT_GAME_MODE_DISPLAY_CHANGED:
+ return __glutDisplaySettingsChanged;
+ default:
+ return -1;
+ }
+}
+ \ No newline at end of file
diff --git a/src/glut/os2/glut_get.cpp b/src/glut/os2/glut_get.cpp
new file mode 100644
index 00000000000..c846f486582
--- /dev/null
+++ b/src/glut/os2/glut_get.cpp
@@ -0,0 +1,232 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1997, 1998. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include <assert.h>
+#include <stdlib.h> /* SunOS 4 needs NULL defined for GETTIMEOFDAY macro. */
+#include "glutint.h"
+
+/* CENTRY */
+int GLUTAPIENTRY
+glutGet(GLenum param)
+{
+ Window win, root;
+ int x, y, value;
+ unsigned int width, height, border, depth;
+
+ switch (param) {
+ case GLUT_INIT_WINDOW_X:
+ return __glutInitX;
+ case GLUT_INIT_WINDOW_Y:
+ return __glutInitY;
+ case GLUT_INIT_WINDOW_WIDTH:
+ return __glutInitWidth;
+ case GLUT_INIT_WINDOW_HEIGHT:
+ return __glutInitHeight;
+ case GLUT_INIT_DISPLAY_MODE:
+ return __glutDisplayMode;
+ case GLUT_WINDOW_X:
+ XTranslateCoordinates(__glutDisplay, __glutCurrentWindow->win,
+ __glutRoot, 0, 0, &x, &y, &win);
+ return x;
+ case GLUT_WINDOW_Y:
+ XTranslateCoordinates(__glutDisplay, __glutCurrentWindow->win,
+ __glutRoot, 0, 0, &x, &y, &win);
+ return y;
+ case GLUT_WINDOW_WIDTH:
+ if (!__glutCurrentWindow->reshape) {
+ XGetGeometry(__glutDisplay, __glutCurrentWindow->win,
+ &root, &x, &y,
+ &width, &height, &border, &depth);
+ return width;
+ }
+ return __glutCurrentWindow->width;
+ case GLUT_WINDOW_HEIGHT:
+ if (!__glutCurrentWindow->reshape) {
+ XGetGeometry(__glutDisplay, __glutCurrentWindow->win,
+ &root, &x, &y,
+ &width, &height, &border, &depth);
+ return height;
+ }
+ return __glutCurrentWindow->height;
+#ifdef __OS2__
+ #define GET_CONFIG(attrib) \
+ { if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) \
+ glXGetConfig( __glutCurrentWindow->vis, attrib, &value); \
+ else \
+ glXGetConfig(__glutCurrentWindow->overlay->vis, attrib, &value); \
+ } \
+
+#else
+
+#define GET_CONFIG(attrib) { \
+ if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) { \
+ glXGetConfig(__glutDisplay, __glutCurrentWindow->vis, \
+ attrib, &value); \
+ } else { \
+ glXGetConfig(__glutDisplay, __glutCurrentWindow->overlay->vis, \
+ attrib, &value); \
+ } \
+}
+#endif
+
+ case GLUT_WINDOW_BUFFER_SIZE:
+ GET_CONFIG(GLX_BUFFER_SIZE);
+ return value;
+ case GLUT_WINDOW_STENCIL_SIZE:
+ GET_CONFIG(GLX_STENCIL_SIZE);
+ return value;
+ case GLUT_WINDOW_DEPTH_SIZE:
+ GET_CONFIG(GLX_DEPTH_SIZE);
+ return value;
+ case GLUT_WINDOW_RED_SIZE:
+ GET_CONFIG(GLX_RED_SIZE);
+ return value;
+ case GLUT_WINDOW_GREEN_SIZE:
+ GET_CONFIG(GLX_GREEN_SIZE);
+ return value;
+ case GLUT_WINDOW_BLUE_SIZE:
+ GET_CONFIG(GLX_BLUE_SIZE);
+ return value;
+ case GLUT_WINDOW_ALPHA_SIZE:
+ GET_CONFIG(GLX_ALPHA_SIZE);
+ return value;
+ case GLUT_WINDOW_ACCUM_RED_SIZE:
+ GET_CONFIG(GLX_ACCUM_RED_SIZE);
+ return value;
+ case GLUT_WINDOW_ACCUM_GREEN_SIZE:
+ GET_CONFIG(GLX_ACCUM_GREEN_SIZE);
+ return value;
+ case GLUT_WINDOW_ACCUM_BLUE_SIZE:
+ GET_CONFIG(GLX_ACCUM_BLUE_SIZE);
+ return value;
+ case GLUT_WINDOW_ACCUM_ALPHA_SIZE:
+ GET_CONFIG(GLX_ACCUM_ALPHA_SIZE);
+ return value;
+ case GLUT_WINDOW_DOUBLEBUFFER:
+ GET_CONFIG(GLX_DOUBLEBUFFER);
+ return value;
+ case GLUT_WINDOW_RGBA:
+ GET_CONFIG(GLX_RGBA);
+ return value;
+ case GLUT_WINDOW_COLORMAP_SIZE:
+ GET_CONFIG(GLX_RGBA);
+ if (value) {
+ return 0;
+ } else {
+#if defined(_WIN32) || defined(__OS2__)
+ /* KLUDGE: we always assume 256 colors in CI mode on
+ Win32 */
+ return 256;
+#else
+ if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
+ return __glutCurrentWindow->vis->visual->map_entries;
+ } else {
+ return __glutCurrentWindow->overlay->vis->visual->map_entries;
+ }
+#endif /* _WIN32 */
+ }
+ case GLUT_WINDOW_PARENT:
+ return __glutCurrentWindow->parent ?
+ __glutCurrentWindow->parent->num + 1 : 0;
+ case GLUT_WINDOW_NUM_CHILDREN:
+ {
+ int num = 0;
+ GLUTwindow *children = __glutCurrentWindow->children;
+
+ while (children) {
+ num++;
+ children = children->siblings;
+ }
+ return num;
+ }
+ case GLUT_WINDOW_NUM_SAMPLES:
+#if defined(GLX_VERSION_1_1) && defined(GLX_SGIS_multisample)
+ if (__glutIsSupportedByGLX("GLX_SGIS_multisample")) {
+ GET_CONFIG(GLX_SAMPLES_SGIS);
+ return value;
+ } else {
+ return 0;
+ }
+#else
+ /* Independent of GLX server support, multisampling not
+ supported by GLX client-side. */
+ return 0;
+#endif
+ case GLUT_WINDOW_STEREO:
+ GET_CONFIG(GLX_STEREO);
+ return value;
+ case GLUT_WINDOW_CURSOR:
+ return __glutCurrentWindow->cursor;
+ case GLUT_SCREEN_WIDTH:
+ return DisplayWidth(__glutDisplay, __glutScreen);
+ case GLUT_SCREEN_HEIGHT:
+ return DisplayHeight(__glutDisplay, __glutScreen);
+ case GLUT_SCREEN_WIDTH_MM:
+ return DisplayWidthMM(__glutDisplay, __glutScreen);
+ case GLUT_SCREEN_HEIGHT_MM:
+ return DisplayHeightMM(__glutDisplay, __glutScreen);
+ case GLUT_MENU_NUM_ITEMS:
+ return __glutCurrentMenu->num;
+ case GLUT_DISPLAY_MODE_POSSIBLE:
+ {
+ XVisualInfo *vi;
+ Bool dummy, visAlloced;
+ void *fbc;
+
+#if defined(_WIN32)
+ /* Our fake glXChooseVisual (which is called by
+ __glutDetermineVisual) needs an HDC to work with, so grab one
+ from the "root" window. */
+ XHDC = GetDC(GetDesktopWindow());
+#endif
+ vi = __glutDetermineWindowVisual(&dummy, &visAlloced, &fbc);
+#if defined(_WIN32)
+ ReleaseDC(GetDesktopWindow(), XHDC);
+#endif
+ if (vi) {
+ if (visAlloced)
+ XFree(vi);
+ return 1;
+ }
+ return 0;
+ }
+ case GLUT_ELAPSED_TIME:
+ {
+#ifdef OLD_VMS
+ struct timeval6 elapsed, beginning, now;
+#else
+ struct timeval elapsed, beginning, now;
+#endif
+
+ __glutInitTime(&beginning);
+ GETTIMEOFDAY(&now);
+ TIMEDELTA(elapsed, now, beginning);
+ /* Return elapsed milliseconds. */
+#if defined(__vms) && ( __VMS_VER < 70000000 )
+ return (int) (elapsed.val / TICKS_PER_MILLISECOND);
+#else
+ return (int) ((elapsed.tv_sec * 1000) + (elapsed.tv_usec / 1000));
+#endif
+ }
+ case GLUT_WINDOW_FORMAT_ID:
+#if defined(__OS2__)
+ return wglGetPixelFormat(__glutCurrentWindow->hdc);
+#elif defined(_WIN32)
+ return GetPixelFormat(__glutCurrentWindow->hdc);
+#else
+ if (__glutCurrentWindow->renderWin == __glutCurrentWindow->win) {
+ return (int) __glutCurrentWindow->vis->visualid;
+ } else {
+ return (int) __glutCurrentWindow->overlay->vis->visualid;
+ }
+#endif
+ default:
+ __glutWarning("invalid glutGet parameter: %d", param);
+ return -1;
+ }
+}
+/* ENDCENTRY */
diff --git a/src/glut/os2/glut_hel10.cpp b/src/glut/os2/glut_hel10.cpp
new file mode 100644
index 00000000000..6409f6181a3
--- /dev/null
+++ b/src/glut/os2/glut_hel10.cpp
@@ -0,0 +1,1781 @@
+
+/* GENERATED FILE -- DO NOT MODIFY */
+
+#define glutBitmapHelvetica10 XXX
+#include "glutbitmap.h"
+#undef glutBitmapHelvetica10
+
+/* char: 0xff */
+
+static const GLubyte ch255data[] = {
+0x80,0x40,0x40,0x60,0xa0,0xa0,0x90,0x90,0x0,0x50,
+};
+
+static const BitmapCharRec ch255 = {4,10,0,2,5,ch255data};
+
+/* char: 0xfe */
+
+static const GLubyte ch254data[] = {
+0x80,0x80,0xb0,0xc8,0x88,0x88,0xc8,0xb0,0x80,0x80,
+};
+
+static const BitmapCharRec ch254 = {5,10,0,2,6,ch254data};
+
+/* char: 0xfd */
+
+static const GLubyte ch253data[] = {
+0x80,0x40,0x40,0x60,0xa0,0xa0,0x90,0x90,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch253 = {4,11,0,2,5,ch253data};
+
+/* char: 0xfc */
+
+static const GLubyte ch252data[] = {
+0x70,0x90,0x90,0x90,0x90,0x90,0x0,0x50,
+};
+
+static const BitmapCharRec ch252 = {4,8,0,0,5,ch252data};
+
+/* char: 0xfb */
+
+static const GLubyte ch251data[] = {
+0x70,0x90,0x90,0x90,0x90,0x90,0x0,0x50,0x20,
+};
+
+static const BitmapCharRec ch251 = {4,9,0,0,5,ch251data};
+
+/* char: 0xfa */
+
+static const GLubyte ch250data[] = {
+0x70,0x90,0x90,0x90,0x90,0x90,0x0,0x40,0x20,
+};
+
+static const BitmapCharRec ch250 = {4,9,0,0,5,ch250data};
+
+/* char: 0xf9 */
+
+static const GLubyte ch249data[] = {
+0x70,0x90,0x90,0x90,0x90,0x90,0x0,0x20,0x40,
+};
+
+static const BitmapCharRec ch249 = {4,9,0,0,5,ch249data};
+
+/* char: 0xf8 */
+
+static const GLubyte ch248data[] = {
+0x70,0x88,0xc8,0xa8,0x98,0x74,
+};
+
+static const BitmapCharRec ch248 = {6,6,0,0,6,ch248data};
+
+/* char: 0xf7 */
+
+static const GLubyte ch247data[] = {
+0x20,0x0,0xf8,0x0,0x20,
+};
+
+static const BitmapCharRec ch247 = {5,5,0,-1,6,ch247data};
+
+/* char: 0xf6 */
+
+static const GLubyte ch246data[] = {
+0x70,0x88,0x88,0x88,0x88,0x70,0x0,0x50,
+};
+
+static const BitmapCharRec ch246 = {5,8,0,0,6,ch246data};
+
+/* char: 0xf5 */
+
+static const GLubyte ch245data[] = {
+0x70,0x88,0x88,0x88,0x88,0x70,0x0,0x50,0x28,
+};
+
+static const BitmapCharRec ch245 = {5,9,0,0,6,ch245data};
+
+/* char: 0xf4 */
+
+static const GLubyte ch244data[] = {
+0x70,0x88,0x88,0x88,0x88,0x70,0x0,0x50,0x20,
+};
+
+static const BitmapCharRec ch244 = {5,9,0,0,6,ch244data};
+
+/* char: 0xf3 */
+
+static const GLubyte ch243data[] = {
+0x70,0x88,0x88,0x88,0x88,0x70,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch243 = {5,9,0,0,6,ch243data};
+
+/* char: 0xf2 */
+
+static const GLubyte ch242data[] = {
+0x70,0x88,0x88,0x88,0x88,0x70,0x0,0x20,0x40,
+};
+
+static const BitmapCharRec ch242 = {5,9,0,0,6,ch242data};
+
+/* char: 0xf1 */
+
+static const GLubyte ch241data[] = {
+0x90,0x90,0x90,0x90,0x90,0xe0,0x0,0xa0,0x50,
+};
+
+static const BitmapCharRec ch241 = {4,9,0,0,5,ch241data};
+
+/* char: 0xf0 */
+
+static const GLubyte ch240data[] = {
+0x70,0x88,0x88,0x88,0x88,0x78,0x90,0x60,0x50,
+};
+
+static const BitmapCharRec ch240 = {5,9,0,0,6,ch240data};
+
+/* char: 0xef */
+
+static const GLubyte ch239data[] = {
+0x40,0x40,0x40,0x40,0x40,0x40,0x0,0xa0,
+};
+
+static const BitmapCharRec ch239 = {3,8,0,0,2,ch239data};
+
+/* char: 0xee */
+
+static const GLubyte ch238data[] = {
+0x40,0x40,0x40,0x40,0x40,0x40,0x0,0xa0,0x40,
+};
+
+static const BitmapCharRec ch238 = {3,9,1,0,2,ch238data};
+
+/* char: 0xed */
+
+static const GLubyte ch237data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x0,0x80,0x40,
+};
+
+static const BitmapCharRec ch237 = {2,9,0,0,2,ch237data};
+
+/* char: 0xec */
+
+static const GLubyte ch236data[] = {
+0x40,0x40,0x40,0x40,0x40,0x40,0x0,0x40,0x80,
+};
+
+static const BitmapCharRec ch236 = {2,9,1,0,2,ch236data};
+
+/* char: 0xeb */
+
+static const GLubyte ch235data[] = {
+0x60,0x90,0x80,0xf0,0x90,0x60,0x0,0x50,
+};
+
+static const BitmapCharRec ch235 = {4,8,0,0,5,ch235data};
+
+/* char: 0xea */
+
+static const GLubyte ch234data[] = {
+0x60,0x90,0x80,0xf0,0x90,0x60,0x0,0x50,0x20,
+};
+
+static const BitmapCharRec ch234 = {4,9,0,0,5,ch234data};
+
+/* char: 0xe9 */
+
+static const GLubyte ch233data[] = {
+0x60,0x90,0x80,0xf0,0x90,0x60,0x0,0x40,0x20,
+};
+
+static const BitmapCharRec ch233 = {4,9,0,0,5,ch233data};
+
+/* char: 0xe8 */
+
+static const GLubyte ch232data[] = {
+0x60,0x90,0x80,0xf0,0x90,0x60,0x0,0x20,0x40,
+};
+
+static const BitmapCharRec ch232 = {4,9,0,0,5,ch232data};
+
+/* char: 0xe7 */
+
+static const GLubyte ch231data[] = {
+0x60,0x20,0x60,0x90,0x80,0x80,0x90,0x60,
+};
+
+static const BitmapCharRec ch231 = {4,8,0,2,5,ch231data};
+
+/* char: 0xe6 */
+
+static const GLubyte ch230data[] = {
+0x6c,0x92,0x90,0x7e,0x12,0xec,
+};
+
+static const BitmapCharRec ch230 = {7,6,0,0,8,ch230data};
+
+/* char: 0xe5 */
+
+static const GLubyte ch229data[] = {
+0x68,0x90,0x90,0x70,0x10,0xe0,0x20,0x50,0x20,
+};
+
+static const BitmapCharRec ch229 = {5,9,0,0,5,ch229data};
+
+/* char: 0xe4 */
+
+static const GLubyte ch228data[] = {
+0x68,0x90,0x90,0x70,0x10,0xe0,0x0,0x50,
+};
+
+static const BitmapCharRec ch228 = {5,8,0,0,5,ch228data};
+
+/* char: 0xe3 */
+
+static const GLubyte ch227data[] = {
+0x68,0x90,0x90,0x70,0x10,0xe0,0x0,0xa0,0x50,
+};
+
+static const BitmapCharRec ch227 = {5,9,0,0,5,ch227data};
+
+/* char: 0xe2 */
+
+static const GLubyte ch226data[] = {
+0x68,0x90,0x90,0x70,0x10,0xe0,0x0,0x50,0x20,
+};
+
+static const BitmapCharRec ch226 = {5,9,0,0,5,ch226data};
+
+/* char: 0xe1 */
+
+static const GLubyte ch225data[] = {
+0x68,0x90,0x90,0x70,0x10,0xe0,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch225 = {5,9,0,0,5,ch225data};
+
+/* char: 0xe0 */
+
+static const GLubyte ch224data[] = {
+0x68,0x90,0x90,0x70,0x10,0xe0,0x0,0x20,0x40,
+};
+
+static const BitmapCharRec ch224 = {5,9,0,0,5,ch224data};
+
+/* char: 0xdf */
+
+static const GLubyte ch223data[] = {
+0xa0,0x90,0x90,0x90,0xa0,0x90,0x90,0x60,
+};
+
+static const BitmapCharRec ch223 = {4,8,0,0,5,ch223data};
+
+/* char: 0xde */
+
+static const GLubyte ch222data[] = {
+0x80,0x80,0xf0,0x88,0x88,0xf0,0x80,0x80,
+};
+
+static const BitmapCharRec ch222 = {5,8,-1,0,7,ch222data};
+
+/* char: 0xdd */
+
+static const GLubyte ch221data[] = {
+0x10,0x10,0x10,0x28,0x28,0x44,0x44,0x82,0x0,0x10,0x8,
+};
+
+static const BitmapCharRec ch221 = {7,11,0,0,7,ch221data};
+
+/* char: 0xdc */
+
+static const GLubyte ch220data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x0,0x48,
+};
+
+static const BitmapCharRec ch220 = {6,10,-1,0,8,ch220data};
+
+/* char: 0xdb */
+
+static const GLubyte ch219data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x0,0x28,0x10,
+};
+
+static const BitmapCharRec ch219 = {6,11,-1,0,8,ch219data};
+
+/* char: 0xda */
+
+static const GLubyte ch218data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch218 = {6,11,-1,0,8,ch218data};
+
+/* char: 0xd9 */
+
+static const GLubyte ch217data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x0,0x10,0x20,
+};
+
+static const BitmapCharRec ch217 = {6,11,-1,0,8,ch217data};
+
+/* char: 0xd8 */
+
+static const GLubyte ch216data[] = {
+0x80,0x78,0xc4,0xa4,0xa4,0x94,0x94,0x8c,0x78,0x4,
+};
+
+static const BitmapCharRec ch216 = {6,10,-1,1,8,ch216data};
+
+/* char: 0xd7 */
+
+static const GLubyte ch215data[] = {
+0x88,0x50,0x20,0x50,0x88,
+};
+
+static const BitmapCharRec ch215 = {5,5,0,-1,6,ch215data};
+
+/* char: 0xd6 */
+
+static const GLubyte ch214data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x78,0x0,0x48,
+};
+
+static const BitmapCharRec ch214 = {6,10,-1,0,8,ch214data};
+
+/* char: 0xd5 */
+
+static const GLubyte ch213data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x78,0x0,0x50,0x28,
+};
+
+static const BitmapCharRec ch213 = {6,11,-1,0,8,ch213data};
+
+/* char: 0xd4 */
+
+static const GLubyte ch212data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x78,0x0,0x28,0x10,
+};
+
+static const BitmapCharRec ch212 = {6,11,-1,0,8,ch212data};
+
+/* char: 0xd3 */
+
+static const GLubyte ch211data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x78,0x0,0x10,0x8,
+};
+
+static const BitmapCharRec ch211 = {6,11,-1,0,8,ch211data};
+
+/* char: 0xd2 */
+
+static const GLubyte ch210data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x78,0x0,0x10,0x20,
+};
+
+static const BitmapCharRec ch210 = {6,11,-1,0,8,ch210data};
+
+/* char: 0xd1 */
+
+static const GLubyte ch209data[] = {
+0x8c,0x8c,0x94,0x94,0xa4,0xa4,0xc4,0xc4,0x0,0x50,0x28,
+};
+
+static const BitmapCharRec ch209 = {6,11,-1,0,8,ch209data};
+
+/* char: 0xd0 */
+
+static const GLubyte ch208data[] = {
+0x78,0x44,0x42,0x42,0xf2,0x42,0x44,0x78,
+};
+
+static const BitmapCharRec ch208 = {7,8,0,0,8,ch208data};
+
+/* char: 0xcf */
+
+static const GLubyte ch207data[] = {
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x0,0xa0,
+};
+
+static const BitmapCharRec ch207 = {3,10,0,0,3,ch207data};
+
+/* char: 0xce */
+
+static const GLubyte ch206data[] = {
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x0,0xa0,0x40,
+};
+
+static const BitmapCharRec ch206 = {3,11,0,0,3,ch206data};
+
+/* char: 0xcd */
+
+static const GLubyte ch205data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x0,0x80,0x40,
+};
+
+static const BitmapCharRec ch205 = {2,11,-1,0,3,ch205data};
+
+/* char: 0xcc */
+
+static const GLubyte ch204data[] = {
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x0,0x40,0x80,
+};
+
+static const BitmapCharRec ch204 = {2,11,0,0,3,ch204data};
+
+/* char: 0xcb */
+
+static const GLubyte ch203data[] = {
+0xf8,0x80,0x80,0x80,0xf8,0x80,0x80,0xf8,0x0,0x50,
+};
+
+static const BitmapCharRec ch203 = {5,10,-1,0,7,ch203data};
+
+/* char: 0xca */
+
+static const GLubyte ch202data[] = {
+0xf8,0x80,0x80,0xf8,0x80,0x80,0x80,0xf8,0x0,0x50,0x20,
+};
+
+static const BitmapCharRec ch202 = {5,11,-1,0,7,ch202data};
+
+/* char: 0xc9 */
+
+static const GLubyte ch201data[] = {
+0xf8,0x80,0x80,0x80,0xf8,0x80,0x80,0xf8,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch201 = {5,11,-1,0,7,ch201data};
+
+/* char: 0xc8 */
+
+static const GLubyte ch200data[] = {
+0xf8,0x80,0x80,0x80,0xf8,0x80,0x80,0xf8,0x0,0x20,0x40,
+};
+
+static const BitmapCharRec ch200 = {5,11,-1,0,7,ch200data};
+
+/* char: 0xc7 */
+
+static const GLubyte ch199data[] = {
+0x30,0x10,0x78,0x84,0x80,0x80,0x80,0x80,0x84,0x78,
+};
+
+static const BitmapCharRec ch199 = {6,10,-1,2,8,ch199data};
+
+/* char: 0xc6 */
+
+static const GLubyte ch198data[] = {
+0x8f,0x80,0x88,0x0,0x78,0x0,0x48,0x0,0x2f,0x80,0x28,0x0,0x18,0x0,0x1f,0x80,
+};
+
+static const BitmapCharRec ch198 = {9,8,0,0,10,ch198data};
+
+/* char: 0xc5 */
+
+static const GLubyte ch197data[] = {
+0x82,0x82,0x7c,0x44,0x28,0x28,0x10,0x10,0x10,0x28,0x10,
+};
+
+static const BitmapCharRec ch197 = {7,11,0,0,7,ch197data};
+
+/* char: 0xc4 */
+
+static const GLubyte ch196data[] = {
+0x82,0x82,0x7c,0x44,0x28,0x28,0x10,0x10,0x0,0x28,
+};
+
+static const BitmapCharRec ch196 = {7,10,0,0,7,ch196data};
+
+/* char: 0xc3 */
+
+static const GLubyte ch195data[] = {
+0x82,0x82,0x7c,0x44,0x28,0x28,0x10,0x10,0x0,0x28,0x14,
+};
+
+static const BitmapCharRec ch195 = {7,11,0,0,7,ch195data};
+
+/* char: 0xc2 */
+
+static const GLubyte ch194data[] = {
+0x82,0x82,0x7c,0x44,0x28,0x28,0x10,0x10,0x0,0x28,0x10,
+};
+
+static const BitmapCharRec ch194 = {7,11,0,0,7,ch194data};
+
+/* char: 0xc1 */
+
+static const GLubyte ch193data[] = {
+0x82,0x82,0x7c,0x44,0x28,0x28,0x10,0x10,0x0,0x10,0x8,
+};
+
+static const BitmapCharRec ch193 = {7,11,0,0,7,ch193data};
+
+/* char: 0xc0 */
+
+static const GLubyte ch192data[] = {
+0x82,0x82,0x7c,0x44,0x28,0x28,0x10,0x10,0x0,0x10,0x20,
+};
+
+static const BitmapCharRec ch192 = {7,11,0,0,7,ch192data};
+
+/* char: 0xbf */
+
+static const GLubyte ch191data[] = {
+0x60,0x90,0x80,0x40,0x20,0x20,0x0,0x20,
+};
+
+static const BitmapCharRec ch191 = {4,8,-1,2,6,ch191data};
+
+/* char: 0xbe */
+
+static const GLubyte ch190data[] = {
+0x21,0x0,0x17,0x80,0x13,0x0,0x9,0x0,0xc8,0x0,0x24,0x0,0x44,0x0,0xe2,0x0,
+};
+
+static const BitmapCharRec ch190 = {9,8,0,0,9,ch190data};
+
+/* char: 0xbd */
+
+static const GLubyte ch189data[] = {
+0x27,0x12,0x15,0xb,0x48,0x44,0xc4,0x42,
+};
+
+static const BitmapCharRec ch189 = {8,8,0,0,9,ch189data};
+
+/* char: 0xbc */
+
+static const GLubyte ch188data[] = {
+0x21,0x0,0x17,0x80,0x13,0x0,0x9,0x0,0x48,0x0,0x44,0x0,0xc4,0x0,0x42,0x0,
+};
+
+static const BitmapCharRec ch188 = {9,8,0,0,9,ch188data};
+
+/* char: 0xbb */
+
+static const GLubyte ch187data[] = {
+0xa0,0x50,0x28,0x50,0xa0,
+};
+
+static const BitmapCharRec ch187 = {5,5,0,0,6,ch187data};
+
+/* char: 0xba */
+
+static const GLubyte ch186data[] = {
+0xe0,0x0,0xe0,0xa0,0xe0,
+};
+
+static const BitmapCharRec ch186 = {3,5,0,-3,4,ch186data};
+
+/* char: 0xb9 */
+
+static const GLubyte ch185data[] = {
+0x40,0x40,0xc0,0x40,
+};
+
+static const BitmapCharRec ch185 = {2,4,0,-3,3,ch185data};
+
+/* char: 0xb8 */
+
+static const GLubyte ch184data[] = {
+0xc0,0x40,
+};
+
+static const BitmapCharRec ch184 = {2,2,0,2,3,ch184data};
+
+/* char: 0xb7 */
+
+static const GLubyte ch183data[] = {
+0xc0,
+};
+
+static const BitmapCharRec ch183 = {2,1,0,-3,3,ch183data};
+
+/* char: 0xb6 */
+
+static const GLubyte ch182data[] = {
+0x28,0x28,0x28,0x28,0x28,0x68,0xe8,0xe8,0xe8,0x7c,
+};
+
+static const BitmapCharRec ch182 = {6,10,0,2,6,ch182data};
+
+/* char: 0xb5 */
+
+static const GLubyte ch181data[] = {
+0x80,0x80,0xf0,0x90,0x90,0x90,0x90,0x90,
+};
+
+static const BitmapCharRec ch181 = {4,8,0,2,5,ch181data};
+
+/* char: 0xb4 */
+
+static const GLubyte ch180data[] = {
+0x80,0x40,
+};
+
+static const BitmapCharRec ch180 = {2,2,0,-6,3,ch180data};
+
+/* char: 0xb3 */
+
+static const GLubyte ch179data[] = {
+0xc0,0x20,0x40,0xe0,
+};
+
+static const BitmapCharRec ch179 = {3,4,0,-3,3,ch179data};
+
+/* char: 0xb2 */
+
+static const GLubyte ch178data[] = {
+0xe0,0x40,0xa0,0x60,
+};
+
+static const BitmapCharRec ch178 = {3,4,0,-3,3,ch178data};
+
+/* char: 0xb1 */
+
+static const GLubyte ch177data[] = {
+0xf8,0x0,0x20,0x20,0xf8,0x20,0x20,
+};
+
+static const BitmapCharRec ch177 = {5,7,0,0,6,ch177data};
+
+/* char: 0xb0 */
+
+static const GLubyte ch176data[] = {
+0x60,0x90,0x90,0x60,
+};
+
+static const BitmapCharRec ch176 = {4,4,0,-3,4,ch176data};
+
+/* char: 0xaf */
+
+static const GLubyte ch175data[] = {
+0xe0,
+};
+
+static const BitmapCharRec ch175 = {3,1,0,-7,3,ch175data};
+
+/* char: 0xae */
+
+static const GLubyte ch174data[] = {
+0x38,0x44,0xaa,0xb2,0xba,0x44,0x38,
+};
+
+static const BitmapCharRec ch174 = {7,7,-1,0,9,ch174data};
+
+/* char: 0xad */
+
+static const GLubyte ch173data[] = {
+0xe0,
+};
+
+static const BitmapCharRec ch173 = {3,1,0,-3,4,ch173data};
+
+/* char: 0xac */
+
+static const GLubyte ch172data[] = {
+0x8,0x8,0xf8,
+};
+
+static const BitmapCharRec ch172 = {5,3,-1,-2,7,ch172data};
+
+/* char: 0xab */
+
+static const GLubyte ch171data[] = {
+0x28,0x50,0xa0,0x50,0x28,
+};
+
+static const BitmapCharRec ch171 = {5,5,0,0,6,ch171data};
+
+/* char: 0xaa */
+
+static const GLubyte ch170data[] = {
+0xe0,0x0,0xa0,0x20,0xe0,
+};
+
+static const BitmapCharRec ch170 = {3,5,0,-3,4,ch170data};
+
+/* char: 0xa9 */
+
+static const GLubyte ch169data[] = {
+0x38,0x44,0x9a,0xa2,0x9a,0x44,0x38,
+};
+
+static const BitmapCharRec ch169 = {7,7,-1,0,9,ch169data};
+
+/* char: 0xa8 */
+
+static const GLubyte ch168data[] = {
+0xa0,
+};
+
+static const BitmapCharRec ch168 = {3,1,0,-7,3,ch168data};
+
+/* char: 0xa7 */
+
+static const GLubyte ch167data[] = {
+0x70,0x88,0x18,0x70,0xc8,0x98,0x70,0xc0,0x88,0x70,
+};
+
+static const BitmapCharRec ch167 = {5,10,0,2,6,ch167data};
+
+/* char: 0xa6 */
+
+static const GLubyte ch166data[] = {
+0x80,0x80,0x80,0x80,0x0,0x0,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch166 = {1,10,-1,2,3,ch166data};
+
+/* char: 0xa5 */
+
+static const GLubyte ch165data[] = {
+0x20,0xf8,0x20,0xf8,0x50,0x50,0x88,0x88,
+};
+
+static const BitmapCharRec ch165 = {5,8,0,0,6,ch165data};
+
+/* char: 0xa4 */
+
+static const GLubyte ch164data[] = {
+0x90,0x60,0x90,0x90,0x60,0x90,
+};
+
+static const BitmapCharRec ch164 = {4,6,0,-1,5,ch164data};
+
+/* char: 0xa3 */
+
+static const GLubyte ch163data[] = {
+0xb0,0x48,0x40,0x40,0xe0,0x40,0x48,0x30,
+};
+
+static const BitmapCharRec ch163 = {5,8,0,0,6,ch163data};
+
+/* char: 0xa2 */
+
+static const GLubyte ch162data[] = {
+0x40,0x70,0xa8,0xa0,0xa0,0xa8,0x70,0x10,
+};
+
+static const BitmapCharRec ch162 = {5,8,0,1,6,ch162data};
+
+/* char: 0xa1 */
+
+static const GLubyte ch161data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x0,0x80,
+};
+
+static const BitmapCharRec ch161 = {1,8,-1,2,3,ch161data};
+
+/* char: 0xa0 */
+
+#ifdef _WIN32
+/* XXX Work around Microsoft OpenGL 1.1 bug where glBitmap with
+ a height or width of zero does not advance the raster position
+ as specified by OpenGL. (Cosmo OpenGL does not have this bug.) */
+static const GLubyte ch160data[] = { 0x0 };
+static const BitmapCharRec ch160 = {1,1,0,0,3,ch160data};
+#else
+static const BitmapCharRec ch160 = {0,0,0,0,3,0};
+#endif
+
+/* char: 0x7e '~' */
+
+static const GLubyte ch126data[] = {
+0x98,0x64,
+};
+
+static const BitmapCharRec ch126 = {6,2,0,-3,7,ch126data};
+
+/* char: 0x7d '}' */
+
+static const GLubyte ch125data[] = {
+0x80,0x40,0x40,0x40,0x40,0x20,0x40,0x40,0x40,0x80,
+};
+
+static const BitmapCharRec ch125 = {3,10,0,2,3,ch125data};
+
+/* char: 0x7c '|' */
+
+static const GLubyte ch124data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch124 = {1,10,-1,2,3,ch124data};
+
+/* char: 0x7b '{' */
+
+static const GLubyte ch123data[] = {
+0x20,0x40,0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x20,
+};
+
+static const BitmapCharRec ch123 = {3,10,0,2,3,ch123data};
+
+/* char: 0x7a 'z' */
+
+static const GLubyte ch122data[] = {
+0xf0,0x80,0x40,0x20,0x10,0xf0,
+};
+
+static const BitmapCharRec ch122 = {4,6,0,0,5,ch122data};
+
+/* char: 0x79 'y' */
+
+static const GLubyte ch121data[] = {
+0x80,0x40,0x40,0x60,0xa0,0xa0,0x90,0x90,
+};
+
+static const BitmapCharRec ch121 = {4,8,0,2,5,ch121data};
+
+/* char: 0x78 'x' */
+
+static const GLubyte ch120data[] = {
+0x88,0x88,0x50,0x20,0x50,0x88,
+};
+
+static const BitmapCharRec ch120 = {5,6,0,0,6,ch120data};
+
+/* char: 0x77 'w' */
+
+static const GLubyte ch119data[] = {
+0x28,0x28,0x54,0x54,0x92,0x92,
+};
+
+static const BitmapCharRec ch119 = {7,6,0,0,8,ch119data};
+
+/* char: 0x76 'v' */
+
+static const GLubyte ch118data[] = {
+0x20,0x20,0x50,0x50,0x88,0x88,
+};
+
+static const BitmapCharRec ch118 = {5,6,0,0,6,ch118data};
+
+/* char: 0x75 'u' */
+
+static const GLubyte ch117data[] = {
+0x70,0x90,0x90,0x90,0x90,0x90,
+};
+
+static const BitmapCharRec ch117 = {4,6,0,0,5,ch117data};
+
+/* char: 0x74 't' */
+
+static const GLubyte ch116data[] = {
+0x60,0x40,0x40,0x40,0x40,0xe0,0x40,0x40,
+};
+
+static const BitmapCharRec ch116 = {3,8,0,0,4,ch116data};
+
+/* char: 0x73 's' */
+
+static const GLubyte ch115data[] = {
+0x60,0x90,0x10,0x60,0x90,0x60,
+};
+
+static const BitmapCharRec ch115 = {4,6,0,0,5,ch115data};
+
+/* char: 0x72 'r' */
+
+static const GLubyte ch114data[] = {
+0x80,0x80,0x80,0x80,0xc0,0xa0,
+};
+
+static const BitmapCharRec ch114 = {3,6,0,0,4,ch114data};
+
+/* char: 0x71 'q' */
+
+static const GLubyte ch113data[] = {
+0x8,0x8,0x68,0x98,0x88,0x88,0x98,0x68,
+};
+
+static const BitmapCharRec ch113 = {5,8,0,2,6,ch113data};
+
+/* char: 0x70 'p' */
+
+static const GLubyte ch112data[] = {
+0x80,0x80,0xb0,0xc8,0x88,0x88,0xc8,0xb0,
+};
+
+static const BitmapCharRec ch112 = {5,8,0,2,6,ch112data};
+
+/* char: 0x6f 'o' */
+
+static const GLubyte ch111data[] = {
+0x70,0x88,0x88,0x88,0x88,0x70,
+};
+
+static const BitmapCharRec ch111 = {5,6,0,0,6,ch111data};
+
+/* char: 0x6e 'n' */
+
+static const GLubyte ch110data[] = {
+0x88,0x88,0x88,0x88,0xc8,0xb0,
+};
+
+static const BitmapCharRec ch110 = {5,6,0,0,6,ch110data};
+
+/* char: 0x6d 'm' */
+
+static const GLubyte ch109data[] = {
+0x92,0x92,0x92,0x92,0x92,0xec,
+};
+
+static const BitmapCharRec ch109 = {7,6,0,0,8,ch109data};
+
+/* char: 0x6c 'l' */
+
+static const GLubyte ch108data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch108 = {1,8,0,0,2,ch108data};
+
+/* char: 0x6b 'k' */
+
+static const GLubyte ch107data[] = {
+0x90,0x90,0xa0,0xc0,0xa0,0x90,0x80,0x80,
+};
+
+static const BitmapCharRec ch107 = {4,8,0,0,5,ch107data};
+
+/* char: 0x6a 'j' */
+
+static const GLubyte ch106data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x0,0x80,
+};
+
+static const BitmapCharRec ch106 = {1,9,0,1,2,ch106data};
+
+/* char: 0x69 'i' */
+
+static const GLubyte ch105data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x0,0x80,
+};
+
+static const BitmapCharRec ch105 = {1,8,0,0,2,ch105data};
+
+/* char: 0x68 'h' */
+
+static const GLubyte ch104data[] = {
+0x88,0x88,0x88,0x88,0xc8,0xb0,0x80,0x80,
+};
+
+static const BitmapCharRec ch104 = {5,8,0,0,6,ch104data};
+
+/* char: 0x67 'g' */
+
+static const GLubyte ch103data[] = {
+0x70,0x8,0x68,0x98,0x88,0x88,0x98,0x68,
+};
+
+static const BitmapCharRec ch103 = {5,8,0,2,6,ch103data};
+
+/* char: 0x66 'f' */
+
+static const GLubyte ch102data[] = {
+0x40,0x40,0x40,0x40,0x40,0xe0,0x40,0x30,
+};
+
+static const BitmapCharRec ch102 = {4,8,0,0,4,ch102data};
+
+/* char: 0x65 'e' */
+
+static const GLubyte ch101data[] = {
+0x60,0x90,0x80,0xf0,0x90,0x60,
+};
+
+static const BitmapCharRec ch101 = {4,6,0,0,5,ch101data};
+
+/* char: 0x64 'd' */
+
+static const GLubyte ch100data[] = {
+0x68,0x98,0x88,0x88,0x98,0x68,0x8,0x8,
+};
+
+static const BitmapCharRec ch100 = {5,8,0,0,6,ch100data};
+
+/* char: 0x63 'c' */
+
+static const GLubyte ch99data[] = {
+0x60,0x90,0x80,0x80,0x90,0x60,
+};
+
+static const BitmapCharRec ch99 = {4,6,0,0,5,ch99data};
+
+/* char: 0x62 'b' */
+
+static const GLubyte ch98data[] = {
+0xb0,0xc8,0x88,0x88,0xc8,0xb0,0x80,0x80,
+};
+
+static const BitmapCharRec ch98 = {5,8,0,0,6,ch98data};
+
+/* char: 0x61 'a' */
+
+static const GLubyte ch97data[] = {
+0x68,0x90,0x90,0x70,0x10,0xe0,
+};
+
+static const BitmapCharRec ch97 = {5,6,0,0,5,ch97data};
+
+/* char: 0x60 '`' */
+
+static const GLubyte ch96data[] = {
+0x80,0x80,0x40,
+};
+
+static const BitmapCharRec ch96 = {2,3,0,-5,3,ch96data};
+
+/* char: 0x5f '_' */
+
+static const GLubyte ch95data[] = {
+0xfc,
+};
+
+static const BitmapCharRec ch95 = {6,1,0,2,6,ch95data};
+
+/* char: 0x5e '^' */
+
+static const GLubyte ch94data[] = {
+0x88,0x50,0x50,0x20,0x20,
+};
+
+static const BitmapCharRec ch94 = {5,5,0,-3,6,ch94data};
+
+/* char: 0x5d ']' */
+
+static const GLubyte ch93data[] = {
+0xc0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xc0,
+};
+
+static const BitmapCharRec ch93 = {2,10,0,2,3,ch93data};
+
+/* char: 0x5c '\' */
+
+static const GLubyte ch92data[] = {
+0x20,0x20,0x40,0x40,0x40,0x40,0x80,0x80,
+};
+
+static const BitmapCharRec ch92 = {3,8,0,0,3,ch92data};
+
+/* char: 0x5b '[' */
+
+static const GLubyte ch91data[] = {
+0xc0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xc0,
+};
+
+static const BitmapCharRec ch91 = {2,10,-1,2,3,ch91data};
+
+/* char: 0x5a 'Z' */
+
+static const GLubyte ch90data[] = {
+0xf8,0x80,0x40,0x20,0x20,0x10,0x8,0xf8,
+};
+
+static const BitmapCharRec ch90 = {5,8,-1,0,7,ch90data};
+
+/* char: 0x59 'Y' */
+
+static const GLubyte ch89data[] = {
+0x10,0x10,0x10,0x28,0x28,0x44,0x44,0x82,
+};
+
+static const BitmapCharRec ch89 = {7,8,0,0,7,ch89data};
+
+/* char: 0x58 'X' */
+
+static const GLubyte ch88data[] = {
+0x88,0x88,0x50,0x50,0x20,0x50,0x88,0x88,
+};
+
+static const BitmapCharRec ch88 = {5,8,-1,0,7,ch88data};
+
+/* char: 0x57 'W' */
+
+static const GLubyte ch87data[] = {
+0x22,0x0,0x22,0x0,0x22,0x0,0x55,0x0,0x49,0x0,0x49,0x0,0x88,0x80,0x88,0x80,
+};
+
+static const BitmapCharRec ch87 = {9,8,0,0,9,ch87data};
+
+/* char: 0x56 'V' */
+
+static const GLubyte ch86data[] = {
+0x10,0x28,0x28,0x44,0x44,0x44,0x82,0x82,
+};
+
+static const BitmapCharRec ch86 = {7,8,0,0,7,ch86data};
+
+/* char: 0x55 'U' */
+
+static const GLubyte ch85data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x84,
+};
+
+static const BitmapCharRec ch85 = {6,8,-1,0,8,ch85data};
+
+/* char: 0x54 'T' */
+
+static const GLubyte ch84data[] = {
+0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xf8,
+};
+
+static const BitmapCharRec ch84 = {5,8,0,0,5,ch84data};
+
+/* char: 0x53 'S' */
+
+static const GLubyte ch83data[] = {
+0x70,0x88,0x88,0x8,0x70,0x80,0x88,0x70,
+};
+
+static const BitmapCharRec ch83 = {5,8,-1,0,7,ch83data};
+
+/* char: 0x52 'R' */
+
+static const GLubyte ch82data[] = {
+0x88,0x88,0x88,0x88,0xf0,0x88,0x88,0xf0,
+};
+
+static const BitmapCharRec ch82 = {5,8,-1,0,7,ch82data};
+
+/* char: 0x51 'Q' */
+
+static const GLubyte ch81data[] = {
+0x2,0x7c,0x8c,0x94,0x84,0x84,0x84,0x84,0x78,
+};
+
+static const BitmapCharRec ch81 = {7,9,-1,1,8,ch81data};
+
+/* char: 0x50 'P' */
+
+static const GLubyte ch80data[] = {
+0x80,0x80,0x80,0x80,0xf0,0x88,0x88,0xf0,
+};
+
+static const BitmapCharRec ch80 = {5,8,-1,0,7,ch80data};
+
+/* char: 0x4f 'O' */
+
+static const GLubyte ch79data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x78,
+};
+
+static const BitmapCharRec ch79 = {6,8,-1,0,8,ch79data};
+
+/* char: 0x4e 'N' */
+
+static const GLubyte ch78data[] = {
+0x8c,0x8c,0x94,0x94,0xa4,0xa4,0xc4,0xc4,
+};
+
+static const BitmapCharRec ch78 = {6,8,-1,0,8,ch78data};
+
+/* char: 0x4d 'M' */
+
+static const GLubyte ch77data[] = {
+0x92,0x92,0x92,0xaa,0xaa,0xc6,0xc6,0x82,
+};
+
+static const BitmapCharRec ch77 = {7,8,-1,0,9,ch77data};
+
+/* char: 0x4c 'L' */
+
+static const GLubyte ch76data[] = {
+0xf0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch76 = {4,8,-1,0,6,ch76data};
+
+/* char: 0x4b 'K' */
+
+static const GLubyte ch75data[] = {
+0x88,0x88,0x90,0x90,0xe0,0xa0,0x90,0x88,
+};
+
+static const BitmapCharRec ch75 = {5,8,-1,0,7,ch75data};
+
+/* char: 0x4a 'J' */
+
+static const GLubyte ch74data[] = {
+0x60,0x90,0x10,0x10,0x10,0x10,0x10,0x10,
+};
+
+static const BitmapCharRec ch74 = {4,8,0,0,5,ch74data};
+
+/* char: 0x49 'I' */
+
+static const GLubyte ch73data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch73 = {1,8,-1,0,3,ch73data};
+
+/* char: 0x48 'H' */
+
+static const GLubyte ch72data[] = {
+0x84,0x84,0x84,0x84,0xfc,0x84,0x84,0x84,
+};
+
+static const BitmapCharRec ch72 = {6,8,-1,0,8,ch72data};
+
+/* char: 0x47 'G' */
+
+static const GLubyte ch71data[] = {
+0x74,0x8c,0x84,0x8c,0x80,0x80,0x84,0x78,
+};
+
+static const BitmapCharRec ch71 = {6,8,-1,0,8,ch71data};
+
+/* char: 0x46 'F' */
+
+static const GLubyte ch70data[] = {
+0x80,0x80,0x80,0x80,0xf0,0x80,0x80,0xf8,
+};
+
+static const BitmapCharRec ch70 = {5,8,-1,0,6,ch70data};
+
+/* char: 0x45 'E' */
+
+static const GLubyte ch69data[] = {
+0xf8,0x80,0x80,0x80,0xf8,0x80,0x80,0xf8,
+};
+
+static const BitmapCharRec ch69 = {5,8,-1,0,7,ch69data};
+
+/* char: 0x44 'D' */
+
+static const GLubyte ch68data[] = {
+0xf0,0x88,0x84,0x84,0x84,0x84,0x88,0xf0,
+};
+
+static const BitmapCharRec ch68 = {6,8,-1,0,8,ch68data};
+
+/* char: 0x43 'C' */
+
+static const GLubyte ch67data[] = {
+0x78,0x84,0x80,0x80,0x80,0x80,0x84,0x78,
+};
+
+static const BitmapCharRec ch67 = {6,8,-1,0,8,ch67data};
+
+/* char: 0x42 'B' */
+
+static const GLubyte ch66data[] = {
+0xf0,0x88,0x88,0x88,0xf0,0x88,0x88,0xf0,
+};
+
+static const BitmapCharRec ch66 = {5,8,-1,0,7,ch66data};
+
+/* char: 0x41 'A' */
+
+static const GLubyte ch65data[] = {
+0x82,0x82,0x7c,0x44,0x28,0x28,0x10,0x10,
+};
+
+static const BitmapCharRec ch65 = {7,8,0,0,7,ch65data};
+
+/* char: 0x40 '@' */
+
+static const GLubyte ch64data[] = {
+0x3e,0x0,0x40,0x0,0x9b,0x0,0xa4,0x80,0xa4,0x80,0xa2,0x40,0x92,0x40,0x4d,0x40,
+0x20,0x80,0x1f,0x0,
+};
+
+static const BitmapCharRec ch64 = {10,10,0,2,11,ch64data};
+
+/* char: 0x3f '?' */
+
+static const GLubyte ch63data[] = {
+0x40,0x0,0x40,0x40,0x20,0x10,0x90,0x60,
+};
+
+static const BitmapCharRec ch63 = {4,8,-1,0,6,ch63data};
+
+/* char: 0x3e '>' */
+
+static const GLubyte ch62data[] = {
+0x80,0x40,0x20,0x40,0x80,
+};
+
+static const BitmapCharRec ch62 = {3,5,-1,-1,6,ch62data};
+
+/* char: 0x3d '=' */
+
+static const GLubyte ch61data[] = {
+0xf0,0x0,0xf0,
+};
+
+static const BitmapCharRec ch61 = {4,3,0,-2,5,ch61data};
+
+/* char: 0x3c '<' */
+
+static const GLubyte ch60data[] = {
+0x20,0x40,0x80,0x40,0x20,
+};
+
+static const BitmapCharRec ch60 = {3,5,-1,-1,6,ch60data};
+
+/* char: 0x3b ';' */
+
+static const GLubyte ch59data[] = {
+0x80,0x40,0x40,0x0,0x0,0x0,0x0,0x40,
+};
+
+static const BitmapCharRec ch59 = {2,8,0,2,3,ch59data};
+
+/* char: 0x3a ':' */
+
+static const GLubyte ch58data[] = {
+0x80,0x0,0x0,0x0,0x0,0x80,
+};
+
+static const BitmapCharRec ch58 = {1,6,-1,0,3,ch58data};
+
+/* char: 0x39 '9' */
+
+static const GLubyte ch57data[] = {
+0x70,0x88,0x8,0x68,0x98,0x88,0x88,0x70,
+};
+
+static const BitmapCharRec ch57 = {5,8,0,0,6,ch57data};
+
+/* char: 0x38 '8' */
+
+static const GLubyte ch56data[] = {
+0x70,0x88,0x88,0x88,0x70,0x88,0x88,0x70,
+};
+
+static const BitmapCharRec ch56 = {5,8,0,0,6,ch56data};
+
+/* char: 0x37 '7' */
+
+static const GLubyte ch55data[] = {
+0x40,0x40,0x20,0x20,0x10,0x10,0x8,0xf8,
+};
+
+static const BitmapCharRec ch55 = {5,8,0,0,6,ch55data};
+
+/* char: 0x36 '6' */
+
+static const GLubyte ch54data[] = {
+0x70,0x88,0x88,0xc8,0xb0,0x80,0x88,0x70,
+};
+
+static const BitmapCharRec ch54 = {5,8,0,0,6,ch54data};
+
+/* char: 0x35 '5' */
+
+static const GLubyte ch53data[] = {
+0x70,0x88,0x8,0x8,0xf0,0x80,0x80,0xf8,
+};
+
+static const BitmapCharRec ch53 = {5,8,0,0,6,ch53data};
+
+/* char: 0x34 '4' */
+
+static const GLubyte ch52data[] = {
+0x10,0x10,0xf8,0x90,0x50,0x50,0x30,0x10,
+};
+
+static const BitmapCharRec ch52 = {5,8,0,0,6,ch52data};
+
+/* char: 0x33 '3' */
+
+static const GLubyte ch51data[] = {
+0x70,0x88,0x8,0x8,0x30,0x8,0x88,0x70,
+};
+
+static const BitmapCharRec ch51 = {5,8,0,0,6,ch51data};
+
+/* char: 0x32 '2' */
+
+static const GLubyte ch50data[] = {
+0xf8,0x80,0x40,0x30,0x8,0x8,0x88,0x70,
+};
+
+static const BitmapCharRec ch50 = {5,8,0,0,6,ch50data};
+
+/* char: 0x31 '1' */
+
+static const GLubyte ch49data[] = {
+0x40,0x40,0x40,0x40,0x40,0x40,0xc0,0x40,
+};
+
+static const BitmapCharRec ch49 = {2,8,-1,0,6,ch49data};
+
+/* char: 0x30 '0' */
+
+static const GLubyte ch48data[] = {
+0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x70,
+};
+
+static const BitmapCharRec ch48 = {5,8,0,0,6,ch48data};
+
+/* char: 0x2f '/' */
+
+static const GLubyte ch47data[] = {
+0x80,0x80,0x40,0x40,0x40,0x40,0x20,0x20,
+};
+
+static const BitmapCharRec ch47 = {3,8,0,0,3,ch47data};
+
+/* char: 0x2e '.' */
+
+static const GLubyte ch46data[] = {
+0x80,
+};
+
+static const BitmapCharRec ch46 = {1,1,-1,0,3,ch46data};
+
+/* char: 0x2d '-' */
+
+static const GLubyte ch45data[] = {
+0xf8,
+};
+
+static const BitmapCharRec ch45 = {5,1,-1,-3,7,ch45data};
+
+/* char: 0x2c ',' */
+
+static const GLubyte ch44data[] = {
+0x80,0x40,0x40,
+};
+
+static const BitmapCharRec ch44 = {2,3,0,2,3,ch44data};
+
+/* char: 0x2b '+' */
+
+static const GLubyte ch43data[] = {
+0x20,0x20,0xf8,0x20,0x20,
+};
+
+static const BitmapCharRec ch43 = {5,5,0,-1,6,ch43data};
+
+/* char: 0x2a '*' */
+
+static const GLubyte ch42data[] = {
+0xa0,0x40,0xa0,
+};
+
+static const BitmapCharRec ch42 = {3,3,0,-5,4,ch42data};
+
+/* char: 0x29 ')' */
+
+static const GLubyte ch41data[] = {
+0x80,0x40,0x40,0x20,0x20,0x20,0x20,0x40,0x40,0x80,
+};
+
+static const BitmapCharRec ch41 = {3,10,-1,2,4,ch41data};
+
+/* char: 0x28 '(' */
+
+static const GLubyte ch40data[] = {
+0x20,0x40,0x40,0x80,0x80,0x80,0x80,0x40,0x40,0x20,
+};
+
+static const BitmapCharRec ch40 = {3,10,0,2,4,ch40data};
+
+/* char: 0x27 ''' */
+
+static const GLubyte ch39data[] = {
+0x80,0x40,0x40,
+};
+
+static const BitmapCharRec ch39 = {2,3,-1,-5,3,ch39data};
+
+/* char: 0x26 '&' */
+
+static const GLubyte ch38data[] = {
+0x64,0x98,0x98,0xa4,0x60,0x50,0x50,0x20,
+};
+
+static const BitmapCharRec ch38 = {6,8,-1,0,8,ch38data};
+
+/* char: 0x25 '%' */
+
+static const GLubyte ch37data[] = {
+0x26,0x29,0x16,0x10,0x8,0x68,0x94,0x64,
+};
+
+static const BitmapCharRec ch37 = {8,8,0,0,9,ch37data};
+
+/* char: 0x24 '$' */
+
+static const GLubyte ch36data[] = {
+0x20,0x70,0xa8,0x28,0x70,0xa0,0xa8,0x70,0x20,
+};
+
+static const BitmapCharRec ch36 = {5,9,0,1,6,ch36data};
+
+/* char: 0x23 '#' */
+
+static const GLubyte ch35data[] = {
+0x50,0x50,0xf8,0x28,0x7c,0x28,0x28,
+};
+
+static const BitmapCharRec ch35 = {6,7,0,0,6,ch35data};
+
+/* char: 0x22 '"' */
+
+static const GLubyte ch34data[] = {
+0xa0,0xa0,
+};
+
+static const BitmapCharRec ch34 = {3,2,-1,-6,4,ch34data};
+
+/* char: 0x21 '!' */
+
+static const GLubyte ch33data[] = {
+0x80,0x0,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch33 = {1,8,-1,0,3,ch33data};
+
+/* char: 0x20 ' ' */
+
+#ifdef _WIN32
+/* XXX Work around Microsoft OpenGL 1.1 bug where glBitmap with
+ a height or width of zero does not advance the raster position
+ as specified by OpenGL. (Cosmo OpenGL does not have this bug.) */
+static const GLubyte ch32data[] = { 0x0 };
+static const BitmapCharRec ch32 = {0,0,0,0,3,ch32data};
+#else
+static const BitmapCharRec ch32 = {0,0,0,0,3,0};
+#endif
+
+static const BitmapCharRec * const chars[] = {
+&ch32,
+&ch33,
+&ch34,
+&ch35,
+&ch36,
+&ch37,
+&ch38,
+&ch39,
+&ch40,
+&ch41,
+&ch42,
+&ch43,
+&ch44,
+&ch45,
+&ch46,
+&ch47,
+&ch48,
+&ch49,
+&ch50,
+&ch51,
+&ch52,
+&ch53,
+&ch54,
+&ch55,
+&ch56,
+&ch57,
+&ch58,
+&ch59,
+&ch60,
+&ch61,
+&ch62,
+&ch63,
+&ch64,
+&ch65,
+&ch66,
+&ch67,
+&ch68,
+&ch69,
+&ch70,
+&ch71,
+&ch72,
+&ch73,
+&ch74,
+&ch75,
+&ch76,
+&ch77,
+&ch78,
+&ch79,
+&ch80,
+&ch81,
+&ch82,
+&ch83,
+&ch84,
+&ch85,
+&ch86,
+&ch87,
+&ch88,
+&ch89,
+&ch90,
+&ch91,
+&ch92,
+&ch93,
+&ch94,
+&ch95,
+&ch96,
+&ch97,
+&ch98,
+&ch99,
+&ch100,
+&ch101,
+&ch102,
+&ch103,
+&ch104,
+&ch105,
+&ch106,
+&ch107,
+&ch108,
+&ch109,
+&ch110,
+&ch111,
+&ch112,
+&ch113,
+&ch114,
+&ch115,
+&ch116,
+&ch117,
+&ch118,
+&ch119,
+&ch120,
+&ch121,
+&ch122,
+&ch123,
+&ch124,
+&ch125,
+&ch126,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+&ch160,
+&ch161,
+&ch162,
+&ch163,
+&ch164,
+&ch165,
+&ch166,
+&ch167,
+&ch168,
+&ch169,
+&ch170,
+&ch171,
+&ch172,
+&ch173,
+&ch174,
+&ch175,
+&ch176,
+&ch177,
+&ch178,
+&ch179,
+&ch180,
+&ch181,
+&ch182,
+&ch183,
+&ch184,
+&ch185,
+&ch186,
+&ch187,
+&ch188,
+&ch189,
+&ch190,
+&ch191,
+&ch192,
+&ch193,
+&ch194,
+&ch195,
+&ch196,
+&ch197,
+&ch198,
+&ch199,
+&ch200,
+&ch201,
+&ch202,
+&ch203,
+&ch204,
+&ch205,
+&ch206,
+&ch207,
+&ch208,
+&ch209,
+&ch210,
+&ch211,
+&ch212,
+&ch213,
+&ch214,
+&ch215,
+&ch216,
+&ch217,
+&ch218,
+&ch219,
+&ch220,
+&ch221,
+&ch222,
+&ch223,
+&ch224,
+&ch225,
+&ch226,
+&ch227,
+&ch228,
+&ch229,
+&ch230,
+&ch231,
+&ch232,
+&ch233,
+&ch234,
+&ch235,
+&ch236,
+&ch237,
+&ch238,
+&ch239,
+&ch240,
+&ch241,
+&ch242,
+&ch243,
+&ch244,
+&ch245,
+&ch246,
+&ch247,
+&ch248,
+&ch249,
+&ch250,
+&ch251,
+&ch252,
+&ch253,
+&ch254,
+&ch255,
+};
+
+#if !defined(__IBMCPP__)
+const
+#endif
+BitmapFontRec glutBitmapHelvetica10 = {
+"-adobe-helvetica-medium-r-normal--10-100-75-75-p-56-iso8859-1",
+224,
+32,
+chars
+};
+
diff --git a/src/glut/os2/glut_hel12.cpp b/src/glut/os2/glut_hel12.cpp
new file mode 100644
index 00000000000..cbd0548b930
--- /dev/null
+++ b/src/glut/os2/glut_hel12.cpp
@@ -0,0 +1,1791 @@
+
+/* GENERATED FILE -- DO NOT MODIFY */
+
+#define glutBitmapHelvetica12 XXX
+#include "glutbitmap.h"
+#undef glutBitmapHelvetica12
+
+/* char: 0xff */
+
+static const GLubyte ch255data[] = {
+0xc0,0x20,0x20,0x20,0x30,0x50,0x50,0x48,0x88,0x88,0x0,0x50,
+};
+
+static const BitmapCharRec ch255 = {5,12,-1,3,7,ch255data};
+
+/* char: 0xfe */
+
+static const GLubyte ch254data[] = {
+0x80,0x80,0x80,0xb0,0xc8,0x88,0x88,0x88,0xc8,0xb0,0x80,0x80,
+};
+
+static const BitmapCharRec ch254 = {5,12,-1,3,7,ch254data};
+
+/* char: 0xfd */
+
+static const GLubyte ch253data[] = {
+0x80,0x40,0x20,0x20,0x50,0x50,0x90,0x88,0x88,0x88,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch253 = {5,13,-1,3,7,ch253data};
+
+/* char: 0xfc */
+
+static const GLubyte ch252data[] = {
+0x68,0x98,0x88,0x88,0x88,0x88,0x88,0x0,0x50,
+};
+
+static const BitmapCharRec ch252 = {5,9,-1,0,7,ch252data};
+
+/* char: 0xfb */
+
+static const GLubyte ch251data[] = {
+0x68,0x98,0x88,0x88,0x88,0x88,0x88,0x0,0x50,0x20,
+};
+
+static const BitmapCharRec ch251 = {5,10,-1,0,7,ch251data};
+
+/* char: 0xfa */
+
+static const GLubyte ch250data[] = {
+0x68,0x98,0x88,0x88,0x88,0x88,0x88,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch250 = {5,10,-1,0,7,ch250data};
+
+/* char: 0xf9 */
+
+static const GLubyte ch249data[] = {
+0x68,0x98,0x88,0x88,0x88,0x88,0x88,0x0,0x20,0x40,
+};
+
+static const BitmapCharRec ch249 = {5,10,-1,0,7,ch249data};
+
+/* char: 0xf8 */
+
+static const GLubyte ch248data[] = {
+0xb8,0x44,0x64,0x54,0x4c,0x44,0x3a,
+};
+
+static const BitmapCharRec ch248 = {7,7,0,0,7,ch248data};
+
+/* char: 0xf7 */
+
+static const GLubyte ch247data[] = {
+0x20,0x0,0xf8,0x0,0x20,
+};
+
+static const BitmapCharRec ch247 = {5,5,-1,-1,7,ch247data};
+
+/* char: 0xf6 */
+
+static const GLubyte ch246data[] = {
+0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x0,0x50,
+};
+
+static const BitmapCharRec ch246 = {5,9,-1,0,7,ch246data};
+
+/* char: 0xf5 */
+
+static const GLubyte ch245data[] = {
+0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x0,0x50,0x28,
+};
+
+static const BitmapCharRec ch245 = {5,10,-1,0,7,ch245data};
+
+/* char: 0xf4 */
+
+static const GLubyte ch244data[] = {
+0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x0,0x50,0x20,
+};
+
+static const BitmapCharRec ch244 = {5,10,-1,0,7,ch244data};
+
+/* char: 0xf3 */
+
+static const GLubyte ch243data[] = {
+0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch243 = {5,10,-1,0,7,ch243data};
+
+/* char: 0xf2 */
+
+static const GLubyte ch242data[] = {
+0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x0,0x20,0x40,
+};
+
+static const BitmapCharRec ch242 = {5,10,-1,0,7,ch242data};
+
+/* char: 0xf1 */
+
+static const GLubyte ch241data[] = {
+0x88,0x88,0x88,0x88,0x88,0xc8,0xb0,0x0,0x50,0x28,
+};
+
+static const BitmapCharRec ch241 = {5,10,-1,0,7,ch241data};
+
+/* char: 0xf0 */
+
+static const GLubyte ch240data[] = {
+0x70,0x88,0x88,0x88,0x88,0x78,0x8,0x50,0x30,0x68,
+};
+
+static const BitmapCharRec ch240 = {5,10,-1,0,7,ch240data};
+
+/* char: 0xef */
+
+static const GLubyte ch239data[] = {
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x0,0xa0,
+};
+
+static const BitmapCharRec ch239 = {3,9,0,0,3,ch239data};
+
+/* char: 0xee */
+
+static const GLubyte ch238data[] = {
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x0,0xa0,0x40,
+};
+
+static const BitmapCharRec ch238 = {3,10,0,0,3,ch238data};
+
+/* char: 0xed */
+
+static const GLubyte ch237data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x0,0x80,0x40,
+};
+
+static const BitmapCharRec ch237 = {2,10,-1,0,3,ch237data};
+
+/* char: 0xec */
+
+static const GLubyte ch236data[] = {
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x0,0x40,0x80,
+};
+
+static const BitmapCharRec ch236 = {2,10,0,0,3,ch236data};
+
+/* char: 0xeb */
+
+static const GLubyte ch235data[] = {
+0x70,0x88,0x80,0xf8,0x88,0x88,0x70,0x0,0x50,
+};
+
+static const BitmapCharRec ch235 = {5,9,-1,0,7,ch235data};
+
+/* char: 0xea */
+
+static const GLubyte ch234data[] = {
+0x70,0x88,0x80,0xf8,0x88,0x88,0x70,0x0,0x50,0x20,
+};
+
+static const BitmapCharRec ch234 = {5,10,-1,0,7,ch234data};
+
+/* char: 0xe9 */
+
+static const GLubyte ch233data[] = {
+0x70,0x88,0x80,0xf8,0x88,0x88,0x70,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch233 = {5,10,-1,0,7,ch233data};
+
+/* char: 0xe8 */
+
+static const GLubyte ch232data[] = {
+0x70,0x88,0x80,0xf8,0x88,0x88,0x70,0x0,0x20,0x40,
+};
+
+static const BitmapCharRec ch232 = {5,10,-1,0,7,ch232data};
+
+/* char: 0xe7 */
+
+static const GLubyte ch231data[] = {
+0x60,0x10,0x20,0x70,0x88,0x80,0x80,0x80,0x88,0x70,
+};
+
+static const BitmapCharRec ch231 = {5,10,-1,3,7,ch231data};
+
+/* char: 0xe6 */
+
+static const GLubyte ch230data[] = {
+0x77,0x0,0x88,0x80,0x88,0x0,0x7f,0x80,0x8,0x80,0x88,0x80,0x77,0x0,
+};
+
+static const BitmapCharRec ch230 = {9,7,-1,0,11,ch230data};
+
+/* char: 0xe5 */
+
+static const GLubyte ch229data[] = {
+0x74,0x88,0x88,0x78,0x8,0x88,0x70,0x30,0x48,0x30,
+};
+
+static const BitmapCharRec ch229 = {6,10,-1,0,7,ch229data};
+
+/* char: 0xe4 */
+
+static const GLubyte ch228data[] = {
+0x74,0x88,0x88,0x78,0x8,0x88,0x70,0x0,0x50,
+};
+
+static const BitmapCharRec ch228 = {6,9,-1,0,7,ch228data};
+
+/* char: 0xe3 */
+
+static const GLubyte ch227data[] = {
+0x74,0x88,0x88,0x78,0x8,0x88,0x70,0x0,0x50,0x28,
+};
+
+static const BitmapCharRec ch227 = {6,10,-1,0,7,ch227data};
+
+/* char: 0xe2 */
+
+static const GLubyte ch226data[] = {
+0x74,0x88,0x88,0x78,0x8,0x88,0x70,0x0,0x50,0x20,
+};
+
+static const BitmapCharRec ch226 = {6,10,-1,0,7,ch226data};
+
+/* char: 0xe1 */
+
+static const GLubyte ch225data[] = {
+0x74,0x88,0x88,0x78,0x8,0x88,0x70,0x0,0x20,0x10,
+};
+
+static const BitmapCharRec ch225 = {6,10,-1,0,7,ch225data};
+
+/* char: 0xe0 */
+
+static const GLubyte ch224data[] = {
+0x74,0x88,0x88,0x78,0x8,0x88,0x70,0x0,0x10,0x20,
+};
+
+static const BitmapCharRec ch224 = {6,10,-1,0,7,ch224data};
+
+/* char: 0xdf */
+
+static const GLubyte ch223data[] = {
+0xb0,0x88,0x88,0x88,0xb0,0x88,0x88,0x88,0x70,
+};
+
+static const BitmapCharRec ch223 = {5,9,-1,0,7,ch223data};
+
+/* char: 0xde */
+
+static const GLubyte ch222data[] = {
+0x80,0x80,0xf8,0x84,0x84,0x84,0xf8,0x80,0x80,
+};
+
+static const BitmapCharRec ch222 = {6,9,-1,0,8,ch222data};
+
+/* char: 0xdd */
+
+static const GLubyte ch221data[] = {
+0x10,0x10,0x10,0x10,0x28,0x44,0x44,0x82,0x82,0x0,0x10,0x8,
+};
+
+static const BitmapCharRec ch221 = {7,12,-1,0,9,ch221data};
+
+/* char: 0xdc */
+
+static const GLubyte ch220data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x0,0x48,
+};
+
+static const BitmapCharRec ch220 = {6,11,-1,0,8,ch220data};
+
+/* char: 0xdb */
+
+static const GLubyte ch219data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x0,0x28,0x10,
+};
+
+static const BitmapCharRec ch219 = {6,12,-1,0,8,ch219data};
+
+/* char: 0xda */
+
+static const GLubyte ch218data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x0,0x10,0x8,
+};
+
+static const BitmapCharRec ch218 = {6,12,-1,0,8,ch218data};
+
+/* char: 0xd9 */
+
+static const GLubyte ch217data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x0,0x10,0x20,
+};
+
+static const BitmapCharRec ch217 = {6,12,-1,0,8,ch217data};
+
+/* char: 0xd8 */
+
+static const GLubyte ch216data[] = {
+0x80,0x0,0x5e,0x0,0x21,0x0,0x50,0x80,0x48,0x80,0x44,0x80,0x44,0x80,0x42,0x80,
+0x21,0x0,0x1e,0x80,0x0,0x40,
+};
+
+static const BitmapCharRec ch216 = {10,11,0,1,10,ch216data};
+
+/* char: 0xd7 */
+
+static const GLubyte ch215data[] = {
+0x88,0x50,0x20,0x50,0x88,
+};
+
+static const BitmapCharRec ch215 = {5,5,-1,-1,7,ch215data};
+
+/* char: 0xd6 */
+
+static const GLubyte ch214data[] = {
+0x3c,0x42,0x81,0x81,0x81,0x81,0x81,0x42,0x3c,0x0,0x24,
+};
+
+static const BitmapCharRec ch214 = {8,11,-1,0,10,ch214data};
+
+/* char: 0xd5 */
+
+static const GLubyte ch213data[] = {
+0x3c,0x42,0x81,0x81,0x81,0x81,0x81,0x42,0x3c,0x0,0x28,0x14,
+};
+
+static const BitmapCharRec ch213 = {8,12,-1,0,10,ch213data};
+
+/* char: 0xd4 */
+
+static const GLubyte ch212data[] = {
+0x3c,0x42,0x81,0x81,0x81,0x81,0x81,0x42,0x3c,0x0,0x14,0x8,
+};
+
+static const BitmapCharRec ch212 = {8,12,-1,0,10,ch212data};
+
+/* char: 0xd3 */
+
+static const GLubyte ch211data[] = {
+0x3c,0x42,0x81,0x81,0x81,0x81,0x81,0x42,0x3c,0x0,0x8,0x4,
+};
+
+static const BitmapCharRec ch211 = {8,12,-1,0,10,ch211data};
+
+/* char: 0xd2 */
+
+static const GLubyte ch210data[] = {
+0x3c,0x42,0x81,0x81,0x81,0x81,0x81,0x42,0x3c,0x0,0x8,0x10,
+};
+
+static const BitmapCharRec ch210 = {8,12,-1,0,10,ch210data};
+
+/* char: 0xd1 */
+
+static const GLubyte ch209data[] = {
+0x82,0x86,0x8a,0x8a,0x92,0xa2,0xa2,0xc2,0x82,0x0,0x28,0x14,
+};
+
+static const BitmapCharRec ch209 = {7,12,-1,0,9,ch209data};
+
+/* char: 0xd0 */
+
+static const GLubyte ch208data[] = {
+0x7c,0x42,0x41,0x41,0xf1,0x41,0x41,0x42,0x7c,
+};
+
+static const BitmapCharRec ch208 = {8,9,0,0,9,ch208data};
+
+/* char: 0xcf */
+
+static const GLubyte ch207data[] = {
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x0,0xa0,
+};
+
+static const BitmapCharRec ch207 = {3,11,0,0,3,ch207data};
+
+/* char: 0xce */
+
+static const GLubyte ch206data[] = {
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x0,0xa0,0x40,
+};
+
+static const BitmapCharRec ch206 = {3,12,0,0,3,ch206data};
+
+/* char: 0xcd */
+
+static const GLubyte ch205data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x0,0x80,0x40,
+};
+
+static const BitmapCharRec ch205 = {2,12,-1,0,3,ch205data};
+
+/* char: 0xcc */
+
+static const GLubyte ch204data[] = {
+0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x0,0x40,0x80,
+};
+
+static const BitmapCharRec ch204 = {2,12,0,0,3,ch204data};
+
+/* char: 0xcb */
+
+static const GLubyte ch203data[] = {
+0xfc,0x80,0x80,0x80,0xfc,0x80,0x80,0x80,0xfc,0x0,0x28,
+};
+
+static const BitmapCharRec ch203 = {6,11,-1,0,8,ch203data};
+
+/* char: 0xca */
+
+static const GLubyte ch202data[] = {
+0xfc,0x80,0x80,0x80,0xfc,0x80,0x80,0x80,0xfc,0x0,0x28,0x10,
+};
+
+static const BitmapCharRec ch202 = {6,12,-1,0,8,ch202data};
+
+/* char: 0xc9 */
+
+static const GLubyte ch201data[] = {
+0xfc,0x80,0x80,0x80,0xfc,0x80,0x80,0x80,0xfc,0x0,0x10,0x8,
+};
+
+static const BitmapCharRec ch201 = {6,12,-1,0,8,ch201data};
+
+/* char: 0xc8 */
+
+static const GLubyte ch200data[] = {
+0xfc,0x80,0x80,0x80,0xfc,0x80,0x80,0x80,0xfc,0x0,0x10,0x20,
+};
+
+static const BitmapCharRec ch200 = {6,12,-1,0,8,ch200data};
+
+/* char: 0xc7 */
+
+static const GLubyte ch199data[] = {
+0x30,0x8,0x8,0x3c,0x42,0x80,0x80,0x80,0x80,0x80,0x42,0x3c,
+};
+
+static const BitmapCharRec ch199 = {7,12,-1,3,9,ch199data};
+
+/* char: 0xc6 */
+
+static const GLubyte ch198data[] = {
+0x8f,0x80,0x88,0x0,0x88,0x0,0x78,0x0,0x4f,0x80,0x48,0x0,0x28,0x0,0x28,0x0,
+0x1f,0x80,
+};
+
+static const BitmapCharRec ch198 = {9,9,-1,0,11,ch198data};
+
+/* char: 0xc5 */
+
+static const GLubyte ch197data[] = {
+0x82,0x82,0x82,0x7c,0x44,0x44,0x28,0x10,0x10,0x10,0x28,0x10,
+};
+
+static const BitmapCharRec ch197 = {7,12,-1,0,9,ch197data};
+
+/* char: 0xc4 */
+
+static const GLubyte ch196data[] = {
+0x82,0x82,0x82,0x7c,0x44,0x44,0x28,0x10,0x10,0x0,0x28,
+};
+
+static const BitmapCharRec ch196 = {7,11,-1,0,9,ch196data};
+
+/* char: 0xc3 */
+
+static const GLubyte ch195data[] = {
+0x82,0x82,0x82,0x7c,0x44,0x44,0x28,0x10,0x10,0x0,0x28,0x14,
+};
+
+static const BitmapCharRec ch195 = {7,12,-1,0,9,ch195data};
+
+/* char: 0xc2 */
+
+static const GLubyte ch194data[] = {
+0x82,0x82,0x82,0x7c,0x44,0x44,0x28,0x10,0x10,0x0,0x28,0x10,
+};
+
+static const BitmapCharRec ch194 = {7,12,-1,0,9,ch194data};
+
+/* char: 0xc1 */
+
+static const GLubyte ch193data[] = {
+0x82,0x82,0x82,0x7c,0x44,0x44,0x28,0x10,0x10,0x0,0x10,0x8,
+};
+
+static const BitmapCharRec ch193 = {7,12,-1,0,9,ch193data};
+
+/* char: 0xc0 */
+
+static const GLubyte ch192data[] = {
+0x82,0x82,0x82,0x7c,0x44,0x44,0x28,0x10,0x10,0x0,0x10,0x20,
+};
+
+static const BitmapCharRec ch192 = {7,12,-1,0,9,ch192data};
+
+/* char: 0xbf */
+
+static const GLubyte ch191data[] = {
+0x70,0x88,0x88,0x40,0x40,0x20,0x20,0x0,0x20,
+};
+
+static const BitmapCharRec ch191 = {5,9,-1,3,7,ch191data};
+
+/* char: 0xbe */
+
+static const GLubyte ch190data[] = {
+0x21,0x0,0x17,0x80,0x15,0x0,0xb,0x0,0xc9,0x0,0x24,0x0,0x44,0x0,0x22,0x0,
+0xe1,0x0,
+};
+
+static const BitmapCharRec ch190 = {9,9,0,0,10,ch190data};
+
+/* char: 0xbd */
+
+static const GLubyte ch189data[] = {
+0x47,0x80,0x22,0x0,0x11,0x0,0x14,0x80,0x4b,0x0,0x48,0x0,0x44,0x0,0xc2,0x0,
+0x41,0x0,
+};
+
+static const BitmapCharRec ch189 = {9,9,0,0,10,ch189data};
+
+/* char: 0xbc */
+
+static const GLubyte ch188data[] = {
+0x41,0x0,0x27,0x80,0x15,0x0,0x13,0x0,0x49,0x0,0x44,0x0,0x44,0x0,0xc2,0x0,
+0x41,0x0,
+};
+
+static const BitmapCharRec ch188 = {9,9,0,0,10,ch188data};
+
+/* char: 0xbb */
+
+static const GLubyte ch187data[] = {
+0xa0,0x50,0x28,0x50,0xa0,
+};
+
+static const BitmapCharRec ch187 = {5,5,-1,-1,7,ch187data};
+
+/* char: 0xba */
+
+static const GLubyte ch186data[] = {
+0xe0,0x0,0xe0,0xa0,0xe0,
+};
+
+static const BitmapCharRec ch186 = {3,5,-1,-4,5,ch186data};
+
+/* char: 0xb9 */
+
+static const GLubyte ch185data[] = {
+0x40,0x40,0x40,0xc0,0x40,
+};
+
+static const BitmapCharRec ch185 = {2,5,-1,-3,4,ch185data};
+
+/* char: 0xb8 */
+
+static const GLubyte ch184data[] = {
+0xc0,0x20,0x20,0x40,
+};
+
+static const BitmapCharRec ch184 = {3,4,0,3,3,ch184data};
+
+/* char: 0xb7 */
+
+static const GLubyte ch183data[] = {
+0x80,
+};
+
+static const BitmapCharRec ch183 = {1,1,-1,-3,3,ch183data};
+
+/* char: 0xb6 */
+
+static const GLubyte ch182data[] = {
+0x28,0x28,0x28,0x28,0x28,0x28,0x68,0xe8,0xe8,0xe8,0x68,0x3c,
+};
+
+static const BitmapCharRec ch182 = {6,12,0,3,7,ch182data};
+
+/* char: 0xb5 */
+
+static const GLubyte ch181data[] = {
+0x80,0x80,0x80,0xe8,0x98,0x88,0x88,0x88,0x88,0x88,
+};
+
+static const BitmapCharRec ch181 = {5,10,-1,3,7,ch181data};
+
+/* char: 0xb4 */
+
+static const GLubyte ch180data[] = {
+0x80,0x40,
+};
+
+static const BitmapCharRec ch180 = {2,2,0,-8,2,ch180data};
+
+/* char: 0xb3 */
+
+static const GLubyte ch179data[] = {
+0xc0,0x20,0x40,0x20,0xe0,
+};
+
+static const BitmapCharRec ch179 = {3,5,0,-3,4,ch179data};
+
+/* char: 0xb2 */
+
+static const GLubyte ch178data[] = {
+0xf0,0x40,0x20,0x90,0x60,
+};
+
+static const BitmapCharRec ch178 = {4,5,0,-3,4,ch178data};
+
+/* char: 0xb1 */
+
+static const GLubyte ch177data[] = {
+0xf8,0x0,0x20,0x20,0xf8,0x20,0x20,
+};
+
+static const BitmapCharRec ch177 = {5,7,-1,0,7,ch177data};
+
+/* char: 0xb0 */
+
+static const GLubyte ch176data[] = {
+0x60,0x90,0x90,0x60,
+};
+
+static const BitmapCharRec ch176 = {4,4,0,-4,5,ch176data};
+
+/* char: 0xaf */
+
+static const GLubyte ch175data[] = {
+0xf0,
+};
+
+static const BitmapCharRec ch175 = {4,1,0,-8,4,ch175data};
+
+/* char: 0xae */
+
+static const GLubyte ch174data[] = {
+0x3e,0x0,0x41,0x0,0x94,0x80,0x94,0x80,0x98,0x80,0x94,0x80,0x9c,0x80,0x41,0x0,
+0x3e,0x0,
+};
+
+static const BitmapCharRec ch174 = {9,9,-1,0,11,ch174data};
+
+/* char: 0xad */
+
+static const GLubyte ch173data[] = {
+0xf0,
+};
+
+static const BitmapCharRec ch173 = {4,1,0,-3,5,ch173data};
+
+/* char: 0xac */
+
+static const GLubyte ch172data[] = {
+0x4,0x4,0x4,0xfc,
+};
+
+static const BitmapCharRec ch172 = {6,4,-1,-2,8,ch172data};
+
+/* char: 0xab */
+
+static const GLubyte ch171data[] = {
+0x28,0x50,0xa0,0x50,0x28,
+};
+
+static const BitmapCharRec ch171 = {5,5,-1,-1,7,ch171data};
+
+/* char: 0xaa */
+
+static const GLubyte ch170data[] = {
+0xe0,0x0,0xa0,0x20,0xe0,
+};
+
+static const BitmapCharRec ch170 = {3,5,-1,-4,5,ch170data};
+
+/* char: 0xa9 */
+
+static const GLubyte ch169data[] = {
+0x3e,0x0,0x41,0x0,0x9c,0x80,0xa2,0x80,0xa0,0x80,0xa2,0x80,0x9c,0x80,0x41,0x0,
+0x3e,0x0,
+};
+
+static const BitmapCharRec ch169 = {9,9,-1,0,11,ch169data};
+
+/* char: 0xa8 */
+
+static const GLubyte ch168data[] = {
+0xa0,
+};
+
+static const BitmapCharRec ch168 = {3,1,0,-8,3,ch168data};
+
+/* char: 0xa7 */
+
+static const GLubyte ch167data[] = {
+0x70,0x88,0x8,0x30,0x48,0x88,0x88,0x90,0x60,0x80,0x88,0x70,
+};
+
+static const BitmapCharRec ch167 = {5,12,0,3,6,ch167data};
+
+/* char: 0xa6 */
+
+static const GLubyte ch166data[] = {
+0x80,0x80,0x80,0x80,0x0,0x0,0x0,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch166 = {1,11,-1,2,3,ch166data};
+
+/* char: 0xa5 */
+
+static const GLubyte ch165data[] = {
+0x20,0x20,0xf8,0x20,0xf8,0x20,0x50,0x88,0x88,
+};
+
+static const BitmapCharRec ch165 = {5,9,-1,0,7,ch165data};
+
+/* char: 0xa4 */
+
+static const GLubyte ch164data[] = {
+0x84,0x78,0x48,0x48,0x78,0x84,
+};
+
+static const BitmapCharRec ch164 = {6,6,0,-1,7,ch164data};
+
+/* char: 0xa3 */
+
+static const GLubyte ch163data[] = {
+0xb0,0x48,0x20,0x20,0xf0,0x40,0x40,0x48,0x30,
+};
+
+static const BitmapCharRec ch163 = {5,9,-1,0,7,ch163data};
+
+/* char: 0xa2 */
+
+static const GLubyte ch162data[] = {
+0x40,0x70,0xc8,0xa0,0xa0,0xa0,0xa8,0x70,0x10,
+};
+
+static const BitmapCharRec ch162 = {5,9,-1,1,7,ch162data};
+
+/* char: 0xa1 */
+
+static const GLubyte ch161data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x0,0x80,
+};
+
+static const BitmapCharRec ch161 = {1,10,-1,3,3,ch161data};
+
+/* char: 0xa0 */
+
+#ifdef _WIN32
+/* XXX Work around Microsoft OpenGL 1.1 bug where glBitmap with
+ a height or width of zero does not advance the raster position
+ as specified by OpenGL. (Cosmo OpenGL does not have this bug.) */
+static const GLubyte ch160data[] = { 0x0 };
+static const BitmapCharRec ch160 = {1,1,0,0,4,ch160data};
+#else
+static const BitmapCharRec ch160 = {0,0,0,0,4,0};
+#endif
+
+/* char: 0x7e '~' */
+
+static const GLubyte ch126data[] = {
+0x98,0x64,
+};
+
+static const BitmapCharRec ch126 = {6,2,0,-3,7,ch126data};
+
+/* char: 0x7d '}' */
+
+static const GLubyte ch125data[] = {
+0xc0,0x20,0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0xc0,
+};
+
+static const BitmapCharRec ch125 = {4,12,0,3,4,ch125data};
+
+/* char: 0x7c '|' */
+
+static const GLubyte ch124data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch124 = {1,12,-1,3,3,ch124data};
+
+/* char: 0x7b '{' */
+
+static const GLubyte ch123data[] = {
+0x30,0x40,0x40,0x40,0x40,0x40,0x80,0x40,0x40,0x40,0x40,0x30,
+};
+
+static const BitmapCharRec ch123 = {4,12,0,3,4,ch123data};
+
+/* char: 0x7a 'z' */
+
+static const GLubyte ch122data[] = {
+0xf0,0x80,0x40,0x40,0x20,0x10,0xf0,
+};
+
+static const BitmapCharRec ch122 = {4,7,-1,0,6,ch122data};
+
+/* char: 0x79 'y' */
+
+static const GLubyte ch121data[] = {
+0x80,0x40,0x20,0x20,0x50,0x50,0x90,0x88,0x88,0x88,
+};
+
+static const BitmapCharRec ch121 = {5,10,-1,3,7,ch121data};
+
+/* char: 0x78 'x' */
+
+static const GLubyte ch120data[] = {
+0x84,0x84,0x48,0x30,0x30,0x48,0x84,
+};
+
+static const BitmapCharRec ch120 = {6,7,0,0,6,ch120data};
+
+/* char: 0x77 'w' */
+
+static const GLubyte ch119data[] = {
+0x22,0x0,0x22,0x0,0x55,0x0,0x49,0x0,0x49,0x0,0x88,0x80,0x88,0x80,
+};
+
+static const BitmapCharRec ch119 = {9,7,0,0,9,ch119data};
+
+/* char: 0x76 'v' */
+
+static const GLubyte ch118data[] = {
+0x20,0x20,0x50,0x50,0x88,0x88,0x88,
+};
+
+static const BitmapCharRec ch118 = {5,7,-1,0,7,ch118data};
+
+/* char: 0x75 'u' */
+
+static const GLubyte ch117data[] = {
+0x68,0x98,0x88,0x88,0x88,0x88,0x88,
+};
+
+static const BitmapCharRec ch117 = {5,7,-1,0,7,ch117data};
+
+/* char: 0x74 't' */
+
+static const GLubyte ch116data[] = {
+0x60,0x40,0x40,0x40,0x40,0x40,0xe0,0x40,0x40,
+};
+
+static const BitmapCharRec ch116 = {3,9,0,0,3,ch116data};
+
+/* char: 0x73 's' */
+
+static const GLubyte ch115data[] = {
+0x60,0x90,0x10,0x60,0x80,0x90,0x60,
+};
+
+static const BitmapCharRec ch115 = {4,7,-1,0,6,ch115data};
+
+/* char: 0x72 'r' */
+
+static const GLubyte ch114data[] = {
+0x80,0x80,0x80,0x80,0x80,0xc0,0xa0,
+};
+
+static const BitmapCharRec ch114 = {3,7,-1,0,4,ch114data};
+
+/* char: 0x71 'q' */
+
+static const GLubyte ch113data[] = {
+0x8,0x8,0x8,0x68,0x98,0x88,0x88,0x88,0x98,0x68,
+};
+
+static const BitmapCharRec ch113 = {5,10,-1,3,7,ch113data};
+
+/* char: 0x70 'p' */
+
+static const GLubyte ch112data[] = {
+0x80,0x80,0x80,0xb0,0xc8,0x88,0x88,0x88,0xc8,0xb0,
+};
+
+static const BitmapCharRec ch112 = {5,10,-1,3,7,ch112data};
+
+/* char: 0x6f 'o' */
+
+static const GLubyte ch111data[] = {
+0x70,0x88,0x88,0x88,0x88,0x88,0x70,
+};
+
+static const BitmapCharRec ch111 = {5,7,-1,0,7,ch111data};
+
+/* char: 0x6e 'n' */
+
+static const GLubyte ch110data[] = {
+0x88,0x88,0x88,0x88,0x88,0xc8,0xb0,
+};
+
+static const BitmapCharRec ch110 = {5,7,-1,0,7,ch110data};
+
+/* char: 0x6d 'm' */
+
+static const GLubyte ch109data[] = {
+0x92,0x92,0x92,0x92,0x92,0xda,0xa4,
+};
+
+static const BitmapCharRec ch109 = {7,7,-1,0,9,ch109data};
+
+/* char: 0x6c 'l' */
+
+static const GLubyte ch108data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch108 = {1,9,-1,0,3,ch108data};
+
+/* char: 0x6b 'k' */
+
+static const GLubyte ch107data[] = {
+0x88,0x90,0xa0,0xc0,0xc0,0xa0,0x90,0x80,0x80,
+};
+
+static const BitmapCharRec ch107 = {5,9,-1,0,6,ch107data};
+
+/* char: 0x6a 'j' */
+
+static const GLubyte ch106data[] = {
+0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x0,0x40,
+};
+
+static const BitmapCharRec ch106 = {2,12,0,3,3,ch106data};
+
+/* char: 0x69 'i' */
+
+static const GLubyte ch105data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x0,0x80,
+};
+
+static const BitmapCharRec ch105 = {1,9,-1,0,3,ch105data};
+
+/* char: 0x68 'h' */
+
+static const GLubyte ch104data[] = {
+0x88,0x88,0x88,0x88,0x88,0xc8,0xb0,0x80,0x80,
+};
+
+static const BitmapCharRec ch104 = {5,9,-1,0,7,ch104data};
+
+/* char: 0x67 'g' */
+
+static const GLubyte ch103data[] = {
+0x70,0x88,0x8,0x68,0x98,0x88,0x88,0x88,0x98,0x68,
+};
+
+static const BitmapCharRec ch103 = {5,10,-1,3,7,ch103data};
+
+/* char: 0x66 'f' */
+
+static const GLubyte ch102data[] = {
+0x40,0x40,0x40,0x40,0x40,0x40,0xe0,0x40,0x30,
+};
+
+static const BitmapCharRec ch102 = {4,9,0,0,3,ch102data};
+
+/* char: 0x65 'e' */
+
+static const GLubyte ch101data[] = {
+0x70,0x88,0x80,0xf8,0x88,0x88,0x70,
+};
+
+static const BitmapCharRec ch101 = {5,7,-1,0,7,ch101data};
+
+/* char: 0x64 'd' */
+
+static const GLubyte ch100data[] = {
+0x68,0x98,0x88,0x88,0x88,0x98,0x68,0x8,0x8,
+};
+
+static const BitmapCharRec ch100 = {5,9,-1,0,7,ch100data};
+
+/* char: 0x63 'c' */
+
+static const GLubyte ch99data[] = {
+0x70,0x88,0x80,0x80,0x80,0x88,0x70,
+};
+
+static const BitmapCharRec ch99 = {5,7,-1,0,7,ch99data};
+
+/* char: 0x62 'b' */
+
+static const GLubyte ch98data[] = {
+0xb0,0xc8,0x88,0x88,0x88,0xc8,0xb0,0x80,0x80,
+};
+
+static const BitmapCharRec ch98 = {5,9,-1,0,7,ch98data};
+
+/* char: 0x61 'a' */
+
+static const GLubyte ch97data[] = {
+0x74,0x88,0x88,0x78,0x8,0x88,0x70,
+};
+
+static const BitmapCharRec ch97 = {6,7,-1,0,7,ch97data};
+
+/* char: 0x60 '`' */
+
+static const GLubyte ch96data[] = {
+0xc0,0x80,0x40,
+};
+
+static const BitmapCharRec ch96 = {2,3,0,-6,3,ch96data};
+
+/* char: 0x5f '_' */
+
+static const GLubyte ch95data[] = {
+0xfe,
+};
+
+static const BitmapCharRec ch95 = {7,1,0,2,7,ch95data};
+
+/* char: 0x5e '^' */
+
+static const GLubyte ch94data[] = {
+0x88,0x50,0x20,
+};
+
+static const BitmapCharRec ch94 = {5,3,0,-5,6,ch94data};
+
+/* char: 0x5d ']' */
+
+static const GLubyte ch93data[] = {
+0xc0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xc0,
+};
+
+static const BitmapCharRec ch93 = {2,12,0,3,3,ch93data};
+
+/* char: 0x5c '\' */
+
+static const GLubyte ch92data[] = {
+0x10,0x10,0x20,0x20,0x20,0x40,0x40,0x80,0x80,
+};
+
+static const BitmapCharRec ch92 = {4,9,0,0,4,ch92data};
+
+/* char: 0x5b '[' */
+
+static const GLubyte ch91data[] = {
+0xc0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xc0,
+};
+
+static const BitmapCharRec ch91 = {2,12,-1,3,3,ch91data};
+
+/* char: 0x5a 'Z' */
+
+static const GLubyte ch90data[] = {
+0xfe,0x80,0x40,0x20,0x10,0x8,0x4,0x2,0xfe,
+};
+
+static const BitmapCharRec ch90 = {7,9,-1,0,9,ch90data};
+
+/* char: 0x59 'Y' */
+
+static const GLubyte ch89data[] = {
+0x10,0x10,0x10,0x10,0x28,0x44,0x44,0x82,0x82,
+};
+
+static const BitmapCharRec ch89 = {7,9,-1,0,9,ch89data};
+
+/* char: 0x58 'X' */
+
+static const GLubyte ch88data[] = {
+0x82,0x44,0x44,0x28,0x10,0x28,0x44,0x44,0x82,
+};
+
+static const BitmapCharRec ch88 = {7,9,-1,0,9,ch88data};
+
+/* char: 0x57 'W' */
+
+static const GLubyte ch87data[] = {
+0x22,0x0,0x22,0x0,0x22,0x0,0x55,0x0,0x55,0x0,0x49,0x0,0x88,0x80,0x88,0x80,
+0x88,0x80,
+};
+
+static const BitmapCharRec ch87 = {9,9,-1,0,11,ch87data};
+
+/* char: 0x56 'V' */
+
+static const GLubyte ch86data[] = {
+0x10,0x10,0x28,0x28,0x44,0x44,0x44,0x82,0x82,
+};
+
+static const BitmapCharRec ch86 = {7,9,-1,0,9,ch86data};
+
+/* char: 0x55 'U' */
+
+static const GLubyte ch85data[] = {
+0x78,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,
+};
+
+static const BitmapCharRec ch85 = {6,9,-1,0,8,ch85data};
+
+/* char: 0x54 'T' */
+
+static const GLubyte ch84data[] = {
+0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0xfe,
+};
+
+static const BitmapCharRec ch84 = {7,9,0,0,7,ch84data};
+
+/* char: 0x53 'S' */
+
+static const GLubyte ch83data[] = {
+0x78,0x84,0x84,0x4,0x18,0x60,0x80,0x84,0x78,
+};
+
+static const BitmapCharRec ch83 = {6,9,-1,0,8,ch83data};
+
+/* char: 0x52 'R' */
+
+static const GLubyte ch82data[] = {
+0x84,0x84,0x84,0x88,0xf8,0x84,0x84,0x84,0xf8,
+};
+
+static const BitmapCharRec ch82 = {6,9,-1,0,8,ch82data};
+
+/* char: 0x51 'Q' */
+
+static const GLubyte ch81data[] = {
+0x3d,0x42,0x85,0x89,0x81,0x81,0x81,0x42,0x3c,
+};
+
+static const BitmapCharRec ch81 = {8,9,-1,0,10,ch81data};
+
+/* char: 0x50 'P' */
+
+static const GLubyte ch80data[] = {
+0x80,0x80,0x80,0x80,0xf8,0x84,0x84,0x84,0xf8,
+};
+
+static const BitmapCharRec ch80 = {6,9,-1,0,8,ch80data};
+
+/* char: 0x4f 'O' */
+
+static const GLubyte ch79data[] = {
+0x3c,0x42,0x81,0x81,0x81,0x81,0x81,0x42,0x3c,
+};
+
+static const BitmapCharRec ch79 = {8,9,-1,0,10,ch79data};
+
+/* char: 0x4e 'N' */
+
+static const GLubyte ch78data[] = {
+0x82,0x86,0x8a,0x8a,0x92,0xa2,0xa2,0xc2,0x82,
+};
+
+static const BitmapCharRec ch78 = {7,9,-1,0,9,ch78data};
+
+/* char: 0x4d 'M' */
+
+static const GLubyte ch77data[] = {
+0x88,0x80,0x88,0x80,0x94,0x80,0x94,0x80,0xa2,0x80,0xa2,0x80,0xc1,0x80,0xc1,0x80,
+0x80,0x80,
+};
+
+static const BitmapCharRec ch77 = {9,9,-1,0,11,ch77data};
+
+/* char: 0x4c 'L' */
+
+static const GLubyte ch76data[] = {
+0xf8,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch76 = {5,9,-1,0,7,ch76data};
+
+/* char: 0x4b 'K' */
+
+static const GLubyte ch75data[] = {
+0x82,0x84,0x88,0x90,0xe0,0xa0,0x90,0x88,0x84,
+};
+
+static const BitmapCharRec ch75 = {7,9,-1,0,8,ch75data};
+
+/* char: 0x4a 'J' */
+
+static const GLubyte ch74data[] = {
+0x70,0x88,0x88,0x8,0x8,0x8,0x8,0x8,0x8,
+};
+
+static const BitmapCharRec ch74 = {5,9,-1,0,7,ch74data};
+
+/* char: 0x49 'I' */
+
+static const GLubyte ch73data[] = {
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch73 = {1,9,-1,0,3,ch73data};
+
+/* char: 0x48 'H' */
+
+static const GLubyte ch72data[] = {
+0x82,0x82,0x82,0x82,0xfe,0x82,0x82,0x82,0x82,
+};
+
+static const BitmapCharRec ch72 = {7,9,-1,0,9,ch72data};
+
+/* char: 0x47 'G' */
+
+static const GLubyte ch71data[] = {
+0x3a,0x46,0x82,0x82,0x8e,0x80,0x80,0x42,0x3c,
+};
+
+static const BitmapCharRec ch71 = {7,9,-1,0,9,ch71data};
+
+/* char: 0x46 'F' */
+
+static const GLubyte ch70data[] = {
+0x80,0x80,0x80,0x80,0xf8,0x80,0x80,0x80,0xfc,
+};
+
+static const BitmapCharRec ch70 = {6,9,-1,0,8,ch70data};
+
+/* char: 0x45 'E' */
+
+static const GLubyte ch69data[] = {
+0xfc,0x80,0x80,0x80,0xfc,0x80,0x80,0x80,0xfc,
+};
+
+static const BitmapCharRec ch69 = {6,9,-1,0,8,ch69data};
+
+/* char: 0x44 'D' */
+
+static const GLubyte ch68data[] = {
+0xf8,0x84,0x82,0x82,0x82,0x82,0x82,0x84,0xf8,
+};
+
+static const BitmapCharRec ch68 = {7,9,-1,0,9,ch68data};
+
+/* char: 0x43 'C' */
+
+static const GLubyte ch67data[] = {
+0x3c,0x42,0x80,0x80,0x80,0x80,0x80,0x42,0x3c,
+};
+
+static const BitmapCharRec ch67 = {7,9,-1,0,9,ch67data};
+
+/* char: 0x42 'B' */
+
+static const GLubyte ch66data[] = {
+0xf8,0x84,0x84,0x84,0xf8,0x84,0x84,0x84,0xf8,
+};
+
+static const BitmapCharRec ch66 = {6,9,-1,0,8,ch66data};
+
+/* char: 0x41 'A' */
+
+static const GLubyte ch65data[] = {
+0x82,0x82,0x82,0x7c,0x44,0x44,0x28,0x28,0x10,
+};
+
+static const BitmapCharRec ch65 = {7,9,-1,0,9,ch65data};
+
+/* char: 0x40 '@' */
+
+static const GLubyte ch64data[] = {
+0x3e,0x0,0x40,0x0,0x9b,0x0,0xa6,0x80,0xa2,0x40,0xa2,0x40,0x92,0x40,0x4d,0x40,
+0x60,0x80,0x1f,0x0,
+};
+
+static const BitmapCharRec ch64 = {10,10,-1,1,12,ch64data};
+
+/* char: 0x3f '?' */
+
+static const GLubyte ch63data[] = {
+0x20,0x0,0x20,0x20,0x10,0x10,0x88,0x88,0x70,
+};
+
+static const BitmapCharRec ch63 = {5,9,-1,0,7,ch63data};
+
+/* char: 0x3e '>' */
+
+static const GLubyte ch62data[] = {
+0xc0,0x30,0xc,0x30,0xc0,
+};
+
+static const BitmapCharRec ch62 = {6,5,-1,-1,7,ch62data};
+
+/* char: 0x3d '=' */
+
+static const GLubyte ch61data[] = {
+0xf8,0x0,0xf8,
+};
+
+static const BitmapCharRec ch61 = {5,3,-1,-2,7,ch61data};
+
+/* char: 0x3c '<' */
+
+static const GLubyte ch60data[] = {
+0xc,0x30,0xc0,0x30,0xc,
+};
+
+static const BitmapCharRec ch60 = {6,5,0,-1,7,ch60data};
+
+/* char: 0x3b ';' */
+
+static const GLubyte ch59data[] = {
+0x80,0x40,0x40,0x0,0x0,0x0,0x0,0x40,
+};
+
+static const BitmapCharRec ch59 = {2,8,0,2,3,ch59data};
+
+/* char: 0x3a ':' */
+
+static const GLubyte ch58data[] = {
+0x80,0x0,0x0,0x0,0x0,0x80,
+};
+
+static const BitmapCharRec ch58 = {1,6,-1,0,3,ch58data};
+
+/* char: 0x39 '9' */
+
+static const GLubyte ch57data[] = {
+0x70,0x88,0x8,0x8,0x78,0x88,0x88,0x88,0x70,
+};
+
+static const BitmapCharRec ch57 = {5,9,-1,0,7,ch57data};
+
+/* char: 0x38 '8' */
+
+static const GLubyte ch56data[] = {
+0x70,0x88,0x88,0x88,0x88,0x70,0x88,0x88,0x70,
+};
+
+static const BitmapCharRec ch56 = {5,9,-1,0,7,ch56data};
+
+/* char: 0x37 '7' */
+
+static const GLubyte ch55data[] = {
+0x40,0x40,0x20,0x20,0x20,0x10,0x10,0x8,0xf8,
+};
+
+static const BitmapCharRec ch55 = {5,9,-1,0,7,ch55data};
+
+/* char: 0x36 '6' */
+
+static const GLubyte ch54data[] = {
+0x70,0x88,0x88,0x88,0xc8,0xb0,0x80,0x88,0x70,
+};
+
+static const BitmapCharRec ch54 = {5,9,-1,0,7,ch54data};
+
+/* char: 0x35 '5' */
+
+static const GLubyte ch53data[] = {
+0x70,0x88,0x88,0x8,0x8,0xf0,0x80,0x80,0xf8,
+};
+
+static const BitmapCharRec ch53 = {5,9,-1,0,7,ch53data};
+
+/* char: 0x34 '4' */
+
+static const GLubyte ch52data[] = {
+0x8,0x8,0xfc,0x88,0x48,0x28,0x28,0x18,0x8,
+};
+
+static const BitmapCharRec ch52 = {6,9,0,0,7,ch52data};
+
+/* char: 0x33 '3' */
+
+static const GLubyte ch51data[] = {
+0x70,0x88,0x88,0x8,0x8,0x30,0x8,0x88,0x70,
+};
+
+static const BitmapCharRec ch51 = {5,9,-1,0,7,ch51data};
+
+/* char: 0x32 '2' */
+
+static const GLubyte ch50data[] = {
+0xf8,0x80,0x80,0x40,0x20,0x10,0x8,0x88,0x70,
+};
+
+static const BitmapCharRec ch50 = {5,9,-1,0,7,ch50data};
+
+/* char: 0x31 '1' */
+
+static const GLubyte ch49data[] = {
+0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xe0,0x20,
+};
+
+static const BitmapCharRec ch49 = {3,9,-1,0,7,ch49data};
+
+/* char: 0x30 '0' */
+
+static const GLubyte ch48data[] = {
+0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x70,
+};
+
+static const BitmapCharRec ch48 = {5,9,-1,0,7,ch48data};
+
+/* char: 0x2f '/' */
+
+static const GLubyte ch47data[] = {
+0x80,0x80,0x40,0x40,0x40,0x20,0x20,0x10,0x10,
+};
+
+static const BitmapCharRec ch47 = {4,9,0,0,4,ch47data};
+
+/* char: 0x2e '.' */
+
+static const GLubyte ch46data[] = {
+0x80,
+};
+
+static const BitmapCharRec ch46 = {1,1,-1,0,3,ch46data};
+
+/* char: 0x2d '-' */
+
+static const GLubyte ch45data[] = {
+0xf8,
+};
+
+static const BitmapCharRec ch45 = {5,1,-1,-3,8,ch45data};
+
+/* char: 0x2c ',' */
+
+static const GLubyte ch44data[] = {
+0x80,0x40,0x40,
+};
+
+static const BitmapCharRec ch44 = {2,3,-1,2,4,ch44data};
+
+/* char: 0x2b '+' */
+
+static const GLubyte ch43data[] = {
+0x20,0x20,0xf8,0x20,0x20,
+};
+
+static const BitmapCharRec ch43 = {5,5,-1,-1,7,ch43data};
+
+/* char: 0x2a '*' */
+
+static const GLubyte ch42data[] = {
+0xa0,0x40,0xa0,
+};
+
+static const BitmapCharRec ch42 = {3,3,-1,-6,5,ch42data};
+
+/* char: 0x29 ')' */
+
+static const GLubyte ch41data[] = {
+0x80,0x40,0x40,0x20,0x20,0x20,0x20,0x20,0x20,0x40,0x40,0x80,
+};
+
+static const BitmapCharRec ch41 = {3,12,0,3,4,ch41data};
+
+/* char: 0x28 '(' */
+
+static const GLubyte ch40data[] = {
+0x20,0x40,0x40,0x80,0x80,0x80,0x80,0x80,0x80,0x40,0x40,0x20,
+};
+
+static const BitmapCharRec ch40 = {3,12,-1,3,4,ch40data};
+
+/* char: 0x27 ''' */
+
+static const GLubyte ch39data[] = {
+0x80,0x40,0xc0,
+};
+
+static const BitmapCharRec ch39 = {2,3,-1,-6,3,ch39data};
+
+/* char: 0x26 '&' */
+
+static const GLubyte ch38data[] = {
+0x72,0x8c,0x84,0x8a,0x50,0x30,0x48,0x48,0x30,
+};
+
+static const BitmapCharRec ch38 = {7,9,-1,0,9,ch38data};
+
+/* char: 0x25 '%' */
+
+static const GLubyte ch37data[] = {
+0x23,0x0,0x14,0x80,0x14,0x80,0x13,0x0,0x8,0x0,0x68,0x0,0x94,0x0,0x94,0x0,
+0x62,0x0,
+};
+
+static const BitmapCharRec ch37 = {9,9,-1,0,11,ch37data};
+
+/* char: 0x24 '$' */
+
+static const GLubyte ch36data[] = {
+0x20,0x70,0xa8,0xa8,0x28,0x70,0xa0,0xa8,0x70,0x20,
+};
+
+static const BitmapCharRec ch36 = {5,10,-1,1,7,ch36data};
+
+/* char: 0x23 '#' */
+
+static const GLubyte ch35data[] = {
+0x50,0x50,0x50,0xfc,0x28,0xfc,0x28,0x28,
+};
+
+static const BitmapCharRec ch35 = {6,8,0,0,7,ch35data};
+
+/* char: 0x22 '"' */
+
+static const GLubyte ch34data[] = {
+0xa0,0xa0,0xa0,
+};
+
+static const BitmapCharRec ch34 = {3,3,-1,-6,5,ch34data};
+
+/* char: 0x21 '!' */
+
+static const GLubyte ch33data[] = {
+0x80,0x0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+};
+
+static const BitmapCharRec ch33 = {1,9,-1,0,3,ch33data};
+
+/* char: 0x20 ' ' */
+
+#ifdef _WIN32
+/* XXX Work around Microsoft OpenGL 1.1 bug where glBitmap with
+ a height or width of zero does not advance the raster position
+ as specified by OpenGL. (Cosmo OpenGL does not have this bug.) */
+static const GLubyte ch32data[] = { 0x0 };
+static const BitmapCharRec ch32 = {1,1,0,0,4,ch32data};
+#else
+static const BitmapCharRec ch32 = {0,0,0,0,4,0};
+#endif
+
+static const BitmapCharRec * const chars[] = {
+&ch32,
+&ch33,
+&ch34,
+&ch35,
+&ch36,
+&ch37,
+&ch38,
+&ch39,
+&ch40,
+&ch41,
+&ch42,
+&ch43,
+&ch44,
+&ch45,
+&ch46,
+&ch47,
+&ch48,
+&ch49,
+&ch50,
+&ch51,
+&ch52,
+&ch53,
+&ch54,
+&ch55,
+&ch56,
+&ch57,
+&ch58,
+&ch59,
+&ch60,
+&ch61,
+&ch62,
+&ch63,
+&ch64,
+&ch65,
+&ch66,
+&ch67,
+&ch68,
+&ch69,
+&ch70,
+&ch71,
+&ch72,
+&ch73,
+&ch74,
+&ch75,
+&ch76,
+&ch77,
+&ch78,
+&ch79,
+&ch80,
+&ch81,
+&ch82,
+&ch83,
+&ch84,
+&ch85,
+&ch86,
+&ch87,
+&ch88,
+&ch89,
+&ch90,
+&ch91,
+&ch92,
+&ch93,
+&ch94,
+&ch95,
+&ch96,
+&ch97,
+&ch98,
+&ch99,
+&ch100,
+&ch101,
+&ch102,
+&ch103,
+&ch104,
+&ch105,
+&ch106,
+&ch107,
+&ch108,
+&ch109,
+&ch110,
+&ch111,
+&ch112,
+&ch113,
+&ch114,
+&ch115,
+&ch116,
+&ch117,
+&ch118,
+&ch119,
+&ch120,
+&ch121,
+&ch122,
+&ch123,
+&ch124,
+&ch125,
+&ch126,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+&ch160,
+&ch161,
+&ch162,
+&ch163,
+&ch164,
+&ch165,
+&ch166,
+&ch167,
+&ch168,
+&ch169,
+&ch170,
+&ch171,
+&ch172,
+&ch173,
+&ch174,
+&ch175,
+&ch176,
+&ch177,
+&ch178,
+&ch179,
+&ch180,
+&ch181,
+&ch182,
+&ch183,
+&ch184,
+&ch185,
+&ch186,
+&ch187,
+&ch188,
+&ch189,
+&ch190,
+&ch191,
+&ch192,
+&ch193,
+&ch194,
+&ch195,
+&ch196,
+&ch197,
+&ch198,
+&ch199,
+&ch200,
+&ch201,
+&ch202,
+&ch203,
+&ch204,
+&ch205,
+&ch206,
+&ch207,
+&ch208,
+&ch209,
+&ch210,
+&ch211,
+&ch212,
+&ch213,
+&ch214,
+&ch215,
+&ch216,
+&ch217,
+&ch218,
+&ch219,
+&ch220,
+&ch221,
+&ch222,
+&ch223,
+&ch224,
+&ch225,
+&ch226,
+&ch227,
+&ch228,
+&ch229,
+&ch230,
+&ch231,
+&ch232,
+&ch233,
+&ch234,
+&ch235,
+&ch236,
+&ch237,
+&ch238,
+&ch239,
+&ch240,
+&ch241,
+&ch242,
+&ch243,
+&ch244,
+&ch245,
+&ch246,
+&ch247,
+&ch248,
+&ch249,
+&ch250,
+&ch251,
+&ch252,
+&ch253,
+&ch254,
+&ch255,
+};
+
+#if !defined(__IBMCPP__)
+const
+#endif
+BitmapFontRec glutBitmapHelvetica12 = {
+"-adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1",
+224,
+32,
+chars
+};
+
diff --git a/src/glut/os2/glut_hel18.cpp b/src/glut/os2/glut_hel18.cpp
new file mode 100644
index 00000000000..26f88ec505d
--- /dev/null
+++ b/src/glut/os2/glut_hel18.cpp
@@ -0,0 +1,1900 @@
+
+/* GENERATED FILE -- DO NOT MODIFY */
+
+#define glutBitmapHelvetica18 XXX
+#include "glutbitmap.h"
+#undef glutBitmapHelvetica18
+
+/* char: 0xff */
+
+static const GLubyte ch255data[] = {
+0x70,0x70,0x18,0x18,0x18,0x18,0x3c,0x24,0x66,0x66,0x66,0xc3,0xc3,0xc3,0x0,0x66,
+0x66,
+};
+
+static const BitmapCharRec ch255 = {8,17,-1,4,10,ch255data};
+
+/* char: 0xfe */
+
+static const GLubyte ch254data[] = {
+0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xde,0x0,0xff,0x0,0xe3,0x0,0xc1,0x80,
+0xc1,0x80,0xc1,0x80,0xc1,0x80,0xe3,0x0,0xff,0x0,0xde,0x0,0xc0,0x0,0xc0,0x0,
+0xc0,0x0,0xc0,0x0,
+};
+
+static const BitmapCharRec ch254 = {9,18,-1,4,11,ch254data};
+
+/* char: 0xfd */
+
+static const GLubyte ch253data[] = {
+0x70,0x70,0x18,0x18,0x18,0x18,0x3c,0x24,0x66,0x66,0x66,0xc3,0xc3,0xc3,0x0,0x18,
+0xc,0x6,
+};
+
+static const BitmapCharRec ch253 = {8,18,-1,4,10,ch253data};
+
+/* char: 0xfc */
+
+static const GLubyte ch252data[] = {
+0x73,0xfb,0xc7,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x0,0x66,0x66,
+};
+
+static const BitmapCharRec ch252 = {8,13,-1,0,10,ch252data};
+
+/* char: 0xfb */
+
+static const GLubyte ch251data[] = {
+0x73,0xfb,0xc7,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x0,0x66,0x3c,0x18,
+};
+
+static const BitmapCharRec ch251 = {8,14,-1,0,10,ch251data};
+
+/* char: 0xfa */
+
+static const GLubyte ch250data[] = {
+0x73,0xfb,0xc7,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x0,0x18,0xc,0x6,
+};
+
+static const BitmapCharRec ch250 = {8,14,-1,0,10,ch250data};
+
+/* char: 0xf9 */
+
+static const GLubyte ch249data[] = {
+0x73,0xfb,0xc7,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x0,0xc,0x18,0x30,
+};
+
+static const BitmapCharRec ch249 = {8,14,-1,0,10,ch249data};
+
+/* char: 0xf8 */
+
+static const GLubyte ch248data[] = {
+0xce,0x0,0x7f,0x80,0x31,0x80,0x78,0xc0,0x6c,0xc0,0x66,0xc0,0x63,0xc0,0x31,0x80,
+0x3f,0xc0,0xe,0x60,
+};
+
+static const BitmapCharRec ch248 = {11,10,0,0,11,ch248data};
+
+/* char: 0xf7 */
+
+static const GLubyte ch247data[] = {
+0x18,0x18,0x0,0xff,0xff,0x0,0x18,0x18,
+};
+
+static const BitmapCharRec ch247 = {8,8,-1,-1,10,ch247data};
+
+/* char: 0xf6 */
+
+static const GLubyte ch246data[] = {
+0x3e,0x0,0x7f,0x0,0x63,0x0,0xc1,0x80,0xc1,0x80,0xc1,0x80,0xc1,0x80,0x63,0x0,
+0x7f,0x0,0x3e,0x0,0x0,0x0,0x36,0x0,0x36,0x0,
+};
+
+static const BitmapCharRec ch246 = {9,13,-1,0,11,ch246data};
+
+/* char: 0xf5 */
+
+static const GLubyte ch245data[] = {
+0x3e,0x0,0x7f,0x0,0x63,0x0,0xc1,0x80,0xc1,0x80,0xc1,0x80,0xc1,0x80,0x63,0x0,
+0x7f,0x0,0x3e,0x0,0x0,0x0,0x26,0x0,0x2d,0x0,0x19,0x0,
+};
+
+static const BitmapCharRec ch245 = {9,14,-1,0,11,ch245data};
+
+/* char: 0xf4 */
+
+static const GLubyte ch244data[] = {
+0x3e,0x0,0x7f,0x0,0x63,0x0,0xc1,0x80,0xc1,0x80,0xc1,0x80,0xc1,0x80,0x63,0x0,
+0x7f,0x0,0x3e,0x0,0x0,0x0,0x33,0x0,0x1e,0x0,0xc,0x0,
+};
+
+static const BitmapCharRec ch244 = {9,14,-1,0,11,ch244data};
+
+/* char: 0xf3 */
+
+static const GLubyte ch243data[] = {
+0x3e,0x0,0x7f,0x0,0x63,0x0,0xc1,0x80,0xc1,0x80,0xc1,0x80,0xc1,0x80,0x63,0x0,
+0x7f,0x0,0x3e,0x0,0x0,0x0,0x18,0x0,0xc,0x0,0x6,0x0,
+};
+
+static const BitmapCharRec ch243 = {9,14,-1,0,11,ch243data};
+
+/* char: 0xf2 */
+
+static const GLubyte ch242data[] = {
+0x3e,0x0,0x7f,0x0,0x63,0x0,0xc1,0x80,0xc1,0x80,0xc1,0x80,0xc1,0x80,0x63,0x0,
+0x7f,0x0,0x3e,0x0,0x0,0x0,0xc,0x0,0x18,0x0,0x30,0x0,
+};
+
+static const BitmapCharRec ch242 = {9,14,-1,0,11,ch242data};
+
+/* char: 0xf1 */
+
+static const GLubyte ch241data[] = {
+0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xe3,0xdf,0xce,0x0,0x4c,0x5a,0x32,
+};
+
+static const BitmapCharRec ch241 = {8,14,-1,0,10,ch241data};
+
+/* char: 0xf0 */
+
+static const GLubyte ch240data[] = {
+0x3e,0x0,0x7f,0x0,0x63,0x0,0xc1,0x80,0xc1,0x80,0xc1,0x80,0xc1,0x80,0x63,0x0,
+0x7f,0x0,0x3e,0x0,0x4c,0x0,0x38,0x0,0x36,0x0,0x60,0x0,
+};
+
+static const BitmapCharRec ch240 = {9,14,-1,0,11,ch240data};
+
+/* char: 0xef */
+
+static const GLubyte ch239data[] = {
+0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x0,0xd8,0xd8,
+};
+
+static const BitmapCharRec ch239 = {5,13,0,0,4,ch239data};
+
+/* char: 0xee */
+
+static const GLubyte ch238data[] = {
+0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x0,0xcc,0x78,0x30,
+};
+
+static const BitmapCharRec ch238 = {6,14,1,0,4,ch238data};
+
+/* char: 0xed */
+
+static const GLubyte ch237data[] = {
+0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x0,0xc0,0x60,0x30,
+};
+
+static const BitmapCharRec ch237 = {4,14,0,0,4,ch237data};
+
+/* char: 0xec */
+
+static const GLubyte ch236data[] = {
+0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x0,0x30,0x60,0xc0,
+};
+
+static const BitmapCharRec ch236 = {4,14,0,0,4,ch236data};
+
+/* char: 0xeb */
+
+static const GLubyte ch235data[] = {
+0x3c,0x7f,0xe3,0xc0,0xc0,0xff,0xc3,0xc3,0x7e,0x3c,0x0,0x36,0x36,
+};
+
+static const BitmapCharRec ch235 = {8,13,-1,0,10,ch235data};
+
+/* char: 0xea */
+
+static const GLubyte ch234data[] = {
+0x3c,0x7f,0xe3,0xc0,0xc0,0xff,0xc3,0xc3,0x7e,0x3c,0x0,0x66,0x3c,0x18,
+};
+
+static const BitmapCharRec ch234 = {8,14,-1,0,10,ch234data};
+
+/* char: 0xe9 */
+
+static const GLubyte ch233data[] = {
+0x3c,0x7f,0xe3,0xc0,0xc0,0xff,0xc3,0xc3,0x7e,0x3c,0x0,0x18,0xc,0x6,
+};
+
+static const BitmapCharRec ch233 = {8,14,-1,0,10,ch233data};
+
+/* char: 0xe8 */
+
+static const GLubyte ch232data[] = {
+0x3c,0x7f,0xe3,0xc0,0xc0,0xff,0xc3,0xc3,0x7e,0x3c,0x0,0x18,0x30,0x60,
+};
+
+static const BitmapCharRec ch232 = {8,14,-1,0,10,ch232data};
+
+/* char: 0xe7 */
+
+static const GLubyte ch231data[] = {
+0x78,0x6c,0xc,0x38,0x3e,0x7f,0x63,0xc0,0xc0,0xc0,0xc0,0x63,0x7f,0x3e,
+};
+
+static const BitmapCharRec ch231 = {8,14,-1,4,10,ch231data};
+
+/* char: 0xe6 */
+
+static const GLubyte ch230data[] = {
+0x75,0xe0,0xef,0xf8,0xc7,0x18,0xc6,0x0,0xe6,0x0,0x7f,0xf8,0xe,0x18,0xc6,0x18,
+0xef,0xf0,0x7d,0xe0,
+};
+
+static const BitmapCharRec ch230 = {13,10,-1,0,15,ch230data};
+
+/* char: 0xe5 */
+
+static const GLubyte ch229data[] = {
+0x76,0xee,0xc6,0xc6,0xe6,0x7e,0xe,0xc6,0xee,0x7c,0x38,0x6c,0x6c,0x38,
+};
+
+static const BitmapCharRec ch229 = {7,14,-1,0,9,ch229data};
+
+/* char: 0xe4 */
+
+static const GLubyte ch228data[] = {
+0x76,0xee,0xc6,0xc6,0xe6,0x7e,0xe,0xc6,0xee,0x7c,0x0,0x6c,0x6c,
+};
+
+static const BitmapCharRec ch228 = {7,13,-1,0,9,ch228data};
+
+/* char: 0xe3 */
+
+static const GLubyte ch227data[] = {
+0x76,0xee,0xc6,0xc6,0xe6,0x7e,0xe,0xc6,0xee,0x7c,0x0,0x4c,0x5a,0x32,
+};
+
+static const BitmapCharRec ch227 = {7,14,-1,0,9,ch227data};
+
+/* char: 0xe2 */
+
+static const GLubyte ch226data[] = {
+0x76,0xee,0xc6,0xc6,0xe6,0x7e,0xe,0xc6,0xee,0x7c,0x0,0x66,0x3c,0x18,
+};
+
+static const BitmapCharRec ch226 = {7,14,-1,0,9,ch226data};
+
+/* char: 0xe1 */
+
+static const GLubyte ch225data[] = {
+0x76,0xee,0xc6,0xc6,0xe6,0x7e,0xe,0xc6,0xee,0x7c,0x0,0x30,0x18,0xc,
+};
+
+static const BitmapCharRec ch225 = {7,14,-1,0,9,ch225data};
+
+/* char: 0xe0 */
+
+static const GLubyte ch224data[] = {
+0x76,0xee,0xc6,0xc6,0xe6,0x7e,0xe,0xc6,0xee,0x7c,0x0,0x18,0x30,0x60,
+};
+
+static const BitmapCharRec ch224 = {7,14,-1,0,9,ch224data};
+
+/* char: 0xdf */
+
+static const GLubyte ch223data[] = {
+0xdc,0xde,0xc6,0xc6,0xc6,0xc6,0xdc,0xdc,0xc6,0xc6,0xc6,0xc6,0x7c,0x38,
+};
+
+static const BitmapCharRec ch223 = {7,14,-1,0,9,ch223data};
+
+/* char: 0xde */
+
+static const GLubyte ch222data[] = {
+0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x0,0xff,0x80,0xc1,0xc0,0xc0,0xc0,0xc0,0xc0,
+0xc1,0xc0,0xff,0x80,0xff,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,
+};
+
+static const BitmapCharRec ch222 = {10,14,-1,0,12,ch222data};
+
+/* char: 0xdd */
+
+static const GLubyte ch221data[] = {
+0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0xf,0x0,0x19,0x80,
+0x30,0xc0,0x30,0xc0,0x60,0x60,0x60,0x60,0xc0,0x30,0xc0,0x30,0x0,0x0,0x6,0x0,
+0x3,0x0,0x1,0x80,
+};
+
+static const BitmapCharRec ch221 = {12,18,-1,0,14,ch221data};
+
+/* char: 0xdc */
+
+static const GLubyte ch220data[] = {
+0x1f,0x0,0x7f,0xc0,0x60,0xc0,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,
+0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0x0,0x0,0x19,0x80,
+0x19,0x80,
+};
+
+static const BitmapCharRec ch220 = {11,17,-1,0,13,ch220data};
+
+/* char: 0xdb */
+
+static const GLubyte ch219data[] = {
+0x1f,0x0,0x7f,0xc0,0x60,0xc0,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,
+0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0x0,0x0,0x19,0x80,
+0xf,0x0,0x6,0x0,
+};
+
+static const BitmapCharRec ch219 = {11,18,-1,0,13,ch219data};
+
+/* char: 0xda */
+
+static const GLubyte ch218data[] = {
+0x1f,0x0,0x7f,0xc0,0x60,0xc0,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,
+0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0x0,0x0,0xc,0x0,
+0x6,0x0,0x3,0x0,
+};
+
+static const BitmapCharRec ch218 = {11,18,-1,0,13,ch218data};
+
+/* char: 0xd9 */
+
+static const GLubyte ch217data[] = {
+0x1f,0x0,0x7f,0xc0,0x60,0xc0,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,
+0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0x0,0x0,0x6,0x0,
+0xc,0x0,0x18,0x0,
+};
+
+static const BitmapCharRec ch217 = {11,18,-1,0,13,ch217data};
+
+/* char: 0xd8 */
+
+static const GLubyte ch216data[] = {
+0xc7,0xc0,0xff,0xf0,0x78,0x38,0x38,0x18,0x6c,0x1c,0x6e,0xc,0x67,0xc,0x63,0x8c,
+0x61,0xcc,0x70,0xdc,0x30,0x78,0x38,0x38,0x1f,0xfc,0x7,0xcc,
+};
+
+static const BitmapCharRec ch216 = {14,14,0,0,15,ch216data};
+
+/* char: 0xd7 */
+
+static const GLubyte ch215data[] = {
+0xc0,0xc0,0x61,0x80,0x33,0x0,0x1e,0x0,0xc,0x0,0x1e,0x0,0x33,0x0,0x61,0x80,
+0xc0,0xc0,
+};
+
+static const BitmapCharRec ch215 = {10,9,0,0,10,ch215data};
+
+/* char: 0xd6 */
+
+static const GLubyte ch214data[] = {
+0xf,0x80,0x3f,0xe0,0x70,0x70,0x60,0x30,0xe0,0x38,0xc0,0x18,0xc0,0x18,0xc0,0x18,
+0xc0,0x18,0xe0,0x38,0x60,0x30,0x70,0x70,0x3f,0xe0,0xf,0x80,0x0,0x0,0xd,0x80,
+0xd,0x80,
+};
+
+static const BitmapCharRec ch214 = {13,17,-1,0,15,ch214data};
+
+/* char: 0xd5 */
+
+static const GLubyte ch213data[] = {
+0xf,0x80,0x3f,0xe0,0x70,0x70,0x60,0x30,0xe0,0x38,0xc0,0x18,0xc0,0x18,0xc0,0x18,
+0xc0,0x18,0xe0,0x38,0x60,0x30,0x70,0x70,0x3f,0xe0,0xf,0x80,0x0,0x0,0x9,0x80,
+0xb,0x40,0x6,0x40,
+};
+
+static const BitmapCharRec ch213 = {13,18,-1,0,15,ch213data};
+
+/* char: 0xd4 */
+
+static const GLubyte ch212data[] = {
+0xf,0x80,0x3f,0xe0,0x70,0x70,0x60,0x30,0xe0,0x38,0xc0,0x18,0xc0,0x18,0xc0,0x18,
+0xc0,0x18,0xe0,0x38,0x60,0x30,0x70,0x70,0x3f,0xe0,0xf,0x80,0x0,0x0,0xc,0xc0,
+0x7,0x80,0x3,0x0,
+};
+
+static const BitmapCharRec ch212 = {13,18,-1,0,15,ch212data};
+
+/* char: 0xd3 */
+
+static const GLubyte ch211data[] = {
+0xf,0x80,0x3f,0xe0,0x70,0x70,0x60,0x30,0xe0,0x38,0xc0,0x18,0xc0,0x18,0xc0,0x18,
+0xc0,0x18,0xe0,0x38,0x60,0x30,0x70,0x70,0x3f,0xe0,0xf,0x80,0x0,0x0,0x3,0x0,
+0x1,0x80,0x0,0xc0,
+};
+
+static const BitmapCharRec ch211 = {13,18,-1,0,15,ch211data};
+
+/* char: 0xd2 */
+
+static const GLubyte ch210data[] = {
+0xf,0x80,0x3f,0xe0,0x70,0x70,0x60,0x30,0xe0,0x38,0xc0,0x18,0xc0,0x18,0xc0,0x18,
+0xc0,0x18,0xe0,0x38,0x60,0x30,0x70,0x70,0x3f,0xe0,0xf,0x80,0x0,0x0,0x3,0x0,
+0x6,0x0,0xc,0x0,
+};
+
+static const BitmapCharRec ch210 = {13,18,-1,0,15,ch210data};
+
+/* char: 0xd1 */
+
+static const GLubyte ch209data[] = {
+0xc0,0x60,0xc0,0xe0,0xc1,0xe0,0xc1,0xe0,0xc3,0x60,0xc6,0x60,0xc6,0x60,0xcc,0x60,
+0xcc,0x60,0xd8,0x60,0xd8,0x60,0xf0,0x60,0xe0,0x60,0xe0,0x60,0x0,0x0,0x13,0x0,
+0x16,0x80,0xc,0x80,
+};
+
+static const BitmapCharRec ch209 = {11,18,-1,0,13,ch209data};
+
+/* char: 0xd0 */
+
+static const GLubyte ch208data[] = {
+0x7f,0x80,0x7f,0xc0,0x60,0xe0,0x60,0x60,0x60,0x30,0x60,0x30,0xfc,0x30,0xfc,0x30,
+0x60,0x30,0x60,0x30,0x60,0x60,0x60,0xe0,0x7f,0xc0,0x7f,0x80,
+};
+
+static const BitmapCharRec ch208 = {12,14,0,0,13,ch208data};
+
+/* char: 0xcf */
+
+static const GLubyte ch207data[] = {
+0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x0,0xcc,
+0xcc,
+};
+
+static const BitmapCharRec ch207 = {6,17,0,0,6,ch207data};
+
+/* char: 0xce */
+
+static const GLubyte ch206data[] = {
+0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x0,0xcc,
+0x78,0x30,
+};
+
+static const BitmapCharRec ch206 = {6,18,0,0,6,ch206data};
+
+/* char: 0xcd */
+
+static const GLubyte ch205data[] = {
+0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x0,0xc0,
+0x60,0x30,
+};
+
+static const BitmapCharRec ch205 = {4,18,-2,0,6,ch205data};
+
+/* char: 0xcc */
+
+static const GLubyte ch204data[] = {
+0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x0,0x30,
+0x60,0xc0,
+};
+
+static const BitmapCharRec ch204 = {4,18,0,0,6,ch204data};
+
+/* char: 0xcb */
+
+static const GLubyte ch203data[] = {
+0xff,0x80,0xff,0x80,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x0,0xff,0x0,
+0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x80,0xff,0x80,0x0,0x0,0x33,0x0,
+0x33,0x0,
+};
+
+static const BitmapCharRec ch203 = {9,17,-1,0,11,ch203data};
+
+/* char: 0xca */
+
+static const GLubyte ch202data[] = {
+0xff,0x80,0xff,0x80,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x0,0xff,0x0,
+0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x80,0xff,0x80,0x0,0x0,0x33,0x0,
+0x1e,0x0,0xc,0x0,
+};
+
+static const BitmapCharRec ch202 = {9,18,-1,0,11,ch202data};
+
+/* char: 0xc9 */
+
+static const GLubyte ch201data[] = {
+0xff,0x80,0xff,0x80,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x0,0xff,0x0,
+0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x80,0xff,0x80,0x0,0x0,0xc,0x0,
+0x6,0x0,0x3,0x0,
+};
+
+static const BitmapCharRec ch201 = {9,18,-1,0,11,ch201data};
+
+/* char: 0xc8 */
+
+static const GLubyte ch200data[] = {
+0xff,0x80,0xff,0x80,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x0,0xff,0x0,
+0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x80,0xff,0x80,0x0,0x0,0xc,0x0,
+0x18,0x0,0x30,0x0,
+};
+
+static const BitmapCharRec ch200 = {9,18,-1,0,11,ch200data};
+
+/* char: 0xc7 */
+
+static const GLubyte ch199data[] = {
+0x1e,0x0,0x1b,0x0,0x3,0x0,0xe,0x0,0xf,0x80,0x3f,0xe0,0x70,0x70,0x60,0x30,
+0xe0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xe0,0x0,0x60,0x30,0x70,0x70,
+0x3f,0xe0,0xf,0x80,
+};
+
+static const BitmapCharRec ch199 = {12,18,-1,4,14,ch199data};
+
+/* char: 0xc6 */
+
+static const GLubyte ch198data[] = {
+0xc1,0xff,0xc1,0xff,0x61,0x80,0x61,0x80,0x7f,0x80,0x3f,0x80,0x31,0xfe,0x31,0xfe,
+0x19,0x80,0x19,0x80,0xd,0x80,0xd,0x80,0x7,0xff,0x7,0xff,
+};
+
+static const BitmapCharRec ch198 = {16,14,-1,0,18,ch198data};
+
+/* char: 0xc5 */
+
+static const GLubyte ch197data[] = {
+0xc0,0x30,0xc0,0x30,0x60,0x60,0x60,0x60,0x7f,0xe0,0x3f,0xc0,0x30,0xc0,0x30,0xc0,
+0x19,0x80,0x19,0x80,0xf,0x0,0xf,0x0,0x6,0x0,0x6,0x0,0xf,0x0,0x19,0x80,
+0x19,0x80,0xf,0x0,
+};
+
+static const BitmapCharRec ch197 = {12,18,0,0,12,ch197data};
+
+/* char: 0xc4 */
+
+static const GLubyte ch196data[] = {
+0xc0,0x30,0xc0,0x30,0x60,0x60,0x60,0x60,0x7f,0xe0,0x3f,0xc0,0x30,0xc0,0x30,0xc0,
+0x19,0x80,0x19,0x80,0xf,0x0,0xf,0x0,0x6,0x0,0x6,0x0,0x0,0x0,0x19,0x80,
+0x19,0x80,
+};
+
+static const BitmapCharRec ch196 = {12,17,0,0,12,ch196data};
+
+/* char: 0xc3 */
+
+static const GLubyte ch195data[] = {
+0xc0,0x30,0xc0,0x30,0x60,0x60,0x60,0x60,0x7f,0xe0,0x3f,0xc0,0x30,0xc0,0x30,0xc0,
+0x19,0x80,0x19,0x80,0xf,0x0,0xf,0x0,0x6,0x0,0x6,0x0,0x0,0x0,0x13,0x0,
+0x16,0x80,0xc,0x80,
+};
+
+static const BitmapCharRec ch195 = {12,18,0,0,12,ch195data};
+
+/* char: 0xc2 */
+
+static const GLubyte ch194data[] = {
+0xc0,0x30,0xc0,0x30,0x60,0x60,0x60,0x60,0x7f,0xe0,0x3f,0xc0,0x30,0xc0,0x30,0xc0,
+0x19,0x80,0x19,0x80,0xf,0x0,0xf,0x0,0x6,0x0,0x6,0x0,0x0,0x0,0x19,0x80,
+0xf,0x0,0x6,0x0,
+};
+
+static const BitmapCharRec ch194 = {12,18,0,0,12,ch194data};
+
+/* char: 0xc1 */
+
+static const GLubyte ch193data[] = {
+0xc0,0x30,0xc0,0x30,0x60,0x60,0x60,0x60,0x7f,0xe0,0x3f,0xc0,0x30,0xc0,0x30,0xc0,
+0x19,0x80,0x19,0x80,0xf,0x0,0xf,0x0,0x6,0x0,0x6,0x0,0x0,0x0,0x6,0x0,
+0x3,0x0,0x1,0x80,
+};
+
+static const BitmapCharRec ch193 = {12,18,0,0,12,ch193data};
+
+/* char: 0xc0 */
+
+static const GLubyte ch192data[] = {
+0xc0,0x30,0xc0,0x30,0x60,0x60,0x60,0x60,0x7f,0xe0,0x3f,0xc0,0x30,0xc0,0x30,0xc0,
+0x19,0x80,0x19,0x80,0xf,0x0,0xf,0x0,0x6,0x0,0x6,0x0,0x0,0x0,0x6,0x0,
+0xc,0x0,0x18,0x0,
+};
+
+static const BitmapCharRec ch192 = {12,18,0,0,12,ch192data};
+
+/* char: 0xbf */
+
+static const GLubyte ch191data[] = {
+0x7c,0xfe,0xc6,0xc6,0xe0,0x70,0x38,0x18,0x18,0x18,0x0,0x0,0x18,0x18,
+};
+
+static const BitmapCharRec ch191 = {7,14,-1,4,10,ch191data};
+
+/* char: 0xbe */
+
+static const GLubyte ch190data[] = {
+0x18,0x18,0x18,0x18,0xc,0xfc,0x6,0xd8,0x6,0x78,0x73,0x38,0xf9,0x18,0x99,0x88,
+0x30,0xc0,0x30,0xc0,0x98,0x60,0xf8,0x30,0x70,0x30,
+};
+
+static const BitmapCharRec ch190 = {14,13,0,0,15,ch190data};
+
+/* char: 0xbd */
+
+static const GLubyte ch189data[] = {
+0x30,0xf8,0x30,0xf8,0x18,0x60,0xc,0x30,0xc,0x18,0x66,0x98,0x62,0xf8,0x63,0x70,
+0x61,0x80,0x61,0x80,0xe0,0xc0,0xe0,0x60,0x60,0x60,
+};
+
+static const BitmapCharRec ch189 = {13,13,-1,0,15,ch189data};
+
+/* char: 0xbc */
+
+static const GLubyte ch188data[] = {
+0x30,0x30,0x30,0x30,0x19,0xf8,0xd,0xb0,0xc,0xf0,0x66,0x70,0x62,0x30,0x63,0x10,
+0x61,0x80,0x61,0x80,0xe0,0xc0,0xe0,0x60,0x60,0x60,
+};
+
+static const BitmapCharRec ch188 = {13,13,-1,0,15,ch188data};
+
+/* char: 0xbb */
+
+static const GLubyte ch187data[] = {
+0x90,0xd8,0x6c,0x36,0x36,0x6c,0xd8,0x90,
+};
+
+static const BitmapCharRec ch187 = {7,8,-1,-1,9,ch187data};
+
+/* char: 0xba */
+
+static const GLubyte ch186data[] = {
+0xf8,0x0,0x70,0xd8,0x88,0x88,0xd8,0x70,
+};
+
+static const BitmapCharRec ch186 = {5,8,-1,-6,7,ch186data};
+
+/* char: 0xb9 */
+
+static const GLubyte ch185data[] = {
+0x60,0x60,0x60,0x60,0x60,0xe0,0xe0,0x60,
+};
+
+static const BitmapCharRec ch185 = {3,8,-1,-5,6,ch185data};
+
+/* char: 0xb8 */
+
+static const GLubyte ch184data[] = {
+0xf0,0xd8,0x18,0x70,0x60,
+};
+
+static const BitmapCharRec ch184 = {5,5,0,4,5,ch184data};
+
+/* char: 0xb7 */
+
+static const GLubyte ch183data[] = {
+0xc0,0xc0,
+};
+
+static const BitmapCharRec ch183 = {2,2,-1,-4,4,ch183data};
+
+/* char: 0xb6 */
+
+static const GLubyte ch182data[] = {
+0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x32,0x72,0xf2,0xf2,0xf2,0xf2,
+0x72,0x3f,
+};
+
+static const BitmapCharRec ch182 = {8,18,-1,4,10,ch182data};
+
+/* char: 0xb5 */
+
+static const GLubyte ch181data[] = {
+0xc0,0xc0,0xc0,0xc0,0xdb,0xff,0xe7,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,
+};
+
+static const BitmapCharRec ch181 = {8,14,-1,4,10,ch181data};
+
+/* char: 0xb4 */
+
+static const GLubyte ch180data[] = {
+0xc0,0x60,0x30,
+};
+
+static const BitmapCharRec ch180 = {4,3,0,-11,4,ch180data};
+
+/* char: 0xb3 */
+
+static const GLubyte ch179data[] = {
+0x70,0xf8,0x98,0x30,0x30,0x98,0xf8,0x70,
+};
+
+static const BitmapCharRec ch179 = {5,8,0,-5,6,ch179data};
+
+/* char: 0xb2 */
+
+static const GLubyte ch178data[] = {
+0xf8,0xf8,0x60,0x30,0x18,0x98,0xf8,0x70,
+};
+
+static const BitmapCharRec ch178 = {5,8,0,-5,6,ch178data};
+
+/* char: 0xb1 */
+
+static const GLubyte ch177data[] = {
+0xff,0xff,0x0,0x18,0x18,0x18,0xff,0xff,0x18,0x18,0x18,
+};
+
+static const BitmapCharRec ch177 = {8,11,-1,0,10,ch177data};
+
+/* char: 0xb0 */
+
+static const GLubyte ch176data[] = {
+0x70,0xd8,0x88,0xd8,0x70,
+};
+
+static const BitmapCharRec ch176 = {5,5,-1,-8,7,ch176data};
+
+/* char: 0xaf */
+
+static const GLubyte ch175data[] = {
+0xf8,
+};
+
+static const BitmapCharRec ch175 = {5,1,0,-12,5,ch175data};
+
+/* char: 0xae */
+
+static const GLubyte ch174data[] = {
+0xf,0x80,0x30,0x60,0x40,0x10,0x48,0x50,0x88,0x88,0x89,0x8,0x8f,0x88,0x88,0x48,
+0x88,0x48,0x4f,0x90,0x40,0x10,0x30,0x60,0xf,0x80,
+};
+
+static const BitmapCharRec ch174 = {13,13,-1,0,14,ch174data};
+
+/* char: 0xad */
+
+static const GLubyte ch173data[] = {
+0xf8,0xf8,
+};
+
+static const BitmapCharRec ch173 = {5,2,-1,-4,7,ch173data};
+
+/* char: 0xac */
+
+static const GLubyte ch172data[] = {
+0x1,0x80,0x1,0x80,0x1,0x80,0xff,0x80,0xff,0x80,
+};
+
+static const BitmapCharRec ch172 = {9,5,-1,-3,11,ch172data};
+
+/* char: 0xab */
+
+static const GLubyte ch171data[] = {
+0x12,0x36,0x6c,0xd8,0xd8,0x6c,0x36,0x12,
+};
+
+static const BitmapCharRec ch171 = {7,8,-1,-1,9,ch171data};
+
+/* char: 0xaa */
+
+static const GLubyte ch170data[] = {
+0xf8,0x0,0x68,0xd8,0x48,0x38,0xc8,0x70,
+};
+
+static const BitmapCharRec ch170 = {5,8,-1,-6,7,ch170data};
+
+/* char: 0xa9 */
+
+static const GLubyte ch169data[] = {
+0xf,0x80,0x30,0x60,0x40,0x10,0x47,0x10,0x88,0x88,0x90,0x8,0x90,0x8,0x90,0x8,
+0x88,0x88,0x47,0x10,0x40,0x10,0x30,0x60,0xf,0x80,
+};
+
+static const BitmapCharRec ch169 = {13,13,-1,0,15,ch169data};
+
+/* char: 0xa8 */
+
+static const GLubyte ch168data[] = {
+0xd8,0xd8,
+};
+
+static const BitmapCharRec ch168 = {5,2,0,-11,6,ch168data};
+
+/* char: 0xa7 */
+
+static const GLubyte ch167data[] = {
+0x3c,0x7e,0xc3,0xc3,0x7,0xe,0x3e,0x73,0xe3,0xc3,0xc7,0x6e,0x7c,0xf0,0xc3,0xc3,
+0x7e,0x3c,
+};
+
+static const BitmapCharRec ch167 = {8,18,-1,4,10,ch167data};
+
+/* char: 0xa6 */
+
+static const GLubyte ch166data[] = {
+0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x0,0x0,0x0,0x0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+0xc0,
+};
+
+static const BitmapCharRec ch166 = {2,17,-1,3,4,ch166data};
+
+/* char: 0xa5 */
+
+static const GLubyte ch165data[] = {
+0x18,0x18,0x18,0x18,0xff,0x18,0xff,0x3c,0x66,0x66,0x66,0xc3,0xc3,
+};
+
+static const BitmapCharRec ch165 = {8,13,-1,0,10,ch165data};
+
+/* char: 0xa4 */
+
+static const GLubyte ch164data[] = {
+0xc3,0xff,0x66,0x66,0x66,0xff,0xc3,
+};
+
+static const BitmapCharRec ch164 = {8,7,-1,-3,10,ch164data};
+
+/* char: 0xa3 */
+
+static const GLubyte ch163data[] = {
+0xdf,0x0,0xff,0x80,0x60,0x80,0x30,0x0,0x18,0x0,0x18,0x0,0x7e,0x0,0x30,0x0,
+0x60,0x0,0x61,0x80,0x61,0x80,0x3f,0x0,0x1e,0x0,
+};
+
+static const BitmapCharRec ch163 = {9,13,0,0,10,ch163data};
+
+/* char: 0xa2 */
+
+static const GLubyte ch162data[] = {
+0x10,0x10,0x3e,0x7f,0x6b,0xc8,0xc8,0xc8,0xc8,0x6b,0x7f,0x3e,0x4,0x4,
+};
+
+static const BitmapCharRec ch162 = {8,14,-1,2,10,ch162data};
+
+/* char: 0xa1 */
+
+static const GLubyte ch161data[] = {
+0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x40,0x40,0x0,0x0,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch161 = {2,14,-2,4,6,ch161data};
+
+/* char: 0xa0 */
+
+#ifdef _WIN32
+/* XXX Work around Microsoft OpenGL 1.1 bug where glBitmap with
+ a height or width of zero does not advance the raster position
+ as specified by OpenGL. (Cosmo OpenGL does not have this bug.) */
+static const GLubyte ch160data[] = { 0x0 };
+static const BitmapCharRec ch160 = {1,1,0,0,5,ch160data};
+#else
+static const BitmapCharRec ch160 = {0,0,0,0,5,0};
+#endif
+
+/* char: 0x7e '~' */
+
+static const GLubyte ch126data[] = {
+0xcc,0x7e,0x33,
+};
+
+static const BitmapCharRec ch126 = {8,3,-1,-4,10,ch126data};
+
+/* char: 0x7d '}' */
+
+static const GLubyte ch125data[] = {
+0xc0,0x60,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0xc,0x18,0x30,0x30,0x30,0x30,0x30,
+0x60,0xc0,
+};
+
+static const BitmapCharRec ch125 = {6,18,0,4,6,ch125data};
+
+/* char: 0x7c '|' */
+
+static const GLubyte ch124data[] = {
+0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+0xc0,0xc0,
+};
+
+static const BitmapCharRec ch124 = {2,18,-1,4,4,ch124data};
+
+/* char: 0x7b '{' */
+
+static const GLubyte ch123data[] = {
+0xc,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x60,0xc0,0x60,0x30,0x30,0x30,0x30,0x30,
+0x18,0xc,
+};
+
+static const BitmapCharRec ch123 = {6,18,0,4,6,ch123data};
+
+/* char: 0x7a 'z' */
+
+static const GLubyte ch122data[] = {
+0xfe,0xfe,0xc0,0x60,0x30,0x18,0xc,0x6,0xfe,0xfe,
+};
+
+static const BitmapCharRec ch122 = {7,10,-1,0,9,ch122data};
+
+/* char: 0x79 'y' */
+
+static const GLubyte ch121data[] = {
+0x70,0x70,0x18,0x18,0x18,0x18,0x3c,0x24,0x66,0x66,0x66,0xc3,0xc3,0xc3,
+};
+
+static const BitmapCharRec ch121 = {8,14,-1,4,10,ch121data};
+
+/* char: 0x78 'x' */
+
+static const GLubyte ch120data[] = {
+0xc3,0xe7,0x66,0x3c,0x18,0x18,0x3c,0x66,0xe7,0xc3,
+};
+
+static const BitmapCharRec ch120 = {8,10,-1,0,10,ch120data};
+
+/* char: 0x77 'w' */
+
+static const GLubyte ch119data[] = {
+0x19,0x80,0x19,0x80,0x39,0xc0,0x29,0x40,0x69,0x60,0x66,0x60,0x66,0x60,0xc6,0x30,
+0xc6,0x30,0xc6,0x30,
+};
+
+static const BitmapCharRec ch119 = {12,10,-1,0,14,ch119data};
+
+/* char: 0x76 'v' */
+
+static const GLubyte ch118data[] = {
+0x18,0x18,0x3c,0x24,0x66,0x66,0x66,0xc3,0xc3,0xc3,
+};
+
+static const BitmapCharRec ch118 = {8,10,-1,0,10,ch118data};
+
+/* char: 0x75 'u' */
+
+static const GLubyte ch117data[] = {
+0x73,0xfb,0xc7,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,
+};
+
+static const BitmapCharRec ch117 = {8,10,-1,0,10,ch117data};
+
+/* char: 0x74 't' */
+
+static const GLubyte ch116data[] = {
+0x18,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0xfc,0xfc,0x30,0x30,0x30,
+};
+
+static const BitmapCharRec ch116 = {6,13,0,0,6,ch116data};
+
+/* char: 0x73 's' */
+
+static const GLubyte ch115data[] = {
+0x78,0xfc,0xc6,0x6,0x3e,0xfc,0xc0,0xc6,0x7e,0x3c,
+};
+
+static const BitmapCharRec ch115 = {7,10,-1,0,9,ch115data};
+
+/* char: 0x72 'r' */
+
+static const GLubyte ch114data[] = {
+0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xe0,0xd8,0xd8,
+};
+
+static const BitmapCharRec ch114 = {5,10,-1,0,6,ch114data};
+
+/* char: 0x71 'q' */
+
+static const GLubyte ch113data[] = {
+0x1,0x80,0x1,0x80,0x1,0x80,0x1,0x80,0x3d,0x80,0x7f,0x80,0x63,0x80,0xc1,0x80,
+0xc1,0x80,0xc1,0x80,0xc1,0x80,0x63,0x80,0x7f,0x80,0x3d,0x80,
+};
+
+static const BitmapCharRec ch113 = {9,14,-1,4,11,ch113data};
+
+/* char: 0x70 'p' */
+
+static const GLubyte ch112data[] = {
+0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xde,0x0,0xff,0x0,0xe3,0x0,0xc1,0x80,
+0xc1,0x80,0xc1,0x80,0xc1,0x80,0xe3,0x0,0xff,0x0,0xde,0x0,
+};
+
+static const BitmapCharRec ch112 = {9,14,-1,4,11,ch112data};
+
+/* char: 0x6f 'o' */
+
+static const GLubyte ch111data[] = {
+0x3e,0x0,0x7f,0x0,0x63,0x0,0xc1,0x80,0xc1,0x80,0xc1,0x80,0xc1,0x80,0x63,0x0,
+0x7f,0x0,0x3e,0x0,
+};
+
+static const BitmapCharRec ch111 = {9,10,-1,0,11,ch111data};
+
+/* char: 0x6e 'n' */
+
+static const GLubyte ch110data[] = {
+0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xe3,0xdf,0xce,
+};
+
+static const BitmapCharRec ch110 = {8,10,-1,0,10,ch110data};
+
+/* char: 0x6d 'm' */
+
+static const GLubyte ch109data[] = {
+0xc6,0x30,0xc6,0x30,0xc6,0x30,0xc6,0x30,0xc6,0x30,0xc6,0x30,0xc6,0x30,0xe7,0x30,
+0xde,0xf0,0xcc,0x60,
+};
+
+static const BitmapCharRec ch109 = {12,10,-1,0,14,ch109data};
+
+/* char: 0x6c 'l' */
+
+static const GLubyte ch108data[] = {
+0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch108 = {2,14,-1,0,4,ch108data};
+
+/* char: 0x6b 'k' */
+
+static const GLubyte ch107data[] = {
+0xc7,0xc6,0xce,0xcc,0xd8,0xf8,0xf0,0xd8,0xcc,0xc6,0xc0,0xc0,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch107 = {8,14,-1,0,9,ch107data};
+
+/* char: 0x6a 'j' */
+
+static const GLubyte ch106data[] = {
+0xe0,0xf0,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x0,0x0,
+0x30,0x30,
+};
+
+static const BitmapCharRec ch106 = {4,18,1,4,4,ch106data};
+
+/* char: 0x69 'i' */
+
+static const GLubyte ch105data[] = {
+0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x0,0x0,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch105 = {2,14,-1,0,4,ch105data};
+
+/* char: 0x68 'h' */
+
+static const GLubyte ch104data[] = {
+0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xe3,0xdf,0xce,0xc0,0xc0,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch104 = {8,14,-1,0,10,ch104data};
+
+/* char: 0x67 'g' */
+
+static const GLubyte ch103data[] = {
+0x1c,0x0,0x7f,0x0,0x63,0x0,0x1,0x80,0x3d,0x80,0x7f,0x80,0x63,0x80,0xc1,0x80,
+0xc1,0x80,0xc1,0x80,0xc1,0x80,0x61,0x80,0x7f,0x80,0x3d,0x80,
+};
+
+static const BitmapCharRec ch103 = {9,14,-1,4,11,ch103data};
+
+/* char: 0x66 'f' */
+
+static const GLubyte ch102data[] = {
+0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0xfc,0xfc,0x30,0x30,0x3c,0x1c,
+};
+
+static const BitmapCharRec ch102 = {6,14,0,0,6,ch102data};
+
+/* char: 0x65 'e' */
+
+static const GLubyte ch101data[] = {
+0x3c,0x7f,0xe3,0xc0,0xc0,0xff,0xc3,0xc3,0x7e,0x3c,
+};
+
+static const BitmapCharRec ch101 = {8,10,-1,0,10,ch101data};
+
+/* char: 0x64 'd' */
+
+static const GLubyte ch100data[] = {
+0x3d,0x80,0x7f,0x80,0x63,0x80,0xc1,0x80,0xc1,0x80,0xc1,0x80,0xc1,0x80,0x63,0x80,
+0x7f,0x80,0x3d,0x80,0x1,0x80,0x1,0x80,0x1,0x80,0x1,0x80,
+};
+
+static const BitmapCharRec ch100 = {9,14,-1,0,11,ch100data};
+
+/* char: 0x63 'c' */
+
+static const GLubyte ch99data[] = {
+0x3e,0x7f,0x63,0xc0,0xc0,0xc0,0xc0,0x63,0x7f,0x3e,
+};
+
+static const BitmapCharRec ch99 = {8,10,-1,0,10,ch99data};
+
+/* char: 0x62 'b' */
+
+static const GLubyte ch98data[] = {
+0xde,0x0,0xff,0x0,0xe3,0x0,0xc1,0x80,0xc1,0x80,0xc1,0x80,0xc1,0x80,0xe3,0x0,
+0xff,0x0,0xde,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,
+};
+
+static const BitmapCharRec ch98 = {9,14,-1,0,11,ch98data};
+
+/* char: 0x61 'a' */
+
+static const GLubyte ch97data[] = {
+0x76,0xee,0xc6,0xc6,0xe6,0x7e,0xe,0xc6,0xee,0x7c,
+};
+
+static const BitmapCharRec ch97 = {7,10,-1,0,9,ch97data};
+
+/* char: 0x60 '`' */
+
+static const GLubyte ch96data[] = {
+0xc0,0xc0,0x80,0x80,0x40,
+};
+
+static const BitmapCharRec ch96 = {2,5,-1,-9,4,ch96data};
+
+/* char: 0x5f '_' */
+
+static const GLubyte ch95data[] = {
+0xff,0xc0,0xff,0xc0,
+};
+
+static const BitmapCharRec ch95 = {10,2,0,4,10,ch95data};
+
+/* char: 0x5e '^' */
+
+static const GLubyte ch94data[] = {
+0x82,0xc6,0x6c,0x38,0x10,
+};
+
+static const BitmapCharRec ch94 = {7,5,-1,-8,9,ch94data};
+
+/* char: 0x5d ']' */
+
+static const GLubyte ch93data[] = {
+0xf0,0xf0,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
+0xf0,0xf0,
+};
+
+static const BitmapCharRec ch93 = {4,18,0,4,5,ch93data};
+
+/* char: 0x5c '\' */
+
+static const GLubyte ch92data[] = {
+0x18,0x18,0x10,0x10,0x30,0x30,0x20,0x20,0x60,0x60,0x40,0x40,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch92 = {5,14,0,0,5,ch92data};
+
+/* char: 0x5b '[' */
+
+static const GLubyte ch91data[] = {
+0xf0,0xf0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+0xf0,0xf0,
+};
+
+static const BitmapCharRec ch91 = {4,18,-1,4,5,ch91data};
+
+/* char: 0x5a 'Z' */
+
+static const GLubyte ch90data[] = {
+0xff,0xc0,0xff,0xc0,0xc0,0x0,0x60,0x0,0x30,0x0,0x18,0x0,0x1c,0x0,0xc,0x0,
+0x6,0x0,0x3,0x0,0x1,0x80,0x0,0xc0,0xff,0xc0,0xff,0xc0,
+};
+
+static const BitmapCharRec ch90 = {10,14,-1,0,12,ch90data};
+
+/* char: 0x59 'Y' */
+
+static const GLubyte ch89data[] = {
+0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0xf,0x0,0x19,0x80,
+0x30,0xc0,0x30,0xc0,0x60,0x60,0x60,0x60,0xc0,0x30,0xc0,0x30,
+};
+
+static const BitmapCharRec ch89 = {12,14,-1,0,14,ch89data};
+
+/* char: 0x58 'X' */
+
+static const GLubyte ch88data[] = {
+0xc0,0x60,0xe0,0xe0,0x60,0xc0,0x71,0xc0,0x31,0x80,0x1b,0x0,0xe,0x0,0xe,0x0,
+0x1b,0x0,0x31,0x80,0x71,0xc0,0x60,0xc0,0xe0,0xe0,0xc0,0x60,
+};
+
+static const BitmapCharRec ch88 = {11,14,-1,0,13,ch88data};
+
+/* char: 0x57 'W' */
+
+static const GLubyte ch87data[] = {
+0x18,0x18,0x18,0x18,0x1c,0x38,0x34,0x2c,0x36,0x6c,0x36,0x6c,0x66,0x66,0x66,0x66,
+0x62,0x46,0x63,0xc6,0xc3,0xc3,0xc1,0x83,0xc1,0x83,0xc1,0x83,
+};
+
+static const BitmapCharRec ch87 = {16,14,-1,0,18,ch87data};
+
+/* char: 0x56 'V' */
+
+static const GLubyte ch86data[] = {
+0x6,0x0,0xf,0x0,0xf,0x0,0x19,0x80,0x19,0x80,0x19,0x80,0x30,0xc0,0x30,0xc0,
+0x30,0xc0,0x60,0x60,0x60,0x60,0x60,0x60,0xc0,0x30,0xc0,0x30,
+};
+
+static const BitmapCharRec ch86 = {12,14,-1,0,14,ch86data};
+
+/* char: 0x55 'U' */
+
+static const GLubyte ch85data[] = {
+0x1f,0x0,0x7f,0xc0,0x60,0xc0,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,
+0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,
+};
+
+static const BitmapCharRec ch85 = {11,14,-1,0,13,ch85data};
+
+/* char: 0x54 'T' */
+
+static const GLubyte ch84data[] = {
+0xc,0x0,0xc,0x0,0xc,0x0,0xc,0x0,0xc,0x0,0xc,0x0,0xc,0x0,0xc,0x0,
+0xc,0x0,0xc,0x0,0xc,0x0,0xc,0x0,0xff,0xc0,0xff,0xc0,
+};
+
+static const BitmapCharRec ch84 = {10,14,-1,0,12,ch84data};
+
+/* char: 0x53 'S' */
+
+static const GLubyte ch83data[] = {
+0x3f,0x0,0x7f,0xc0,0xe0,0xe0,0xc0,0x60,0x0,0x60,0x0,0xe0,0x3,0xc0,0x1f,0x0,
+0x7c,0x0,0xe0,0x0,0xc0,0x60,0xe0,0xe0,0x7f,0xc0,0x1f,0x0,
+};
+
+static const BitmapCharRec ch83 = {11,14,-1,0,13,ch83data};
+
+/* char: 0x52 'R' */
+
+static const GLubyte ch82data[] = {
+0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc1,0x80,0xc1,0x80,0xff,0x0,0xff,0x80,
+0xc1,0xc0,0xc0,0xc0,0xc0,0xc0,0xc1,0xc0,0xff,0x80,0xff,0x0,
+};
+
+static const BitmapCharRec ch82 = {10,14,-1,0,12,ch82data};
+
+/* char: 0x51 'Q' */
+
+static const GLubyte ch81data[] = {
+0x0,0x30,0xf,0xb0,0x3f,0xe0,0x70,0xf0,0x61,0xb0,0xe1,0xb8,0xc0,0x18,0xc0,0x18,
+0xc0,0x18,0xc0,0x18,0xe0,0x38,0x60,0x30,0x70,0x70,0x3f,0xe0,0xf,0x80,
+};
+
+static const BitmapCharRec ch81 = {13,15,-1,1,15,ch81data};
+
+/* char: 0x50 'P' */
+
+static const GLubyte ch80data[] = {
+0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x0,0xff,0x80,
+0xc1,0xc0,0xc0,0xc0,0xc0,0xc0,0xc1,0xc0,0xff,0x80,0xff,0x0,
+};
+
+static const BitmapCharRec ch80 = {10,14,-1,0,12,ch80data};
+
+/* char: 0x4f 'O' */
+
+static const GLubyte ch79data[] = {
+0xf,0x80,0x3f,0xe0,0x70,0x70,0x60,0x30,0xe0,0x38,0xc0,0x18,0xc0,0x18,0xc0,0x18,
+0xc0,0x18,0xe0,0x38,0x60,0x30,0x70,0x70,0x3f,0xe0,0xf,0x80,
+};
+
+static const BitmapCharRec ch79 = {13,14,-1,0,15,ch79data};
+
+/* char: 0x4e 'N' */
+
+static const GLubyte ch78data[] = {
+0xc0,0x60,0xc0,0xe0,0xc1,0xe0,0xc1,0xe0,0xc3,0x60,0xc6,0x60,0xc6,0x60,0xcc,0x60,
+0xcc,0x60,0xd8,0x60,0xf0,0x60,0xf0,0x60,0xe0,0x60,0xc0,0x60,
+};
+
+static const BitmapCharRec ch78 = {11,14,-1,0,13,ch78data};
+
+/* char: 0x4d 'M' */
+
+static const GLubyte ch77data[] = {
+0xc3,0xc,0xc3,0xc,0xc7,0x8c,0xc4,0x8c,0xcc,0xcc,0xcc,0xcc,0xd8,0x6c,0xd8,0x6c,
+0xf0,0x3c,0xf0,0x3c,0xe0,0x1c,0xe0,0x1c,0xc0,0xc,0xc0,0xc,
+};
+
+static const BitmapCharRec ch77 = {14,14,-1,0,16,ch77data};
+
+/* char: 0x4c 'L' */
+
+static const GLubyte ch76data[] = {
+0xff,0xff,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch76 = {8,14,-1,0,10,ch76data};
+
+/* char: 0x4b 'K' */
+
+static const GLubyte ch75data[] = {
+0xc0,0x70,0xc0,0xe0,0xc1,0xc0,0xc3,0x80,0xc7,0x0,0xce,0x0,0xfc,0x0,0xf8,0x0,
+0xdc,0x0,0xce,0x0,0xc7,0x0,0xc3,0x80,0xc1,0xc0,0xc0,0xe0,
+};
+
+static const BitmapCharRec ch75 = {12,14,-1,0,13,ch75data};
+
+/* char: 0x4a 'J' */
+
+static const GLubyte ch74data[] = {
+0x3c,0x7e,0xe7,0xc3,0xc3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,
+};
+
+static const BitmapCharRec ch74 = {8,14,-1,0,10,ch74data};
+
+/* char: 0x49 'I' */
+
+static const GLubyte ch73data[] = {
+0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch73 = {2,14,-2,0,6,ch73data};
+
+/* char: 0x48 'H' */
+
+static const GLubyte ch72data[] = {
+0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xff,0xe0,0xff,0xe0,
+0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,
+};
+
+static const BitmapCharRec ch72 = {11,14,-1,0,13,ch72data};
+
+/* char: 0x47 'G' */
+
+static const GLubyte ch71data[] = {
+0xf,0xb0,0x3f,0xf0,0x70,0x70,0x60,0x30,0xe0,0x30,0xc1,0xf0,0xc1,0xf0,0xc0,0x0,
+0xc0,0x0,0xe0,0x30,0x60,0x30,0x70,0x70,0x3f,0xe0,0xf,0x80,
+};
+
+static const BitmapCharRec ch71 = {12,14,-1,0,14,ch71data};
+
+/* char: 0x46 'F' */
+
+static const GLubyte ch70data[] = {
+0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x0,0xff,0x0,
+0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x80,0xff,0x80,
+};
+
+static const BitmapCharRec ch70 = {9,14,-1,0,11,ch70data};
+
+/* char: 0x45 'E' */
+
+static const GLubyte ch69data[] = {
+0xff,0x80,0xff,0x80,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x0,0xff,0x0,
+0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x80,0xff,0x80,
+};
+
+static const BitmapCharRec ch69 = {9,14,-1,0,11,ch69data};
+
+/* char: 0x44 'D' */
+
+static const GLubyte ch68data[] = {
+0xff,0x0,0xff,0x80,0xc1,0xc0,0xc0,0xc0,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,
+0xc0,0x60,0xc0,0x60,0xc0,0xc0,0xc1,0xc0,0xff,0x80,0xff,0x0,
+};
+
+static const BitmapCharRec ch68 = {11,14,-1,0,13,ch68data};
+
+/* char: 0x43 'C' */
+
+static const GLubyte ch67data[] = {
+0xf,0x80,0x3f,0xe0,0x70,0x70,0x60,0x30,0xe0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,
+0xc0,0x0,0xe0,0x0,0x60,0x30,0x70,0x70,0x3f,0xe0,0xf,0x80,
+};
+
+static const BitmapCharRec ch67 = {12,14,-1,0,14,ch67data};
+
+/* char: 0x42 'B' */
+
+static const GLubyte ch66data[] = {
+0xff,0x80,0xff,0xc0,0xc0,0xe0,0xc0,0x60,0xc0,0x60,0xc0,0xe0,0xff,0xc0,0xff,0x80,
+0xc1,0x80,0xc0,0xc0,0xc0,0xc0,0xc1,0xc0,0xff,0x80,0xff,0x0,
+};
+
+static const BitmapCharRec ch66 = {11,14,-1,0,13,ch66data};
+
+/* char: 0x41 'A' */
+
+static const GLubyte ch65data[] = {
+0xc0,0x30,0xc0,0x30,0x60,0x60,0x60,0x60,0x7f,0xe0,0x3f,0xc0,0x30,0xc0,0x30,0xc0,
+0x19,0x80,0x19,0x80,0xf,0x0,0xf,0x0,0x6,0x0,0x6,0x0,
+};
+
+static const BitmapCharRec ch65 = {12,14,0,0,12,ch65data};
+
+/* char: 0x40 '@' */
+
+static const GLubyte ch64data[] = {
+0x7,0xe0,0x1f,0xf0,0x38,0x0,0x70,0x0,0x67,0x70,0xcf,0xf8,0xcc,0xcc,0xcc,0x66,
+0xcc,0x66,0xcc,0x63,0xc6,0x33,0x67,0x73,0x63,0xb3,0x30,0x6,0x1c,0xe,0xf,0xfc,
+0x3,0xf0,
+};
+
+static const BitmapCharRec ch64 = {16,17,-1,3,18,ch64data};
+
+/* char: 0x3f '?' */
+
+static const GLubyte ch63data[] = {
+0x30,0x30,0x0,0x0,0x30,0x30,0x30,0x38,0x1c,0xe,0xc6,0xc6,0xfe,0x7c,
+};
+
+static const BitmapCharRec ch63 = {7,14,-1,0,10,ch63data};
+
+/* char: 0x3e '>' */
+
+static const GLubyte ch62data[] = {
+0xc0,0xf0,0x3c,0xe,0x3,0xe,0x3c,0xf0,0xc0,
+};
+
+static const BitmapCharRec ch62 = {8,9,-1,0,10,ch62data};
+
+/* char: 0x3d '=' */
+
+static const GLubyte ch61data[] = {
+0xfe,0xfe,0x0,0x0,0xfe,0xfe,
+};
+
+static const BitmapCharRec ch61 = {7,6,-2,-2,11,ch61data};
+
+/* char: 0x3c '<' */
+
+static const GLubyte ch60data[] = {
+0x3,0xf,0x3c,0x70,0xc0,0x70,0x3c,0xf,0x3,
+};
+
+static const BitmapCharRec ch60 = {8,9,-1,0,10,ch60data};
+
+/* char: 0x3b ';' */
+
+static const GLubyte ch59data[] = {
+0x80,0x40,0x40,0xc0,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch59 = {2,13,-1,3,5,ch59data};
+
+/* char: 0x3a ':' */
+
+static const GLubyte ch58data[] = {
+0xc0,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch58 = {2,10,-1,0,5,ch58data};
+
+/* char: 0x39 '9' */
+
+static const GLubyte ch57data[] = {
+0x7c,0xfe,0xc6,0x3,0x3,0x3b,0x7f,0xc3,0xc3,0xc3,0xc7,0x7e,0x3c,
+};
+
+static const BitmapCharRec ch57 = {8,13,-1,0,10,ch57data};
+
+/* char: 0x38 '8' */
+
+static const GLubyte ch56data[] = {
+0x3c,0x7e,0xe7,0xc3,0xc3,0x66,0x7e,0x66,0xc3,0xc3,0xe7,0x7e,0x3c,
+};
+
+static const BitmapCharRec ch56 = {8,13,-1,0,10,ch56data};
+
+/* char: 0x37 '7' */
+
+static const GLubyte ch55data[] = {
+0x60,0x60,0x30,0x30,0x30,0x18,0x18,0xc,0xc,0x6,0x3,0xff,0xff,
+};
+
+static const BitmapCharRec ch55 = {8,13,-1,0,10,ch55data};
+
+/* char: 0x36 '6' */
+
+static const GLubyte ch54data[] = {
+0x3c,0x7e,0xe3,0xc3,0xc3,0xc3,0xfe,0xdc,0xc0,0xc0,0x63,0x7f,0x3c,
+};
+
+static const BitmapCharRec ch54 = {8,13,-1,0,10,ch54data};
+
+/* char: 0x35 '5' */
+
+static const GLubyte ch53data[] = {
+0x7c,0xfe,0xc7,0xc3,0x3,0x3,0xc7,0xfe,0xfc,0xc0,0xc0,0xfe,0xfe,
+};
+
+static const BitmapCharRec ch53 = {8,13,-1,0,10,ch53data};
+
+/* char: 0x34 '4' */
+
+static const GLubyte ch52data[] = {
+0x3,0x0,0x3,0x0,0x3,0x0,0xff,0x80,0xff,0x80,0xc3,0x0,0x63,0x0,0x33,0x0,
+0x33,0x0,0x1b,0x0,0xf,0x0,0x7,0x0,0x3,0x0,
+};
+
+static const BitmapCharRec ch52 = {9,13,-1,0,10,ch52data};
+
+/* char: 0x33 '3' */
+
+static const GLubyte ch51data[] = {
+0x3c,0x7e,0xc7,0xc3,0x3,0x7,0x1e,0x1c,0x6,0xc3,0xc3,0x7e,0x3c,
+};
+
+static const BitmapCharRec ch51 = {8,13,-1,0,10,ch51data};
+
+/* char: 0x32 '2' */
+
+static const GLubyte ch50data[] = {
+0xff,0xff,0xc0,0xe0,0x70,0x38,0x1c,0xe,0x7,0x3,0xc3,0xfe,0x3c,
+};
+
+static const BitmapCharRec ch50 = {8,13,-1,0,10,ch50data};
+
+/* char: 0x31 '1' */
+
+static const GLubyte ch49data[] = {
+0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xf8,0xf8,0x18,
+};
+
+static const BitmapCharRec ch49 = {5,13,-2,0,10,ch49data};
+
+/* char: 0x30 '0' */
+
+static const GLubyte ch48data[] = {
+0x3c,0x7e,0x66,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x66,0x7e,0x3c,
+};
+
+static const BitmapCharRec ch48 = {8,13,-1,0,10,ch48data};
+
+/* char: 0x2f '/' */
+
+static const GLubyte ch47data[] = {
+0xc0,0xc0,0x40,0x40,0x60,0x60,0x20,0x20,0x30,0x30,0x10,0x10,0x18,0x18,
+};
+
+static const BitmapCharRec ch47 = {5,14,0,0,5,ch47data};
+
+/* char: 0x2e '.' */
+
+static const GLubyte ch46data[] = {
+0xc0,0xc0,
+};
+
+static const BitmapCharRec ch46 = {2,2,-1,0,5,ch46data};
+
+/* char: 0x2d '-' */
+
+static const GLubyte ch45data[] = {
+0xff,0xff,
+};
+
+static const BitmapCharRec ch45 = {8,2,-1,-4,11,ch45data};
+
+/* char: 0x2c ',' */
+
+static const GLubyte ch44data[] = {
+0x80,0x40,0x40,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch44 = {2,5,-1,3,5,ch44data};
+
+/* char: 0x2b '+' */
+
+static const GLubyte ch43data[] = {
+0x18,0x18,0x18,0x18,0xff,0xff,0x18,0x18,0x18,0x18,
+};
+
+static const BitmapCharRec ch43 = {8,10,-1,0,10,ch43data};
+
+/* char: 0x2a '*' */
+
+static const GLubyte ch42data[] = {
+0x88,0x70,0x70,0xf8,0x20,0x20,
+};
+
+static const BitmapCharRec ch42 = {5,6,-1,-8,7,ch42data};
+
+/* char: 0x29 ')' */
+
+static const GLubyte ch41data[] = {
+0x80,0xc0,0x60,0x60,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x60,0x60,
+0xc0,0x80,
+};
+
+static const BitmapCharRec ch41 = {4,18,-1,4,6,ch41data};
+
+/* char: 0x28 '(' */
+
+static const GLubyte ch40data[] = {
+0x10,0x30,0x60,0x60,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x60,0x60,
+0x30,0x10,
+};
+
+static const BitmapCharRec ch40 = {4,18,-1,4,6,ch40data};
+
+/* char: 0x27 ''' */
+
+static const GLubyte ch39data[] = {
+0x80,0x40,0x40,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch39 = {2,5,-1,-9,4,ch39data};
+
+/* char: 0x26 '&' */
+
+static const GLubyte ch38data[] = {
+0x3c,0x70,0x7e,0xe0,0xe7,0xc0,0xc3,0x80,0xc3,0xc0,0xc6,0xc0,0xee,0xc0,0x7c,0x0,
+0x3c,0x0,0x66,0x0,0x66,0x0,0x7e,0x0,0x3c,0x0,
+};
+
+static const BitmapCharRec ch38 = {12,13,-1,0,13,ch38data};
+
+/* char: 0x25 '%' */
+
+static const GLubyte ch37data[] = {
+0x18,0x78,0x18,0xfc,0xc,0xcc,0xc,0xcc,0x6,0xfc,0x6,0x78,0x3,0x0,0x7b,0x0,
+0xfd,0x80,0xcd,0x80,0xcc,0xc0,0xfc,0xc0,0x78,0x60,
+};
+
+static const BitmapCharRec ch37 = {14,13,-1,0,16,ch37data};
+
+/* char: 0x24 '$' */
+
+static const GLubyte ch36data[] = {
+0x8,0x0,0x8,0x0,0x3e,0x0,0x7f,0x0,0xeb,0x80,0xc9,0x80,0x9,0x80,0xf,0x0,
+0x3e,0x0,0x78,0x0,0xe8,0x0,0xc8,0x0,0xcb,0x0,0x7f,0x0,0x3e,0x0,0x8,0x0,
+};
+
+static const BitmapCharRec ch36 = {9,16,-1,2,10,ch36data};
+
+/* char: 0x23 '#' */
+
+static const GLubyte ch35data[] = {
+0x24,0x0,0x24,0x0,0x24,0x0,0xff,0x80,0xff,0x80,0x12,0x0,0x12,0x0,0x12,0x0,
+0x7f,0xc0,0x7f,0xc0,0x9,0x0,0x9,0x0,0x9,0x0,
+};
+
+static const BitmapCharRec ch35 = {10,13,0,0,10,ch35data};
+
+/* char: 0x22 '"' */
+
+static const GLubyte ch34data[] = {
+0x90,0x90,0xd8,0xd8,0xd8,
+};
+
+static const BitmapCharRec ch34 = {5,5,0,-9,5,ch34data};
+
+/* char: 0x21 '!' */
+
+static const GLubyte ch33data[] = {
+0xc0,0xc0,0x0,0x0,0x80,0x80,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch33 = {2,14,-2,0,6,ch33data};
+
+/* char: 0x20 ' ' */
+
+#ifdef _WIN32
+/* XXX Work around Microsoft OpenGL 1.1 bug where glBitmap with
+ a height or width of zero does not advance the raster position
+ as specified by OpenGL. (Cosmo OpenGL does not have this bug.) */
+static const GLubyte ch32data[] = { 0x0 };
+static const BitmapCharRec ch32 = {1,1,0,0,5,ch32data};
+#else
+static const BitmapCharRec ch32 = {0,0,0,0,5,0};
+#endif
+
+static const BitmapCharRec * const chars[] = {
+&ch32,
+&ch33,
+&ch34,
+&ch35,
+&ch36,
+&ch37,
+&ch38,
+&ch39,
+&ch40,
+&ch41,
+&ch42,
+&ch43,
+&ch44,
+&ch45,
+&ch46,
+&ch47,
+&ch48,
+&ch49,
+&ch50,
+&ch51,
+&ch52,
+&ch53,
+&ch54,
+&ch55,
+&ch56,
+&ch57,
+&ch58,
+&ch59,
+&ch60,
+&ch61,
+&ch62,
+&ch63,
+&ch64,
+&ch65,
+&ch66,
+&ch67,
+&ch68,
+&ch69,
+&ch70,
+&ch71,
+&ch72,
+&ch73,
+&ch74,
+&ch75,
+&ch76,
+&ch77,
+&ch78,
+&ch79,
+&ch80,
+&ch81,
+&ch82,
+&ch83,
+&ch84,
+&ch85,
+&ch86,
+&ch87,
+&ch88,
+&ch89,
+&ch90,
+&ch91,
+&ch92,
+&ch93,
+&ch94,
+&ch95,
+&ch96,
+&ch97,
+&ch98,
+&ch99,
+&ch100,
+&ch101,
+&ch102,
+&ch103,
+&ch104,
+&ch105,
+&ch106,
+&ch107,
+&ch108,
+&ch109,
+&ch110,
+&ch111,
+&ch112,
+&ch113,
+&ch114,
+&ch115,
+&ch116,
+&ch117,
+&ch118,
+&ch119,
+&ch120,
+&ch121,
+&ch122,
+&ch123,
+&ch124,
+&ch125,
+&ch126,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+&ch160,
+&ch161,
+&ch162,
+&ch163,
+&ch164,
+&ch165,
+&ch166,
+&ch167,
+&ch168,
+&ch169,
+&ch170,
+&ch171,
+&ch172,
+&ch173,
+&ch174,
+&ch175,
+&ch176,
+&ch177,
+&ch178,
+&ch179,
+&ch180,
+&ch181,
+&ch182,
+&ch183,
+&ch184,
+&ch185,
+&ch186,
+&ch187,
+&ch188,
+&ch189,
+&ch190,
+&ch191,
+&ch192,
+&ch193,
+&ch194,
+&ch195,
+&ch196,
+&ch197,
+&ch198,
+&ch199,
+&ch200,
+&ch201,
+&ch202,
+&ch203,
+&ch204,
+&ch205,
+&ch206,
+&ch207,
+&ch208,
+&ch209,
+&ch210,
+&ch211,
+&ch212,
+&ch213,
+&ch214,
+&ch215,
+&ch216,
+&ch217,
+&ch218,
+&ch219,
+&ch220,
+&ch221,
+&ch222,
+&ch223,
+&ch224,
+&ch225,
+&ch226,
+&ch227,
+&ch228,
+&ch229,
+&ch230,
+&ch231,
+&ch232,
+&ch233,
+&ch234,
+&ch235,
+&ch236,
+&ch237,
+&ch238,
+&ch239,
+&ch240,
+&ch241,
+&ch242,
+&ch243,
+&ch244,
+&ch245,
+&ch246,
+&ch247,
+&ch248,
+&ch249,
+&ch250,
+&ch251,
+&ch252,
+&ch253,
+&ch254,
+&ch255,
+};
+
+#if !defined(__IBMCPP__)
+const
+#endif
+BitmapFontRec glutBitmapHelvetica18 = {
+"-adobe-helvetica-medium-r-normal--18-180-75-75-p-98-iso8859-1",
+224,
+32,
+chars
+};
+
diff --git a/src/glut/os2/glut_init.cpp b/src/glut/os2/glut_init.cpp
new file mode 100644
index 00000000000..da5d0735e29
--- /dev/null
+++ b/src/glut/os2/glut_init.cpp
@@ -0,0 +1,451 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1997. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#ifdef __VMS
+#include <GL/vms_x_fix.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#if !defined(_WIN32) && !defined(__OS2__)
+ #include <X11/Xlib.h>
+ #include <X11/Xatom.h>
+#endif
+
+/* SGI optimization introduced in IRIX 6.3 to avoid X server
+ round trips for interning common X atoms. */
+#if defined(_SGI_EXTRA_PREDEFINES) && !defined(NO_FAST_ATOMS)
+#include <X11/SGIFastAtom.h>
+#else
+#define XSGIFastInternAtom(dpy,string,fast_name,how) XInternAtom(dpy,string,how)
+#endif
+
+#include "glutint.h"
+
+/* GLUT inter-file variables */
+/* *INDENT-OFF* */
+char *__glutProgramName = NULL;
+int __glutArgc = 0;
+char **__glutArgv = NULL;
+char *__glutGeometry = NULL;
+Display *__glutDisplay = NULL;
+int __glutScreen;
+Window __glutRoot;
+int __glutScreenHeight;
+int __glutScreenWidth;
+GLboolean __glutIconic = GL_FALSE;
+GLboolean __glutDebug = GL_FALSE;
+unsigned int __glutDisplayMode =
+ GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH;
+char *__glutDisplayString = NULL;
+int __glutConnectionFD;
+XSizeHints __glutSizeHints = {0};
+int __glutInitWidth = 300, __glutInitHeight = 300;
+int __glutInitX = -1, __glutInitY = -1;
+GLboolean __glutForceDirect = GL_FALSE,
+ __glutTryDirect = GL_TRUE;
+Atom __glutWMDeleteWindow;
+/* *INDENT-ON* */
+
+#ifdef _WIN32
+void (__cdecl *__glutExitFunc)(int retval) = NULL;
+#endif
+
+static Bool synchronize = False;
+
+#if defined(__OS2__)
+
+MRESULT EXPENTRY GlutWindowProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 );
+MRESULT EXPENTRY GlutWindowChildProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 );
+
+
+void __glutOpenOS2Connection(char* display)
+{
+ static char *classname=NULL;
+extern HAB hab; /* PM anchor block handle */
+ERRORID erridErrorCode;/* last error id code */
+int ii;
+
+ /* Make sure we register the window only once. */
+ if(classname)
+ return;
+
+ classname = "GLUT";
+
+ if ( !WinRegisterClass( hab, /* PM anchor block handle */
+ classname,/* window class name */
+ GlutWindowProc,/* address of window procedure*/
+ CS_SIZEREDRAW, /* |CS_SYNCPAINT size changes cause redrawing */
+ 0UL ) ) /* window data */
+ { erridErrorCode = WinGetLastError(hab);
+ ii = erridErrorCode;
+ return;
+ }
+
+ classname = "GLUTCHILD";
+
+ if ( !WinRegisterClass( hab, /* PM anchor block handle */
+ classname,/* window class name */
+ GlutWindowChildProc,/* address of window procedure*/
+ CS_SIZEREDRAW, /* size changes cause redrawing */
+ 0UL ) ) /* window data */
+ { erridErrorCode = WinGetLastError(hab);
+ ii = erridErrorCode;
+ return;
+ }
+
+ __glutScreenWidth = GetSystemMetrics(SM_CXSCREEN);
+ __glutScreenHeight = GetSystemMetrics(SM_CYSCREEN);
+
+ /* Set the root window to NULL because windows creates a top-level
+ window when the parent is NULL. X creates a top-level window
+ when the parent is the root window. */
+ __glutRoot = NULLHANDLE;
+
+ /* Set the display to 1 -- we shouldn't be using this anywhere
+ (except as an argument to X calls). */
+ __glutDisplay = (Display*)1;
+
+ /* There isn't any concept of multiple screens in Win32, therefore,
+ we don't need to keep track of the screen we're on... it's always
+ the same one. */
+ __glutScreen = 0;
+}
+
+#elif defined(_WIN32)
+
+#ifdef __BORLANDC__
+#include <float.h> /* For masking floating point exceptions. */
+#endif
+
+void
+__glutOpenWin32Connection(char* display)
+{
+ static char *classname;
+ WNDCLASS wc;
+ HINSTANCE hInstance = GetModuleHandle(NULL);
+
+ /* Make sure we register the window only once. */
+ if(classname)
+ return;
+
+#ifdef __BORLANDC__
+ /* Under certain conditions (e.g. while rendering solid surfaces with
+ lighting enabled) Microsoft OpenGL libraries cause some illegal
+ operations like floating point overflow or division by zero. The
+ default behaviour of Microsoft compilers is to mask (ignore)
+ floating point exceptions, while Borland compilers do not. The
+ following function of Borland RTL allows to mask exceptions.
+ Advice from Pier Giorgio Esposito (mc2172@mclink.it). */
+ _control87(MCW_EM,MCW_EM);
+#endif
+
+ classname = "GLUT";
+
+ /* Clear (important!) and then fill in the window class structure. */
+ memset(&wc, 0, sizeof(WNDCLASS));
+ wc.style = CS_OWNDC;
+ wc.lpfnWndProc = (WNDPROC)__glutWindowProc;
+ wc.hInstance = hInstance;
+ wc.hIcon = LoadIcon(hInstance, "GLUT_ICON");
+ wc.hCursor = LoadCursor(hInstance, IDC_ARROW);
+ wc.hbrBackground = NULL;
+ wc.lpszMenuName = NULL;
+ wc.lpszClassName = classname;
+
+ /* Fill in a default icon if one isn't specified as a resource. */
+ if(!wc.hIcon)
+ wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
+
+ if(!RegisterClass(&wc)) {
+ __glutFatalError("RegisterClass() failed:"
+ "Cannot register GLUT window class.");
+ }
+
+ __glutScreenWidth = GetSystemMetrics(SM_CXSCREEN);
+ __glutScreenHeight = GetSystemMetrics(SM_CYSCREEN);
+
+ /* Set the root window to NULL because windows creates a top-level
+ window when the parent is NULL. X creates a top-level window
+ when the parent is the root window. */
+ __glutRoot = NULL;
+
+ /* Set the display to 1 -- we shouldn't be using this anywhere
+ (except as an argument to X calls). */
+ __glutDisplay = (Display*)1;
+
+ /* There isn't any concept of multiple screens in Win32, therefore,
+ we don't need to keep track of the screen we're on... it's always
+ the same one. */
+ __glutScreen = 0;
+}
+#else /* !_WIN32 */
+void
+__glutOpenXConnection(char *display)
+{
+ int errorBase, eventBase;
+
+ __glutDisplay = XOpenDisplay(display);
+ if (!__glutDisplay)
+ __glutFatalError("could not open display: %s",
+ XDisplayName(display));
+ if (synchronize)
+ XSynchronize(__glutDisplay, True);
+ if (!glXQueryExtension(__glutDisplay, &errorBase, &eventBase))
+ __glutFatalError(
+ "OpenGL GLX extension not supported by display: %s",
+ XDisplayName(display));
+ __glutScreen = DefaultScreen(__glutDisplay);
+ __glutRoot = RootWindow(__glutDisplay, __glutScreen);
+ __glutScreenWidth = DisplayWidth(__glutDisplay, __glutScreen);
+ __glutScreenHeight = DisplayHeight(__glutDisplay,
+ __glutScreen);
+ __glutConnectionFD = ConnectionNumber(__glutDisplay);
+ __glutWMDeleteWindow = XSGIFastInternAtom(__glutDisplay,
+ "WM_DELETE_WINDOW", SGI_XA_WM_DELETE_WINDOW, False);
+}
+#endif /* _WIN32 */
+
+void
+#ifdef OLD_VMS
+ __glutInitTime(struct timeval6 *beginning)
+#else
+ __glutInitTime(struct timeval *beginning)
+#endif
+{
+ static int beenhere = 0;
+#ifdef OLD_VMS
+ static struct timeval6 genesis;
+#else
+ static struct timeval genesis;
+#endif
+
+ if (!beenhere) {
+ GETTIMEOFDAY(&genesis);
+ beenhere = 1;
+ }
+ *beginning = genesis;
+}
+
+static void
+removeArgs(int *argcp, char **argv, int numToRemove)
+{
+ int i, j;
+
+ for (i = 0, j = numToRemove; argv[j]; i++, j++) {
+ argv[i] = argv[j];
+ }
+ argv[i] = NULL;
+ *argcp -= numToRemove;
+}
+
+void GLUTAPIENTRY
+glutInit(int *argcp, char **argv)
+{
+ char *display = NULL;
+ char *str, *geometry = NULL;
+#ifdef OLD_VMS
+ struct timeval6 unused;
+#else
+ struct timeval unused;
+#endif
+ int i;
+
+ if (__glutDisplay) {
+ __glutWarning("glutInit being called a second time.");
+ return;
+ }
+ /* Determine temporary program name. */
+ str = strrchr(argv[0], '/');
+ if (str == NULL) {
+ __glutProgramName = argv[0];
+ } else {
+ __glutProgramName = str + 1;
+ }
+
+ /* Make private copy of command line arguments. */
+ __glutArgc = *argcp;
+ __glutArgv = (char **) malloc(__glutArgc * sizeof(char *));
+ if (!__glutArgv)
+ __glutFatalError("out of memory.");
+ for (i = 0; i < __glutArgc; i++) {
+ __glutArgv[i] = __glutStrdup(argv[i]);
+ if (!__glutArgv[i])
+ __glutFatalError("out of memory.");
+ }
+
+ /* determine permanent program name */
+ str = strrchr(__glutArgv[0], '/');
+ if (str == NULL) {
+ __glutProgramName = __glutArgv[0];
+ } else {
+ __glutProgramName = str + 1;
+ }
+
+ /* parse arguments for standard options */
+ for (i = 1; i < __glutArgc; i++) {
+ if (!strcmp(__glutArgv[i], "-display")) {
+#if defined(_WIN32)
+ __glutWarning("-display option not supported by Win32 GLUT.");
+#endif
+ if (++i >= __glutArgc) {
+ __glutFatalError(
+ "follow -display option with X display name.");
+ }
+ display = __glutArgv[i];
+ removeArgs(argcp, &argv[1], 2);
+ } else if (!strcmp(__glutArgv[i], "-geometry")) {
+ if (++i >= __glutArgc) {
+ __glutFatalError(
+ "follow -geometry option with geometry parameter.");
+ }
+ geometry = __glutArgv[i];
+ removeArgs(argcp, &argv[1], 2);
+ } else if (!strcmp(__glutArgv[i], "-direct")) {
+#if defined(_WIN32)
+ __glutWarning("-direct option not supported by Win32 GLUT.");
+#endif
+ if (!__glutTryDirect)
+ __glutFatalError(
+ "cannot force both direct and indirect rendering.");
+ __glutForceDirect = GL_TRUE;
+ removeArgs(argcp, &argv[1], 1);
+ } else if (!strcmp(__glutArgv[i], "-indirect")) {
+#if defined(_WIN32)
+ __glutWarning("-indirect option not supported by Win32 GLUT.");
+#endif
+ if (__glutForceDirect)
+ __glutFatalError(
+ "cannot force both direct and indirect rendering.");
+ __glutTryDirect = GL_FALSE;
+ removeArgs(argcp, &argv[1], 1);
+ } else if (!strcmp(__glutArgv[i], "-iconic")) {
+ __glutIconic = GL_TRUE;
+ removeArgs(argcp, &argv[1], 1);
+ } else if (!strcmp(__glutArgv[i], "-gldebug")) {
+ __glutDebug = GL_TRUE;
+ removeArgs(argcp, &argv[1], 1);
+ } else if (!strcmp(__glutArgv[i], "-sync")) {
+#if defined(_WIN32)
+ __glutWarning("-sync option not supported by Win32 GLUT.");
+#endif
+ synchronize = GL_TRUE;
+ removeArgs(argcp, &argv[1], 1);
+ } else {
+ /* Once unknown option encountered, stop command line
+ processing. */
+ break;
+ }
+ }
+#if defined(__OS2__)
+ __glutOpenOS2Connection(display);
+#elif defined(_WIN32)
+ __glutOpenWin32Connection(display);
+#else
+ __glutOpenXConnection(display);
+#endif
+ if (geometry) {
+ int flags, x, y, width, height;
+
+ /* Fix bogus "{width|height} may be used before set"
+ warning */
+ width = 0;
+ height = 0;
+
+ flags = XParseGeometry(geometry, &x, &y,
+ (unsigned int *) &width, (unsigned int *) &height);
+ if (WidthValue & flags) {
+ /* Careful because X does not allow zero or negative
+ width windows */
+ if (width > 0)
+ __glutInitWidth = width;
+ }
+ if (HeightValue & flags) {
+ /* Careful because X does not allow zero or negative
+ height windows */
+ if (height > 0)
+ __glutInitHeight = height;
+ }
+ glutInitWindowSize(__glutInitWidth, __glutInitHeight);
+ if (XValue & flags) {
+ if (XNegative & flags)
+ x = DisplayWidth(__glutDisplay, __glutScreen) +
+ x - __glutSizeHints.width;
+ /* Play safe: reject negative X locations */
+ if (x >= 0)
+ __glutInitX = x;
+ }
+ if (YValue & flags) {
+ if (YNegative & flags)
+ y = DisplayHeight(__glutDisplay, __glutScreen) +
+ y - __glutSizeHints.height;
+ /* Play safe: reject negative Y locations */
+ if (y >= 0)
+ __glutInitY = y;
+ }
+ glutInitWindowPosition(__glutInitX, __glutInitY);
+ }
+ __glutInitTime(&unused);
+
+ /* check if GLUT_FPS env var is set */
+ {
+ const char *fps = getenv("GLUT_FPS");
+ if (fps) {
+ sscanf(fps, "%d", &__glutFPS);
+ if (__glutFPS <= 0)
+ __glutFPS = 5000; /* 5000 milliseconds */
+ }
+ }
+}
+
+#ifdef _WIN32
+void APIENTRY
+__glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int))
+{
+ __glutExitFunc = exitfunc;
+ glutInit(argcp, argv);
+}
+#endif
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutInitWindowPosition(int x, int y)
+{
+ __glutInitX = x;
+ __glutInitY = y;
+ if (x >= 0 && y >= 0) {
+ __glutSizeHints.x = x;
+ __glutSizeHints.y = y;
+ __glutSizeHints.flags |= USPosition;
+ } else {
+ __glutSizeHints.flags &= ~USPosition;
+ }
+}
+
+void GLUTAPIENTRY
+glutInitWindowSize(int width, int height)
+{
+ __glutInitWidth = width;
+ __glutInitHeight = height;
+ if (width > 0 && height > 0) {
+ __glutSizeHints.width = width;
+ __glutSizeHints.height = height;
+ __glutSizeHints.flags |= USSize;
+ } else {
+ __glutSizeHints.flags &= ~USSize;
+ }
+}
+
+void GLUTAPIENTRY
+glutInitDisplayMode(unsigned int mask)
+{
+ __glutDisplayMode = mask;
+}
+
+/* ENDCENTRY */
diff --git a/src/glut/os2/glut_input.cpp b/src/glut/os2/glut_input.cpp
new file mode 100644
index 00000000000..c517fe12490
--- /dev/null
+++ b/src/glut/os2/glut_input.cpp
@@ -0,0 +1,628 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1997, 1998. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "glutint.h"
+#define POFIG 0
+#if POFIG
+
+int __glutNumDials = 0;
+int __glutNumSpaceballButtons = 0;
+int __glutNumButtonBoxButtons = 0;
+int __glutNumTabletButtons = 0;
+int __glutNumMouseButtons = 3; /* Good guess. */
+XDevice *__glutTablet = NULL;
+XDevice *__glutDials = NULL;
+XDevice *__glutSpaceball = NULL;
+
+int __glutHasJoystick = 0;
+int __glutNumJoystickButtons = 0;
+int __glutNumJoystickAxes = 0;
+
+#if !defined(_WIN32)
+typedef struct _Range {
+ int min;
+ int range;
+} Range;
+
+#define NUM_SPACEBALL_AXIS 6
+#define NUM_TABLET_AXIS 2
+#define NUM_DIALS_AXIS 8
+
+Range __glutSpaceballRange[NUM_SPACEBALL_AXIS];
+Range __glutTabletRange[NUM_TABLET_AXIS];
+int *__glutDialsResolution;
+
+/* Safely assumes 0 is an illegal event type for X Input
+ extension events. */
+int __glutDeviceMotionNotify = 0;
+int __glutDeviceButtonPress = 0;
+int __glutDeviceButtonPressGrab = 0;
+int __glutDeviceButtonRelease = 0;
+int __glutDeviceStateNotify = 0;
+
+static int
+normalizeTabletPos(int axis, int rawValue)
+{
+ assert(rawValue >= __glutTabletRange[axis].min);
+ assert(rawValue <= __glutTabletRange[axis].min
+ + __glutTabletRange[axis].range);
+ /* Normalize rawValue to between 0 and 4000. */
+ return ((rawValue - __glutTabletRange[axis].min) * 4000) /
+ __glutTabletRange[axis].range;
+}
+
+static int
+normalizeDialAngle(int axis, int rawValue)
+{
+ /* XXX Assumption made that the resolution of the device is
+ number of clicks for one complete dial revolution. This
+ is true for SGI's dial & button box. */
+ return (rawValue * 360.0) / __glutDialsResolution[axis];
+}
+
+static int
+normalizeSpaceballAngle(int axis, int rawValue)
+{
+ assert(rawValue >= __glutSpaceballRange[axis].min);
+ assert(rawValue <= __glutSpaceballRange[axis].min +
+ __glutSpaceballRange[axis].range);
+ /* Normalize rawValue to between -1800 and 1800. */
+ return ((rawValue - __glutSpaceballRange[axis].min) * 3600) /
+ __glutSpaceballRange[axis].range - 1800;
+}
+
+static int
+normalizeSpaceballDelta(int axis, int rawValue)
+{
+ assert(rawValue >= __glutSpaceballRange[axis].min);
+ assert(rawValue <= __glutSpaceballRange[axis].min +
+ __glutSpaceballRange[axis].range);
+ /* Normalize rawValue to between -1000 and 1000. */
+ return ((rawValue - __glutSpaceballRange[axis].min) * 2000) /
+ __glutSpaceballRange[axis].range - 1000;
+}
+
+static void
+queryTabletPos(GLUTwindow * window)
+{
+ XDeviceState *state;
+ XInputClass *any;
+ XValuatorState *v;
+ int i;
+
+ state = XQueryDeviceState(__glutDisplay, __glutTablet);
+ any = state->data;
+ for (i = 0; i < state->num_classes; i++) {
+#if defined(__cplusplus) || defined(c_plusplus)
+ switch (any->c_class) {
+#else
+ switch (any->class) {
+#endif
+ case ValuatorClass:
+ v = (XValuatorState *) any;
+ if (v->num_valuators < 2)
+ goto end;
+ if (window->tabletPos[0] == -1)
+ window->tabletPos[0] = normalizeTabletPos(0, v->valuators[0]);
+ if (window->tabletPos[1] == -1)
+ window->tabletPos[1] = normalizeTabletPos(1, v->valuators[1]);
+ }
+ any = (XInputClass *) ((char *) any + any->length);
+ }
+end:
+ XFreeDeviceState(state);
+}
+
+static void
+tabletPosChange(GLUTwindow * window, int first, int count, int *data)
+{
+ int i, value, genEvent = 0;
+
+ for (i = first; i < first + count; i++) {
+ switch (i) {
+ case 0: /* X axis */
+ case 1: /* Y axis */
+ value = normalizeTabletPos(i, data[i - first]);
+ if (value != window->tabletPos[i]) {
+ window->tabletPos[i] = value;
+ genEvent = 1;
+ }
+ break;
+ }
+ }
+ if (window->tabletPos[0] == -1 || window->tabletPos[1] == -1)
+ queryTabletPos(window);
+ if (genEvent)
+ window->tabletMotion(window->tabletPos[0], window->tabletPos[1]);
+}
+#endif /* !_WIN32 */
+
+static int
+__glutProcessDeviceEvents(XEvent * event)
+{
+#if !defined(_WIN32)
+ GLUTwindow *window;
+
+ /* XXX Ugly code fan out. */
+
+ /* Can't use switch/case since X Input event types are
+ dynamic. */
+
+ if (__glutDeviceMotionNotify && event->type == __glutDeviceMotionNotify) {
+ XDeviceMotionEvent *devmot = (XDeviceMotionEvent *) event;
+
+ window = __glutGetWindow(devmot->window);
+ if (window) {
+ if (__glutTablet
+ && devmot->deviceid == __glutTablet->device_id
+ && window->tabletMotion) {
+ tabletPosChange(window, devmot->first_axis, devmot->axes_count,
+ devmot->axis_data);
+ } else if (__glutDials
+ && devmot->deviceid == __glutDials->device_id
+ && window->dials) {
+ int i, first = devmot->first_axis, count = devmot->axes_count;
+
+ for (i = first; i < first + count; i++)
+ window->dials(i + 1,
+ normalizeDialAngle(i, devmot->axis_data[i - first]));
+ } else if (__glutSpaceball
+ && devmot->deviceid == __glutSpaceball->device_id) {
+ /* XXX Assume that space ball motion events come in as
+ all the first 6 axes. Assume first 3 axes are XYZ
+ translations; second 3 axes are XYZ rotations. */
+ if (devmot->first_axis == 0 && devmot->axes_count == 6) {
+ if (window->spaceMotion)
+ window->spaceMotion(
+ normalizeSpaceballDelta(0, devmot->axis_data[0]),
+ normalizeSpaceballDelta(1, devmot->axis_data[1]),
+ normalizeSpaceballDelta(2, devmot->axis_data[2]));
+ if (window->spaceRotate)
+ window->spaceRotate(
+ normalizeSpaceballAngle(3, devmot->axis_data[3]),
+ normalizeSpaceballAngle(4, devmot->axis_data[4]),
+ normalizeSpaceballAngle(5, devmot->axis_data[5]));
+ }
+ }
+ return 1;
+ }
+ } else if (__glutDeviceButtonPress
+ && event->type == __glutDeviceButtonPress) {
+ XDeviceButtonEvent *devbtn = (XDeviceButtonEvent *) event;
+
+ window = __glutGetWindow(devbtn->window);
+ if (window) {
+ if (__glutTablet
+ && devbtn->deviceid == __glutTablet->device_id
+ && window->tabletButton
+ && devbtn->first_axis == 0
+ && devbtn->axes_count == 2) {
+ tabletPosChange(window, devbtn->first_axis, devbtn->axes_count,
+ devbtn->axis_data);
+ window->tabletButton(devbtn->button, GLUT_DOWN,
+ window->tabletPos[0], window->tabletPos[1]);
+ } else if (__glutDials
+ && devbtn->deviceid == __glutDials->device_id
+ && window->buttonBox) {
+ window->buttonBox(devbtn->button, GLUT_DOWN);
+ } else if (__glutSpaceball
+ && devbtn->deviceid == __glutSpaceball->device_id
+ && window->spaceButton) {
+ window->spaceButton(devbtn->button, GLUT_DOWN);
+ }
+ return 1;
+ }
+ } else if (__glutDeviceButtonRelease
+ && event->type == __glutDeviceButtonRelease) {
+ XDeviceButtonEvent *devbtn = (XDeviceButtonEvent *) event;
+
+ window = __glutGetWindow(devbtn->window);
+ if (window) {
+ if (__glutTablet
+ && devbtn->deviceid == __glutTablet->device_id
+ && window->tabletButton
+ && devbtn->first_axis == 0
+ && devbtn->axes_count == 2) {
+ tabletPosChange(window, devbtn->first_axis, devbtn->axes_count,
+ devbtn->axis_data);
+ window->tabletButton(devbtn->button, GLUT_UP,
+ window->tabletPos[0], window->tabletPos[1]);
+ } else if (__glutDials
+ && devbtn->deviceid == __glutDials->device_id
+ && window->buttonBox) {
+ window->buttonBox(devbtn->button, GLUT_UP);
+ } else if (__glutSpaceball
+ && devbtn->deviceid == __glutSpaceball->device_id
+ && window->spaceButton) {
+ window->spaceButton(devbtn->button, GLUT_UP);
+ }
+ return 1;
+ }
+ }
+#else
+ {
+ JOYINFOEX info;
+ JOYCAPS joyCaps;
+
+ memset(&info, 0, sizeof(JOYINFOEX));
+ info.dwSize = sizeof(JOYINFOEX);
+ info.dwFlags = JOY_RETURNALL;
+
+ if (joyGetPosEx(JOYSTICKID1,&info) != JOYERR_NOERROR) {
+ __glutHasJoystick = 1;
+ joyGetDevCaps(JOYSTICKID1, &joyCaps, sizeof(joyCaps));
+ __glutNumJoystickButtons = joyCaps.wNumButtons;
+ __glutNumJoystickAxes = joyCaps.wNumAxes;
+ } else {
+ __glutHasJoystick = 0;
+ __glutNumJoystickButtons = 0;
+ __glutNumJoystickAxes = 0;
+ }
+ }
+#endif /* !_WIN32 */
+ return 0;
+}
+
+static GLUTeventParser eventParser =
+{__glutProcessDeviceEvents, NULL};
+
+static void
+addDeviceEventParser(void)
+{
+ static Bool been_here = False;
+
+ if (been_here)
+ return;
+ been_here = True;
+ __glutRegisterEventParser(&eventParser);
+}
+
+static int
+probeDevices(void)
+{
+ static Bool been_here = False;
+ static int support;
+#if !defined(_WIN32)
+ XExtensionVersion *version;
+ XDeviceInfoPtr device_info, device;
+ XAnyClassPtr any;
+ XButtonInfoPtr b;
+ XValuatorInfoPtr v;
+ XAxisInfoPtr a;
+ int num_dev = 0, btns = 0, dials = 0;
+ int i, j, k;
+#endif /* !_WIN32 */
+
+ if (been_here) {
+ return support;
+ }
+ been_here = True;
+
+#if !defined(_WIN32)
+ version = XGetExtensionVersion(__glutDisplay, "XInputExtension");
+ /* Ugh. XInput extension API forces annoying cast of a pointer
+ to a long so it can be compared with the NoSuchExtension
+ value (#defined to 1). */
+ if (version == NULL || ((long) version) == NoSuchExtension) {
+ support = 0;
+ return support;
+ }
+ XFree(version);
+ device_info = XListInputDevices(__glutDisplay, &num_dev);
+ if (device_info) {
+ for (i = 0; i < num_dev; i++) {
+ /* XXX These are SGI names for these devices;
+ unfortunately, no good standard exists for standard
+ types of X input extension devices. */
+
+ device = &device_info[i];
+ any = (XAnyClassPtr) device->inputclassinfo;
+
+ if (!__glutSpaceball && !strcmp(device->name, "spaceball")) {
+ v = NULL;
+ b = NULL;
+ for (j = 0; j < device->num_classes; j++) {
+#if defined(__cplusplus) || defined(c_plusplus)
+ switch (any->c_class) {
+#else
+ switch (any->class) {
+#endif
+ case ButtonClass:
+ b = (XButtonInfoPtr) any;
+ btns = b->num_buttons;
+ break;
+ case ValuatorClass:
+ v = (XValuatorInfoPtr) any;
+ /* Sanity check: at least 6 valuators? */
+ if (v->num_axes < NUM_SPACEBALL_AXIS)
+ goto skip_device;
+ a = (XAxisInfoPtr) ((char *) v + sizeof(XValuatorInfo));
+ for (k = 0; k < NUM_SPACEBALL_AXIS; k++, a++) {
+ __glutSpaceballRange[k].min = a->min_value;
+ __glutSpaceballRange[k].range = a->max_value - a->min_value;
+ }
+ break;
+ }
+ any = (XAnyClassPtr) ((char *) any + any->length);
+ }
+ if (v) {
+ __glutSpaceball = XOpenDevice(__glutDisplay, device->id);
+ if (__glutSpaceball) {
+ __glutNumSpaceballButtons = btns;
+ addDeviceEventParser();
+ }
+ }
+ } else if (!__glutDials && !strcmp(device->name, "dial+buttons")) {
+ v = NULL;
+ b = NULL;
+ for (j = 0; j < device->num_classes; j++) {
+#if defined(__cplusplus) || defined(c_plusplus)
+ switch (any->c_class) {
+#else
+ switch (any->class) {
+#endif
+ case ButtonClass:
+ b = (XButtonInfoPtr) any;
+ btns = b->num_buttons;
+ break;
+ case ValuatorClass:
+ v = (XValuatorInfoPtr) any;
+ /* Sanity check: at least 8 valuators? */
+ if (v->num_axes < NUM_DIALS_AXIS)
+ goto skip_device;
+ dials = v->num_axes;
+ __glutDialsResolution = (int *) malloc(sizeof(int) * dials);
+ a = (XAxisInfoPtr) ((char *) v + sizeof(XValuatorInfo));
+ for (k = 0; k < dials; k++, a++) {
+ __glutDialsResolution[k] = a->resolution;
+ }
+ break;
+ }
+ any = (XAnyClassPtr) ((char *) any + any->length);
+ }
+ if (v) {
+ __glutDials = XOpenDevice(__glutDisplay, device->id);
+ if (__glutDials) {
+ __glutNumButtonBoxButtons = btns;
+ __glutNumDials = dials;
+ addDeviceEventParser();
+ }
+ }
+ } else if (!__glutTablet && !strcmp(device->name, "tablet")) {
+ v = NULL;
+ b = NULL;
+ for (j = 0; j < device->num_classes; j++) {
+#if defined(__cplusplus) || defined(c_plusplus)
+ switch (any->c_class) {
+#else
+ switch (any->class) {
+#endif
+ case ButtonClass:
+ b = (XButtonInfoPtr) any;
+ btns = b->num_buttons;
+ break;
+ case ValuatorClass:
+ v = (XValuatorInfoPtr) any;
+ /* Sanity check: exactly 2 valuators? */
+ if (v->num_axes != NUM_TABLET_AXIS)
+ goto skip_device;
+ a = (XAxisInfoPtr) ((char *) v + sizeof(XValuatorInfo));
+ for (k = 0; k < NUM_TABLET_AXIS; k++, a++) {
+ __glutTabletRange[k].min = a->min_value;
+ __glutTabletRange[k].range = a->max_value - a->min_value;
+ }
+ break;
+ }
+ any = (XAnyClassPtr) ((char *) any + any->length);
+ }
+ if (v) {
+ __glutTablet = XOpenDevice(__glutDisplay, device->id);
+ if (__glutTablet) {
+ __glutNumTabletButtons = btns;
+ addDeviceEventParser();
+ }
+ }
+ } else if (!strcmp(device->name, "mouse")) {
+ for (j = 0; j < device->num_classes; j++) {
+#if defined(__cplusplus) || defined(c_plusplus)
+ if (any->c_class == ButtonClass) {
+#else
+ if (any->class == ButtonClass) {
+#endif
+ b = (XButtonInfoPtr) any;
+ __glutNumMouseButtons = b->num_buttons;
+ }
+ any = (XAnyClassPtr) ((char *) any + any->length);
+ }
+ }
+ skip_device:;
+ }
+ XFreeDeviceList(device_info);
+ }
+#else /* _WIN32 */
+ __glutNumMouseButtons = GetSystemMetrics(SM_CMOUSEBUTTONS);
+#endif /* !_WIN32 */
+ /* X Input extension might be supported, but only if there is
+ a tablet, dials, or spaceball do we claim devices are
+ supported. */
+ support = __glutTablet || __glutDials || __glutSpaceball;
+ return support;
+}
+
+void
+__glutUpdateInputDeviceMask(GLUTwindow * window)
+{
+#if !defined(_WIN32)
+ /* 5 (dial and buttons) + 5 (tablet locator and buttons) + 5
+ (Spaceball buttons and axis) = 15 */
+ XEventClass eventList[15];
+ int rc, numEvents;
+
+ rc = probeDevices();
+ if (rc) {
+ numEvents = 0;
+ if (__glutTablet) {
+ if (window->tabletMotion) {
+ DeviceMotionNotify(__glutTablet, __glutDeviceMotionNotify,
+ eventList[numEvents]);
+ numEvents++;
+ }
+ if (window->tabletButton) {
+ DeviceButtonPress(__glutTablet, __glutDeviceButtonPress,
+ eventList[numEvents]);
+ numEvents++;
+ DeviceButtonPressGrab(__glutTablet, __glutDeviceButtonPressGrab,
+ eventList[numEvents]);
+ numEvents++;
+ DeviceButtonRelease(__glutTablet, __glutDeviceButtonRelease,
+ eventList[numEvents]);
+ numEvents++;
+ }
+ if (window->tabletMotion || window->tabletButton) {
+ DeviceStateNotify(__glutTablet, __glutDeviceStateNotify,
+ eventList[numEvents]);
+ numEvents++;
+ }
+ }
+ if (__glutDials) {
+ if (window->dials) {
+ DeviceMotionNotify(__glutDials, __glutDeviceMotionNotify,
+ eventList[numEvents]);
+ numEvents++;
+ }
+ if (window->buttonBox) {
+ DeviceButtonPress(__glutDials, __glutDeviceButtonPress,
+ eventList[numEvents]);
+ numEvents++;
+ DeviceButtonPressGrab(__glutDials, __glutDeviceButtonPressGrab,
+ eventList[numEvents]);
+ numEvents++;
+ DeviceButtonRelease(__glutDials, __glutDeviceButtonRelease,
+ eventList[numEvents]);
+ numEvents++;
+ }
+ if (window->dials || window->buttonBox) {
+ DeviceStateNotify(__glutDials, __glutDeviceStateNotify,
+ eventList[numEvents]);
+ numEvents++;
+ }
+ }
+ if (__glutSpaceball) {
+ if (window->spaceMotion || window->spaceRotate) {
+ DeviceMotionNotify(__glutSpaceball, __glutDeviceMotionNotify,
+ eventList[numEvents]);
+ numEvents++;
+ }
+ if (window->spaceButton) {
+ DeviceButtonPress(__glutSpaceball, __glutDeviceButtonPress,
+ eventList[numEvents]);
+ numEvents++;
+ DeviceButtonPressGrab(__glutSpaceball, __glutDeviceButtonPressGrab,
+ eventList[numEvents]);
+ numEvents++;
+ DeviceButtonRelease(__glutSpaceball, __glutDeviceButtonRelease,
+ eventList[numEvents]);
+ numEvents++;
+ }
+ if (window->spaceMotion || window->spaceRotate || window->spaceButton) {
+ DeviceStateNotify(__glutSpaceball, __glutDeviceStateNotify,
+ eventList[numEvents]);
+ numEvents++;
+ }
+ }
+#if 0
+ if (window->children) {
+ GLUTwindow *child = window->children;
+
+ do {
+ XChangeDeviceDontPropagateList(__glutDisplay, child->win,
+ numEvents, eventList, AddToList);
+ child = child->siblings;
+ } while (child);
+ }
+#endif
+ XSelectExtensionEvent(__glutDisplay, window->win,
+ eventList, numEvents);
+ if (window->overlay) {
+ XSelectExtensionEvent(__glutDisplay, window->overlay->win,
+ eventList, numEvents);
+ }
+ } else {
+ /* X Input extension not supported; no chance for exotic
+ input devices. */
+ }
+#endif /* !_WIN32 */
+}
+
+#endif //POFIG
+
+/* CENTRY */
+int GLUTAPIENTRY
+glutDeviceGet(GLenum param)
+{
+#if POFIG
+ probeDevices();
+#endif
+ switch (param) {
+ case GLUT_HAS_KEYBOARD:
+ case GLUT_HAS_MOUSE:
+ /* Assume window system always has mouse and keyboard. */
+ return 1;
+#if POFIG
+ case GLUT_HAS_SPACEBALL:
+ return __glutSpaceball != NULL;
+ case GLUT_HAS_DIAL_AND_BUTTON_BOX:
+ return __glutDials != NULL;
+ case GLUT_HAS_TABLET:
+ return __glutTablet != NULL;
+ case GLUT_NUM_MOUSE_BUTTONS:
+ return __glutNumMouseButtons;
+ case GLUT_NUM_SPACEBALL_BUTTONS:
+ return __glutNumSpaceballButtons;
+ case GLUT_NUM_BUTTON_BOX_BUTTONS:
+ return __glutNumButtonBoxButtons;
+ case GLUT_NUM_DIALS:
+ return __glutNumDials;
+ case GLUT_NUM_TABLET_BUTTONS:
+ return __glutNumTabletButtons;
+ case GLUT_DEVICE_IGNORE_KEY_REPEAT:
+ return __glutCurrentWindow->ignoreKeyRepeat;
+#ifndef _WIN32
+ case GLUT_DEVICE_KEY_REPEAT:
+ {
+ XKeyboardState state;
+
+ XGetKeyboardControl(__glutDisplay, &state);
+ return state.global_auto_repeat;
+ }
+ case GLUT_JOYSTICK_POLL_RATE:
+ return 0;
+#else
+ case GLUT_DEVICE_KEY_REPEAT:
+ /* Win32 cannot globally disable key repeat. */
+ return GLUT_KEY_REPEAT_ON;
+ case GLUT_JOYSTICK_POLL_RATE:
+ return __glutCurrentWindow->joyPollInterval;
+#endif
+ case GLUT_HAS_JOYSTICK:
+ return __glutHasJoystick;
+ case GLUT_JOYSTICK_BUTTONS:
+ return __glutNumJoystickButtons;
+ case GLUT_JOYSTICK_AXES:
+ return __glutNumJoystickAxes;
+#endif //POFIG
+ default:
+ __glutWarning("invalid glutDeviceGet parameter: %d", param);
+ return -1;
+ }
+}
+/* ENDCENTRY */
diff --git a/src/glut/os2/glut_key.cpp b/src/glut/os2/glut_key.cpp
new file mode 100644
index 00000000000..a1b9919abc4
--- /dev/null
+++ b/src/glut/os2/glut_key.cpp
@@ -0,0 +1,29 @@
+
+/* Copyright (c) Mark J. Kilgard, 1997. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include <stdlib.h>
+
+#include "glutint.h"
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutKeyboardFunc(GLUTkeyboardCB keyboardFunc)
+{
+ __glutChangeWindowEventMask(KeyPressMask,
+ keyboardFunc != NULL || __glutCurrentWindow->special != NULL);
+ __glutCurrentWindow->keyboard = keyboardFunc;
+}
+
+void GLUTAPIENTRY
+glutSpecialFunc(GLUTspecialCB specialFunc)
+{
+ __glutChangeWindowEventMask(KeyPressMask,
+ specialFunc != NULL || __glutCurrentWindow->keyboard != NULL);
+ __glutCurrentWindow->special = specialFunc;
+}
+
+/* ENDCENTRY */
diff --git a/src/glut/os2/glut_keyctrl.cpp b/src/glut/os2/glut_keyctrl.cpp
new file mode 100644
index 00000000000..b0f3a28f7d8
--- /dev/null
+++ b/src/glut/os2/glut_keyctrl.cpp
@@ -0,0 +1,29 @@
+
+/* Copyright (c) Mark J. Kilgard, 1996, 1997. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include "glutint.h"
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutIgnoreKeyRepeat(int ignore)
+{
+ __glutCurrentWindow->ignoreKeyRepeat = ignore;
+}
+
+void GLUTAPIENTRY
+glutSetKeyRepeat(int repeatMode)
+{
+#if !defined(_WIN32) && !defined(__OS2PM__)
+ XKeyboardControl values;
+
+ /* GLUT's repeatMode #define's match the Xlib API values. */
+ values.auto_repeat_mode = repeatMode;
+ XChangeKeyboardControl(__glutDisplay, KBAutoRepeatMode, &values);
+#endif
+}
+
+/* ENDCENTRY */
diff --git a/src/glut/os2/glut_keyup.cpp b/src/glut/os2/glut_keyup.cpp
new file mode 100644
index 00000000000..ada758e2774
--- /dev/null
+++ b/src/glut/os2/glut_keyup.cpp
@@ -0,0 +1,29 @@
+
+/* Copyright (c) Mark J. Kilgard, 1997. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include <stdlib.h>
+
+#include "glutint.h"
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutKeyboardUpFunc(GLUTkeyboardCB keyboardUpFunc)
+{
+ __glutChangeWindowEventMask(KeyReleaseMask,
+ keyboardUpFunc != NULL || __glutCurrentWindow->specialUp != NULL);
+ __glutCurrentWindow->keyboardUp = keyboardUpFunc;
+}
+
+void GLUTAPIENTRY
+glutSpecialUpFunc(GLUTspecialCB specialUpFunc)
+{
+ __glutChangeWindowEventMask(KeyReleaseMask,
+ specialUpFunc != NULL || __glutCurrentWindow->keyboardUp != NULL);
+ __glutCurrentWindow->specialUp = specialUpFunc;
+}
+
+/* ENDCENTRY */
diff --git a/src/glut/os2/glut_mesa.cpp b/src/glut/os2/glut_mesa.cpp
new file mode 100644
index 00000000000..73682a50672
--- /dev/null
+++ b/src/glut/os2/glut_mesa.cpp
@@ -0,0 +1,57 @@
+
+/* Copyright (c) Mark J. Kilgard, 1996. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include <stdlib.h>
+#include <string.h>
+#include "glutint.h"
+
+int __glutMesaSwapHackSupport = 0; /* Not supported until
+ proven otherwise. */
+
+/* Use the "Mesa swap hack" if reasonable if and only if
+ MESA_SWAP_HACK is set to something whose first character is
+ not "N" or "n" AND "Brian Paul" is the vendor string AND
+ "Mesa X11"* (or "Mesa" for backward compatibility) is the
+ renderer string.
+
+ Anyone who modifies Mesa so that glXSwapBuffers does not
+ simply blit the previously rendered back buffer should
+ change either their vendor or renderer string to avoid
+ confusing GLUT. */
+
+void
+__glutDetermineMesaSwapHackSupport(void)
+{
+ static int doneAlready = 0;
+ char *env, *vendor, *renderer;
+
+ if (doneAlready)
+ return;
+ env = getenv("MESA_SWAP_HACK");
+ if (env) {
+ if ((env[0] != 'n') && (env[0] != 'N')) {
+ vendor = (char *) glGetString(GL_VENDOR);
+ renderer = (char *) glGetString(GL_RENDERER);
+
+ /* Old versions of X11 Mesa uses the renderer string
+ "Mesa"; Brian plans to start using "Mesa X11" to
+ distinguish the X version of Mesa from other flavor
+ such as Windows or 3Dfx. */
+
+#define MESA_X11 "Mesa X11"
+
+ /* XXX At some point in the future, eliminate the
+ backward compatibility for the old "Mesa" renderer
+ string. */
+
+ if (!strcmp(vendor, "Brian Paul") && (!strcmp(renderer, "Mesa") ||
+ !strncmp(renderer, MESA_X11, sizeof(MESA_X11) - 1)))
+ __glutMesaSwapHackSupport = 1;
+ }
+ }
+ doneAlready = 1;
+}
diff --git a/src/glut/os2/glut_modifier.cpp b/src/glut/os2/glut_modifier.cpp
new file mode 100644
index 00000000000..0ffa5a68010
--- /dev/null
+++ b/src/glut/os2/glut_modifier.cpp
@@ -0,0 +1,31 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include "glutint.h"
+
+/* CENTRY */
+int GLUTAPIENTRY
+glutGetModifiers(void)
+{
+ int modifiers;
+
+ if(__glutModifierMask == (unsigned int) ~0) {
+ __glutWarning(
+ "glutCurrentModifiers: do not call outside core input callback.");
+ return 0;
+ }
+ modifiers = 0;
+ if(__glutModifierMask & (ShiftMask|LockMask))
+ modifiers |= GLUT_ACTIVE_SHIFT;
+ if(__glutModifierMask & ControlMask)
+ modifiers |= GLUT_ACTIVE_CTRL;
+ if(__glutModifierMask & Mod1Mask)
+ modifiers |= GLUT_ACTIVE_ALT;
+ return modifiers;
+}
+
+/* ENDCENTRY */
diff --git a/src/glut/os2/glut_roman.cpp b/src/glut/os2/glut_roman.cpp
new file mode 100644
index 00000000000..8e25de8ac1a
--- /dev/null
+++ b/src/glut/os2/glut_roman.cpp
@@ -0,0 +1,2451 @@
+
+/* GENERATED FILE -- DO NOT MODIFY */
+
+#include "glutstroke.h"
+
+/* char: 33 '!' */
+
+static const CoordRec char33_stroke0[] = {
+ { 13.3819, 100 },
+ { 13.3819, 33.3333 },
+};
+
+static const CoordRec char33_stroke1[] = {
+ { 13.3819, 9.5238 },
+ { 8.62, 4.7619 },
+ { 13.3819, 0 },
+ { 18.1438, 4.7619 },
+ { 13.3819, 9.5238 },
+};
+
+static const StrokeRec char33[] = {
+ { 2, char33_stroke0 },
+ { 5, char33_stroke1 },
+};
+
+/* char: 34 '"' */
+
+static const CoordRec char34_stroke0[] = {
+ { 4.02, 100 },
+ { 4.02, 66.6667 },
+};
+
+static const CoordRec char34_stroke1[] = {
+ { 42.1152, 100 },
+ { 42.1152, 66.6667 },
+};
+
+static const StrokeRec char34[] = {
+ { 2, char34_stroke0 },
+ { 2, char34_stroke1 },
+};
+
+/* char: 35 '#' */
+
+static const CoordRec char35_stroke0[] = {
+ { 41.2952, 119.048 },
+ { 7.9619, -33.3333 },
+};
+
+static const CoordRec char35_stroke1[] = {
+ { 69.8667, 119.048 },
+ { 36.5333, -33.3333 },
+};
+
+static const CoordRec char35_stroke2[] = {
+ { 7.9619, 57.1429 },
+ { 74.6286, 57.1429 },
+};
+
+static const CoordRec char35_stroke3[] = {
+ { 3.2, 28.5714 },
+ { 69.8667, 28.5714 },
+};
+
+static const StrokeRec char35[] = {
+ { 2, char35_stroke0 },
+ { 2, char35_stroke1 },
+ { 2, char35_stroke2 },
+ { 2, char35_stroke3 },
+};
+
+/* char: 36 '$' */
+
+static const CoordRec char36_stroke0[] = {
+ { 28.6295, 119.048 },
+ { 28.6295, -19.0476 },
+};
+
+static const CoordRec char36_stroke1[] = {
+ { 47.6771, 119.048 },
+ { 47.6771, -19.0476 },
+};
+
+static const CoordRec char36_stroke2[] = {
+ { 71.4867, 85.7143 },
+ { 61.9629, 95.2381 },
+ { 47.6771, 100 },
+ { 28.6295, 100 },
+ { 14.3438, 95.2381 },
+ { 4.82, 85.7143 },
+ { 4.82, 76.1905 },
+ { 9.5819, 66.6667 },
+ { 14.3438, 61.9048 },
+ { 23.8676, 57.1429 },
+ { 52.439, 47.619 },
+ { 61.9629, 42.8571 },
+ { 66.7248, 38.0952 },
+ { 71.4867, 28.5714 },
+ { 71.4867, 14.2857 },
+ { 61.9629, 4.7619 },
+ { 47.6771, 0 },
+ { 28.6295, 0 },
+ { 14.3438, 4.7619 },
+ { 4.82, 14.2857 },
+};
+
+static const StrokeRec char36[] = {
+ { 2, char36_stroke0 },
+ { 2, char36_stroke1 },
+ { 20, char36_stroke2 },
+};
+
+/* char: 37 '%' */
+
+static const CoordRec char37_stroke0[] = {
+ { 92.0743, 100 },
+ { 6.36, 0 },
+};
+
+static const CoordRec char37_stroke1[] = {
+ { 30.1695, 100 },
+ { 39.6933, 90.4762 },
+ { 39.6933, 80.9524 },
+ { 34.9314, 71.4286 },
+ { 25.4076, 66.6667 },
+ { 15.8838, 66.6667 },
+ { 6.36, 76.1905 },
+ { 6.36, 85.7143 },
+ { 11.1219, 95.2381 },
+ { 20.6457, 100 },
+ { 30.1695, 100 },
+ { 39.6933, 95.2381 },
+ { 53.979, 90.4762 },
+ { 68.2648, 90.4762 },
+ { 82.5505, 95.2381 },
+ { 92.0743, 100 },
+};
+
+static const CoordRec char37_stroke2[] = {
+ { 73.0267, 33.3333 },
+ { 63.5029, 28.5714 },
+ { 58.741, 19.0476 },
+ { 58.741, 9.5238 },
+ { 68.2648, 0 },
+ { 77.7886, 0 },
+ { 87.3124, 4.7619 },
+ { 92.0743, 14.2857 },
+ { 92.0743, 23.8095 },
+ { 82.5505, 33.3333 },
+ { 73.0267, 33.3333 },
+};
+
+static const StrokeRec char37[] = {
+ { 2, char37_stroke0 },
+ { 16, char37_stroke1 },
+ { 11, char37_stroke2 },
+};
+
+/* char: 38 '&' */
+
+static const CoordRec char38_stroke0[] = {
+ { 101.218, 57.1429 },
+ { 101.218, 61.9048 },
+ { 96.4562, 66.6667 },
+ { 91.6943, 66.6667 },
+ { 86.9324, 61.9048 },
+ { 82.1705, 52.381 },
+ { 72.6467, 28.5714 },
+ { 63.1229, 14.2857 },
+ { 53.599, 4.7619 },
+ { 44.0752, 0 },
+ { 25.0276, 0 },
+ { 15.5038, 4.7619 },
+ { 10.7419, 9.5238 },
+ { 5.98, 19.0476 },
+ { 5.98, 28.5714 },
+ { 10.7419, 38.0952 },
+ { 15.5038, 42.8571 },
+ { 48.8371, 61.9048 },
+ { 53.599, 66.6667 },
+ { 58.361, 76.1905 },
+ { 58.361, 85.7143 },
+ { 53.599, 95.2381 },
+ { 44.0752, 100 },
+ { 34.5514, 95.2381 },
+ { 29.7895, 85.7143 },
+ { 29.7895, 76.1905 },
+ { 34.5514, 61.9048 },
+ { 44.0752, 47.619 },
+ { 67.8848, 14.2857 },
+ { 77.4086, 4.7619 },
+ { 86.9324, 0 },
+ { 96.4562, 0 },
+ { 101.218, 4.7619 },
+ { 101.218, 9.5238 },
+};
+
+static const StrokeRec char38[] = {
+ { 34, char38_stroke0 },
+};
+
+/* char: 39 ''' */
+
+static const CoordRec char39_stroke0[] = {
+ { 4.44, 100 },
+ { 4.44, 66.6667 },
+};
+
+static const StrokeRec char39[] = {
+ { 2, char39_stroke0 },
+};
+
+/* char: 40 '(' */
+
+static const CoordRec char40_stroke0[] = {
+ { 40.9133, 119.048 },
+ { 31.3895, 109.524 },
+ { 21.8657, 95.2381 },
+ { 12.3419, 76.1905 },
+ { 7.58, 52.381 },
+ { 7.58, 33.3333 },
+ { 12.3419, 9.5238 },
+ { 21.8657, -9.5238 },
+ { 31.3895, -23.8095 },
+ { 40.9133, -33.3333 },
+};
+
+static const StrokeRec char40[] = {
+ { 10, char40_stroke0 },
+};
+
+/* char: 41 ')' */
+
+static const CoordRec char41_stroke0[] = {
+ { 5.28, 119.048 },
+ { 14.8038, 109.524 },
+ { 24.3276, 95.2381 },
+ { 33.8514, 76.1905 },
+ { 38.6133, 52.381 },
+ { 38.6133, 33.3333 },
+ { 33.8514, 9.5238 },
+ { 24.3276, -9.5238 },
+ { 14.8038, -23.8095 },
+ { 5.28, -33.3333 },
+};
+
+static const StrokeRec char41[] = {
+ { 10, char41_stroke0 },
+};
+
+/* char: 42 '*' */
+
+static const CoordRec char42_stroke0[] = {
+ { 30.7695, 71.4286 },
+ { 30.7695, 14.2857 },
+};
+
+static const CoordRec char42_stroke1[] = {
+ { 6.96, 57.1429 },
+ { 54.579, 28.5714 },
+};
+
+static const CoordRec char42_stroke2[] = {
+ { 54.579, 57.1429 },
+ { 6.96, 28.5714 },
+};
+
+static const StrokeRec char42[] = {
+ { 2, char42_stroke0 },
+ { 2, char42_stroke1 },
+ { 2, char42_stroke2 },
+};
+
+/* char: 43 '+' */
+
+static const CoordRec char43_stroke0[] = {
+ { 48.8371, 85.7143 },
+ { 48.8371, 0 },
+};
+
+static const CoordRec char43_stroke1[] = {
+ { 5.98, 42.8571 },
+ { 91.6943, 42.8571 },
+};
+
+static const StrokeRec char43[] = {
+ { 2, char43_stroke0 },
+ { 2, char43_stroke1 },
+};
+
+/* char: 44 ',' */
+
+static const CoordRec char44_stroke0[] = {
+ { 18.2838, 4.7619 },
+ { 13.5219, 0 },
+ { 8.76, 4.7619 },
+ { 13.5219, 9.5238 },
+ { 18.2838, 4.7619 },
+ { 18.2838, -4.7619 },
+ { 13.5219, -14.2857 },
+ { 8.76, -19.0476 },
+};
+
+static const StrokeRec char44[] = {
+ { 8, char44_stroke0 },
+};
+
+/* char: 45 '-' */
+
+static const CoordRec char45_stroke0[] = {
+ { 7.38, 42.8571 },
+ { 93.0943, 42.8571 },
+};
+
+static const StrokeRec char45[] = {
+ { 2, char45_stroke0 },
+};
+
+/* char: 46 '.' */
+
+static const CoordRec char46_stroke0[] = {
+ { 13.1019, 9.5238 },
+ { 8.34, 4.7619 },
+ { 13.1019, 0 },
+ { 17.8638, 4.7619 },
+ { 13.1019, 9.5238 },
+};
+
+static const StrokeRec char46[] = {
+ { 5, char46_stroke0 },
+};
+
+/* char: 47 '/' */
+
+static const CoordRec char47_stroke0[] = {
+ { 7.24, -14.2857 },
+ { 73.9067, 100 },
+};
+
+static const StrokeRec char47[] = {
+ { 2, char47_stroke0 },
+};
+
+/* char: 48 '0' */
+
+static const CoordRec char48_stroke0[] = {
+ { 33.5514, 100 },
+ { 19.2657, 95.2381 },
+ { 9.7419, 80.9524 },
+ { 4.98, 57.1429 },
+ { 4.98, 42.8571 },
+ { 9.7419, 19.0476 },
+ { 19.2657, 4.7619 },
+ { 33.5514, 0 },
+ { 43.0752, 0 },
+ { 57.361, 4.7619 },
+ { 66.8848, 19.0476 },
+ { 71.6467, 42.8571 },
+ { 71.6467, 57.1429 },
+ { 66.8848, 80.9524 },
+ { 57.361, 95.2381 },
+ { 43.0752, 100 },
+ { 33.5514, 100 },
+};
+
+static const StrokeRec char48[] = {
+ { 17, char48_stroke0 },
+};
+
+/* char: 49 '1' */
+
+static const CoordRec char49_stroke0[] = {
+ { 11.82, 80.9524 },
+ { 21.3438, 85.7143 },
+ { 35.6295, 100 },
+ { 35.6295, 0 },
+};
+
+static const StrokeRec char49[] = {
+ { 4, char49_stroke0 },
+};
+
+/* char: 50 '2' */
+
+static const CoordRec char50_stroke0[] = {
+ { 10.1819, 76.1905 },
+ { 10.1819, 80.9524 },
+ { 14.9438, 90.4762 },
+ { 19.7057, 95.2381 },
+ { 29.2295, 100 },
+ { 48.2771, 100 },
+ { 57.801, 95.2381 },
+ { 62.5629, 90.4762 },
+ { 67.3248, 80.9524 },
+ { 67.3248, 71.4286 },
+ { 62.5629, 61.9048 },
+ { 53.039, 47.619 },
+ { 5.42, 0 },
+ { 72.0867, 0 },
+};
+
+static const StrokeRec char50[] = {
+ { 14, char50_stroke0 },
+};
+
+/* char: 51 '3' */
+
+static const CoordRec char51_stroke0[] = {
+ { 14.5238, 100 },
+ { 66.9048, 100 },
+ { 38.3333, 61.9048 },
+ { 52.619, 61.9048 },
+ { 62.1429, 57.1429 },
+ { 66.9048, 52.381 },
+ { 71.6667, 38.0952 },
+ { 71.6667, 28.5714 },
+ { 66.9048, 14.2857 },
+ { 57.381, 4.7619 },
+ { 43.0952, 0 },
+ { 28.8095, 0 },
+ { 14.5238, 4.7619 },
+ { 9.7619, 9.5238 },
+ { 5, 19.0476 },
+};
+
+static const StrokeRec char51[] = {
+ { 15, char51_stroke0 },
+};
+
+/* char: 52 '4' */
+
+static const CoordRec char52_stroke0[] = {
+ { 51.499, 100 },
+ { 3.88, 33.3333 },
+ { 75.3086, 33.3333 },
+};
+
+static const CoordRec char52_stroke1[] = {
+ { 51.499, 100 },
+ { 51.499, 0 },
+};
+
+static const StrokeRec char52[] = {
+ { 3, char52_stroke0 },
+ { 2, char52_stroke1 },
+};
+
+/* char: 53 '5' */
+
+static const CoordRec char53_stroke0[] = {
+ { 62.0029, 100 },
+ { 14.3838, 100 },
+ { 9.6219, 57.1429 },
+ { 14.3838, 61.9048 },
+ { 28.6695, 66.6667 },
+ { 42.9552, 66.6667 },
+ { 57.241, 61.9048 },
+ { 66.7648, 52.381 },
+ { 71.5267, 38.0952 },
+ { 71.5267, 28.5714 },
+ { 66.7648, 14.2857 },
+ { 57.241, 4.7619 },
+ { 42.9552, 0 },
+ { 28.6695, 0 },
+ { 14.3838, 4.7619 },
+ { 9.6219, 9.5238 },
+ { 4.86, 19.0476 },
+};
+
+static const StrokeRec char53[] = {
+ { 17, char53_stroke0 },
+};
+
+/* char: 54 '6' */
+
+static const CoordRec char54_stroke0[] = {
+ { 62.7229, 85.7143 },
+ { 57.961, 95.2381 },
+ { 43.6752, 100 },
+ { 34.1514, 100 },
+ { 19.8657, 95.2381 },
+ { 10.3419, 80.9524 },
+ { 5.58, 57.1429 },
+ { 5.58, 33.3333 },
+ { 10.3419, 14.2857 },
+ { 19.8657, 4.7619 },
+ { 34.1514, 0 },
+ { 38.9133, 0 },
+ { 53.199, 4.7619 },
+ { 62.7229, 14.2857 },
+ { 67.4848, 28.5714 },
+ { 67.4848, 33.3333 },
+ { 62.7229, 47.619 },
+ { 53.199, 57.1429 },
+ { 38.9133, 61.9048 },
+ { 34.1514, 61.9048 },
+ { 19.8657, 57.1429 },
+ { 10.3419, 47.619 },
+ { 5.58, 33.3333 },
+};
+
+static const StrokeRec char54[] = {
+ { 23, char54_stroke0 },
+};
+
+/* char: 55 '7' */
+
+static const CoordRec char55_stroke0[] = {
+ { 72.2267, 100 },
+ { 24.6076, 0 },
+};
+
+static const CoordRec char55_stroke1[] = {
+ { 5.56, 100 },
+ { 72.2267, 100 },
+};
+
+static const StrokeRec char55[] = {
+ { 2, char55_stroke0 },
+ { 2, char55_stroke1 },
+};
+
+/* char: 56 '8' */
+
+static const CoordRec char56_stroke0[] = {
+ { 29.4095, 100 },
+ { 15.1238, 95.2381 },
+ { 10.3619, 85.7143 },
+ { 10.3619, 76.1905 },
+ { 15.1238, 66.6667 },
+ { 24.6476, 61.9048 },
+ { 43.6952, 57.1429 },
+ { 57.981, 52.381 },
+ { 67.5048, 42.8571 },
+ { 72.2667, 33.3333 },
+ { 72.2667, 19.0476 },
+ { 67.5048, 9.5238 },
+ { 62.7429, 4.7619 },
+ { 48.4571, 0 },
+ { 29.4095, 0 },
+ { 15.1238, 4.7619 },
+ { 10.3619, 9.5238 },
+ { 5.6, 19.0476 },
+ { 5.6, 33.3333 },
+ { 10.3619, 42.8571 },
+ { 19.8857, 52.381 },
+ { 34.1714, 57.1429 },
+ { 53.219, 61.9048 },
+ { 62.7429, 66.6667 },
+ { 67.5048, 76.1905 },
+ { 67.5048, 85.7143 },
+ { 62.7429, 95.2381 },
+ { 48.4571, 100 },
+ { 29.4095, 100 },
+};
+
+static const StrokeRec char56[] = {
+ { 29, char56_stroke0 },
+};
+
+/* char: 57 '9' */
+
+static const CoordRec char57_stroke0[] = {
+ { 68.5048, 66.6667 },
+ { 63.7429, 52.381 },
+ { 54.219, 42.8571 },
+ { 39.9333, 38.0952 },
+ { 35.1714, 38.0952 },
+ { 20.8857, 42.8571 },
+ { 11.3619, 52.381 },
+ { 6.6, 66.6667 },
+ { 6.6, 71.4286 },
+ { 11.3619, 85.7143 },
+ { 20.8857, 95.2381 },
+ { 35.1714, 100 },
+ { 39.9333, 100 },
+ { 54.219, 95.2381 },
+ { 63.7429, 85.7143 },
+ { 68.5048, 66.6667 },
+ { 68.5048, 42.8571 },
+ { 63.7429, 19.0476 },
+ { 54.219, 4.7619 },
+ { 39.9333, 0 },
+ { 30.4095, 0 },
+ { 16.1238, 4.7619 },
+ { 11.3619, 14.2857 },
+};
+
+static const StrokeRec char57[] = {
+ { 23, char57_stroke0 },
+};
+
+/* char: 58 ':' */
+
+static const CoordRec char58_stroke0[] = {
+ { 14.0819, 66.6667 },
+ { 9.32, 61.9048 },
+ { 14.0819, 57.1429 },
+ { 18.8438, 61.9048 },
+ { 14.0819, 66.6667 },
+};
+
+static const CoordRec char58_stroke1[] = {
+ { 14.0819, 9.5238 },
+ { 9.32, 4.7619 },
+ { 14.0819, 0 },
+ { 18.8438, 4.7619 },
+ { 14.0819, 9.5238 },
+};
+
+static const StrokeRec char58[] = {
+ { 5, char58_stroke0 },
+ { 5, char58_stroke1 },
+};
+
+/* char: 59 ';' */
+
+static const CoordRec char59_stroke0[] = {
+ { 12.9619, 66.6667 },
+ { 8.2, 61.9048 },
+ { 12.9619, 57.1429 },
+ { 17.7238, 61.9048 },
+ { 12.9619, 66.6667 },
+};
+
+static const CoordRec char59_stroke1[] = {
+ { 17.7238, 4.7619 },
+ { 12.9619, 0 },
+ { 8.2, 4.7619 },
+ { 12.9619, 9.5238 },
+ { 17.7238, 4.7619 },
+ { 17.7238, -4.7619 },
+ { 12.9619, -14.2857 },
+ { 8.2, -19.0476 },
+};
+
+static const StrokeRec char59[] = {
+ { 5, char59_stroke0 },
+ { 8, char59_stroke1 },
+};
+
+/* char: 60 '<' */
+
+static const CoordRec char60_stroke0[] = {
+ { 79.2505, 85.7143 },
+ { 3.06, 42.8571 },
+ { 79.2505, 0 },
+};
+
+static const StrokeRec char60[] = {
+ { 3, char60_stroke0 },
+};
+
+/* char: 61 '=' */
+
+static const CoordRec char61_stroke0[] = {
+ { 5.7, 57.1429 },
+ { 91.4143, 57.1429 },
+};
+
+static const CoordRec char61_stroke1[] = {
+ { 5.7, 28.5714 },
+ { 91.4143, 28.5714 },
+};
+
+static const StrokeRec char61[] = {
+ { 2, char61_stroke0 },
+ { 2, char61_stroke1 },
+};
+
+/* char: 62 '>' */
+
+static const CoordRec char62_stroke0[] = {
+ { 2.78, 85.7143 },
+ { 78.9705, 42.8571 },
+ { 2.78, 0 },
+};
+
+static const StrokeRec char62[] = {
+ { 3, char62_stroke0 },
+};
+
+/* char: 63 '?' */
+
+static const CoordRec char63_stroke0[] = {
+ { 8.42, 76.1905 },
+ { 8.42, 80.9524 },
+ { 13.1819, 90.4762 },
+ { 17.9438, 95.2381 },
+ { 27.4676, 100 },
+ { 46.5152, 100 },
+ { 56.039, 95.2381 },
+ { 60.801, 90.4762 },
+ { 65.5629, 80.9524 },
+ { 65.5629, 71.4286 },
+ { 60.801, 61.9048 },
+ { 56.039, 57.1429 },
+ { 36.9914, 47.619 },
+ { 36.9914, 33.3333 },
+};
+
+static const CoordRec char63_stroke1[] = {
+ { 36.9914, 9.5238 },
+ { 32.2295, 4.7619 },
+ { 36.9914, 0 },
+ { 41.7533, 4.7619 },
+ { 36.9914, 9.5238 },
+};
+
+static const StrokeRec char63[] = {
+ { 14, char63_stroke0 },
+ { 5, char63_stroke1 },
+};
+
+/* char: 64 '@' */
+
+static const CoordRec char64_stroke0[] = {
+ { 49.2171, 52.381 },
+ { 39.6933, 57.1429 },
+ { 30.1695, 57.1429 },
+ { 25.4076, 47.619 },
+ { 25.4076, 42.8571 },
+ { 30.1695, 33.3333 },
+ { 39.6933, 33.3333 },
+ { 49.2171, 38.0952 },
+};
+
+static const CoordRec char64_stroke1[] = {
+ { 49.2171, 57.1429 },
+ { 49.2171, 38.0952 },
+ { 53.979, 33.3333 },
+ { 63.5029, 33.3333 },
+ { 68.2648, 42.8571 },
+ { 68.2648, 47.619 },
+ { 63.5029, 61.9048 },
+ { 53.979, 71.4286 },
+ { 39.6933, 76.1905 },
+ { 34.9314, 76.1905 },
+ { 20.6457, 71.4286 },
+ { 11.1219, 61.9048 },
+ { 6.36, 47.619 },
+ { 6.36, 42.8571 },
+ { 11.1219, 28.5714 },
+ { 20.6457, 19.0476 },
+ { 34.9314, 14.2857 },
+ { 39.6933, 14.2857 },
+ { 53.979, 19.0476 },
+};
+
+static const StrokeRec char64[] = {
+ { 8, char64_stroke0 },
+ { 19, char64_stroke1 },
+};
+
+/* char: 65 'A' */
+
+static const CoordRec char65_stroke0[] = {
+ { 40.5952, 100 },
+ { 2.5, 0 },
+};
+
+static const CoordRec char65_stroke1[] = {
+ { 40.5952, 100 },
+ { 78.6905, 0 },
+};
+
+static const CoordRec char65_stroke2[] = {
+ { 16.7857, 33.3333 },
+ { 64.4048, 33.3333 },
+};
+
+static const StrokeRec char65[] = {
+ { 2, char65_stroke0 },
+ { 2, char65_stroke1 },
+ { 2, char65_stroke2 },
+};
+
+/* char: 66 'B' */
+
+static const CoordRec char66_stroke0[] = {
+ { 11.42, 100 },
+ { 11.42, 0 },
+};
+
+static const CoordRec char66_stroke1[] = {
+ { 11.42, 100 },
+ { 54.2771, 100 },
+ { 68.5629, 95.2381 },
+ { 73.3248, 90.4762 },
+ { 78.0867, 80.9524 },
+ { 78.0867, 71.4286 },
+ { 73.3248, 61.9048 },
+ { 68.5629, 57.1429 },
+ { 54.2771, 52.381 },
+};
+
+static const CoordRec char66_stroke2[] = {
+ { 11.42, 52.381 },
+ { 54.2771, 52.381 },
+ { 68.5629, 47.619 },
+ { 73.3248, 42.8571 },
+ { 78.0867, 33.3333 },
+ { 78.0867, 19.0476 },
+ { 73.3248, 9.5238 },
+ { 68.5629, 4.7619 },
+ { 54.2771, 0 },
+ { 11.42, 0 },
+};
+
+static const StrokeRec char66[] = {
+ { 2, char66_stroke0 },
+ { 9, char66_stroke1 },
+ { 10, char66_stroke2 },
+};
+
+/* char: 67 'C' */
+
+static const CoordRec char67_stroke0[] = {
+ { 78.0886, 76.1905 },
+ { 73.3267, 85.7143 },
+ { 63.8029, 95.2381 },
+ { 54.279, 100 },
+ { 35.2314, 100 },
+ { 25.7076, 95.2381 },
+ { 16.1838, 85.7143 },
+ { 11.4219, 76.1905 },
+ { 6.66, 61.9048 },
+ { 6.66, 38.0952 },
+ { 11.4219, 23.8095 },
+ { 16.1838, 14.2857 },
+ { 25.7076, 4.7619 },
+ { 35.2314, 0 },
+ { 54.279, 0 },
+ { 63.8029, 4.7619 },
+ { 73.3267, 14.2857 },
+ { 78.0886, 23.8095 },
+};
+
+static const StrokeRec char67[] = {
+ { 18, char67_stroke0 },
+};
+
+/* char: 68 'D' */
+
+static const CoordRec char68_stroke0[] = {
+ { 11.96, 100 },
+ { 11.96, 0 },
+};
+
+static const CoordRec char68_stroke1[] = {
+ { 11.96, 100 },
+ { 45.2933, 100 },
+ { 59.579, 95.2381 },
+ { 69.1029, 85.7143 },
+ { 73.8648, 76.1905 },
+ { 78.6267, 61.9048 },
+ { 78.6267, 38.0952 },
+ { 73.8648, 23.8095 },
+ { 69.1029, 14.2857 },
+ { 59.579, 4.7619 },
+ { 45.2933, 0 },
+ { 11.96, 0 },
+};
+
+static const StrokeRec char68[] = {
+ { 2, char68_stroke0 },
+ { 12, char68_stroke1 },
+};
+
+/* char: 69 'E' */
+
+static const CoordRec char69_stroke0[] = {
+ { 11.42, 100 },
+ { 11.42, 0 },
+};
+
+static const CoordRec char69_stroke1[] = {
+ { 11.42, 100 },
+ { 73.3248, 100 },
+};
+
+static const CoordRec char69_stroke2[] = {
+ { 11.42, 52.381 },
+ { 49.5152, 52.381 },
+};
+
+static const CoordRec char69_stroke3[] = {
+ { 11.42, 0 },
+ { 73.3248, 0 },
+};
+
+static const StrokeRec char69[] = {
+ { 2, char69_stroke0 },
+ { 2, char69_stroke1 },
+ { 2, char69_stroke2 },
+ { 2, char69_stroke3 },
+};
+
+/* char: 70 'F' */
+
+static const CoordRec char70_stroke0[] = {
+ { 11.42, 100 },
+ { 11.42, 0 },
+};
+
+static const CoordRec char70_stroke1[] = {
+ { 11.42, 100 },
+ { 73.3248, 100 },
+};
+
+static const CoordRec char70_stroke2[] = {
+ { 11.42, 52.381 },
+ { 49.5152, 52.381 },
+};
+
+static const StrokeRec char70[] = {
+ { 2, char70_stroke0 },
+ { 2, char70_stroke1 },
+ { 2, char70_stroke2 },
+};
+
+/* char: 71 'G' */
+
+static const CoordRec char71_stroke0[] = {
+ { 78.4886, 76.1905 },
+ { 73.7267, 85.7143 },
+ { 64.2029, 95.2381 },
+ { 54.679, 100 },
+ { 35.6314, 100 },
+ { 26.1076, 95.2381 },
+ { 16.5838, 85.7143 },
+ { 11.8219, 76.1905 },
+ { 7.06, 61.9048 },
+ { 7.06, 38.0952 },
+ { 11.8219, 23.8095 },
+ { 16.5838, 14.2857 },
+ { 26.1076, 4.7619 },
+ { 35.6314, 0 },
+ { 54.679, 0 },
+ { 64.2029, 4.7619 },
+ { 73.7267, 14.2857 },
+ { 78.4886, 23.8095 },
+ { 78.4886, 38.0952 },
+};
+
+static const CoordRec char71_stroke1[] = {
+ { 54.679, 38.0952 },
+ { 78.4886, 38.0952 },
+};
+
+static const StrokeRec char71[] = {
+ { 19, char71_stroke0 },
+ { 2, char71_stroke1 },
+};
+
+/* char: 72 'H' */
+
+static const CoordRec char72_stroke0[] = {
+ { 11.42, 100 },
+ { 11.42, 0 },
+};
+
+static const CoordRec char72_stroke1[] = {
+ { 78.0867, 100 },
+ { 78.0867, 0 },
+};
+
+static const CoordRec char72_stroke2[] = {
+ { 11.42, 52.381 },
+ { 78.0867, 52.381 },
+};
+
+static const StrokeRec char72[] = {
+ { 2, char72_stroke0 },
+ { 2, char72_stroke1 },
+ { 2, char72_stroke2 },
+};
+
+/* char: 73 'I' */
+
+static const CoordRec char73_stroke0[] = {
+ { 10.86, 100 },
+ { 10.86, 0 },
+};
+
+static const StrokeRec char73[] = {
+ { 2, char73_stroke0 },
+};
+
+/* char: 74 'J' */
+
+static const CoordRec char74_stroke0[] = {
+ { 50.119, 100 },
+ { 50.119, 23.8095 },
+ { 45.3571, 9.5238 },
+ { 40.5952, 4.7619 },
+ { 31.0714, 0 },
+ { 21.5476, 0 },
+ { 12.0238, 4.7619 },
+ { 7.2619, 9.5238 },
+ { 2.5, 23.8095 },
+ { 2.5, 33.3333 },
+};
+
+static const StrokeRec char74[] = {
+ { 10, char74_stroke0 },
+};
+
+/* char: 75 'K' */
+
+static const CoordRec char75_stroke0[] = {
+ { 11.28, 100 },
+ { 11.28, 0 },
+};
+
+static const CoordRec char75_stroke1[] = {
+ { 77.9467, 100 },
+ { 11.28, 33.3333 },
+};
+
+static const CoordRec char75_stroke2[] = {
+ { 35.0895, 57.1429 },
+ { 77.9467, 0 },
+};
+
+static const StrokeRec char75[] = {
+ { 2, char75_stroke0 },
+ { 2, char75_stroke1 },
+ { 2, char75_stroke2 },
+};
+
+/* char: 76 'L' */
+
+static const CoordRec char76_stroke0[] = {
+ { 11.68, 100 },
+ { 11.68, 0 },
+};
+
+static const CoordRec char76_stroke1[] = {
+ { 11.68, 0 },
+ { 68.8229, 0 },
+};
+
+static const StrokeRec char76[] = {
+ { 2, char76_stroke0 },
+ { 2, char76_stroke1 },
+};
+
+/* char: 77 'M' */
+
+static const CoordRec char77_stroke0[] = {
+ { 10.86, 100 },
+ { 10.86, 0 },
+};
+
+static const CoordRec char77_stroke1[] = {
+ { 10.86, 100 },
+ { 48.9552, 0 },
+};
+
+static const CoordRec char77_stroke2[] = {
+ { 87.0505, 100 },
+ { 48.9552, 0 },
+};
+
+static const CoordRec char77_stroke3[] = {
+ { 87.0505, 100 },
+ { 87.0505, 0 },
+};
+
+static const StrokeRec char77[] = {
+ { 2, char77_stroke0 },
+ { 2, char77_stroke1 },
+ { 2, char77_stroke2 },
+ { 2, char77_stroke3 },
+};
+
+/* char: 78 'N' */
+
+static const CoordRec char78_stroke0[] = {
+ { 11.14, 100 },
+ { 11.14, 0 },
+};
+
+static const CoordRec char78_stroke1[] = {
+ { 11.14, 100 },
+ { 77.8067, 0 },
+};
+
+static const CoordRec char78_stroke2[] = {
+ { 77.8067, 100 },
+ { 77.8067, 0 },
+};
+
+static const StrokeRec char78[] = {
+ { 2, char78_stroke0 },
+ { 2, char78_stroke1 },
+ { 2, char78_stroke2 },
+};
+
+/* char: 79 'O' */
+
+static const CoordRec char79_stroke0[] = {
+ { 34.8114, 100 },
+ { 25.2876, 95.2381 },
+ { 15.7638, 85.7143 },
+ { 11.0019, 76.1905 },
+ { 6.24, 61.9048 },
+ { 6.24, 38.0952 },
+ { 11.0019, 23.8095 },
+ { 15.7638, 14.2857 },
+ { 25.2876, 4.7619 },
+ { 34.8114, 0 },
+ { 53.859, 0 },
+ { 63.3829, 4.7619 },
+ { 72.9067, 14.2857 },
+ { 77.6686, 23.8095 },
+ { 82.4305, 38.0952 },
+ { 82.4305, 61.9048 },
+ { 77.6686, 76.1905 },
+ { 72.9067, 85.7143 },
+ { 63.3829, 95.2381 },
+ { 53.859, 100 },
+ { 34.8114, 100 },
+};
+
+static const StrokeRec char79[] = {
+ { 21, char79_stroke0 },
+};
+
+/* char: 80 'P' */
+
+static const CoordRec char80_stroke0[] = {
+ { 12.1, 100 },
+ { 12.1, 0 },
+};
+
+static const CoordRec char80_stroke1[] = {
+ { 12.1, 100 },
+ { 54.9571, 100 },
+ { 69.2429, 95.2381 },
+ { 74.0048, 90.4762 },
+ { 78.7667, 80.9524 },
+ { 78.7667, 66.6667 },
+ { 74.0048, 57.1429 },
+ { 69.2429, 52.381 },
+ { 54.9571, 47.619 },
+ { 12.1, 47.619 },
+};
+
+static const StrokeRec char80[] = {
+ { 2, char80_stroke0 },
+ { 10, char80_stroke1 },
+};
+
+/* char: 81 'Q' */
+
+static const CoordRec char81_stroke0[] = {
+ { 33.8714, 100 },
+ { 24.3476, 95.2381 },
+ { 14.8238, 85.7143 },
+ { 10.0619, 76.1905 },
+ { 5.3, 61.9048 },
+ { 5.3, 38.0952 },
+ { 10.0619, 23.8095 },
+ { 14.8238, 14.2857 },
+ { 24.3476, 4.7619 },
+ { 33.8714, 0 },
+ { 52.919, 0 },
+ { 62.4429, 4.7619 },
+ { 71.9667, 14.2857 },
+ { 76.7286, 23.8095 },
+ { 81.4905, 38.0952 },
+ { 81.4905, 61.9048 },
+ { 76.7286, 76.1905 },
+ { 71.9667, 85.7143 },
+ { 62.4429, 95.2381 },
+ { 52.919, 100 },
+ { 33.8714, 100 },
+};
+
+static const CoordRec char81_stroke1[] = {
+ { 48.1571, 19.0476 },
+ { 76.7286, -9.5238 },
+};
+
+static const StrokeRec char81[] = {
+ { 21, char81_stroke0 },
+ { 2, char81_stroke1 },
+};
+
+/* char: 82 'R' */
+
+static const CoordRec char82_stroke0[] = {
+ { 11.68, 100 },
+ { 11.68, 0 },
+};
+
+static const CoordRec char82_stroke1[] = {
+ { 11.68, 100 },
+ { 54.5371, 100 },
+ { 68.8229, 95.2381 },
+ { 73.5848, 90.4762 },
+ { 78.3467, 80.9524 },
+ { 78.3467, 71.4286 },
+ { 73.5848, 61.9048 },
+ { 68.8229, 57.1429 },
+ { 54.5371, 52.381 },
+ { 11.68, 52.381 },
+};
+
+static const CoordRec char82_stroke2[] = {
+ { 45.0133, 52.381 },
+ { 78.3467, 0 },
+};
+
+static const StrokeRec char82[] = {
+ { 2, char82_stroke0 },
+ { 10, char82_stroke1 },
+ { 2, char82_stroke2 },
+};
+
+/* char: 83 'S' */
+
+static const CoordRec char83_stroke0[] = {
+ { 74.6667, 85.7143 },
+ { 65.1429, 95.2381 },
+ { 50.8571, 100 },
+ { 31.8095, 100 },
+ { 17.5238, 95.2381 },
+ { 8, 85.7143 },
+ { 8, 76.1905 },
+ { 12.7619, 66.6667 },
+ { 17.5238, 61.9048 },
+ { 27.0476, 57.1429 },
+ { 55.619, 47.619 },
+ { 65.1429, 42.8571 },
+ { 69.9048, 38.0952 },
+ { 74.6667, 28.5714 },
+ { 74.6667, 14.2857 },
+ { 65.1429, 4.7619 },
+ { 50.8571, 0 },
+ { 31.8095, 0 },
+ { 17.5238, 4.7619 },
+ { 8, 14.2857 },
+};
+
+static const StrokeRec char83[] = {
+ { 20, char83_stroke0 },
+};
+
+/* char: 84 'T' */
+
+static const CoordRec char84_stroke0[] = {
+ { 35.6933, 100 },
+ { 35.6933, 0 },
+};
+
+static const CoordRec char84_stroke1[] = {
+ { 2.36, 100 },
+ { 69.0267, 100 },
+};
+
+static const StrokeRec char84[] = {
+ { 2, char84_stroke0 },
+ { 2, char84_stroke1 },
+};
+
+/* char: 85 'U' */
+
+static const CoordRec char85_stroke0[] = {
+ { 11.54, 100 },
+ { 11.54, 28.5714 },
+ { 16.3019, 14.2857 },
+ { 25.8257, 4.7619 },
+ { 40.1114, 0 },
+ { 49.6352, 0 },
+ { 63.921, 4.7619 },
+ { 73.4448, 14.2857 },
+ { 78.2067, 28.5714 },
+ { 78.2067, 100 },
+};
+
+static const StrokeRec char85[] = {
+ { 10, char85_stroke0 },
+};
+
+/* char: 86 'V' */
+
+static const CoordRec char86_stroke0[] = {
+ { 2.36, 100 },
+ { 40.4552, 0 },
+};
+
+static const CoordRec char86_stroke1[] = {
+ { 78.5505, 100 },
+ { 40.4552, 0 },
+};
+
+static const StrokeRec char86[] = {
+ { 2, char86_stroke0 },
+ { 2, char86_stroke1 },
+};
+
+/* char: 87 'W' */
+
+static const CoordRec char87_stroke0[] = {
+ { 2.22, 100 },
+ { 26.0295, 0 },
+};
+
+static const CoordRec char87_stroke1[] = {
+ { 49.839, 100 },
+ { 26.0295, 0 },
+};
+
+static const CoordRec char87_stroke2[] = {
+ { 49.839, 100 },
+ { 73.6486, 0 },
+};
+
+static const CoordRec char87_stroke3[] = {
+ { 97.4581, 100 },
+ { 73.6486, 0 },
+};
+
+static const StrokeRec char87[] = {
+ { 2, char87_stroke0 },
+ { 2, char87_stroke1 },
+ { 2, char87_stroke2 },
+ { 2, char87_stroke3 },
+};
+
+/* char: 88 'X' */
+
+static const CoordRec char88_stroke0[] = {
+ { 2.5, 100 },
+ { 69.1667, 0 },
+};
+
+static const CoordRec char88_stroke1[] = {
+ { 69.1667, 100 },
+ { 2.5, 0 },
+};
+
+static const StrokeRec char88[] = {
+ { 2, char88_stroke0 },
+ { 2, char88_stroke1 },
+};
+
+/* char: 89 'Y' */
+
+static const CoordRec char89_stroke0[] = {
+ { 1.52, 100 },
+ { 39.6152, 52.381 },
+ { 39.6152, 0 },
+};
+
+static const CoordRec char89_stroke1[] = {
+ { 77.7105, 100 },
+ { 39.6152, 52.381 },
+};
+
+static const StrokeRec char89[] = {
+ { 3, char89_stroke0 },
+ { 2, char89_stroke1 },
+};
+
+/* char: 90 'Z' */
+
+static const CoordRec char90_stroke0[] = {
+ { 69.1667, 100 },
+ { 2.5, 0 },
+};
+
+static const CoordRec char90_stroke1[] = {
+ { 2.5, 100 },
+ { 69.1667, 100 },
+};
+
+static const CoordRec char90_stroke2[] = {
+ { 2.5, 0 },
+ { 69.1667, 0 },
+};
+
+static const StrokeRec char90[] = {
+ { 2, char90_stroke0 },
+ { 2, char90_stroke1 },
+ { 2, char90_stroke2 },
+};
+
+/* char: 91 '[' */
+
+static const CoordRec char91_stroke0[] = {
+ { 7.78, 119.048 },
+ { 7.78, -33.3333 },
+};
+
+static const CoordRec char91_stroke1[] = {
+ { 12.5419, 119.048 },
+ { 12.5419, -33.3333 },
+};
+
+static const CoordRec char91_stroke2[] = {
+ { 7.78, 119.048 },
+ { 41.1133, 119.048 },
+};
+
+static const CoordRec char91_stroke3[] = {
+ { 7.78, -33.3333 },
+ { 41.1133, -33.3333 },
+};
+
+static const StrokeRec char91[] = {
+ { 2, char91_stroke0 },
+ { 2, char91_stroke1 },
+ { 2, char91_stroke2 },
+ { 2, char91_stroke3 },
+};
+
+/* char: 92 '\' */
+
+static const CoordRec char92_stroke0[] = {
+ { 5.84, 100 },
+ { 72.5067, -14.2857 },
+};
+
+static const StrokeRec char92[] = {
+ { 2, char92_stroke0 },
+};
+
+/* char: 93 ']' */
+
+static const CoordRec char93_stroke0[] = {
+ { 33.0114, 119.048 },
+ { 33.0114, -33.3333 },
+};
+
+static const CoordRec char93_stroke1[] = {
+ { 37.7733, 119.048 },
+ { 37.7733, -33.3333 },
+};
+
+static const CoordRec char93_stroke2[] = {
+ { 4.44, 119.048 },
+ { 37.7733, 119.048 },
+};
+
+static const CoordRec char93_stroke3[] = {
+ { 4.44, -33.3333 },
+ { 37.7733, -33.3333 },
+};
+
+static const StrokeRec char93[] = {
+ { 2, char93_stroke0 },
+ { 2, char93_stroke1 },
+ { 2, char93_stroke2 },
+ { 2, char93_stroke3 },
+};
+
+/* char: 94 '^' */
+
+static const CoordRec char94_stroke0[] = {
+ { 44.0752, 109.524 },
+ { 5.98, 42.8571 },
+};
+
+static const CoordRec char94_stroke1[] = {
+ { 44.0752, 109.524 },
+ { 82.1705, 42.8571 },
+};
+
+static const StrokeRec char94[] = {
+ { 2, char94_stroke0 },
+ { 2, char94_stroke1 },
+};
+
+/* char: 95 '_' */
+
+static const CoordRec char95_stroke0[] = {
+ { -1.1, -33.3333 },
+ { 103.662, -33.3333 },
+ { 103.662, -28.5714 },
+ { -1.1, -28.5714 },
+ { -1.1, -33.3333 },
+};
+
+static const StrokeRec char95[] = {
+ { 5, char95_stroke0 },
+};
+
+/* char: 96 '`' */
+
+static const CoordRec char96_stroke0[] = {
+ { 33.0219, 100 },
+ { 56.8314, 71.4286 },
+};
+
+static const CoordRec char96_stroke1[] = {
+ { 33.0219, 100 },
+ { 28.26, 95.2381 },
+ { 56.8314, 71.4286 },
+};
+
+static const StrokeRec char96[] = {
+ { 2, char96_stroke0 },
+ { 3, char96_stroke1 },
+};
+
+/* char: 97 'a' */
+
+static const CoordRec char97_stroke0[] = {
+ { 63.8229, 66.6667 },
+ { 63.8229, 0 },
+};
+
+static const CoordRec char97_stroke1[] = {
+ { 63.8229, 52.381 },
+ { 54.299, 61.9048 },
+ { 44.7752, 66.6667 },
+ { 30.4895, 66.6667 },
+ { 20.9657, 61.9048 },
+ { 11.4419, 52.381 },
+ { 6.68, 38.0952 },
+ { 6.68, 28.5714 },
+ { 11.4419, 14.2857 },
+ { 20.9657, 4.7619 },
+ { 30.4895, 0 },
+ { 44.7752, 0 },
+ { 54.299, 4.7619 },
+ { 63.8229, 14.2857 },
+};
+
+static const StrokeRec char97[] = {
+ { 2, char97_stroke0 },
+ { 14, char97_stroke1 },
+};
+
+/* char: 98 'b' */
+
+static const CoordRec char98_stroke0[] = {
+ { 8.76, 100 },
+ { 8.76, 0 },
+};
+
+static const CoordRec char98_stroke1[] = {
+ { 8.76, 52.381 },
+ { 18.2838, 61.9048 },
+ { 27.8076, 66.6667 },
+ { 42.0933, 66.6667 },
+ { 51.6171, 61.9048 },
+ { 61.141, 52.381 },
+ { 65.9029, 38.0952 },
+ { 65.9029, 28.5714 },
+ { 61.141, 14.2857 },
+ { 51.6171, 4.7619 },
+ { 42.0933, 0 },
+ { 27.8076, 0 },
+ { 18.2838, 4.7619 },
+ { 8.76, 14.2857 },
+};
+
+static const StrokeRec char98[] = {
+ { 2, char98_stroke0 },
+ { 14, char98_stroke1 },
+};
+
+/* char: 99 'c' */
+
+static const CoordRec char99_stroke0[] = {
+ { 62.6629, 52.381 },
+ { 53.139, 61.9048 },
+ { 43.6152, 66.6667 },
+ { 29.3295, 66.6667 },
+ { 19.8057, 61.9048 },
+ { 10.2819, 52.381 },
+ { 5.52, 38.0952 },
+ { 5.52, 28.5714 },
+ { 10.2819, 14.2857 },
+ { 19.8057, 4.7619 },
+ { 29.3295, 0 },
+ { 43.6152, 0 },
+ { 53.139, 4.7619 },
+ { 62.6629, 14.2857 },
+};
+
+static const StrokeRec char99[] = {
+ { 14, char99_stroke0 },
+};
+
+/* char: 100 'd' */
+
+static const CoordRec char100_stroke0[] = {
+ { 61.7829, 100 },
+ { 61.7829, 0 },
+};
+
+static const CoordRec char100_stroke1[] = {
+ { 61.7829, 52.381 },
+ { 52.259, 61.9048 },
+ { 42.7352, 66.6667 },
+ { 28.4495, 66.6667 },
+ { 18.9257, 61.9048 },
+ { 9.4019, 52.381 },
+ { 4.64, 38.0952 },
+ { 4.64, 28.5714 },
+ { 9.4019, 14.2857 },
+ { 18.9257, 4.7619 },
+ { 28.4495, 0 },
+ { 42.7352, 0 },
+ { 52.259, 4.7619 },
+ { 61.7829, 14.2857 },
+};
+
+static const StrokeRec char100[] = {
+ { 2, char100_stroke0 },
+ { 14, char100_stroke1 },
+};
+
+/* char: 101 'e' */
+
+static const CoordRec char101_stroke0[] = {
+ { 5.72, 38.0952 },
+ { 62.8629, 38.0952 },
+ { 62.8629, 47.619 },
+ { 58.101, 57.1429 },
+ { 53.339, 61.9048 },
+ { 43.8152, 66.6667 },
+ { 29.5295, 66.6667 },
+ { 20.0057, 61.9048 },
+ { 10.4819, 52.381 },
+ { 5.72, 38.0952 },
+ { 5.72, 28.5714 },
+ { 10.4819, 14.2857 },
+ { 20.0057, 4.7619 },
+ { 29.5295, 0 },
+ { 43.8152, 0 },
+ { 53.339, 4.7619 },
+ { 62.8629, 14.2857 },
+};
+
+static const StrokeRec char101[] = {
+ { 17, char101_stroke0 },
+};
+
+/* char: 102 'f' */
+
+static const CoordRec char102_stroke0[] = {
+ { 38.7752, 100 },
+ { 29.2514, 100 },
+ { 19.7276, 95.2381 },
+ { 14.9657, 80.9524 },
+ { 14.9657, 0 },
+};
+
+static const CoordRec char102_stroke1[] = {
+ { 0.68, 66.6667 },
+ { 34.0133, 66.6667 },
+};
+
+static const StrokeRec char102[] = {
+ { 5, char102_stroke0 },
+ { 2, char102_stroke1 },
+};
+
+/* char: 103 'g' */
+
+static const CoordRec char103_stroke0[] = {
+ { 62.5029, 66.6667 },
+ { 62.5029, -9.5238 },
+ { 57.741, -23.8095 },
+ { 52.979, -28.5714 },
+ { 43.4552, -33.3333 },
+ { 29.1695, -33.3333 },
+ { 19.6457, -28.5714 },
+};
+
+static const CoordRec char103_stroke1[] = {
+ { 62.5029, 52.381 },
+ { 52.979, 61.9048 },
+ { 43.4552, 66.6667 },
+ { 29.1695, 66.6667 },
+ { 19.6457, 61.9048 },
+ { 10.1219, 52.381 },
+ { 5.36, 38.0952 },
+ { 5.36, 28.5714 },
+ { 10.1219, 14.2857 },
+ { 19.6457, 4.7619 },
+ { 29.1695, 0 },
+ { 43.4552, 0 },
+ { 52.979, 4.7619 },
+ { 62.5029, 14.2857 },
+};
+
+static const StrokeRec char103[] = {
+ { 7, char103_stroke0 },
+ { 14, char103_stroke1 },
+};
+
+/* char: 104 'h' */
+
+static const CoordRec char104_stroke0[] = {
+ { 9.6, 100 },
+ { 9.6, 0 },
+};
+
+static const CoordRec char104_stroke1[] = {
+ { 9.6, 47.619 },
+ { 23.8857, 61.9048 },
+ { 33.4095, 66.6667 },
+ { 47.6952, 66.6667 },
+ { 57.219, 61.9048 },
+ { 61.981, 47.619 },
+ { 61.981, 0 },
+};
+
+static const StrokeRec char104[] = {
+ { 2, char104_stroke0 },
+ { 7, char104_stroke1 },
+};
+
+/* char: 105 'i' */
+
+static const CoordRec char105_stroke0[] = {
+ { 10.02, 100 },
+ { 14.7819, 95.2381 },
+ { 19.5438, 100 },
+ { 14.7819, 104.762 },
+ { 10.02, 100 },
+};
+
+static const CoordRec char105_stroke1[] = {
+ { 14.7819, 66.6667 },
+ { 14.7819, 0 },
+};
+
+static const StrokeRec char105[] = {
+ { 5, char105_stroke0 },
+ { 2, char105_stroke1 },
+};
+
+/* char: 106 'j' */
+
+static const CoordRec char106_stroke0[] = {
+ { 17.3876, 100 },
+ { 22.1495, 95.2381 },
+ { 26.9114, 100 },
+ { 22.1495, 104.762 },
+ { 17.3876, 100 },
+};
+
+static const CoordRec char106_stroke1[] = {
+ { 22.1495, 66.6667 },
+ { 22.1495, -14.2857 },
+ { 17.3876, -28.5714 },
+ { 7.8638, -33.3333 },
+ { -1.66, -33.3333 },
+};
+
+static const StrokeRec char106[] = {
+ { 5, char106_stroke0 },
+ { 5, char106_stroke1 },
+};
+
+/* char: 107 'k' */
+
+static const CoordRec char107_stroke0[] = {
+ { 9.6, 100 },
+ { 9.6, 0 },
+};
+
+static const CoordRec char107_stroke1[] = {
+ { 57.219, 66.6667 },
+ { 9.6, 19.0476 },
+};
+
+static const CoordRec char107_stroke2[] = {
+ { 28.6476, 38.0952 },
+ { 61.981, 0 },
+};
+
+static const StrokeRec char107[] = {
+ { 2, char107_stroke0 },
+ { 2, char107_stroke1 },
+ { 2, char107_stroke2 },
+};
+
+/* char: 108 'l' */
+
+static const CoordRec char108_stroke0[] = {
+ { 10.02, 100 },
+ { 10.02, 0 },
+};
+
+static const StrokeRec char108[] = {
+ { 2, char108_stroke0 },
+};
+
+/* char: 109 'm' */
+
+static const CoordRec char109_stroke0[] = {
+ { 9.6, 66.6667 },
+ { 9.6, 0 },
+};
+
+static const CoordRec char109_stroke1[] = {
+ { 9.6, 47.619 },
+ { 23.8857, 61.9048 },
+ { 33.4095, 66.6667 },
+ { 47.6952, 66.6667 },
+ { 57.219, 61.9048 },
+ { 61.981, 47.619 },
+ { 61.981, 0 },
+};
+
+static const CoordRec char109_stroke2[] = {
+ { 61.981, 47.619 },
+ { 76.2667, 61.9048 },
+ { 85.7905, 66.6667 },
+ { 100.076, 66.6667 },
+ { 109.6, 61.9048 },
+ { 114.362, 47.619 },
+ { 114.362, 0 },
+};
+
+static const StrokeRec char109[] = {
+ { 2, char109_stroke0 },
+ { 7, char109_stroke1 },
+ { 7, char109_stroke2 },
+};
+
+/* char: 110 'n' */
+
+static const CoordRec char110_stroke0[] = {
+ { 9.18, 66.6667 },
+ { 9.18, 0 },
+};
+
+static const CoordRec char110_stroke1[] = {
+ { 9.18, 47.619 },
+ { 23.4657, 61.9048 },
+ { 32.9895, 66.6667 },
+ { 47.2752, 66.6667 },
+ { 56.799, 61.9048 },
+ { 61.561, 47.619 },
+ { 61.561, 0 },
+};
+
+static const StrokeRec char110[] = {
+ { 2, char110_stroke0 },
+ { 7, char110_stroke1 },
+};
+
+/* char: 111 'o' */
+
+static const CoordRec char111_stroke0[] = {
+ { 28.7895, 66.6667 },
+ { 19.2657, 61.9048 },
+ { 9.7419, 52.381 },
+ { 4.98, 38.0952 },
+ { 4.98, 28.5714 },
+ { 9.7419, 14.2857 },
+ { 19.2657, 4.7619 },
+ { 28.7895, 0 },
+ { 43.0752, 0 },
+ { 52.599, 4.7619 },
+ { 62.1229, 14.2857 },
+ { 66.8848, 28.5714 },
+ { 66.8848, 38.0952 },
+ { 62.1229, 52.381 },
+ { 52.599, 61.9048 },
+ { 43.0752, 66.6667 },
+ { 28.7895, 66.6667 },
+};
+
+static const StrokeRec char111[] = {
+ { 17, char111_stroke0 },
+};
+
+/* char: 112 'p' */
+
+static const CoordRec char112_stroke0[] = {
+ { 9.46, 66.6667 },
+ { 9.46, -33.3333 },
+};
+
+static const CoordRec char112_stroke1[] = {
+ { 9.46, 52.381 },
+ { 18.9838, 61.9048 },
+ { 28.5076, 66.6667 },
+ { 42.7933, 66.6667 },
+ { 52.3171, 61.9048 },
+ { 61.841, 52.381 },
+ { 66.6029, 38.0952 },
+ { 66.6029, 28.5714 },
+ { 61.841, 14.2857 },
+ { 52.3171, 4.7619 },
+ { 42.7933, 0 },
+ { 28.5076, 0 },
+ { 18.9838, 4.7619 },
+ { 9.46, 14.2857 },
+};
+
+static const StrokeRec char112[] = {
+ { 2, char112_stroke0 },
+ { 14, char112_stroke1 },
+};
+
+/* char: 113 'q' */
+
+static const CoordRec char113_stroke0[] = {
+ { 61.9829, 66.6667 },
+ { 61.9829, -33.3333 },
+};
+
+static const CoordRec char113_stroke1[] = {
+ { 61.9829, 52.381 },
+ { 52.459, 61.9048 },
+ { 42.9352, 66.6667 },
+ { 28.6495, 66.6667 },
+ { 19.1257, 61.9048 },
+ { 9.6019, 52.381 },
+ { 4.84, 38.0952 },
+ { 4.84, 28.5714 },
+ { 9.6019, 14.2857 },
+ { 19.1257, 4.7619 },
+ { 28.6495, 0 },
+ { 42.9352, 0 },
+ { 52.459, 4.7619 },
+ { 61.9829, 14.2857 },
+};
+
+static const StrokeRec char113[] = {
+ { 2, char113_stroke0 },
+ { 14, char113_stroke1 },
+};
+
+/* char: 114 'r' */
+
+static const CoordRec char114_stroke0[] = {
+ { 9.46, 66.6667 },
+ { 9.46, 0 },
+};
+
+static const CoordRec char114_stroke1[] = {
+ { 9.46, 38.0952 },
+ { 14.2219, 52.381 },
+ { 23.7457, 61.9048 },
+ { 33.2695, 66.6667 },
+ { 47.5552, 66.6667 },
+};
+
+static const StrokeRec char114[] = {
+ { 2, char114_stroke0 },
+ { 5, char114_stroke1 },
+};
+
+/* char: 115 's' */
+
+static const CoordRec char115_stroke0[] = {
+ { 57.081, 52.381 },
+ { 52.319, 61.9048 },
+ { 38.0333, 66.6667 },
+ { 23.7476, 66.6667 },
+ { 9.4619, 61.9048 },
+ { 4.7, 52.381 },
+ { 9.4619, 42.8571 },
+ { 18.9857, 38.0952 },
+ { 42.7952, 33.3333 },
+ { 52.319, 28.5714 },
+ { 57.081, 19.0476 },
+ { 57.081, 14.2857 },
+ { 52.319, 4.7619 },
+ { 38.0333, 0 },
+ { 23.7476, 0 },
+ { 9.4619, 4.7619 },
+ { 4.7, 14.2857 },
+};
+
+static const StrokeRec char115[] = {
+ { 17, char115_stroke0 },
+};
+
+/* char: 116 't' */
+
+static const CoordRec char116_stroke0[] = {
+ { 14.8257, 100 },
+ { 14.8257, 19.0476 },
+ { 19.5876, 4.7619 },
+ { 29.1114, 0 },
+ { 38.6352, 0 },
+};
+
+static const CoordRec char116_stroke1[] = {
+ { 0.54, 66.6667 },
+ { 33.8733, 66.6667 },
+};
+
+static const StrokeRec char116[] = {
+ { 5, char116_stroke0 },
+ { 2, char116_stroke1 },
+};
+
+/* char: 117 'u' */
+
+static const CoordRec char117_stroke0[] = {
+ { 9.46, 66.6667 },
+ { 9.46, 19.0476 },
+ { 14.2219, 4.7619 },
+ { 23.7457, 0 },
+ { 38.0314, 0 },
+ { 47.5552, 4.7619 },
+ { 61.841, 19.0476 },
+};
+
+static const CoordRec char117_stroke1[] = {
+ { 61.841, 66.6667 },
+ { 61.841, 0 },
+};
+
+static const StrokeRec char117[] = {
+ { 7, char117_stroke0 },
+ { 2, char117_stroke1 },
+};
+
+/* char: 118 'v' */
+
+static const CoordRec char118_stroke0[] = {
+ { 1.8, 66.6667 },
+ { 30.3714, 0 },
+};
+
+static const CoordRec char118_stroke1[] = {
+ { 58.9429, 66.6667 },
+ { 30.3714, 0 },
+};
+
+static const StrokeRec char118[] = {
+ { 2, char118_stroke0 },
+ { 2, char118_stroke1 },
+};
+
+/* char: 119 'w' */
+
+static const CoordRec char119_stroke0[] = {
+ { 2.5, 66.6667 },
+ { 21.5476, 0 },
+};
+
+static const CoordRec char119_stroke1[] = {
+ { 40.5952, 66.6667 },
+ { 21.5476, 0 },
+};
+
+static const CoordRec char119_stroke2[] = {
+ { 40.5952, 66.6667 },
+ { 59.6429, 0 },
+};
+
+static const CoordRec char119_stroke3[] = {
+ { 78.6905, 66.6667 },
+ { 59.6429, 0 },
+};
+
+static const StrokeRec char119[] = {
+ { 2, char119_stroke0 },
+ { 2, char119_stroke1 },
+ { 2, char119_stroke2 },
+ { 2, char119_stroke3 },
+};
+
+/* char: 120 'x' */
+
+static const CoordRec char120_stroke0[] = {
+ { 1.66, 66.6667 },
+ { 54.041, 0 },
+};
+
+static const CoordRec char120_stroke1[] = {
+ { 54.041, 66.6667 },
+ { 1.66, 0 },
+};
+
+static const StrokeRec char120[] = {
+ { 2, char120_stroke0 },
+ { 2, char120_stroke1 },
+};
+
+/* char: 121 'y' */
+
+static const CoordRec char121_stroke0[] = {
+ { 6.5619, 66.6667 },
+ { 35.1333, 0 },
+};
+
+static const CoordRec char121_stroke1[] = {
+ { 63.7048, 66.6667 },
+ { 35.1333, 0 },
+ { 25.6095, -19.0476 },
+ { 16.0857, -28.5714 },
+ { 6.5619, -33.3333 },
+ { 1.8, -33.3333 },
+};
+
+static const StrokeRec char121[] = {
+ { 2, char121_stroke0 },
+ { 6, char121_stroke1 },
+};
+
+/* char: 122 'z' */
+
+static const CoordRec char122_stroke0[] = {
+ { 56.821, 66.6667 },
+ { 4.44, 0 },
+};
+
+static const CoordRec char122_stroke1[] = {
+ { 4.44, 66.6667 },
+ { 56.821, 66.6667 },
+};
+
+static const CoordRec char122_stroke2[] = {
+ { 4.44, 0 },
+ { 56.821, 0 },
+};
+
+static const StrokeRec char122[] = {
+ { 2, char122_stroke0 },
+ { 2, char122_stroke1 },
+ { 2, char122_stroke2 },
+};
+
+/* char: 123 '{' */
+
+static const CoordRec char123_stroke0[] = {
+ { 31.1895, 119.048 },
+ { 21.6657, 114.286 },
+ { 16.9038, 109.524 },
+ { 12.1419, 100 },
+ { 12.1419, 90.4762 },
+ { 16.9038, 80.9524 },
+ { 21.6657, 76.1905 },
+ { 26.4276, 66.6667 },
+ { 26.4276, 57.1429 },
+ { 16.9038, 47.619 },
+};
+
+static const CoordRec char123_stroke1[] = {
+ { 21.6657, 114.286 },
+ { 16.9038, 104.762 },
+ { 16.9038, 95.2381 },
+ { 21.6657, 85.7143 },
+ { 26.4276, 80.9524 },
+ { 31.1895, 71.4286 },
+ { 31.1895, 61.9048 },
+ { 26.4276, 52.381 },
+ { 7.38, 42.8571 },
+ { 26.4276, 33.3333 },
+ { 31.1895, 23.8095 },
+ { 31.1895, 14.2857 },
+ { 26.4276, 4.7619 },
+ { 21.6657, 0 },
+ { 16.9038, -9.5238 },
+ { 16.9038, -19.0476 },
+ { 21.6657, -28.5714 },
+};
+
+static const CoordRec char123_stroke2[] = {
+ { 16.9038, 38.0952 },
+ { 26.4276, 28.5714 },
+ { 26.4276, 19.0476 },
+ { 21.6657, 9.5238 },
+ { 16.9038, 4.7619 },
+ { 12.1419, -4.7619 },
+ { 12.1419, -14.2857 },
+ { 16.9038, -23.8095 },
+ { 21.6657, -28.5714 },
+ { 31.1895, -33.3333 },
+};
+
+static const StrokeRec char123[] = {
+ { 10, char123_stroke0 },
+ { 17, char123_stroke1 },
+ { 10, char123_stroke2 },
+};
+
+/* char: 124 '|' */
+
+static const CoordRec char124_stroke0[] = {
+ { 11.54, 119.048 },
+ { 11.54, -33.3333 },
+};
+
+static const StrokeRec char124[] = {
+ { 2, char124_stroke0 },
+};
+
+/* char: 125 '}' */
+
+static const CoordRec char125_stroke0[] = {
+ { 9.18, 119.048 },
+ { 18.7038, 114.286 },
+ { 23.4657, 109.524 },
+ { 28.2276, 100 },
+ { 28.2276, 90.4762 },
+ { 23.4657, 80.9524 },
+ { 18.7038, 76.1905 },
+ { 13.9419, 66.6667 },
+ { 13.9419, 57.1429 },
+ { 23.4657, 47.619 },
+};
+
+static const CoordRec char125_stroke1[] = {
+ { 18.7038, 114.286 },
+ { 23.4657, 104.762 },
+ { 23.4657, 95.2381 },
+ { 18.7038, 85.7143 },
+ { 13.9419, 80.9524 },
+ { 9.18, 71.4286 },
+ { 9.18, 61.9048 },
+ { 13.9419, 52.381 },
+ { 32.9895, 42.8571 },
+ { 13.9419, 33.3333 },
+ { 9.18, 23.8095 },
+ { 9.18, 14.2857 },
+ { 13.9419, 4.7619 },
+ { 18.7038, 0 },
+ { 23.4657, -9.5238 },
+ { 23.4657, -19.0476 },
+ { 18.7038, -28.5714 },
+};
+
+static const CoordRec char125_stroke2[] = {
+ { 23.4657, 38.0952 },
+ { 13.9419, 28.5714 },
+ { 13.9419, 19.0476 },
+ { 18.7038, 9.5238 },
+ { 23.4657, 4.7619 },
+ { 28.2276, -4.7619 },
+ { 28.2276, -14.2857 },
+ { 23.4657, -23.8095 },
+ { 18.7038, -28.5714 },
+ { 9.18, -33.3333 },
+};
+
+static const StrokeRec char125[] = {
+ { 10, char125_stroke0 },
+ { 17, char125_stroke1 },
+ { 10, char125_stroke2 },
+};
+
+/* char: 126 '~' */
+
+static const CoordRec char126_stroke0[] = {
+ { 2.92, 28.5714 },
+ { 2.92, 38.0952 },
+ { 7.6819, 52.381 },
+ { 17.2057, 57.1429 },
+ { 26.7295, 57.1429 },
+ { 36.2533, 52.381 },
+ { 55.301, 38.0952 },
+ { 64.8248, 33.3333 },
+ { 74.3486, 33.3333 },
+ { 83.8724, 38.0952 },
+ { 88.6343, 47.619 },
+};
+
+static const CoordRec char126_stroke1[] = {
+ { 2.92, 38.0952 },
+ { 7.6819, 47.619 },
+ { 17.2057, 52.381 },
+ { 26.7295, 52.381 },
+ { 36.2533, 47.619 },
+ { 55.301, 33.3333 },
+ { 64.8248, 28.5714 },
+ { 74.3486, 28.5714 },
+ { 83.8724, 33.3333 },
+ { 88.6343, 47.619 },
+ { 88.6343, 57.1429 },
+};
+
+static const StrokeRec char126[] = {
+ { 11, char126_stroke0 },
+ { 11, char126_stroke1 },
+};
+
+/* char: 127 */
+
+static const CoordRec char127_stroke0[] = {
+ { 52.381, 100 },
+ { 14.2857, -33.3333 },
+};
+
+static const CoordRec char127_stroke1[] = {
+ { 28.5714, 66.6667 },
+ { 14.2857, 61.9048 },
+ { 4.7619, 52.381 },
+ { 0, 38.0952 },
+ { 0, 23.8095 },
+ { 4.7619, 14.2857 },
+ { 14.2857, 4.7619 },
+ { 28.5714, 0 },
+ { 38.0952, 0 },
+ { 52.381, 4.7619 },
+ { 61.9048, 14.2857 },
+ { 66.6667, 28.5714 },
+ { 66.6667, 42.8571 },
+ { 61.9048, 52.381 },
+ { 52.381, 61.9048 },
+ { 38.0952, 66.6667 },
+ { 28.5714, 66.6667 },
+};
+
+static const StrokeRec char127[] = {
+ { 2, char127_stroke0 },
+ { 17, char127_stroke1 },
+};
+
+static const StrokeCharRec chars[] = {
+ { 0, /* char0 */ 0, 0, 0 },
+ { 0, /* char1 */ 0, 0, 0 },
+ { 0, /* char2 */ 0, 0, 0 },
+ { 0, /* char3 */ 0, 0, 0 },
+ { 0, /* char4 */ 0, 0, 0 },
+ { 0, /* char5 */ 0, 0, 0 },
+ { 0, /* char6 */ 0, 0, 0 },
+ { 0, /* char7 */ 0, 0, 0 },
+ { 0, /* char8 */ 0, 0, 0 },
+ { 0, /* char9 */ 0, 0, 0 },
+ { 0, /* char10 */ 0, 0, 0 },
+ { 0, /* char11 */ 0, 0, 0 },
+ { 0, /* char12 */ 0, 0, 0 },
+ { 0, /* char13 */ 0, 0, 0 },
+ { 0, /* char14 */ 0, 0, 0 },
+ { 0, /* char15 */ 0, 0, 0 },
+ { 0, /* char16 */ 0, 0, 0 },
+ { 0, /* char17 */ 0, 0, 0 },
+ { 0, /* char18 */ 0, 0, 0 },
+ { 0, /* char19 */ 0, 0, 0 },
+ { 0, /* char20 */ 0, 0, 0 },
+ { 0, /* char21 */ 0, 0, 0 },
+ { 0, /* char22 */ 0, 0, 0 },
+ { 0, /* char23 */ 0, 0, 0 },
+ { 0, /* char24 */ 0, 0, 0 },
+ { 0, /* char25 */ 0, 0, 0 },
+ { 0, /* char26 */ 0, 0, 0 },
+ { 0, /* char27 */ 0, 0, 0 },
+ { 0, /* char28 */ 0, 0, 0 },
+ { 0, /* char29 */ 0, 0, 0 },
+ { 0, /* char30 */ 0, 0, 0 },
+ { 0, /* char31 */ 0, 0, 0 },
+ { 0, /* char32 */ 0, 52.381, 104.762 },
+ { 2, char33, 13.3819, 26.6238 },
+ { 2, char34, 23.0676, 51.4352 },
+ { 4, char35, 36.5333, 79.4886 },
+ { 3, char36, 38.1533, 76.2067 },
+ { 3, char37, 49.2171, 96.5743 },
+ { 1, char38, 53.599, 101.758 },
+ { 1, char39, 4.44, 13.62 },
+ { 1, char40, 21.8657, 47.1733 },
+ { 1, char41, 24.3276, 47.5333 },
+ { 3, char42, 30.7695, 59.439 },
+ { 2, char43, 48.8371, 97.2543 },
+ { 1, char44, 13.5219, 26.0638 },
+ { 1, char45, 50.2371, 100.754 },
+ { 1, char46, 13.1019, 26.4838 },
+ { 1, char47, 40.5733, 82.1067 },
+ { 1, char48, 38.3133, 77.0667 },
+ { 1, char49, 30.8676, 66.5295 },
+ { 1, char50, 38.7533, 77.6467 },
+ { 1, char51, 38.3333, 77.0467 },
+ { 2, char52, 37.2133, 80.1686 },
+ { 1, char53, 38.1933, 77.6867 },
+ { 1, char54, 34.1514, 73.8048 },
+ { 2, char55, 38.8933, 77.2267 },
+ { 1, char56, 38.9333, 77.6667 },
+ { 1, char57, 39.9333, 74.0648 },
+ { 2, char58, 14.0819, 26.2238 },
+ { 2, char59, 12.9619, 26.3038 },
+ { 1, char60, 41.1552, 81.6105 },
+ { 2, char61, 48.5571, 97.2543 },
+ { 1, char62, 40.8752, 81.6105 },
+ { 2, char63, 36.9914, 73.9029 },
+ { 2, char64, 34.9314, 74.3648 },
+ { 3, char65, 40.5952, 80.4905 },
+ { 3, char66, 44.7533, 83.6267 },
+ { 1, char67, 39.9933, 84.4886 },
+ { 2, char68, 45.2933, 85.2867 },
+ { 4, char69, 39.9914, 78.1848 },
+ { 3, char70, 39.9914, 78.7448 },
+ { 2, char71, 40.3933, 89.7686 },
+ { 3, char72, 44.7533, 89.0867 },
+ { 1, char73, 10.86, 21.3 },
+ { 1, char74, 31.0714, 59.999 },
+ { 3, char75, 44.6133, 79.3267 },
+ { 2, char76, 40.2514, 71.3229 },
+ { 4, char77, 48.9552, 97.2105 },
+ { 3, char78, 44.4733, 88.8067 },
+ { 1, char79, 44.3352, 88.8305 },
+ { 2, char80, 45.4333, 85.6667 },
+ { 2, char81, 43.3952, 88.0905 },
+ { 3, char82, 45.0133, 82.3667 },
+ { 1, char83, 41.3333, 80.8267 },
+ { 2, char84, 35.6933, 71.9467 },
+ { 1, char85, 44.8733, 89.4867 },
+ { 2, char86, 40.4552, 81.6105 },
+ { 4, char87, 49.839, 100.518 },
+ { 2, char88, 35.8333, 72.3667 },
+ { 2, char89, 39.6152, 79.6505 },
+ { 3, char90, 35.8333, 73.7467 },
+ { 4, char91, 22.0657, 46.1133 },
+ { 1, char92, 39.1733, 78.2067 },
+ { 4, char93, 23.4876, 46.3933 },
+ { 2, char94, 44.0752, 90.2305 },
+ { 1, char95, 51.281, 104.062 },
+ { 2, char96, 42.5457, 83.5714 },
+ { 2, char97, 35.2514, 66.6029 },
+ { 2, char98, 37.3314, 70.4629 },
+ { 1, char99, 34.0914, 68.9229 },
+ { 2, char100, 33.2114, 70.2629 },
+ { 1, char101, 34.2914, 68.5229 },
+ { 2, char102, 14.9657, 38.6552 },
+ { 2, char103, 33.9314, 70.9829 },
+ { 2, char104, 33.4095, 71.021 },
+ { 2, char105, 14.7819, 28.8638 },
+ { 2, char106, 17.3876, 36.2314 },
+ { 3, char107, 33.4095, 62.521 },
+ { 1, char108, 10.02, 19.34 },
+ { 3, char109, 61.981, 123.962 },
+ { 2, char110, 32.9895, 70.881 },
+ { 1, char111, 33.5514, 71.7448 },
+ { 2, char112, 38.0314, 70.8029 },
+ { 2, char113, 33.4114, 70.7429 },
+ { 2, char114, 23.7457, 49.4952 },
+ { 1, char115, 28.5095, 62.321 },
+ { 2, char116, 14.8257, 39.3152 },
+ { 2, char117, 33.2695, 71.161 },
+ { 2, char118, 30.3714, 60.6029 },
+ { 4, char119, 40.5952, 80.4905 },
+ { 2, char120, 25.4695, 56.401 },
+ { 2, char121, 35.1333, 66.0648 },
+ { 3, char122, 28.2495, 61.821 },
+ { 3, char123, 21.6657, 41.6295 },
+ { 1, char124, 11.54, 23.78 },
+ { 3, char125, 18.7038, 41.4695 },
+ { 2, char126, 45.7771, 91.2743 },
+ { 2, char127, 33.3333, 66.6667 },
+};
+
+StrokeFontRec glutStrokeRoman = { "Roman", 128, chars, 119.048, -33.3333 };
+
diff --git a/src/glut/os2/glut_shapes.cpp b/src/glut/os2/glut_shapes.cpp
new file mode 100644
index 00000000000..76b08095114
--- /dev/null
+++ b/src/glut/os2/glut_shapes.cpp
@@ -0,0 +1,595 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1997. */
+
+/**
+(c) Copyright 1993, Silicon Graphics, Inc.
+
+ALL RIGHTS RESERVED
+
+Permission to use, copy, modify, and distribute this software
+for any purpose and without fee is hereby granted, provided
+that the above copyright notice appear in all copies and that
+both the copyright notice and this permission notice appear in
+supporting documentation, and that the name of Silicon
+Graphics, Inc. not be used in advertising or publicity
+pertaining to distribution of the software without specific,
+written prior permission.
+
+THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU
+"AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR
+OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO
+EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE
+ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
+INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,
+SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR
+NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY
+OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+US Government Users Restricted Rights
+
+Use, duplication, or disclosure by the Government is subject to
+restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+(c)(1)(ii) of the Rights in Technical Data and Computer
+Software clause at DFARS 252.227-7013 and/or in similar or
+successor clauses in the FAR or the DOD or NASA FAR
+Supplement. Unpublished-- rights reserved under the copyright
+laws of the United States. Contractor/manufacturer is Silicon
+Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA
+94039-7311.
+
+OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+*/
+
+#include <math.h>
+#include "glutint.h"
+
+/* Some <math.h> files do not define M_PI... */
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+static GLUquadricObj *quadObj;
+
+#define QUAD_OBJ_INIT() { if(!quadObj) initQuadObj(); }
+
+static void
+initQuadObj(void)
+{
+ quadObj = gluNewQuadric();
+ if (!quadObj)
+ __glutFatalError("out of memory.");
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutWireSphere(GLdouble radius, GLint slices, GLint stacks)
+{
+ QUAD_OBJ_INIT();
+ gluQuadricDrawStyle(quadObj, GLU_LINE);
+ gluQuadricNormals(quadObj, GLU_SMOOTH);
+ /* If we ever changed/used the texture or orientation state
+ of quadObj, we'd need to change it to the defaults here
+ with gluQuadricTexture and/or gluQuadricOrientation. */
+ gluSphere(quadObj, radius, slices, stacks);
+}
+
+void GLUTAPIENTRY
+glutSolidSphere(GLdouble radius, GLint slices, GLint stacks)
+{
+ QUAD_OBJ_INIT();
+ gluQuadricDrawStyle(quadObj, GLU_FILL);
+ gluQuadricNormals(quadObj, GLU_SMOOTH);
+ /* If we ever changed/used the texture or orientation state
+ of quadObj, we'd need to change it to the defaults here
+ with gluQuadricTexture and/or gluQuadricOrientation. */
+ gluSphere(quadObj, radius, slices, stacks);
+}
+
+void GLUTAPIENTRY
+glutWireCone(GLdouble base, GLdouble height,
+ GLint slices, GLint stacks)
+{
+ QUAD_OBJ_INIT();
+ gluQuadricDrawStyle(quadObj, GLU_LINE);
+ gluQuadricNormals(quadObj, GLU_SMOOTH);
+ /* If we ever changed/used the texture or orientation state
+ of quadObj, we'd need to change it to the defaults here
+ with gluQuadricTexture and/or gluQuadricOrientation. */
+ gluCylinder(quadObj, base, 0.0, height, slices, stacks);
+}
+
+void GLUTAPIENTRY
+glutSolidCone(GLdouble base, GLdouble height,
+ GLint slices, GLint stacks)
+{
+ QUAD_OBJ_INIT();
+ gluQuadricDrawStyle(quadObj, GLU_FILL);
+ gluQuadricNormals(quadObj, GLU_SMOOTH);
+ /* If we ever changed/used the texture or orientation state
+ of quadObj, we'd need to change it to the defaults here
+ with gluQuadricTexture and/or gluQuadricOrientation. */
+ gluCylinder(quadObj, base, 0.0, height, slices, stacks);
+}
+
+/* ENDCENTRY */
+
+static void
+drawBox(GLfloat size, GLenum type)
+{
+ static GLfloat n[6][3] =
+ {
+ {-1.0, 0.0, 0.0},
+ {0.0, 1.0, 0.0},
+ {1.0, 0.0, 0.0},
+ {0.0, -1.0, 0.0},
+ {0.0, 0.0, 1.0},
+ {0.0, 0.0, -1.0}
+ };
+ static GLint faces[6][4] =
+ {
+ {0, 1, 2, 3},
+ {3, 2, 6, 7},
+ {7, 6, 5, 4},
+ {4, 5, 1, 0},
+ {5, 6, 2, 1},
+ {7, 4, 0, 3}
+ };
+ GLfloat v[8][3];
+ GLint i;
+
+ v[0][0] = v[1][0] = v[2][0] = v[3][0] = -size / 2;
+ v[4][0] = v[5][0] = v[6][0] = v[7][0] = size / 2;
+ v[0][1] = v[1][1] = v[4][1] = v[5][1] = -size / 2;
+ v[2][1] = v[3][1] = v[6][1] = v[7][1] = size / 2;
+ v[0][2] = v[3][2] = v[4][2] = v[7][2] = -size / 2;
+ v[1][2] = v[2][2] = v[5][2] = v[6][2] = size / 2;
+
+ for (i = 5; i >= 0; i--) {
+ glBegin(type);
+ glNormal3fv(&n[i][0]);
+ glVertex3fv(&v[faces[i][0]][0]);
+ glVertex3fv(&v[faces[i][1]][0]);
+ glVertex3fv(&v[faces[i][2]][0]);
+ glVertex3fv(&v[faces[i][3]][0]);
+ glEnd();
+ }
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutWireCube(GLdouble size)
+{
+ drawBox(size, GL_LINE_LOOP);
+}
+
+void GLUTAPIENTRY
+glutSolidCube(GLdouble size)
+{
+ drawBox(size, GL_QUADS);
+}
+
+/* ENDCENTRY */
+
+static void
+doughnut(GLfloat r, GLfloat R, GLint nsides, GLint rings)
+{
+ int i, j;
+ GLfloat theta, phi, theta1;
+ GLfloat cosTheta, sinTheta;
+ GLfloat cosTheta1, sinTheta1;
+ GLfloat ringDelta, sideDelta;
+
+ ringDelta = 2.0 * M_PI / rings;
+ sideDelta = 2.0 * M_PI / nsides;
+
+ theta = 0.0;
+ cosTheta = 1.0;
+ sinTheta = 0.0;
+ for (i = rings - 1; i >= 0; i--) {
+ theta1 = theta + ringDelta;
+ cosTheta1 = cos(theta1);
+ sinTheta1 = sin(theta1);
+ glBegin(GL_QUAD_STRIP);
+ phi = 0.0;
+ for (j = nsides; j >= 0; j--) {
+ GLfloat cosPhi, sinPhi, dist;
+
+ phi += sideDelta;
+ cosPhi = cos(phi);
+ sinPhi = sin(phi);
+ dist = R + r * cosPhi;
+
+ glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi);
+ glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi);
+ glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi);
+ glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi);
+ }
+ glEnd();
+ theta = theta1;
+ cosTheta = cosTheta1;
+ sinTheta = sinTheta1;
+ }
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutWireTorus(GLdouble innerRadius, GLdouble outerRadius,
+ GLint nsides, GLint rings)
+{
+ glPushAttrib(GL_POLYGON_BIT);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ doughnut(innerRadius, outerRadius, nsides, rings);
+ glPopAttrib();
+}
+
+void GLUTAPIENTRY
+glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius,
+ GLint nsides, GLint rings)
+{
+ doughnut(innerRadius, outerRadius, nsides, rings);
+}
+
+/* ENDCENTRY */
+
+static GLfloat dodec[20][3];
+
+static void
+initDodecahedron(void)
+{
+ GLfloat alpha, beta;
+
+ alpha = sqrt(2.0 / (3.0 + sqrt(5.0)));
+ beta = 1.0 + sqrt(6.0 / (3.0 + sqrt(5.0)) -
+ 2.0 + 2.0 * sqrt(2.0 / (3.0 + sqrt(5.0))));
+ /* *INDENT-OFF* */
+ dodec[0][0] = -alpha; dodec[0][1] = 0; dodec[0][2] = beta;
+ dodec[1][0] = alpha; dodec[1][1] = 0; dodec[1][2] = beta;
+ dodec[2][0] = -1; dodec[2][1] = -1; dodec[2][2] = -1;
+ dodec[3][0] = -1; dodec[3][1] = -1; dodec[3][2] = 1;
+ dodec[4][0] = -1; dodec[4][1] = 1; dodec[4][2] = -1;
+ dodec[5][0] = -1; dodec[5][1] = 1; dodec[5][2] = 1;
+ dodec[6][0] = 1; dodec[6][1] = -1; dodec[6][2] = -1;
+ dodec[7][0] = 1; dodec[7][1] = -1; dodec[7][2] = 1;
+ dodec[8][0] = 1; dodec[8][1] = 1; dodec[8][2] = -1;
+ dodec[9][0] = 1; dodec[9][1] = 1; dodec[9][2] = 1;
+ dodec[10][0] = beta; dodec[10][1] = alpha; dodec[10][2] = 0;
+ dodec[11][0] = beta; dodec[11][1] = -alpha; dodec[11][2] = 0;
+ dodec[12][0] = -beta; dodec[12][1] = alpha; dodec[12][2] = 0;
+ dodec[13][0] = -beta; dodec[13][1] = -alpha; dodec[13][2] = 0;
+ dodec[14][0] = -alpha; dodec[14][1] = 0; dodec[14][2] = -beta;
+ dodec[15][0] = alpha; dodec[15][1] = 0; dodec[15][2] = -beta;
+ dodec[16][0] = 0; dodec[16][1] = beta; dodec[16][2] = alpha;
+ dodec[17][0] = 0; dodec[17][1] = beta; dodec[17][2] = -alpha;
+ dodec[18][0] = 0; dodec[18][1] = -beta; dodec[18][2] = alpha;
+ dodec[19][0] = 0; dodec[19][1] = -beta; dodec[19][2] = -alpha;
+ /* *INDENT-ON* */
+
+}
+
+#define DIFF3(_a,_b,_c) { \
+ (_c)[0] = (_a)[0] - (_b)[0]; \
+ (_c)[1] = (_a)[1] - (_b)[1]; \
+ (_c)[2] = (_a)[2] - (_b)[2]; \
+}
+
+static void
+crossprod(GLfloat v1[3], GLfloat v2[3], GLfloat prod[3])
+{
+ GLfloat p[3]; /* in case prod == v1 or v2 */
+
+ p[0] = v1[1] * v2[2] - v2[1] * v1[2];
+ p[1] = v1[2] * v2[0] - v2[2] * v1[0];
+ p[2] = v1[0] * v2[1] - v2[0] * v1[1];
+ prod[0] = p[0];
+ prod[1] = p[1];
+ prod[2] = p[2];
+}
+
+static void
+normalize(GLfloat v[3])
+{
+ GLfloat d;
+
+ d = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
+ if (d == 0.0) {
+ __glutWarning("normalize: zero length vector");
+ v[0] = d = 1.0;
+ }
+ d = 1 / d;
+ v[0] *= d;
+ v[1] *= d;
+ v[2] *= d;
+}
+
+static void
+pentagon(int a, int b, int c, int d, int e, GLenum shadeType)
+{
+ GLfloat n0[3], d1[3], d2[3];
+
+ DIFF3(dodec[a], dodec[b], d1);
+ DIFF3(dodec[b], dodec[c], d2);
+ crossprod(d1, d2, n0);
+ normalize(n0);
+
+ glBegin(shadeType);
+ glNormal3fv(n0);
+ glVertex3fv(&dodec[a][0]);
+ glVertex3fv(&dodec[b][0]);
+ glVertex3fv(&dodec[c][0]);
+ glVertex3fv(&dodec[d][0]);
+ glVertex3fv(&dodec[e][0]);
+ glEnd();
+}
+
+static void
+dodecahedron(GLenum type)
+{
+ static int inited = 0;
+
+ if (inited == 0) {
+ inited = 1;
+ initDodecahedron();
+ }
+ pentagon(0, 1, 9, 16, 5, type);
+ pentagon(1, 0, 3, 18, 7, type);
+ pentagon(1, 7, 11, 10, 9, type);
+ pentagon(11, 7, 18, 19, 6, type);
+ pentagon(8, 17, 16, 9, 10, type);
+ pentagon(2, 14, 15, 6, 19, type);
+ pentagon(2, 13, 12, 4, 14, type);
+ pentagon(2, 19, 18, 3, 13, type);
+ pentagon(3, 0, 5, 12, 13, type);
+ pentagon(6, 15, 8, 10, 11, type);
+ pentagon(4, 17, 8, 15, 14, type);
+ pentagon(4, 12, 5, 16, 17, type);
+}
+
+/* CENTRY */
+void GLUTAPIENTRY glutWireDodecahedron(void)
+{
+ dodecahedron(GL_LINE_LOOP);
+}
+
+void GLUTAPIENTRY
+glutSolidDodecahedron(void)
+{
+ dodecahedron(GL_TRIANGLE_FAN);
+}
+
+/* ENDCENTRY */
+
+static void
+recorditem(GLfloat * n1, GLfloat * n2, GLfloat * n3,
+ GLenum shadeType)
+{
+ GLfloat q0[3], q1[3];
+
+ DIFF3(n1, n2, q0);
+ DIFF3(n2, n3, q1);
+ crossprod(q0, q1, q1);
+ normalize(q1);
+
+ glBegin(shadeType);
+ glNormal3fv(q1);
+ glVertex3fv(n1);
+ glVertex3fv(n2);
+ glVertex3fv(n3);
+ glEnd();
+}
+
+static void
+subdivide(GLfloat * v0, GLfloat * v1, GLfloat * v2,
+ GLenum shadeType)
+{
+ int depth;
+ GLfloat w0[3], w1[3], w2[3];
+ GLfloat l;
+ int i, j, k, n;
+
+ depth = 1;
+ for (i = 0; i < depth; i++) {
+ for (j = 0; i + j < depth; j++) {
+ k = depth - i - j;
+ for (n = 0; n < 3; n++) {
+ w0[n] = (i * v0[n] + j * v1[n] + k * v2[n]) / depth;
+ w1[n] = ((i + 1) * v0[n] + j * v1[n] + (k - 1) * v2[n])
+ / depth;
+ w2[n] = (i * v0[n] + (j + 1) * v1[n] + (k - 1) * v2[n])
+ / depth;
+ }
+ l = sqrt(w0[0] * w0[0] + w0[1] * w0[1] + w0[2] * w0[2]);
+ w0[0] /= l;
+ w0[1] /= l;
+ w0[2] /= l;
+ l = sqrt(w1[0] * w1[0] + w1[1] * w1[1] + w1[2] * w1[2]);
+ w1[0] /= l;
+ w1[1] /= l;
+ w1[2] /= l;
+ l = sqrt(w2[0] * w2[0] + w2[1] * w2[1] + w2[2] * w2[2]);
+ w2[0] /= l;
+ w2[1] /= l;
+ w2[2] /= l;
+ recorditem(w1, w0, w2, shadeType);
+ }
+ }
+}
+
+static void
+drawtriangle(int i, GLfloat data[][3], int ndx[][3],
+ GLenum shadeType)
+{
+ GLfloat *x0, *x1, *x2;
+
+ x0 = data[ndx[i][0]];
+ x1 = data[ndx[i][1]];
+ x2 = data[ndx[i][2]];
+ subdivide(x0, x1, x2, shadeType);
+}
+
+/* octahedron data: The octahedron produced is centered at the
+ origin and has radius 1.0 */
+static GLfloat odata[6][3] =
+{
+ {1.0, 0.0, 0.0},
+ {-1.0, 0.0, 0.0},
+ {0.0, 1.0, 0.0},
+ {0.0, -1.0, 0.0},
+ {0.0, 0.0, 1.0},
+ {0.0, 0.0, -1.0}
+};
+
+static int ondex[8][3] =
+{
+ {0, 4, 2},
+ {1, 2, 4},
+ {0, 3, 4},
+ {1, 4, 3},
+ {0, 2, 5},
+ {1, 5, 2},
+ {0, 5, 3},
+ {1, 3, 5}
+};
+
+static void
+octahedron(GLenum shadeType)
+{
+ int i;
+
+ for (i = 7; i >= 0; i--) {
+ drawtriangle(i, odata, ondex, shadeType);
+ }
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutWireOctahedron(void)
+{
+ octahedron(GL_LINE_LOOP);
+}
+
+void GLUTAPIENTRY
+glutSolidOctahedron(void)
+{
+ octahedron(GL_TRIANGLES);
+}
+
+/* ENDCENTRY */
+
+/* icosahedron data: These numbers are rigged to make an
+ icosahedron of radius 1.0 */
+
+#define X .525731112119133606
+#define Z .850650808352039932
+
+static GLfloat idata[12][3] =
+{
+ {-X, 0, Z},
+ {X, 0, Z},
+ {-X, 0, -Z},
+ {X, 0, -Z},
+ {0, Z, X},
+ {0, Z, -X},
+ {0, -Z, X},
+ {0, -Z, -X},
+ {Z, X, 0},
+ {-Z, X, 0},
+ {Z, -X, 0},
+ {-Z, -X, 0}
+};
+
+static int index[20][3] =
+{
+ {0, 4, 1},
+ {0, 9, 4},
+ {9, 5, 4},
+ {4, 5, 8},
+ {4, 8, 1},
+ {8, 10, 1},
+ {8, 3, 10},
+ {5, 3, 8},
+ {5, 2, 3},
+ {2, 7, 3},
+ {7, 10, 3},
+ {7, 6, 10},
+ {7, 11, 6},
+ {11, 0, 6},
+ {0, 1, 6},
+ {6, 1, 10},
+ {9, 0, 11},
+ {9, 11, 2},
+ {9, 2, 5},
+ {7, 2, 11},
+};
+
+static void
+icosahedron(GLenum shadeType)
+{
+ int i;
+
+ for (i = 19; i >= 0; i--) {
+ drawtriangle(i, idata, index, shadeType);
+ }
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutWireIcosahedron(void)
+{
+ icosahedron(GL_LINE_LOOP);
+}
+
+void GLUTAPIENTRY
+glutSolidIcosahedron(void)
+{
+ icosahedron(GL_TRIANGLES);
+}
+
+/* ENDCENTRY */
+
+/* tetrahedron data: */
+
+#define T 1.73205080756887729
+
+static GLfloat tdata[4][3] =
+{
+ {T, T, T},
+ {T, -T, -T},
+ {-T, T, -T},
+ {-T, -T, T}
+};
+
+static int tndex[4][3] =
+{
+ {0, 1, 3},
+ {2, 1, 0},
+ {3, 2, 0},
+ {1, 2, 3}
+};
+
+static void
+tetrahedron(GLenum shadeType)
+{
+ int i;
+
+ for (i = 3; i >= 0; i--)
+ drawtriangle(i, tdata, tndex, shadeType);
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutWireTetrahedron(void)
+{
+ tetrahedron(GL_LINE_LOOP);
+}
+
+void GLUTAPIENTRY
+glutSolidTetrahedron(void)
+{
+ tetrahedron(GL_TRIANGLES);
+}
+
+/* ENDCENTRY */
diff --git a/src/glut/os2/glut_stroke.cpp b/src/glut/os2/glut_stroke.cpp
new file mode 100644
index 00000000000..4823283c8c4
--- /dev/null
+++ b/src/glut/os2/glut_stroke.cpp
@@ -0,0 +1,42 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include "glutint.h"
+#include "glutstroke.h"
+
+void GLUTAPIENTRY
+glutStrokeCharacter(GLUTstrokeFont font, int c)
+{
+ const StrokeCharRec *ch;
+ const StrokeRec *stroke;
+ const CoordRec *coord;
+ StrokeFontPtr fontinfo;
+ int i, j;
+
+
+#if defined(_WIN32)
+ fontinfo = (StrokeFontPtr) __glutFont(font);
+#else
+ fontinfo = (StrokeFontPtr) font;
+#endif
+
+ if (c < 0 || c >= fontinfo->num_chars)
+ return;
+ ch = &(fontinfo->ch[c]);
+ if (ch) {
+ for (i = ch->num_strokes, stroke = ch->stroke;
+ i > 0; i--, stroke++) {
+ glBegin(GL_LINE_STRIP);
+ for (j = stroke->num_coords, coord = stroke->coord;
+ j > 0; j--, coord++) {
+ glVertex2f(coord->x, coord->y);
+ }
+ glEnd();
+ }
+ glTranslatef(ch->right, 0.0, 0.0);
+ }
+}
diff --git a/src/glut/os2/glut_swap.cpp b/src/glut/os2/glut_swap.cpp
new file mode 100644
index 00000000000..210a7fc37e0
--- /dev/null
+++ b/src/glut/os2/glut_swap.cpp
@@ -0,0 +1,67 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1997. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include <stdio.h>
+#include "glutint.h"
+
+GLint __glutFPS = 0;
+GLint __glutSwapCount = 0;
+GLint __glutSwapTime = 0;
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutSwapBuffers(void)
+{
+ GLUTwindow *window = __glutCurrentWindow;
+
+ if (window->renderWin == window->win) {
+ if (__glutCurrentWindow->treatAsSingle) {
+ /* Pretend the double buffered window is single buffered,
+ so treat glutSwapBuffers as a no-op. */
+ return;
+ }
+ } else {
+ if (__glutCurrentWindow->overlay->treatAsSingle) {
+ /* Pretend the double buffered overlay is single
+ buffered, so treat glutSwapBuffers as a no-op. */
+ return;
+ }
+ }
+
+ /* For the MESA_SWAP_HACK. */
+ window->usedSwapBuffers = 1;
+
+ SWAP_BUFFERS_LAYER(__glutCurrentWindow);
+
+ /* I considered putting the window being swapped on the
+ GLUT_FINISH_WORK work list because you could call
+ glutSwapBuffers from an idle callback which doesn't call
+ __glutSetWindow which normally adds indirect rendering
+ windows to the GLUT_FINISH_WORK work list. Not being put
+ on the list could lead to the buffering up of multiple
+ redisplays and buffer swaps and hamper interactivity. I
+ consider this an application bug due to not using
+ glutPostRedisplay to trigger redraws. If
+ glutPostRedisplay were used, __glutSetWindow would be
+ called and a glFinish to throttle buffering would occur. */
+
+ if (__glutFPS) {
+ GLint t = glutGet(GLUT_ELAPSED_TIME);
+ __glutSwapCount++;
+ if (__glutSwapTime == 0)
+ __glutSwapTime = t;
+ else if (t - __glutSwapTime > __glutFPS) {
+ float time = 0.001 * (t - __glutSwapTime);
+ float fps = (float) __glutSwapCount / time;
+ fprintf(stderr, "GLUT: %d frames in %.2f seconds = %.2f FPS\n",
+ __glutSwapCount, time, fps);
+ __glutSwapTime = t;
+ __glutSwapCount = 0;
+ }
+ }
+}
+/* ENDCENTRY */
diff --git a/src/glut/os2/glut_teapot.cpp b/src/glut/os2/glut_teapot.cpp
new file mode 100644
index 00000000000..e2fcb53152e
--- /dev/null
+++ b/src/glut/os2/glut_teapot.cpp
@@ -0,0 +1,210 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/**
+(c) Copyright 1993, Silicon Graphics, Inc.
+
+ALL RIGHTS RESERVED
+
+Permission to use, copy, modify, and distribute this software
+for any purpose and without fee is hereby granted, provided
+that the above copyright notice appear in all copies and that
+both the copyright notice and this permission notice appear in
+supporting documentation, and that the name of Silicon
+Graphics, Inc. not be used in advertising or publicity
+pertaining to distribution of the software without specific,
+written prior permission.
+
+THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU
+"AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR
+OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO
+EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE
+ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER,
+INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE,
+SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR
+NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY
+OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR
+PERFORMANCE OF THIS SOFTWARE.
+
+US Government Users Restricted Rights
+
+Use, duplication, or disclosure by the Government is subject to
+restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+(c)(1)(ii) of the Rights in Technical Data and Computer
+Software clause at DFARS 252.227-7013 and/or in similar or
+successor clauses in the FAR or the DOD or NASA FAR
+Supplement. Unpublished-- rights reserved under the copyright
+laws of the United States. Contractor/manufacturer is Silicon
+Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA
+94039-7311.
+
+OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+*/
+
+#include "glutint.h"
+
+/* 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] =
+{
+ /* rim */
+ {102, 103, 104, 105, 4, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15},
+ /* body */
+ {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27},
+ {24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36,
+ 37, 38, 39, 40},
+ /* lid */
+ {96, 96, 96, 96, 97, 98, 99, 100, 101, 101, 101,
+ 101, 0, 1, 2, 3,},
+ {0, 1, 2, 3, 106, 107, 108, 109, 110, 111, 112,
+ 113, 114, 115, 116, 117},
+ /* bottom */
+ {118, 118, 118, 118, 124, 122, 119, 121, 123, 126,
+ 125, 120, 40, 39, 38, 37},
+ /* handle */
+ {41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
+ 53, 54, 55, 56},
+ {53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
+ 28, 65, 66, 67},
+ /* spout */
+ {68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83},
+ {80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
+ 92, 93, 94, 95}
+};
+/* *INDENT-OFF* */
+
+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}}
+};
+
+/* *INDENT-ON* */
+
+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();
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutSolidTeapot(GLdouble scale)
+{
+ teapot(7, scale, GL_FILL);
+}
+
+void GLUTAPIENTRY
+glutWireTeapot(GLdouble scale)
+{
+ teapot(10, scale, GL_LINE);
+}
+
+/* ENDCENTRY */
diff --git a/src/glut/os2/glut_tr24.cpp b/src/glut/os2/glut_tr24.cpp
new file mode 100644
index 00000000000..9e1234644d7
--- /dev/null
+++ b/src/glut/os2/glut_tr24.cpp
@@ -0,0 +1,2063 @@
+
+/* GENERATED FILE -- DO NOT MODIFY */
+
+#define glutBitmapTimesRoman24 XXX
+#include "glutbitmap.h"
+#undef glutBitmapTimesRoman24
+
+/* char: 0xff */
+
+static const GLubyte ch255data[] = {
+0xe0,0x0,0xf0,0x0,0x18,0x0,0x8,0x0,0xc,0x0,0x4,0x0,0xe,0x0,0xe,0x0,
+0x1a,0x0,0x19,0x0,0x19,0x0,0x31,0x0,0x30,0x80,0x30,0x80,0x60,0x80,0x60,0xc0,
+0xf1,0xe0,0x0,0x0,0x0,0x0,0x33,0x0,0x33,0x0,
+};
+
+static const BitmapCharRec ch255 = {11,21,0,5,11,ch255data};
+
+/* char: 0xfe */
+
+static const GLubyte ch254data[] = {
+0xf0,0x0,0x60,0x0,0x60,0x0,0x60,0x0,0x60,0x0,0x6e,0x0,0x73,0x80,0x61,0x80,
+0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x61,0x80,0x73,0x80,
+0x6e,0x0,0x60,0x0,0x60,0x0,0x60,0x0,0x60,0x0,0xe0,0x0,
+};
+
+static const BitmapCharRec ch254 = {10,22,-1,5,12,ch254data};
+
+/* char: 0xfd */
+
+static const GLubyte ch253data[] = {
+0xe0,0x0,0xf0,0x0,0x18,0x0,0x8,0x0,0xc,0x0,0x4,0x0,0xe,0x0,0xe,0x0,
+0x1a,0x0,0x19,0x0,0x19,0x0,0x31,0x0,0x30,0x80,0x30,0x80,0x60,0x80,0x60,0xc0,
+0xf1,0xe0,0x0,0x0,0x8,0x0,0x6,0x0,0x3,0x80,0x1,0x80,
+};
+
+static const BitmapCharRec ch253 = {11,22,0,5,11,ch253data};
+
+/* char: 0xfc */
+
+static const GLubyte ch252data[] = {
+0x1c,0xe0,0x3e,0xc0,0x71,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,
+0x60,0xc0,0x60,0xc0,0x60,0xc0,0xe1,0xc0,0x0,0x0,0x0,0x0,0x33,0x0,0x33,0x0,
+};
+
+static const BitmapCharRec ch252 = {11,16,-1,0,13,ch252data};
+
+/* char: 0xfb */
+
+static const GLubyte ch251data[] = {
+0x1c,0xe0,0x3e,0xc0,0x71,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,
+0x60,0xc0,0x60,0xc0,0x60,0xc0,0xe1,0xc0,0x0,0x0,0x21,0x0,0x12,0x0,0x1e,0x0,
+0xc,0x0,
+};
+
+static const BitmapCharRec ch251 = {11,17,-1,0,13,ch251data};
+
+/* char: 0xfa */
+
+static const GLubyte ch250data[] = {
+0x1c,0xe0,0x3e,0xc0,0x71,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,
+0x60,0xc0,0x60,0xc0,0x60,0xc0,0xe1,0xc0,0x0,0x0,0x8,0x0,0x6,0x0,0x3,0x80,
+0x1,0x80,
+};
+
+static const BitmapCharRec ch250 = {11,17,-1,0,13,ch250data};
+
+/* char: 0xf9 */
+
+static const GLubyte ch249data[] = {
+0x1c,0xe0,0x3e,0xc0,0x71,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,
+0x60,0xc0,0x60,0xc0,0x60,0xc0,0xe1,0xc0,0x0,0x0,0x2,0x0,0xc,0x0,0x38,0x0,
+0x30,0x0,
+};
+
+static const BitmapCharRec ch249 = {11,17,-1,0,13,ch249data};
+
+/* char: 0xf8 */
+
+static const GLubyte ch248data[] = {
+0xc0,0x0,0xde,0x0,0x73,0x80,0x71,0x80,0xd0,0xc0,0xd8,0xc0,0xc8,0xc0,0xcc,0xc0,
+0xc4,0xc0,0xc6,0xc0,0x63,0x80,0x73,0x80,0x1e,0xc0,0x0,0xc0,
+};
+
+static const BitmapCharRec ch248 = {10,14,-1,1,12,ch248data};
+
+/* char: 0xf7 */
+
+static const GLubyte ch247data[] = {
+0x6,0x0,0x6,0x0,0x0,0x0,0x0,0x0,0xff,0xf0,0xff,0xf0,0x0,0x0,0x0,0x0,
+0x6,0x0,0x6,0x0,
+};
+
+static const BitmapCharRec ch247 = {12,10,-1,-2,14,ch247data};
+
+/* char: 0xf6 */
+
+static const GLubyte ch246data[] = {
+0x1e,0x0,0x73,0x80,0x61,0x80,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+0xc0,0xc0,0x61,0x80,0x73,0x80,0x1e,0x0,0x0,0x0,0x0,0x0,0x33,0x0,0x33,0x0,
+};
+
+static const BitmapCharRec ch246 = {10,16,-1,0,12,ch246data};
+
+/* char: 0xf5 */
+
+static const GLubyte ch245data[] = {
+0x1e,0x0,0x73,0x80,0x61,0x80,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+0xc0,0xc0,0x61,0x80,0x73,0x80,0x1e,0x0,0x0,0x0,0x0,0x0,0x27,0x0,0x1c,0x80,
+};
+
+static const BitmapCharRec ch245 = {10,16,-1,0,12,ch245data};
+
+/* char: 0xf4 */
+
+static const GLubyte ch244data[] = {
+0x1e,0x0,0x73,0x80,0x61,0x80,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+0xc0,0xc0,0x61,0x80,0x73,0x80,0x1e,0x0,0x0,0x0,0x21,0x0,0x12,0x0,0x1e,0x0,
+0xc,0x0,
+};
+
+static const BitmapCharRec ch244 = {10,17,-1,0,12,ch244data};
+
+/* char: 0xf3 */
+
+static const GLubyte ch243data[] = {
+0x1e,0x0,0x73,0x80,0x61,0x80,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+0xc0,0xc0,0x61,0x80,0x73,0x80,0x1e,0x0,0x0,0x0,0x8,0x0,0x6,0x0,0x3,0x80,
+0x1,0x80,
+};
+
+static const BitmapCharRec ch243 = {10,17,-1,0,12,ch243data};
+
+/* char: 0xf2 */
+
+static const GLubyte ch242data[] = {
+0x1e,0x0,0x73,0x80,0x61,0x80,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+0xc0,0xc0,0x61,0x80,0x73,0x80,0x1e,0x0,0x0,0x0,0x2,0x0,0xc,0x0,0x38,0x0,
+0x30,0x0,
+};
+
+static const BitmapCharRec ch242 = {10,17,-1,0,12,ch242data};
+
+/* char: 0xf1 */
+
+static const GLubyte ch241data[] = {
+0xf1,0xe0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,
+0x60,0xc0,0x71,0xc0,0x6f,0x80,0xe7,0x0,0x0,0x0,0x0,0x0,0x27,0x0,0x1c,0x80,
+};
+
+static const BitmapCharRec ch241 = {11,16,-1,0,13,ch241data};
+
+/* char: 0xf0 */
+
+static const GLubyte ch240data[] = {
+0x1e,0x0,0x73,0x80,0x61,0x80,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+0xc0,0xc0,0x61,0x80,0x73,0x80,0x1f,0x0,0xc6,0x0,0x3c,0x0,0x1e,0x0,0x71,0x80,
+0xc0,0x0,
+};
+
+static const BitmapCharRec ch240 = {10,17,-1,0,12,ch240data};
+
+/* char: 0xef */
+
+static const GLubyte ch239data[] = {
+0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x70,0x0,0x0,0xcc,0xcc,
+};
+
+static const BitmapCharRec ch239 = {6,16,0,0,6,ch239data};
+
+/* char: 0xee */
+
+static const GLubyte ch238data[] = {
+0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x70,0x0,0x84,0x48,0x78,
+0x30,
+};
+
+static const BitmapCharRec ch238 = {6,17,0,0,6,ch238data};
+
+/* char: 0xed */
+
+static const GLubyte ch237data[] = {
+0xf0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xe0,0x0,0x80,0x60,0x38,
+0x18,
+};
+
+static const BitmapCharRec ch237 = {5,17,-1,0,6,ch237data};
+
+/* char: 0xec */
+
+static const GLubyte ch236data[] = {
+0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x70,0x0,0x8,0x30,0xe0,
+0xc0,
+};
+
+static const BitmapCharRec ch236 = {5,17,0,0,6,ch236data};
+
+/* char: 0xeb */
+
+static const GLubyte ch235data[] = {
+0x1e,0x0,0x7f,0x0,0x70,0x80,0xe0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x80,
+0xc1,0x80,0x41,0x80,0x63,0x0,0x1e,0x0,0x0,0x0,0x0,0x0,0x33,0x0,0x33,0x0,
+};
+
+static const BitmapCharRec ch235 = {9,16,-1,0,11,ch235data};
+
+/* char: 0xea */
+
+static const GLubyte ch234data[] = {
+0x1e,0x0,0x7f,0x0,0x70,0x80,0xe0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x80,
+0xc1,0x80,0x41,0x80,0x63,0x0,0x1e,0x0,0x0,0x0,0x21,0x0,0x12,0x0,0x1e,0x0,
+0xc,0x0,
+};
+
+static const BitmapCharRec ch234 = {9,17,-1,0,11,ch234data};
+
+/* char: 0xe9 */
+
+static const GLubyte ch233data[] = {
+0x1e,0x0,0x7f,0x0,0x70,0x80,0xe0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x80,
+0xc1,0x80,0x41,0x80,0x63,0x0,0x1e,0x0,0x0,0x0,0x10,0x0,0xc,0x0,0x7,0x0,
+0x3,0x0,
+};
+
+static const BitmapCharRec ch233 = {9,17,-1,0,11,ch233data};
+
+/* char: 0xe8 */
+
+static const GLubyte ch232data[] = {
+0x1e,0x0,0x7f,0x0,0x70,0x80,0xe0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x80,
+0xc1,0x80,0x41,0x80,0x63,0x0,0x1e,0x0,0x0,0x0,0x4,0x0,0x18,0x0,0x70,0x0,
+0x60,0x0,
+};
+
+static const BitmapCharRec ch232 = {9,17,-1,0,11,ch232data};
+
+/* char: 0xe7 */
+
+static const GLubyte ch231data[] = {
+0x3c,0x0,0x66,0x0,0x6,0x0,0x1e,0x0,0x18,0x0,0x8,0x0,0x1e,0x0,0x7f,0x0,
+0x70,0x80,0xe0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0x41,0x80,
+0x63,0x80,0x1f,0x0,
+};
+
+static const BitmapCharRec ch231 = {9,18,-1,6,11,ch231data};
+
+/* char: 0xe6 */
+
+static const GLubyte ch230data[] = {
+0x70,0xf0,0xfb,0xf8,0xc7,0x84,0xc3,0x0,0xc3,0x0,0x63,0x0,0x3b,0x0,0xf,0xfc,
+0x3,0xc,0x63,0xc,0x67,0x98,0x3c,0xf0,
+};
+
+static const BitmapCharRec ch230 = {14,12,-1,0,16,ch230data};
+
+/* char: 0xe5 */
+
+static const GLubyte ch229data[] = {
+0x71,0x80,0xfb,0x0,0xc7,0x0,0xc3,0x0,0xc3,0x0,0x63,0x0,0x3b,0x0,0xf,0x0,
+0x3,0x0,0x63,0x0,0x67,0x0,0x3e,0x0,0x0,0x0,0x1c,0x0,0x22,0x0,0x22,0x0,
+0x1c,0x0,
+};
+
+static const BitmapCharRec ch229 = {9,17,-1,0,11,ch229data};
+
+/* char: 0xe4 */
+
+static const GLubyte ch228data[] = {
+0x71,0x80,0xfb,0x0,0xc7,0x0,0xc3,0x0,0xc3,0x0,0x63,0x0,0x3b,0x0,0xf,0x0,
+0x3,0x0,0x63,0x0,0x67,0x0,0x3e,0x0,0x0,0x0,0x0,0x0,0x66,0x0,0x66,0x0,
+};
+
+static const BitmapCharRec ch228 = {9,16,-1,0,11,ch228data};
+
+/* char: 0xe3 */
+
+static const GLubyte ch227data[] = {
+0x71,0x80,0xfb,0x0,0xc7,0x0,0xc3,0x0,0xc3,0x0,0x63,0x0,0x3b,0x0,0xf,0x0,
+0x3,0x0,0x63,0x0,0x67,0x0,0x3e,0x0,0x0,0x0,0x0,0x0,0x5c,0x0,0x3a,0x0,
+};
+
+static const BitmapCharRec ch227 = {9,16,-1,0,11,ch227data};
+
+/* char: 0xe2 */
+
+static const GLubyte ch226data[] = {
+0x71,0x80,0xfb,0x0,0xc7,0x0,0xc3,0x0,0xc3,0x0,0x63,0x0,0x3b,0x0,0xf,0x0,
+0x3,0x0,0x63,0x0,0x67,0x0,0x3e,0x0,0x0,0x0,0x42,0x0,0x24,0x0,0x3c,0x0,
+0x18,0x0,
+};
+
+static const BitmapCharRec ch226 = {9,17,-1,0,11,ch226data};
+
+/* char: 0xe1 */
+
+static const GLubyte ch225data[] = {
+0x71,0x80,0xfb,0x0,0xc7,0x0,0xc3,0x0,0xc3,0x0,0x63,0x0,0x3b,0x0,0xf,0x0,
+0x3,0x0,0x63,0x0,0x67,0x0,0x3e,0x0,0x0,0x0,0x10,0x0,0xc,0x0,0x7,0x0,
+0x3,0x0,
+};
+
+static const BitmapCharRec ch225 = {9,17,-1,0,11,ch225data};
+
+/* char: 0xe0 */
+
+static const GLubyte ch224data[] = {
+0x71,0x80,0xfb,0x0,0xc7,0x0,0xc3,0x0,0xc3,0x0,0x63,0x0,0x3b,0x0,0xf,0x0,
+0x3,0x0,0x63,0x0,0x67,0x0,0x3e,0x0,0x0,0x0,0x4,0x0,0x18,0x0,0x70,0x0,
+0x60,0x0,
+};
+
+static const BitmapCharRec ch224 = {9,17,-1,0,11,ch224data};
+
+/* char: 0xdf */
+
+static const GLubyte ch223data[] = {
+0xe7,0x0,0x6c,0x80,0x6c,0xc0,0x60,0xc0,0x60,0xc0,0x61,0xc0,0x61,0x80,0x63,0x80,
+0x67,0x0,0x6c,0x0,0x63,0x0,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x0,
+0x1e,0x0,
+};
+
+static const BitmapCharRec ch223 = {10,17,-1,0,12,ch223data};
+
+/* char: 0xde */
+
+static const GLubyte ch222data[] = {
+0xfc,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x3f,0xc0,0x30,0x70,0x30,0x30,0x30,0x18,
+0x30,0x18,0x30,0x18,0x30,0x30,0x30,0x70,0x3f,0xc0,0x30,0x0,0x30,0x0,0x30,0x0,
+0xfc,0x0,
+};
+
+static const BitmapCharRec ch222 = {13,17,-1,0,15,ch222data};
+
+/* char: 0xdd */
+
+static const GLubyte ch221data[] = {
+0x7,0xe0,0x1,0x80,0x1,0x80,0x1,0x80,0x1,0x80,0x1,0x80,0x1,0x80,0x3,0xc0,
+0x3,0x40,0x6,0x60,0x6,0x20,0xc,0x30,0x1c,0x10,0x18,0x18,0x38,0x8,0x30,0xc,
+0xfc,0x3f,0x0,0x0,0x1,0x0,0x0,0xc0,0x0,0x70,0x0,0x30,
+};
+
+static const BitmapCharRec ch221 = {16,22,0,0,16,ch221data};
+
+/* char: 0xdc */
+
+static const GLubyte ch220data[] = {
+0x7,0xe0,0x1c,0x30,0x18,0x8,0x30,0x8,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,
+0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,
+0xfc,0x1f,0x0,0x0,0x0,0x0,0x6,0x30,0x6,0x30,
+};
+
+static const BitmapCharRec ch220 = {16,21,-1,0,18,ch220data};
+
+/* char: 0xdb */
+
+static const GLubyte ch219data[] = {
+0x7,0xe0,0x1c,0x30,0x18,0x8,0x30,0x8,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,
+0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,
+0xfc,0x1f,0x0,0x0,0x8,0x10,0x6,0x60,0x3,0xc0,0x1,0x80,
+};
+
+static const BitmapCharRec ch219 = {16,22,-1,0,18,ch219data};
+
+/* char: 0xda */
+
+static const GLubyte ch218data[] = {
+0x7,0xe0,0x1c,0x30,0x18,0x8,0x30,0x8,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,
+0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,
+0xfc,0x1f,0x0,0x0,0x1,0x0,0x0,0xc0,0x0,0x70,0x0,0x30,
+};
+
+static const BitmapCharRec ch218 = {16,22,-1,0,18,ch218data};
+
+/* char: 0xd9 */
+
+static const GLubyte ch217data[] = {
+0x7,0xe0,0x1c,0x30,0x18,0x8,0x30,0x8,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,
+0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,
+0xfc,0x1f,0x0,0x0,0x0,0x40,0x1,0x80,0x7,0x0,0x6,0x0,
+};
+
+static const BitmapCharRec ch217 = {16,22,-1,0,18,ch217data};
+
+/* char: 0xd8 */
+
+static const GLubyte ch216data[] = {
+0x20,0x0,0x27,0xe0,0x1c,0x38,0x38,0x1c,0x68,0x6,0x64,0x6,0xc2,0x3,0xc2,0x3,
+0xc1,0x3,0xc1,0x3,0xc0,0x83,0xc0,0x83,0xc0,0x43,0x60,0x46,0x60,0x26,0x38,0x1c,
+0x1c,0x38,0x7,0xe4,0x0,0x4,
+};
+
+static const BitmapCharRec ch216 = {16,19,-1,1,18,ch216data};
+
+/* char: 0xd7 */
+
+static const GLubyte ch215data[] = {
+0x80,0x40,0xc0,0xc0,0x61,0x80,0x33,0x0,0x1e,0x0,0xc,0x0,0x1e,0x0,0x33,0x0,
+0x61,0x80,0xc0,0xc0,0x80,0x40,
+};
+
+static const BitmapCharRec ch215 = {10,11,-2,-1,14,ch215data};
+
+/* char: 0xd6 */
+
+static const GLubyte ch214data[] = {
+0x7,0xe0,0x1c,0x38,0x38,0x1c,0x60,0x6,0x60,0x6,0xc0,0x3,0xc0,0x3,0xc0,0x3,
+0xc0,0x3,0xc0,0x3,0xc0,0x3,0xc0,0x3,0x60,0x6,0x60,0x6,0x38,0x1c,0x1c,0x38,
+0x7,0xe0,0x0,0x0,0x0,0x0,0x6,0x60,0x6,0x60,
+};
+
+static const BitmapCharRec ch214 = {16,21,-1,0,18,ch214data};
+
+/* char: 0xd5 */
+
+static const GLubyte ch213data[] = {
+0x7,0xe0,0x1c,0x38,0x38,0x1c,0x60,0x6,0x60,0x6,0xc0,0x3,0xc0,0x3,0xc0,0x3,
+0xc0,0x3,0xc0,0x3,0xc0,0x3,0xc0,0x3,0x60,0x6,0x60,0x6,0x38,0x1c,0x1c,0x38,
+0x7,0xe0,0x0,0x0,0x0,0x0,0x4,0xe0,0x3,0x90,
+};
+
+static const BitmapCharRec ch213 = {16,21,-1,0,18,ch213data};
+
+/* char: 0xd4 */
+
+static const GLubyte ch212data[] = {
+0x7,0xe0,0x1c,0x38,0x38,0x1c,0x60,0x6,0x60,0x6,0xc0,0x3,0xc0,0x3,0xc0,0x3,
+0xc0,0x3,0xc0,0x3,0xc0,0x3,0xc0,0x3,0x60,0x6,0x60,0x6,0x38,0x1c,0x1c,0x38,
+0x7,0xe0,0x0,0x0,0x8,0x10,0x6,0x60,0x3,0xc0,0x1,0x80,
+};
+
+static const BitmapCharRec ch212 = {16,22,-1,0,18,ch212data};
+
+/* char: 0xd3 */
+
+static const GLubyte ch211data[] = {
+0x7,0xe0,0x1c,0x38,0x38,0x1c,0x60,0x6,0x60,0x6,0xc0,0x3,0xc0,0x3,0xc0,0x3,
+0xc0,0x3,0xc0,0x3,0xc0,0x3,0xc0,0x3,0x60,0x6,0x60,0x6,0x38,0x1c,0x1c,0x38,
+0x7,0xe0,0x0,0x0,0x1,0x0,0x0,0xc0,0x0,0x70,0x0,0x30,
+};
+
+static const BitmapCharRec ch211 = {16,22,-1,0,18,ch211data};
+
+/* char: 0xd2 */
+
+static const GLubyte ch210data[] = {
+0x7,0xe0,0x1c,0x38,0x38,0x1c,0x60,0x6,0x60,0x6,0xc0,0x3,0xc0,0x3,0xc0,0x3,
+0xc0,0x3,0xc0,0x3,0xc0,0x3,0xc0,0x3,0x60,0x6,0x60,0x6,0x38,0x1c,0x1c,0x38,
+0x7,0xe0,0x0,0x0,0x0,0x40,0x1,0x80,0x7,0x0,0x6,0x0,
+};
+
+static const BitmapCharRec ch210 = {16,22,-1,0,18,ch210data};
+
+/* char: 0xd1 */
+
+static const GLubyte ch209data[] = {
+0xf8,0xc,0x20,0x1c,0x20,0x1c,0x20,0x34,0x20,0x64,0x20,0x64,0x20,0xc4,0x21,0x84,
+0x21,0x84,0x23,0x4,0x26,0x4,0x26,0x4,0x2c,0x4,0x38,0x4,0x38,0x4,0x30,0x4,
+0xf0,0x1f,0x0,0x0,0x0,0x0,0x4,0xe0,0x3,0x90,
+};
+
+static const BitmapCharRec ch209 = {16,21,-1,0,18,ch209data};
+
+/* char: 0xd0 */
+
+static const GLubyte ch208data[] = {
+0x7f,0xe0,0x18,0x38,0x18,0x1c,0x18,0x6,0x18,0x6,0x18,0x3,0x18,0x3,0x18,0x3,
+0xff,0x3,0x18,0x3,0x18,0x3,0x18,0x3,0x18,0x6,0x18,0x6,0x18,0x1c,0x18,0x38,
+0x7f,0xe0,
+};
+
+static const BitmapCharRec ch208 = {16,17,0,0,17,ch208data};
+
+/* char: 0xcf */
+
+static const GLubyte ch207data[] = {
+0xfc,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
+0xfc,0x0,0x0,0xcc,0xcc,
+};
+
+static const BitmapCharRec ch207 = {6,21,-1,0,8,ch207data};
+
+/* char: 0xce */
+
+static const GLubyte ch206data[] = {
+0x7e,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x7e,0x0,0x81,0x66,0x3c,0x18,
+};
+
+static const BitmapCharRec ch206 = {8,22,-1,0,8,ch206data};
+
+/* char: 0xcd */
+
+static const GLubyte ch205data[] = {
+0xfc,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
+0xfc,0x0,0x40,0x30,0x1c,0xc,
+};
+
+static const BitmapCharRec ch205 = {6,22,-1,0,8,ch205data};
+
+/* char: 0xcc */
+
+static const GLubyte ch204data[] = {
+0xfc,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
+0xfc,0x0,0x8,0x30,0xe0,0xc0,
+};
+
+static const BitmapCharRec ch204 = {6,22,-1,0,8,ch204data};
+
+/* char: 0xcb */
+
+static const GLubyte ch203data[] = {
+0xff,0xf8,0x30,0x18,0x30,0x8,0x30,0x8,0x30,0x0,0x30,0x0,0x30,0x40,0x30,0x40,
+0x3f,0xc0,0x30,0x40,0x30,0x40,0x30,0x0,0x30,0x0,0x30,0x10,0x30,0x10,0x30,0x30,
+0xff,0xf0,0x0,0x0,0x0,0x0,0x19,0x80,0x19,0x80,
+};
+
+static const BitmapCharRec ch203 = {13,21,-1,0,15,ch203data};
+
+/* char: 0xca */
+
+static const GLubyte ch202data[] = {
+0xff,0xf8,0x30,0x18,0x30,0x8,0x30,0x8,0x30,0x0,0x30,0x0,0x30,0x40,0x30,0x40,
+0x3f,0xc0,0x30,0x40,0x30,0x40,0x30,0x0,0x30,0x0,0x30,0x10,0x30,0x10,0x30,0x30,
+0xff,0xf0,0x0,0x0,0x10,0x20,0xc,0xc0,0x7,0x80,0x3,0x0,
+};
+
+static const BitmapCharRec ch202 = {13,22,-1,0,15,ch202data};
+
+/* char: 0xc9 */
+
+static const GLubyte ch201data[] = {
+0xff,0xf8,0x30,0x18,0x30,0x8,0x30,0x8,0x30,0x0,0x30,0x0,0x30,0x40,0x30,0x40,
+0x3f,0xc0,0x30,0x40,0x30,0x40,0x30,0x0,0x30,0x0,0x30,0x10,0x30,0x10,0x30,0x30,
+0xff,0xf0,0x0,0x0,0x4,0x0,0x3,0x0,0x1,0xc0,0x0,0xc0,
+};
+
+static const BitmapCharRec ch201 = {13,22,-1,0,15,ch201data};
+
+/* char: 0xc8 */
+
+static const GLubyte ch200data[] = {
+0xff,0xf8,0x30,0x18,0x30,0x8,0x30,0x8,0x30,0x0,0x30,0x0,0x30,0x40,0x30,0x40,
+0x3f,0xc0,0x30,0x40,0x30,0x40,0x30,0x0,0x30,0x0,0x30,0x10,0x30,0x10,0x30,0x30,
+0xff,0xf0,0x0,0x0,0x1,0x0,0x6,0x0,0x1c,0x0,0x18,0x0,
+};
+
+static const BitmapCharRec ch200 = {13,22,-1,0,15,ch200data};
+
+/* char: 0xc7 */
+
+static const GLubyte ch199data[] = {
+0x7,0x80,0xc,0xc0,0x0,0xc0,0x3,0xc0,0x3,0x0,0x1,0x0,0x7,0xe0,0x1e,0x38,
+0x38,0x8,0x60,0x4,0x60,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,
+0xc0,0x0,0xc0,0x0,0x60,0x4,0x60,0x4,0x38,0xc,0x1c,0x3c,0x7,0xe4,
+};
+
+static const BitmapCharRec ch199 = {14,23,-1,6,16,ch199data};
+
+/* char: 0xc6 */
+
+static const GLubyte ch198data[] = {
+0xf9,0xff,0xf0,0x30,0x60,0x30,0x10,0x60,0x10,0x10,0x60,0x10,0x18,0x60,0x0,0x8,
+0x60,0x0,0xf,0xe0,0x80,0xc,0x60,0x80,0x4,0x7f,0x80,0x4,0x60,0x80,0x6,0x60,
+0x80,0x2,0x60,0x0,0x2,0x60,0x0,0x1,0x60,0x20,0x1,0x60,0x20,0x1,0xe0,0x60,
+0x3,0xff,0xe0,
+};
+
+static const BitmapCharRec ch198 = {20,17,0,0,21,ch198data};
+
+/* char: 0xc5 */
+
+static const GLubyte ch197data[] = {
+0xfc,0x1f,0x80,0x30,0x6,0x0,0x10,0x6,0x0,0x10,0xc,0x0,0x18,0xc,0x0,0x8,
+0xc,0x0,0xf,0xf8,0x0,0xc,0x18,0x0,0x4,0x18,0x0,0x4,0x30,0x0,0x6,0x30,
+0x0,0x2,0x30,0x0,0x2,0x60,0x0,0x1,0x60,0x0,0x1,0xc0,0x0,0x1,0xc0,0x0,
+0x0,0x80,0x0,0x1,0xc0,0x0,0x2,0x20,0x0,0x2,0x20,0x0,0x1,0xc0,0x0,
+};
+
+static const BitmapCharRec ch197 = {17,21,0,0,17,ch197data};
+
+/* char: 0xc4 */
+
+static const GLubyte ch196data[] = {
+0xfc,0x1f,0x80,0x30,0x6,0x0,0x10,0x6,0x0,0x10,0xc,0x0,0x18,0xc,0x0,0x8,
+0xc,0x0,0xf,0xf8,0x0,0xc,0x18,0x0,0x4,0x18,0x0,0x4,0x30,0x0,0x6,0x30,
+0x0,0x2,0x30,0x0,0x2,0x60,0x0,0x1,0x60,0x0,0x1,0xc0,0x0,0x1,0xc0,0x0,
+0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x6,0x30,0x0,0x6,0x30,0x0,
+};
+
+static const BitmapCharRec ch196 = {17,21,0,0,17,ch196data};
+
+/* char: 0xc3 */
+
+static const GLubyte ch195data[] = {
+0xfc,0x1f,0x80,0x30,0x7,0x0,0x10,0x6,0x0,0x10,0xc,0x0,0x18,0xc,0x0,0x8,
+0xc,0x0,0xf,0xf8,0x0,0xc,0x18,0x0,0x4,0x18,0x0,0x4,0x30,0x0,0x6,0x30,
+0x0,0x2,0x30,0x0,0x2,0x60,0x0,0x1,0x60,0x0,0x1,0xc0,0x0,0x1,0xc0,0x0,
+0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4,0xe0,0x0,0x3,0x90,0x0,
+};
+
+static const BitmapCharRec ch195 = {17,21,0,0,17,ch195data};
+
+/* char: 0xc2 */
+
+static const GLubyte ch194data[] = {
+0xfc,0x1f,0x80,0x30,0x6,0x0,0x10,0x6,0x0,0x10,0xc,0x0,0x18,0xc,0x0,0x8,
+0xc,0x0,0xf,0xf8,0x0,0xc,0x18,0x0,0x4,0x18,0x0,0x4,0x30,0x0,0x6,0x30,
+0x0,0x2,0x30,0x0,0x2,0x60,0x0,0x1,0x60,0x0,0x1,0xc0,0x0,0x1,0xc0,0x0,
+0x0,0x80,0x0,0x0,0x0,0x0,0x8,0x10,0x0,0x6,0x60,0x0,0x3,0xc0,0x0,0x1,
+0x80,0x0,
+};
+
+static const BitmapCharRec ch194 = {17,22,0,0,17,ch194data};
+
+/* char: 0xc1 */
+
+static const GLubyte ch193data[] = {
+0xfc,0x1f,0x80,0x30,0x6,0x0,0x10,0x6,0x0,0x10,0xc,0x0,0x18,0xc,0x0,0x8,
+0xc,0x0,0xf,0xf8,0x0,0xc,0x18,0x0,0x4,0x18,0x0,0x4,0x30,0x0,0x6,0x30,
+0x0,0x2,0x30,0x0,0x2,0x60,0x0,0x1,0x60,0x0,0x1,0xc0,0x0,0x1,0xc0,0x0,
+0x0,0x80,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xc0,0x0,0x0,0x70,0x0,0x0,
+0x30,0x0,
+};
+
+static const BitmapCharRec ch193 = {17,22,0,0,17,ch193data};
+
+/* char: 0xc0 */
+
+static const GLubyte ch192data[] = {
+0xfc,0x1f,0x80,0x30,0x6,0x0,0x10,0x6,0x0,0x10,0xc,0x0,0x18,0xc,0x0,0x8,
+0xc,0x0,0xf,0xf8,0x0,0xc,0x18,0x0,0x4,0x18,0x0,0x4,0x30,0x0,0x6,0x30,
+0x0,0x2,0x30,0x0,0x2,0x60,0x0,0x1,0x60,0x0,0x1,0xc0,0x0,0x1,0xc0,0x0,
+0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x20,0x0,0x0,0xc0,0x0,0x3,0x80,0x0,0x3,
+0x0,0x0,
+};
+
+static const BitmapCharRec ch192 = {17,22,0,0,17,ch192data};
+
+/* char: 0xbf */
+
+static const GLubyte ch191data[] = {
+0x3e,0x63,0xc1,0xc3,0xc3,0xe0,0x70,0x30,0x38,0x18,0x18,0x8,0x8,0x0,0x0,0xc,
+0xc,
+};
+
+static const BitmapCharRec ch191 = {8,17,-1,5,11,ch191data};
+
+/* char: 0xbe */
+
+static const GLubyte ch190data[] = {
+0x18,0x2,0x0,0x8,0x2,0x0,0xc,0x7f,0x80,0x4,0x22,0x0,0x6,0x32,0x0,0x3,
+0x12,0x0,0x1,0xa,0x0,0x71,0x8e,0x0,0x88,0x86,0x0,0x8c,0xc2,0x0,0xc,0x60,
+0x0,0x8,0x20,0x0,0x30,0x30,0x0,0x8,0x10,0x0,0x8c,0x18,0x0,0x4c,0xc,0x0,
+0x38,0x4,0x0,
+};
+
+static const BitmapCharRec ch190 = {17,17,0,0,18,ch190data};
+
+/* char: 0xbd */
+
+static const GLubyte ch189data[] = {
+0x30,0x7e,0x10,0x22,0x18,0x10,0x8,0x18,0xc,0x8,0x6,0x4,0x2,0x6,0xfb,0x46,
+0x21,0x26,0x21,0x9c,0x20,0xc0,0x20,0x40,0x20,0x60,0x20,0x20,0xa0,0x30,0x60,0x18,
+0x20,0x8,
+};
+
+static const BitmapCharRec ch189 = {15,17,-1,0,18,ch189data};
+
+/* char: 0xbc */
+
+static const GLubyte ch188data[] = {
+0x30,0x4,0x10,0x4,0x18,0xff,0x8,0x44,0xc,0x64,0x6,0x24,0x2,0x14,0xfb,0x1c,
+0x21,0xc,0x21,0x84,0x20,0xc0,0x20,0x40,0x20,0x60,0x20,0x20,0xa0,0x30,0x60,0x18,
+0x20,0x8,
+};
+
+static const BitmapCharRec ch188 = {16,17,-1,0,18,ch188data};
+
+/* char: 0xbb */
+
+static const GLubyte ch187data[] = {
+0x88,0x0,0xcc,0x0,0x66,0x0,0x33,0x0,0x19,0x80,0x19,0x80,0x33,0x0,0x66,0x0,
+0xcc,0x0,0x88,0x0,
+};
+
+static const BitmapCharRec ch187 = {9,10,-2,-1,12,ch187data};
+
+/* char: 0xba */
+
+static const GLubyte ch186data[] = {
+0xfc,0x0,0x78,0xcc,0xcc,0xcc,0xcc,0xcc,0x78,
+};
+
+static const BitmapCharRec ch186 = {6,9,-1,-8,8,ch186data};
+
+/* char: 0xb9 */
+
+static const GLubyte ch185data[] = {
+0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0xa0,0x60,0x20,
+};
+
+static const BitmapCharRec ch185 = {5,10,-1,-7,7,ch185data};
+
+/* char: 0xb8 */
+
+static const GLubyte ch184data[] = {
+0x78,0xcc,0xc,0x3c,0x30,0x10,
+};
+
+static const BitmapCharRec ch184 = {6,6,-1,6,8,ch184data};
+
+/* char: 0xb7 */
+
+static const GLubyte ch183data[] = {
+0xc0,0xc0,
+};
+
+static const BitmapCharRec ch183 = {2,2,-2,-6,6,ch183data};
+
+/* char: 0xb6 */
+
+static const GLubyte ch182data[] = {
+0x9,0x0,0x9,0x0,0x9,0x0,0x9,0x0,0x9,0x0,0x9,0x0,0x9,0x0,0x9,0x0,
+0x9,0x0,0x9,0x0,0x9,0x0,0x19,0x0,0x39,0x0,0x79,0x0,0x79,0x0,0xf9,0x0,
+0xf9,0x0,0xf9,0x0,0x79,0x0,0x79,0x0,0x39,0x0,0x1f,0x80,
+};
+
+static const BitmapCharRec ch182 = {9,22,-1,5,11,ch182data};
+
+/* char: 0xb5 */
+
+static const GLubyte ch181data[] = {
+0x40,0x0,0xe0,0x0,0xc0,0x0,0x40,0x0,0x40,0x0,0x5c,0xe0,0x7e,0xc0,0x71,0xc0,
+0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,
+0xe1,0xc0,
+};
+
+static const BitmapCharRec ch181 = {11,17,-1,5,13,ch181data};
+
+/* char: 0xb4 */
+
+static const GLubyte ch180data[] = {
+0x80,0x60,0x38,0x18,
+};
+
+static const BitmapCharRec ch180 = {5,4,-2,-13,8,ch180data};
+
+/* char: 0xb3 */
+
+static const GLubyte ch179data[] = {
+0x70,0x88,0x8c,0xc,0x8,0x30,0x8,0x8c,0x4c,0x38,
+};
+
+static const BitmapCharRec ch179 = {6,10,0,-7,7,ch179data};
+
+/* char: 0xb2 */
+
+static const GLubyte ch178data[] = {
+0xfc,0x44,0x20,0x30,0x10,0x8,0xc,0x8c,0x4c,0x38,
+};
+
+static const BitmapCharRec ch178 = {6,10,0,-7,7,ch178data};
+
+/* char: 0xb1 */
+
+static const GLubyte ch177data[] = {
+0xff,0xf0,0xff,0xf0,0x0,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,
+0xff,0xf0,0xff,0xf0,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,
+};
+
+static const BitmapCharRec ch177 = {12,15,-1,0,14,ch177data};
+
+/* char: 0xb0 */
+
+static const GLubyte ch176data[] = {
+0x38,0x44,0x82,0x82,0x82,0x44,0x38,
+};
+
+static const BitmapCharRec ch176 = {7,7,-1,-10,9,ch176data};
+
+/* char: 0xaf */
+
+static const GLubyte ch175data[] = {
+0xfc,0xfc,
+};
+
+static const BitmapCharRec ch175 = {6,2,-1,-14,8,ch175data};
+
+/* char: 0xae */
+
+static const GLubyte ch174data[] = {
+0x7,0xf0,0x0,0x1c,0x1c,0x0,0x30,0x6,0x0,0x60,0x3,0x0,0x47,0x19,0x0,0xc2,
+0x31,0x80,0x82,0x20,0x80,0x82,0x40,0x80,0x83,0xe0,0x80,0x82,0x30,0x80,0x82,0x10,
+0x80,0xc2,0x11,0x80,0x42,0x31,0x0,0x67,0xe3,0x0,0x30,0x6,0x0,0x1c,0x1c,0x0,
+0x7,0xf0,0x0,
+};
+
+static const BitmapCharRec ch174 = {17,17,-1,0,19,ch174data};
+
+/* char: 0xad */
+
+static const GLubyte ch173data[] = {
+0xfe,0xfe,
+};
+
+static const BitmapCharRec ch173 = {7,2,-1,-5,9,ch173data};
+
+/* char: 0xac */
+
+static const GLubyte ch172data[] = {
+0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0xff,0xf0,0xff,0xf0,
+};
+
+static const BitmapCharRec ch172 = {12,7,-1,-3,14,ch172data};
+
+/* char: 0xab */
+
+static const GLubyte ch171data[] = {
+0x8,0x80,0x19,0x80,0x33,0x0,0x66,0x0,0xcc,0x0,0xcc,0x0,0x66,0x0,0x33,0x0,
+0x19,0x80,0x8,0x80,
+};
+
+static const BitmapCharRec ch171 = {9,10,-2,-1,13,ch171data};
+
+/* char: 0xaa */
+
+static const GLubyte ch170data[] = {
+0x7e,0x0,0x76,0xcc,0xcc,0x7c,0xc,0xcc,0x78,
+};
+
+static const BitmapCharRec ch170 = {7,9,0,-8,8,ch170data};
+
+/* char: 0xa9 */
+
+static const GLubyte ch169data[] = {
+0x7,0xf0,0x0,0x1c,0x1c,0x0,0x30,0x6,0x0,0x61,0xc3,0x0,0x47,0x71,0x0,0xc4,
+0x19,0x80,0x8c,0x0,0x80,0x88,0x0,0x80,0x88,0x0,0x80,0x88,0x0,0x80,0x8c,0x0,
+0x80,0xc4,0x19,0x80,0x47,0x31,0x0,0x61,0xe3,0x0,0x30,0x6,0x0,0x1c,0x1c,0x0,
+0x7,0xf0,0x0,
+};
+
+static const BitmapCharRec ch169 = {17,17,-1,0,19,ch169data};
+
+/* char: 0xa8 */
+
+static const GLubyte ch168data[] = {
+0xcc,0xcc,
+};
+
+static const BitmapCharRec ch168 = {6,2,-1,-14,8,ch168data};
+
+/* char: 0xa7 */
+
+static const GLubyte ch167data[] = {
+0x38,0x64,0x62,0x6,0xe,0x1c,0x38,0x74,0xe2,0xc3,0x83,0x87,0x4e,0x3c,0x38,0x70,
+0x60,0x46,0x26,0x1c,
+};
+
+static const BitmapCharRec ch167 = {8,20,-2,2,12,ch167data};
+
+/* char: 0xa6 */
+
+static const GLubyte ch166data[] = {
+0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x0,0x0,0x0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+0xc0,
+};
+
+static const BitmapCharRec ch166 = {2,17,-2,0,6,ch166data};
+
+/* char: 0xa5 */
+
+static const GLubyte ch165data[] = {
+0xf,0xc0,0x3,0x0,0x3,0x0,0x3,0x0,0x3,0x0,0x1f,0xe0,0x3,0x0,0x1f,0xe0,
+0x3,0x0,0x7,0x80,0xc,0x80,0xc,0xc0,0x18,0x40,0x18,0x60,0x30,0x20,0x70,0x30,
+0xf8,0x7c,
+};
+
+static const BitmapCharRec ch165 = {14,17,0,0,14,ch165data};
+
+/* char: 0xa4 */
+
+static const GLubyte ch164data[] = {
+0xc0,0x60,0xee,0xe0,0x7f,0xc0,0x31,0x80,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,
+0x31,0x80,0x7f,0xc0,0xee,0xe0,0xc0,0x60,
+};
+
+static const BitmapCharRec ch164 = {11,12,-1,-3,13,ch164data};
+
+/* char: 0xa3 */
+
+static const GLubyte ch163data[] = {
+0xe7,0x80,0xbe,0xc0,0x78,0x40,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,
+0x30,0x0,0xfc,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x31,0x80,0x19,0x80,
+0xf,0x0,
+};
+
+static const BitmapCharRec ch163 = {10,17,-1,0,12,ch163data};
+
+/* char: 0xa2 */
+
+static const GLubyte ch162data[] = {
+0x40,0x0,0x40,0x0,0x3e,0x0,0x7f,0x0,0x70,0x80,0xd0,0x0,0xc8,0x0,0xc8,0x0,
+0xc8,0x0,0xc4,0x0,0xc4,0x0,0x43,0x80,0x63,0x80,0x1f,0x0,0x1,0x0,0x1,0x0,
+};
+
+static const BitmapCharRec ch162 = {9,16,-1,2,12,ch162data};
+
+/* char: 0xa1 */
+
+static const GLubyte ch161data[] = {
+0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x0,0x0,0x0,0xc0,
+0xc0,
+};
+
+static const BitmapCharRec ch161 = {2,17,-4,5,8,ch161data};
+
+/* char: 0xa0 */
+
+#ifdef _WIN32
+/* XXX Work around Microsoft OpenGL 1.1 bug where glBitmap with
+ a height or width of zero does not advance the raster position
+ as specified by OpenGL. (Cosmo OpenGL does not have this bug.) */
+static const GLubyte ch160data[] = { 0x0 };
+static const BitmapCharRec ch160 = {1,1,0,0,6,ch160data};
+#else
+static const BitmapCharRec ch160 = {0,0,0,0,6,0};
+#endif
+
+/* char: 0x7e '~' */
+
+static const GLubyte ch126data[] = {
+0x83,0x80,0xc7,0xc0,0x7c,0x60,0x38,0x20,
+};
+
+static const BitmapCharRec ch126 = {11,4,-1,-5,13,ch126data};
+
+/* char: 0x7d '}' */
+
+static const GLubyte ch125data[] = {
+0xe0,0x30,0x18,0x18,0x18,0x18,0x18,0x18,0x8,0xc,0x4,0x3,0x4,0xc,0x8,0x18,
+0x18,0x18,0x18,0x18,0x30,0xe0,
+};
+
+static const BitmapCharRec ch125 = {8,22,-1,5,10,ch125data};
+
+/* char: 0x7c '|' */
+
+static const GLubyte ch124data[] = {
+0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+0xc0,
+};
+
+static const BitmapCharRec ch124 = {2,17,-2,0,6,ch124data};
+
+/* char: 0x7b '{' */
+
+static const GLubyte ch123data[] = {
+0x7,0xc,0x18,0x18,0x18,0x18,0x18,0x18,0x10,0x30,0x20,0xc0,0x20,0x30,0x10,0x18,
+0x18,0x18,0x18,0x18,0xc,0x7,
+};
+
+static const BitmapCharRec ch123 = {8,22,-1,5,10,ch123data};
+
+/* char: 0x7a 'z' */
+
+static const GLubyte ch122data[] = {
+0xff,0xc3,0x61,0x70,0x30,0x38,0x18,0x1c,0xe,0x86,0xc3,0xff,
+};
+
+static const BitmapCharRec ch122 = {8,12,-1,0,10,ch122data};
+
+/* char: 0x79 'y' */
+
+static const GLubyte ch121data[] = {
+0xe0,0x0,0xf0,0x0,0x18,0x0,0x8,0x0,0xc,0x0,0x4,0x0,0xe,0x0,0xe,0x0,
+0x1a,0x0,0x19,0x0,0x19,0x0,0x31,0x0,0x30,0x80,0x30,0x80,0x60,0x80,0x60,0xc0,
+0xf1,0xe0,
+};
+
+static const BitmapCharRec ch121 = {11,17,0,5,11,ch121data};
+
+/* char: 0x78 'x' */
+
+static const GLubyte ch120data[] = {
+0xf1,0xe0,0x60,0xc0,0x21,0x80,0x33,0x80,0x1b,0x0,0xe,0x0,0xc,0x0,0x1a,0x0,
+0x39,0x0,0x31,0x80,0x60,0xc0,0xf1,0xe0,
+};
+
+static const BitmapCharRec ch120 = {11,12,-1,0,13,ch120data};
+
+/* char: 0x77 'w' */
+
+static const GLubyte ch119data[] = {
+0x4,0x10,0x0,0xe,0x38,0x0,0xe,0x38,0x0,0x1a,0x28,0x0,0x1a,0x64,0x0,0x19,
+0x64,0x0,0x31,0x64,0x0,0x30,0xc2,0x0,0x30,0xc2,0x0,0x60,0xc2,0x0,0x60,0xc3,
+0x0,0xf1,0xe7,0x80,
+};
+
+static const BitmapCharRec ch119 = {17,12,0,0,17,ch119data};
+
+/* char: 0x76 'v' */
+
+static const GLubyte ch118data[] = {
+0x4,0x0,0xe,0x0,0xe,0x0,0x1a,0x0,0x19,0x0,0x19,0x0,0x31,0x0,0x30,0x80,
+0x30,0x80,0x60,0x80,0x60,0xc0,0xf1,0xe0,
+};
+
+static const BitmapCharRec ch118 = {11,12,0,0,11,ch118data};
+
+/* char: 0x75 'u' */
+
+static const GLubyte ch117data[] = {
+0x1c,0xe0,0x3e,0xc0,0x71,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,
+0x60,0xc0,0x60,0xc0,0x60,0xc0,0xe1,0xc0,
+};
+
+static const BitmapCharRec ch117 = {11,12,-1,0,13,ch117data};
+
+/* char: 0x74 't' */
+
+static const GLubyte ch116data[] = {
+0x1c,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0xfe,0x70,0x30,0x10,
+};
+
+static const BitmapCharRec ch116 = {7,15,0,0,7,ch116data};
+
+/* char: 0x73 's' */
+
+static const GLubyte ch115data[] = {
+0xf8,0xc6,0x83,0x3,0x7,0x1e,0x7c,0x70,0xe0,0xc2,0x66,0x3e,
+};
+
+static const BitmapCharRec ch115 = {8,12,-1,0,10,ch115data};
+
+/* char: 0x72 'r' */
+
+static const GLubyte ch114data[] = {
+0xf0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x76,0x6e,0xe6,
+};
+
+static const BitmapCharRec ch114 = {7,12,-1,0,8,ch114data};
+
+/* char: 0x71 'q' */
+
+static const GLubyte ch113data[] = {
+0x3,0xc0,0x1,0x80,0x1,0x80,0x1,0x80,0x1,0x80,0x1d,0x80,0x73,0x80,0x61,0x80,
+0xc1,0x80,0xc1,0x80,0xc1,0x80,0xc1,0x80,0xc1,0x80,0xc1,0x80,0x61,0x80,0x73,0x80,
+0x1d,0x80,
+};
+
+static const BitmapCharRec ch113 = {10,17,-1,5,12,ch113data};
+
+/* char: 0x70 'p' */
+
+static const GLubyte ch112data[] = {
+0xf0,0x0,0x60,0x0,0x60,0x0,0x60,0x0,0x60,0x0,0x6e,0x0,0x73,0x80,0x61,0x80,
+0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x61,0x80,0x73,0x80,
+0xee,0x0,
+};
+
+static const BitmapCharRec ch112 = {10,17,-1,5,12,ch112data};
+
+/* char: 0x6f 'o' */
+
+static const GLubyte ch111data[] = {
+0x1e,0x0,0x73,0x80,0x61,0x80,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+0xc0,0xc0,0x61,0x80,0x73,0x80,0x1e,0x0,
+};
+
+static const BitmapCharRec ch111 = {10,12,-1,0,12,ch111data};
+
+/* char: 0x6e 'n' */
+
+static const GLubyte ch110data[] = {
+0xf1,0xe0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,
+0x60,0xc0,0x71,0xc0,0x6f,0x80,0xe7,0x0,
+};
+
+static const BitmapCharRec ch110 = {11,12,-1,0,13,ch110data};
+
+/* char: 0x6d 'm' */
+
+static const GLubyte ch109data[] = {
+0xf1,0xe3,0xc0,0x60,0xc1,0x80,0x60,0xc1,0x80,0x60,0xc1,0x80,0x60,0xc1,0x80,0x60,
+0xc1,0x80,0x60,0xc1,0x80,0x60,0xc1,0x80,0x60,0xc1,0x80,0x71,0xe3,0x80,0x6f,0x9f,
+0x0,0xe7,0xe,0x0,
+};
+
+static const BitmapCharRec ch109 = {18,12,-1,0,20,ch109data};
+
+/* char: 0x6c 'l' */
+
+static const GLubyte ch108data[] = {
+0xf0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,
+0xe0,
+};
+
+static const BitmapCharRec ch108 = {4,17,-1,0,6,ch108data};
+
+/* char: 0x6b 'k' */
+
+static const GLubyte ch107data[] = {
+0xf3,0xe0,0x61,0xc0,0x63,0x80,0x67,0x0,0x6e,0x0,0x6c,0x0,0x78,0x0,0x68,0x0,
+0x64,0x0,0x66,0x0,0x63,0x0,0x67,0xc0,0x60,0x0,0x60,0x0,0x60,0x0,0x60,0x0,
+0xe0,0x0,
+};
+
+static const BitmapCharRec ch107 = {11,17,-1,0,12,ch107data};
+
+/* char: 0x6a 'j' */
+
+static const GLubyte ch106data[] = {
+0xc0,0xe0,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
+0x70,0x0,0x0,0x0,0x30,0x30,
+};
+
+static const BitmapCharRec ch106 = {4,22,0,5,6,ch106data};
+
+/* char: 0x69 'i' */
+
+static const GLubyte ch105data[] = {
+0xf0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xe0,0x0,0x0,0x0,0x60,
+0x60,
+};
+
+static const BitmapCharRec ch105 = {4,17,-1,0,6,ch105data};
+
+/* char: 0x68 'h' */
+
+static const GLubyte ch104data[] = {
+0xf1,0xe0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,
+0x60,0xc0,0x71,0xc0,0x6f,0x80,0x67,0x0,0x60,0x0,0x60,0x0,0x60,0x0,0x60,0x0,
+0xe0,0x0,
+};
+
+static const BitmapCharRec ch104 = {11,17,-1,0,13,ch104data};
+
+/* char: 0x67 'g' */
+
+static const GLubyte ch103data[] = {
+0x3f,0x0,0xf1,0xc0,0xc0,0x60,0xc0,0x20,0x60,0x60,0x3f,0xc0,0x7f,0x0,0x60,0x0,
+0x30,0x0,0x3e,0x0,0x33,0x0,0x61,0x80,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x0,
+0x1f,0xc0,
+};
+
+static const BitmapCharRec ch103 = {11,17,-1,5,12,ch103data};
+
+/* char: 0x66 'f' */
+
+static const GLubyte ch102data[] = {
+0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0xfe,0x30,0x30,0x30,0x16,
+0xe,
+};
+
+static const BitmapCharRec ch102 = {7,17,0,0,7,ch102data};
+
+/* char: 0x65 'e' */
+
+static const GLubyte ch101data[] = {
+0x1e,0x0,0x7f,0x0,0x70,0x80,0xe0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xff,0x80,
+0xc1,0x80,0x41,0x80,0x63,0x0,0x1e,0x0,
+};
+
+static const BitmapCharRec ch101 = {9,12,-1,0,11,ch101data};
+
+/* char: 0x64 'd' */
+
+static const GLubyte ch100data[] = {
+0x1e,0xc0,0x73,0x80,0x61,0x80,0xc1,0x80,0xc1,0x80,0xc1,0x80,0xc1,0x80,0xc1,0x80,
+0xc1,0x80,0x61,0x80,0x73,0x80,0x1d,0x80,0x1,0x80,0x1,0x80,0x1,0x80,0x1,0x80,
+0x3,0x80,
+};
+
+static const BitmapCharRec ch100 = {10,17,-1,0,12,ch100data};
+
+/* char: 0x63 'c' */
+
+static const GLubyte ch99data[] = {
+0x1e,0x0,0x7f,0x0,0x70,0x80,0xe0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,
+0xc0,0x0,0x41,0x80,0x63,0x80,0x1f,0x0,
+};
+
+static const BitmapCharRec ch99 = {9,12,-1,0,11,ch99data};
+
+/* char: 0x62 'b' */
+
+static const GLubyte ch98data[] = {
+0x5e,0x0,0x73,0x80,0x61,0x80,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,0x60,0xc0,
+0x60,0xc0,0x61,0x80,0x73,0x80,0x6e,0x0,0x60,0x0,0x60,0x0,0x60,0x0,0x60,0x0,
+0xe0,0x0,
+};
+
+static const BitmapCharRec ch98 = {10,17,-1,0,12,ch98data};
+
+/* char: 0x61 'a' */
+
+static const GLubyte ch97data[] = {
+0x71,0x80,0xfb,0x0,0xc7,0x0,0xc3,0x0,0xc3,0x0,0x63,0x0,0x3b,0x0,0xf,0x0,
+0x3,0x0,0x63,0x0,0x67,0x0,0x3e,0x0,
+};
+
+static const BitmapCharRec ch97 = {9,12,-1,0,11,ch97data};
+
+/* char: 0x60 '`' */
+
+static const GLubyte ch96data[] = {
+0x60,0xe0,0x80,0xc0,0x60,
+};
+
+static const BitmapCharRec ch96 = {3,5,-2,-12,7,ch96data};
+
+/* char: 0x5f '_' */
+
+static const GLubyte ch95data[] = {
+0xff,0xf8,0xff,0xf8,
+};
+
+static const BitmapCharRec ch95 = {13,2,0,5,13,ch95data};
+
+/* char: 0x5e '^' */
+
+static const GLubyte ch94data[] = {
+0x80,0x80,0xc1,0x80,0x41,0x0,0x63,0x0,0x22,0x0,0x36,0x0,0x14,0x0,0x1c,0x0,
+0x8,0x0,
+};
+
+static const BitmapCharRec ch94 = {9,9,-1,-8,11,ch94data};
+
+/* char: 0x5d ']' */
+
+static const GLubyte ch93data[] = {
+0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
+0x18,0x18,0x18,0x18,0xf8,
+};
+
+static const BitmapCharRec ch93 = {5,21,-1,4,8,ch93data};
+
+/* char: 0x5c '\' */
+
+static const GLubyte ch92data[] = {
+0x6,0x6,0x4,0xc,0xc,0x8,0x18,0x18,0x10,0x30,0x30,0x20,0x60,0x60,0x40,0xc0,
+0xc0,
+};
+
+static const BitmapCharRec ch92 = {7,17,0,0,7,ch92data};
+
+/* char: 0x5b '[' */
+
+static const GLubyte ch91data[] = {
+0xf8,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+0xc0,0xc0,0xc0,0xc0,0xf8,
+};
+
+static const BitmapCharRec ch91 = {5,21,-2,4,8,ch91data};
+
+/* char: 0x5a 'Z' */
+
+static const GLubyte ch90data[] = {
+0xff,0xf8,0xe0,0x18,0x70,0x8,0x30,0x8,0x38,0x0,0x18,0x0,0x1c,0x0,0xe,0x0,
+0x6,0x0,0x7,0x0,0x3,0x0,0x3,0x80,0x1,0xc0,0x80,0xc0,0x80,0xe0,0xc0,0x70,
+0xff,0xf0,
+};
+
+static const BitmapCharRec ch90 = {13,17,-1,0,15,ch90data};
+
+/* char: 0x59 'Y' */
+
+static const GLubyte ch89data[] = {
+0x7,0xe0,0x1,0x80,0x1,0x80,0x1,0x80,0x1,0x80,0x1,0x80,0x1,0x80,0x3,0xc0,
+0x3,0x40,0x6,0x60,0x6,0x20,0xc,0x30,0x1c,0x10,0x18,0x18,0x38,0x8,0x30,0xc,
+0xfc,0x3f,
+};
+
+static const BitmapCharRec ch89 = {16,17,0,0,16,ch89data};
+
+/* char: 0x58 'X' */
+
+static const GLubyte ch88data[] = {
+0xfc,0xf,0xc0,0x30,0x3,0x80,0x18,0x7,0x0,0x8,0xe,0x0,0x4,0xc,0x0,0x6,
+0x18,0x0,0x2,0x38,0x0,0x1,0x70,0x0,0x0,0xe0,0x0,0x0,0xc0,0x0,0x1,0xc0,
+0x0,0x3,0xa0,0x0,0x3,0x10,0x0,0x6,0x8,0x0,0xe,0xc,0x0,0x1c,0x6,0x0,
+0x7e,0xf,0x80,
+};
+
+static const BitmapCharRec ch88 = {18,17,0,0,18,ch88data};
+
+/* char: 0x57 'W' */
+
+static const GLubyte ch87data[] = {
+0x1,0x83,0x0,0x1,0x83,0x0,0x1,0x83,0x80,0x3,0x87,0x80,0x3,0x46,0x80,0x3,
+0x46,0xc0,0x6,0x46,0x40,0x6,0x4c,0x40,0x6,0x4c,0x60,0xc,0x2c,0x60,0xc,0x2c,
+0x20,0x18,0x2c,0x20,0x18,0x18,0x30,0x18,0x18,0x10,0x30,0x18,0x10,0x30,0x18,0x18,
+0xfc,0x7e,0x7e,
+};
+
+static const BitmapCharRec ch87 = {23,17,0,0,23,ch87data};
+
+/* char: 0x56 'V' */
+
+static const GLubyte ch86data[] = {
+0x1,0x80,0x0,0x1,0x80,0x0,0x1,0x80,0x0,0x3,0xc0,0x0,0x3,0x40,0x0,0x3,
+0x60,0x0,0x6,0x20,0x0,0x6,0x20,0x0,0x6,0x30,0x0,0xc,0x10,0x0,0xc,0x18,
+0x0,0x18,0x8,0x0,0x18,0x8,0x0,0x18,0xc,0x0,0x30,0x4,0x0,0x30,0x6,0x0,
+0xfc,0x1f,0x80,
+};
+
+static const BitmapCharRec ch86 = {17,17,0,0,17,ch86data};
+
+/* char: 0x55 'U' */
+
+static const GLubyte ch85data[] = {
+0x7,0xe0,0x1c,0x30,0x18,0x8,0x30,0x8,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,
+0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,0x30,0x4,
+0xfc,0x1f,
+};
+
+static const BitmapCharRec ch85 = {16,17,-1,0,18,ch85data};
+
+/* char: 0x54 'T' */
+
+static const GLubyte ch84data[] = {
+0xf,0xc0,0x3,0x0,0x3,0x0,0x3,0x0,0x3,0x0,0x3,0x0,0x3,0x0,0x3,0x0,
+0x3,0x0,0x3,0x0,0x3,0x0,0x3,0x0,0x3,0x0,0x83,0x4,0x83,0x4,0xc3,0xc,
+0xff,0xfc,
+};
+
+static const BitmapCharRec ch84 = {14,17,-1,0,16,ch84data};
+
+/* char: 0x53 'S' */
+
+static const GLubyte ch83data[] = {
+0x9e,0x0,0xf1,0x80,0xc0,0xc0,0x80,0x60,0x80,0x60,0x0,0x60,0x0,0xe0,0x3,0xc0,
+0xf,0x80,0x1e,0x0,0x78,0x0,0xe0,0x0,0xc0,0x40,0xc0,0x40,0xc0,0xc0,0x63,0xc0,
+0x1e,0x40,
+};
+
+static const BitmapCharRec ch83 = {11,17,-1,0,13,ch83data};
+
+/* char: 0x52 'R' */
+
+static const GLubyte ch82data[] = {
+0xfc,0x1e,0x30,0x1c,0x30,0x38,0x30,0x70,0x30,0x60,0x30,0xc0,0x31,0xc0,0x33,0x80,
+0x3f,0xc0,0x30,0x70,0x30,0x30,0x30,0x38,0x30,0x18,0x30,0x38,0x30,0x30,0x30,0x70,
+0xff,0xc0,
+};
+
+static const BitmapCharRec ch82 = {15,17,-1,0,16,ch82data};
+
+/* char: 0x51 'Q' */
+
+static const GLubyte ch81data[] = {
+0x0,0xf,0x0,0x38,0x0,0x70,0x0,0xe0,0x1,0xc0,0x7,0xe0,0x1c,0x38,0x38,0x1c,
+0x60,0x6,0x60,0x6,0xc0,0x3,0xc0,0x3,0xc0,0x3,0xc0,0x3,0xc0,0x3,0xc0,0x3,
+0xc0,0x3,0x60,0x6,0x60,0x6,0x38,0x1c,0x1c,0x38,0x7,0xe0,
+};
+
+static const BitmapCharRec ch81 = {16,22,-1,5,18,ch81data};
+
+/* char: 0x50 'P' */
+
+static const GLubyte ch80data[] = {
+0xfc,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,
+0x3f,0xc0,0x30,0x70,0x30,0x30,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x30,0x30,0x70,
+0xff,0xc0,
+};
+
+static const BitmapCharRec ch80 = {13,17,-1,0,15,ch80data};
+
+/* char: 0x4f 'O' */
+
+static const GLubyte ch79data[] = {
+0x7,0xe0,0x1c,0x38,0x38,0x1c,0x60,0x6,0x60,0x6,0xc0,0x3,0xc0,0x3,0xc0,0x3,
+0xc0,0x3,0xc0,0x3,0xc0,0x3,0xc0,0x3,0x60,0x6,0x60,0x6,0x38,0x1c,0x1c,0x38,
+0x7,0xe0,
+};
+
+static const BitmapCharRec ch79 = {16,17,-1,0,18,ch79data};
+
+/* char: 0x4e 'N' */
+
+static const GLubyte ch78data[] = {
+0xf8,0xc,0x20,0x1c,0x20,0x1c,0x20,0x34,0x20,0x64,0x20,0x64,0x20,0xc4,0x21,0x84,
+0x21,0x84,0x23,0x4,0x26,0x4,0x26,0x4,0x2c,0x4,0x38,0x4,0x38,0x4,0x30,0x4,
+0xf0,0x1f,
+};
+
+static const BitmapCharRec ch78 = {16,17,-1,0,18,ch78data};
+
+/* char: 0x4d 'M' */
+
+static const GLubyte ch77data[] = {
+0xf8,0x21,0xf8,0x20,0x60,0x60,0x20,0x60,0x60,0x20,0xd0,0x60,0x20,0xd0,0x60,0x21,
+0x88,0x60,0x21,0x88,0x60,0x23,0x8,0x60,0x23,0x4,0x60,0x26,0x4,0x60,0x26,0x2,
+0x60,0x2c,0x2,0x60,0x2c,0x2,0x60,0x38,0x1,0x60,0x38,0x1,0x60,0x30,0x0,0xe0,
+0xf0,0x0,0xf8,
+};
+
+static const BitmapCharRec ch77 = {21,17,-1,0,22,ch77data};
+
+/* char: 0x4c 'L' */
+
+static const GLubyte ch76data[] = {
+0xff,0xf8,0x30,0x18,0x30,0x8,0x30,0x8,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,
+0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,
+0xfc,0x0,
+};
+
+static const BitmapCharRec ch76 = {13,17,-1,0,14,ch76data};
+
+/* char: 0x4b 'K' */
+
+static const GLubyte ch75data[] = {
+0xfc,0x1f,0x30,0xe,0x30,0x1c,0x30,0x38,0x30,0x70,0x30,0xe0,0x31,0xc0,0x33,0x80,
+0x3f,0x0,0x3e,0x0,0x33,0x0,0x31,0x80,0x30,0xc0,0x30,0x60,0x30,0x30,0x30,0x18,
+0xfc,0x7e,
+};
+
+static const BitmapCharRec ch75 = {16,17,-1,0,17,ch75data};
+
+/* char: 0x4a 'J' */
+
+static const GLubyte ch74data[] = {
+0x78,0x0,0xcc,0x0,0xc6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,
+0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,
+0x1f,0x80,
+};
+
+static const BitmapCharRec ch74 = {9,17,-1,0,11,ch74data};
+
+/* char: 0x49 'I' */
+
+static const GLubyte ch73data[] = {
+0xfc,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
+0xfc,
+};
+
+static const BitmapCharRec ch73 = {6,17,-1,0,8,ch73data};
+
+/* char: 0x48 'H' */
+
+static const GLubyte ch72data[] = {
+0xfc,0x1f,0x80,0x30,0x6,0x0,0x30,0x6,0x0,0x30,0x6,0x0,0x30,0x6,0x0,0x30,
+0x6,0x0,0x30,0x6,0x0,0x30,0x6,0x0,0x3f,0xfe,0x0,0x30,0x6,0x0,0x30,0x6,
+0x0,0x30,0x6,0x0,0x30,0x6,0x0,0x30,0x6,0x0,0x30,0x6,0x0,0x30,0x6,0x0,
+0xfc,0x1f,0x80,
+};
+
+static const BitmapCharRec ch72 = {17,17,-1,0,19,ch72data};
+
+/* char: 0x47 'G' */
+
+static const GLubyte ch71data[] = {
+0x7,0xe0,0x1e,0x38,0x38,0x1c,0x60,0xc,0x60,0xc,0xc0,0xc,0xc0,0xc,0xc0,0x3f,
+0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0x60,0x4,0x60,0x4,0x38,0xc,0x1c,0x3c,
+0x7,0xe4,
+};
+
+static const BitmapCharRec ch71 = {16,17,-1,0,18,ch71data};
+
+/* char: 0x46 'F' */
+
+static const GLubyte ch70data[] = {
+0xfc,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x0,0x30,0x20,0x30,0x20,
+0x3f,0xe0,0x30,0x20,0x30,0x20,0x30,0x0,0x30,0x0,0x30,0x10,0x30,0x10,0x30,0x30,
+0xff,0xf0,
+};
+
+static const BitmapCharRec ch70 = {12,17,-1,0,14,ch70data};
+
+/* char: 0x45 'E' */
+
+static const GLubyte ch69data[] = {
+0xff,0xf8,0x30,0x18,0x30,0x8,0x30,0x8,0x30,0x0,0x30,0x0,0x30,0x40,0x30,0x40,
+0x3f,0xc0,0x30,0x40,0x30,0x40,0x30,0x0,0x30,0x0,0x30,0x10,0x30,0x10,0x30,0x30,
+0xff,0xf0,
+};
+
+static const BitmapCharRec ch69 = {13,17,-1,0,15,ch69data};
+
+/* char: 0x44 'D' */
+
+static const GLubyte ch68data[] = {
+0xff,0xc0,0x30,0x70,0x30,0x38,0x30,0xc,0x30,0xc,0x30,0x6,0x30,0x6,0x30,0x6,
+0x30,0x6,0x30,0x6,0x30,0x6,0x30,0x6,0x30,0xc,0x30,0xc,0x30,0x38,0x30,0x70,
+0xff,0xc0,
+};
+
+static const BitmapCharRec ch68 = {15,17,-1,0,17,ch68data};
+
+/* char: 0x43 'C' */
+
+static const GLubyte ch67data[] = {
+0x7,0xe0,0x1e,0x38,0x38,0x8,0x60,0x4,0x60,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,
+0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0x60,0x4,0x60,0x4,0x38,0xc,0x1c,0x3c,
+0x7,0xe4,
+};
+
+static const BitmapCharRec ch67 = {14,17,-1,0,16,ch67data};
+
+/* char: 0x42 'B' */
+
+static const GLubyte ch66data[] = {
+0xff,0xe0,0x30,0x78,0x30,0x18,0x30,0xc,0x30,0xc,0x30,0xc,0x30,0x18,0x30,0x38,
+0x3f,0xe0,0x30,0x40,0x30,0x30,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x30,0x30,0x70,
+0xff,0xc0,
+};
+
+static const BitmapCharRec ch66 = {14,17,-1,0,16,ch66data};
+
+/* char: 0x41 'A' */
+
+static const GLubyte ch65data[] = {
+0xfc,0x1f,0x80,0x30,0x6,0x0,0x10,0x6,0x0,0x10,0xc,0x0,0x18,0xc,0x0,0x8,
+0xc,0x0,0xf,0xf8,0x0,0xc,0x18,0x0,0x4,0x18,0x0,0x4,0x30,0x0,0x6,0x30,
+0x0,0x2,0x30,0x0,0x2,0x60,0x0,0x1,0x60,0x0,0x1,0xc0,0x0,0x1,0xc0,0x0,
+0x0,0x80,0x0,
+};
+
+static const BitmapCharRec ch65 = {17,17,0,0,17,ch65data};
+
+/* char: 0x40 '@' */
+
+static const GLubyte ch64data[] = {
+0x3,0xf0,0x0,0xe,0xc,0x0,0x18,0x0,0x0,0x30,0x0,0x0,0x61,0xde,0x0,0x63,
+0x7b,0x0,0xc6,0x39,0x80,0xc6,0x18,0x80,0xc6,0x18,0xc0,0xc6,0x18,0x40,0xc6,0xc,
+0x40,0xc3,0xc,0x40,0xc3,0x8c,0x40,0xe1,0xfc,0x40,0x60,0xec,0xc0,0x70,0x0,0x80,
+0x38,0x1,0x80,0x1c,0x3,0x0,0xf,0xe,0x0,0x3,0xf8,0x0,
+};
+
+static const BitmapCharRec ch64 = {18,20,-2,3,22,ch64data};
+
+/* char: 0x3f '?' */
+
+static const GLubyte ch63data[] = {
+0x30,0x30,0x0,0x0,0x10,0x10,0x10,0x18,0x18,0xc,0xe,0x7,0xc3,0xc3,0x83,0xc6,
+0x7c,
+};
+
+static const BitmapCharRec ch63 = {8,17,-2,0,11,ch63data};
+
+/* char: 0x3e '>' */
+
+static const GLubyte ch62data[] = {
+0xc0,0x0,0x70,0x0,0x1c,0x0,0x7,0x0,0x1,0xc0,0x0,0x60,0x1,0xc0,0x7,0x0,
+0x1c,0x0,0x70,0x0,0xc0,0x0,
+};
+
+static const BitmapCharRec ch62 = {11,11,-1,-1,13,ch62data};
+
+/* char: 0x3d '=' */
+
+static const GLubyte ch61data[] = {
+0xff,0xf0,0xff,0xf0,0x0,0x0,0x0,0x0,0xff,0xf0,0xff,0xf0,
+};
+
+static const BitmapCharRec ch61 = {12,6,-1,-4,14,ch61data};
+
+/* char: 0x3c '<' */
+
+static const GLubyte ch60data[] = {
+0x0,0x60,0x1,0xc0,0x7,0x0,0x1c,0x0,0x70,0x0,0xc0,0x0,0x70,0x0,0x1c,0x0,
+0x7,0x0,0x1,0xc0,0x0,0x60,
+};
+
+static const BitmapCharRec ch60 = {11,11,-1,-1,13,ch60data};
+
+/* char: 0x3b ';' */
+
+static const GLubyte ch59data[] = {
+0xc0,0x60,0x20,0xe0,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch59 = {3,14,-2,3,7,ch59data};
+
+/* char: 0x3a ':' */
+
+static const GLubyte ch58data[] = {
+0xc0,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc0,0xc0,
+};
+
+static const BitmapCharRec ch58 = {2,11,-2,0,6,ch58data};
+
+/* char: 0x39 '9' */
+
+static const GLubyte ch57data[] = {
+0xf0,0x0,0x1c,0x0,0x6,0x0,0x3,0x0,0x3,0x80,0x1,0x80,0x1d,0x80,0x73,0xc0,
+0x61,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc1,0xc0,0x61,0x80,0x77,0x80,
+0x1e,0x0,
+};
+
+static const BitmapCharRec ch57 = {10,17,-1,0,12,ch57data};
+
+/* char: 0x38 '8' */
+
+static const GLubyte ch56data[] = {
+0x1e,0x0,0x73,0x80,0xe1,0x80,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x41,0xc0,0x61,0x80,
+0x37,0x0,0x1e,0x0,0x1e,0x0,0x33,0x0,0x61,0x80,0x61,0x80,0x61,0x80,0x33,0x0,
+0x1e,0x0,
+};
+
+static const BitmapCharRec ch56 = {10,17,-1,0,12,ch56data};
+
+/* char: 0x37 '7' */
+
+static const GLubyte ch55data[] = {
+0x18,0x0,0x18,0x0,0xc,0x0,0xc,0x0,0xc,0x0,0x4,0x0,0x6,0x0,0x6,0x0,
+0x2,0x0,0x3,0x0,0x3,0x0,0x1,0x0,0x1,0x80,0x81,0x80,0xc0,0xc0,0xff,0xc0,
+0x7f,0xc0,
+};
+
+static const BitmapCharRec ch55 = {10,17,-1,0,12,ch55data};
+
+/* char: 0x36 '6' */
+
+static const GLubyte ch54data[] = {
+0x1e,0x0,0x7b,0x80,0x61,0x80,0xe0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+0xc1,0x80,0xf3,0x80,0xee,0x0,0x60,0x0,0x70,0x0,0x30,0x0,0x18,0x0,0xe,0x0,
+0x3,0xc0,
+};
+
+static const BitmapCharRec ch54 = {10,17,-1,0,12,ch54data};
+
+/* char: 0x35 '5' */
+
+static const GLubyte ch53data[] = {
+0x7e,0x0,0xe3,0x80,0xc1,0x80,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x0,0xc0,0x1,0xc0,
+0x3,0x80,0xf,0x80,0x7e,0x0,0x78,0x0,0x60,0x0,0x20,0x0,0x20,0x0,0x1f,0x80,
+0x1f,0xc0,
+};
+
+static const BitmapCharRec ch53 = {10,17,-1,0,12,ch53data};
+
+/* char: 0x34 '4' */
+
+static const GLubyte ch52data[] = {
+0x3,0x0,0x3,0x0,0x3,0x0,0x3,0x0,0xff,0xc0,0xff,0xc0,0xc3,0x0,0x43,0x0,
+0x63,0x0,0x23,0x0,0x33,0x0,0x13,0x0,0x1b,0x0,0xb,0x0,0x7,0x0,0x7,0x0,
+0x3,0x0,
+};
+
+static const BitmapCharRec ch52 = {10,17,-1,0,12,ch52data};
+
+/* char: 0x33 '3' */
+
+static const GLubyte ch51data[] = {
+0x78,0x0,0xe6,0x0,0xc3,0x0,0x1,0x0,0x1,0x80,0x1,0x80,0x1,0x80,0x3,0x80,
+0x7,0x0,0x1e,0x0,0xc,0x0,0x6,0x0,0x83,0x0,0x83,0x0,0x47,0x0,0x7e,0x0,
+0x1c,0x0,
+};
+
+static const BitmapCharRec ch51 = {9,17,-1,0,12,ch51data};
+
+/* char: 0x32 '2' */
+
+static const GLubyte ch50data[] = {
+0xff,0x80,0xff,0xc0,0x60,0x40,0x30,0x0,0x18,0x0,0xc,0x0,0x4,0x0,0x6,0x0,
+0x3,0x0,0x3,0x0,0x1,0x80,0x1,0x80,0x81,0x80,0x81,0x80,0x43,0x80,0x7f,0x0,
+0x1c,0x0,
+};
+
+static const BitmapCharRec ch50 = {10,17,-1,0,12,ch50data};
+
+/* char: 0x31 '1' */
+
+static const GLubyte ch49data[] = {
+0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x78,0x18,
+0x8,
+};
+
+static const BitmapCharRec ch49 = {8,17,-2,0,12,ch49data};
+
+/* char: 0x30 '0' */
+
+static const GLubyte ch48data[] = {
+0x1e,0x0,0x33,0x0,0x61,0x80,0x61,0x80,0xe1,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x61,0x80,0x61,0x80,0x33,0x0,
+0x1e,0x0,
+};
+
+static const BitmapCharRec ch48 = {10,17,-1,0,12,ch48data};
+
+/* char: 0x2f '/' */
+
+static const GLubyte ch47data[] = {
+0xc0,0xc0,0xc0,0x60,0x60,0x20,0x30,0x30,0x10,0x18,0x18,0x8,0xc,0xc,0x4,0x6,
+0x6,0x3,0x3,0x3,
+};
+
+static const BitmapCharRec ch47 = {8,20,1,3,7,ch47data};
+
+/* char: 0x2e '.' */
+
+static const GLubyte ch46data[] = {
+0xc0,0xc0,
+};
+
+static const BitmapCharRec ch46 = {2,2,-2,0,6,ch46data};
+
+/* char: 0x2d '-' */
+
+static const GLubyte ch45data[] = {
+0xff,0xf0,0xff,0xf0,
+};
+
+static const BitmapCharRec ch45 = {12,2,-1,-6,14,ch45data};
+
+/* char: 0x2c ',' */
+
+static const GLubyte ch44data[] = {
+0xc0,0x60,0x20,0xe0,0xc0,
+};
+
+static const BitmapCharRec ch44 = {3,5,-2,3,7,ch44data};
+
+/* char: 0x2b '+' */
+
+static const GLubyte ch43data[] = {
+0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,0xff,0xf0,0xff,0xf0,0x6,0x0,
+0x6,0x0,0x6,0x0,0x6,0x0,0x6,0x0,
+};
+
+static const BitmapCharRec ch43 = {12,12,-1,-1,14,ch43data};
+
+/* char: 0x2a '*' */
+
+static const GLubyte ch42data[] = {
+0x8,0x0,0x1c,0x0,0xc9,0x80,0xeb,0x80,0x1c,0x0,0xeb,0x80,0xc9,0x80,0x1c,0x0,
+0x8,0x0,
+};
+
+static const BitmapCharRec ch42 = {9,9,-2,-8,12,ch42data};
+
+/* char: 0x29 ')' */
+
+static const GLubyte ch41data[] = {
+0x80,0x40,0x20,0x30,0x10,0x18,0x18,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0xc,0x18,
+0x18,0x10,0x30,0x20,0x40,0x80,
+};
+
+static const BitmapCharRec ch41 = {6,22,-1,5,8,ch41data};
+
+/* char: 0x28 '(' */
+
+static const GLubyte ch40data[] = {
+0x4,0x8,0x10,0x30,0x20,0x60,0x60,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x60,
+0x60,0x20,0x30,0x10,0x8,0x4,
+};
+
+static const BitmapCharRec ch40 = {6,22,-1,5,8,ch40data};
+
+/* char: 0x27 ''' */
+
+static const GLubyte ch39data[] = {
+0xc0,0x60,0x20,0xe0,0xc0,
+};
+
+static const BitmapCharRec ch39 = {3,5,-3,-12,8,ch39data};
+
+/* char: 0x26 '&' */
+
+static const GLubyte ch38data[] = {
+0x3c,0x3c,0x7f,0x7e,0xe1,0xe1,0xc0,0xc0,0xc1,0xc0,0xc1,0xa0,0x63,0x20,0x37,0x10,
+0x1e,0x18,0xe,0x3e,0xf,0x0,0x1d,0x80,0x18,0xc0,0x18,0x40,0x18,0x40,0xc,0xc0,
+0x7,0x80,
+};
+
+static const BitmapCharRec ch38 = {16,17,-1,0,18,ch38data};
+
+/* char: 0x25 '%' */
+
+static const GLubyte ch37data[] = {
+0x30,0x3c,0x0,0x18,0x72,0x0,0xc,0x61,0x0,0x4,0x60,0x80,0x6,0x60,0x80,0x3,
+0x30,0x80,0x1,0x19,0x80,0x1,0x8f,0x0,0x78,0xc0,0x0,0xe4,0x40,0x0,0xc2,0x60,
+0x0,0xc1,0x30,0x0,0xc1,0x10,0x0,0x61,0x18,0x0,0x33,0xfc,0x0,0x1e,0xc,0x0,
+};
+
+static const BitmapCharRec ch37 = {17,16,-1,0,19,ch37data};
+
+/* char: 0x24 '$' */
+
+static const GLubyte ch36data[] = {
+0x4,0x0,0x4,0x0,0x3f,0x0,0xe5,0xc0,0xc4,0xc0,0x84,0x60,0x84,0x60,0x4,0x60,
+0x4,0xe0,0x7,0xc0,0x7,0x80,0x1e,0x0,0x3c,0x0,0x74,0x0,0x64,0x0,0x64,0x20,
+0x64,0x60,0x34,0xe0,0x1f,0x80,0x4,0x0,0x4,0x0,
+};
+
+static const BitmapCharRec ch36 = {11,21,0,2,12,ch36data};
+
+/* char: 0x23 '#' */
+
+static const GLubyte ch35data[] = {
+0x22,0x0,0x22,0x0,0x22,0x0,0x22,0x0,0x22,0x0,0xff,0xc0,0xff,0xc0,0x11,0x0,
+0x11,0x0,0x11,0x0,0x7f,0xe0,0x7f,0xe0,0x8,0x80,0x8,0x80,0x8,0x80,0x8,0x80,
+0x8,0x80,
+};
+
+static const BitmapCharRec ch35 = {11,17,-1,0,13,ch35data};
+
+/* char: 0x22 '"' */
+
+static const GLubyte ch34data[] = {
+0x88,0xcc,0xcc,0xcc,0xcc,
+};
+
+static const BitmapCharRec ch34 = {6,5,-1,-12,10,ch34data};
+
+/* char: 0x21 '!' */
+
+static const GLubyte ch33data[] = {
+0xc0,0xc0,0x0,0x0,0x0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,
+0xc0,
+};
+
+static const BitmapCharRec ch33 = {2,17,-3,0,8,ch33data};
+
+/* char: 0x20 ' ' */
+
+#ifdef _WIN32
+/* XXX Work around Microsoft OpenGL 1.1 bug where glBitmap with
+ a height or width of zero does not advance the raster position
+ as specified by OpenGL. (Cosmo OpenGL does not have this bug.) */
+static const GLubyte ch32data[] = { 0x0 };
+static const BitmapCharRec ch32 = {1,1,0,0,6,ch32data};
+#else
+static const BitmapCharRec ch32 = {0,0,0,0,6,0};
+#endif
+
+static const BitmapCharRec * const chars[] = {
+&ch32,
+&ch33,
+&ch34,
+&ch35,
+&ch36,
+&ch37,
+&ch38,
+&ch39,
+&ch40,
+&ch41,
+&ch42,
+&ch43,
+&ch44,
+&ch45,
+&ch46,
+&ch47,
+&ch48,
+&ch49,
+&ch50,
+&ch51,
+&ch52,
+&ch53,
+&ch54,
+&ch55,
+&ch56,
+&ch57,
+&ch58,
+&ch59,
+&ch60,
+&ch61,
+&ch62,
+&ch63,
+&ch64,
+&ch65,
+&ch66,
+&ch67,
+&ch68,
+&ch69,
+&ch70,
+&ch71,
+&ch72,
+&ch73,
+&ch74,
+&ch75,
+&ch76,
+&ch77,
+&ch78,
+&ch79,
+&ch80,
+&ch81,
+&ch82,
+&ch83,
+&ch84,
+&ch85,
+&ch86,
+&ch87,
+&ch88,
+&ch89,
+&ch90,
+&ch91,
+&ch92,
+&ch93,
+&ch94,
+&ch95,
+&ch96,
+&ch97,
+&ch98,
+&ch99,
+&ch100,
+&ch101,
+&ch102,
+&ch103,
+&ch104,
+&ch105,
+&ch106,
+&ch107,
+&ch108,
+&ch109,
+&ch110,
+&ch111,
+&ch112,
+&ch113,
+&ch114,
+&ch115,
+&ch116,
+&ch117,
+&ch118,
+&ch119,
+&ch120,
+&ch121,
+&ch122,
+&ch123,
+&ch124,
+&ch125,
+&ch126,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+&ch160,
+&ch161,
+&ch162,
+&ch163,
+&ch164,
+&ch165,
+&ch166,
+&ch167,
+&ch168,
+&ch169,
+&ch170,
+&ch171,
+&ch172,
+&ch173,
+&ch174,
+&ch175,
+&ch176,
+&ch177,
+&ch178,
+&ch179,
+&ch180,
+&ch181,
+&ch182,
+&ch183,
+&ch184,
+&ch185,
+&ch186,
+&ch187,
+&ch188,
+&ch189,
+&ch190,
+&ch191,
+&ch192,
+&ch193,
+&ch194,
+&ch195,
+&ch196,
+&ch197,
+&ch198,
+&ch199,
+&ch200,
+&ch201,
+&ch202,
+&ch203,
+&ch204,
+&ch205,
+&ch206,
+&ch207,
+&ch208,
+&ch209,
+&ch210,
+&ch211,
+&ch212,
+&ch213,
+&ch214,
+&ch215,
+&ch216,
+&ch217,
+&ch218,
+&ch219,
+&ch220,
+&ch221,
+&ch222,
+&ch223,
+&ch224,
+&ch225,
+&ch226,
+&ch227,
+&ch228,
+&ch229,
+&ch230,
+&ch231,
+&ch232,
+&ch233,
+&ch234,
+&ch235,
+&ch236,
+&ch237,
+&ch238,
+&ch239,
+&ch240,
+&ch241,
+&ch242,
+&ch243,
+&ch244,
+&ch245,
+&ch246,
+&ch247,
+&ch248,
+&ch249,
+&ch250,
+&ch251,
+&ch252,
+&ch253,
+&ch254,
+&ch255,
+};
+
+#if !defined(__IBMCPP__)
+const
+#endif
+BitmapFontRec glutBitmapTimesRoman24 = {
+"-adobe-times-medium-r-normal--24-240-75-75-p-124-iso8859-1",
+224,
+32,
+chars
+};
+
diff --git a/src/glut/os2/glut_util.cpp b/src/glut/os2/glut_util.cpp
new file mode 100644
index 00000000000..76f25020aff
--- /dev/null
+++ b/src/glut/os2/glut_util.cpp
@@ -0,0 +1,90 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "glutint.h"
+
+#if !defined(__OS2__)
+
+/* strdup is actually not a standard ANSI C or POSIX routine
+ so implement a private one for GLUT. OpenVMS does not have a
+ strdup; Linux's standard libc doesn't declare strdup by default
+ (unless BSD or SVID interfaces are requested). */
+char *
+__glutStrdup(const char *string)
+{
+ char *copy;
+
+ copy = (char*) malloc(strlen(string) + 1);
+ if (copy == NULL)
+ return NULL;
+ strcpy(copy, string);
+ return copy;
+}
+#endif
+
+void
+__glutWarning(char *format,...)
+{
+ va_list args;
+
+ va_start(args, format);
+ fprintf(stderr, "GLUT: Warning in %s: ",
+ __glutProgramName ? __glutProgramName : "(unamed)");
+ vfprintf(stderr, format, args);
+ va_end(args);
+ putc('\n', stderr);
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutReportErrors(void)
+{
+ GLenum error;
+
+ while ((error = glGetError()) != GL_NO_ERROR)
+ __glutWarning("GL error: %s", gluErrorString(error));
+}
+/* ENDCENTRY */
+
+void
+__glutFatalError(char *format,...)
+{
+ va_list args;
+
+ va_start(args, format);
+ fprintf(stderr, "GLUT: Fatal Error in %s: ",
+ __glutProgramName ? __glutProgramName : "(unamed)");
+ vfprintf(stderr, format, args);
+ va_end(args);
+ putc('\n', stderr);
+/* || defined(__OS2__) */
+#if defined(_WIN32)
+ if (__glutExitFunc) {
+ __glutExitFunc(1);
+ }
+#endif
+ exit(1);
+}
+
+void
+__glutFatalUsage(char *format,...)
+{
+ va_list args;
+
+ va_start(args, format);
+ fprintf(stderr, "GLUT: Fatal API Usage in %s: ",
+ __glutProgramName ? __glutProgramName : "(unamed)");
+ vfprintf(stderr, format, args);
+ va_end(args);
+ putc('\n', stderr);
+ abort();
+}
diff --git a/src/glut/os2/glut_vidresize.cpp b/src/glut/os2/glut_vidresize.cpp
new file mode 100644
index 00000000000..f9d345dcf52
--- /dev/null
+++ b/src/glut/os2/glut_vidresize.cpp
@@ -0,0 +1,232 @@
+
+/* Copyright (c) Mark J. Kilgard, 1996. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include <stdlib.h>
+
+#ifdef __sgi
+#include <dlfcn.h>
+#endif
+
+#include "glutint.h"
+
+/* Grumble. The IRIX 6.3 and early IRIX 6.4 OpenGL headers
+ support the video resize extension, but failed to define
+ GLX_SGIX_video_resize. */
+#if 0
+#ifdef GLX_SYNC_FRAME_SGIX
+#define GLX_SGIX_video_resize 1
+#endif
+#endif
+
+#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
+static int canVideoResize = -1;
+static int videoResizeChannel;
+#else
+static int canVideoResize = 0;
+#endif
+static int videoResizeInUse = 0;
+static int dx = -1, dy = -1, dw = -1, dh = -1;
+
+/* XXX Note that IRIX 6.2, 6.3, and some 6.4 versions have a
+ bug where programs seg-fault when they attempt video
+ resizing from an indirect OpenGL context (either local or
+ over a network). */
+
+#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
+
+static volatile int errorCaught;
+
+/* ARGSUSED */
+static int
+catchXSGIvcErrors(Display * dpy, XErrorEvent * event)
+{
+ errorCaught = 1;
+ return 0;
+}
+#endif
+
+/* CENTRY */
+
+int GLUTAPIENTRY
+glutVideoResizeGet(GLenum param)
+{
+#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
+ if (canVideoResize < 0) {
+ canVideoResize = __glutIsSupportedByGLX("GLX_SGIX_video_resize");
+ if (canVideoResize) {
+#if defined(__sgi) && __sgi
+ /* This is a hack because IRIX 6.2, 6.3, and some 6.4
+ versions were released with GLX_SGIX_video_resize
+ being advertised by the X server though the video
+ resize extension is not actually supported. We try to
+ determine if the libGL.so we are using actually has a
+ video resize entrypoint before we try to use the
+ feature. */
+ void (*func) (void);
+ void *glxDso = dlopen("libGL.so", RTLD_LAZY);
+
+ func = (void (*)(void)) dlsym(glxDso, "glXQueryChannelDeltasSGIX");
+ if (!func) {
+ canVideoResize = 0;
+ } else
+#endif
+ {
+ char *channelString;
+ int (*handler) (Display *, XErrorEvent *);
+
+ channelString = getenv("GLUT_VIDEO_RESIZE_CHANNEL");
+ videoResizeChannel = channelString ? atoi(channelString) : 0;
+
+ /* Work around another annoying problem with SGI's
+ GLX_SGIX_video_resize implementation. Early IRIX
+ 6.4 OpenGL's advertise the extension and have the
+ video resize API, but an XSGIvc X protocol errors
+ result trying to use the API. Set up an error
+ handler to intercept what would otherwise be a fatal
+ error. If an error was recieved, do not report that
+ video resize is possible. */
+ handler = XSetErrorHandler(catchXSGIvcErrors);
+
+ errorCaught = 0;
+
+#if defined(GLX_GLXEXT_PROTOTYPES)
+#endif
+
+ __glut_glXQueryChannelDeltasSGIX(__glutDisplay, __glutScreen,
+ videoResizeChannel, &dx, &dy, &dw, &dh);
+
+ /* glXQueryChannelDeltasSGIX is an inherent X server
+ round-trip so we know we will have gotten either the
+ correct reply or and error by this time. */
+ XSetErrorHandler(handler);
+
+ /* Still yet another work around. In IRIX 6.4 betas,
+ glXQueryChannelDeltasSGIX will return as if it
+ succeeded, but the values are filled with junk.
+ Watch to make sure the delta variables really make
+ sense. */
+ if (errorCaught ||
+ dx < 0 || dy < 0 || dw < 0 || dh < 0 ||
+ dx > 2048 || dy > 2048 || dw > 2048 || dh > 2048) {
+ canVideoResize = 0;
+ }
+ }
+ }
+ }
+#endif /* GLX_SGIX_video_resize */
+
+ switch (param) {
+ case GLUT_VIDEO_RESIZE_POSSIBLE:
+ return canVideoResize;
+ case GLUT_VIDEO_RESIZE_IN_USE:
+ return videoResizeInUse;
+ case GLUT_VIDEO_RESIZE_X_DELTA:
+ return dx;
+ case GLUT_VIDEO_RESIZE_Y_DELTA:
+ return dy;
+ case GLUT_VIDEO_RESIZE_WIDTH_DELTA:
+ return dw;
+ case GLUT_VIDEO_RESIZE_HEIGHT_DELTA:
+ return dh;
+ case GLUT_VIDEO_RESIZE_X:
+ case GLUT_VIDEO_RESIZE_Y:
+ case GLUT_VIDEO_RESIZE_WIDTH:
+ case GLUT_VIDEO_RESIZE_HEIGHT:
+#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
+ if (videoResizeInUse) {
+ int x, y, width, height;
+
+ __glut_glXQueryChannelRectSGIX(__glutDisplay, __glutScreen,
+ videoResizeChannel, &x, &y, &width, &height);
+ switch (param) {
+ case GLUT_VIDEO_RESIZE_X:
+ return x;
+ case GLUT_VIDEO_RESIZE_Y:
+ return y;
+ case GLUT_VIDEO_RESIZE_WIDTH:
+ return width;
+ case GLUT_VIDEO_RESIZE_HEIGHT:
+ return height;
+ }
+ }
+#endif
+ return -1;
+ default:
+ __glutWarning("invalid glutVideoResizeGet parameter: %d", param);
+ return -1;
+ }
+}
+
+void GLUTAPIENTRY
+glutSetupVideoResizing(void)
+{
+#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
+ if (glutVideoResizeGet(GLUT_VIDEO_RESIZE_POSSIBLE)) {
+ __glut_glXBindChannelToWindowSGIX(__glutDisplay, __glutScreen,
+ videoResizeChannel, __glutCurrentWindow->win);
+ videoResizeInUse = 1;
+ } else
+#endif
+ __glutFatalError("glutEstablishVideoResizing: video resizing not possible.\n");
+}
+
+void GLUTAPIENTRY
+glutStopVideoResizing(void)
+{
+#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
+ if (glutVideoResizeGet(GLUT_VIDEO_RESIZE_POSSIBLE)) {
+ if (videoResizeInUse) {
+ __glut_glXBindChannelToWindowSGIX(__glutDisplay, __glutScreen,
+ videoResizeChannel, None);
+ videoResizeInUse = 0;
+ }
+ }
+#endif
+}
+
+/* ARGSUSED */
+void GLUTAPIENTRY
+glutVideoResize(int x, int y, int width, int height)
+{
+#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
+ if (videoResizeInUse) {
+#ifdef GLX_SYNC_SWAP_SGIX
+ /* glXChannelRectSyncSGIX introduced in a patch to IRIX
+ 6.2; the original unpatched IRIX 6.2 behavior is always
+ GLX_SYNC_SWAP_SGIX. */
+ __glut_glXChannelRectSyncSGIX(__glutDisplay, __glutScreen,
+ videoResizeChannel, GLX_SYNC_SWAP_SGIX);
+#endif
+ __glut_glXChannelRectSGIX(__glutDisplay, __glutScreen,
+ videoResizeChannel, x, y, width, height);
+ }
+#endif
+}
+
+/* ARGSUSED */
+void GLUTAPIENTRY
+glutVideoPan(int x, int y, int width, int height)
+{
+#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
+ if (videoResizeInUse) {
+#ifdef GLX_SYNC_FRAME_SGIX
+ /* glXChannelRectSyncSGIX introduced in a patch to IRIX
+ 6.2; the original unpatched IRIX 6.2 behavior is always
+ GLX_SYNC_SWAP_SGIX. We just ignore that we cannot
+ accomplish GLX_SYNC_FRAME_SGIX on IRIX unpatched 6.2;
+ this means you'd need a glutSwapBuffers to actually
+ realize the video resize. */
+ __glut_glXChannelRectSyncSGIX(__glutDisplay, __glutScreen,
+ videoResizeChannel, GLX_SYNC_FRAME_SGIX);
+#endif
+ __glut_glXChannelRectSGIX(__glutDisplay, __glutScreen,
+ videoResizeChannel, x, y, width, height);
+ }
+#endif
+}
+
+/* ENDCENTRY */
diff --git a/src/glut/os2/glut_warp.cpp b/src/glut/os2/glut_warp.cpp
new file mode 100644
index 00000000000..885e169d3f1
--- /dev/null
+++ b/src/glut/os2/glut_warp.cpp
@@ -0,0 +1,29 @@
+
+/* Copyright (c) Mark J. Kilgard, 1996, 1997. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+
+#include "glutint.h"
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutWarpPointer(int x, int y)
+{
+// XWarpPointer(__glutDisplay, None, __glutCurrentWindow->win,
+// 0, 0, 0, 0, x, y);
+ POINTL point;
+ point.x = x;
+ point.y = y;
+ WinMapWindowPoints(__glutCurrentWindow->win,HWND_DESKTOP,&point,1);
+ WinSetPointerPos(HWND_DESKTOP, point.x, point.y);
+
+ XFlush(__glutDisplay);
+}
+
+/* ENDCENTRY */
diff --git a/src/glut/os2/glut_win.cpp b/src/glut/os2/glut_win.cpp
new file mode 100644
index 00000000000..82abba87e48
--- /dev/null
+++ b/src/glut/os2/glut_win.cpp
@@ -0,0 +1,1221 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1997. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#ifdef __VMS
+#include <GL/vms_x_fix.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#if defined(__OS2__)
+#define POKA 0
+ #include "WarpGL.h"
+ #include "glutos2.h"
+ #include "glutint.h"
+
+ #include "gl\os2mesa.h"
+
+//
+//define for resource id for main GLUT window, in samples it is defined in GL_TEST.h
+ #define ID_WINDOW 256
+
+ int evglSetPixelFormat(int iPixelFormat);
+ HPS hpsCurrent;
+
+#elif !defined(_WIN32)
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#endif
+
+#include "glutint.h"
+
+GLUTwindow *__glutCurrentWindow = NULL;
+GLUTwindow **__glutWindowList = NULL;
+int __glutWindowListSize = 0;
+#if !defined(_WIN32) && !defined(__OS2__)
+GLUTstale *__glutStaleWindowList = NULL;
+#endif
+GLUTwindow *__glutMenuWindow = NULL;
+
+void (*__glutFreeOverlayFunc) (GLUToverlay *);
+XVisualInfo *(*__glutDetermineVisualFromString) (char *string, Bool * treatAsSingle,
+ Criterion * requiredCriteria, int nRequired, int requiredMask, void** fbc) = NULL;
+
+static Criterion requiredWindowCriteria[] =
+{
+ {LEVEL, EQ, 0},
+ {TRANSPARENT, EQ, 0}
+};
+static int numRequiredWindowCriteria = sizeof(requiredWindowCriteria) / sizeof(Criterion);
+static int requiredWindowCriteriaMask = (1 << LEVEL) | (1 << TRANSPARENT);
+
+static void
+cleanWindowWorkList(GLUTwindow * window)
+{
+ GLUTwindow **pEntry = &__glutWindowWorkList;
+ GLUTwindow *entry = __glutWindowWorkList;
+
+ /* Tranverse singly-linked window work list look for the
+ window. */
+ while (entry) {
+ if (entry == window) {
+ /* Found it; delete it. */
+ *pEntry = entry->prevWorkWin;
+ return;
+ } else {
+ pEntry = &entry->prevWorkWin;
+ entry = *pEntry;
+ }
+ }
+}
+
+#if !defined(_WIN32) && !defined(__OS2PM__)
+
+static void
+cleanStaleWindowList(GLUTwindow * window)
+{
+ GLUTstale **pEntry = &__glutStaleWindowList;
+ GLUTstale *entry = __glutStaleWindowList;
+
+ /* Tranverse singly-linked stale window list look for the
+ window ID. */
+ while (entry) {
+ if (entry->window == window) {
+ /* Found it; delete it. */
+ *pEntry = entry->next;
+ free(entry);
+ return;
+ } else {
+ pEntry = &entry->next;
+ entry = *pEntry;
+ }
+ }
+}
+
+#endif
+
+static GLUTwindow *__glutWindowCache = NULL;
+
+GLUTwindow *
+__glutGetWindow(Window win)
+{
+ int i;
+
+ /* Does win belong to the last window ID looked up? */
+ if (__glutWindowCache && (win == __glutWindowCache->win ||
+ (__glutWindowCache->overlay && win ==
+ __glutWindowCache->overlay->win))) {
+ return
+ __glutWindowCache;
+ }
+ /* Otherwise scan the window list looking for the window ID. */
+ for (i = 0; i < __glutWindowListSize; i++) {
+ if (__glutWindowList[i]) {
+ if (win == __glutWindowList[i]->win) {
+ __glutWindowCache = __glutWindowList[i];
+ return __glutWindowCache;
+ }
+ if (__glutWindowList[i]->overlay) {
+ if (win == __glutWindowList[i]->overlay->win) {
+ __glutWindowCache = __glutWindowList[i];
+ return __glutWindowCache;
+ }
+ }
+ }
+ }
+#if !defined(_WIN32) && !defined(__OS2PM__)
+ {
+ GLUTstale *entry;
+
+ /* Scan through destroyed overlay window IDs for which no
+ DestroyNotify has yet been received. */
+ for (entry = __glutStaleWindowList; entry; entry = entry->next) {
+ if (entry->win == win)
+ return entry->window;
+ }
+ }
+#endif
+ return NULL;
+}
+
+/* CENTRY */
+int GLUTAPIENTRY
+glutGetWindow(void)
+{
+ if (__glutCurrentWindow) {
+ return __glutCurrentWindow->num + 1;
+ } else {
+ return 0;
+ }
+}
+/* ENDCENTRY */
+
+void
+__glutSetWindow(GLUTwindow * window)
+{
+ /* It is tempting to try to short-circuit the call to
+ glXMakeCurrent if we "know" we are going to make current
+ to a window we are already current to. In fact, this
+ assumption breaks when GLUT is expected to integrated with
+ other OpenGL windowing APIs that also make current to
+ OpenGL contexts. Since glXMakeCurrent short-circuits the
+ "already bound" case, GLUT avoids the temptation to do so
+ too. */
+ __glutCurrentWindow = window;
+
+ MAKE_CURRENT_LAYER(__glutCurrentWindow);
+
+#if !defined(_WIN32) && !defined(__OS2__)
+ /* We should be careful to force a finish between each
+ iteration through the GLUT main loop if indirect OpenGL
+ contexts are in use; indirect contexts tend to have much
+ longer latency because lots of OpenGL extension requests
+ can queue up in the X protocol stream. We accomplish this
+ by posting GLUT_FINISH_WORK to be done. */
+ if (!__glutCurrentWindow->isDirect)
+ __glutPutOnWorkList(__glutCurrentWindow, GLUT_FINISH_WORK);
+#endif
+
+ /* If debugging is enabled, we'll want to check this window
+ for any OpenGL errors every iteration through the GLUT
+ main loop. To accomplish this, we post the
+ GLUT_DEBUG_WORK to be done on this window. */
+ if (__glutDebug) {
+ __glutPutOnWorkList(__glutCurrentWindow, GLUT_DEBUG_WORK);
+ }
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutSetWindow(int win)
+{
+ GLUTwindow *window;
+
+ if (win < 1 || win > __glutWindowListSize) {
+ __glutWarning("glutSetWindow attempted on bogus window.");
+ return;
+ }
+ window = __glutWindowList[win - 1];
+ if (!window) {
+ __glutWarning("glutSetWindow attempted on bogus window.");
+ return;
+ }
+ __glutSetWindow(window);
+}
+/* ENDCENTRY */
+
+static int
+getUnusedWindowSlot(void)
+{
+ int i;
+
+ /* Look for allocated, unused slot. */
+ for (i = 0; i < __glutWindowListSize; i++) {
+ if (!__glutWindowList[i]) {
+ return i;
+ }
+ }
+ /* Allocate a new slot. */
+ __glutWindowListSize++;
+ if (__glutWindowList) {
+ __glutWindowList = (GLUTwindow **)
+ realloc(__glutWindowList,
+ __glutWindowListSize * sizeof(GLUTwindow *));
+ } else {
+ /* XXX Some realloc's do not correctly perform a malloc
+ when asked to perform a realloc on a NULL pointer,
+ though the ANSI C library spec requires this. */
+ __glutWindowList = (GLUTwindow **)
+ malloc(sizeof(GLUTwindow *));
+ }
+ if (!__glutWindowList)
+ __glutFatalError("out of memory.");
+ __glutWindowList[__glutWindowListSize - 1] = NULL;
+ return __glutWindowListSize - 1;
+}
+
+static XVisualInfo *
+getVisualInfoCI(unsigned int mode)
+{
+#if POKA
+ static int bufSizeList[] =
+ {16, 12, 8, 4, 2, 1, 0};
+ XVisualInfo *vi;
+ int list[32];
+ int i, n = 0;
+
+ /* Should not be looking at display mode mask if
+ __glutDisplayString is non-NULL. */
+ assert(!__glutDisplayString);
+
+ list[n++] = GLX_BUFFER_SIZE;
+ list[n++] = 1;
+ if (GLUT_WIND_IS_DOUBLE(mode)) {
+ list[n++] = GLX_DOUBLEBUFFER;
+ }
+ if (GLUT_WIND_IS_STEREO(mode)) {
+ list[n++] = GLX_STEREO;
+ }
+ if (GLUT_WIND_HAS_DEPTH(mode)) {
+ list[n++] = GLX_DEPTH_SIZE;
+ list[n++] = 1;
+ }
+ if (GLUT_WIND_HAS_STENCIL(mode)) {
+ list[n++] = GLX_STENCIL_SIZE;
+ list[n++] = 1;
+ }
+ list[n] = (int) None; /* terminate list */
+
+ /* glXChooseVisual specify GLX_BUFFER_SIZE prefers the
+ "smallest index buffer of at least the specified size".
+ This would be reasonable if GLUT allowed the user to
+ specify the required buffe size, but GLUT's display mode
+ is too simplistic (easy to use?). GLUT should try to find
+ the "largest". So start with a large buffer size and
+ shrink until we find a matching one that exists. */
+
+ for (i = 0; bufSizeList[i]; i++) {
+ /* XXX Assumes list[1] is where GLX_BUFFER_SIZE parameter
+ is. */
+ list[1] = bufSizeList[i];
+ vi = glXChooseVisual(__glutDisplay,
+ __glutScreen, list);
+ if (vi)
+ return vi;
+ }
+ return NULL;
+#else
+ return
+ glXChooseVisual(mode);
+
+#endif
+}
+
+static XVisualInfo *
+getVisualInfoRGB(unsigned int mode)
+{
+#if POKA
+ int list[32];
+ int n = 0;
+
+ /* Should not be looking at display mode mask if
+ __glutDisplayString is non-NULL. */
+ assert(!__glutDisplayString);
+
+ /* XXX Would a caching mechanism to minize the calls to
+ glXChooseVisual? You'd have to reference count
+ XVisualInfo* pointers. Would also have to properly
+ interact with glutInitDisplayString. */
+
+ list[n++] = GLX_RGBA;
+ list[n++] = GLX_RED_SIZE;
+ list[n++] = 1;
+ list[n++] = GLX_GREEN_SIZE;
+ list[n++] = 1;
+ list[n++] = GLX_BLUE_SIZE;
+ list[n++] = 1;
+ if (GLUT_WIND_HAS_ALPHA(mode)) {
+ list[n++] = GLX_ALPHA_SIZE;
+ list[n++] = 1;
+ }
+ if (GLUT_WIND_IS_DOUBLE(mode)) {
+ list[n++] = GLX_DOUBLEBUFFER;
+ }
+ if (GLUT_WIND_IS_STEREO(mode)) {
+ list[n++] = GLX_STEREO;
+ }
+ if (GLUT_WIND_HAS_DEPTH(mode)) {
+ list[n++] = GLX_DEPTH_SIZE;
+ list[n++] = 1;
+ }
+ if (GLUT_WIND_HAS_STENCIL(mode)) {
+ list[n++] = GLX_STENCIL_SIZE;
+ list[n++] = 1;
+ }
+ if (GLUT_WIND_HAS_ACCUM(mode)) {
+ list[n++] = GLX_ACCUM_RED_SIZE;
+ list[n++] = 1;
+ list[n++] = GLX_ACCUM_GREEN_SIZE;
+ list[n++] = 1;
+ list[n++] = GLX_ACCUM_BLUE_SIZE;
+ list[n++] = 1;
+ if (GLUT_WIND_HAS_ALPHA(mode)) {
+ list[n++] = GLX_ACCUM_ALPHA_SIZE;
+ list[n++] = 1;
+ }
+ }
+#if defined(GLX_VERSION_1_1) && (defined(GLX_SGIS_multisample) || defined(GLX_ARB_multisample))
+ if (GLUT_WIND_IS_MULTISAMPLE(mode)) {
+ if (!__glutIsSupportedByGLX("GLX_SGIS_multisample") &&
+ !__glutIsSupportedByGLX("GLX_ARB_multisample"))
+ return NULL;
+#if defined(GLX_ARB_multisample)
+ list[n++] = GLX_SAMPLES_ARB;
+#elif defined(GLX_SGIS_multisample)
+ list[n++] = GLX_SAMPLES_SGIS;
+#endif
+ /* XXX Is 4 a reasonable minimum acceptable number of
+ samples? */
+ list[n++] = 4;
+ }
+#endif
+ list[n] = (int) None; /* terminate list */
+
+ return glXChooseVisual(__glutDisplay,
+ __glutScreen, list);
+#else /* POKA */
+
+ return
+ glXChooseVisual(mode);
+
+#endif
+}
+
+XVisualInfo *
+__glutGetVisualInfo(unsigned int mode)
+{
+ /* XXX GLUT_LUMINANCE not implemented for GLUT 3.0. */
+ if (GLUT_WIND_IS_LUMINANCE(mode))
+ return NULL;
+
+ if (GLUT_WIND_IS_RGB(mode))
+ return getVisualInfoRGB(mode);
+ else
+ return getVisualInfoCI(mode);
+}
+
+XVisualInfo *
+__glutDetermineVisual(
+ unsigned int displayMode,
+ Bool * treatAsSingle,
+ XVisualInfo * (getVisualInfo) (unsigned int))
+{
+ XVisualInfo *vis;
+
+ /* Should not be looking at display mode mask if
+ __glutDisplayString is non-NULL. */
+ assert(!__glutDisplayString);
+
+ *treatAsSingle = GLUT_WIND_IS_SINGLE(displayMode);
+ vis = getVisualInfo(displayMode);
+ if (!vis) {
+ /* Fallback cases when can't get exactly what was asked
+ for... */
+ if (GLUT_WIND_IS_SINGLE(displayMode)) {
+ /* If we can't find a single buffered visual, try looking
+ for a double buffered visual. We can treat a double
+ buffered visual as a single buffer visual by changing
+ the draw buffer to GL_FRONT and treating any swap
+ buffers as no-ops. */
+ displayMode |= GLUT_DOUBLE;
+ vis = getVisualInfo(displayMode);
+ *treatAsSingle = True;
+ }
+ if (!vis && GLUT_WIND_IS_MULTISAMPLE(displayMode)) {
+ /* If we can't seem to get multisampling (ie, not Reality
+ Engine class graphics!), go without multisampling. It
+ is up to the application to query how many multisamples
+ were allocated (0 equals no multisampling) if the
+ application is going to use multisampling for more than
+ just antialiasing. */
+ displayMode &= ~GLUT_MULTISAMPLE;
+ vis = getVisualInfo(displayMode);
+ }
+ }
+ return vis;
+}
+
+static void GLUTCALLBACK
+__glutDefaultDisplay(void)
+{
+ /* XXX Remove the warning after GLUT 3.0. */
+ __glutWarning("The following is a new check for GLUT 3.0; update your code.");
+ __glutFatalError(
+ "redisplay needed for window %d, but no display callback.",
+ __glutCurrentWindow->num + 1);
+}
+
+void GLUTCALLBACK
+__glutDefaultReshape(int width, int height)
+{
+ GLUToverlay *overlay;
+
+ /* Adjust the viewport of the window (and overlay if one
+ exists). */
+ MAKE_CURRENT_WINDOW(__glutCurrentWindow);
+ glViewport(0, 0, (GLsizei) width, (GLsizei) height);
+ overlay = __glutCurrentWindow->overlay;
+ if (overlay) {
+ MAKE_CURRENT_OVERLAY(overlay);
+ glViewport(0, 0, (GLsizei) width, (GLsizei) height);
+ }
+ /* Make sure we are current to the current layer (application
+ should be able to count on the current layer not changing
+ unless the application explicitly calls glutUseLayer). */
+ MAKE_CURRENT_LAYER(__glutCurrentWindow);
+}
+
+XVisualInfo *
+__glutDetermineWindowVisual(Bool * treatAsSingle, Bool * visAlloced, void **fbc)
+{
+ if (__glutDisplayString) {
+
+ /* __glutDisplayString should be NULL except if
+ glutInitDisplayString has been called to register a
+ different display string. Calling glutInitDisplayString
+ means using a string instead of an integer mask determine
+ the visual to use. Using the function pointer variable
+ __glutDetermineVisualFromString below avoids linking in
+ the code for implementing glutInitDisplayString (ie,
+ glut_dstr.o) unless glutInitDisplayString gets called by
+ the application. */
+
+ assert(__glutDetermineVisualFromString);
+ *visAlloced = False;
+ *fbc = NULL;
+ return __glutDetermineVisualFromString(__glutDisplayString, treatAsSingle,
+ requiredWindowCriteria, numRequiredWindowCriteria, requiredWindowCriteriaMask, fbc);
+ } else {
+ *visAlloced = True;
+ *fbc = NULL;
+ return __glutDetermineVisual(__glutDisplayMode,
+ treatAsSingle, __glutGetVisualInfo);
+ }
+}
+
+/* ARGSUSED5 */ /* Only Win32 uses gameMode parameter. */
+GLUTwindow *
+__glutCreateWindow(GLUTwindow * parent,
+ int x, int y, int width, int height, int gameMode)
+{
+ GLUTwindow *window;
+ XSetWindowAttributes wa;
+ unsigned long attribMask;
+ int winnum;
+ int i;
+#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_fbconfig)
+ GLXFBConfigSGIX fbc;
+#else
+ void *fbc;
+#endif
+
+#if defined(__OS2PM__)
+ {
+ extern HAB hab; /* PM anchor block handle */
+ CLASSINFO classinfo;
+
+ if(!WinQueryClassInfo(hab,"GLUT", &classinfo) )
+ __glutOpenOS2Connection(NULL);
+ }
+#elif defined(_WIN32)
+ WNDCLASS wc;
+ int style;
+
+ if (!GetClassInfo(GetModuleHandle(NULL), "GLUT", &wc)) {
+ __glutOpenWin32Connection(NULL);
+ }
+#else
+ if (!__glutDisplay) {
+ __glutOpenXConnection(NULL);
+ }
+#endif
+
+#ifndef __OS2PM__
+ if (__glutGameModeWindow) {
+ __glutFatalError("cannot create windows in game mode.");
+ }
+#endif
+
+ winnum = getUnusedWindowSlot();
+ window = (GLUTwindow *) malloc(sizeof(GLUTwindow));
+ if (!window) {
+ __glutFatalError("out of memory.");
+ }
+ window->num = winnum;
+
+#if defined(__OS2PM__)
+ /* Add this new window to the window list. */
+ __glutWindowList[winnum] = window;
+ window->shownState = -1;
+#endif
+
+#if !defined(_WIN32) && !defined(__OS2PM__)
+ window->vis = __glutDetermineWindowVisual(&window->treatAsSingle,
+ &window->visAlloced, (void**) &fbc);
+ if (!window->vis) {
+ __glutFatalError(
+ "visual with necessary capabilities not found.");
+ }
+ __glutSetupColormap(window->vis, &window->colormap, &window->cmap);
+#endif
+ window->eventMask = StructureNotifyMask | ExposureMask;
+
+ attribMask = CWBackPixmap | CWBorderPixel | CWColormap | CWEventMask;
+ wa.background_pixmap = None;
+ wa.border_pixel = 0;
+ wa.colormap = window->cmap;
+ wa.event_mask = window->eventMask;
+ if (parent) {
+ if (parent->eventMask & GLUT_HACK_STOP_PROPAGATE_MASK)
+ wa.event_mask |= GLUT_HACK_STOP_PROPAGATE_MASK;
+ attribMask |= CWDontPropagate;
+ wa.do_not_propagate_mask = parent->eventMask & GLUT_DONT_PROPAGATE_FILTER_MASK;
+ } else {
+ wa.do_not_propagate_mask = 0;
+ }
+
+ /* Stash width and height before Win32's __glutAdjustCoords
+ possibly overwrites the values. */
+ window->width = width;
+ window->height = height;
+ window->forceReshape = True;
+ window->ignoreKeyRepeat = False;
+
+#if defined(__OS2PM__)
+
+ { ULONG flStyle=0;
+ int ii;
+ ERRORID erridErrorCode;/* last error id code */
+ extern HAB hab; /* PM anchor block handle */
+
+ if (parent) {
+ flStyle = WS_CLIPCHILDREN|WS_VISIBLE;
+ } else {
+ if (gameMode) {
+ /* Game mode window should be a WS_POPUP window to
+ ensure that the taskbar is hidden by it. A standard
+ WS_OVERLAPPEDWINDOW does not hide the task bar. */
+ flStyle = FCF_STANDARD | WS_MAXIMIZED;
+ } else {
+ /* A standard toplevel window with borders and such. */
+ flStyle = FCF_STANDARD | WS_CLIPCHILDREN;
+// flStyle = WS_OVERLAPPEDWINDOW;
+ }
+ }
+{
+ HWND hwnd; /* Window */
+ ULONG ListBoxId; /* Window id */
+ /* (supplied by application) */
+
+
+ HWND hwndClient; /* handle to the client */
+ HWND hwndFrame; /* handle to the frame */
+ PFNWP GenericWndProc;
+ FRAMECDATA fcd;
+ RECTL rect; /* Boundary rectangle */
+
+
+
+/************************************************/
+// flCreate = (FCF_STANDARD) & ~FCF_TASKLIST;
+/**********************************/
+ if (parent)
+ { window->frame = NULL;
+
+ hwnd = WinCreateWindow(parent->win, /* Parent window */
+ "GLUTCHILD", /* Class name */
+ "", /* Window text */
+ flStyle, /* Window style */
+ x, y, /* Position (x,y) */
+ width, height, /* Size (width,height) */
+ parent->win, /* Owner window */
+ HWND_TOP, /* Sibling window */
+ 0, /* Window id */
+ NULL, /* Control data */
+ NULL); /* Pres parameters */
+
+ erridErrorCode = WinGetLastError(hab);
+ window->win = hwnd;
+
+ window->hdc = WinOpenWindowDC(window->win);
+ window->hpsBuffer = hpsCurrent;
+
+
+ rect.xLeft = x;
+ rect.xRight = x+width;
+ rect.yBottom = y;
+ rect.yTop = y + height;
+
+/***** else parent *****************************/
+ } else {
+ hwnd = WinCreateStdWindow(HWND_DESKTOP,
+ 0, /* WS_VISIBLE frame-window style */
+ &flStyle, /* window style */
+ "GLUT", /* class name */
+ "GLUT",/* window title */
+ 0L, /* default client style */
+ NULLHANDLE, /* resource in executable file */
+ ID_WINDOW, /* resource id */
+ &hwndClient); /* receives client window handle */
+
+ erridErrorCode = WinGetLastError(hab);
+ window->win = hwndClient;
+ window->frame = hwnd;
+ window->hdc = WinOpenWindowDC(window->win);
+
+ window->hpsBuffer = hpsCurrent;
+
+
+/* converts a client window's boundaries into an equivalent frame rectangle */
+ rect.xLeft = x;
+ rect.xRight = x+width;
+ rect.yBottom = y;
+ rect.yTop = y + height;
+
+ /* calculate equivalent frame boundary from boundary data */
+ WinCalcFrameRect(window->frame, &rect, FALSE);
+ }
+/***** endof if(parent) *****************************/
+
+ /* Must set the XHDC for fake glXChooseVisual & fake
+ glXCreateContext & fake XAllocColorCells. */
+ XHDC = window->hdc;
+ XHWND = window->win;
+ window->vis = __glutDetermineWindowVisual(&window->treatAsSingle,
+ &window->visAlloced, &fbc);
+ if (!window->vis)
+ { __glutFatalError(
+ "pixel format with necessary capabilities not found.");
+ }
+ { int rc;
+ rc = wglChoosePixelFormat(window->hdc, window->vis),
+
+// evglSetPixelFormat(2); /* int iPixelFormat 1 - doublebuffer/2 - single buffer ??*/
+ wglSetPixelFormat(window->hdc,rc,window->vis);
+ }
+ __glutSetupColormap(window->vis, &window->colormap, &window->cmap);
+
+ window->ctx = glXCreateContext(window->hpsBuffer, window->vis,
+ None, __glutTryDirect);
+
+ WinSetWindowPos(hwnd,
+ HWND_TOP,rect.xLeft,rect.yBottom,
+ rect.xRight-rect.xLeft, rect.yTop-rect.yBottom,
+ SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW|SWP_ZORDER); /* flags*/
+
+ /* Make sure subwindows get a windowStatus callback. */
+ if (parent)
+ WinPostMsg(parent->win, WM_ACTIVATE, 0, 0);
+
+ }
+}
+
+#elif defined(_WIN32)
+
+ __glutAdjustCoords(parent ? parent->win : NULL,
+ &x, &y, &width, &height);
+ if (parent) {
+ style = WS_CHILD;
+ } else {
+ if (gameMode) {
+ /* Game mode window should be a WS_POPUP window to
+ ensure that the taskbar is hidden by it. A standard
+ WS_OVERLAPPEDWINDOW does not hide the task bar. */
+ style = WS_POPUP | WS_MAXIMIZE;
+ } else {
+ /* A standard toplevel window with borders and such. */
+ style = WS_OVERLAPPEDWINDOW;
+ }
+ }
+ window->win = CreateWindow("GLUT", "GLUT",
+ WS_CLIPSIBLINGS | WS_CLIPCHILDREN | style,
+ x, y, width, height, parent ? parent->win : __glutRoot,
+ NULL, GetModuleHandle(NULL), 0);
+ window->hdc = GetDC(window->win);
+ /* Must set the XHDC for fake glXChooseVisual & fake
+ glXCreateContext & fake XAllocColorCells. */
+ XHDC = window->hdc;
+ window->vis = __glutDetermineWindowVisual(&window->treatAsSingle,
+ &window->visAlloced, &fbc);
+ if (!window->vis) {
+ __glutFatalError(
+ "pixel format with necessary capabilities not found.");
+ }
+ if (!SetPixelFormat(window->hdc,
+ ChoosePixelFormat(window->hdc, window->vis),
+ window->vis)) {
+ __glutFatalError("SetPixelFormat failed during window create.");
+ }
+ __glutSetupColormap(window->vis, &window->colormap, &window->cmap);
+ /* Make sure subwindows get a windowStatus callback. */
+ if (parent) {
+ PostMessage(parent->win, WM_ACTIVATE, 0, 0);
+ }
+ window->renderDc = window->hdc;
+#else
+ window->win = XCreateWindow(__glutDisplay,
+ parent == NULL ? __glutRoot : parent->win,
+ x, y, width, height, 0,
+ window->vis->depth, InputOutput, window->vis->visual,
+ attribMask, &wa);
+#endif
+ window->renderWin = window->win;
+#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_fbconfig)
+ if (fbc) {
+ window->ctx = __glut_glXCreateContextWithConfigSGIX(__glutDisplay, fbc,
+ GLX_RGBA_TYPE_SGIX, None, __glutTryDirect);
+ } else
+#endif
+#if defined(__OS2PM__)
+// window->ctx = glXCreateContext(window->hpsBuffer, window->vis,
+// None, __glutTryDirect);
+#else
+ window->ctx = glXCreateContext(__glutDisplay, window->vis,
+ None, __glutTryDirect);
+#endif
+ if (!window->ctx) {
+ __glutFatalError(
+ "failed to create OpenGL rendering context.");
+ }
+ window->renderCtx = window->ctx;
+#if !defined(_WIN32) && !defined(__OS2PM__)
+ window->isDirect = glXIsDirect(__glutDisplay, window->ctx);
+ if (__glutForceDirect) {
+ if (!window->isDirect)
+ __glutFatalError("direct rendering not possible.");
+ }
+#endif
+
+ window->parent = parent;
+ if (parent) {
+ window->siblings = parent->children;
+ parent->children = window;
+ } else {
+ window->siblings = NULL;
+ }
+ window->overlay = NULL;
+ window->children = NULL;
+ window->display = __glutDefaultDisplay;
+ window->reshape = __glutDefaultReshape;
+ window->mouse = NULL;
+ window->motion = NULL;
+ window->passive = NULL;
+ window->entry = NULL;
+ window->keyboard = NULL;
+ window->keyboardUp = NULL;
+ window->windowStatus = NULL;
+ window->visibility = NULL;
+ window->special = NULL;
+ window->specialUp = NULL;
+ window->buttonBox = NULL;
+ window->dials = NULL;
+ window->spaceMotion = NULL;
+ window->spaceRotate = NULL;
+ window->spaceButton = NULL;
+ window->tabletMotion = NULL;
+ window->tabletButton = NULL;
+#ifdef _WIN32
+ window->joystick = NULL;
+ window->joyPollInterval = 0;
+#endif
+
+#if defined(__OS2PM__)
+ window->wm_command = NULL;
+#endif
+
+ window->tabletPos[0] = -1;
+ window->tabletPos[1] = -1;
+#if defined(__OS2PM__)
+ if(window->shownState == -1)
+ window->shownState = 0;
+ window->visState = window->shownState;
+#else
+ window->shownState = 0;
+ window->visState = -1; /* not VisibilityUnobscured,
+ VisibilityPartiallyObscured, or
+ VisibilityFullyObscured */
+#endif
+ window->entryState = -1; /* not EnterNotify or LeaveNotify */
+
+ window->desiredConfMask = 0;
+ window->buttonUses = 0;
+ window->cursor = GLUT_CURSOR_INHERIT;
+
+ /* Setup window to be mapped when glutMainLoop starts. */
+ window->workMask = GLUT_MAP_WORK;
+#ifdef _WIN32
+ if (gameMode) {
+ /* When mapping a game mode window, just show
+ the window. We have already created the game
+ mode window with a maximize flag at creation
+ time. Doing a ShowWindow(window->win, SW_SHOWNORMAL)
+ would be wrong for a game mode window since it
+ would unmaximize the window. */
+ window->desiredMapState = GameModeState;
+ } else {
+ window->desiredMapState = NormalState;
+ }
+#else
+ window->desiredMapState = NormalState;
+#endif
+ window->prevWorkWin = __glutWindowWorkList;
+ __glutWindowWorkList = window;
+
+ /* Initially, no menus attached. */
+ for (i = 0; i < GLUT_MAX_MENUS; i++) {
+ window->menu[i] = 0;
+ }
+
+ /* Add this new window to the window list. */
+ __glutWindowList[winnum] = window;
+
+ /* Make the new window the current window. */
+ __glutSetWindow(window);
+
+ __glutDetermineMesaSwapHackSupport();
+
+ if (window->treatAsSingle) {
+ /* We do this because either the window really is single
+ buffered (in which case this is redundant, but harmless,
+ because this is the initial single-buffered context
+ state); or we are treating a double buffered window as a
+ single-buffered window because the system does not appear
+ to export any suitable single- buffered visuals (in which
+ the following are necessary). */
+ glDrawBuffer(GL_FRONT);
+ glReadBuffer(GL_FRONT);
+ }
+ return window;
+}
+
+/* CENTRY */
+int GLUTAPIENTRY
+glutCreateWindow(const char *title)
+{
+ static int firstWindow = 1;
+ GLUTwindow *window;
+#if !defined(_WIN32) && !defined(__OS2__)
+ XWMHints *wmHints;
+#endif
+ Window win;
+ XTextProperty textprop;
+
+ if (__glutGameModeWindow) {
+ __glutFatalError("cannot create windows in game mode.");
+ }
+ window = __glutCreateWindow(NULL,
+ __glutSizeHints.x, __glutSizeHints.y,
+ __glutInitWidth, __glutInitHeight,
+ /* not game mode */ 0);
+ win = window->win;
+ /* Setup ICCCM properties. */
+ textprop.value = (unsigned char *) title;
+ textprop.encoding = XA_STRING;
+ textprop.format = 8;
+ textprop.nitems = strlen(title);
+#if defined(__OS2__)
+ WinSetWindowText(window->frame, (PCSZ)title);
+ if (__glutIconic) {
+ window->desiredMapState = IconicState;
+ }
+#elif defined(_WIN32)
+ SetWindowText(win, title);
+ if (__glutIconic) {
+ window->desiredMapState = IconicState;
+ }
+#else
+ wmHints = XAllocWMHints();
+ wmHints->initial_state =
+ __glutIconic ? IconicState : NormalState;
+ wmHints->flags = StateHint;
+ XSetWMProperties(__glutDisplay, win, &textprop, &textprop,
+ /* Only put WM_COMMAND property on first window. */
+ firstWindow ? __glutArgv : NULL,
+ firstWindow ? __glutArgc : 0,
+ &__glutSizeHints, wmHints, NULL);
+ XFree(wmHints);
+ XSetWMProtocols(__glutDisplay, win, &__glutWMDeleteWindow, 1);
+#endif
+ firstWindow = 0;
+ return window->num + 1;
+}
+
+#ifdef _WIN32
+int GLUTAPIENTRY
+__glutCreateWindowWithExit(const char *title, void (__cdecl *exitfunc)(int))
+{
+ __glutExitFunc = exitfunc;
+ return glutCreateWindow(title);
+}
+#endif
+
+int GLUTAPIENTRY
+glutCreateSubWindow(int win, int x, int y, int width, int height)
+{
+ GLUTwindow *window;
+
+ window = __glutCreateWindow(__glutWindowList[win - 1],
+ x, y, width, height, /* not game mode */ 0);
+#if !defined(_WIN32) && !defined(__OS2__)
+ {
+ GLUTwindow *toplevel;
+
+ toplevel = __glutToplevelOf(window);
+ if (toplevel->cmap != window->cmap) {
+ __glutPutOnWorkList(toplevel, GLUT_COLORMAP_WORK);
+ }
+ }
+#endif
+ return window->num + 1;
+}
+/* ENDCENTRY */
+
+void
+__glutDestroyWindow(GLUTwindow * window,
+ GLUTwindow * initialWindow)
+{
+ GLUTwindow **prev, *cur, *parent, *siblings;
+
+ /* Recursively destroy any children. */
+ cur = window->children;
+ while (cur) {
+ siblings = cur->siblings;
+ __glutDestroyWindow(cur, initialWindow);
+ cur = siblings;
+ }
+ /* Remove from parent's children list (only necessary for
+ non-initial windows and subwindows!). */
+ parent = window->parent;
+ if (parent && parent == initialWindow->parent) {
+ prev = &parent->children;
+ cur = parent->children;
+ while (cur) {
+ if (cur == window) {
+ *prev = cur->siblings;
+ break;
+ }
+ prev = &(cur->siblings);
+ cur = cur->siblings;
+ }
+ }
+ /* Unbind if bound to this window. */
+ if (window == __glutCurrentWindow) {
+ UNMAKE_CURRENT();
+ __glutCurrentWindow = NULL;
+ }
+ /* Begin tearing down window itself. */
+ if (window->overlay) {
+ __glutFreeOverlayFunc(window->overlay);
+ }
+ XDestroyWindow(__glutDisplay, window->win);
+ glXDestroyContext(__glutDisplay, window->ctx);
+ if (window->colormap) {
+ /* Only color index windows have colormap data structure. */
+ __glutFreeColormap(window->colormap);
+ }
+ /* NULLing the __glutWindowList helps detect is a window
+ instance has been destroyed, given a window number. */
+ __glutWindowList[window->num] = NULL;
+
+ /* Cleanup data structures that might contain window. */
+ cleanWindowWorkList(window);
+#if !defined(_WIN32) && !defined(__OS2__)
+ cleanStaleWindowList(window);
+#endif
+ /* Remove window from the "get window cache" if it is there. */
+ if (__glutWindowCache == window)
+ __glutWindowCache = NULL;
+
+ if (window->visAlloced) {
+ /* Only free XVisualInfo* gotten from glXChooseVisual. */
+ XFree(window->vis);
+ }
+
+ if (window == __glutGameModeWindow) {
+ /* Destroying the game mode window should implicitly
+ have GLUT leave game mode. */
+ __glutCloseDownGameMode();
+ }
+
+ free(window);
+}
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutDestroyWindow(int win)
+{
+ GLUTwindow *window = __glutWindowList[win - 1];
+
+ if (__glutMappedMenu && __glutMenuWindow == window) {
+ __glutFatalUsage("destroying menu window not allowed while menus in use");
+ }
+#if !defined(_WIN32) && !defined(__OS2__)
+ /* If not a toplevel window... */
+ if (window->parent) {
+ /* Destroying subwindows may change colormap requirements;
+ recalculate toplevel window's WM_COLORMAP_WINDOWS
+ property. */
+ __glutPutOnWorkList(__glutToplevelOf(window->parent),
+ GLUT_COLORMAP_WORK);
+ }
+#endif
+ __glutDestroyWindow(window, window);
+ XFlush(__glutDisplay);
+}
+/* ENDCENTRY */
+
+void
+__glutChangeWindowEventMask(long eventMask, Bool add)
+{
+ if (add) {
+ /* Add eventMask to window's event mask. */
+ if ((__glutCurrentWindow->eventMask & eventMask) !=
+ eventMask) {
+ __glutCurrentWindow->eventMask |= eventMask;
+ __glutPutOnWorkList(__glutCurrentWindow,
+ GLUT_EVENT_MASK_WORK);
+ }
+ } else {
+ /* Remove eventMask from window's event mask. */
+ if (__glutCurrentWindow->eventMask & eventMask) {
+ __glutCurrentWindow->eventMask &= ~eventMask;
+ __glutPutOnWorkList(__glutCurrentWindow,
+ GLUT_EVENT_MASK_WORK);
+ }
+ }
+}
+
+void GLUTAPIENTRY
+glutDisplayFunc(GLUTdisplayCB displayFunc)
+{
+ /* XXX Remove the warning after GLUT 3.0. */
+ if (!displayFunc)
+ __glutFatalError("NULL display callback not allowed in GLUT 3.0; update your code.");
+ __glutCurrentWindow->display = displayFunc;
+}
+
+void GLUTAPIENTRY
+glutMouseFunc(GLUTmouseCB mouseFunc)
+{
+ if (__glutCurrentWindow->mouse) {
+ if (!mouseFunc) {
+ /* Previous mouseFunc being disabled. */
+ __glutCurrentWindow->buttonUses--;
+ __glutChangeWindowEventMask(
+ ButtonPressMask | ButtonReleaseMask,
+ __glutCurrentWindow->buttonUses > 0);
+ }
+ } else {
+ if (mouseFunc) {
+ /* Previously no mouseFunc, new one being installed. */
+ __glutCurrentWindow->buttonUses++;
+ __glutChangeWindowEventMask(
+ ButtonPressMask | ButtonReleaseMask, True);
+ }
+ }
+ __glutCurrentWindow->mouse = mouseFunc;
+}
+
+void GLUTAPIENTRY
+glutMotionFunc(GLUTmotionCB motionFunc)
+{
+ /* Hack. Some window managers (4Dwm by default) will mask
+ motion events if the client is not selecting for button
+ press and release events. So we select for press and
+ release events too (being careful to use reference
+ counting). */
+ if (__glutCurrentWindow->motion) {
+ if (!motionFunc) {
+ /* previous mouseFunc being disabled */
+ __glutCurrentWindow->buttonUses--;
+ __glutChangeWindowEventMask(
+ ButtonPressMask | ButtonReleaseMask,
+ __glutCurrentWindow->buttonUses > 0);
+ }
+ } else {
+ if (motionFunc) {
+ /* Previously no mouseFunc, new one being installed. */
+ __glutCurrentWindow->buttonUses++;
+ __glutChangeWindowEventMask(
+ ButtonPressMask | ButtonReleaseMask, True);
+ }
+ }
+ /* Real work of selecting for passive mouse motion. */
+ __glutChangeWindowEventMask(
+ Button1MotionMask | Button2MotionMask | Button3MotionMask,
+ motionFunc != NULL);
+ __glutCurrentWindow->motion = motionFunc;
+}
+
+void GLUTAPIENTRY
+glutPassiveMotionFunc(GLUTpassiveCB passiveMotionFunc)
+{
+ __glutChangeWindowEventMask(PointerMotionMask,
+ passiveMotionFunc != NULL);
+
+ /* Passive motion also requires watching enters and leaves so
+ that a fake passive motion event can be generated on an
+ enter. */
+ __glutChangeWindowEventMask(EnterWindowMask | LeaveWindowMask,
+ __glutCurrentWindow->entry != NULL || passiveMotionFunc != NULL);
+
+ __glutCurrentWindow->passive = passiveMotionFunc;
+}
+
+void GLUTAPIENTRY
+glutEntryFunc(GLUTentryCB entryFunc)
+{
+ __glutChangeWindowEventMask(EnterWindowMask | LeaveWindowMask,
+ entryFunc != NULL || __glutCurrentWindow->passive);
+ __glutCurrentWindow->entry = entryFunc;
+ if (!entryFunc) {
+ __glutCurrentWindow->entryState = -1;
+ }
+}
+
+void GLUTAPIENTRY
+glutWindowStatusFunc(GLUTwindowStatusCB windowStatusFunc)
+{
+ __glutChangeWindowEventMask(VisibilityChangeMask,
+ windowStatusFunc != NULL);
+ __glutCurrentWindow->windowStatus = windowStatusFunc;
+ if (!windowStatusFunc) {
+ /* Make state invalid. */
+ __glutCurrentWindow->visState = -1;
+ }
+}
+
+static void GLUTCALLBACK
+visibilityHelper(int status)
+{
+ if (status == GLUT_HIDDEN || status == GLUT_FULLY_COVERED)
+ __glutCurrentWindow->visibility(GLUT_NOT_VISIBLE);
+ else
+ __glutCurrentWindow->visibility(GLUT_VISIBLE);
+}
+
+
+void GLUTAPIENTRY
+glutVisibilityFunc(GLUTvisibilityCB visibilityFunc)
+{
+ __glutCurrentWindow->visibility = visibilityFunc;
+
+ if (visibilityFunc)
+ { glutWindowStatusFunc(visibilityHelper);
+#if defined(__OS2PM__)
+ if(__glutCurrentWindow->shownState >= 0)
+ { visibilityHelper(__glutCurrentWindow->shownState);
+ }
+#endif
+ }
+ else
+ glutWindowStatusFunc(NULL);
+}
+
+void GLUTAPIENTRY
+glutReshapeFunc(GLUTreshapeCB reshapeFunc)
+{
+ if (reshapeFunc) {
+ __glutCurrentWindow->reshape = reshapeFunc;
+ } else {
+ __glutCurrentWindow->reshape = __glutDefaultReshape;
+ }
+}
+ \ No newline at end of file
diff --git a/src/glut/os2/glut_winmisc.cpp b/src/glut/os2/glut_winmisc.cpp
new file mode 100644
index 00000000000..ffa31c021c0
--- /dev/null
+++ b/src/glut/os2/glut_winmisc.cpp
@@ -0,0 +1,127 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+
+#include "glutint.h"
+
+/* CENTRY */
+void GLUTAPIENTRY
+glutSetWindowTitle(const char *title)
+{
+#if defined(__OS2PM__)
+ __glutSetWindowText(__glutCurrentWindow->win, (char *)title);
+
+#else
+ XTextProperty textprop;
+
+ assert(!__glutCurrentWindow->parent);
+ IGNORE_IN_GAME_MODE();
+ textprop.value = (unsigned char *) title;
+ textprop.encoding = XA_STRING;
+ textprop.format = 8;
+ textprop.nitems = strlen(title);
+ XSetWMName(__glutDisplay,
+ __glutCurrentWindow->win, &textprop);
+ XFlush(__glutDisplay);
+#endif
+}
+
+void GLUTAPIENTRY
+glutSetIconTitle(const char *title)
+{
+#if defined(__OS2PM__)
+//todo ?
+#else
+
+ XTextProperty textprop;
+
+ assert(!__glutCurrentWindow->parent);
+ IGNORE_IN_GAME_MODE();
+ textprop.value = (unsigned char *) title;
+ textprop.encoding = XA_STRING;
+ textprop.format = 8;
+ textprop.nitems = strlen(title);
+ XSetWMIconName(__glutDisplay,
+ __glutCurrentWindow->win, &textprop);
+ XFlush(__glutDisplay);
+#endif
+}
+
+void GLUTAPIENTRY
+glutPositionWindow(int x, int y)
+{
+ IGNORE_IN_GAME_MODE();
+ __glutCurrentWindow->desiredX = x;
+ __glutCurrentWindow->desiredY = y;
+ __glutCurrentWindow->desiredConfMask |= CWX | CWY;
+ __glutPutOnWorkList(__glutCurrentWindow, GLUT_CONFIGURE_WORK);
+}
+
+void GLUTAPIENTRY
+glutReshapeWindow(int w, int h)
+{
+ IGNORE_IN_GAME_MODE();
+ if (w <= 0 || h <= 0)
+ __glutWarning("glutReshapeWindow: non-positive width or height not allowed");
+
+ __glutCurrentWindow->desiredWidth = w;
+ __glutCurrentWindow->desiredHeight = h;
+ __glutCurrentWindow->desiredConfMask |= CWWidth | CWHeight;
+ __glutPutOnWorkList(__glutCurrentWindow, GLUT_CONFIGURE_WORK);
+}
+
+void GLUTAPIENTRY
+glutPopWindow(void)
+{
+ IGNORE_IN_GAME_MODE();
+ __glutCurrentWindow->desiredStack = Above;
+ __glutCurrentWindow->desiredConfMask |= CWStackMode;
+ __glutPutOnWorkList(__glutCurrentWindow, GLUT_CONFIGURE_WORK);
+}
+
+void GLUTAPIENTRY
+glutPushWindow(void)
+{
+ IGNORE_IN_GAME_MODE();
+ __glutCurrentWindow->desiredStack = Below;
+ __glutCurrentWindow->desiredConfMask |= CWStackMode;
+ __glutPutOnWorkList(__glutCurrentWindow, GLUT_CONFIGURE_WORK);
+}
+
+void GLUTAPIENTRY
+glutIconifyWindow(void)
+{
+ IGNORE_IN_GAME_MODE();
+ assert(!__glutCurrentWindow->parent);
+ __glutCurrentWindow->desiredMapState = IconicState;
+ __glutPutOnWorkList(__glutCurrentWindow, GLUT_MAP_WORK);
+}
+
+void GLUTAPIENTRY
+glutShowWindow(void)
+{
+ IGNORE_IN_GAME_MODE();
+ __glutCurrentWindow->desiredMapState = NormalState;
+ __glutPutOnWorkList(__glutCurrentWindow, GLUT_MAP_WORK);
+}
+
+void GLUTAPIENTRY
+glutHideWindow(void)
+{
+ IGNORE_IN_GAME_MODE();
+ __glutCurrentWindow->desiredMapState = WithdrawnState;
+ __glutPutOnWorkList(__glutCurrentWindow, GLUT_MAP_WORK);
+}
+
+/* ENDCENTRY */
+ \ No newline at end of file
diff --git a/src/glut/os2/glutbitmap.h b/src/glut/os2/glutbitmap.h
new file mode 100644
index 00000000000..dc1b61af195
--- /dev/null
+++ b/src/glut/os2/glutbitmap.h
@@ -0,0 +1,32 @@
+#ifndef __glutbitmap_h__
+#define __glutbitmap_h__
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1998. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#define GLUT_NO_LIB_PRAGMA /* Avoid auto library linking when building
+ the GLUT library itself. */
+#include <GL/glut.h>
+
+typedef struct {
+ const GLsizei width;
+ const GLsizei height;
+ const GLfloat xorig;
+ const GLfloat yorig;
+ const GLfloat advance;
+ const GLubyte *bitmap;
+} BitmapCharRec, *BitmapCharPtr;
+
+typedef struct {
+ const char *name;
+ const int num_chars;
+ const int first;
+ const BitmapCharRec * const *ch;
+} BitmapFontRec, *BitmapFontPtr;
+
+typedef void *GLUTbitmapFont;
+
+#endif /* __glutbitmap_h__ */
diff --git a/src/glut/os2/glutos2.h b/src/glut/os2/glutos2.h
new file mode 100644
index 00000000000..533a78011e2
--- /dev/null
+++ b/src/glut/os2/glutos2.h
@@ -0,0 +1,36 @@
+#ifndef __glutos2_h__
+#define __glutos2_h__
+
+
+/* Win32 "equivalent" cursors - eventually, the X glyphs should be
+ converted to Win32 cursors -- then they will look the same */
+#define XC_arrow IDC_ARROW
+#define XC_top_left_arrow IDC_ARROW
+#define XC_hand1 IDC_SIZEALL
+#define XC_pirate IDC_NO
+#define XC_question_arrow IDC_HELP
+#define XC_exchange IDC_NO
+#define XC_spraycan IDC_SIZEALL
+#define XC_watch IDC_WAIT
+#define XC_xterm IDC_IBEAM
+#define XC_crosshair IDC_CROSS
+#define XC_sb_v_double_arrow IDC_SIZENS
+#define XC_sb_h_double_arrow IDC_SIZEWE
+#define XC_top_side IDC_UPARROW
+#define XC_bottom_side IDC_SIZENS
+#define XC_left_side IDC_SIZEWE
+#define XC_right_side IDC_SIZEWE
+#define XC_top_left_corner IDC_SIZENWSE
+#define XC_top_right_corner IDC_SIZENESW
+#define XC_bottom_right_corner IDC_SIZENWSE
+#define XC_bottom_left_corner IDC_SIZENESW
+
+#define XA_STRING 0
+
+/* Private routines from win32_util.c */
+extern int gettimeofday(struct timeval* tp, void* tzp);
+//extern void *__glutFont(void *font);
+extern int __glutGetTransparentPixel(Display *dpy, XVisualInfo *vinfo);
+extern void __glutAdjustCoords(Window parent, int *x, int *y, int *width, int *height);
+
+#endif /* __glutos2_h__ */
diff --git a/src/glut/os2/glutstroke.h b/src/glut/os2/glutstroke.h
new file mode 100644
index 00000000000..fbbc70d6cc0
--- /dev/null
+++ b/src/glut/os2/glutstroke.h
@@ -0,0 +1,42 @@
+#ifndef __glutstroke_h__
+#define __glutstroke_h__
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+#if defined(_WIN32)
+#pragma warning (disable:4244) /* disable bogus conversion warnings */
+#pragma warning (disable:4305) /* VC++ 5.0 version of above warning. */
+#endif
+
+typedef struct {
+ float x;
+ float y;
+} CoordRec, *CoordPtr;
+
+typedef struct {
+ int num_coords;
+ const CoordRec *coord;
+} StrokeRec, *StrokePtr;
+
+typedef struct {
+ int num_strokes;
+ const StrokeRec *stroke;
+ float center;
+ float right;
+} StrokeCharRec, *StrokeCharPtr;
+
+typedef struct {
+ const char *name;
+ int num_chars;
+ const StrokeCharRec *ch;
+ float top;
+ float bottom;
+} StrokeFontRec, *StrokeFontPtr;
+
+typedef void *GLUTstrokeFont;
+
+#endif /* __glutstroke_h__ */
diff --git a/src/glut/os2/layerutil.h b/src/glut/os2/layerutil.h
new file mode 100644
index 00000000000..3786c4d871c
--- /dev/null
+++ b/src/glut/os2/layerutil.h
@@ -0,0 +1,59 @@
+#ifndef __layerutil_h__
+#define __layerutil_h__
+
+/* Copyright (c) Mark J. Kilgard, 1993, 1994. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+/* Based on XLayerUtil.h: Revision: 1.3 */
+
+#ifdef __VMS
+#include <GL/vms_x_fix.h>
+#endif
+
+#if !defined(_WIN32) && !defined(__OS2__)
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xmd.h>
+#endif /* !_WIN32 */
+
+/* Transparent type values */
+/* None 0 */
+#define TransparentPixel 1
+#define TransparentMask 2
+
+/* layered visual info template flags */
+#define VisualLayerMask 0x200
+#define VisualTransparentType 0x400
+#define VisualTransparentValue 0x800
+#define VisualAllLayerMask 0xFFF
+
+/* layered visual info structure */
+typedef struct _XLayerVisualInfo {
+ XVisualInfo vinfo;
+ long layer;
+ long type;
+ unsigned long value;
+} XLayerVisualInfo;
+
+/* SERVER_OVERLAY_VISUALS property element */
+typedef struct _OverlayInfo {
+ /* Avoid 64-bit portability problems by being careful to use
+ longs due to the way XGetWindowProperty is specified. Note
+ that these parameters are passed as CARD32s over X
+ protocol. */
+ long overlay_visual;
+ long transparent_type;
+ long value;
+ long layer;
+} OverlayInfo;
+
+extern int __glutGetTransparentPixel(Display *, XVisualInfo *);
+extern XLayerVisualInfo *__glutXGetLayerVisualInfo(Display *,
+ long, XLayerVisualInfo *, int *);
+extern Status __glutXMatchLayerVisualInfo(Display *,
+ int, int, int, int, XLayerVisualInfo *);
+
+#endif /* __layerutil_h__ */
diff --git a/src/glut/os2/libGlut.DEF b/src/glut/os2/libGlut.DEF
new file mode 100644
index 00000000000..fb92544ab80
--- /dev/null
+++ b/src/glut/os2/libGlut.DEF
@@ -0,0 +1,94 @@
+
+;-----------------------------------------------------
+; def Module definition file for the DLL
+;-----------------------------------------------------
+
+LIBRARY libGlut INITINSTANCE TERMINSTANCE
+PROTMODE
+DATA MULTIPLE NONSHARED READWRITE LOADONCALL
+CODE LOADONCALL
+EXPORTS ; Names of exported functions and data
+
+;*********************************
+;MesaGLUT
+ glutCommandFunc @3001
+ glutCreateWindow @3002
+ glutCreateSubWindow @3003
+ glutDestroyWindow @3004
+ glutDisplayFunc @3005
+ glutEntryFunc @3006
+ glutExtensionSupported @3007
+ glutIdleFunc @3008
+ glutInit @3009
+ glutInitDisplayMode @3010
+ glutInitWindowPosition @3011
+ glutInitWindowSize @3012
+ glutMainLoop @3013
+ glutGet @3014
+ glutGetColor @3015
+ glutGetWindow @3016
+ glutKeyboardFunc @3017
+ glutMouseFunc @3018
+ glutSpecialFunc @3019
+ glutStrokeCharacter @3020
+ glutSetColor @3021
+ glutSetIconTitle @3022
+ glutSetWindow @3023
+ glutSetWindowTitle @3024
+
+ glutReshapeFunc @3025
+ glutReshapeWindow @3026
+
+
+ glutSwapBuffers @3027
+ glutPostRedisplay @3028
+ glutPositionWindow @3029
+ glutVisibilityFunc @3030
+ glutTimerFunc @3031
+ glutMotionFunc @3032
+
+ glutCreateMenu @3033
+ glutAttachMenu @3034
+ glutDestroyMenu @3035
+ glutAddMenuEntry @3036
+ glutPassiveMotionFunc @3037
+
+ glutSolidCone @3038
+ glutSolidCube @3039
+ glutSolidDodecahedron @3040
+ glutSolidOctahedron @3041
+ glutSolidIcosahedron @3042
+ glutSolidSphere @3043
+ glutSolidTeapot @3044
+ glutSolidTetrahedron @3045
+ glutSolidTorus @3046
+
+ glutWireCone @3047
+ glutWireCube @3048
+ glutWireDodecahedron @3049
+ glutWireIcosahedron @3050
+ glutWireOctahedron @3051
+ glutWireSphere @3052
+ glutWireTetrahedron @3053
+ glutWireTorus @3054
+ glutWireTeapot @3055
+
+;GL_GLEXT_PROTOTYPES
+ glutBitmapCharacter @3101
+ glutBitmap9By15 @3102
+ glutBitmapHelvetica10 @3103
+ glutBitmapHelvetica12 @3104
+ glutBitmapHelvetica18 @3105
+ glutBitmapTimesRoman24 @3106
+ glutStrokeRoman @3107
+ glutBitmap8By13 @3108
+
+;Global constants
+; hab @12001
+; /* PM anchor block handle */
+; hpsCurrent @12002
+ XHDC @12004
+ XHWND @12005
+
+
+
diff --git a/src/glut/os2/os2_glx.cpp b/src/glut/os2/os2_glx.cpp
new file mode 100644
index 00000000000..ca345ea05b5
--- /dev/null
+++ b/src/glut/os2/os2_glx.cpp
@@ -0,0 +1,146 @@
+/* os2_glx.c */
+
+#include <stdio.h>
+#include <string.h>
+#include <malloc.h>
+#include "gl/gl.h"
+#include "WarpGL.h"
+#include "GL/os2mesa.h"
+
+#define POKA 0
+/* global current HDC */
+
+XVisualInfo *wglDescribePixelFormat(int iPixelFormat);
+
+extern HDC XHDC;
+extern HWND XHWND;
+//extern HPS hpsCurrent;
+extern HAB hab; /* PM anchor block handle */
+
+GLXContext
+glXCreateContext(HPS hps, XVisualInfo * visinfo,
+ GLXContext share, Bool direct)
+{
+ /* KLUDGE: GLX really expects a display pointer to be passed
+ in as the first parameter, but Win32 needs an HDC instead,
+ so BE SURE that the global XHDC is set before calling this
+ routine. */
+ HGLRC context;
+
+ context = wglCreateContext(XHDC,hps,hab);
+
+
+ /* Since direct rendering is implicit, the direct flag is
+ ignored. */
+
+ return context;
+}
+
+
+int
+glXGetConfig(XVisualInfo * visual, int attrib, int *value)
+{
+ if (!visual)
+ return GLX_BAD_VISUAL;
+
+ switch (attrib) {
+ case GLX_USE_GL:
+ if (visual->dwFlags & (PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW)) {
+ /* XXX Brad's Matrix Millenium II has problems creating
+ color index windows in 24-bit mode (lead to GDI crash)
+ and 32-bit mode (lead to black window). The cColorBits
+ filed of the PIXELFORMATDESCRIPTOR returned claims to
+ have 24 and 32 bits respectively of color indices. 2^24
+ and 2^32 are ridiculously huge writable colormaps.
+ Assume that if we get back a color index
+ PIXELFORMATDESCRIPTOR with 24 or more bits, the
+ PIXELFORMATDESCRIPTOR doesn't really work and skip it.
+ -mjk */
+ if (visual->iPixelType == PFD_TYPE_COLORINDEX
+ && visual->cColorBits >= 24) {
+ *value = 0;
+ } else {
+ *value = 1;
+ }
+ } else {
+ *value = 0;
+ }
+ break;
+ case GLX_BUFFER_SIZE:
+ /* KLUDGE: if we're RGBA, return the number of bits/pixel,
+ otherwise, return 8 (we guessed at 256 colors in CI
+ mode). */
+ if (visual->iPixelType == PFD_TYPE_RGBA)
+ *value = visual->cColorBits;
+ else
+ *value = 8;
+ break;
+ case GLX_LEVEL:
+ /* The bReserved flag of the pfd contains the
+ overlay/underlay info. */
+ *value = visual->bReserved;
+ break;
+ case GLX_RGBA:
+ *value = visual->iPixelType == PFD_TYPE_RGBA;
+ break;
+ case GLX_DOUBLEBUFFER:
+ *value = visual->dwFlags & PFD_DOUBLEBUFFER;
+ break;
+ case GLX_STEREO:
+ *value = visual->dwFlags & PFD_STEREO;
+ break;
+ case GLX_AUX_BUFFERS:
+ *value = visual->cAuxBuffers;
+ break;
+ case GLX_RED_SIZE:
+ *value = visual->cRedBits;
+ break;
+ case GLX_GREEN_SIZE:
+ *value = visual->cGreenBits;
+ break;
+ case GLX_BLUE_SIZE:
+ *value = visual->cBlueBits;
+ break;
+ case GLX_ALPHA_SIZE:
+ *value = visual->cAlphaBits;
+ break;
+ case GLX_DEPTH_SIZE:
+ *value = visual->cDepthBits;
+ break;
+ case GLX_STENCIL_SIZE:
+ *value = visual->cStencilBits;
+ break;
+ case GLX_ACCUM_RED_SIZE:
+ *value = visual->cAccumRedBits;
+ break;
+ case GLX_ACCUM_GREEN_SIZE:
+ *value = visual->cAccumGreenBits;
+ break;
+ case GLX_ACCUM_BLUE_SIZE:
+ *value = visual->cAccumBlueBits;
+ break;
+ case GLX_ACCUM_ALPHA_SIZE:
+ *value = visual->cAccumAlphaBits;
+ break;
+#if POKA == 100
+#endif /* POKA == 100 */
+ default:
+ return GLX_BAD_ATTRIB;
+ }
+ return 0;
+}
+
+
+XVisualInfo * glXChooseVisual(int mode)
+{ int imode = 2;
+ if(mode & GLUT_DOUBLE)
+ imode = 1;
+ return
+ wglDescribePixelFormat(imode);
+}
+
+
+#if POKA
+#endif /* POKA */
+
+ \ No newline at end of file
diff --git a/src/glut/os2/os2_menu.cpp b/src/glut/os2/os2_menu.cpp
new file mode 100644
index 00000000000..4eef308e5a9
--- /dev/null
+++ b/src/glut/os2/os2_menu.cpp
@@ -0,0 +1,533 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1997, 1998. */
+/* Copyright (c) Nate Robins, 1997. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+/* This file completely re-implements glut_menu.c and glut_menu2.c
+ for Win32. Note that neither glut_menu.c nor glut_menu2.c are
+ compiled into Win32 GLUT. */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include <assert.h>
+
+#include "glutint.h"
+
+void (GLUTCALLBACK *__glutMenuStatusFunc) (int, int, int);
+//GLUTmenu *__glutMappedMenu;
+//GLUTwindow *__glutMenuWindow;
+GLUTmenuItem *__glutItemSelected;
+unsigned __glutMenuButton;
+
+static GLUTmenu **menuList = NULL;
+static int menuListSize = 0;
+static UINT uniqueMenuHandler = 1;
+
+/* DEPRICATED, use glutMenuStatusFunc instead. */
+void GLUTAPIENTRY
+glutMenuStateFunc(GLUTmenuStateCB menuStateFunc)
+{
+ __glutMenuStatusFunc = (GLUTmenuStatusCB) menuStateFunc;
+}
+
+void GLUTAPIENTRY
+glutMenuStatusFunc(GLUTmenuStatusCB menuStatusFunc)
+{
+ __glutMenuStatusFunc = menuStatusFunc;
+}
+
+void
+__glutSetMenu(GLUTmenu * menu)
+{
+ __glutCurrentMenu = menu;
+}
+
+static void
+unmapMenu(GLUTmenu * menu)
+{
+ if (menu->cascade) {
+ unmapMenu(menu->cascade);
+ menu->cascade = NULL;
+ }
+ menu->anchor = NULL;
+ menu->highlighted = NULL;
+}
+
+void
+__glutFinishMenu(Window win, int x, int y)
+{
+
+ unmapMenu(__glutMappedMenu);
+
+ /* XXX Put in a GdiFlush just in case. Probably unnecessary. -mjk */
+// GdiFlush();
+
+ if (__glutMenuStatusFunc) {
+ __glutSetWindow(__glutMenuWindow);
+ __glutSetMenu(__glutMappedMenu);
+
+ /* Setting __glutMappedMenu to NULL permits operations that
+ change menus or destroy the menu window again. */
+ __glutMappedMenu = NULL;
+
+ __glutMenuStatusFunc(GLUT_MENU_NOT_IN_USE, x, y);
+ }
+ /* Setting __glutMappedMenu to NULL permits operations that
+ change menus or destroy the menu window again. */
+ __glutMappedMenu = NULL;
+
+ /* If an item is selected and it is not a submenu trigger,
+ generate menu callback. */
+ if (__glutItemSelected && !__glutItemSelected->isTrigger) {
+ __glutSetWindow(__glutMenuWindow);
+ /* When menu callback is triggered, current menu should be
+ set to the callback menu. */
+ __glutSetMenu(__glutItemSelected->menu);
+ __glutItemSelected->menu->select(__glutItemSelected->value);
+ }
+ __glutMenuWindow = NULL;
+}
+
+static void
+mapMenu(GLUTmenu * menu, int x, int y)
+{
+//todo
+// TrackPopupMenu((HMENU) menu->win, TPM_LEFTALIGN |
+// (__glutMenuButton == TPM_RIGHTBUTTON) ? TPM_RIGHTBUTTON : TPM_LEFTBUTTON,
+// x, y, 0, __glutCurrentWindow->win, NULL);
+}
+
+void
+__glutStartMenu(GLUTmenu * menu, GLUTwindow * window,
+ int x, int y, int x_win, int y_win)
+{
+ assert(__glutMappedMenu == NULL);
+ __glutMappedMenu = menu;
+ __glutMenuWindow = window;
+ __glutItemSelected = NULL;
+ if (__glutMenuStatusFunc) {
+ __glutSetMenu(menu);
+ __glutSetWindow(window);
+ __glutMenuStatusFunc(GLUT_MENU_IN_USE, x_win, y_win);
+ }
+ mapMenu(menu, x, y);
+}
+
+GLUTmenuItem *
+__glutGetUniqueMenuItem(GLUTmenu * menu, UINT unique)
+{
+ GLUTmenuItem *item;
+ int i;
+
+ i = menu->num;
+ item = menu->list;
+ while (item) {
+ if (item->unique == unique) {
+ return item;
+ }
+ if (item->isTrigger) {
+ GLUTmenuItem *subitem;
+ subitem = __glutGetUniqueMenuItem(menuList[item->value], unique);
+ if (subitem) {
+ return subitem;
+ }
+ }
+ i--;
+ item = item->next;
+ }
+ return NULL;
+}
+
+GLUTmenuItem *
+__glutGetMenuItem(GLUTmenu * menu, Window win, int *which)
+{
+ GLUTmenuItem *item;
+ int i;
+
+ i = menu->num;
+ item = menu->list;
+ while (item) {
+ if (item->win == win) {
+ *which = i;
+ return item;
+ }
+ if (item->isTrigger) {
+ GLUTmenuItem *subitem;
+
+ subitem = __glutGetMenuItem(menuList[item->value],
+ win, which);
+ if (subitem) {
+ return subitem;
+ }
+ }
+ i--;
+ item = item->next;
+ }
+ return NULL;
+}
+
+GLUTmenu *
+__glutGetMenu(Window win)
+{
+ GLUTmenu *menu;
+
+ menu = __glutMappedMenu;
+ while (menu) {
+ if (win == menu->win) {
+ return menu;
+ }
+ menu = menu->cascade;
+ }
+ return NULL;
+}
+
+GLUTmenu *
+__glutGetMenuByNum(int menunum)
+{
+ if (menunum < 1 || menunum > menuListSize) {
+ return NULL;
+ }
+ return menuList[menunum - 1];
+}
+
+static int
+getUnusedMenuSlot(void)
+{
+ int i;
+
+ /* Look for allocated, unused slot. */
+ for (i = 0; i < menuListSize; i++) {
+ if (!menuList[i]) {
+ return i;
+ }
+ }
+ /* Allocate a new slot. */
+ menuListSize++;
+ if (menuList) {
+ menuList = (GLUTmenu **)
+ realloc(menuList, menuListSize * sizeof(GLUTmenu *));
+ } else {
+ /* XXX Some realloc's do not correctly perform a malloc
+ when asked to perform a realloc on a NULL pointer,
+ though the ANSI C library spec requires this. */
+ menuList = (GLUTmenu **) malloc(sizeof(GLUTmenu *));
+ }
+ if (!menuList) {
+ __glutFatalError("out of memory.");
+ }
+ menuList[menuListSize - 1] = NULL;
+ return menuListSize - 1;
+}
+
+static void
+menuModificationError(void)
+{
+ /* XXX Remove the warning after GLUT 3.0. */
+ __glutWarning("The following is a new check for GLUT 3.0; update your code.");
+ __glutFatalError("menu manipulation not allowed while menus in use.");
+}
+
+int GLUTAPIENTRY
+glutCreateMenu(GLUTselectCB selectFunc)
+{
+ GLUTmenu *menu;
+ int menuid;
+
+ if (__glutMappedMenu) {
+ menuModificationError();
+ }
+ menuid = getUnusedMenuSlot();
+ menu = (GLUTmenu *) malloc(sizeof(GLUTmenu));
+ if (!menu) {
+ __glutFatalError("out of memory.");
+ }
+ menu->id = menuid;
+ menu->num = 0;
+ menu->submenus = 0;
+ menu->select = selectFunc;
+ menu->list = NULL;
+ menu->cascade = NULL;
+ menu->highlighted = NULL;
+ menu->anchor = NULL;
+//todo
+// menu->win = (HWND) CreatePopupMenu();
+ menuList[menuid] = menu;
+ __glutSetMenu(menu);
+ return menuid + 1;
+}
+
+
+void GLUTAPIENTRY
+glutDestroyMenu(int menunum)
+{
+ GLUTmenu *menu = __glutGetMenuByNum(menunum);
+ GLUTmenuItem *item, *next;
+
+ if (__glutMappedMenu) {
+ menuModificationError();
+ }
+ assert(menu->id == menunum - 1);
+//todo DestroyMenu( (HMENU) menu->win);
+ menuList[menunum - 1] = NULL;
+ /* free all menu entries */
+ item = menu->list;
+ while (item) {
+ assert(item->menu == menu);
+ next = item->next;
+ free(item->label);
+ free(item);
+ item = next;
+ }
+ if (__glutCurrentMenu == menu) {
+ __glutCurrentMenu = NULL;
+ }
+ free(menu);
+}
+
+int GLUTAPIENTRY
+glutGetMenu(void)
+{
+ if (__glutCurrentMenu) {
+ return __glutCurrentMenu->id + 1;
+ } else {
+ return 0;
+ }
+}
+
+void GLUTAPIENTRY
+glutSetMenu(int menuid)
+{
+ GLUTmenu *menu;
+
+ if (menuid < 1 || menuid > menuListSize) {
+ __glutWarning("glutSetMenu attempted on bogus menu.");
+ return;
+ }
+ menu = menuList[menuid - 1];
+ if (!menu) {
+ __glutWarning("glutSetMenu attempted on bogus menu.");
+ return;
+ }
+ __glutSetMenu(menu);
+}
+
+static void
+setMenuItem(GLUTmenuItem * item, const char *label,
+ int value, Bool isTrigger)
+{
+ GLUTmenu *menu;
+
+ menu = item->menu;
+ item->label = __glutStrdup(label);
+ if (!item->label) {
+ __glutFatalError("out of memory.");
+ }
+ item->isTrigger = isTrigger;
+ item->len = (int) strlen(label);
+ item->value = value;
+ item->unique = uniqueMenuHandler++;
+//todo
+// if (isTrigger) {
+// AppendMenu((HMENU) menu->win, MF_POPUP, (UINT)item->win, label);
+// } else {
+// AppendMenu((HMENU) menu->win, MF_STRING, item->unique, label);
+// }
+}
+
+void GLUTAPIENTRY
+glutAddMenuEntry(const char *label, int value)
+{
+ GLUTmenuItem *entry;
+
+ if (__glutMappedMenu) {
+ menuModificationError();
+ }
+ entry = (GLUTmenuItem *) malloc(sizeof(GLUTmenuItem));
+ if (!entry) {
+ __glutFatalError("out of memory.");
+ }
+ entry->menu = __glutCurrentMenu;
+ setMenuItem(entry, label, value, FALSE);
+ __glutCurrentMenu->num++;
+ entry->next = __glutCurrentMenu->list;
+ __glutCurrentMenu->list = entry;
+}
+
+void GLUTAPIENTRY
+glutAddSubMenu(const char *label, int menu)
+{
+ GLUTmenuItem *submenu;
+ GLUTmenu *popupmenu;
+
+ if (__glutMappedMenu) {
+ menuModificationError();
+ }
+ submenu = (GLUTmenuItem *) malloc(sizeof(GLUTmenuItem));
+ if (!submenu) {
+ __glutFatalError("out of memory.");
+ }
+ __glutCurrentMenu->submenus++;
+ submenu->menu = __glutCurrentMenu;
+ popupmenu = __glutGetMenuByNum(menu);
+ if (popupmenu) {
+ submenu->win = popupmenu->win;
+ }
+ setMenuItem(submenu, label, /* base 0 */ menu - 1, TRUE);
+ __glutCurrentMenu->num++;
+ submenu->next = __glutCurrentMenu->list;
+ __glutCurrentMenu->list = submenu;
+}
+
+void GLUTAPIENTRY
+glutChangeToMenuEntry(int num, const char *label, int value)
+{
+ GLUTmenuItem *item;
+ int i;
+
+ if (__glutMappedMenu) {
+ menuModificationError();
+ }
+ i = __glutCurrentMenu->num;
+ item = __glutCurrentMenu->list;
+ while (item) {
+ if (i == num) {
+ if (item->isTrigger) {
+ /* If changing a submenu trigger to a menu entry, we
+ need to account for submenus. */
+ item->menu->submenus--;
+ /* Nuke the Win32 menu. */
+//todo
+// DestroyMenu((HMENU) item->win);
+ }
+ free(item->label);
+
+ item->label = strdup(label);
+ if (!item->label)
+ __glutFatalError("out of memory");
+ item->isTrigger = FALSE;
+ item->len = (int) strlen(label);
+ item->value = value;
+ item->unique = uniqueMenuHandler++;
+//todo
+// ModifyMenu((HMENU) __glutCurrentMenu->win, (UINT) i - 1,
+// MF_BYPOSITION | MFT_STRING, item->unique, label);
+
+ return;
+ }
+ i--;
+ item = item->next;
+ }
+ __glutWarning("Current menu has no %d item.", num);
+}
+
+void GLUTAPIENTRY
+glutChangeToSubMenu(int num, const char *label, int menu)
+{
+ GLUTmenu *popupmenu;
+ GLUTmenuItem *item;
+ int i;
+
+ if (__glutMappedMenu) {
+ menuModificationError();
+ }
+ i = __glutCurrentMenu->num;
+ item = __glutCurrentMenu->list;
+ while (item) {
+ if (i == num) {
+ if (!item->isTrigger) {
+ /* If changing a menu entry to as submenu trigger, we
+ need to account for submenus. */
+ item->menu->submenus++;
+//todo
+// item->win = (HWND) CreatePopupMenu();
+ }
+ free(item->label);
+
+ item->label = strdup(label);
+ if (!item->label)
+ __glutFatalError("out of memory");
+ item->isTrigger = TRUE;
+ item->len = (int) strlen(label);
+ item->value = menu - 1;
+ item->unique = uniqueMenuHandler++;
+ popupmenu = __glutGetMenuByNum(menu);
+ if (popupmenu)
+ item->win = popupmenu->win;
+//todo
+// ModifyMenu((HMENU) __glutCurrentMenu->win, (UINT) i - 1,
+// MF_BYPOSITION | MF_POPUP, (UINT) item->win, label);
+ return;
+ }
+ i--;
+ item = item->next;
+ }
+ __glutWarning("Current menu has no %d item.", num);
+}
+
+void GLUTAPIENTRY
+glutRemoveMenuItem(int num)
+{
+ GLUTmenuItem *item, **prev;
+ int i;
+
+ if (__glutMappedMenu) {
+ menuModificationError();
+ }
+ i = __glutCurrentMenu->num;
+ prev = &__glutCurrentMenu->list;
+ item = __glutCurrentMenu->list;
+ while (item) {
+ if (i == num) {
+ /* Found the menu item in list to remove. */
+ __glutCurrentMenu->num--;
+
+ /* Patch up menu's item list. */
+ *prev = item->next;
+//todo
+// RemoveMenu((HMENU) __glutCurrentMenu->win, (UINT) i - 1, MF_BYPOSITION);
+
+ free(item->label);
+ free(item);
+ return;
+ }
+ i--;
+ prev = &item->next;
+ item = item->next;
+ }
+ __glutWarning("Current menu has no %d item.", num);
+}
+
+void GLUTAPIENTRY
+glutAttachMenu(int button)
+{
+ if (__glutCurrentWindow == __glutGameModeWindow) {
+ __glutWarning("cannot attach menus in game mode.");
+ return;
+ }
+ if (__glutMappedMenu) {
+ menuModificationError();
+ }
+ if (__glutCurrentWindow->menu[button] < 1) {
+ __glutCurrentWindow->buttonUses++;
+ }
+ __glutCurrentWindow->menu[button] = __glutCurrentMenu->id + 1;
+}
+
+void GLUTAPIENTRY
+glutDetachMenu(int button)
+{
+ if (__glutMappedMenu) {
+ menuModificationError();
+ }
+ if (__glutCurrentWindow->menu[button] > 0) {
+ __glutCurrentWindow->buttonUses--;
+ __glutCurrentWindow->menu[button] = 0;
+ }
+}
+
+ \ No newline at end of file
diff --git a/src/glut/os2/os2_winproc.cpp b/src/glut/os2/os2_winproc.cpp
new file mode 100644
index 00000000000..e2d4ba9d550
--- /dev/null
+++ b/src/glut/os2/os2_winproc.cpp
@@ -0,0 +1,1297 @@
+/* os2_winproc.c */
+
+
+#define INCL_DEV
+#include "WarpGL.h"
+#include "GL/os2mesa.h"
+
+
+#define _MEERROR_H_
+#include <mmioos2.h> /* It is from MMPM toolkit */
+#include <dive.h>
+#include <fourcc.h>
+
+
+#include "os2mesadef.h"
+#include "glutint.h"
+
+
+#define POKA 0
+
+#if POKA
+
+extern unsigned __glutMenuButton;
+extern GLUTidleCB __glutIdleFunc;
+extern GLUTtimer *__glutTimerList;
+extern void handleTimeouts(void);
+extern GLUTmenuItem *__glutGetUniqueMenuItem(GLUTmenu * menu, int unique);
+static HMENU __glutHMenu;
+
+#endif
+
+extern void _mesa_ResizeBuffersMESA( void );
+
+
+MRESULT EXPENTRY GlutWindowProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 );
+MRESULT EXPENTRY GlutWindowChildProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 );
+void updateWindowState(GLUTwindow *window, int visState);
+
+volatile extern HAB hab; /* PM anchor block handle */
+volatile extern HPS hpsCurrent;
+
+RECTL rCtls[52];
+ULONG ulNumRcls;
+
+MRESULT EXPENTRY GlutWindowChildProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
+{ MRESULT rc;
+ rc = GlutWindowProc(hwnd, msg, mp1, mp2 );
+ return rc;
+}
+
+MRESULT EXPENTRY GlutWindowProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
+{
+ HPS hps = NULLHANDLE; /* presentation space handle */
+ GLUTwindow* window; /* GLUT window associated with message. */
+ GLUTmenu* menu; /* GLUT menu associated with message. */
+ RECTL rclClient;
+ POINTL point;
+ int button = -1,rc,key;
+
+
+/* Process the message. */
+
+ switch( msg )
+ {
+ case WM_CREATE:
+ {
+ SIZEL sizl = { 0L, 0L };
+ LONG *alCaps;
+ HDC hdc;
+
+ /*+-----------------------------------------------------------------+*/
+ /*| The client window is being created. Create the semaphore to |*/
+ /*| control access to the presentation space. Then create the |*/
+ /*| thread that will draw the lines. |*/
+ /*+-----------------------------------------------------------------+*/
+ // DosCreateMutexSem( (PSZ)NULL, &hmtxPS, 0UL, FALSE );
+
+ hdc = WinOpenWindowDC(hwnd);
+
+ /*+-----------------------------------------------------------------+*/
+ /*| Create a non-cached presentation space. We will not release |*/
+ /*| this PS, as we will be Selecting a Palette to this PS and then |*/
+ /*| animating the palette. Upon releasing a PS the palette is no |*/
+ /*| longer selected for obvious reasons. |*/
+ /*+-----------------------------------------------------------------+*/
+ hpsCurrent = GpiCreatePS( hab,
+ hdc,
+ &sizl,
+ PU_PELS | GPIF_DEFAULT |
+ GPIT_MICRO | GPIA_ASSOC );
+// DevQueryCaps( hdc, lStart, lCount, alCaps );
+// fPaletteCaps = alCaps[CAPS_ADDITIONAL_GRAPHICS] & CAPS_PALETTE_MANAGER;
+// PaletteInit(3);
+ /* пеpевод hpsBuffer в pежим RGB color table */
+
+ GpiCreateLogColorTable(hpsCurrent,0 ,LCOLF_RGB,0,0,NULL);
+ GpiSetPattern(hpsCurrent,PATSYM_SOLID);
+ GpiSetPatternSet(hpsCurrent,LCID_DEFAULT);
+
+ }
+ break;
+
+ return 0;
+ case WM_CLOSE:
+ WinPostMsg( hwnd, WM_QUIT, NULL, NULL );
+
+ return 0;
+
+ case WM_PAINT:
+ window = __glutGetWindow(hwnd);
+ if (window)
+ {
+ PWMC ctx;
+// hps = WinBeginPaint(hwnd,NULLHANDLE,&rclClient);
+ hps = WinBeginPaint(hwnd,NULLHANDLE,&rclClient);
+ // blit Dive buffer to screen.
+
+ {
+ SWP swp; // Window position
+ POINTL pointl; // Point to offset from Desktop
+
+ // Convert the point to offset from desktop lower left.
+ pointl.x = 0;
+ pointl.y = 0;
+ WinMapWindowPoints ( hwnd, HWND_DESKTOP, &pointl, 1 );
+
+
+// ctx = window->ctx;
+// ctx->xDiveScr = pointl.x;
+// ctx->yDiveScr = pointl.y;
+ }
+// rc = DiveBlitImage (ctx->hDive,
+// ctx->ulDiveBufferNumber,
+// DIVE_BUFFER_SCREEN );
+//
+
+ if (window->win == hwnd) {
+ __glutPostRedisplay(window, GLUT_REPAIR_WORK);
+ } else if (window->overlay && window->overlay->win == hwnd) {
+ __glutPostRedisplay(window, GLUT_OVERLAY_REPAIR_WORK);
+ }
+ WinEndPaint(hps);
+ } else {
+
+ hps = WinBeginPaint(hwnd,NULLHANDLE,&rclClient);
+ WinFillRect(hps, &rclClient, CLR_WHITE);
+ WinEndPaint(hps);
+ }
+ break;
+
+ case WM_VRNDISABLED:
+
+// pwinData->fDataInProcess = TRUE;
+// DiveSetupBlitter ( pwinData->hDive, 0 );
+// pwinData->fVrnDisabled = TRUE;
+ break;
+
+ case WM_VRNENABLED:
+ { HRGN hrgn; /* Region handle */
+ RGNRECT rgnCtl; /* Processing control structure */
+// RECTL rCtls[52];
+// ULONG ulNumRcls;
+
+// pwinData->fDataInProcess = TRUE;
+ hps = WinGetPS ( hwnd );
+ if ( !hps )
+ break;
+ hrgn = GpiCreateRegion ( hps, 0L, NULL );
+ if ( hrgn )
+ { /* NOTE: If mp1 is zero, then this was just a move message.
+ ** Illustrate the visible region on a WM_VRNENABLE.
+ */
+ WinQueryVisibleRegion ( hwnd, hrgn );
+ rgnCtl.ircStart = 0;
+ rgnCtl.crc = 50;
+ rgnCtl.ulDirection = 1;
+
+ /* Get the all ORed rectangles */
+ if ( GpiQueryRegionRects ( hps, hrgn, NULL,
+ &rgnCtl, rCtls) )
+ {
+ ulNumRcls = rgnCtl.crcReturned;
+
+ /* Now find the window position and size, relative to parent.
+ */
+// WinQueryWindowPos ( pwinData->hwndClient, &pwinData->swp );
+
+// rcl.xLeft = 0;
+// rcl.yBottom = 0;
+
+ /* Convert the point to offset from desktop lower left.
+ */
+// pointl.x = pwinData->swp.x;
+// pointl.y = pwinData->swp.y;
+
+// WinMapWindowPoints ( pwinData->hwndFrame,
+// HWND_DESKTOP, &pointl, 1 );
+
+// pwinData->cxWindowPos = pointl.x;
+// pwinData->cyWindowPos = pointl.y;
+
+ }
+ GpiDestroyRegion( hps, hrgn );
+ }
+ WinReleasePS( hps );
+
+ }
+ break;
+
+ case WM_SIZE:
+ window = __glutGetWindow(hwnd);
+ if (window)
+ { int width,height;
+ width = SHORT1FROMMP(mp2);
+ height = SHORT2FROMMP(mp2);
+ if (width != window->width || height != window->height) {
+#if 0 /* Win32 GLUT does not support overlays for now. */
+ if (window->overlay) {
+ XResizeWindow(__glutDisplay, window->overlay->win, width, height);
+ }
+#endif
+ window->width = width;
+ window->height = height;
+ __glutSetWindow(window);
+ if(width <= 0 || height <= 0)
+ break;
+ _mesa_ResizeBuffersMESA();
+
+ /* Do not execute OpenGL out of sequence with respect
+ to the SetWindowPos request! */
+ window->reshape(width, height);
+ window->forceReshape = FALSE;
+ /* A reshape should be considered like posting a
+ repair request. */
+ __glutPostRedisplay(window, GLUT_REPAIR_WORK);
+ }
+ }
+ return 0;
+ case WM_SHOW:
+ window = __glutGetWindow(hwnd);
+ if (window) {
+ int visState;
+ visState = SHORT1FROMMP( mp1 );
+ updateWindowState(window, visState);
+ }
+ return 0;
+
+ case WM_ACTIVATE:
+ window = __glutGetWindow(hwnd);
+// /* Make sure we re-select the correct palette if needed. */
+// if (LOWORD(wParam)) {
+// PostMessage(hwnd, WM_PALETTECHANGED, 0, 0);
+// }
+ if (window) {
+ int visState;
+ visState = SHORT1FROMMP( mp1 );
+ updateWindowState(window, visState);
+ }
+ return 0;
+
+ case WM_CHAR:
+ { USHORT fsflags;
+ window = __glutGetWindow(hwnd);
+ if (!window) {
+ break;
+ }
+ fsflags = SHORT1FROMMP(mp1);
+/* ?? */
+ if((fsflags & KC_KEYUP) ) /* игноpиpуем отжатие кнопки, pеагиpуем только на нажатие */
+ break;
+///////////////////////////////////////////////////
+ if(!(fsflags & KC_CHAR) )
+ {
+ if (!(fsflags & KC_VIRTUALKEY))
+ break;
+ key = 0;
+ /* Get the virtual key from mp2. */
+ switch (SHORT2FROMMP(mp2))
+ {
+/* directional keys */
+ case VK_LEFT: key = GLUT_KEY_LEFT; break;
+ case VK_UP: key = GLUT_KEY_UP; break;
+ case VK_RIGHT: key = GLUT_KEY_RIGHT; break;
+ case VK_DOWN: key = GLUT_KEY_DOWN; break;
+
+ case VK_PAGEUP: key = GLUT_KEY_PAGE_UP; break;
+ case VK_PAGEDOWN:key = GLUT_KEY_PAGE_DOWN; break;
+ case VK_HOME: key = GLUT_KEY_HOME;break;
+ case VK_END: key = GLUT_KEY_END; break;
+ case VK_INSERT: key = GLUT_KEY_INSERT; break;
+
+/* function keys */
+ case VK_F1 : key = GLUT_KEY_F1; break;
+ case VK_F2 : key = GLUT_KEY_F2; break;
+ case VK_F3 : key = GLUT_KEY_F3; break;
+ case VK_F4 : key = GLUT_KEY_F4; break;
+ case VK_F5 : key = GLUT_KEY_F5; break;
+ case VK_F6 : key = GLUT_KEY_F6; break;
+ case VK_F7 : key = GLUT_KEY_F7; break;
+ case VK_F8 : key = GLUT_KEY_F8; break;
+ case VK_F9 : key = GLUT_KEY_F9; break;
+ case VK_F10: key = GLUT_KEY_F10;break;
+ case VK_F11: key = GLUT_KEY_F11; break;
+ case VK_F12: key = GLUT_KEY_F12; break;
+ case VK_ESC: key = -1; break; /* Character codes */
+ case VK_SPACE: key = -1; break;
+ case VK_TAB: key = -1; break;
+ }
+ if(!key)
+ { break; /* Key Not implemented */
+ }
+ if(key > 0)
+ { if (!window->special) /* не установлено обработчика */
+ break;
+
+ WinQueryPointerPos(HWND_DESKTOP,&point);
+ ScreenToClient(window->win, &point);
+ __glutSetWindow(window);
+ __glutModifierMask = 0;
+ if(WinGetKeyState(HWND_DESKTOP,VK_SHIFT) & 0x8000) /* high order bit is on */
+ __glutModifierMask |= ShiftMask;
+ if(WinGetKeyState(HWND_DESKTOP,VK_CTRL) & 0x8000)
+ __glutModifierMask |= ControlMask;
+ if(WinGetKeyState(HWND_DESKTOP,VK_MENU) & 0x8000)
+ __glutModifierMask |= Mod1Mask;
+ window->special(key, point.x, point.y);
+ __glutModifierMask = (unsigned int) ~0;
+ return 0;
+ }
+
+ }
+/////////////////////////////////////////////////////
+ /* If we are ignoring auto repeated key strokes for the window, bail. */
+ if (window->ignoreKeyRepeat && (CHAR3FROMMP(mp1)) )
+ break;
+ if(!((unsigned char)SHORT1FROMMP(mp2)) ) /* игноpиpуем несимвольные коды */
+ break;
+ if (window->keyboard) {
+ WinQueryPointerPos(HWND_DESKTOP,&point);
+
+ ScreenToClient(window->win, &point);
+ __glutSetWindow(window);
+ __glutModifierMask = 0;
+ if(WinGetKeyState(HWND_DESKTOP,VK_SHIFT) & 0x8000) /* high order bit is on */
+ __glutModifierMask |= ShiftMask;
+ if(WinGetKeyState(HWND_DESKTOP,VK_CTRL) & 0x8000)
+ __glutModifierMask |= ControlMask;
+ if(WinGetKeyState(HWND_DESKTOP,VK_MENU) & 0x8000)
+ __glutModifierMask |= Mod1Mask;
+ window->keyboard((unsigned char)SHORT1FROMMP(mp2), point.x, point.y);
+ __glutModifierMask = (unsigned int) ~0;
+ }
+ return 0;
+ } /* endof case WM_CHAR: */
+////////////////////////////////////////////////
+ case WM_BUTTON1DOWN:
+ button = GLUT_LEFT_BUTTON;
+ case WM_BUTTON3DOWN:
+ if (button < 0)
+ button = GLUT_MIDDLE_BUTTON;
+ case WM_BUTTON2DOWN:
+ if (button < 0)
+ button = GLUT_RIGHT_BUTTON;
+ { POINTS psh;
+ psh = *((POINTS *)&mp1);
+ point.x = psh.x;
+ point.y = psh.y;
+ }
+ /* finish the menu if we get a button down message (user must have
+ cancelled the menu). */
+ if (__glutMappedMenu) {
+ /* TODO: take this out once the menu on middle mouse stuff works
+ properly. */
+ if (button == GLUT_MIDDLE_BUTTON)
+ return 0;
+ /* get current mouse pointer position */
+// WinQueryPointerPos(HWND_DESKTOP,&point);
+ /* map from desktop to client window */
+// WinMapWindowPoints(HWND_DESKTOP, hwnd, &point, 1);
+ __glutItemSelected = NULL;
+ __glutFinishMenu(hwnd, point.x, point.y);
+ return 0;
+ }
+ window = __glutGetWindow(hwnd);
+ if (window) {
+ window->buttonDownState = button+1;
+ menu = __glutGetMenuByNum(window->menu[button]);
+ if (menu) {
+//todo
+// __glutMenuButton = button == GLUT_RIGHT_BUTTON ? TPM_RIGHTBUTTON :
+// button == GLUT_LEFT_BUTTON ? TPM_LEFTBUTTON :
+// 0x0001;
+// __glutStartMenu(menu, window, point.x, point.y, x, y);
+ } else if (window->mouse) {
+
+ __glutSetWindow(window);
+ __glutModifierMask = 0;
+ if (WinGetKeyState(HWND_DESKTOP,VK_SHIFT) & 0x8000) /* < 0 = high order bit is on. */
+ __glutModifierMask |= ShiftMask;
+ if (WinGetKeyState(HWND_DESKTOP,VK_CTRL) & 0x8000)
+ __glutModifierMask |= ControlMask;
+ if (WinGetKeyState(HWND_DESKTOP,VK_MENU) & 0x8000)
+ __glutModifierMask |= Mod1Mask;
+ window->mouse(button, GLUT_DOWN, point.x, point.y);
+ __glutModifierMask = (unsigned int)~0;
+ } else {
+ /* Stray mouse events. Ignore. */
+ }
+ }
+ return 0;
+
+ break;
+/********************************************/
+ case WM_BUTTON1UP:
+ button = GLUT_LEFT_BUTTON;
+ case WM_BUTTON3UP:
+ if (button < 0)
+ button = GLUT_MIDDLE_BUTTON;
+ case WM_BUTTON2UP:
+ if (button < 0)
+ button = GLUT_RIGHT_BUTTON;
+ { POINTS psh;
+ psh = *((POINTS *)&mp1);
+ point.x = psh.x;
+ point.y = psh.y;
+ }
+ /* Bail out if we're processing a menu. */
+ /* Bail out = выброситься с парашутом */
+ if (__glutMappedMenu) {
+ WinQueryPointerPos(HWND_DESKTOP,&point);
+ WinMapWindowPoints(HWND_DESKTOP, hwnd, &point, 1);
+ /* if we're getting the middle button up signal, then something
+ on the menu was selected. */
+ if (button == GLUT_MIDDLE_BUTTON) {
+ return 0;
+ /* For some reason, the code below always returns -1 even
+ though the point IS IN THE ITEM! Therefore, just bail out if
+ we get a middle mouse up. The user must select using the
+ left mouse button. Stupid Win32. */
+#if 0
+ int item = MenuItemFromPoint(hwnd, __glutHMenu, point);
+ if (item != -1)
+ __glutItemSelected = (GLUTmenuItem*)GetMenuItemID(__glutHMenu, item);
+ else
+ __glutItemSelected = NULL;
+ __glutFinishMenu(hwnd, point.x, point.y);
+#endif
+ } else {
+ __glutItemSelected = NULL;
+ __glutFinishMenu(hwnd, point.x, point.y);
+ }
+ return 0;
+ }
+
+ window = __glutGetWindow(hwnd);
+ if(window)
+ window->buttonDownState = 0;
+
+ if (window && window->mouse) {
+ __glutSetWindow(window);
+ __glutModifierMask = 0;
+ if (WinGetKeyState(HWND_DESKTOP,VK_SHIFT) & 0x8000) /* < 0 = high order bit is on */
+ __glutModifierMask |= ShiftMask;
+ if (WinGetKeyState(HWND_DESKTOP,VK_CTRL) & 0x8000)
+ __glutModifierMask |= ControlMask;
+ if (WinGetKeyState(HWND_DESKTOP,VK_MENU) & 0x8000)
+ __glutModifierMask |= Mod1Mask;
+ window->mouse(button, GLUT_UP, point.x, point.y);
+
+ __glutModifierMask = (unsigned int)~0;
+ } else {
+ /* Window might have been destroyed and all the
+ events for the window may not yet be received. */
+ }
+ return 0;
+
+
+ break;
+//////////////////////////////////////////////////
+ case WM_COMMAND:
+ window = __glutGetWindow(hwnd);
+ if (window)
+ { if (window->wm_command)
+ window->wm_command(hwnd,mp1,mp2);
+ }
+ break;
+
+ case WM_MOUSEMOVE:
+ if (!__glutMappedMenu) {
+ window = __glutGetWindow(hwnd);
+ if (window) {
+ /* If motion function registered _and_ buttons held *
+ down, call motion function... */
+ { POINTS psh;
+ psh = *((POINTS *)&mp1);
+ point.x = psh.x;
+ point.y = psh.y;
+ }
+
+ if (window->motion && window->buttonDownState) {
+ __glutSetWindow(window);
+ window->motion(point.x, point.y);
+ }
+ /* If passive motion function registered _and_
+ buttons not held down, call passive motion
+ function... */
+ else if (window->passive && !window->buttonDownState) {
+ __glutSetWindow(window);
+ window->passive(point.x, point.y);
+ }
+ }
+ } else {
+ /* Motion events are thrown away when a pop up menu is
+ active. */
+ }
+ return 0;
+
+
+ default:
+ /* For all other messages, let the default window procedure process them. */
+ return ( WinDefWindowProc( hwnd, msg, mp1, mp2 ) );
+
+ } //endof switch( msg )
+ return ( WinDefWindowProc( hwnd, msg, mp1, mp2 ) );
+// return NULL;
+}
+
+void APIENTRY glutCommandFunc(GLUTcommandCB Func)
+{
+extern GLUTwindow *__glutCurrentWindow;
+ __glutCurrentWindow->wm_command = Func;
+}
+
+
+
+
+void
+updateWindowState(GLUTwindow *window, int visState)
+{
+ GLUTwindow* child;
+
+ /* XXX shownState and visState are the same in Win32. */
+ window->shownState = visState;
+ if (visState != window->visState) {
+ if (window->windowStatus) {
+ window->visState = visState;
+ __glutSetWindow(window);
+ window->windowStatus(visState);
+ }
+ }
+ /* Since Win32 only sends an activate for the toplevel window,
+ update the visibility for all the child windows. */
+ child = window->children;
+ while (child) {
+ updateWindowState(child, visState);
+ child = child->siblings;
+ }
+}
+
+#if POKA
+
+LONG WINAPI
+__glutWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ POINT point; /* Point structure. */
+ PAINTSTRUCT ps; /* Paint structure. */
+ LPMINMAXINFO minmax; /* Minimum/maximum info structure. */
+ GLUTwindow* window; /* GLUT window associated with message. */
+ GLUTmenu* menu; /* GLUT menu associated with message. */
+ int x, y, width, height, key;
+ int button = -1;
+
+ switch(msg) {
+ case WM_CREATE:
+ return 0;
+ case WM_CLOSE:
+ PostQuitMessage(0);
+ return 0;
+#if 0
+ case WM_DESTROY:
+ /* XXX NVidia's NT OpenGL can have problems closing down
+ its OpenGL internal data structures if we just allow
+ the process to terminate without unbinding and deleting
+ the windows context. Apparently, DirectDraw unloads
+ before OPENGL32.DLL in the close down sequence, but
+ NVidia's NT OpenGL needs DirectDraw to close down its
+ data structures. */
+ window = __glutGetWindow(hwnd);
+ if (window) {
+ if (window->ctx) {
+ wglMakeCurrent(NULL, NULL);
+ wglDeleteContext(window->ctx);
+ }
+ }
+ return 0;
+#endif
+
+ case WM_SYSKEYUP:
+ case WM_KEYUP:
+ window = __glutGetWindow(hwnd);
+ if (!window) {
+ break;
+ }
+ /* Win32 is dumb and sends these messages only to the parent
+ window. Therefore, find out if we're in a child window and
+ call the child windows keyboard callback if we are. */
+ if (window->parent) {
+ GetCursorPos(&point);
+ ScreenToClient(hwnd, &point);
+ hwnd = ChildWindowFromPoint(hwnd, point);
+ window = __glutGetWindow(hwnd);
+ }
+ if (window->specialUp || window->keyboardUp) {
+ GetCursorPos(&point);
+ ScreenToClient(window->win, &point);
+ __glutSetWindow(window);
+ __glutModifierMask = 0;
+ if (GetKeyState(VK_SHIFT) < 0) /* < 0 = high order bit is on */
+ __glutModifierMask |= ShiftMask;
+ if (GetKeyState(VK_SHIFT) < 0) /* < 0 = high order bit is on */
+ __glutModifierMask |= ControlMask;
+ if (GetKeyState(VK_MENU) < 0)
+ __glutModifierMask |= Mod1Mask;
+ switch (wParam) {
+ /* *INDENT-OFF* */
+ case VK_F1: key = GLUT_KEY_F1; break;
+ case VK_F2: key = GLUT_KEY_F2; break;
+ case VK_F3: key = GLUT_KEY_F3; break;
+ case VK_F4: key = GLUT_KEY_F4; break;
+ case VK_F5: key = GLUT_KEY_F5; break;
+ case VK_F6: key = GLUT_KEY_F6; break;
+ case VK_F7: key = GLUT_KEY_F7; break;
+ case VK_F8: key = GLUT_KEY_F8; break;
+ case VK_F9: key = GLUT_KEY_F9; break;
+ case VK_F10: key = GLUT_KEY_F10; break;
+ case VK_F11: key = GLUT_KEY_F11; break;
+ case VK_F12: key = GLUT_KEY_F12; break;
+ case VK_LEFT: key = GLUT_KEY_LEFT; break;
+ case VK_UP: key = GLUT_KEY_UP; break;
+ case VK_RIGHT: key = GLUT_KEY_RIGHT; break;
+ case VK_DOWN: key = GLUT_KEY_DOWN; break;
+ case VK_PRIOR: key = GLUT_KEY_PAGE_UP; break;
+ case VK_NEXT: key = GLUT_KEY_PAGE_DOWN; break;
+ case VK_HOME: key = GLUT_KEY_HOME; break;
+ case VK_END: key = GLUT_KEY_END; break;
+ case VK_INSERT: key = GLUT_KEY_INSERT; break;
+ case VK_DELETE:
+ /* Delete is an ASCII character. */
+ if (window->keyboardUp) {
+ window->keyboardUp((unsigned char) 127, point.x, point.y);
+ }
+ return 0;
+ /* *INDENT-ON* */
+ default:
+ if (window->keyboardUp) {
+ key = MapVirtualKey(wParam, 2); /* Map to ASCII. */
+ if (isascii(key) && (key != 0)) {
+
+ /* XXX Attempt to determine modified ASCII character
+ is quite incomplete. Digits, symbols, CapsLock,
+ Ctrl, and numeric keypad are all ignored. Fix this. */
+
+ if (!(__glutModifierMask & ShiftMask))
+ key = tolower(key);
+ window->keyboardUp((unsigned char) key, point.x, point.y);
+ }
+ }
+ __glutModifierMask = (unsigned int) ~0;
+ return 0;
+ }
+ if (window->specialUp) {
+ window->specialUp(key, point.x, point.y);
+ }
+ __glutModifierMask = (unsigned int) ~0;
+ }
+ return 0;
+
+ case WM_SYSCHAR:
+ case WM_CHAR:
+ window = __glutGetWindow(hwnd);
+ if (!window) {
+ break;
+ }
+
+ /* Bit 30 of lParam is set if key already held down. If
+ we are ignoring auto repeated key strokes for the window, bail. */
+ if (window->ignoreKeyRepeat && (lParam & (1 << 30)) ) {
+ break;
+ }
+
+ /* Win32 is dumb and sends these messages only to the parent
+ window. Therefore, find out if we're in a child window and
+ call the child windows keyboard callback if we are. */
+ if (window->parent) {
+ GetCursorPos(&point);
+ ScreenToClient(hwnd, &point);
+ hwnd = ChildWindowFromPoint(hwnd, point);
+ window = __glutGetWindow(hwnd);
+ }
+ if (window->keyboard) {
+ GetCursorPos(&point);
+ ScreenToClient(window->win, &point);
+ __glutSetWindow(window);
+ __glutModifierMask = 0;
+ if (GetKeyState(VK_SHIFT) < 0) /* < 0 = high order bit is on */
+ __glutModifierMask |= ShiftMask;
+ if (GetKeyState(VK_CONTROL) < 0)
+ __glutModifierMask |= ControlMask;
+ if (GetKeyState(VK_MENU) < 0)
+ __glutModifierMask |= Mod1Mask;
+ window->keyboard((unsigned char)wParam, point.x, point.y);
+ __glutModifierMask = (unsigned int) ~0;
+ }
+ return 0;
+
+ case WM_SYSKEYDOWN:
+ case WM_KEYDOWN:
+ window = __glutGetWindow(hwnd);
+ if (!window) {
+ break;
+ }
+
+ /* Bit 30 of lParam is set if key already held down. If
+ we are ignoring auto repeated key strokes for the window, bail. */
+ if (window->ignoreKeyRepeat && (lParam & (1 << 30)) ) {
+ break;
+ }
+
+ /* Win32 is dumb and sends these messages only to the parent
+ window. Therefore, find out if we're in a child window and
+ call the child windows keyboard callback if we are. */
+ if (window->parent) {
+ GetCursorPos(&point);
+ ScreenToClient(hwnd, &point);
+ hwnd = ChildWindowFromPoint(hwnd, point);
+ window = __glutGetWindow(hwnd);
+ }
+ if (window->special) {
+ switch (wParam) {
+ /* *INDENT-OFF* */
+ /* function keys */
+ case VK_F1: key = GLUT_KEY_F1; break;
+ case VK_F2: key = GLUT_KEY_F2; break;
+ case VK_F3: key = GLUT_KEY_F3; break;
+ case VK_F4: key = GLUT_KEY_F4; break;
+ case VK_F5: key = GLUT_KEY_F5; break;
+ case VK_F6: key = GLUT_KEY_F6; break;
+ case VK_F7: key = GLUT_KEY_F7; break;
+ case VK_F8: key = GLUT_KEY_F8; break;
+ case VK_F9: key = GLUT_KEY_F9; break;
+ case VK_F10: key = GLUT_KEY_F10; break;
+ case VK_F11: key = GLUT_KEY_F11; break;
+ case VK_F12: key = GLUT_KEY_F12; break;
+ /* directional keys */
+ case VK_LEFT: key = GLUT_KEY_LEFT; break;
+ case VK_UP: key = GLUT_KEY_UP; break;
+ case VK_RIGHT: key = GLUT_KEY_RIGHT; break;
+ case VK_DOWN: key = GLUT_KEY_DOWN; break;
+ /* *INDENT-ON* */
+
+ case VK_PRIOR:
+ /* VK_PRIOR is Win32's Page Up */
+ key = GLUT_KEY_PAGE_UP;
+ break;
+ case VK_NEXT:
+ /* VK_NEXT is Win32's Page Down */
+ key = GLUT_KEY_PAGE_DOWN;
+ break;
+ case VK_HOME:
+ key = GLUT_KEY_HOME;
+ break;
+ case VK_END:
+ key = GLUT_KEY_END;
+ break;
+ case VK_INSERT:
+ key = GLUT_KEY_INSERT;
+ break;
+ case VK_DELETE:
+ goto handleDelete;
+ default:
+ goto defproc;
+ }
+ GetCursorPos(&point);
+ ScreenToClient(window->win, &point);
+ __glutSetWindow(window);
+ __glutModifierMask = 0;
+ if (GetKeyState(VK_SHIFT) < 0) /* < 0 = high order bit is on */
+ __glutModifierMask |= ShiftMask;
+ if (GetKeyState(VK_CONTROL) < 0)
+ __glutModifierMask |= ControlMask;
+ if (GetKeyState(VK_MENU) < 0)
+ __glutModifierMask |= Mod1Mask;
+ window->special(key, point.x, point.y);
+ __glutModifierMask = (unsigned int) ~0;
+ } else if (window->keyboard) {
+ /* Specially handle any keys that match ASCII values but
+ do not generate Windows WM_SYSCHAR or WM_CHAR messages. */
+ switch (wParam) {
+ case VK_DELETE:
+ handleDelete:
+ /* Delete is an ASCII character. */
+ GetCursorPos(&point);
+ ScreenToClient(window->win, &point);
+ __glutSetWindow(window);
+ __glutModifierMask = 0;
+ if (GetKeyState(VK_SHIFT) < 0) /* < 0 = high order bit is on */
+ __glutModifierMask |= ShiftMask;
+ if (GetKeyState(VK_CONTROL) < 0)
+ __glutModifierMask |= ControlMask;
+ if (GetKeyState(VK_MENU) < 0)
+ __glutModifierMask |= Mod1Mask;
+ window->keyboard((unsigned char) 127, point.x, point.y);
+ __glutModifierMask = (unsigned int) ~0;
+ return 0;
+ default:
+ /* Let the following WM_SYSCHAR or WM_CHAR message generate
+ the keyboard callback. */
+ break;
+ }
+ }
+ return 0;
+
+ case WM_LBUTTONDOWN:
+ button = GLUT_LEFT_BUTTON;
+ case WM_MBUTTONDOWN:
+ if (button < 0)
+ button = GLUT_MIDDLE_BUTTON;
+ case WM_RBUTTONDOWN:
+ if (button < 0)
+ button = GLUT_RIGHT_BUTTON;
+
+ /* finish the menu if we get a button down message (user must have
+ cancelled the menu). */
+ if (__glutMappedMenu) {
+ /* TODO: take this out once the menu on middle mouse stuff works
+ properly. */
+ if (button == GLUT_MIDDLE_BUTTON)
+ return 0;
+ GetCursorPos(&point);
+ ScreenToClient(hwnd, &point);
+ __glutItemSelected = NULL;
+ __glutFinishMenu(hwnd, point.x, point.y);
+ return 0;
+ }
+
+ /* set the capture so we can get mouse events outside the window */
+ SetCapture(hwnd);
+
+ /* Win32 doesn't return the same numbers as X does when the mouse
+ goes beyond the upper or left side of the window. roll the
+ Win32's 0..2^16 pointer co-ord range to 0 +/- 2^15. */
+ x = LOWORD(lParam);
+ y = HIWORD(lParam);
+ if(x & 1 << 15) x -= (1 << 16);
+ if(y & 1 << 15) y -= (1 << 16);
+
+ window = __glutGetWindow(hwnd);
+ if (window) {
+ menu = __glutGetMenuByNum(window->menu[button]);
+ if (menu) {
+ point.x = LOWORD(lParam); point.y = HIWORD(lParam);
+ ClientToScreen(window->win, &point);
+ __glutMenuButton = button == GLUT_RIGHT_BUTTON ? TPM_RIGHTBUTTON :
+ button == GLUT_LEFT_BUTTON ? TPM_LEFTBUTTON :
+ 0x0001;
+ __glutStartMenu(menu, window, point.x, point.y, x, y);
+ } else if (window->mouse) {
+
+ __glutSetWindow(window);
+ __glutModifierMask = 0;
+ if (GetKeyState(VK_SHIFT) < 0) /* < 0 = high order bit is on. */
+ __glutModifierMask |= ShiftMask;
+ if (GetKeyState(VK_CONTROL) < 0)
+ __glutModifierMask |= ControlMask;
+ if (GetKeyState(VK_MENU) < 0)
+ __glutModifierMask |= Mod1Mask;
+ window->mouse(button, GLUT_DOWN, x, y);
+ __glutModifierMask = (unsigned int)~0;
+ } else {
+ /* Stray mouse events. Ignore. */
+ }
+ }
+ return 0;
+
+ case WM_LBUTTONUP:
+ button = GLUT_LEFT_BUTTON;
+ case WM_MBUTTONUP:
+ if (button < 0)
+ button = GLUT_MIDDLE_BUTTON;
+ case WM_RBUTTONUP:
+ if (button < 0)
+ button = GLUT_RIGHT_BUTTON;
+
+ /* Bail out if we're processing a menu. */
+ if (__glutMappedMenu) {
+ GetCursorPos(&point);
+ ScreenToClient(hwnd, &point);
+ /* if we're getting the middle button up signal, then something
+ on the menu was selected. */
+ if (button == GLUT_MIDDLE_BUTTON) {
+ return 0;
+ /* For some reason, the code below always returns -1 even
+ though the point IS IN THE ITEM! Therefore, just bail out if
+ we get a middle mouse up. The user must select using the
+ left mouse button. Stupid Win32. */
+#if 0
+ int item = MenuItemFromPoint(hwnd, __glutHMenu, point);
+ if (item != -1)
+ __glutItemSelected = (GLUTmenuItem*)GetMenuItemID(__glutHMenu, item);
+ else
+ __glutItemSelected = NULL;
+ __glutFinishMenu(hwnd, point.x, point.y);
+#endif
+ } else {
+ __glutItemSelected = NULL;
+ __glutFinishMenu(hwnd, point.x, point.y);
+ }
+ return 0;
+ }
+
+ /* Release the mouse capture. */
+ ReleaseCapture();
+
+ window = __glutGetWindow(hwnd);
+ if (window && window->mouse) {
+ /* Win32 doesn't return the same numbers as X does when the
+ mouse goes beyond the upper or left side of the window. roll
+ the Win32's 0..2^16 pointer co-ord range to 0 +/- 2^15. */
+ x = LOWORD(lParam);
+ y = HIWORD(lParam);
+ if(x & 1 << 15) x -= (1 << 16);
+ if(y & 1 << 15) y -= (1 << 16);
+
+ __glutSetWindow(window);
+ __glutModifierMask = 0;
+ if (GetKeyState(VK_SHIFT) < 0) /* < 0 = high order bit is on */
+ __glutModifierMask |= ShiftMask;
+ if (GetKeyState(VK_CONTROL) < 0)
+ __glutModifierMask |= ControlMask;
+ if (GetKeyState(VK_MENU) < 0)
+ __glutModifierMask |= Mod1Mask;
+ window->mouse(button, GLUT_UP, x, y);
+ __glutModifierMask = (unsigned int)~0;
+ } else {
+ /* Window might have been destroyed and all the
+ events for the window may not yet be received. */
+ }
+ return 0;
+
+ case WM_ENTERMENULOOP:
+ /* KLUDGE: create a timer that fires every 100 ms when we start a
+ menu so that we can still process the idle & timer events (that
+ way, the timers will fire during a menu pick and so will the
+ idle func. */
+ SetTimer(hwnd, 1, 1, NULL);
+ return 0;
+
+ case WM_TIMER:
+#if 0
+ /* If the timer id is 2, then this is the timer that is set up in
+ the main glut message processing loop, and we don't want to do
+ anything but acknowledge that we got it. It is used to prevent
+ CPU spiking when an idle function is installed. */
+ if (wParam == 2)
+ return 0;
+#endif
+
+ /* only worry about the idle function and the timeouts, since
+ these are the only events we expect to process during
+ processing of a menu. */
+ /* we no longer process the idle functions (as outlined in the
+ README), since drawing can't be done until the menu has
+ finished...it's pretty lame when the animation goes on, but
+ doesn't update, so you get this weird jerkiness. */
+#if 0
+ if (__glutIdleFunc)
+ __glutIdleFunc();
+#endif
+ if (__glutTimerList)
+ handleTimeouts();
+ return 0;
+
+ case WM_EXITMENULOOP:
+ /* nuke the above created timer...we don't need it anymore, since
+ the menu is gone now. */
+ KillTimer(hwnd, 1);
+ return 0;
+
+ case WM_MENUSELECT:
+ if (lParam != 0)
+ __glutHMenu = (HMENU)lParam;
+ return 0;
+
+ case WM_COMMAND:
+ if (__glutMappedMenu) {
+ if (GetSubMenu(__glutHMenu, LOWORD(wParam)))
+ __glutItemSelected = NULL;
+ else
+ __glutItemSelected =
+ __glutGetUniqueMenuItem(__glutMappedMenu, LOWORD(wParam));
+ GetCursorPos(&point);
+ ScreenToClient(hwnd, &point);
+ __glutFinishMenu(hwnd, point.x, point.y);
+ }
+ return 0;
+
+ case WM_MOUSEMOVE:
+ if (!__glutMappedMenu) {
+ window = __glutGetWindow(hwnd);
+ if (window) {
+ /* If motion function registered _and_ buttons held *
+ down, call motion function... */
+ x = LOWORD(lParam);
+ y = HIWORD(lParam);
+
+ /* Win32 doesn't return the same numbers as X does when the
+ mouse goes beyond the upper or left side of the window.
+ roll the Win32's 0..2^16 pointer co-ord range to 0..+/-2^15. */
+ if(x & 1 << 15) x -= (1 << 16);
+ if(y & 1 << 15) y -= (1 << 16);
+
+ if (window->motion && wParam &
+ (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON)) {
+ __glutSetWindow(window);
+ window->motion(x, y);
+ }
+ /* If passive motion function registered _and_
+ buttons not held down, call passive motion
+ function... */
+ else if (window->passive &&
+ ((wParam &
+ (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON)) ==
+ 0)) {
+ __glutSetWindow(window);
+ window->passive(x, y);
+ }
+ }
+ } else {
+ /* Motion events are thrown away when a pop up menu is
+ active. */
+ }
+ return 0;
+
+ case WM_GETMINMAXINFO:
+ /* this voodoo is brought to you by Win32 (again). It allows the
+ window to be bigger than the screen, and smaller than 100x100
+ (although it doesn't seem to help the y minimum). */
+ minmax = (LPMINMAXINFO)lParam;
+ minmax->ptMaxSize.x = __glutScreenWidth;
+ minmax->ptMaxSize.y = __glutScreenHeight;
+ minmax->ptMinTrackSize.x = 0;
+ minmax->ptMinTrackSize.y = 0;
+ minmax->ptMaxTrackSize.x = __glutScreenWidth +
+ GetSystemMetrics(SM_CXSIZE) * 2;
+ minmax->ptMaxTrackSize.y = __glutScreenHeight +
+ GetSystemMetrics(SM_CXSIZE) * 2 + GetSystemMetrics(SM_CYCAPTION);
+ return 0;
+
+ case WM_SIZE:
+ window = __glutGetWindow(hwnd);
+ if (window) {
+ width = LOWORD(lParam);
+ height = HIWORD(lParam);
+ if (width != window->width || height != window->height) {
+#if 0 /* Win32 GLUT does not support overlays for now. */
+ if (window->overlay) {
+ XResizeWindow(__glutDisplay, window->overlay->win, width, height);
+ }
+#endif
+ window->width = width;
+ window->height = height;
+ __glutSetWindow(window);
+ /* Do not execute OpenGL out of sequence with respect
+ to the SetWindowPos request! */
+ GdiFlush();
+ window->reshape(width, height);
+ window->forceReshape = FALSE;
+ /* A reshape should be considered like posting a
+ repair request. */
+ __glutPostRedisplay(window, GLUT_REPAIR_WORK);
+ }
+ }
+ return 0;
+
+ case WM_SETCURSOR:
+ /* If the cursor is not in the client area, then we want to send
+ this message to the default window procedure ('cause its
+ probably in the border or title, and we don't handle that
+ cursor. otherwise, set our cursor. Win32 makes us set the
+ cursor every time the mouse moves (DUMB!). */
+ if(LOWORD(lParam) != HTCLIENT) {
+ goto defproc;
+ }
+ window = __glutGetWindow(hwnd);
+ if (window) {
+ __glutSetCursor(window);
+ }
+ /* TODO: check out the info in DevStudio on WM_SETCURSOR in the
+ DefaultAction section. */
+ return 1;
+
+ case WM_SETFOCUS:
+ window = __glutGetWindow(hwnd);
+ if (window) {
+ window->entryState = WM_SETFOCUS;
+ if (window->entry) {
+ __glutSetWindow(window);
+ window->entry(GLUT_ENTERED);
+ /* XXX Generation of fake passive notify? See how much
+ work the X11 code does to support fake passive notify
+ callbacks. */
+ }
+ if (window->joystick && __glutCurrentWindow) {
+ if (__glutCurrentWindow->joyPollInterval > 0) {
+ MMRESULT result;
+
+ /* Because Win32 will only let one window capture the
+ joystick at a time, we must capture it when we get the
+ focus and release it when we lose the focus. */
+ result = joySetCapture(__glutCurrentWindow->win,
+ JOYSTICKID1, 0, TRUE);
+ if (result != JOYERR_NOERROR) {
+ return 0;
+ }
+ (void) joySetThreshold(JOYSTICKID1,
+ __glutCurrentWindow->joyPollInterval);
+ }
+ }
+ }
+ return 0;
+
+ case WM_KILLFOCUS:
+ window = __glutGetWindow(hwnd);
+ if (window) {
+ window->entryState = WM_KILLFOCUS;
+ if (window->entry) {
+ __glutSetWindow(window);
+ window->entry(GLUT_LEFT);
+ }
+ if (window->joystick && __glutCurrentWindow) {
+ if (__glutCurrentWindow->joyPollInterval > 0) {
+ /* Because Win32 will only let one window capture the
+ joystick at a time, we must capture it when we get the
+ focus and release it when we lose the focus. */
+ (void) joyReleaseCapture(JOYSTICKID1);
+ }
+ }
+ }
+ return 0;
+ case WM_ACTIVATE:
+ window = __glutGetWindow(hwnd);
+ /* Make sure we re-select the correct palette if needed. */
+ if (LOWORD(wParam)) {
+ PostMessage(hwnd, WM_PALETTECHANGED, 0, 0);
+ }
+ if (window) {
+ int visState;
+
+ /* HIWORD(wParam) is the minimized flag. */
+ visState = !HIWORD(wParam);
+ updateWindowState(window, visState);
+ }
+ return 0;
+
+ /* Colour Palette Management */
+ case WM_PALETTECHANGED:
+ if (hwnd == (HWND)wParam) {
+ /* Don't respond to the message that we sent! */
+ break;
+ }
+ /* fall through to WM_QUERYNEWPALETTE */
+
+ case WM_QUERYNEWPALETTE:
+ window = __glutGetWindow(hwnd);
+ if (window && window->colormap) {
+ UnrealizeObject(window->colormap->cmap);
+ SelectPalette(window->hdc, window->colormap->cmap, FALSE);
+ RealizePalette(window->hdc);
+ return TRUE;
+ }
+ return FALSE;
+
+ case MM_JOY1MOVE:
+ case MM_JOY1ZMOVE:
+ window = __glutGetWindow(hwnd);
+ if (window->joystick) {
+ JOYINFOEX jix;
+ int x, y, z;
+
+ /* Because WIN32 only supports messages for X, Y, and Z
+ translations, we must poll for the rest */
+ jix.dwSize = sizeof(jix);
+ jix.dwFlags = JOY_RETURNALL;
+ joyGetPosEx(JOYSTICKID1,&jix);
+
+#define SCALE(v) ((int) ((v - 32767)/32.768))
+
+ /* Convert to integer for scaling. */
+ x = jix.dwXpos;
+ y = jix.dwYpos;
+ z = jix.dwZpos;
+ window->joystick(jix.dwButtons, SCALE(x), SCALE(y), SCALE(z));
+
+ return TRUE;
+ }
+ return FALSE;
+ case MM_JOY1BUTTONDOWN:
+ case MM_JOY1BUTTONUP:
+ window = __glutGetWindow(hwnd);
+ if (window->joystick) {
+ JOYINFOEX jix;
+
+ /* Because WIN32 only supports messages for X, Y, and Z
+ translations, we must poll for the rest */
+ jix.dwSize = sizeof(jix);
+ jix.dwFlags = JOY_RETURNALL;
+ joyGetPosEx(JOYSTICKID1,&jix);
+
+ return TRUE;
+ }
+ return FALSE;
+
+#if 0
+ /* Miscellaneous messages (don't really need to enumerate them,
+ but it's good to know what you're not getting sometimes). */
+ case WM_DISPLAYCHANGE:
+ break;
+ case WM_NCHITTEST:
+ /* This event is generated by every mouse move event. */
+ goto defproc;
+ case WM_NCMOUSEMOVE:
+ goto defproc;
+ case WM_NCACTIVATE:
+ goto defproc;
+ case WM_NCPAINT:
+ goto defproc;
+ case WM_NCCALCSIZE:
+ goto defproc;
+ case WM_NCCREATE:
+ goto defproc;
+ case WM_NCDESTROY:
+ goto defproc;
+ case WM_NCLBUTTONDOWN:
+ goto defproc;
+ case WM_SETTEXT:
+ goto defproc;
+ case WM_GETTEXT:
+ goto defproc;
+ case WM_ACTIVATEAPP:
+ goto defproc;
+ case WM_GETICON:
+ goto defproc;
+ case WM_ERASEBKGND:
+ goto defproc;
+ case WM_WINDOWPOSCHANGING:
+ goto defproc;
+ case WM_WINDOWPOSCHANGED:
+ goto defproc;
+ case WM_MOUSEACTIVATE:
+ goto defproc;
+ case WM_SHOWWINDOW:
+ goto defproc;
+ case WM_MOVING:
+ goto defproc;
+ case WM_MOVE:
+ goto defproc;
+ case WM_KEYUP:
+ goto defproc;
+ case WM_CAPTURECHANGED:
+ goto defproc;
+ case WM_SYSCOMMAND:
+ goto defproc;
+ case WM_ENTERSIZEMOVE:
+ goto defproc;
+ case WM_ENTERIDLE:
+ goto defproc;
+#endif
+
+ default:
+ goto defproc;
+ }
+
+defproc:
+ return DefWindowProc(hwnd, msg, wParam, lParam);
+}
+
+#endif
+
+#if defined(__OS2PM__)
+Bool __glutSetWindowText(Window window, char *text)
+{
+ return WinSetWindowText(window, (PCSZ)text);
+
+}
+
+#endif
+ \ No newline at end of file
diff --git a/src/glut/os2/src-glut_os2pm.zip b/src/glut/os2/src-glut_os2pm.zip
new file mode 100644
index 00000000000..8c8a8c7ac48
--- /dev/null
+++ b/src/glut/os2/src-glut_os2pm.zip
Binary files differ