ftp://ftp.jp.xemacs.org/pub/NetBSD/packages/distfiles/xscreensaver-4.15.tar.gz
[xscreensaver] / hacks / glx / glmatrix.c
index 1fa1123cf394dc4e30ff3048034a50aa5e3603df..3830fa94f1bcb2a18dea3394df85ff4602143bc5 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 */
@@ -204,13 +209,13 @@ static XrmOptionDescRec opts[] = {
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &mode_str,   "mode",       "Mode",    DEF_MODE,      t_String},
-  {(caddr_t *) &speed,      "speed",      "Speed",   DEF_SPEED,     t_Float},
-  {(caddr_t *) &density,    "density",    "Density", DEF_DENSITY,   t_Float},
-  {(caddr_t *) &do_fog,     "fog",        "Fog",     DEF_FOG,       t_Bool},
-  {(caddr_t *) &do_waves,   "waves",      "Waves",   DEF_WAVES,     t_Bool},
-  {(caddr_t *) &do_rotate,  "rotate",     "Rotate",  DEF_ROTATE,    t_Bool},
-  {(caddr_t *) &do_texture, "texture",    "Texture", DEF_TEXTURE,   t_Bool},
+  {&mode_str,   "mode",       "Mode",    DEF_MODE,      t_String},
+  {&speed,      "speed",      "Speed",   DEF_SPEED,     t_Float},
+  {&density,    "density",    "Density", DEF_DENSITY,   t_Float},
+  {&do_fog,     "fog",        "Fog",     DEF_FOG,       t_Bool},
+  {&do_waves,   "waves",      "Waves",   DEF_WAVES,     t_Bool},
+  {&do_rotate,  "rotate",     "Rotate",  DEF_ROTATE,    t_Bool},
+  {&do_texture, "texture",    "Texture", DEF_TEXTURE,   t_Bool},
 };
 
 ModeSpecOpt matrix_opts = {countof(opts), opts, countof(vars), vars, NULL};
@@ -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);
 
@@ -395,8 +400,8 @@ draw_glyph (ModeInfo *mi, int glyph,
            we fade towards a completely solid rectangle.  WTF?
 
            So, for now, instead of changing the alpha, just make the colors
-           be darker.  This isn't quite right (it causes a large dark glyph
-           to occlude the brighter glyphs behind it) but it's close...
+           be darker.  This works out ok so long as we use GL_ONE in
+           glBlendFunc, so that stacked glyph colors are added together.
          */
         r *= a;
         g *= a;
@@ -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++)
@@ -850,7 +863,13 @@ init_matrix (ModeInfo *mi)
       load_textures (mi, flip_p);
       glEnable(GL_TEXTURE_2D);
       glEnable(GL_BLEND);
-      glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
+
+      /* Jeff Epler points out:
+         By using GL_ONE instead of GL_SRC_ALPHA, glyphs are added to
+         each other, so that a bright glyph with a darker one in front
+         is a little brighter than the bright glyph alone.
+       */
+      glBlendFunc (GL_ONE_MINUS_SRC_ALPHA, /* GL_SRC_ALPHA */ GL_ONE);
     }
 
   /* to scale coverage-percent to strips, this number looks about right... */