/* -*- Mode: C; tab-width: 4 -*- */
/* crystal --- polygons moving according to plane group rules */
-#if !defined( lint ) && !defined( SABER )
+#if 0
static const char sccsid[] = "@(#)crystal.c 4.12 98/09/10 xlockmore";
-
#endif
/*-
*
* A moving polygon-mode. The polygons obey 2D-planegroup symmetry.
*
+ * The groupings of the cells fall in 3 categories:
+ * oblique groups 1 and 2 where the angle gamma ranges from 60 to 120 degrees
+ * square groups 3 through 11 where the angle gamma is 90 degrees
+ * hexagonal groups 12 through 17 where the angle gamma is 120 degrees
+ *
* Revision History:
+ * 03-Dec-98: Random inversion of y-axis included to simulate hexagonal groups
+ * with an angle of 60 degrees.
* 10-Sep-98: new colour scheme
* 24-Feb-98: added option centre which turns on/off forcing the centre of
* the screen to be used
*/
#ifdef STANDALONE
-# define PROGCLASS "Crystal"
-# define HACK_INIT init_crystal
-# define HACK_DRAW draw_crystal
-# define crystal_opts xlockmore_opts
# define DEFAULTS "*delay: 60000 \n" \
"*count: -500 \n" \
"*cycles: 200 \n" \
"*size: -15 \n" \
"*ncolors: 100 \n" \
- "*fullrandom: True \n" \
- "*verbose: False \n"
+ "*fpsSolid: True \n" \
+ "*ignoreRotation: True \n" \
+
# include "xlockmore.h" /* in xscreensaver distribution */
#else /* STANDALONE */
# include "xlock.h" /* in xlockmore distribution */
+# include "color.h"
#endif /* STANDALONE */
#define DEF_CELL "True" /* Draw unit cell */
#define DEF_MAXSIZE "False"
#define DEF_CYCLE "True"
-#define min(a,b) ((a) <= (b) ? (a) : (b))
+#undef NRAND
+#define NRAND(n) ( (n) ? (int) (LRAND() % (n)) : 0)
-void release_crystal(ModeInfo * mi);
+#define min(a,b) ((a) <= (b) ? (a) : (b))
static int nx, ny;
static XrmOptionDescRec opts[] =
{
- {"-nx", "crystal.nx", XrmoptionSepArg, (caddr_t) NULL},
- {"-ny", "crystal.ny", XrmoptionSepArg, (caddr_t) NULL},
- {"-centre", ".crystal.centre", XrmoptionNoArg, (caddr_t) "on"},
- {"+centre", ".crystal.centre", XrmoptionNoArg, (caddr_t) "off"},
- {"-maxsize", ".crystal.maxsize", XrmoptionNoArg, (caddr_t) "on"},
- {"+maxsize", ".crystal.maxsize", XrmoptionNoArg, (caddr_t) "off"},
- {"-cell", ".crystal.cell", XrmoptionNoArg, (caddr_t) "on"},
- {"+cell", ".crystal.cell", XrmoptionNoArg, (caddr_t) "off"},
- {"-grid", ".crystal.grid", XrmoptionNoArg, (caddr_t) "on"},
- {"+grid", ".crystal.grid", XrmoptionNoArg, (caddr_t) "off"},
- {"-shift", ".crystal.shift", XrmoptionNoArg, (caddr_t) "on"},
- {"+shift", ".crystal.shift", XrmoptionNoArg, (caddr_t) "off"}
+ {"-nx", "crystal.nx", XrmoptionSepArg, 0},
+ {"-ny", "crystal.ny", XrmoptionSepArg, 0},
+ {"-centre", ".crystal.centre", XrmoptionNoArg, "on"},
+ {"+centre", ".crystal.centre", XrmoptionNoArg, "off"},
+ {"-maxsize", ".crystal.maxsize", XrmoptionNoArg, "on"},
+ {"+maxsize", ".crystal.maxsize", XrmoptionNoArg, "off"},
+ {"-cell", ".crystal.cell", XrmoptionNoArg, "on"},
+ {"+cell", ".crystal.cell", XrmoptionNoArg, "off"},
+ {"-grid", ".crystal.grid", XrmoptionNoArg, "on"},
+ {"+grid", ".crystal.grid", XrmoptionNoArg, "off"},
+ {"-shift", ".crystal.shift", XrmoptionNoArg, "on"},
+ {"+shift", ".crystal.shift", XrmoptionNoArg, "off"}
};
static argtype vars[] =
{
- {(caddr_t *) & nx, "nx", "nx", DEF_NX, t_Int},
- {(caddr_t *) & ny, "ny", "ny", DEF_NY, t_Int},
- {(caddr_t *) & centre, "centre", "Centre", DEF_CENTRE, t_Bool},
- {(caddr_t *) & maxsize, "maxsize", "Maxsize", DEF_MAXSIZE, t_Bool},
- {(caddr_t *) & unit_cell, "cell", "Cell", DEF_CELL, t_Bool},
- {(caddr_t *) & grid_cell, "grid", "Grid", DEF_GRID, t_Bool},
- {(caddr_t *) & cycle_p, "shift", "Shift", DEF_CYCLE, t_Bool}
+ {&nx, "nx", "nx", DEF_NX, t_Int},
+ {&ny, "ny", "ny", DEF_NY, t_Int},
+ {¢re, "centre", "Centre", DEF_CENTRE, t_Bool},
+ {&maxsize, "maxsize", "Maxsize", DEF_MAXSIZE, t_Bool},
+ {&unit_cell, "cell", "Cell", DEF_CELL, t_Bool},
+ {&grid_cell, "grid", "Grid", DEF_GRID, t_Bool},
+ {&cycle_p, "shift", "Shift", DEF_CYCLE, t_Bool}
};
static OptionStruct desc[] =
{
{"-/+shift", "turn on/off colour cycling"}
};
-ModeSpecOpt crystal_opts =
+ENTRYPOINT ModeSpecOpt crystal_opts =
{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
#ifdef USE_MODULES
int ncolors;
Bool cycle_p, mono_p, no_colors;
unsigned long blackpixel, whitepixel, fg, bg;
- int direction;
+ int direction, invert;
} crystalstruct;
static crystalstruct *crystals = NULL;
static void
trans_coor_back(XPoint * xyp, XPoint * new_xyp,
- int num_points, float gamma, int offset_w, int offset_h)
+ int num_points, float gamma, int offset_w, int offset_h ,
+ int winheight , int invert )
{
int i;
offset_h;
new_xyp[i].x = xyp[i].x - (int) (xyp[i].y * sin((gamma - 90.0)
* PI_RAD)) + offset_w;
+ if ( invert ) new_xyp[i].y = winheight - new_xyp[i].y;
}
}
xy_1[k].y = xy[k].y + m * cryst->b;
}
trans_coor_back(xy_1, new_xy, atom0->num_point,
- cryst->gamma, cryst->offset_w, cryst->offset_h);
+ cryst->gamma, cryst->offset_w,
+ cryst->offset_h ,
+ cryst->win_height,
+ cryst->invert);
XFillPolygon(display, window, cryst->gc, new_xy,
atom0->num_point, Convex, CoordModeOrigin);
}
xy_1[k].y = xy[k].y + m * cryst->b;
}
trans_coor_back(xy_1, new_xy, atom0->num_point,
- cryst->gamma, cryst->offset_w, cryst->offset_h);
+ cryst->gamma,
+ cryst->offset_w,
+ cryst->offset_h ,
+ cryst->win_height ,
+ cryst->invert);
XFillPolygon(display, window, cryst->gc,
new_xy,
atom0->num_point, Convex,
xy_1[k].y = xy[k].y + m * cryst->b;
}
trans_coor_back(xy_1, new_xy, atom0->num_point,
- cryst->gamma, cryst->offset_w, cryst->offset_h);
+ cryst->gamma,
+ cryst->offset_w,
+ cryst->offset_h ,
+ cryst->win_height,
+ cryst->invert);
XFillPolygon(display, window, cryst->gc,
new_xy,
atom0->num_point, Convex,
xy_1[k].y = xy1[k].y + m * cryst->b;
}
trans_coor_back(xy_1, new_xy, atom0->num_point,
- cryst->gamma, cryst->offset_w, cryst->offset_h);
+ cryst->gamma,
+ cryst->offset_w,
+ cryst->offset_h ,
+ cryst->win_height,
+ cryst->invert);
XFillPolygon(display, window,
cryst->gc,
new_xy, atom0->num_point,
}
}
-void
+ENTRYPOINT void init_crystal(ModeInfo * mi);
+ENTRYPOINT void release_crystal(ModeInfo * mi);
+
+
+ENTRYPOINT void
draw_crystal(ModeInfo * mi)
{
Display *display = MI_DISPLAY(mi);
crystalstruct *cryst = &crystals[MI_SCREEN(mi)];
int i;
+#ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */
+ XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+#endif
+
if (cryst->no_colors) {
release_crystal(mi);
init_crystal(mi);
/* Rotate colours */
if (cryst->cycle_p) {
- rotate_colors(display, cryst->cmap, cryst->colors, cryst->ncolors,
+ rotate_colors(mi->xgwa.screen, cryst->cmap,
+ cryst->colors, cryst->ncolors,
cryst->direction);
if (!(LRAND() % 1000))
cryst->direction = -cryst->direction;
crystalatom *atom0;
atom0 = &cryst->atom[i];
- XSetForeground(display, cryst->gc, cryst->colors[atom0->colour].pixel);
+
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+ XSetForeground(display, cryst->gc, cryst->colors[atom0->colour].pixel);
+ } else {
+ XSetForeground(display, cryst->gc, atom0->colour);
+ }
crystal_drawatom(mi, atom0);
atom0->velocity[0] += NRAND(3) - 1;
atom0->velocity[0] = MAX(-20, MIN(20, atom0->velocity[0]));
XSetFunction(display, cryst->gc, GXcopy);
}
-void
+ENTRYPOINT void
refresh_crystal(ModeInfo * mi)
{
Display *display = MI_DISPLAY(mi);
XSetFunction(display, cryst->gc, GXxor);
if (cryst->unit_cell) {
+ int y_coor1 , y_coor2;
+
if (MI_NPIXELS(mi) > 2)
XSetForeground(display, cryst->gc, MI_PIXEL(mi, NRAND(MI_NPIXELS(mi))));
else
- XSetForeground(display, cryst->gc, MI_BLACK_PIXEL(mi));
+ XSetForeground(display, cryst->gc, MI_WHITE_PIXEL(mi));
if (cryst->grid_cell) {
int inx, iny;
+ if ( cryst->invert )
+ y_coor1 = y_coor2 = cryst->win_height - cryst->offset_h;
+ else
+ y_coor1 = y_coor2 = cryst->offset_h;
XDrawLine(display, window, cryst->gc, cryst->offset_w,
- cryst->offset_h, cryst->offset_w + cryst->nx * cryst->a,
- cryst->offset_h);
+ y_coor1, cryst->offset_w + cryst->nx * cryst->a,
+ y_coor2);
+ if ( cryst->invert )
+ {
+ y_coor1 = cryst->win_height - cryst->offset_h;
+ y_coor2 = cryst->win_height - (int) (cryst->ny *
+ cryst->b *
+ cos((cryst->gamma - 90) * PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 = cryst->offset_h;
+ y_coor2 = (int) (cryst->ny * cryst->b *
+ cos((cryst->gamma - 90) * PI_RAD)) +
+ cryst->offset_h;
+ }
XDrawLine(display, window, cryst->gc, cryst->offset_w,
- cryst->offset_h, (int) (cryst->offset_w - cryst->ny * cryst->b *
+ y_coor1, (int) (cryst->offset_w - cryst->ny * cryst->b *
sin((cryst->gamma - 90) * PI_RAD)),
- (int) (cryst->ny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h);
+ y_coor2);
inx = cryst->nx;
for (iny = 1; iny <= cryst->ny; iny++) {
+ if ( cryst->invert )
+ {
+ y_coor1 = cryst->win_height -
+ (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) - cryst->offset_h;
+ y_coor2 = cryst->win_height -
+ (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 = (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) + cryst->offset_h;
+ y_coor2 = (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) +
+ cryst->offset_h;
+ }
XDrawLine(display, window, cryst->gc,
(int) (cryst->offset_w +
inx * cryst->a - (int) (iny * cryst->b *
sin((cryst->gamma - 90) * PI_RAD))),
- (int) (iny * cryst->b * cos((cryst->gamma - 90) *
- PI_RAD)) + cryst->offset_h,
+ y_coor1,
(int) (cryst->offset_w - iny * cryst->b *
sin((cryst->gamma - 90) * PI_RAD)),
- (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) +
- cryst->offset_h);
+ y_coor2);
}
iny = cryst->ny;
for (inx = 1; inx <= cryst->nx; inx++) {
+ if ( cryst->invert )
+ {
+ y_coor1 =cryst->win_height -
+ (int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) - cryst->offset_h;
+ y_coor2 =cryst->win_height - cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 =(int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) + cryst->offset_h;
+ y_coor2 =cryst->offset_h;
+ }
XDrawLine(display, window, cryst->gc,
(int) (cryst->offset_w +
inx * cryst->a - (int) (iny * cryst->b *
sin((cryst->gamma - 90) * PI_RAD))),
- (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h,
- cryst->offset_w + inx * cryst->a, cryst->offset_h);
+ y_coor1,
+ cryst->offset_w + inx * cryst->a,
+ y_coor2);
}
} else {
int inx, iny;
inx = NRAND(cryst->nx);
iny = NRAND(cryst->ny);
+ if ( cryst->invert )
+ {
+ y_coor1 =cryst->win_height -
+ (int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ y_coor2 =cryst->win_height -
+ (int) ( ( iny + 1 ) * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 =(int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) +
+ cryst->offset_h;
+ y_coor2 =(int) (( iny + 1 ) * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) +
+ cryst->offset_h;
+ }
XDrawLine(display, window, cryst->gc,
cryst->offset_w + inx * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h,
+ y_coor1,
cryst->offset_w + (inx + 1) * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h);
+ y_coor1);
XDrawLine(display, window, cryst->gc,
cryst->offset_w + inx * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h,
+ y_coor1,
cryst->offset_w + inx * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- (int) ((iny + 1) * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h);
+ y_coor2);
XDrawLine(display, window, cryst->gc,
cryst->offset_w + (inx + 1) * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h,
+ y_coor1,
cryst->offset_w + (inx + 1) * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- (int) ((iny + 1) * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h);
+ y_coor2);
XDrawLine(display, window, cryst->gc,
cryst->offset_w + inx * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- (int) ((iny + 1) * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h,
+ y_coor2,
cryst->offset_w + (inx + 1) * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- (int) ((iny + 1) * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h);
+ y_coor2);
}
}
for (i = 0; i < cryst->num_atom; i++) {
crystalatom *atom0;
atom0 = &cryst->atom[i];
- XSetForeground(display, cryst->gc, cryst->colors[atom0->colour].pixel);
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+ XSetForeground(display, cryst->gc, cryst->colors[atom0->colour].pixel);
+ } else {
+ XSetForeground(display, cryst->gc, atom0->colour);
+ }
crystal_drawatom(mi, atom0);
}
XSetFunction(display, cryst->gc, GXcopy);
}
-void
+ENTRYPOINT void
release_crystal(ModeInfo * mi)
{
Display *display = MI_DISPLAY(mi);
for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
crystalstruct *cryst = &crystals[screen];
- MI_WHITE_PIXEL(mi) = cryst->whitepixel;
- MI_BLACK_PIXEL(mi) = cryst->blackpixel;
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+ MI_WHITE_PIXEL(mi) = cryst->whitepixel;
+ MI_BLACK_PIXEL(mi) = cryst->blackpixel;
#ifndef STANDALONE
- MI_FG_PIXEL(mi) = cryst->fg;
- MI_BG_PIXEL(mi) = cryst->bg;
+ MI_FG_PIXEL(mi) = cryst->fg;
+ MI_BG_PIXEL(mi) = cryst->bg;
+#endif
+ if (cryst->colors && cryst->ncolors && !cryst->no_colors)
+ free_colors(mi->xgwa.screen, cryst->cmap, cryst->colors,
+ cryst->ncolors);
+ if (cryst->colors)
+ (void) free((void *) cryst->colors);
+#if 0 /* #### wrong! -jwz */
+ XFreeColormap(display, cryst->cmap);
#endif
- if (cryst->colors && cryst->ncolors && !cryst->no_colors)
- free_colors(display, cryst->cmap, cryst->colors, cryst->ncolors);
- if (cryst->colors)
- (void) free((void *) cryst->colors);
- XFreeColormap(display, cryst->cmap);
+ }
if (cryst->gc != NULL)
XFreeGC(display, cryst->gc);
if (cryst->atom != NULL)
}
}
-void
+ENTRYPOINT void
init_crystal(ModeInfo * mi)
{
Display *display = MI_DISPLAY(mi);
cryst = &crystals[MI_SCREEN(mi)];
if (!cryst->gc) {
-#ifndef STANDALONE
- XColor color;
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+ XColor color;
- extern char *background;
- extern char *foreground;
+#ifndef STANDALONE
+ extern char *background;
+ extern char *foreground;
- cryst->fg = MI_FG_PIXEL(mi);
- cryst->bg = MI_BG_PIXEL(mi);
+ cryst->fg = MI_FG_PIXEL(mi);
+ cryst->bg = MI_BG_PIXEL(mi);
#endif
- cryst->blackpixel = MI_BLACK_PIXEL(mi);
- cryst->whitepixel = MI_WHITE_PIXEL(mi);
-
-#ifdef STANDALONE
- cryst->cmap = mi->xgwa.colormap;
-#else /* !STANDALONE */
- cryst->cmap = XCreateColormap(display, window,
- MI_VISUAL(mi), AllocNone);
- XSetWindowColormap(display, window, cryst->cmap);
-
- (void) XParseColor(display, cryst->cmap, "black", &color);
- (void) XAllocColor(display, cryst->cmap, &color);
- MI_BLACK_PIXEL(mi) = color.pixel;
- (void) XParseColor(display, cryst->cmap, "white", &color);
- (void) XAllocColor(display, cryst->cmap, &color);
- MI_WHITE_PIXEL(mi) = color.pixel;
-
- (void) XParseColor(display, cryst->cmap, background, &color);
- (void) XAllocColor(display, cryst->cmap, &color);
- MI_BG_PIXEL(mi) = color.pixel;
- (void) XParseColor(display, cryst->cmap, foreground, &color);
- (void) XAllocColor(display, cryst->cmap, &color);
- MI_FG_PIXEL(mi) = color.pixel;
-#endif /* !STANDALONE */
-
- cryst->colors = 0;
- cryst->ncolors = 0;
+ cryst->blackpixel = MI_BLACK_PIXEL(mi);
+ cryst->whitepixel = MI_WHITE_PIXEL(mi);
+#if 0 /* #### wrong! -jwz */
+ cryst->cmap = XCreateColormap(display, window,
+ MI_VISUAL(mi), AllocNone);
+ XSetWindowColormap(display, window, cryst->cmap);
+#else
+ cryst->cmap = mi->xgwa.colormap;
+#endif
+ (void) XParseColor(display, cryst->cmap, "black", &color);
+ (void) XAllocColor(display, cryst->cmap, &color);
+ MI_BLACK_PIXEL(mi) = color.pixel;
+ (void) XParseColor(display, cryst->cmap, "white", &color);
+ (void) XAllocColor(display, cryst->cmap, &color);
+ MI_WHITE_PIXEL(mi) = color.pixel;
+#ifndef STANDALONE
+ (void) XParseColor(display, cryst->cmap, background, &color);
+ (void) XAllocColor(display, cryst->cmap, &color);
+ MI_BG_PIXEL(mi) = color.pixel;
+ (void) XParseColor(display, cryst->cmap, foreground, &color);
+ (void) XAllocColor(display, cryst->cmap, &color);
+ MI_FG_PIXEL(mi) = color.pixel;
+#endif
+ cryst->colors = 0;
+ cryst->ncolors = 0;
+ }
if ((cryst->gc = XCreateGC(display, MI_WINDOW(mi),
(unsigned long) 0, (XGCValues *) NULL)) == None)
return;
cell_min = min(cryst->win_width / 2 + 1, MIN_CELL);
cell_min = min(cell_min, cryst->win_height / 2 + 1);
cryst->planegroup = NRAND(17);
+ cryst->invert = NRAND(2);
if (MI_IS_VERBOSE(mi))
(void) fprintf(stdout, "Selected plane group no %d\n",
cryst->planegroup + 1);
cryst->offset_w = (int) (cryst->b * 0.5);
}
} else {
+ int max_repeat = 10;
cryst->offset_w = -1;
- while (cryst->offset_w < 4 || (int) (cryst->offset_w - cryst->b *
- sin((cryst->gamma - 90) * PI_RAD)) < 4) {
+ while (max_repeat-- &&
+ (cryst->offset_w < 4 || (int) (cryst->offset_w - cryst->b *
+ sin((cryst->gamma - 90) * PI_RAD)) < 4)
+ ) {
cryst->b = NRAND((int) (cryst->win_height / (cos((cryst->gamma - 90) *
PI_RAD))) - cell_min) + cell_min;
if (cryst->planegroup > 8)
cryst->a = cryst->a / cryst->nx;
cryst->b = cryst->b / cryst->ny;
if (cryst->unit_cell) {
+ int y_coor1 , y_coor2;
+
if (MI_NPIXELS(mi) > 2)
XSetForeground(display, cryst->gc, MI_PIXEL(mi, NRAND(MI_NPIXELS(mi))));
else
- XSetForeground(display, cryst->gc, MI_BLACK_PIXEL(mi));
+ XSetForeground(display, cryst->gc, MI_WHITE_PIXEL(mi));
if (cryst->grid_cell) {
int inx, iny;
+ if ( cryst->invert )
+ y_coor1 = y_coor2 = cryst->win_height - cryst->offset_h;
+ else
+ y_coor1 = y_coor2 = cryst->offset_h;
XDrawLine(display, window, cryst->gc, cryst->offset_w,
- cryst->offset_h, cryst->offset_w + cryst->nx * cryst->a,
- cryst->offset_h);
+ y_coor1, cryst->offset_w + cryst->nx * cryst->a,
+ y_coor2);
+ if ( cryst->invert )
+ {
+ y_coor1 = cryst->win_height - cryst->offset_h;
+ y_coor2 = cryst->win_height - (int) (cryst->ny *
+ cryst->b *
+ cos((cryst->gamma - 90) * PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 = cryst->offset_h;
+ y_coor2 = (int) (cryst->ny * cryst->b *
+ cos((cryst->gamma - 90) * PI_RAD)) +
+ cryst->offset_h;
+ }
XDrawLine(display, window, cryst->gc, cryst->offset_w,
- cryst->offset_h, (int) (cryst->offset_w - cryst->ny * cryst->b *
+ y_coor1, (int) (cryst->offset_w - cryst->ny * cryst->b *
sin((cryst->gamma - 90) * PI_RAD)),
- (int) (cryst->ny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h);
+ y_coor2);
inx = cryst->nx;
for (iny = 1; iny <= cryst->ny; iny++) {
+ if ( cryst->invert )
+ {
+ y_coor1 = cryst->win_height -
+ (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) - cryst->offset_h;
+ y_coor2 = cryst->win_height -
+ (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 = (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+ PI_RAD)) + cryst->offset_h;
+ y_coor2 = (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) +
+ cryst->offset_h;
+ }
XDrawLine(display, window, cryst->gc,
(int) (cryst->offset_w +
inx * cryst->a - (int) (iny * cryst->b *
sin((cryst->gamma - 90) * PI_RAD))),
- (int) (iny * cryst->b * cos((cryst->gamma - 90) *
- PI_RAD)) + cryst->offset_h,
+ y_coor1,
(int) (cryst->offset_w - iny * cryst->b *
sin((cryst->gamma - 90) * PI_RAD)),
- (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) +
- cryst->offset_h);
+ y_coor2);
}
iny = cryst->ny;
for (inx = 1; inx <= cryst->nx; inx++) {
+ if ( cryst->invert )
+ {
+ y_coor1 =cryst->win_height -
+ (int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) - cryst->offset_h;
+ y_coor2 =cryst->win_height - cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 =(int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) + cryst->offset_h;
+ y_coor2 =cryst->offset_h;
+ }
XDrawLine(display, window, cryst->gc,
(int) (cryst->offset_w +
inx * cryst->a - (int) (iny * cryst->b *
sin((cryst->gamma - 90) * PI_RAD))),
- (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h,
- cryst->offset_w + inx * cryst->a, cryst->offset_h);
+ y_coor1,
+ cryst->offset_w + inx * cryst->a,
+ y_coor2);
}
} else {
int inx, iny;
inx = NRAND(cryst->nx);
iny = NRAND(cryst->ny);
+ if ( cryst->invert )
+ {
+ y_coor1 =cryst->win_height -
+ (int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ y_coor2 =cryst->win_height -
+ (int) ( ( iny + 1 ) * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) -
+ cryst->offset_h;
+ }
+ else
+ {
+ y_coor1 =(int) (iny * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) +
+ cryst->offset_h;
+ y_coor2 =(int) (( iny + 1 ) * cryst->b *
+ cos((cryst->gamma - 90) *
+ PI_RAD)) +
+ cryst->offset_h;
+ }
XDrawLine(display, window, cryst->gc,
cryst->offset_w + inx * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h,
+ y_coor1,
cryst->offset_w + (inx + 1) * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h);
+ y_coor1);
XDrawLine(display, window, cryst->gc,
cryst->offset_w + inx * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h,
+ y_coor1,
cryst->offset_w + inx * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- (int) ((iny + 1) * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h);
+ y_coor2);
XDrawLine(display, window, cryst->gc,
cryst->offset_w + (inx + 1) * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h,
+ y_coor1,
cryst->offset_w + (inx + 1) * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- (int) ((iny + 1) * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h);
+ y_coor2);
XDrawLine(display, window, cryst->gc,
cryst->offset_w + inx * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- (int) ((iny + 1) * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h,
+ y_coor2,
cryst->offset_w + (inx + 1) * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
- (int) ((iny + 1) * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) + cryst->offset_h);
+ y_coor2);
}
}
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
/* Set up colour map */
- if (cryst->colors && cryst->ncolors && !cryst->no_colors)
- free_colors(display, cryst->cmap, cryst->colors, cryst->ncolors);
- if (cryst->colors)
- (void) free((void *) cryst->colors);
- cryst->colors = 0;
-#ifdef STANDALONE
- cryst->ncolors = get_integer_resource("ncolors", "Integer");
-#else
- cryst->ncolors = MI_NCOLORS(mi);
-#endif
- if (cryst->ncolors < 2)
- cryst->ncolors = 2;
- if (cryst->ncolors <= 2)
- cryst->mono_p = True;
- else
- cryst->mono_p = False;
-
- if (cryst->mono_p)
+ if (cryst->colors && cryst->ncolors && !cryst->no_colors)
+ free_colors(mi->xgwa.screen, cryst->cmap,
+ cryst->colors, cryst->ncolors);
+ if (cryst->colors)
+ (void) free((void *) cryst->colors);
cryst->colors = 0;
- else
- cryst->colors = (XColor *) malloc(sizeof (*cryst->colors) * (cryst->ncolors + 1));
-#ifdef STANDALONE
- cryst->cycle_p = has_writable_cells(mi->xgwa.screen, mi->xgwa.visual);
-#else
- cryst->cycle_p = has_writable_cells(mi);
-#endif
- if (cryst->cycle_p) {
- if (MI_IS_FULLRANDOM(mi)) {
- if (NRAND(8) == 7)
- cryst->cycle_p = False;
+ cryst->ncolors = MI_NCOLORS(mi);
+ if (cryst->ncolors < 2)
+ cryst->ncolors = 2;
+ if (cryst->ncolors <= 2)
+ cryst->mono_p = True;
+ else
+ cryst->mono_p = False;
+
+ if (cryst->mono_p)
+ cryst->colors = 0;
+ else
+ cryst->colors = (XColor *) malloc(sizeof (*cryst->colors) * (cryst->ncolors + 1));
+ cryst->cycle_p = has_writable_cells(mi->xgwa.screen, MI_VISUAL(mi));
+ if (cryst->cycle_p) {
+ if (MI_IS_FULLRANDOM(mi)) {
+ if (!NRAND(8))
+ cryst->cycle_p = False;
+ else
+ cryst->cycle_p = True;
+ } else {
+ cryst->cycle_p = cycle_p;
+ }
+ }
+ if (!cryst->mono_p) {
+ if (!(LRAND() % 10))
+ make_random_colormap(mi->xgwa.screen, MI_VISUAL(mi),
+ cryst->cmap, cryst->colors,
+ &cryst->ncolors,
+ True, True, &cryst->cycle_p, True);
+ else if (!(LRAND() % 2))
+ make_uniform_colormap(mi->xgwa.screen, MI_VISUAL(mi),
+ cryst->cmap, cryst->colors,
+ &cryst->ncolors, True,
+ &cryst->cycle_p, True);
else
- cryst->cycle_p = True;
- } else {
- cryst->cycle_p = cycle_p;
+ make_smooth_colormap(mi->xgwa.screen, MI_VISUAL(mi),
+ cryst->cmap, cryst->colors,
+ &cryst->ncolors,
+ True, &cryst->cycle_p, True);
}
- }
- if (!cryst->mono_p) {
- if (!(LRAND() % 10))
- make_random_colormap(
-#ifdef STANDALONE
- mi->dpy, mi->xgwa.visual,
-#else
- mi,
+#if 0 /* #### wrong! -jwz */
+ XInstallColormap(display, cryst->cmap);
#endif
- cryst->cmap, cryst->colors, &cryst->ncolors,
- True, True, &cryst->cycle_p
-#ifdef STANDALONE
- , False
-#endif
- );
- else if (!(LRAND() % 2))
- make_uniform_colormap(
-#ifdef STANDALONE
- mi->dpy, mi->xgwa.visual,
-#else
- mi,
-#endif
- cryst->cmap, cryst->colors, &cryst->ncolors,
- True, &cryst->cycle_p
-#ifdef STANDALONE
- , False
-#endif
- );
- else
- make_smooth_colormap(
-#ifdef STANDALONE
- mi->dpy, mi->xgwa.visual,
-#else
- mi,
-#endif
- cryst->cmap, cryst->colors, &cryst->ncolors,
- True, &cryst->cycle_p
-#ifdef STANDALONE
- , False
-#endif
- );
- }
- XInstallColormap(display, cryst->cmap);
- if (cryst->ncolors < 2) {
- cryst->ncolors = 2;
- cryst->no_colors = True;
- } else
- cryst->no_colors = False;
- if (cryst->ncolors <= 2)
- cryst->mono_p = True;
+ if (cryst->ncolors < 2) {
+ cryst->ncolors = 2;
+ cryst->no_colors = True;
+ } else
+ cryst->no_colors = False;
+ if (cryst->ncolors <= 2)
+ cryst->mono_p = True;
- if (cryst->mono_p)
- cryst->cycle_p = False;
+ if (cryst->mono_p)
+ cryst->cycle_p = False;
+ }
for (i = 0; i < cryst->num_atom; i++) {
crystalatom *atom0;
atom0 = &cryst->atom[i];
- if (cryst->ncolors > 2)
- atom0->colour = NRAND(cryst->ncolors - 2) + 2;
- else
- atom0->colour = 1; /*Xor'red so WHITE may not be appropriate */
- XSetForeground(display, cryst->gc, cryst->colors[atom0->colour].pixel);
+ if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+ if (cryst->ncolors > 2)
+ atom0->colour = NRAND(cryst->ncolors - 2) + 2;
+ else
+ atom0->colour = 1; /* Just in case */
+ XSetForeground(display, cryst->gc, cryst->colors[atom0->colour].pixel);
+ } else {
+ if (MI_NPIXELS(mi) > 2)
+ atom0->colour = MI_PIXEL(mi, NRAND(MI_NPIXELS(mi)));
+ else
+ atom0->colour = 1; /*Xor'red so WHITE may not be appropriate */
+ XSetForeground(display, cryst->gc, atom0->colour);
+ }
atom0->x0 = NRAND(cryst->a);
atom0->y0 = NRAND(cryst->b);
atom0->velocity[0] = NRAND(7) - 3;
crystal_setupatom(atom0, cryst->gamma);
crystal_drawatom(mi, atom0);
}
- XSync(display, False);
XSetFunction(display, cryst->gc, GXcopy);
}
+
+ENTRYPOINT void
+reshape_crystal(ModeInfo * mi, int width, int height)
+{
+ release_crystal(mi);
+ init_crystal(mi);
+}
+
+ENTRYPOINT Bool
+crystal_handle_event (ModeInfo *mi, XEvent *event)
+{
+ if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+ {
+ reshape_crystal (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ return True;
+ }
+ return False;
+}
+
+XSCREENSAVER_MODULE ("Crystal", crystal)