This is dissolve.c in view mode; [Download] [Up]
/* ----------------------------------------------------------------------------
* Animated display of collapse and expansion of nodes in a tree.
* ----------------------------------------------------------------------------
*/
#include <X11/Xlib.h>
#include "dissolve.h"
static Pixmap DissolvePixmaps[NUM_DISSOLVE_STEPS];
static GC DissolveInGC;
static GC DissolveOutGC;
static GC DissolveInLineGC[NUM_LINE_STEPS];
static GC DissolveOutLineGC[NUM_LINE_STEPS];
static unsigned char first_dash[] = {1, 3};
static unsigned char second_dash[] = {1, 1};
InitializeDissolveEffect(dpy, drawable, fg_pixel, bg_pixel)
Display *dpy;
Drawable drawable;
int fg_pixel;
int bg_pixel;
{
unsigned long gcvaluemask;
XGCValues gcvalues;
int i;
/* make DissolveOutGC */
gcvalues.background = bg_pixel;
gcvalues.foreground = bg_pixel;
gcvalues.function = GXcopy;
gcvalues.fill_style = FillStippled;
gcvalues.line_width = 0;
gcvaluemask = GCFunction | GCForeground | GCBackground | GCFillStyle |
GCLineWidth;
DissolveOutGC = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues);
XSetTSOrigin(dpy, DissolveOutGC, 0, 0);
/* make DissolveInGC */
gcvalues.foreground = fg_pixel;
DissolveInGC = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues);
XSetTSOrigin(dpy, DissolveInGC, 0, 0);
/* make DissolveOutLineGC */
i = 0;
gcvalues.foreground = bg_pixel;
gcvalues.fill_style = FillSolid;
gcvalues.line_style = LineOnOffDash;
gcvalues.line_width = 0;
gcvaluemask = GCFunction | GCForeground | GCBackground |
GCFillStyle | GCLineStyle | GCLineWidth ;
DissolveOutLineGC[i] = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues);
XSetDashes(dpy, DissolveOutLineGC[i], 0, first_dash, 2);
i++;
DissolveOutLineGC[i] = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues);
XSetDashes(dpy, DissolveOutLineGC[i], 0, second_dash, 2);
i++;
DissolveOutLineGC[i] = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues);
XSetDashes(dpy, DissolveOutLineGC[i], 3, first_dash, 2);
i++;
gcvalues.line_style = LineSolid;
DissolveOutLineGC[i] = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues);
/* make DissolveInLineGC */
i = 0;
gcvalues.foreground = fg_pixel;
gcvalues.fill_style = FillSolid;
gcvalues.line_style = LineOnOffDash;
gcvalues.line_width = 0;
gcvaluemask = GCFunction | GCForeground | GCBackground |
GCFillStyle | GCLineStyle | GCLineWidth;
DissolveInLineGC[i] = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues);
XSetDashes(dpy, DissolveInLineGC[i], 0, first_dash, 2);
i++;
DissolveInLineGC[i] = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues);
XSetDashes(dpy, DissolveInLineGC[i], 0, second_dash, 2);
i++;
DissolveInLineGC[i] = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues);
XSetDashes(dpy, DissolveInLineGC[i], 3, first_dash, 2);
i++;
gcvalues.line_style = LineSolid;
DissolveInLineGC[i] = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues);
i = 0;
DissolvePixmaps[i] = XCreateBitmapFromData(dpy, drawable,
first_bits,
first_width,
first_height);
i++;
DissolvePixmaps[i] = XCreateBitmapFromData(dpy, drawable,
second_bits,
second_width,
second_height);
i++;
DissolvePixmaps[i] = XCreateBitmapFromData(dpy, drawable,
third_bits,
third_width,
third_height);
i++;
DissolvePixmaps[i] = XCreateBitmapFromData(dpy, drawable,
fourth_bits,
fourth_width,
fourth_height);
i++;
DissolvePixmaps[i] = XCreateBitmapFromData(dpy, drawable,
fifth_bits,
fifth_width,
fifth_height);
i++;
DissolvePixmaps[i] = XCreateBitmapFromData(dpy, drawable,
sixth_bits,
sixth_width,
sixth_height);
i++;
DissolvePixmaps[i] = XCreateBitmapFromData(dpy, drawable,
seventh_bits,
seventh_width,
seventh_height);
i++;
DissolvePixmaps[i] = XCreateBitmapFromData(dpy, drawable,
eighth_bits,
eighth_width,
eighth_height);
}
DissolveRectangle(dpy, drawable, x, y, width, height, mode)
Display *dpy;
Window drawable;
int x, y, width, height;
int mode;
{
int i;
GC gc;
gc = mode ? DissolveOutGC : DissolveInGC;
for (i = 0 ; i < NUM_DISSOLVE_STEPS ; i++) {
XSetStipple(dpy, gc, DissolvePixmaps[i]);
if (mode)
XFillRectangle(dpy, drawable, gc, x, y, width, height);
else
XDrawRectangle(dpy, drawable, gc, x, y, width, height);
XFlush(dpy);
usleep(50000);
}
}
DissolveRectangles(dpy, drawable, rectangles, nrectangles, mode)
Display *dpy;
Window drawable;
XRectangle rectangles[];
int nrectangles;
int mode;
{
int i;
GC gc;
gc = mode ? DissolveOutGC : DissolveInGC;
for (i = 0 ; i < NUM_DISSOLVE_STEPS ; i++) {
XSetStipple(dpy, gc, DissolvePixmaps[i]);
if (mode)
XFillRectangles(dpy, drawable, gc, rectangles, nrectangles);
else
XDrawRectangles(dpy, drawable, gc, rectangles, nrectangles);
XFlush(dpy);
usleep(50000);
}
}
DissolveSegments(dpy, drawable, segments, nsegments, mode)
Display *dpy;
Window drawable;
XSegment segments[];
int nsegments;
int mode;
{
int i;
GC *gc;
gc = mode ? DissolveOutLineGC : DissolveInLineGC;
for (i = 0 ; i < NUM_LINE_STEPS ; i++) {
XDrawSegments(dpy, drawable, gc[i], segments, nsegments);
XFlush(dpy);
usleep(50000);
}
}
DissolveTree(dpy, drawable, rectangles, nrectangles, segments, nsegments, mode)
Display *dpy;
Window drawable;
XRectangle rectangles[];
int nrectangles;
XSegment segments[];
int nsegments;
int mode;
{
int i;
int j = 0;
int idle;
GC gc;
GC *lineGC;
gc = mode ? DissolveOutGC : DissolveInGC;
lineGC = mode ? DissolveOutLineGC : DissolveInLineGC;
/* speed up if there are lots of nodes */
idle = nrectangles > 50 ? 0 : 25000;
for (i = 0 ; i < NUM_DISSOLVE_STEPS ; i++) {
XSetStipple(dpy, gc, DissolvePixmaps[i]);
if (mode)
XFillRectangles(dpy, drawable, gc, rectangles, nrectangles);
else
XDrawRectangles(dpy, drawable, gc, rectangles, nrectangles);
if (i % 2)
XDrawSegments(dpy, drawable, lineGC[j++], segments, nsegments);
XFlush(dpy);
usleep(idle);
}
}
DissolvePolygon(dpy, drawable, pts, num_pts, mode)
Display *dpy;
Window drawable;
XPoint *pts;
int num_pts;
int mode;
{
int i;
GC gc;
gc = mode ? DissolveOutGC : DissolveInGC;
for (i = 0 ; i < NUM_DISSOLVE_STEPS ; i++) {
XSetStipple(dpy, gc, DissolvePixmaps[i]);
XFillPolygon(dpy, drawable, gc, pts, num_pts,
Nonconvex, CoordModeOrigin);
XFlush(dpy);
usleep(50000);
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.