diff lisp/oobr/tree-x/dissolve.c @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/oobr/tree-x/dissolve.c	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,245 @@
+/* ----------------------------------------------------------------------------
+ * 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);
+   }
+}
+