/* -*- 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
"*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 */
#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 */
int init;
double psi;
double dpsi;
- int count, nfibers;
+ long count, nfibers;
double cx;
double rx, ry; /* Coordinates relative to root */
fiberstruct *fiber;
}
}
-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;
{
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;
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 {
/* Allocate fibers */
if((fl->fiber =
(fiberstruct*) calloc(fl->nfibers, sizeof (fiberstruct))) == NULL) {
- free_fiberlamp(mi, fl);
+ free_fiberlamp(mi);
return;
} else {
int f;
(nodestruct*) calloc(NODES, sizeof (nodestruct))) == NULL
||(fs->draw =
(XPoint*) calloc(NODES, sizeof (XPoint))) == NULL) {
- free_fiberlamp(mi, fl);
+ free_fiberlamp(mi);
return;
}
}
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
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)];
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;
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);
}
}
-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)