X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Ffiberlamp.c;h=580851acba808f6b108fa108d8e5a7d811f74321;hb=39809ded547bdbb08207d3e514950425215b4410;hp=062f62ffd3e65f83b304ef88d986d19aca272302;hpb=c1b9b55ad8d59dc05ef55e316aebf5863e7dfa56;p=xscreensaver diff --git a/hacks/fiberlamp.c b/hacks/fiberlamp.c index 062f62ff..580851ac 100644 --- a/hacks/fiberlamp.c +++ b/hacks/fiberlamp.c @@ -1,7 +1,7 @@ /* -*- Mode: C; tab-width: 4 -*- */ /* fiberlamp --- A Fiber Optic Lamp */ -#if !defined( lint ) && !defined( SABER ) +#if 0 static const char sccsid[] = "@(#)fiberlamp.c 5.00 2000/11/01 xlockmore"; #endif @@ -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,15 +53,15 @@ 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 #define SPREAD (30.0) /* Angular spread at the base */ #define SCALE (MI_WIDTH(mi)/2) /* Screen size */ -#define NODES (20) /* Number of nodes in a fiber. Variable with range +#define NODES (20L) /* Number of nodes in a fiber. Variable with range 10 .. 30, if desired. High values have stability problems unless you use small DT */ @@ -95,7 +97,7 @@ typedef struct { int init; double psi; double dpsi; - int count, nfibers; + long count, nfibers; double cx; double rx, ry; /* Coordinates relative to root */ fiberstruct *fiber; @@ -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; @@ -408,9 +420,9 @@ draw_fiberlamp (ModeInfo * mi) double x = fs->node[1].x - fl->cx + 0.025; double y = fs->node[1].z + 0.02; double angle = atan2(y, x) + fl->psi; - int tipcolor = (int)(MI_NPIXELS(mi)*angle/(2*M_PI)) % MI_NPIXELS(mi); - int fibercolor; - int tiplen; + long tipcolor = (int)(MI_NPIXELS(mi)*angle/(2*M_PI)) % MI_NPIXELS(mi); + long fibercolor; + long tiplen; if (tipcolor < 0) tipcolor += MI_NPIXELS(mi); tipcolor = MI_PIXEL(mi, tipcolor); @@ -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)