X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Ffiberlamp.c;h=580851acba808f6b108fa108d8e5a7d811f74321;hb=39809ded547bdbb08207d3e514950425215b4410;hp=4c594fbb99f7b36d31663953653864338e9241f7;hpb=8afc01a67be4fbf3f1cc0fce9adf01b5289a21c6;p=xscreensaver diff --git a/hacks/fiberlamp.c b/hacks/fiberlamp.c index 4c594fbb..580851ac 100644 --- a/hacks/fiberlamp.c +++ b/hacks/fiberlamp.c @@ -38,6 +38,8 @@ static const char sccsid[] = "@(#)fiberlamp.c 5.00 2000/11/01 xlockmore"; "*fpsTop: true \n" \ # define UNIFORM_COLORS +# define release_fiberlamp 0 +# define reshape_fiberlamp 0 # define fiberlamp_handle_event 0 # include "xlockmore.h" /* in xscreensaver distribution */ #else /* STANDALONE */ @@ -51,8 +53,8 @@ ENTRYPOINT ModeSpecOpt fiberlamp_opts = #ifdef USE_MODULES ModStruct fiberlamp_description = -{"fiberlamp", "init_fiberlamp", "draw_fiberlamp", "release_fiberlamp", - "draw_fiberlamp", "change_fiberlamp", (char *) NULL, &fiberlamp_opts, +{"fiberlamp", "init_fiberlamp", "draw_fiberlamp", (char *) NULL, + "draw_fiberlamp", "change_fiberlamp", "free_fiberlamp", &fiberlamp_opts, 1000, 500, 10000, 0, 64, 1.0, "", "Shows a Fiber Optic Lamp", 0, NULL}; #endif @@ -141,9 +143,10 @@ free_fiber(fiberlampstruct *fl) } } -static void -free_fiberlamp(ModeInfo *mi, fiberlampstruct *fl) +ENTRYPOINT void +free_fiberlamp(ModeInfo *mi) { + fiberlampstruct *fl = &fiberlamps[MI_SCREEN(mi)]; if (fl->buffer != None && fl->dbufp) { XFreePixmap(MI_DISPLAY(mi), fl->buffer); fl->buffer = None; @@ -156,16 +159,11 @@ init_fiberlamp(ModeInfo * mi) { fiberlampstruct *fl; - if (fiberlamps == NULL) { - if ((fiberlamps = - (fiberlampstruct *) calloc(MI_NUM_SCREENS(mi), - sizeof (fiberlampstruct))) == NULL) - return; - } + MI_INIT (mi, fiberlamps); fl = &fiberlamps[MI_SCREEN(mi)]; /* Create or Resize double buffer */ -#ifdef HAVE_COCOA /* Don't second-guess Quartz's double-buffering */ +#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */ fl->dbufp = False; #else fl->dbufp = True; @@ -178,7 +176,7 @@ init_fiberlamp(ModeInfo * mi) fl->buffer = XCreatePixmap(MI_DISPLAY(mi), MI_WINDOW(mi), MI_WIDTH(mi), MI_HEIGHT(mi), MI_DEPTH(mi)); if (fl->buffer == None) { - free_fiberlamp(mi, fl); + free_fiberlamp(mi); return; } } else { @@ -197,7 +195,7 @@ init_fiberlamp(ModeInfo * mi) /* Allocate fibers */ if((fl->fiber = (fiberstruct*) calloc(fl->nfibers, sizeof (fiberstruct))) == NULL) { - free_fiberlamp(mi, fl); + free_fiberlamp(mi); return; } else { int f; @@ -207,7 +205,7 @@ init_fiberlamp(ModeInfo * mi) (nodestruct*) calloc(NODES, sizeof (nodestruct))) == NULL ||(fs->draw = (XPoint*) calloc(NODES, sizeof (XPoint))) == NULL) { - free_fiberlamp(mi, fl); + free_fiberlamp(mi); return; } } @@ -276,13 +274,6 @@ init_fiberlamp(ModeInfo * mi) change_fiberlamp(mi); } -/* Used by xscreensaver. xlock just uses init_fiberlamp */ -ENTRYPOINT void -reshape_fiberlamp(ModeInfo * mi, int width, int height) -{ - init_fiberlamp(mi); -} - /* sort fibers so they get drawn back-to-front, one bubble pass is enough as the order only changes slowly */ static void @@ -305,15 +296,36 @@ draw_fiberlamp (ModeInfo * mi) fiberlampstruct *fl; int f, i; int x, y; + int ww, hh; Window unused; + short cx, cy; + + ww = MI_WIDTH(mi); + hh = MI_HEIGHT(mi); - short cx = MI_WIDTH(mi)/2; + cx = MI_WIDTH(mi)/2; #if defined PLAN || defined CHECKCOLORWHEEL - short cy = MI_HEIGHT(mi)/2; + cy = MI_HEIGHT(mi)/2; #else - short cy = MI_HEIGHT(mi); + cy = MI_HEIGHT(mi); #endif + if (ww > hh * 5 || /* window has weird aspect */ + hh > ww * 5) + { + if (ww > hh) + { + hh = ww; + cy = hh / 4; + } + else + { + ww = hh; + cx = 0; + cy = hh*3/4; + } + } + if (fiberlamps == NULL) return; fl = &fiberlamps[MI_SCREEN(mi)]; @@ -383,11 +395,11 @@ draw_fiberlamp (ModeInfo * mi) n->z = p->z + LEN(i-1) * se * sp; } - fs->draw[i-1].x = cx + MI_WIDTH(mi)/2*n->x; + fs->draw[i-1].x = cx + ww/2*n->x; #if defined PLAN || defined CHECKCOLORWHEEL /* Plan */ - fs->draw[i-1].y = cy + MI_WIDTH(mi)/2*n->z; + fs->draw[i-1].y = cy + ww/2*n->z; #else /* Elevation */ - fs->draw[i-1].y = cy + MI_WIDTH(mi)/2*n->y; + fs->draw[i-1].y = cy + ww/2*n->y; #endif } MI_IS_DRAWN(mi) = True; @@ -449,24 +461,13 @@ draw_fiberlamp (ModeInfo * mi) } } -ENTRYPOINT void -release_fiberlamp(ModeInfo * mi) -{ - if (fiberlamps != NULL) { - int screen; - - for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) - free_fiberlamp(mi, &fiberlamps[screen]); - free(fiberlamps); - fiberlamps = (fiberlampstruct *) NULL; - } -} - +#ifndef STANDALONE ENTRYPOINT void refresh_fiberlamp(ModeInfo * mi) { MI_CLEARWINDOW(mi); } +#endif XSCREENSAVER_MODULE ("Fiberlamp", fiberlamp)