1  /***********************************************************************
2    contour_panel.c
3
4    begun 25 November 1992, Jim Wen
5   ***********************************************************************/
6
7#include "header.h"
8#include "cpanel.h"
9#include "draw.h"
10#include "../include/purty/volume.bitmap"
11#include "../include/purty/volume.mask"
12#include "../include/purty/slicer.bitmap"
13
14#define use_fat
15
16#define gStuff_NOT
17
18#define contourWinDEBUG
19#define drawDEBUG
20#define contourDEBUG
21
22#define stickColor moColor(orange2, pastel)
23
24  /*=====================================================================*
25    Static Variables
26   *=====================================================================*/
27XImage slicer_image_stuff, *slicer_image = &slicer_image_stuff;
28int last_tip_long_x, last_tip_long_y;
29int last_tip_lat_x, last_tip_lat_y;
30
31  /*=====================================================================*
32    Local Functions
33   *=====================================================================*/
34int initContourButtons(void);
35
36  /*---------------------------------------------------------------------*
37    makeContourPanel()
38   *---------------------------------------------------------------------*/
39int
40makeContourPanel(void)
41{
42
43  int i;
44  XSetWindowAttributes cwAttrib, controlAttrib;
45  XSizeHints sizehint;
46  Pixmap contourbits, contourmask, slicer_pixmap;
47  XColor foreColor, backColor;
48
49  contourbits = XCreateBitmapFromData(dsply,rtWindow,volumeBitmap_bits,
50                                     volumeBitmap_width,volumeBitmap_height);
51  contourmask = XCreateBitmapFromData(dsply,rtWindow,volumeMask_bits,
52                                     volumeMask_width,volumeMask_height);
53  cwAttrib.background_pixel = backgroundColor;
54  cwAttrib.border_pixel = foregroundColor;
55  cwAttrib.event_mask = contourMASK;
56  cwAttrib.colormap = colorMap;
57  cwAttrib.override_redirect = overrideManager;
58  foreColor.pixel = contourCursorForeground;
59  XQueryColor(dsply,colorMap,&foreColor);
60  backColor.pixel = contourCursorBackground;
61  XQueryColor(dsply,colorMap,&backColor);
62  cwAttrib.cursor = XCreatePixmapCursor(dsply,contourbits,contourmask,
63                                        &foreColor,&backColor,
64                                        volumeBitmap_x_hot,
65                                        volumeBitmap_y_hot);
66
67#define slicer_pixmap_FG moColor(yellow1,normal)
68#define slicer_pixmap_BG backgroundColor
69  slicer_pixmap = XCreatePixmapFromBitmapData(dsply, control->controlWindow,
70                                              slicer_bits, slicer_width, slicer_height,
71                                              slicer_pixmap_FG, slicer_pixmap_BG,
72                                              DefaultDepthOfScreen
73                                              (DefaultScreenOfDisplay(dsply)));
74  slicer_image = XGetImage(dsply, slicer_pixmap, 0, 0, slicer_width, slicer_height,
75                          AllPlanes, ZPixmap);
76
77
78  contourWindow = XCreateWindow(dsply,control->controlWindow,
79                               -3,-3,controlWidth,controlHeight,3,
80                               CopyFromParent,InputOutput,CopyFromParent,
81                               controlCreateMASK,&cwAttrib);
82
83  sizehint.flags  = USPosition | USSize;
84  sizehint.x      = 0;
85  sizehint.y      = 0;
86  sizehint.width  = controlWidth;
87  sizehint.height = controlHeight;
88          /*** the None stands for icon pixmap ***/
89  XSetNormalHints(dsply,contourWindow,&sizehint);
90  XSetStandardProperties(dsply,contourWindow,"Control Panel 3D",
91                         "Contour Slicing",None,NULL,0,&sizehint);
92
93      /*** volume frustrum window ***/
94
95    /*** do contour buttons ***/
96  initContourButtons(control->buttonQueue);
97  for (i=contourButtonsStart; i<(contourButtonsEnd); i++) {
98    controlAttrib.event_mask = (control->buttonQueue[i]).mask;
99    (control->buttonQueue[i]).self =
100                XCreateWindow(dsply,contourWindow,
101                              (control->buttonQueue[i]).buttonX,
102                              (control->buttonQueue[i]).buttonY,
103                              (control->buttonQueue[i]).buttonWidth,
104                              (control->buttonQueue[i]).buttonHeight,
105                              0,0,InputOnly,CopyFromParent,
106                              buttonCreateMASK,&controlAttrib);
107    XMakeAssoc(dsply,table,(control->buttonQueue[i]).self,
108               &((control->buttonQueue[i]).buttonKey));
109    XMapWindow(dsply,(control->buttonQueue[i]).self);
110  }
111
112}  /* makeContourPanel() */
113
114
115int
116initContourButtons(buttonStruct * contourButtons)
117{
118
119  int ii, num = 0;
120
121  ii = contourReturn;
122  contourButtons[ii].buttonX      = 154;
123  contourButtons[ii].buttonY      = 370;
124  contourButtons[ii].buttonWidth  = 110;
125  contourButtons[ii].buttonHeight = 24;
126  contourButtons[ii].buttonKey    = ii;
127  contourButtons[ii].pot          = no;
128  contourButtons[ii].mask         = buttonMASK;
129  contourButtons[ii].text         = "Return";
130  contourButtons[ii].textColor    = return_FG;
131  contourButtons[ii].xHalf        = contourButtons[ii].buttonWidth/2;
132  contourButtons[ii].yHalf        = contourButtons[ii].buttonHeight/2;
133  ++num;
134
135  ii = contourXY;
136  contourButtons[ii].buttonX      = contourPlaneXY_X;
137  contourButtons[ii].buttonY      = contourPlaneXY_Y;
138  contourButtons[ii].buttonWidth  = contourLittleButt_W;
139  contourButtons[ii].buttonHeight = contourLittleButt_H;
140  contourButtons[ii].buttonKey    = ii;
141  contourButtons[ii].pot          = no;
142  contourButtons[ii].mask         = buttonMASK;
143  contourButtons[ii].text         = "XY";
144  contourButtons[ii].textColor    = littleButt_FG;
145  contourButtons[ii].xHalf        = contourButtons[ii].buttonWidth/2;
146  contourButtons[ii].yHalf        = contourButtons[ii].buttonHeight/2;
147  ++num;
148
149  ii = contourXZ;
150  contourButtons[ii].buttonX      = contourPlaneXZ_X;
151  contourButtons[ii].buttonY      = contourPlaneXZ_Y;
152  contourButtons[ii].buttonWidth  = contourLittleButt_W;
153  contourButtons[ii].buttonHeight = contourLittleButt_H;
154  contourButtons[ii].buttonKey    = ii;
155  contourButtons[ii].pot          = no;
156  contourButtons[ii].mask         = buttonMASK;
157  contourButtons[ii].text         = "XZ";
158  contourButtons[ii].textColor    = littleButt_FG;
159  contourButtons[ii].xHalf        = contourButtons[ii].buttonWidth/2;
160  contourButtons[ii].yHalf        = contourButtons[ii].buttonHeight/2;
161  ++num;
162
163  ii = contourYZ;
164  contourButtons[ii].buttonX      = contourPlaneYZ_X;
165  contourButtons[ii].buttonY      = contourPlaneYZ_Y;
166  contourButtons[ii].buttonWidth  = contourLittleButt_W;
167  contourButtons[ii].buttonHeight = contourLittleButt_H;
168  contourButtons[ii].buttonKey    = ii;
169  contourButtons[ii].pot          = no;
170  contourButtons[ii].mask         = buttonMASK;
171  contourButtons[ii].text         = "YZ";
172  contourButtons[ii].textColor    = littleButt_FG;
173  contourButtons[ii].xHalf        = contourButtons[ii].buttonWidth/2;
174  contourButtons[ii].yHalf        = contourButtons[ii].buttonHeight/2;
175  ++num;
176
177  ii = contourFlatView;
178  contourButtons[ii].buttonX      = contourFlatView_X;
179  contourButtons[ii].buttonY      = contourFlatView_Y;
180  contourButtons[ii].buttonWidth  = contourBigButt_W;
181  contourButtons[ii].buttonHeight = contourBigButt_H;
182  contourButtons[ii].buttonKey    = ii;
183  contourButtons[ii].pot          = no;
184  contourButtons[ii].mask         = potMASK;
185  contourButtons[ii].text         = "Flat View Upon Return";
186  contourButtons[ii].textColor    = bigButt_FG;
187  contourButtons[ii].xHalf        = contourButtons[ii].buttonWidth/2;
188  contourButtons[ii].yHalf        = contourButtons[ii].buttonHeight/2;
189  ++num;
190
191  ii = contourAppendSegs;
192  contourButtons[ii].buttonX      = contourAppendSegs_X;
193  contourButtons[ii].buttonY      = contourAppendSegs_Y;
194  contourButtons[ii].buttonWidth  = contourBigButt_W;
195  contourButtons[ii].buttonHeight = contourBigButt_H;
196  contourButtons[ii].buttonKey    = ii;
197  contourButtons[ii].pot          = no;
198  contourButtons[ii].mask         = potMASK;
199  contourButtons[ii].text         = "Append Contours";
200  contourButtons[ii].textColor    = bigButt_FG;
201  contourButtons[ii].xHalf        = contourButtons[ii].buttonWidth/2;
202  contourButtons[ii].yHalf        = contourButtons[ii].buttonHeight/2;
203  ++num;
204
205  ii = contourLongitude;
206  contourButtons[ii].buttonX      = contourLongitude_X;
207  contourButtons[ii].buttonY      = contourLongitude_Y;
208  contourButtons[ii].buttonWidth  = contourLongitude_W;
209  contourButtons[ii].buttonHeight = contourLongitude_H;
210  contourButtons[ii].buttonKey    = ii;
211  contourButtons[ii].pot          = yes;
212  contourButtons[ii].mask         = potMASK;
213  contourButtons[ii].text         = "XZ";
214  contourButtons[ii].textColor    = long_FG;
215  contourButtons[ii].xHalf        = contourButtons[ii].buttonWidth/2;
216  contourButtons[ii].yHalf        = contourButtons[ii].buttonHeight/2;
217  ++num;
218
219  ii = contourLatitude;
220  contourButtons[ii].buttonX      = contourLatitude_X;
221  contourButtons[ii].buttonY      = contourLatitude_Y;
222  contourButtons[ii].buttonWidth  = contourLatitude_W;
223  contourButtons[ii].buttonHeight = contourLatitude_H;
224  contourButtons[ii].buttonKey    = ii;
225  contourButtons[ii].pot          = yes;
226  contourButtons[ii].mask         = potMASK;
227  contourButtons[ii].text         = "XZ";
228  contourButtons[ii].textColor    = lat_FG;
229  contourButtons[ii].xHalf        = contourButtons[ii].buttonWidth/2;
230  contourButtons[ii].yHalf        = contourButtons[ii].buttonHeight/2;
231  ++num;
232
233  ii = contourSliceNum;
234  contourButtons[ii].buttonX      = contourSliceNum_X;
235  contourButtons[ii].buttonY      = contourSliceNum_Y;
236  contourButtons[ii].buttonWidth  = contourSliceNum_W;
237  contourButtons[ii].buttonHeight = contourSliceNum_H;
238  contourButtons[ii].buttonKey    = ii;
239  contourButtons[ii].pot          = yes;
240  contourButtons[ii].mask         = potMASK;
241  contourButtons[ii].text         = "XZ";
242  contourButtons[ii].textColor    = slice_FG;
243  contourButtons[ii].xHalf        = contourButtons[ii].buttonWidth/2;
244  contourButtons[ii].yHalf        = contourButtons[ii].buttonHeight/2;
245  ++num;
246
247  ii = contourAbort;
248  contourButtons[ii].buttonX      = 36;
249  contourButtons[ii].buttonY      = 370;
250  contourButtons[ii].buttonWidth  = 110;
251  contourButtons[ii].buttonHeight = 24;
252  contourButtons[ii].buttonKey    = ii;
253  contourButtons[ii].pot          = no;
254  contourButtons[ii].mask         = buttonMASK;
255  contourButtons[ii].text         = "Abort";
256  contourButtons[ii].textColor    = abort_FG;
257  contourButtons[ii].xHalf        = contourButtons[ii].buttonWidth/2;
258  contourButtons[ii].yHalf        = contourButtons[ii].buttonHeight/2;
259  ++num;
260
261
262  return(num);
263
264}  /* initContourButtons() */
265
266
267void
268drawContourPanel(void)
269{
270
271  int i,strlength;
272
273        /*---------------------------------------------------*
274          Set the function to copy for first painting
275         *---------------------------------------------------*/
276  XSetFunction(dsply, contourGC, GXcopy);
277
278            /* Draw some lines for the contour panel, break up da space */
279  GSetForeground(contourGC /* ZZZ */,(float)foregroundColor,X);
280  GSetLineAttributes(contourGC /* ZZZ */,3,LineSolid,CapButt,JoinMiter,X);
281  GDrawLine(contourGC /* ZZZ */, contourWindow, 0, potA, controlWidth, potA, X);
282
283
284  GSetLineAttributes(contourGC /* ZZZ */,2,LineSolid,CapButt,JoinMiter,X);
285  GDrawLine(contourGC /* ZZZ */, contourWindow, 0, contourTitleA, controlWidth,
286            contourTitleA, X);
287  GDrawLine(contourGC /* ZZZ */, contourWindow, 0, contourTitleB, controlWidth,
288            contourTitleB, X);
289
290  writeControlTitle(contourWindow);
291  s = "Contour Slicing Panel";
292  strlength = strlen(s);
293  GSetForeground(anotherGC,(float)contourTitleColor,X);
294  GDrawString(anotherGC,contourWindow,
295              centerX(anotherGC,s,strlength,controlWidth),
296              contourTitleA+18,s,strlength,X);
297
298  for (i=contourButtonsStart; i<(contourButtonsEnd); i++) {
299        /*---------------------------------------------------*
300          NOTE: different from other control panels in that
301                the "monoColor" is defined in the button
302                and "moColor" is used there
303         *---------------------------------------------------*/
304    GSetForeground(contourGC /* ZZZ */,
305#ifdef oldie
306                   (float)monoColor((control->buttonQueue[i]).textColor),X);
307#else
308                   (float)((control->buttonQueue[i]).textColor),X);
309#endif
310    switch (i) {
311
312    case contourFlatView:
313    case contourAppendSegs:
314      GSetForeground(contourGC,
315                     (float)((control->buttonQueue[i]).textColor),X);
316      GDrawRectangle(contourGC,contourWindow,
317                     (control->buttonQueue[i]).buttonX,
318                     (control->buttonQueue[i]).buttonY,
319                     (control->buttonQueue[i]).buttonWidth,
320                     (control->buttonQueue[i]).buttonHeight,X);
321      GDrawString(contourGC,contourWindow,
322                  (control->buttonQueue[i]).buttonX +
323                  (control->buttonQueue[i]).buttonWidth + 4,
324                  (control->buttonQueue[i]).buttonY +
325                  centerY(contourGC,(control->buttonQueue[i]).buttonHeight),
326                  (control->buttonQueue[i]).text,
327                  strlen(control->buttonQueue[i].text),X);
328      if (i==contourFlatView && contour_flat_view_flag)
329      GDrawString(contourGC,contourWindow,
330                  (control->buttonQueue[i]).buttonX +
331                  centerX(contourGC,"x",1,
332                          (control->buttonQueue[i]).buttonWidth),
333                  (control->buttonQueue[i]).buttonY +
334                  centerY(contourGC,(control->buttonQueue[i]).buttonHeight),
335                  "x",1,X);
336      else if (i==contourAppendSegs && contour_append_lists_flag)
337      GDrawString(contourGC,contourWindow,
338                  (control->buttonQueue[i]).buttonX +
339                  centerX(contourGC,"x",1,
340                          (control->buttonQueue[i]).buttonWidth),
341                  (control->buttonQueue[i]).buttonY +
342                  centerY(contourGC,(control->buttonQueue[i]).buttonHeight),
343                  "x",1,X);
344      break;
345
346    case contourLongitude:
347      GDrawRectangle(contourGC /* ZZZ */,contourWindow,
348                     (control->buttonQueue[i]).buttonX,
349                     (control->buttonQueue[i]).buttonY,
350                     (control->buttonQueue[i]).buttonWidth,
351                     (control->buttonQueue[i]).buttonHeight,X);
352      draw_contour_longitude();
353      break;
354
355    case contourLatitude:
356#ifdef oldie
357      GDrawRectangle(contourGC /* ZZZ */,contourWindow,
358                     (control->buttonQueue[i]).buttonX,
359                     (control->buttonQueue[i]).buttonY,
360                     (control->buttonQueue[i]).buttonWidth,
361                     (control->buttonQueue[i]).buttonHeight,X);
362#else
363      XDrawRectangle(dsply,contourWindow, contourGC /* ZZZ */,
364                     (control->buttonQueue[i]).buttonX,
365                     (control->buttonQueue[i]).buttonY,
366                     (control->buttonQueue[i]).buttonWidth,
367                     (control->buttonQueue[i]).buttonHeight);
368#endif
369      draw_contour_latitude();
370      break;
371
372    case contourSliceNum:
373      GDrawRectangle(contourGC /* ZZZ */,contourWindow,
374                     (control->buttonQueue[i]).buttonX,
375                     (control->buttonQueue[i]).buttonY,
376                     (control->buttonQueue[i]).buttonWidth,
377                     (control->buttonQueue[i]).buttonHeight,X);
378      draw_contour_slicing();
379      break;
380
381    default:
382      GDrawRectangle(contourGC /* ZZZ */,contourWindow,
383                     (control->buttonQueue[i]).buttonX,
384                     (control->buttonQueue[i]).buttonY,
385                     (control->buttonQueue[i]).buttonWidth,
386                     (control->buttonQueue[i]).buttonHeight,X);
387      s = (control->buttonQueue[i]).text;
388      strlength = strlen(s);
389      GSetForeground(contourGC /* ZZZ */,
390#ifdef oldie
391                     (float)monoColor((control->buttonQueue[i]).textColor),X);
392#else
393                     (float)((control->buttonQueue[i]).textColor),X);
394#endif
395      GDrawString(trashGC /* ZZZ */,contourWindow,
396                  (control->buttonQueue[i]).buttonX +
397                  centerX(processGC,s,strlength,
398                          (control->buttonQueue[i]).buttonWidth),
399                  (control->buttonQueue[i]).buttonY +
400                  centerY(processGC,(control->buttonQueue[i]).buttonHeight),
401                  s,strlen(s),X);
402      break;
403    }  /* switch on i */
404  }  /* for contour buttons */
405
406        /*---------------------------------------------------*
407          Set the function to XOR for updating
408         *---------------------------------------------------*/
409  XSetFunction(dsply, contourGC, GXxor);
410  update_contour_longitude();  /* to get the xor stuff going */
411  update_contour_latitude();    /* to get the xor stuff going */
412
413}  /* drawContourPanel() */
414
415
416  /*---------------------------------------------------------------------*
417    draw_contour_longitude()
418   *---------------------------------------------------------------------*/
419void
420draw_contour_longitude(void)
421{
422
423  int tip_x, tip_y;
424  char stringo[20];
425
426
427        /*---------------------------------------------------*
428          print out the longitude in degrees
429         *---------------------------------------------------*/
430  sprintf(stringo,"Longitude: %d",(int)(rot_theta * DEGREES));
431  XClearArea(dsply, contourWindow, long_str_X, long_str_Y - 12,
432             long_W + 50, 18, False);
433  XDrawString(dsply, contourWindow, anotherGC,
434              long_str_X, long_str_Y,
435              stringo, strlen(stringo));
436
437        /*---------------------------------------------------*
438          draw the background artwork
439         *---------------------------------------------------*/
440  XClearArea(dsply, contourWindow,
441             contourLongitude_X, contourLongitude_Y,
442             contourLongitude_W, contourLongitude_H,
443             False);
444#ifdef use_fat
445  XSetForeground(dsply, contourGC /* ZZZ */, long_FG);
446  XDrawArc(dsply, contourWindow, contourGC /* ZZZ */,
447           long_corner_X, long_corner_Y,
448           long_W, long_H,
449           0, 360*64);
450#else
451  XSetForeground(dsply, contourGC, long_FG);
452  XSetForeground(dsply, trashGC, long_FG);
453  XDrawArc(dsply, contourWindow, trashGC /* ZZZ */,
454           long_corner_X, long_corner_Y,
455           long_W, long_H,
456           0, 360*64);
457#endif
458
459        /*---------------------------------------------------*
460          some spokes to make it look purty
461         *---------------------------------------------------*/
462  {
463    float a, xp, yp;
464    for (a=0; a<pi; a+=pi/8) {
465      xp = long_RADIUS*cos(a);
466      yp = long_RADIUS*sin(a);
467      XDrawLine(dsply, contourWindow,
468#ifdef use_fat
469                contourGC,
470#else
471                trashGC,
472#endif
473                (int)(xp + long_center_X), (int)(yp + long_center_Y),
474                (int)(-xp + long_center_X), (int)(-yp + long_center_Y));
475    }
476  }
477
478        /*---------------------------------------------------*
479          calculate and draw the longitudal pointer
480         *---------------------------------------------------*/
481  XSetFunction(dsply, contourGC, GXxor);
482  tip_x = (int)(cos(rot_theta) * (long_RADIUS + dotExt)) + long_center_X;
483  tip_y = (int)(-sin(rot_theta) * (long_RADIUS + dotExt)) + long_center_Y;
484  last_tip_long_x = tip_x;
485  last_tip_long_y = tip_y;
486  GSetForeground(contourGC,(float)stickColor,X);
487  GDrawLine(contourGC /* ZZZ */, contourWindow,
488            long_center_X, long_center_Y,
489            tip_x, tip_y, X);
490  GSetForeground(contourGC,(float)dotColor,X);
491  XFillArc(dsply, contourWindow, contourGC /* ZZZ */,
492           tip_x - (dotSize>>1), tip_y - (dotSize>>1),
493           dotSize, dotSize,
494           0, 360*64);
495  XSetFunction(dsply, contourGC, GXcopy);
496
497}  /* draw_contour_longitude() */
498
499
500  /*---------------------------------------------------------------------*
501    draw_contour_latitude()
502   *---------------------------------------------------------------------*/
503void
504draw_contour_latitude(void)
505{
506
507  int tip_x, tip_y;
508  char stringo[20];
509
510        /*---------------------------------------------------*
511          print out the latitude in degrees
512         *---------------------------------------------------*/
513  sprintf(stringo,"Latitude: %d",(int)(rot_phi * DEGREES));
514  XClearArea(dsply, contourWindow, lat_str_X, lat_str_Y - 12,
515             lat_W, 18, False);
516  XDrawString(dsply, contourWindow, anotherGC,
517              lat_str_X, lat_str_Y,
518              stringo, strlen(stringo));
519
520        /*---------------------------------------------------*
521          draw the background superduper work of art
522         *---------------------------------------------------*/
523  XClearArea(dsply, contourWindow,
524             contourLatitude_X, contourLatitude_Y,
525             contourLatitude_W, contourLatitude_H,
526             False);
527  XSetForeground(dsply, contourGC /* ZZZ */, lat_FG);
528  XDrawArc(dsply, contourWindow, contourGC /* ZZZ */,
529           lat_corner_X, lat_corner_Y,
530           lat_W, lat_H,
531           0, 90*64);
532  XDrawLine(dsply, contourWindow, contourGC,
533            lat_quad_X, lat_quad_Y,
534            lat_quad_X, lat_quad_Y - lat_RADIUS);
535  XDrawLine(dsply, contourWindow, contourGC,
536            lat_quad_X, lat_quad_Y,
537            lat_quad_X + lat_RADIUS, lat_quad_Y);
538
539        /*---------------------------------------------------*
540          purty leettle tabs
541         *---------------------------------------------------*/
542  {
543    float a, xp, yp;
544    for (a=0; a<pi_half; a+=pi/16) {
545      xp = cos(a);
546      yp = -sin(a);
547      XDrawLine(dsply, contourWindow, contourGC,
548                (int)((lat_RADIUS-3) * xp + lat_quad_X),
549                (int)((lat_RADIUS-3) * yp + lat_quad_Y),
550                (int)((lat_RADIUS+3) * xp + lat_quad_X),
551                (int)((lat_RADIUS+3) * yp + lat_quad_Y));
552    }
553  }
554
555        /*---------------------------------------------------*
556          calculate and draw the latitudal pointer
557         *---------------------------------------------------*/
558  XSetFunction(dsply, contourGC, GXxor);
559  tip_x = (int)(sin(rot_phi) * (lat_RADIUS + dotExt)) + lat_quad_X;
560  tip_y = (int)(-cos(rot_phi) * (lat_RADIUS + dotExt)) + lat_quad_Y;
561  last_tip_lat_x = tip_x;
562  last_tip_lat_y = tip_y;
563  GSetForeground(contourGC,(float)stickColor,X);
564  GDrawLine(contourGC /* ZZZ */, contourWindow,
565            lat_quad_X, lat_quad_Y,
566            tip_x, tip_y, X);
567  XSetForeground(dsply, contourGC, dotColor);
568  XFillArc(dsply, contourWindow, contourGC /* ZZZ */,
569           tip_x - (dotSize>>1), tip_y - (dotSize>>1),
570           dotSize, dotSize,
571           0, 360*64);
572  XSetFunction(dsply, contourGC, GXcopy);
573
574}  /* draw_contour_latitude() */
575
576
577
578  /*---------------------------------------------------------------------*
579    draw_contour_slicing()
580   *---------------------------------------------------------------------*/
581void
582draw_contour_slicing(void)
583{
584
585  int tip_y, cut_spacing;
586#ifdef oldie
587  XDrawString(dsply, contourWindow, anotherGC,
588              slice_str_X, slice_str_Y,
589              "Slicer", 6);
590#else
591  char stringo[20];
592
593  sprintf(stringo,"Cuts: %d",max_cuts);
594  XClearArea(dsply, contourWindow,
595             slice_str_X,
596             slice_str_Y - 12,
597             contourSliceNum_W, 16, False);
598  XDrawString(dsply, contourWindow, anotherGC,
599              slice_str_X, slice_str_Y,
600              stringo, strlen(stringo));
601#endif
602
603        /*---------------------------------------------------*
604          put up the piece de resistance
605         *---------------------------------------------------*/
606  XClearArea(dsply, contourWindow,
607             contourSliceNum_X, contourSliceNum_Y,
608             contourSliceNum_W, contourSliceNum_H,
609             False);
610  XPutImage(dsply, contourWindow, contourGC,
611            slicer_image,
612            0, 0,
613            slicer_image_X,
614            slicer_image_Y,
615            slicer_width, slicer_height);
616
617        /*---------------------------------------------------*
618          draw the number of slices
619         *---------------------------------------------------*/
620#define cuts_X (contourSliceNum_X + 15)
621#define cuts_Y (contourSliceNum_Y + 15)
622#define cuts_W 20
623#define cuts_H 85
624
625  XSetLineAttributes(dsply, trashGC, 1, LineSolid, CapButt, JoinMiter);
626  XClearArea(dsply, contourWindow,
627             cuts_X, cuts_Y, cuts_W, cuts_H, False);
628#ifdef oldie
629  cut_spacing = ( -(max_cuts - 1) + MAX_SLICES ) * cuts_H / MAX_SLICES;
630#else
631  {
632    float tmp;
633    tmp = (float)(-(max_cuts - 1) + MAX_SLICES) / MAX_SLICES;
634    cut_spacing = tmp*tmp * cuts_H;
635    if (cut_spacing < 1) cut_spacing = 1;
636    else if (cut_spacing > cuts_H) cut_spacing = cuts_H;
637  }
638#endif
639
640  XSetForeground(dsply, trashGC, moColor(violet0, pastel));
641  for (tip_y=cuts_Y+cuts_H; tip_y>=cuts_Y; tip_y-=cut_spacing) {
642    XDrawLine(dsply, contourWindow, trashGC,
643              cuts_X, tip_y,
644              cuts_X + cuts_W, tip_y);
645  }
646
647#define slide_Y (contourSliceNum_Y + 30)
648#define slide_H 55
649  {
650    float where;
651    int here;
652    where = (float)max_cuts/MAX_SLICES;  /* [0..1] */
653    here = where * slide_H + slide_Y;
654    XSetForeground(dsply, contourGC, moColor(red1, normal));
655    XDrawLine(dsply, contourWindow, contourGC,
656              cuts_X + 45, here,
657              cuts_X + 55, here);
658  }
659
660}  /* draw_contour_slicing() */
661
662
663  /*---------------------------------------------------------------------*
664    update_contour_longitude()
665
666    To be called for all subsequent updates after the contour window has
667    been mapped and drawn.
668   *---------------------------------------------------------------------*/
669void
670update_contour_longitude(void)
671{
672
673  int tip_x, tip_y;
674  char stringo[20];
675
676        /*---------------------------------------------------*
677          print out the longitude in degrees
678         *---------------------------------------------------*/
679  sprintf(stringo,"Longitude: %d",(int)(rot_theta * DEGREES));
680  XClearArea(dsply, contourWindow, long_str_X, long_str_Y - 12,
681             long_W + 50, 18, False);
682  XDrawString(dsply, contourWindow, anotherGC,
683              long_str_X, long_str_Y,
684              stringo, strlen(stringo));
685
686
687        /*---------------------------------------------------*
688          calculate and draw the longitudal pointer
689         *---------------------------------------------------*/
690  GSetForeground(contourGC,(float)stickColor,X);
691  GDrawLine(contourGC /* ZZZ */, contourWindow,
692            long_center_X, long_center_Y,
693            last_tip_long_x, last_tip_long_y, X);
694  GSetForeground(contourGC,(float)dotColor,X);
695  XFillArc(dsply, contourWindow, contourGC /* ZZZ */,
696           last_tip_long_x - (dotSize>>1), last_tip_long_y - (dotSize>>1),
697           dotSize, dotSize,
698           0, 360*64);
699  tip_x = (int)(cos(rot_theta) * (long_RADIUS + dotExt)) + long_center_X;
700  tip_y = (int)(-sin(rot_theta) * (long_RADIUS + dotExt)) + long_center_Y;
701  last_tip_long_x = tip_x;
702  last_tip_long_y = tip_y;
703  GSetForeground(contourGC,(float)stickColor,X);
704  GDrawLine(contourGC /* ZZZ */, contourWindow,
705            long_center_X, long_center_Y,
706            tip_x, tip_y, X);
707  GSetForeground(contourGC,(float)dotColor,X);
708  XFillArc(dsply, contourWindow, contourGC /* ZZZ */,
709           tip_x - (dotSize>>1), tip_y - (dotSize>>1),
710           dotSize, dotSize,
711           0, 360*64);
712
713}  /* update_contour_longitude() */
714
715
716  /*---------------------------------------------------------------------*
717    update_contour_latitude()
718
719    To be called for all subsequent updates after the contour window has
720    been mapped and drawn.
721   *---------------------------------------------------------------------*/
722void
723update_contour_latitude(void)
724{
725
726  int tip_x, tip_y;
727  char stringo[20];
728
729        /*---------------------------------------------------*
730          print out the latitude in degrees
731         *---------------------------------------------------*/
732  sprintf(stringo,"Latitude: %d",(int)(rot_phi * DEGREES));
733  XClearArea(dsply, contourWindow, lat_str_X, lat_str_Y - 12,
734             lat_W, 18, False);
735  XDrawString(dsply, contourWindow, anotherGC,
736              lat_str_X, lat_str_Y,
737              stringo, strlen(stringo));
738
739        /*---------------------------------------------------*
740          calculate and draw the latitudal pointer
741         *---------------------------------------------------*/
742  GSetForeground(contourGC,(float)stickColor,X);
743  GDrawLine(contourGC /* ZZZ */, contourWindow,
744            lat_quad_X, lat_quad_Y,
745            last_tip_lat_x, last_tip_lat_y, X);
746  XSetForeground(dsply, contourGC, dotColor);
747  XFillArc(dsply, contourWindow, contourGC /* ZZZ */,
748           last_tip_lat_x - (dotSize>>1),
749           last_tip_lat_y - (dotSize>>1),
750           dotSize, dotSize,
751           0, 360*64);
752  tip_x = (int)(sin(rot_phi) * (lat_RADIUS + dotExt)) + lat_quad_X;
753  tip_y = (int)(-cos(rot_phi) * (lat_RADIUS + dotExt)) + lat_quad_Y;
754  last_tip_lat_x = tip_x;
755  last_tip_lat_y = tip_y;
756  GSetForeground(contourGC,(float)stickColor,X);
757  GDrawLine(contourGC /* ZZZ */, contourWindow,
758            lat_quad_X, lat_quad_Y,
759            tip_x, tip_y, X);
760  XSetForeground(dsply, contourGC, dotColor);
761  XFillArc(dsply, contourWindow, contourGC /* ZZZ */,
762           tip_x - (dotSize>>1), tip_y - (dotSize>>1),
763           dotSize, dotSize,
764           0, 360*64);
765
766}  /* update_contour_latitude() */
767