From http://www.jwz.org/xscreensaver/xscreensaver-5.39.tar.gz
[xscreensaver] / hacks / glx / cage.c
index 268d0830c604255b979221fc5d699c54fb3d1ed4..66f48aadc30ab57a8342ced10b64a4f7f54c7612 100644 (file)
@@ -82,8 +82,9 @@ static const char sccsid[] = "@(#)cage.c      5.01 2001/03/01 xlockmore";
                                                        "*wireframe:    False   \n"                     \
                                                        "*suppressRotationAnimation: True\n" \
 
-# define refresh_cage 0
-# define cage_handle_event 0
+# define free_cage 0
+# define release_cage 0
+# define cage_handle_event xlockmore_no_events
 # include "xlockmore.h"                /* from the xscreensaver distribution */
 #else /* !STANDALONE */
 # include "xlock.h"            /* from the xlockmore distribution */
@@ -94,8 +95,8 @@ static const char sccsid[] = "@(#)cage.c      5.01 2001/03/01 xlockmore";
 #if 0
 #include "e_textures.h"
 #else
-#include "xpm-ximage.h"
-#include "../images/wood.xpm"
+#include "ximage-loader.h"
+#include "images/gen/wood_png.h"
 #endif
 
 ENTRYPOINT ModeSpecOpt cage_opts =
@@ -103,7 +104,7 @@ ENTRYPOINT ModeSpecOpt cage_opts =
 
 #ifdef USE_MODULES
 ModStruct   cage_description =
-{"cage", "init_cage", "draw_cage", "release_cage",
+{"cage", "init_cage", "draw_cage", NULL,
  "draw_cage", "change_cage", (char *) NULL, &cage_opts,
  25000, 1, 1, 1, 1.0, 4, "",
  "Shows the Impossible Cage, an Escher-like GL scene", 0, NULL};
@@ -295,8 +296,14 @@ reshape_cage(ModeInfo * mi, int width, int height)
 {
        cagestruct *cp = &cage[MI_SCREEN(mi)];
        int i;
+    int y = 0;
 
-       glViewport(0, 0, cp->WindW = (GLint) width, cp->WindH = (GLint) height);
+    if (width > height * 5) {   /* tiny window: show middle */
+      height = width * 9/16;
+      y = -height/2;
+    }
+
+       glViewport(0, y, cp->WindW = (GLint) width, cp->WindH = (GLint) height);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0);
@@ -356,16 +363,11 @@ pinit(ModeInfo *mi)
        check_gl_error("mipmapping");
 #else
     {
-      XImage *img = xpm_to_ximage (mi->dpy,
-                                   mi->xgwa.visual,
-                                   mi->xgwa.colormap,
-                                   wood_texture);
+      XImage *img = image_data_to_ximage (mi->dpy, mi->xgwa.visual,
+                                          wood_png, sizeof(wood_png));
          glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA,
                     img->width, img->height, 0,
-                    GL_RGBA,
-                    /* GL_UNSIGNED_BYTE, */
-                    GL_UNSIGNED_INT_8_8_8_8_REV,
-                    img->data);
+                    GL_RGBA, GL_UNSIGNED_BYTE, img->data);
       check_gl_error("texture");
       XDestroyImage (img);
     }
@@ -381,35 +383,12 @@ pinit(ModeInfo *mi)
        glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
 }
 
-ENTRYPOINT void
-release_cage (ModeInfo * mi)
-{
-       if (cage != NULL) {
-               int screen;
-
-               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
-                       cagestruct *cp = &cage[screen];
-
-                       if (cp->glx_context) {
-                               cp->glx_context = (GLXContext *) NULL;
-                       }
-               }
-               (void) free((void *) cage);
-               cage = (cagestruct *) NULL;
-       }
-       FreeAllGL(mi);
-}
-
 ENTRYPOINT void
 init_cage (ModeInfo * mi)
 {
        cagestruct *cp;
 
-       if (cage == NULL) {
-               if ((cage = (cagestruct *) calloc(MI_NUM_SCREENS(mi),
-                                              sizeof (cagestruct))) == NULL)
-                       return;
-       }
+       MI_INIT (mi, cage);
        cp = &cage[MI_SCREEN(mi)];
 
        cp->step = NRAND(90);
@@ -469,7 +448,7 @@ draw_cage (ModeInfo * mi)
        glRotatef(25 + cos(cp->step * 5) * 6, 1, 0, 0);
        glRotatef(204.5 - sin(cp->step * 5) * 8, 0, 1, 0);
        if (!draw_impossiblecage(mi, cp, MI_IS_WIREFRAME(mi))) {
-               release_cage(mi);
+               MI_ABORT(mi);
                return;
        }