From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / glx / providence.c
index fcf8d316f540206ab8ed51cd1d07a1f09ba4e418..2d49bb4a956b635b8fb58de7b1b3b9751a8177a2 100644 (file)
@@ -20,6 +20,7 @@
                            "*wireframe: False \n"
 
 # define refresh_providence 0
+# define release_providence 0
 #include "xlockmore.h"
 #else
 #include "xlock.h"
@@ -53,7 +54,7 @@ ENTRYPOINT ModeSpecOpt providence_opts = {
 #ifdef USE_MODULES
 ModStruct   providence_description = {
   "providence", "init_providence", "draw_providence", 
-  "release_providence", "draw_providence", "change_providence", 
+  (char *) NULL, "draw_providence", "change_providence", 
   (char *) NULL, &providence_opts, 1000, 1, 1, 1, 4, 1.0, "",
   "draws pyramid with glory", 0, NULL
 };
@@ -625,18 +626,6 @@ static void pinit(providencestruct *mp)
   glEndList();
 }
 
-/* cleanup routine */
-ENTRYPOINT void release_providence(ModeInfo * mi) 
-{
-
-  if(providence) {
-    free((void *) providence);
-    providence = (providencestruct *) NULL;
-  }
-
-  FreeAllGL(mi);
-}
-
 /* event handling */
 ENTRYPOINT Bool providence_handle_event(ModeInfo *mi, XEvent *event) 
 {
@@ -671,11 +660,7 @@ ENTRYPOINT void init_providence(ModeInfo *mi)
 {
   providencestruct *mp;
   
-  if(!providence) {
-    if((providence = (providencestruct *) 
-       calloc(MI_NUM_SCREENS(mi), sizeof (providencestruct))) == NULL)
-      return;
-  }
+  MI_INIT(mi, providence, NULL);
   mp = &providence[MI_SCREEN(mi)];
   mp->trackball = gltrackball_init (False);
 
@@ -767,6 +752,15 @@ ENTRYPOINT void draw_providence(ModeInfo * mi)
   gltrackball_rotate(mp->trackball);
   glRotatef(mp->theta * 180.0 / Pi, 0.0, -1.0, 0.0);
 
+# 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, 1/h, 1/h);
+  }
+# endif
+
   /* draw providence */
   draw_providence_strip(mi);
   glPopMatrix();