Mercurial > hg > xemacs-beta
comparison 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 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:376386a54a3c |
---|---|
1 /* ---------------------------------------------------------------------------- | |
2 * Animated display of collapse and expansion of nodes in a tree. | |
3 * ---------------------------------------------------------------------------- | |
4 */ | |
5 | |
6 #include <X11/Xlib.h> | |
7 | |
8 #include "dissolve.h" | |
9 | |
10 static Pixmap DissolvePixmaps[NUM_DISSOLVE_STEPS]; | |
11 static GC DissolveInGC; | |
12 static GC DissolveOutGC; | |
13 static GC DissolveInLineGC[NUM_LINE_STEPS]; | |
14 static GC DissolveOutLineGC[NUM_LINE_STEPS]; | |
15 | |
16 static unsigned char first_dash[] = {1, 3}; | |
17 static unsigned char second_dash[] = {1, 1}; | |
18 | |
19 InitializeDissolveEffect(dpy, drawable, fg_pixel, bg_pixel) | |
20 Display *dpy; | |
21 Drawable drawable; | |
22 int fg_pixel; | |
23 int bg_pixel; | |
24 { | |
25 unsigned long gcvaluemask; | |
26 XGCValues gcvalues; | |
27 int i; | |
28 | |
29 /* make DissolveOutGC */ | |
30 gcvalues.background = bg_pixel; | |
31 gcvalues.foreground = bg_pixel; | |
32 gcvalues.function = GXcopy; | |
33 gcvalues.fill_style = FillStippled; | |
34 gcvalues.line_width = 0; | |
35 gcvaluemask = GCFunction | GCForeground | GCBackground | GCFillStyle | | |
36 GCLineWidth; | |
37 DissolveOutGC = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues); | |
38 XSetTSOrigin(dpy, DissolveOutGC, 0, 0); | |
39 | |
40 /* make DissolveInGC */ | |
41 gcvalues.foreground = fg_pixel; | |
42 DissolveInGC = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues); | |
43 XSetTSOrigin(dpy, DissolveInGC, 0, 0); | |
44 | |
45 /* make DissolveOutLineGC */ | |
46 i = 0; | |
47 gcvalues.foreground = bg_pixel; | |
48 gcvalues.fill_style = FillSolid; | |
49 gcvalues.line_style = LineOnOffDash; | |
50 gcvalues.line_width = 0; | |
51 gcvaluemask = GCFunction | GCForeground | GCBackground | | |
52 GCFillStyle | GCLineStyle | GCLineWidth ; | |
53 DissolveOutLineGC[i] = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues); | |
54 XSetDashes(dpy, DissolveOutLineGC[i], 0, first_dash, 2); | |
55 i++; | |
56 DissolveOutLineGC[i] = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues); | |
57 XSetDashes(dpy, DissolveOutLineGC[i], 0, second_dash, 2); | |
58 i++; | |
59 DissolveOutLineGC[i] = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues); | |
60 XSetDashes(dpy, DissolveOutLineGC[i], 3, first_dash, 2); | |
61 i++; | |
62 gcvalues.line_style = LineSolid; | |
63 DissolveOutLineGC[i] = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues); | |
64 | |
65 /* make DissolveInLineGC */ | |
66 i = 0; | |
67 gcvalues.foreground = fg_pixel; | |
68 gcvalues.fill_style = FillSolid; | |
69 gcvalues.line_style = LineOnOffDash; | |
70 gcvalues.line_width = 0; | |
71 gcvaluemask = GCFunction | GCForeground | GCBackground | | |
72 GCFillStyle | GCLineStyle | GCLineWidth; | |
73 DissolveInLineGC[i] = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues); | |
74 XSetDashes(dpy, DissolveInLineGC[i], 0, first_dash, 2); | |
75 i++; | |
76 DissolveInLineGC[i] = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues); | |
77 XSetDashes(dpy, DissolveInLineGC[i], 0, second_dash, 2); | |
78 i++; | |
79 DissolveInLineGC[i] = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues); | |
80 XSetDashes(dpy, DissolveInLineGC[i], 3, first_dash, 2); | |
81 i++; | |
82 gcvalues.line_style = LineSolid; | |
83 DissolveInLineGC[i] = XCreateGC(dpy, drawable, gcvaluemask, &gcvalues); | |
84 | |
85 i = 0; | |
86 DissolvePixmaps[i] = XCreateBitmapFromData(dpy, drawable, | |
87 first_bits, | |
88 first_width, | |
89 first_height); | |
90 i++; | |
91 DissolvePixmaps[i] = XCreateBitmapFromData(dpy, drawable, | |
92 second_bits, | |
93 second_width, | |
94 second_height); | |
95 i++; | |
96 DissolvePixmaps[i] = XCreateBitmapFromData(dpy, drawable, | |
97 third_bits, | |
98 third_width, | |
99 third_height); | |
100 i++; | |
101 DissolvePixmaps[i] = XCreateBitmapFromData(dpy, drawable, | |
102 fourth_bits, | |
103 fourth_width, | |
104 fourth_height); | |
105 i++; | |
106 DissolvePixmaps[i] = XCreateBitmapFromData(dpy, drawable, | |
107 fifth_bits, | |
108 fifth_width, | |
109 fifth_height); | |
110 i++; | |
111 DissolvePixmaps[i] = XCreateBitmapFromData(dpy, drawable, | |
112 sixth_bits, | |
113 sixth_width, | |
114 sixth_height); | |
115 i++; | |
116 DissolvePixmaps[i] = XCreateBitmapFromData(dpy, drawable, | |
117 seventh_bits, | |
118 seventh_width, | |
119 seventh_height); | |
120 i++; | |
121 DissolvePixmaps[i] = XCreateBitmapFromData(dpy, drawable, | |
122 eighth_bits, | |
123 eighth_width, | |
124 eighth_height); | |
125 } | |
126 | |
127 DissolveRectangle(dpy, drawable, x, y, width, height, mode) | |
128 Display *dpy; | |
129 Window drawable; | |
130 int x, y, width, height; | |
131 int mode; | |
132 { | |
133 int i; | |
134 GC gc; | |
135 | |
136 gc = mode ? DissolveOutGC : DissolveInGC; | |
137 | |
138 for (i = 0 ; i < NUM_DISSOLVE_STEPS ; i++) { | |
139 XSetStipple(dpy, gc, DissolvePixmaps[i]); | |
140 if (mode) | |
141 XFillRectangle(dpy, drawable, gc, x, y, width, height); | |
142 else | |
143 XDrawRectangle(dpy, drawable, gc, x, y, width, height); | |
144 XFlush(dpy); | |
145 usleep(50000); | |
146 } | |
147 } | |
148 | |
149 DissolveRectangles(dpy, drawable, rectangles, nrectangles, mode) | |
150 Display *dpy; | |
151 Window drawable; | |
152 XRectangle rectangles[]; | |
153 int nrectangles; | |
154 int mode; | |
155 { | |
156 int i; | |
157 GC gc; | |
158 | |
159 gc = mode ? DissolveOutGC : DissolveInGC; | |
160 | |
161 for (i = 0 ; i < NUM_DISSOLVE_STEPS ; i++) { | |
162 XSetStipple(dpy, gc, DissolvePixmaps[i]); | |
163 if (mode) | |
164 XFillRectangles(dpy, drawable, gc, rectangles, nrectangles); | |
165 else | |
166 XDrawRectangles(dpy, drawable, gc, rectangles, nrectangles); | |
167 XFlush(dpy); | |
168 usleep(50000); | |
169 } | |
170 } | |
171 | |
172 DissolveSegments(dpy, drawable, segments, nsegments, mode) | |
173 Display *dpy; | |
174 Window drawable; | |
175 XSegment segments[]; | |
176 int nsegments; | |
177 int mode; | |
178 { | |
179 int i; | |
180 GC *gc; | |
181 | |
182 gc = mode ? DissolveOutLineGC : DissolveInLineGC; | |
183 | |
184 for (i = 0 ; i < NUM_LINE_STEPS ; i++) { | |
185 XDrawSegments(dpy, drawable, gc[i], segments, nsegments); | |
186 XFlush(dpy); | |
187 usleep(50000); | |
188 } | |
189 } | |
190 | |
191 DissolveTree(dpy, drawable, rectangles, nrectangles, segments, nsegments, mode) | |
192 Display *dpy; | |
193 Window drawable; | |
194 XRectangle rectangles[]; | |
195 int nrectangles; | |
196 XSegment segments[]; | |
197 int nsegments; | |
198 int mode; | |
199 { | |
200 int i; | |
201 int j = 0; | |
202 int idle; | |
203 GC gc; | |
204 GC *lineGC; | |
205 | |
206 gc = mode ? DissolveOutGC : DissolveInGC; | |
207 lineGC = mode ? DissolveOutLineGC : DissolveInLineGC; | |
208 | |
209 /* speed up if there are lots of nodes */ | |
210 idle = nrectangles > 50 ? 0 : 25000; | |
211 | |
212 for (i = 0 ; i < NUM_DISSOLVE_STEPS ; i++) { | |
213 XSetStipple(dpy, gc, DissolvePixmaps[i]); | |
214 if (mode) | |
215 XFillRectangles(dpy, drawable, gc, rectangles, nrectangles); | |
216 else | |
217 XDrawRectangles(dpy, drawable, gc, rectangles, nrectangles); | |
218 if (i % 2) | |
219 XDrawSegments(dpy, drawable, lineGC[j++], segments, nsegments); | |
220 XFlush(dpy); | |
221 usleep(idle); | |
222 } | |
223 } | |
224 | |
225 DissolvePolygon(dpy, drawable, pts, num_pts, mode) | |
226 Display *dpy; | |
227 Window drawable; | |
228 XPoint *pts; | |
229 int num_pts; | |
230 int mode; | |
231 { | |
232 int i; | |
233 GC gc; | |
234 | |
235 gc = mode ? DissolveOutGC : DissolveInGC; | |
236 | |
237 for (i = 0 ; i < NUM_DISSOLVE_STEPS ; i++) { | |
238 XSetStipple(dpy, gc, DissolvePixmaps[i]); | |
239 XFillPolygon(dpy, drawable, gc, pts, num_pts, | |
240 Nonconvex, CoordModeOrigin); | |
241 XFlush(dpy); | |
242 usleep(50000); | |
243 } | |
244 } | |
245 |