From http://www.jwz.org/xscreensaver/xscreensaver-5.38.tar.gz
[xscreensaver] / hacks / discrete.c
index db3838ff5fa0be75c73a89ec3ffe20425b09d9ff..bfb4459a233324d31a0b45d8cb2c332d3498c7e0 100644 (file)
@@ -33,15 +33,18 @@ static const char sccsid[] = "@(#)discrete.c        5.00 2000/11/01 xlockmore";
 
 #ifdef STANDALONE
 # define MODE_discrete
-#define DEFAULTS       "*delay: 1000 \n" \
-                                       "*count: 4096 \n" \
+#define DEFAULTS       "*delay: 20000 \n" \
+                                       "*count:  4096 \n" \
                                        "*cycles: 2500 \n" \
-                                       "*ncolors: 100 \n"
+                                       "*ncolors: 100 \n" \
+                                       "*fpsSolid: true \n" \
+                                   "*ignoreRotation: True \n" \
+                                   "*lowrez: True \n" \
+
 # define SMOOTH_COLORS
-# define reshape_discrete 0
+# define release_discrete 0
 # define discrete_handle_event 0
 # include "xlockmore.h"                /* in xscreensaver distribution */
-# include "erase.h"
 #else /* STANDALONE */
 # include "xlock.h"            /* in xlockmore distribution */
 #endif /* STANDALONE */
@@ -53,8 +56,8 @@ ENTRYPOINT ModeSpecOpt discrete_opts =
 
 #ifdef USE_MODULES
 ModStruct   discrete_description =
-{"discrete", "init_discrete", "draw_discrete", "release_discrete",
- "refresh_discrete", "init_discrete", (char *) NULL, &discrete_opts,
+{"discrete", "init_discrete", "draw_discrete", (char *) NULL,
+ "refresh_discrete", "init_discrete", "free_discrete", &discrete_opts,
  1000, 4096, 2500, 1, 64, 1.0, "",
  "Shows various discrete maps", 0, NULL};
 
@@ -100,10 +103,6 @@ typedef struct {
 
     int sqrt_sign, std_sign;
 
-#ifdef STANDALONE
-  eraser_state *eraser;
-#endif
-
 } discretestruct;
 
 static discretestruct *discretes = (discretestruct *) NULL;
@@ -114,12 +113,7 @@ init_discrete (ModeInfo * mi)
        double      range;
        discretestruct *hp;
 
-       if (discretes == NULL) {
-               if ((discretes =
-                    (discretestruct *) calloc(MI_NUM_SCREENS(mi),
-                                          sizeof (discretestruct))) == NULL)
-                       return;
-       }
+       MI_INIT (mi, discretes);
        hp = &discretes[MI_SCREEN(mi)];
 
        hp->maxx = MI_WIDTH(mi);
@@ -248,10 +242,8 @@ init_discrete (ModeInfo * mi)
                /* if fails will check later */
        }
 
-#ifndef STANDALONE
        /* Clear the background. */
        MI_CLEARWINDOW(mi);
-#endif
 
        XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
        hp->count = 0;
@@ -260,8 +252,8 @@ init_discrete (ModeInfo * mi)
 }
 
 
-ENTRYPOINT void
-draw_discrete (ModeInfo * mi)
+static void
+draw_discrete_1 (ModeInfo * mi)
 {
        Display    *dsp = MI_DISPLAY(mi);
        Window      win = MI_WINDOW(mi);
@@ -279,11 +271,6 @@ draw_discrete (ModeInfo * mi)
        if (hp->pointBuffer == NULL)
                return;
 
-    if (hp->eraser) {
-      hp->eraser = erase_window (MI_DISPLAY(mi), MI_WINDOW(mi), hp->eraser);
-      return;
-    }
-
        k = count;
        xp = hp->pointBuffer;
 
@@ -400,38 +387,53 @@ draw_discrete (ModeInfo * mi)
                xp++;
        }
        XDrawPoints(dsp, win, gc, hp->pointBuffer, count, CoordModeOrigin);
-       if (++hp->count > cycles) {
-#ifdef STANDALONE
-      hp->eraser = erase_window (MI_DISPLAY(mi), MI_WINDOW(mi), hp->eraser);
-#endif /* STANDALONE */
-               init_discrete(mi);
-       }
 }
 
 ENTRYPOINT void
-release_discrete(ModeInfo * mi)
+draw_discrete (ModeInfo * mi)
 {
-       if (discretes != NULL) {
-               int         screen;
+  discretestruct *hp = &discretes[MI_SCREEN(mi)];
+  int cycles = MI_CYCLES(mi);
+  int i;
+
+  for (i = 0; i < 10; i++) {
+    draw_discrete_1 (mi);
+    hp->count++;
+  }
+
+  if (hp->count > cycles) {
+    init_discrete(mi);
+  }
+}
 
-               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
-                       discretestruct *hp = &discretes[screen];
 
-                       if (hp->pointBuffer != NULL) {
-                               (void) free((void *) hp->pointBuffer);
-                               /* hp->pointBuffer = NULL; */
-                       }
-               }
-               (void) free((void *) discretes);
-               discretes = (discretestruct *) NULL;
+ENTRYPOINT void
+reshape_discrete(ModeInfo * mi, int width, int height)
+{
+  discretestruct *hp = &discretes[MI_SCREEN(mi)];
+  hp->maxx = width;
+  hp->maxy = height;
+  XClearWindow (MI_DISPLAY (mi), MI_WINDOW(mi));
+}
+
+ENTRYPOINT void
+free_discrete(ModeInfo * mi)
+{
+       discretestruct *hp = &discretes[MI_SCREEN(mi)];
+
+       if (hp->pointBuffer != NULL) {
+               (void) free((void *) hp->pointBuffer);
+               /* hp->pointBuffer = NULL; */
        }
 }
 
+#ifndef STANDALONE
 ENTRYPOINT void
 refresh_discrete(ModeInfo * mi)
 {
        MI_CLEARWINDOW(mi);
 }
+#endif
 
 XSCREENSAVER_MODULE ("Discrete", discrete)