Mercurial > hg > xemacs-beta
view pkg-src/tree-x/dissolve.c @ 163:0132846995bd r20-3b8
Import from CVS: tag r20-3b8
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:43:35 +0200 |
parents | |
children | 85ec50267440 |
line wrap: on
line source
/* ---------------------------------------------------------------------------- * 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); } }