http://svn.poeml.de/viewvc/ppc/src-unpacked/xscreensaver/xscreensaver-4.12.tar.bz2...
authorZygo Blaxell <zblaxell@hungrycats.org>
Mon, 2 Mar 2009 05:43:11 +0000 (00:43 -0500)
committerZygo Blaxell <zblaxell@faye.furryterror.org>
Fri, 8 Feb 2013 17:54:04 +0000 (12:54 -0500)
-rw-r--r-- 1 zblaxell zblaxell 2888853 Mar  1 22:01 xscreensaver-4.12.tar.bz2?view=co
d515a35765428b26097e20ac46f1d373510ee9c2  xscreensaver-4.12.tar.bz2?view=co

114 files changed:
README
README.debugging
configure
configure.in
driver/XScreenSaver.ad.in
driver/XScreenSaver_ad.h
driver/demo-Gtk-conf.c
driver/demo-Gtk-widgets.c
driver/demo-Gtk.c
driver/demo-Xm.c
driver/passwd-pam.c
driver/xscreensaver-command.c
driver/xscreensaver-command.man
driver/xscreensaver-demo.man
driver/xscreensaver-getimage-file
driver/xscreensaver-getimage-file.man
driver/xscreensaver-getimage-video.man
driver/xscreensaver-getimage.c
driver/xscreensaver-getimage.man
driver/xscreensaver.c
driver/xscreensaver.h
driver/xscreensaver.man
hacks/barcode.c
hacks/bsod.c
hacks/bubbles.man
hacks/bumps.c
hacks/config/README
hacks/config/antspotlight.xml [new file with mode: 0644]
hacks/config/bouboule.xml
hacks/config/bsod.xml
hacks/config/engine.xml
hacks/config/fireflies.xml [new file with mode: 0644]
hacks/config/flipflop.xml [new file with mode: 0644]
hacks/config/hyperball.xml
hacks/config/hypercube.xml
hacks/config/polytopes.xml [new file with mode: 0644]
hacks/config/shadebobs.xml
hacks/config/spotlight.xml
hacks/epicycle.c
hacks/eruption.c
hacks/glx/Makefile.in
hacks/glx/ants.h [new file with mode: 0644]
hacks/glx/antspotlight.c [new file with mode: 0644]
hacks/glx/antspotlight.man [new file with mode: 0644]
hacks/glx/atlantis.c
hacks/glx/blocktube.c
hacks/glx/boxed.c
hacks/glx/boxed.h
hacks/glx/cage.c
hacks/glx/circuit.c
hacks/glx/cubenetic.c
hacks/glx/extrusion.c
hacks/glx/flipflop.c [new file with mode: 0644]
hacks/glx/flipflop.man [new file with mode: 0644]
hacks/glx/flipscreen3d.c
hacks/glx/flurry-smoke.c
hacks/glx/flurry-spark.c
hacks/glx/flurry-star.c
hacks/glx/flurry-texture.c
hacks/glx/flurry.h
hacks/glx/font-ximage.c
hacks/glx/gflux.c
hacks/glx/glknots.c
hacks/glx/glmatrix.c
hacks/glx/glplanet.c
hacks/glx/glslideshow.c
hacks/glx/glslideshow.man
hacks/glx/grab-ximage.c
hacks/glx/jigglypuff.c
hacks/glx/klein.c
hacks/glx/lament.c
hacks/glx/moebius.c
hacks/glx/molecule.c
hacks/glx/polytopes.c [new file with mode: 0644]
hacks/glx/polytopes.man [new file with mode: 0644]
hacks/glx/pulsar.c
hacks/glx/queens.c
hacks/glx/sballs.c
hacks/glx/stairs.c
hacks/glx/starwars.c
hacks/glx/xpm-ximage.c
hacks/greynetic.c
hacks/halftone.c
hacks/halo.c
hacks/images/atari.xbm
hacks/images/blocktube.xpm
hacks/images/macbomb.xbm
hacks/juggle.c
hacks/kumppa.c
hacks/metaballs.c
hacks/phosphor.man
hacks/rd-bomb.c
hacks/shadebobs.man
hacks/slidescreen.c
hacks/sonar.c
hacks/webcollage
hacks/webcollage-helper.c
hacks/xlockmore.c
hacks/xmatrix.c
hacks/xrayswarm.c
hacks/xsublim.c
po/POTFILES.in
po/fr.po
utils/colorbars.c
utils/grabclient.c
utils/images/logo-180.xpm
utils/images/logo-50.xpm
utils/logo.c
utils/resources.c
utils/version.h
utils/visual.c
utils/yarandom.h
xscreensaver.lsm
xscreensaver.spec

diff --git a/README b/README
index 7f656b94b9d97593884e4d157bb1164e625dd559..b3422d9c27bf041e88db1ca83257d5ae10ee4043 100644 (file)
--- a/README
+++ b/README
@@ -18,10 +18,16 @@ Makefiles for you.  Run `configure --help' to see how to override these
 choices, or to specify things like the default installation directory.
 The file `INSTALL' gives a general overview of use of these sorts of
 configure scripts (those generated by the GNU autoconf system.)
-The most important hint is probably this:
+
+If you have libraries in non-standard places, you can specify their
+locations with options like this:
 
      ./configure --with-motif=/opt/Motif --with-xpm=/usr/local
 
+On MacOS X, it is strongly recommended that you install Fink first
+(http://fink.sourceforge.net/).  With Fink installed, you probably want
+to pass --prefix=/sw to configure.
+
 To build on VMS, see README.VMS.
 
 If you think you've found a bug, please let me know!  No bug report is too
@@ -70,6 +76,12 @@ the XScreenSaver FAQ about that: http://www.jwz.org/xscreensaver/faq.html
 
                               ============
 
+Changes since 4.11:   * New GL hacks, `flipflop', `antspotlight', and
+                        `polytopes'.
+                      * Added VMS to `bsod'.
+                      * Compile without warnings in "gcc -pedantic".
+                      * Updates to `webcollage' and `queens'.
+                      * Fixed a bug that could cause PAM to hang.
 Changes since 4.10:   * New hacks, `hypertorus', `cubestorm', `glknots',
                         `blocktube', and `glmatrix'.
                       * Updates to `cloudlife', `engine', `xmatrix', and
index 9c847673278619a8a875084134a74f01d6ab1fec..6afb2421dca24bfcb1239b4f98fb4d6356cd983a 100644 (file)
@@ -54,15 +54,9 @@ COMPILATION PROBLEMS:
 
     Before doing this, you'll need to nuke `config.cache'.
 
-    If you get errors about not being able to find Gtk or Motif (the
-     gtk/ or Xm/ header files), and you can't find them on your system,
-    then your system is horked and your vendor is lame.  Perhaps the
-    problem is that you don't have some kind of ``development option''
-    installed.  Xt/ is free and available on all systems; Xm/ (Motif)
-    is available on all commercial systems except SunOS 4.x and some
-    early releases of Solaris.  Linux and other free Unixes systems
-    usually come with Gtk, but a Motif clone is also available from
-    http://www.lesstif.org/.
+    If you get errors about not being able to find Gtk, then perhaps
+    the problem is that you don't have some kind of ``development
+    option'' installed.
 
 RUN-TIME PROBLEMS:
 
@@ -81,8 +75,8 @@ RUN-TIME PROBLEMS:
         *  Is the problem in the driver (`xscreensaver'), the GUI
            (`xscreensaver-demo'), or in the graphics hacks?
 
-        *  If the problem is in the GUI, was it built using
-           Motif, Lesstif, or Gtk?  Which version?
+        *  If the problem is in the GUI, was it built using Gtk, Motif,
+           or Lesstif?  Which version?
 
         *  If the problem is in one (or more) of the hacks, which ones?
            If you're not sure, try running `xscreensaver-demo' to go
index fc5b9fddab278a82f224ca3a785a6277a009cb99..085a7f01b717501ec86b007b3e6f3451375c1f34 100755 (executable)
--- a/configure
+++ b/configure
@@ -1306,6 +1306,15 @@ done
 #       gcc.  Old gcc doesn't support -std, and new gcc doesn't support -lang.
 #       so much for compatibility!)
 #
+#       UPDATE: apparently there is NO WAY to tell gcc 3.2.2 to require that
+#       declarations preceed statements, without resorting to "-pedantic".
+#       This means that there is no way to get gcc3 to issue warnings that
+#       ensure that your code complies with the ANSI/ISO C89 standard, without
+#       also drowning in totally useless warnings.  Thank you master may I
+#       have another.
+#
+#       So, I give up, let's just use -pedantic.
+#
 ###############################################################################
 
 
@@ -2371,7 +2380,9 @@ fi
   if test -n "$GCC"; then
     echo "$as_me:$LINENO: result: Turning on gcc compiler warnings." >&5
 echo "${ECHO_T}Turning on gcc compiler warnings." >&6
-    CC="$CC -Wall -Wstrict-prototypes -Wnested-externs"
+    CC="$CC -pedantic -Wall -Wstrict-prototypes -Wnested-externs"
+    # supposedly gcc 3.4 will have "-Wdeclaration-after-statement"
+    # and then perhaps we can do without -pedantic?
   else
     case "$host" in
       *-irix5* |*-irix6.0-3* )
@@ -14869,7 +14880,7 @@ if test "${ac_cv_mesagl_version_string+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 14878 "configure"
+#line 14889 "configure"
 #include "confdefs.h"
 #include <GL/gl.h>
 #ifndef MESA_MAJOR_VERSION
index 411df4ac1634fea83052970c530561b8f742b1e7..4df13b8e9c151c07a603cf0600cdbc690c1effac 100644 (file)
@@ -65,7 +65,9 @@ AC_DEFUN(AC_PROG_CC_ANSI,
 
   if test -n "$GCC"; then
     AC_MSG_RESULT(Turning on gcc compiler warnings.)
-    CC="$CC -Wall -Wstrict-prototypes -Wnested-externs"
+    CC="$CC -pedantic -Wall -Wstrict-prototypes -Wnested-externs"
+    # supposedly gcc 3.4 will have "-Wdeclaration-after-statement"
+    # and then perhaps we can do without -pedantic?
   else
     case "$host" in
       *-irix5* |*-irix6.[0-3]* )
@@ -92,6 +94,15 @@ AC_DEFUN(AC_PROG_CC_ANSI,
 #       gcc.  Old gcc doesn't support -std, and new gcc doesn't support -lang.
 #       so much for compatibility!)
 #
+#       UPDATE: apparently there is NO WAY to tell gcc 3.2.2 to require that
+#       declarations preceed statements, without resorting to "-pedantic".
+#       This means that there is no way to get gcc3 to issue warnings that
+#       ensure that your code complies with the ANSI/ISO C89 standard, without
+#       also drowning in totally useless warnings.  Thank you master may I
+#       have another.
+#
+#       So, I give up, let's just use -pedantic.
+#
 ###############################################################################
 
 AC_DEFUN(AC_GCC_ACCEPTS_STD,
index 47c798f08f3bda1f69d10dc25eb992b8a8f1cd1c..d78f5e3307617961d641fc6f8eb33ba228a7c4a8 100644 (file)
@@ -4,8 +4,8 @@
 !            a screen saver and locker for the X window system
 !                            by Jamie Zawinski
 !
-!                              version 4.11
-!                              23-Jun-2003
+!                              version 4.12
+!                              14-Aug-2003
 !
 ! See "man xscreensaver" for more info.  The latest version is always
 ! available at http://www.jwz.org/xscreensaver/
              "Ripples (stir)"  ripples -root -oily -light 2 -stir          \n\
           "Ripples (desktop)"  ripples -root -water -light 6               \n\
                                hypercube -root                             \n\
-                               hyperball -root                             \n\
+-                              hyperball -root                             \n\
                                halo -root                                  \n\
                                maze -root                                  \n\
                                noseguy -root                               \n\
 @GL_KLUDGE@ GL:                        cubestorm -root                             \n\
 @GL_KLUDGE@ GL:                        glknots -root                               \n\
 @GL_KLUDGE@ GL:                        blocktube -root                             \n\
+@GL_KLUDGE@ GL:                        flipflop -root                              \n\
+@GL_KLUDGE@ GL:                        antspotlight -root                          \n\
+@GL_KLUDGE@ GL:                        polytopes -root                             \n\
 -         GL:                  glslideshow -root                           \n\
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \n\
 -                              goban -root                                 \n\
 -                              electricsheep                               \n\
 -                              cosmos -root                                \n\
--         GL:                  sphereEversion --root                       \n
+-         GL:                  sphereEversion --root                       \n\
+-         GL:                  fireflies -root                             \n
 
 
 ! To display a randomized slideshow of images, you can do something like this:
@@ -651,6 +655,8 @@ XScreenSaver*doc.fontList:       *-helvetica-medium-r-*-*-*-100-*-*-*-iso8859-1
 *hacks.hypertorus.name:     HyperTorus
 *hacks.cubestorm.name:      CubeStorm
 *hacks.blocktube.name:      BlockTube
+*hacks.flipflop.name:       FlipFlop
+*hacks.antspotlight.name:   AntSpotlight
 
 ! obsolete, but still used by xscreensaver-demo-Xm.
 *hacks.documentation.isInstalled: True
index 5a6ffa9713bb834633e330d36b90e52ca5847552..42d7cea2319812e1e22fa2ee14cf38c127f0fb41 100644 (file)
@@ -79,7 +79,7 @@
              \"Ripples (stir)\"        ripples -root -oily -light 2 -stir          \\n\
           \"Ripples (desktop)\"        ripples -root -water -light 6               \\n\
                                hypercube -root                             \\n\
-                               hyperball -root                             \\n\
+-                              hyperball -root                             \\n\
                                halo -root                                  \\n\
                                maze -root                                  \\n\
                                noseguy -root                               \\n\
           GL:                  cubestorm -root                             \\n\
           GL:                  glknots -root                               \\n\
           GL:                  blocktube -root                             \\n\
+          GL:                  flipflop -root                              \\n\
+          GL:                  antspotlight -root                          \\n\
+          GL:                  polytopes -root                             \\n\
 -         GL:                  glslideshow -root                           \\n\
                                                                              \
 -                              xdaliclock -root -builtin3 -cycle           \\n\
 -                              goban -root                                 \\n\
 -                              electricsheep                               \\n\
 -                              cosmos -root                                \\n\
--         GL:                  sphereEversion --root                       \\n",
+-         GL:                  sphereEversion --root                       \\n\
+-         GL:                  fireflies -root                             \\n",
 "XScreenSaver.pointerPollTime:         0:00:05",
 "XScreenSaver.initialDelay:            0:00:00",
 "XScreenSaver.windowCreationTimeout:   0:00:30",
 "*hacks.hypertorus.name:     HyperTorus",
 "*hacks.cubestorm.name:      CubeStorm",
 "*hacks.blocktube.name:      BlockTube",
+"*hacks.flipflop.name:       FlipFlop",
+"*hacks.antspotlight.name:   AntSpotlight",
 "*hacks.documentation.isInstalled: True",
index 23f5944dea4ec7e8de44f208a3d5824683996c61..608e488c898e225617434fa03258e1d7a50f2cb2 100644 (file)
@@ -91,30 +91,30 @@ typedef struct {
 
   parameter_type type;
 
-  char *id;            /* widget name */
-  char *label;         /* heading label, or null */
+  xmlChar *id;         /* widget name */
+  xmlChar *label;      /* heading label, or null */
 
   /* command, fake, description, fakepreview, string, file
    */
-  char *string;                /* file name, description, whatever. */
+  xmlChar *string;     /* file name, description, whatever. */
 
   /* slider, spinbutton
    */
-  char *low_label;     /* label for the left side */
-  char *high_label;    /* label for the right side */
+  xmlChar *low_label;  /* label for the left side */
+  xmlChar *high_label; /* label for the right side */
   float low;           /* minimum value */
   float high;          /* maximum value */
   float value;         /* default value */
   gboolean integer_p;  /* whether the range is integral, or real */
-  char *arg;           /* command-line option to set (substitute "%") */
+  xmlChar *arg;                /* command-line option to set (substitute "%") */
   gboolean invert_p;   /* whether to flip the value and pretend the
                            range goes from hi-low instead of low-hi. */
 
   /* boolean, select-option
    */
-  char *arg_set;       /* command-line option to set for "yes", or null */
-  char *arg_unset;     /* command-line option to set for "no", or null */
-  char *test;          /* #### no idea - enablement? */
+  xmlChar *arg_set;    /* command-line option to set for "yes", or null */
+  xmlChar *arg_unset;  /* command-line option to set for "no", or null */
+  xmlChar *test;       /* #### no idea - enablement? */
 
   /* select
    */
@@ -246,9 +246,9 @@ describe_parameter (FILE *out, parameter *p)
    `floatp' is set to TRUE.  Otherwise, it is unchanged.
  */
 static float
-xml_get_float (xmlNodePtr node, const char *name, gboolean *floatpP)
+xml_get_float (xmlNodePtr node, const xmlChar *name, gboolean *floatpP)
 {
-  const char *s = xmlGetProp (node, name);
+  const char *s = (char *) xmlGetProp (node, name);
   float f;
   char c;
   if (!s || 1 != sscanf (s, "%f %c", &f, &c))
@@ -262,7 +262,7 @@ xml_get_float (xmlNodePtr node, const char *name, gboolean *floatpP)
 
 
 static void sanity_check_parameter (const char *filename,
-                                    const char *node_name,
+                                    const xmlChar *node_name,
                                     parameter *p);
 
 /* Allocates and returns a new `parameter' object based on the
@@ -273,7 +273,7 @@ static parameter *
 make_parameter (const char *filename, xmlNodePtr node)
 {
   parameter *p;
-  const char *name = node->name;
+  const char *name = (char *) node->name;
   const char *convert;
   gboolean floatp = FALSE;
 
@@ -304,7 +304,7 @@ make_parameter (const char *filename, xmlNodePtr node)
 
   if (p->type == SPINBUTTON)
     {
-      const char *type = xmlGetProp (node, "type");
+      const char *type = (char *) xmlGetProp (node, (xmlChar *) "type");
       if (!type || !strcmp (type, "spinbutton")) p->type = SPINBUTTON;
       else if (!strcmp (type, "slider"))         p->type = SLIDER;
       else
@@ -321,23 +321,24 @@ make_parameter (const char *filename, xmlNodePtr node)
       if (node->xmlChildrenNode &&
           node->xmlChildrenNode->type == XML_TEXT_NODE &&
           !node->xmlChildrenNode->next)
-        p->string = strdup (node->xmlChildrenNode->content);
+        p->string = (xmlChar *)
+          strdup ((char *) node->xmlChildrenNode->content);
     }
 
-  p->id         = xmlGetProp (node, "id");
-  p->label      = xmlGetProp (node, "_label");
-  p->low_label  = xmlGetProp (node, "_low-label");
-  p->high_label = xmlGetProp (node, "_high-label");
-  p->low        = xml_get_float (node, "low",     &floatp);
-  p->high       = xml_get_float (node, "high",    &floatp);
-  p->value      = xml_get_float (node, "default", &floatp);
+  p->id         = xmlGetProp (node, (xmlChar *) "id");
+  p->label      = xmlGetProp (node, (xmlChar *) "_label");
+  p->low_label  = xmlGetProp (node, (xmlChar *) "_low-label");
+  p->high_label = xmlGetProp (node, (xmlChar *) "_high-label");
+  p->low        = xml_get_float (node, (xmlChar *) "low",     &floatp);
+  p->high       = xml_get_float (node, (xmlChar *) "high",    &floatp);
+  p->value      = xml_get_float (node, (xmlChar *) "default", &floatp);
   p->integer_p  = !floatp;
-  convert       = xmlGetProp (node, "convert");
+  convert       = (char *) xmlGetProp (node, (xmlChar *) "convert");
   p->invert_p   = (convert && !strcmp (convert, "invert"));
-  p->arg        = xmlGetProp (node, "arg");
-  p->arg_set    = xmlGetProp (node, "arg-set");
-  p->arg_unset  = xmlGetProp (node, "arg-unset");
-  p->test       = xmlGetProp (node, "test");
+  p->arg        = xmlGetProp (node, (xmlChar *) "arg");
+  p->arg_set    = xmlGetProp (node, (xmlChar *) "arg-set");
+  p->arg_unset  = xmlGetProp (node, (xmlChar *) "arg-unset");
+  p->test       = xmlGetProp (node, (xmlChar *) "test");
 
   /* Check for missing decimal point */
   if (debug_p &&
@@ -360,7 +361,7 @@ make_parameter (const char *filename, xmlNodePtr node)
         }
     }
 
-  sanity_check_parameter (filename, name, p);
+  sanity_check_parameter (filename, (const xmlChar *) name, p);
 
   return p;
 }
@@ -383,7 +384,7 @@ make_select_option (const char *filename, xmlNodePtr node)
                  blurb(), filename, node->name, (int)node->type);
       return 0;
     }
-  else if (strcmp (node->name, "option"))
+  else if (strcmp ((char *) node->name, "option"))
     {
       if (debug_p)
         fprintf (stderr,
@@ -397,12 +398,12 @@ make_select_option (const char *filename, xmlNodePtr node)
       char *enable, *e;
 
       s->type       = SELECT_OPTION;
-      s->id         = xmlGetProp (node, "id");
-      s->label      = xmlGetProp (node, "_label");
-      s->arg_set    = xmlGetProp (node, "arg-set");
-      s->arg_unset  = xmlGetProp (node, "arg-unset");
-      s->test       = xmlGetProp (node, "test");
-      enable        = xmlGetProp (node, "enable");
+      s->id         = xmlGetProp (node, (xmlChar *) "id");
+      s->label      = xmlGetProp (node, (xmlChar *) "_label");
+      s->arg_set    = xmlGetProp (node, (xmlChar *) "arg-set");
+      s->arg_unset  = xmlGetProp (node, (xmlChar *) "arg-unset");
+      s->test       = xmlGetProp (node, (xmlChar *) "test");
+      enable = (char*)xmlGetProp (node, (xmlChar *) "enable");
 
       if (enable)
         {
@@ -426,7 +427,7 @@ make_select_option (const char *filename, xmlNodePtr node)
    when they should have typed "arg=", etc.
  */
 static void
-sanity_check_parameter (const char *filename, const char *node_name,
+sanity_check_parameter (const char *filename, const xmlChar *node_name,
                         parameter *p)
 {
   struct {
@@ -530,10 +531,10 @@ sanity_check_parameter (const char *filename, const char *node_name,
 # define WARN(STR) \
    fprintf (stderr, "%s: %s: " STR " in <%s%s id=\"%s\">\n", \
               blurb(), filename, node_name, \
-              (!strcmp(node_name, "number") \
+              (!strcmp((char *) node_name, "number") \
                ? (p->type == SPINBUTTON ? " type=spinbutton" : " type=slider")\
                : ""), \
-              (p->id ? p->id : ""))
+              (p->id ? (char *) p->id : ""))
 # define CHECK(SLOT,NAME) \
    if (p->SLOT && !allowed.SLOT) \
      WARN ("\"" NAME "\" is not a valid option"); \
@@ -568,7 +569,7 @@ make_parameters_1 (const char *filename, xmlNodePtr node,
 
   for (; node; node = node->next)
     {
-      const char *name = node->name;
+      const char *name = (char *) node->name;
       if (!strcmp (name, "hgroup") ||
           !strcmp (name, "vgroup"))
         {
@@ -616,7 +617,7 @@ make_parameters (const char *filename, xmlNodePtr node, GtkWidget *parent)
   for (; node; node = node->next)
     {
       if (node->type == XML_ELEMENT_NODE &&
-          !strcmp (node->name, "screensaver"))
+          !strcmp ((char *) node->name, "screensaver"))
         return make_parameters_1 (filename, node->xmlChildrenNode, parent, &row);
     }
   return 0;
@@ -693,7 +694,7 @@ static void
 make_parameter_widget (const char *filename,
                        parameter *p, GtkWidget *parent, int *row)
 {
-  const char *label = p->label;
+  const char *label = (char *) p->label;
   if (p->widget) return;
 
   switch (p->type)
@@ -715,7 +716,7 @@ make_parameter_widget (const char *filename,
 
         p->widget = gtk_entry_new ();
         if (p->string)
-          gtk_entry_set_text (GTK_ENTRY (p->widget), p->string);
+          gtk_entry_set_text (GTK_ENTRY (p->widget), (char *) p->string);
         if (row)
           gtk_table_attach (GTK_TABLE (parent), p->widget, 1, 3,
                             *row, *row + 1,
@@ -742,7 +743,7 @@ make_parameter_widget (const char *filename,
         gtk_widget_show (L);
 
         if (p->string)
-          gtk_entry_set_text (GTK_ENTRY (entry), p->string);
+          gtk_entry_set_text (GTK_ENTRY (entry), (char *) p->string);
 
         if (row)
           {
@@ -828,7 +829,7 @@ make_parameter_widget (const char *filename,
 
         if (p->low_label)
           {
-            GtkWidget *w = gtk_label_new (_(p->low_label));
+            GtkWidget *w = gtk_label_new (_((char *) p->low_label));
             gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_RIGHT);
             gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5);
             gtk_widget_show (w);
@@ -853,7 +854,7 @@ make_parameter_widget (const char *filename,
 
         if (p->high_label)
           {
-            GtkWidget *w = gtk_label_new (_(p->high_label));
+            GtkWidget *w = gtk_label_new (_((char *) p->high_label));
             gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
             gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.5);
             gtk_widget_show (w);
@@ -935,7 +936,7 @@ make_parameter_widget (const char *filename,
         for (opts = p->options; opts; opts = opts->next)
           {
             parameter *s = (parameter *) opts->data;
-            GtkWidget *i = gtk_menu_item_new_with_label (_(s->label));
+            GtkWidget *i = gtk_menu_item_new_with_label (_((char *) s->label));
             gtk_widget_show (i);
             gtk_menu_append (GTK_MENU (menu), i);
           }
@@ -962,7 +963,7 @@ make_parameter_widget (const char *filename,
 
   if (p->widget)
     {
-      gtk_widget_set_name (p->widget, p->id);
+      gtk_widget_set_name (p->widget, (char *) p->id);
       gtk_widget_show (p->widget);
       if (row)
         (*row)++;
@@ -1124,7 +1125,7 @@ de_stringify (char *s)
 static char *
 format_switch (parameter *p, const char *value)
 {
-  char *fmt = p->arg;
+  char *fmt = (char *) p->arg;
   char *v2;
   char *result, *s;
   if (!fmt || !value) return 0;
@@ -1156,7 +1157,7 @@ parameter_to_switch (parameter *p)
     {
     case COMMAND:
       if (p->arg)
-        return strdup (p->arg);
+        return strdup ((char *) p->arg);
       else
         return 0;
       break;
@@ -1167,7 +1168,7 @@ parameter_to_switch (parameter *p)
         const char *s = gtk_entry_get_text (GTK_ENTRY (p->widget));
         char *v;
         if (!strcmp ((s ? s : ""),
-                     (p->string ? p->string : "")))
+                     (p->string ? (char *) p->string : "")))
           v = 0;  /* same as default */
         else
           v = format_switch (p, s);
@@ -1213,8 +1214,8 @@ parameter_to_switch (parameter *p)
       {
         GtkToggleButton *b = GTK_TOGGLE_BUTTON (p->widget);
         const char *s = (gtk_toggle_button_get_active (b)
-                         ? p->arg_set
-                         : p->arg_unset);
+                         ? (char *) p->arg_set
+                         : (char *) p->arg_unset);
         if (s)
           return strdup (s);
         else
@@ -1233,7 +1234,7 @@ parameter_to_switch (parameter *p)
         const char *s;
         if (!o) abort();
         if (o->type != SELECT_OPTION) abort();
-        s = o->arg_set;
+        s = (char *) o->arg_set;
         if (s)
           return strdup (s);
         else
@@ -1453,7 +1454,7 @@ parse_command_line_into_parameters_1 (const char *filename,
         }
       else if (pp->arg)
         {
-          if (compare_opts (option, value, pp->arg))
+          if (compare_opts (option, value, (char *) pp->arg))
             {
               which = -1;
               match = pp;
@@ -1461,7 +1462,7 @@ parse_command_line_into_parameters_1 (const char *filename,
         }
       else if (pp->arg_set)
         {
-          if (compare_opts (option, value, pp->arg_set))
+          if (compare_opts (option, value, (char *) pp->arg_set))
             {
               which = 1;
               match = pp;
@@ -1469,7 +1470,7 @@ parse_command_line_into_parameters_1 (const char *filename,
         }
       else if (pp->arg_unset)
         {
-          if (compare_opts (option, value, pp->arg_unset))
+          if (compare_opts (option, value, (char *) pp->arg_unset))
             {
               which = 0;
               match = pp;
@@ -1580,7 +1581,7 @@ restore_defaults (const char *progname, GList *parms)
         case FILENAME:
           {
             gtk_entry_set_text (GTK_ENTRY (p->widget),
-                                (p->string ? p->string : ""));
+                                (p->string ? (char *) p->string : ""));
             break;
           }
         case SLIDER:
@@ -1658,7 +1659,7 @@ get_description (GList *parms)
     return 0;
   else
     {
-      char *d = strdup (doc->string);
+      char *d = strdup ((char *) doc->string);
       char *s;
       for (s = d; *s; s++)
         if (s[0] == '\n')
@@ -1781,7 +1782,7 @@ load_configurator_1 (const char *program, const char *arguments,
 
       p = calloc (1, sizeof(*p));
       p->type = COMMAND;
-      p->arg = strdup (arguments);
+      p->arg = (xmlChar *) strdup (arguments);
 
       data->parameters = g_list_append (0, (gpointer) p);
     }
index e2c9be771cd5166c0e72da060cf75de2374d1343..3ac260ae8cdd909926744dc9e8a987f4cd462708 100644 (file)
 #include "demo-Gtk-widgets.h"
 #include "demo-Gtk-support.h"
 
+# ifdef __GNUC__
+#  define STFU __extension__  /* ignore gcc -pendantic warnings in next sexp */
+# else
+#  define STFU /* */
+# endif
+
 GtkWidget*
 create_xscreensaver_demo (void)
 {
@@ -480,7 +486,7 @@ create_xscreensaver_demo (void)
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (demo);
   gtk_container_add (GTK_CONTAINER (demo_manual_hbbox), demo);
-  GTK_WIDGET_SET_FLAGS (demo, GTK_CAN_DEFAULT);
+  STFU GTK_WIDGET_SET_FLAGS (demo, GTK_CAN_DEFAULT);
   gtk_tooltips_set_tip (tooltips, demo, _("Demo the selected screen saver in full-screen mode (click the mouse to return.)"), NULL);
 
   settings = gtk_button_new_with_label (_("Settings..."));
@@ -490,7 +496,7 @@ create_xscreensaver_demo (void)
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (settings);
   gtk_container_add (GTK_CONTAINER (demo_manual_hbbox), settings);
-  GTK_WIDGET_SET_FLAGS (settings, GTK_CAN_DEFAULT);
+  STFU GTK_WIDGET_SET_FLAGS (settings, GTK_CAN_DEFAULT);
   gtk_tooltips_set_tip (tooltips, settings, _("Customization and explanation of the selected screen saver."), NULL);
 
   list_vbox = gtk_vbox_new (FALSE, 0);
@@ -642,7 +648,7 @@ create_xscreensaver_demo (void)
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (next);
   gtk_box_pack_start (GTK_BOX (next_prev_hbox), next, FALSE, FALSE, 0);
-  GTK_WIDGET_SET_FLAGS (next, GTK_CAN_DEFAULT);
+  STFU GTK_WIDGET_SET_FLAGS (next, GTK_CAN_DEFAULT);
   gtk_tooltips_set_tip (tooltips, next, _("Run the next screen saver in the list in full-screen mode (click the mouse to return.)"), NULL);
 
   prev = gtk_button_new_with_label (_("/\\"));
@@ -652,7 +658,7 @@ create_xscreensaver_demo (void)
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (prev);
   gtk_box_pack_start (GTK_BOX (next_prev_hbox), prev, FALSE, FALSE, 0);
-  GTK_WIDGET_SET_FLAGS (prev, GTK_CAN_DEFAULT);
+  STFU GTK_WIDGET_SET_FLAGS (prev, GTK_CAN_DEFAULT);
   gtk_tooltips_set_tip (tooltips, prev, _("Run the previous screen saver in the list in full-screen mode (click the mouse to return.)"), NULL);
 
   preview_frame = gtk_frame_new (_("Description"));
@@ -1645,7 +1651,7 @@ create_xscreensaver_settings_dialog (void)
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (manual);
   gtk_container_add (GTK_CONTAINER (doc_hbuttonbox), manual);
-  GTK_WIDGET_SET_FLAGS (manual, GTK_CAN_DEFAULT);
+  STFU GTK_WIDGET_SET_FLAGS (manual, GTK_CAN_DEFAULT);
   gtk_tooltips_set_tip (tooltips, manual, _("Click here to read the manual for this display mode, if it has one."), NULL);
 
   dialog_action_area = GTK_DIALOG (xscreensaver_settings_dialog)->action_area;
@@ -1678,7 +1684,7 @@ create_xscreensaver_settings_dialog (void)
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (adv_button);
   gtk_container_add (GTK_CONTAINER (dialog_hbuttonbox), adv_button);
-  GTK_WIDGET_SET_FLAGS (adv_button, GTK_CAN_DEFAULT);
+  STFU GTK_WIDGET_SET_FLAGS (adv_button, GTK_CAN_DEFAULT);
   gtk_tooltips_set_tip (tooltips, adv_button, _("Edit the command line directly."), NULL);
 
   std_button = gtk_button_new_with_label (_("Standard <<"));
@@ -1688,7 +1694,7 @@ create_xscreensaver_settings_dialog (void)
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (std_button);
   gtk_container_add (GTK_CONTAINER (dialog_hbuttonbox), std_button);
-  GTK_WIDGET_SET_FLAGS (std_button, GTK_CAN_DEFAULT);
+  STFU GTK_WIDGET_SET_FLAGS (std_button, GTK_CAN_DEFAULT);
   gtk_tooltips_set_tip (tooltips, std_button, _("Back to the graphical configuration options."), NULL);
 
   ok_cancel_hbuttonbox = gtk_hbutton_box_new ();
@@ -1707,7 +1713,7 @@ create_xscreensaver_settings_dialog (void)
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (ok_button);
   gtk_container_add (GTK_CONTAINER (ok_cancel_hbuttonbox), ok_button);
-  GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT);
+  STFU GTK_WIDGET_SET_FLAGS (ok_button, GTK_CAN_DEFAULT);
 
   cancel_button = gtk_button_new_with_label (_("Cancel"));
   gtk_widget_set_name (cancel_button, "cancel_button");
@@ -1716,7 +1722,7 @@ create_xscreensaver_settings_dialog (void)
                             (GtkDestroyNotify) gtk_widget_unref);
   gtk_widget_show (cancel_button);
   gtk_container_add (GTK_CONTAINER (ok_cancel_hbuttonbox), cancel_button);
-  GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT);
+  STFU GTK_WIDGET_SET_FLAGS (cancel_button, GTK_CAN_DEFAULT);
 
   gtk_signal_connect (GTK_OBJECT (opt_notebook), "switch_page",
                       GTK_SIGNAL_FUNC (settings_switch_page_cb),
index b2620a4f7ef12d17e8488a2a6b1afae377dea322..715ca3934f55a472ed8a2b8300177e391a65d9b3 100644 (file)
 # include <unistd.h>
 #endif
 
+# ifdef __GNUC__
+#  define STFU __extension__  /* ignore gcc -pendantic warnings in next sexp */
+# else
+#  define STFU /* */
+# endif
+
+
 #ifdef ENABLE_NLS
 # include <locale.h>
 #endif /* ENABLE_NLS */
@@ -515,13 +522,13 @@ warning_dialog (GtkWidget *parent, const char *message,
   gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
   gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
   gtk_window_set_title (GTK_WINDOW (dialog), progclass);
-  GTK_WIDGET_SET_FLAGS (ok, GTK_CAN_DEFAULT);
+  STFU GTK_WIDGET_SET_FLAGS (ok, GTK_CAN_DEFAULT);
   gtk_widget_show (ok);
   gtk_widget_grab_focus (ok);
 
   if (cancel)
     {
-      GTK_WIDGET_SET_FLAGS (cancel, GTK_CAN_DEFAULT); 
+      STFU GTK_WIDGET_SET_FLAGS (cancel, GTK_CAN_DEFAULT); 
       gtk_widget_show (cancel);
     }
   gtk_widget_show (label);
@@ -850,6 +857,12 @@ await_xscreensaver (state *s)
                "\n"));
 
       if (root_p)
+
+# ifdef __GNUC__
+        __extension__     /* don't warn about "string length is greater than
+                             the length ISO C89 compilers are required to
+                             support" in the following expression... */
+# endif
         strcat (buf,
          _("You are running as root.  This usually means that xscreensaver\n"
             "was unable to contact your X server because access control is\n"
@@ -988,7 +1001,7 @@ force_list_select_item (state *s, GtkWidget *list, int list_elt, Bool scroll_p)
   if (!was) gtk_widget_set_sensitive (parent, True);
 #ifdef HAVE_GTK2
   model = gtk_tree_view_get_model (GTK_TREE_VIEW (list));
-  g_assert (model);
+  STFU g_assert (model);
   gtk_tree_model_iter_nth_child (model, &iter, NULL, list_elt);
   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list));
   gtk_tree_selection_select_iter (selection, &iter);
@@ -1136,7 +1149,7 @@ hack_time_text (state *s, const char *line, Time *store, Bool sec_p)
       else
         {
           char c;
-          if (sscanf (line, "%u%c", &value, &c) != 1)
+          if (sscanf (line, "%d%c", &value, &c) != 1)
             value = -1;
           if (!sec_p)
             value *= 60;
@@ -1506,7 +1519,7 @@ flush_popup_changes_and_save (state *s)
   else if (!strcasecmp (visual, "greyscale"))          visual = "GrayScale";
   else if (!strcasecmp (visual, "pseudocolor"))        visual = "PseudoColor";
   else if (!strcasecmp (visual, "directcolor"))        visual = "DirectColor";
-  else if (1 == sscanf (visual, " %ld %c", &id, &c))   ;
+  else if (1 == sscanf (visual, " %lu %c", &id, &c))   ;
   else if (1 == sscanf (visual, " 0x%lx %c", &id, &c)) ;
   else
     {
@@ -1630,7 +1643,7 @@ list_activated_cb (GtkTreeView       *list,
   char *str;
   int list_elt;
 
-  g_return_if_fail (!gdk_pointer_is_grabbed ());
+  STFU g_return_if_fail (!gdk_pointer_is_grabbed ());
 
   str = gtk_tree_path_to_string (path);
   list_elt = strtol (str, NULL, 10);
@@ -3899,6 +3912,12 @@ g_log_handler (const gchar *log_domain, GLogLevelFlags log_level,
 }
 
 
+#ifdef __GNUC__
+ __extension__     /* shut up about "string length is greater than the length
+                      ISO C89 compilers are required to support" when including
+                      the .ad file... */
+#endif
+
 static char *defaults[] = {
 #include "XScreenSaver_ad.h"
  0
@@ -4442,7 +4461,7 @@ main (int argc, char **argv)
       gtk_widget_ref (outer_vbox);
       gtk_container_remove (GTK_CONTAINER (s->toplevel_widget),
                             outer_vbox);
-      GTK_OBJECT_SET_FLAGS (outer_vbox, GTK_FLOATING);
+      STFU GTK_OBJECT_SET_FLAGS (outer_vbox, GTK_FLOATING);
       gtk_container_add (GTK_CONTAINER (capplet), outer_vbox);
 
       /* Find the window above us, and set the title and close handler. */
index f8d0de286ee7efc80cf79123b40f045f28b22fef..c0f72e3a772c74990417e9c96ba8c7fbccb0624b 100644 (file)
@@ -467,6 +467,11 @@ await_xscreensaver (Widget widget)
               "\n");
 
       if (root_p)
+# ifdef __GNUC__
+        __extension__     /* don't warn about "string length is greater than
+                             the length ISO C89 compilers are required to
+                             support" in the following expression... */
+# endif
         strcat (buf,
             "You are running as root.  This usually means that xscreensaver\n"
             "was unable to contact your X server because access control is\n"
@@ -599,7 +604,7 @@ apply_changes_and_save (Widget widget)
   else if (!strcasecmp (visual, "greyscale"))          visual = "GrayScale";
   else if (!strcasecmp (visual, "pseudocolor"))        visual = "PseudoColor";
   else if (!strcasecmp (visual, "directcolor"))        visual = "DirectColor";
-  else if (1 == sscanf (visual, " %ld %c", &id, &c))   ;
+  else if (1 == sscanf (visual, " %lu %c", &id, &c))   ;
   else if (1 == sscanf (visual, " 0x%lx %c", &id, &c)) ;
   else
     {
@@ -1677,6 +1682,12 @@ demo_ehandler (Display *dpy, XErrorEvent *error)
 
 
 
+#ifdef __GNUC__
+ __extension__     /* shut up about "string length is greater than the length
+                      ISO C89 compilers are required to support" when including
+                      the .ad file... */
+#endif
+
 static char *defaults[] = {
 #include "XScreenSaver_ad.h"
  0
index 7560d1a41ec487175784a56687f81db48495a77b..a5abb806cef71521c5291cb6c0baded8270e75f4 100644 (file)
@@ -246,6 +246,7 @@ pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
 
   PAM_NO_DELAY(pamh);
 
+  timeout.tv_sec = 0;
   timeout.tv_nsec = 1;
   set = block_sigchld();
   status = pam_authenticate (pamh, 0);
index 41613c7dcbcd2f05ecc4681f98d4f7c7df7be61a..ed10dc64adb09844040a374aa0386a32f5a9ad26 100644 (file)
@@ -48,6 +48,11 @@ static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV;
 static Atom XA_RESTART, XA_PREFS, XA_THROTTLE, XA_UNTHROTTLE;
 
 static char *screensaver_version;
+# ifdef __GNUC__
+  __extension__   /* don't warn about "string length is greater than the
+                     length ISO C89 compilers are required to support" in the
+                     usage string... */
+# endif
 static char *usage = "\n\
 usage: %s -<option>\n\
 \n\
index 1823ad09269fc5948d528f0d2e1628f08c5efea6..af0505e6950db5451fbb69cedf036af44c8e035c 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "23-Jun-2003 (4.11)" "X Version 11"
+.TH XScreenSaver 1 "14-Aug-2003 (4.12)" "X Version 11"
 .SH NAME
 xscreensaver-command - control a running xscreensaver process
 .SH SYNOPSIS
index 135cbe45f1c155aeb38caff4cebd23b8259d67c0..34884f0036a80b9f9fd88b4d0a39fdcae28cf40d 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "23-Jun-2003 (4.11)" "X Version 11"
+.TH XScreenSaver 1 "14-Aug-2003 (4.12)" "X Version 11"
 .SH NAME
 xscreensaver-demo - interactively control the background xscreensaver daemon
 .SH SYNOPSIS
index f7f4c8746d1133042f2817d6058d28d1ceed5974..619020497d39c293085bc3a762367697f76a52da 100755 (executable)
@@ -51,10 +51,18 @@ BEGIN {
 
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.12 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.13 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 
 my $verbose = 0;
 
+# This matches files that we are allowed to use as images (case-insensitive.)
+# Anything not matching this is ignored.  This is so you can point your
+# imageDirectory at directory trees that have things other than images in
+# them, but it assumes that you gave your images sensible file extensions.
+#
+my $good_file_re = '\.(gif|p?jpe?g|png|tiff?|xbm|xpm)$';
+
+
 # These are programs that can be used to put an image file on the root
 # window (including virtual root windows.)  The first one of these programs
 # that exists on $PATH will be used (with the file name as the last arg.)
@@ -72,6 +80,7 @@ my @programs = (
 # "xsri       -scale -keep-aspect -center-horizontal -center-vertical",
 );
 
+
 sub pick_displayer {
   my @names = ();
 
@@ -95,6 +104,8 @@ sub pick_displayer {
 
 my @all_files = ();
 my %seen_inodes;
+my $skip_count = 0;
+my $dir_count = 1;
 
 sub find_all_files {
   my ($dir) = @_;
@@ -112,10 +123,7 @@ sub find_all_files {
   my @dirs = ();
 
   foreach my $file (@files) {
-    next if ($file =~ m/^\./);      # ignore dot files
-    next if ($file =~ m/[~%\#]$/);  # ignore backup files
-    next if ($file =~ m/\.(BAK|bak|tmp|orig|rej|rpmsave)$/);
-    next if ($file eq "core");
+    next if ($file =~ m/^\./);      # ignore dot files/dirs
 
     $file = "$dir/$file";
     my @st = stat($file);
@@ -139,10 +147,18 @@ sub find_all_files {
 
     if (S_ISDIR($mode)) {
       push @dirs, $file;
+      $dir_count++;
       print STDERR "$progname:   found dir  $file\n" if ($verbose > 2);
     } elsif (S_ISREG($mode) || S_ISLNK($mode)) {
-      push @all_files, $file;
-      print STDERR "$progname:   found file $file\n" if ($verbose > 2);
+
+      if ($file =~ m/[~%\#]$/ ||               # backup file, or
+          ! ($file =~ m/$good_file_re/io)) {   # no image extension
+        $skip_count++;
+        print STDERR "$progname:   skip file $file\n" if ($verbose > 2);
+      } else {
+        push @all_files, $file;
+        print STDERR "$progname:   found file $file\n" if ($verbose > 2);
+      }
     } elsif ($verbose > 2) {
       print STDERR "$progname:   nonreg $file\n";
     }
@@ -161,7 +177,11 @@ sub find_random_file {
 
   print STDERR "$progname: recursively reading $dir...\n" if ($verbose > 1);
   find_all_files ($dir);
-  print STDERR "$progname: found " . ($#all_files+1) . " files\n"
+  print STDERR "$progname: found " . ($#all_files+1) .
+               " file" . ($#all_files == 0 ? "" : "s") .
+               " in $dir_count dir" . ($dir_count == 1 ? "" : "s") .
+               "; skipped $skip_count file" . ($skip_count == 1 ? "" : "s") .
+               ".\n"
     if ($verbose > 1);
 
   @all_files = sort(@all_files);
index f69bffb17a69c9c2e0185eba96e9aed3ebfa81af..f84a146efec46378c2ac449b67942675efa53d64 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "23-Jun-2003 (4.11)" "X Version 11"
+.TH XScreenSaver 1 "14-Aug-2003 (4.12)" "X Version 11"
 .SH NAME
 xscreensaver-getimage-file - put a randomly-selected image on the root window
 .SH SYNOPSIS
index cfeb15da9e0f99b22d90bacbb0e20e26cbd4123d..5cd56bd5edf78198d6daed3341b8b8524dbcaf3d 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "23-Jun-2003 (4.11)" "X Version 11"
+.TH XScreenSaver 1 "14-Aug-2003 (4.12)" "X Version 11"
 .SH NAME
 xscreensaver-getimage-video - put a video frame on the root window
 .SH SYNOPSIS
index 47247686b428a9508bcc1e3573153b1d22a492c5..8dc800a40ed97709d542c4106d46dce3258cab1b 100644 (file)
 #endif
 
 
+#ifdef __GNUC__
+ __extension__     /* shut up about "string length is greater than the length
+                      ISO C89 compilers are required to support" when including
+                      the .ad file... */
+#endif
+
 static char *defaults[] = {
 #include "../driver/XScreenSaver_ad.h"
  0
@@ -184,7 +190,10 @@ compute_image_scaling (int src_w, int src_h,
       int th = src_h * r;
       int pct = (r * 100);
 
+#if 0
+      /* this optimization breaks things */
       if (pct < 95 || pct > 105)  /* don't scale if it's close */
+#endif
         {
           if (verbose_p)
             fprintf (stderr, "%s: scaling image by %d%% (%dx%d -> %dx%d)\n",
@@ -575,8 +584,7 @@ maybe_read_ppm (Screen *screen, Visual *visual,
   ximage = XCreateImage (dpy, visual, depth, ZPixmap, 0, 0,
                          w, h, 8, 0);
   if (ximage)
-    ximage->data = (unsigned char *)
-      calloc (ximage->height, ximage->bytes_per_line);
+    ximage->data = (char *) calloc (ximage->height, ximage->bytes_per_line);
   if (!ximage || !ximage->data)
     {
       fprintf (stderr, "%s: out of memory loading %dx%d PPM file %s\n",
@@ -722,8 +730,7 @@ read_jpeg_ximage (Screen *screen, Visual *visual, Drawable drawable,
                          cinfo.output_width, cinfo.output_height,
                          8, 0);
   if (ximage)
-    ximage->data = (unsigned char *)
-      calloc (ximage->height, ximage->bytes_per_line);
+    ximage->data = (char *) calloc (ximage->height, ximage->bytes_per_line);
 
   if (ximage && ximage->data)
     scanbuf = (*cinfo.mem->alloc_sarray) ((j_common_ptr) &cinfo, JPOOL_IMAGE,
@@ -814,8 +821,7 @@ scale_ximage (Screen *screen, Visual *visual,
   XImage *ximage2 = XCreateImage (dpy, visual, depth,
                                   ZPixmap, 0, 0,
                                   new_width, new_height, 8, 0);
-  ximage2->data = (unsigned char *)
-    calloc (ximage2->height, ximage2->bytes_per_line);
+  ximage2->data = (char *) calloc (ximage2->height, ximage2->bytes_per_line);
 
   if (!ximage2->data)
     {
@@ -1462,7 +1468,7 @@ main (int argc, char **argv)
           window = (Window) RootWindowOfScreen (screen);
         }
       else if ((1 == sscanf (argv[i], " 0x%lx %c", &w, &dummy) ||
-                1 == sscanf (argv[i], " %ld %c",   &w, &dummy)) &&
+                1 == sscanf (argv[i], " %lu %c",   &w, &dummy)) &&
                w != 0)
         {
           if (drawable)
@@ -1491,6 +1497,11 @@ main (int argc, char **argv)
             fprintf (stderr, "\n%s: unparsable window/pixmap ID: \"%s\"\n",
                      progname, argv[i]);
         LOSE:
+# ifdef __GNUC__
+          __extension__   /* don't warn about "string length is greater than
+                             the length ISO C89 compilers are required to
+                             support" in the usage string... */
+# endif
           fprintf (stderr, USAGE, progname, version, progname);
           exit (1);
         }
index 9f325df712ce8c0dc1be6a0a39a166d843e76b5b..5e0367065cada426e2b4c8fb814b2daa85fa0ecc 100644 (file)
@@ -1,4 +1,4 @@
-.TH XScreenSaver 1 "23-Jun-2003 (4.11)" "X Version 11"
+.TH XScreenSaver 1 "14-Aug-2003 (4.12)" "X Version 11"
 .SH NAME
 xscreensaver-getimage - put some randomly-selected image on the root window
 .SH SYNOPSIS
index 1077c7543c007298008a77c760222f3851504d60..a70de0e4043a2eba2e497f7b36210824cd85c530 100644 (file)
@@ -216,6 +216,12 @@ static XrmOptionDescRec options [] = {
 #endif /* 0 */
 };
 
+#ifdef __GNUC__
+ __extension__     /* shut up about "string length is greater than the length
+                      ISO C89 compilers are required to support" when including
+                      the .ad file... */
+#endif
+
 static char *defaults[] = {
 #include "XScreenSaver_ad.h"
  0
@@ -237,7 +243,9 @@ xscreensaver %s, copyright (c) 1991-2003 by Jamie Zawinski <jwz@jwz.org>\n\
   Rather than editing that file by hand, just run `xscreensaver-demo':\n\
   that program lets you configure the screen saver graphically,\n\
   including timeouts, locking, and display modes.\n\
-\n\
+\n",
+         si->version);
+  fprintf (stdout, "\
   Just getting started?  Try this:\n\
 \n\
         xscreensaver &\n\
@@ -246,8 +254,8 @@ xscreensaver %s, copyright (c) 1991-2003 by Jamie Zawinski <jwz@jwz.org>\n\
   For updates, online manual, and FAQ, please see the web page:\n\
 \n\
        http://www.jwz.org/xscreensaver/\n\
-\n",
-         si->version);
+\n");
+
   fflush (stdout);
   fflush (stderr);
   exit (1);
@@ -341,7 +349,8 @@ saver_ehandler (Display *dpy, XErrorEvent *error)
    "    bug.  That will cause xscreensaver to dump a `core' file to the\n"
    "    current directory.  Please include the stack trace from that core\n"
    "    file in your bug report.  *DO NOT* mail the core file itself!\n"
-   "    That won't work.\n"
+   "    That won't work.\n");
+          fprintf (real_stderr,
    "\n"
    "    http://www.jwz.org/xscreensaver/bugs.html explains how to create\n"
    "    the most useful bug reports, and how to examine core files.\n"
index 81d3e5ad3f360aa8a412c308cd3e18b3aff87553..0e0b2060b7080fff329ed633ddc82a5bf3b516b6 100644 (file)
 #include <string.h>
 #include <stdio.h>
 
+#ifdef HAVE_SIGACTION
+# include <signal.h>    /* for sigset_t */
+#endif
+
 #include "prefs.h"
 
 extern char *progname;
index 6fc5ad85748035fa281fc4d0e36a494ddd4af17d..552e3430cdf52c9237bcce7b3b021d9701227f51 100644 (file)
@@ -11,7 +11,7 @@
 .if n .sp 1
 .if t .sp .5
 ..
-.TH XScreenSaver 1 "23-Jun-2003 (4.11)" "X Version 11"
+.TH XScreenSaver 1 "14-Aug-2003 (4.12)" "X Version 11"
 .SH NAME
 xscreensaver - extensible screen saver framework, plus locking
 .SH SYNOPSIS
index f6b19eb8cabd993feb7674120e40a9b6441f5147..fc61a59dcfee08965dd2fba903e0762a8840ccc4 100644 (file)
@@ -67,7 +67,7 @@ typedef struct
     int width;
     int height;
     int widthBytes;
-    unsigned char *buf;
+    char *buf;
 }
 Bitmap;
 
@@ -594,7 +594,7 @@ static unsigned char font5x8Buf[] =
    0x0f, 0x0f, 0x0f, 0x00
 };
 
-static Bitmap font5x8 = { 8, 1024, 1, font5x8Buf };
+static Bitmap font5x8 = { 8, 1024, 1, (char *) font5x8Buf };
 
 /* draw the given 5x8 character at the given coordinates */
 void bitmapDrawChar5x8 (Bitmap *b, int x, int y, char c)
index fbe2a7706d0f1baf4595d74ece97c8df870a2d9e..008b60fdb52047c5a7a5846d6a5ae6f7146f4f4a 100644 (file)
@@ -17,6 +17,7 @@
 #include "screenhack.h"
 #include "xpm-pixmap.h"
 #include <stdio.h>
+#include <ctype.h>
 #include <time.h>
 #include <sys/time.h>
 #include <X11/Xutil.h>
@@ -224,6 +225,12 @@ windows (Display *dpy, Window window, int delay, int which)
      "\n"
      "_Press any key to continue");
 
+# ifdef __GNUC__
+  __extension__   /* don't warn about "string length is greater than the
+                     length ISO C89 compilers are required to support"
+                     in the following string constant... */
+# endif
+
   const char *wnt = /* from Jim Niemira <urmane@urmane.org> */
     ("*** STOP: 0x0000001E (0x80000003,0x80106fc0,0x8025ea21,0xfd6829e8)\n"
    "Unhandled Kernel exception c0000047 from fa8418b4 (8025ea21,fd6829e8)\n"
@@ -412,6 +419,12 @@ sco (Display *dpy, Window window, int delay)
   int lines_1 = 0, lines_2 = 0, lines_3 = 0, lines_4 = 0;
   const char *s;
 
+# ifdef __GNUC__
+  __extension__   /* don't warn about "string length is greater than the
+                     length ISO C89 compilers are required to support"
+                     in the following string constant... */
+# endif
+
   const char *sco_panic_1 =
     ("Unexpected trap in kernel mode:\n"
      "\n"
@@ -528,6 +541,12 @@ sparc_linux (Display *dpy, Window window, int delay)
   int lines = 1;
   const char *s;
 
+# ifdef __GNUC__
+  __extension__   /* don't warn about "string length is greater than the
+                     length ISO C89 compilers are required to support"
+                     in the following string constant... */
+# endif
+
   const char *linux_panic =
     ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
        "Unable to handle kernel paging request at virtual address f0d4a000\n"
@@ -1002,6 +1021,12 @@ macsbug (Display *dpy, Window window, int delay)
   int col_right, row_top, row_bottom, page_right, page_bottom, body_top;
   int xoff, yoff;
 
+# ifdef __GNUC__
+  __extension__   /* don't warn about "string length is greater than the
+                     length ISO C89 compilers are required to support"
+                     in the following string constant... */
+# endif
+
   const char *left = ("    SP     \n"
                      " 04EB0A58  \n"
                      "58 00010000\n"
@@ -1064,6 +1089,13 @@ macsbug (Display *dpy, Window window, int delay)
                      "  PC: 2A0DE3E6\n"
                      "  Frame Type: B008");
 #else
+
+# ifdef __GNUC__
+  __extension__   /* don't warn about "string length is greater than the
+                     length ISO C89 compilers are required to support"
+                     in the following string constant... */
+# endif
+
   const char * body = ("PowerPC unmapped memory exception at 003AFDAC "
                                                "BowelsOfTheMemoryMgr+04F9C\n"
                      " Calling chain using A6/R1 links\n"
@@ -1259,6 +1291,12 @@ macx (Display *dpy, Window window, int delay)
   XFontStruct *font;
   GC gc;
 
+# ifdef __GNUC__
+  __extension__   /* don't warn about "string length is greater than the
+                     length ISO C89 compilers are required to support"
+                     in the following string constant... */
+# endif
+
   const char *macx_panic =
    ("panic(cpu 0): Unable to find driver for this platform: "
     "\"PowerMac 3,5\".\n"
@@ -1636,6 +1674,12 @@ scrolling_puts (scrolling_window *ts, const char* aString, int delay)
 static void
 sparc_solaris (Display* dpy, Window window, int delay)
 {
+# ifdef __GNUC__
+  __extension__   /* don't warn about "string length is greater than the
+                     length ISO C89 compilers are required to support"
+                     in the following string constant... */
+# endif
+
   const char *msg1 =
     "BAD TRAP: cpu=0 type=0x31 rp=0x2a10043b5e0 addr=0xf3880 mmu_fsr=0x0\n"
     "BAD TRAP occured in module \"unix\" due to an illegal access to a"
@@ -2065,7 +2109,7 @@ linux_fsck (Display *dpy, Window window, int delay)
 
       if (*linux_panic[i])
         {
-          strftime (prefix, sizeof(prefix)-1, "%b %d %k:%M:%S ", tm);
+          strftime (prefix, sizeof(prefix)-1, "%b %d %H:%M:%S ", tm);
           scrolling_puts (ts, prefix, 0);
           scrolling_puts (ts, sysname, 0);
           scrolling_puts (ts, linux_panic[i], 0);
@@ -2092,6 +2136,183 @@ linux_fsck (Display *dpy, Window window, int delay)
   XClearWindow(dpy, window);
 }
 
+/* VMS by jwz (text sent by Roland Barmettler <roli@barmettler.net>)
+ */
+static void
+vms (Display *dpy, Window window, int delay)
+{
+  XWindowAttributes xgwa;
+  scrolling_window *ts;
+  const char *sysname;
+  int char_delay = 0;
+  int dot_delay = 40000;
+  int chunk_delay = 500000;
+  char *s, *s1;
+  int i;
+  int arg_count;
+
+# ifdef __GNUC__
+  __extension__   /* don't warn about "string length is greater than the
+                     length ISO C89 compilers are required to support"
+                     in the following string constant... */
+# endif
+
+  const char *lines[] = {
+    "%CNXMAN,  Lost connection to system #\n"
+    "%SHADOW-I-VOLPROC, DSA0: shadow master has changed.  "
+    "Dump file WILL be written if system crashes.\n"
+    "\n",
+    "",
+
+    "%CNXMAN,  Quorum lost, blocking activity\n"
+    "%CNXMAN,  Timed-out lost connection to system #\n"
+    "%CNXMAN,  Timed-out lost connection to system #\n"
+    "%CNXMAN,  Timed-out lost connection to system #\n"
+    "%CNXMAN,  Proposing reconfiguration of the VMScluster\n",
+    "",
+
+    "%CNXMAN,  Removed from VMScluster system #\n"
+    "%CNXMAN,  Removed from VMScluster system #\n"
+    "%CNXMAN,  Removed from VMScluster system #\n"
+    "%CNXMAN,  Completing VMScluster state transition\n",
+
+    "\n"
+    "**** OpenVMS (TM) Alpha Operating system V7.3-1   - BUGCHECK ****\n"
+    "\n"
+    "** Bugcheck code = 000005DC: CLUEXIT, Node voluntarily exiting "
+    "VMScluster\n"
+    "** Crash CPU: 00    Primary CPU: 00    Active CPUs: 00000001\n"
+    "** Current Process = NULL\n"
+    "** Current PSB ID = 00000001\n"
+    "** Image Name =\n"
+    "\n"
+    "** Dumping error log buffers to HBVS unit 0\n"
+    "**** Unable to dump error log buffers to remaining shadow set members\n"
+    "** Error log buffers not dumped to HBVS unit 200\n"
+    "\n"
+    "** Dumping memory to HBVS unit 0\n"
+    "**** Starting compressed selective memory dump at #...\n",
+
+    "...",
+
+    "\n"
+    "**** Memory dump complete - not all processes or global pages saved\n",
+
+    "\n"
+    "halted CPU 0\n",
+    "",
+
+    "\n"
+    "halt code = 5\n"
+    "HALT instruction executed\n"
+    "PC = ffffffff800c3884\n",
+
+    "\n"
+    "CPU 0 booting\n",
+
+    "\n"
+    "resetting all I/O buses\n"
+    "\n"
+    "\n"
+    };
+  char *args[8];
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+  ts = make_scrolling_window (dpy, window, "VMS", False);
+  XClearWindow(dpy,window);
+  ts->sub_x = 0;
+  ts->sub_y = 0;
+  ts->sub_width = xgwa.width;
+  ts->sub_height = xgwa.height;
+
+  sysname = "VMS001";
+# ifdef HAVE_UNAME
+  {
+    struct utsname uts;
+    if (uname (&uts) >= 0)
+      sysname = uts.nodename;
+    s = strchr (sysname, '.');
+    if (s) *s = 0;
+  }
+# endif        /* !HAVE_UNAME */
+
+  args[0] = malloc (strlen(sysname) + 7);
+  strcpy (args[0], sysname);
+  args[0][5] = 0;
+
+  i = strlen(args[0])-1;
+  if (i < 6) i++;
+  args[0][i] = '1' + (random() % 9);
+  args[0][i+1] = 0;
+
+  for (s = args[0]; *s; s++)
+    if (isalpha(*s)) *s = toupper (*s);
+
+  args[1] = strdup (args[0]);
+  args[2] = strdup (args[0]); args[2][i] = '1' + (random() % 9);
+  args[3] = strdup (args[0]); args[3][i] = '1' + (random() % 9);
+
+  args[4] = strdup (args[1]);
+  args[5] = strdup (args[2]);
+  args[6] = strdup (args[3]);
+
+  {
+    time_t t = time ((time_t *) 0);
+    struct tm *tm = localtime (&t);
+    args[7] = malloc (30);
+    strftime (args[7], 29, "%d-%b-%Y %H:%M", tm);
+    for (s = args[7]; *s; s++)
+      if (isalpha(*s)) *s = toupper (*s);
+  }
+
+  arg_count = 0;
+  for (i = 0; i < countof(lines); i++)
+    {
+      const char *fmt = lines[i];
+      if (! strcmp (fmt, "..."))
+        {
+          int steps = 180 + (random() % 60);
+          while (--steps >= 0)
+            {
+              scrolling_puts (ts, ".", 0);
+              XSync (dpy, False);
+              usleep (dot_delay);
+              if (bsod_sleep (dpy, 0))
+                goto DONE;
+            }
+        }
+      else
+        {
+          char *fmt2 = malloc (strlen (fmt) * 2 + 1);
+          for (s = (char *) fmt, s1 = fmt2; *s; s++)
+            {
+              if (*s == '#')
+                {
+                  strcpy (s1, args[arg_count++]);
+                  s1 += strlen(s1);
+                }
+              else
+                *s1++ = *s;
+            }
+          *s1 = 0;
+          scrolling_puts (ts, fmt2, char_delay);
+          free (fmt2);
+          usleep (chunk_delay);
+          if (bsod_sleep (dpy, 0))
+            goto DONE;
+        }
+    }
+
+  XSync(dpy, False);
+  bsod_sleep(dpy, delay);
+
+ DONE:
+  free_scrolling_window (ts);
+  for (i = 0; i < countof (args); i++)
+    free (args[i]);
+}
+
+
 \f
 
 /* HPUX panic, by Tobias Klausmann <klausman@schwarzvogel.de>
@@ -2105,6 +2326,12 @@ hpux (Display* dpy, Window window, int delay)
   const char *sysname;
   char buf[2048];
 
+# ifdef __GNUC__
+  __extension__   /* don't warn about "string length is greater than the
+                     length ISO C89 compilers are required to support"
+                     in the following string constant... */
+# endif
+
   const char *msg1 =
    "Console Login:\n"
    "\n"
@@ -2447,7 +2674,7 @@ struct apple2_state {
 enum {
   A2_SP_ROWMASK=1023,
   A2_SP_PUT=1024,
-  A2_SP_COPY=2048,
+  A2_SP_COPY=2048
 };
 
 static void
@@ -2752,7 +2979,7 @@ ntsc_to_yiq(struct ntsc_dec *it)
 enum {
   A2_CMAP_HISTBITS=5,
   A2_CMAP_LEVELS=2,
-  A2_CMAP_OFFSETS=4,
+  A2_CMAP_OFFSETS=4
 };
 
 #define A2_CMAP_INDEX(COLORMODE, LEVEL, HIST, OFFSET) \
@@ -3850,6 +4077,7 @@ char *defaults [] = {
   "*doHPUX:                True",
   "*doApple2:              True",
   "*doOS390:               True",
+  "*doVMS:                True",
 
   ".Windows.font:         -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
   ".Windows.font2:        -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*",
@@ -3929,6 +4157,11 @@ char *defaults [] = {
   "*apple2TVContrast:      90",
   "*apple2SimulateUser:    True",
 
+  ".VMS.font:             9x15bold",
+  ".VMS.font2:            -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+  ".VMS.foreground:       White",
+  ".VMS.background:       Black",
+
 #ifdef HAVE_XSHM_EXTENSION
   "*useSHM:                True",
 #endif
@@ -3974,6 +4207,8 @@ XrmOptionDescRec options [] = {
   { "-no-hpux",                ".doHPUX",              XrmoptionNoArg,  "False" },
   { "-os390",          ".doOS390",             XrmoptionNoArg,  "True"  },
   { "-no-os390",       ".doOS390",             XrmoptionNoArg,  "False" },
+  { "-vms",            ".doVMS",               XrmoptionNoArg,  "True"  },
+  { "-no-vms",         ".doVMS",               XrmoptionNoArg,  "False" },
   { 0, 0, 0, 0 }
 };
 
@@ -4000,6 +4235,7 @@ static struct {
   { "HPUX",            hpux },
   { "OS390",           os390 },
   { "Apple2",          apple2 },
+  { "VMS",             vms },
 };
 
 
index ab9095181560c47a318a5b4db19eef00ca4f792c..5b83e21dfd134f7a9a739e031118c7cdc13d40f9 100644 (file)
@@ -16,7 +16,7 @@
 bubbles - frying pan / soft drink simulation
 .SH SYNOPSIS
 .B bubbles
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-simple] [\-broken] [\-3D] [\-file filename] [\-directory directoryname]
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-simple] [\-broken] [\-3D]
 .SH DESCRIPTION
 \fIBubbles\fP sprays lots of little random bubbles all over the window which
 then grow until they reach their maximum size and go pop.  The inspiration
@@ -67,9 +67,7 @@ this sort of thing.
 .TP 8
 .B \-broken
 Don't hide bubbles when they pop.  This was a bug during development
-but the results were actually quite attractive.  (This option is only
-available if you have the XPM library available and the imake generated
-Makefile has defined HAVE_XPM).
+but the results were actually quite attractive.
 .TP 8
 .B \-3D
 Normally, the simulation is done completely in two dimensions.  When a
@@ -80,19 +78,6 @@ whole thing looks more realistic but I find it attracts attention to
 the flickering of each bubble as they are move and are redrawn.  Your
 mileage may vary.
 .TP 8
-.B \-file filename
-Use the pixmap definitions in the given file, instead of the default (if
-one is compiled in).  This is ignored if \fI\-simple\fP is specified.  If
-the file is compressed (either with compress or gzip), it is decompressed
-before use.  (This option only works if you have XPM compiled into your
-binary and you have compiled with BUBBLES_IO set in bubbles.h.  This is
-\fBnot\fP the default).
-.TP 8
-.B \-directory directoryname
-Similar to \fI-file\fP except the file is taken randomly from the
-contents of the specified directory.  (Again, this option is only available
-if you have XPM and BUBBLES_IO was set when compiling.  See above).
-.TP 8
 .B \-quiet
 Don't print messages explaining why one or several command line options
 were ignored.  This is disabled by default.
index 28c58aacd5089dd6d43f010a9efea471350a132c..1500bcc8b114f9034688403bf5550e65776a0055 100644 (file)
@@ -374,7 +374,7 @@ void InitBumpMap( SBumps *pBumps, XWindowAttributes *pXWinAttribs )
        free( aColors );
 }
 
-/* Soften the bump map.  This is to avoid pixellated-looking ridges.
+/* Soften the bump map.  This is to avoid pixelated-looking ridges.
  * |-----|-----|-----|
  * |  0% |12.5%|  0% | The adjacent pixels are averaged together
  * |-----|-----|-----| first.  Then than value is averaged with
@@ -442,7 +442,9 @@ void Execute( SBumps *pBumps )
                if( iScreenY < 0 )                                                      continue;
                else if( iScreenY >= pBumps->iWinHeight )       break;
 
-               pDOffset = &pBumps->pXImage->data[ (iLightY+pBumps->SpotLight.nLightRadius) * pBumps->pXImage->bytes_per_line ];
+    /* warning: pointer targets in assignment differ in signedness
+       Should pDOffset be a int8?  I can't tell.  -jwz, 22-Jul-2003 */
+               pDOffset = (int8_ *) &pBumps->pXImage->data[ (iLightY+pBumps->SpotLight.nLightRadius) * pBumps->pXImage->bytes_per_line ];
                pBOffset = pBumps->aBumpMap + ( iScreenY * pBumps->iWinWidth ) + nLightXPos;
                for( iScreenX=nLightXPos, iLightX=-pBumps->SpotLight.nLightRadius; iLightX<nLightOffsetFar; ++iScreenX, ++iLightX, ++pBOffset, pDOffset+=pBumps->bytesPerPixel )
                {
index bf9188e3e561965063f4aebdf6c94ed59b93f6c5..ba3008536733756eb2874d8dc43a5cc333144a5f 100644 (file)
@@ -4,8 +4,8 @@
             a screen saver and locker for the X window system
                             by Jamie Zawinski
 
-                              version 4.11
-                               23-Jun-2003
+                              version 4.12
+                               14-Aug-2003
 
                      http://www.jwz.org/xscreensaver/
 
diff --git a/hacks/config/antspotlight.xml b/hacks/config/antspotlight.xml
new file mode 100644 (file)
index 0000000..3dfccdc
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="antspotlight" _label="AntSpotlight">
+
+  <command arg="-root"/>
+
+  <number id="speed" type="slider" arg="-delay %"
+          _label="Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="50000" default="20000"
+          convert="invert"/>
+
+  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+  <_description>
+Andspotlight draws an ant (with a headlight) who walks on top of an
+image of your desktop or other image.  Written by Blair Tennessy.
+  </_description>
+</screensaver>
index 7931eec9eb854f8fc5566414294315fa378ebf73..a34a07b44fe2757bffd815bdd87b63ae17e28aa2 100644 (file)
@@ -20,7 +20,7 @@
   <boolean id="3d" _label="Do Red/Blue 3D seperation" arg-set="-3d"/>
 
   <_description>
-This draws what looks like a spinning, deforming baloon with
+This draws what looks like a spinning, deforming balloon with
 varying-sized spots painted on its invisible surface.  Written by
 Jeremie Petit.
   </_description>
index 0194d5617bc09cc2bc1cffec3a37ff8a19d8e085..d7042e19b6612fd96ed8f078fe4a1ed2d30fdb6d 100644 (file)
@@ -19,6 +19,7 @@
      <boolean id="macx"       _label="MacOS X"      arg-unset="-no-macx"/>
      <boolean id="blitdamage" _label="NCD X Terminal" arg-unset="-no-blitdamage"/>
      <boolean id="os390"      _label="OS/390"       arg-unset="-no-os390"/>
+     <boolean id="vms"        _label="VMS"          arg-unset="-no-vms"/>
    </vgroup>
    <vgroup>
      <boolean id="bsd"        _label="BSD"          arg-set="-bsd"/>
index 519adbe47afaf99dbc4f8de13ef869ed428edb57..bfd73a1fedf958d8f65a2b4bb37ee04009193dce 100644 (file)
 
   <select id="engine">
    <option id="random" _label="Random Engine"/>
-   <option id="1" _label="BMW M3 (4 cylinders)" arg-set="-engine 'BMW M3'"/>
-   <option id="2" _label="VW Beetle (4 cylinders, flat)" arg-set="-engine 'VW Beetle'"/>
-   <option id="3" _label="Audi Quattro (5 cylinders)" arg-set="-engine 'Audi Quattro'"/>
-   <option id="4" _label="BMW M5 (6 cylinders)" arg-set="-engine 'BMW M5'"/>
-   <option id="5" _label="Subaru XT (6 cylinders, V)" arg-set="-engine 'Subaru XT'"/>
-   <option id="6" _label="Porsche 911 (6 cylinders, flat)" arg-set="-engine 'Porsche 911'"/>
-   <option id="7" _label="Corvette Z06 (8 cylinders, V)" arg-set="-engine 'Corvette Z06'"/>
-   <option id="8" _label="Dodge Viper (10 cylinders, V)" arg-set="-engine 'Dodge Viper'"/>
-   <option id="9" _label="Jaguar XKE (12 cylinders, V)" arg-set="-engine 'Jaguar XKE'"/>
+   <option id="1" _label="Honda Insight (3 cylinders)" arg-set="-engine 'Honda Insight'"/>
+   <option id="2" _label="BMW M3 (4 cylinders)" arg-set="-engine 'BMW M3'"/>
+   <option id="3" _label="VW Beetle (4 cylinders, flat)" arg-set="-engine 'VW Beetle'"/>
+   <option id="4" _label="Audi Quattro (5 cylinders)" arg-set="-engine 'Audi Quattro'"/>
+   <option id="5" _label="BMW M5 (6 cylinders)" arg-set="-engine 'BMW M5'"/>
+   <option id="6" _label="Subaru XT (6 cylinders, V)" arg-set="-engine 'Subaru XT'"/>
+   <option id="7" _label="Porsche 911 (6 cylinders, flat)" arg-set="-engine 'Porsche 911'"/>
+   <option id="8" _label="Corvette Z06 (8 cylinders, V)" arg-set="-engine 'Corvette Z06'"/>
+   <option id="9" _label="Dodge Viper (10 cylinders, V)" arg-set="-engine 'Dodge Viper'"/>
+   <option id="10" _label="Jaguar XKE (12 cylinders, V)" arg-set="-engine 'Jaguar XKE'"/>
   </select>
 
   <boolean id="titles" _label="Show Engine Name" arg-set="-titles"/>
diff --git a/hacks/config/fireflies.xml b/hacks/config/fireflies.xml
new file mode 100644 (file)
index 0000000..323c641
--- /dev/null
@@ -0,0 +1,327 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="fireflies" _label="Fireflies">
+<command arg="-root" />
+
+<hgroup>
+<vgroup>
+<hgroup>
+    <number id="minbaits"
+       arg="-minbaits %"
+       type="spinbutton"
+       _label="Minimum baits"
+       low="1"
+       high="50"
+       default="2"
+    />
+    <number id="minflies"
+       arg="-minflies %"
+       type="spinbutton"
+       _label="Minimum flies"
+       low="1"
+       high="10000"
+       default="100"
+    />
+</hgroup>
+<hgroup>
+    <number id="maxbaits"
+       arg="-maxbaits %"
+       type="spinbutton"
+       _label="Maximum baits"
+       low="1"
+       high="50"
+       default="5"
+    />
+    <number id="maxflies"
+       arg="-maxflies %"
+       type="spinbutton"
+       _label="Maximum flies"
+       low="1"
+       high="10000"
+       default="175"
+    />
+</hgroup>
+
+<boolean id="draw"
+    _label="Draw baits"
+    arg-set="-drawbait"
+/>
+<hgroup>
+    <number id="bspeed"
+       arg="-bspeed %"
+       type="spinbutton"
+       _label="Bait speed"
+       low="0"
+       high="10000"
+       default="50"
+    />
+    <number id="baccel"
+       arg="-baccel %"
+       type="spinbutton"
+       _label="Bait accel"
+       low="0"
+       high="10000"
+       default="600"
+    />
+</hgroup>
+<hgroup>
+    <number id="fspeed"
+       arg="-fspeed %"
+       type="spinbutton"
+       _label="Firefly speed"
+       low="0"
+       high="10000"
+       default="100"
+    />
+    <number id="faccel"
+       arg="-faccel %"
+       type="spinbutton"
+       _label="Firefly accel"
+       low="0"
+       high="10000"
+       default="300"
+    />
+</hgroup>
+<number id="taillength"
+    arg="-taillength %"
+    type="slider"
+    _label="Tails"
+    _low-label="Short"
+    _high-label="Long"
+    low="0"
+    high="100"
+    default="22"
+/>
+<number id="tailwidth"
+    arg="-tailwidth %"
+    type="slider"
+    _low-label="Narrow"
+    _high-label="Wide"
+    low="0"
+    high="100"
+    default="25"
+/>
+<number id="tailopacity"
+    arg="-tailopacity %"
+    type="slider"
+    _low-label="Invisible"
+    _high-label="Opaque"
+    low="0"
+    high="100"
+    default="60"
+/>
+</vgroup>
+<vgroup>
+<hgroup>
+<number id="colorspeed"
+    arg="-colorspeed %"
+    type="spinbutton"
+    _label="Color cycle speed"
+    low="1"
+    high="100"
+    default="15"
+/>
+</hgroup>
+<number id="fps"
+    arg="-fps %"
+    type="spinbutton"
+    _label="Frames per sec"
+    low="1"
+    high="100"
+    default="20"
+/>
+<number id="fastforward"
+    arg="-fastforward %"
+    type="spinbutton"
+    _label="Fast Forward speed"
+    low="1"
+    high="100"
+    default="1"
+/>
+<number id="size"
+    arg="-size %"
+    type="slider"
+    _label="Firefly size"
+    _low-label="Tiny"
+    _high-label="Huge"
+    low="5"
+    high="100"
+    default="15"
+/>
+<number id="glowfactor"
+    arg="-glowfactor %"
+    type="slider"
+    _label="Glow factor"
+    _low-label="Half"
+    _high-label="10 times"
+    low="5"
+    high="100"
+    default="20"
+/>
+<number id="wind"
+    arg="-wind %"
+    type="slider"
+    _label="Wind"
+    _low-label="Still"
+    _high-label="Hurricane"
+    low="0"
+    high="100"
+    default="30"
+/>
+</vgroup>
+</hgroup>
+<hgroup>
+    <vgroup>
+       <number id="m0"
+           arg="-m0 %"
+           type="slider"
+           _label="Normal swarm motion"
+           _low-label="Never"
+           _high-label="Often"
+           low="0"
+           high="100"
+           default="30"
+       />
+       <number id="m1"
+           arg="-m1 %"
+           type="slider"
+           _label="Swarm comes to a halt"
+           _low-label="Never"
+           _high-label="Often"
+           low="0"
+           high="100"
+           default="10"
+       />
+       <number id="m2"
+           arg="-m2 %"
+           type="slider"
+           _label="Swarm does loops"
+           _low-label="Never"
+           _high-label="Often"
+           low="0"
+           high="100"
+           default="10"
+       />
+       <number id="m3"
+           arg="-m3 %"
+           type="slider"
+           _label="Swarm bursts into rainbow               "
+           _low-label="Never"
+           _high-label="Often"
+           low="00"
+           high="100"
+           default="10"
+       />
+       <number id="m4"
+           arg="-m4 %"
+           type="slider"
+           _label="Swarm tails glow"
+           _low-label="Never"
+           _high-label="Often"
+           low="0"
+           high="100"
+           default="15"
+       />
+       <number id="m5"
+           arg="-m5 %"
+           type="slider"
+           _label="Swarm hyperspeed"
+           _low-label="Never"
+           _high-label="Often"
+           low="0"
+           high="100"
+           default="10"
+       />
+       <number id="m6"
+           arg="-m6 %"
+           type="slider"
+           _label="Faded colors"
+           _low-label="Never"
+           _high-label="Often"
+           low="0"
+           high="100"
+           default="10"
+       />
+    </vgroup>
+    <vgroup>
+       <number id="M0"
+           arg="-M0 %"
+           type="slider"
+           _label="Make all swarms do something"
+           _low-label="Never"
+           _high-label="Often"
+           low="0"
+           high="100"
+           default="5"
+       />
+       <number id="M1"
+           arg="-M1 %"
+           type="slider"
+           _label="Kill some fireflies"
+           _low-label="Never"
+           _high-label="Often"
+           low="0"
+           high="100"
+           default="10"
+       />
+       <number id="M2"
+           arg="-M2 %"
+           type="slider"
+           _label="Add some fireflies"
+           _low-label="Never"
+           _high-label="Often"
+           low="00"
+           high="100"
+           default="10"
+       />
+       <number id="M3"
+           arg="-M3 %"
+           type="slider"
+           _label="Wind picks up"
+           _low-label="Never"
+           _high-label="Often"
+           low="0"
+           high="100"
+           default="20"
+       />
+       <number id="M4"
+           arg="-M4 %"
+           type="slider"
+           _label="Matrix (pause and rotate)"
+           _low-label="Never"
+           _high-label="Often"
+           low="0"
+           high="100"
+           default="20"
+       />
+       <number id="M5"
+           arg="-M5 %"
+           type="slider"
+           _label="Split a swarm"
+           _low-label="Never"
+           _high-label="Often"
+           low="0"
+           high="100"
+           default="10"
+       />
+       <number id="M6"
+           arg="-M6 %"
+           type="slider"
+           _label="Merge two swarms"
+           _low-label="Never"
+           _high-label="Often"
+           low="0"
+           high="100"
+           default="10"
+       />
+    </vgroup>
+</hgroup>
+
+  <_description>
+A bunch of fireflies chase a few baits around the screen, leaving colorful
+tails which get blown around by the wind.
+Written by Matt Perry.  This program is not included with the
+XScreenSaver package, but if you don't have it already, you can find it
+at &lt;http://somewhere.fscked.org/fireflies/&gt;.
+  </_description>
+</screensaver>
diff --git a/hacks/config/flipflop.xml b/hacks/config/flipflop.xml
new file mode 100644 (file)
index 0000000..bacc8d5
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="flipflop" _label="FlipFlop">
+
+  <command arg="-root"/>
+
+  <number id="speed" type="slider" arg="-delay %"
+          _label="Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="50000" default="20000"
+          convert="invert"/>
+
+  <select id="render">
+    <option id="solid"    _label="Solid Tiles" arg-set="-no-texture"/>
+    <option id="wire"     _label="Wireframe" arg-set="-wireframe"/>
+  </select>
+
+  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+  <_description>
+Flipflop draws a grid of 3D colored tiles that change positions with 
+each other.  Written by Kevin Ogden.
+  </_description>
+</screensaver>
index de2bf6bf509e8571dcaf6be4c18731cd3f1619ed..dc196960a9cb995de77d21fa1e90c416c1207378 100644 (file)
   <_description>
 Hyperball is to hypercube as dodecahedron is to cube: this displays
 a 2D projection of the sequence of 3D objects which are the projections
-of the 4D analog to the dodecahedron.  Written by Joe Keane.
+of the 4D analog to the dodecahedron.  Technically, it is a "120 cell 
+polytope."  Written by Joe Keane.
+
+See also the "polytopes" hack for a more general version of this
+using OpenGL.
   </_description>
 </screensaver>
index c9c19de1b15ddf9f368777af687a2d4fa9c66a05..b43553e335d89ccefde885242a0913431d54003d 100644 (file)
@@ -56,5 +56,8 @@ eight cubes, each touching six others.  To make it easier to
 visualize the rotation, it uses a different color for the edges of
 each face.  Don't think about it too long, or your brain will melt.
 Written by Joe Keane, Fritz Mueller, and Jamie Zawinski.
+
+See also the "polytopes" hack for a more general version of this
+using OpenGL.
   </_description>
 </screensaver>
diff --git a/hacks/config/polytopes.xml b/hacks/config/polytopes.xml
new file mode 100644 (file)
index 0000000..0b2c8e3
--- /dev/null
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<screensaver name="polytopes" _label="Regular 4D Polytopes">
+
+  <command arg="-root"/>
+
+  <select id="display-mode">
+    <option id="mesh" _label="Wireframe Mesh"
+            arg-set="-mesh"/>
+    <option id="surface" _label="Solid Surface"
+            arg-set="-surface"/>
+    <option id="transparent" _label="Transparent Surface"/>
+  </select>
+
+  <select id="polytope">
+    <option id="random" _label="Random Object"/>
+    <option id="cell-5" _label="5-Cell (Hyper-Tetrahedron)"
+            arg-set="-5-cell"/>
+    <option id="cell-8" _label="8-Cell (Hypercube / Tesseract)"
+            arg-set="-8-cell"/>
+    <option id="cell-16" _label="16-Cell (Hyper-Octahedron)"
+            arg-set="-16-cell"/>
+    <option id="cell-24" _label="24-Cell"
+            arg-set="-24-cell"/>
+    <option id="cell-120" _label="120-Cell"
+            arg-set="-120-cell"/>
+    <option id="cell-600" _label="600-Cell"
+            arg-set="-600-cell"/>
+  </select>
+
+  <select id="colors">
+    <option id="single" _label="Single Color"
+            arg-set="-single-color"/>
+    <option id="depth" _label="Colors By 4D Depth"/>
+  </select>
+
+  <select id="projection3d">
+    <option id="perspective-3d" _label="Perspective 3d"/>
+    <option id="orthographic-3d" _label="Orthographic 3d"
+            arg-set="-orthographic-3d"/>
+  </select>
+
+  <select id="projection4d">
+    <option id="perspective-4d" _label="Perspective 4d"/>
+    <option id="orthographic-4d" _label="Orthographic 4d"
+            arg-set="-orthographic-4d"/>
+  </select>
+
+  <hgroup>
+
+    <vgroup>
+
+      <number id="speed-wx" type="slider" arg="-speed-wx %"
+              _label="WX Rotation Speed"
+              _low-label="-4.0" _high-label="4.0"
+              low="-4.0" high="4.0" default="1.1"/>
+
+      <number id="speed-wy" type="slider" arg="-speed-wy %"
+              _label="WY Rotation Speed"
+              _low-label="-4.0" _high-label="4.0"
+              low="-4.0" high="4.0" default="1.3"/>
+
+      <number id="speed-wz" type="slider" arg="-speed-wz %"
+              _label="WZ Rotation Speed"
+              _low-label="-4.0" _high-label="4.0"
+              low="-4.0" high="4.0" default="1.5"/>
+
+    </vgroup>
+
+    <vgroup>
+
+      <number id="speed-xy" type="slider" arg="-speed-xy %"
+              _label="XY Rotation Speed"
+              _low-label="-4.0" _high-label="4.0"
+              low="-4.0" high="4.0" default="1.7"/>
+    
+      <number id="speed-xz" type="slider" arg="-speed-xz %"
+              _label="XZ Rotation Speed"
+              _low-label="-4.0" _high-label="4.0"
+              low="-4.0" high="4.0" default="1.9"/>
+    
+      <number id="speed-yz" type="slider" arg="-speed-yz %"
+              _label="YZ Rotation Speed"
+              _low-label="-4.0" _high-label="4.0"
+              low="-4.0" high="4.0" default="2.1"/>
+    
+    </vgroup>
+
+  </hgroup>
+
+  <number id="speed" type="slider" arg="-delay %"
+          _label="Display Speed" _low-label="Slow" _high-label="Fast"
+          low="0" high="40000" default="25000"
+          convert="invert"/>
+
+  <boolean id="showfps" _label="Show Frames-per-Second" arg-set="-fps"/>
+
+  <_description>
+This program shows one of the six regular 4D polytopes rotating in 4D.
+Written by Carsten Steger, inspired by H.S.M Coxeter's book "Regular
+Polytopes", 3rd Edition, Dover Publications, Inc., 1973, and Thomas
+Banchoff's book "Beyond the Third Dimension: Geometry, Computer
+Graphics, and Higher Dimensions", Scientific American Library, 1990.
+  </_description>
+</screensaver>
index 3f80495b222a25d4ad7a741eff48a9c86810e7f3..7ab68e52447dff19930646934c17cf93a411fe92 100644 (file)
@@ -24,7 +24,7 @@
           low="0" high="100" default="10"/>
 
   <_description>
-This draws smoothly-shaded oscilating oval patterns, that look
+This draws smoothly-shaded oscillating oval patterns, that look
 something like vapor trails or neon tubes.  Written by Shane Smit.
   </_description>
 </screensaver>
index b10adacf79a87616decc21acb18cdafbe38c37d2..16ccbb8248f807a664db1d65a3442ae4415f1166 100644 (file)
@@ -13,7 +13,7 @@
           _label="Radius" low="5" high="1000" default="125"/>
 
   <_description>
-Draws a spotlight scanning across a black screen, illumnating the
+Draws a spotlight scanning across a black screen, illuminating the
 underlying desktop when it passes.  Written by Rick Schultz.
   </_description>
 </screensaver>
index 9d355c3127b5010e43e35a4721e41cacc879cb1a..65a468162ef9fe5dcbfb7974600652edbd337e31 100644 (file)
@@ -587,7 +587,6 @@ setup(void)
     }
   else
     {
-      XWindowAttributes xgwa;
       XGetWindowAttributes (dpy, window, &xgwa);
       XSelectInput (dpy, window,
                     xgwa.your_event_mask | ExposureMask |
index 6dd19925ad15726489f028138677905feba23656..26ed801c823b269b2de27eebf2d224a44d4c7db5 100644 (file)
@@ -320,7 +320,7 @@ static void Initialize( Display *pDisplay, Window Win, GC *pGC, XImage **ppImage
 
        /* Find the preferred bits-per-pixel. (jwz) */
        {
-               int i, pfvc = 0;
+               int pfvc = 0;
                XPixmapFormatValues *pfv = XListPixmapFormats( pDisplay, &pfvc );
                for( i=0; i<pfvc; i++ )
                        if( pfv[ i ].depth == XWinAttribs.depth )
index a65a6742bb40b2b1fa3de4d9ee5f77288d7ffd1c..8b7fd04477737014be106fa080113f9645bbd800 100644 (file)
@@ -93,7 +93,8 @@ SRCS          = xscreensaver-gl-helper.c \
                  toaster_slots.c toaster_wing.c toast.c toast2.c \
                  bouncingcow.c cow_face.c cow_hide.c cow_hoofs.c cow_horns.c \
                  cow_tail.c cow_udder.c glslideshow.c jigglypuff.c klein.c \
-                 hypertorus.c glmatrix.c cubestorm.c glknots.c blocktube.c
+                 hypertorus.c glmatrix.c cubestorm.c glknots.c blocktube.c \
+                 flipflop.c antspotlight.c polytopes.c
 
 OBJS           = xscreensaver-gl-helper.o \
                  atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
@@ -119,7 +120,8 @@ OBJS                = xscreensaver-gl-helper.o \
                  toaster_slots.o toaster_wing.o toast.o toast2.o \
                  bouncingcow.o cow_face.o cow_hide.o cow_hoofs.o cow_horns.o \
                  cow_tail.o cow_udder.o glslideshow.o jigglypuff.o klein.o \
-                 hypertorus.o glmatrix.o cubestorm.o glknots.o blocktube.o
+                 hypertorus.o glmatrix.o cubestorm.o glknots.o blocktube.o \
+                 flipflop.o antspotlight.o polytopes.o
 
 GL_EXES                = cage gears moebius pipes sproingies stairs superquadrics \
                  morph3d rubik atlantis lament bubble3d glplanet pulsar \
@@ -128,7 +130,7 @@ GL_EXES             = cage gears moebius pipes sproingies stairs superquadrics \
                  glforestfire sballs cubenetic spheremonics lavalite queens \
                  endgame glblur flurry atunnel flyingtoasters bouncingcow \
                  glslideshow jigglypuff klein hypertorus glmatrix cubestorm \
-                 glknots blocktube
+                 glknots blocktube flipflop antspotlight polytopes
 GLE_EXES       = extrusion
 GL_UTIL_EXES   = xscreensaver-gl-helper
 HACK_EXES      = @GL_EXES@ @GLE_EXES@
@@ -145,7 +147,8 @@ HDRS                = atlantis.h bubble3d.h buildlwo.h e_textures.h xpm-ximage.h \
                  grab-ximage.h font-ximage.h tube.h sphere.h boxed.h \
                  stonerview-move.h stonerview-osc.h glutstroke.h \
                  glut_roman.h marching.h rotator.h trackball.h gltrackball.h \
-                 chessmodels.h chessgames.h gllist.h flurry.h tunnel_draw.h
+                 chessmodels.h chessgames.h gllist.h flurry.h tunnel_draw.h \
+                 ants.h
 GL_MEN         = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
                  cubenetic.man dangerball.man engine.man extrusion.man \
                  flipscreen3d.man gears.man gflux.man glforestfire.man \
@@ -157,7 +160,8 @@ GL_MEN              = atlantis.man boxed.man bubble3d.man cage.man circuit.man \
                  endgame.man flurry.man glblur.man atunnel.man \
                  flyingtoasters.man bouncingcow.man glslideshow.man \
                  jigglypuff.man klein.man hypertorus.man glmatrix.man \
-                 cubestorm.man glknots.man blocktube.man
+                 cubestorm.man glknots.man blocktube.man flipflop.man \
+                 antspotlight.man polytopes.man
 MEN            = @GL_MEN@
 EXTRAS         = README Makefile.in dxf2gl.pl
 
@@ -536,6 +540,15 @@ glknots:   glknots.o       tube.o $(TRACK_OBJS) $(HACK_OBJS)
 blocktube:     blocktube.o     $(HACK_OBJS) xpm-ximage.o
        $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) xpm-ximage.o $(HACK_LIBS) $(XPM_LIBS)
 
+flipflop:      flipflop.o      $(TRACK_OBJS) $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(TRACK_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+
+antspotlight:  antspotlight.o  $(TRACK_OBJS) $(GRAB_OBJS) $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(TRACK_OBJS) $(GRAB_OBJS) $(HACK_OBJS) $(HACK_LIBS)
+
+polytopes:     polytopes.o     $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
 # This one works differently (it's not xlock-like.)
 #
 STONER_OBJS=stonerview.o stonerview-move.o stonerview-osc.o stonerview-view.o \
@@ -565,6 +578,11 @@ dnalogo:   dnalogo.o       tube.o $(HACK_OBJS)
 #
 # DO NOT DELETE: updated by make distdepend
 
+antspotlight.o: $(srcdir)/ants.h
+antspotlight.o: ../../config.h
+antspotlight.o: $(srcdir)/gltrackball.h
+antspotlight.o: $(srcdir)/grab-ximage.h
+antspotlight.o: $(srcdir)/rotator.h
 atlantis.o: $(srcdir)/atlantis.h
 atlantis.o: ../../config.h
 atlantis.o: $(HACK_SRC)/images/sea-texture.xpm
@@ -634,6 +652,8 @@ extrusion.o: $(srcdir)/xpm-ximage.h
 extrusion-screw.o: ../../config.h
 extrusion-taper.o: ../../config.h
 extrusion-twistoid.o: ../../config.h
+flipflop.o: ../../config.h
+flipflop.o: $(srcdir)/gltrackball.h
 flipscreen3d.o: ../../config.h
 flipscreen3d.o: $(srcdir)/gltrackball.h
 flipscreen3d.o: $(srcdir)/grab-ximage.h
@@ -641,15 +661,19 @@ flurry.o: ../../config.h
 flurry.o: $(srcdir)/flurry.h
 flurry.o: $(srcdir)/gltrackball.h
 flurry.o: $(srcdir)/rotator.h
+flurry-smoke.o: ../../config.h
 flurry-smoke.o: $(srcdir)/flurry.h
 flurry-smoke.o: $(srcdir)/gltrackball.h
 flurry-smoke.o: $(srcdir)/rotator.h
+flurry-spark.o: ../../config.h
 flurry-spark.o: $(srcdir)/flurry.h
 flurry-spark.o: $(srcdir)/gltrackball.h
 flurry-spark.o: $(srcdir)/rotator.h
+flurry-star.o: ../../config.h
 flurry-star.o: $(srcdir)/flurry.h
 flurry-star.o: $(srcdir)/gltrackball.h
 flurry-star.o: $(srcdir)/rotator.h
+flurry-texture.o: ../../config.h
 flurry-texture.o: $(srcdir)/flurry.h
 flurry-texture.o: $(srcdir)/gltrackball.h
 flurry-texture.o: $(srcdir)/rotator.h
@@ -743,6 +767,7 @@ morph3d.o: ../../config.h
 pipeobjs.o: $(srcdir)/buildlwo.h
 pipes.o: $(srcdir)/buildlwo.h
 pipes.o: ../../config.h
+polytopes.o: ../../config.h
 pulsar.o: ../../config.h
 pulsar.o: $(srcdir)/xpm-ximage.h
 queens.o: ../../config.h
diff --git a/hacks/glx/ants.h b/hacks/glx/ants.h
new file mode 100644 (file)
index 0000000..e3746f6
--- /dev/null
@@ -0,0 +1,45 @@
+/* ants.h -- header file containing common ant parameters
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Copyright 2003 Blair Tennessy
+*/
+
+static GLfloat MaterialRed[] = {0.6, 0.0, 0.0, 1.0};
+/*static GLfloat MaterialPurple[] = {0.6, 0.2, 0.5, 1.0};*/
+/*static GLfloat MaterialOrange[] = {1.0, 0.69, 0.00, 1.0};*/
+/*static GLfloat MaterialGreen[] = {0.1, 0.5, 0.2, 0.2};*/
+/*static GLfloat MaterialBlue[] = {0.4, 0.4, 0.8, 1.0};*/
+/*static GLfloat MaterialCyan[] = {0.2, 0.5, 0.7, 1.0};*/
+/*static GLfloat MaterialYellow[] = {0.7, 0.7, 0.0, 1.0};*/
+static GLfloat MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0};
+/*static GLfloat MaterialWhite[] = {0.7, 0.7, 0.7, 1.0};*/
+static GLfloat MaterialGray[] = {0.2, 0.2, 0.2, 1.0};
+static GLfloat MaterialGrayB[] = {0.1, 0.1, 0.1, 0.5};
+/*static GLfloat MaterialGray35[] = {0.30, 0.30, 0.30, 1.0};*/
+
+static GLfloat MaterialGray5[] = {0.5, 0.5, 0.5, 1.0};
+static GLfloat MaterialGray6[] = {0.6, 0.6, 0.6, 1.0};
+static GLfloat MaterialGray8[] = {0.8, 0.8, 0.8, 1.0};
+
+typedef struct {
+
+  double position[3];
+  double goal[3];
+  double velocity;
+  double direction;
+  double step;
+
+  GLfloat *material;
+
+} Ant;
diff --git a/hacks/glx/antspotlight.c b/hacks/glx/antspotlight.c
new file mode 100644 (file)
index 0000000..e6f173a
--- /dev/null
@@ -0,0 +1,763 @@
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Copyright 2003 Blair Tennessy
+ */
+
+#include <X11/Intrinsic.h>
+
+#ifdef STANDALONE
+#define PROGCLASS          "AntSpotlight"
+#define HACK_INIT          init_antspotlight
+#define HACK_DRAW          draw_antspotlight
+#define HACK_RESHAPE       reshape_antspotlight
+#define HACK_HANDLE_EVENT   antspotlight_handle_event
+#define EVENT_MASK         PointerMotionMask
+#define antspotlight_opts          xlockmore_opts
+#define DEFAULTS           "*delay:   20000   \n" \
+                           "*showFPS: False   \n"
+
+#include "xlockmore.h"
+#else
+#include "xlock.h"
+#endif
+
+#include <GL/glu.h>
+#include "rotator.h"
+#include "gltrackball.h"
+
+ModeSpecOpt antspotlight_opts = {
+  0, NULL, 0, NULL, NULL
+};
+
+#ifdef USE_MODULES
+ModStruct   antspotlight_description = {
+  "antspotlight", "init_antspotlight", "draw_antspotlight", 
+  "release_antspotlight", "draw_antspotlight", "change_antspotlight", 
+  (char *) NULL, &antspotlight_opts, 1000, 1, 1, 1, 4, 1.0, "",
+  "draws an ant scoping the screen", 0, NULL
+};
+#endif
+
+#define Scale4Window               0.3
+#define Scale4Iconic               0.4
+
+#define sqr(A)                     ((A)*(A))
+
+#ifndef Pi
+#define Pi M_PI
+#endif
+
+int winw, winh;
+int tw, th; /* texture width, height */
+int tx, ty;
+GLfloat max_tx, max_ty;
+#define QW 12
+#define QH 12
+GLfloat qw = QW, qh = QH; /* for the quad we'll draw */
+GLfloat qx = -6 , qy = 6;
+int mono = 0, wire = 0, ticks = 0;
+
+typedef struct {
+  GLint       WindH, WindW;
+  GLXContext *glx_context;
+  rotator    *rot;
+  trackball_state *trackball;
+  Bool        button_down_p;
+} antspotlightstruct;
+
+#include "ants.h"
+#include "grab-ximage.h"
+
+static antspotlightstruct *antspotlight = (antspotlightstruct *) NULL;
+
+#define NUM_SCENES      2
+
+/* draw method for ant */
+Bool draw_ant(float *Material, int mono, int shadow, 
+             float ant_step, Bool (*sphere)(float), Bool (*cone)(float)) {
+  
+  float cos1 = cos(ant_step);
+  float cos2 = cos(ant_step + 2 * Pi / 3);
+  float cos3 = cos(ant_step + 4 * Pi / 3);
+  float sin1 = sin(ant_step);
+  float sin2 = sin(ant_step + 2 * Pi / 3);
+  float sin3 = sin(ant_step + 4 * Pi / 3);
+  
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mono ? MaterialGray5 : Material);
+  glEnable(GL_CULL_FACE);
+  glPushMatrix();
+  glScalef(1, 1.3, 1);
+  if(!((*sphere)(0.18)))
+    return False;
+  glScalef(1, 1 / 1.3, 1);
+  glTranslatef(0.00, 0.30, 0.00);
+  if(!((*sphere)(0.2)))
+    return False;
+  
+  glTranslatef(-0.05, 0.17, 0.05);
+  glRotatef(-90, 1, 0, 0);
+  glRotatef(-25, 0, 1, 0);
+  if(!((*cone)(0.05)))
+    return False;
+  glTranslatef(0.00, 0.10, 0.00);
+  if(!((*cone)(0.05)))
+    return False;
+  glRotatef(25, 0, 1, 0);
+  glRotatef(90, 1, 0, 0);
+  
+  glScalef(1, 1.3, 1);
+  glTranslatef(0.15, -0.65, 0.05);
+  if(!((*sphere)(0.25)))
+    return False;
+  glScalef(1, 1 / 1.3, 1);
+  glPopMatrix();
+  glDisable(GL_CULL_FACE);
+  
+  glDisable(GL_LIGHTING);
+  
+  /* ANTENNAS */
+  glBegin(GL_LINES);
+  glColor3fv(mono ? MaterialGray5 : Material);
+  glVertex3f(0.00, 0.30, 0.00);
+  glColor3fv(MaterialGray);
+  glVertex3f(0.40, 0.70, 0.40);
+  glColor3fv(mono ? MaterialGray5 : Material);
+  glVertex3f(0.00, 0.30, 0.00);
+  glColor3fv(MaterialGray);
+  glVertex3f(0.40, 0.70, -0.40);
+  glEnd();
+
+  if(!shadow) {
+    glBegin(GL_POINTS);
+    glColor3fv(mono ? MaterialGray6 : MaterialRed);
+    glVertex3f(0.40, 0.70, 0.40);
+    glVertex3f(0.40, 0.70, -0.40);
+    glEnd();
+  }
+
+  /* LEFT-FRONT ARM */
+  glBegin(GL_LINE_STRIP);
+  glColor3fv(mono ? MaterialGray5 : Material);
+  glVertex3f(0.00, 0.05, 0.18);
+  glVertex3f(0.35 + 0.05 * cos1, 0.15, 0.25);
+  glColor3fv(MaterialGray);
+  glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
+  glEnd();
+
+  /* LEFT-CENTER ARM */
+  glBegin(GL_LINE_STRIP);
+  glColor3fv(mono ? MaterialGray5 : Material);
+  glVertex3f(0.00, 0.00, 0.18);
+  glVertex3f(0.35 + 0.05 * cos2, 0.00, 0.25);
+  glColor3fv(MaterialGray);
+  glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
+  glEnd();
+
+  /* LEFT-BACK ARM */
+  glBegin(GL_LINE_STRIP);
+  glColor3fv(mono ? MaterialGray5 : Material);
+  glVertex3f(0.00, -0.05, 0.18);
+  glVertex3f(0.35 + 0.05 * cos3, -0.15, 0.25);
+  glColor3fv(MaterialGray);
+  glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
+  glEnd();
+
+  /* RIGHT-FRONT ARM */
+  glBegin(GL_LINE_STRIP);
+  glColor3fv(mono ? MaterialGray5 : Material);
+  glVertex3f(0.00, 0.05, -0.18);
+  glVertex3f(0.35 - 0.05 * sin1, 0.15, -0.25);
+  glColor3fv(MaterialGray);
+  glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
+  glEnd();
+
+  /* RIGHT-CENTER ARM */
+  glBegin(GL_LINE_STRIP);
+  glColor3fv(mono ? MaterialGray5 : Material);
+  glVertex3f(0.00, 0.00, -0.18);
+  glVertex3f(0.35 - 0.05 * sin2, 0.00, -0.25);
+  glColor3fv(MaterialGray);
+  glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
+  glEnd();
+
+  /* RIGHT-BACK ARM */
+  glBegin(GL_LINE_STRIP);
+  glColor3fv(mono ? MaterialGray5 : Material);
+  glVertex3f(0.00, -0.05, -0.18);
+  glVertex3f(0.35 - 0.05 * sin3, -0.15, -0.25);
+  glColor3fv(MaterialGray);
+  glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
+  glEnd();
+
+  if(!shadow) {
+    glBegin(GL_POINTS);
+    if(mono)
+      glColor3fv(MaterialGray8);
+    else
+      glColor3fv(MaterialMagenta);
+    glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
+    glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
+    glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
+    glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
+    glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
+    glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
+    glEnd();
+  }
+
+  glEnable(GL_LIGHTING);
+
+  return True;
+}
+
+/* filled sphere */
+static Bool mySphere(float radius) {
+  GLUquadricObj *quadObj;
+  
+  if((quadObj = gluNewQuadric()) == 0)
+    return False;
+
+  gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+  gluSphere(quadObj, radius, 16, 16);
+  gluDeleteQuadric(quadObj);
+
+  return True;
+}
+
+/* silhouette sphere */
+static Bool mySphere2(float radius) {
+  GLUquadricObj *quadObj;
+
+  if((quadObj = gluNewQuadric()) == 0)
+       return False;
+  gluQuadricDrawStyle(quadObj, (GLenum) GLU_SILHOUETTE);
+  gluSphere(quadObj, radius, 16, 8);
+  gluDeleteQuadric(quadObj);
+
+  return True;
+}
+
+/* no cone */
+static Bool myCone2(float radius) { return True; }
+
+Ant *ant;
+
+double boardsize = 8.0;
+#define BOARDLIST 1
+
+GLfloat spot_direction[3];
+
+void draw_board(void) {
+  int i, j;
+  double cutoff = Pi/3.0;
+  double center[3];
+  double centertex[2];
+
+  glEnable(GL_TEXTURE_2D);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray6);
+
+  /* draw mesh */
+
+  /* center is roughly spotlight position */
+  center[0] = ant->position[0];/* + cos(ant->direction); */
+  center[1] = 0.0;
+  center[2] = ant->position[2];/* - 0.7*sin(ant->direction);*/
+
+  centertex[0] = (boardsize/2.0+center[0]) * max_tx / boardsize;
+  centertex[1] = max_ty - ((boardsize/2.0+center[2]) * max_ty / boardsize);
+
+/*   glPolygonMode(GL_FRONT, GL_LINE); */
+/*   glDisable(GL_TEXTURE_2D); */
+
+  /* 
+     the vertices determined here should correspond to the illuminated
+     board.  ideally the code adapts vertex distribution to the
+     intensity and shape of the light.
+     
+     i should be finding the intersection of the cone of light and
+     the board-plane.
+  */
+  for(i = -8; i < 8; ++i) {
+
+    double theta1, theta2;
+
+    glBegin(GL_TRIANGLE_STRIP);
+    glNormal3f(0.0, 1.0, 0.0);
+    glTexCoord2f(centertex[0], centertex[1]);
+    glVertex3f(center[0], 0.01, center[2]);
+
+    /* watch those constants */
+    theta1 = ant->direction + i*(cutoff/8);
+    theta2 = ant->direction + (i+1)*(cutoff/8);
+
+    for(j = 1; j <= 40; ++j) {
+      double point[3], tex[2];
+      /* double fj = pow(1.05, j) - 1.0;*/
+      double fj = j / 6.0;
+      point[0] = center[0] + fj*cos(theta1);
+      point[1] = 0.0;
+      point[2] = center[2] - fj*sin(theta1);
+
+      tex[0] = (boardsize/2.0+point[0]) * max_tx / boardsize;
+      tex[1] = max_ty - ((boardsize/2.0+point[2]) * max_ty / boardsize);
+
+      glTexCoord2f(tex[0], tex[1]);
+      glVertex3f(point[0], point[1], point[2]);
+
+      point[0] = center[0] + fj*cos(theta2);
+      point[1] = 0.0;
+      point[2] = center[2] - fj*sin(theta2);
+
+      tex[0] = (boardsize/2.0+point[0]) * max_tx / boardsize;
+      tex[1] = max_ty - ((boardsize/2.0+point[2]) * max_ty / boardsize);
+
+      glTexCoord2f(tex[0], tex[1]);
+      glVertex3f(point[0], point[1], point[2]);
+    }
+
+    glEnd();
+  }
+
+  glDisable(GL_TEXTURE_2D);
+}
+
+/* return euclidean distance between two points */
+double distance(double x[3], double y[3]) {
+  double dx = x[0] - y[0];
+  double dz = x[2] - y[2];
+  return sqrt(dx*dx + dz*dz);
+}
+
+/* determine a new goal */
+void find_goal(void) {
+  do {
+    ant->goal[0] = random()%((int)(boardsize+0.5)-2) - boardsize/2.0 + 1.0;
+    ant->goal[1] = 0.0;
+    ant->goal[2] = random()%((int)(boardsize+0.5)-2) - boardsize/2.0 + 1.0;
+  }
+  while(distance(ant->position, ant->goal) < 1.0);
+}
+
+/* construct our ant */
+void build_ant(void) {
+  ant = (Ant *) malloc(sizeof (Ant));
+  ant->position[0] = 0.0;
+  ant->position[1] = 0.0;
+  ant->position[2] = 0.0;
+  ant->direction = 0.0;
+  ant->velocity = 0.02;
+  ant->material = MaterialGray5;
+  find_goal();
+}
+
+#define EPSILON 0.01
+
+double sign(double d) {
+  return d < 0.0 ? -1.0 : 1.0;
+}
+
+double min(double a, double b) {
+  return a < b ? a : b;
+}
+
+double max(double a, double b) {
+  return a > b ? a : b;
+}
+
+/* find a new goal and reset steps */
+void reset_ant(void) {
+  find_goal();
+}
+
+/* draw ant composed of skeleton and glass */
+void show_ant(void) {
+
+  glPushMatrix();
+
+  /* move into position */
+  glTranslatef(ant->position[0], 0.33, ant->position[2]);
+  glRotatef(180.0 + ant->direction*180.0/Pi, 0.0, 1.0, 0.0);
+  glRotatef(90.0, 0.0, 0.0, 1.0);
+
+  /* draw skeleton */
+  draw_ant(ant->material, mono, 0, ant->step, mySphere2, myCone2);
+
+  /* draw glass */
+  if(!wire && !mono) {
+    glEnable(GL_BLEND);
+    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGrayB);
+    glColor4fv(MaterialGrayB);
+    draw_ant(MaterialGrayB, mono, 0, ant->step, mySphere, myCone2);
+    glDisable(GL_BLEND);
+  }
+
+  glPopMatrix();
+}
+
+void draw_antspotlight_strip(ModeInfo *mi) {
+
+  /* compute spotlight position and direction */
+  GLfloat light1_position[4];
+
+  light1_position[0] = ant->position[0] + 0.7*cos(ant->direction);
+  light1_position[1] = 0.5;
+  light1_position[2] = ant->position[2] - 0.7*sin(ant->direction);
+  light1_position[3] = 1.0;
+
+  spot_direction[0] = cos(ant->direction);
+  spot_direction[1] = -0.5;
+  spot_direction[2] = -sin(ant->direction);
+
+  glLightfv(GL_LIGHT2, GL_POSITION, light1_position);
+  glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, spot_direction);
+  
+  glEnable(GL_LIGHT2);
+  glDisable(GL_LIGHT0);
+  glDisable(GL_LIGHT1);
+
+  /* draw board */
+  if(wire)
+    ;
+  else
+    draw_board();
+/*     glCallList(BOARDLIST); */
+
+  glDisable(GL_LIGHT2);
+  glEnable(GL_LIGHT0);
+  glEnable(GL_LIGHT1);
+  
+  /* now modify ant */
+  show_ant();
+
+  /* near goal, bend path towards next step */
+  if(distance(ant->position, ant->goal) < 0.2) {
+    reset_ant();
+  }
+
+  /* move toward goal, correct ant direction if required */
+  else {
+    
+    /* difference */
+    double dx = ant->goal[0] - ant->position[0];
+    double dz = -(ant->goal[2] - ant->position[2]);
+    double theta, ideal, dt;
+    
+    if(fabs(dx) > EPSILON) {
+      theta = atan(dz/dx);
+      if(dx < 0.0)
+       theta += Pi;
+    }
+    else
+      theta = dz > 0.0 ? (1.0/2.0)*Pi : (3.0/2.0)*Pi;
+    
+    if(theta < 0.0)
+      theta += 2*Pi;
+    
+    ideal = theta - ant->direction;
+    if(ideal > Pi)
+      ideal -= 2*Pi;
+    
+    /* compute correction */
+    dt = sign(ideal) * min(fabs(ideal), Pi/100.0);
+    ant->direction += dt;
+    while(ant->direction < 0.0)
+      ant->direction += 2*Pi;
+    while(ant->direction > 2*Pi)
+      ant->direction -= 2*Pi;
+  }
+
+  ant->position[0] += ant->velocity * cos(ant->direction);
+  ant->position[2] += ant->velocity * sin(-ant->direction);
+  ant->step += 10*ant->velocity;
+}
+
+void reshape_antspotlight(ModeInfo * mi, int width, int height) {
+  double h = (GLfloat) height / (GLfloat) width;  
+  int size = 2;
+  antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
+
+  glViewport(0, 0, mp->WindW = (GLint) width, mp->WindH = (GLint) height);
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+
+  gluPerspective(45, 1/h, 1.0, 25.0);
+
+  glMatrixMode(GL_MODELVIEW);
+  glLineWidth(size);
+  glPointSize(size);
+}
+
+/* lighting variables */
+GLfloat front_shininess[] = {60.0};
+GLfloat front_specular[] = {0.8, 0.8, 0.8, 1.0};
+GLfloat ambient[] = {0.4, 0.4, 0.4, 1.0};
+GLfloat ambient2[] = {0.0, 0.0, 0.0, 0.0};
+GLfloat diffuse[] = {1.0, 1.0, 1.0, 1.0};
+GLfloat position0[] = {1.0, 5.0, 1.0, 0.0};
+GLfloat position1[] = {-1.0, -5.0, 1.0, 0.0};
+GLfloat lmodel_ambient[] = {0.8, 0.8, 0.8, 1.0};
+GLfloat lmodel_twoside[] = {GL_TRUE};
+GLfloat spotlight_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+GLfloat spotlight_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+
+static void pinit(void) {
+  glClearDepth(1.0);
+  glClearColor(0.0, 0.0, 0.0, 1.0);
+  
+  /* setup twoside lighting */
+  glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+  glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+  glLightfv(GL_LIGHT0, GL_POSITION, position0);
+  glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+  glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+  glLightfv(GL_LIGHT1, GL_POSITION, position1);
+/*   glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); */
+  glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+  glEnable(GL_LIGHTING);
+  glEnable(GL_LIGHT0);
+  glEnable(GL_LIGHT1);
+
+  /* setup spotlight */
+  glLightfv(GL_LIGHT2, GL_AMBIENT, spotlight_ambient);
+  glLightfv(GL_LIGHT2, GL_DIFFUSE, spotlight_diffuse);
+  glLightf(GL_LIGHT2, GL_CONSTANT_ATTENUATION, 0.1);
+  glLightf(GL_LIGHT2, GL_LINEAR_ATTENUATION, 0.05);
+  glLightf(GL_LIGHT2, GL_QUADRATIC_ATTENUATION, 0.0);
+  glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 60.0);
+  glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 3.0);
+
+  glEnable(GL_NORMALIZE);
+  glFrontFace(GL_CCW);
+  glCullFace(GL_BACK);
+
+  /* setup material properties */
+  glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  glShadeModel(GL_SMOOTH);
+/*   glShadeModel(GL_FLAT); */
+  glEnable(GL_DEPTH_TEST);
+}
+
+/* cleanup routine */
+void release_antspotlight(ModeInfo * mi) {
+
+  if(antspotlight) {
+    free((void *) antspotlight);
+    antspotlight = (antspotlightstruct *) NULL;
+  }
+
+  FreeAllGL(mi);
+}
+
+int mag = 1;
+#define MAX_MAGNIFICATION 10
+#define max(a, b) a < b ? b : a
+#define min(a, b) a < b ? a : b
+
+/* event handling */
+Bool antspotlight_handle_event(ModeInfo *mi, XEvent *event) {
+  antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
+
+  switch(event->xany.type) {
+  case ButtonPress:
+
+    switch(event->xbutton.button) {
+
+    case Button1:
+      mp->button_down_p = True;
+      gltrackball_start(mp->trackball, 
+                       event->xbutton.x, event->xbutton.y,
+                       MI_WIDTH (mi), MI_HEIGHT (mi));
+      break;
+      
+    case Button4:
+      mag = max(mag-1, 1);
+      break;
+
+    case Button5:
+      mag = min(mag+1, MAX_MAGNIFICATION);
+      break;
+    }
+
+    break;
+    
+  case ButtonRelease:
+
+    switch(event->xbutton.button) {
+    case Button1:
+      mp->button_down_p = False;
+      break;
+    }
+
+    break;
+
+  case MotionNotify:
+    if(mp->button_down_p)
+      gltrackball_track(mp->trackball,
+                       event->xmotion.x, event->xmotion.y,
+                       MI_WIDTH (mi), MI_HEIGHT (mi));
+    break;
+    
+  default:
+    return False;
+  }
+
+  return True;
+}
+
+/* get screenshot */
+void get_snapshot(ModeInfo *modeinfo) {
+  XImage *ximage;
+  int status;
+
+  if(MI_IS_WIREFRAME(modeinfo))
+    return;
+
+  ximage = screen_to_ximage(modeinfo->xgwa.screen, modeinfo->window);
+
+  qw = QW; qh = QH;
+  tw = modeinfo->xgwa.width;
+  th = modeinfo->xgwa.height;
+  
+#if 0  /* jwz: this makes the image start off the bottom right of the screen */
+  qx += (qw*tw/winw);
+  qy -= (qh*th/winh);
+#endif
+
+  qw *= (GLfloat)tw/winw;
+  qh *= (GLfloat)th/winh;
+
+  max_tx = (GLfloat) tw / (GLfloat) ximage->width;
+  max_ty = (GLfloat) th / (GLfloat) ximage->height;
+
+  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+                  GL_LINEAR_MIPMAP_LINEAR);
+  
+  clear_gl_error();
+  status = gluBuild2DMipmaps(GL_TEXTURE_2D, 3,
+                            ximage->width, ximage->height,
+                            GL_RGBA, GL_UNSIGNED_BYTE, ximage->data);
+  
+  if (!status && glGetError())
+    /* Some implementations of gluBuild2DMipmaps(), but set a GL error anyway.
+       We could just call check_gl_error(), but that would exit. */
+    status = -1;
+  
+  if(status) {
+    const unsigned char *s = gluErrorString(status);
+    fprintf(stderr, "%s: error mipmapping %dx%d texture: %s\n",
+           progname, ximage->width, ximage->height,
+           (s ? s : (unsigned char *) "(unknown)"));
+    fprintf(stderr, "%s: turning on -wireframe.\n", progname);
+    MI_IS_WIREFRAME(modeinfo) = 1;
+    clear_gl_error();
+  }
+  check_gl_error("mipmapping");  /* should get a return code instead of a
+                                   GL error, but just in case... */
+  
+  free(ximage->data);
+  ximage->data = 0;
+  XDestroyImage (ximage);
+}
+
+void init_antspotlight(ModeInfo *mi) {
+  double rot_speed = 0.3;
+
+  antspotlightstruct *mp;
+  
+  if(!antspotlight) {
+    if((antspotlight = (antspotlightstruct *) 
+       calloc(MI_NUM_SCREENS(mi), sizeof (antspotlightstruct))) == NULL)
+      return;
+  }
+  mp = &antspotlight[MI_SCREEN(mi)];
+  mp->rot = make_rotator (rot_speed, rot_speed, rot_speed, 1, 0, True);
+  mp->trackball = gltrackball_init ();
+
+  if((mp->glx_context = init_GL(mi)) != NULL) {
+    reshape_antspotlight(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+    glDrawBuffer(GL_BACK);
+    pinit();
+  }
+  else
+    MI_CLEARWINDOW(mi);
+
+  get_snapshot(mi);
+  build_ant();
+  mono = MI_IS_MONO(mi);
+  wire = MI_IS_WIREFRAME(mi);
+
+/*   glNewList(BOARDLIST, GL_COMPILE); */
+/*   draw_board(); */
+/*   glEndList(); */
+}
+
+void draw_antspotlight(ModeInfo * mi) {
+  antspotlightstruct *mp;
+  
+  Display    *display = MI_DISPLAY(mi);
+  Window      window = MI_WINDOW(mi);
+  
+  if(!antspotlight)
+       return;
+  mp = &antspotlight[MI_SCREEN(mi)];
+  
+  MI_IS_DRAWN(mi) = True;
+  
+  if(!mp->glx_context)
+       return;
+  
+  glXMakeCurrent(display, window, *(mp->glx_context));
+  
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+  
+  glPushMatrix();
+
+  /* position camera */
+
+  /* follow focused ant */
+  glTranslatef(0.0, 0.0, -10.0 - mag);
+  glRotatef(35.0, 1.0, 0.0, 0.0);
+  gltrackball_rotate(mp->trackball);
+  glTranslatef(-ant->position[0], ant->position[1], -ant->position[2]);
+
+  /* stable position */
+/*   glTranslatef(0.0, 0.0, -10.0 - mag); */
+/*   gltrackball_rotate(mp->trackball); */
+/*   glRotatef(40.0, 1.0, 0.0, 0.0); */
+/*   glRotatef(20.0, 0.0, 1.0, 0.0); */
+
+  draw_antspotlight_strip(mi);
+
+  ++ticks;
+  
+  glPopMatrix();
+  
+  if (MI_IS_FPS(mi)) do_fps (mi);
+  glFlush();
+  
+  glXSwapBuffers(display, window);
+}
+
+void change_antspotlight(ModeInfo * mi) {
+  antspotlightstruct *mp = &antspotlight[MI_SCREEN(mi)];
+  
+  if (!mp->glx_context)
+       return;
+  
+  glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(mp->glx_context));
+  pinit();
+}
diff --git a/hacks/glx/antspotlight.man b/hacks/glx/antspotlight.man
new file mode 100644 (file)
index 0000000..f3c8f53
--- /dev/null
@@ -0,0 +1,54 @@
+.TH XScreenSaver 1 "July 2003"
+.SH NAME
+antspotlight \- ant spotlight screenhack
+.SH SYNOPSIS
+.B antspotlight
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fImicroseconds\fP] [\-fps]
+.SH DESCRIPTION
+The \fIantspotlight\fP code displays a single ant spotting out a screenshot.
+.SH OPTIONS
+.I antspotlight
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.B \-fps
+Display a running tally of how many frames per second are being rendered.
+In conjunction with \fB\-delay 0\fP, this can be a useful benchmark of 
+your GL performance.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-getimage (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Blair Tennessy.  Permission to use, copy, modify,
+distribute, and sell this software and its documentation for any purpose is
+hereby granted without fee, provided that the above copyright notice appear
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Blair Tennessy <tennessb@unbc.ca>, 20-July-2003.
index d37998954977d62cd442aab77f5209bf329ea5c8..e7fc50f1d7d00f00c1e7e05f2aeba865168a26d2 100644 (file)
@@ -1,7 +1,7 @@
 /* atlantis --- Shows moving 3D sea animals */
 
 #if !defined( lint ) && !defined( SABER )
-static const char sccsid[] = "@(#)atlantis.c   1.3 98/06/18 xlockmore";
+static const char sccsid[] = "@(#)atlantis.c   5.08 2003/04/09 xlockmore";
 
 #endif
 
@@ -30,7 +30,7 @@ static const char sccsid[] = "@(#)atlantis.c  1.3 98/06/18 xlockmore";
  * Thanks goes also to Brian Paul for making it possible and inexpensive
  * to use OpenGL at home.
  *
- * My e-mail address is lassauge@sagem.fr
+ * My e-mail address is lassauge@mail.dotcom.fr
  *
  * Eric Lassauge  (May-13-1998)
  *
@@ -201,7 +201,7 @@ InitFishs(atlantisstruct * ap)
                ap->sharks[i].v = 1.0;
        }
 
-       /* Random whae direction */
+       /* Random whale direction */
        ap->whaledir = LRAND() & 1;
 
        ap->dolph.x = 30000.0;
@@ -249,6 +249,7 @@ Init(ModeInfo *mi)
        {0.4, 0.4, 0.4, 1.0};
        static float lmodel_localviewer[] =
        {0.0};
+       float        fblue = 0.0, fgreen;
 
        glFrontFace(GL_CCW);
 
@@ -325,7 +326,10 @@ Init(ModeInfo *mi)
 
        InitFishs(ap);
 
-       glClearColor(0.0, 0.39, 0.7, 0.0);
+       /* Add a little randomness */
+       fblue = ((float) (NRAND(30)) / 100.0) + 0.70;
+       fgreen = fblue * 0.56;
+       glClearColor(0.0, fgreen, fblue, 0.0);
 }
 
 void
@@ -360,10 +364,10 @@ clear_tank (atlantisstruct * ap)
 
   if (do_gradient && !ap->wire)
     {
-      static GLint gradient_list = -1;
-      static GLint gradient_tex = -1;
+      static GLuint gradient_list = 0;
+      static GLuint gradient_tex = 0;
 
-      if (gradient_list == -1)
+      if (gradient_list == 0)
         {
           unsigned char *pixels = 0;
           int start = 64;
index 2542973a9e047cce05b042b6ff434f19194a1531..b16e0d3824a93696b1ab785fb0dff8410ef3402b 100644 (file)
@@ -135,7 +135,7 @@ static Bool LoadGLTextures(ModeInfo *mi)
     glGenTextures(1, &envTexture);
     glBindTexture(GL_TEXTURE_2D, envTexture);
     texti = xpm_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi), MI_COLORMAP(mi),
-                          envImage_xpm);
+                          blocktube_xpm);
     if (!texti) {
         status = False;
     } else {
index cdf04a52a80744b01c39315fd7fab1c80c5ea83a..3159a2438a60364c2280a565330b548f154e727a 100644 (file)
@@ -1092,7 +1092,7 @@ pinit(ModeInfo * mi)
                          GL_RGB, GL_UNSIGNED_BYTE, gp->tex1);
    if (i)
      {
-       const char *s = gluErrorString (i);
+       const char *s = (char *) gluErrorString (i);
        fprintf (stderr, "%s: error mipmapping texture: %s\n",
                 progname, (s ? s : "(unknown)"));
        exit (1);
index cab42a2f6a47f1ec9ee7da061740bcecf14d0b8e..fd9b5e14925308b75bb97325b0cbc3cda08485cb 100644 (file)
@@ -11,6 +11,11 @@ static unsigned int height = 256;
   pixel[2] = ((((data[2] - 33) & 0x3) << 6) | ((data[3] - 33))); \
   data += 4;
 
+# ifdef __GNUC__
+  __extension__  /* don't warn about "string length is greater than the length
+                    ISO C89 compilers are required to support" when including
+                    the following constant data... */
+# endif
 static char *header_data =
        "!FY'\"&Q#!&M!!VM-!6Y(!&M##6Q&\"69%\"FU'!FE!!VM$!VI$!&M!!FM#!VU&!'!!"
        "\"&M%#&M!\"6Q$\"')#!FY#\"FY%\"6Y\"\"&Y#\"6]$\"&U!\"G%!\"7%&!G)!!'-!!')!\"'=!"
index f8965441807b8df00729e9bccc77df8644725a36..18c2bda5381be14e269b2d72c60ae0d262340710 100644 (file)
@@ -357,7 +357,7 @@ pinit(ModeInfo *mi)
                                  GL_RGB, GL_UNSIGNED_BYTE, WoodTextureData);
        if (status)
          {
-               const char *s = gluErrorString (status);
+               const char *s = (char *) gluErrorString (status);
                fprintf (stderr, "%s: error mipmapping texture: %s\n",
                                 progname, (s ? s : "(unknown)"));
                exit (1);
index 039d2fed64d64162983a1aea0fdc4a3fbfc39f51..7b55956abec948f1e66bdbd67dcbf0fcba3dbc1d 100644 (file)
@@ -241,7 +241,7 @@ static const char * smctypes[] = {
 typedef struct {
   int type; /* package type. 0 = to-92, 1 = to-220 */
   GLfloat tw, th; /* texture dimensions */
-  int tnum; /* texture binding */
+  GLuint tnum; /* texture binding */
 } Transistor;
 
 typedef struct {
@@ -392,7 +392,7 @@ void DrawRCA(RCA *);
 void DrawThreeFive(ThreeFive *);
 void DrawSwitch(Switch *);
 
-void freetexture(int);
+void freetexture(GLuint);
 void reorder(Component *[]);
 void circle(float, int,int);
 void bandedCylinder(float, float , GLfloat, GLfloat , GLfloat,  Band **, int);
@@ -2002,7 +2002,7 @@ void display(void)
   glFlush();
 }
 
-void freetexture (int texture) {
+void freetexture (GLuint texture) {
   s_refs[texture]--;
   if (s_refs[texture] < 1) {
     glDeleteTextures(1, &texture);
@@ -2064,7 +2064,7 @@ TexNum * fonttexturealloc (const char *str, float *fg, float *bg)
                              GL_RGBA, GL_UNSIGNED_BYTE, ximage->data);
   if (status)
     {
-      const char *s = gluErrorString (status);
+      const char *s = (char *) gluErrorString (status);
       fprintf (stderr, "%s: error mipmapping %dx%d texture: %s\n",
                progname, ximage->width, ximage->height,
                (s ? s : "(unknown)"));
index 7fa06e1bc03fe1826806bb1a19dd319665f5d5db..a7399dd17a3bc26a658c77b6a24a8f3b3ec754db 100644 (file)
@@ -1,4 +1,4 @@
-/* cubenetic, Copyright (c) 2002 Jamie Zawinski <jwz@jwz.org>
+/* cubenetic, Copyright (c) 2002, 2003 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -324,7 +324,7 @@ init_texture (ModeInfo *mi)
   cc->texture_height = texture_size;
 
   i = texture_size * texture_size * 4;
-  cc->texture = (char *) malloc (i);
+  cc->texture = (unsigned char *) malloc (i);
   memset (cc->texture, 0xFF, i);
 }
 
index 683486518f98155b1654cfe669557d461d5fdb87..07a82dc4bd08513a5f6955cffc4f8ab6f98c82de 100644 (file)
@@ -273,7 +273,7 @@ void Create_Texture(ModeInfo *mi, const char *filename)
     {
       XImage *ximage = xpm_file_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
                                            MI_COLORMAP (mi), filename);
-      image  = ximage->data;
+      image  = (GLubyte *) ximage->data;
       width  = ximage->width;
       height = ximage->height;
       format = GL_RGBA;
@@ -308,7 +308,7 @@ void Create_Texture(ModeInfo *mi, const char *filename)
                                  GL_UNSIGNED_BYTE, image);
       if (status)
         {
-          const char *s = gluErrorString (status);
+          const char *s = (char *) gluErrorString (status);
           fprintf (stderr, "%s: error mipmapping %dx%d texture: %s\n",
                    progname, width, height,
                    (s ? s : "(unknown)"));
diff --git a/hacks/glx/flipflop.c b/hacks/glx/flipflop.c
new file mode 100644 (file)
index 0000000..6e1593d
--- /dev/null
@@ -0,0 +1,588 @@
+/* flipflop, Copyright (c) 2003 Kevin Ogden <kogden1@hotmail.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#include <X11/Intrinsic.h>
+
+#include <math.h>
+#include <sys/time.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define BOARDSIZE 9
+#define NUMSQUARES 76
+#define HALFTHICK 0.04
+
+#ifdef STANDALONE
+# define PROGCLASS        "Flipflop"
+# define HACK_INIT        init_flipflop
+# define HACK_DRAW        draw_flipflop
+# define HACK_RESHAPE     reshape_flipflop
+# define HACK_HANDLE_EVENT flipflop_handle_event
+# define EVENT_MASK       PointerMotionMask
+# define flipflop_opts  xlockmore_opts
+
+#define DEFAULTS       "*delay:       20000       \n" \
+                       "*showFPS:       False       \n" \
+                      "*wireframe:     False     \n"
+
+# include "xlockmore.h"
+
+#else
+# include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#include <GL/glu.h>
+#include "gltrackball.h"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static XrmOptionDescRec opts[] = {
+  {"+rotate", ".flipflop.rotate", XrmoptionNoArg, (caddr_t) "false" },
+  {"-rotate", ".flipflop.rotate", XrmoptionNoArg, (caddr_t) "true" },
+};
+
+
+
+static int rotate, wire, clearbits;
+
+static argtype vars[] = {
+  {(caddr_t *) &rotate, "rotate", "Rotate", "True", t_Bool},
+};
+
+ModeSpecOpt flipflop_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct   flipflop_description =
+{"flipflop", "init_flipflop", "draw_flipflop", "release_flipflop",
+ "draw_flipflop", "init_flipflop", NULL, &flipflop_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Flipflop", 0, NULL};
+
+#endif
+
+typedef struct {
+  GLXContext *glx_context;
+  Window window;
+  trackball_state *trackball;
+  Bool button_down_p;
+} Flipflopcreen;
+
+static Flipflopcreen *qs = NULL;
+
+typedef struct{
+  /* 2D array specifying which squares are where (to avoid collisions) */
+  /* -1 means empty otherwise integer represents square index 0 - n-1 */
+  int occupied[ BOARDSIZE ][ BOARDSIZE ];
+  /* an array of xpositions of the squares */
+  int xpos[ NUMSQUARES ];
+  /* array of y positions of the squares */
+  int ypos[ NUMSQUARES ];
+  /* integer representing the direction of movement of a square */
+  int direction[ NUMSQUARES ]; /* 0 not, 1 x+, 2 y+, 3 x-, 4 y-*/
+  /* angle of moving square (during a flip) */
+  float angle[ NUMSQUARES ];
+  /* array of colors for a square.  rgb */
+  /* eg. color[ 4 ][ 0 ] is the red component of square 4 */
+  /* eg. color[ 5 ][ 2 ] is the blue component of square 5  */
+  float color[ NUMSQUARES ][ 3 ];
+  /* n is the number of square */
+} randsheet;
+
+
+/*** ADDED RANDSHEET VARS ***/
+
+static randsheet MyRandSheet;
+
+static double theta = 0.0;
+/* amount which the square flips.  1 is a entire flip */
+static float flipspeed = 0.03;
+/* relative distace of camera from center */
+static float reldist = 1;
+/* likelehood a square will attempt a move */
+static float energy = 40;
+
+
+static void randsheet_initialize( randsheet *rs );
+static int randsheet_new_move( randsheet* rs );
+static int randsheet_new_move( randsheet* rs );
+static void randsheet_move( randsheet *rs, float rot );
+static void randsheet_draw( randsheet *rs );
+static void setup_lights(void);
+static void drawBoard(void);
+static void display(Flipflopcreen *c);
+static void draw_sheet(void);
+
+
+/* configure lighting */
+static void
+setup_lights(void)
+{
+/*   GLfloat position0[] = { BOARDSIZE*0.5, BOARDSIZE*0.1, BOARDSIZE*0.5, 1.0 }; */
+
+/*   GLfloat position0[] = { -BOARDSIZE*0.5, 0.2*BOARDSIZE, -BOARDSIZE*0.5, 1.0 }; */
+  GLfloat position0[] = { 0, BOARDSIZE*0.3, 0, 1.0 };
+
+  if (wire) return;
+
+  glEnable(GL_LIGHTING);
+  glLightfv(GL_LIGHT0, GL_POSITION, position0);
+  glEnable(GL_LIGHT0);
+ }
+
+Bool
+flipflop_handle_event (ModeInfo *mi, XEvent *event)
+{
+  Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+
+  if (event->xany.type == ButtonPress &&
+      event->xbutton.button & Button1)
+    {
+      c->button_down_p = True;
+      gltrackball_start (c->trackball,
+                         event->xbutton.x, event->xbutton.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+  else if (event->xany.type == ButtonRelease &&
+           event->xbutton.button & Button1)
+    {
+      c->button_down_p = False;
+      return True;
+    }
+  else if (event->xany.type == MotionNotify &&
+           c->button_down_p)
+    {
+      gltrackball_track (c->trackball,
+                         event->xmotion.x, event->xmotion.y,
+                         MI_WIDTH (mi), MI_HEIGHT (mi));
+      return True;
+    }
+
+  return False;
+}
+
+/* draw board */
+static void
+drawBoard(void)
+{
+  int i;
+  for( i=0; i < (energy) ; i++ )
+    randsheet_new_move( &MyRandSheet );
+  randsheet_move( &MyRandSheet, flipspeed * 3.14159 );
+  randsheet_draw( &MyRandSheet );
+}
+
+
+static void
+display(Flipflopcreen *c)
+{
+   GLfloat amb[] = { 0.8, 0.8, 0.8, 1.0 };
+
+
+ glClear(clearbits);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+  glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.2);
+  glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.15/BOARDSIZE );
+  glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.15/BOARDSIZE );
+   glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+
+
+  /** setup perspectif */
+  glTranslatef(0.0, 0.0, -reldist*BOARDSIZE);
+  glRotatef(22.5, 1.0, 0.0, 0.0);
+  gltrackball_rotate (c->trackball);
+  glRotatef(theta*100, 0.0, 1.0, 0.0);
+  glTranslatef(-0.5*BOARDSIZE, 0.0, -0.5*BOARDSIZE);
+
+  drawBoard();
+
+  if (!c->button_down_p)
+    theta += .001;
+
+}
+
+void
+reshape_flipflop(ModeInfo *mi, int width, int height)
+{
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+  glViewport(0,0, width, height);
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective(45, 1/h, 1.0, 300.0);
+  glMatrixMode(GL_MODELVIEW);
+}
+
+void
+init_flipflop(ModeInfo *mi)
+{
+  int screen = MI_SCREEN(mi);
+  Flipflopcreen *c;
+  wire = MI_IS_WIREFRAME(mi);
+
+  if(!qs &&
+     !(qs = (Flipflopcreen *) calloc(MI_NUM_SCREENS(mi), sizeof(Flipflopcreen))))
+    return;
+
+  c = &qs[screen];
+  c->window = MI_WINDOW(mi);
+  c->trackball = gltrackball_init ();
+
+  if((c->glx_context = init_GL(mi)))
+    reshape_flipflop(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+  else
+    MI_CLEARWINDOW(mi);
+
+  glClearColor(0.0, 0.0, 0.0, 0.0);
+
+  clearbits = GL_COLOR_BUFFER_BIT;
+
+  glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
+  glEnable(GL_COLOR_MATERIAL);
+  setup_lights();
+
+  glEnable(GL_DEPTH_TEST);
+  clearbits |= GL_DEPTH_BUFFER_BIT;
+  glEnable(GL_CULL_FACE);
+  glCullFace(GL_BACK);
+  randsheet_initialize( &MyRandSheet );
+
+
+}
+
+void
+draw_flipflop(ModeInfo *mi)
+{
+  Flipflopcreen *c = &qs[MI_SCREEN(mi)];
+  Window w = MI_WINDOW(mi);
+  Display *disp = MI_DISPLAY(mi);
+
+  if(!c->glx_context)
+    return;
+
+  glXMakeCurrent(disp, w, *(c->glx_context));
+
+  display(c);
+
+  if(mi->fps_p){
+    do_fps(mi);
+  }
+
+  glFinish();
+  glXSwapBuffers(disp, w);
+
+
+}
+
+void
+release_flipflop(ModeInfo *mi)
+{
+  if(qs)
+    free((void *) qs);
+
+  FreeAllGL(MI);
+}
+
+/*** ADDED RANDSHEET FUNCTIONS ***/
+
+static void
+draw_sheet(void)
+{
+  glBegin( wire ? GL_LINE_LOOP : GL_QUADS );
+
+  glNormal3f( 0, -1, 0 );
+  glVertex3f( HALFTHICK,  -HALFTHICK,  HALFTHICK );
+  glVertex3f( 1-HALFTHICK,   -HALFTHICK, HALFTHICK );
+  glVertex3f( 1-HALFTHICK, -HALFTHICK,  1-HALFTHICK);
+  glVertex3f( HALFTHICK, -HALFTHICK, 1-HALFTHICK );
+
+  if (wire) { glEnd(); glBegin (GL_LINE_LOOP); }
+
+  /* back */
+  glNormal3f( 0, 1, 0 );
+  glVertex3f( HALFTHICK, HALFTHICK, 1-HALFTHICK );
+  glVertex3f( 1-HALFTHICK, HALFTHICK,  1-HALFTHICK);
+  glVertex3f( 1-HALFTHICK,   HALFTHICK, HALFTHICK );
+  glVertex3f( HALFTHICK,  HALFTHICK,  HALFTHICK );
+
+  if (wire) { glEnd(); return; }
+
+  /* 4 edges!!! weee.... */
+  glNormal3f( 0, 0, -1 );
+  glVertex3f( HALFTHICK, HALFTHICK, HALFTHICK );
+  glVertex3f( 1-HALFTHICK, HALFTHICK, HALFTHICK );
+  glVertex3f( 1-HALFTHICK, -HALFTHICK, HALFTHICK );
+  glVertex3f( HALFTHICK, -HALFTHICK, HALFTHICK );
+  glNormal3f( 0, 0, 1 );
+  glVertex3f( HALFTHICK, HALFTHICK, 1-HALFTHICK );
+  glVertex3f( HALFTHICK, -HALFTHICK, 1-HALFTHICK );
+  glVertex3f( 1-HALFTHICK, -HALFTHICK, 1-HALFTHICK );
+  glVertex3f( 1-HALFTHICK, HALFTHICK, 1-HALFTHICK );
+  glNormal3f( 1, 0, 0 );
+  glVertex3f( 1-HALFTHICK, HALFTHICK, 1-HALFTHICK );
+  glVertex3f( 1-HALFTHICK, -HALFTHICK, 1-HALFTHICK );
+  glVertex3f( 1-HALFTHICK, -HALFTHICK, HALFTHICK );
+  glVertex3f( 1-HALFTHICK, HALFTHICK, HALFTHICK );
+  glNormal3f( -1, 0, 0 );
+  glVertex3f( HALFTHICK, HALFTHICK, 1-HALFTHICK );
+  glVertex3f( HALFTHICK, HALFTHICK, HALFTHICK );
+  glVertex3f( HALFTHICK, -HALFTHICK, HALFTHICK );
+  glVertex3f( HALFTHICK, -HALFTHICK, 1-HALFTHICK );
+  glEnd();
+}
+
+static void
+randsheet_initialize( randsheet *rs )
+{
+  int i, j, index;
+      index = 0;
+      /* put the moving sheets on the board */
+      for( i = 0; i < BOARDSIZE; i++ )
+       {
+         for( j = 0; j < BOARDSIZE; j++ )
+           {
+             /* initially fill up a corner with the moving squares */
+             if( index < NUMSQUARES )
+               {
+                 rs->occupied[ i ][ j ] = index;
+                 rs->xpos[ index ] = i;
+                 rs->ypos[ index ] = j;
+                 /* have the square colors start out as a pattern */
+                 rs->color[ index ][ 0 ] = ((i+j)%3 == 0)||((i+j+1)%3 == 0);
+                 rs->color[ index ][ 1 ] = ((i+j+1)%3 == 0);
+                 rs->color[ index ][ 2 ] = ((i+j+2)%3 == 0);
+                ++index;
+               }
+               /* leave everything else empty*/
+             else
+               {
+                 rs->occupied[ i ][ j ] = -1;
+               }
+           }
+       }
+       /* initially everything is at rest */
+      for( i=0; i<NUMSQUARES; i++ )
+       {
+         rs->direction[ i ] = 0;
+         rs->angle[ i ] = 0;
+       }
+}
+
+/* Pick and random square and direction and try to move it. */
+/* May not actually move anything, just attempt a random move. */
+/* Returns true if move was sucessful. */
+/* This could probably be implemented faster in a dequeue */
+/* to avoid trying to move a square which is already moving */
+/* but speed is most likely bottlenecked by rendering anyway... */
+static int
+randsheet_new_move( randsheet* rs )
+{
+      int i, j;
+      int num, dir;
+      /* pick a random square */
+      num = random( ) % NUMSQUARES;
+      i = rs->xpos[ num ];
+      j = rs->ypos[ num ];
+      /* pick a random direction */
+      dir = ( random( )% 4 ) + 1;
+
+      if( rs->direction[ num ] == 0 )
+       {
+         switch( dir )
+           {
+           case 1:
+             /* move up in x */
+             if( ( i + 1 ) < BOARDSIZE )
+               {
+                 if( rs->occupied[ i + 1 ][ j ] == -1 )
+                   {
+                     rs->direction[ num ] = dir;
+                     rs->occupied[ i + 1 ][ j ] = num;
+                     rs->occupied[ i ][ j ] = -1;
+                     return 1;
+                   }
+               }
+             return 0;
+             break;
+           case 2:
+             /* move up in y */
+             if( ( j + 1 ) < BOARDSIZE )
+               {
+                 if( rs->occupied[ i ][ j + 1 ] == -1 )
+                   {
+                     rs->direction[ num ] = dir;
+                     rs->occupied[ i ][ j + 1 ] = num;
+                     rs->occupied[ i ][ j ] = -1;
+                     return 1;
+                   }
+               }
+             return 0;
+             break;
+           case 3:
+             /* move down in x */
+             if( ( i - 1 ) >= 0 )
+               {
+                 if( rs->occupied[ i - 1][ j ] == -1 )
+                   {
+                     rs->direction[ num ] = dir;
+                     rs->occupied[ i - 1][ j ] = num;
+                     rs->occupied[ i ][ j ] = -1;
+                     return 1;
+                   }
+               }
+             return 0;
+             break;
+           case 4:
+             /* move down in y */
+             if( ( j - 1 ) >= 0 )
+               {
+                 if( rs->occupied[ i ][ j - 1 ] == -1 )
+                   {
+                     rs->direction[ num ] = dir;
+                     rs->occupied[ i ][ j - 1 ] = num;
+                     rs->occupied[ i ][ j ] = -1;
+                     return 1;
+                   }
+               }
+             return 0;
+             break;
+           default:
+             break;
+           }
+       }
+      return 0;
+}
+
+/*   move a single frame.  */
+/*   Pass in the angle in rads the square rotates in a frame. */
+static void
+randsheet_move( randsheet *rs, float rot )
+{
+      int i, j, index;
+      for( index = 0 ; index < NUMSQUARES; index++ )
+       {
+         i = rs->xpos[ index ];
+         j = rs->ypos[ index ];
+         switch( rs->direction[ index ] )
+           {
+           case 0:
+             /* not moving */
+             break;
+           case 1:
+           /* move up in x */
+             rs->angle[ index ] += rot;
+             /* check to see if we have finished moving */
+             if( rs->angle[ index ] >= M_PI  )
+               {
+                 rs->xpos[ index ] += 1;
+                 rs->direction[ index ] = 0;
+                 rs->angle[ index ] = 0;
+               }
+             break;
+           case 2:
+           /* move up in y */
+             rs->angle[ index ] += rot;
+             /* check to see if we have finished moving */
+             if( rs->angle[ index ] >= M_PI  )
+               {
+                 rs->ypos[ index ] += 1;
+                 rs->direction[ index ] = 0;
+                 rs->angle[ index ] = 0;
+               }
+             break;
+           case 3:
+           /* down in x */
+             rs->angle[ index ] += rot;
+             /* check to see if we have finished moving */
+             if( rs->angle[ index ] >= M_PI  )
+               {
+                 rs->xpos[ index ] -= 1;
+                 rs->direction[ index ] = 0;
+                 rs->angle[ index ] = 0;
+               }
+             break;
+           case 4:
+           /* up in x */
+             rs->angle[ index ] += rot;
+             /* check to see if we have finished moving */
+             if( rs->angle[ index ] >= M_PI  )
+               {
+                 rs->ypos[ index ] -= 1;
+                 rs->direction[ index ] = 0;
+                 rs->angle[ index ] = 0;
+               }
+             break;
+           default:
+             break;
+           }
+       }
+}
+
+
+    /* draw all the moving squares  */
+static void
+randsheet_draw( randsheet *rs )
+{
+      int i, j;
+      int index;
+      /* for all moving squares ... */
+      for( index = 0; index < NUMSQUARES; index++ )
+       {
+         /* set color */
+         glColor3f( rs->color[ index ][ 0 ],
+                    rs->color[ index ][ 1 ],
+                    rs->color[ index ][ 2 ] );
+                    /* find x and y position */
+         i = rs->xpos[ index ];
+         j = rs->ypos[ index ];
+         glPushMatrix();
+         switch( rs->direction[ index ] )
+           {
+           case 0:
+
+           /* not moving */
+             /* front */
+             glTranslatef( i, 0, j );
+             break;
+           case 1:
+             glTranslatef( i+1, 0, j );
+             glRotatef( 180 - rs->angle[ index ]*180/M_PI, 0, 0, 1 );
+
+             break;
+           case 2:
+             glTranslatef( i, 0, j+1 );
+             glRotatef( 180 - rs->angle[ index ]*180/M_PI, -1, 0, 0 );
+
+             break;
+           case 3:
+             glTranslatef( i, 0, j );
+             glRotatef( rs->angle[ index ]*180/M_PI, 0, 0, 1 );
+             break;
+           case 4:
+             glTranslatef( i, 0, j );
+             glRotatef( rs->angle[ index ]*180/M_PI, -1, 0, 0 );
+             break;
+           default:
+             break;
+           }
+         draw_sheet();
+         glPopMatrix();
+
+       }
+}
+
+/**** END RANDSHEET FUNCTIONS ***/
+
+#endif
diff --git a/hacks/glx/flipflop.man b/hacks/glx/flipflop.man
new file mode 100644 (file)
index 0000000..1ba6f5c
--- /dev/null
@@ -0,0 +1,61 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+flipflop - draws a grid of 3D squares that change positions
+.SH SYNOPSIS
+.B flipflop
+[\-display \fIhost:display.screen\fP]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fInumber\fP]
+[\-holdtime \fInumber\fP]
+[\-changetime \fInumber\fP]
+[\-no-texture]
+[\-no-fog]
+[\-wireframe]
+[\-fps]
+.SH DESCRIPTION
+Flipflop draws a grid of 3D colored tiles that change positions with 
+each other.
+.SH OPTIONS
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-delay \fInumber\fP
+Per-frame delay, in microseconds.  Default: 20000 (0.02 seconds.).
+.TP 8
+.B \-wireframe
+Only draw outlines.
+.TP 8
+.B \-fps | \-no-fps
+Whether to show a frames-per-second display at the bottom of the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Kevin Ogden.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided that the above copyright notice appear 
+in all copies and that both that copyright notice and this permission notice
+appear in supporting documentation.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Kevin Ogden <kogden1@hotmail.com>
index 14cb2767f0e29d724d8bff1fd1a5b8331d0794f5..e72d8dce8725f7890ceb739345591ad41d35f17b 100644 (file)
@@ -439,7 +439,7 @@ void getSnapshot (ModeInfo *modeinfo)
 
  if (status)
    {
-     const char *s = gluErrorString (status);
+     const char *s = (char *) gluErrorString (status);
      fprintf (stderr, "%s: error mipmapping %dx%d texture: %s\n",
               progname, ximage->width, ximage->height,
               (s ? s : "(unknown)"));
index c89fe7d1f93aa815f1fc464d88e62ee80da20c4a..97c3d9533334b3987c2e1124655ad410fa24c077 100644 (file)
@@ -32,6 +32,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 /* Smoke.cpp: implementation of the Smoke class. */
 
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "flurry.h"
 
 #define MAXANGLES 16384
index cc41b42e6bdce477fc01d9e64734422a3680e536..5b58b56915f4c2a7ce63c2f578efb1ba8d86b321 100644 (file)
@@ -32,6 +32,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 /* Spark.cpp: implementation of the Spark class. */
 
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "flurry.h"
 
 void InitSpark(Spark *s)
index f7e1b8648a7f4d092dd59f95a1a2b2dbd877b6cf..8d9cc41b48803314b838da51388e2454f1c35f1a 100644 (file)
@@ -32,6 +32,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 /* Star.c: implementation of the Star class. */
 
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "flurry.h"
 
 /* Construction/Destruction */
index 29d5df0140ada09be2f882be650a83fb1b4314dd..c787f59a76e736ff3005538bcd6e1229bea109ac 100644 (file)
@@ -39,6 +39,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  */
 
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include "flurry.h"
 
 #include <GL/gl.h>
index a8aca0fdbf02956e9d3a375aeb5a7b3306bc4e1d..38c0adebb624559c6445834de82712b87f6c2349 100644 (file)
@@ -156,7 +156,7 @@ void DrawSpark(global_info_t *info, flurry_info_t *flurry, Spark *s);
 /* int fieldIncoherence = 0; */
 /* int ifieldSpeed = 120; */
 
-static /*inline*/ float FastDistance2D(float x, float y)
+static inline float FastDistance2D(float x, float y)
 {
         /* this function computes the distance from 0,0 to x,y with ~3.5% error */
        float mn;
index 1b95173ae8432e64095b47afeb1189efa2b9e76e..47e8a700dbaf3159b8b4895bfb31300318db599a 100644 (file)
@@ -1,5 +1,5 @@
 /* font-ximage.c --- renders text to an XImage for use with OpenGL.
- * xscreensaver, Copyright (c) 2001 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2001, 2003 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -31,6 +31,7 @@ extern char *progname;
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
+#if 0
 static Bool
 bigendian (void)
 {
@@ -38,6 +39,7 @@ bigendian (void)
   u.i = 1;
   return !u.c[0];
 }
+#endif
 
 /* return the next larger power of 2. */
 static int
@@ -199,9 +201,15 @@ text_to_ximage (Screen *screen, Visual *visual,
          things as necessary) OpenGL pretends everything is client-side, so
          we need to pack things in the right order for the client machine.
        */
+#if 0
+    /* #### Cherub says that the little-endian case must be taken on MacOSX,
+            or else the colors/alpha are the wrong way around.  How can
+            that be the case?
+     */
       if (bigendian())
         rpos = 24, gpos = 16, bpos =  8, apos =  0;
       else
+#endif
         rpos =  0, gpos =  8, bpos = 16, apos = 24;
 
       fg = (((unsigned long) (texture_fg[0] * 255.0) << rpos) |
index ad14d01f2c1827e3a9f95f5ac99c03c4d905738b..f9b1cb2ec6193761e82fc0a96d331017c7e8d84d 100644 (file)
@@ -2,7 +2,7 @@
 /* gflux - creates a fluctuating 3D grid 
  * requires OpenGL or MesaGL
  * 
- * Copyright (c) Josiah Pease, 2000
+ * Copyright (c) Josiah Pease, 2000, 2003
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  * the above copyright notice appear in all copies and that both that
@@ -213,7 +213,7 @@ typedef struct {
        int imageMax;
        GLubyte *image;
 #endif
-    GLint texName;
+    GLuint texName;
     GLfloat tex_xscale;
     GLfloat tex_yscale;
     void (*drawFunc)(void);
@@ -680,7 +680,7 @@ grabTexture(void)
 
   gflux->imageWidth  = ximage->width;
   gflux->imageHeight = ximage->height;
-  gflux->image = ximage->data;
+  gflux->image = (GLubyte *) ximage->data;
 
   if (bigimage)  /* don't scale really large images */
     {
index 81488ac8575822f727bdb1802ef10765b079de6c..ab514646646c18378f8c045dd0557fb903a3306f 100644 (file)
@@ -115,7 +115,7 @@ make_knot (ModeInfo *mi)
   int faces = (wire ? 3 : 6);
 
   int i;
-  double x, y, z, ox, oy, oz;
+  double x, y, z, ox=0, oy=0, oz=0;
   double mu;
 
   double p[9];
index 1fa1123cf394dc4e30ff3048034a50aa5e3603df..9b5754069a039a12e39e14a635ce8a839ba60a7c 100644 (file)
@@ -57,6 +57,11 @@ extern XtAppContext app;
 #include "xpm-ximage.h"
 #include <ctype.h>
 
+#ifdef __GNUC__
+  __extension__  /* don't warn about "string length is greater than the length
+                    ISO C89 compilers are required to support" when including
+                    the following XPM file... */
+#endif
 #include "../images/matrix3.xpm"
 
 #ifdef USE_GL /* whole file */
@@ -333,7 +338,7 @@ draw_glyph (ModeInfo *mi, int glyph,
   int wire = MI_IS_WIREFRAME(mi);
   GLfloat w = mp->tex_char_width;
   GLfloat h = mp->tex_char_height;
-  GLfloat cx, cy;
+  GLfloat cx = 0, cy = 0;
   GLfloat S = 1;
   Bool spinner_p = (glyph < 0);
 
@@ -587,6 +592,7 @@ matrix_handle_event (ModeInfo *mi, XEvent *event)
 }
 
 
+#if 0
 static Bool
 bigendian (void)
 {
@@ -594,6 +600,7 @@ bigendian (void)
   u.i = 1;
   return !u.c[0];
 }
+#endif
 
 
 /* The image with the characters in it is 512x598, meaning that it needs to
@@ -719,9 +726,15 @@ load_textures (ModeInfo *mi, Bool flip_p)
    */
   {
     int rpos, gpos, bpos, apos;  /* bitfield positions */
+#if 0
+    /* #### Cherub says that the little-endian case must be taken on MacOSX,
+            or else the colors/alpha are the wrong way around.  How can
+            that be the case?
+     */
     if (bigendian())
       rpos = 24, gpos = 16, bpos =  8, apos =  0;
     else
+#endif
       rpos =  0, gpos =  8, bpos = 16, apos = 24;
 
     for (y = 0; y < xi->height; y++)
index f2080b303af96aa6b258f2b46bd5419745cc0c61..316e6821205dc65c6fcb809febd8253cb3921434 100644 (file)
@@ -142,7 +142,13 @@ ModStruct   planet_description =
  "Animates texture mapped sphere (planet)", 0, NULL};
 #endif
 
+# ifdef __GNUC__
+  __extension__  /* don't warn about "string length is greater than the length
+                    ISO C89 compilers are required to support" when including
+                    the following XPM file... */
+# endif
 #include "../images/earth.xpm"
+
 #include "xpm-ximage.h"
 #include "rotator.h"
 #include "gltrackball.h"
index f705a65c010da82bf24c30a26a6f4c23c2aba4cc..5a88a4e5c39436b2573215bee823ec6860c3980d 100644 (file)
@@ -69,7 +69,7 @@ typedef struct {
   GLuint texid;                           /* which texture to draw */
   enum { IN, OUT, DEAD } state;    /* how to draw it */
   rect from, to;                  /* the journey this quad is taking */
-} quad;
+} gls_quad;
 
 
 typedef struct {
@@ -79,7 +79,7 @@ typedef struct {
   int motion_frames;            /* how many frames each pan takes */
   int fade_frames;              /* how many frames fading in/out takes */
 
-  quad quads[2];               /* the (up to) 2 quads we animate */
+  gls_quad quads[2];           /* the (up to) 2 quads we animate */
   GLuint texids[2];            /* textures: "old" and "new" */
   GLuint current_texid;         /* the "new" one */
 
@@ -157,7 +157,7 @@ double_time (void)
 
 
 static void
-draw_quad (ModeInfo *mi, quad *q)
+draw_quad (ModeInfo *mi, gls_quad *q)
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
   int wire = MI_IS_WIREFRAME(mi);
@@ -316,7 +316,7 @@ draw_quads (ModeInfo *mi)
 /* Re-randomize the state of the given quad.
  */
 static void
-reset_quad (ModeInfo *mi, quad *q)
+reset_quad (ModeInfo *mi, gls_quad *q)
 {
 /*  slideshow_state *ss = &sss[MI_SCREEN(mi)];*/
 
@@ -403,7 +403,7 @@ shrink_image (ModeInfo *mi, XImage *ximage)
 /* Load a new image into a texture for the given quad.
  */
 static void
-load_quad (ModeInfo *mi, quad *q)
+load_quad (ModeInfo *mi, gls_quad *q)
 {
   slideshow_state *ss = &sss[MI_SCREEN(mi)];
   XImage *ximage;
@@ -466,7 +466,7 @@ load_quad (ModeInfo *mi, quad *q)
   if (status)
     {
       char buf[100];
-      const char *s = gluErrorString (status);
+      const char *s = (char *) gluErrorString (status);
 
       if (!s || !*s)
         {
@@ -648,7 +648,7 @@ init_slideshow (ModeInfo *mi)
 
   for (i = 0; i < countof(ss->quads); i++)
     {
-      quad *q = &ss->quads[i];
+      gls_quad *q = &ss->quads[i];
       q->texid = ss->current_texid;
       q->state = DEAD;
       reset_quad (mi, q);
@@ -718,7 +718,7 @@ ponder_state_change (ModeInfo *mi)
       /* Reset all quads, and mark only #0 as active. */
       for (i = 0; i < countof(ss->quads); i++)
         {
-          quad *q = &ss->quads[i];
+          gls_quad *q = &ss->quads[i];
           q->state = DEAD;
           reset_quad (mi, q);
           q->texid = ss->current_texid;
@@ -795,7 +795,7 @@ draw_slideshow (ModeInfo *mi)
          It's time to begin fading the visible one out, and the
          invisible one in.  (Reset the invisible one first.)
        */
-      quad *vq, *iq;
+      gls_quad *vq, *iq;
 
       ponder_state_change (mi);
 
index e13f3b5fd365eedb4853e2771fed8270f5e4cbaf..b5208dc85e868c1b311f9b47ec2aacda34c24058 100644 (file)
@@ -2,7 +2,7 @@
 .SH NAME
 glslideshow - slideshow of images using smooth zooming and fades
 .SH SYNOPSIS
-B glslideshow
+.B glslideshow
 [\-display \fIhost:display.screen\fP]
 [\-visual \fIvisual\fP]
 [\-window]
index d1e920794a0acdbdfeeee93153378274fadbdaf4..c0b5a2f01082a4c90f6655e6a5fbcb363bede846 100644 (file)
@@ -85,6 +85,15 @@ spread_bits (unsigned char value, unsigned char width)
 }
 
 
+static Bool
+bigendian (void)
+{
+  union { int i; char c[sizeof(int)]; } u;
+  u.i = 1;
+  return !u.c[0];
+}
+
+
 /* Returns an XImage structure containing an image of the desktop.
    (As a side-effect, that image *may* be painted onto the given Window.)
    This XImage will be 32 bits per pixel, 8 each per R, G, and B, with the
@@ -146,10 +155,10 @@ screen_to_ximage (Screen *screen, Window window)
      */
     {
       int x, y;
-      int crpos, cgpos, cbpos, capos;  /* bitfield positions */
-      int srpos, sgpos, sbpos;
-      int srmsk, sgmsk, sbmsk;
-      int srsiz, sgsiz, sbsiz;
+      unsigned int crpos=0, cgpos=0, cbpos=0, capos=0; /* bitfield positions */
+      unsigned int srpos=0, sgpos=0, sbpos=0;
+      unsigned int srmsk=0, sgmsk=0, sbmsk=0;
+      unsigned int srsiz=0, sgsiz=0, sbsiz=0;
       int i;
 
       unsigned char spread_map[3][256];
@@ -171,7 +180,10 @@ screen_to_ximage (Screen *screen, Window window)
          we need to pack things in "RGBA" order on the client machine,
          regardless of its endianness.
        */
-      crpos =  0, cgpos =  8, cbpos = 16, capos = 24;
+      if (bigendian())
+        crpos = 24, cgpos = 16, cbpos =  8, capos =  0;
+      else
+        crpos =  0, cgpos =  8, cbpos = 16, capos = 24;
 
       if (colors == 0)  /* truecolor */
         {
index e5351886f017efd61d2c642506e75bf4d6868dc5..ae8891f739cb743dc95a68e7a8c38afba8b2ea68 100644 (file)
@@ -195,6 +195,8 @@ static GLfloat flowerbox_colors[4][4] = {
     {0.0, 0.0, 0.9, 1.0},
 };
 
+# if 0 /* I am not even going to *try* and make this bullshit compile
+          without warning under gcc -std=c89 -pedantic.  -jwz. */
 #ifdef DEBUG
 # ifdef __GNUC__ /* GCC style */
 #define _DEBUG(msg, args...) do { \
@@ -212,6 +214,7 @@ static GLfloat flowerbox_colors[4][4] = {
 #define _DEBUG(msg, ...)
 # endif
 #endif
+#endif /* 0 */
 
 /* This is all the half-edge b-rep code (as well as basic geometry) */
 typedef struct face face;
@@ -356,7 +359,7 @@ static inline hedge *partner(hedge *h) {
        return h->e->left;
     }
     else {
-       _DEBUG("Inconsistent edge detected. Presumably, this is a bug. Exiting.\n", NULL);
+/*     _DEBUG("Inconsistent edge detected. Presumably, this is a bug. Exiting.\n", NULL); */
        exit(-1);
     }
 }
@@ -385,7 +388,7 @@ hedge *hedge_new(hedge *hafter, vertex *vtx)
     hedge *h = (hedge*)malloc(sizeof(hedge));
     
     if(!h) {
-       _DEBUG("Out of memory in hedge_new()\n",NULL);
+/*     _DEBUG("Out of memory in hedge_new()\n",NULL); */
        return NULL;
     }
     h->f = hafter->f;
@@ -402,7 +405,7 @@ edge *edge_new(solid *s)
 {
     edge *e = (edge*)malloc(sizeof(edge));
     if(!e) {
-       _DEBUG("Out of memory in edge_new()\n",NULL);
+/*     _DEBUG("Out of memory in edge_new()\n",NULL);*/
        exit(-1);
     }
     e->next = s->edges;
@@ -416,7 +419,7 @@ face *face_new(solid *s, hedge *h)
 {
     face *f = (face*)malloc(sizeof(face));
     if(!f) {
-       _DEBUG("Out of memory in face_new()",NULL);
+/*     _DEBUG("Out of memory in face_new()",NULL);*/
        exit(-1);
     }
     f->s = s;
@@ -477,11 +480,11 @@ face *face_split(face *f, hedge *h1, hedge *h2)
     face *fn;
 
     if(h1->f != f || h2->f != f) {
-       _DEBUG("Whoah, cap'n, yer usin' a bad halfedge!\n",NULL);
+/*     _DEBUG("Whoah, cap'n, yer usin' a bad halfedge!\n",NULL);*/
        exit(-1);
     }
     if(h1 == h2) {
-       _DEBUG("Trying to split a face at a single vertex\n",NULL);
+/*     _DEBUG("Trying to split a face at a single vertex\n",NULL);*/
        exit(-1);
     }
     /* close the loops */
@@ -837,7 +840,7 @@ void setup_opengl(ModeInfo *mi, jigglystruct *js)
 
 int parse_color(jigglystruct *js)
 {
-    int r, g, b;
+    unsigned int r, g, b;
     if(!strcmp(color, "clownbarf")) {
        js->color_style = COLOR_STYLE_CLOWNBARF;
        return 1;
@@ -1055,11 +1058,11 @@ void init_jigglypuff(ModeInfo *mi)
        MI_CLEARWINDOW(mi);
     }
     js->trackball = gltrackball_init();
-    _DEBUG("distance : %f\nhold : %f\nspherify : %f\ndamping : %f\ndfact : %f\n",
+/*    _DEBUG("distance : %f\nhold : %f\nspherify : %f\ndamping : %f\ndfact : %f\n",
           js->stable_distance, js->hold_strength, js->spherify_strength,
           js->damping_velocity, js->damping_factor);
     _DEBUG("wire : %d\nspooky : %d\nstyle : %d\nshininess : %d\n",
-          js->do_wireframe, js->spooky, js->color_style, js->shininess);
+          js->do_wireframe, js->spooky, js->color_style, js->shininess);*/
 }
 
 /* This is the end of the file */
index b068e3f4e7ff8259be004e41437ea1b78e9d9730..e4a87158c1f7d193149714fca9d7acc734ef8f22 100644 (file)
@@ -64,7 +64,7 @@ enum {
        SEASHELL,
        SWALLOWTAIL,
        BOHEM,
-    SURFACE_LAST,
+    SURFACE_LAST
 };
 
 /* primitives to draw with 
@@ -78,7 +78,7 @@ enum {
        MY_POINTS = 0,
        MY_LINES,
        MY_LINE_LOOP,
-       MY_PRIM_LAST,
+       MY_PRIM_LAST
 };
 
 
index eb75dd6d8ac81c509c604a87b2cde344fab0ad0c..bb6f219987796f0738ceab351da653df896280b7 100644 (file)
@@ -1861,7 +1861,7 @@ reshape_lament(ModeInfo *mi, int width, int height)
      Note that the image-map bits we have are 128x128.  Therefore, if the
      image is magnified a lot, it looks pretty blocky.  So it's better to
      have a 128x128 animation on a 1280x1024 screen that looks good, than
-     a 1024x1024 animation that looks really pixellated.
+     a 1024x1024 animation that looks really pixelated.
    */
   if (win_size > target_size * 1.5)
     {
index dcdb0f5e4363e2711a4c53d4f42c4820c3cba485..eebef51d0a665339be2bf9edd2946970fe57e9e7 100644 (file)
@@ -608,7 +608,7 @@ pinit(void)
                                GL_RGB, GL_UNSIGNED_BYTE, WoodTextureData);
     if (status)
       {
-        const char *s = gluErrorString (status);
+        const char *s = (char *) gluErrorString (status);
         fprintf (stderr, "%s: error mipmapping %dx%d texture: %s\n",
                  progname, WoodTextureWidth, WoodTextureHeight,
                  (s ? s : "(unknown)"));
index c54c101c6f6b821da0d2000de59bc25482e6a494..39ad1969e7e8d05693c7b0c63e4c63e094199d4b 100644 (file)
@@ -90,6 +90,11 @@ static int scale_down;
 #define TUBE_FACES_2     3
 
 
+# ifdef __GNUC__
+  __extension__  /* don't warn about "string length is greater than the length
+                    ISO C89 compilers are required to support" when includng
+                    the following data file... */
+# endif
 const char * const builtin_pdb_data[] = {
 # include "molecules.h"
 };
diff --git a/hacks/glx/polytopes.c b/hacks/glx/polytopes.c
new file mode 100644 (file)
index 0000000..d4a9eaa
--- /dev/null
@@ -0,0 +1,3007 @@
+/* polytopes --- Shows one of the six regular polytopes rotating in 4d */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)polytopes.c  1.1 03/05/18 xlockmore";
+
+#endif
+
+/* Copyright (c) 2003 Carsten Steger <carsten@mirsanmir.org>. */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and that
+ * both that copyright notice and this permission notice appear in
+ * supporting documentation.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * REVISION HISTORY:
+ * C. Steger - 03/08/10: Initial version
+ */
+
+/*
+ * This program shows one of the six regular 4D polytopes rotating in 4D.
+ * Written by Carsten Steger, inspired by H.S.M Coxeter's book "Regular
+ * Polytopes", 3rd Edition, Dover Publications, Inc., 1973, and Thomas
+ * Banchoff's book "Beyond the Third Dimension: Geometry, Computer
+ * Graphics, and Higher Dimensions", Scientific American Library, 1990.
+ */
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#define SQRT15OVER4 1.93649167310370844259 /* sqrt(15/4) */
+#define SQRT10OVER3 1.82574185835055371152 /* sqrt(10/3) */
+#define SQRT5OVER2  1.58113883008418966600 /* sqrt(5/2) */
+#define SQRT5OVER6  0.91287092917527685576 /* sqrt(5/6) */
+#define SQRT5OVER12 0.64549722436790281420 /* sqrt(5/12) */
+#define SQRT2       1.41421356237309504880 /* sqrt(2) */
+#define GOLDEN      1.61803398874989484820 /* (sqrt(5)+1)/2 */
+#define GOLDENINV   0.61803398874989484820 /* (sqrt(5)-1)/2 */
+#define SQRT2INV    0.70710678118654752440 /* sqrt(1/2) */
+#define GOLDEN2     1.14412280563536859520 /* ((sqrt(5)+1)/2)/sqrt(2) */
+#define GOLDENINV2  0.43701602444882107080 /* ((sqrt(5)-1)/2)/sqrt(2) */
+#define GOLDEN22    1.85122958682191611960 /* (((sqrt(5)+1)/2)^2)/sqrt(2) */
+#define GOLDENINV22 0.27009075673772645360 /* (((sqrt(5)-1)/2)^2)/sqrt(2) */
+
+#define DISP_WIREFRAME            0
+#define DISP_WIREFRAME_STR       "0"
+#define DISP_SURFACE              1
+#define DISP_SURFACE_STR         "1"
+#define DISP_TRANSPARENT          2
+#define DISP_TRANSPARENT_STR     "2"
+
+#define POLYTOPE_RANDOM          -1
+#define POLYTOPE_RANDOM_STR      "-1"
+#define POLYTOPE_5_CELL           0
+#define POLYTOPE_5_CELL_STR      "0"
+#define POLYTOPE_8_CELL           1
+#define POLYTOPE_8_CELL_STR      "1"
+#define POLYTOPE_16_CELL          2
+#define POLYTOPE_16_CELL_STR     "2"
+#define POLYTOPE_24_CELL          3
+#define POLYTOPE_24_CELL_STR     "3"
+#define POLYTOPE_120_CELL         4
+#define POLYTOPE_120_CELL_STR    "4"
+#define POLYTOPE_600_CELL         5
+#define POLYTOPE_600_CELL_STR    "5"
+#define POLYTOPE_LAST_CELL        POLYTOPE_600_CELL
+
+#define COLORS_SINGLE             0
+#define COLORS_SINGLE_STR        "0"
+#define COLORS_DEPTH              1
+#define COLORS_DEPTH_STR         "1"
+
+#define DISP_3D_PERSPECTIVE       0
+#define DISP_3D_PERSPECTIVE_STR  "0"
+#define DISP_3D_ORTHOGRAPHIC      1
+#define DISP_3D_ORTHOGRAPHIC_STR "1"
+
+#define DISP_4D_PERSPECTIVE       0
+#define DISP_4D_PERSPECTIVE_STR  "0"
+#define DISP_4D_ORTHOGRAPHIC      1
+#define DISP_4D_ORTHOGRAPHIC_STR "1"
+
+#define DALPHA                    1.1
+#define DALPHA_STR               "1.1"
+#define DBETA                     1.3
+#define DBETA_STR                "1.3"
+#define DDELTA                    1.5
+#define DDELTA_STR               "1.5"
+#define DZETA                     1.7
+#define DZETA_STR                "1.7"
+#define DETA                      1.9
+#define DETA_STR                 "1.9"
+#define DTHETA                    2.1
+#define DTHETA_STR               "2.1"
+
+#define DEF_DISPLAY_MODE          DISP_TRANSPARENT_STR   
+#define DEF_POLYTOPE              POLYTOPE_RANDOM_STR
+#define DEF_COLORS                COLORS_DEPTH_STR
+#define DEF_3D_PROJECTION         DISP_3D_PERSPECTIVE_STR
+#define DEF_4D_PROJECTION         DISP_4D_PERSPECTIVE_STR
+#define DEF_DALPHA                DALPHA_STR
+#define DEF_DBETA                 DBETA_STR
+#define DEF_DDELTA                DDELTA_STR
+#define DEF_DZETA                 DZETA_STR
+#define DEF_DETA                  DETA_STR
+#define DEF_DTHETA                DTHETA_STR
+
+#ifdef STANDALONE
+# define PROGCLASS       "Polytopes"
+# define HACK_INIT       init_polytopes
+# define HACK_DRAW       draw_polytopes
+# define HACK_RESHAPE    reshape_polytopes
+# define polytopes_opts xlockmore_opts
+# define DEFAULTS        "*delay:      25000 \n" \
+                         "*showFPS:    False \n" \
+                         "*wireframe:  False \n" \
+                         "*displayMode: "  DEF_DISPLAY_MODE  " \n" \
+                         "*polytope: "     DEF_POLYTOPE      " \n" \
+                         "*colors: "       DEF_COLORS        " \n" \
+                         "*projection3d: " DEF_3D_PROJECTION " \n" \
+                         "*projection4d: " DEF_4D_PROJECTION " \n" \
+                         "speedwx: "       DEF_DALPHA        " \n" \
+                         "speedwy: "       DEF_DBETA         " \n" \
+                         "speedwz: "       DEF_DDELTA        " \n" \
+                         "speedxy: "       DEF_DZETA         " \n" \
+                         "speedxz: "       DEF_DETA          " \n" \
+                         "speedyz: "       DEF_DTHETA        " \n"
+# include "xlockmore.h"         /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"             /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+
+#ifdef USE_MODULES
+ModStruct   polytopes_description =
+{"polytopes", "init_polytopes", "draw_polytopes", "release_polytopes",
+ "draw_polytopes", "change_polytopes", NULL, &polytopes_opts,
+ 25000, 1, 1, 1, 1.0, 4, "",
+ "Shows one of the six regular 4d polytopes rotating in 4d", 0, NULL};
+
+#endif
+
+
+static int display_mode;
+static int polytope;
+static int color_mode;
+static int projection_3d;
+static int projection_4d;
+static float speed_wx;
+static float speed_wy;
+static float speed_wz;
+static float speed_xy;
+static float speed_xz;
+static float speed_yz;
+
+/* 4D rotation angles */
+static float alpha, beta, delta, zeta, eta, theta;
+static float aspect;
+
+static const float offset4d[4] = {  0.0,  0.0,  0.0,  3.0 };
+static const float offset3d[4] = {  0.0,  0.0, -2.0,  0.0 };
+
+
+static XrmOptionDescRec opts[] =
+{
+  {"-mesh",            ".polytopes.displayMode",  XrmoptionNoArg,
+                       (caddr_t)DISP_WIREFRAME_STR },
+  {"-surface",         ".polytopes.displayMode",  XrmoptionNoArg,
+                       (caddr_t)DISP_SURFACE_STR },
+  {"-transparent",     ".polytopes.displayMode",  XrmoptionNoArg,
+                       (caddr_t)DISP_TRANSPARENT_STR },
+  {"-random",          ".polytopes.polytope",     XrmoptionNoArg,
+                       (caddr_t)POLYTOPE_RANDOM_STR },
+  {"-5-cell",          ".polytopes.polytope",     XrmoptionNoArg,
+                       (caddr_t)POLYTOPE_5_CELL_STR },
+  {"-8-cell",          ".polytopes.polytope",     XrmoptionNoArg,
+                       (caddr_t)POLYTOPE_8_CELL_STR },
+  {"-16-cell",         ".polytopes.polytope",     XrmoptionNoArg,
+                       (caddr_t)POLYTOPE_16_CELL_STR },
+  {"-24-cell",         ".polytopes.polytope",     XrmoptionNoArg,
+                       (caddr_t)POLYTOPE_24_CELL_STR },
+  {"-120-cell",        ".polytopes.polytope",     XrmoptionNoArg,
+                       (caddr_t)POLYTOPE_120_CELL_STR },
+  {"-600-cell",        ".polytopes.polytope",     XrmoptionNoArg,
+                       (caddr_t)POLYTOPE_600_CELL_STR },
+  {"-single-color",    ".polytopes.colors",       XrmoptionNoArg,
+                       (caddr_t)COLORS_SINGLE_STR },
+  {"-depth-colors",    ".polytopes.colors",       XrmoptionNoArg,
+                       (caddr_t)COLORS_DEPTH_STR },
+  {"-perspective-3d",  ".polytopes.projection3d", XrmoptionNoArg,
+                       (caddr_t)DISP_3D_PERSPECTIVE_STR },
+  {"-orthographic-3d", ".polytopes.projection3d", XrmoptionNoArg,
+                       (caddr_t)DISP_3D_ORTHOGRAPHIC_STR },
+  {"-perspective-4d",  ".polytopes.projection4d", XrmoptionNoArg,
+                       (caddr_t)DISP_4D_PERSPECTIVE_STR },
+  {"-orthographic-4d", ".polytopes.projection4d", XrmoptionNoArg,
+                       (caddr_t)DISP_4D_ORTHOGRAPHIC_STR },
+  {"-speed-wx",        ".polytopes.speedwx",      XrmoptionSepArg,
+                       (caddr_t)NULL },
+  {"-speed-wy",        ".polytopes.speedwy",      XrmoptionSepArg,
+                       (caddr_t)NULL },
+  {"-speed-wz",        ".polytopes.speedwz",      XrmoptionSepArg,
+                       (caddr_t)NULL },
+  {"-speed-xy",        ".polytopes.speedxy",      XrmoptionSepArg,
+                       (caddr_t)NULL },
+  {"-speed-xz",        ".polytopes.speedxz",      XrmoptionSepArg,
+                       (caddr_t)NULL },
+  {"-speed-yz",        ".polytopes.speedyz",      XrmoptionSepArg,
+                       (caddr_t)NULL }
+};
+
+static argtype vars[] =
+{
+  { (caddr_t *) &display_mode,  "displayMode",  "DisplayMode",
+    DEF_DISPLAY_MODE,  t_Int },
+  { (caddr_t *) &polytope,      "polytope",     "Polytope",
+    DEF_POLYTOPE,      t_Int },
+  { (caddr_t *) &color_mode,    "colors",       "Colors",
+    DEF_COLORS,        t_Int },
+  { (caddr_t *) &projection_3d, "projection3d", "Projection3d",
+    DEF_3D_PROJECTION, t_Int },
+  { (caddr_t *) &projection_4d, "projection4d", "Projection4d",
+    DEF_4D_PROJECTION, t_Int },
+  { (caddr_t *) &speed_wx,      "speedwx",      "Speedwx",
+    DEF_DALPHA,        t_Float},
+  { (caddr_t *) &speed_wy,      "speedwy",      "Speedwy",
+    DEF_DBETA,         t_Float},
+  { (caddr_t *) &speed_wz,      "speedwz",      "Speedwz",
+    DEF_DDELTA,        t_Float},
+  { (caddr_t *) &speed_xy,      "speedxy",      "Speedxy",
+    DEF_DZETA,         t_Float},
+  { (caddr_t *) &speed_xz,      "speedxz",      "Speedxz",
+    DEF_DETA,          t_Float},
+  { (caddr_t *) &speed_yz,      "speedyz",      "Speedyz",
+    DEF_DTHETA,        t_Float}
+};
+
+static OptionStruct desc[] =
+{
+  { "-mesh",            "display the polytope as a wireframe mesh" },
+  { "-surface",         "display the polytope as a solid surface" },
+  { "-transparent",     "display the polytope as a transparent surface" },
+  { "-solid",           "display the polytope as a solid object" },
+  { "-bands",           "display the polytope as see-through bands" },
+  { "-twosided",        "display the polytope with two colors" },
+  { "-colorwheel",      "display the polytope with a smooth color wheel" },
+  { "-perspective-3d",  "project the polytope perspectively from 3d to 2d" },
+  { "-orthographic-3d", "project the polytope orthographically from 3d to 2d"},
+  { "-perspective-4d",  "project the polytope perspectively from 4d to 3d" },
+  { "-orthographic-4d", "project the polytope orthographically from 4d to 3d"},
+  { "-speed-wx <arg>",  "rotation speed around the wx plane" },
+  { "-speed-wy <arg>",  "rotation speed around the wy plane" },
+  { "-speed-wz <arg>",  "rotation speed around the wz plane" },
+  { "-speed-xy <arg>",  "rotation speed around the xy plane" },
+  { "-speed-xz <arg>",  "rotation speed around the xz plane" },
+  { "-speed-yz <arg>",  "rotation speed around the yz plane" }
+};
+
+ModeSpecOpt polytopes_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+
+typedef struct {
+  GLint       WindH, WindW;
+  GLXContext *glx_context;
+} polytopesstruct;
+
+static polytopesstruct *poly = (polytopesstruct *) NULL;
+
+
+/* Vertex, edge, and face data for the six regular polytopes.  All the
+   polytopes are constructed with coordinates chosen such that their 4d
+   circumsphere has a radius of 2. */
+
+/* 5-cell {3,3,3} */
+#define NUM_VERT_5 5
+#define NUM_EDGE_5 10
+#define NUM_FACE_5 10
+#define VERT_PER_FACE_5 3
+
+#define MIN_EDGE_DEPTH_5 (-0.5)
+#define MAX_EDGE_DEPTH_5 0.75
+#define MIN_FACE_DEPTH_5 (-0.5)
+#define MAX_FACE_DEPTH_5 (1.0/3.0)
+
+static float vert_5[NUM_VERT_5][4] = {
+  { -SQRT5OVER2, -SQRT5OVER6, -SQRT5OVER12, -0.5 },
+  {  SQRT5OVER2, -SQRT5OVER6, -SQRT5OVER12, -0.5 },
+  {         0.0, SQRT10OVER3, -SQRT5OVER12, -0.5 },
+  {         0.0,         0.0,  SQRT15OVER4, -0.5 },
+  {         0.0,         0.0,          0.0,  2.0 }
+};
+
+static int edge_5[NUM_EDGE_5][2] = {
+  { 0, 1 }, { 0, 2 }, { 0, 3 }, { 0, 4 }, { 1, 2 }, { 1, 3 }, { 1, 4 },
+  { 2, 3 }, { 2, 4 }, { 3, 4 }
+};
+
+static int face_5[NUM_FACE_5][VERT_PER_FACE_5] = {
+  { 0, 1, 2 }, { 0, 1, 3 }, { 0, 1, 4 }, { 0, 2, 3 }, { 0, 2, 4 }, { 0, 3, 4 },
+  { 1, 2, 3 }, { 1, 2, 4 }, { 1, 3, 4 }, { 2, 3, 4 }
+};
+
+static float edge_color_5[NUM_EDGE_5][4];
+static float face_color_5[NUM_FACE_5][4];
+static float face_color_trans_5[NUM_FACE_5][4];
+
+
+/* 8-cell {4,3,3} */
+#define NUM_VERT_8 16
+#define NUM_EDGE_8 32
+#define NUM_FACE_8 24
+#define VERT_PER_FACE_8 4
+
+#define MIN_EDGE_DEPTH_8 (-1.0)
+#define MAX_EDGE_DEPTH_8 1.0
+#define MIN_FACE_DEPTH_8 (-1.0)
+#define MAX_FACE_DEPTH_8 1.0
+
+static float vert_8[NUM_VERT_8][4] = {
+  { -1.0, -1.0, -1.0, -1.0 }, {  1.0, -1.0, -1.0, -1.0 },
+  { -1.0,  1.0, -1.0, -1.0 }, {  1.0,  1.0, -1.0, -1.0 },
+  { -1.0, -1.0,  1.0, -1.0 }, {  1.0, -1.0,  1.0, -1.0 },
+  { -1.0,  1.0,  1.0, -1.0 }, {  1.0,  1.0,  1.0, -1.0 },
+  { -1.0, -1.0, -1.0,  1.0 }, {  1.0, -1.0, -1.0,  1.0 },
+  { -1.0,  1.0, -1.0,  1.0 }, {  1.0,  1.0, -1.0,  1.0 },
+  { -1.0, -1.0,  1.0,  1.0 }, {  1.0, -1.0,  1.0,  1.0 },
+  { -1.0,  1.0,  1.0,  1.0 }, {  1.0,  1.0,  1.0,  1.0 }
+};
+
+static int edge_8[NUM_EDGE_8][2] = {
+  {  0,  1 }, {  0,  2 }, {  0,  4 }, {  0,  8 }, {  1,  3 }, {  1,  5 },
+  {  1,  9 }, {  2,  3 }, {  2,  6 }, {  2, 10 }, {  3,  7 }, {  3, 11 },
+  {  4,  5 }, {  4,  6 }, {  4, 12 }, {  5,  7 }, {  5, 13 }, {  6,  7 },
+  {  6, 14 }, {  7, 15 }, {  8,  9 }, {  8, 10 }, {  8, 12 }, {  9, 11 },
+  {  9, 13 }, { 10, 11 }, { 10, 14 }, { 11, 15 }, { 12, 13 }, { 12, 14 },
+  { 13, 15 }, { 14, 15 }
+};
+
+static int face_8[NUM_FACE_8][VERT_PER_FACE_8] = {
+  {  0,  1,  3,  2 }, {  0,  1,  5,  4 }, {  0,  1,  9,  8 },
+  {  0,  2,  6,  4 }, {  0,  2, 10,  8 }, {  0,  4, 12,  8 },
+  {  1,  3,  7,  5 }, {  1,  3, 11,  9 }, {  1,  5, 13,  9 },
+  {  2,  3,  7,  6 }, {  2,  3, 11, 10 }, {  2,  6, 14, 10 },
+  {  3,  7, 15, 11 }, {  4,  5,  7,  6 }, {  4,  5, 13, 12 },
+  {  4,  6, 14, 12 }, {  5,  7, 15, 13 }, {  6,  7, 15, 14 },
+  {  8,  9, 11, 10 }, {  8,  9, 13, 12 }, {  8, 10, 14, 12 },
+  {  9, 11, 15, 13 }, { 10, 11, 15, 14 }, { 12, 13, 15, 14 }
+};
+
+static float edge_color_8[NUM_EDGE_8][4];
+static float face_color_8[NUM_FACE_8][4];
+static float face_color_trans_8[NUM_FACE_8][4];
+
+
+/* 16-cell {3,3,4} */
+#define NUM_VERT_16 8
+#define NUM_EDGE_16 24
+#define NUM_FACE_16 32
+#define VERT_PER_FACE_16 3
+
+#define MIN_EDGE_DEPTH_16 (-1.0)
+#define MAX_EDGE_DEPTH_16 1.0
+#define MIN_FACE_DEPTH_16 (-2.0/3.0)
+#define MAX_FACE_DEPTH_16 (2.0/3.0)
+
+static float vert_16[NUM_VERT_16][4] = {
+  {  0.0,  0.0,  0.0, -2.0 }, {  0.0,  0.0, -2.0,  0.0 },
+  {  0.0, -2.0,  0.0,  0.0 }, { -2.0,  0.0,  0.0,  0.0 },
+  {  2.0,  0.0,  0.0,  0.0 }, {  0.0,  2.0,  0.0,  0.0 },
+  {  0.0,  0.0,  2.0,  0.0 }, {  0.0,  0.0,  0.0,  2.0 }
+};
+
+static int edge_16[NUM_EDGE_16][2] = {
+  { 0, 1 }, { 0, 2 }, { 0, 3 }, { 0, 4 }, { 0, 5 }, { 0, 6 }, { 1, 2 },
+  { 1, 3 }, { 1, 4 }, { 1, 5 }, { 1, 7 }, { 2, 3 }, { 2, 4 }, { 2, 6 },
+  { 2, 7 }, { 3, 5 }, { 3, 6 }, { 3, 7 }, { 4, 5 }, { 4, 6 }, { 4, 7 },
+  { 5, 6 }, { 5, 7 }, { 6, 7 }
+};
+
+static int face_16[NUM_FACE_16][VERT_PER_FACE_16] = {
+  { 0, 1, 2 }, { 0, 1, 3 }, { 0, 1, 4 }, { 0, 1, 5 }, { 0, 2, 3 }, { 0, 2, 4 },
+  { 0, 2, 6 }, { 0, 3, 5 }, { 0, 3, 6 }, { 0, 4, 5 }, { 0, 4, 6 }, { 0, 5, 6 },
+  { 1, 2, 3 }, { 1, 2, 4 }, { 1, 2, 7 }, { 1, 3, 5 }, { 1, 3, 7 }, { 1, 4, 5 },
+  { 1, 4, 7 }, { 1, 5, 7 }, { 2, 3, 6 }, { 2, 3, 7 }, { 2, 4, 6 }, { 2, 4, 7 },
+  { 2, 6, 7 }, { 3, 5, 6 }, { 3, 5, 7 }, { 3, 6, 7 }, { 4, 5, 6 }, { 4, 5, 7 },
+  { 4, 6, 7 }, { 5, 6, 7 }
+};
+
+static float edge_color_16[NUM_EDGE_16][4];
+static float face_color_16[NUM_FACE_16][4];
+static float face_color_trans_16[NUM_FACE_16][4];
+
+
+/* 24-cell {3,4,3} */
+#define NUM_VERT_24 24
+#define NUM_EDGE_24 96
+#define NUM_FACE_24 96
+#define VERT_PER_FACE_24 3
+
+#define MIN_EDGE_DEPTH_24 (-SQRT2)
+#define MAX_EDGE_DEPTH_24 SQRT2
+#define MIN_FACE_DEPTH_24 (-SQRT2)
+#define MAX_FACE_DEPTH_24 SQRT2
+
+static float vert_24[NUM_VERT_24][4] = {
+  {    0.0,    0.0, -SQRT2, -SQRT2 }, {    0.0, -SQRT2,    0.0, -SQRT2 },
+  { -SQRT2,    0.0,    0.0, -SQRT2 }, {  SQRT2,    0.0,    0.0, -SQRT2 },
+  {    0.0,  SQRT2,    0.0, -SQRT2 }, {    0.0,    0.0,  SQRT2, -SQRT2 },
+  {    0.0, -SQRT2, -SQRT2,    0.0 }, { -SQRT2,    0.0, -SQRT2,    0.0 },
+  {  SQRT2,    0.0, -SQRT2,    0.0 }, {    0.0,  SQRT2, -SQRT2,    0.0 },
+  { -SQRT2, -SQRT2,    0.0,    0.0 }, {  SQRT2, -SQRT2,    0.0,    0.0 },
+  { -SQRT2,  SQRT2,    0.0,    0.0 }, {  SQRT2,  SQRT2,    0.0,    0.0 },
+  {    0.0, -SQRT2,  SQRT2,    0.0 }, { -SQRT2,    0.0,  SQRT2,    0.0 },
+  {  SQRT2,    0.0,  SQRT2,    0.0 }, {    0.0,  SQRT2,  SQRT2,    0.0 },
+  {    0.0,    0.0, -SQRT2,  SQRT2 }, {    0.0, -SQRT2,    0.0,  SQRT2 },
+  { -SQRT2,    0.0,    0.0,  SQRT2 }, {  SQRT2,    0.0,    0.0,  SQRT2 },
+  {    0.0,  SQRT2,    0.0,  SQRT2 }, {    0.0,    0.0,  SQRT2,  SQRT2 }
+};
+
+static int edge_24[NUM_EDGE_24][2] = {
+  {  0,  1 }, {  0,  2 }, {  0,  3 }, {  0,  4 }, {  0,  6 }, {  0,  7 },
+  {  0,  8 }, {  0,  9 }, {  1,  2 }, {  1,  3 }, {  1,  5 }, {  1,  6 },
+  {  1, 10 }, {  1, 11 }, {  1, 14 }, {  2,  4 }, {  2,  5 }, {  2,  7 },
+  {  2, 10 }, {  2, 12 }, {  2, 15 }, {  3,  4 }, {  3,  5 }, {  3,  8 },
+  {  3, 11 }, {  3, 13 }, {  3, 16 }, {  4,  5 }, {  4,  9 }, {  4, 12 },
+  {  4, 13 }, {  4, 17 }, {  5, 14 }, {  5, 15 }, {  5, 16 }, {  5, 17 },
+  {  6,  7 }, {  6,  8 }, {  6, 10 }, {  6, 11 }, {  6, 18 }, {  6, 19 },
+  {  7,  9 }, {  7, 10 }, {  7, 12 }, {  7, 18 }, {  7, 20 }, {  8,  9 },
+  {  8, 11 }, {  8, 13 }, {  8, 18 }, {  8, 21 }, {  9, 12 }, {  9, 13 },
+  {  9, 18 }, {  9, 22 }, { 10, 14 }, { 10, 15 }, { 10, 19 }, { 10, 20 },
+  { 11, 14 }, { 11, 16 }, { 11, 19 }, { 11, 21 }, { 12, 15 }, { 12, 17 },
+  { 12, 20 }, { 12, 22 }, { 13, 16 }, { 13, 17 }, { 13, 21 }, { 13, 22 },
+  { 14, 15 }, { 14, 16 }, { 14, 19 }, { 14, 23 }, { 15, 17 }, { 15, 20 },
+  { 15, 23 }, { 16, 17 }, { 16, 21 }, { 16, 23 }, { 17, 22 }, { 17, 23 },
+  { 18, 19 }, { 18, 20 }, { 18, 21 }, { 18, 22 }, { 19, 20 }, { 19, 21 },
+  { 19, 23 }, { 20, 22 }, { 20, 23 }, { 21, 22 }, { 21, 23 }, { 22, 23 }
+};
+
+static int face_24[NUM_FACE_24][VERT_PER_FACE_24] = {
+  {  0,  1,  2 }, {  0,  1,  3 }, {  0,  1,  6 }, {  0,  2,  4 }, 
+  {  0,  2,  7 }, {  0,  3,  4 }, {  0,  3,  8 }, {  0,  4,  9 },
+  {  0,  6,  7 }, {  0,  6,  8 }, {  0,  7,  9 }, {  0,  8,  9 },
+  {  1,  2,  5 }, {  1,  2, 10 }, {  1,  3,  5 }, {  1,  3, 11 },
+  {  1,  5, 14 }, {  1,  6, 10 }, {  1,  6, 11 }, {  1, 10, 14 },
+  {  1, 11, 14 }, {  2,  4,  5 }, {  2,  4, 12 }, {  2,  5, 15 },
+  {  2,  7, 10 }, {  2,  7, 12 }, {  2, 10, 15 }, {  2, 12, 15 },
+  {  3,  4,  5 }, {  3,  4, 13 }, {  3,  5, 16 }, {  3,  8, 11 },
+  {  3,  8, 13 }, {  3, 11, 16 }, {  3, 13, 16 }, {  4,  5, 17 },
+  {  4,  9, 12 }, {  4,  9, 13 }, {  4, 12, 17 }, {  4, 13, 17 },
+  {  5, 14, 15 }, {  5, 14, 16 }, {  5, 15, 17 }, {  5, 16, 17 },
+  {  6,  7, 10 }, {  6,  7, 18 }, {  6,  8, 11 }, {  6,  8, 18 },
+  {  6, 10, 19 }, {  6, 11, 19 }, {  6, 18, 19 }, {  7,  9, 12 },
+  {  7,  9, 18 }, {  7, 10, 20 }, {  7, 12, 20 }, {  7, 18, 20 },
+  {  8,  9, 13 }, {  8,  9, 18 }, {  8, 11, 21 }, {  8, 13, 21 },
+  {  8, 18, 21 }, {  9, 12, 22 }, {  9, 13, 22 }, {  9, 18, 22 },
+  { 10, 14, 15 }, { 10, 14, 19 }, { 10, 15, 20 }, { 10, 19, 20 },
+  { 11, 14, 16 }, { 11, 14, 19 }, { 11, 16, 21 }, { 11, 19, 21 },
+  { 12, 15, 17 }, { 12, 15, 20 }, { 12, 17, 22 }, { 12, 20, 22 },
+  { 13, 16, 17 }, { 13, 16, 21 }, { 13, 17, 22 }, { 13, 21, 22 },
+  { 14, 15, 23 }, { 14, 16, 23 }, { 14, 19, 23 }, { 15, 17, 23 },
+  { 15, 20, 23 }, { 16, 17, 23 }, { 16, 21, 23 }, { 17, 22, 23 },
+  { 18, 19, 20 }, { 18, 19, 21 }, { 18, 20, 22 }, { 18, 21, 22 },
+  { 19, 20, 23 }, { 19, 21, 23 }, { 20, 22, 23 }, { 21, 22, 23 }
+};
+
+static float edge_color_24[NUM_EDGE_24][4];
+static float face_color_24[NUM_FACE_24][4];
+static float face_color_trans_24[NUM_FACE_24][4];
+
+
+/* 120-cell {5,3,3} */
+#define NUM_VERT_120 600
+#define NUM_EDGE_120 1200
+#define NUM_FACE_120 720
+#define VERT_PER_FACE_120 5
+
+#define MIN_EDGE_DEPTH_120 (-GOLDEN22)
+#define MAX_EDGE_DEPTH_120 GOLDEN22
+#define MIN_FACE_DEPTH_120 (-GOLDEN22)
+#define MAX_FACE_DEPTH_120 GOLDEN22
+
+static float vert_120[NUM_VERT_120][4] = {
+  { -GOLDENINV22,          0.0,    -SQRT2INV,    -GOLDEN22 },
+  {  GOLDENINV22,          0.0,    -SQRT2INV,    -GOLDEN22 },
+  {  -GOLDENINV2,  -GOLDENINV2,  -GOLDENINV2,    -GOLDEN22 },
+  {   GOLDENINV2,  -GOLDENINV2,  -GOLDENINV2,    -GOLDEN22 },
+  {  -GOLDENINV2,   GOLDENINV2,  -GOLDENINV2,    -GOLDEN22 },
+  {   GOLDENINV2,   GOLDENINV2,  -GOLDENINV2,    -GOLDEN22 },
+  {          0.0,    -SQRT2INV, -GOLDENINV22,    -GOLDEN22 },
+  {          0.0,     SQRT2INV, -GOLDENINV22,    -GOLDEN22 },
+  {    -SQRT2INV, -GOLDENINV22,          0.0,    -GOLDEN22 },
+  {     SQRT2INV, -GOLDENINV22,          0.0,    -GOLDEN22 },
+  {    -SQRT2INV,  GOLDENINV22,          0.0,    -GOLDEN22 },
+  {     SQRT2INV,  GOLDENINV22,          0.0,    -GOLDEN22 },
+  {          0.0,    -SQRT2INV,  GOLDENINV22,    -GOLDEN22 },
+  {          0.0,     SQRT2INV,  GOLDENINV22,    -GOLDEN22 },
+  {  -GOLDENINV2,  -GOLDENINV2,   GOLDENINV2,    -GOLDEN22 },
+  {   GOLDENINV2,  -GOLDENINV2,   GOLDENINV2,    -GOLDEN22 },
+  {  -GOLDENINV2,   GOLDENINV2,   GOLDENINV2,    -GOLDEN22 },
+  {   GOLDENINV2,   GOLDENINV2,   GOLDENINV2,    -GOLDEN22 },
+  { -GOLDENINV22,          0.0,     SQRT2INV,    -GOLDEN22 },
+  {  GOLDENINV22,          0.0,     SQRT2INV,    -GOLDEN22 },
+  {  -GOLDENINV2,          0.0,     -GOLDEN2,  -SQRT5OVER2 },
+  {   GOLDENINV2,          0.0,     -GOLDEN2,  -SQRT5OVER2 },
+  {    -SQRT2INV,    -SQRT2INV,    -SQRT2INV,  -SQRT5OVER2 },
+  {     SQRT2INV,    -SQRT2INV,    -SQRT2INV,  -SQRT5OVER2 },
+  {    -SQRT2INV,     SQRT2INV,    -SQRT2INV,  -SQRT5OVER2 },
+  {     SQRT2INV,     SQRT2INV,    -SQRT2INV,  -SQRT5OVER2 },
+  {          0.0,     -GOLDEN2,  -GOLDENINV2,  -SQRT5OVER2 },
+  {          0.0,      GOLDEN2,  -GOLDENINV2,  -SQRT5OVER2 },
+  {     -GOLDEN2,  -GOLDENINV2,          0.0,  -SQRT5OVER2 },
+  {      GOLDEN2,  -GOLDENINV2,          0.0,  -SQRT5OVER2 },
+  {     -GOLDEN2,   GOLDENINV2,          0.0,  -SQRT5OVER2 },
+  {      GOLDEN2,   GOLDENINV2,          0.0,  -SQRT5OVER2 },
+  {          0.0,     -GOLDEN2,   GOLDENINV2,  -SQRT5OVER2 },
+  {          0.0,      GOLDEN2,   GOLDENINV2,  -SQRT5OVER2 },
+  {    -SQRT2INV,    -SQRT2INV,     SQRT2INV,  -SQRT5OVER2 },
+  {     SQRT2INV,    -SQRT2INV,     SQRT2INV,  -SQRT5OVER2 },
+  {    -SQRT2INV,     SQRT2INV,     SQRT2INV,  -SQRT5OVER2 },
+  {     SQRT2INV,     SQRT2INV,     SQRT2INV,  -SQRT5OVER2 },
+  {  -GOLDENINV2,          0.0,      GOLDEN2,  -SQRT5OVER2 },
+  {   GOLDENINV2,          0.0,      GOLDEN2,  -SQRT5OVER2 },
+  {          0.0,          0.0,       -SQRT2,       -SQRT2 },
+  {    -SQRT2INV,  -GOLDENINV2,     -GOLDEN2,       -SQRT2 },
+  {     SQRT2INV,  -GOLDENINV2,     -GOLDEN2,       -SQRT2 },
+  {    -SQRT2INV,   GOLDENINV2,     -GOLDEN2,       -SQRT2 },
+  {     SQRT2INV,   GOLDENINV2,     -GOLDEN2,       -SQRT2 },
+  {  -GOLDENINV2,     -GOLDEN2,    -SQRT2INV,       -SQRT2 },
+  {   GOLDENINV2,     -GOLDEN2,    -SQRT2INV,       -SQRT2 },
+  {  -GOLDENINV2,      GOLDEN2,    -SQRT2INV,       -SQRT2 },
+  {   GOLDENINV2,      GOLDEN2,    -SQRT2INV,       -SQRT2 },
+  {     -GOLDEN2,    -SQRT2INV,  -GOLDENINV2,       -SQRT2 },
+  {      GOLDEN2,    -SQRT2INV,  -GOLDENINV2,       -SQRT2 },
+  {     -GOLDEN2,     SQRT2INV,  -GOLDENINV2,       -SQRT2 },
+  {      GOLDEN2,     SQRT2INV,  -GOLDENINV2,       -SQRT2 },
+  {          0.0,       -SQRT2,          0.0,       -SQRT2 },
+  {       -SQRT2,          0.0,          0.0,       -SQRT2 },
+  {        SQRT2,          0.0,          0.0,       -SQRT2 },
+  {          0.0,        SQRT2,          0.0,       -SQRT2 },
+  {     -GOLDEN2,    -SQRT2INV,   GOLDENINV2,       -SQRT2 },
+  {      GOLDEN2,    -SQRT2INV,   GOLDENINV2,       -SQRT2 },
+  {     -GOLDEN2,     SQRT2INV,   GOLDENINV2,       -SQRT2 },
+  {      GOLDEN2,     SQRT2INV,   GOLDENINV2,       -SQRT2 },
+  {  -GOLDENINV2,     -GOLDEN2,     SQRT2INV,       -SQRT2 },
+  {   GOLDENINV2,     -GOLDEN2,     SQRT2INV,       -SQRT2 },
+  {  -GOLDENINV2,      GOLDEN2,     SQRT2INV,       -SQRT2 },
+  {   GOLDENINV2,      GOLDEN2,     SQRT2INV,       -SQRT2 },
+  {    -SQRT2INV,  -GOLDENINV2,      GOLDEN2,       -SQRT2 },
+  {     SQRT2INV,  -GOLDENINV2,      GOLDEN2,       -SQRT2 },
+  {    -SQRT2INV,   GOLDENINV2,      GOLDEN2,       -SQRT2 },
+  {     SQRT2INV,   GOLDENINV2,      GOLDEN2,       -SQRT2 },
+  {          0.0,          0.0,        SQRT2,       -SQRT2 },
+  {          0.0,  -GOLDENINV2,  -SQRT5OVER2,     -GOLDEN2 },
+  {          0.0,   GOLDENINV2,  -SQRT5OVER2,     -GOLDEN2 },
+  {  -GOLDENINV2,    -SQRT2INV,       -SQRT2,     -GOLDEN2 },
+  {   GOLDENINV2,    -SQRT2INV,       -SQRT2,     -GOLDEN2 },
+  {  -GOLDENINV2,     SQRT2INV,       -SQRT2,     -GOLDEN2 },
+  {   GOLDENINV2,     SQRT2INV,       -SQRT2,     -GOLDEN2 },
+  { -GOLDENINV22,     -GOLDEN2,     -GOLDEN2,     -GOLDEN2 },
+  {  GOLDENINV22,     -GOLDEN2,     -GOLDEN2,     -GOLDEN2 },
+  {     -GOLDEN2, -GOLDENINV22,     -GOLDEN2,     -GOLDEN2 },
+  {      GOLDEN2, -GOLDENINV22,     -GOLDEN2,     -GOLDEN2 },
+  {     -GOLDEN2,  GOLDENINV22,     -GOLDEN2,     -GOLDEN2 },
+  {      GOLDEN2,  GOLDENINV22,     -GOLDEN2,     -GOLDEN2 },
+  { -GOLDENINV22,      GOLDEN2,     -GOLDEN2,     -GOLDEN2 },
+  {  GOLDENINV22,      GOLDEN2,     -GOLDEN2,     -GOLDEN2 },
+  {       -SQRT2,  -GOLDENINV2,    -SQRT2INV,     -GOLDEN2 },
+  {        SQRT2,  -GOLDENINV2,    -SQRT2INV,     -GOLDEN2 },
+  {       -SQRT2,   GOLDENINV2,    -SQRT2INV,     -GOLDEN2 },
+  {        SQRT2,   GOLDENINV2,    -SQRT2INV,     -GOLDEN2 },
+  {    -SQRT2INV,       -SQRT2,  -GOLDENINV2,     -GOLDEN2 },
+  {     SQRT2INV,       -SQRT2,  -GOLDENINV2,     -GOLDEN2 },
+  {  -SQRT5OVER2,          0.0,  -GOLDENINV2,     -GOLDEN2 },
+  {   SQRT5OVER2,          0.0,  -GOLDENINV2,     -GOLDEN2 },
+  {    -SQRT2INV,        SQRT2,  -GOLDENINV2,     -GOLDEN2 },
+  {     SQRT2INV,        SQRT2,  -GOLDENINV2,     -GOLDEN2 },
+  {     -GOLDEN2,     -GOLDEN2, -GOLDENINV22,     -GOLDEN2 },
+  {      GOLDEN2,     -GOLDEN2, -GOLDENINV22,     -GOLDEN2 },
+  {     -GOLDEN2,      GOLDEN2, -GOLDENINV22,     -GOLDEN2 },
+  {      GOLDEN2,      GOLDEN2, -GOLDENINV22,     -GOLDEN2 },
+  {  -GOLDENINV2,  -SQRT5OVER2,          0.0,     -GOLDEN2 },
+  {   GOLDENINV2,  -SQRT5OVER2,          0.0,     -GOLDEN2 },
+  {  -GOLDENINV2,   SQRT5OVER2,          0.0,     -GOLDEN2 },
+  {   GOLDENINV2,   SQRT5OVER2,          0.0,     -GOLDEN2 },
+  {     -GOLDEN2,     -GOLDEN2,  GOLDENINV22,     -GOLDEN2 },
+  {      GOLDEN2,     -GOLDEN2,  GOLDENINV22,     -GOLDEN2 },
+  {     -GOLDEN2,      GOLDEN2,  GOLDENINV22,     -GOLDEN2 },
+  {      GOLDEN2,      GOLDEN2,  GOLDENINV22,     -GOLDEN2 },
+  {    -SQRT2INV,       -SQRT2,   GOLDENINV2,     -GOLDEN2 },
+  {     SQRT2INV,       -SQRT2,   GOLDENINV2,     -GOLDEN2 },
+  {  -SQRT5OVER2,          0.0,   GOLDENINV2,     -GOLDEN2 },
+  {   SQRT5OVER2,          0.0,   GOLDENINV2,     -GOLDEN2 },
+  {    -SQRT2INV,        SQRT2,   GOLDENINV2,     -GOLDEN2 },
+  {     SQRT2INV,        SQRT2,   GOLDENINV2,     -GOLDEN2 },
+  {       -SQRT2,  -GOLDENINV2,     SQRT2INV,     -GOLDEN2 },
+  {        SQRT2,  -GOLDENINV2,     SQRT2INV,     -GOLDEN2 },
+  {       -SQRT2,   GOLDENINV2,     SQRT2INV,     -GOLDEN2 },
+  {        SQRT2,   GOLDENINV2,     SQRT2INV,     -GOLDEN2 },
+  { -GOLDENINV22,     -GOLDEN2,      GOLDEN2,     -GOLDEN2 },
+  {  GOLDENINV22,     -GOLDEN2,      GOLDEN2,     -GOLDEN2 },
+  {     -GOLDEN2, -GOLDENINV22,      GOLDEN2,     -GOLDEN2 },
+  {      GOLDEN2, -GOLDENINV22,      GOLDEN2,     -GOLDEN2 },
+  {     -GOLDEN2,  GOLDENINV22,      GOLDEN2,     -GOLDEN2 },
+  {      GOLDEN2,  GOLDENINV22,      GOLDEN2,     -GOLDEN2 },
+  { -GOLDENINV22,      GOLDEN2,      GOLDEN2,     -GOLDEN2 },
+  {  GOLDENINV22,      GOLDEN2,      GOLDEN2,     -GOLDEN2 },
+  {  -GOLDENINV2,    -SQRT2INV,        SQRT2,     -GOLDEN2 },
+  {   GOLDENINV2,    -SQRT2INV,        SQRT2,     -GOLDEN2 },
+  {  -GOLDENINV2,     SQRT2INV,        SQRT2,     -GOLDEN2 },
+  {   GOLDENINV2,     SQRT2INV,        SQRT2,     -GOLDEN2 },
+  {          0.0,  -GOLDENINV2,   SQRT5OVER2,     -GOLDEN2 },
+  {          0.0,   GOLDENINV2,   SQRT5OVER2,     -GOLDEN2 },
+  {          0.0, -GOLDENINV22,    -GOLDEN22,    -SQRT2INV },
+  {          0.0,  GOLDENINV22,    -GOLDEN22,    -SQRT2INV },
+  {    -SQRT2INV,    -SQRT2INV,  -SQRT5OVER2,    -SQRT2INV },
+  {     SQRT2INV,    -SQRT2INV,  -SQRT5OVER2,    -SQRT2INV },
+  {    -SQRT2INV,     SQRT2INV,  -SQRT5OVER2,    -SQRT2INV },
+  {     SQRT2INV,     SQRT2INV,  -SQRT5OVER2,    -SQRT2INV },
+  {     -GOLDEN2,  -GOLDENINV2,       -SQRT2,    -SQRT2INV },
+  {      GOLDEN2,  -GOLDENINV2,       -SQRT2,    -SQRT2INV },
+  {     -GOLDEN2,   GOLDENINV2,       -SQRT2,    -SQRT2INV },
+  {      GOLDEN2,   GOLDENINV2,       -SQRT2,    -SQRT2INV },
+  {  -GOLDENINV2,       -SQRT2,     -GOLDEN2,    -SQRT2INV },
+  {   GOLDENINV2,       -SQRT2,     -GOLDEN2,    -SQRT2INV },
+  {  -GOLDENINV2,        SQRT2,     -GOLDEN2,    -SQRT2INV },
+  {   GOLDENINV2,        SQRT2,     -GOLDEN2,    -SQRT2INV },
+  {    -SQRT2INV,  -SQRT5OVER2,    -SQRT2INV,    -SQRT2INV },
+  {     SQRT2INV,  -SQRT5OVER2,    -SQRT2INV,    -SQRT2INV },
+  {  -SQRT5OVER2,    -SQRT2INV,    -SQRT2INV,    -SQRT2INV },
+  {   SQRT5OVER2,    -SQRT2INV,    -SQRT2INV,    -SQRT2INV },
+  {  -SQRT5OVER2,     SQRT2INV,    -SQRT2INV,    -SQRT2INV },
+  {   SQRT5OVER2,     SQRT2INV,    -SQRT2INV,    -SQRT2INV },
+  {    -SQRT2INV,   SQRT5OVER2,    -SQRT2INV,    -SQRT2INV },
+  {     SQRT2INV,   SQRT5OVER2,    -SQRT2INV,    -SQRT2INV },
+  {       -SQRT2,     -GOLDEN2,  -GOLDENINV2,    -SQRT2INV },
+  {        SQRT2,     -GOLDEN2,  -GOLDENINV2,    -SQRT2INV },
+  {       -SQRT2,      GOLDEN2,  -GOLDENINV2,    -SQRT2INV },
+  {        SQRT2,      GOLDEN2,  -GOLDENINV2,    -SQRT2INV },
+  {    -GOLDEN22,          0.0, -GOLDENINV22,    -SQRT2INV },
+  {     GOLDEN22,          0.0, -GOLDENINV22,    -SQRT2INV },
+  { -GOLDENINV22,    -GOLDEN22,          0.0,    -SQRT2INV },
+  {  GOLDENINV22,    -GOLDEN22,          0.0,    -SQRT2INV },
+  { -GOLDENINV22,     GOLDEN22,          0.0,    -SQRT2INV },
+  {  GOLDENINV22,     GOLDEN22,          0.0,    -SQRT2INV },
+  {    -GOLDEN22,          0.0,  GOLDENINV22,    -SQRT2INV },
+  {     GOLDEN22,          0.0,  GOLDENINV22,    -SQRT2INV },
+  {       -SQRT2,     -GOLDEN2,   GOLDENINV2,    -SQRT2INV },
+  {        SQRT2,     -GOLDEN2,   GOLDENINV2,    -SQRT2INV },
+  {       -SQRT2,      GOLDEN2,   GOLDENINV2,    -SQRT2INV },
+  {        SQRT2,      GOLDEN2,   GOLDENINV2,    -SQRT2INV },
+  {    -SQRT2INV,  -SQRT5OVER2,     SQRT2INV,    -SQRT2INV },
+  {     SQRT2INV,  -SQRT5OVER2,     SQRT2INV,    -SQRT2INV },
+  {  -SQRT5OVER2,    -SQRT2INV,     SQRT2INV,    -SQRT2INV },
+  {   SQRT5OVER2,    -SQRT2INV,     SQRT2INV,    -SQRT2INV },
+  {  -SQRT5OVER2,     SQRT2INV,     SQRT2INV,    -SQRT2INV },
+  {   SQRT5OVER2,     SQRT2INV,     SQRT2INV,    -SQRT2INV },
+  {    -SQRT2INV,   SQRT5OVER2,     SQRT2INV,    -SQRT2INV },
+  {     SQRT2INV,   SQRT5OVER2,     SQRT2INV,    -SQRT2INV },
+  {  -GOLDENINV2,       -SQRT2,      GOLDEN2,    -SQRT2INV },
+  {   GOLDENINV2,       -SQRT2,      GOLDEN2,    -SQRT2INV },
+  {  -GOLDENINV2,        SQRT2,      GOLDEN2,    -SQRT2INV },
+  {   GOLDENINV2,        SQRT2,      GOLDEN2,    -SQRT2INV },
+  {     -GOLDEN2,  -GOLDENINV2,        SQRT2,    -SQRT2INV },
+  {      GOLDEN2,  -GOLDENINV2,        SQRT2,    -SQRT2INV },
+  {     -GOLDEN2,   GOLDENINV2,        SQRT2,    -SQRT2INV },
+  {      GOLDEN2,   GOLDENINV2,        SQRT2,    -SQRT2INV },
+  {    -SQRT2INV,    -SQRT2INV,   SQRT5OVER2,    -SQRT2INV },
+  {     SQRT2INV,    -SQRT2INV,   SQRT5OVER2,    -SQRT2INV },
+  {    -SQRT2INV,     SQRT2INV,   SQRT5OVER2,    -SQRT2INV },
+  {     SQRT2INV,     SQRT2INV,   SQRT5OVER2,    -SQRT2INV },
+  {          0.0, -GOLDENINV22,     GOLDEN22,    -SQRT2INV },
+  {          0.0,  GOLDENINV22,     GOLDEN22,    -SQRT2INV },
+  {  -GOLDENINV2,  -GOLDENINV2,    -GOLDEN22,  -GOLDENINV2 },
+  {   GOLDENINV2,  -GOLDENINV2,    -GOLDEN22,  -GOLDENINV2 },
+  {  -GOLDENINV2,   GOLDENINV2,    -GOLDEN22,  -GOLDENINV2 },
+  {   GOLDENINV2,   GOLDENINV2,    -GOLDEN22,  -GOLDENINV2 },
+  {     -GOLDEN2,          0.0,  -SQRT5OVER2,  -GOLDENINV2 },
+  {      GOLDEN2,          0.0,  -SQRT5OVER2,  -GOLDENINV2 },
+  {    -SQRT2INV,     -GOLDEN2,       -SQRT2,  -GOLDENINV2 },
+  {     SQRT2INV,     -GOLDEN2,       -SQRT2,  -GOLDENINV2 },
+  {    -SQRT2INV,      GOLDEN2,       -SQRT2,  -GOLDENINV2 },
+  {     SQRT2INV,      GOLDEN2,       -SQRT2,  -GOLDENINV2 },
+  {          0.0,  -SQRT5OVER2,     -GOLDEN2,  -GOLDENINV2 },
+  {       -SQRT2,    -SQRT2INV,     -GOLDEN2,  -GOLDENINV2 },
+  {        SQRT2,    -SQRT2INV,     -GOLDEN2,  -GOLDENINV2 },
+  {       -SQRT2,     SQRT2INV,     -GOLDEN2,  -GOLDENINV2 },
+  {        SQRT2,     SQRT2INV,     -GOLDEN2,  -GOLDENINV2 },
+  {          0.0,   SQRT5OVER2,     -GOLDEN2,  -GOLDENINV2 },
+  {     -GOLDEN2,       -SQRT2,    -SQRT2INV,  -GOLDENINV2 },
+  {      GOLDEN2,       -SQRT2,    -SQRT2INV,  -GOLDENINV2 },
+  {     -GOLDEN2,        SQRT2,    -SQRT2INV,  -GOLDENINV2 },
+  {      GOLDEN2,        SQRT2,    -SQRT2INV,  -GOLDENINV2 },
+  {  -GOLDENINV2,    -GOLDEN22,  -GOLDENINV2,  -GOLDENINV2 },
+  {   GOLDENINV2,    -GOLDEN22,  -GOLDENINV2,  -GOLDENINV2 },
+  {    -GOLDEN22,  -GOLDENINV2,  -GOLDENINV2,  -GOLDENINV2 },
+  {     GOLDEN22,  -GOLDENINV2,  -GOLDENINV2,  -GOLDENINV2 },
+  {    -GOLDEN22,   GOLDENINV2,  -GOLDENINV2,  -GOLDENINV2 },
+  {     GOLDEN22,   GOLDENINV2,  -GOLDENINV2,  -GOLDENINV2 },
+  {  -GOLDENINV2,     GOLDEN22,  -GOLDENINV2,  -GOLDENINV2 },
+  {   GOLDENINV2,     GOLDEN22,  -GOLDENINV2,  -GOLDENINV2 },
+  {  -SQRT5OVER2,     -GOLDEN2,          0.0,  -GOLDENINV2 },
+  {   SQRT5OVER2,     -GOLDEN2,          0.0,  -GOLDENINV2 },
+  {  -SQRT5OVER2,      GOLDEN2,          0.0,  -GOLDENINV2 },
+  {   SQRT5OVER2,      GOLDEN2,          0.0,  -GOLDENINV2 },
+  {  -GOLDENINV2,    -GOLDEN22,   GOLDENINV2,  -GOLDENINV2 },
+  {   GOLDENINV2,    -GOLDEN22,   GOLDENINV2,  -GOLDENINV2 },
+  {    -GOLDEN22,  -GOLDENINV2,   GOLDENINV2,  -GOLDENINV2 },
+  {     GOLDEN22,  -GOLDENINV2,   GOLDENINV2,  -GOLDENINV2 },
+  {    -GOLDEN22,   GOLDENINV2,   GOLDENINV2,  -GOLDENINV2 },
+  {     GOLDEN22,   GOLDENINV2,   GOLDENINV2,  -GOLDENINV2 },
+  {  -GOLDENINV2,     GOLDEN22,   GOLDENINV2,  -GOLDENINV2 },
+  {   GOLDENINV2,     GOLDEN22,   GOLDENINV2,  -GOLDENINV2 },
+  {     -GOLDEN2,       -SQRT2,     SQRT2INV,  -GOLDENINV2 },
+  {      GOLDEN2,       -SQRT2,     SQRT2INV,  -GOLDENINV2 },
+  {     -GOLDEN2,        SQRT2,     SQRT2INV,  -GOLDENINV2 },
+  {      GOLDEN2,        SQRT2,     SQRT2INV,  -GOLDENINV2 },
+  {          0.0,  -SQRT5OVER2,      GOLDEN2,  -GOLDENINV2 },
+  {       -SQRT2,    -SQRT2INV,      GOLDEN2,  -GOLDENINV2 },
+  {        SQRT2,    -SQRT2INV,      GOLDEN2,  -GOLDENINV2 },
+  {       -SQRT2,     SQRT2INV,      GOLDEN2,  -GOLDENINV2 },
+  {        SQRT2,     SQRT2INV,      GOLDEN2,  -GOLDENINV2 },
+  {          0.0,   SQRT5OVER2,      GOLDEN2,  -GOLDENINV2 },
+  {    -SQRT2INV,     -GOLDEN2,        SQRT2,  -GOLDENINV2 },
+  {     SQRT2INV,     -GOLDEN2,        SQRT2,  -GOLDENINV2 },
+  {    -SQRT2INV,      GOLDEN2,        SQRT2,  -GOLDENINV2 },
+  {     SQRT2INV,      GOLDEN2,        SQRT2,  -GOLDENINV2 },
+  {     -GOLDEN2,          0.0,   SQRT5OVER2,  -GOLDENINV2 },
+  {      GOLDEN2,          0.0,   SQRT5OVER2,  -GOLDENINV2 },
+  {  -GOLDENINV2,  -GOLDENINV2,     GOLDEN22,  -GOLDENINV2 },
+  {   GOLDENINV2,  -GOLDENINV2,     GOLDEN22,  -GOLDENINV2 },
+  {  -GOLDENINV2,   GOLDENINV2,     GOLDEN22,  -GOLDENINV2 },
+  {   GOLDENINV2,   GOLDENINV2,     GOLDEN22,  -GOLDENINV2 },
+  {    -SQRT2INV,          0.0,    -GOLDEN22, -GOLDENINV22 },
+  {     SQRT2INV,          0.0,    -GOLDEN22, -GOLDENINV22 },
+  {     -GOLDEN2,     -GOLDEN2,     -GOLDEN2, -GOLDENINV22 },
+  {      GOLDEN2,     -GOLDEN2,     -GOLDEN2, -GOLDENINV22 },
+  {     -GOLDEN2,      GOLDEN2,     -GOLDEN2, -GOLDENINV22 },
+  {      GOLDEN2,      GOLDEN2,     -GOLDEN2, -GOLDENINV22 },
+  {          0.0,    -GOLDEN22,    -SQRT2INV, -GOLDENINV22 },
+  {          0.0,     GOLDEN22,    -SQRT2INV, -GOLDENINV22 },
+  {    -GOLDEN22,    -SQRT2INV,          0.0, -GOLDENINV22 },
+  {     GOLDEN22,    -SQRT2INV,          0.0, -GOLDENINV22 },
+  {    -GOLDEN22,     SQRT2INV,          0.0, -GOLDENINV22 },
+  {     GOLDEN22,     SQRT2INV,          0.0, -GOLDENINV22 },
+  {          0.0,    -GOLDEN22,     SQRT2INV, -GOLDENINV22 },
+  {          0.0,     GOLDEN22,     SQRT2INV, -GOLDENINV22 },
+  {     -GOLDEN2,     -GOLDEN2,      GOLDEN2, -GOLDENINV22 },
+  {      GOLDEN2,     -GOLDEN2,      GOLDEN2, -GOLDENINV22 },
+  {     -GOLDEN2,      GOLDEN2,      GOLDEN2, -GOLDENINV22 },
+  {      GOLDEN2,      GOLDEN2,      GOLDEN2, -GOLDENINV22 },
+  {    -SQRT2INV,          0.0,     GOLDEN22, -GOLDENINV22 },
+  {     SQRT2INV,          0.0,     GOLDEN22, -GOLDENINV22 },
+  { -GOLDENINV22,    -SQRT2INV,    -GOLDEN22,          0.0 },
+  {  GOLDENINV22,    -SQRT2INV,    -GOLDEN22,          0.0 },
+  { -GOLDENINV22,     SQRT2INV,    -GOLDEN22,          0.0 },
+  {  GOLDENINV22,     SQRT2INV,    -GOLDEN22,          0.0 },
+  {  -GOLDENINV2,     -GOLDEN2,  -SQRT5OVER2,          0.0 },
+  {   GOLDENINV2,     -GOLDEN2,  -SQRT5OVER2,          0.0 },
+  {  -GOLDENINV2,      GOLDEN2,  -SQRT5OVER2,          0.0 },
+  {   GOLDENINV2,      GOLDEN2,  -SQRT5OVER2,          0.0 },
+  {          0.0,       -SQRT2,       -SQRT2,          0.0 },
+  {       -SQRT2,          0.0,       -SQRT2,          0.0 },
+  {        SQRT2,          0.0,       -SQRT2,          0.0 },
+  {          0.0,        SQRT2,       -SQRT2,          0.0 },
+  {  -SQRT5OVER2,  -GOLDENINV2,     -GOLDEN2,          0.0 },
+  {   SQRT5OVER2,  -GOLDENINV2,     -GOLDEN2,          0.0 },
+  {  -SQRT5OVER2,   GOLDENINV2,     -GOLDEN2,          0.0 },
+  {   SQRT5OVER2,   GOLDENINV2,     -GOLDEN2,          0.0 },
+  {    -GOLDEN22, -GOLDENINV22,    -SQRT2INV,          0.0 },
+  {     GOLDEN22, -GOLDENINV22,    -SQRT2INV,          0.0 },
+  {    -GOLDEN22,  GOLDENINV22,    -SQRT2INV,          0.0 },
+  {     GOLDEN22,  GOLDENINV22,    -SQRT2INV,          0.0 },
+  {     -GOLDEN2,  -SQRT5OVER2,  -GOLDENINV2,          0.0 },
+  {      GOLDEN2,  -SQRT5OVER2,  -GOLDENINV2,          0.0 },
+  {     -GOLDEN2,   SQRT5OVER2,  -GOLDENINV2,          0.0 },
+  {      GOLDEN2,   SQRT5OVER2,  -GOLDENINV2,          0.0 },
+  {    -SQRT2INV,    -GOLDEN22, -GOLDENINV22,          0.0 },
+  {     SQRT2INV,    -GOLDEN22, -GOLDENINV22,          0.0 },
+  {    -SQRT2INV,     GOLDEN22, -GOLDENINV22,          0.0 },
+  {     SQRT2INV,     GOLDEN22, -GOLDENINV22,          0.0 },
+  {       -SQRT2,       -SQRT2,          0.0,          0.0 },
+  {        SQRT2,       -SQRT2,          0.0,          0.0 },
+  {       -SQRT2,        SQRT2,          0.0,          0.0 },
+  {        SQRT2,        SQRT2,          0.0,          0.0 },
+  {    -SQRT2INV,    -GOLDEN22,  GOLDENINV22,          0.0 },
+  {     SQRT2INV,    -GOLDEN22,  GOLDENINV22,          0.0 },
+  {    -SQRT2INV,     GOLDEN22,  GOLDENINV22,          0.0 },
+  {     SQRT2INV,     GOLDEN22,  GOLDENINV22,          0.0 },
+  {     -GOLDEN2,  -SQRT5OVER2,   GOLDENINV2,          0.0 },
+  {      GOLDEN2,  -SQRT5OVER2,   GOLDENINV2,          0.0 },
+  {     -GOLDEN2,   SQRT5OVER2,   GOLDENINV2,          0.0 },
+  {      GOLDEN2,   SQRT5OVER2,   GOLDENINV2,          0.0 },
+  {    -GOLDEN22, -GOLDENINV22,     SQRT2INV,          0.0 },
+  {     GOLDEN22, -GOLDENINV22,     SQRT2INV,          0.0 },
+  {    -GOLDEN22,  GOLDENINV22,     SQRT2INV,          0.0 },
+  {     GOLDEN22,  GOLDENINV22,     SQRT2INV,          0.0 },
+  {  -SQRT5OVER2,  -GOLDENINV2,      GOLDEN2,          0.0 },
+  {   SQRT5OVER2,  -GOLDENINV2,      GOLDEN2,          0.0 },
+  {  -SQRT5OVER2,   GOLDENINV2,      GOLDEN2,          0.0 },
+  {   SQRT5OVER2,   GOLDENINV2,      GOLDEN2,          0.0 },
+  {          0.0,       -SQRT2,        SQRT2,          0.0 },
+  {       -SQRT2,          0.0,        SQRT2,          0.0 },
+  {        SQRT2,          0.0,        SQRT2,          0.0 },
+  {          0.0,        SQRT2,        SQRT2,          0.0 },
+  {  -GOLDENINV2,     -GOLDEN2,   SQRT5OVER2,          0.0 },
+  {   GOLDENINV2,     -GOLDEN2,   SQRT5OVER2,          0.0 },
+  {  -GOLDENINV2,      GOLDEN2,   SQRT5OVER2,          0.0 },
+  {   GOLDENINV2,      GOLDEN2,   SQRT5OVER2,          0.0 },
+  { -GOLDENINV22,    -SQRT2INV,     GOLDEN22,          0.0 },
+  {  GOLDENINV22,    -SQRT2INV,     GOLDEN22,          0.0 },
+  { -GOLDENINV22,     SQRT2INV,     GOLDEN22,          0.0 },
+  {  GOLDENINV22,     SQRT2INV,     GOLDEN22,          0.0 },
+  {    -SQRT2INV,          0.0,    -GOLDEN22,  GOLDENINV22 },
+  {     SQRT2INV,          0.0,    -GOLDEN22,  GOLDENINV22 },
+  {     -GOLDEN2,     -GOLDEN2,     -GOLDEN2,  GOLDENINV22 },
+  {      GOLDEN2,     -GOLDEN2,     -GOLDEN2,  GOLDENINV22 },
+  {     -GOLDEN2,      GOLDEN2,     -GOLDEN2,  GOLDENINV22 },
+  {      GOLDEN2,      GOLDEN2,     -GOLDEN2,  GOLDENINV22 },
+  {          0.0,    -GOLDEN22,    -SQRT2INV,  GOLDENINV22 },
+  {          0.0,     GOLDEN22,    -SQRT2INV,  GOLDENINV22 },
+  {    -GOLDEN22,    -SQRT2INV,          0.0,  GOLDENINV22 },
+  {     GOLDEN22,    -SQRT2INV,          0.0,  GOLDENINV22 },
+  {    -GOLDEN22,     SQRT2INV,          0.0,  GOLDENINV22 },
+  {     GOLDEN22,     SQRT2INV,          0.0,  GOLDENINV22 },
+  {          0.0,    -GOLDEN22,     SQRT2INV,  GOLDENINV22 },
+  {          0.0,     GOLDEN22,     SQRT2INV,  GOLDENINV22 },
+  {     -GOLDEN2,     -GOLDEN2,      GOLDEN2,  GOLDENINV22 },
+  {      GOLDEN2,     -GOLDEN2,      GOLDEN2,  GOLDENINV22 },
+  {     -GOLDEN2,      GOLDEN2,      GOLDEN2,  GOLDENINV22 },
+  {      GOLDEN2,      GOLDEN2,      GOLDEN2,  GOLDENINV22 },
+  {    -SQRT2INV,          0.0,     GOLDEN22,  GOLDENINV22 },
+  {     SQRT2INV,          0.0,     GOLDEN22,  GOLDENINV22 },
+  {  -GOLDENINV2,  -GOLDENINV2,    -GOLDEN22,   GOLDENINV2 },
+  {   GOLDENINV2,  -GOLDENINV2,    -GOLDEN22,   GOLDENINV2 },
+  {  -GOLDENINV2,   GOLDENINV2,    -GOLDEN22,   GOLDENINV2 },
+  {   GOLDENINV2,   GOLDENINV2,    -GOLDEN22,   GOLDENINV2 },
+  {     -GOLDEN2,          0.0,  -SQRT5OVER2,   GOLDENINV2 },
+  {      GOLDEN2,          0.0,  -SQRT5OVER2,   GOLDENINV2 },
+  {    -SQRT2INV,     -GOLDEN2,       -SQRT2,   GOLDENINV2 },
+  {     SQRT2INV,     -GOLDEN2,       -SQRT2,   GOLDENINV2 },
+  {    -SQRT2INV,      GOLDEN2,       -SQRT2,   GOLDENINV2 },
+  {     SQRT2INV,      GOLDEN2,       -SQRT2,   GOLDENINV2 },
+  {          0.0,  -SQRT5OVER2,     -GOLDEN2,   GOLDENINV2 },
+  {       -SQRT2,    -SQRT2INV,     -GOLDEN2,   GOLDENINV2 },
+  {        SQRT2,    -SQRT2INV,     -GOLDEN2,   GOLDENINV2 },
+  {       -SQRT2,     SQRT2INV,     -GOLDEN2,   GOLDENINV2 },
+  {        SQRT2,     SQRT2INV,     -GOLDEN2,   GOLDENINV2 },
+  {          0.0,   SQRT5OVER2,     -GOLDEN2,   GOLDENINV2 },
+  {     -GOLDEN2,       -SQRT2,    -SQRT2INV,   GOLDENINV2 },
+  {      GOLDEN2,       -SQRT2,    -SQRT2INV,   GOLDENINV2 },
+  {     -GOLDEN2,        SQRT2,    -SQRT2INV,   GOLDENINV2 },
+  {      GOLDEN2,        SQRT2,    -SQRT2INV,   GOLDENINV2 },
+  {  -GOLDENINV2,    -GOLDEN22,  -GOLDENINV2,   GOLDENINV2 },
+  {   GOLDENINV2,    -GOLDEN22,  -GOLDENINV2,   GOLDENINV2 },
+  {    -GOLDEN22,  -GOLDENINV2,  -GOLDENINV2,   GOLDENINV2 },
+  {     GOLDEN22,  -GOLDENINV2,  -GOLDENINV2,   GOLDENINV2 },
+  {    -GOLDEN22,   GOLDENINV2,  -GOLDENINV2,   GOLDENINV2 },
+  {     GOLDEN22,   GOLDENINV2,  -GOLDENINV2,   GOLDENINV2 },
+  {  -GOLDENINV2,     GOLDEN22,  -GOLDENINV2,   GOLDENINV2 },
+  {   GOLDENINV2,     GOLDEN22,  -GOLDENINV2,   GOLDENINV2 },
+  {  -SQRT5OVER2,     -GOLDEN2,          0.0,   GOLDENINV2 },
+  {   SQRT5OVER2,     -GOLDEN2,          0.0,   GOLDENINV2 },
+  {  -SQRT5OVER2,      GOLDEN2,          0.0,   GOLDENINV2 },
+  {   SQRT5OVER2,      GOLDEN2,          0.0,   GOLDENINV2 },
+  {  -GOLDENINV2,    -GOLDEN22,   GOLDENINV2,   GOLDENINV2 },
+  {   GOLDENINV2,    -GOLDEN22,   GOLDENINV2,   GOLDENINV2 },
+  {    -GOLDEN22,  -GOLDENINV2,   GOLDENINV2,   GOLDENINV2 },
+  {     GOLDEN22,  -GOLDENINV2,   GOLDENINV2,   GOLDENINV2 },
+  {    -GOLDEN22,   GOLDENINV2,   GOLDENINV2,   GOLDENINV2 },
+  {     GOLDEN22,   GOLDENINV2,   GOLDENINV2,   GOLDENINV2 },
+  {  -GOLDENINV2,     GOLDEN22,   GOLDENINV2,   GOLDENINV2 },
+  {   GOLDENINV2,     GOLDEN22,   GOLDENINV2,   GOLDENINV2 },
+  {     -GOLDEN2,       -SQRT2,     SQRT2INV,   GOLDENINV2 },
+  {      GOLDEN2,       -SQRT2,     SQRT2INV,   GOLDENINV2 },
+  {     -GOLDEN2,        SQRT2,     SQRT2INV,   GOLDENINV2 },
+  {      GOLDEN2,        SQRT2,     SQRT2INV,   GOLDENINV2 },
+  {          0.0,  -SQRT5OVER2,      GOLDEN2,   GOLDENINV2 },
+  {       -SQRT2,    -SQRT2INV,      GOLDEN2,   GOLDENINV2 },
+  {        SQRT2,    -SQRT2INV,      GOLDEN2,   GOLDENINV2 },
+  {       -SQRT2,     SQRT2INV,      GOLDEN2,   GOLDENINV2 },
+  {        SQRT2,     SQRT2INV,      GOLDEN2,   GOLDENINV2 },
+  {          0.0,   SQRT5OVER2,      GOLDEN2,   GOLDENINV2 },
+  {    -SQRT2INV,     -GOLDEN2,        SQRT2,   GOLDENINV2 },
+  {     SQRT2INV,     -GOLDEN2,        SQRT2,   GOLDENINV2 },
+  {    -SQRT2INV,      GOLDEN2,        SQRT2,   GOLDENINV2 },
+  {     SQRT2INV,      GOLDEN2,        SQRT2,   GOLDENINV2 },
+  {     -GOLDEN2,          0.0,   SQRT5OVER2,   GOLDENINV2 },
+  {      GOLDEN2,          0.0,   SQRT5OVER2,   GOLDENINV2 },
+  {  -GOLDENINV2,  -GOLDENINV2,     GOLDEN22,   GOLDENINV2 },
+  {   GOLDENINV2,  -GOLDENINV2,     GOLDEN22,   GOLDENINV2 },
+  {  -GOLDENINV2,   GOLDENINV2,     GOLDEN22,   GOLDENINV2 },
+  {   GOLDENINV2,   GOLDENINV2,     GOLDEN22,   GOLDENINV2 },
+  {          0.0, -GOLDENINV22,    -GOLDEN22,     SQRT2INV },
+  {          0.0,  GOLDENINV22,    -GOLDEN22,     SQRT2INV },
+  {    -SQRT2INV,    -SQRT2INV,  -SQRT5OVER2,     SQRT2INV },
+  {     SQRT2INV,    -SQRT2INV,  -SQRT5OVER2,     SQRT2INV },
+  {    -SQRT2INV,     SQRT2INV,  -SQRT5OVER2,     SQRT2INV },
+  {     SQRT2INV,     SQRT2INV,  -SQRT5OVER2,     SQRT2INV },
+  {     -GOLDEN2,  -GOLDENINV2,       -SQRT2,     SQRT2INV },
+  {      GOLDEN2,  -GOLDENINV2,       -SQRT2,     SQRT2INV },
+  {     -GOLDEN2,   GOLDENINV2,       -SQRT2,     SQRT2INV },
+  {      GOLDEN2,   GOLDENINV2,       -SQRT2,     SQRT2INV },
+  {  -GOLDENINV2,       -SQRT2,     -GOLDEN2,     SQRT2INV },
+  {   GOLDENINV2,       -SQRT2,     -GOLDEN2,     SQRT2INV },
+  {  -GOLDENINV2,        SQRT2,     -GOLDEN2,     SQRT2INV },
+  {   GOLDENINV2,        SQRT2,     -GOLDEN2,     SQRT2INV },
+  {    -SQRT2INV,  -SQRT5OVER2,    -SQRT2INV,     SQRT2INV },
+  {     SQRT2INV,  -SQRT5OVER2,    -SQRT2INV,     SQRT2INV },
+  {  -SQRT5OVER2,    -SQRT2INV,    -SQRT2INV,     SQRT2INV },
+  {   SQRT5OVER2,    -SQRT2INV,    -SQRT2INV,     SQRT2INV },
+  {  -SQRT5OVER2,     SQRT2INV,    -SQRT2INV,     SQRT2INV },
+  {   SQRT5OVER2,     SQRT2INV,    -SQRT2INV,     SQRT2INV },
+  {    -SQRT2INV,   SQRT5OVER2,    -SQRT2INV,     SQRT2INV },
+  {     SQRT2INV,   SQRT5OVER2,    -SQRT2INV,     SQRT2INV },
+  {       -SQRT2,     -GOLDEN2,  -GOLDENINV2,     SQRT2INV },
+  {        SQRT2,     -GOLDEN2,  -GOLDENINV2,     SQRT2INV },
+  {       -SQRT2,      GOLDEN2,  -GOLDENINV2,     SQRT2INV },
+  {        SQRT2,      GOLDEN2,  -GOLDENINV2,     SQRT2INV },
+  {    -GOLDEN22,          0.0, -GOLDENINV22,     SQRT2INV },
+  {     GOLDEN22,          0.0, -GOLDENINV22,     SQRT2INV },
+  { -GOLDENINV22,    -GOLDEN22,          0.0,     SQRT2INV },
+  {  GOLDENINV22,    -GOLDEN22,          0.0,     SQRT2INV },
+  { -GOLDENINV22,     GOLDEN22,          0.0,     SQRT2INV },
+  {  GOLDENINV22,     GOLDEN22,          0.0,     SQRT2INV },
+  {    -GOLDEN22,          0.0,  GOLDENINV22,     SQRT2INV },
+  {     GOLDEN22,          0.0,  GOLDENINV22,     SQRT2INV },
+  {       -SQRT2,     -GOLDEN2,   GOLDENINV2,     SQRT2INV },
+  {        SQRT2,     -GOLDEN2,   GOLDENINV2,     SQRT2INV },
+  {       -SQRT2,      GOLDEN2,   GOLDENINV2,     SQRT2INV },
+  {        SQRT2,      GOLDEN2,   GOLDENINV2,     SQRT2INV },
+  {    -SQRT2INV,  -SQRT5OVER2,     SQRT2INV,     SQRT2INV },
+  {     SQRT2INV,  -SQRT5OVER2,     SQRT2INV,     SQRT2INV },
+  {  -SQRT5OVER2,    -SQRT2INV,     SQRT2INV,     SQRT2INV },
+  {   SQRT5OVER2,    -SQRT2INV,     SQRT2INV,     SQRT2INV },
+  {  -SQRT5OVER2,     SQRT2INV,     SQRT2INV,     SQRT2INV },
+  {   SQRT5OVER2,     SQRT2INV,     SQRT2INV,     SQRT2INV },
+  {    -SQRT2INV,   SQRT5OVER2,     SQRT2INV,     SQRT2INV },
+  {     SQRT2INV,   SQRT5OVER2,     SQRT2INV,     SQRT2INV },
+  {  -GOLDENINV2,       -SQRT2,      GOLDEN2,     SQRT2INV },
+  {   GOLDENINV2,       -SQRT2,      GOLDEN2,     SQRT2INV },
+  {  -GOLDENINV2,        SQRT2,      GOLDEN2,     SQRT2INV },
+  {   GOLDENINV2,        SQRT2,      GOLDEN2,     SQRT2INV },
+  {     -GOLDEN2,  -GOLDENINV2,        SQRT2,     SQRT2INV },
+  {      GOLDEN2,  -GOLDENINV2,        SQRT2,     SQRT2INV },
+  {     -GOLDEN2,   GOLDENINV2,        SQRT2,     SQRT2INV },
+  {      GOLDEN2,   GOLDENINV2,        SQRT2,     SQRT2INV },
+  {    -SQRT2INV,    -SQRT2INV,   SQRT5OVER2,     SQRT2INV },
+  {     SQRT2INV,    -SQRT2INV,   SQRT5OVER2,     SQRT2INV },
+  {    -SQRT2INV,     SQRT2INV,   SQRT5OVER2,     SQRT2INV },
+  {     SQRT2INV,     SQRT2INV,   SQRT5OVER2,     SQRT2INV },
+  {          0.0, -GOLDENINV22,     GOLDEN22,     SQRT2INV },
+  {          0.0,  GOLDENINV22,     GOLDEN22,     SQRT2INV },
+  {          0.0,  -GOLDENINV2,  -SQRT5OVER2,      GOLDEN2 },
+  {          0.0,   GOLDENINV2,  -SQRT5OVER2,      GOLDEN2 },
+  {  -GOLDENINV2,    -SQRT2INV,       -SQRT2,      GOLDEN2 },
+  {   GOLDENINV2,    -SQRT2INV,       -SQRT2,      GOLDEN2 },
+  {  -GOLDENINV2,     SQRT2INV,       -SQRT2,      GOLDEN2 },
+  {   GOLDENINV2,     SQRT2INV,       -SQRT2,      GOLDEN2 },
+  { -GOLDENINV22,     -GOLDEN2,     -GOLDEN2,      GOLDEN2 },
+  {  GOLDENINV22,     -GOLDEN2,     -GOLDEN2,      GOLDEN2 },
+  {     -GOLDEN2, -GOLDENINV22,     -GOLDEN2,      GOLDEN2 },
+  {      GOLDEN2, -GOLDENINV22,     -GOLDEN2,      GOLDEN2 },
+  {     -GOLDEN2,  GOLDENINV22,     -GOLDEN2,      GOLDEN2 },
+  {      GOLDEN2,  GOLDENINV22,     -GOLDEN2,      GOLDEN2 },
+  { -GOLDENINV22,      GOLDEN2,     -GOLDEN2,      GOLDEN2 },
+  {  GOLDENINV22,      GOLDEN2,     -GOLDEN2,      GOLDEN2 },
+  {       -SQRT2,  -GOLDENINV2,    -SQRT2INV,      GOLDEN2 },
+  {        SQRT2,  -GOLDENINV2,    -SQRT2INV,      GOLDEN2 },
+  {       -SQRT2,   GOLDENINV2,    -SQRT2INV,      GOLDEN2 },
+  {        SQRT2,   GOLDENINV2,    -SQRT2INV,      GOLDEN2 },
+  {    -SQRT2INV,       -SQRT2,  -GOLDENINV2,      GOLDEN2 },
+  {     SQRT2INV,       -SQRT2,  -GOLDENINV2,      GOLDEN2 },
+  {  -SQRT5OVER2,          0.0,  -GOLDENINV2,      GOLDEN2 },
+  {   SQRT5OVER2,          0.0,  -GOLDENINV2,      GOLDEN2 },
+  {    -SQRT2INV,        SQRT2,  -GOLDENINV2,      GOLDEN2 },
+  {     SQRT2INV,        SQRT2,  -GOLDENINV2,      GOLDEN2 },
+  {     -GOLDEN2,     -GOLDEN2, -GOLDENINV22,      GOLDEN2 },
+  {      GOLDEN2,     -GOLDEN2, -GOLDENINV22,      GOLDEN2 },
+  {     -GOLDEN2,      GOLDEN2, -GOLDENINV22,      GOLDEN2 },
+  {      GOLDEN2,      GOLDEN2, -GOLDENINV22,      GOLDEN2 },
+  {  -GOLDENINV2,  -SQRT5OVER2,          0.0,      GOLDEN2 },
+  {   GOLDENINV2,  -SQRT5OVER2,          0.0,      GOLDEN2 },
+  {  -GOLDENINV2,   SQRT5OVER2,          0.0,      GOLDEN2 },
+  {   GOLDENINV2,   SQRT5OVER2,          0.0,      GOLDEN2 },
+  {     -GOLDEN2,     -GOLDEN2,  GOLDENINV22,      GOLDEN2 },
+  {      GOLDEN2,     -GOLDEN2,  GOLDENINV22,      GOLDEN2 },
+  {     -GOLDEN2,      GOLDEN2,  GOLDENINV22,      GOLDEN2 },
+  {      GOLDEN2,      GOLDEN2,  GOLDENINV22,      GOLDEN2 },
+  {    -SQRT2INV,       -SQRT2,   GOLDENINV2,      GOLDEN2 },
+  {     SQRT2INV,       -SQRT2,   GOLDENINV2,      GOLDEN2 },
+  {  -SQRT5OVER2,          0.0,   GOLDENINV2,      GOLDEN2 },
+  {   SQRT5OVER2,          0.0,   GOLDENINV2,      GOLDEN2 },
+  {    -SQRT2INV,        SQRT2,   GOLDENINV2,      GOLDEN2 },
+  {     SQRT2INV,        SQRT2,   GOLDENINV2,      GOLDEN2 },
+  {       -SQRT2,  -GOLDENINV2,     SQRT2INV,      GOLDEN2 },
+  {        SQRT2,  -GOLDENINV2,     SQRT2INV,      GOLDEN2 },
+  {       -SQRT2,   GOLDENINV2,     SQRT2INV,      GOLDEN2 },
+  {        SQRT2,   GOLDENINV2,     SQRT2INV,      GOLDEN2 },
+  { -GOLDENINV22,     -GOLDEN2,      GOLDEN2,      GOLDEN2 },
+  {  GOLDENINV22,     -GOLDEN2,      GOLDEN2,      GOLDEN2 },
+  {     -GOLDEN2, -GOLDENINV22,      GOLDEN2,      GOLDEN2 },
+  {      GOLDEN2, -GOLDENINV22,      GOLDEN2,      GOLDEN2 },
+  {     -GOLDEN2,  GOLDENINV22,      GOLDEN2,      GOLDEN2 },
+  {      GOLDEN2,  GOLDENINV22,      GOLDEN2,      GOLDEN2 },
+  { -GOLDENINV22,      GOLDEN2,      GOLDEN2,      GOLDEN2 },
+  {  GOLDENINV22,      GOLDEN2,      GOLDEN2,      GOLDEN2 },
+  {  -GOLDENINV2,    -SQRT2INV,        SQRT2,      GOLDEN2 },
+  {   GOLDENINV2,    -SQRT2INV,        SQRT2,      GOLDEN2 },
+  {  -GOLDENINV2,     SQRT2INV,        SQRT2,      GOLDEN2 },
+  {   GOLDENINV2,     SQRT2INV,        SQRT2,      GOLDEN2 },
+  {          0.0,  -GOLDENINV2,   SQRT5OVER2,      GOLDEN2 },
+  {          0.0,   GOLDENINV2,   SQRT5OVER2,      GOLDEN2 },
+  {          0.0,          0.0,       -SQRT2,        SQRT2 },
+  {    -SQRT2INV,  -GOLDENINV2,     -GOLDEN2,        SQRT2 },
+  {     SQRT2INV,  -GOLDENINV2,     -GOLDEN2,        SQRT2 },
+  {    -SQRT2INV,   GOLDENINV2,     -GOLDEN2,        SQRT2 },
+  {     SQRT2INV,   GOLDENINV2,     -GOLDEN2,        SQRT2 },
+  {  -GOLDENINV2,     -GOLDEN2,    -SQRT2INV,        SQRT2 },
+  {   GOLDENINV2,     -GOLDEN2,    -SQRT2INV,        SQRT2 },
+  {  -GOLDENINV2,      GOLDEN2,    -SQRT2INV,        SQRT2 },
+  {   GOLDENINV2,      GOLDEN2,    -SQRT2INV,        SQRT2 },
+  {     -GOLDEN2,    -SQRT2INV,  -GOLDENINV2,        SQRT2 },
+  {      GOLDEN2,    -SQRT2INV,  -GOLDENINV2,        SQRT2 },
+  {     -GOLDEN2,     SQRT2INV,  -GOLDENINV2,        SQRT2 },
+  {      GOLDEN2,     SQRT2INV,  -GOLDENINV2,        SQRT2 },
+  {          0.0,       -SQRT2,          0.0,        SQRT2 },
+  {       -SQRT2,          0.0,          0.0,        SQRT2 },
+  {        SQRT2,          0.0,          0.0,        SQRT2 },
+  {          0.0,        SQRT2,          0.0,        SQRT2 },
+  {     -GOLDEN2,    -SQRT2INV,   GOLDENINV2,        SQRT2 },
+  {      GOLDEN2,    -SQRT2INV,   GOLDENINV2,        SQRT2 },
+  {     -GOLDEN2,     SQRT2INV,   GOLDENINV2,        SQRT2 },
+  {      GOLDEN2,     SQRT2INV,   GOLDENINV2,        SQRT2 },
+  {  -GOLDENINV2,     -GOLDEN2,     SQRT2INV,        SQRT2 },
+  {   GOLDENINV2,     -GOLDEN2,     SQRT2INV,        SQRT2 },
+  {  -GOLDENINV2,      GOLDEN2,     SQRT2INV,        SQRT2 },
+  {   GOLDENINV2,      GOLDEN2,     SQRT2INV,        SQRT2 },
+  {    -SQRT2INV,  -GOLDENINV2,      GOLDEN2,        SQRT2 },
+  {     SQRT2INV,  -GOLDENINV2,      GOLDEN2,        SQRT2 },
+  {    -SQRT2INV,   GOLDENINV2,      GOLDEN2,        SQRT2 },
+  {     SQRT2INV,   GOLDENINV2,      GOLDEN2,        SQRT2 },
+  {          0.0,          0.0,        SQRT2,        SQRT2 },
+  {  -GOLDENINV2,          0.0,     -GOLDEN2,   SQRT5OVER2 },
+  {   GOLDENINV2,          0.0,     -GOLDEN2,   SQRT5OVER2 },
+  {    -SQRT2INV,    -SQRT2INV,    -SQRT2INV,   SQRT5OVER2 },
+  {     SQRT2INV,    -SQRT2INV,    -SQRT2INV,   SQRT5OVER2 },
+  {    -SQRT2INV,     SQRT2INV,    -SQRT2INV,   SQRT5OVER2 },
+  {     SQRT2INV,     SQRT2INV,    -SQRT2INV,   SQRT5OVER2 },
+  {          0.0,     -GOLDEN2,  -GOLDENINV2,   SQRT5OVER2 },
+  {          0.0,      GOLDEN2,  -GOLDENINV2,   SQRT5OVER2 },
+  {     -GOLDEN2,  -GOLDENINV2,          0.0,   SQRT5OVER2 },
+  {      GOLDEN2,  -GOLDENINV2,          0.0,   SQRT5OVER2 },
+  {     -GOLDEN2,   GOLDENINV2,          0.0,   SQRT5OVER2 },
+  {      GOLDEN2,   GOLDENINV2,          0.0,   SQRT5OVER2 },
+  {          0.0,     -GOLDEN2,   GOLDENINV2,   SQRT5OVER2 },
+  {          0.0,      GOLDEN2,   GOLDENINV2,   SQRT5OVER2 },
+  {    -SQRT2INV,    -SQRT2INV,     SQRT2INV,   SQRT5OVER2 },
+  {     SQRT2INV,    -SQRT2INV,     SQRT2INV,   SQRT5OVER2 },
+  {    -SQRT2INV,     SQRT2INV,     SQRT2INV,   SQRT5OVER2 },
+  {     SQRT2INV,     SQRT2INV,     SQRT2INV,   SQRT5OVER2 },
+  {  -GOLDENINV2,          0.0,      GOLDEN2,   SQRT5OVER2 },
+  {   GOLDENINV2,          0.0,      GOLDEN2,   SQRT5OVER2 },
+  { -GOLDENINV22,          0.0,    -SQRT2INV,     GOLDEN22 },
+  {  GOLDENINV22,          0.0,    -SQRT2INV,     GOLDEN22 },
+  {  -GOLDENINV2,  -GOLDENINV2,  -GOLDENINV2,     GOLDEN22 },
+  {   GOLDENINV2,  -GOLDENINV2,  -GOLDENINV2,     GOLDEN22 },
+  {  -GOLDENINV2,   GOLDENINV2,  -GOLDENINV2,     GOLDEN22 },
+  {   GOLDENINV2,   GOLDENINV2,  -GOLDENINV2,     GOLDEN22 },
+  {          0.0,    -SQRT2INV, -GOLDENINV22,     GOLDEN22 },
+  {          0.0,     SQRT2INV, -GOLDENINV22,     GOLDEN22 },
+  {    -SQRT2INV, -GOLDENINV22,          0.0,     GOLDEN22 },
+  {     SQRT2INV, -GOLDENINV22,          0.0,     GOLDEN22 },
+  {    -SQRT2INV,  GOLDENINV22,          0.0,     GOLDEN22 },
+  {     SQRT2INV,  GOLDENINV22,          0.0,     GOLDEN22 },
+  {          0.0,    -SQRT2INV,  GOLDENINV22,     GOLDEN22 },
+  {          0.0,     SQRT2INV,  GOLDENINV22,     GOLDEN22 },
+  {  -GOLDENINV2,  -GOLDENINV2,   GOLDENINV2,     GOLDEN22 },
+  {   GOLDENINV2,  -GOLDENINV2,   GOLDENINV2,     GOLDEN22 },
+  {  -GOLDENINV2,   GOLDENINV2,   GOLDENINV2,     GOLDEN22 },
+  {   GOLDENINV2,   GOLDENINV2,   GOLDENINV2,     GOLDEN22 },
+  { -GOLDENINV22,          0.0,     SQRT2INV,     GOLDEN22 },
+  {  GOLDENINV22,          0.0,     SQRT2INV,     GOLDEN22 }
+};
+
+static int edge_120[NUM_EDGE_120][2] = {
+  {   0,   1 }, {   0,   2 }, {   0,   4 }, {   0,  20 }, {   1,   3 },
+  {   1,   5 }, {   1,  21 }, {   2,   6 }, {   2,   8 }, {   2,  22 },
+  {   3,   6 }, {   3,   9 }, {   3,  23 }, {   4,   7 }, {   4,  10 },
+  {   4,  24 }, {   5,   7 }, {   5,  11 }, {   5,  25 }, {   6,  12 },
+  {   6,  26 }, {   7,  13 }, {   7,  27 }, {   8,  10 }, {   8,  14 },
+  {   8,  28 }, {   9,  11 }, {   9,  15 }, {   9,  29 }, {  10,  16 },
+  {  10,  30 }, {  11,  17 }, {  11,  31 }, {  12,  14 }, {  12,  15 },
+  {  12,  32 }, {  13,  16 }, {  13,  17 }, {  13,  33 }, {  14,  18 },
+  {  14,  34 }, {  15,  19 }, {  15,  35 }, {  16,  18 }, {  16,  36 },
+  {  17,  19 }, {  17,  37 }, {  18,  19 }, {  18,  38 }, {  19,  39 },
+  {  20,  40 }, {  20,  41 }, {  20,  43 }, {  21,  40 }, {  21,  42 },
+  {  21,  44 }, {  22,  41 }, {  22,  45 }, {  22,  49 }, {  23,  42 },
+  {  23,  46 }, {  23,  50 }, {  24,  43 }, {  24,  47 }, {  24,  51 },
+  {  25,  44 }, {  25,  48 }, {  25,  52 }, {  26,  45 }, {  26,  46 },
+  {  26,  53 }, {  27,  47 }, {  27,  48 }, {  27,  56 }, {  28,  49 },
+  {  28,  54 }, {  28,  57 }, {  29,  50 }, {  29,  55 }, {  29,  58 },
+  {  30,  51 }, {  30,  54 }, {  30,  59 }, {  31,  52 }, {  31,  55 },
+  {  31,  60 }, {  32,  53 }, {  32,  61 }, {  32,  62 }, {  33,  56 },
+  {  33,  63 }, {  33,  64 }, {  34,  57 }, {  34,  61 }, {  34,  65 },
+  {  35,  58 }, {  35,  62 }, {  35,  66 }, {  36,  59 }, {  36,  63 },
+  {  36,  67 }, {  37,  60 }, {  37,  64 }, {  37,  68 }, {  38,  65 },
+  {  38,  67 }, {  38,  69 }, {  39,  66 }, {  39,  68 }, {  39,  69 },
+  {  40,  70 }, {  40,  71 }, {  41,  72 }, {  41,  78 }, {  42,  73 },
+  {  42,  79 }, {  43,  74 }, {  43,  80 }, {  44,  75 }, {  44,  81 },
+  {  45,  76 }, {  45,  88 }, {  46,  77 }, {  46,  89 }, {  47,  82 },
+  {  47,  92 }, {  48,  83 }, {  48,  93 }, {  49,  84 }, {  49,  94 },
+  {  50,  85 }, {  50,  95 }, {  51,  86 }, {  51,  96 }, {  52,  87 },
+  {  52,  97 }, {  53,  98 }, {  53,  99 }, {  54,  90 }, {  54, 108 },
+  {  55,  91 }, {  55, 109 }, {  56, 100 }, {  56, 101 }, {  57, 102 },
+  {  57, 112 }, {  58, 103 }, {  58, 113 }, {  59, 104 }, {  59, 114 },
+  {  60, 105 }, {  60, 115 }, {  61, 106 }, {  61, 116 }, {  62, 107 },
+  {  62, 117 }, {  63, 110 }, {  63, 122 }, {  64, 111 }, {  64, 123 },
+  {  65, 118 }, {  65, 124 }, {  66, 119 }, {  66, 125 }, {  67, 120 },
+  {  67, 126 }, {  68, 121 }, {  68, 127 }, {  69, 128 }, {  69, 129 },
+  {  70,  72 }, {  70,  73 }, {  70, 130 }, {  71,  74 }, {  71,  75 },
+  {  71, 131 }, {  72,  76 }, {  72, 132 }, {  73,  77 }, {  73, 133 },
+  {  74,  82 }, {  74, 134 }, {  75,  83 }, {  75, 135 }, {  76,  77 },
+  {  76, 140 }, {  77, 141 }, {  78,  80 }, {  78,  84 }, {  78, 136 },
+  {  79,  81 }, {  79,  85 }, {  79, 137 }, {  80,  86 }, {  80, 138 },
+  {  81,  87 }, {  81, 139 }, {  82,  83 }, {  82, 142 }, {  83, 143 },
+  {  84,  90 }, {  84, 146 }, {  85,  91 }, {  85, 147 }, {  86,  90 },
+  {  86, 148 }, {  87,  91 }, {  87, 149 }, {  88,  94 }, {  88,  98 },
+  {  88, 144 }, {  89,  95 }, {  89,  99 }, {  89, 145 }, {  90, 156 },
+  {  91, 157 }, {  92,  96 }, {  92, 100 }, {  92, 150 }, {  93,  97 },
+  {  93, 101 }, {  93, 151 }, {  94, 102 }, {  94, 152 }, {  95, 103 },
+  {  95, 153 }, {  96, 104 }, {  96, 154 }, {  97, 105 }, {  97, 155 },
+  {  98, 106 }, {  98, 158 }, {  99, 107 }, {  99, 159 }, { 100, 110 },
+  { 100, 160 }, { 101, 111 }, { 101, 161 }, { 102, 106 }, { 102, 164 },
+  { 103, 107 }, { 103, 165 }, { 104, 110 }, { 104, 166 }, { 105, 111 },
+  { 105, 167 }, { 106, 168 }, { 107, 169 }, { 108, 112 }, { 108, 114 },
+  { 108, 162 }, { 109, 113 }, { 109, 115 }, { 109, 163 }, { 110, 174 },
+  { 111, 175 }, { 112, 118 }, { 112, 170 }, { 113, 119 }, { 113, 171 },
+  { 114, 120 }, { 114, 172 }, { 115, 121 }, { 115, 173 }, { 116, 117 },
+  { 116, 124 }, { 116, 176 }, { 117, 125 }, { 117, 177 }, { 118, 120 },
+  { 118, 180 }, { 119, 121 }, { 119, 181 }, { 120, 182 }, { 121, 183 },
+  { 122, 123 }, { 122, 126 }, { 122, 178 }, { 123, 127 }, { 123, 179 },
+  { 124, 128 }, { 124, 184 }, { 125, 128 }, { 125, 185 }, { 126, 129 },
+  { 126, 186 }, { 127, 129 }, { 127, 187 }, { 128, 188 }, { 129, 189 },
+  { 130, 131 }, { 130, 190 }, { 130, 191 }, { 131, 192 }, { 131, 193 },
+  { 132, 136 }, { 132, 190 }, { 132, 196 }, { 133, 137 }, { 133, 191 },
+  { 133, 197 }, { 134, 138 }, { 134, 192 }, { 134, 198 }, { 135, 139 },
+  { 135, 193 }, { 135, 199 }, { 136, 194 }, { 136, 201 }, { 137, 195 },
+  { 137, 202 }, { 138, 194 }, { 138, 203 }, { 139, 195 }, { 139, 204 },
+  { 140, 144 }, { 140, 196 }, { 140, 200 }, { 141, 145 }, { 141, 197 },
+  { 141, 200 }, { 142, 150 }, { 142, 198 }, { 142, 205 }, { 143, 151 },
+  { 143, 199 }, { 143, 205 }, { 144, 206 }, { 144, 210 }, { 145, 207 },
+  { 145, 211 }, { 146, 152 }, { 146, 201 }, { 146, 212 }, { 147, 153 },
+  { 147, 202 }, { 147, 213 }, { 148, 154 }, { 148, 203 }, { 148, 214 },
+  { 149, 155 }, { 149, 204 }, { 149, 215 }, { 150, 208 }, { 150, 216 },
+  { 151, 209 }, { 151, 217 }, { 152, 206 }, { 152, 218 }, { 153, 207 },
+  { 153, 219 }, { 154, 208 }, { 154, 220 }, { 155, 209 }, { 155, 221 },
+  { 156, 162 }, { 156, 212 }, { 156, 214 }, { 157, 163 }, { 157, 213 },
+  { 157, 215 }, { 158, 159 }, { 158, 210 }, { 158, 222 }, { 159, 211 },
+  { 159, 223 }, { 160, 161 }, { 160, 216 }, { 160, 228 }, { 161, 217 },
+  { 161, 229 }, { 162, 224 }, { 162, 226 }, { 163, 225 }, { 163, 227 },
+  { 164, 170 }, { 164, 218 }, { 164, 230 }, { 165, 171 }, { 165, 219 },
+  { 165, 231 }, { 166, 172 }, { 166, 220 }, { 166, 232 }, { 167, 173 },
+  { 167, 221 }, { 167, 233 }, { 168, 176 }, { 168, 222 }, { 168, 230 },
+  { 169, 177 }, { 169, 223 }, { 169, 231 }, { 170, 224 }, { 170, 235 },
+  { 171, 225 }, { 171, 236 }, { 172, 226 }, { 172, 237 }, { 173, 227 },
+  { 173, 238 }, { 174, 178 }, { 174, 228 }, { 174, 232 }, { 175, 179 },
+  { 175, 229 }, { 175, 233 }, { 176, 234 }, { 176, 240 }, { 177, 234 },
+  { 177, 241 }, { 178, 239 }, { 178, 242 }, { 179, 239 }, { 179, 243 },
+  { 180, 184 }, { 180, 235 }, { 180, 244 }, { 181, 185 }, { 181, 236 },
+  { 181, 245 }, { 182, 186 }, { 182, 237 }, { 182, 244 }, { 183, 187 },
+  { 183, 238 }, { 183, 245 }, { 184, 240 }, { 184, 246 }, { 185, 241 },
+  { 185, 247 }, { 186, 242 }, { 186, 248 }, { 187, 243 }, { 187, 249 },
+  { 188, 189 }, { 188, 246 }, { 188, 247 }, { 189, 248 }, { 189, 249 },
+  { 190, 250 }, { 190, 270 }, { 191, 251 }, { 191, 271 }, { 192, 250 },
+  { 192, 272 }, { 193, 251 }, { 193, 273 }, { 194, 250 }, { 194, 279 },
+  { 195, 251 }, { 195, 280 }, { 196, 252 }, { 196, 274 }, { 197, 253 },
+  { 197, 275 }, { 198, 254 }, { 198, 276 }, { 199, 255 }, { 199, 277 },
+  { 200, 256 }, { 200, 278 }, { 201, 252 }, { 201, 282 }, { 202, 253 },
+  { 202, 283 }, { 203, 254 }, { 203, 284 }, { 204, 255 }, { 204, 285 },
+  { 205, 257 }, { 205, 281 }, { 206, 252 }, { 206, 290 }, { 207, 253 },
+  { 207, 291 }, { 208, 254 }, { 208, 292 }, { 209, 255 }, { 209, 293 },
+  { 210, 256 }, { 210, 294 }, { 211, 256 }, { 211, 295 }, { 212, 258 },
+  { 212, 286 }, { 213, 259 }, { 213, 287 }, { 214, 260 }, { 214, 288 },
+  { 215, 261 }, { 215, 289 }, { 216, 257 }, { 216, 296 }, { 217, 257 },
+  { 217, 297 }, { 218, 258 }, { 218, 298 }, { 219, 259 }, { 219, 299 },
+  { 220, 260 }, { 220, 300 }, { 221, 261 }, { 221, 301 }, { 222, 262 },
+  { 222, 302 }, { 223, 262 }, { 223, 303 }, { 224, 258 }, { 224, 310 },
+  { 225, 259 }, { 225, 311 }, { 226, 260 }, { 226, 312 }, { 227, 261 },
+  { 227, 313 }, { 228, 263 }, { 228, 304 }, { 229, 263 }, { 229, 305 },
+  { 230, 264 }, { 230, 306 }, { 231, 265 }, { 231, 307 }, { 232, 266 },
+  { 232, 308 }, { 233, 267 }, { 233, 309 }, { 234, 262 }, { 234, 318 },
+  { 235, 264 }, { 235, 314 }, { 236, 265 }, { 236, 315 }, { 237, 266 },
+  { 237, 316 }, { 238, 267 }, { 238, 317 }, { 239, 263 }, { 239, 321 },
+  { 240, 264 }, { 240, 322 }, { 241, 265 }, { 241, 323 }, { 242, 266 },
+  { 242, 324 }, { 243, 267 }, { 243, 325 }, { 244, 268 }, { 244, 319 },
+  { 245, 269 }, { 245, 320 }, { 246, 268 }, { 246, 326 }, { 247, 269 },
+  { 247, 327 }, { 248, 268 }, { 248, 328 }, { 249, 269 }, { 249, 329 },
+  { 250, 330 }, { 251, 331 }, { 252, 332 }, { 253, 333 }, { 254, 334 },
+  { 255, 335 }, { 256, 336 }, { 257, 337 }, { 258, 338 }, { 259, 339 },
+  { 260, 340 }, { 261, 341 }, { 262, 342 }, { 263, 343 }, { 264, 344 },
+  { 265, 345 }, { 266, 346 }, { 267, 347 }, { 268, 348 }, { 269, 349 },
+  { 270, 271 }, { 270, 274 }, { 270, 350 }, { 271, 275 }, { 271, 351 },
+  { 272, 273 }, { 272, 276 }, { 272, 352 }, { 273, 277 }, { 273, 353 },
+  { 274, 278 }, { 274, 356 }, { 275, 278 }, { 275, 357 }, { 276, 281 },
+  { 276, 358 }, { 277, 281 }, { 277, 359 }, { 278, 360 }, { 279, 282 },
+  { 279, 284 }, { 279, 354 }, { 280, 283 }, { 280, 285 }, { 280, 355 },
+  { 281, 365 }, { 282, 286 }, { 282, 361 }, { 283, 287 }, { 283, 362 },
+  { 284, 288 }, { 284, 363 }, { 285, 289 }, { 285, 364 }, { 286, 288 },
+  { 286, 372 }, { 287, 289 }, { 287, 373 }, { 288, 374 }, { 289, 375 },
+  { 290, 294 }, { 290, 298 }, { 290, 366 }, { 291, 295 }, { 291, 299 },
+  { 291, 367 }, { 292, 296 }, { 292, 300 }, { 292, 368 }, { 293, 297 },
+  { 293, 301 }, { 293, 369 }, { 294, 302 }, { 294, 370 }, { 295, 303 },
+  { 295, 371 }, { 296, 304 }, { 296, 376 }, { 297, 305 }, { 297, 377 },
+  { 298, 306 }, { 298, 378 }, { 299, 307 }, { 299, 379 }, { 300, 308 },
+  { 300, 380 }, { 301, 309 }, { 301, 381 }, { 302, 306 }, { 302, 382 },
+  { 303, 307 }, { 303, 383 }, { 304, 308 }, { 304, 388 }, { 305, 309 },
+  { 305, 389 }, { 306, 390 }, { 307, 391 }, { 308, 392 }, { 309, 393 },
+  { 310, 312 }, { 310, 314 }, { 310, 384 }, { 311, 313 }, { 311, 315 },
+  { 311, 385 }, { 312, 316 }, { 312, 386 }, { 313, 317 }, { 313, 387 },
+  { 314, 319 }, { 314, 395 }, { 315, 320 }, { 315, 396 }, { 316, 319 },
+  { 316, 397 }, { 317, 320 }, { 317, 398 }, { 318, 322 }, { 318, 323 },
+  { 318, 394 }, { 319, 404 }, { 320, 405 }, { 321, 324 }, { 321, 325 },
+  { 321, 399 }, { 322, 326 }, { 322, 400 }, { 323, 327 }, { 323, 401 },
+  { 324, 328 }, { 324, 402 }, { 325, 329 }, { 325, 403 }, { 326, 327 },
+  { 326, 406 }, { 327, 407 }, { 328, 329 }, { 328, 408 }, { 329, 409 },
+  { 330, 350 }, { 330, 352 }, { 330, 354 }, { 331, 351 }, { 331, 353 },
+  { 331, 355 }, { 332, 356 }, { 332, 361 }, { 332, 366 }, { 333, 357 },
+  { 333, 362 }, { 333, 367 }, { 334, 358 }, { 334, 363 }, { 334, 368 },
+  { 335, 359 }, { 335, 364 }, { 335, 369 }, { 336, 360 }, { 336, 370 },
+  { 336, 371 }, { 337, 365 }, { 337, 376 }, { 337, 377 }, { 338, 372 },
+  { 338, 378 }, { 338, 384 }, { 339, 373 }, { 339, 379 }, { 339, 385 },
+  { 340, 374 }, { 340, 380 }, { 340, 386 }, { 341, 375 }, { 341, 381 },
+  { 341, 387 }, { 342, 382 }, { 342, 383 }, { 342, 394 }, { 343, 388 },
+  { 343, 389 }, { 343, 399 }, { 344, 390 }, { 344, 395 }, { 344, 400 },
+  { 345, 391 }, { 345, 396 }, { 345, 401 }, { 346, 392 }, { 346, 397 },
+  { 346, 402 }, { 347, 393 }, { 347, 398 }, { 347, 403 }, { 348, 404 },
+  { 348, 406 }, { 348, 408 }, { 349, 405 }, { 349, 407 }, { 349, 409 },
+  { 350, 410 }, { 350, 412 }, { 351, 410 }, { 351, 413 }, { 352, 411 },
+  { 352, 414 }, { 353, 411 }, { 353, 415 }, { 354, 416 }, { 354, 418 },
+  { 355, 417 }, { 355, 419 }, { 356, 412 }, { 356, 420 }, { 357, 413 },
+  { 357, 421 }, { 358, 414 }, { 358, 422 }, { 359, 415 }, { 359, 423 },
+  { 360, 420 }, { 360, 421 }, { 361, 416 }, { 361, 426 }, { 362, 417 },
+  { 362, 427 }, { 363, 418 }, { 363, 428 }, { 364, 419 }, { 364, 429 },
+  { 365, 422 }, { 365, 423 }, { 366, 424 }, { 366, 432 }, { 367, 425 },
+  { 367, 433 }, { 368, 430 }, { 368, 434 }, { 369, 431 }, { 369, 435 },
+  { 370, 424 }, { 370, 438 }, { 371, 425 }, { 371, 439 }, { 372, 426 },
+  { 372, 436 }, { 373, 427 }, { 373, 437 }, { 374, 428 }, { 374, 436 },
+  { 375, 429 }, { 375, 437 }, { 376, 430 }, { 376, 440 }, { 377, 431 },
+  { 377, 441 }, { 378, 432 }, { 378, 444 }, { 379, 433 }, { 379, 445 },
+  { 380, 434 }, { 380, 446 }, { 381, 435 }, { 381, 447 }, { 382, 438 },
+  { 382, 448 }, { 383, 439 }, { 383, 449 }, { 384, 442 }, { 384, 450 },
+  { 385, 443 }, { 385, 451 }, { 386, 442 }, { 386, 452 }, { 387, 443 },
+  { 387, 453 }, { 388, 440 }, { 388, 454 }, { 389, 441 }, { 389, 455 },
+  { 390, 444 }, { 390, 448 }, { 391, 445 }, { 391, 449 }, { 392, 446 },
+  { 392, 454 }, { 393, 447 }, { 393, 455 }, { 394, 456 }, { 394, 457 },
+  { 395, 450 }, { 395, 460 }, { 396, 451 }, { 396, 461 }, { 397, 452 },
+  { 397, 462 }, { 398, 453 }, { 398, 463 }, { 399, 458 }, { 399, 459 },
+  { 400, 456 }, { 400, 464 }, { 401, 457 }, { 401, 465 }, { 402, 458 },
+  { 402, 466 }, { 403, 459 }, { 403, 467 }, { 404, 460 }, { 404, 462 },
+  { 405, 461 }, { 405, 463 }, { 406, 464 }, { 406, 468 }, { 407, 465 },
+  { 407, 468 }, { 408, 466 }, { 408, 469 }, { 409, 467 }, { 409, 469 },
+  { 410, 411 }, { 410, 470 }, { 411, 471 }, { 412, 416 }, { 412, 472 },
+  { 413, 417 }, { 413, 473 }, { 414, 418 }, { 414, 474 }, { 415, 419 },
+  { 415, 475 }, { 416, 478 }, { 417, 479 }, { 418, 480 }, { 419, 481 },
+  { 420, 424 }, { 420, 476 }, { 421, 425 }, { 421, 477 }, { 422, 430 },
+  { 422, 482 }, { 423, 431 }, { 423, 483 }, { 424, 488 }, { 425, 489 },
+  { 426, 432 }, { 426, 484 }, { 427, 433 }, { 427, 485 }, { 428, 434 },
+  { 428, 486 }, { 429, 435 }, { 429, 487 }, { 430, 492 }, { 431, 493 },
+  { 432, 494 }, { 433, 495 }, { 434, 496 }, { 435, 497 }, { 436, 442 },
+  { 436, 490 }, { 437, 443 }, { 437, 491 }, { 438, 439 }, { 438, 498 },
+  { 439, 499 }, { 440, 441 }, { 440, 500 }, { 441, 501 }, { 442, 508 },
+  { 443, 509 }, { 444, 450 }, { 444, 502 }, { 445, 451 }, { 445, 503 },
+  { 446, 452 }, { 446, 504 }, { 447, 453 }, { 447, 505 }, { 448, 456 },
+  { 448, 506 }, { 449, 457 }, { 449, 507 }, { 450, 512 }, { 451, 513 },
+  { 452, 514 }, { 453, 515 }, { 454, 458 }, { 454, 510 }, { 455, 459 },
+  { 455, 511 }, { 456, 516 }, { 457, 517 }, { 458, 522 }, { 459, 523 },
+  { 460, 464 }, { 460, 518 }, { 461, 465 }, { 461, 519 }, { 462, 466 },
+  { 462, 520 }, { 463, 467 }, { 463, 521 }, { 464, 524 }, { 465, 525 },
+  { 466, 526 }, { 467, 527 }, { 468, 469 }, { 468, 528 }, { 469, 529 },
+  { 470, 472 }, { 470, 473 }, { 470, 530 }, { 471, 474 }, { 471, 475 },
+  { 471, 530 }, { 472, 476 }, { 472, 531 }, { 473, 477 }, { 473, 532 },
+  { 474, 482 }, { 474, 533 }, { 475, 483 }, { 475, 534 }, { 476, 477 },
+  { 476, 535 }, { 477, 536 }, { 478, 480 }, { 478, 484 }, { 478, 531 },
+  { 479, 481 }, { 479, 485 }, { 479, 532 }, { 480, 486 }, { 480, 533 },
+  { 481, 487 }, { 481, 534 }, { 482, 483 }, { 482, 537 }, { 483, 538 },
+  { 484, 490 }, { 484, 539 }, { 485, 491 }, { 485, 540 }, { 486, 490 },
+  { 486, 541 }, { 487, 491 }, { 487, 542 }, { 488, 494 }, { 488, 498 },
+  { 488, 535 }, { 489, 495 }, { 489, 499 }, { 489, 536 }, { 490, 544 },
+  { 491, 545 }, { 492, 496 }, { 492, 500 }, { 492, 537 }, { 493, 497 },
+  { 493, 501 }, { 493, 538 }, { 494, 502 }, { 494, 539 }, { 495, 503 },
+  { 495, 540 }, { 496, 504 }, { 496, 541 }, { 497, 505 }, { 497, 542 },
+  { 498, 506 }, { 498, 543 }, { 499, 507 }, { 499, 543 }, { 500, 510 },
+  { 500, 546 }, { 501, 511 }, { 501, 546 }, { 502, 506 }, { 502, 547 },
+  { 503, 507 }, { 503, 548 }, { 504, 510 }, { 504, 549 }, { 505, 511 },
+  { 505, 550 }, { 506, 551 }, { 507, 552 }, { 508, 512 }, { 508, 514 },
+  { 508, 544 }, { 509, 513 }, { 509, 515 }, { 509, 545 }, { 510, 553 },
+  { 511, 554 }, { 512, 518 }, { 512, 547 }, { 513, 519 }, { 513, 548 },
+  { 514, 520 }, { 514, 549 }, { 515, 521 }, { 515, 550 }, { 516, 517 },
+  { 516, 524 }, { 516, 551 }, { 517, 525 }, { 517, 552 }, { 518, 520 },
+  { 518, 555 }, { 519, 521 }, { 519, 556 }, { 520, 557 }, { 521, 558 },
+  { 522, 523 }, { 522, 526 }, { 522, 553 }, { 523, 527 }, { 523, 554 },
+  { 524, 528 }, { 524, 555 }, { 525, 528 }, { 525, 556 }, { 526, 529 },
+  { 526, 557 }, { 527, 529 }, { 527, 558 }, { 528, 559 }, { 529, 559 },
+  { 530, 560 }, { 530, 561 }, { 531, 560 }, { 531, 562 }, { 532, 561 },
+  { 532, 563 }, { 533, 560 }, { 533, 564 }, { 534, 561 }, { 534, 565 },
+  { 535, 562 }, { 535, 566 }, { 536, 563 }, { 536, 566 }, { 537, 564 },
+  { 537, 567 }, { 538, 565 }, { 538, 567 }, { 539, 562 }, { 539, 568 },
+  { 540, 563 }, { 540, 569 }, { 541, 564 }, { 541, 570 }, { 542, 565 },
+  { 542, 571 }, { 543, 566 }, { 543, 572 }, { 544, 568 }, { 544, 570 },
+  { 545, 569 }, { 545, 571 }, { 546, 567 }, { 546, 573 }, { 547, 568 },
+  { 547, 574 }, { 548, 569 }, { 548, 575 }, { 549, 570 }, { 549, 576 },
+  { 550, 571 }, { 550, 577 }, { 551, 572 }, { 551, 574 }, { 552, 572 },
+  { 552, 575 }, { 553, 573 }, { 553, 576 }, { 554, 573 }, { 554, 577 },
+  { 555, 574 }, { 555, 578 }, { 556, 575 }, { 556, 579 }, { 557, 576 },
+  { 557, 578 }, { 558, 577 }, { 558, 579 }, { 559, 578 }, { 559, 579 },
+  { 560, 580 }, { 561, 581 }, { 562, 582 }, { 563, 583 }, { 564, 584 },
+  { 565, 585 }, { 566, 586 }, { 567, 587 }, { 568, 588 }, { 569, 589 },
+  { 570, 590 }, { 571, 591 }, { 572, 592 }, { 573, 593 }, { 574, 594 },
+  { 575, 595 }, { 576, 596 }, { 577, 597 }, { 578, 598 }, { 579, 599 },
+  { 580, 581 }, { 580, 582 }, { 580, 584 }, { 581, 583 }, { 581, 585 },
+  { 582, 586 }, { 582, 588 }, { 583, 586 }, { 583, 589 }, { 584, 587 },
+  { 584, 590 }, { 585, 587 }, { 585, 591 }, { 586, 592 }, { 587, 593 },
+  { 588, 590 }, { 588, 594 }, { 589, 591 }, { 589, 595 }, { 590, 596 },
+  { 591, 597 }, { 592, 594 }, { 592, 595 }, { 593, 596 }, { 593, 597 },
+  { 594, 598 }, { 595, 599 }, { 596, 598 }, { 597, 599 }, { 598, 599 }
+};
+
+static int face_120[NUM_FACE_120][VERT_PER_FACE_120] = {
+  {   0,   1,   3,   6,   2 }, {   0,   1,   5,   7,   4 },
+  {   0,   1,  21,  40,  20 }, {   0,   2,   8,  10,   4 },
+  {   0,   2,  22,  41,  20 }, {   0,   4,  24,  43,  20 },
+  {   1,   3,   9,  11,   5 }, {   1,   3,  23,  42,  21 },
+  {   1,   5,  25,  44,  21 }, {   2,   6,  12,  14,   8 },
+  {   2,   6,  26,  45,  22 }, {   2,   8,  28,  49,  22 },
+  {   3,   6,  12,  15,   9 }, {   3,   6,  26,  46,  23 },
+  {   3,   9,  29,  50,  23 }, {   4,   7,  13,  16,  10 },
+  {   4,   7,  27,  47,  24 }, {   4,  10,  30,  51,  24 },
+  {   5,   7,  13,  17,  11 }, {   5,   7,  27,  48,  25 },
+  {   5,  11,  31,  52,  25 }, {   6,  12,  32,  53,  26 },
+  {   7,  13,  33,  56,  27 }, {   8,  10,  16,  18,  14 },
+  {   8,  10,  30,  54,  28 }, {   8,  14,  34,  57,  28 },
+  {   9,  11,  17,  19,  15 }, {   9,  11,  31,  55,  29 },
+  {   9,  15,  35,  58,  29 }, {  10,  16,  36,  59,  30 },
+  {  11,  17,  37,  60,  31 }, {  12,  14,  18,  19,  15 },
+  {  12,  14,  34,  61,  32 }, {  12,  15,  35,  62,  32 },
+  {  13,  16,  18,  19,  17 }, {  13,  16,  36,  63,  33 },
+  {  13,  17,  37,  64,  33 }, {  14,  18,  38,  65,  34 },
+  {  15,  19,  39,  66,  35 }, {  16,  18,  38,  67,  36 },
+  {  17,  19,  39,  68,  37 }, {  18,  19,  39,  69,  38 },
+  {  20,  40,  70,  72,  41 }, {  20,  40,  71,  74,  43 },
+  {  20,  41,  78,  80,  43 }, {  21,  40,  70,  73,  42 },
+  {  21,  40,  71,  75,  44 }, {  21,  42,  79,  81,  44 },
+  {  22,  41,  72,  76,  45 }, {  22,  41,  78,  84,  49 },
+  {  22,  45,  88,  94,  49 }, {  23,  42,  73,  77,  46 },
+  {  23,  42,  79,  85,  50 }, {  23,  46,  89,  95,  50 },
+  {  24,  43,  74,  82,  47 }, {  24,  43,  80,  86,  51 },
+  {  24,  47,  92,  96,  51 }, {  25,  44,  75,  83,  48 },
+  {  25,  44,  81,  87,  52 }, {  25,  48,  93,  97,  52 },
+  {  26,  45,  76,  77,  46 }, {  26,  45,  88,  98,  53 },
+  {  26,  46,  89,  99,  53 }, {  27,  47,  82,  83,  48 },
+  {  27,  47,  92, 100,  56 }, {  27,  48,  93, 101,  56 },
+  {  28,  49,  84,  90,  54 }, {  28,  49,  94, 102,  57 },
+  {  28,  54, 108, 112,  57 }, {  29,  50,  85,  91,  55 },
+  {  29,  50,  95, 103,  58 }, {  29,  55, 109, 113,  58 },
+  {  30,  51,  86,  90,  54 }, {  30,  51,  96, 104,  59 },
+  {  30,  54, 108, 114,  59 }, {  31,  52,  87,  91,  55 },
+  {  31,  52,  97, 105,  60 }, {  31,  55, 109, 115,  60 },
+  {  32,  53,  98, 106,  61 }, {  32,  53,  99, 107,  62 },
+  {  32,  61, 116, 117,  62 }, {  33,  56, 100, 110,  63 },
+  {  33,  56, 101, 111,  64 }, {  33,  63, 122, 123,  64 },
+  {  34,  57, 102, 106,  61 }, {  34,  57, 112, 118,  65 },
+  {  34,  61, 116, 124,  65 }, {  35,  58, 103, 107,  62 },
+  {  35,  58, 113, 119,  66 }, {  35,  62, 117, 125,  66 },
+  {  36,  59, 104, 110,  63 }, {  36,  59, 114, 120,  67 },
+  {  36,  63, 122, 126,  67 }, {  37,  60, 105, 111,  64 },
+  {  37,  60, 115, 121,  68 }, {  37,  64, 123, 127,  68 },
+  {  38,  65, 118, 120,  67 }, {  38,  65, 124, 128,  69 },
+  {  38,  67, 126, 129,  69 }, {  39,  66, 119, 121,  68 },
+  {  39,  66, 125, 128,  69 }, {  39,  68, 127, 129,  69 },
+  {  40,  70, 130, 131,  71 }, {  41,  72, 132, 136,  78 },
+  {  42,  73, 133, 137,  79 }, {  43,  74, 134, 138,  80 },
+  {  44,  75, 135, 139,  81 }, {  45,  76, 140, 144,  88 },
+  {  46,  77, 141, 145,  89 }, {  47,  82, 142, 150,  92 },
+  {  48,  83, 143, 151,  93 }, {  49,  84, 146, 152,  94 },
+  {  50,  85, 147, 153,  95 }, {  51,  86, 148, 154,  96 },
+  {  52,  87, 149, 155,  97 }, {  53,  98, 158, 159,  99 },
+  {  54,  90, 156, 162, 108 }, {  55,  91, 157, 163, 109 },
+  {  56, 100, 160, 161, 101 }, {  57, 102, 164, 170, 112 },
+  {  58, 103, 165, 171, 113 }, {  59, 104, 166, 172, 114 },
+  {  60, 105, 167, 173, 115 }, {  61, 106, 168, 176, 116 },
+  {  62, 107, 169, 177, 117 }, {  63, 110, 174, 178, 122 },
+  {  64, 111, 175, 179, 123 }, {  65, 118, 180, 184, 124 },
+  {  66, 119, 181, 185, 125 }, {  67, 120, 182, 186, 126 },
+  {  68, 121, 183, 187, 127 }, {  69, 128, 188, 189, 129 },
+  {  70,  72,  76,  77,  73 }, {  70,  72, 132, 190, 130 },
+  {  70,  73, 133, 191, 130 }, {  71,  74,  82,  83,  75 },
+  {  71,  74, 134, 192, 131 }, {  71,  75, 135, 193, 131 },
+  {  72,  76, 140, 196, 132 }, {  73,  77, 141, 197, 133 },
+  {  74,  82, 142, 198, 134 }, {  75,  83, 143, 199, 135 },
+  {  76,  77, 141, 200, 140 }, {  78,  80,  86,  90,  84 },
+  {  78,  80, 138, 194, 136 }, {  78,  84, 146, 201, 136 },
+  {  79,  81,  87,  91,  85 }, {  79,  81, 139, 195, 137 },
+  {  79,  85, 147, 202, 137 }, {  80,  86, 148, 203, 138 },
+  {  81,  87, 149, 204, 139 }, {  82,  83, 143, 205, 142 },
+  {  84,  90, 156, 212, 146 }, {  85,  91, 157, 213, 147 },
+  {  86,  90, 156, 214, 148 }, {  87,  91, 157, 215, 149 },
+  {  88,  94, 102, 106,  98 }, {  88,  94, 152, 206, 144 },
+  {  88,  98, 158, 210, 144 }, {  89,  95, 103, 107,  99 },
+  {  89,  95, 153, 207, 145 }, {  89,  99, 159, 211, 145 },
+  {  92,  96, 104, 110, 100 }, {  92,  96, 154, 208, 150 },
+  {  92, 100, 160, 216, 150 }, {  93,  97, 105, 111, 101 },
+  {  93,  97, 155, 209, 151 }, {  93, 101, 161, 217, 151 },
+  {  94, 102, 164, 218, 152 }, {  95, 103, 165, 219, 153 },
+  {  96, 104, 166, 220, 154 }, {  97, 105, 167, 221, 155 },
+  {  98, 106, 168, 222, 158 }, {  99, 107, 169, 223, 159 },
+  { 100, 110, 174, 228, 160 }, { 101, 111, 175, 229, 161 },
+  { 102, 106, 168, 230, 164 }, { 103, 107, 169, 231, 165 },
+  { 104, 110, 174, 232, 166 }, { 105, 111, 175, 233, 167 },
+  { 108, 112, 118, 120, 114 }, { 108, 112, 170, 224, 162 },
+  { 108, 114, 172, 226, 162 }, { 109, 113, 119, 121, 115 },
+  { 109, 113, 171, 225, 163 }, { 109, 115, 173, 227, 163 },
+  { 112, 118, 180, 235, 170 }, { 113, 119, 181, 236, 171 },
+  { 114, 120, 182, 237, 172 }, { 115, 121, 183, 238, 173 },
+  { 116, 117, 125, 128, 124 }, { 116, 117, 177, 234, 176 },
+  { 116, 124, 184, 240, 176 }, { 117, 125, 185, 241, 177 },
+  { 118, 120, 182, 244, 180 }, { 119, 121, 183, 245, 181 },
+  { 122, 123, 127, 129, 126 }, { 122, 123, 179, 239, 178 },
+  { 122, 126, 186, 242, 178 }, { 123, 127, 187, 243, 179 },
+  { 124, 128, 188, 246, 184 }, { 125, 128, 188, 247, 185 },
+  { 126, 129, 189, 248, 186 }, { 127, 129, 189, 249, 187 },
+  { 130, 131, 192, 250, 190 }, { 130, 131, 193, 251, 191 },
+  { 130, 190, 270, 271, 191 }, { 131, 192, 272, 273, 193 },
+  { 132, 136, 194, 250, 190 }, { 132, 136, 201, 252, 196 },
+  { 132, 190, 270, 274, 196 }, { 133, 137, 195, 251, 191 },
+  { 133, 137, 202, 253, 197 }, { 133, 191, 271, 275, 197 },
+  { 134, 138, 194, 250, 192 }, { 134, 138, 203, 254, 198 },
+  { 134, 192, 272, 276, 198 }, { 135, 139, 195, 251, 193 },
+  { 135, 139, 204, 255, 199 }, { 135, 193, 273, 277, 199 },
+  { 136, 194, 279, 282, 201 }, { 137, 195, 280, 283, 202 },
+  { 138, 194, 279, 284, 203 }, { 139, 195, 280, 285, 204 },
+  { 140, 144, 206, 252, 196 }, { 140, 144, 210, 256, 200 },
+  { 140, 196, 274, 278, 200 }, { 141, 145, 207, 253, 197 },
+  { 141, 145, 211, 256, 200 }, { 141, 197, 275, 278, 200 },
+  { 142, 150, 208, 254, 198 }, { 142, 150, 216, 257, 205 },
+  { 142, 198, 276, 281, 205 }, { 143, 151, 209, 255, 199 },
+  { 143, 151, 217, 257, 205 }, { 143, 199, 277, 281, 205 },
+  { 144, 206, 290, 294, 210 }, { 145, 207, 291, 295, 211 },
+  { 146, 152, 206, 252, 201 }, { 146, 152, 218, 258, 212 },
+  { 146, 201, 282, 286, 212 }, { 147, 153, 207, 253, 202 },
+  { 147, 153, 219, 259, 213 }, { 147, 202, 283, 287, 213 },
+  { 148, 154, 208, 254, 203 }, { 148, 154, 220, 260, 214 },
+  { 148, 203, 284, 288, 214 }, { 149, 155, 209, 255, 204 },
+  { 149, 155, 221, 261, 215 }, { 149, 204, 285, 289, 215 },
+  { 150, 208, 292, 296, 216 }, { 151, 209, 293, 297, 217 },
+  { 152, 206, 290, 298, 218 }, { 153, 207, 291, 299, 219 },
+  { 154, 208, 292, 300, 220 }, { 155, 209, 293, 301, 221 },
+  { 156, 162, 224, 258, 212 }, { 156, 162, 226, 260, 214 },
+  { 156, 212, 286, 288, 214 }, { 157, 163, 225, 259, 213 },
+  { 157, 163, 227, 261, 215 }, { 157, 213, 287, 289, 215 },
+  { 158, 159, 211, 256, 210 }, { 158, 159, 223, 262, 222 },
+  { 158, 210, 294, 302, 222 }, { 159, 211, 295, 303, 223 },
+  { 160, 161, 217, 257, 216 }, { 160, 161, 229, 263, 228 },
+  { 160, 216, 296, 304, 228 }, { 161, 217, 297, 305, 229 },
+  { 162, 224, 310, 312, 226 }, { 163, 225, 311, 313, 227 },
+  { 164, 170, 224, 258, 218 }, { 164, 170, 235, 264, 230 },
+  { 164, 218, 298, 306, 230 }, { 165, 171, 225, 259, 219 },
+  { 165, 171, 236, 265, 231 }, { 165, 219, 299, 307, 231 },
+  { 166, 172, 226, 260, 220 }, { 166, 172, 237, 266, 232 },
+  { 166, 220, 300, 308, 232 }, { 167, 173, 227, 261, 221 },
+  { 167, 173, 238, 267, 233 }, { 167, 221, 301, 309, 233 },
+  { 168, 176, 234, 262, 222 }, { 168, 176, 240, 264, 230 },
+  { 168, 222, 302, 306, 230 }, { 169, 177, 234, 262, 223 },
+  { 169, 177, 241, 265, 231 }, { 169, 223, 303, 307, 231 },
+  { 170, 224, 310, 314, 235 }, { 171, 225, 311, 315, 236 },
+  { 172, 226, 312, 316, 237 }, { 173, 227, 313, 317, 238 },
+  { 174, 178, 239, 263, 228 }, { 174, 178, 242, 266, 232 },
+  { 174, 228, 304, 308, 232 }, { 175, 179, 239, 263, 229 },
+  { 175, 179, 243, 267, 233 }, { 175, 229, 305, 309, 233 },
+  { 176, 234, 318, 322, 240 }, { 177, 234, 318, 323, 241 },
+  { 178, 239, 321, 324, 242 }, { 179, 239, 321, 325, 243 },
+  { 180, 184, 240, 264, 235 }, { 180, 184, 246, 268, 244 },
+  { 180, 235, 314, 319, 244 }, { 181, 185, 241, 265, 236 },
+  { 181, 185, 247, 269, 245 }, { 181, 236, 315, 320, 245 },
+  { 182, 186, 242, 266, 237 }, { 182, 186, 248, 268, 244 },
+  { 182, 237, 316, 319, 244 }, { 183, 187, 243, 267, 238 },
+  { 183, 187, 249, 269, 245 }, { 183, 238, 317, 320, 245 },
+  { 184, 240, 322, 326, 246 }, { 185, 241, 323, 327, 247 },
+  { 186, 242, 324, 328, 248 }, { 187, 243, 325, 329, 249 },
+  { 188, 189, 248, 268, 246 }, { 188, 189, 249, 269, 247 },
+  { 188, 246, 326, 327, 247 }, { 189, 248, 328, 329, 249 },
+  { 190, 250, 330, 350, 270 }, { 191, 251, 331, 351, 271 },
+  { 192, 250, 330, 352, 272 }, { 193, 251, 331, 353, 273 },
+  { 194, 250, 330, 354, 279 }, { 195, 251, 331, 355, 280 },
+  { 196, 252, 332, 356, 274 }, { 197, 253, 333, 357, 275 },
+  { 198, 254, 334, 358, 276 }, { 199, 255, 335, 359, 277 },
+  { 200, 256, 336, 360, 278 }, { 201, 252, 332, 361, 282 },
+  { 202, 253, 333, 362, 283 }, { 203, 254, 334, 363, 284 },
+  { 204, 255, 335, 364, 285 }, { 205, 257, 337, 365, 281 },
+  { 206, 252, 332, 366, 290 }, { 207, 253, 333, 367, 291 },
+  { 208, 254, 334, 368, 292 }, { 209, 255, 335, 369, 293 },
+  { 210, 256, 336, 370, 294 }, { 211, 256, 336, 371, 295 },
+  { 212, 258, 338, 372, 286 }, { 213, 259, 339, 373, 287 },
+  { 214, 260, 340, 374, 288 }, { 215, 261, 341, 375, 289 },
+  { 216, 257, 337, 376, 296 }, { 217, 257, 337, 377, 297 },
+  { 218, 258, 338, 378, 298 }, { 219, 259, 339, 379, 299 },
+  { 220, 260, 340, 380, 300 }, { 221, 261, 341, 381, 301 },
+  { 222, 262, 342, 382, 302 }, { 223, 262, 342, 383, 303 },
+  { 224, 258, 338, 384, 310 }, { 225, 259, 339, 385, 311 },
+  { 226, 260, 340, 386, 312 }, { 227, 261, 341, 387, 313 },
+  { 228, 263, 343, 388, 304 }, { 229, 263, 343, 389, 305 },
+  { 230, 264, 344, 390, 306 }, { 231, 265, 345, 391, 307 },
+  { 232, 266, 346, 392, 308 }, { 233, 267, 347, 393, 309 },
+  { 234, 262, 342, 394, 318 }, { 235, 264, 344, 395, 314 },
+  { 236, 265, 345, 396, 315 }, { 237, 266, 346, 397, 316 },
+  { 238, 267, 347, 398, 317 }, { 239, 263, 343, 399, 321 },
+  { 240, 264, 344, 400, 322 }, { 241, 265, 345, 401, 323 },
+  { 242, 266, 346, 402, 324 }, { 243, 267, 347, 403, 325 },
+  { 244, 268, 348, 404, 319 }, { 245, 269, 349, 405, 320 },
+  { 246, 268, 348, 406, 326 }, { 247, 269, 349, 407, 327 },
+  { 248, 268, 348, 408, 328 }, { 249, 269, 349, 409, 329 },
+  { 270, 271, 275, 278, 274 }, { 270, 271, 351, 410, 350 },
+  { 270, 274, 356, 412, 350 }, { 271, 275, 357, 413, 351 },
+  { 272, 273, 277, 281, 276 }, { 272, 273, 353, 411, 352 },
+  { 272, 276, 358, 414, 352 }, { 273, 277, 359, 415, 353 },
+  { 274, 278, 360, 420, 356 }, { 275, 278, 360, 421, 357 },
+  { 276, 281, 365, 422, 358 }, { 277, 281, 365, 423, 359 },
+  { 279, 282, 286, 288, 284 }, { 279, 282, 361, 416, 354 },
+  { 279, 284, 363, 418, 354 }, { 280, 283, 287, 289, 285 },
+  { 280, 283, 362, 417, 355 }, { 280, 285, 364, 419, 355 },
+  { 282, 286, 372, 426, 361 }, { 283, 287, 373, 427, 362 },
+  { 284, 288, 374, 428, 363 }, { 285, 289, 375, 429, 364 },
+  { 286, 288, 374, 436, 372 }, { 287, 289, 375, 437, 373 },
+  { 290, 294, 302, 306, 298 }, { 290, 294, 370, 424, 366 },
+  { 290, 298, 378, 432, 366 }, { 291, 295, 303, 307, 299 },
+  { 291, 295, 371, 425, 367 }, { 291, 299, 379, 433, 367 },
+  { 292, 296, 304, 308, 300 }, { 292, 296, 376, 430, 368 },
+  { 292, 300, 380, 434, 368 }, { 293, 297, 305, 309, 301 },
+  { 293, 297, 377, 431, 369 }, { 293, 301, 381, 435, 369 },
+  { 294, 302, 382, 438, 370 }, { 295, 303, 383, 439, 371 },
+  { 296, 304, 388, 440, 376 }, { 297, 305, 389, 441, 377 },
+  { 298, 306, 390, 444, 378 }, { 299, 307, 391, 445, 379 },
+  { 300, 308, 392, 446, 380 }, { 301, 309, 393, 447, 381 },
+  { 302, 306, 390, 448, 382 }, { 303, 307, 391, 449, 383 },
+  { 304, 308, 392, 454, 388 }, { 305, 309, 393, 455, 389 },
+  { 310, 312, 316, 319, 314 }, { 310, 312, 386, 442, 384 },
+  { 310, 314, 395, 450, 384 }, { 311, 313, 317, 320, 315 },
+  { 311, 313, 387, 443, 385 }, { 311, 315, 396, 451, 385 },
+  { 312, 316, 397, 452, 386 }, { 313, 317, 398, 453, 387 },
+  { 314, 319, 404, 460, 395 }, { 315, 320, 405, 461, 396 },
+  { 316, 319, 404, 462, 397 }, { 317, 320, 405, 463, 398 },
+  { 318, 322, 326, 327, 323 }, { 318, 322, 400, 456, 394 },
+  { 318, 323, 401, 457, 394 }, { 321, 324, 328, 329, 325 },
+  { 321, 324, 402, 458, 399 }, { 321, 325, 403, 459, 399 },
+  { 322, 326, 406, 464, 400 }, { 323, 327, 407, 465, 401 },
+  { 324, 328, 408, 466, 402 }, { 325, 329, 409, 467, 403 },
+  { 326, 327, 407, 468, 406 }, { 328, 329, 409, 469, 408 },
+  { 330, 350, 410, 411, 352 }, { 330, 350, 412, 416, 354 },
+  { 330, 352, 414, 418, 354 }, { 331, 351, 410, 411, 353 },
+  { 331, 351, 413, 417, 355 }, { 331, 353, 415, 419, 355 },
+  { 332, 356, 412, 416, 361 }, { 332, 356, 420, 424, 366 },
+  { 332, 361, 426, 432, 366 }, { 333, 357, 413, 417, 362 },
+  { 333, 357, 421, 425, 367 }, { 333, 362, 427, 433, 367 },
+  { 334, 358, 414, 418, 363 }, { 334, 358, 422, 430, 368 },
+  { 334, 363, 428, 434, 368 }, { 335, 359, 415, 419, 364 },
+  { 335, 359, 423, 431, 369 }, { 335, 364, 429, 435, 369 },
+  { 336, 360, 420, 424, 370 }, { 336, 360, 421, 425, 371 },
+  { 336, 370, 438, 439, 371 }, { 337, 365, 422, 430, 376 },
+  { 337, 365, 423, 431, 377 }, { 337, 376, 440, 441, 377 },
+  { 338, 372, 426, 432, 378 }, { 338, 372, 436, 442, 384 },
+  { 338, 378, 444, 450, 384 }, { 339, 373, 427, 433, 379 },
+  { 339, 373, 437, 443, 385 }, { 339, 379, 445, 451, 385 },
+  { 340, 374, 428, 434, 380 }, { 340, 374, 436, 442, 386 },
+  { 340, 380, 446, 452, 386 }, { 341, 375, 429, 435, 381 },
+  { 341, 375, 437, 443, 387 }, { 341, 381, 447, 453, 387 },
+  { 342, 382, 438, 439, 383 }, { 342, 382, 448, 456, 394 },
+  { 342, 383, 449, 457, 394 }, { 343, 388, 440, 441, 389 },
+  { 343, 388, 454, 458, 399 }, { 343, 389, 455, 459, 399 },
+  { 344, 390, 444, 450, 395 }, { 344, 390, 448, 456, 400 },
+  { 344, 395, 460, 464, 400 }, { 345, 391, 445, 451, 396 },
+  { 345, 391, 449, 457, 401 }, { 345, 396, 461, 465, 401 },
+  { 346, 392, 446, 452, 397 }, { 346, 392, 454, 458, 402 },
+  { 346, 397, 462, 466, 402 }, { 347, 393, 447, 453, 398 },
+  { 347, 393, 455, 459, 403 }, { 347, 398, 463, 467, 403 },
+  { 348, 404, 460, 464, 406 }, { 348, 404, 462, 466, 408 },
+  { 348, 406, 468, 469, 408 }, { 349, 405, 461, 465, 407 },
+  { 349, 405, 463, 467, 409 }, { 349, 407, 468, 469, 409 },
+  { 350, 410, 470, 472, 412 }, { 351, 410, 470, 473, 413 },
+  { 352, 411, 471, 474, 414 }, { 353, 411, 471, 475, 415 },
+  { 354, 416, 478, 480, 418 }, { 355, 417, 479, 481, 419 },
+  { 356, 412, 472, 476, 420 }, { 357, 413, 473, 477, 421 },
+  { 358, 414, 474, 482, 422 }, { 359, 415, 475, 483, 423 },
+  { 360, 420, 476, 477, 421 }, { 361, 416, 478, 484, 426 },
+  { 362, 417, 479, 485, 427 }, { 363, 418, 480, 486, 428 },
+  { 364, 419, 481, 487, 429 }, { 365, 422, 482, 483, 423 },
+  { 366, 424, 488, 494, 432 }, { 367, 425, 489, 495, 433 },
+  { 368, 430, 492, 496, 434 }, { 369, 431, 493, 497, 435 },
+  { 370, 424, 488, 498, 438 }, { 371, 425, 489, 499, 439 },
+  { 372, 426, 484, 490, 436 }, { 373, 427, 485, 491, 437 },
+  { 374, 428, 486, 490, 436 }, { 375, 429, 487, 491, 437 },
+  { 376, 430, 492, 500, 440 }, { 377, 431, 493, 501, 441 },
+  { 378, 432, 494, 502, 444 }, { 379, 433, 495, 503, 445 },
+  { 380, 434, 496, 504, 446 }, { 381, 435, 497, 505, 447 },
+  { 382, 438, 498, 506, 448 }, { 383, 439, 499, 507, 449 },
+  { 384, 442, 508, 512, 450 }, { 385, 443, 509, 513, 451 },
+  { 386, 442, 508, 514, 452 }, { 387, 443, 509, 515, 453 },
+  { 388, 440, 500, 510, 454 }, { 389, 441, 501, 511, 455 },
+  { 390, 444, 502, 506, 448 }, { 391, 445, 503, 507, 449 },
+  { 392, 446, 504, 510, 454 }, { 393, 447, 505, 511, 455 },
+  { 394, 456, 516, 517, 457 }, { 395, 450, 512, 518, 460 },
+  { 396, 451, 513, 519, 461 }, { 397, 452, 514, 520, 462 },
+  { 398, 453, 515, 521, 463 }, { 399, 458, 522, 523, 459 },
+  { 400, 456, 516, 524, 464 }, { 401, 457, 517, 525, 465 },
+  { 402, 458, 522, 526, 466 }, { 403, 459, 523, 527, 467 },
+  { 404, 460, 518, 520, 462 }, { 405, 461, 519, 521, 463 },
+  { 406, 464, 524, 528, 468 }, { 407, 465, 525, 528, 468 },
+  { 408, 466, 526, 529, 469 }, { 409, 467, 527, 529, 469 },
+  { 410, 411, 471, 530, 470 }, { 412, 416, 478, 531, 472 },
+  { 413, 417, 479, 532, 473 }, { 414, 418, 480, 533, 474 },
+  { 415, 419, 481, 534, 475 }, { 420, 424, 488, 535, 476 },
+  { 421, 425, 489, 536, 477 }, { 422, 430, 492, 537, 482 },
+  { 423, 431, 493, 538, 483 }, { 426, 432, 494, 539, 484 },
+  { 427, 433, 495, 540, 485 }, { 428, 434, 496, 541, 486 },
+  { 429, 435, 497, 542, 487 }, { 436, 442, 508, 544, 490 },
+  { 437, 443, 509, 545, 491 }, { 438, 439, 499, 543, 498 },
+  { 440, 441, 501, 546, 500 }, { 444, 450, 512, 547, 502 },
+  { 445, 451, 513, 548, 503 }, { 446, 452, 514, 549, 504 },
+  { 447, 453, 515, 550, 505 }, { 448, 456, 516, 551, 506 },
+  { 449, 457, 517, 552, 507 }, { 454, 458, 522, 553, 510 },
+  { 455, 459, 523, 554, 511 }, { 460, 464, 524, 555, 518 },
+  { 461, 465, 525, 556, 519 }, { 462, 466, 526, 557, 520 },
+  { 463, 467, 527, 558, 521 }, { 468, 469, 529, 559, 528 },
+  { 470, 472, 476, 477, 473 }, { 470, 472, 531, 560, 530 },
+  { 470, 473, 532, 561, 530 }, { 471, 474, 482, 483, 475 },
+  { 471, 474, 533, 560, 530 }, { 471, 475, 534, 561, 530 },
+  { 472, 476, 535, 562, 531 }, { 473, 477, 536, 563, 532 },
+  { 474, 482, 537, 564, 533 }, { 475, 483, 538, 565, 534 },
+  { 476, 477, 536, 566, 535 }, { 478, 480, 486, 490, 484 },
+  { 478, 480, 533, 560, 531 }, { 478, 484, 539, 562, 531 },
+  { 479, 481, 487, 491, 485 }, { 479, 481, 534, 561, 532 },
+  { 479, 485, 540, 563, 532 }, { 480, 486, 541, 564, 533 },
+  { 481, 487, 542, 565, 534 }, { 482, 483, 538, 567, 537 },
+  { 484, 490, 544, 568, 539 }, { 485, 491, 545, 569, 540 },
+  { 486, 490, 544, 570, 541 }, { 487, 491, 545, 571, 542 },
+  { 488, 494, 502, 506, 498 }, { 488, 494, 539, 562, 535 },
+  { 488, 498, 543, 566, 535 }, { 489, 495, 503, 507, 499 },
+  { 489, 495, 540, 563, 536 }, { 489, 499, 543, 566, 536 },
+  { 492, 496, 504, 510, 500 }, { 492, 496, 541, 564, 537 },
+  { 492, 500, 546, 567, 537 }, { 493, 497, 505, 511, 501 },
+  { 493, 497, 542, 565, 538 }, { 493, 501, 546, 567, 538 },
+  { 494, 502, 547, 568, 539 }, { 495, 503, 548, 569, 540 },
+  { 496, 504, 549, 570, 541 }, { 497, 505, 550, 571, 542 },
+  { 498, 506, 551, 572, 543 }, { 499, 507, 552, 572, 543 },
+  { 500, 510, 553, 573, 546 }, { 501, 511, 554, 573, 546 },
+  { 502, 506, 551, 574, 547 }, { 503, 507, 552, 575, 548 },
+  { 504, 510, 553, 576, 549 }, { 505, 511, 554, 577, 550 },
+  { 508, 512, 518, 520, 514 }, { 508, 512, 547, 568, 544 },
+  { 508, 514, 549, 570, 544 }, { 509, 513, 519, 521, 515 },
+  { 509, 513, 548, 569, 545 }, { 509, 515, 550, 571, 545 },
+  { 512, 518, 555, 574, 547 }, { 513, 519, 556, 575, 548 },
+  { 514, 520, 557, 576, 549 }, { 515, 521, 558, 577, 550 },
+  { 516, 517, 525, 528, 524 }, { 516, 517, 552, 572, 551 },
+  { 516, 524, 555, 574, 551 }, { 517, 525, 556, 575, 552 },
+  { 518, 520, 557, 578, 555 }, { 519, 521, 558, 579, 556 },
+  { 522, 523, 527, 529, 526 }, { 522, 523, 554, 573, 553 },
+  { 522, 526, 557, 576, 553 }, { 523, 527, 558, 577, 554 },
+  { 524, 528, 559, 578, 555 }, { 525, 528, 559, 579, 556 },
+  { 526, 529, 559, 578, 557 }, { 527, 529, 559, 579, 558 },
+  { 530, 560, 580, 581, 561 }, { 531, 560, 580, 582, 562 },
+  { 532, 561, 581, 583, 563 }, { 533, 560, 580, 584, 564 },
+  { 534, 561, 581, 585, 565 }, { 535, 562, 582, 586, 566 },
+  { 536, 563, 583, 586, 566 }, { 537, 564, 584, 587, 567 },
+  { 538, 565, 585, 587, 567 }, { 539, 562, 582, 588, 568 },
+  { 540, 563, 583, 589, 569 }, { 541, 564, 584, 590, 570 },
+  { 542, 565, 585, 591, 571 }, { 543, 566, 586, 592, 572 },
+  { 544, 568, 588, 590, 570 }, { 545, 569, 589, 591, 571 },
+  { 546, 567, 587, 593, 573 }, { 547, 568, 588, 594, 574 },
+  { 548, 569, 589, 595, 575 }, { 549, 570, 590, 596, 576 },
+  { 550, 571, 591, 597, 577 }, { 551, 572, 592, 594, 574 },
+  { 552, 572, 592, 595, 575 }, { 553, 573, 593, 596, 576 },
+  { 554, 573, 593, 597, 577 }, { 555, 574, 594, 598, 578 },
+  { 556, 575, 595, 599, 579 }, { 557, 576, 596, 598, 578 },
+  { 558, 577, 597, 599, 579 }, { 559, 578, 598, 599, 579 },
+  { 580, 581, 583, 586, 582 }, { 580, 581, 585, 587, 584 },
+  { 580, 582, 588, 590, 584 }, { 581, 583, 589, 591, 585 },
+  { 582, 586, 592, 594, 588 }, { 583, 586, 592, 595, 589 },
+  { 584, 587, 593, 596, 590 }, { 585, 587, 593, 597, 591 },
+  { 588, 590, 596, 598, 594 }, { 589, 591, 597, 599, 595 },
+  { 592, 594, 598, 599, 595 }, { 593, 596, 598, 599, 597 }
+};
+
+static float edge_color_120[NUM_EDGE_120][4];
+static float face_color_120[NUM_FACE_120][4];
+static float face_color_trans_120[NUM_FACE_120][4];
+
+
+/* 600-cell {3,3,5} */
+#define NUM_VERT_600 120
+#define NUM_EDGE_600 720
+#define NUM_FACE_600 1200
+#define VERT_PER_FACE_600 3
+
+#define MIN_EDGE_DEPTH_600 (-GOLDEN/2.0-1)
+#define MAX_EDGE_DEPTH_600 (GOLDEN/2.0+1)
+#define MIN_FACE_DEPTH_600 ((-2*GOLDEN-2)/3.0)
+#define MAX_FACE_DEPTH_600 ((2*GOLDEN+2)/3.0)
+
+static float vert_600[NUM_VERT_600][4] = {
+  {        0.0,        0.0,        0.0,       -2.0 },
+  {        0.0, -GOLDENINV,       -1.0,    -GOLDEN },
+  {        0.0,  GOLDENINV,       -1.0,    -GOLDEN },
+  {       -1.0,        0.0, -GOLDENINV,    -GOLDEN },
+  {        1.0,        0.0, -GOLDENINV,    -GOLDEN },
+  { -GOLDENINV,       -1.0,        0.0,    -GOLDEN },
+  {  GOLDENINV,       -1.0,        0.0,    -GOLDEN },
+  { -GOLDENINV,        1.0,        0.0,    -GOLDEN },
+  {  GOLDENINV,        1.0,        0.0,    -GOLDEN },
+  {       -1.0,        0.0,  GOLDENINV,    -GOLDEN },
+  {        1.0,        0.0,  GOLDENINV,    -GOLDEN },
+  {        0.0, -GOLDENINV,        1.0,    -GOLDEN },
+  {        0.0,  GOLDENINV,        1.0,    -GOLDEN },
+  { -GOLDENINV,        0.0,    -GOLDEN,       -1.0 },
+  {  GOLDENINV,        0.0,    -GOLDEN,       -1.0 },
+  {       -1.0,       -1.0,       -1.0,       -1.0 },
+  {        1.0,       -1.0,       -1.0,       -1.0 },
+  {       -1.0,        1.0,       -1.0,       -1.0 },
+  {        1.0,        1.0,       -1.0,       -1.0 },
+  {        0.0,    -GOLDEN, -GOLDENINV,       -1.0 },
+  {        0.0,     GOLDEN, -GOLDENINV,       -1.0 },
+  {    -GOLDEN, -GOLDENINV,        0.0,       -1.0 },
+  {     GOLDEN, -GOLDENINV,        0.0,       -1.0 },
+  {    -GOLDEN,  GOLDENINV,        0.0,       -1.0 },
+  {     GOLDEN,  GOLDENINV,        0.0,       -1.0 },
+  {        0.0,    -GOLDEN,  GOLDENINV,       -1.0 },
+  {        0.0,     GOLDEN,  GOLDENINV,       -1.0 },
+  {       -1.0,       -1.0,        1.0,       -1.0 },
+  {        1.0,       -1.0,        1.0,       -1.0 },
+  {       -1.0,        1.0,        1.0,       -1.0 },
+  {        1.0,        1.0,        1.0,       -1.0 },
+  { -GOLDENINV,        0.0,     GOLDEN,       -1.0 },
+  {  GOLDENINV,        0.0,     GOLDEN,       -1.0 },
+  {        0.0,       -1.0,    -GOLDEN, -GOLDENINV },
+  {        0.0,        1.0,    -GOLDEN, -GOLDENINV },
+  {    -GOLDEN,        0.0,       -1.0, -GOLDENINV },
+  {     GOLDEN,        0.0,       -1.0, -GOLDENINV },
+  {       -1.0,    -GOLDEN,        0.0, -GOLDENINV },
+  {        1.0,    -GOLDEN,        0.0, -GOLDENINV },
+  {       -1.0,     GOLDEN,        0.0, -GOLDENINV },
+  {        1.0,     GOLDEN,        0.0, -GOLDENINV },
+  {    -GOLDEN,        0.0,        1.0, -GOLDENINV },
+  {     GOLDEN,        0.0,        1.0, -GOLDENINV },
+  {        0.0,       -1.0,     GOLDEN, -GOLDENINV },
+  {        0.0,        1.0,     GOLDEN, -GOLDENINV },
+  {        0.0,        0.0,       -2.0,        0.0 },
+  {       -1.0, -GOLDENINV,    -GOLDEN,        0.0 },
+  {        1.0, -GOLDENINV,    -GOLDEN,        0.0 },
+  {       -1.0,  GOLDENINV,    -GOLDEN,        0.0 },
+  {        1.0,  GOLDENINV,    -GOLDEN,        0.0 },
+  { -GOLDENINV,    -GOLDEN,       -1.0,        0.0 },
+  {  GOLDENINV,    -GOLDEN,       -1.0,        0.0 },
+  { -GOLDENINV,     GOLDEN,       -1.0,        0.0 },
+  {  GOLDENINV,     GOLDEN,       -1.0,        0.0 },
+  {    -GOLDEN,       -1.0, -GOLDENINV,        0.0 },
+  {     GOLDEN,       -1.0, -GOLDENINV,        0.0 },
+  {    -GOLDEN,        1.0, -GOLDENINV,        0.0 },
+  {     GOLDEN,        1.0, -GOLDENINV,        0.0 },
+  {        0.0,       -2.0,        0.0,        0.0 },
+  {       -2.0,        0.0,        0.0,        0.0 },
+  {        2.0,        0.0,        0.0,        0.0 },
+  {        0.0,        2.0,        0.0,        0.0 },
+  {    -GOLDEN,       -1.0,  GOLDENINV,        0.0 },
+  {     GOLDEN,       -1.0,  GOLDENINV,        0.0 },
+  {    -GOLDEN,        1.0,  GOLDENINV,        0.0 },
+  {     GOLDEN,        1.0,  GOLDENINV,        0.0 },
+  { -GOLDENINV,    -GOLDEN,        1.0,        0.0 },
+  {  GOLDENINV,    -GOLDEN,        1.0,        0.0 },
+  { -GOLDENINV,     GOLDEN,        1.0,        0.0 },
+  {  GOLDENINV,     GOLDEN,        1.0,        0.0 },
+  {       -1.0, -GOLDENINV,     GOLDEN,        0.0 },
+  {        1.0, -GOLDENINV,     GOLDEN,        0.0 },
+  {       -1.0,  GOLDENINV,     GOLDEN,        0.0 },
+  {        1.0,  GOLDENINV,     GOLDEN,        0.0 },
+  {        0.0,        0.0,        2.0,        0.0 },
+  {        0.0,       -1.0,    -GOLDEN,  GOLDENINV },
+  {        0.0,        1.0,    -GOLDEN,  GOLDENINV },
+  {    -GOLDEN,        0.0,       -1.0,  GOLDENINV },
+  {     GOLDEN,        0.0,       -1.0,  GOLDENINV },
+  {       -1.0,    -GOLDEN,        0.0,  GOLDENINV },
+  {        1.0,    -GOLDEN,        0.0,  GOLDENINV },
+  {       -1.0,     GOLDEN,        0.0,  GOLDENINV },
+  {        1.0,     GOLDEN,        0.0,  GOLDENINV },
+  {    -GOLDEN,        0.0,        1.0,  GOLDENINV },
+  {     GOLDEN,        0.0,        1.0,  GOLDENINV },
+  {        0.0,       -1.0,     GOLDEN,  GOLDENINV },
+  {        0.0,        1.0,     GOLDEN,  GOLDENINV },
+  { -GOLDENINV,        0.0,    -GOLDEN,        1.0 },
+  {  GOLDENINV,        0.0,    -GOLDEN,        1.0 },
+  {       -1.0,       -1.0,       -1.0,        1.0 },
+  {        1.0,       -1.0,       -1.0,        1.0 },
+  {       -1.0,        1.0,       -1.0,        1.0 },
+  {        1.0,        1.0,       -1.0,        1.0 },
+  {        0.0,    -GOLDEN, -GOLDENINV,        1.0 },
+  {        0.0,     GOLDEN, -GOLDENINV,        1.0 },
+  {    -GOLDEN, -GOLDENINV,        0.0,        1.0 },
+  {     GOLDEN, -GOLDENINV,        0.0,        1.0 },
+  {    -GOLDEN,  GOLDENINV,        0.0,        1.0 },
+  {     GOLDEN,  GOLDENINV,        0.0,        1.0 },
+  {        0.0,    -GOLDEN,  GOLDENINV,        1.0 },
+  {        0.0,     GOLDEN,  GOLDENINV,        1.0 },
+  {       -1.0,       -1.0,        1.0,        1.0 },
+  {        1.0,       -1.0,        1.0,        1.0 },
+  {       -1.0,        1.0,        1.0,        1.0 },
+  {        1.0,        1.0,        1.0,        1.0 },
+  { -GOLDENINV,        0.0,     GOLDEN,        1.0 },
+  {  GOLDENINV,        0.0,     GOLDEN,        1.0 },
+  {        0.0, -GOLDENINV,       -1.0,     GOLDEN },
+  {        0.0,  GOLDENINV,       -1.0,     GOLDEN },
+  {       -1.0,        0.0, -GOLDENINV,     GOLDEN },
+  {        1.0,        0.0, -GOLDENINV,     GOLDEN },
+  { -GOLDENINV,       -1.0,        0.0,     GOLDEN },
+  {  GOLDENINV,       -1.0,        0.0,     GOLDEN },
+  { -GOLDENINV,        1.0,        0.0,     GOLDEN },
+  {  GOLDENINV,        1.0,        0.0,     GOLDEN },
+  {       -1.0,        0.0,  GOLDENINV,     GOLDEN },
+  {        1.0,        0.0,  GOLDENINV,     GOLDEN },
+  {        0.0, -GOLDENINV,        1.0,     GOLDEN },
+  {        0.0,  GOLDENINV,        1.0,     GOLDEN },
+  {        0.0,        0.0,        0.0,        2.0 }
+};
+
+static int edge_600[NUM_EDGE_600][2] = {
+  {   0,   1 }, {   0,   2 }, {   0,   3 }, {   0,   4 }, {   0,   5 },
+  {   0,   6 }, {   0,   7 }, {   0,   8 }, {   0,   9 }, {   0,  10 },
+  {   0,  11 }, {   0,  12 }, {   1,   2 }, {   1,   3 }, {   1,   4 },
+  {   1,   5 }, {   1,   6 }, {   1,  13 }, {   1,  14 }, {   1,  15 },
+  {   1,  16 }, {   1,  19 }, {   1,  33 }, {   2,   3 }, {   2,   4 },
+  {   2,   7 }, {   2,   8 }, {   2,  13 }, {   2,  14 }, {   2,  17 },
+  {   2,  18 }, {   2,  20 }, {   2,  34 }, {   3,   5 }, {   3,   7 },
+  {   3,   9 }, {   3,  13 }, {   3,  15 }, {   3,  17 }, {   3,  21 },
+  {   3,  23 }, {   3,  35 }, {   4,   6 }, {   4,   8 }, {   4,  10 },
+  {   4,  14 }, {   4,  16 }, {   4,  18 }, {   4,  22 }, {   4,  24 },
+  {   4,  36 }, {   5,   6 }, {   5,   9 }, {   5,  11 }, {   5,  15 },
+  {   5,  19 }, {   5,  21 }, {   5,  25 }, {   5,  27 }, {   5,  37 },
+  {   6,  10 }, {   6,  11 }, {   6,  16 }, {   6,  19 }, {   6,  22 },
+  {   6,  25 }, {   6,  28 }, {   6,  38 }, {   7,   8 }, {   7,   9 },
+  {   7,  12 }, {   7,  17 }, {   7,  20 }, {   7,  23 }, {   7,  26 },
+  {   7,  29 }, {   7,  39 }, {   8,  10 }, {   8,  12 }, {   8,  18 },
+  {   8,  20 }, {   8,  24 }, {   8,  26 }, {   8,  30 }, {   8,  40 },
+  {   9,  11 }, {   9,  12 }, {   9,  21 }, {   9,  23 }, {   9,  27 },
+  {   9,  29 }, {   9,  31 }, {   9,  41 }, {  10,  11 }, {  10,  12 },
+  {  10,  22 }, {  10,  24 }, {  10,  28 }, {  10,  30 }, {  10,  32 },
+  {  10,  42 }, {  11,  12 }, {  11,  25 }, {  11,  27 }, {  11,  28 },
+  {  11,  31 }, {  11,  32 }, {  11,  43 }, {  12,  26 }, {  12,  29 },
+  {  12,  30 }, {  12,  31 }, {  12,  32 }, {  12,  44 }, {  13,  14 },
+  {  13,  15 }, {  13,  17 }, {  13,  33 }, {  13,  34 }, {  13,  35 },
+  {  13,  45 }, {  13,  46 }, {  13,  48 }, {  14,  16 }, {  14,  18 },
+  {  14,  33 }, {  14,  34 }, {  14,  36 }, {  14,  45 }, {  14,  47 },
+  {  14,  49 }, {  15,  19 }, {  15,  21 }, {  15,  33 }, {  15,  35 },
+  {  15,  37 }, {  15,  46 }, {  15,  50 }, {  15,  54 }, {  16,  19 },
+  {  16,  22 }, {  16,  33 }, {  16,  36 }, {  16,  38 }, {  16,  47 },
+  {  16,  51 }, {  16,  55 }, {  17,  20 }, {  17,  23 }, {  17,  34 },
+  {  17,  35 }, {  17,  39 }, {  17,  48 }, {  17,  52 }, {  17,  56 },
+  {  18,  20 }, {  18,  24 }, {  18,  34 }, {  18,  36 }, {  18,  40 },
+  {  18,  49 }, {  18,  53 }, {  18,  57 }, {  19,  25 }, {  19,  33 },
+  {  19,  37 }, {  19,  38 }, {  19,  50 }, {  19,  51 }, {  19,  58 },
+  {  20,  26 }, {  20,  34 }, {  20,  39 }, {  20,  40 }, {  20,  52 },
+  {  20,  53 }, {  20,  61 }, {  21,  23 }, {  21,  27 }, {  21,  35 },
+  {  21,  37 }, {  21,  41 }, {  21,  54 }, {  21,  59 }, {  21,  62 },
+  {  22,  24 }, {  22,  28 }, {  22,  36 }, {  22,  38 }, {  22,  42 },
+  {  22,  55 }, {  22,  60 }, {  22,  63 }, {  23,  29 }, {  23,  35 },
+  {  23,  39 }, {  23,  41 }, {  23,  56 }, {  23,  59 }, {  23,  64 },
+  {  24,  30 }, {  24,  36 }, {  24,  40 }, {  24,  42 }, {  24,  57 },
+  {  24,  60 }, {  24,  65 }, {  25,  27 }, {  25,  28 }, {  25,  37 },
+  {  25,  38 }, {  25,  43 }, {  25,  58 }, {  25,  66 }, {  25,  67 },
+  {  26,  29 }, {  26,  30 }, {  26,  39 }, {  26,  40 }, {  26,  44 },
+  {  26,  61 }, {  26,  68 }, {  26,  69 }, {  27,  31 }, {  27,  37 },
+  {  27,  41 }, {  27,  43 }, {  27,  62 }, {  27,  66 }, {  27,  70 },
+  {  28,  32 }, {  28,  38 }, {  28,  42 }, {  28,  43 }, {  28,  63 },
+  {  28,  67 }, {  28,  71 }, {  29,  31 }, {  29,  39 }, {  29,  41 },
+  {  29,  44 }, {  29,  64 }, {  29,  68 }, {  29,  72 }, {  30,  32 },
+  {  30,  40 }, {  30,  42 }, {  30,  44 }, {  30,  65 }, {  30,  69 },
+  {  30,  73 }, {  31,  32 }, {  31,  41 }, {  31,  43 }, {  31,  44 },
+  {  31,  70 }, {  31,  72 }, {  31,  74 }, {  32,  42 }, {  32,  43 },
+  {  32,  44 }, {  32,  71 }, {  32,  73 }, {  32,  74 }, {  33,  45 },
+  {  33,  46 }, {  33,  47 }, {  33,  50 }, {  33,  51 }, {  33,  75 },
+  {  34,  45 }, {  34,  48 }, {  34,  49 }, {  34,  52 }, {  34,  53 },
+  {  34,  76 }, {  35,  46 }, {  35,  48 }, {  35,  54 }, {  35,  56 },
+  {  35,  59 }, {  35,  77 }, {  36,  47 }, {  36,  49 }, {  36,  55 },
+  {  36,  57 }, {  36,  60 }, {  36,  78 }, {  37,  50 }, {  37,  54 },
+  {  37,  58 }, {  37,  62 }, {  37,  66 }, {  37,  79 }, {  38,  51 },
+  {  38,  55 }, {  38,  58 }, {  38,  63 }, {  38,  67 }, {  38,  80 },
+  {  39,  52 }, {  39,  56 }, {  39,  61 }, {  39,  64 }, {  39,  68 },
+  {  39,  81 }, {  40,  53 }, {  40,  57 }, {  40,  61 }, {  40,  65 },
+  {  40,  69 }, {  40,  82 }, {  41,  59 }, {  41,  62 }, {  41,  64 },
+  {  41,  70 }, {  41,  72 }, {  41,  83 }, {  42,  60 }, {  42,  63 },
+  {  42,  65 }, {  42,  71 }, {  42,  73 }, {  42,  84 }, {  43,  66 },
+  {  43,  67 }, {  43,  70 }, {  43,  71 }, {  43,  74 }, {  43,  85 },
+  {  44,  68 }, {  44,  69 }, {  44,  72 }, {  44,  73 }, {  44,  74 },
+  {  44,  86 }, {  45,  46 }, {  45,  47 }, {  45,  48 }, {  45,  49 },
+  {  45,  75 }, {  45,  76 }, {  45,  87 }, {  45,  88 }, {  46,  48 },
+  {  46,  50 }, {  46,  54 }, {  46,  75 }, {  46,  77 }, {  46,  87 },
+  {  46,  89 }, {  47,  49 }, {  47,  51 }, {  47,  55 }, {  47,  75 },
+  {  47,  78 }, {  47,  88 }, {  47,  90 }, {  48,  52 }, {  48,  56 },
+  {  48,  76 }, {  48,  77 }, {  48,  87 }, {  48,  91 }, {  49,  53 },
+  {  49,  57 }, {  49,  76 }, {  49,  78 }, {  49,  88 }, {  49,  92 },
+  {  50,  51 }, {  50,  54 }, {  50,  58 }, {  50,  75 }, {  50,  79 },
+  {  50,  89 }, {  50,  93 }, {  51,  55 }, {  51,  58 }, {  51,  75 },
+  {  51,  80 }, {  51,  90 }, {  51,  93 }, {  52,  53 }, {  52,  56 },
+  {  52,  61 }, {  52,  76 }, {  52,  81 }, {  52,  91 }, {  52,  94 },
+  {  53,  57 }, {  53,  61 }, {  53,  76 }, {  53,  82 }, {  53,  92 },
+  {  53,  94 }, {  54,  59 }, {  54,  62 }, {  54,  77 }, {  54,  79 },
+  {  54,  89 }, {  54,  95 }, {  55,  60 }, {  55,  63 }, {  55,  78 },
+  {  55,  80 }, {  55,  90 }, {  55,  96 }, {  56,  59 }, {  56,  64 },
+  {  56,  77 }, {  56,  81 }, {  56,  91 }, {  56,  97 }, {  57,  60 },
+  {  57,  65 }, {  57,  78 }, {  57,  82 }, {  57,  92 }, {  57,  98 },
+  {  58,  66 }, {  58,  67 }, {  58,  79 }, {  58,  80 }, {  58,  93 },
+  {  58,  99 }, {  59,  62 }, {  59,  64 }, {  59,  77 }, {  59,  83 },
+  {  59,  95 }, {  59,  97 }, {  60,  63 }, {  60,  65 }, {  60,  78 },
+  {  60,  84 }, {  60,  96 }, {  60,  98 }, {  61,  68 }, {  61,  69 },
+  {  61,  81 }, {  61,  82 }, {  61,  94 }, {  61, 100 }, {  62,  66 },
+  {  62,  70 }, {  62,  79 }, {  62,  83 }, {  62,  95 }, {  62, 101 },
+  {  63,  67 }, {  63,  71 }, {  63,  80 }, {  63,  84 }, {  63,  96 },
+  {  63, 102 }, {  64,  68 }, {  64,  72 }, {  64,  81 }, {  64,  83 },
+  {  64,  97 }, {  64, 103 }, {  65,  69 }, {  65,  73 }, {  65,  82 },
+  {  65,  84 }, {  65,  98 }, {  65, 104 }, {  66,  67 }, {  66,  70 },
+  {  66,  79 }, {  66,  85 }, {  66,  99 }, {  66, 101 }, {  67,  71 },
+  {  67,  80 }, {  67,  85 }, {  67,  99 }, {  67, 102 }, {  68,  69 },
+  {  68,  72 }, {  68,  81 }, {  68,  86 }, {  68, 100 }, {  68, 103 },
+  {  69,  73 }, {  69,  82 }, {  69,  86 }, {  69, 100 }, {  69, 104 },
+  {  70,  72 }, {  70,  74 }, {  70,  83 }, {  70,  85 }, {  70, 101 },
+  {  70, 105 }, {  71,  73 }, {  71,  74 }, {  71,  84 }, {  71,  85 },
+  {  71, 102 }, {  71, 106 }, {  72,  74 }, {  72,  83 }, {  72,  86 },
+  {  72, 103 }, {  72, 105 }, {  73,  74 }, {  73,  84 }, {  73,  86 },
+  {  73, 104 }, {  73, 106 }, {  74,  85 }, {  74,  86 }, {  74, 105 },
+  {  74, 106 }, {  75,  87 }, {  75,  88 }, {  75,  89 }, {  75,  90 },
+  {  75,  93 }, {  75, 107 }, {  76,  87 }, {  76,  88 }, {  76,  91 },
+  {  76,  92 }, {  76,  94 }, {  76, 108 }, {  77,  87 }, {  77,  89 },
+  {  77,  91 }, {  77,  95 }, {  77,  97 }, {  77, 109 }, {  78,  88 },
+  {  78,  90 }, {  78,  92 }, {  78,  96 }, {  78,  98 }, {  78, 110 },
+  {  79,  89 }, {  79,  93 }, {  79,  95 }, {  79,  99 }, {  79, 101 },
+  {  79, 111 }, {  80,  90 }, {  80,  93 }, {  80,  96 }, {  80,  99 },
+  {  80, 102 }, {  80, 112 }, {  81,  91 }, {  81,  94 }, {  81,  97 },
+  {  81, 100 }, {  81, 103 }, {  81, 113 }, {  82,  92 }, {  82,  94 },
+  {  82,  98 }, {  82, 100 }, {  82, 104 }, {  82, 114 }, {  83,  95 },
+  {  83,  97 }, {  83, 101 }, {  83, 103 }, {  83, 105 }, {  83, 115 },
+  {  84,  96 }, {  84,  98 }, {  84, 102 }, {  84, 104 }, {  84, 106 },
+  {  84, 116 }, {  85,  99 }, {  85, 101 }, {  85, 102 }, {  85, 105 },
+  {  85, 106 }, {  85, 117 }, {  86, 100 }, {  86, 103 }, {  86, 104 },
+  {  86, 105 }, {  86, 106 }, {  86, 118 }, {  87,  88 }, {  87,  89 },
+  {  87,  91 }, {  87, 107 }, {  87, 108 }, {  87, 109 }, {  88,  90 },
+  {  88,  92 }, {  88, 107 }, {  88, 108 }, {  88, 110 }, {  89,  93 },
+  {  89,  95 }, {  89, 107 }, {  89, 109 }, {  89, 111 }, {  90,  93 },
+  {  90,  96 }, {  90, 107 }, {  90, 110 }, {  90, 112 }, {  91,  94 },
+  {  91,  97 }, {  91, 108 }, {  91, 109 }, {  91, 113 }, {  92,  94 },
+  {  92,  98 }, {  92, 108 }, {  92, 110 }, {  92, 114 }, {  93,  99 },
+  {  93, 107 }, {  93, 111 }, {  93, 112 }, {  94, 100 }, {  94, 108 },
+  {  94, 113 }, {  94, 114 }, {  95,  97 }, {  95, 101 }, {  95, 109 },
+  {  95, 111 }, {  95, 115 }, {  96,  98 }, {  96, 102 }, {  96, 110 },
+  {  96, 112 }, {  96, 116 }, {  97, 103 }, {  97, 109 }, {  97, 113 },
+  {  97, 115 }, {  98, 104 }, {  98, 110 }, {  98, 114 }, {  98, 116 },
+  {  99, 101 }, {  99, 102 }, {  99, 111 }, {  99, 112 }, {  99, 117 },
+  { 100, 103 }, { 100, 104 }, { 100, 113 }, { 100, 114 }, { 100, 118 },
+  { 101, 105 }, { 101, 111 }, { 101, 115 }, { 101, 117 }, { 102, 106 },
+  { 102, 112 }, { 102, 116 }, { 102, 117 }, { 103, 105 }, { 103, 113 },
+  { 103, 115 }, { 103, 118 }, { 104, 106 }, { 104, 114 }, { 104, 116 },
+  { 104, 118 }, { 105, 106 }, { 105, 115 }, { 105, 117 }, { 105, 118 },
+  { 106, 116 }, { 106, 117 }, { 106, 118 }, { 107, 108 }, { 107, 109 },
+  { 107, 110 }, { 107, 111 }, { 107, 112 }, { 107, 119 }, { 108, 109 },
+  { 108, 110 }, { 108, 113 }, { 108, 114 }, { 108, 119 }, { 109, 111 },
+  { 109, 113 }, { 109, 115 }, { 109, 119 }, { 110, 112 }, { 110, 114 },
+  { 110, 116 }, { 110, 119 }, { 111, 112 }, { 111, 115 }, { 111, 117 },
+  { 111, 119 }, { 112, 116 }, { 112, 117 }, { 112, 119 }, { 113, 114 },
+  { 113, 115 }, { 113, 118 }, { 113, 119 }, { 114, 116 }, { 114, 118 },
+  { 114, 119 }, { 115, 117 }, { 115, 118 }, { 115, 119 }, { 116, 117 },
+  { 116, 118 }, { 116, 119 }, { 117, 118 }, { 117, 119 }, { 118, 119 }
+};
+
+static int face_600[NUM_FACE_600][VERT_PER_FACE_600] = {
+  {   0,   1,   2 }, {   0,   1,   3 }, {   0,   1,   4 }, {   0,   1,   5 },
+  {   0,   1,   6 }, {   0,   2,   3 }, {   0,   2,   4 }, {   0,   2,   7 },
+  {   0,   2,   8 }, {   0,   3,   5 }, {   0,   3,   7 }, {   0,   3,   9 },
+  {   0,   4,   6 }, {   0,   4,   8 }, {   0,   4,  10 }, {   0,   5,   6 },
+  {   0,   5,   9 }, {   0,   5,  11 }, {   0,   6,  10 }, {   0,   6,  11 },
+  {   0,   7,   8 }, {   0,   7,   9 }, {   0,   7,  12 }, {   0,   8,  10 },
+  {   0,   8,  12 }, {   0,   9,  11 }, {   0,   9,  12 }, {   0,  10,  11 },
+  {   0,  10,  12 }, {   0,  11,  12 }, {   1,   2,   3 }, {   1,   2,   4 },
+  {   1,   2,  13 }, {   1,   2,  14 }, {   1,   3,   5 }, {   1,   3,  13 },
+  {   1,   3,  15 }, {   1,   4,   6 }, {   1,   4,  14 }, {   1,   4,  16 },
+  {   1,   5,   6 }, {   1,   5,  15 }, {   1,   5,  19 }, {   1,   6,  16 },
+  {   1,   6,  19 }, {   1,  13,  14 }, {   1,  13,  15 }, {   1,  13,  33 },
+  {   1,  14,  16 }, {   1,  14,  33 }, {   1,  15,  19 }, {   1,  15,  33 },
+  {   1,  16,  19 }, {   1,  16,  33 }, {   1,  19,  33 }, {   2,   3,   7 },
+  {   2,   3,  13 }, {   2,   3,  17 }, {   2,   4,   8 }, {   2,   4,  14 },
+  {   2,   4,  18 }, {   2,   7,   8 }, {   2,   7,  17 }, {   2,   7,  20 },
+  {   2,   8,  18 }, {   2,   8,  20 }, {   2,  13,  14 }, {   2,  13,  17 },
+  {   2,  13,  34 }, {   2,  14,  18 }, {   2,  14,  34 }, {   2,  17,  20 },
+  {   2,  17,  34 }, {   2,  18,  20 }, {   2,  18,  34 }, {   2,  20,  34 },
+  {   3,   5,   9 }, {   3,   5,  15 }, {   3,   5,  21 }, {   3,   7,   9 },
+  {   3,   7,  17 }, {   3,   7,  23 }, {   3,   9,  21 }, {   3,   9,  23 },
+  {   3,  13,  15 }, {   3,  13,  17 }, {   3,  13,  35 }, {   3,  15,  21 },
+  {   3,  15,  35 }, {   3,  17,  23 }, {   3,  17,  35 }, {   3,  21,  23 },
+  {   3,  21,  35 }, {   3,  23,  35 }, {   4,   6,  10 }, {   4,   6,  16 },
+  {   4,   6,  22 }, {   4,   8,  10 }, {   4,   8,  18 }, {   4,   8,  24 },
+  {   4,  10,  22 }, {   4,  10,  24 }, {   4,  14,  16 }, {   4,  14,  18 },
+  {   4,  14,  36 }, {   4,  16,  22 }, {   4,  16,  36 }, {   4,  18,  24 },
+  {   4,  18,  36 }, {   4,  22,  24 }, {   4,  22,  36 }, {   4,  24,  36 },
+  {   5,   6,  11 }, {   5,   6,  19 }, {   5,   6,  25 }, {   5,   9,  11 },
+  {   5,   9,  21 }, {   5,   9,  27 }, {   5,  11,  25 }, {   5,  11,  27 },
+  {   5,  15,  19 }, {   5,  15,  21 }, {   5,  15,  37 }, {   5,  19,  25 },
+  {   5,  19,  37 }, {   5,  21,  27 }, {   5,  21,  37 }, {   5,  25,  27 },
+  {   5,  25,  37 }, {   5,  27,  37 }, {   6,  10,  11 }, {   6,  10,  22 },
+  {   6,  10,  28 }, {   6,  11,  25 }, {   6,  11,  28 }, {   6,  16,  19 },
+  {   6,  16,  22 }, {   6,  16,  38 }, {   6,  19,  25 }, {   6,  19,  38 },
+  {   6,  22,  28 }, {   6,  22,  38 }, {   6,  25,  28 }, {   6,  25,  38 },
+  {   6,  28,  38 }, {   7,   8,  12 }, {   7,   8,  20 }, {   7,   8,  26 },
+  {   7,   9,  12 }, {   7,   9,  23 }, {   7,   9,  29 }, {   7,  12,  26 },
+  {   7,  12,  29 }, {   7,  17,  20 }, {   7,  17,  23 }, {   7,  17,  39 },
+  {   7,  20,  26 }, {   7,  20,  39 }, {   7,  23,  29 }, {   7,  23,  39 },
+  {   7,  26,  29 }, {   7,  26,  39 }, {   7,  29,  39 }, {   8,  10,  12 },
+  {   8,  10,  24 }, {   8,  10,  30 }, {   8,  12,  26 }, {   8,  12,  30 },
+  {   8,  18,  20 }, {   8,  18,  24 }, {   8,  18,  40 }, {   8,  20,  26 },
+  {   8,  20,  40 }, {   8,  24,  30 }, {   8,  24,  40 }, {   8,  26,  30 },
+  {   8,  26,  40 }, {   8,  30,  40 }, {   9,  11,  12 }, {   9,  11,  27 },
+  {   9,  11,  31 }, {   9,  12,  29 }, {   9,  12,  31 }, {   9,  21,  23 },
+  {   9,  21,  27 }, {   9,  21,  41 }, {   9,  23,  29 }, {   9,  23,  41 },
+  {   9,  27,  31 }, {   9,  27,  41 }, {   9,  29,  31 }, {   9,  29,  41 },
+  {   9,  31,  41 }, {  10,  11,  12 }, {  10,  11,  28 }, {  10,  11,  32 },
+  {  10,  12,  30 }, {  10,  12,  32 }, {  10,  22,  24 }, {  10,  22,  28 },
+  {  10,  22,  42 }, {  10,  24,  30 }, {  10,  24,  42 }, {  10,  28,  32 },
+  {  10,  28,  42 }, {  10,  30,  32 }, {  10,  30,  42 }, {  10,  32,  42 },
+  {  11,  12,  31 }, {  11,  12,  32 }, {  11,  25,  27 }, {  11,  25,  28 },
+  {  11,  25,  43 }, {  11,  27,  31 }, {  11,  27,  43 }, {  11,  28,  32 },
+  {  11,  28,  43 }, {  11,  31,  32 }, {  11,  31,  43 }, {  11,  32,  43 },
+  {  12,  26,  29 }, {  12,  26,  30 }, {  12,  26,  44 }, {  12,  29,  31 },
+  {  12,  29,  44 }, {  12,  30,  32 }, {  12,  30,  44 }, {  12,  31,  32 },
+  {  12,  31,  44 }, {  12,  32,  44 }, {  13,  14,  33 }, {  13,  14,  34 },
+  {  13,  14,  45 }, {  13,  15,  33 }, {  13,  15,  35 }, {  13,  15,  46 },
+  {  13,  17,  34 }, {  13,  17,  35 }, {  13,  17,  48 }, {  13,  33,  45 },
+  {  13,  33,  46 }, {  13,  34,  45 }, {  13,  34,  48 }, {  13,  35,  46 },
+  {  13,  35,  48 }, {  13,  45,  46 }, {  13,  45,  48 }, {  13,  46,  48 },
+  {  14,  16,  33 }, {  14,  16,  36 }, {  14,  16,  47 }, {  14,  18,  34 },
+  {  14,  18,  36 }, {  14,  18,  49 }, {  14,  33,  45 }, {  14,  33,  47 },
+  {  14,  34,  45 }, {  14,  34,  49 }, {  14,  36,  47 }, {  14,  36,  49 },
+  {  14,  45,  47 }, {  14,  45,  49 }, {  14,  47,  49 }, {  15,  19,  33 },
+  {  15,  19,  37 }, {  15,  19,  50 }, {  15,  21,  35 }, {  15,  21,  37 },
+  {  15,  21,  54 }, {  15,  33,  46 }, {  15,  33,  50 }, {  15,  35,  46 },
+  {  15,  35,  54 }, {  15,  37,  50 }, {  15,  37,  54 }, {  15,  46,  50 },
+  {  15,  46,  54 }, {  15,  50,  54 }, {  16,  19,  33 }, {  16,  19,  38 },
+  {  16,  19,  51 }, {  16,  22,  36 }, {  16,  22,  38 }, {  16,  22,  55 },
+  {  16,  33,  47 }, {  16,  33,  51 }, {  16,  36,  47 }, {  16,  36,  55 },
+  {  16,  38,  51 }, {  16,  38,  55 }, {  16,  47,  51 }, {  16,  47,  55 },
+  {  16,  51,  55 }, {  17,  20,  34 }, {  17,  20,  39 }, {  17,  20,  52 },
+  {  17,  23,  35 }, {  17,  23,  39 }, {  17,  23,  56 }, {  17,  34,  48 },
+  {  17,  34,  52 }, {  17,  35,  48 }, {  17,  35,  56 }, {  17,  39,  52 },
+  {  17,  39,  56 }, {  17,  48,  52 }, {  17,  48,  56 }, {  17,  52,  56 },
+  {  18,  20,  34 }, {  18,  20,  40 }, {  18,  20,  53 }, {  18,  24,  36 },
+  {  18,  24,  40 }, {  18,  24,  57 }, {  18,  34,  49 }, {  18,  34,  53 },
+  {  18,  36,  49 }, {  18,  36,  57 }, {  18,  40,  53 }, {  18,  40,  57 },
+  {  18,  49,  53 }, {  18,  49,  57 }, {  18,  53,  57 }, {  19,  25,  37 },
+  {  19,  25,  38 }, {  19,  25,  58 }, {  19,  33,  50 }, {  19,  33,  51 },
+  {  19,  37,  50 }, {  19,  37,  58 }, {  19,  38,  51 }, {  19,  38,  58 },
+  {  19,  50,  51 }, {  19,  50,  58 }, {  19,  51,  58 }, {  20,  26,  39 },
+  {  20,  26,  40 }, {  20,  26,  61 }, {  20,  34,  52 }, {  20,  34,  53 },
+  {  20,  39,  52 }, {  20,  39,  61 }, {  20,  40,  53 }, {  20,  40,  61 },
+  {  20,  52,  53 }, {  20,  52,  61 }, {  20,  53,  61 }, {  21,  23,  35 },
+  {  21,  23,  41 }, {  21,  23,  59 }, {  21,  27,  37 }, {  21,  27,  41 },
+  {  21,  27,  62 }, {  21,  35,  54 }, {  21,  35,  59 }, {  21,  37,  54 },
+  {  21,  37,  62 }, {  21,  41,  59 }, {  21,  41,  62 }, {  21,  54,  59 },
+  {  21,  54,  62 }, {  21,  59,  62 }, {  22,  24,  36 }, {  22,  24,  42 },
+  {  22,  24,  60 }, {  22,  28,  38 }, {  22,  28,  42 }, {  22,  28,  63 },
+  {  22,  36,  55 }, {  22,  36,  60 }, {  22,  38,  55 }, {  22,  38,  63 },
+  {  22,  42,  60 }, {  22,  42,  63 }, {  22,  55,  60 }, {  22,  55,  63 },
+  {  22,  60,  63 }, {  23,  29,  39 }, {  23,  29,  41 }, {  23,  29,  64 },
+  {  23,  35,  56 }, {  23,  35,  59 }, {  23,  39,  56 }, {  23,  39,  64 },
+  {  23,  41,  59 }, {  23,  41,  64 }, {  23,  56,  59 }, {  23,  56,  64 },
+  {  23,  59,  64 }, {  24,  30,  40 }, {  24,  30,  42 }, {  24,  30,  65 },
+  {  24,  36,  57 }, {  24,  36,  60 }, {  24,  40,  57 }, {  24,  40,  65 },
+  {  24,  42,  60 }, {  24,  42,  65 }, {  24,  57,  60 }, {  24,  57,  65 },
+  {  24,  60,  65 }, {  25,  27,  37 }, {  25,  27,  43 }, {  25,  27,  66 },
+  {  25,  28,  38 }, {  25,  28,  43 }, {  25,  28,  67 }, {  25,  37,  58 },
+  {  25,  37,  66 }, {  25,  38,  58 }, {  25,  38,  67 }, {  25,  43,  66 },
+  {  25,  43,  67 }, {  25,  58,  66 }, {  25,  58,  67 }, {  25,  66,  67 },
+  {  26,  29,  39 }, {  26,  29,  44 }, {  26,  29,  68 }, {  26,  30,  40 },
+  {  26,  30,  44 }, {  26,  30,  69 }, {  26,  39,  61 }, {  26,  39,  68 },
+  {  26,  40,  61 }, {  26,  40,  69 }, {  26,  44,  68 }, {  26,  44,  69 },
+  {  26,  61,  68 }, {  26,  61,  69 }, {  26,  68,  69 }, {  27,  31,  41 },
+  {  27,  31,  43 }, {  27,  31,  70 }, {  27,  37,  62 }, {  27,  37,  66 },
+  {  27,  41,  62 }, {  27,  41,  70 }, {  27,  43,  66 }, {  27,  43,  70 },
+  {  27,  62,  66 }, {  27,  62,  70 }, {  27,  66,  70 }, {  28,  32,  42 },
+  {  28,  32,  43 }, {  28,  32,  71 }, {  28,  38,  63 }, {  28,  38,  67 },
+  {  28,  42,  63 }, {  28,  42,  71 }, {  28,  43,  67 }, {  28,  43,  71 },
+  {  28,  63,  67 }, {  28,  63,  71 }, {  28,  67,  71 }, {  29,  31,  41 },
+  {  29,  31,  44 }, {  29,  31,  72 }, {  29,  39,  64 }, {  29,  39,  68 },
+  {  29,  41,  64 }, {  29,  41,  72 }, {  29,  44,  68 }, {  29,  44,  72 },
+  {  29,  64,  68 }, {  29,  64,  72 }, {  29,  68,  72 }, {  30,  32,  42 },
+  {  30,  32,  44 }, {  30,  32,  73 }, {  30,  40,  65 }, {  30,  40,  69 },
+  {  30,  42,  65 }, {  30,  42,  73 }, {  30,  44,  69 }, {  30,  44,  73 },
+  {  30,  65,  69 }, {  30,  65,  73 }, {  30,  69,  73 }, {  31,  32,  43 },
+  {  31,  32,  44 }, {  31,  32,  74 }, {  31,  41,  70 }, {  31,  41,  72 },
+  {  31,  43,  70 }, {  31,  43,  74 }, {  31,  44,  72 }, {  31,  44,  74 },
+  {  31,  70,  72 }, {  31,  70,  74 }, {  31,  72,  74 }, {  32,  42,  71 },
+  {  32,  42,  73 }, {  32,  43,  71 }, {  32,  43,  74 }, {  32,  44,  73 },
+  {  32,  44,  74 }, {  32,  71,  73 }, {  32,  71,  74 }, {  32,  73,  74 },
+  {  33,  45,  46 }, {  33,  45,  47 }, {  33,  45,  75 }, {  33,  46,  50 },
+  {  33,  46,  75 }, {  33,  47,  51 }, {  33,  47,  75 }, {  33,  50,  51 },
+  {  33,  50,  75 }, {  33,  51,  75 }, {  34,  45,  48 }, {  34,  45,  49 },
+  {  34,  45,  76 }, {  34,  48,  52 }, {  34,  48,  76 }, {  34,  49,  53 },
+  {  34,  49,  76 }, {  34,  52,  53 }, {  34,  52,  76 }, {  34,  53,  76 },
+  {  35,  46,  48 }, {  35,  46,  54 }, {  35,  46,  77 }, {  35,  48,  56 },
+  {  35,  48,  77 }, {  35,  54,  59 }, {  35,  54,  77 }, {  35,  56,  59 },
+  {  35,  56,  77 }, {  35,  59,  77 }, {  36,  47,  49 }, {  36,  47,  55 },
+  {  36,  47,  78 }, {  36,  49,  57 }, {  36,  49,  78 }, {  36,  55,  60 },
+  {  36,  55,  78 }, {  36,  57,  60 }, {  36,  57,  78 }, {  36,  60,  78 },
+  {  37,  50,  54 }, {  37,  50,  58 }, {  37,  50,  79 }, {  37,  54,  62 },
+  {  37,  54,  79 }, {  37,  58,  66 }, {  37,  58,  79 }, {  37,  62,  66 },
+  {  37,  62,  79 }, {  37,  66,  79 }, {  38,  51,  55 }, {  38,  51,  58 },
+  {  38,  51,  80 }, {  38,  55,  63 }, {  38,  55,  80 }, {  38,  58,  67 },
+  {  38,  58,  80 }, {  38,  63,  67 }, {  38,  63,  80 }, {  38,  67,  80 },
+  {  39,  52,  56 }, {  39,  52,  61 }, {  39,  52,  81 }, {  39,  56,  64 },
+  {  39,  56,  81 }, {  39,  61,  68 }, {  39,  61,  81 }, {  39,  64,  68 },
+  {  39,  64,  81 }, {  39,  68,  81 }, {  40,  53,  57 }, {  40,  53,  61 },
+  {  40,  53,  82 }, {  40,  57,  65 }, {  40,  57,  82 }, {  40,  61,  69 },
+  {  40,  61,  82 }, {  40,  65,  69 }, {  40,  65,  82 }, {  40,  69,  82 },
+  {  41,  59,  62 }, {  41,  59,  64 }, {  41,  59,  83 }, {  41,  62,  70 },
+  {  41,  62,  83 }, {  41,  64,  72 }, {  41,  64,  83 }, {  41,  70,  72 },
+  {  41,  70,  83 }, {  41,  72,  83 }, {  42,  60,  63 }, {  42,  60,  65 },
+  {  42,  60,  84 }, {  42,  63,  71 }, {  42,  63,  84 }, {  42,  65,  73 },
+  {  42,  65,  84 }, {  42,  71,  73 }, {  42,  71,  84 }, {  42,  73,  84 },
+  {  43,  66,  67 }, {  43,  66,  70 }, {  43,  66,  85 }, {  43,  67,  71 },
+  {  43,  67,  85 }, {  43,  70,  74 }, {  43,  70,  85 }, {  43,  71,  74 },
+  {  43,  71,  85 }, {  43,  74,  85 }, {  44,  68,  69 }, {  44,  68,  72 },
+  {  44,  68,  86 }, {  44,  69,  73 }, {  44,  69,  86 }, {  44,  72,  74 },
+  {  44,  72,  86 }, {  44,  73,  74 }, {  44,  73,  86 }, {  44,  74,  86 },
+  {  45,  46,  48 }, {  45,  46,  75 }, {  45,  46,  87 }, {  45,  47,  49 },
+  {  45,  47,  75 }, {  45,  47,  88 }, {  45,  48,  76 }, {  45,  48,  87 },
+  {  45,  49,  76 }, {  45,  49,  88 }, {  45,  75,  87 }, {  45,  75,  88 },
+  {  45,  76,  87 }, {  45,  76,  88 }, {  45,  87,  88 }, {  46,  48,  77 },
+  {  46,  48,  87 }, {  46,  50,  54 }, {  46,  50,  75 }, {  46,  50,  89 },
+  {  46,  54,  77 }, {  46,  54,  89 }, {  46,  75,  87 }, {  46,  75,  89 },
+  {  46,  77,  87 }, {  46,  77,  89 }, {  46,  87,  89 }, {  47,  49,  78 },
+  {  47,  49,  88 }, {  47,  51,  55 }, {  47,  51,  75 }, {  47,  51,  90 },
+  {  47,  55,  78 }, {  47,  55,  90 }, {  47,  75,  88 }, {  47,  75,  90 },
+  {  47,  78,  88 }, {  47,  78,  90 }, {  47,  88,  90 }, {  48,  52,  56 },
+  {  48,  52,  76 }, {  48,  52,  91 }, {  48,  56,  77 }, {  48,  56,  91 },
+  {  48,  76,  87 }, {  48,  76,  91 }, {  48,  77,  87 }, {  48,  77,  91 },
+  {  48,  87,  91 }, {  49,  53,  57 }, {  49,  53,  76 }, {  49,  53,  92 },
+  {  49,  57,  78 }, {  49,  57,  92 }, {  49,  76,  88 }, {  49,  76,  92 },
+  {  49,  78,  88 }, {  49,  78,  92 }, {  49,  88,  92 }, {  50,  51,  58 },
+  {  50,  51,  75 }, {  50,  51,  93 }, {  50,  54,  79 }, {  50,  54,  89 },
+  {  50,  58,  79 }, {  50,  58,  93 }, {  50,  75,  89 }, {  50,  75,  93 },
+  {  50,  79,  89 }, {  50,  79,  93 }, {  50,  89,  93 }, {  51,  55,  80 },
+  {  51,  55,  90 }, {  51,  58,  80 }, {  51,  58,  93 }, {  51,  75,  90 },
+  {  51,  75,  93 }, {  51,  80,  90 }, {  51,  80,  93 }, {  51,  90,  93 },
+  {  52,  53,  61 }, {  52,  53,  76 }, {  52,  53,  94 }, {  52,  56,  81 },
+  {  52,  56,  91 }, {  52,  61,  81 }, {  52,  61,  94 }, {  52,  76,  91 },
+  {  52,  76,  94 }, {  52,  81,  91 }, {  52,  81,  94 }, {  52,  91,  94 },
+  {  53,  57,  82 }, {  53,  57,  92 }, {  53,  61,  82 }, {  53,  61,  94 },
+  {  53,  76,  92 }, {  53,  76,  94 }, {  53,  82,  92 }, {  53,  82,  94 },
+  {  53,  92,  94 }, {  54,  59,  62 }, {  54,  59,  77 }, {  54,  59,  95 },
+  {  54,  62,  79 }, {  54,  62,  95 }, {  54,  77,  89 }, {  54,  77,  95 },
+  {  54,  79,  89 }, {  54,  79,  95 }, {  54,  89,  95 }, {  55,  60,  63 },
+  {  55,  60,  78 }, {  55,  60,  96 }, {  55,  63,  80 }, {  55,  63,  96 },
+  {  55,  78,  90 }, {  55,  78,  96 }, {  55,  80,  90 }, {  55,  80,  96 },
+  {  55,  90,  96 }, {  56,  59,  64 }, {  56,  59,  77 }, {  56,  59,  97 },
+  {  56,  64,  81 }, {  56,  64,  97 }, {  56,  77,  91 }, {  56,  77,  97 },
+  {  56,  81,  91 }, {  56,  81,  97 }, {  56,  91,  97 }, {  57,  60,  65 },
+  {  57,  60,  78 }, {  57,  60,  98 }, {  57,  65,  82 }, {  57,  65,  98 },
+  {  57,  78,  92 }, {  57,  78,  98 }, {  57,  82,  92 }, {  57,  82,  98 },
+  {  57,  92,  98 }, {  58,  66,  67 }, {  58,  66,  79 }, {  58,  66,  99 },
+  {  58,  67,  80 }, {  58,  67,  99 }, {  58,  79,  93 }, {  58,  79,  99 },
+  {  58,  80,  93 }, {  58,  80,  99 }, {  58,  93,  99 }, {  59,  62,  83 },
+  {  59,  62,  95 }, {  59,  64,  83 }, {  59,  64,  97 }, {  59,  77,  95 },
+  {  59,  77,  97 }, {  59,  83,  95 }, {  59,  83,  97 }, {  59,  95,  97 },
+  {  60,  63,  84 }, {  60,  63,  96 }, {  60,  65,  84 }, {  60,  65,  98 },
+  {  60,  78,  96 }, {  60,  78,  98 }, {  60,  84,  96 }, {  60,  84,  98 },
+  {  60,  96,  98 }, {  61,  68,  69 }, {  61,  68,  81 }, {  61,  68, 100 },
+  {  61,  69,  82 }, {  61,  69, 100 }, {  61,  81,  94 }, {  61,  81, 100 },
+  {  61,  82,  94 }, {  61,  82, 100 }, {  61,  94, 100 }, {  62,  66,  70 },
+  {  62,  66,  79 }, {  62,  66, 101 }, {  62,  70,  83 }, {  62,  70, 101 },
+  {  62,  79,  95 }, {  62,  79, 101 }, {  62,  83,  95 }, {  62,  83, 101 },
+  {  62,  95, 101 }, {  63,  67,  71 }, {  63,  67,  80 }, {  63,  67, 102 },
+  {  63,  71,  84 }, {  63,  71, 102 }, {  63,  80,  96 }, {  63,  80, 102 },
+  {  63,  84,  96 }, {  63,  84, 102 }, {  63,  96, 102 }, {  64,  68,  72 },
+  {  64,  68,  81 }, {  64,  68, 103 }, {  64,  72,  83 }, {  64,  72, 103 },
+  {  64,  81,  97 }, {  64,  81, 103 }, {  64,  83,  97 }, {  64,  83, 103 },
+  {  64,  97, 103 }, {  65,  69,  73 }, {  65,  69,  82 }, {  65,  69, 104 },
+  {  65,  73,  84 }, {  65,  73, 104 }, {  65,  82,  98 }, {  65,  82, 104 },
+  {  65,  84,  98 }, {  65,  84, 104 }, {  65,  98, 104 }, {  66,  67,  85 },
+  {  66,  67,  99 }, {  66,  70,  85 }, {  66,  70, 101 }, {  66,  79,  99 },
+  {  66,  79, 101 }, {  66,  85,  99 }, {  66,  85, 101 }, {  66,  99, 101 },
+  {  67,  71,  85 }, {  67,  71, 102 }, {  67,  80,  99 }, {  67,  80, 102 },
+  {  67,  85,  99 }, {  67,  85, 102 }, {  67,  99, 102 }, {  68,  69,  86 },
+  {  68,  69, 100 }, {  68,  72,  86 }, {  68,  72, 103 }, {  68,  81, 100 },
+  {  68,  81, 103 }, {  68,  86, 100 }, {  68,  86, 103 }, {  68, 100, 103 },
+  {  69,  73,  86 }, {  69,  73, 104 }, {  69,  82, 100 }, {  69,  82, 104 },
+  {  69,  86, 100 }, {  69,  86, 104 }, {  69, 100, 104 }, {  70,  72,  74 },
+  {  70,  72,  83 }, {  70,  72, 105 }, {  70,  74,  85 }, {  70,  74, 105 },
+  {  70,  83, 101 }, {  70,  83, 105 }, {  70,  85, 101 }, {  70,  85, 105 },
+  {  70, 101, 105 }, {  71,  73,  74 }, {  71,  73,  84 }, {  71,  73, 106 },
+  {  71,  74,  85 }, {  71,  74, 106 }, {  71,  84, 102 }, {  71,  84, 106 },
+  {  71,  85, 102 }, {  71,  85, 106 }, {  71, 102, 106 }, {  72,  74,  86 },
+  {  72,  74, 105 }, {  72,  83, 103 }, {  72,  83, 105 }, {  72,  86, 103 },
+  {  72,  86, 105 }, {  72, 103, 105 }, {  73,  74,  86 }, {  73,  74, 106 },
+  {  73,  84, 104 }, {  73,  84, 106 }, {  73,  86, 104 }, {  73,  86, 106 },
+  {  73, 104, 106 }, {  74,  85, 105 }, {  74,  85, 106 }, {  74,  86, 105 },
+  {  74,  86, 106 }, {  74, 105, 106 }, {  75,  87,  88 }, {  75,  87,  89 },
+  {  75,  87, 107 }, {  75,  88,  90 }, {  75,  88, 107 }, {  75,  89,  93 },
+  {  75,  89, 107 }, {  75,  90,  93 }, {  75,  90, 107 }, {  75,  93, 107 },
+  {  76,  87,  88 }, {  76,  87,  91 }, {  76,  87, 108 }, {  76,  88,  92 },
+  {  76,  88, 108 }, {  76,  91,  94 }, {  76,  91, 108 }, {  76,  92,  94 },
+  {  76,  92, 108 }, {  76,  94, 108 }, {  77,  87,  89 }, {  77,  87,  91 },
+  {  77,  87, 109 }, {  77,  89,  95 }, {  77,  89, 109 }, {  77,  91,  97 },
+  {  77,  91, 109 }, {  77,  95,  97 }, {  77,  95, 109 }, {  77,  97, 109 },
+  {  78,  88,  90 }, {  78,  88,  92 }, {  78,  88, 110 }, {  78,  90,  96 },
+  {  78,  90, 110 }, {  78,  92,  98 }, {  78,  92, 110 }, {  78,  96,  98 },
+  {  78,  96, 110 }, {  78,  98, 110 }, {  79,  89,  93 }, {  79,  89,  95 },
+  {  79,  89, 111 }, {  79,  93,  99 }, {  79,  93, 111 }, {  79,  95, 101 },
+  {  79,  95, 111 }, {  79,  99, 101 }, {  79,  99, 111 }, {  79, 101, 111 },
+  {  80,  90,  93 }, {  80,  90,  96 }, {  80,  90, 112 }, {  80,  93,  99 },
+  {  80,  93, 112 }, {  80,  96, 102 }, {  80,  96, 112 }, {  80,  99, 102 },
+  {  80,  99, 112 }, {  80, 102, 112 }, {  81,  91,  94 }, {  81,  91,  97 },
+  {  81,  91, 113 }, {  81,  94, 100 }, {  81,  94, 113 }, {  81,  97, 103 },
+  {  81,  97, 113 }, {  81, 100, 103 }, {  81, 100, 113 }, {  81, 103, 113 },
+  {  82,  92,  94 }, {  82,  92,  98 }, {  82,  92, 114 }, {  82,  94, 100 },
+  {  82,  94, 114 }, {  82,  98, 104 }, {  82,  98, 114 }, {  82, 100, 104 },
+  {  82, 100, 114 }, {  82, 104, 114 }, {  83,  95,  97 }, {  83,  95, 101 },
+  {  83,  95, 115 }, {  83,  97, 103 }, {  83,  97, 115 }, {  83, 101, 105 },
+  {  83, 101, 115 }, {  83, 103, 105 }, {  83, 103, 115 }, {  83, 105, 115 },
+  {  84,  96,  98 }, {  84,  96, 102 }, {  84,  96, 116 }, {  84,  98, 104 },
+  {  84,  98, 116 }, {  84, 102, 106 }, {  84, 102, 116 }, {  84, 104, 106 },
+  {  84, 104, 116 }, {  84, 106, 116 }, {  85,  99, 101 }, {  85,  99, 102 },
+  {  85,  99, 117 }, {  85, 101, 105 }, {  85, 101, 117 }, {  85, 102, 106 },
+  {  85, 102, 117 }, {  85, 105, 106 }, {  85, 105, 117 }, {  85, 106, 117 },
+  {  86, 100, 103 }, {  86, 100, 104 }, {  86, 100, 118 }, {  86, 103, 105 },
+  {  86, 103, 118 }, {  86, 104, 106 }, {  86, 104, 118 }, {  86, 105, 106 },
+  {  86, 105, 118 }, {  86, 106, 118 }, {  87,  88, 107 }, {  87,  88, 108 },
+  {  87,  89, 107 }, {  87,  89, 109 }, {  87,  91, 108 }, {  87,  91, 109 },
+  {  87, 107, 108 }, {  87, 107, 109 }, {  87, 108, 109 }, {  88,  90, 107 },
+  {  88,  90, 110 }, {  88,  92, 108 }, {  88,  92, 110 }, {  88, 107, 108 },
+  {  88, 107, 110 }, {  88, 108, 110 }, {  89,  93, 107 }, {  89,  93, 111 },
+  {  89,  95, 109 }, {  89,  95, 111 }, {  89, 107, 109 }, {  89, 107, 111 },
+  {  89, 109, 111 }, {  90,  93, 107 }, {  90,  93, 112 }, {  90,  96, 110 },
+  {  90,  96, 112 }, {  90, 107, 110 }, {  90, 107, 112 }, {  90, 110, 112 },
+  {  91,  94, 108 }, {  91,  94, 113 }, {  91,  97, 109 }, {  91,  97, 113 },
+  {  91, 108, 109 }, {  91, 108, 113 }, {  91, 109, 113 }, {  92,  94, 108 },
+  {  92,  94, 114 }, {  92,  98, 110 }, {  92,  98, 114 }, {  92, 108, 110 },
+  {  92, 108, 114 }, {  92, 110, 114 }, {  93,  99, 111 }, {  93,  99, 112 },
+  {  93, 107, 111 }, {  93, 107, 112 }, {  93, 111, 112 }, {  94, 100, 113 },
+  {  94, 100, 114 }, {  94, 108, 113 }, {  94, 108, 114 }, {  94, 113, 114 },
+  {  95,  97, 109 }, {  95,  97, 115 }, {  95, 101, 111 }, {  95, 101, 115 },
+  {  95, 109, 111 }, {  95, 109, 115 }, {  95, 111, 115 }, {  96,  98, 110 },
+  {  96,  98, 116 }, {  96, 102, 112 }, {  96, 102, 116 }, {  96, 110, 112 },
+  {  96, 110, 116 }, {  96, 112, 116 }, {  97, 103, 113 }, {  97, 103, 115 },
+  {  97, 109, 113 }, {  97, 109, 115 }, {  97, 113, 115 }, {  98, 104, 114 },
+  {  98, 104, 116 }, {  98, 110, 114 }, {  98, 110, 116 }, {  98, 114, 116 },
+  {  99, 101, 111 }, {  99, 101, 117 }, {  99, 102, 112 }, {  99, 102, 117 },
+  {  99, 111, 112 }, {  99, 111, 117 }, {  99, 112, 117 }, { 100, 103, 113 },
+  { 100, 103, 118 }, { 100, 104, 114 }, { 100, 104, 118 }, { 100, 113, 114 },
+  { 100, 113, 118 }, { 100, 114, 118 }, { 101, 105, 115 }, { 101, 105, 117 },
+  { 101, 111, 115 }, { 101, 111, 117 }, { 101, 115, 117 }, { 102, 106, 116 },
+  { 102, 106, 117 }, { 102, 112, 116 }, { 102, 112, 117 }, { 102, 116, 117 },
+  { 103, 105, 115 }, { 103, 105, 118 }, { 103, 113, 115 }, { 103, 113, 118 },
+  { 103, 115, 118 }, { 104, 106, 116 }, { 104, 106, 118 }, { 104, 114, 116 },
+  { 104, 114, 118 }, { 104, 116, 118 }, { 105, 106, 117 }, { 105, 106, 118 },
+  { 105, 115, 117 }, { 105, 115, 118 }, { 105, 117, 118 }, { 106, 116, 117 },
+  { 106, 116, 118 }, { 106, 117, 118 }, { 107, 108, 109 }, { 107, 108, 110 },
+  { 107, 108, 119 }, { 107, 109, 111 }, { 107, 109, 119 }, { 107, 110, 112 },
+  { 107, 110, 119 }, { 107, 111, 112 }, { 107, 111, 119 }, { 107, 112, 119 },
+  { 108, 109, 113 }, { 108, 109, 119 }, { 108, 110, 114 }, { 108, 110, 119 },
+  { 108, 113, 114 }, { 108, 113, 119 }, { 108, 114, 119 }, { 109, 111, 115 },
+  { 109, 111, 119 }, { 109, 113, 115 }, { 109, 113, 119 }, { 109, 115, 119 },
+  { 110, 112, 116 }, { 110, 112, 119 }, { 110, 114, 116 }, { 110, 114, 119 },
+  { 110, 116, 119 }, { 111, 112, 117 }, { 111, 112, 119 }, { 111, 115, 117 },
+  { 111, 115, 119 }, { 111, 117, 119 }, { 112, 116, 117 }, { 112, 116, 119 },
+  { 112, 117, 119 }, { 113, 114, 118 }, { 113, 114, 119 }, { 113, 115, 118 },
+  { 113, 115, 119 }, { 113, 118, 119 }, { 114, 116, 118 }, { 114, 116, 119 },
+  { 114, 118, 119 }, { 115, 117, 118 }, { 115, 117, 119 }, { 115, 118, 119 },
+  { 116, 117, 118 }, { 116, 117, 119 }, { 116, 118, 119 }, { 117, 118, 119 }
+};
+
+static float edge_color_600[NUM_EDGE_600][4];
+static float face_color_600[NUM_FACE_600][4];
+static float face_color_trans_600[NUM_FACE_600][4];
+
+
+/* Add a rotation around the wx-plane to the matrix m. */
+static void rotatewx(float m[4][4], float phi)
+{
+  float c, s, u, v;
+  int i;
+
+  phi *= M_PI/180.0;
+  c = cos(phi);
+  s = sin(phi);
+  for (i=0; i<4; i++)
+  {
+    u = m[i][1];
+    v = m[i][2];
+    m[i][1] = c*u+s*v;
+    m[i][2] = -s*u+c*v;
+  }
+}
+
+
+/* Add a rotation around the wy-plane to the matrix m. */
+static void rotatewy(float m[4][4], float phi)
+{
+  float c, s, u, v;
+  int i;
+
+  phi *= M_PI/180.0;
+  c = cos(phi);
+  s = sin(phi);
+  for (i=0; i<4; i++)
+  {
+    u = m[i][0];
+    v = m[i][2];
+    m[i][0] = c*u-s*v;
+    m[i][2] = s*u+c*v;
+  }
+}
+
+
+/* Add a rotation around the wz-plane to the matrix m. */
+static void rotatewz(float m[4][4], float phi)
+{
+  float c, s, u, v;
+  int i;
+
+  phi *= M_PI/180.0;
+  c = cos(phi);
+  s = sin(phi);
+  for (i=0; i<4; i++)
+  {
+    u = m[i][0];
+    v = m[i][1];
+    m[i][0] = c*u+s*v;
+    m[i][1] = -s*u+c*v;
+  }
+}
+
+
+/* Add a rotation around the xy-plane to the matrix m. */
+static void rotatexy(float m[4][4], float phi)
+{
+  float c, s, u, v;
+  int i;
+
+  phi *= M_PI/180.0;
+  c = cos(phi);
+  s = sin(phi);
+  for (i=0; i<4; i++)
+  {
+    u = m[i][2];
+    v = m[i][3];
+    m[i][2] = c*u+s*v;
+    m[i][3] = -s*u+c*v;
+  }
+}
+
+
+/* Add a rotation around the xz-plane to the matrix m. */
+static void rotatexz(float m[4][4], float phi)
+{
+  float c, s, u, v;
+  int i;
+
+  phi *= M_PI/180.0;
+  c = cos(phi);
+  s = sin(phi);
+  for (i=0; i<4; i++)
+  {
+    u = m[i][1];
+    v = m[i][3];
+    m[i][1] = c*u-s*v;
+    m[i][3] = s*u+c*v;
+  }
+}
+
+
+/* Add a rotation around the yz-plane to the matrix m. */
+static void rotateyz(float m[4][4], float phi)
+{
+  float c, s, u, v;
+  int i;
+
+  phi *= M_PI/180.0;
+  c = cos(phi);
+  s = sin(phi);
+  for (i=0; i<4; i++)
+  {
+    u = m[i][0];
+    v = m[i][3];
+    m[i][0] = c*u-s*v;
+    m[i][3] = s*u+c*v;
+  }
+}
+
+
+/* Compute the rotation matrix m from the rotation angles. */
+static void rotateall(float m[4][4])
+{
+  int i, j;
+
+  for (i=0; i<4; i++)
+    for (j=0; j<4; j++)
+      m[i][j] = (i==j);
+  rotatewx(m,alpha);
+  rotatewy(m,beta);
+  rotatewz(m,delta);
+  rotatexy(m,zeta);
+  rotatexz(m,eta);
+  rotateyz(m,theta);
+}
+
+
+/* Compute the normal vector of a plane based on three points in the plane. */
+static void normal(float *p, float *q, float *r, float *n)
+{
+  float u[3], v[3], t;
+
+  u[0] = q[0]-p[0];
+  u[1] = q[1]-p[1];
+  u[2] = q[2]-p[2];
+  v[0] = r[0]-p[0];
+  v[1] = r[1]-p[1];
+  v[2] = r[2]-p[2];
+  n[0] = u[1]*v[2]-u[2]*v[1];
+  n[1] = u[2]*v[0]-u[0]*v[2];
+  n[2] = u[0]*v[1]-u[1]*v[0];
+  t = sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
+  n[0] /= t;
+  n[1] /= t;
+  n[2] /= t;
+}
+
+
+/* Project an array of vertices from 4d to 3d. */
+static void project(float vert[][4], float v[][4], int num)
+{
+  float m[4][4], s;
+  int i, j, k;
+
+  rotateall(m);
+
+  /* Project the vertices from 4d to 3d. */
+  for (i=0; i<num; i++)
+  {
+    for (j=0; j<4; j++)
+    {
+      s = 0.0;
+      for (k=0; k<4; k++)
+        s += m[j][k]*vert[i][k];
+      v[i][j] = s+offset4d[j];
+    }
+    if (projection_4d == DISP_4D_ORTHOGRAPHIC)
+    {
+      for (j=0; j<3; j++)
+        v[i][j] /= 2.0;
+      v[i][3] = 1.0;
+    }
+    else
+    {
+      for (j=0; j<4; j++)
+        v[i][j] /= v[i][3];
+    }
+  }
+
+  /* Move the projected vertices along the z-axis so that they become visible
+     in the viewport. */
+  for (i=0; i<num; i++)
+  {
+    for (j=0; j<4; j++)
+      v[i][j] += offset3d[j];
+  }
+}
+
+
+/* Draw a single polytope. */
+static void draw(ModeInfo *mi,
+                 float v[][4], int edge[][2], int num_edge, int face[],
+                 int num_face, int vert_per_face, float edge_color[][4],
+                 float face_color[][4], float face_color_trans[][4])
+{
+  int i, j;
+  float n[3];
+  static float red[4] = { 1.0, 0.0, 0.0, 1.0 };
+  static float red_trans[4] = { 1.0, 0.0, 0.0, 1.0 };
+
+  mi->polygon_count = 0;
+  if (display_mode == DISP_WIREFRAME)
+  {
+    if (color_mode == COLORS_SINGLE)
+      glColor4fv(red);
+    glBegin(GL_LINES);
+    for (i=0; i<num_edge; i++)
+    {
+      if (color_mode == COLORS_DEPTH)
+        glColor4fv(edge_color[i]);
+      glVertex4fv(v[edge[i][0]]);
+      glVertex4fv(v[edge[i][1]]);
+    }
+    glEnd();
+    mi->polygon_count = num_edge;
+  }
+  else
+  {
+    if (color_mode == COLORS_SINGLE)
+    {
+      red_trans[3] = face_color_trans[0][3]/2.0;
+      if (display_mode == DISP_TRANSPARENT)
+        glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,red_trans);
+      else
+        glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,red);
+    }
+    for (i=0; i<num_face; i++)
+    {
+      glBegin(GL_POLYGON);
+      if (color_mode == COLORS_DEPTH)
+      {
+        if (display_mode == DISP_TRANSPARENT)
+          glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
+                       face_color_trans[i]);
+        else
+          glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,
+                       face_color[i]);
+      }
+      normal(v[face[i*vert_per_face]],v[face[i*vert_per_face+1]],
+             v[face[i*vert_per_face+2]],n);
+      glNormal3fv(n);
+      for (j=0; j<vert_per_face; j++)
+        glVertex4fv(v[face[i*vert_per_face+j]]);
+      glEnd();
+    }
+    mi->polygon_count = num_face;
+  }
+}
+
+
+/* Draw a 5-cell {3,3,3} projected into 3d. */
+static void cell_5(ModeInfo *mi)
+{
+  float v[NUM_VERT_5][4];
+
+  project(vert_5,v,NUM_VERT_5);
+  draw(mi, v,edge_5,NUM_EDGE_5,(int *)face_5,NUM_FACE_5,VERT_PER_FACE_5,
+       edge_color_5,face_color_5,face_color_trans_5);
+}
+
+
+/* Draw a 8-cell {4,3,3} projected into 3d. */
+static void cell_8(ModeInfo *mi)
+{
+  float v[NUM_VERT_8][4];
+
+  project(vert_8,v,NUM_VERT_8);
+  draw(mi,v,edge_8,NUM_EDGE_8,(int *)face_8,NUM_FACE_8,VERT_PER_FACE_8,
+       edge_color_8,face_color_8,face_color_trans_8);
+}
+
+
+/* Draw a 16-cell {3,3,4} projected into 3d. */
+static void cell_16(ModeInfo *mi)
+{
+  float v[NUM_VERT_16][4];
+
+  project(vert_16,v,NUM_VERT_16);
+  draw(mi,v,edge_16,NUM_EDGE_16,(int *)face_16,NUM_FACE_16,VERT_PER_FACE_16,
+       edge_color_16,face_color_16,face_color_trans_16);
+}
+
+
+/* Draw a 24-cell {3,4,3} projected into 3d. */
+static void cell_24(ModeInfo *mi)
+{
+  float v[NUM_VERT_24][4];
+
+  project(vert_24,v,NUM_VERT_24);
+  draw(mi,v,edge_24,NUM_EDGE_24,(int *)face_24,NUM_FACE_24,VERT_PER_FACE_24,
+       edge_color_24,face_color_24,face_color_trans_24);
+}
+
+
+/* Draw a 120-cell {5,3,3} projected into 3d. */
+static void cell_120(ModeInfo *mi)
+{
+  float v[NUM_VERT_120][4];
+
+  project(vert_120,v,NUM_VERT_120);
+  draw(mi,
+       v,edge_120,NUM_EDGE_120,(int *)face_120,NUM_FACE_120,VERT_PER_FACE_120,
+       edge_color_120,face_color_120,face_color_trans_120);
+}
+
+
+/* Draw a 600-cell {3,3,5} projected into 3d. */
+static void cell_600(ModeInfo *mi)
+{
+  float v[NUM_VERT_600][4];
+
+  project(vert_600,v,NUM_VERT_600);
+  draw(mi,
+       v,edge_600,NUM_EDGE_600,(int *)face_600,NUM_FACE_600,VERT_PER_FACE_600,
+       edge_color_600,face_color_600,face_color_trans_600);
+}
+
+
+/* Compute a color based on the w-depth of a point. */
+static void color(float depth, float alpha, float min, float max,
+                  float color[4])
+{
+  double d, t;
+  int s;
+
+  d = (depth-min)/(max-min);
+  s = floor(d*4.0);
+  t = d*4.0-s;
+  if (s < 0)
+    s += 6;
+  if (s >= 6)
+    s -= 6;
+  switch (s)
+  {
+    case 0:
+      color[0] = 1.0;
+      color[1] = t;
+      color[2] = 0.0;
+      break;
+    case 1:
+      color[0] = 1.0-t;
+      color[1] = 1.0;
+      color[2] = 0.0;
+      break;
+    case 2:
+      color[0] = 0.0;
+      color[1] = 1.0;
+      color[2] = t;
+      break;
+    case 3:
+      color[0] = 0.0;
+      color[1] = 1.0-t;
+      color[2] = 1.0;
+      break;
+    case 4:
+      color[0] = t;
+      color[1] = 0.0;
+      color[2] = 1.0;
+      break;
+    case 5:
+      color[0] = 1.0;
+      color[1] = 0.0;
+      color[2] = 1.0-t;
+      break;
+  }
+  color[3] = alpha;
+}
+
+
+/* Set the colors of a single polytope's edges and faces. */
+static void colors(float vert[][4], int edge[][2], int num_edge, int face[],
+                   int num_face, int vert_per_face, float edge_color[][4],
+                   float face_color[][4], float face_color_trans[][4],
+                   float alpha, float min_edge_depth, float max_edge_depth,
+                   float min_face_depth, float max_face_depth)
+{
+  int i, j;
+  float depth;
+
+  for (i=0; i<num_edge; i++)
+  {
+    depth = (vert[edge[i][0]][3]+vert[edge[i][1]][3])/2.0;
+    color(depth,1.0,min_edge_depth,max_edge_depth,edge_color[i]);
+  }
+  for (i=0; i<num_face; i++)
+  {
+    depth = 0.0;
+    for (j=0; j<vert_per_face; j++)
+      depth += vert[face[i*vert_per_face+j]][3];
+    depth /= vert_per_face;
+    color(depth,1.0,min_face_depth,max_face_depth,face_color[i]);
+    color(depth,alpha,min_face_depth,max_face_depth,face_color_trans[i]);
+  }
+}
+
+
+/* Set the colors of the polytopes' edges and faces. */
+static void set_colors(void)
+{
+  /* 5-cell. */
+  colors(vert_5,edge_5,NUM_EDGE_5,(int *)face_5,NUM_FACE_5,
+         VERT_PER_FACE_5,edge_color_5,face_color_5,face_color_trans_5,
+         0.5,MIN_EDGE_DEPTH_5,MAX_EDGE_DEPTH_5,MIN_FACE_DEPTH_5,
+         MAX_FACE_DEPTH_5);
+
+  /* 8-cell. */
+  colors(vert_8,edge_8,NUM_EDGE_8,(int *)face_8,NUM_FACE_8,
+         VERT_PER_FACE_8,edge_color_8,face_color_8,face_color_trans_8,
+         0.4,MIN_EDGE_DEPTH_8,MAX_EDGE_DEPTH_8,MIN_FACE_DEPTH_8,
+         MAX_FACE_DEPTH_8);
+
+  /* 16-cell. */
+  colors(vert_16,edge_16,NUM_EDGE_16,(int *)face_16,NUM_FACE_16,
+         VERT_PER_FACE_16,edge_color_16,face_color_16,face_color_trans_16,
+         0.25,MIN_EDGE_DEPTH_16,MAX_EDGE_DEPTH_16,MIN_FACE_DEPTH_16,
+         MAX_FACE_DEPTH_16);
+
+  /* 24-cell. */
+  colors(vert_24,edge_24,NUM_EDGE_24,(int *)face_24,NUM_FACE_24,
+         VERT_PER_FACE_24,edge_color_24,face_color_24,face_color_trans_24,
+         0.25,MIN_EDGE_DEPTH_24,MAX_EDGE_DEPTH_24,MIN_FACE_DEPTH_24,
+         MAX_FACE_DEPTH_24);
+
+  /* 120-cell. */
+  colors(vert_120,edge_120,NUM_EDGE_120,(int *)face_120,NUM_FACE_120,
+         VERT_PER_FACE_120,edge_color_120,face_color_120,face_color_trans_120,
+         0.15,MIN_EDGE_DEPTH_120,MAX_EDGE_DEPTH_120,MIN_FACE_DEPTH_120,
+         MAX_FACE_DEPTH_120);
+
+  /* 600-cell. */
+  colors(vert_600,edge_600,NUM_EDGE_600,(int *)face_600,NUM_FACE_600,
+         VERT_PER_FACE_600,edge_color_600,face_color_600,face_color_trans_600,
+         0.06,MIN_EDGE_DEPTH_600,MAX_EDGE_DEPTH_600,MIN_FACE_DEPTH_600,
+         MAX_FACE_DEPTH_600);
+}
+
+
+static void init(ModeInfo *mi)
+{
+  static float light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+  static float light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+  static float light_specular[] = { 0.0, 0.0, 0.0, 1.0 };
+  static float light_position[] = { 0.0, 0.0, 1.0, 0.0 };
+  static float mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+
+  set_colors();
+
+  alpha = 0.0;
+  beta = 0.0;
+  delta = 0.0;
+  zeta = 0.0;
+  eta = 0.0;
+  theta = 0.0;
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  if (projection_3d == DISP_3D_PERSPECTIVE)
+    gluPerspective(60.0,1.0,0.1,100.0);
+  else
+    glOrtho(-1.0,1.0,-1.0,1.0,0.1,100.0);;
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+
+  if (display_mode == DISP_WIREFRAME)
+  {
+    glDisable(GL_DEPTH_TEST);
+    glDisable(GL_LIGHTING);
+    glDisable(GL_LIGHT0);
+    glDisable(GL_BLEND);
+  }
+  else if (display_mode == DISP_SURFACE)
+  {
+    glEnable(GL_DEPTH_TEST);
+    glDepthFunc(GL_LESS);
+    glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+    glEnable(GL_LIGHTING);
+    glEnable(GL_LIGHT0);
+    glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+    glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+    glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+    glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+    glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+    glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,0.0);
+    glDepthMask(GL_TRUE);
+    glDisable(GL_BLEND);
+  }
+  else if (display_mode == DISP_TRANSPARENT)
+  {
+    glDisable(GL_DEPTH_TEST);
+    glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
+    glEnable(GL_LIGHTING);
+    glEnable(GL_LIGHT0);
+    glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
+    glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
+    glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
+    glLightfv(GL_LIGHT0,GL_POSITION,light_position);
+    glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_specular);
+    glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,0.0);
+    glDepthMask(GL_FALSE);
+    glEnable(GL_BLEND);
+    glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+  }
+  else
+  {
+    glDisable(GL_DEPTH_TEST);
+    glDisable(GL_LIGHTING);
+    glDisable(GL_LIGHT0);
+    glDisable(GL_BLEND);
+  }
+}
+
+
+/* Redisplay the polytopes. */
+static void display_polytopes(ModeInfo *mi)
+{
+  alpha += speed_wx;
+  if (alpha >= 360.0)
+    alpha -= 360.0;
+  beta += speed_wy;
+  if (beta >= 360.0)
+    beta -= 360.0;
+  delta += speed_wz;
+  if (delta >= 360.0)
+    delta -= 360.0;
+  zeta += speed_xy;
+  if (zeta >= 360.0)
+    zeta -= 360.0;
+  eta += speed_xz;
+  if (eta >= 360.0)
+    eta -= 360.0;
+  theta += speed_yz;
+  if (theta >= 360.0)
+    theta -= 360.0;
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  if (projection_3d == DISP_3D_ORTHOGRAPHIC)
+  {
+    if (aspect >= 1.0)
+      glOrtho(-aspect,aspect,-1.0,1.0,0.1,100.0);
+    else
+      glOrtho(-1.0,1.0,-1.0/aspect,1.0/aspect,0.1,100.0);
+  }
+  else
+  {
+    gluPerspective(60.0,aspect,0.1,100.0);
+  }
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+
+  {
+    static int tick = 0;
+    static int p;
+
+    if (tick == 0)
+      {
+        if (polytope == POLYTOPE_RANDOM)
+          p = random() % (POLYTOPE_LAST_CELL+1);
+        else
+          p = polytope;
+      }
+    if (++tick > 1000) tick = 0;
+
+    if (p == POLYTOPE_5_CELL)
+      cell_5(mi);
+    else if (p == POLYTOPE_8_CELL)
+      cell_8(mi);
+    else if (p == POLYTOPE_16_CELL)
+      cell_16(mi);
+    else if (p == POLYTOPE_24_CELL)
+      cell_24(mi);
+    else if (p == POLYTOPE_120_CELL)
+      cell_120(mi);
+    else if (p == POLYTOPE_600_CELL)
+      cell_600(mi);
+    else
+      abort();
+  }
+}
+
+
+void reshape_polytopes(ModeInfo * mi, int width, int height)
+{
+  polytopesstruct *hp = &poly[MI_SCREEN(mi)];
+
+  hp->WindW = (GLint)width;
+  hp->WindH = (GLint)height;
+  glViewport(0,0,width,height);
+  aspect = (GLfloat)width/(GLfloat)height;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ *    Xlock hooks.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ *-----------------------------------------------------------------------------
+ *    Initialize polytopes.  Called each time the window changes.
+ *-----------------------------------------------------------------------------
+ */
+
+void init_polytopes(ModeInfo * mi)
+{
+  polytopesstruct *hp;
+
+  if (poly == NULL)
+  {
+    poly = (polytopesstruct *)calloc(MI_NUM_SCREENS(mi),
+                                     sizeof(polytopesstruct));
+    if (poly == NULL)
+      return;
+  }
+  hp = &poly[MI_SCREEN(mi)];
+
+  if ((hp->glx_context = init_GL(mi)) != NULL)
+  {
+    reshape_polytopes(mi,MI_WIDTH(mi),MI_HEIGHT(mi));
+    glDrawBuffer(GL_BACK);
+    init(mi);
+  }
+  else
+  {
+    MI_CLEARWINDOW(mi);
+  }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ *    Called by the mainline code periodically to update the display.
+ *-----------------------------------------------------------------------------
+ */
+void draw_polytopes(ModeInfo * mi)
+{
+  Display         *display = MI_DISPLAY(mi);
+  Window          window = MI_WINDOW(mi);
+  polytopesstruct *hp;
+
+  if (poly == NULL)
+    return;
+  hp = &poly[MI_SCREEN(mi)];
+
+  MI_IS_DRAWN(mi) = True;
+  if (!hp->glx_context)
+    return;
+
+  glXMakeCurrent(display,window,*(hp->glx_context));
+
+  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+  glLoadIdentity();
+
+  display_polytopes(mi);
+
+  if (MI_IS_FPS(mi))
+    do_fps (mi);
+
+  glFlush();
+
+  glXSwapBuffers(display,window);
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ *    The display is being taken away from us.  Free up malloc'ed 
+ *      memory and X resources that we've alloc'ed.  Only called
+ *      once, we must zap everything for every screen.
+ *-----------------------------------------------------------------------------
+ */
+
+void release_polytopes(ModeInfo * mi)
+{
+  if (poly != NULL)
+  {
+    int screen;
+
+    for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
+    {
+      polytopesstruct *hp = &poly[screen];
+
+      if (hp->glx_context)
+        hp->glx_context = (GLXContext *)NULL;
+    }
+    (void) free((void *)poly);
+    poly = (polytopesstruct *)NULL;
+  }
+  FreeAllGL(mi);
+}
+
+void change_polytopes(ModeInfo * mi)
+{
+  polytopesstruct *hp = &poly[MI_SCREEN(mi)];
+
+  if (!hp->glx_context)
+    return;
+
+  glXMakeCurrent(MI_DISPLAY(mi),MI_WINDOW(mi),*(hp->glx_context));
+  init(mi);
+}
+
+#endif /* USE_GL */
diff --git a/hacks/glx/polytopes.man b/hacks/glx/polytopes.man
new file mode 100644 (file)
index 0000000..71d2aae
--- /dev/null
@@ -0,0 +1,196 @@
+.TH XScreenSaver 1 "" "X Version 11"
+.SH NAME
+polytopes - Draws one of the six regular 4d polytopes rotating in 4d.
+.SH SYNOPSIS
+.B polytopes
+[\-display \fIhost:display.screen\fP]
+[\-install]
+[\-visual \fIvisual\fP]
+[\-window]
+[\-root]
+[\-delay \fIusecs\fP]
+[\-fps]
+[\-5-cell]
+[\-8-cell]
+[\-16-cell]
+[\-24-cell]
+[\-120-cell]
+[\-600-cell]
+[\-mesh]
+[\-surface]
+[\-transparent]
+[\-single-color]
+[\-depth-colors]
+[\-perspective-3d]
+[\-orthographic-3d]
+[\-perspective-4d]
+[\-orthographic-4d]
+[\-speed-wx \fIfloat\fP]
+[\-speed-wy \fIfloat\fP]
+[\-speed-wz \fIfloat\fP]
+[\-speed-xy \fIfloat\fP]
+[\-speed-xz \fIfloat\fP]
+[\-speed-yz \fIfloat\fP]
+.SH DESCRIPTION
+The \fIpolytopes\fP program shows one of the six regular 4d polytopes
+(5-cell, 8-cell, 16-cell, 24-cell, 120-cell, or 600-cell) rotating in
+4d.  The program projects the 4d polytope to 3d using either a
+perspective or an orthographic projection.  The projected 3d polytope
+can then be projected to the screen either perspectively or
+orthographically.  There are three display modes for the polytope:
+mesh (wireframe), solid, or transparent.  Furthermore, the colors with
+which the polytope is drawn can be set to either single color or to a
+coloring according to the 4d "depth" (the w coordinate) of the
+polytope in its unrotated position.  In the first case, the polytope
+is drawn in red.  This coloring combined with transparency gives a
+nice visual effect of the structure of the polytope.  The second mode
+draws the polytope with a fully saturated color wheel in which the
+edges or faces are colored accoring to their average 4d "depth".  This
+mode is best combined with the wireframe mode, where it allows you to
+see how different parts of the polytope are moved to the "inside" of
+the projected polytope in 3d.  Of course, in 4d the cells, faces, and
+edges of the polytope all have the same distance from the center of
+the polytope.  Only the projection creates the appearance that some of
+the cells lie "inside" the figure in 3d.
+.SH OPTIONS
+.I polytopes
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the
+animation.  Default 25000, or 1/40th second.
+.PP
+The following six options are mutually exclusive.  They determine
+which polytope is displayed.
+.TP 8
+.B \-5-cell
+Display the 5-cell.  The 5-cell is the 4d analogon of a regular
+tetrahedron in 3d.  It has 5 regular tetrahedra as its cells, 10
+equilateral triangles as faces, 10 edges, and 5 vertices.
+.TP 8
+.B \-8-cell
+Display the 8-cell (a.k.a. hypercube or tessaract).  The 8-cell is the
+4d analogon of a cube in 3d.  It has 8 cubes as its cells, 24 squares
+as faces, 32 edges, and 16 vertices.
+.TP 8
+.B \-16-cell
+Display the 16-cell.  The 16-cell is the 4d analogon of an octahedron
+in 3d.  It has 16 regular tetrahedra as its cells, 32 equilateral
+triangles as faces, 24 edges, and 8 vertices.
+.TP 8
+.B \-24-cell
+Display the 24-cell.  The 24-cell has no 3d analogon.  It has 24
+regular octahedra as its cells, 96 equilateral triangles as faces, 96
+edges, and 24 vertices.
+.TP 8
+.B \-120-cell
+Display the 120-cell.  The 120-cell has no 3d analogon.  It has 120
+regular dodecahedra as its cells, 720 regular pentagons as faces, 1200
+edges, and 600 vertices.
+.TP 8
+.B \-600-cell
+Display the 600-cell.  The 600-cell has no 3d analogon.  It has 600
+regular tetrahedra as its cells, 1200 equilateral triangles as faces,
+720 edges, and 120 vertices.
+.PP
+The following three options are mutually exclusive.  They determine
+how the polytope is displayed.
+.TP 8
+.B \-mesh
+Display the polytope as a wireframe mesh (default).
+.TP 8
+.B \-surface
+Display the polytope as a solid object.
+.TP 8
+.B \-transparent
+Display the polytope as a transparent object.
+.PP
+The following two options are mutually exclusive.  They determine how
+to color the polytope.
+.TP 8
+.B \-single-color
+Display the polytope in red.
+.TP 8
+.B \-depth-colors
+Display the polytope with a fully saturated color wheel in which the
+edges or faces are colored accoring to their average 4d "depth", i.e.,
+the w coordinate of the polytope in its unrotated position (default).
+.PP
+The following two options are mutually exclusive.  They determine how
+the polytope is projected from 3d to 2d (i.e., to the screen).
+.TP 8
+.B \-perspective-3d
+Project the polytope from 3d to 2d using a perspective projection
+(default).
+.TP 8
+.B \-orthographic-3d
+Project the polytope from 3d to 2d using an orthographic projection.
+.PP
+The following two options are mutually exclusive.  They determine how
+the polytope is projected from 4d to 3d.
+.TP 8
+.B \-perspective-4d
+Project the polytope from 4d to 3d using a perspective projection
+(default).
+.TP 8
+.B \-orthographic-4d
+Project the polytope from 4d to 3d using an orthographic projection.
+.PP
+The following six options determine the rotation speed of the polytope
+around the six possible hyperplanes.  The rotation speed is measured
+in degrees per frame.  The speeds should be set to relatively small
+values, e.g., less than 4 in magnitude.
+.TP 8
+.B \-speed-xw \fIfloat\fP
+Rotation speed around the wx plane (default: 1.1).
+.TP 8
+.B \-speed-xy \fIfloat\fP
+Rotation speed around the wy plane (default: 1.3).
+.TP 8
+.B \-speed-wz \fIfloat\fP
+Rotation speed around the wz plane (default: 1.5).
+.TP 8
+.B \-speed-xy \fIfloat\fP
+Rotation speed around the xy plane (default: 1.7).
+.TP 8
+.B \-speed-xz \fIfloat\fP
+Rotation speed around the xz plane (default: 1.9).
+.TP 8
+.B \-speed-yz \fIfloat\fP
+Rotation speed around the yz plane (default: 2.1).
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 2003 by Carsten Steger.  Permission to use, copy,
+modify, distribute, and sell this software and its documentation for
+any purpose is hereby granted without fee, provided that the above
+copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the suitability of this software for
+any purpose.  It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Carsten Steger <carsten@mirsanmir.org>, 10-aug-2003.
index 0e99abbe26ee0aa911bedf9e4e99b003cb996a6c..f4535670bf7250c0d1ebd70326b1b07da55a8fd4 100644 (file)
@@ -266,7 +266,7 @@ void Create_Texture(ModeInfo *mi, const char *filename)
     {
       XImage *ximage = xpm_file_to_ximage (MI_DISPLAY (mi), MI_VISUAL (mi),
                                            MI_COLORMAP (mi), filename);
-      image  = ximage->data;
+      image  = (GLubyte *) ximage->data;
       width  = ximage->width;
       height = ximage->height;
       format = GL_RGBA;
@@ -301,7 +301,7 @@ void Create_Texture(ModeInfo *mi, const char *filename)
                                  GL_UNSIGNED_BYTE, image);
       if (status)
         {
-          const char *s = gluErrorString (status);
+          const char *s = (char *) gluErrorString (status);
           fprintf (stderr, "%s: error mipmapping %dx%d texture: %s\n",
                    progname, width, height,
                    (s ? s : "(unknown)"));
index ba14cc7be888a03cbc4dde3f4d29edaf1b2170c7..7862ea725e4921f75a7b8cb5ce499f340f6d91ae 100644 (file)
@@ -92,14 +92,16 @@ static Queenscreen *qs = NULL;
 #define QUEEN 1
 #define MINBOARD 5
 #define MAXBOARD 10
-#define COLORSETS 3
+#define COLORSETS 5
 
 /* definition of white/black colors */
 GLfloat colors[COLORSETS][2][3] = 
   { 
+    {{0.43, 0.54, 0.76}, {0.8, 0.8, 0.8}},
     {{0.5, 0.7, 0.9}, {0.2, 0.3, 0.6}},
     {{0.53725490196, 0.360784313725, 0.521568627451}, {0.6, 0.6, 0.6}},
-    {{1.0, 0.5, 0.0}, {0.5, 0.5, 0.5}},
+    {{0.15, 0.77, 0.54}, {0.5, 0.5, 0.5}},
+    {{0.9, 0.45, 0.0}, {0.5, 0.5, 0.5}},
   };
 
 int board[MAXBOARD][MAXBOARD];
@@ -207,13 +209,36 @@ int findSolution(int row, int col) {
 /** driver for finding solution */
 void go(void) { while(!findSolution(0, random()%BOARDSIZE)); }
 
+/* lighting variables */
+GLfloat front_shininess[] = {80.0};
+GLfloat front_specular[] = {0.5, 0.5, 0.5, 1.0};
+GLfloat ambient[] = {0.5, 0.5, 0.5, 1.0};
+GLfloat ambient2[] = {0.1, 0.1, 0.1, 1.0};
+GLfloat diffuse[] = {0.7, 0.7, 0.7, 1.0};
+GLfloat position0[] = {0.0, 7.0, 0.0, 1.0};
+GLfloat position1[] = {8.0, 7.0, 8.0, 1.0};
+GLfloat lmodel_ambient[] = {0.6, 0.6, 0.6, 1.0};
+GLfloat lmodel_twoside[] = {GL_TRUE};
+
 /* configure lighting */
 void setup_lights(void) {
-  GLfloat position[] = { 4.0, 8.0, 4.0, 1.0 };
 
+  /* setup twoside lighting */
+  glLightfv(GL_LIGHT0, GL_AMBIENT, ambient2);
+  glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+  glLightfv(GL_LIGHT0, GL_POSITION, position0);
+  glLightfv(GL_LIGHT1, GL_AMBIENT, ambient2);
+  glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+  glLightfv(GL_LIGHT1, GL_POSITION, position1);
   glEnable(GL_LIGHTING);
-  glLightfv(GL_LIGHT0, GL_POSITION, position);
   glEnable(GL_LIGHT0);
+  glEnable(GL_LIGHT1);
+
+  /* setup material properties */
+  glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 }
 
 /* return alpha value for fading */
@@ -228,7 +253,7 @@ void drawPieces(void) {
   for(i = 0; i < BOARDSIZE; ++i) {
     for(j = 0; j < BOARDSIZE; ++j) {
       if(board[i][j]) {
-       glColor3fv(colors[colorset][i%2]);
+       glColor3fv(colors[colorset][i%2]);      
        glCallList(QUEEN);
       }
       
@@ -239,6 +264,53 @@ void drawPieces(void) {
   }
 }
 
+/** reflectionboard */
+void draw_reflections(void) {
+  int i, j;
+
+  glEnable(GL_STENCIL_TEST);
+  glStencilFunc(GL_ALWAYS, 1, 1);
+  glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
+  glColorMask(0,0,0,0);
+  glDisable(GL_CULL_FACE);
+
+  glDisable(GL_DEPTH_TEST);
+  glBegin(GL_QUADS);
+
+  /* only draw white squares */
+  for(i = 0; i < BOARDSIZE; ++i) {
+    for(j = (BOARDSIZE+i) % 2; j < BOARDSIZE; j += 2) {
+      glVertex3f(i, 0.0, j + 1.0);
+      glVertex3f(i + 1.0, 0.0, j + 1.0);
+      glVertex3f(i + 1.0, 0.0, j);
+      glVertex3f(i, 0.0, j);
+    }
+  }
+  glEnd();
+  glEnable(GL_DEPTH_TEST);
+
+  glColorMask(1, 1, 1, 1);
+  glStencilFunc(GL_EQUAL, 1, 1);
+  glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+  
+  glPushMatrix(); 
+  glScalef(1.0, -1.0, 1.0);
+  glTranslatef(0.5, 0.001, 0.5);
+  glLightfv(GL_LIGHT0, GL_POSITION, position0);
+  glLightfv(GL_LIGHT1, GL_POSITION, position1);
+  drawPieces();
+  glPopMatrix();
+  glDisable(GL_STENCIL_TEST);
+
+  /* replace lights */
+  glLightfv(GL_LIGHT0, GL_POSITION, position0);
+  glLightfv(GL_LIGHT1, GL_POSITION, position1);
+
+  glEnable(GL_CULL_FACE);
+  glCullFace(GL_BACK);
+  glColorMask(1,1,1,1);
+}
+
 /* draw board */
 void drawBoard(void) {
   int i, j;
@@ -248,19 +320,15 @@ void drawBoard(void) {
   for(i = 0; i < BOARDSIZE; ++i)
     for(j = 0; j < BOARDSIZE; ++j) {
       int par = (i-j+BOARDSIZE)%2;
-      glColor3fv(colors[colorset][par]);
+      glColor4f(colors[colorset][par][0],
+               colors[colorset][par][1],
+               colors[colorset][par][2],
+               0.60);
       glNormal3f(0.0, 1.0, 0.0);
       glVertex3f(i, 0.0, j + 1.0);
       glVertex3f(i + 1.0, 0.0, j + 1.0);
       glVertex3f(i + 1.0, 0.0, j);
       glVertex3f(i, 0.0, j);
-
-      /* draw the bottom, too */
-      glNormal3f(0.0, -1.0, 0.0);
-      glVertex3f(i, 0.0, j);
-      glVertex3f(i + 1.0, 0.0, j);
-      glVertex3f(i + 1.0, 0.0, j + 1.0);
-      glVertex3f(i, 0.0, j + 1.0);
     }
 
   glEnd();
@@ -274,7 +342,12 @@ void display(Queenscreen *c) {
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
 
-  glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.8/(0.01+findAlpha()));
+  glEnable(GL_LIGHTING);
+  glEnable(GL_COLOR_MATERIAL);
+  glLightfv(GL_LIGHT0, GL_POSITION, position0);
+  glLightfv(GL_LIGHT1, GL_POSITION, position1);
+  glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 1.0/(0.01+findAlpha()));
+  glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.0/(0.01+findAlpha()));
 
   /** setup perspectif */
   glTranslatef(0.0, 0.0, -1.5*BOARDSIZE);
@@ -283,11 +356,22 @@ void display(Queenscreen *c) {
   glRotatef(theta*100, 0.0, 1.0, 0.0);
   glTranslatef(-0.5*BOARDSIZE, 0.0, -0.5*BOARDSIZE);
 
+  /* draw reflections */
+  draw_reflections();
+  glEnable(GL_BLEND);
   drawBoard();
-  glTranslatef(0.5, 0.01, 0.5);  
+  glDisable(GL_BLEND);
+
+  position1[0] = BOARDSIZE+2.0;
+  position1[2] = BOARDSIZE+2.0;
+  glLightfv(GL_LIGHT0, GL_POSITION, position0);
+  glLightfv(GL_LIGHT1, GL_POSITION, position1);
+
+  glTranslatef(0.5, 0.0, 0.5);
   drawPieces();
 
-  if (!c->button_down_p)
+  /* rotate camera */
+  if(!c->button_down_p)
     theta += .002;
 
   /* zero out board, find new solution of size MINBOARD <= i <= MAXBOARD */
@@ -366,7 +450,7 @@ void init_queens(ModeInfo *mi) {
     MI_CLEARWINDOW(mi);
 
   glClearColor(0.0, 0.0, 0.0, 0.0);
-  glNewList(1, GL_COMPILE);
+  glNewList(QUEEN, GL_COMPILE);
   draw_model(schunks, spidermodel, 24);
   glEndList();
   
@@ -379,6 +463,7 @@ void init_queens(ModeInfo *mi) {
     setup_lights();
     glEnable(GL_DEPTH_TEST);
     clearbits |= GL_DEPTH_BUFFER_BIT;
+    clearbits |= GL_STENCIL_BUFFER_BIT;
     glEnable(GL_CULL_FACE);
     glCullFace(GL_BACK);
   }
index ad77d8c4d5b118060d79227da130f90cfbaed100..442bcb05d2ddbb74a727eba55c382e1efa586429 100644 (file)
@@ -74,16 +74,25 @@ static const char sccsid[] = "@(#)sballs.c  5.02 2001/03/10 xlockmore";
 
 #if defined( USE_XPM ) || defined( USE_XPMINC ) || defined( HAVE_XPM )
 /* USE_XPM & USE_XPMINC in xlock mode ; HAVE_XPM in xscreensaver mode */
-#include "xpm-ximage.h"
-#define I_HAVE_XPM
-
-#ifdef STANDALONE
-#include "../images/sball.xpm"
-#include "../images/sball-bg.xpm"
-#else /* !STANDALONE */
-#include "pixmaps/sball.xpm"
-#include "pixmaps/sball-bg.xpm"
-#endif /* !STANDALONE */
+# include "xpm-ximage.h"
+# define I_HAVE_XPM
+
+# ifdef STANDALONE
+
+#  ifdef __GNUC__
+   __extension__ /* don't warn about "string length is greater than the length
+                    ISO C89 compilers are required to support" when including
+                    the following XPM file... */
+#  endif
+#  include "../images/sball.xpm"
+#  ifdef __GNUC__
+   __extension__
+#  endif
+#  include "../images/sball-bg.xpm"
+# else /* !STANDALONE */
+#  include "pixmaps/sball.xpm"
+#  include "pixmaps/sball-bg.xpm"
+# endif /* !STANDALONE */
 #endif /* HAVE_XPM */
 
 /* Manage option vars */
index 6832bf4117bc0d48f34acad2a58f71ac3a0edf3b..33e73ab03f9318af5d9bb557ce9b6ca1c8948e88 100644 (file)
@@ -473,7 +473,7 @@ pinit(void)
                                GL_RGB, GL_UNSIGNED_BYTE, WoodTextureData);
     if (status)
       {
-        const char *s = gluErrorString (status);
+        const char *s = (char *) gluErrorString (status);
         fprintf (stderr, "%s: error mipmapping %dx%d texture: %s\n",
                  progname, WoodTextureWidth, WoodTextureHeight,
                  (s ? s : "(unknown)"));
index 1f27a7ebf26e1e67d635dd573b616974a3ede196..3853007f449f2afd4bf731fc687bf7b03f0b6fdb 100644 (file)
@@ -898,7 +898,9 @@ draw_sws (ModeInfo *mi)
             }
 
           if (alignment >= 0)
-            xoff = 1.0 - (glutStrokeLength(GLUT_FONT, line) * sc->font_scale);
+            xoff = 1.0 - (glutStrokeLength(GLUT_FONT,
+                                           (unsigned char *) line)
+                          * sc->font_scale);
           if (alignment == 0)
             xoff /= 2;
 
index a524e7659adb6ed55495592577e1176e08503fb7..37c38eebc516f72df3ae536d83cc18c646244c74 100644 (file)
@@ -165,6 +165,7 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap,
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
+#if 0
 static Bool
 bigendian (void)
 {
@@ -172,6 +173,7 @@ bigendian (void)
   u.i = 1;
   return !u.c[0];
 }
+#endif
 
 
 /* The libxpm version of this function...
@@ -267,9 +269,15 @@ xpm_to_ximage_1 (Display *dpy, Visual *visual, Colormap cmap,
        things as necessary) OpenGL pretends everything is client-side, so
        we need to pack things in the right order for the client machine.
      */
+#if 0
+    /* #### Cherub says that the little-endian case must be taken on MacOSX,
+            or else the colors/alpha are the wrong way around.  How can
+            that be the case?
+     */
     if (bigendian())
       rpos = 24, gpos = 16, bpos =  8, apos =  0;
     else
+#endif
       rpos =  0, gpos =  8, bpos = 16, apos = 24;
 
     for (y = 0; y < xpm_image.height; y++)
index 4a17ba36f114d7f6bd1b0bafc7a8929511f84cce..0f0747d17035ea1975115d1f25fb2c317968ee55 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1997, 1998
+/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1997, 1998, 2003
  *  Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
 
 #define stipple_width  16
 #define stipple_height 4
-static char stipple_bits[] = { 0x55, 0x55, 0xee, 0xee, 0x55, 0x55, 0xba, 0xbb};
+static unsigned char stipple_bits[] = {
+  0x55, 0x55, 0xee, 0xee, 0x55, 0x55, 0xba, 0xbb};
 
 #define cross_weave_width  16
 #define cross_weave_height 16
-static char cross_weave_bits[] = {
+static unsigned char cross_weave_bits[] = {
    0x55, 0x55, 0x88, 0x88, 0x55, 0x55, 0x22, 0x22, 0x55, 0x55, 0x88, 0x88,
    0x55, 0x55, 0x22, 0x22, 0x55, 0x55, 0x88, 0x88, 0x55, 0x55, 0x22, 0x22,
    0x55, 0x55, 0x88, 0x88, 0x55, 0x55, 0x22, 0x22};
 
 #define dimple1_width 16
 #define dimple1_height 16
-static char dimple1_bits[] = {
+static unsigned char dimple1_bits[] = {
    0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
    0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00,
    0x55, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00};
 
 #define dimple3_width 16
 #define dimple3_height 16
-static char dimple3_bits[] = {
+static unsigned char dimple3_bits[] = {
    0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
@@ -110,7 +111,8 @@ init_greynetic (Display *dpy, Window window)
 
   i = 0;
 #define BITS(n,w,h) \
-  pixmaps [i++] = XCreatePixmapFromBitmapData (dpy, window, n, w, h, 1, 0, 1)
+  pixmaps [i++] = \
+    XCreatePixmapFromBitmapData (dpy, window, (char *) n, w, h, 1, 0, 1)
 
   BITS (stipple_bits, stipple_width, stipple_height);
   BITS (cross_weave_bits, cross_weave_width, cross_weave_height);
index 6c5ca973d4a70b81c68574f89700ff543d5e387c..89f7081239502d128605d67e3bc1e235f4e26cb2 100644 (file)
@@ -9,9 +9,9 @@
  * implied warranty.
  *
  * Description:
- * Draws the gravity force in each point on the screen seen through a
- * halftone dot pattern. The gravity force is calculated from a set of
- * moving mass points. View it from a distance for best effect.
+ * Draws the gravitational force in each point on the screen seen
+ * through a halftone dot pattern. The force is calculated from a set
+ * of moving mass points. View it from a distance for best effect.
  */
 
 #include <math.h>
index 7cab38d68b531bd635b6723b28cf7d6ea29db3a2..2c002b54b994a4523a51efdc486aa5df9a2949bd 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1993, 1995, 1996, 1997, 1998, 1999
+/* xscreensaver, Copyright (c) 1993, 1995, 1996, 1997, 1998, 1999, 2003
  *  Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -396,7 +396,7 @@ run_circles (Display *dpy, Window window)
 
       if (cycle_p && cycle_delay)
        {
-         int i = 0;
+          i = 0;
          while (i < d)
            {
              rotate_colors (dpy, cmap, colors, ncolors, direction);
index 57c2aa454661aba448c7ba31b49e0b2a2bae30eb..97f4c38235b0e45cb39d121fb96096fbb09a6ea7 100644 (file)
@@ -1,6 +1,6 @@
 #define atari_width 17
 #define atari_height 14
-static char atari_bits[] = {
+static unsigned char atari_bits[] = {
  0x30,0x00,0x00,0x4a,0x00,0x00,0x80,0x00,0x00,0x09,0x01,0x00,0xc4,0x07,0x00,
  0xc0,0x07,0x00,0xf0,0x1f,0x00,0xf8,0x3f,0x00,0xd8,0x3f,0x00,0xfc,0x7f,0x00,
  0xfc,0x7b,0x00,0xf8,0x3b,0x00,0xf8,0x3d,0x00,0xf0,0x1f,0x00};
index 6c5cc2c95df7190652b795bcb4aed208dbe08865..4ca07c7eca3f49155105f6fe21a32529d8a76656 100644 (file)
@@ -1,5 +1,5 @@
 /* XPM */
-static char * envImage_xpm[] = {
+static char * blocktube_xpm[] = {
 "256 256 61 1",
 "      c None",
 ".     c #060606",
index c6532765f3376311dafb4a94ce491421c90f7f4e..76aba4a605047ae35621571708bb7f9ec5e70fe4 100644 (file)
@@ -1,6 +1,6 @@
 #define macbomb_width 448
 #define macbomb_height 126
-static char macbomb_bits[] = {
+static unsigned char macbomb_bits[] = {
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
index add8a7ddb84610473270db820767a42add840019..2650ad27cf483ac2dafe6d76f2c1a93c354332b8 100644 (file)
@@ -1132,7 +1132,6 @@ init_juggle(ModeInfo * mi)
        }
        if (pattern == NULL && patternindex == NULL) {
          /* pattern list needs indexing */
-         int i;
          int nelements = sizeof(portfolio)/sizeof(patternstruct);
          int maxballs;
          int numpat = 0;
index b7004851d85aab09641235987fc35539dfc3b7be..fa908c06385355c6c0a5f0e44b5aea9cd8e7541b 100644 (file)
@@ -68,7 +68,7 @@ XrmOptionDescRec options [] = {
        {0,0,0,0}
 };
 
-const char colors[96]=
+const unsigned char colors[96]=
        {0,0,255, 0,51,255, 0,102,255, 0,153,255, 0,204,255,
        0,255,255,0,255,204, 0,255,153, 0,255,102, 0,255,51,
        0,255,0, 51,255,0, 102,255,0, 153,255,0, 204,255,0,
index 9efb19e80bec89674ad7de29605a9f2fc0b5a737..cc8047936b79cfc6224c0978ca6d73c0d6c0e136 100644 (file)
@@ -225,7 +225,7 @@ static void Initialize( Display *pDisplay, Window Win, GC *pGC, XImage **ppImage
 
        /* Find the preferred bits-per-pixel. (jwz) */
        {
-               int i, pfvc = 0;
+               int pfvc = 0;
                XPixmapFormatValues *pfv = XListPixmapFormats( pDisplay, &pfvc );
                for( i=0; i<pfvc; i++ )
                        if( pfv[ i ].depth == XWinAttribs.depth )
index 0b8f7900076873a8efa05b5124eebeaf7fda0643..3d1fbe12d0e9ef0b087229700c4a234720148cd5 100644 (file)
@@ -21,7 +21,7 @@ phosphor - simulates an old terminal with long-sustain phosphor
 [\-ticks \fIint\fP] [\-delay \fIusecs\fP] [\-program \fIcommand\fP]
 .SH DESCRIPTION
 The \fIphosphor\fP program draws text on the screen in a very large 
-pixellated font that looks like an old low resolution dumb tty.  The
+pixelated font that looks like an old low resolution dumb tty.  The
 pixels flare and fade out as if the phosphor was very long-sustain.
 .SH OPTIONS
 .I phosphor
@@ -41,7 +41,7 @@ Specify which visual to use.  Legal values are the name of a visual class,
 or the id number (decimal or hex) of a specific visual.
 .TP 8
 .B \-font \fIfont-name\fP
-The X font to use.  Phosphor can take any font and scale it up to pixellate
+The X font to use.  Phosphor can take any font and scale it up to pixelate
 it.  The default is \fIfixed\fP.
 .TP 8
 .B \-scale \fIint\fP
index e380c2711ff35fb3ad3afef57221e707019b006c..071786a0511f85b05b16b54063cb190b1b49755a 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998, 1999
+/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998, 1999, 2003
  *  Jamie Zawinski <jwz@jwz.org>
  *
  *  reaction/diffusion textures
@@ -139,10 +139,10 @@ pixack_frame(char *pix_buf)
   if (!(frame%epoch_time)) {
     int s;
     if (0 != frame) {
-      int t = epoch_time / 500;
-      if (t > 15)
-       t = 15;
-      sleep(t);
+      int tt = epoch_time / 500;
+      if (tt > 15)
+       tt = 15;
+      sleep(tt);
     }
          
     for (i = 0; i < npix; i++) {
@@ -379,7 +379,7 @@ screenhack (Display *dpy, Window win)
   double array_x, array_y;
   double array_dx, array_dy;
   int w2;
-  char *p;
+  char *pd;
   int vdepth;
   int npix;
 #ifdef HAVE_XSHM_EXTENSION
@@ -497,8 +497,8 @@ screenhack (Display *dpy, Window win)
     }
   }
 
-  p = malloc(npix * (pdepth == 1 ? 1 : (pdepth / 8)));
-  if (!p) {
+  pd = malloc(npix * (pdepth == 1 ? 1 : (pdepth / 8)));
+  if (!pd) {
     fprintf(stderr, "not enough memory for %d pixels.\n", npix);
     exit(1);
   }
@@ -514,8 +514,8 @@ screenhack (Display *dpy, Window win)
        use_shm = False;
       else
        {
-         free(p);
-         p = image->data;
+         free(pd);
+         pd = image->data;
        }
     }
 #endif /* HAVE_XSHM_EXTENSION */
@@ -523,7 +523,7 @@ screenhack (Display *dpy, Window win)
   if (!image)
     {
       image = XCreateImage(dpy, xgwa.visual, vdepth,
-                          ZPixmap, 0, p,
+                          ZPixmap, 0, pd,
                           width, height, 8, 0);
     }
 
@@ -531,7 +531,7 @@ screenhack (Display *dpy, Window win)
     Bool bump = False;
 
     int i, j;
-    pixack_frame(p);
+    pixack_frame(pd);
     for (i = 0; i < array_width; i += width)
       for (j = 0; j < array_height; j += height)
 #ifdef HAVE_XSHM_EXTENSION
index 9f2ed3e2320210f54189c7a9b49cdfe73e08d359..e35b696b46d3cd7f5ab72af32c4b987d19f0ed8f 100644 (file)
@@ -1,6 +1,6 @@
 .TH XScreenSaver 1 "" "X Version 11"
 .SH NAME
-shadebobs - oscilating vapor trails.
+shadebobs - oscillating vapor trails.
 .SH SYNOPSIS
 .B shadebobs
 [\-display \fIhost:display.screen\fP]
@@ -12,7 +12,7 @@ shadebobs - oscilating vapor trails.
 [\-delay \fInumber\fP]
 [\-cycles \fInumber\fP]
 .SH DESCRIPTION
-This draws smoothly-shaded oscilating oval patterns, that look something
+This draws smoothly-shaded oscillating oval patterns, that look something
 like vapor trails or neon tubes.
 .SH OPTIONS
 .TP 8
index dde3a21a5936da401ef191753ed345557d72d877..ae08b2ca8a6e3f9d6a79f690230f0d1e774d90cb 100644 (file)
@@ -98,7 +98,7 @@ init_slide (Display *dpy, Window window)
        for(i = 0; i < max; i++)
          {
            long rd, gd, bd;
-           unsigned long d;
+           unsigned long dd;
            if (!fg_ok)
              {
                rd = (all[i].red   >> 8) - (fgc.red   >> 8);
@@ -107,12 +107,12 @@ init_slide (Display *dpy, Window window)
                if (rd < 0) rd = -rd;
                if (gd < 0) gd = -gd;
                if (bd < 0) bd = -bd;
-               d = (rd << 1) + (gd << 2) + bd;
-               if (d < fgd)
+               dd = (rd << 1) + (gd << 2) + bd;
+               if (dd < fgd)
                  {
-                   fgd = d;
+                   fgd = dd;
                    fg = all[i].pixel;
-                   if (d == 0)
+                   if (dd == 0)
                      fg_ok = True;
                  }
              }
@@ -125,12 +125,12 @@ init_slide (Display *dpy, Window window)
                if (rd < 0) rd = -rd;
                if (gd < 0) gd = -gd;
                if (bd < 0) bd = -bd;
-               d = (rd << 1) + (gd << 2) + bd;
-               if (d < bgd)
+               dd = (rd << 1) + (gd << 2) + bd;
+               if (dd < bgd)
                  {
-                   bgd = d;
+                   bgd = dd;
                    bg = all[i].pixel;
-                   if (d == 0)
+                   if (dd == 0)
                      bg_ok = True;
                  }
              }
index 0df716b6028b992ccb12c836ee9d556403716e27..add3d6f1442bfe06997a9986221b123940449903 100644 (file)
@@ -38,7 +38,7 @@
  * software for any purpose.  It is provided "as is" without express or 
  * implied warranty.
  *
- * $Revision: 1.24 $
+ * $Revision: 1.25 $
  *
  * Version 1.0 April 27, 1998.
  * - Initial version
@@ -1117,7 +1117,7 @@ getping(sonar_info *si, ping_info *pi)
     /* Local Variables */
 
     struct sockaddr from;
-    int fromlen;
+    unsigned int fromlen;
     int result;
     u_char packet[1024];
     struct timeval now;
@@ -1926,8 +1926,8 @@ parse_mode (Bool ping_works_p)
         }
 
 #ifdef HAVE_PING
-      if ((4 == sscanf (token, "%d.%d.%d/%d %c",    &n0,&n1,&n2,    &m,&d)) ||
-          (5 == sscanf (token, "%d.%d.%d.%d/%d %c", &n0,&n1,&n2,&n3,&m,&d)))
+      if ((4 == sscanf (token, "%u.%u.%u/%u %c",    &n0,&n1,&n2,    &m,&d)) ||
+          (5 == sscanf (token, "%u.%u.%u.%u/%u %c", &n0,&n1,&n2,&n3,&m,&d)))
         {
           /* subnet: A.B.C.D/M
              subnet: A.B.C/M
@@ -1935,7 +1935,7 @@ parse_mode (Bool ping_works_p)
           unsigned long ip = (n0 << 24) | (n1 << 16) | (n2 << 8) | n3;
           new = subnetHostsList(ip, m);
         }
-      else if (4 == sscanf (token, "%d.%d.%d.%d %c", &n0, &n1, &n2, &n3, &d))
+      else if (4 == sscanf (token, "%u.%u.%u.%u %c", &n0, &n1, &n2, &n3, &d))
         {
           /* IP: A.B.C.D
            */
@@ -1945,7 +1945,7 @@ parse_mode (Bool ping_works_p)
         {
           new = subnetHostsList(0, 24);
         }
-      else if (1 == sscanf (token, "subnet/%d %c", &m, &dummy))
+      else if (1 == sscanf (token, "subnet/%u %c", &m, &dummy))
         {
           new = subnetHostsList(0, m);
         }
index c913cef45803db5a80edc979747420c7bb187623..22f6cec6d60a2234ece3d724273d0d8bccef11e2 100755 (executable)
@@ -53,7 +53,7 @@ use bytes;  # Larry can take Unicode and shove it up his ass sideways.
 
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.103 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.104 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
 my $copyright = "WebCollage $version, Copyright (c) 1999-2002" .
     " Jamie Zawinski <jwz\@jwz.org>\n" .
     "            http://www.jwz.org/xscreensaver/\n";
@@ -337,6 +337,11 @@ sub get_document_1 {
       print S $hdrs;
       my $http = <S> || "";
 
+      # Kludge: the Yahoo Random Link is now returning as its first
+      # line "Status: 301" instead of "HTTP/1.0 301 Found".  Fix it...
+      #
+      $http =~ s@^Status:\s+(\d+)\b@HTTP/1.0 $1@i;
+
       $_  = $http;
       s/[\r\n]+$//s;
       LOG ($verbose_http, "  <== $_");
@@ -422,6 +427,7 @@ sub get_document {
 
     if ( $http =~ m@^HTTP/[0-9.]+ 30[123]@ ) {
       $_ = $head;
+
       my ( $location ) = m@^location:[ \t]*(.*)$@im;
       if ( $location ) {
         $location =~ s/[\r\n]$//;
@@ -982,7 +988,7 @@ sub pick_image_from_pages {
 ############################################################################
 
 # yahoorand
-my $yahoo_random_link = "http://random.yahoo.com/bin/ryl";
+my $yahoo_random_link = "http://random.yahoo.com/fast/ryl";
 
 
 # Picks a random page; picks a random image on that page;
index 7c88a932b8e9b34dabb31cd1b33915a9794269e4..99fef88b679fa2280ed9c91979301e34b4ce3010 100644 (file)
@@ -1,5 +1,5 @@
 /* webcollage-helper --- scales and pastes one image into another
- * xscreensaver, Copyright (c) 2002 Jamie Zawinski <jwz@jwz.org>
+ * xscreensaver, Copyright (c) 2002, 2003 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -302,7 +302,9 @@ add_jpeg_comment (struct jpeg_compress_struct *cinfo)
     "\r\n";
   char comment[sizeof(fmt) + 100];
   strftime (comment, sizeof(comment)-1, fmt, tm);
-  jpeg_write_marker (cinfo, JPEG_COM, comment, strlen (comment));
+  jpeg_write_marker (cinfo, JPEG_COM,
+                     (unsigned char *) comment,
+                     strlen (comment));
 }
 
 
index 12d31ffef519a10e73872545b0fe98311809b0e4..64907a7b5b9d186fd6717f83a65fa89d0926b02f 100644 (file)
@@ -329,7 +329,6 @@ xlockmore_screenhack (Display *dpy, Window window,
        goto MONO;
       else
        {
-         int i;
          mi.pixels = (unsigned long *)
            calloc (mi.npixels, sizeof (*mi.pixels));
          for (i = 0; i < mi.npixels; i++)
index dacf312c6549e3e5d9d7449f736aeee69f3dc695..f16cf3c3be6329f0e40132a5773244ed4a4521f5 100644 (file)
@@ -259,8 +259,8 @@ init_trace (m_state *state)
   if (!s)
     goto FAIL;
 
-  state->tracing = (char *) malloc (strlen (s) + 1);
-  s3 = state->tracing;
+  state->tracing = (signed char *) malloc (strlen (s) + 1);
+  s3 = (char *) state->tracing;
 
   for (s2 = s; *s2; s2++)
     if (*s2 >= '0' && *s2 <= '9')
@@ -270,7 +270,7 @@ init_trace (m_state *state)
   if (s3 == (char *) state->tracing)
     goto FAIL;
 
-  for (i = 0; i < strlen(state->tracing); i++)
+  for (i = 0; i < strlen((char *) state->tracing); i++)
     state->tracing[i] = -state->tracing[i];
 
   state->glyph_map = decimal_encoding;
@@ -556,7 +556,7 @@ redraw_cells (m_state *state, Bool active)
 
         if ((state->mode == TRACEA2 || state->mode == TRACEB2) && active)
           {
-            int xx = x % strlen(state->tracing);
+            int xx = x % strlen((char *) state->tracing);
             Bool dead_p = state->tracing[xx] > 0;
 
             if (y == 0 && x == xx)
@@ -1110,9 +1110,9 @@ hack_text (m_state *state)
           "\n"
           "RRF-CONTROL> ",
 
-          "\001disable grid nodes 21 - 40\n",
+          "\001disable grid nodes 21 - 48\n",
 
-          "\002Warning: Disabling nodes 21-40 will disconnect sector 11 "
+          "\002Warning: Disabling nodes 21-48 will disconnect sector 11 "
           "(27 nodes)\n"
           "\n"
           "\002         ARE YOU SURE? (y/n) ",
@@ -1142,7 +1142,7 @@ hack_text (m_state *state)
 
         typing_delay = False;
         long_delay = False;
-        for (j = 21; j <= 40; j++)
+        for (j = 21; j <= 48; j++)
           {
             char buf[100];
             sprintf (buf, "\002Grid Node %d offline...\n", j);
@@ -1236,7 +1236,7 @@ roll_state (m_state *state)
       {
         Bool any = False;
         int i;
-        for (i = 0; i < strlen(state->tracing); i++)
+        for (i = 0; i < strlen((char *) state->tracing); i++)
           if (state->tracing[i] < 0) any = True;
 
         if (!any)
@@ -1252,7 +1252,7 @@ roll_state (m_state *state)
           }
         else if ((random() % 20) == 0)  /* how fast numbers are discovered */
           {
-            int x = random() % strlen(state->tracing);
+            int x = random() % strlen((char *) state->tracing);
             if (state->tracing[x] < 0)
               state->tracing[x] = -state->tracing[x];
           }
@@ -1264,7 +1264,7 @@ roll_state (m_state *state)
         /* reversed logic from TRACEA2 */
         Bool any = False;
         int i;
-        for (i = 0; i < strlen(state->tracing); i++)
+        for (i = 0; i < strlen((char *) state->tracing); i++)
           if (state->tracing[i] > 0) any = True;
 
         if ((random() % 15) == 0) {
@@ -1272,7 +1272,7 @@ roll_state (m_state *state)
             state->mode = SYSTEMFAILURE;
           else
             {
-              int x = random() % strlen(state->tracing);
+              int x = random() % strlen((char *) state->tracing);
               if (state->tracing[x] < 0)
                 state->tracing[x] = -state->tracing[x];
             }
@@ -1353,9 +1353,9 @@ hack_matrix (m_state *state)
       int i = random() % (state->grid_width / 2);
       while (--i > 0)
         {
-          int x = random() % state->grid_width;
-          int y = random() % state->grid_height;
-          m_cell *cell = &state->cells[state->grid_width * y + x];
+          int yy = random() % state->grid_height;
+          int xx = random() % state->grid_width;
+          m_cell *cell = &state->cells[state->grid_width * yy + xx];
           if (cell->glyph && cell->glow == 0)
             {
               cell->glow = random() % 10;
index 4d740a0df4da9adc0bccb25a6aedfd4340f6cb08..15fc96d28deb8355ea61843d9564d310886a94fb 100644 (file)
@@ -65,7 +65,7 @@ XrmOptionDescRec options [] = {
        {0,0,0,0}
 };
 
-static char colors[768];
+static unsigned char colors[768];
 
 static Display *dpy;
 static Window win;
index 223ceab48bf0f2d66ec99fe92c10a0c85733c945..045f2d9ffd6f8617e687a85fec2fc0657fc0e41b 100644 (file)
@@ -114,6 +114,13 @@ char*        progname;
 XtAppContext app;
 XrmDatabase  db;
 char*        progclass = XSUBLIM_NAME;
+
+# ifdef __GNUC__
+  __extension__   /* don't warn about "string length is greater than the
+                     length ISO C89 compilers are required to support"
+                     in the following string constant... */
+# endif
+
 char*        defaults[] =
 {
        ".background:                     #000000",
@@ -250,7 +257,7 @@ static Window xsublim_Ss_GetWindow(Display* ss_Display)
        Window        win_Parent;
        Window*       win_Child;
        Window        win_Win;
-       int           child_Count;
+       unsigned int  child_Count;
        int           child_Index;
        Atom          prop_Type;
        int           prop_Format;
index c509c246dc7a6d6f0d37e6d8f39edd0559f7a3cb..7e4299121126d0b0c114bb5f8d4dc512cf70e3f3 100644 (file)
@@ -1,4 +1,4 @@
-# Auto-generated: Mon Jun 23 16:14:14 PDT 2003
+# Auto-generated: Thu Aug 14 02:52:12 PDT 2003
 driver/demo-Gtk-conf.c
 driver/demo-Gtk-support.c
 driver/demo-Gtk-widgets.c
@@ -8,6 +8,7 @@ driver/xscreensaver-demo.glade
 driver/xscreensaver-demo.glade2
 hacks/config/anemone.xml
 hacks/config/ant.xml
+hacks/config/antspotlight.xml
 hacks/config/apollonian.xml
 hacks/config/atlantis.xml
 hacks/config/attraction.xml
@@ -52,8 +53,10 @@ hacks/config/eruption.xml
 hacks/config/euler2d.xml
 hacks/config/extrusion.xml
 hacks/config/fadeplot.xml
+hacks/config/fireflies.xml
 hacks/config/flag.xml
 hacks/config/flame.xml
+hacks/config/flipflop.xml
 hacks/config/flipscreen3d.xml
 hacks/config/flow.xml
 hacks/config/fluidballs.xml
@@ -120,6 +123,7 @@ hacks/config/phosphor.xml
 hacks/config/piecewise.xml
 hacks/config/pipes.xml
 hacks/config/polyominoes.xml
+hacks/config/polytopes.xml
 hacks/config/popsquares.xml
 hacks/config/pulsar.xml
 hacks/config/pyro.xml
index 1ec86c657f40e4e144d80b0b13e8bf00718704da..f068153cd8674a922f1cf067e23d8c7e471f1f00 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -2,16 +2,17 @@
 # Copyright (C) 2002 Free Software Foundation, Inc.
 # maintainer: Christophe Merlet (RedFox) <christophe@merlet.net>, 2002.
 # Sun G11n <gnome_int_l10n@ireland.sun.com>, 2002.
+# Eric Lassauge <lassauge@mail.dotcom.fr>, 2003.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: xscreensaver 4.01\n"
+"Project-Id-Version: xscreensaver 4.11\n"
 "POT-Creation-Date: 2002-06-18 21:56+0200\n"
 "PO-Revision-Date: 2002-07-28 01:03+0200\n"
-"Last-Translator: Christophe Merlet (RedFox) <christophe@merlet.net>\n"
+"Last-Translator: Eric Lassauge <lassauge@mail.dotcom.fr>\n"
 "Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
 "Content-Transfer-Encoding: 8bit\n"
 
 #: driver/demo-Gtk-conf.c:729
@@ -20,17 +21,17 @@ msgstr "Parcourir... "
 
 #: driver/demo-Gtk-conf.c:1021
 msgid "Select file."
-msgstr "Sélectionnez un fichier."
+msgstr "Sélectionnez un fichier."
 
 #: driver/demo-Gtk-support.c:121
 #, c-format
 msgid "Couldn't find pixmap file: %s"
-msgstr "Impossible de trouver le fichier d'image : %s"
+msgstr "Impossible de trouver le fichier d'image : %s"
 
 #: driver/demo-Gtk-support.c:130
 #, c-format
 msgid "Error loading pixmap file: %s"
-msgstr "Erreur lors du chargement du fichier d'image : %s"
+msgstr "Erreur lors du chargement du fichier d'image : %s"
 
 #: driver/demo-Gtk-widgets.c:155 driver/xscreensaver-demo.glade.h:89
 #: driver/xscreensaver-demo.glade2.h:43
@@ -44,39 +45,41 @@ msgstr "_Fichier"
 #: driver/demo-Gtk-widgets.c:196 driver/xscreensaver-demo.glade.h:93
 #: driver/xscreensaver-demo.glade2.h:48
 msgid "_Blank Screen Now"
-msgstr "_Économiser l'écran maintenant"
+msgstr "_Economiser l'écran maintenant"
 
 #: driver/demo-Gtk-widgets.c:205 driver/xscreensaver-demo.glade.h:2
 msgid ""
 "Activate the XScreenSaver daemon now (locking the screen if so configured.)"
-msgstr ""
+msgstr "Activer le démon XScreenSaver (blocage de l'écran si c'est configuré)."
 
 #: driver/demo-Gtk-widgets.c:209 driver/xscreensaver-demo.glade.h:97
 #: driver/xscreensaver-demo.glade2.h:58
 msgid "_Lock Screen Now"
-msgstr "_Verrouiller l'écran maintenant"
+msgstr "_Verrouiller l'écran maintenant"
 
 #: driver/demo-Gtk-widgets.c:218 driver/xscreensaver-demo.glade.h:51
 msgid "Lock the screen now (even if \"Lock Screen\" is unchecked.)"
 msgstr ""
+"Verrouille l'écran maintenant (même si \"Verrouiller l'écran\" n'est pas "
+"validé)."
 
 #: driver/demo-Gtk-widgets.c:222 driver/xscreensaver-demo.glade.h:96
 #: driver/xscreensaver-demo.glade2.h:56
 msgid "_Kill Daemon"
-msgstr "_Tuer le demon"
+msgstr "_Tuer le démon"
 
 #: driver/demo-Gtk-widgets.c:231 driver/xscreensaver-demo.glade.h:71
 msgid "Tell the running XScreenSaver daemon to exit."
-msgstr ""
+msgstr "Demande au démon courant de XScreenSaver de se terminer."
 
 #: driver/demo-Gtk-widgets.c:235 driver/xscreensaver-demo.glade.h:98
 #: driver/xscreensaver-demo.glade2.h:64
 msgid "_Restart Daemon"
-msgstr "_Redemarrer le demon"
+msgstr "_Redémarrer le démon"
 
 #: driver/demo-Gtk-widgets.c:244 driver/xscreensaver-demo.glade.h:49
 msgid "Kill and re-launch the XScreenSaver daemon."
-msgstr ""
+msgstr "Tue et re-lance le démon XScreenSaver."
 
 #: driver/demo-Gtk-widgets.c:257 driver/xscreensaver-demo.glade.h:95
 msgid "_Exit"
@@ -87,6 +90,8 @@ msgid ""
 "Exit the xscreensaver-demo program (but leave the XScreenSaver daemon "
 "running in the background.)"
 msgstr ""
+"Sort du programme xscreensaver-demo (mais laisse le démon XScreenSaver actif "
+"en arrière-plan)."
 
 #: driver/demo-Gtk-widgets.c:270 driver/xscreensaver-demo.glade2.h:55
 msgid "_Help"
@@ -95,11 +100,11 @@ msgstr "_Aide"
 #: driver/demo-Gtk-widgets.c:290 driver/xscreensaver-demo.glade.h:92
 #: driver/xscreensaver-demo.glade2.h:44
 msgid "_About..."
-msgstr "À _propos..."
+msgstr "A _propos..."
 
 #: driver/demo-Gtk-widgets.c:299 driver/xscreensaver-demo.glade.h:30
 msgid "Display version information."
-msgstr ""
+msgstr "Affiche les informations de version"
 
 #: driver/demo-Gtk-widgets.c:303 driver/xscreensaver-demo.glade.h:94
 #: driver/xscreensaver-demo.glade2.h:53
@@ -108,32 +113,30 @@ msgstr "_Documentation..."
 
 #: driver/demo-Gtk-widgets.c:312 driver/xscreensaver-demo.glade.h:38
 msgid "Go to the documentation on the XScreenSaver web page."
-msgstr ""
+msgstr "Visite la page web de documentation de XScreenSaver."
 
 #: driver/demo-Gtk-widgets.c:342 driver/xscreensaver-demo.glade.h:18
-#, fuzzy
 msgid "Cycle After"
-msgstr "Eau claire"
+msgstr "Changement au bout de"
 
 #: driver/demo-Gtk-widgets.c:364 driver/xscreensaver-demo.glade.h:78
 #: driver/xscreensaver-demo.glade2.h:42
 msgid "Whether a password should be required to un-blank the screen."
-msgstr ""
+msgstr "Un mot de passe est-il requis pour débloquer l'écran."
 
 #: driver/demo-Gtk-widgets.c:366 driver/xscreensaver-demo.glade.h:50
 msgid "Lock Screen After"
-msgstr ""
+msgstr "Verrouiller l'écran après"
 
 #: driver/demo-Gtk-widgets.c:374 driver/xscreensaver-demo.glade.h:8
-#, fuzzy
 msgid "Blank After"
-msgstr "Explosion"
+msgstr "Économiser l'écran après"
 
 #: driver/demo-Gtk-widgets.c:397 driver/demo-Gtk-widgets.c:447
 #: driver/demo-Gtk-widgets.c:461 driver/demo-Gtk-widgets.c:1010
 #: driver/xscreensaver-demo.glade.h:43 driver/xscreensaver-demo.glade2.h:26
 msgid "How long before the monitor goes completely black."
-msgstr ""
+msgstr "Durée avant que le moniteur passe complètement au noir."
 
 #: driver/demo-Gtk-widgets.c:401 driver/demo-Gtk-widgets.c:413
 #: driver/demo-Gtk-widgets.c:425 driver/demo-Gtk-widgets.c:1014
@@ -145,55 +148,57 @@ msgstr "minutes"
 #: driver/demo-Gtk-widgets.c:476 driver/demo-Gtk.c:2661
 #: driver/xscreensaver-demo.glade.h:58
 msgid "Preview"
-msgstr ""
+msgstr "Aperçu"
 
 #: driver/demo-Gtk-widgets.c:484 driver/xscreensaver-demo.glade.h:21
 msgid ""
 "Demo the selected screen saver in full-screen mode (click the mouse to "
 "return.)"
 msgstr ""
+"Démo de l'économiseur d'écran sélectionné en mode plein-écran (cliquer avec "
+"la souris pour en sortir.)"
 
 #: driver/demo-Gtk-widgets.c:486 driver/xscreensaver-demo.glade.h:65
 msgid "Settings..."
-msgstr "Reglages..."
+msgstr "Réglages..."
 
 #: driver/demo-Gtk-widgets.c:494 driver/xscreensaver-demo.glade.h:17
 msgid "Customization and explanation of the selected screen saver."
-msgstr ""
+msgstr "Configuration et explications pour l'économiseur d'écran sélectionné."
 
 #: driver/demo-Gtk-widgets.c:515 driver/xscreensaver-demo.glade.h:52
 msgid "Mode:"
-msgstr "Mode :"
+msgstr "Mode :"
 
 #: driver/demo-Gtk-widgets.c:533 driver/xscreensaver-demo.glade.h:25
 #: driver/xscreensaver-demo.glade2.h:14
 msgid "Disable Screen Saver"
-msgstr "Désactiver l'économiseur d'acran"
+msgstr "Désactiver l'économiseur d'écran"
 
 #: driver/demo-Gtk-widgets.c:536 driver/xscreensaver-demo.glade.h:9
 #: driver/xscreensaver-demo.glade2.h:5
 msgid "Blank Screen Only"
-msgstr ""
+msgstr "Économiser l'écran uniquement"
 
 #: driver/demo-Gtk-widgets.c:539 driver/xscreensaver-demo.glade.h:56
 #: driver/xscreensaver-demo.glade2.h:32
 msgid "Only One Screen Saver"
-msgstr "Seulement un économiseur d'écran"
+msgstr "Seulement un économiseur d'écran"
 
 #: driver/demo-Gtk-widgets.c:542 driver/xscreensaver-demo.glade.h:60
 #: driver/xscreensaver-demo.glade2.h:35
 msgid "Random Screen Saver"
-msgstr "Économiseur d'écran aléatoire"
+msgstr "Économiseur d'écran aléatoire"
 
 #: driver/demo-Gtk-widgets.c:565 driver/demo-Gtk.c:2034
 #: driver/xscreensaver-demo.glade.h:75
 msgid "Use"
-msgstr ""
+msgstr "Choisis"
 
 #: driver/demo-Gtk-widgets.c:585 driver/demo-Gtk.c:2044
 #: driver/xscreensaver-demo.glade.h:63
 msgid "Screen Saver"
-msgstr "Économiseur d'écran"
+msgstr "Économiseur d'écran"
 
 #: driver/demo-Gtk-widgets.c:638 driver/xscreensaver-demo.glade.h:91
 msgid "\\/"
@@ -204,6 +209,8 @@ msgid ""
 "Run the next screen saver in the list in full-screen mode (click the mouse "
 "to return.)"
 msgstr ""
+"Lance l'économiseur d'écran suivant dans la liste en mode plein-écran "
+"(cliquer la souris pour revenir.)"
 
 #: driver/demo-Gtk-widgets.c:648
 msgid "/\\"
@@ -214,6 +221,8 @@ msgid ""
 "Run the previous screen saver in the list in full-screen mode (click the "
 "mouse to return.)"
 msgstr ""
+"Lance l'économiseur d'écran précédent dans la liste en mode plein-écran "
+"(cliquer la souris pour revenir.)"
 
 #: driver/demo-Gtk-widgets.c:658 driver/demo-Gtk-widgets.c:1601
 #: driver/xscreensaver-demo.glade.h:22 driver/xscreensaver-demo.glade2.h:11
@@ -227,79 +236,87 @@ msgstr "Modes d'affichage"
 #: driver/demo-Gtk-widgets.c:701 driver/xscreensaver-demo.glade.h:23
 #: driver/xscreensaver-demo.glade2.h:12
 msgid "Diagnostics"
-msgstr "Diagnostics"
+msgstr "Diagnostiques"
 
 #: driver/demo-Gtk-widgets.c:745 driver/xscreensaver-demo.glade.h:80
 msgid "Whether the daemon should print lots of debugging information."
-msgstr ""
+msgstr "Le démon doit-il afficher beaucoup d'informations de mise au point."
 
 #: driver/demo-Gtk-widgets.c:747 driver/xscreensaver-demo.glade.h:76
 msgid "Verbose Diagnostics"
-msgstr ""
+msgstr "Diagnostiques verbeux"
 
 #: driver/demo-Gtk-widgets.c:762 driver/xscreensaver-demo.glade.h:79
 msgid ""
 "Whether any error output of the display modes should be redirected to the "
 "screen."
 msgstr ""
+"Les messages d'erreur des modes d'affichages doivent-ils être redirigés vers "
+"l'écran."
 
 #: driver/demo-Gtk-widgets.c:764 driver/xscreensaver-demo.glade.h:29
-#, fuzzy
 msgid "Display Subprocess Errors"
-msgstr "Afficher le viseur"
+msgstr "Afficher les erreurs des sous-processus"
 
 #: driver/demo-Gtk-widgets.c:779 driver/xscreensaver-demo.glade.h:87
 msgid ""
 "Whether the splash screen (with the version number and `Help' button) should "
 "be momentarily displayed when the daemon first starts up."
 msgstr ""
+"L'écran de démarrage (avec le numéro de version et le bouton 'Aide') doit-il "
+"être affiché momentanément au premier démarrage du démon."
 
 #: driver/demo-Gtk-widgets.c:781 driver/xscreensaver-demo.glade.h:28
 msgid "Display Splash Screen at Startup"
-msgstr ""
+msgstr "Afficher l'écran de démarrage"
 
 #: driver/demo-Gtk-widgets.c:790 driver/xscreensaver-demo.glade.h:15
 #: driver/xscreensaver-demo.glade2.h:8
 msgid "Colormaps"
-msgstr "Palette de couleurs"
+msgstr "Palettes de couleurs"
 
 #: driver/demo-Gtk-widgets.c:834 driver/xscreensaver-demo.glade.h:88
 msgid ""
 "Whether to install a private colormap when running in 8-bit mode on the "
 "default Visual."
 msgstr ""
+"Faut-il installer une palette de couleurs privée en mode 8-bits pour le "
+"visuel par défaut"
 
 #: driver/demo-Gtk-widgets.c:836 driver/xscreensaver-demo.glade.h:48
 msgid "Install Colormap"
-msgstr ""
+msgstr "Installer une palette de couleur"
 
 #: driver/demo-Gtk-widgets.c:859 driver/xscreensaver-demo.glade.h:86
 msgid ""
 "Whether the screen should slowly fade to black when the screen saver "
 "activates."
 msgstr ""
+"L'écran doit-il fondre lentement au noir quand l'économiseur d'écran s'active"
 
 #: driver/demo-Gtk-widgets.c:861 driver/xscreensaver-demo.glade.h:36
 msgid "Fade To Black When Blanking"
-msgstr ""
+msgstr "Fondu au noir lors du verrouillage"
 
 #: driver/demo-Gtk-widgets.c:876 driver/xscreensaver-demo.glade.h:85
 msgid ""
 "Whether the screen should slowly fade in from black when the screen saver "
 "deactivates."
 msgstr ""
+"L'écran doit-il fondre lentement depuis le noir quand l'économiseur d'écran "
+"se désactive"
 
 #: driver/demo-Gtk-widgets.c:878 driver/xscreensaver-demo.glade.h:35
 msgid "Fade From Black When Unblanking"
-msgstr ""
+msgstr "Fondu depuis le noir lors du dé-verrouillage"
 
 #: driver/demo-Gtk-widgets.c:904 driver/xscreensaver-demo.glade.h:34
 msgid "Fade Duration"
-msgstr "Durée du fondu"
+msgstr "Durée du fondu"
 
 #: driver/demo-Gtk-widgets.c:922 driver/xscreensaver-demo.glade.h:44
 msgid "How long it should take for the screen to fade in and out."
-msgstr ""
+msgstr "Combien de temps doivent durer les fondus avec le noir."
 
 #: driver/demo-Gtk-widgets.c:926 driver/xscreensaver-demo.glade.h:100
 #: driver/xscreensaver-demo.glade2.h:73
@@ -309,75 +326,80 @@ msgstr "secondes"
 #: driver/demo-Gtk-widgets.c:936 driver/xscreensaver-demo.glade.h:27
 #: driver/xscreensaver-demo.glade2.h:15
 msgid "Display Power Management"
-msgstr ""
+msgstr "Gestion d'alimentation de l'écran"
 
 #: driver/demo-Gtk-widgets.c:980 driver/xscreensaver-demo.glade.h:84
 msgid "Whether the monitor should be powered down after a while."
-msgstr ""
+msgstr "Le moniteur doit-il passer en économie d'énergie au bout d'un moment."
 
 #: driver/demo-Gtk-widgets.c:982 driver/xscreensaver-demo.glade.h:57
 msgid "Power Management Enabled"
-msgstr ""
+msgstr "Gestion d'alimentation de l'écran autorisée"
 
 #: driver/demo-Gtk-widgets.c:1050 driver/xscreensaver-demo.glade.h:55
 msgid "Off After"
-msgstr ""
+msgstr "Extinction après"
 
 #: driver/demo-Gtk-widgets.c:1063 driver/xscreensaver-demo.glade.h:70
 msgid "Suspend After"
-msgstr ""
+msgstr "Suspension après"
 
 #: driver/demo-Gtk-widgets.c:1076 driver/xscreensaver-demo.glade.h:68
 msgid "Standby After"
-msgstr ""
+msgstr "En attente après"
 
 #: driver/demo-Gtk-widgets.c:1099 driver/xscreensaver-demo.glade.h:45
 msgid "How long until the monitor goes into power-saving mode."
-msgstr ""
+msgstr "Durée avant que le moniteur passe en mode d'économie d'énergie."
 
 #: driver/demo-Gtk-widgets.c:1113 driver/xscreensaver-demo.glade.h:46
 msgid "How long until the monitor powers down."
-msgstr ""
+msgstr "Durée avant que le moniteur coupe l'alimentation."
 
 #: driver/demo-Gtk-widgets.c:1117 driver/xscreensaver-demo.glade.h:47
 #: driver/xscreensaver-demo.glade2.h:27
 msgid "Image Manipulation"
-msgstr ""
+msgstr "Manipulation d'images"
 
 #: driver/demo-Gtk-widgets.c:1161 driver/xscreensaver-demo.glade.h:81
 msgid ""
 "Whether the image-manipulating modes should be allowed to operate on an "
 "image of your desktop."
 msgstr ""
+"Les modes qui manipulent des images sont-ils autorisé à utiliser une image "
+"de votre bureau."
 
 #: driver/demo-Gtk-widgets.c:1163 driver/xscreensaver-demo.glade.h:39
-#, fuzzy
 msgid "Grab Desktop Images"
-msgstr "Capturer l'écran"
+msgstr "Capturer l'image du bureau"
 
 #: driver/demo-Gtk-widgets.c:1178 driver/xscreensaver-demo.glade.h:82
 msgid ""
 "Whether the image-manipulating modes should operate on images captured from "
 "the system's video input (if there is one)."
 msgstr ""
+"Les modes qui manipulent des images sont-ils autorisé à utiliser des images "
+"capturées par l'entrée vidéo du système (si il y en a une)."
 
 #: driver/demo-Gtk-widgets.c:1180 driver/xscreensaver-demo.glade.h:40
 msgid "Grab Video Frames"
-msgstr ""
+msgstr "Capturer des trames vidéo"
 
 #: driver/demo-Gtk-widgets.c:1195 driver/xscreensaver-demo.glade.h:83
 msgid ""
 "Whether the image-manipulating modes should operate on random images loaded "
 "from disk."
 msgstr ""
+"Les modes qui manipulent des images sont-ils autorisé à utiliser des images "
+"chargées aléatoirement depuis le disque."
 
 #: driver/demo-Gtk-widgets.c:1197 driver/xscreensaver-demo.glade.h:12
 msgid "Choose Random Image:"
-msgstr ""
+msgstr "Choisir une image aléatoire :"
 
 #: driver/demo-Gtk-widgets.c:1230 driver/xscreensaver-demo.glade.h:73
 msgid "The directory from which images will be randomly chosen."
-msgstr ""
+msgstr "Répertoire source des images aléatoires."
 
 #: driver/demo-Gtk-widgets.c:1232 driver/xscreensaver-demo.glade.h:10
 msgid "Browse"
@@ -386,16 +408,16 @@ msgstr "Parcourir"
 #: driver/demo-Gtk-widgets.c:1240 driver/demo-Gtk-widgets.c:1593
 #: driver/xscreensaver-demo.glade.h:3 driver/xscreensaver-demo.glade2.h:2
 msgid "Advanced"
-msgstr "Avancée"
+msgstr "Avancé"
 
 #: driver/demo-Gtk-widgets.c:1438 driver/xscreensaver-demo.glade.h:90
 msgid "XScreenSaver: Mode-Specific Settings"
-msgstr ""
+msgstr "XScreenSaver: réglages spécifiques au mode"
 
 #: driver/demo-Gtk-widgets.c:1460 driver/xscreensaver-demo.glade.h:64
 #: driver/xscreensaver-demo.glade2.h:36
 msgid "Settings"
-msgstr "Réglages"
+msgstr "Réglages"
 
 #: driver/demo-Gtk-widgets.c:1489 driver/xscreensaver-demo.glade.h:66
 #: driver/xscreensaver-demo.glade2.h:38
@@ -404,39 +426,38 @@ msgstr "Standard"
 
 #: driver/demo-Gtk-widgets.c:1526 driver/xscreensaver-demo.glade.h:77
 msgid "Visual:"
-msgstr "Visuel :"
+msgstr "Visuel :"
 
 #: driver/demo-Gtk-widgets.c:1544 driver/demo-Gtk-widgets.c:1567
 #: driver/demo-Gtk.c:1479 driver/demo-Gtk.c:2680
 #: driver/xscreensaver-demo.glade.h:5 driver/xscreensaver-demo.glade2.h:3
-#, fuzzy
 msgid "Any"
-msgstr "Fourmis"
+msgstr "Tous"
 
 #: driver/demo-Gtk-widgets.c:1545 driver/xscreensaver-demo.glade.h:7
 #: driver/xscreensaver-demo.glade2.h:4
 msgid "Best"
-msgstr ""
+msgstr "Le meilleur"
 
 #: driver/demo-Gtk-widgets.c:1546 driver/xscreensaver-demo.glade.h:19
 #: driver/xscreensaver-demo.glade2.h:9
 msgid "Default"
-msgstr ""
+msgstr "Par défaut"
 
 #: driver/demo-Gtk-widgets.c:1547 driver/xscreensaver-demo.glade.h:20
 #: driver/xscreensaver-demo.glade2.h:10
 msgid "Default-N"
-msgstr ""
+msgstr "Défault-N"
 
 #: driver/demo-Gtk-widgets.c:1548 driver/xscreensaver-demo.glade.h:37
 #: driver/xscreensaver-demo.glade2.h:21
 msgid "GL"
-msgstr ""
+msgstr "OpenGL"
 
 #: driver/demo-Gtk-widgets.c:1549 driver/xscreensaver-demo.glade.h:74
 #: driver/xscreensaver-demo.glade2.h:41
 msgid "TrueColor"
-msgstr "Couleurs réelles"
+msgstr "Couleurs vraies"
 
 #: driver/demo-Gtk-widgets.c:1550 driver/xscreensaver-demo.glade.h:59
 #: driver/xscreensaver-demo.glade2.h:34
@@ -445,9 +466,8 @@ msgstr "Pseudo couleurs"
 
 #: driver/demo-Gtk-widgets.c:1551 driver/xscreensaver-demo.glade.h:69
 #: driver/xscreensaver-demo.glade2.h:39
-#, fuzzy
 msgid "StaticGray"
-msgstr "Escaliers"
+msgstr "StaticGray"
 
 #: driver/demo-Gtk-widgets.c:1552 driver/xscreensaver-demo.glade.h:42
 #: driver/xscreensaver-demo.glade2.h:25
@@ -456,9 +476,8 @@ msgstr "Niveaux de gris"
 
 #: driver/demo-Gtk-widgets.c:1553 driver/xscreensaver-demo.glade.h:24
 #: driver/xscreensaver-demo.glade2.h:13
-#, fuzzy
 msgid "DirectColor"
-msgstr "Répertoire d'images"
+msgstr "Couleurs directes"
 
 #: driver/demo-Gtk-widgets.c:1554 driver/xscreensaver-demo.glade.h:14
 #: driver/xscreensaver-demo.glade2.h:7
@@ -473,41 +492,44 @@ msgstr "Gris"
 #: driver/demo-Gtk-widgets.c:1556 driver/xscreensaver-demo.glade.h:53
 #: driver/xscreensaver-demo.glade2.h:29
 msgid "Mono"
-msgstr ""
+msgstr "Monochrome"
 
 #: driver/demo-Gtk-widgets.c:1566 driver/xscreensaver-demo.glade.h:72
 msgid ""
 "The X visual type that this demo will require.  If that visual is available "
 "it will be used, otherwise, this demo will not be run."
 msgstr ""
+"Le visuel X11 nécessaire pour cette démo. S'il est disponible il sera "
+"utilisé, sinon cette démo ne fonctionnera pas."
 
 #: driver/demo-Gtk-widgets.c:1569 driver/xscreensaver-demo.glade.h:16
 msgid "Command Line:"
-msgstr ""
+msgstr "Ligne de commande :"
 
 #: driver/demo-Gtk-widgets.c:1641 driver/xscreensaver-demo.glade.h:31
 msgid "Documentation..."
-msgstr ""
+msgstr "Documentation..."
 
 #: driver/demo-Gtk-widgets.c:1649 driver/xscreensaver-demo.glade.h:13
 msgid "Click here to read the manual for this display mode, if it has one."
 msgstr ""
+"Cliquer ici pour lire le manuel de ce mode d'affichage, s'il en possède un."
 
 #: driver/demo-Gtk-widgets.c:1674 driver/xscreensaver-demo.glade.h:4
 msgid "Advanced >>"
-msgstr ""
+msgstr "Avancé >>"
 
 #: driver/demo-Gtk-widgets.c:1682 driver/xscreensaver-demo.glade.h:32
 msgid "Edit the command line directly."
-msgstr ""
+msgstr "Editer directement la ligne de commande."
 
 #: driver/demo-Gtk-widgets.c:1684 driver/xscreensaver-demo.glade.h:67
 msgid "Standard <<"
-msgstr ""
+msgstr "Standard <<"
 
 #: driver/demo-Gtk-widgets.c:1692 driver/xscreensaver-demo.glade.h:6
 msgid "Back to the graphical configuration options."
-msgstr ""
+msgstr "Retour aux options de configuration graphique."
 
 #: driver/demo-Gtk-widgets.c:1703 driver/demo-Gtk.c:688
 #: driver/xscreensaver-demo.glade.h:54
@@ -521,6 +543,8 @@ msgstr "Annuler"
 #: driver/demo-Gtk.c:601
 msgid "For updates, check http://www.jwz.org/xscreensaver/"
 msgstr ""
+"Pour les mises à jour, voir «http://www.jwz.org/xscreensaver/»\n"
+"Traductions par Eric Lassauge «http://lassauge.free.fr/xscreensaver/»"
 
 #: driver/demo-Gtk.c:608
 #, c-format
@@ -529,7 +553,7 @@ msgstr ""
 
 #: driver/demo-Gtk.c:610
 #, c-format
-msgid "Copyright  1991-2002 %s"
+msgid "Copyright © 1991-2002 %s"
 msgstr ""
 
 #: driver/demo-Gtk.c:726
@@ -538,6 +562,9 @@ msgid ""
 "\n"
 "No Help URL has been specified.\n"
 msgstr ""
+"Erreur :\n"
+"\n"
+"Aucune URL d'aide spécifiée.\n"
 
 #: driver/demo-Gtk.c:812
 msgid ""
@@ -546,6 +573,9 @@ msgid ""
 "The xscreensaver daemon did not start up properly.\n"
 "\n"
 msgstr ""
+"Erreur :\n"
+"\n"
+"Le démon xscreensaver ne démarre pas correctement.\n"
 
 #: driver/demo-Gtk.c:818
 msgid ""
@@ -565,10 +595,26 @@ msgid ""
 "You shouldn't run X as root. Instead, you should log in as a\n"
 "normal user, and `su' as necessary."
 msgstr ""
+"Vous lancez ce programme en temps qu'administrateur. Ceci signifie\n"
+"que xscreensaver est incapable de contacter le serveur X car le\n"
+"contrôle d'accès est actif. Essayez de lancer cette commande :\n"
+"\n"
+"                        xhost +localhost\n"
+"\n"
+"puis sélectionnez 'Fichier / Relancer le démon'.\n"
+"\n"
+"Notez bien que inactiver le contrôle d'accès permettra à quiconque\n"
+"connecté à cette machine d'accéder à votre écran, ce qui peut être\n"
+"considéré comme un problème de sécurité. Lisez le manuel et la FAQ\n"
+"de xscreensaver pour plus d'information.\n"
+"\n"
+"Vous ne devriez pas lancer X en tant qu'administrateur. En lieu et\n"
+"place il faut se connecter en tant qu'utilisateur normal et utiliser\n"
+"'su' si nécessaire."
 
 #: driver/demo-Gtk.c:834
 msgid "Please check your $PATH and permissions."
-msgstr ""
+msgstr "Vérifiez votre $PATH et les permissions."
 
 #: driver/demo-Gtk.c:869
 msgid ""
@@ -576,6 +622,9 @@ msgid ""
 "\n"
 "Couldn't determine init file name!\n"
 msgstr ""
+"Erreur :\n"
+"\n"
+"Impossible de déterminer le nom du fichier d'init !\n"
 
 #: driver/demo-Gtk.c:874
 #, c-format
@@ -584,6 +633,9 @@ msgid ""
 "\n"
 "Couldn't write %s\n"
 msgstr ""
+"Erreur :\n"
+"\n"
+"Impossible d'écrire dans %s.\n"
 
 #: driver/demo-Gtk.c:933
 msgid ""
@@ -591,6 +643,9 @@ msgid ""
 "\n"
 "no `manualCommand' resource set."
 msgstr ""
+"Erreur :\n"
+"\n"
+"La ressource «manualCommand» n'est pas renseignée."
 
 #: driver/demo-Gtk.c:1114
 #, c-format
@@ -599,6 +654,9 @@ msgid ""
 "\n"
 "Unparsable time format: \"%s\"\n"
 msgstr ""
+"Erreur :\n"
+"\n"
+"Le format «%s» pour l'heure n'est pas exploitable.\n"
 
 #: driver/demo-Gtk.c:1779
 #, c-format
@@ -607,23 +665,25 @@ msgid ""
 "\n"
 "Directory does not exist: \"%s\"\n"
 msgstr ""
+"Erreur :\n"
+"\n"
+"Répertoire «%s» inexistant.\n"
 
 #: driver/demo-Gtk.c:2376
 msgid "Descriptions not available: no XML support compiled in."
-msgstr ""
+msgstr "Descriptions indisponibles: pas de support XML compilé."
 
 #: driver/demo-Gtk.c:2381
 msgid "No description available."
 msgstr "Aucune description disponible."
 
 #: driver/demo-Gtk.c:2632
-#, fuzzy
 msgid "Blank Screen"
-msgstr "Capturer l'écran"
+msgstr "Verrouiller l'écran"
 
 #: driver/demo-Gtk.c:2638
 msgid "Screen Saver Disabled"
-msgstr "Économiseur d'écran désactivé"
+msgstr "Économiseur d'écran inhibé"
 
 #: driver/demo-Gtk.c:2798
 #, c-format
@@ -632,14 +692,17 @@ msgid ""
 "\n"
 "file \"%s\" has changed, reloading.\n"
 msgstr ""
+"Attention :\n"
+"\n"
+"Le fichier \"%s\" a changé, rechargement.\n"
 
 #: driver/demo-Gtk.c:2875
 msgid "No Preview"
-msgstr ""
+msgstr "Pas d'aperçu"
 
 #: driver/demo-Gtk.c:2875
 msgid "Available"
-msgstr ""
+msgstr "Disponible"
 
 #: driver/demo-Gtk.c:3543
 #, c-format
@@ -649,6 +712,10 @@ msgid ""
 "The XScreenSaver daemon doesn't seem to be running\n"
 "on display \"%s\".  Launch it now?"
 msgstr ""
+"Attention :\n"
+"\n"
+"Le démon XScreenSaver n'est pas actif pour l'écran \"%s\". Lancement "
+"maintenant ?"
 
 #: driver/demo-Gtk.c:3553
 #, c-format
@@ -700,15 +767,15 @@ msgstr ""
 #: driver/demo-Gtk.c:3999
 #, c-format
 msgid "%s: unknown option: %s\n"
-msgstr ""
+msgstr "%s: option inconnue: «%s»\n"
 
 #: driver/screensaver-properties.desktop.in.h:1
 msgid "Configure the settings of the screensaver."
-msgstr "Configurer l'économiseur d'écran"
+msgstr "Configurer les paramètres de l'économiseur d'écran"
 
 #: driver/screensaver-properties.desktop.in.h:2
 msgid "Screensaver"
-msgstr "Économiseur d'écran"
+msgstr "Économiseur d'écran"
 
 #: driver/xscreensaver-demo.glade.h:1
 msgid "/\");"
@@ -720,72 +787,71 @@ msgstr "*"
 
 #: driver/xscreensaver-demo.glade2.h:6
 msgid "Choose _Random Image:"
-msgstr ""
+msgstr "Choisir une image _Aléatoire :"
 
 #: driver/xscreensaver-demo.glade2.h:16
-#, fuzzy
 msgid "Display Subprocess _Errors"
-msgstr "Afficher le viseur"
+msgstr "Afficher les erreurs des sous-process"
 
 #: driver/xscreensaver-demo.glade2.h:17
 msgid "Display _Splash Screen at Startup"
-msgstr ""
+msgstr "Afficher l'écran de _Démarrage"
 
 #: driver/xscreensaver-demo.glade2.h:18
 msgid "F_ade Duration"
-msgstr "_Durée du fondu"
+msgstr "Durée du _fondu"
 
 #: driver/xscreensaver-demo.glade2.h:19
 msgid "Fade from Black When _Unblanking"
-msgstr ""
+msgstr "Fondu depuis le noir lors du dé-verrouillage"
 
 #: driver/xscreensaver-demo.glade2.h:20
 msgid "Fade to Black when _Blanking"
-msgstr ""
+msgstr "Fondu au noir lors du _verrouillage"
 
 #: driver/xscreensaver-demo.glade2.h:22
-#, fuzzy
 msgid "Grab Desktop _Images"
-msgstr "Capturer l'écran"
+msgstr "Capturer des _images du bureau"
 
 #: driver/xscreensaver-demo.glade2.h:23
 msgid "Grab _Video Frames"
-msgstr ""
+msgstr "Captures des trames _vidéo"
 
 #: driver/xscreensaver-demo.glade2.h:28
 msgid "Install _Colormap"
-msgstr ""
+msgstr "Installer la palette de _couleurs"
 
 #: driver/xscreensaver-demo.glade2.h:30
 msgid ""
 "No Preview\n"
 "Available"
 msgstr ""
+"Pas d'aperçu\n"
+"Disponible"
 
 #: driver/xscreensaver-demo.glade2.h:33
 msgid "Preview of screen saver"
-msgstr ""
+msgstr "Aperçu de l'économiseur d'écran"
 
 #: driver/xscreensaver-demo.glade2.h:37
 msgid "Stand_by After"
-msgstr ""
+msgstr "Blo_cage après"
 
 #: driver/xscreensaver-demo.glade2.h:40
 msgid "Sus_pend After"
-msgstr ""
+msgstr "Sus_pend après"
 
 #: driver/xscreensaver-demo.glade2.h:45
 msgid "_Advanced"
-msgstr "_Avancée"
+msgstr "_Avancé"
 
 #: driver/xscreensaver-demo.glade2.h:46
 msgid "_Advanced >>"
-msgstr "_Avancée >>"
+msgstr "_Avancé >>"
 
 #: driver/xscreensaver-demo.glade2.h:47
-#, fuzzy
 msgid "_Blank After"
-msgstr "Explosion"
+msgstr "_Verrouillage après"
 
 #: driver/xscreensaver-demo.glade2.h:49
 msgid "_Browse"
@@ -793,12 +859,11 @@ msgstr "_Parcourir"
 
 #: driver/xscreensaver-demo.glade2.h:50
 msgid "_Command Line:"
-msgstr "_Ligne de commande :"
+msgstr "_Ligne de commande :"
 
 #: driver/xscreensaver-demo.glade2.h:51
-#, fuzzy
 msgid "_Cycle After"
-msgstr "Eau claire"
+msgstr "_Changement au bout de"
 
 #: driver/xscreensaver-demo.glade2.h:52
 msgid "_Display Modes"
@@ -806,43 +871,44 @@ msgstr "_Modes d'affichage"
 
 #: driver/xscreensaver-demo.glade2.h:57
 msgid "_Lock Screen After"
-msgstr ""
+msgstr "_Verrouillage de l'écran après"
 
 #: driver/xscreensaver-demo.glade2.h:59
 msgid "_Mode:"
-msgstr ""
+msgstr "_Mode :"
 
 #: driver/xscreensaver-demo.glade2.h:60
 msgid "_Off After"
-msgstr ""
+msgstr "Coup_ure après"
 
 #: driver/xscreensaver-demo.glade2.h:61
 msgid "_Power Management Enabled"
-msgstr ""
+msgstr "_Gestion d'alimentation de l'écran"
 
 #: driver/xscreensaver-demo.glade2.h:62
 msgid "_Preview"
-msgstr ""
+msgstr "_Aperçu"
 
 #: driver/xscreensaver-demo.glade2.h:63
 msgid "_Quit"
-msgstr ""
+msgstr "_Quitte"
 
 #: driver/xscreensaver-demo.glade2.h:65
 msgid "_Settings..."
-msgstr ""
+msgstr "_Paramètres..."
 
 #: driver/xscreensaver-demo.glade2.h:66
 msgid "_Standard <<"
-msgstr ""
+msgstr "_Standard <<"
 
 #: driver/xscreensaver-demo.glade2.h:67
+#, fuzzy
 msgid "_Verbose Dialognostics"
-msgstr ""
+msgstr "Diagnostiques _verbeux"
 
 #: driver/xscreensaver-demo.glade2.h:68
 msgid "_Visual:"
-msgstr ""
+msgstr "_Visuels :"
 
 #: driver/xscreensaver-demo.glade2.h:69
 msgid "dialog1"
@@ -850,20 +916,19 @@ msgstr "dialog1"
 
 #: driver/xscreensaver-demo.glade2.h:71
 msgid "no preview"
-msgstr "pas d'aperçu"
+msgstr "pas d'aperçu"
 
 #: driver/xscreensaver-demo.glade2.h:72
 msgid "preview"
-msgstr "aperçu"
+msgstr "aperçu"
 
 #: hacks/config/anemone.xml.h:1
-#, fuzzy
 msgid "Anemone"
-msgstr "Démon"
+msgstr "Anémone"
 
 #: hacks/config/anemone.xml.h:2
 msgid "Arms"
-msgstr ""
+msgstr "Bras"
 
 #: hacks/config/anemone.xml.h:3 hacks/config/ant.xml.h:5
 #: hacks/config/apollonian.xml.h:5 hacks/config/atlantis.xml.h:4
@@ -1077,7 +1142,7 @@ msgstr "Nombre de couleurs"
 #: hacks/config/xmatrix.xml.h:14 hacks/config/xmountains.xml.h:4
 #: hacks/config/xrayswarm.xml.h:3 hacks/config/zoom.xml.h:6
 msgid "Slow"
-msgstr "Lente"
+msgstr "Lent(e)"
 
 #: hacks/config/anemone.xml.h:8 hacks/config/ant.xml.h:16
 #: hacks/config/apollonian.xml.h:12 hacks/config/attraction.xml.h:28
@@ -1141,18 +1206,18 @@ msgstr "Vitesse"
 
 #: hacks/config/anemone.xml.h:9
 msgid "Tentacles"
-msgstr ""
+msgstr "Tentacules"
 
 #: hacks/config/anemone.xml.h:10 hacks/config/deluxe.xml.h:10
 #: hacks/config/lmorph.xml.h:13 hacks/config/starfish.xml.h:11
 #: hacks/config/thornbird.xml.h:9
 msgid "Thick"
-msgstr "Épais"
+msgstr "Épais"
 
 #: hacks/config/anemone.xml.h:11 hacks/config/moire2.xml.h:8
 #: hacks/config/thornbird.xml.h:10
 msgid "Thickness"
-msgstr "Épaisseur"
+msgstr "Épaisseur"
 
 #: hacks/config/anemone.xml.h:12 hacks/config/deluxe.xml.h:11
 #: hacks/config/lmorph.xml.h:14 hacks/config/starfish.xml.h:12
@@ -1204,10 +1269,10 @@ msgid ""
 "Written by David Bagley."
 msgstr ""
 "Un automate cellulaire qui est en fait une machine de Turing "
-"bidimensionnelle : à mesure que les têtes (''fourmis'') marchent le long de "
-"l'écran, elles changent la valeur des pixels sur leur chemin. Ensuite, leur "
-"comportement est influencé lorsqu'elles passent sur les pixels modifiés. "
-"Écrit par David Bagley."
+"bidimensionnelle: à mesure que les têtes («fourmis») marchent le long de "
+"l'écran, elles changent la valeur des pixels sur leur chemin. Ensuite, leur "
+"comportement est influencé lorsqu'elles passent sur les pixels modifié. àrit "
+"par David Bagley."
 
 #: hacks/config/ant.xml.h:2
 msgid "Ant"
@@ -1223,7 +1288,7 @@ msgstr "Nombre de fourmis"
 
 #: hacks/config/ant.xml.h:6
 msgid "Four Sided Cells"
-msgstr "Cellules à 4 côtés"
+msgstr "Cellules à 4 côtés"
 
 #: hacks/config/ant.xml.h:7 hacks/config/attraction.xml.h:13
 #: hacks/config/cubenetic.xml.h:11 hacks/config/demon.xml.h:5
@@ -1237,23 +1302,23 @@ msgstr "Cellules à 4 côtés"
 #: hacks/config/rubik.xml.h:4 hacks/config/sierpinski.xml.h:3
 #: hacks/config/slip.xml.h:3
 msgid "Large"
-msgstr "Importante"
+msgstr "Important(e)"
 
 #: hacks/config/ant.xml.h:9
 msgid "Nine Sided Cells"
-msgstr "Cellules à 9 côtés"
+msgstr "Cellules à 8 côtés"
 
 #: hacks/config/ant.xml.h:11
 msgid "Random Cell Shape"
-msgstr "Forme de cellule aléatoire"
+msgstr "Forme de cellule aléatoire"
 
 #: hacks/config/ant.xml.h:12 hacks/config/speedmine.xml.h:11
 msgid "Sharp Turns"
-msgstr "Virages serrés"
+msgstr "Virages serrés"
 
 #: hacks/config/ant.xml.h:13
 msgid "Six Sided Cells"
-msgstr "Cellules à 6 côtés"
+msgstr "Cellules à 6 côtés"
 
 #: hacks/config/ant.xml.h:15 hacks/config/attraction.xml.h:27
 #: hacks/config/cubenetic.xml.h:23 hacks/config/demon.xml.h:9
@@ -1271,7 +1336,7 @@ msgstr "Faible"
 
 #: hacks/config/ant.xml.h:17
 msgid "Three Sided Cells"
-msgstr "Cellules à 3 côtés"
+msgstr "Cellules à 3 côtés"
 
 #: hacks/config/ant.xml.h:18 hacks/config/demon.xml.h:12
 #: hacks/config/discrete.xml.h:10 hacks/config/fadeplot.xml.h:11
@@ -1280,7 +1345,7 @@ msgstr "Cellules à 3 côtés"
 #: hacks/config/rubik.xml.h:12 hacks/config/sierpinski.xml.h:11
 #: hacks/config/slip.xml.h:11
 msgid "Timeout"
-msgstr "Délai"
+msgstr "Délai"
 
 #: hacks/config/ant.xml.h:19
 msgid "Truchet Lines"
@@ -1288,7 +1353,7 @@ msgstr "Lignes de Truchet"
 
 #: hacks/config/ant.xml.h:20
 msgid "Twelve Sided Cells"
-msgstr "Cellules à 12 côtés"
+msgstr "Cellules à 12 côtés"
 
 #: hacks/config/apollonian.xml.h:1
 msgid "Apollonian"
@@ -1304,22 +1369,21 @@ msgstr "Profondeur"
 
 #: hacks/config/apollonian.xml.h:4
 msgid "Draw Labels"
-msgstr "Dessiner des étiquettes"
+msgstr "Afficher les étiquettes"
 
 #: hacks/config/apollonian.xml.h:6
 msgid "Include Alternate Geometries"
-msgstr "Inclure les géométries alternatives"
+msgstr "Inclure les géométries alternatives"
 
 #: hacks/config/apollonian.xml.h:9
 msgid ""
 "Packs a large circle with smaller circles, demonstrating the Descartes "
 "Circle Theorem. Written by Allan R. Wilks and David Bagley."
 msgstr ""
-"Remplit un grand cercle de cercles plus petits et démontre ainsi le théorème "
-"des cercles de Descartes. Écrit par Allan R. Wilks et David Bagley."
+"Remplit un grand cercle de cercles plus petits et démontre ainsi le théoràme "
+"des cercles de Descartes. Écrit par Allan R. Wilks et David Bagley."
 
 #: hacks/config/apollonian.xml.h:10
-#, fuzzy
 msgid "Shallow"
 msgstr "Creux"
 
@@ -1337,11 +1401,11 @@ msgstr "Eau claire"
 
 #: hacks/config/atlantis.xml.h:5
 msgid "Flat Background"
-msgstr "Arrière-plan plat"
+msgstr "Arrière-plan uni"
 
 #: hacks/config/atlantis.xml.h:6
 msgid "Gradient Background"
-msgstr "Arrière-plan dégradé"
+msgstr "Arrière-plan dégradé"
 
 #: hacks/config/atlantis.xml.h:7
 msgid "Number of Sharks"
@@ -1349,7 +1413,7 @@ msgstr "Nombre de requins"
 
 #: hacks/config/atlantis.xml.h:8
 msgid "Shark Proximity"
-msgstr "Proximité des requins"
+msgstr "Comportement des requins"
 
 #: hacks/config/atlantis.xml.h:9
 msgid "Shark Speed"
@@ -1377,7 +1441,7 @@ msgstr "Eau miroitante"
 #: hacks/config/sproingies.xml.h:4 hacks/config/stairs.xml.h:2
 #: hacks/config/starwars.xml.h:11 hacks/config/superquadrics.xml.h:6
 msgid "Show Frames-per-Second"
-msgstr "Afficher images par seconde"
+msgstr "Afficher images par seconde (FPS)"
 
 #: hacks/config/atlantis.xml.h:12
 msgid "Shy"
@@ -1401,9 +1465,9 @@ msgid ""
 "dolphins, and whales. The swimming motions are great. Originally written by "
 "Mark Kilgard."
 msgstr ""
-"Voici un aquarium grand format : une animation GL avec des requins, des "
+"Voici un aquarium grand format: une animation GL avec des requins, des "
 "dauphins et des baleines. Les mouvements de nage sont magnifiques. "
-"Initialement écrit par Mark Kilgard."
+"Initialement écrit par Mark Kilgard."
 
 #: hacks/config/atlantis.xml.h:16
 msgid "Whale Speed"
@@ -1434,7 +1498,7 @@ msgstr "Nombre de balles"
 
 #: hacks/config/attraction.xml.h:3
 msgid "Ball Mass"
-msgstr "Masse de balles"
+msgstr "Masse des balles"
 
 #: hacks/config/attraction.xml.h:4 hacks/config/fluidballs.xml.h:2
 msgid "Balls"
@@ -1452,7 +1516,7 @@ msgstr "Contraste des couleurs"
 
 #: hacks/config/attraction.xml.h:7
 msgid "Environmental Viscosity"
-msgstr "Viscosité environnementale"
+msgstr "Viscosité environnementale"
 
 #: hacks/config/attraction.xml.h:9
 msgid "Filled Splines"
@@ -1472,15 +1536,15 @@ msgstr "Rayons pleins"
 #: hacks/config/t3d.xml.h:7 hacks/config/twang.xml.h:5
 #: hacks/config/wander.xml.h:8
 msgid "High"
-msgstr "Haute"
+msgstr "Haut(e)"
 
 #: hacks/config/attraction.xml.h:11
 msgid "Ignore Screen Edges"
-msgstr "Ignorer les bords de l'écran"
+msgstr "Ignorer les bords de l'écran"
 
 #: hacks/config/attraction.xml.h:12
 msgid "Inward"
-msgstr "Intérieur"
+msgstr "Intérieur"
 
 #: hacks/config/attraction.xml.h:14
 msgid ""
@@ -1495,16 +1559,16 @@ msgid ""
 "edge of the screen. It looks quite chaotic. Written by Jamie Zawinski, based "
 "on Lisp code by John Pezaris."
 msgstr ""
-"Comme qix, il utilise un modèle de mouvement simple pour générer de nombreux "
-"modes d'affichage différents. Les points de contrôle s'attirent jusqu'à une "
-"certaine distance, puis commencent à se repousser. Le rapport d'attraction/"
-"répulsion est proportionnel à la distance entre deux particules, à l'instar "
-"des forces nucléaires fortes et faibles. Il est particulièrement intéressant "
+"Comme qix, il utilise un modèle de mouvement simple pour générer de nombreux "
+"modes d'affichage différents. Les points de contrôle s'attirent jusqu'à une "
+"certaine distance, puis commencent à se repousser. Le rapport d'attraction/"
+"répulsion est proportionnel à la distance entre deux particules, à l'instar "
+"des forces nucléaires fortes et faibles. Il est particulièrement intéressant "
 "de regarder ce hack simplement sous la forme de balles qui rebondissent, car "
-"leurs mouvements et leurs interactions sont très étranges. Il arrive parfois "
-"que deux balles entrent en orbite l'une avec l'autre, avant d'être "
-"interrompues par une troisième ou par le bord de l'écran. L'ensemble est "
-"assez chaotique. Écrit par Jamie Zawinski, sur la base d'un code Lisp de "
+"leurs mouvements et leurs interactions sont très étranges. Il arrive parfois "
+"que deux balles entrent en orbite l'une avec l'autre, avant d'être "
+"interrompues par une troisième ou par le bord de l'écran. L'ensemble est "
+"assez chaotique. Écrit par Jamie Zawinski, sur la base d'un code Lisp de "
 "John Pezaris."
 
 #: hacks/config/attraction.xml.h:15 hacks/config/deluxe.xml.h:5
@@ -1524,7 +1588,7 @@ msgstr "Lignes"
 #: hacks/config/spheremonics.xml.h:7 hacks/config/wander.xml.h:10
 #: hacks/config/whirlwindwarp.xml.h:3
 msgid "Long"
-msgstr "Long"
+msgstr "Long(ue)"
 
 #: hacks/config/attraction.xml.h:17 hacks/config/ccurve.xml.h:10
 #: hacks/config/cubenetic.xml.h:12 hacks/config/euler2d.xml.h:7
@@ -1540,7 +1604,7 @@ msgstr "Long"
 #: hacks/config/t3d.xml.h:8 hacks/config/twang.xml.h:7
 #: hacks/config/wander.xml.h:11
 msgid "Low"
-msgstr "Bas"
+msgstr "Bas(se)"
 
 #: hacks/config/attraction.xml.h:20
 msgid "Orbital Mode"
@@ -1548,7 +1612,7 @@ msgstr "Mode orbital"
 
 #: hacks/config/attraction.xml.h:21
 msgid "Outward"
-msgstr "Extérieur"
+msgstr "Extérieur"
 
 #: hacks/config/attraction.xml.h:22
 msgid "Polygons"
@@ -1560,7 +1624,7 @@ msgstr "Rayon"
 
 #: hacks/config/attraction.xml.h:24
 msgid "Repulsion Threshold"
-msgstr "Seuil de répulsion"
+msgstr "Seuil de répulsion"
 
 #: hacks/config/attraction.xml.h:25 hacks/config/braid.xml.h:10
 #: hacks/config/cynosure.xml.h:8 hacks/config/drift.xml.h:11
@@ -1572,22 +1636,20 @@ msgstr "Seuil de répulsion"
 #: hacks/config/sierpinski3d.xml.h:5 hacks/config/spheremonics.xml.h:17
 #: hacks/config/wander.xml.h:12 hacks/config/whirlwindwarp.xml.h:6
 msgid "Short"
-msgstr "Court"
+msgstr "Court(e)"
 
 #: hacks/config/attraction.xml.h:29
-#, fuzzy
 msgid "Splines"
 msgstr "Rayons"
 
 #: hacks/config/attraction.xml.h:30
-#, fuzzy
 msgid "Tails"
 msgstr "Queues"
 
 #: hacks/config/attraction.xml.h:31 hacks/config/euler2d.xml.h:16
 #: hacks/config/juggle.xml.h:9
 msgid "Trail Length"
-msgstr "Longueur de la traînée"
+msgstr "Longueur de la traînée"
 
 #: hacks/config/blaster.xml.h:1
 msgid "Blaster"
@@ -1599,8 +1661,8 @@ msgid ""
 "colored circles) doing battle in front of a moving star field. Written by "
 "Jonathan Lin."
 msgstr ""
-"Dessine une simulation de robots de combat volants (ingénieusement déguisés "
-"en cercles colorés) en guerre sur un fond de champ stellaire animé. Écrit "
+"Dessine une simulation de robots de combat volants (ingénieusement déguisés "
+"en cercles colorés) en guerre sur un fond de champ stellaire animé. Écrit "
 "par Jonathan Lin."
 
 #: hacks/config/blaster.xml.h:5 hacks/config/penetrate.xml.h:4
@@ -1613,19 +1675,17 @@ msgstr "Robots"
 
 #: hacks/config/blaster.xml.h:10
 msgid "Stars"
-msgstr "Étoiles"
+msgstr "Étoiles"
 
 #: hacks/config/blitspin.xml.h:1
-#, fuzzy
 msgid "90 deg Rotation Speed"
-msgstr "Rotation"
+msgstr "Vitesse de rotation à 90°"
 
 #: hacks/config/blitspin.xml.h:2
 msgid "Bitmap to rotate"
-msgstr "Bitmap à pivoter"
+msgstr "Image à pivoter"
 
 #: hacks/config/blitspin.xml.h:3
-#, fuzzy
 msgid "BlitSpin"
 msgstr "RotationBitmap"
 
@@ -1635,7 +1695,7 @@ msgstr "Vitesse de rotation floue"
 
 #: hacks/config/blitspin.xml.h:6
 msgid "Grab Screen"
-msgstr "Capturer l'écran"
+msgstr "Capturer l'écran"
 
 #: hacks/config/blitspin.xml.h:8
 msgid ""
@@ -1649,15 +1709,15 @@ msgid ""
 "provide the image to use, as an XBM or XPM file, or tell it to grab a screen "
 "image and rotate that."
 msgstr ""
-"Le ''hack'' RotationBitmap fait pivoter à plusieurs reprises un bitmap de "
-"90° à l'aide d'opérations logiques : le bitmap est divisé en quadrants, qui "
-"pivotent dans le sens horaire. La même opération est répétée avec des "
-"quadrants progressivement plus petits, à ceci près que tous les sous-"
-"quadrants d'une certaine taille pivotent parallèlement. Écrit par Jamie "
-"Zawinski sur la base d'un super code SmallTalk trouvé dans Byte Magazine en "
+"Le mode RotationBitmap fait pivoter à plusieurs reprises un bitmap de 90° à "
+"l'aide d'opérations logiques: le bitmap est divisé en quadrants, qui "
+"pivotent dans le sens horaire. La même opération est répétée avec des "
+"quadrants progressivement plus petits, à ceci près que tous les sous-"
+"quadrants d'une certaine taille pivotent parallèlement. Écrit par Jamie "
+"Zawinski sur la base d'un super code SmallTalk trouvé dans Byte Magazine en "
 "1981. Lorsque vous la regardez, l'image semble se dissoudre en parasites "
-"puis se reconstituer avec une rotation. Vous pouvez fournir l'image à "
-"utiliser, au format XBM ou XPM, ou effectuer une capture d'écran et la faire "
+"puis se reconstituer avec une rotation. Vous pouvez fournir l'image à "
+"utiliser, au format XBM ou XPM, ou effectuer une capture d'écran et la faire "
 "pivoter."
 
 #: hacks/config/bouboule.xml.h:1
@@ -1666,7 +1726,7 @@ msgstr "Bouboule"
 
 #: hacks/config/bouboule.xml.h:2 hacks/config/rocks.xml.h:3
 msgid "Do Red/Blue 3D seperation"
-msgstr "Séparation rouge/bleu 3D"
+msgstr "Séparation rouge/bleu 3D"
 
 #: hacks/config/bouboule.xml.h:7
 msgid "Number of Spots"
@@ -1677,8 +1737,8 @@ msgid ""
 "This draws what looks like a spinning, deforming baloon with varying-sized "
 "spots painted on its invisible surface. Written by Jeremie Petit."
 msgstr ""
-"Dessine une sorte de ballon qui tournoie et se déforme. Des taches de taille "
-"variable sont peintes sur sa surface invisible. Écrit par Jeremie Petit."
+"Dessine une sorte de ballon qui tournoie et se déforme. Des taches de taille "
+"variable sont peintes sur sa surface invisible. Écrit par Jeremie Petit."
 
 #: hacks/config/boxed.xml.h:1 hacks/config/gears.xml.h:1
 #: hacks/config/gflux.xml.h:1 hacks/config/pyro.xml.h:1
@@ -1689,14 +1749,14 @@ msgstr "Vitesse d'animation"
 
 #: hacks/config/boxed.xml.h:2
 msgid "Boxed"
-msgstr "En boîte"
+msgstr "En boîte"
 
 #: hacks/config/boxed.xml.h:3
 msgid ""
 "Draws a box full of 3D bouncing balls that explode. Written by Sander van "
 "Grieken."
 msgstr ""
-"Dessine une boîte remplie de balles 3D qui explosent. Écrit par Sander van "
+"Dessine une boîte remplie de balles 3D qui explosent. Écrit par Sander van "
 "Grieken."
 
 #: hacks/config/braid.xml.h:1
@@ -1708,8 +1768,8 @@ msgid ""
 "Draws random color-cycling inter-braided concentric circles. Written by John "
 "Neil."
 msgstr ""
-"Dessine des cercles concentriques aléatoires entrelacés, avec des cycles de "
-"couleurs. Écrit par John Neil."
+"Dessine des cercles concentriques aléatoires entrelacés, avec des cycles de "
+"couleurs. Écrit par John Neil."
 
 #: hacks/config/braid.xml.h:3 hacks/config/bsod.xml.h:8
 #: hacks/config/ccurve.xml.h:7 hacks/config/coral.xml.h:6
@@ -1729,12 +1789,12 @@ msgstr ""
 #: hacks/config/vidwhacker.xml.h:3 hacks/config/wander.xml.h:7
 #: hacks/config/xspirograph.xml.h:3
 msgid "Duration"
-msgstr "Durée"
+msgstr "Durée"
 
 #: hacks/config/braid.xml.h:5 hacks/config/epicycle.xml.h:7
 #: hacks/config/nerverot.xml.h:12
 msgid "Line Thickness"
-msgstr "Épaisseur de ligne"
+msgstr "Épaisseur de ligne"
 
 #: hacks/config/braid.xml.h:8
 msgid "Max Rings"
@@ -1771,13 +1831,13 @@ msgid ""
 "emulation, this hack simulates popular screen savers from a number of less "
 "robust operating systems. Written by Jamie Zawinski."
 msgstr ""
-"BSOD signifie ''Blue Screen of Death'' (écran bleu de la mort). Fine fleur "
-"de l'émulation PC, ce hack simule des économiseurs d'écran de plusieurs "
-"systèmes d'exploitation moins puissants. Écrit par Jamie Zawinski."
+"BSOD signifie «Blue Screen of Deaths» (écran bleu de la mort). Fine fleur de "
+"l'émulation PC, ce hack simule des économiseurs d'écran de plusieurs "
+"systèmes d'exploitation moins puissants. Écrit par Jamie Zawinski."
 
 #: hacks/config/bsod.xml.h:9
 msgid "Mac Bomb"
-msgstr ""
+msgstr "Bombe Mac"
 
 #: hacks/config/bsod.xml.h:10
 msgid "MacsBug"
@@ -1793,7 +1853,7 @@ msgstr "SCO"
 
 #: hacks/config/bsod.xml.h:13
 msgid "Sad Mac"
-msgstr ""
+msgstr "Mac Triste"
 
 #: hacks/config/bsod.xml.h:14
 msgid "Solaris"
@@ -1804,8 +1864,9 @@ msgid "Sparc Linux"
 msgstr "Sparc Linux"
 
 #: hacks/config/bsod.xml.h:16
+#, fuzzy
 msgid "Windows"
-msgstr "Windows"
+msgstr "Windows NT"
 
 #: hacks/config/bsod.xml.h:17
 msgid "Windows 2000"
@@ -1825,7 +1886,7 @@ msgid ""
 "the screen, with nice specular reflections. Written by Richard Jones."
 msgstr ""
 "Dessine un flux de bulles 3D ondulantes, qui montent vers le haut de "
-"l'écran, avec de belles réflexions spéculaires. Écrit par Richard Jones."
+"l'écran, avec de belles réflexions spéculaires. Écrit par Richard Jones."
 
 #: hacks/config/bubbles.xml.h:1 hacks/config/xfishtank.xml.h:2
 msgid "Bubbles"
@@ -1849,7 +1910,7 @@ msgstr "Les bulles existent en 3 dimensions"
 
 #: hacks/config/bubbles.xml.h:6
 msgid "Don't hide bubbles when they pop"
-msgstr "Ne pas masquer les bulles lorsqu'elles éclatent"
+msgstr "Ne pas masquer les bulles lorsqu'elles éclatent"
 
 #: hacks/config/bubbles.xml.h:7
 msgid "Draw circles instead of pixmap bubbles"
@@ -1857,7 +1918,7 @@ msgstr "Tracer des cercles au lieu de bulles pixmap"
 
 #: hacks/config/bubbles.xml.h:9
 msgid "Leave Trails"
-msgstr "Laisser des traînées"
+msgstr "Laisser des traînées"
 
 #: hacks/config/bubbles.xml.h:12
 msgid ""
@@ -1866,9 +1927,9 @@ msgid ""
 "form larger bubbles, which eventually pop. Written by James Macnicol."
 msgstr ""
 "Simule le type de formation de bulles qui se produit lorsque de l'eau entre "
-"en ébullition :de petites bulles apparaissent et, lorsqu'elles se "
+"en ébullition: de petites bulles apparaissent et, lorsqu'elles se "
 "rapprochent, elles se combinent pour former de plus grandes bulles, qui "
-"finissent par éclater. Écrit par James Macnicol."
+"finissent par éclater. Écrit par James Macnicol."
 
 #: hacks/config/bumps.xml.h:1
 msgid ""
@@ -1876,10 +1937,10 @@ msgid ""
 "desktop, it creates a bump map from it. Basically, it 3D-izes a roaming "
 "section of your desktop, based on color intensity. Written by Shane Smit."
 msgstr ""
-"Un peu comme 'Faisceau lumineux', à ceci près qu'au lieu d'exposer "
-"simplement une partie du bureau, il en crée un placage de relief. En fait, "
+"Un peu comme «Faisceau lumineux», à ceci près qu'au lieu d'exposer "
+"simplement une partie du bureau, il en crée un placage de relief. En fait, "
 "il met en 3 dimensions une section variable du bureau, en fonction de "
-"l'intensité des couleurs. Écrit par Shane Smit."
+"l'intensité des couleurs. Écrit par Shane Smit."
 
 #: hacks/config/bumps.xml.h:2
 msgid "Bumps"
@@ -1894,8 +1955,8 @@ msgid ""
 "This draws Escher's ``Impossible Cage,'' a 3d analog of a moebius strip, and "
 "rotates it in three dimensions. Written by Marcelo Vianna."
 msgstr ""
-"Dessine la ''Cage impossible'' d'Escher, une analogie en 3D d'un ruban de "
-"Moebius, et la fait pivoter en 3 dimensions. Écrit par Marcelo Vianna."
+"Dessine la «Cage impossible» d'Escher, une analogie en 3D d'un ruban de "
+"Moebius, et la fait pivoter en 3 dimensions. Écrit par Marcelo Vianna."
 
 #: hacks/config/ccurve.xml.h:1
 msgid "0 seconds"
@@ -1915,26 +1976,26 @@ msgstr "Courbe C"
 
 #: hacks/config/ccurve.xml.h:5
 msgid "Delay"
-msgstr "Délai"
+msgstr "Délai"
 
 #: hacks/config/ccurve.xml.h:6 hacks/config/coral.xml.h:5
 #: hacks/config/imsmap.xml.h:5 hacks/config/kumppa.xml.h:1
 #: hacks/config/qix.xml.h:6 hacks/config/squiral.xml.h:2
 #: hacks/config/wander.xml.h:4 hacks/config/xmatrix.xml.h:3
 msgid "Density"
-msgstr "Densité"
+msgstr "Densité"
 
 #: hacks/config/ccurve.xml.h:8
 msgid ""
 "Generates self-similar linear fractals, including the classic ``C Curve.'' "
 "Written by Rick Campbell."
 msgstr ""
-"Génère des fractales linéaires auto-similaires, notamment la fameuse "
-"''courbe C''. Écrit par Rick Campbell."
+"Génère des fractales linéaires auto-similaires, notamment la fameuse «courbe "
+"C». Écrit par Rick Campbell."
 
 #: hacks/config/circuit.xml.h:1
 msgid "Animates a number of 3D electronic components. Written by Ben Buxton."
-msgstr "Anime plusieurs composants électroniques 3D. Écrit par Ben Buxton."
+msgstr "Anime plusieurs composants électroniques 3D. Écrit par Ben Buxton."
 
 #: hacks/config/circuit.xml.h:2
 msgid "Circuit"
@@ -1943,7 +2004,7 @@ msgstr "Circuit"
 #: hacks/config/circuit.xml.h:3 hacks/config/gflux.xml.h:4
 #: hacks/config/pulsar.xml.h:2
 msgid "Directional Lighting"
-msgstr "Éclairage directionnel"
+msgstr "Éclairage directionnel"
 
 #: hacks/config/circuit.xml.h:5
 msgid "Flat Coloring"
@@ -1955,7 +2016,7 @@ msgstr "Parties"
 
 #: hacks/config/circuit.xml.h:7 hacks/config/flipscreen3d.xml.h:4
 msgid "Rotate"
-msgstr "Rotation"
+msgstr "Rotation globale"
 
 #: hacks/config/circuit.xml.h:8
 msgid "Rotation Speed"
@@ -1964,7 +2025,7 @@ msgstr "Vitesse de rotation"
 #: hacks/config/circuit.xml.h:12 hacks/config/dangerball.xml.h:9
 #: hacks/config/engine.xml.h:7
 msgid "Spin"
-msgstr "Vrille"
+msgstr "Rotation des objets"
 
 #: hacks/config/compass.xml.h:1
 msgid "Compass"
@@ -1981,8 +2042,8 @@ msgid ""
 "This draws a compass, with all elements spinning about randomly, for that "
 "``lost and nauseous'' feeling. Written by Jamie Zawinski."
 msgstr ""
-"Dessine une boussole, dont tous les éléments tournent de manière aléatoire, "
-"pour obtenir ce sentiment de ''mal de mer''. Écrit par Jamie Zawinski."
+"Dessine une boussole, dont tous les éléments tournent de manière aléatoire, "
+"pour obtenir ce sentiment de «mal de mer». Écrit par Jamie Zawinski."
 
 #: hacks/config/coral.xml.h:1 hacks/config/deco.xml.h:1
 #: hacks/config/helix.xml.h:1 hacks/config/imsmap.xml.h:1
@@ -2048,13 +2109,13 @@ msgid ""
 "Draws a system of self-organizing lines. It starts out as random squiggles, "
 "but after a few iterations, order begins to appear. Written by Martin Pool."
 msgstr ""
-"Dessine un système de lignes auto-organisées. Elles commencent sous la forme "
-"de gribouillis aléatoires, mais, après quelques itérations, l'ordre commence "
-"à apparaître. Écrit par Martin Pool."
+"Dessine un système de lignes auto-organisées. Elles commencent sous la forme "
+"de gribouillis aléatoires, mais, après quelques itérations, l'ordre commence "
+"à apparaître. Écrit par Martin Pool."
 
 #: hacks/config/crystal.xml.h:1
 msgid "Center on Screen"
-msgstr "Centré sur l'écran"
+msgstr "Centré sur l'écran"
 
 #: hacks/config/crystal.xml.h:2 hacks/config/deluxe.xml.h:1
 #: hacks/config/fadeplot.xml.h:1 hacks/config/flow.xml.h:3
@@ -2087,41 +2148,37 @@ msgstr "Dessiner une grille"
 
 #: hacks/config/crystal.xml.h:7
 msgid "Horizontal Symmetries"
-msgstr "Symétries horizontales"
+msgstr "Symétries horizontales"
 
 #: hacks/config/crystal.xml.h:9
 msgid ""
 "Moving polygons, similar to a kaleidescope (more like a kaleidescope than "
 "the hack called `kaleid,' actually.) This one by Jouk Jansen."
 msgstr ""
-"Polygones animés, semblables à un kaléidoscope (plus semblables que le hack "
-"'kaleid', en fait.) Par Jouk Jansen."
+"Polygones animés, semblables à un kaléidoscope (plus semblables à un "
+"kaléïdoscope que le hack «kaleid», en fait.) Par Jouk Jansen."
 
 #: hacks/config/crystal.xml.h:14
 msgid "Vertical Symmetries"
-msgstr "Symétries verticales"
+msgstr "Symétries verticales"
 
 #: hacks/config/cubenetic.xml.h:1
 msgid "Boxes"
-msgstr "Boîtes"
+msgstr "Boîtes"
 
 #: hacks/config/cubenetic.xml.h:2
-#, fuzzy
 msgid "Cubenetic"
 msgstr "Rectangles de couleur"
 
 #: hacks/config/cubenetic.xml.h:3
-#, fuzzy
 msgid "Display Solid Colors"
-msgstr "Afficher les secondes"
+msgstr "Afficher des couleurs unies"
 
 #: hacks/config/cubenetic.xml.h:4
-#, fuzzy
 msgid "Display Surface Patterns"
-msgstr "Afficher les étoiles"
+msgstr "Afficher les modèles de surface"
 
 #: hacks/config/cubenetic.xml.h:5
-#, fuzzy
 msgid "Display Wireframe"
 msgstr "Fil de fer"
 
@@ -2197,9 +2254,8 @@ msgstr ""
 #: hacks/config/gltext.xml.h:17 hacks/config/lavalite.xml.h:30
 #: hacks/config/menger.xml.h:20 hacks/config/molecule.xml.h:25
 #: hacks/config/spheremonics.xml.h:25 hacks/config/wander.xml.h:15
-#, fuzzy
 msgid "Wander"
-msgstr "Errance"
+msgstr "Déplacement"
 
 #: hacks/config/cynosure.xml.h:1
 msgid ""
@@ -2208,10 +2264,10 @@ msgid ""
 "clone. That clone was discovered by Jamie Zawinski, and ported to C for "
 "inclusion here."
 msgstr ""
-"Un hack similaire à 'greynetic', en moins frénétique. La première mise en "
-"oeuvre était par Stephen Linhart ; ensuite, Ozymandias G. Desiderata a écrit "
-"un clone de l'applet Java. Il a été découvert par Jamie Zawinski et porté "
-"sur C pour être inclus ici."
+"Un hack similaire à «greynetic», en moins frénétique. La première mise en "
+"oeuvre était par Stephen Linhart; ensuite, Ozymandias G. Desiderata a écrit "
+"un clone de l'applet Java. Il a été découvert par Jamie Zawinski et porté "
+"sur C pour être inclus ici."
 
 #: hacks/config/cynosure.xml.h:2
 msgid "Cynosure"
@@ -2226,11 +2282,10 @@ msgid ""
 "Draws a ball that periodically extrudes many random spikes. Ouch! Written by "
 "Jamie Zawinski."
 msgstr ""
-"Dessine une balle qui se hérisse régulièrement de nombreux picots "
-"aléatoires. Ouille ! Écrit par Jamie Zawinski."
+"Dessine une balle qui se hérisse régulièrement de nombreux picots "
+"aléatoires. Ouille ! Écrit par Jamie Zawinski."
 
 #: hacks/config/dangerball.xml.h:7
-#, fuzzy
 msgid "Spike Count"
 msgstr "Nombre de picots"
 
@@ -2239,13 +2294,12 @@ msgid "Spike Growth"
 msgstr "Croissance des picots"
 
 #: hacks/config/decayscreen.xml.h:1
-#, fuzzy
 msgid "DecayScreen"
-msgstr "Écran fondu"
+msgstr "Écran fondu"
 
 #: hacks/config/decayscreen.xml.h:3
 msgid "Fuzzy Melt"
-msgstr "Fondu brouillé"
+msgstr "Fondu brouillé"
 
 #: hacks/config/decayscreen.xml.h:4
 msgid "Melt Away From Center"
@@ -2264,12 +2318,10 @@ msgid "Melt Down, Right"
 msgstr "Fondu vers le bas et la droite"
 
 #: hacks/config/decayscreen.xml.h:8
-#, fuzzy
 msgid "Melt Left"
 msgstr "Fondu vers la gauche"
 
 #: hacks/config/decayscreen.xml.h:9
-#, fuzzy
 msgid "Melt Right"
 msgstr "Fondu vers la droite"
 
@@ -2294,19 +2346,19 @@ msgid "Melty Melt"
 msgstr "Fondu fondu"
 
 #: hacks/config/decayscreen.xml.h:15
-#, fuzzy
 msgid "Random Melt Style"
-msgstr "Fondu aléatoire"
+msgstr "Fondu aléatoire"
 
 #: hacks/config/decayscreen.xml.h:16
 msgid "Shuffle Melt"
-msgstr "Fondu mélangé"
+msgstr "Fondu mélangé"
 
 #: hacks/config/decayscreen.xml.h:19
 msgid "Stretchy Melt"
-msgstr "Fondu étendu"
+msgstr "Fondu étendu"
 
 #: hacks/config/decayscreen.xml.h:20
+#, fuzzy
 msgid ""
 "This takes an image and makes it melt. You've no doubt seen this effect "
 "before, but no screensaver would really be complete without it. It works "
@@ -2314,15 +2366,15 @@ msgid ""
 "after the screen saver is off, seek medical attention. Written by David Wald "
 "and Vivek Khera."
 msgstr ""
-"Fait fondre une image. Vous avez certainement déjà vu cet effet, mais aucun "
-"programme d'économiseurs d'écran ne pourrait s'en passer. Il fonctionne "
-"particulièrement bien si l'image est colorée. Attention, si l'effet se "
-"poursuit après désactivation de l'économiseur, cherchez de l'aide. Écrit par "
+"Fait fondre une image. Vous avez certainement déjà vu cet effet, mais aucun "
+"programme d'économiseurs d'écran ne pourrait s'en passer. Il fonctionne "
+"particulièrement bien si l'image est colorée. Attention, si l'effet se "
+"poursuit après désactivation de l'économiseur, cherchez de l'aide. Écrit par "
 "David Wald et Vivek Khera."
 
 #: hacks/config/deco.xml.h:3
 msgid "Deco"
-msgstr "Déco"
+msgstr "Déco"
 
 #: hacks/config/deco.xml.h:6 hacks/config/menger.xml.h:5
 #: hacks/config/sierpinski3d.xml.h:4
@@ -2340,10 +2392,10 @@ msgid ""
 "ugly enough to peel paint.'') Written by Jamie Zawinski, inspired by Java "
 "code by Michael Bayne."
 msgstr ""
-"Subdivise et colore des rectangles de manière aléatoire. Ça ressemble à une "
-"sorte de papier peint seventies. (Raven a dit : ''Cet économiseur d'écran "
-"est tellement moche qu'il fait craqueler la peinture.'') Écrit par Jamie "
-"Zawinski, inspiré par un code Java de Michael Bayne."
+"Subdivise et colore des rectangles de manière aléatoire. Ca ressemble à une "
+"sorte de papier peint seventies. (Raven a dit : «Cet économiseur d'écran est "
+"tellement moche qu'il fait craqueler la peinture.») Écrit par Jamie "
+"Zawinski, inspiré par un code Java de Michael Bayne."
 
 #: hacks/config/deco.xml.h:11 hacks/config/rd-bomb.xml.h:23
 #: hacks/config/whirlygig.xml.h:7 hacks/config/xearth.xml.h:33
@@ -2362,23 +2414,22 @@ msgid ""
 "this be both: fast, and flicker-free. Yet another reason X sucks. Written by "
 "Jamie Zawinski."
 msgstr ""
-"Dessine une séquence pulsatile d'étoiles, de cercles et de lignes. Il serait "
-"plus beau s'il était plus rapide, mais à ma connaissance, il est impossible "
+"Dessine une séquence pulsatile d'étoiles, de cercles et de lignes. Il serait "
+"plus beau s'il était plus rapide, mais à ma connaissance, il est impossible "
 "de le rendre rapide sans scintillement. Encore un mauvais point pour X. "
-"Écrit par Jamie Zawinski."
+"Écrit par Jamie Zawinski."
 
 #: hacks/config/deluxe.xml.h:13
 msgid "Transparency"
 msgstr "Transparence"
 
 #: hacks/config/demon.xml.h:1
-#, fuzzy
 msgid ""
 "A cellular automaton that starts with a random field, and organizes it into "
 "stripes and spirals. Written by David Bagley."
 msgstr ""
-"Automate cellulaire qui commence par un champ aléatoire et s'organise en "
-"bandes et spirales. Écrit par David Bagley."
+"Automate cellulaire qui commence par un champ aléatoire et s'organise en "
+"bandes et spirales. Écrit par David Bagley."
 
 #: hacks/config/demon.xml.h:2 hacks/config/petri.xml.h:1
 msgid "Cell Size"
@@ -2386,11 +2437,11 @@ msgstr "Taille de cellule"
 
 #: hacks/config/demon.xml.h:3
 msgid "Demon"
-msgstr "Démon"
+msgstr "Démon"
 
 #: hacks/config/demon.xml.h:11
 msgid "States"
-msgstr "États"
+msgstr "États"
 
 #: hacks/config/discrete.xml.h:1
 msgid "Discrete"
@@ -2401,8 +2452,8 @@ msgid ""
 "More ``discrete map'' systems, including new variants of Hopalong and Julia, "
 "and a few others. Written by Tim Auckland."
 msgstr ""
-"Autres systèmes de ''cartes discrètes'', comprenant de nouvelles variantes "
-"de Hopalong et Julia, ainsi que quelques autres. Écrit par Tim Auckland."
+"Autres systèmes de «cartes discrètes», comprenant de nouvelles variantes de "
+"Hopalong et Julia, ainsi que quelques autres. Écrit par Tim Auckland."
 
 #: hacks/config/distort.xml.h:1
 msgid "Black Hole"
@@ -2435,7 +2486,7 @@ msgstr "Normal"
 
 #: hacks/config/distort.xml.h:10
 msgid "Reflect"
-msgstr "Réfléchir"
+msgstr "Réfléchir"
 
 #: hacks/config/distort.xml.h:14
 msgid "Swamp Thing"
@@ -2447,15 +2498,15 @@ msgid ""
 "wander around the screen, magnifying whatever is underneath. Written by "
 "Jonas Munsin."
 msgstr ""
-"Ce hack capture une image de l'écran et laisse une lentille transparente s'y "
-"promener en agrandissant ce qu'elle réfléchit. Écrit par Jonas Munsin."
+"Ce hack capture une image de l'écran et laisse une lentille transparente s'y "
+"promener en agrandissant ce qu'elle réfléchit. Écrit par Jonas Munsin."
 
 #: hacks/config/distort.xml.h:16 hacks/config/moire.xml.h:12
 #: hacks/config/rd-bomb.xml.h:21 hacks/config/ripples.xml.h:15
 #: hacks/config/rotzoomer.xml.h:10 hacks/config/swirl.xml.h:10
 #: hacks/config/twang.xml.h:15 hacks/config/xflame.xml.h:7
 msgid "Use Shared Memory"
-msgstr "Utiliser une mémoire partagée"
+msgstr "Utiliser une mémoire partagée"
 
 #: hacks/config/distort.xml.h:17
 msgid "Vortex"
@@ -2463,16 +2514,15 @@ msgstr "Vortex"
 
 #: hacks/config/drift.xml.h:1
 msgid "Drift"
-msgstr "Dérive"
+msgstr "Dérive"
 
 #: hacks/config/drift.xml.h:4
-#, fuzzy
 msgid "Fractal Growth"
 msgstr "Croissance fractale"
 
 #: hacks/config/drift.xml.h:5
 msgid "High Dimensional Sphere"
-msgstr "Sphère dimensionnelle"
+msgstr "Sphère dimensionnelle"
 
 #: hacks/config/drift.xml.h:6
 msgid ""
@@ -2480,9 +2530,8 @@ msgid ""
 "cosmic flames?'' Another fine hack from the Scott Draves collection of fine "
 "hacks."
 msgstr ""
-"Comment décrire ceci sinon comme des ''flammes cosmiques fractales "
-"récursives à la dérive ?'' Un nouveau chouette hack de la collection de "
-"Scott Draves ."
+"Comment décrire ceci sinon comme des «flammes cosmiques fractales récursives "
+"à la dérive ?» Un nouveau chouette hack de la collection de Scott Draves."
 
 #: hacks/config/drift.xml.h:7
 msgid "Lissojous Figures"
@@ -2490,7 +2539,7 @@ msgstr "Figures Lissojous"
 
 #: hacks/config/electricsheep.xml.h:1
 msgid "ElectricSheep"
-msgstr "Mouton électrique"
+msgstr "Mouton électrique"
 
 #: hacks/config/electricsheep.xml.h:2
 msgid ""
@@ -2510,17 +2559,17 @@ msgid ""
 msgstr ""
 
 #: hacks/config/endgame.xml.h:2
-#, fuzzy
 msgid "Endgame"
-msgstr "Moteur"
+msgstr "Fin de jeux"
 
 #: hacks/config/engine.xml.h:1
+#, fuzzy
 msgid ""
 "Draws a simple four-stroke engine that floats around the screen. Written by "
 "Ben Buxton."
 msgstr ""
-"Dessine un simple moteur à quatre temps qui flotte sur l'écran. Écrit par "
-"Ben Buxton."
+"Dessine un simple moteur à quatre temps qui flotte sur l'écran. Écrit par "
+"Ben Buxton et Ed Beroset."
 
 #: hacks/config/engine.xml.h:2
 msgid "Engine"
@@ -2528,24 +2577,23 @@ msgstr "Moteur"
 
 #: hacks/config/epicycle.xml.h:4
 msgid "Epicycle"
-msgstr "Épicycle"
+msgstr "Épicycle"
 
 #: hacks/config/epicycle.xml.h:6
 msgid "Harmonics"
 msgstr "Harmoniques"
 
 #: hacks/config/epicycle.xml.h:12
-#, fuzzy
 msgid ""
 "This program draws the path traced out by a point on the edge of a circle. "
 "That circle rotates around a point on the rim of another circle, and so on, "
 "several times. These were the basis for the pre-heliocentric model of "
 "planetary motion. Written by James Youngman."
 msgstr ""
-"Ce programme dessine le chemin tracé par un point sur le bord d'un cercle. "
+"Ce programme dessine le chemin tracé par un point sur le bord d'un cercle. "
 "Ce cercle pivote autour d'un point sur le pourtour d'un autre cercle, et "
-"ainsi de suite, plusieurs fois. Il s'agit de la base du modèle pré-"
-"héliocentrique de révolution planétaire. Écrit par James Youngman."
+"ainsi de suite, plusieurs fois. Il s'agit de la base du modèle pré-"
+"héliocentrique de révolution planétaire. Écrit par James Youngman."
 
 #: hacks/config/euler2d.xml.h:2
 msgid "Euler2d"
@@ -2564,7 +2612,7 @@ msgid ""
 "Simulates two dimensional Incompressible Inviscid Fluid Flow. Written by "
 "Stephen Montgomery-Smith."
 msgstr ""
-"Simule un flux fluide non-visqueux incompressible bidimensionnel. Écrit par "
+"Simule un flux fluide non-visqueux incompressible bidimensionnel. Écrit par "
 "Stephen Montgomery-Smith."
 
 #: hacks/config/extrusion.xml.h:1
@@ -2573,9 +2621,9 @@ msgid ""
 "inside out. Created by David Konerding from the samples that come with the "
 "GL Extrusion library by Linas Vepstas."
 msgstr ""
-"Dessine diverses formes extrudées en rotation qui se tournent, s'allongent "
-"et se retournent. Créé par David Konerding à partir des exemples fournis "
-"avec la bibliothèque GL Extrusion de Linas Vepstas."
+"Dessine diverses formes extrudées en rotation qui se tournent, s'allongent "
+"et se retournent. Créé par David Konerding à partir des exemples fournis "
+"avec la bibliothèque GL Extrusion de Linas Vepstas."
 
 #: hacks/config/extrusion.xml.h:2
 msgid "Extrusion"
@@ -2583,43 +2631,39 @@ msgstr "Extrusion"
 
 #: hacks/config/extrusion.xml.h:4
 msgid "Helix 2"
-msgstr "Hélice 2"
+msgstr "Hélice 2"
 
 #: hacks/config/extrusion.xml.h:5
 msgid "Helix 3"
-msgstr "Hélice 3"
+msgstr "Hélice 3"
 
 #: hacks/config/extrusion.xml.h:6
 msgid "Helix 4"
-msgstr "Hélice 4"
+msgstr "Hélice 4"
 
 #: hacks/config/extrusion.xml.h:7
-#, fuzzy
 msgid "Join Offset"
-msgstr "Joindre décalage"
+msgstr "Décalage de jointure"
 
 #: hacks/config/extrusion.xml.h:8
 msgid "Random Object"
-msgstr "Objet aléatoire"
+msgstr "Objet aléatoire"
 
 #: hacks/config/extrusion.xml.h:9
-#, fuzzy
 msgid "Screw"
-msgstr "Visser"
+msgstr "Vis"
 
 #: hacks/config/extrusion.xml.h:14
 msgid "Taper"
-msgstr "Effiler"
+msgstr "Pic"
 
 #: hacks/config/extrusion.xml.h:15
-#, fuzzy
 msgid "Texture Image"
-msgstr "Texture"
+msgstr "Image de texture"
 
 #: hacks/config/extrusion.xml.h:16
-#, fuzzy
 msgid "Twistoid"
-msgstr "Torsion"
+msgstr "Twistoïd"
 
 #: hacks/config/extrusion.xml.h:17 hacks/config/glplanet.xml.h:9
 #: hacks/config/pulsar.xml.h:19
@@ -2628,19 +2672,17 @@ msgstr "Utiliser les couleurs en aplat"
 
 #: hacks/config/extrusion.xml.h:18 hacks/config/glplanet.xml.h:10
 msgid "Use Lighting"
-msgstr "Utiliser l'éclairage"
+msgstr "Utiliser l'éclairage"
 
 #: hacks/config/fadeplot.xml.h:2
-#, fuzzy
 msgid ""
 "Draws what looks like a waving ribbon following a sinusoidal path. Written "
 "by Bas van Gaalen and Charles Vidal."
 msgstr ""
-"Dessine une sorte de ruban ondulant suivant un chemin sinusoïdal. Écrit par "
+"Dessine une sorte de ruban ondulant suivant un chemin sinusoïdal. Écrit par "
 "Bas van Gaalen et Charles Vidal."
 
 #: hacks/config/fadeplot.xml.h:3
-#, fuzzy
 msgid "FadePlot"
 msgstr "FadePlot"
 
@@ -2664,11 +2706,11 @@ msgid ""
 "``Bob,'' but you can replace the text or the image with a command-line "
 "option. Written by Charles Vidal and Jamie Zawinski."
 msgstr ""
-"Dessine un drapeau coloré qui ondule sur l'écran. Il peut contenir un texte "
-"et des images arbitraires. Par défaut, il affiche le nom système et le type "
-"de système d'exploitation en cours ou une photo de ''Bob'', mais vous pouvez "
-"remplacer le texte ou l'image à l'aide d'une option de ligne de commande. "
-"Écrit par Charles Vidal et Jamie Zawinski."
+"Dessine un drapeau coloré qui ondule sur l'écran. Il peut contenir un texte "
+"et des images arbitraires. Par défaut, il affiche le nom système et le type "
+"de système d'exploitation en cours ou une photo de «Bob», mais vous pouvez "
+"remplacer le texte ou l'image à l'aide d'une option de ligne de commande. "
+"Écrit par Charles Vidal et Jamie Zawinski."
 
 #: hacks/config/flame.xml.h:1 hacks/config/jigsaw.xml.h:1
 #: hacks/config/maze.xml.h:1 hacks/config/rotzoomer.xml.h:1
@@ -2682,11 +2724,11 @@ msgstr "10 secondes"
 
 #: hacks/config/flame.xml.h:3
 msgid "Another iterative fractal generator. Written by Scott Draves."
-msgstr "Un autre générateur fractal itératif. Écrit par Scott Draves."
+msgstr "Un autre générateur fractal itératif. Écrit par Scott Draves."
 
 #: hacks/config/flame.xml.h:4
 msgid "Complexity"
-msgstr "Complexité"
+msgstr "Complexité"
 
 #: hacks/config/flame.xml.h:8
 msgid "Flame"
@@ -2697,9 +2739,8 @@ msgid "Number of Fractals"
 msgstr "Nombre de fractales"
 
 #: hacks/config/flipscreen3d.xml.h:2
-#, fuzzy
 msgid "Flipscreen3d"
-msgstr "Écran retourné 3D"
+msgstr "Écran retourné 3D"
 
 #: hacks/config/flipscreen3d.xml.h:3
 msgid ""
@@ -2716,8 +2757,8 @@ msgid ""
 "Another series of strange attractors: a flowing series of points, making "
 "strange rotational shapes. Written by Jeff Butterworth."
 msgstr ""
-"Une autre série d'attracteurs étranges : une série flottante de points, "
-"constituant d'étranges formes rotatives. Écrit par Jeff Butterworth."
+"Une autre série d'attracteurs étranges : une série flottante de points, "
+"constituant d'étranges formes rotatives. Écrit par Jeff Butterworth."
 
 #: hacks/config/flow.xml.h:5
 msgid "Flow"
@@ -2729,7 +2770,7 @@ msgstr "Geler des abeilles"
 
 #: hacks/config/flow.xml.h:10
 msgid "Ride a Trained Bee"
-msgstr "Utiliser une abeille dressée"
+msgstr "Utiliser une abeille dressée"
 
 #: hacks/config/flow.xml.h:11
 msgid "Rotate Around Attractor"
@@ -2737,7 +2778,7 @@ msgstr "Tourner autour de l'attracteur"
 
 #: hacks/config/flow.xml.h:12
 msgid "Show Bounding Box"
-msgstr "Afficher une boîte bondissante"
+msgstr "Afficher une boîte bondissante"
 
 #: hacks/config/flow.xml.h:14
 msgid "Slow Bees with Antifreeze"
@@ -2745,41 +2786,42 @@ msgstr "Ralentir les abeilles avec de l'antigel"
 
 #: hacks/config/flow.xml.h:19
 msgid "Zoom In and Out"
-msgstr "Zoom avant et arrière"
+msgstr "Zoom avant et arrière"
 
 #: hacks/config/fluidballs.xml.h:1
 msgid "Ball Size"
 msgstr "Taille des balles"
 
 #: hacks/config/fluidballs.xml.h:5
-#, fuzzy
 msgid "FluidBalls"
-msgstr "Balles"
+msgstr "Balles fluides"
 
 #: hacks/config/fluidballs.xml.h:6
+#, fuzzy
 msgid "Freefall"
-msgstr ""
+msgstr "Chute libre"
 
 #: hacks/config/fluidballs.xml.h:7 hacks/config/twang.xml.h:4
 msgid "Friction"
 msgstr "Friction"
 
 #: hacks/config/fluidballs.xml.h:8
+#, fuzzy
 msgid "Glass"
-msgstr ""
+msgstr "Classique"
 
 #: hacks/config/fluidballs.xml.h:9 hacks/config/qix.xml.h:9
 #: hacks/config/speedmine.xml.h:4
 msgid "Gravity"
-msgstr "Gravité"
+msgstr "Gravité"
 
 #: hacks/config/fluidballs.xml.h:10
 msgid "Hurricane"
-msgstr ""
+msgstr "Ouragan"
 
 #: hacks/config/fluidballs.xml.h:11
 msgid "Jupiter"
-msgstr ""
+msgstr "Jupiter"
 
 #: hacks/config/fluidballs.xml.h:14
 msgid ""
@@ -2790,14 +2832,12 @@ msgid ""
 msgstr ""
 
 #: hacks/config/fluidballs.xml.h:15
-#, fuzzy
 msgid "Sandpaper"
-msgstr "Errance"
+msgstr "Papier abrasif"
 
 #: hacks/config/fluidballs.xml.h:16
-#, fuzzy
 msgid "Shake Box"
-msgstr "ShadeBobs"
+msgstr "Remuer la boîte"
 
 #: hacks/config/fluidballs.xml.h:21 hacks/config/glforestfire.xml.h:16
 msgid "Still"
@@ -2805,7 +2845,7 @@ msgstr "Tranquille"
 
 #: hacks/config/fluidballs.xml.h:22
 msgid "Various Ball Sizes"
-msgstr ""
+msgstr "Taille des balles variée"
 
 #: hacks/config/fluidballs.xml.h:23
 msgid "Wind"
@@ -2813,15 +2853,15 @@ msgstr "Vent"
 
 #: hacks/config/forest.xml.h:2 hacks/config/glforestfire.xml.h:6
 msgid "Forest"
-msgstr "Forêt"
+msgstr "Forêt"
 
 #: hacks/config/forest.xml.h:7
 msgid ""
 "This draws fractal trees. Written by Peter Baumung. Everybody loves "
 "fractals, right?"
 msgstr ""
-"Dessine des arbres fractals. Écrit par Peter Baumung. Tout le monde aime les "
-"fractales, n'est-ce pas ?"
+"Dessine des arbres fractals. Écrit par Peter Baumung. Tout le monde aime les "
+"fractales, n'est-ce pas ?"
 
 #: hacks/config/galaxy.xml.h:4
 msgid "Galaxy"
@@ -2842,7 +2882,7 @@ msgid ""
 "Siegmund."
 msgstr ""
 "Dessine des galaxies tournoyantes, qui entrent en collision et dispersent "
-"leurs étoiles aux quatre vents (en quelque sorte). Initialement un programme "
+"leurs étoiles aux quatre vents (en quelque sorte). Initialement un programme "
 "Amiga d'Uli Siegmund."
 
 #: hacks/config/gears.xml.h:3
@@ -2851,11 +2891,11 @@ msgstr "Engrenages"
 
 #: hacks/config/gears.xml.h:4
 msgid "Planetary Gear System"
-msgstr "Train d'engrenages planétaires"
+msgstr "Train d'engrenages planétaires"
 
 #: hacks/config/gears.xml.h:5 hacks/config/goop.xml.h:9
 msgid "Rotational Speed"
-msgstr "Vitesse drotationnel"
+msgstr "Vitesse de rotation"
 
 #: hacks/config/gears.xml.h:9
 msgid ""
@@ -2863,16 +2903,16 @@ msgid ""
 "dimensions. Another GL hack, by Danny Sung, Brian Paul, Ed Mackey, and Jamie "
 "Zawinski."
 msgstr ""
-"Dessine des engrenages qui s'emboîtent et pivotent en trois dimensions. Un "
+"Dessine des engrenages qui s'emboîtent et pivotent en trois dimensions. Un "
 "autre hack GL de Danny Sung, Brian Paul, Ed Mackey et Jamie Zawinski."
 
 #: hacks/config/gears.xml.h:10
 msgid "Three Gear System"
-msgstr "Système à trois engrenages"
+msgstr "Système à trois engrenages"
 
 #: hacks/config/gflux.xml.h:2
 msgid "Checkerboard"
-msgstr "Échiquier"
+msgstr "Échiquier"
 
 #: hacks/config/gflux.xml.h:5
 msgid ""
@@ -2880,25 +2920,23 @@ msgid ""
 "Josiah Pease."
 msgstr ""
 "Dessine des vagues ondulantes sur une grille en rotation en utilisant GL. "
-"Écrit par Josiah Pease."
+"Écrit par Josiah Pease."
 
 #: hacks/config/gflux.xml.h:7
 msgid "Flat Lighting"
-msgstr "Éclairage plat"
+msgstr "Éclairage plat"
 
 #: hacks/config/gflux.xml.h:8
 msgid "GFlux"
 msgstr "GFlux"
 
 #: hacks/config/gflux.xml.h:9
-#, fuzzy
 msgid "Mesh Density"
-msgstr "Densité de maille"
+msgstr "Densité de maille"
 
 #: hacks/config/gflux.xml.h:10
-#, fuzzy
 msgid "Screen Image"
-msgstr "Image écran"
+msgstr "Image écran"
 
 #: hacks/config/gflux.xml.h:14 hacks/config/interference.xml.h:18
 msgid "Wave Speed"
@@ -2914,7 +2952,7 @@ msgstr "Grille en fil de fer"
 
 #: hacks/config/glforestfire.xml.h:2
 msgid "Desert"
-msgstr "Désert"
+msgstr "Désert"
 
 #: hacks/config/glforestfire.xml.h:3
 msgid ""
@@ -2928,12 +2966,10 @@ msgid "Fog"
 msgstr "Brouillard"
 
 #: hacks/config/glforestfire.xml.h:7
-#, fuzzy
 msgid "GLForestFire"
-msgstr "Feu de forêt GL"
+msgstr "Feu de forêt GL"
 
 #: hacks/config/glforestfire.xml.h:8
-#, fuzzy
 msgid "Huge Fire"
 msgstr "Grand incendie"
 
@@ -2965,14 +3001,14 @@ msgid ""
 "wrap any texture around the sphere, e.g., the planetary textures that come "
 "with `ssystem'."
 msgstr ""
-"Dessine une planète qui rebondit dans l'espace. Écrit par David Konerding. "
-"L'image intégrée est un planisphère (extrait de 'xearth'), mais vous pouvez "
-"entourer la sphère d'une texture quelconque, p. ex., les textures "
-"planétaires fournies avec 'ssystem'."
+"Dessine une planète qui rebondit dans l'espace. Écrit par David Konerding. "
+"L'image intégrée est un planisphère (extrait de «xearth»), mais vous pouvez "
+"entourer la sphère d'une texture quelconque, p. ex., les textures "
+"planétaires fournies avec «ssystem»."
 
 #: hacks/config/glplanet.xml.h:3
 msgid "GLPlanet"
-msgstr "Planète GL"
+msgstr "Planète GL"
 
 #: hacks/config/glplanet.xml.h:4
 msgid "Image File"
@@ -2991,7 +3027,7 @@ msgid ""
 "Draws a simulation of the Rubik's Snake puzzle. Written by Jamie Wilkinson, "
 "Andrew Bennetts, and Peter Aylett."
 msgstr ""
-"Dessine une simulation du serpent Rubik. Écrit par Jamie Wilkinson, Andrew "
+"Dessine une simulation du serpent Rubik. Écrit par Jamie Wilkinson, Andrew "
 "Bennetts et Peter Aylett."
 
 #: hacks/config/glsnake.xml.h:6
@@ -2999,32 +3035,28 @@ msgid "GlSnake"
 msgstr "Serpent GL"
 
 #: hacks/config/glsnake.xml.h:7
-#, fuzzy
 msgid "Loose"
-msgstr "Étendu"
+msgstr "Étendu"
 
 #: hacks/config/glsnake.xml.h:8
-#, fuzzy
 msgid "Packing"
 msgstr "En boule"
 
 #: hacks/config/glsnake.xml.h:9
-#, fuzzy
 msgid "Scary Colors"
 msgstr "Couleurs effrayantes"
 
 #: hacks/config/glsnake.xml.h:11
 msgid "Show Labels"
-msgstr "Afficher les étiquettes"
+msgstr "Afficher les étiquettes"
 
 #: hacks/config/glsnake.xml.h:14
-#, fuzzy
 msgid "Tight"
-msgstr "Serré"
+msgstr "Serré"
 
 #: hacks/config/glsnake.xml.h:15 hacks/config/rocks.xml.h:13
 msgid "Velocity"
-msgstr "Vélocité"
+msgstr "Vélocité"
 
 #: hacks/config/glsnake.xml.h:17
 msgid "Y Rotation"
@@ -3040,7 +3072,7 @@ msgid ""
 "Jamie Zawinski."
 msgstr ""
 "Affiche quelques lignes de texte qui tournoient dans une police 3D unie. "
-"Écrit par Jamie Zawinski."
+"Écrit par Jamie Zawinski."
 
 #: hacks/config/gltext.xml.h:4
 msgid "GLText"
@@ -3062,16 +3094,15 @@ msgstr ""
 
 #: hacks/config/goop.xml.h:1
 msgid "Additive Colors (reflected light)"
-msgstr "Couleurs additives (lumière réfléchie)"
+msgstr "Couleurs additives (lumière réfléchie)"
 
 #: hacks/config/goop.xml.h:2
-#, fuzzy
 msgid "Blob Count"
 msgstr "Nombre de taches"
 
 #: hacks/config/goop.xml.h:3
 msgid "Elasticity"
-msgstr "Élasticité"
+msgstr "Élasticité"
 
 #: hacks/config/goop.xml.h:5
 msgid "Goop"
@@ -3087,7 +3118,7 @@ msgstr "Vitesse limite"
 
 #: hacks/config/goop.xml.h:13
 msgid "Subtractive Colors (transmitted light)"
-msgstr "Couleurs soustractives (lumière transmise)"
+msgstr "Couleurs soustractives (lumière transmise)"
 
 #: hacks/config/goop.xml.h:14
 msgid ""
@@ -3099,47 +3130,43 @@ msgid ""
 "effect in real life by having several layers plastic with colored oil "
 "between them. Written by Jamie Zawinski."
 msgstr ""
-"Dessine un ensemble de taches transparentes, animées, semblables à des "
-"amibes. Les taches changent de forme en se déplaçant sur l'écran et sont "
-"translucides,  ce qui permet de voir les taches d'arrière-plan à travers "
+"Dessine un ensemble de taches transparentes, animées, semblables à des "
+"amibes. Les taches changent de forme en se déplaçant sur l'écran et sont "
+"translucides,  ce qui permet de voir les taches d'arrière-plan à travers "
 "celles d'avant-plan. Lorsqu'une tache passe au-dessus d'une autre, leurs "
-"couleurs fusionnent. Écrit par Jamie Zawinski. C'est un super tapis de "
-"souris qui m'en a donné l'idée. Il obtient le même type d'effet en étant "
-"composé de plusieurs couches de plastique séparées par  de l'huile colorée. "
-"Écrit par Jamie Zawinski."
+"couleurs fusionnent. Écrit par Jamie Zawinski. C'est un super tapis de "
+"souris qui m'en a donné l'idée. Il obtient le même type d'effet en étant "
+"composé de plusieurs couches de plastique séparées par  de l'huile colorée. "
+"Écrit par Jamie Zawinski."
 
 #: hacks/config/goop.xml.h:15
-#, fuzzy
 msgid "Transparent Blobs"
 msgstr "Taches transparentes"
 
 #: hacks/config/goop.xml.h:16
-#, fuzzy
 msgid "XOR Blobs"
 msgstr "Taches XOR"
 
 #: hacks/config/grav.xml.h:3
 msgid "Grav"
-msgstr "Gravité"
+msgstr "Gravité"
 
 #: hacks/config/grav.xml.h:6
-#, fuzzy
 msgid "Object Trails"
-msgstr "Traînées d'objets"
+msgstr "Traînées d'objets"
 
 #: hacks/config/grav.xml.h:7
-#, fuzzy
 msgid "Orbital Decay"
-msgstr "Désintégration orbitale"
+msgstr "Désintégration orbitale"
 
 #: hacks/config/grav.xml.h:10
 msgid ""
 "This program draws a simple orbital simulation. If you turn on trails, it "
 "looks kind of like a cloud-chamber photograph. Written by Greg Bowering."
 msgstr ""
-"Ce programme crée une simple simulation orbitale. Si vous activez les "
-"traînées, il ressemble à une sorte de photographie de chambre à brouillard. "
-"Écrit par Greg Bowering."
+"Ce programme crée une simple simulation orbitale. Si vous activez les "
+"traînées, il ressemble à une sorte de photographie de chambre à brouillard. "
+"Écrit par Greg Bowering."
 
 #: hacks/config/greynetic.xml.h:2
 msgid "Greynetic"
@@ -3149,13 +3176,12 @@ msgstr "Rectangles de couleur"
 msgid ""
 "This draws random colored and stippled rectangles. Written by Jamie Zawinski."
 msgstr ""
-"Dessine des rectangles colorés et pointillés de manière aléatoire. Écrit par "
+"Dessine des rectangles colorés et pointillés de manière aléatoire. Écrit par "
 "Jamie Zawinski."
 
 #: hacks/config/halo.xml.h:1
-#, fuzzy
 msgid "Animate Circles"
-msgstr "Cercles animés"
+msgstr "Cercles animés"
 
 #: hacks/config/halo.xml.h:3
 msgid "Halo"
@@ -3167,7 +3193,7 @@ msgstr "Nombre de cercles"
 
 #: hacks/config/halo.xml.h:7 hacks/config/imsmap.xml.h:11
 msgid "Random Mode"
-msgstr "Mode aléatoire"
+msgstr "Mode aléatoire"
 
 #: hacks/config/halo.xml.h:8
 msgid "Seuss Mode"
@@ -3179,19 +3205,19 @@ msgid ""
 "also animate the control-points, but that takes a lot of CPU and bandwidth. "
 "Written by Jamie Zawinski."
 msgstr ""
-"Dessine des motifs circulaires psychédéliques qui font mal aux yeux. Il peut "
-"aussi animer les points de contrôle, mais cette option utilise beaucoup de "
-"ressources processeur et de bande passante. Écrit par Jamie Zawinski."
+"Dessine des motifs circulaires psychédéliques qui font mal aux yeux. Il peut "
+"aussi animer les points de contrôle, mais cette option utilise beaucoup de "
+"ressources processeur et de bande passante. Écrit par Jamie Zawinski."
 
 #: hacks/config/helix.xml.h:4
 msgid "Helix"
-msgstr "Hélice"
+msgstr "Hélix"
 
 #: hacks/config/helix.xml.h:5
 msgid ""
 "This repeatedly generates spirally string-art-ish patterns. Written by Jamie "
 "Zawinski."
-msgstr "Génère de nombreux motifs en spirale. Écrit par Jamie Zawinski."
+msgstr "Génère de nombreux motifs en spirale. Écrit par Jamie Zawinski."
 
 #: hacks/config/hopalong.xml.h:3
 msgid "EJK1"
@@ -3219,7 +3245,7 @@ msgstr "EJK6"
 
 #: hacks/config/hopalong.xml.h:11
 msgid "Hopalong"
-msgstr "Cercles psychédéliques"
+msgstr "Cercles psychédéliques"
 
 #: hacks/config/hopalong.xml.h:12
 msgid "Jong"
@@ -3246,9 +3272,9 @@ msgid ""
 "This draws lacy fractal patterns, based on iteration in the imaginary plane, "
 "from a 1986 Scientific American article. Mostly written by Patrick Naughton."
 msgstr ""
-"Dessine des motifs fractals dentelés, basés sur une itération sur le plan "
-"imaginaire, d'un article scientifique américain de 1986. Principalement "
-"écrit par Patrick Naughton."
+"Dessine des motifs fractals dentelés, basés sur une itération sur le plan "
+"imaginaire, d'un article scientifique américain de 1986. Principalement "
+"écrit par Patrick Naughton."
 
 #: hacks/config/hyperball.xml.h:1 hacks/config/hypercube.xml.h:1
 msgid "Far"
@@ -3264,9 +3290,9 @@ msgid ""
 "projection of the sequence of 3D objects which are the projections of the 4D "
 "analog to the dodecahedron. Written by Joe Keane."
 msgstr ""
-"L'hyperballe est à l'hypercube ce que le dodécaèdre est au cube : il affiche "
-"une projection en 2D de la séquence d'objets 3D qui sont les projections de "
-"l'analogie 4D du dodécaèdre. Écrit par Joe Keane."
+"L'hyperballe est à l'hypercube ce que le dodécaèdre est au cube : il affiche "
+"une projection en 2D de la séquence d'objets 3D qui sont les projections de "
+"l'analogie 4D du dodécaèdre. Écrit par Joe Keane."
 
 #: hacks/config/hyperball.xml.h:7 hacks/config/hypercube.xml.h:6
 msgid "Near"
@@ -3315,35 +3341,34 @@ msgid ""
 "color for the edges of each face. Don't think about it too long, or your "
 "brain will melt. Written by Joe Keane, Fritz Mueller, and Jamie Zawinski."
 msgstr ""
-"Affiche des projections 2D de la séquence d'objets 3D qui sont les "
-"projections de l'analogie 4D du cube : un carré est composé de quatre "
-"lignes, chacune touchant les deux autres ; un cube est composé de six "
-"carrés,  chacun touchant les quatre autres et un hypercube est composé de "
+"Affiche des projections 2D de la séquence d'objets 3D qui sont les "
+"projections de l'analogie 4D du cube : un carré est composé de quatre "
+"lignes, chacune touchant les deux autres; un cube est composé de six "
+"carrés,  chacun touchant les quatre autres et un hypercube est composé de "
 "huit cubes,  chacun touchant les six autres. Pour visualiser la rotation "
-"plus facilement, il utilise une couleur différente pour les bords de chaque "
-"face. N'y réfléchissez pas trop longtemps, votre cerveau pourrait fondre. "
-"Écrit par Joe Keane, Fritz Mueller et Jamie Zawinski."
+"plus facilement, il utilise une couleur différente pour les bords de chaque "
+"face. N'y réfléchissez pas trop longtemps, votre cerveau pourrait fondre. "
+"Écrit par Joe Keane, Fritz Mueller et Jamie Zawinski."
 
 #: hacks/config/ifs.xml.h:2
 msgid "IFS"
-msgstr "SFI"
+msgstr "IFS"
 
 #: hacks/config/ifs.xml.h:7
-#, fuzzy
 msgid ""
 "This one draws spinning, colliding iterated-function-system images. Written "
 "by Massimino Pascal."
 msgstr ""
-"Dessine des images de système de fonctions itérées, qui tournent et entrent "
-"en collision. Écrit par Massimino Pascal."
+"Dessine des images de système de fonctions itérées, qui tournent et entrent "
+"en collision. Écrit par Massimino Pascal."
 
 #: hacks/config/imsmap.xml.h:3
 msgid "Brightness Gradients"
-msgstr "Dégradés de luminosité"
+msgstr "Dégradés de luminosité"
 
 #: hacks/config/imsmap.xml.h:7
 msgid "Hue Gradients"
-msgstr "Dégradés de teinte"
+msgstr "Dégradés de teinte"
 
 #: hacks/config/imsmap.xml.h:8
 msgid "IMSmap"
@@ -3351,7 +3376,7 @@ msgstr "IMSmap"
 
 #: hacks/config/imsmap.xml.h:12
 msgid "Saturation Gradients"
-msgstr "Dégradés de saturation"
+msgstr "Dégradés de saturation"
 
 #: hacks/config/imsmap.xml.h:14
 msgid ""
@@ -3366,17 +3391,17 @@ msgid ""
 "to generate images that look like heat-maps or CAT-scans. Written by Juergen "
 "Nickelsen and Jamie Zawinski."
 msgstr ""
-"Génère des motifs nuageux aléatoires. Son apparence en mode monochrome et "
-"couleur est assez différente. L'idée de base consiste à prendre quatre "
-"points sur le bord de l'image et à leur attribuer une ''élévation'' "
-"aléatoire. Ensuite, il trouve le point situé entre eux et lui attribue une "
-"valeur qui correspond à la moyenne des quatre autres, plus un petit décalage "
-"aléatoire. La coloration s'effectue alors en fonction de l'élévation. La "
-"sélection de couleur est basée sur l'association de l'élévation à la teinte, "
-"la saturation ou la luminosité, des valeurs aléatoires étant attribuées aux "
-"autres paramètres. Le mode ''luminosité'' tend à produire des motifs nuageux "
-"et les autres, à générer des images qui ressemblent à des cartes thermiques "
-"ou des tomodensitogrammes. Écrit par Juergen Nickelsen et Jamie Zawinski."
+"Génère des motifs nuageux aléatoires. Son apparence en mode monochrome et "
+"couleur est assez différente. L'idée de base consiste à prendre quatre "
+"points sur le bord de l'image et à leur attribuer une 'élévation' aléatoire. "
+"Ensuite, il trouve le point situé entre eux et lui attribue une valeur qui "
+"correspond à la moyenne des quatre autres, plus un petit décalage aléatoire. "
+"La coloration s'effectue alors en fonction de l'élévation. La sélection de "
+"couleur est basée sur l'association de l'élévation à la teinte, la "
+"saturation ou la luminosité, des valeurs aléatoires étant attribuées aux "
+"autres paramètres. Le mode ''luminosité'' tend à produire des motifs nuageux "
+"et les autres, à générer des images qui ressemblent à des cartes thermiques "
+"ou des tomodensitogrammes. Écrit par Juergen Nickelsen et Jamie Zawinski."
 
 #: hacks/config/interference.xml.h:1
 msgid "Anim Speed"
@@ -3388,14 +3413,14 @@ msgid ""
 "waves, and allowing them to interfere with each other as their origins move. "
 "Written by Hannu Mallat."
 msgstr ""
-"Un autre hack basé sur des champs de couleur, qui fonctionne en calculant "
-"des vagues sinusoïdales qui se désintègrent et en leur permettant "
-"d'interagir à mesure du déplacement de leurs origines. Écrit par Hannu "
+"Un autre hack basé sur des champs de couleur, qui fonctionne en calculant "
+"des vagues sinusoïdales qui se désintègrent et en leur permettant "
+"d'interagir à mesure du déplacement de leurs origines. Écrit par Hannu "
 "Mallat."
 
 #: hacks/config/interference.xml.h:7
 msgid "Interference"
-msgstr "Interférences"
+msgstr "Interférences"
 
 #: hacks/config/interference.xml.h:10 hacks/config/t3d.xml.h:9
 #: hacks/config/xearth.xml.h:11 hacks/config/zoom.xml.h:5
@@ -3416,7 +3441,7 @@ msgstr "Puzzle"
 
 #: hacks/config/jigsaw.xml.h:6
 msgid "Solved Duration"
-msgstr "Durée de résolution"
+msgstr "Durée de résolution"
 
 #: hacks/config/jigsaw.xml.h:8
 msgid ""
@@ -3427,20 +3452,20 @@ msgid ""
 "sometimes pretty hard to guess what the image is going to look like once the "
 "puzzle is solved. Written by Jamie Zawinski."
 msgstr ""
-"Capture l'écran, le découpe en pièces de puzzle, qu'il mélange, puis remet "
-"en ordre. Fonctionne particulièrement bien lorsque l'image capturée provient "
-"d'un signal vidéo externe et non de l'écran (en fait, je crois que c'est "
-"généralement le cas...). Lorsqu'il capture une image vidéo, il est parfois "
+"Capture l'écran, le découpe en pièces de puzzle, qu'il mélange, puis remet "
+"en ordre. Fonctionne particulièrement bien lorsque l'image capturée provient "
+"d'un signal vidéo externe et non de l'écran (en fait, je crois que c'est "
+"généralement le cas...). Lorsqu'il capture une image vidéo, il est parfois "
 "assez difficile de deviner l'apparence de l'image  une fois le puzzle "
-"résolu. Écrit par Jamie Zawinski."
+"résolu. Écrit par Jamie Zawinski."
 
 #: hacks/config/juggle.xml.h:1
 msgid "Checkered Balls"
-msgstr "Balles à damiers"
+msgstr "Balles à damiers"
 
 #: hacks/config/juggle.xml.h:2
 msgid "Draws a juggling stick-man. Written by Tim Auckland."
-msgstr "Dessine un bonhomme jongleur. Écrit par Tim Auckland."
+msgstr "Dessine un bonhomme jongleur. Écrit par Tim Auckland."
 
 #: hacks/config/juggle.xml.h:4
 msgid "Juggle"
@@ -3452,7 +3477,7 @@ msgstr "Aucun"
 
 #: hacks/config/julia.xml.h:3 hacks/config/rorschach.xml.h:4
 msgid "Iterations"
-msgstr "Itérations"
+msgstr "Itérations"
 
 #: hacks/config/julia.xml.h:4
 msgid "Julia"
@@ -3467,12 +3492,12 @@ msgid ""
 "the image, which indicates the control point from which the rest of the "
 "image was generated. Written by Sean McCullough."
 msgstr ""
-"Dessine des explorations tournoyantes et animées (distinguez-vous déjà un "
-"motif ?) de la courbe de Julia. Vous avez probablement déjà vu des images "
-"statiques de cette forme fractale, mais c'est aussi très sympa en forme "
-"animée. L'élément intéressant est un petit point animé qui passe devant "
-"l'image et qui indique le point de contrôle à partir duquel le reste de "
-"l'image a été généré. Écrit par Sean McCullough."
+"Dessine des explorations tournoyantes et animées (distinguez-vous déjà un "
+"motif ?) de la courbe de Julia. Vous avez probablement déjà vu des images "
+"statiques de cette forme fractale, mais c'est aussi très sympa en forme "
+"animée. L'élément intéressant est un petit point animé qui passe devant "
+"l'image et qui indique le point de contrôle à partir duquel le reste de "
+"l'image a été généré. Écrit par Sean McCullough."
 
 #: hacks/config/kaleidescope.xml.h:1
 msgid ""
@@ -3481,15 +3506,15 @@ msgid ""
 "think it needs more solids, or perhaps just brighter colors. More variations "
 "in the rotational speed might help, too."
 msgstr ""
-"Un autre clone d'un ancien mème, principalement constitué de mouvements "
-"rotatifs frénétiques de lignes colorées. Par Ron Tapia. Les mouvements sont "
+"Un autre clone d'un ancien même, principalement constitué de mouvements "
+"rotatifs frénétiques de lignes colorées. Par Ron Tapia. Les mouvements sont "
 "bien, mais je pense qu'il devrait comporter plus de couleurs unies ou "
 "simplement des couleurs plus vives. Davantage de variations de la vitesse de "
-"rotation seraient aussi appréciables."
+"rotation seraient aussi appréciables."
 
 #: hacks/config/kaleidescope.xml.h:4
 msgid "Kaleidescope"
-msgstr "Kaleïdoscope"
+msgstr "Kaleïdoscope"
 
 #: hacks/config/kaleidescope.xml.h:6 hacks/config/qix.xml.h:18
 msgid "Segments"
@@ -3497,11 +3522,11 @@ msgstr "Segments"
 
 #: hacks/config/kaleidescope.xml.h:9
 msgid "Symmetry"
-msgstr "Symétrie"
+msgstr "Symétrie"
 
 #: hacks/config/kaleidescope.xml.h:10
 msgid "Trails"
-msgstr "Traînées"
+msgstr "Traînées"
 
 #: hacks/config/kumppa.xml.h:5
 msgid "Kumppa"
@@ -3509,15 +3534,15 @@ msgstr "Kumppa"
 
 #: hacks/config/kumppa.xml.h:7
 msgid "Randomize"
-msgstr "Aléatoire"
+msgstr "Aléatoire"
 
 #: hacks/config/kumppa.xml.h:10
 msgid ""
 "Spiraling, spinning, and very, very fast splashes of color rush toward the "
 "screen. Written by Teemu Suutari."
 msgstr ""
-"Des taches de couleur très, très rapides foncent vers l'écran en tournoyant "
-"et en formant des spirales. Écrit par Teemu Suutari."
+"Des taches de couleur très, très rapides foncent vers l'écran en tournoyant "
+"et en formant des spirales. Écrit par Teemu Suutari."
 
 #: hacks/config/lament.xml.h:1
 msgid ""
@@ -3525,9 +3550,9 @@ msgid ""
 "Requires OpenGL, and a machine with fast hardware support for texture maps. "
 "Warning: occasionally opens doors. Written by Jamie Zawinski."
 msgstr ""
-"Anime une simulation du cube de Lemarchand, qui se résout sans cesse. "
-"Nécessite OpenGL et une machine avec prise en charge matérielle rapide des "
-"mappes de texture. Attension : risque d'ouvrir des portes. Écrit par Jamie "
+"Anime une simulation du cube de Lemarchand, qui se résout sans cesse. "
+"Nécessite OpenGL et une machine avec prise en charge matérielle rapide des "
+"mappes de texture. Attension : risque d'ouvrir des portes. Écrit par Jamie "
 "Zawinski."
 
 #: hacks/config/lament.xml.h:3
@@ -3543,8 +3568,8 @@ msgid ""
 "Moving radiating lines, that look vaguely like scanning laser beams. Written "
 "by Pascal Pensa. (Frankie say: relax.)"
 msgstr ""
-"Lignes de radiation animées, qui ressemblent vaguement à des faisceaux laser "
-"de lecture. Écrit par Pascal Pensa. (Frankie a dit : relax.)"
+"Lignes de radiation animées, qui ressemblent vaguement à des faisceaux "
+"laser . Écrit par Pascal Pensa. (Frankie a dit : relax.)"
 
 #: hacks/config/lavalite.xml.h:2
 msgid "10"
@@ -3552,15 +3577,15 @@ msgstr "10"
 
 #: hacks/config/lavalite.xml.h:3
 msgid "Activity"
-msgstr ""
+msgstr "Activité"
 
 #: hacks/config/lavalite.xml.h:4
 msgid "Classic Lavalite"
-msgstr ""
+msgstr "Lavalite classique"
 
 #: hacks/config/lavalite.xml.h:5
 msgid "Cone Lavalite"
-msgstr ""
+msgstr "Lavalite conique"
 
 #: hacks/config/lavalite.xml.h:8
 msgid ""
@@ -3576,49 +3601,47 @@ msgstr ""
 
 #: hacks/config/lavalite.xml.h:9
 msgid "Faceted"
-msgstr ""
+msgstr "A facette"
 
 #: hacks/config/lavalite.xml.h:11
 msgid "Giant Lavalite"
-msgstr ""
+msgstr "Lavalite géante"
 
 #: hacks/config/lavalite.xml.h:13
 msgid "LavaLite"
-msgstr ""
+msgstr "LavaLite"
 
 #: hacks/config/lavalite.xml.h:15
-#, fuzzy
 msgid "Max Blobs"
-msgstr "Taches opaques"
+msgstr "Maximum de blobs"
 
 #: hacks/config/lavalite.xml.h:16
-#, fuzzy
 msgid "Random Lamp Style"
-msgstr "Fondu aléatoire"
+msgstr "Style de lampe aléatoire"
 
 #: hacks/config/lavalite.xml.h:17 hacks/config/spheremonics.xml.h:9
 msgid "Resolution"
-msgstr "Résolution"
+msgstr "Résolution"
 
 #: hacks/config/lavalite.xml.h:18
 msgid "Rocket Lavalite"
-msgstr ""
+msgstr "Lavalite roquette"
 
 #: hacks/config/lavalite.xml.h:27
 msgid "Smooth"
-msgstr ""
+msgstr "Lisse"
 
 #: hacks/config/lightning.xml.h:2
 msgid "Lightning"
-msgstr "Éclairs"
+msgstr "Éclairs"
 
 #: hacks/config/lightning.xml.h:7
 msgid ""
 "This one draws crackling fractal lightning bolts. It's simple, direct, and "
 "to the point. If only it had sound... Written by Keith Romberg."
 msgstr ""
-"Dessine des éclairs fractals. C'est simple, direct et sans fioritures. Si "
-"seulement il avait du son... Écrit par Keith Romberg."
+"Dessine des éclairs fractals. C'est simple, direct et sans fioritures. Si "
+"seulement il avait du son... Écrit par Keith Romberg."
 
 #: hacks/config/lisa.xml.h:4
 msgid "Lisa"
@@ -3626,7 +3649,7 @@ msgstr "Lisa"
 
 #: hacks/config/lisa.xml.h:10
 msgid "Steps"
-msgstr "Étapes"
+msgstr "Étapes"
 
 #: hacks/config/lisa.xml.h:11
 msgid ""
@@ -3635,8 +3658,8 @@ msgid ""
 "was one of these."
 msgstr ""
 "Trace des boucles de Lissajous, par Caleb Cullen. Vous vous souvenez de "
-"l'appareil des prisonniers de la zone fantôme pendant leur procès dans "
-"Superman ? Je crois que c'était quelque chose comme ça."
+"l'appareil des prisonniers de la zone fantôme pendant leur procès dans "
+"Superman ? Je crois que c'était quelque chose comme ça."
 
 #: hacks/config/lissie.xml.h:1
 msgid ""
@@ -3644,7 +3667,7 @@ msgid ""
 "along a path. Written by Alexander Jolk."
 msgstr ""
 "Une autre figure de Lissajous. Elle trace la progression de formes "
-"circulaires le long d'un chemin. Écrit par Alexander Jolk."
+"circulaires le long d'un chemin. Écrit par Alexander Jolk."
 
 #: hacks/config/lissie.xml.h:5
 msgid "Lissie"
@@ -3652,15 +3675,15 @@ msgstr "Lissajous"
 
 #: hacks/config/lmorph.xml.h:1
 msgid "Closed Figures"
-msgstr "Figures fermées"
+msgstr "Figures fermées"
 
 #: hacks/config/lmorph.xml.h:2
 msgid "Control Points"
-msgstr "Points de contrôle"
+msgstr "Points de contrôle"
 
 #: hacks/config/lmorph.xml.h:4
 msgid "Interpolation Steps"
-msgstr "Étapes d'interpolation"
+msgstr "Étapes d'interpolation"
 
 #: hacks/config/lmorph.xml.h:5
 msgid "LMorph"
@@ -3680,14 +3703,14 @@ msgstr "Figures ouvertes"
 
 #: hacks/config/lmorph.xml.h:10
 msgid "Open and Closed Figures"
-msgstr "Figures ouvertes et fermées"
+msgstr "Figures ouvertes et fermées"
 
 #: hacks/config/lmorph.xml.h:15
 msgid ""
 "This generates random spline-ish line drawings and morphs between them. "
 "Written by Sverre H. Huseby and Glenn T. Lines."
 msgstr ""
-"Génère des dessins en trait aléatoires et crée des morphings. Écrit par "
+"Génère des dessins en trait aléatoires et crée des morphings. Écrit par "
 "Sverre H. Huseby et Glenn T. Lines."
 
 #: hacks/config/loop.xml.h:3
@@ -3700,11 +3723,11 @@ msgid ""
 "Written by David Bagley."
 msgstr ""
 "Produit des colonies en forme de boucles qui se reproduisent, vieillissent "
-"et meurent. Écrit par David Bagley."
+"et meurent. Écrit par David Bagley."
 
 #: hacks/config/maze.xml.h:3
 msgid "Backtracking Generator"
-msgstr "Générateur de retour en arrière"
+msgstr "Générateur de retour en arrière"
 
 #: hacks/config/maze.xml.h:5 hacks/config/slidescreen.xml.h:3
 msgid "Grid Size"
@@ -3720,7 +3743,7 @@ msgstr "Ignorer la direction de la sortie"
 
 #: hacks/config/maze.xml.h:8
 msgid "Joining Generator"
-msgstr "Générateur de fusion"
+msgstr "Générateur de fusion"
 
 #: hacks/config/maze.xml.h:9
 msgid "Maze"
@@ -3728,23 +3751,23 @@ msgstr "Labyrinthe"
 
 #: hacks/config/maze.xml.h:10
 msgid "Post-Solve Delay"
-msgstr "Délai post-résolution"
+msgstr "Délai post-résolution"
 
 #: hacks/config/maze.xml.h:11
 msgid "Pre-Solve Delay"
-msgstr "Délai pré-résolution"
+msgstr "Délai pré-résolution"
 
 #: hacks/config/maze.xml.h:12
 msgid "Random Generator"
-msgstr "Générateur aléatoire"
+msgstr "Générateur aléatoire"
 
 #: hacks/config/maze.xml.h:13
 msgid "Seeding Generator"
-msgstr "Générateur d'ensemencement"
+msgstr "Générateur d'ensemencement"
 
 #: hacks/config/maze.xml.h:15
 msgid "Solve Speed"
-msgstr "Vitesse de résolution"
+msgstr "Vitesse de résolution"
 
 #: hacks/config/maze.xml.h:16
 msgid ""
@@ -3752,9 +3775,9 @@ msgid ""
 "generates a random maze, then solves it with visual feedback. Originally by "
 "Jim Randell; modified by a cast of thousands."
 msgstr ""
-"Il s'agit de l'ancienne démo du labyrinthe X, modifiée pour fonctionner avec "
-"xscreensaver. Elle génère un labyrinthe aléatoire, puis le résout avec un "
-"feedback visuel. Initialement par Jim Randell ; modifié par des milliers de "
+"Il s'agit de l'ancienne démo du labyrinthe X, modifiée pour fonctionner avec "
+"xscreensaver. Elle génère un labyrinthe aléatoire, puis le résout avec un "
+"feedback visuel. Initialement par Jim Randell; modifié par des milliers de "
 "gens."
 
 #: hacks/config/menger.xml.h:6
@@ -3767,8 +3790,8 @@ msgid ""
 "cube-based fractal object analagous to the Sierpinski Tetrahedron. Written "
 "by Jamie Zawinski."
 msgstr ""
-"Dessine une variante tridimensionnelle du tamis récursif de Menger, un objet "
-"fractal cubique analogue au tétraèdre de Sierpinski. Écrit par Jamie "
+"Dessine une variante tridimensionnelle du tamis récursif de Menger, un objet "
+"fractal cubique analogue au tétraèdre de Sierpinski. Écrit par Jamie "
 "Zawinski."
 
 #: hacks/config/moebius.xml.h:1
@@ -3776,9 +3799,8 @@ msgid ""
 "Another M. C. Escher hack by Marcelo Vianna, this one draws ``Moebius Strip "
 "II,'' a GL image of ants walking along the surface of a moebius strip."
 msgstr ""
-"Un autre hack de M. C. Escher par Marcelo Vianna. Trace le ''ruban de "
-"Moebius II'', une image GL de fourmis marchant sur la surface d'un ruban de "
-"Moebius."
+"Un autre hack de M. C. Escher par Marcelo Vianna. Trace le «ruban de Moebius "
+"II», une image GL de fourmis marchant sur la surface d'un ruban de Moebius."
 
 #: hacks/config/moebius.xml.h:2
 msgid "Draw Ants"
@@ -3786,7 +3808,7 @@ msgstr "Dessiner des fournis"
 
 #: hacks/config/moebius.xml.h:4
 msgid "Mesh Floor"
-msgstr "Sol grillagé"
+msgstr "Sol grillagé"
 
 #: hacks/config/moebius.xml.h:5
 msgid "Moebius"
@@ -3806,7 +3828,7 @@ msgstr "Moirage"
 
 #: hacks/config/moire.xml.h:8 hacks/config/rorschach.xml.h:6
 msgid "Offset"
-msgstr "Décalage"
+msgstr "Décalage"
 
 #: hacks/config/moire.xml.h:10
 msgid ""
@@ -3818,13 +3840,13 @@ msgid ""
 "just a pair of loops and a handful of arithmetic, giving it a high ``display "
 "hack metric''."
 msgstr ""
-"Trace de jolis motifs d'interférences circulaires. La plupart des cercles "
-"affichés ne sont pas rendus de manière explicite, mais s'affichent comme "
-"résultat d'interactions entre les autres pixels dessinés. Écrit par Jamie "
+"Trace de jolis motifs d'interférences circulaires. La plupart des cercles "
+"affichés ne sont pas rendus de manière explicite, mais s'affichent comme "
+"résultat d'interactions entre les autres pixels dessinés. Écrit par Jamie "
 "Zawinski, sur la base d'un code Java de Michael Bayne. Comme il l'a "
-"souligné, la beauté de ce hackréside dans le fait que le coeur de "
-"l'algorithme d'affichage peut être exprimé avec quelques boucles et "
-"opérations arithmétiques, ce qui lui assure une grande valeur esthétique."
+"souligné, la beauté de ce hackréside dans le fait que le coeur de "
+"l'algorithme d'affichage peut être exprimé avec quelques boucles et "
+"opérations arithmétiques, ce qui lui assure une grande valeur esthétique."
 
 #: hacks/config/moire2.xml.h:1
 msgid ""
@@ -3834,11 +3856,11 @@ msgid ""
 "another, causing the interference lines to ``spray.'' Written by Jamie "
 "Zawinski."
 msgstr ""
-"Un autre exemple de l'amusement qu'offrent les motifs d'interférences "
-"moirés ; ce hack génère des champs de cercles ou ovales concentriques et "
-"associe les plans par différentes opérations. Les plans se déplacent "
-"indépendamment, ce qui entraîne un ''jaillissement'' des lignes "
-"d'interférence. Écrit par Jamie Zawinski."
+"Un autre exemple de l'amusement qu'offrent les motifs d'interférences "
+"moirés; ce hack génère des champs de cercles ou ovales concentriques et "
+"associe les plans par différentes opérations. Les plans se déplacent "
+"indépendamment, ce qui entraîne un 'jaillissement' des lignes "
+"d'interférence. Écrit par Jamie Zawinski."
 
 #: hacks/config/moire2.xml.h:4
 msgid "Moire2"
@@ -3846,7 +3868,7 @@ msgstr "Moirage2"
 
 #: hacks/config/molecule.xml.h:3
 msgid "Describe Molecule"
-msgstr "Décrire la molécule"
+msgstr "Décrire la molécule"
 
 #: hacks/config/molecule.xml.h:5
 msgid "Draw Atomic Bonds"
@@ -3866,17 +3888,17 @@ msgid ""
 "are built in, and it can also read PDB (Protein Data Base) files as input. "
 "Written by Jamie Zawinski."
 msgstr ""
-"Dessine différentes représentations de molécules. Certaines molécules "
-"courantes sont intégrées et le programme peut lire des fichiers PDB (banque "
-"protéique). Écrit par Jamie Zawinski."
+"Dessine différentes représentations de molécules. Certaines molécules "
+"courantes sont intégrées et le programme peut lire des fichiers PDB (banque "
+"protéique). Écrit par Jamie Zawinski."
 
 #: hacks/config/molecule.xml.h:11
 msgid "Label Atoms"
-msgstr "Étiqueter les atomes"
+msgstr "Étiqueter les atomes"
 
 #: hacks/config/molecule.xml.h:12
 msgid "Molecule"
-msgstr "Molécule"
+msgstr "Molécule"
 
 #: hacks/config/molecule.xml.h:13
 msgid "PDB File"
@@ -3887,8 +3909,8 @@ msgid ""
 "Another 3d shape-changing GL hack, by Marcelo Vianna. It has the same shiny-"
 "plastic feel as Superquadrics, as many computer-generated objects do..."
 msgstr ""
-"Un autre hack GL 3D à forme changeante, par Marcelo Vianna. Il a le même "
-"aspect plastique luisantque Superquadriques, comme beaucoup d'objets générés "
+"Un autre hack GL 3D à forme changeante, par Marcelo Vianna. Il a le même "
+"aspect plastique luisantque Superquadriques, comme beaucoup d'objets générés "
 "par ordinateur..."
 
 #: hacks/config/morph3d.xml.h:4
@@ -3900,7 +3922,7 @@ msgid ""
 "Generates random 3d plots that look vaguely mountainous. Written by Pascal "
 "Pensa."
 msgstr ""
-"Génère des graphiques 3D aléatoires d'apparence vaguement montagneuse. Écrit "
+"Génère des graphiques 3D aléatoires d'apparence vaguement montagneuse. Écrit "
 "par Pascal Pensa."
 
 #: hacks/config/mountain.xml.h:5
@@ -3914,10 +3936,10 @@ msgid ""
 "screenhack, some 35 years later. The number of lines of enclosing code has "
 "increased substantially, however. This version is by Tim Showalter."
 msgstr ""
-"DATAI 2 ADDB 1,2 ROTC 2,-22 XOR 1,2 JRST .-4 Comme signalé par HAKMEM, en "
-"1962, Jackson Wright a écrit le code PDP-1 ci-dessus. Ce code est toujours "
-"présent dans ce hack, quelque 35 ans plus tard. Le nombre de lignes de code "
-"a toutefois considérablement augmenté. Cette version est de Tim Showalter."
+"DATAI 2 ADDB 1,2 ROTC 2,-22 XOR 1,2 JRST .-4 Comme signalé par HAKMEM, en "
+"1962, Jackson Wright a écrit le code PDP-1 ci-dessus. Ce code est toujours "
+"présent dans ce hack, quelque 35 ans plus tard. Le nombre de lignes de code "
+"a toutefois considérablement augmenté. Cette version est de Tim Showalter."
 
 #: hacks/config/munch.xml.h:5
 msgid "Munch"
@@ -3952,12 +3974,12 @@ msgid ""
 "Draws different shapes composed of nervously vibrating squiggles, as if seen "
 "through a camera operated by a monkey on crack. By Dan Bornstein."
 msgstr ""
-"Trace différentes formes composées de gribouillis vibrants et nerveux, comme "
-"s'ils étaient filmés par un singe sous amphétamines. Par Dan Bornstein."
+"Trace différentes formes composées de gribouillis vibrants et nerveux, comme "
+"s'ils étaient filmés par un singe sous amphétamines. Par Dan Bornstein."
 
 #: hacks/config/nerverot.xml.h:10
 msgid "Frequent"
-msgstr "Fréquent"
+msgstr "Fréquent"
 
 #: hacks/config/nerverot.xml.h:16
 msgid "NerveRot"
@@ -3965,7 +3987,7 @@ msgstr "NerveRot"
 
 #: hacks/config/nerverot.xml.h:17
 msgid "Nervousness"
-msgstr "Nervosité"
+msgstr "Nervosité"
 
 #: hacks/config/nerverot.xml.h:18 hacks/config/pyro.xml.h:12
 msgid "Seldom"
@@ -3982,9 +4004,9 @@ msgid ""
 "`zippy' or `fortune'. This was extracted from `xnlock' by Dan Heller. "
 "Colorized by Jamie Zawinski."
 msgstr ""
-"Un petit bonhomme avec un gros nez se promène sur l'écran en disant des "
+"Un petit bonhomme avec un gros nez se promène sur l'écran en disant des "
 "choses. Ce qu'il dit peut provenir d'un fichier ou d'un programme externe "
-"comme 'zippy' ou 'fortune'. Extrait de 'xnlock' par Dan Heller. Colorisé par "
+"comme 'zippy' ou 'fortune'. Extrait de 'xnlock' par Dan Heller. Colorisé par "
 "Jamie Zawinski."
 
 #: hacks/config/noseguy.xml.h:2
@@ -4014,7 +4036,7 @@ msgstr "Utiliser le texte ci-dessous"
 
 #: hacks/config/pedal.xml.h:7
 msgid "Pedal"
-msgstr "Pédale"
+msgstr "Pédale"
 
 #: hacks/config/pedal.xml.h:8
 msgid ""
@@ -4023,9 +4045,9 @@ msgid ""
 "an even/odd winding rule. Written by Dale Moore, based on some ancient PDP-"
 "11 code."
 msgstr ""
-"Sorte de combinaison de spirographe/art pauvre. Génère un grand polygone "
+"Sorte de combinaison de spirographe/art pauvre. Génère un grand polygone "
 "complexe et laisse le serveur X faire le plus gros du travail en lui donnant "
-"une règle WIND_EVEN_ODD. Écrit par Dale Moore, basé sur un ancien code PDP-"
+"une règle WIND_EVEN_ODD. Écrit par Dale Moore, basé sur un ancien code PDP-"
 "11."
 
 #: hacks/config/penetrate.xml.h:1
@@ -4038,7 +4060,7 @@ msgstr "Explosions"
 
 #: hacks/config/penetrate.xml.h:5
 msgid "Penetrate"
-msgstr "Pénétrer"
+msgstr "Pénétrer"
 
 #: hacks/config/penetrate.xml.h:7
 msgid "Start badly, but learn"
@@ -4049,7 +4071,7 @@ msgid ""
 "This hack simulates the classic arcade game Missile Command. Written by Adam "
 "Miller."
 msgstr ""
-"Ce hack simule le jeu d'arcade classique Missile Command. Écrit par Adam "
+"Ce hack simule le jeu d'arcade classique Missile Command. Écrit par Adam "
 "Miller."
 
 #: hacks/config/penrose.xml.h:3
@@ -4070,18 +4092,18 @@ msgid ""
 "bottoms on what appears to be the work of a Knight of the Realm, then a last "
 "stand must be taken.'' As reported by News of the Weird #491, 4-jul-1997."
 msgstr ""
-"Dessine des carreaux quasi-périodiques ; pensez aux implications pour la "
-"technologie moderne du formica. Écrit par Timo Korvola. En avril 1997, Sir "
-"Roger Penrose, un professeur de math britannique qui a travaillé avec "
-"Stephen Hawking sur des sujets tels que la relativité, les trous noirs et "
-"l'existence d'un début du temps, a intenté un procès en violation de "
-"copyrightà l'encontre de Kimberly-Clark Corporation, qui, selon Penrose, a "
-"copié un motif qu'il avait créé (qui démontrait qu'un ''motif non répétitif "
-"pouvait exister dans la nature'') pour son papier toilette Kleenex à "
-"carreaux. Penrose a déclaré qu'il n'aimait pas les litiges, mais que ''Si la "
-"population de Grande-Bretagne est invitée par une multinationale à s'essuyer "
-"les fesses sur ce qui semble être l'oeuvre d'un Chevalier du Royaume, des "
-"mesures s'imposent.'' Rapporté par News of the Weird n° 491, 4-jul-1997."
+"Dessine des carreaux quasi-périodiques; pensez aux implications pour la "
+"technologie moderne du formica. Écrit par Timo Korvola. En avril 1997, Sir "
+"Roger Penrose, un professeur de math britannique qui a travaillé avec "
+"Stephen Hawking sur des sujets tels que la relativité, les trous noirs et "
+"l'existence d'un début du temps, a intenté un procès en violation de "
+"copyright à l'encontre de Kimberly-Clark Corporation, qui, selon Penrose, a "
+"copié un motif qu'il avait créé (qui démontrait qu'un ''motif non répétitif "
+"pouvait exister dans la nature'') pour son papier toilette Kleenex à "
+"carreaux. Penrose a déclaré qu'il n'aimait pas les litiges, mais que ''Si la "
+"population de Grande-Bretagne est invitée par une multinationale à s'essuyer "
+"les fesses sur ce qui semble être l'oeuvre d'un Chevalier du Royaume, des "
+"mesures s'imposent.'' Rapporté par News of the Weird n°491, 4-jul-1997."
 
 #: hacks/config/penrose.xml.h:9
 msgid "Penrose"
@@ -4101,15 +4123,15 @@ msgstr "Diamant"
 
 #: hacks/config/petri.xml.h:6
 msgid "Fertility"
-msgstr "Fertilité"
+msgstr "Fertilité"
 
 #: hacks/config/petri.xml.h:12
 msgid "Maxium Lifespan"
-msgstr "Durée de vie maximum"
+msgstr "Durée de vie maximum"
 
 #: hacks/config/petri.xml.h:13
 msgid "Maxium Rate of Death"
-msgstr "Taux de mortalité maximum"
+msgstr "Taux de mortalité maximum"
 
 #: hacks/config/petri.xml.h:14
 msgid "Maxium Rate of Growth"
@@ -4117,11 +4139,11 @@ msgstr "Taux de croissance maximum"
 
 #: hacks/config/petri.xml.h:15
 msgid "Minium Lifespan"
-msgstr "Durée de vie minimum"
+msgstr "Durée de vie minimum"
 
 #: hacks/config/petri.xml.h:16
 msgid "Minium Rate of Death"
-msgstr "Taux de mortalité minimum"
+msgstr "Taux de mortalité minimum"
 
 #: hacks/config/petri.xml.h:17
 msgid "Minium Rate of Growth"
@@ -4129,11 +4151,11 @@ msgstr "Taux de croissance minimum"
 
 #: hacks/config/petri.xml.h:18
 msgid "Mold Varieties"
-msgstr "Variétés de moisissures"
+msgstr "Variétés de moisissures"
 
 #: hacks/config/petri.xml.h:19
 msgid "Offspring"
-msgstr "Progéniture"
+msgstr "Progéniture"
 
 #: hacks/config/petri.xml.h:20
 msgid "Petri"
@@ -4149,7 +4171,7 @@ msgstr "Lentement"
 
 #: hacks/config/petri.xml.h:26
 msgid "Square"
-msgstr "Carré"
+msgstr "Carré"
 
 #: hacks/config/petri.xml.h:27
 msgid ""
@@ -4157,9 +4179,9 @@ msgid ""
 "circles overlap and leave spiral interference in their wake. Written by Dan "
 "Bornstein."
 msgstr ""
-"Simule des colonies de moisissures qui poussent dans une boîte de Petri. Des "
-"cercles colorés grandissent, se chevauchent et laissent des interférences en "
-"spirale à leur suite. Écrit par Dan Bornstein."
+"Simule des colonies de moisissures qui poussent dans une boîte de Petri. Des "
+"cercles colorés grandissent, se chevauchent et laissent des interférences en "
+"spirale à leur suite. Écrit par Dan Bornstein."
 
 #: hacks/config/phosphor.xml.h:1
 msgid ""
@@ -4168,8 +4190,8 @@ msgid ""
 "Written by Jamie Zawinski."
 msgstr ""
 "Dessine une simulation d'un vieux terminal, avec de grands pixels et du "
-"phosphore de longue durée. Il peut exécuter n'importe quel programme comme "
-"source du texte qu'il affiche. Écrit par Jamie Zawinski."
+"phosphore de longue durée. Il peut exécuter n'importe quel programme comme "
+"source du texte qu'il affiche. Écrit par Jamie Zawinski."
 
 #: hacks/config/phosphor.xml.h:2
 msgid "Fade"
@@ -4181,19 +4203,19 @@ msgstr "Phosphore"
 
 #: hacks/config/phosphor.xml.h:5
 msgid "Scale"
-msgstr "Échelle"
+msgstr "Échelle"
 
 #: hacks/config/pipes.xml.h:1
 msgid "Allow Tight Turns"
-msgstr "Autoriser des virages serrés"
+msgstr "Autoriser des virages serrés"
 
 #: hacks/config/pipes.xml.h:2
 msgid "Ball Joints"
-msgstr "Raccords à boule"
+msgstr "Raccords à boule"
 
 #: hacks/config/pipes.xml.h:3
 msgid "Curved Pipes"
-msgstr "Canalisations courbées"
+msgstr "Canalisations courbées"
 
 #: hacks/config/pipes.xml.h:6
 msgid "Fisheye Lens"
@@ -4208,8 +4230,8 @@ msgid ""
 "If you've ever been in the same room with a Windows NT machine, you've "
 "probably seen this GL hack. This version is by Marcelo Vianna."
 msgstr ""
-"Si vous avez déjà croisé la route d'une machine Windows NT, vous avez "
-"certainement déjà vu ce hack GL. Cette version est de Marcelo Vianna."
+"Si vous avez déjà croisé la route d'une machine Windows NT, vous avez "
+"certainement déjà vu ce hack GL. Cette version est de Marcelo Vianna."
 
 #: hacks/config/pipes.xml.h:9
 msgid "Lots"
@@ -4217,7 +4239,7 @@ msgstr "Lots"
 
 #: hacks/config/pipes.xml.h:11
 msgid "Number of Pipe Systems"
-msgstr "Nombre de systèmes de canalisation"
+msgstr "Nombre de systèmes de canalisation"
 
 #: hacks/config/pipes.xml.h:12
 msgid "Pipe Fittings"
@@ -4229,11 +4251,11 @@ msgstr "Canalisations"
 
 #: hacks/config/pipes.xml.h:17
 msgid "System Length"
-msgstr "Longueur du système"
+msgstr "Longueur du système"
 
 #: hacks/config/polyominoes.xml.h:3
 msgid "Identical Pieces"
-msgstr "Pièces identiques"
+msgstr "Pièces identiques"
 
 #: hacks/config/polyominoes.xml.h:7
 msgid "Polyominoes"
@@ -4244,8 +4266,8 @@ msgid ""
 "Repeatedly attempts to completely fill a rectangle with irregularly-shaped "
 "puzzle pieces. Written by Stephen Montgomery-Smith."
 msgstr ""
-"Tente sans cesse de remplir entièrement un rectangle à l'aide de pièces de "
-"puzzle de formes irrégulières. Écrit par Stephen Montgomery-Smith."
+"Tente sans cesse de remplir entièrement un rectangle à l'aide de pièces de "
+"puzzle de formes irrégulières. Écrit par Stephen Montgomery-Smith."
 
 #: hacks/config/pulsar.xml.h:1
 msgid "Anti-alias Lines"
@@ -4257,14 +4279,14 @@ msgid ""
 "and mipmaps, plus a ``frames per second'' meter so that you can tell how "
 "fast your graphics card is... Requires OpenGL. Written by David Konerding."
 msgstr ""
-"Dessine des plans en intersection en utilisant le mélange de valeurs alpha, "
+"Dessine des plans en intersection en utilisant le mélange de valeurs alpha, "
 "le brouillard, des textures, et des mipmaps, plus une mesure ''images par "
-"seconde'' pour que vous puissiez calculer la rapidité de votre carte "
-"graphique... Nécessite OpenGL. Écrit par David Konerding."
+"seconde'' pour que vous puissiez calculer la rapidité de votre carte "
+"graphique... Nécessite OpenGL. Écrit par David Konerding."
 
 #: hacks/config/pulsar.xml.h:4
 msgid "Enable Blending"
-msgstr "Activer le mélange"
+msgstr "Activer le mélange"
 
 #: hacks/config/pulsar.xml.h:5
 msgid "Enable Depth Buffer"
@@ -4276,7 +4298,7 @@ msgstr "Activer le brouillard"
 
 #: hacks/config/pulsar.xml.h:7
 msgid "Enable Lighting"
-msgstr "Activer l'éclairage"
+msgstr "Activer l'éclairage"
 
 #: hacks/config/pulsar.xml.h:8
 msgid "Enable Texture Filtering"
@@ -4312,7 +4334,7 @@ msgstr "Production d'explosions"
 
 #: hacks/config/pyro.xml.h:6
 msgid "Launch Frequency"
-msgstr "Fréquence de lancement"
+msgstr "Fréquence de lancement"
 
 #: hacks/config/pyro.xml.h:8
 msgid "Often"
@@ -4320,7 +4342,7 @@ msgstr "Souvent"
 
 #: hacks/config/pyro.xml.h:9
 msgid "Particle Density"
-msgstr "Densité des particules"
+msgstr "Densité des particules"
 
 #: hacks/config/pyro.xml.h:10
 msgid "Pyro"
@@ -4330,7 +4352,7 @@ msgstr "Pyro"
 msgid ""
 "Pyro draws exploding fireworks. Blah blah blah. Written by Jamie Zawinski."
 msgstr ""
-"Pyro dessine des feux d'artifices en explosion. Bla bla. Écrit par Jamie "
+"Pyro dessine des feux d'artifices en explosion. Bla bla. Écrit par Jamie "
 "Zawinski."
 
 #: hacks/config/qix.xml.h:1
@@ -4347,7 +4369,7 @@ msgstr "Segments de ligne"
 
 #: hacks/config/qix.xml.h:12
 msgid "Linear Motion"
-msgstr "Mouvement linéaire"
+msgstr "Mouvement linéaire"
 
 #: hacks/config/qix.xml.h:15
 msgid "Max Size"
@@ -4359,7 +4381,7 @@ msgstr "Qix"
 
 #: hacks/config/qix.xml.h:17
 msgid "Random Motion"
-msgstr "Mouvement aléatoire"
+msgstr "Mouvement aléatoire"
 
 #: hacks/config/qix.xml.h:23
 msgid "Subtractive Colors"
@@ -4372,10 +4394,10 @@ msgid ""
 "to produce all sorts of different presentations: line segments, filled "
 "polygons, overlapping translucent areas... Written by Jamie Zawinski."
 msgstr ""
-"La tronçonneuse suisse des programmes qix. Fait rebondir une série de "
-"segments de lignes sur l'écran et utilise des variations de ce modèle de "
-"mouvement de base pour produire toutes sortes de présentations différentes : "
-"segments de ligne, polygones pleins, zones translucides superposées... Écrit "
+"La tronçonneuse suisse des programmes qix. Fait rebondir une série de "
+"segments de lignes sur l'écran et utilise des variations de ce modèle de "
+"mouvement de base pour produire toutes sortes de présentations différentes : "
+"segments de ligne, polygones pleins, zones translucides superposées... Écrit "
 "par Jamie Zawinski."
 
 #: hacks/config/qix.xml.h:25
@@ -4384,7 +4406,7 @@ msgstr "Transparent"
 
 #: hacks/config/queens.xml.h:2
 msgid "Queens"
-msgstr ""
+msgstr "Reines"
 
 #: hacks/config/queens.xml.h:5
 msgid ""
@@ -4413,17 +4435,17 @@ msgid ""
 "of growing square-like shapes that, once they overtake each other, react in "
 "unpredictable ways. ``RD'' stands for reaction-diffusion."
 msgstr ""
-"Une autre variation du programme 'Bomb' de Scott Draves. Dessine une grille "
-"de formes carrées croissantes qui, une fois qu'elles se rejoignent, "
-"réagissent de façon imprévisible. ''RD'' signifie réaction-diffusion."
+"Une autre variation du programme «Bomb» de Scott Draves. Dessine une grille "
+"de formes carrées croissantes qui, une fois qu'elles se rejoignent, "
+"réagissent de façon imprévisible. 'RD' signifie réaction-diffusion."
 
 #: hacks/config/rd-bomb.xml.h:8
 msgid "Epoch"
-msgstr "Époque"
+msgstr "Époque"
 
 #: hacks/config/rd-bomb.xml.h:10
 msgid "Fill Screen"
-msgstr "Remplir l'écran"
+msgstr "Remplir l'écran"
 
 #: hacks/config/rd-bomb.xml.h:14
 msgid "RD-Bomb"
@@ -4431,7 +4453,7 @@ msgstr "Bombe RD"
 
 #: hacks/config/rd-bomb.xml.h:15
 msgid "Reaction/Difusion"
-msgstr "Réaction/Diffusion"
+msgstr "Réaction/Diffusion"
 
 #: hacks/config/rd-bomb.xml.h:16
 msgid "Seed Radius"
@@ -4439,11 +4461,11 @@ msgstr "Rayon du germe"
 
 #: hacks/config/rd-bomb.xml.h:19 hacks/config/twang.xml.h:12
 msgid "Tile Size"
-msgstr "Taille des mosaïques"
+msgstr "Taille des mosaïques"
 
 #: hacks/config/rd-bomb.xml.h:22
 msgid "Wander Speed"
-msgstr "Vitesse de déplacement"
+msgstr "Vitesse de déplacement"
 
 #: hacks/config/ripples.xml.h:1
 msgid "Big Drops"
@@ -4459,19 +4481,19 @@ msgstr "Bruine"
 
 #: hacks/config/ripples.xml.h:5
 msgid "Grab Screen Image"
-msgstr "Capturer l'écran"
+msgstr "Capturer l'écran"
 
 #: hacks/config/ripples.xml.h:6
 msgid "Lighting Effect"
-msgstr "Effet d'éclairage"
+msgstr "Effet d'éclairage"
 
 #: hacks/config/ripples.xml.h:8
 msgid "Moving Splashes"
-msgstr "Éclaboussures mobiles"
+msgstr "Éclaboussures mobiles"
 
 #: hacks/config/ripples.xml.h:9
 msgid "Psychedelic Colors"
-msgstr "Couleurs psychédéliques"
+msgstr "Couleurs psychédéliques"
 
 #: hacks/config/ripples.xml.h:10
 msgid "Ripples"
@@ -4483,7 +4505,7 @@ msgstr "Petites gouttes"
 
 #: hacks/config/ripples.xml.h:13
 msgid "Storm"
-msgstr "Tempête"
+msgstr "Tempète"
 
 #: hacks/config/ripples.xml.h:14
 msgid ""
@@ -4491,9 +4513,9 @@ msgid ""
 "water option, it manipulates your desktop image to look like something is "
 "dripping into it. Written by Tom Hammersley."
 msgstr ""
-"Dessine des motifs d'interférences ondulants qui ressemblent à des "
-"éclaboussures d'eau. Avec l'option -eau, manipule votre image bureau pour "
-"que quelque chose ait l'air de l'éclabousser. Écrit par Tom Hammersley."
+"Dessine des motifs d'interférences ondulants qui ressemblent à des "
+"éclaboussures d'eau. Avec l'option '-water', manipule votre image bureau "
+"pour que quelque chose ait l'air de l'éclabousser. Écrit par Tom Hammersley."
 
 #: hacks/config/rocks.xml.h:7
 msgid "Rocks"
@@ -4504,7 +4526,6 @@ msgid "Rotation"
 msgstr "Rotation"
 
 #: hacks/config/rocks.xml.h:10
-#, fuzzy
 msgid "Steering"
 msgstr "Direction"
 
@@ -4514,9 +4535,9 @@ msgid ""
 "rotation and direction. It can also display 3D separations for red/blue "
 "glasses! Mostly written by Jamie Zawinski."
 msgstr ""
-"Dessine une animation de vol dans un champ d'astéroïdes, dont la  rotation "
-"et la direction changent. Peut également afficher des séparations 3D pour "
-"les verres rouges/bleus ! Principalement écrit par Jamie Zawinski."
+"Dessine une animation de vol dans un champ d'astéroïdes, dont la  rotation "
+"et la direction changent. Peut également afficher des séparations 3D pour "
+"les verres rouges/bleus ! Principalement écrit par Jamie Zawinski."
 
 #: hacks/config/rorschach.xml.h:7
 msgid "Rorschach"
@@ -4530,19 +4551,19 @@ msgid ""
 "neurotic tendencies which this program reveals are your own problem. Written "
 "by Jamie Zawinski."
 msgstr ""
-"Génère des motifs de taches d'encre aléatoires. L'algorithme est "
-"incroyablement simple pour un si bon fonctionnement ; il déplace simplement "
-"un point sur l'écran au hasard et reflète l'image horizontalement et/ou "
-"verticalement. Vous êtes responsable de toutes les tendances névrotiques "
-"enfouies que ce programme pourrait révéler. Écrit par Jamie Zawinski."
+"Génère des motifs de taches d'encre aléatoires. L'algorithme est "
+"incroyablement simple pour un si bon fonctionnement; il déplace simplement "
+"un point sur l'écran au hasard et reflète l'image horizontalement et/ou "
+"verticalement. Vous êtes responsable de toutes les tendances névrotiques "
+"enfouies que ce programme pourrait révéler. Écrit par Jamie Zawinski."
 
 #: hacks/config/rorschach.xml.h:10
 msgid "With X Symmetry"
-msgstr "Avec symétrie X"
+msgstr "Avec symétrie X"
 
 #: hacks/config/rorschach.xml.h:11
 msgid "With Y Symmetry"
-msgstr "Avec symétrie Y"
+msgstr "Avec symétrie Y"
 
 #: hacks/config/rotor.xml.h:1
 msgid ""
@@ -4567,7 +4588,7 @@ msgid ""
 "Creates a collage of rotated and scaled portions of the screen. Written by "
 "Claudio Matsuoka."
 msgstr ""
-"Crée un collage de portions pivotées et mises à l'échelle de l'écran. Écrit "
+"Crée un collage de portions pivotées et mises à l'échelle de l'écran. Écrit "
 "par Claudio Matsuoka."
 
 #: hacks/config/rotzoomer.xml.h:6
@@ -4595,8 +4616,8 @@ msgid ""
 "Draws a Rubik's Cube that rotates in three dimensions and repeatedly "
 "shuffles and solves itself. Another fine GL hack by Marcelo Vianna."
 msgstr ""
-"Dessine un Rubik's Cube qui pivote en trois dimensions et  se mélange et se "
-"résout sans cesse. Un autre beau hack GL de Marcelo Vianna."
+"Dessine un Rubik's Cube qui pivote en trois dimensions et  se mélange et se "
+"résout sans cesse. Un autre beau hack GL de Marcelo Vianna."
 
 #: hacks/config/rubik.xml.h:5
 msgid "Rubik"
@@ -4604,7 +4625,7 @@ msgstr "Rubik"
 
 #: hacks/config/rubik.xml.h:7
 msgid "Show Shuffling"
-msgstr "Afficher le mélange"
+msgstr "Afficher le mélange"
 
 #: hacks/config/sballs.xml.h:1
 msgid "Cube"
@@ -4612,27 +4633,22 @@ msgstr "Cube"
 
 #: hacks/config/sballs.xml.h:2
 msgid "Dodecahedron"
-msgstr "Dodécaèdre"
+msgstr "Dodécaèdre"
 
 #: hacks/config/sballs.xml.h:3
-#, fuzzy
 msgid ""
 "Draws an animation of textured balls spinning like crazy in GL. Requires "
 "OpenGL, and a machine with fast hardware support for texture maps. Written "
 "by Eric Lassauge &lt;lassauge@mail.dotcom.fr&gt;."
 msgstr ""
-"Anime une simulation du cube de Lemarchand, qui se résout sans cesse. "
-"Nécessite OpenGL et une machine avec prise en charge matérielle rapide des "
-"mappes de texture. Attension : risque d'ouvrir des portes. Écrit par Jamie "
-"Zawinski."
 
 #: hacks/config/sballs.xml.h:5
 msgid "Icosahedron"
-msgstr "Icosaèdre"
+msgstr "Icosaèdre"
 
 #: hacks/config/sballs.xml.h:7
 msgid "Octahedron"
-msgstr "Octaèdre"
+msgstr "Octaèdre"
 
 #: hacks/config/sballs.xml.h:8
 msgid "Plane"
@@ -4644,7 +4660,7 @@ msgstr "Pyramide"
 
 #: hacks/config/sballs.xml.h:10
 msgid "Random"
-msgstr "Aléatoire"
+msgstr "Aléatoire"
 
 #: hacks/config/sballs.xml.h:11
 msgid "Sballs"
@@ -4652,11 +4668,11 @@ msgstr "Sballs"
 
 #: hacks/config/sballs.xml.h:15
 msgid "Star"
-msgstr "Étoile"
+msgstr "Étoile"
 
 #: hacks/config/sballs.xml.h:16
 msgid "Tetrahedron"
-msgstr "Tétraèdre"
+msgstr "Tétraèdre"
 
 #: hacks/config/shadebobs.xml.h:7
 msgid "ShadeBobs"
@@ -4667,8 +4683,8 @@ msgid ""
 "This draws smoothly-shaded oscilating oval patterns, that look something "
 "like vapor trails or neon tubes. Written by Shane Smit."
 msgstr ""
-"Dessine des formes ovoïdes oscillantes et d'aspect lisse, qui ressemblent un "
-"peu à des traînées de vapeur ou des tubes au néon. Écrit par Shane Smit."
+"Dessine des formes ovoïdes oscillantes et d'aspect lisse, qui ressemblent un "
+"peu à des traînées de vapeur ou des tubes au néon. Écrit par Shane Smit."
 
 #: hacks/config/sierpinski.xml.h:6
 msgid "Sierpinski"
@@ -4679,8 +4695,8 @@ msgid ""
 "This draws the two-dimensional variant of the recursive Sierpinski triangle "
 "fractal. Written by Desmond Daignault."
 msgstr ""
-"Dessine la variante bidimensionnelle de la fractale triangulaire récursive "
-"de Sierpinski. Écrit par Desmond Daignault."
+"Dessine la variante bidimensionnelle de la fractale triangulaire récursive "
+"de Sierpinski. Écrit par Desmond Daignault."
 
 #: hacks/config/sierpinski3d.xml.h:7
 msgid "Sierpinski3D"
@@ -4691,8 +4707,8 @@ msgid ""
 "This draws the three-dimensional variant of the recursive Sierpinski "
 "triangle fractal, using GL. Written by Tim Robinson and Jamie Zawinski."
 msgstr ""
-"Dessine la variante tridimensionnelle de la fractale triangulaire récursive "
-"de Sierpinski, à l'aide de GL. Écrit par Tim Robinson et Jamie Zawinski."
+"Dessine la variante tridimensionnelle de la fractale triangulaire récursive "
+"de Sierpinski, à l'aide de GL. Écrit par Tim Robinson et Jamie Zawinski."
 
 #: hacks/config/slidescreen.xml.h:1 hacks/config/twang.xml.h:1
 #: hacks/config/zoom.xml.h:1
@@ -4705,7 +4721,7 @@ msgstr "Vitesse de glissement"
 
 #: hacks/config/slidescreen.xml.h:5
 msgid "SlideScreen"
-msgstr "Glissement d'écran"
+msgstr "Glissement d'écran"
 
 #: hacks/config/slidescreen.xml.h:8
 msgid ""
@@ -4715,10 +4731,10 @@ msgid ""
 "those puzzles, but watching one permute itself is more amusing. Written by "
 "Jamie Zawinski."
 msgstr ""
-"Prend une image, la divise pour former une grille et mélange au hasard les "
-"carrés comme l'un de ces jeux ennuyeux comprenant une grille de carrés dont "
-"l'un est manquant. Je déteste essayer de résoudre ces puzzles, mais c'est "
-"plus amusant d'en voir un se résoudre lui-même. Écrit par Jamie Zawinski."
+"Prend une image, la divise pour former une grille et mélange au hasard les "
+"carrés comme l'un de ces jeux ennuyeux comprenant une grille de carrés dont "
+"l'un est manquant. Je déteste essayer de résoudre ces puzzles, mais c'est "
+"plus amusant d'en voir un se résoudre lui-même. Écrit par Jamie Zawinski."
 
 #: hacks/config/slip.xml.h:6
 msgid "Slip"
@@ -4734,21 +4750,21 @@ msgid ""
 "desktop to chew on. Originally written by Scott Draves; whacked on by Jamie "
 "Zawinski."
 msgstr ""
-"Ce programme affiche des éléments aléatoires à l'écran, puis les aspire dans "
-"un réacteur et les fait ressortir. Pour ne pas réduire complètement l'image "
+"Ce programme affiche des éléments aléatoires à l'écran, puis les aspire dans "
+"un réacteur et les fait ressortir. Pour ne pas réduire complètement l'image "
 "en bouillie, il injectera de temps en temps des taches de couleur dans la "
-"scène, entamera un cycle d'essorage, étendra l'image comme un caramel ou (ma "
+"scène, entamera un cycle d'essorage, étendra l'image comme un caramel ou (ma "
 "touche personnelle) capturera l'image de votre bureau actuel pour la "
-"retourner. Initialement écrit par Scott Draves ; bouleversé par Jamie "
+"retourner. Initialement écrit par Scott Draves ; bouleversé par Jamie "
 "Zawinski."
 
 #: hacks/config/sonar.xml.h:1
 msgid "Ping Subnet"
-msgstr "Sous-réseau ping"
+msgstr "Sous-réseau ping"
 
 #: hacks/config/sonar.xml.h:2
 msgid "Simulation Team Members"
-msgstr "Membres de l'équipe de simulation"
+msgstr "Membres de l'équipe de simulation"
 
 #: hacks/config/sonar.xml.h:3
 msgid "Sonar"
@@ -4756,11 +4772,11 @@ msgstr "Sonar"
 
 #: hacks/config/sonar.xml.h:4
 msgid "Team A Name"
-msgstr "Nom de l'équipe A"
+msgstr "Nom de l'équipe A"
 
 #: hacks/config/sonar.xml.h:5
 msgid "Team B Name"
-msgstr "Nom de l'équipe B"
+msgstr "Nom de l'équipe B"
 
 #: hacks/config/sonar.xml.h:6
 msgid ""
@@ -4771,13 +4787,13 @@ msgid ""
 "make it monitor other sources of data, too. (Processes? Active network "
 "connections? CPU usage per user?) Written by Stephen Martin."
 msgstr ""
-"Ce programme dessine une simulation d'un écran de sonar. Écrit par défaut, "
-"il affiche un assortiment aléatoire de ''trucs'' à l'écran, mais, s'il est "
-"compilé correctement, il peut effectuer un ping sur votre réseau local et "
-"calculer  la proximité des autres hôtes du réseau par rapport à vous. Il "
-"serait facile de lui faire aussi surveiller d'autres sources de données. "
-"(Processus ? Connexions au réseau actif ? Utilisation du processeur par "
-"utilisateur ?) Écrit par Stephen Martin."
+"Ce programme dessine une simulation d'un écran de sonar. Écrit par défaut, "
+"il affiche un assortiment aléatoire de 'trucs' à l'écran, mais, s'il est "
+"compilé correctement, il peut effectuer un ping sur votre réseau local et "
+"calculer  la proximité des autres hôtes du réseau par rapport à vous. Il "
+"serait facile de lui faire aussi surveiller d'autres sources de données. "
+"(Processus ? Connexions au réseau actif ? Utilisation du processeur par "
+"utilisateur ?) Écrit par Stephen Martin."
 
 #: hacks/config/sonar.xml.h:7
 msgid "vs."
@@ -4785,7 +4801,7 @@ msgstr "contre"
 
 #: hacks/config/speedmine.xml.h:1
 msgid "Allow Wall Collisions"
-msgstr "Éviter les collisions avec le mur"
+msgstr "Éviter les collisions avec le mur"
 
 #: hacks/config/speedmine.xml.h:2
 msgid "Display Crosshair"
@@ -4793,7 +4809,7 @@ msgstr "Afficher le viseur"
 
 #: hacks/config/speedmine.xml.h:7
 msgid "Max Velocity"
-msgstr "Vélocité max."
+msgstr "Vélocité max."
 
 #: hacks/config/speedmine.xml.h:8
 msgid "Mine Shaft"
@@ -4801,7 +4817,7 @@ msgstr "Puits de mine"
 
 #: hacks/config/speedmine.xml.h:9
 msgid "Present Bonuses"
-msgstr "Bonus présents"
+msgstr "Bonus présents"
 
 #: hacks/config/speedmine.xml.h:10
 msgid "Rocky Walls"
@@ -4813,7 +4829,7 @@ msgid ""
 "by Conrad Parker."
 msgstr ""
 "Simule la descente dans un puits de mine rocheux ou affiche un ver funky "
-"dansant. Écrit par Conrad Parker."
+"dansant. Écrit par Conrad Parker."
 
 #: hacks/config/speedmine.xml.h:16
 msgid "SpeedMine"
@@ -4821,7 +4837,7 @@ msgstr "SpeedMine"
 
 #: hacks/config/speedmine.xml.h:17
 msgid "Thrust"
-msgstr "Poussée"
+msgstr "Poussée"
 
 #: hacks/config/speedmine.xml.h:19 hacks/config/worm.xml.h:10
 msgid "Worm"
@@ -4833,13 +4849,13 @@ msgid ""
 "shaded spheres in multiple colors. This hack traces its lineage back to Tom "
 "Duff in 1982."
 msgstr ""
-"Un autre hack classique d'une époque lointaine. Il dessine des sphères "
-"ombrées en plusieurs couleurs. Son arbre généalogique remonte à Tom Duff en "
+"Un autre hack classique d'une époque lointaine. Il dessine des sphères "
+"ombrées en plusieurs couleurs. Son arbre généalogique remonte à Tom Duff en "
 "1982."
 
 #: hacks/config/sphere.xml.h:7
 msgid "Sphere"
-msgstr "Sphère"
+msgstr "Sphère"
 
 #: hacks/config/sphereEversion.xml.h:1
 msgid "SphereEversion"
@@ -4861,9 +4877,8 @@ msgid "Smoothed Lines"
 msgstr ""
 
 #: hacks/config/spheremonics.xml.h:23
-#, fuzzy
 msgid "Spheremonics"
-msgstr "Harmoniques"
+msgstr ""
 
 #: hacks/config/spheremonics.xml.h:24
 msgid ""
@@ -4883,7 +4898,7 @@ msgid ""
 "means moire; interference patterns, of course."
 msgstr ""
 "Motifs circulaires mobiles, par Peter Schmitzberger. Les motifs circulaires "
-"mobiles sont synonymes de moiré ; des motifs d'interférences, évidemment."
+"mobiles sont synonymes de moiré ; des motifs d'interférences, évidemment."
 
 #: hacks/config/spiral.xml.h:11
 msgid "Spiral"
@@ -4894,8 +4909,8 @@ msgid ""
 "Draws a spotlight scanning across a black screen, illumnating the underlying "
 "desktop when it passes. Written by Rick Schultz."
 msgstr ""
-"Trace un faisceau lumineux qui parcourt un écran noir et illumine le bureau "
-"sous-jacent. Écrit par Rick Schultz."
+"Trace un faisceau lumineux qui parcourt un écran noir et illumine le bureau "
+"sous-jacent. Écrit par Rick Schultz."
 
 #: hacks/config/spotlight.xml.h:6
 msgid "Spotlight"
@@ -4903,7 +4918,7 @@ msgstr "Faisceau lumineux"
 
 #: hacks/config/sproingies.xml.h:3
 msgid "Q-Bert meets Marble Madness! Written by Ed Mackey."
-msgstr "La rencontre de Q-Bert et de Marble Madness ! Écrit par Ed Mackey."
+msgstr "La rencontre de Q-Bert et de Marble Madness ! Écrit par Ed Mackey."
 
 #: hacks/config/sproingies.xml.h:9
 msgid "Sproingies"
@@ -4916,12 +4931,12 @@ msgid ""
 "Jeff Epler."
 msgstr ""
 "Dessine un ensemble d'automates qui interagissent et produisent des spirales "
-"carrées. Les spirales grandissent jusqu'à ce qu'elles heurtent un obstacle, "
-"qu'elles contournent. Écrit par Jeff Epler."
+"carrées. Les spirales grandissent jusqu'à ce qu'elles heurtent un obstacle, "
+"qu'elles contournent. Écrit par Jeff Epler."
 
 #: hacks/config/squiral.xml.h:5
 msgid "Handedness"
-msgstr "Chiralité"
+msgstr "Sens de rotation"
 
 #: hacks/config/squiral.xml.h:7
 msgid "Left"
@@ -4929,7 +4944,7 @@ msgstr "Gauche"
 
 #: hacks/config/squiral.xml.h:11 hacks/config/twang.xml.h:8
 msgid "Randomness"
-msgstr "Aléatoire"
+msgstr "Aléatoire"
 
 #: hacks/config/squiral.xml.h:12
 msgid "Right"
@@ -4937,7 +4952,7 @@ msgstr "Droite"
 
 #: hacks/config/squiral.xml.h:17
 msgid "Squiral"
-msgstr "Spirale carrées"
+msgstr "Spirale carrées"
 
 #: hacks/config/ssystem.xml.h:1
 msgid "SSystem"
@@ -4968,12 +4983,12 @@ msgid ""
 "by Marcelo Vianna's third Escher GL hack, this one draws an ``infinite'' "
 "staircase."
 msgstr ""
-"Le troisième hack GL de Marcelo Vianna d'après Escher, cette fois "
-"''l'escalier infini''."
+"Le troisième hack GL de Marcelo Vianna d'après Escher, cette fois "
+"«l'escalier infini»."
 
 #: hacks/config/starfish.xml.h:1
 msgid "Color Gradients"
-msgstr "Dégradés de couleur"
+msgstr "Dégradés de couleur"
 
 #: hacks/config/starfish.xml.h:7
 msgid "Pulsating Blob"
@@ -4981,7 +4996,7 @@ msgstr "Tache pulsatile"
 
 #: hacks/config/starfish.xml.h:10
 msgid "Starfish"
-msgstr "Étoile de mer"
+msgstr "Étoile de mer"
 
 #: hacks/config/starfish.xml.h:13
 msgid ""
@@ -4990,10 +5005,10 @@ msgid ""
 "to lay down a field of colors, which are then cycled. The motion is very "
 "organic. Written by Jamie Zawinski."
 msgstr ""
-"Génère une séquence de motifs ondulants en forme d'étoiles qui pulsent, "
+"Génère une séquence de motifs ondulants en forme d'étoiles qui pulsent, "
 "pivotent et se retournent. Un autre mode d'affichage utilise ces formes pour "
-"créer un champ de couleurs, qui présente des cycles. Le mouvement est très "
-"organique. Écrit par Jamie Zawinski."
+"créer un champ de couleurs, qui présente des cycles. Le mouvement est très "
+"organique. Écrit par Jamie Zawinski."
 
 #: hacks/config/starwars.xml.h:2
 msgid "Anti-aliased Lines"
@@ -5001,7 +5016,7 @@ msgstr "Lignes anti-alias"
 
 #: hacks/config/starwars.xml.h:3
 msgid "Centered Text"
-msgstr "Texte centré"
+msgstr "Texte centré"
 
 #: hacks/config/starwars.xml.h:4
 msgid ""
@@ -5009,8 +5024,8 @@ msgid ""
 "a star field, like at the beginning of the movie of the same name. Written "
 "by Jamie Zawinski and Claudio Matauoka."
 msgstr ""
-"Fait défiler lentement un texte en diagonale sur un champ stellaire, comme "
-"au début du film du même nom. Écrit par Jamie Zawinski et Claudio Matauoka."
+"Fait défiler lentement un texte en diagonale sur un champ stellaire, comme "
+"au début du film du même nom. Écrit par Jamie Zawinski et Claudio Matauoka."
 
 #: hacks/config/starwars.xml.h:5
 msgid "Fade Out"
@@ -5018,11 +5033,11 @@ msgstr "Fondu au noir"
 
 #: hacks/config/starwars.xml.h:7
 msgid "Flush Left Text"
-msgstr "Décaler le texte vers la gauche"
+msgstr "Décaler le texte vers la gauche"
 
 #: hacks/config/starwars.xml.h:8
 msgid "Flush Right Text"
-msgstr "Décaler le texte vers la droite"
+msgstr "Décaler le texte vers la droite"
 
 #: hacks/config/starwars.xml.h:9
 msgid "Font Point Size"
@@ -5030,11 +5045,11 @@ msgstr "Taille de police"
 
 #: hacks/config/starwars.xml.h:10
 msgid "Scroll Speed"
-msgstr "Vitesse de défilement"
+msgstr "Vitesse de défilement"
 
 #: hacks/config/starwars.xml.h:13
 msgid "Star Rotation Speed"
-msgstr "Vitesse de rotation des étoiles"
+msgstr "Vitesse de rotation des étoiles"
 
 #: hacks/config/starwars.xml.h:14
 msgid "StarWars"
@@ -5050,11 +5065,11 @@ msgstr "Lignes de texte"
 
 #: hacks/config/starwars.xml.h:18
 msgid "Thick Lines"
-msgstr "Lignes épaisses"
+msgstr "Lignes épaisses"
 
 #: hacks/config/starwars.xml.h:19
 msgid "Wrap Long Lines"
-msgstr "Retour à la ligne"
+msgstr "Retour à la ligne"
 
 #: hacks/config/stonerview.xml.h:1
 msgid ""
@@ -5062,13 +5077,13 @@ msgid ""
 "patterns. Written by Andrew Plotkin, based on SGI's `electropaint' "
 "screensaver."
 msgstr ""
-"Des chaînes de carrés colorés dansent les unes autour des autres  en formant "
-"des spirales complexes. Écrit par Andrew Plotkin, basé sur l'économiseur "
-"d'écran 'electropaint'de SGI."
+"Des chaînes de carrés colorés dansent les unes autour des autres  en formant "
+"des spirales complexes. Écrit par Andrew Plotkin, basé sur l'économiseur "
+"d'écran «electropaint» de SGI."
 
 #: hacks/config/stonerview.xml.h:3
 msgid "StonerView"
-msgstr "Spirale psyché"
+msgstr "Spirale psyché"
 
 #: hacks/config/strange.xml.h:1
 msgid "Curviness"
@@ -5076,7 +5091,7 @@ msgstr "Courbure"
 
 #: hacks/config/strange.xml.h:9
 msgid "Strange"
-msgstr "Étrange"
+msgstr "Étrange"
 
 #: hacks/config/strange.xml.h:10
 msgid ""
@@ -5084,9 +5099,9 @@ msgid ""
 "field of dots that swoops and twists around. The motion is very nice. "
 "Written by Massimino Pascal."
 msgstr ""
-"Dessine d'étranges attracteurs : ils ressemblent à des champs de points "
-"colorés qui tournent et se tortillent de manière imprévisible. Le mouvement "
-"est très beau. Écrit par Massimino Pascal."
+"Dessine d'étranges attracteurs : ils ressemblent à des champs de points "
+"colorés qui tournent et se tortillent de manière imprévisible. Le mouvement "
+"est très beau. Écrit par Massimino Pascal."
 
 #: hacks/config/superquadrics.xml.h:2
 msgid ""
@@ -5094,10 +5109,10 @@ msgid ""
 "on a Commodore 64 in 1987, as a 320x200 black and white wireframe. Now it is "
 "GL and has specular reflections."
 msgstr ""
-"Ed Mackey déclare avoir écrit la première version de ce programme en langage "
+"Ed Mackey déclare avoir écrit la première version de ce programme en langage "
 "BASIC sur un Commodore 64 en 1987, sous la forme d'un maillage graphique "
-"320x200 noir et blanc. Il est désormais en GL et présente des réflexions "
-"spéculaires."
+"320x200 noir et blanc. Il est désormais en GL et présente des réflexions "
+"spéculaires."
 
 #: hacks/config/superquadrics.xml.h:10
 msgid "Superquadrics"
@@ -5110,9 +5125,9 @@ msgid ""
 "There is also a cool Java applet of a similar concept."
 msgstr ""
 "Autre motifs fluides et tourbillonnants. Cette version est de M. Dobie et R. "
-"Taylor, mais vous avez peut-être déjà vu un programme Mac similaire appelé "
+"Taylor, mais vous avez peut-être déjà vu un programme Mac similaire appelé "
 "FlowFazer. Il existe aussi une chouette applet Java avec un concept "
-"apparenté."
+"apparenté."
 
 #: hacks/config/swirl.xml.h:8
 msgid "Swirl"
@@ -5120,7 +5135,7 @@ msgstr "Tourbillon"
 
 #: hacks/config/t3d.xml.h:1
 msgid "0 deg"
-msgstr ""
+msgstr ""
 
 #: hacks/config/t3d.xml.h:2
 msgid "5 Minute Tick Marks"
@@ -5128,7 +5143,7 @@ msgstr "Marques toutes les 5 minutes"
 
 #: hacks/config/t3d.xml.h:3
 msgid "90 deg"
-msgstr ""
+msgstr "90°"
 
 #: hacks/config/t3d.xml.h:4
 msgid "Bigger"
@@ -5155,15 +5170,14 @@ msgid ""
 "This draws a working analog clock composed of floating, throbbing bubbles. "
 "Written by Bernd Paysan."
 msgstr ""
-"Dessine une horloge analogique composée de bulles flottantes et pulsatiles. "
-"Écrit par Bernd Paysan."
+"Dessine une horloge analogique composée de bulles flottantes et pulsatiles. "
+"Écrit par Bernd Paysan."
 
 #: hacks/config/t3d.xml.h:16
 msgid "Turn Side-to-Side"
 msgstr "Retourner"
 
 #: hacks/config/t3d.xml.h:17
-#, fuzzy
 msgid "Wobbliness"
 msgstr "Oscillation"
 
@@ -5172,7 +5186,7 @@ msgid ""
 "Displays a view of the ``Bird in a Thornbush'' fractal. Written by Tim "
 "Auckland."
 msgstr ""
-"Affiche la fractale de l' ''oiseau dans un buisson épineux''. Écrit par Tim "
+"Affiche la fractale de l'«oiseau dans un buisson épineux». Écrit par Tim "
 "Auckland."
 
 #: hacks/config/thornbird.xml.h:6
@@ -5181,15 +5195,15 @@ msgstr "Points"
 
 #: hacks/config/thornbird.xml.h:12
 msgid "Thornbird"
-msgstr "Buisson épineux"
+msgstr "Buisson épineux"
 
 #: hacks/config/triangle.xml.h:2
 msgid ""
 "Generates random mountain ranges using iterative subdivision of triangles. "
 "Written by Tobias Gloth."
 msgstr ""
-"Génère des chaînes de montagne aléatoires en utilisant la subdivision "
-"itérative de triangles. Écrit par Tobias Gloth."
+"Génère des chaînes de montagne aléatoires en utilisant la subdivision "
+"itérative de triangles. Écrit par Tobias Gloth."
 
 #: hacks/config/triangle.xml.h:7
 msgid "Triangle"
@@ -5200,8 +5214,8 @@ msgid ""
 "This draws line- and arc-based Truchet patterns that tile the screen. "
 "Written by Adrian Likins."
 msgstr ""
-"Dessine des motifs de Truchet basés sur des lignes et des arcs, qui "
-"recouvrent l'écran. Écrit par Adrian Likins."
+"Dessine des motifs de Truchet basés sur des lignes et des arcs, qui "
+"recouvrent l'écran. Écrit par Adrian Likins."
 
 #: hacks/config/truchet.xml.h:5
 msgid "Truchet"
@@ -5211,7 +5225,7 @@ msgstr "Truchet"
 msgid ""
 "Divides the screen into a grid, and plucks them. Written by Dan Bornstein."
 msgstr ""
-"Divise l'écran en petits rectangles, qui sont ensuite enlevés. Écrit par Dan "
+"Divise l'écran en petits rectangles, qui sont ensuite enlevés. Écrit par Dan "
 "Bornstein."
 
 #: hacks/config/twang.xml.h:6
@@ -5219,12 +5233,10 @@ msgid "Jumpy"
 msgstr "Sautillant"
 
 #: hacks/config/twang.xml.h:11
-#, fuzzy
 msgid "Springiness"
-msgstr "Flexibilité"
+msgstr "Flexibilité"
 
 #: hacks/config/twang.xml.h:13
-#, fuzzy
 msgid "Transference"
 msgstr "Migration"
 
@@ -5234,11 +5246,11 @@ msgstr "Twang"
 
 #: hacks/config/vermiculate.xml.h:1
 msgid "Draws squiggly worm-like paths. Written by Tyler Pierce."
-msgstr "Trace des gribouillis vermiculés. Écrit par Tyler Pierce."
+msgstr "Trace des gribouillis vermiculés. Écrit par Tyler Pierce."
 
 #: hacks/config/vermiculate.xml.h:2
 msgid "Vermiculate"
-msgstr "Vermiculé"
+msgstr "Vermiculé"
 
 #: hacks/config/vidwhacker.xml.h:2 hacks/config/webcollage.xml.h:2
 msgid "2 seconds"
@@ -5246,7 +5258,7 @@ msgstr "2 secondes"
 
 #: hacks/config/vidwhacker.xml.h:4
 msgid "Image Directory"
-msgstr "Répertoire d'images"
+msgstr "Répertoire d'images"
 
 #: hacks/config/vidwhacker.xml.h:5
 msgid ""
@@ -5257,12 +5269,12 @@ msgid ""
 "displays that image for a few seconds, and does it again. This works really "
 "well if you just feed broadcast television into it."
 msgstr ""
-"Il s'agit d'un simple script shell qui capture une image depuis l'entrée "
-"vidéo du système et utilise des filtres PBM (choisis au hasard) pour  "
-"manipuler et reformer l'image vidéo de diverses manières (détection des "
-"contours, soustraction de l'image d'une version pivotée d'elle-même, etc.) "
+"Il s'agit d'un simple script shell qui capture une image depuis l'entrée "
+"vidéo du système et utilise des filtres PBM (choisis au hasard) pour  "
+"manipuler et reformer l'image vidéo de diverses manières (détection des "
+"contours, soustraction de l'image d'une version pivotée d'elle-même, etc.) "
 "Ensuite, il  affiche cette image pendant quelques secondes et recommence. Ce "
-"programme fonctionne très bien si vous le reliez à un téléviseur."
+"programme fonctionne très bien si vous le reliez à un téléviseur."
 
 #: hacks/config/vidwhacker.xml.h:6
 msgid "VidWhacker"
@@ -5274,8 +5286,8 @@ msgid ""
 "It scatters them around your screen until it fills up, then it clears the "
 "screen and starts over. Written by Tracy Camp and David Hansen."
 msgstr ""
-"Génère une séquence continue de petits motifs géométriques et arrondis. Ils "
-"remplissent l'écran, puis s'effacent avant de recommencer l'opération. Écrit "
+"Génère une séquence continue de petits motifs géométriques et arrondis. Ils "
+"remplissent l'écran, puis s'effacent avant de recommencer l'opération. Écrit "
 "par Tracy Camp et David Hansen."
 
 #: hacks/config/vines.xml.h:8
@@ -5290,11 +5302,10 @@ msgstr "Dessiner des taches"
 msgid ""
 "Draws a colorful random-walk, in various forms. Written by Rick Campbell."
 msgstr ""
-"Dessine une promenade aléatoire colorée, sous plusieurs formes. Écrit par "
+"Dessine une promenade aléatoire colorée, sous plusieurs formes. Écrit par "
 "Rick Campbell."
 
 #: hacks/config/wander.xml.h:14
-#, fuzzy
 msgid "Sustain"
 msgstr "Conserver"
 
@@ -5304,7 +5315,7 @@ msgstr "Fichier dictionnaire"
 
 #: hacks/config/webcollage.xml.h:5
 msgid "Overall Filter Program"
-msgstr "Programme de filtrage général"
+msgstr "Programme de filtrage général"
 
 #: hacks/config/webcollage.xml.h:6
 msgid "Per-Image Filter Program"
@@ -5320,18 +5331,18 @@ msgid ""
 "This is because most of the web is pictures of text. Which is pretty sad.) "
 "Written by Jamie Zawinski."
 msgstr ""
-"Ce programme effectue des collages à partir d'images extraites au hasard "
-"depuis le World Wide Web. Il les trouve en faisant des recherches aléatoires "
-"sur le Web et en  extrayant les images des pages trouvées. Il peut également "
-"être configuré pour filtrer les images via le programme 'VidWhacker' ci-"
-"dessus, pour obtenir des résultats stupéfiants. (Notez que la plupart des "
-"images trouvées sont en fait du texte et non des images proprement dites. "
-"Cela est dû au fait que la plupart des images du Web contiennent du texte, "
-"ce qui est assez désolant.) Écrit par Jamie Zawinski."
+"Ce programme effectue des collages à partir d'images extraites au hasard "
+"depuis le World Wide Web. Il les trouve en faisant des recherches aléatoires "
+"sur le Web et en  extrayant les images des pages trouvées. Il peut également "
+"être configuré pour filtrer les images via le programme 'VidWhacker' ci-"
+"dessus, pour obtenir des résultats stupéfiants. (Notez que la plupart des "
+"images trouvées sont en fait du texte et non des images proprement dites. "
+"Cela est dû au fait que la plupart des images du Web contiennent du texte, "
+"ce qui est assez désolant.) Écrit par Jamie Zawinski."
 
 #: hacks/config/webcollage.xml.h:10
 msgid "URL Timeout"
-msgstr "Délai d'expiration de l'URL"
+msgstr "Délai d'expiration de l'URL"
 
 #: hacks/config/webcollage.xml.h:11
 msgid "WebCollage"
@@ -5343,13 +5354,12 @@ msgid ""
 "strength of each forcefield changes continuously, and it is also switched on "
 "and off at random. By Paul 'Joey' Clark."
 msgstr ""
-"Des étoiles flottantes sont influencées par un mélange de simples champs de "
+"Des étoiles flottantes sont influencées par un mélange de simples champs de "
 "forces 2D. La puissance de chaque champ de forces change continuellement. "
-"Les champs sont également  activés et désactivés au hasard. Par Paul 'Joey' "
+"Les champs sont également  activés et désactivés au hasard. Par Paul 'Joey' "
 "Clark."
 
 #: hacks/config/whirlwindwarp.xml.h:7
-#, fuzzy
 msgid "Trail Size"
 msgstr "Taille de la queue"
 
@@ -5364,7 +5374,7 @@ msgstr "Amplitude"
 #: hacks/config/whirlygig.xml.h:2
 msgid "Draws zooming chains of sinusoidal spots. Written by Ashton Trey Belew."
 msgstr ""
-"Dessine des chaînes de taches sinusoïdales. Écrit par Ashton Trey Belew."
+"Dessine des chaînes de taches sinusoïdales. Écrit par Ashton Trey Belew."
 
 #: hacks/config/whirlygig.xml.h:5
 msgid "Whirlies"
@@ -5380,8 +5390,8 @@ msgid ""
 "screen. Written by Brad Taylor, Dave Lemke, Boris Putanec, and Henrik "
 "Theiling."
 msgstr ""
-"Ancien hack xlock qui dessine des vers multicolores rampant sur l'écran. "
-"Écrit par Brad Taylor, Dave Lemke, Boris Putanec et Henrik Theiling."
+"Ancien hack xlock qui dessine des vers multicolores rampant sur l'écran. "
+"Écrit par Brad Taylor, Dave Lemke, Boris Putanec et Henrik Theiling."
 
 #: hacks/config/xaos.xml.h:1
 msgid "XaoS"
@@ -5413,7 +5423,7 @@ msgstr "Afficher les secondes"
 
 #: hacks/config/xdaliclock.xml.h:5
 msgid "Huge Font"
-msgstr "Très grande police"
+msgstr "Très grande police"
 
 #: hacks/config/xdaliclock.xml.h:6 hacks/config/xmatrix.xml.h:9
 msgid "Large Font"
@@ -5453,7 +5463,7 @@ msgstr "Jour  Dim"
 
 #: hacks/config/xearth.xml.h:5
 msgid "Display Stars"
-msgstr "Afficher les étoiles"
+msgstr "Afficher les étoiles"
 
 #: hacks/config/xearth.xml.h:8
 msgid "Label Cities"
@@ -5461,11 +5471,11 @@ msgstr "Indiquer les villes"
 
 #: hacks/config/xearth.xml.h:9
 msgid "Lower Left"
-msgstr "Inférieur gauche"
+msgstr "Inférieur gauche"
 
 #: hacks/config/xearth.xml.h:10
 msgid "Lower Right"
-msgstr "Inférieur droit"
+msgstr "Inférieur droit"
 
 #: hacks/config/xearth.xml.h:13
 msgid "Mercator Projection"
@@ -5477,7 +5487,7 @@ msgstr "Nuit   Dim"
 
 #: hacks/config/xearth.xml.h:15
 msgid "No Stars"
-msgstr "Pas d'étoiles"
+msgstr "Pas d'étoiles"
 
 #: hacks/config/xearth.xml.h:16
 msgid "North/South Rotation"
@@ -5489,11 +5499,11 @@ msgstr "Projection orthographique"
 
 #: hacks/config/xearth.xml.h:19
 msgid "Real Time"
-msgstr "Temps réel"
+msgstr "Temps réel"
 
 #: hacks/config/xearth.xml.h:20
 msgid "Shaded Image"
-msgstr "Image ombragée"
+msgstr "Image ombragée"
 
 #: hacks/config/xearth.xml.h:21
 msgid "Sharp"
@@ -5513,11 +5523,11 @@ msgstr "Alignement temporel"
 
 #: hacks/config/xearth.xml.h:29
 msgid "Upper Left"
-msgstr "Supérieur gauche"
+msgstr "Supérieur gauche"
 
 #: hacks/config/xearth.xml.h:30
 msgid "Upper Right"
-msgstr "Supérieur droit"
+msgstr "Supérieur droit"
 
 #: hacks/config/xearth.xml.h:31
 msgid ""
@@ -5560,13 +5570,13 @@ msgid ""
 "Draws a simulation of pulsing fire. It can also take an arbitrary image and "
 "set it on fire too. Written by Carsten Haitzler, hacked on by many others."
 msgstr ""
-"Dessine une simulation de feu rougeoyant. Il peut également choisir une "
-"image arbitraire et lui mettre le feu. Écrit par Carsten Haitzler, avec de "
+"Dessine une simulation de feu rougeoyant. Il peut également choisir une "
+"image arbitraire et lui mettre le feu. Écrit par Carsten Haitzler, avec de "
 "nombreuses contributions."
 
 #: hacks/config/xflame.xml.h:3
 msgid "Enable Blooming"
-msgstr "Activer l'étendue"
+msgstr "Activer l'étendue"
 
 #: hacks/config/xflame.xml.h:8
 msgid "Xflame"
@@ -5579,10 +5589,10 @@ msgid ""
 "Shining,'' you won't get it. Those who have describe this hack as "
 "``inspired.''"
 msgstr ""
-"Ce programme a un comportement schizophrène et effectue de nombreuses "
-"coquilles. Écrit par Jamie Zawinski. Si vous n'avez pas vu le chef-d'oeuvre "
-"de Stanley Kubrick,  ''Shining'', vous n'y comprendrez rien. Ceux qui l'ont "
-"vu considèrent ce hack comme ''inspiré''."
+"Ce programme a un comportement schizophrène et effectue de nombreuses "
+"coquilles. Écrit par Jamie Zawinski. Si vous n'avez pas vu le chef-d'oeuvre "
+"de Stanley Kubrick, «Shining», vous n'y comprendrez rien. Ceux qui l'ont vu "
+"considèrent ce hack comme «inspiré»."
 
 #: hacks/config/xjack.xml.h:5
 msgid "Xjack"
@@ -5594,9 +5604,9 @@ msgid ""
 "``Lyapunov exponent.'' It has a cool interactive mode, too. Written by Ron "
 "Record."
 msgstr ""
-"Génère de jolies fractales en effectuant de géniales opérations de math "
-"utilisant ''l'exposant de Lyapunov''. Il possède aussi un mode interactif. "
-"Écrit par Ron Record."
+"Génère de jolies fractales en effectuant de géniales opérations de math "
+"utilisant ''l'exposant de Lyapunov''. Il possède aussi un mode interactif. "
+"Écrit par Ron Record."
 
 #: hacks/config/xlyap.xml.h:2
 msgid "Xlyap"
@@ -5607,8 +5617,8 @@ msgid ""
 "A rendition of the text scrolls seen in the movie ``The Matrix.'' Written by "
 "Jamie Zawinski."
 msgstr ""
-"Reproduction du texte qui défile à l'écran au début du film ''Matrix''. "
-"Écrit par Jamie Zawinski."
+"Reproduction du texte qui défile à l'écran au début du film «Matrix». Écrit "
+"par Jamie Zawinski."
 
 #: hacks/config/xmatrix.xml.h:2
 msgid "Binary Encoding"
@@ -5624,11 +5634,11 @@ msgstr "Complet"
 
 #: hacks/config/xmatrix.xml.h:7
 msgid "Genetic Encoding"
-msgstr "Encodage génétique"
+msgstr "Encodage génétique"
 
 #: hacks/config/xmatrix.xml.h:8
 msgid "Hexadecimal Encoding"
-msgstr "Encodage hexadécimal"
+msgstr "Encodage hexadécimal"
 
 #: hacks/config/xmatrix.xml.h:10
 msgid "Matrix Encoding"
@@ -5636,11 +5646,11 @@ msgstr "Encodage Matrix"
 
 #: hacks/config/xmatrix.xml.h:11
 msgid "Phone Number"
-msgstr "Numéro de téléphone"
+msgstr "Numéro de téléphone"
 
 #: hacks/config/xmatrix.xml.h:12
 msgid "Run Trace Program"
-msgstr "Exécuter le programme de suivi"
+msgstr "Exécuter le programme de suivi"
 
 #: hacks/config/xmatrix.xml.h:13
 msgid "Slider Algorithm"
@@ -5656,11 +5666,11 @@ msgstr "Xmatrix"
 
 #: hacks/config/xmountains.xml.h:2
 msgid "Reflections"
-msgstr "Réflexions"
+msgstr "Réflexions"
 
 #: hacks/config/xmountains.xml.h:3
 msgid "Side View"
-msgstr "Vue latérale"
+msgstr "Vue latérale"
 
 #: hacks/config/xmountains.xml.h:6
 msgid "Top View"
@@ -5685,8 +5695,8 @@ msgid ""
 "Draws a few swarms of critters flying around the screen, with nicely faded "
 "color trails behind them. Written by Chris Leger."
 msgstr ""
-"Dessine quelques nuées de bestioles qui volent sur l'écran, avec de jolies "
-"traînées dans des fondus de couleur. Écrit par Chris Leger."
+"Dessine quelques nuées de bestioles qui volent sur l'écran, avec de jolies "
+"traînées dans des fondus de couleur. Écrit par Chris Leger."
 
 #: hacks/config/xrayswarm.xml.h:5
 msgid "XRaySwarm"
@@ -5711,7 +5721,7 @@ msgid ""
 "Simulates that pen-in-nested-plastic-gears toy from your childhood. By Rohit "
 "Singh."
 msgstr ""
-"Simule le célèbre jouet de notre enfance, constitué d'un stylo logé dans un "
+"Simule le célèbre jouet de notre enfance, constitué d'un stylo logé dans un "
 "engrenage en plastique. Par Rohit Singh."
 
 #: hacks/config/xspirograph.xml.h:6
@@ -5720,20 +5730,19 @@ msgstr "XSpiroGraph"
 
 #: hacks/config/xteevee.xml.h:1
 msgid "Color Bars Enabled"
-msgstr "Barres de couleur activées"
+msgstr "Barres de couleur activées"
 
 #: hacks/config/xteevee.xml.h:2
-#, fuzzy
 msgid "Cycle Through Modes"
-msgstr "Cycle de modes"
+msgstr "Cycle à travers les modes"
 
 #: hacks/config/xteevee.xml.h:3
 msgid "Rolling Enabled"
-msgstr "Baladage activé"
+msgstr "Baladage activé"
 
 #: hacks/config/xteevee.xml.h:4
 msgid "Static Enabled"
-msgstr "Parasites activés"
+msgstr "Parasites activés"
 
 #: hacks/config/xteevee.xml.h:5
 msgid "XTeeVee"
@@ -5744,12 +5753,12 @@ msgid ""
 "XTeeVee simulates various television problems, including static, loss of "
 "vertical hold, and a test pattern. By Greg Knauss."
 msgstr ""
-"XTeeVee simule différents problèmes de télévision comme les parasites, la "
-"perte de stabilité verticale et la mire. Par Greg Knauss."
+"XTeeVee simule différents problèmes de télévision comme les parasites, la "
+"perte de stabilité verticale et la mire. Par Greg Knauss."
 
 #: hacks/config/zoom.xml.h:3
 msgid "Lens Offset"
-msgstr "Décalage lentille"
+msgstr "Décalage lentille"
 
 #: hacks/config/zoom.xml.h:4
 msgid "Lenses"
@@ -5761,9 +5770,507 @@ msgid ""
 "option the result is like looking through many overlapping lenses rather "
 "than just a simple zoom. Written by James Macnicol."
 msgstr ""
-"Zoome sur une partie de l'écran et se déplace. Avec l'option - lentilles, le "
-"résultat ressemble à la superposition de lentilles plutôt qu'à un simple "
-"zoom. Écrit par James Macnicol."
+"Zoome sur une partie de l'écran et se déplace. Avec l'option '-lenses', le "
+"résultat ressemble à la superposition de lentilles plutôt qu'à un simple "
+"zoom. Érit par James Macnicol."
+
+#~ msgid "reason: %s\n"
+#~ msgstr "Raison: %s\n"
+
+#~ msgid "Not"
+#~ msgstr "Non"
+
+#~ msgid "Installed"
+#~ msgstr "Installé"
+
+#~ msgid "Screensaver Preferences"
+#~ msgstr "Préférences Économiseur d'écran"
+
+#~ msgid "Change screensaver properties"
+#~ msgstr "Changer les propriétés de l'économiseur d'écran"
+
+#~ msgid "How long after the screen blanks until a password will be required."
+#~ msgstr "Durée entre le verrouillage et la nécessité d'un mot de passe"
+
+#~ msgid "How long before the screensaver activates."
+#~ msgstr "Combien de temps avant que l'économiseurs s'active."
+
+#~ msgid ""
+#~ "How long each display mode should run before choosing a new one (in "
+#~ "Random mode.)"
+#~ msgstr "Combien de temps avant le changement de mode (en mode Aléatoire)"
+
+#~ msgid "How long until the monitor goes completely black."
+#~ msgstr "Durée avant que le moniteur passe complètement au noir."
+
+#~ msgid ""
+#~ "Not\n"
+#~ "Installed"
+#~ msgstr ""
+#~ "Non\n"
+#~ "Installé"
+
+#~ msgid ""
+#~ "Whether the image-manipulating modes should operate on images captured "
+#~ "from the system's video input (if there is one.)"
+#~ msgstr ""
+#~ "Les modes qui manipulent des images sont-ils autorisé à utiliser des "
+#~ "images capturées par l'entrée vidéo du système (si il y en a une)."
+
+#~ msgid "not installed"
+#~ msgstr "non installé"
+
+#~ msgid "Rarely"
+#~ msgstr "Rarement"
+
+#~ msgid "Turn speed"
+#~ msgstr "Vitesse de rotation"
+
+#~ msgid "Withdraw freqency"
+#~ msgstr "Fréquence de retrait"
+
+#~ msgid "Draw Eyes"
+#~ msgstr "Dessiner les yeux"
+
+#~ msgid "Atunnel"
+#~ msgstr "Tunnel GL"
+
+#~ msgid "Use light"
+#~ msgstr "Utiliser l'éclairage"
+
+#~ msgid "Barcode"
+#~ msgstr "Code barre"
+
+#~ msgid "Barcode Clock (24 Hour)"
+#~ msgstr "Horloge code barre (24 Heures)"
+
+#~ msgid "Barcode Clock (AM/PM)"
+#~ msgstr "Horloge code barre (12 Heures)"
+
+#~ msgid "Scrolling Barcodes"
+#~ msgstr "Codes barre déroulants"
+
+#~ msgid "BlockTube"
+#~ msgstr "Tube de blocs"
+
+#~ msgid "Color Change Time"
+#~ msgstr "Durée de changement de couleur"
+
+#~ msgid "Color Hold Time"
+#~ msgstr "Durée de rétention de couleur"
+
+#~ msgid "Reflective Blocks"
+#~ msgstr "Blocs réfléchissants"
+
+#~ msgid "Solid Blocks"
+#~ msgstr "Blocs uniforme"
+
+#~ msgid "Beefy Cow"
+#~ msgstr "Vache normande"
+
+#~ msgid "Bounce Speed"
+#~ msgstr "Vitesse de rebond"
+
+#~ msgid "BouncingCow"
+#~ msgstr "Vache bondissante"
+
+#~ msgid "Herd"
+#~ msgstr "Troupeau"
+
+#~ msgid "Moo"
+#~ msgstr "Meuh"
+
+#~ msgid "Number of Cows"
+#~ msgstr "Nombre de vaches"
+
+#~ msgid "Wireframe Cow"
+#~ msgstr "Vache fil de fer"
+
+#~ msgid "Apple II"
+#~ msgstr "Apple II"
+
+#~ msgid "HPUX"
+#~ msgstr "HPUX"
+
+#~ msgid "Linux"
+#~ msgstr "Linux"
+
+#~ msgid "MacOS X"
+#~ msgstr "MacOS X"
+
+#~ msgid "OS/390"
+#~ msgstr "OS/390"
+
+#~ msgid "Windows 3.1"
+#~ msgstr "Windows 3.1"
+
+#~ msgid "Initial Density"
+#~ msgstr "Densité initiale"
+
+#~ msgid "Max Age"
+#~ msgstr "Age max."
+
+#~ msgid "Old"
+#~ msgstr "Vieux"
+
+#~ msgid "Young"
+#~ msgstr "Jeune"
+
+#~ msgid "CubeStorm"
+#~ msgstr "Tempète de cubes"
+
+#~ msgid "Motion Speed"
+#~ msgstr "Vitesse de déplacement"
+
+#~ msgid "Number of Cubes"
+#~ msgstr "Nombre de cubes"
+
+#~ msgid "Strut Thickness"
+#~ msgstr "Épaisseur"
+
+#~ msgid "Frame Rate"
+#~ msgstr "Vitesse"
+
+#~ msgid "Hide Sheep"
+#~ msgstr "Cache le mouton"
+
+#~ msgid "Megabytes of Local Sheep Storage"
+#~ msgstr "Mégaoctet de mémoire pour le mouton"
+
+#~ msgid "Nickname"
+#~ msgstr "Alias"
+
+#~ msgid "Repititions of each Sheep"
+#~ msgstr "Répétition de chaque mouton"
+
+#~ msgid "Audi Quattro (5 cylinders)"
+#~ msgstr "Audi Quattro (5 cylindres)"
+
+#~ msgid "BMW M3 (4 cylinders)"
+#~ msgstr "BMW M3 (4 cylindres)"
+
+#~ msgid "BMW M5 (6 cylinders)"
+#~ msgstr "BMW M5 (6 cylindres)"
+
+#~ msgid "Corvette Z06 (8 cylinders, V)"
+#~ msgstr "Corvette Z06 (8 cylindres en V)"
+
+#~ msgid "Dodge Viper (10 cylinders, V)"
+#~ msgstr "Dodge Viper (10 cylindres en V)"
+
+#~ msgid "Honda Insight (3 cylinders)"
+#~ msgstr "Honda Insight (3 cylindres)"
+
+#~ msgid "Jaguar XKE (12 cylinders, V)"
+#~ msgstr "Jaguar XKE (12 cylindres en V)"
+
+#~ msgid "Porsche 911 (6 cylinders, flat)"
+#~ msgstr "Porsche 911 (6 cylindres à plat)"
+
+#~ msgid "Random Engine"
+#~ msgstr "Engin aléatoire"
+
+#~ msgid "Show Engine Name"
+#~ msgstr "Montre le nom de l'engin"
+
+#~ msgid "Subaru XT (6 cylinders, V)"
+#~ msgstr "Subaru XT (6 cylindres en V)"
+
+#~ msgid "VW Beetle (4 cylinders, flat)"
+#~ msgstr "VW Beetle (4 cylindres à plat)"
+
+#~ msgid "Cooling factor"
+#~ msgstr "Facteur de refroidissement"
+
+#~ msgid "Eruption"
+#~ msgstr "Éruption"
+
+#~ msgid "Heat"
+#~ msgstr "Chaleur"
+
+#~ msgid "Inferno"
+#~ msgstr "Infernale"
+
+#~ msgid "Little"
+#~ msgstr "Peu"
+
+#~ msgid "Negative"
+#~ msgstr "Négative"
+
+#~ msgid "Number of Particles"
+#~ msgstr "Nombre de particules"
+
+#~ msgid "Pleasant"
+#~ msgstr "Plaisante"
+
+#~ msgid "Positive"
+#~ msgstr "Positive"
+
+#~ msgid "Clay"
+#~ msgstr "Argile"
+
+#~ msgid "Rubber"
+#~ msgstr "Caoutchouc"
+
+#~ msgid "Binary"
+#~ msgstr "Binaire"
+
+#~ msgid "Fire"
+#~ msgstr "Feu"
+
+#~ msgid "Flurry"
+#~ msgstr "Bourrasque"
+
+#~ msgid "Insane"
+#~ msgstr "Aliéné"
+
+#~ msgid "Psychedelic"
+#~ msgstr "Psychédélique"
+
+#~ msgid "RGB"
+#~ msgstr "RVB"
+
+#~ msgid "Water"
+#~ msgstr "Eau"
+
+#~ msgid "Air Speed"
+#~ msgstr "Vitesse de l'air"
+
+#~ msgid "Chrome Toasters"
+#~ msgstr "Grille-pain chromé"
+
+#~ msgid "Flying Toasters"
+#~ msgstr "Grille-pain volant"
+
+#~ msgid "Number of Slices"
+#~ msgstr "Nombre de tranches"
+
+#~ msgid "Number of Toasters"
+#~ msgstr "Nombre de grille-pains"
+
+#~ msgid "Solid Colors"
+#~ msgstr "Couleurs unies"
+
+#~ msgid "Swarm"
+#~ msgstr "Essaim"
+
+#~ msgid "Blur Smoothness"
+#~ msgstr "Douceur de flou"
+
+#~ msgid "GLBlur"
+#~ msgstr "Flou GL"
+
+#~ msgid "GLKnots"
+#~ msgstr "Noeuds GL"
+
+#~ msgid ""
+#~ "Generates some twisting 3d knot patterns. Spins 'em around. Written by "
+#~ "Jamie Zawinski."
+#~ msgstr "Génère de nombreux motifs 3D en spirale. Écrit par Jamie Zawinski."
+
+#~ msgid "Segmented"
+#~ msgstr "Segmenté"
+
+#~ msgid "Draw Glyphs"
+#~ msgstr "Dessiner des glyphes"
+
+#~ msgid "Draw Outlines"
+#~ msgstr "Dessiner en fil de fer"
+
+#~ msgid "Draw Solid Boxes"
+#~ msgstr "Dessiner sans texture"
+
+#~ msgid "GLMatrix"
+#~ msgstr "GLMatrix"
+
+#~ msgid "Glyph Density"
+#~ msgstr "Densité des glyphes"
+
+#~ msgid "Glyph Speed"
+#~ msgstr "Vitesse des glyphes"
+
+#~ msgid "Panning"
+#~ msgstr "Panoramique"
+
+#~ msgid "5 Minutes"
+#~ msgstr "5 minutes"
+
+#~ msgid "50%"
+#~ msgstr "50%"
+
+#~ msgid "Always show at least this much of the image:"
+#~ msgstr "Montre au moins ce nombre d'images :"
+
+#~ msgid "Crossfade Duration:"
+#~ msgstr "Durée du fondu :"
+
+#~ msgid "Frame Rate:"
+#~ msgstr "Vitesse d'affichage :"
+
+#~ msgid "GLSlideshow"
+#~ msgstr "Présentation GL"
+
+#~ msgid "Pan/Zoom Duration:"
+#~ msgstr "Durée Pan/Zoom :"
+
+#~ msgid "Time until loading a new image:"
+#~ msgstr "Temps avant le chargement d'une nouvelle image :"
+
+#~ msgid "Dot size"
+#~ msgstr "Taille des points"
+
+#~ msgid "Gravity points"
+#~ msgstr "Points de gravité"
+
+#~ msgid "Halftone"
+#~ msgstr "Tramage"
+
+#~ msgid "Maximum mass"
+#~ msgstr "Masse max."
+
+#~ msgid "Maximum speed"
+#~ msgstr "Vitesse max."
+
+#~ msgid "Minimum mass"
+#~ msgstr "Masse min."
+
+#~ msgid "Minimum speed"
+#~ msgstr "Vitesse min."
+
+#~ msgid "4D Hypertorus"
+#~ msgstr "Hypertore 4D"
+
+#~ msgid "Color Wheel"
+#~ msgstr "Roue des couleurs"
+
+#~ msgid "Display Speed"
+#~ msgstr "Vitesse d'affichage"
+
+#~ msgid "Orthographic 3d"
+#~ msgstr "Projection orthographique 3D"
+
+#~ msgid "Orthographic 4d"
+#~ msgstr "Projection orthographique 4D"
+
+#~ msgid "Perspective 3d"
+#~ msgstr "Perspective 3D"
+
+#~ msgid "Perspective 4d"
+#~ msgstr "Perspective 4D"
+
+#~ msgid "See-Through Bands"
+#~ msgstr "Eléments que l'on peut voir à travers"
+
+#~ msgid "Solid Object"
+#~ msgstr "Objets solides"
+
+#~ msgid "Transparent Surface"
+#~ msgstr "Surface transparente"
+
+#~ msgid "Two-Sided"
+#~ msgstr "2 faces"
+
+#~ msgid "WX Rotation Speed"
+#~ msgstr "Vitesse de rotation X"
+
+#~ msgid "WY Rotation Speed"
+#~ msgstr "Vitesse de rotation Y"
+
+#~ msgid "WZ Rotation Speed"
+#~ msgstr "Vitesse de rotation Z"
+
+#~ msgid "Wireframe Mesh"
+#~ msgstr "Fil de fer"
+
+#~ msgid "XY Rotation Speed"
+#~ msgstr "Vitesse de rotation XY"
+
+#~ msgid "XZ Rotation Speed"
+#~ msgstr "Vitesse de rotation XZ"
+
+#~ msgid "YZ Rotation Speed"
+#~ msgstr "Vitesse de rotation YZ"
+
+#~ msgid "Chrome"
+#~ msgstr "Chrome"
+
+#~ msgid "Clown barf"
+#~ msgstr "Rire de clown"
+
+#~ msgid "Cycle"
+#~ msgstr "Cycles"
+
+#~ msgid "Flower box"
+#~ msgstr "Boîte à fleurs"
+
+#~ msgid "Inertial damping"
+#~ msgstr "Atténuation inertielle"
+
+#~ msgid "JigglyPuff"
+#~ msgstr "JigglyPuff"
+
+#~ msgid "Rotation speed"
+#~ msgstr "Vitesse de rotation"
+
+#~ msgid "Sphere strength"
+#~ msgstr "Force de la sphère"
+
+#~ msgid "none"
+#~ msgstr "Aucun"
+
+#~ msgid "Wander Around the Screen"
+#~ msgstr "Déplacement centré sur l'écran"
+
+#~ msgid "Big"
+#~ msgstr "Élevé"
+
+#~ msgid "MetaBall Movement"
+#~ msgstr "Mouvement méta-balle"
+
+#~ msgid "MetaBall Radius"
+#~ msgstr "Rayon méta-balle"
+
+#~ msgid "MetaBalls"
+#~ msgstr "Méta-Balles"
+
+#~ msgid "Number of MetaBalls"
+#~ msgstr "Nombre de méta-balles"
+
+#~ msgid "Maximum radius"
+#~ msgstr "Rayon max."
+
+#~ msgid "Minimum radius"
+#~ msgstr "Rayon min."
+
+#~ msgid "Border"
+#~ msgstr "Bordure"
+
+#~ msgid "End color"
+#~ msgstr "Couleur finale"
+
+#~ msgid "Start color"
+#~ msgstr "Couleur initiale"
+
+#~ msgid "Subdivision"
+#~ msgstr "Subdivision"
+
+#~ msgid "Twitch"
+#~ msgstr "Mouvement convulsif"
+
+#~ msgid "Circle"
+#~ msgstr "Cercle"
+
+#~ msgid "Leave a trail"
+#~ msgstr "Laisser une traînée"
+
+#~ msgid "Linear"
+#~ msgstr "Linéaire"
+
+#~ msgid "Lissajous"
+#~ msgstr "Figures Lissojous"
+
+#~ msgid "Test"
+#~ msgstr "Test"
 
-#~ msgid "MacOS"
-#~ msgstr "MacOS"
+#~ msgid "Use Double Buffering"
+#~ msgstr "Double tampon"
index cf4fd92d7a2fcd5b6c686a9660c1ea1e57921f7c..3243c0b9d7b17de7c1afc4bac5f5f64a16d32c10 100644 (file)
@@ -70,7 +70,10 @@ draw_colorbars (Screen *screen, Visual *visual,
       int xx, yy;
       unsigned int bw, d;
       XGetGeometry (dpy, drawable,
-                    &root, &xx, &yy, &width, &height, &bw, &d);
+                    &root, &xx, &yy,
+                    (unsigned int *) &width,
+                    (unsigned int *) &height,
+                    &bw, &d);
     }
 
   for (j = 0; j < sizeof(colors) / sizeof(*colors); j++)
@@ -115,10 +118,11 @@ draw_colorbars (Screen *screen, Visual *visual,
     if (logo_map)
       {
         Window root;
-        int logo_width, logo_height;
-        int w = width;
-        int h = height * heights[0] / 100;
-        int x1, y1, bw, d;
+        unsigned int logo_width, logo_height;
+        unsigned int w = width;
+        unsigned int h = height * heights[0] / 100;
+        int x1, y1;
+        unsigned int bw, d;
         XGetGeometry (dpy, logo_map, &root, &x1, &y1,
                       &logo_width, &logo_height, &bw, &d);
         x1 = x + (w - logo_width) / 2;
index 92481b20292181a0da98844acc36ea286a2c233a..2c426be83e797329566c7304e2a819b68274c53b 100644 (file)
@@ -110,7 +110,7 @@ checkerboard (Screen *screen, Drawable drawable)
   XGCValues gcv;
   GC gc = XCreateGC (dpy, drawable, 0, &gcv);
   Colormap cmap;
-  int win_width, win_height;
+  unsigned int win_width, win_height;
 
   fg.flags = bg.flags = DoRed|DoGreen|DoBlue;
   fg.red = fg.green = fg.blue = 0x0000;
index 563fa6a720524bc90d1b4e10a41231ad6d751d74..a0cea806a2e662f01d0bd4b715738d0dad2cace2 100644 (file)
@@ -7,7 +7,7 @@
    http://www.jwz.org/xscreensaver/
  */
 
-static unsigned const char * const logo_180_xpm[] = {
+static const char * const logo_180_xpm[] = {
 "180 180 16 1",
 "      c None    m None",
 ")     c #FF0000 m #FFFFFF",
index eee542f72e0c5f070fc331cd05c52df5fe5087da..fb93ced0575819486d77aaa7a15156967d9088e0 100644 (file)
@@ -7,7 +7,7 @@
    http://www.jwz.org/xscreensaver/
  */
 
-static unsigned const char * const logo_50_xpm[] = {
+static const char * const logo_50_xpm[] = {
 "50 50 16 1",
 "      c None    m None",
 "&     c #FF0000 m #FFFFFF",
index 858c68c90951ce82b6188502478331fba6648526..b0d7205186a36a0afec2d803cdeccdc5b3887b41 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 2001-2002 Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2001-2002, 2003 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -49,7 +49,7 @@ static const char hex[128] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 static XImage *
 parse_xpm_data (Display *dpy, Visual *visual, Colormap colormap, int depth,
                 unsigned long transparent_color,
-                unsigned const char * const * data,
+                const char * const * data,
                 int *width_ret, int *height_ret,
                 unsigned long **pixels_ret, int *npixels_ret,
                 unsigned char **mask_ret)
@@ -90,7 +90,7 @@ parse_xpm_data (Display *dpy, Visual *visual, Colormap colormap, int depth,
 
   for (i = 0; i < ncolors; i++)
     {
-      const unsigned char *line = *data;
+      const char *line = *data;
       cmap[i].byte = *line++;
       while (*line)
         {
@@ -175,10 +175,11 @@ parse_xpm_data (Display *dpy, Visual *visual, Colormap colormap, int depth,
       ximage->data = (char *) calloc (ximage->height, ximage->bytes_per_line);
       for (y = 0; y < h; y++)
         {
-          const unsigned char *line = *data++;
+          const char *line = *data++;
           for (x = 0; x < w; x++)
             {
-              int p = rmap[*line++];
+              int p = rmap[(int) *line];
+              line++;
               XPutPixel (ximage, x, y,
                          (p == 255 ? transparent_color : pixels[p]));
 
index fc5cea13e7f7e9d25681e0c48452acbf240b2e02..980878204d78e657e0f11a8989051d8ff3228c52 100644 (file)
@@ -1,4 +1,4 @@
-/* xscreensaver, Copyright (c) 1992, 1997, 1998, 2001
+/* xscreensaver, Copyright (c) 1992, 1997, 1998, 2001, 2003
  *  Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -91,7 +91,7 @@ get_integer_resource (char *res_name, char *res_class)
 
   if (ss[0] == '0' && (ss[1] == 'x' || ss[1] == 'X'))  /* 0x: parse as hex */
     {
-      if (1 == sscanf (ss+2, "%x %c", &val, &c))
+      if (1 == sscanf (ss+2, "%x %c", (unsigned int *) &val, &c))
        {
          free (s);
          return val;
index 53cd3519cebe86eb1c76be98481630af7642f98a..fc9ffa80fc3322431c93e9b8011e4c61f724b4f7 100644 (file)
@@ -1,2 +1,2 @@
 static const char screensaver_id[] =
-       "@(#)xscreensaver 4.11 (23-Jun-2003), by Jamie Zawinski (jwz@jwz.org)";
+       "@(#)xscreensaver 4.12 (14-Aug-2003), by Jamie Zawinski (jwz@jwz.org)";
index 2e3b9a9619007a5605cc23b3649560b75b4dbfd2..8bb97646c2b14dd57394c26bf45b68db90358007 100644 (file)
@@ -1,4 +1,5 @@
-/* xscreensaver, Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+/* xscreensaver, Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2003
+ * 
  *  by Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -77,7 +78,7 @@ get_visual (Screen *screen, const char *string, Bool prefer_writable_cells,
   else if (!strcmp (v, "greyscale"))             vclass = GrayScale;
   else if (!strcmp (v, "pseudocolor"))           vclass = PseudoColor;
   else if (!strcmp (v, "directcolor"))           vclass = DirectColor;
-  else if (1 == sscanf (v, " %ld %c", &id, &c))          vclass = SPECIFIC_VISUAL;
+  else if (1 == sscanf (v, " %lu %c", &id, &c))          vclass = SPECIFIC_VISUAL;
   else if (1 == sscanf (v, " 0x%lx %c", &id, &c)) vclass = SPECIFIC_VISUAL;
   else
     {
index 3a4acbf0b07ddc69be58caa85c2cafe76e833654..eb560a2fd04256a614d5cb30c0fde7cdffd6ff14 100644 (file)
@@ -47,6 +47,7 @@ extern void ya_rand_init (unsigned int);
  /* Implement frand using GCC's statement-expression extension. */
 
 # define frand(f)                                                      \
+  __extension__                                                                \
   ({ double tmp = ((((double) random()) * ((double) (f))) /            \
                   ((double) ((unsigned int)~0)));                      \
      tmp < 0 ? (-tmp) : tmp; })
index 02a26d851c542408a9a0df976dac101e68908a30..51482e52238d8dbb9495075463fd94816eb09e7b 100644 (file)
@@ -1,7 +1,7 @@
 Begin3
 Title:          xscreensaver
-Version:        4.11
-Entered-date:   23JUN03
+Version:        4.12
+Entered-date:   14AUG03
 Description:    A modular screen saver and locker for the X Window System.
                 Highly customizable: allows the use of any program that
                 can draw on the root window as a display mode.
@@ -10,16 +10,16 @@ Keywords:       screen saver, screen lock, lock, xlock, X11
 Author:         jwz@jwz.org (Jamie Zawinski)
 Maintained-by:  jwz@jwz.org (Jamie Zawinski)
 Primary-site:   http://www.jwz.org/xscreensaver/
-                245K xscreensaver-4.11.tar.gz
-                64K   xscreensaver.README
+                3793K xscreensaver-4.12.tar.gz
+                65K   xscreensaver.README
                 1K    xscreensaver.lsm
 Alternate-site: sunsite.unc.edu /pub/Linux/X11/screensavers/
-                245K xscreensaver-4.11.tar.gz
-                64K   xscreensaver.README
+                3793K xscreensaver-4.12.tar.gz
+                65K   xscreensaver.README
                 1K    xscreensaver.lsm
 Alternate-site: ftp.x.org /contrib/applications/
-                245K xscreensaver-4.11.tar.gz
-                64K   xscreensaver.README
+                3793K xscreensaver-4.12.tar.gz
+                65K   xscreensaver.README
                 1K    xscreensaver.lsm
 Platforms:      Linux, Irix, SunOS, Solaris, HPUX, AIX, FreeBSD, NetBSD,
                 BSDI, SCO, OSF1, Ultrix, VMS.
index 93da1d7c19611c7b50036bcae4a4a3129965c275..21e32876f40d33fbde21d2ab51d02f5595735d9f 100644 (file)
@@ -1,5 +1,5 @@
 %define        name            xscreensaver
-%define        version         4.11
+%define        version         4.12
 %define        release         1
 %define        serial          1
 %define        x11_prefix      /usr/X11R6