X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Ftimetunnel.c;h=723d04deec4adf7c8e60443834afc030b346cbb3;hb=78add6e627ee5f10e1fa6f3852602ea5066eee5a;hp=18f38131f4f9b3c1f5eb7d9d4c634890be5e2da4;hpb=7b34ef992563d7bcbb64cc5597dc45fa24470b05;p=xscreensaver diff --git a/hacks/glx/timetunnel.c b/hacks/glx/timetunnel.c index 18f38131..723d04de 100644 --- a/hacks/glx/timetunnel.c +++ b/hacks/glx/timetunnel.c @@ -1,5 +1,5 @@ /* timetunnel. Based on dangerball.c, hack by Sean Brennan */ -/* dangerball, Copyright (c) 2001-2004 Jamie Zawinski +/* dangerball, Copyright (c) 2001-2018 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -23,7 +23,7 @@ -# define refresh_tunnel 0 +# define free_tunnel 0 # define release_tunnel 0 #undef countof #define countof(x) (sizeof((x))/sizeof((*x))) @@ -33,7 +33,6 @@ #include "rotator.h" #include "gltrackball.h" - #define DEF_START "0.00" #define DEF_DILATE "1.00" #define DEF_END "27.79" @@ -90,12 +89,12 @@ static argtype vars[] = { }; ENTRYPOINT ModeSpecOpt tunnel_opts = {countof(opts), opts, countof(vars), vars, NULL}; -#include "xpm-ximage.h" -#include "images/logo-180.xpm" -#include "images/tunnelstar.xpm" -#include "images/timetunnel0.xpm" -#include "images/timetunnel1.xpm" -#include "images/timetunnel2.xpm" +#include "ximage-loader.h" +#include "images/gen/logo-180_png.h" +#include "images/gen/tunnelstar_png.h" +#include "images/gen/timetunnel0_png.h" +#include "images/gen/timetunnel1_png.h" +#include "images/gen/timetunnel2_png.h" #ifdef USE_GL /* whole file */ @@ -353,8 +352,15 @@ ENTRYPOINT void reshape_tunnel (ModeInfo *mi, int width, int height) { GLfloat h = (GLfloat) height / (GLfloat) width; + int y = 0; + + if (width > height * 5) { /* tiny window: show middle */ + height = width * 9/16; + y = -height/2; + h = height / (GLfloat) width; + } - glViewport (0, 0, (GLint) width, (GLint) height); + glViewport (0, y, (GLint) width, (GLint) height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); @@ -377,37 +383,10 @@ tunnel_handle_event (ModeInfo *mi, XEvent *event) { tunnel_configuration *tc = &tconf[MI_SCREEN(mi)]; - if (event->xany.type == ButtonPress && - event->xbutton.button == Button1) - { - tc->button_down_p = True; - gltrackball_start (tc->trackball, - event->xbutton.x, event->xbutton.y, - MI_WIDTH (mi), MI_HEIGHT (mi)); - return True; - } - else if (event->xany.type == ButtonRelease && - event->xbutton.button == Button1) - { - tc->button_down_p = False; - return True; - } - else if (event->xany.type == ButtonPress && - (event->xbutton.button == Button4 || - event->xbutton.button == Button5)) - { - gltrackball_mousewheel (tc->trackball, event->xbutton.button, 10, - !!event->xbutton.state); - return True; - } - else if (event->xany.type == MotionNotify && - tc->button_down_p) - { - gltrackball_track (tc->trackball, - event->xmotion.x, event->xmotion.y, - MI_WIDTH (mi), MI_HEIGHT (mi)); - return True; - } + if (gltrackball_event_handler (event, tc->trackball, + MI_WIDTH (mi), MI_HEIGHT (mi), + &tc->button_down_p)) + return True; return False; } @@ -486,6 +465,7 @@ static void draw_sign(ModeInfo *mi, tunnel_configuration *tc, float z, float al GLuint tex, int blend_mode) { +#ifndef HAVE_JWZGLES if (alpha > 0.0) { mi->polygon_count ++; /* glEnable(GL_BLEND); */ @@ -527,6 +507,7 @@ static void draw_sign(ModeInfo *mi, tunnel_configuration *tc, float z, float al /* glDisable(GL_BLEND); */ } +#endif /* !HAVE_JWZGLES */ } /* draw sign */ @@ -535,6 +516,7 @@ static void draw_sign(ModeInfo *mi, tunnel_configuration *tc, float z, float al tunnel does not move, and is acutally a display list. if alpha = 0, skip */ static void draw_cyl(ModeInfo *mi, tunnel_configuration *tc, float alpha, int texnum, int listnum, int shiftnum) { +#ifndef HAVE_JWZGLES if (alpha > 0.0) { if (listnum == tc->diamondlist) mi->polygon_count += 4; @@ -559,6 +541,7 @@ static void draw_cyl(ModeInfo *mi, tunnel_configuration *tc, float alpha, int te glMatrixMode(GL_MODELVIEW); /* glDisable(GL_BLEND); */ } +#endif /* HAVE_JWZGLES */ } @@ -585,7 +568,7 @@ l| |r tr0, tr1, tl0, tl1, l0 , l1 , - bl0, depth=0.3, zdepth=15.0; + depth=0.3, zdepth=15.0; /* zdepth is how far back tunnel goes */ /* depth is tex coord scale. low number = fast texture shifting */ @@ -601,7 +584,6 @@ l| |r tl1 = tl0 + half_floor; l0 = tr1; l1 = l0 + full_wall; - bl0 = l1; glMatrixMode(GL_TEXTURE); glLoadIdentity(); @@ -854,7 +836,7 @@ static int wrapVal(int val, int min, int max) static float mylog2(float x) { return ( log(x) / log(2));} -static void LoadTexture(ModeInfo * mi, char **fn, const char *filename, GLuint texbind, int blur, float bw_color, Bool anegative, Bool onealpha) +static void LoadTexture(ModeInfo * mi, const unsigned char *fn, unsigned long size, const char *filename, GLuint texbind, int blur, float bw_color, Bool anegative, Bool onealpha) { /* looping and temporary array index variables */ int ix, iy, bx, by, indx, indy, boxsize, cchan, tmpidx, dtaidx; @@ -873,11 +855,11 @@ static void LoadTexture(ModeInfo * mi, char **fn, const char *filename, GLuint t if (filename) - teximage = xpm_file_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi), - MI_COLORMAP(mi), filename); + teximage = file_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi), + filename); else - teximage = xpm_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi), - MI_COLORMAP(mi), fn); + teximage = image_data_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi), + fn, size); if (teximage == NULL) { fprintf(stderr, "%s: error reading the texture.\n", progname); glDeleteTextures(1, &texbind); @@ -903,6 +885,7 @@ static void LoadTexture(ModeInfo * mi, char **fn, const char *filename, GLuint t } if (rescale) { +#ifndef HAVE_JWZGLES tmpbuf = calloc(bx * by * 4, sizeof(unsigned char)); if (gluScaleImage(GL_RGBA, teximage->width, teximage->height, GL_UNSIGNED_BYTE, teximage->data, bx, by, GL_UNSIGNED_BYTE, tmpbuf)) @@ -912,6 +895,7 @@ static void LoadTexture(ModeInfo * mi, char **fn, const char *filename, GLuint t teximage->data = (char *) tmpbuf; teximage->width = bx; teximage->height= by; +#endif /* !HAVE_JWZGLES */ } /* end rescale code */ @@ -965,7 +949,6 @@ static void LoadTexture(ModeInfo * mi, char **fn, const char *filename, GLuint t tmpa = teximage->data[dtaidx + cchan]; tmpfa = (float) tmpa * boxdiv; /* box filter */ - blursum = 0.0; for (by = -boxsize ; by <= boxsize; by++) { for (bx = -boxsize ; bx <= boxsize; bx++) { indx = wrapVal(ix + bx, 0, teximage->width); @@ -991,6 +974,7 @@ static void LoadTexture(ModeInfo * mi, char **fn, const char *filename, GLuint t clear_gl_error(); #ifdef HAVE_GLBINDTEXTURE glBindTexture(GL_TEXTURE_2D, texbind); + clear_gl_error(); /* WTF? sometimes "invalid op" from glBindTexture! */ #endif glPixelStorei(GL_UNPACK_ALIGNMENT, 4); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, teximage->width, teximage->height, @@ -1050,16 +1034,11 @@ init_tunnel (ModeInfo *mi) wire = MI_IS_WIREFRAME(mi); - if (!tconf) { - tconf = (tunnel_configuration *) - calloc (MI_NUM_SCREENS(mi), sizeof (tunnel_configuration)); - if (!tconf) { - fprintf(stderr, "%s: out of memory\n", progname); - exit(1); - } +# ifdef HAVE_JWZGLES /* #### glPolygonMode other than GL_FILL unimplemented */ + wire = 0; +# endif - tc = &tconf[MI_SCREEN(mi)]; - } + MI_INIT (mi, tconf); tc = &tconf[MI_SCREEN(mi)]; @@ -1097,36 +1076,42 @@ init_tunnel (ModeInfo *mi) tunnel 1, tunnel 2, tunnel 3, marquee, tardis, head */ glGenTextures(MAX_TEXTURE, tc->texture_binds); - /*LoadTexture(*mi, **fn, *filename, texbind, bluralpha, bw_color, anegative, onealpha)*/ + /*LoadTexture(*mi, *data, size, *filename, texbind, bluralpha, bw_color, anegative, onealpha)*/ if (strcasecmp (do_tun1, "(none)")) /* tunnel 1 */ - LoadTexture(mi, NULL, do_tun1, tc->texture_binds[0], 0,0.0, False, False); + LoadTexture(mi, NULL, 0, do_tun1, tc->texture_binds[0], 0,0.0, False, False); else - LoadTexture(mi, timetunnel0_xpm, NULL, tc->texture_binds[0], 0, 0.0, False, False); + LoadTexture(mi, timetunnel0_png, sizeof(timetunnel0_png), NULL, tc->texture_binds[0], 0, 0.0, False, False); if (strcasecmp (do_tun2, "(none)")) /* tunnel 2 */ - LoadTexture(mi, NULL, do_tun2, tc->texture_binds[2], 0,0.0, False, False); + LoadTexture(mi, NULL, 0, do_tun2, tc->texture_binds[2], 0,0.0, False, False); else - LoadTexture(mi, timetunnel1_xpm, NULL, tc->texture_binds[2], 0, 0.0, False, False); + LoadTexture(mi, timetunnel1_png, sizeof(timetunnel1_png), NULL, tc->texture_binds[2], 0, 0.0, False, False); if (strcasecmp (do_tun3, "(none)")) /* tunnel 3 */ - LoadTexture(mi, NULL, do_tun3, tc->texture_binds[5], 0,0.0, False, False); + LoadTexture(mi, NULL, 0, do_tun3, tc->texture_binds[5], 0,0.0, False, False); else - LoadTexture(mi, timetunnel2_xpm, NULL, tc->texture_binds[5], 0, 0.0, False, False); - LoadTexture(mi, tunnelstar_xpm, NULL, tc->texture_binds[4], 0, 0.0, False, False); + LoadTexture(mi, timetunnel2_png, sizeof(timetunnel2_png), NULL, tc->texture_binds[5], 0, 0.0, False, False); + LoadTexture(mi, tunnelstar_png, sizeof(tunnelstar_png), NULL, tc->texture_binds[4], 0, 0.0, False, False); if (strcasecmp (do_tx1, "(none)")) /* marquee */ - LoadTexture(mi, NULL, do_tx1, tc->texture_binds[3], 0,0.0, False, False); + LoadTexture(mi, NULL, 0, do_tx1, tc->texture_binds[3], 0,0.0, False, False); +#ifndef HAVE_JWZGLES /* logo_180_png is 180px which is not a power of 2! */ else - LoadTexture(mi, (char **) logo_180_xpm, NULL, tc->texture_binds[3], 0,0.0, False, False); + LoadTexture(mi, logo_180_png, sizeof(logo_180_png), NULL, tc->texture_binds[3], 0,0.0, False, False); +#endif if (strcasecmp (do_tx2, "(none)")) /* tardis */ - LoadTexture(mi, NULL, do_tx2, tc->texture_binds[1], 0, 0.0 ,False, False); + LoadTexture(mi, NULL, 0, do_tx2, tc->texture_binds[1], 0, 0.0 ,False, False); +#ifndef HAVE_JWZGLES /* logo_180_png is 180px which is not a power of 2! */ else - LoadTexture(mi, (char **) logo_180_xpm, NULL, tc->texture_binds[1], 0,0.0, False, False); + LoadTexture(mi, logo_180_png, sizeof(logo_180_png), NULL, tc->texture_binds[1], 0,0.0, False, False); +#endif if (strcasecmp (do_tx3, "(none)")) { /* head */ - LoadTexture(mi, NULL, do_tx3, tc->texture_binds[6], 0, 0.0 ,False, False); + LoadTexture(mi, NULL, 0, do_tx3, tc->texture_binds[6], 0, 0.0 ,False, False); /* negative */ - LoadTexture(mi, NULL, do_tx3, tc->texture_binds[9], 2,1.0, True, True); + LoadTexture(mi, NULL, 0, do_tx3, tc->texture_binds[9], 2,1.0, True, True); +#ifndef HAVE_JWZGLES /* logo_180_png is 180px which is not a power of 2! */ } else { - LoadTexture(mi, (char **) logo_180_xpm, NULL, tc->texture_binds[6], 0,0.0, False, False); + LoadTexture(mi, logo_180_png, sizeof(logo_180_png), NULL, tc->texture_binds[6], 0,0.0, False, False); /* negative */ - LoadTexture(mi, (char **) logo_180_xpm, NULL, tc->texture_binds[9], 2,1.0, True, True); + LoadTexture(mi, logo_180_png, sizeof(logo_180_png), NULL, tc->texture_binds[9], 2,1.0, True, True); +#endif } glEnable(GL_TEXTURE_2D); check_gl_error("tex"); @@ -1145,7 +1130,7 @@ init_tunnel (ModeInfo *mi) glAlphaFunc(GL_GREATER, 0.5); } - tc->trackball = gltrackball_init (); + tc->trackball = gltrackball_init (True); tc->texshift = calloc(tc->num_texshifts, sizeof(GLfloat));