X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fcage.c;h=66f48aadc30ab57a8342ced10b64a4f7f54c7612;hb=78add6e627ee5f10e1fa6f3852602ea5066eee5a;hp=268d0830c604255b979221fc5d699c54fb3d1ed4;hpb=aa75c7476aeaa84cf3abc192b376a8b03c325213;p=xscreensaver diff --git a/hacks/glx/cage.c b/hacks/glx/cage.c index 268d0830..66f48aad 100644 --- a/hacks/glx/cage.c +++ b/hacks/glx/cage.c @@ -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; }