From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / glx / crackberg.c
index 30af9633440d6e6f27c2c4cfa885583a6db5ad26..dcbe481bfa9b47502d36eb2a25784e2d4711f8e6 100644 (file)
@@ -11,6 +11,7 @@
                    "*wireframe:    False       \n" \
 
 # define refresh_crackberg 0
+# define release_crackberg 0
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
@@ -1166,23 +1167,19 @@ static inline double drunken_rando(double cur_val, double max, double width)
  ** */
 
 ENTRYPOINT void reshape_crackberg (ModeInfo *mi, int w, int h);
+static void free_crackberg (ModeInfo *mi);
 
 ENTRYPOINT void init_crackberg (ModeInfo *mi)
 {
     cberg_state *cberg;
 
-    if (!cbergs) {
-        nsubdivs %= 16; /* just in case.. */
+    nsubdivs %= 16; /* just in case.. */
 
-        if ( !(cbergs = calloc(MI_NUM_SCREENS(mi), sizeof(cberg_state)))) {
-            perror(progname);
-            exit(1);
-        }
+    MI_INIT(mi, cbergs, free_crackberg);
 
-        if (visibility > 1.0 || visibility < 0.2) {
-            printf("visibility must be in range [0.2 .. 1.0]\n");
-            visibility = 1.0;
-        }
+    if (visibility > 1.0 || visibility < 0.2) {
+        printf("visibility must be in range [0.2 .. 1.0]\n");
+        visibility = 1.0;
     }
 
     cberg = &cbergs[MI_SCREEN(mi)];
@@ -1460,19 +1457,12 @@ ENTRYPOINT void draw_crackberg (ModeInfo *mi)
 }
 
 /* uh */
-ENTRYPOINT void release_crackberg (ModeInfo *mi)
+static void free_crackberg (ModeInfo *mi)
 {
-  if (cbergs) {
-    int screen;
-    for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
-      cberg_state *cberg = &cbergs[screen];
-      if (cberg->norms)
-        free(cberg->norms);
-      free(cberg->heights);
-    }
-    free (cbergs);
-    cbergs = 0;
-  }
+  cberg_state *cberg = &cbergs[MI_SCREEN(mi)];
+  if (cberg->norms)
+    free(cberg->norms);
+  free(cberg->heights);
 }
 
 XSCREENSAVER_MODULE ("Crackberg", crackberg)