From http://www.jwz.org/xscreensaver/xscreensaver-5.36.tar.gz
[xscreensaver] / hacks / glx / gleidescope.c
index 9ea8035306a76519803cd30377599252127d9380..184b4e82ae932314f3cd905ff570cd7e887a4f57 100644 (file)
@@ -74,7 +74,8 @@
                "*delay:                20000           \n"     \
                "*showFPS:              False           \n"     \
                "*size:                 0                       \n"     \
-               "*useSHM:               True            \n"
+               "*useSHM:               True            \n" \
+               "*suppressRotationAnimation: True\n" \
 
 # define refresh_gleidescope 0
 # include "xlockmore.h"                                /* from the xscreensaver distribution */
@@ -874,7 +875,7 @@ setup_random_texture (ModeInfo *mi, texture *texture)
        texture->start_time = time((time_t *)0);
 }
 
-static void
+static Bool
 setup_file_texture (ModeInfo *mi, char *filename, texture *texture)
 {
        Display *dpy = mi->dpy;
@@ -883,6 +884,7 @@ setup_file_texture (ModeInfo *mi, char *filename, texture *texture)
 
        Colormap cmap = mi->xgwa.colormap;
        XImage *image = xpm_file_to_ximage (dpy, visual, cmap, filename);
+    if (!image) return False;
 
 #ifdef DEBUG
        printf("FileTexture\n");
@@ -915,6 +917,7 @@ setup_file_texture (ModeInfo *mi, char *filename, texture *texture)
        texture->min_ty = 0.0;
        texture->max_ty = 1.0;
        texture->start_time = time((time_t *)0);
+    return True;
 }
 
 static void
@@ -923,6 +926,7 @@ setup_texture(ModeInfo * mi, texture *texture)
        gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
 
        if (!image || !*image || !strcmp(image, "DEFAULT")) {
+    BUILTIN:
                /* no image specified - use system settings */
 #ifdef DEBUG
                printf("SetupTexture: get_snapshot\n");
@@ -939,7 +943,8 @@ setup_texture(ModeInfo * mi, texture *texture)
 #ifdef DEBUG
                        printf("SetupTexture: file_texture\n");
 #endif
-                       setup_file_texture(mi, image, texture);
+                       if (! setup_file_texture(mi, image, texture))
+              goto BUILTIN;
                }
        }
        /* copy start time from texture */
@@ -1117,15 +1122,9 @@ draw_hexagons(ModeInfo *mi, int translucency, texture *texture)
 {
     int polys = 0;
        int             i;
-       GLfloat col[4];
        vector2f t[3];
        gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
 
-       col[0] = 1.0;
-       col[1] = 1.0;
-       col[2] = 1.0;
-       col[3] = (float)translucency / MAX_FADE;
-
        calculate_texture_coords(mi, texture, t);
 
        glColor4f(1.0, 1.0, 1.0, (float)translucency / MAX_FADE);
@@ -1246,7 +1245,6 @@ draw(ModeInfo * mi)
        GLfloat x_angle, y_angle, z_angle;
        gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
        vectorf v1;
-       GLfloat pos[4];
 
     mi->polygon_count = 0;
 
@@ -1328,11 +1326,14 @@ draw(ModeInfo * mi)
                        0.0);
 #endif
 
-       /* light position same as camera */
-       pos[0] = v1.x;
-       pos[1] = v1.y;
-       pos[2] = v1.z;
-       pos[3] = 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
 
        if (gp->fade == 0)
        {
@@ -1401,7 +1402,6 @@ ENTRYPOINT void reshape_gleidescope(ModeInfo *mi, int width, int height)
        glLoadIdentity();
        gluPerspective(50.0, 1/h, 0.1, 2000.0);
        glMatrixMode (GL_MODELVIEW);
-
        glLineWidth(1);
        glPointSize(1);   
 }