From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / glx / morph3d.c
index 5780a30eb94c104099dab7dbefe04df5bd38a2f2..4bea5766f90002f2545eb7a9dd62b7a5d1c87e07 100644 (file)
@@ -55,8 +55,11 @@ static const char sccsid[] = "@(#)morph3d.c  5.01 2001/03/01 xlockmore";
 # define MODE_moebius
 # define DEFAULTS              "*delay:                40000   \n"             \
                                                "*showFPS:      False   \n"             \
-                                               "*count:                0               \n"
+                                               "*count:                0               \n"             \
+                                               "*suppressRotationAnimation: True\n" \
+
 # define refresh_morph3d 0
+# define release_morph3d 0
 # define morph3d_handle_event 0
 # include "xlockmore.h"                /* from the xscreensaver distribution */
 #else /* !STANDALONE */
@@ -70,7 +73,7 @@ ENTRYPOINT ModeSpecOpt morph3d_opts =
 
 #ifdef USE_MODULES
 ModStruct   morph3d_description =
-{"morph3d", "init_morph3d", "draw_morph3d", "release_morph3d",
+{"morph3d", "init_morph3d", "draw_morph3d", (char *) NULL,
  "draw_morph3d", "change_morph3d", (char *) NULL, &morph3d_opts,
  1000, 0, 1, 1, 4, 1.0, "",
  "Shows GL morphing polyhedra", 0, NULL};
@@ -606,7 +609,6 @@ pinit(ModeInfo * mi)
        morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
 
        glClearDepth(1.0);
-       glClearColor(0.0, 0.0, 0.0, 1.0);
        glColor3f(1.0, 1.0, 1.0);
 
        glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
@@ -717,11 +719,7 @@ init_morph3d(ModeInfo * mi)
 {
        morph3dstruct *mp;
 
-       if (morph3d == NULL) {
-               if ((morph3d = (morph3dstruct *) calloc(MI_NUM_SCREENS(mi),
-                                           sizeof (morph3dstruct))) == NULL)
-                       return;
-       }
+       MI_INIT (mi, morph3d, NULL);
        mp = &morph3d[MI_SCREEN(mi)];
        mp->step = NRAND(90);
        mp->VisibleSpikes = 1;
@@ -771,6 +769,15 @@ draw_morph3d(ModeInfo * mi)
                glScalef(Scale4Iconic * mp->WindH / mp->WindW, Scale4Iconic, Scale4Iconic);
        }
 
+# ifdef HAVE_MOBILE    /* Keep it the same relative size when rotated. */
+    {
+      GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+      int o = (int) current_device_rotation();
+      if (o != 0 && o != 180 && o != -180)
+        glScalef (1/h, h, 1);
+    }
+# endif
+
        glRotatef(mp->step * 100, 1, 0, 0);
        glRotatef(mp->step * 95, 0, 1, 0);
        glRotatef(mp->step * 90, 0, 0, 1);
@@ -819,16 +826,6 @@ change_morph3d(ModeInfo * mi)
 }
 #endif /* !STANDALONE */
 
-ENTRYPOINT void
-release_morph3d(ModeInfo * mi)
-{
-       if (morph3d != NULL) {
-               (void) free((void *) morph3d);
-               morph3d = (morph3dstruct *) NULL;
-       }
-       FreeAllGL(mi);
-}
-
 #endif
 
 XSCREENSAVER_MODULE ("Morph3D", morph3d)