open-axiom repository from github
/***********************************************************************
contour_panel.c
begun 25 November 1992, Jim Wen
***********************************************************************/
#include "header.h"
#include "cpanel.h"
#include "draw.h"
#include "../include/purty/volume.bitmap"
#include "../include/purty/volume.mask"
#include "../include/purty/slicer.bitmap"
#define use_fat
#define gStuff_NOT
#define contourWinDEBUG
#define drawDEBUG
#define contourDEBUG
#define stickColor moColor(orange2, pastel)
/*=====================================================================*
Static Variables
*=====================================================================*/
XImage slicer_image_stuff, *slicer_image = &slicer_image_stuff;
int last_tip_long_x, last_tip_long_y;
int last_tip_lat_x, last_tip_lat_y;
/*=====================================================================*
Local Functions
*=====================================================================*/
int initContourButtons();
/*---------------------------------------------------------------------*
makeContourPanel()
*---------------------------------------------------------------------*/
int makeContourPanel()
{
int i;
XSetWindowAttributes cwAttrib, controlAttrib;
XSizeHints sizehint;
Pixmap contourbits, contourmask, slicer_pixmap;
XColor foreColor, backColor;
contourbits = XCreateBitmapFromData(dsply,rtWindow,volumeBitmap_bits,
volumeBitmap_width,volumeBitmap_height);
contourmask = XCreateBitmapFromData(dsply,rtWindow,volumeMask_bits,
volumeMask_width,volumeMask_height);
cwAttrib.background_pixel = backgroundColor;
cwAttrib.border_pixel = foregroundColor;
cwAttrib.event_mask = contourMASK;
cwAttrib.colormap = colorMap;
cwAttrib.override_redirect = overrideManager;
foreColor.pixel = contourCursorForeground;
XQueryColor(dsply,colorMap,&foreColor);
backColor.pixel = contourCursorBackground;
XQueryColor(dsply,colorMap,&backColor);
cwAttrib.cursor = XCreatePixmapCursor(dsply,contourbits,contourmask,
&foreColor,&backColor,
volumeBitmap_x_hot,
volumeBitmap_y_hot);
#define slicer_pixmap_FG moColor(yellow1,normal)
#define slicer_pixmap_BG backgroundColor
slicer_pixmap = XCreatePixmapFromBitmapData(dsply, control->controlWindow,
slicer_bits, slicer_width, slicer_height,
slicer_pixmap_FG, slicer_pixmap_BG,
DefaultDepthOfScreen
(DefaultScreenOfDisplay(dsply)));
slicer_image = XGetImage(dsply, slicer_pixmap, 0, 0, slicer_width, slicer_height,
AllPlanes, ZPixmap);
contourWindow = XCreateWindow(dsply,control->controlWindow,
-3,-3,controlWidth,controlHeight,3,
CopyFromParent,InputOutput,CopyFromParent,
controlCreateMASK,&cwAttrib);
sizehint.flags = USPosition | USSize;
sizehint.x = 0;
sizehint.y = 0;
sizehint.width = controlWidth;
sizehint.height = controlHeight;
/*** the None stands for icon pixmap ***/
XSetNormalHints(dsply,contourWindow,&sizehint);
XSetStandardProperties(dsply,contourWindow,"Control Panel 3D",
"Contour Slicing",None,NULL,0,&sizehint);
/*** volume frustrum window ***/
/*** do contour buttons ***/
initContourButtons(control->buttonQueue);
for (i=contourButtonsStart; i<(contourButtonsEnd); i++) {
controlAttrib.event_mask = (control->buttonQueue[i]).mask;
(control->buttonQueue[i]).self =
XCreateWindow(dsply,contourWindow,
(control->buttonQueue[i]).buttonX,
(control->buttonQueue[i]).buttonY,
(control->buttonQueue[i]).buttonWidth,
(control->buttonQueue[i]).buttonHeight,
0,0,InputOnly,CopyFromParent,
buttonCreateMASK,&controlAttrib);
XMakeAssoc(dsply,table,(control->buttonQueue[i]).self,
&((control->buttonQueue[i]).buttonKey));
XMapWindow(dsply,(control->buttonQueue[i]).self);
}
} /* makeContourPanel() */
int initContourButtons(contourButtons)
buttonStruct *contourButtons;
{
int ii, num = 0;
ii = contourReturn;
contourButtons[ii].buttonX = 154;
contourButtons[ii].buttonY = 370;
contourButtons[ii].buttonWidth = 110;
contourButtons[ii].buttonHeight = 24;
contourButtons[ii].buttonKey = ii;
contourButtons[ii].pot = no;
contourButtons[ii].mask = buttonMASK;
contourButtons[ii].text = "Return";
contourButtons[ii].textColor = return_FG;
contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2;
contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2;
++num;
ii = contourXY;
contourButtons[ii].buttonX = contourPlaneXY_X;
contourButtons[ii].buttonY = contourPlaneXY_Y;
contourButtons[ii].buttonWidth = contourLittleButt_W;
contourButtons[ii].buttonHeight = contourLittleButt_H;
contourButtons[ii].buttonKey = ii;
contourButtons[ii].pot = no;
contourButtons[ii].mask = buttonMASK;
contourButtons[ii].text = "XY";
contourButtons[ii].textColor = littleButt_FG;
contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2;
contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2;
++num;
ii = contourXZ;
contourButtons[ii].buttonX = contourPlaneXZ_X;
contourButtons[ii].buttonY = contourPlaneXZ_Y;
contourButtons[ii].buttonWidth = contourLittleButt_W;
contourButtons[ii].buttonHeight = contourLittleButt_H;
contourButtons[ii].buttonKey = ii;
contourButtons[ii].pot = no;
contourButtons[ii].mask = buttonMASK;
contourButtons[ii].text = "XZ";
contourButtons[ii].textColor = littleButt_FG;
contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2;
contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2;
++num;
ii = contourYZ;
contourButtons[ii].buttonX = contourPlaneYZ_X;
contourButtons[ii].buttonY = contourPlaneYZ_Y;
contourButtons[ii].buttonWidth = contourLittleButt_W;
contourButtons[ii].buttonHeight = contourLittleButt_H;
contourButtons[ii].buttonKey = ii;
contourButtons[ii].pot = no;
contourButtons[ii].mask = buttonMASK;
contourButtons[ii].text = "YZ";
contourButtons[ii].textColor = littleButt_FG;
contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2;
contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2;
++num;
ii = contourFlatView;
contourButtons[ii].buttonX = contourFlatView_X;
contourButtons[ii].buttonY = contourFlatView_Y;
contourButtons[ii].buttonWidth = contourBigButt_W;
contourButtons[ii].buttonHeight = contourBigButt_H;
contourButtons[ii].buttonKey = ii;
contourButtons[ii].pot = no;
contourButtons[ii].mask = potMASK;
contourButtons[ii].text = "Flat View Upon Return";
contourButtons[ii].textColor = bigButt_FG;
contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2;
contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2;
++num;
ii = contourAppendSegs;
contourButtons[ii].buttonX = contourAppendSegs_X;
contourButtons[ii].buttonY = contourAppendSegs_Y;
contourButtons[ii].buttonWidth = contourBigButt_W;
contourButtons[ii].buttonHeight = contourBigButt_H;
contourButtons[ii].buttonKey = ii;
contourButtons[ii].pot = no;
contourButtons[ii].mask = potMASK;
contourButtons[ii].text = "Append Contours";
contourButtons[ii].textColor = bigButt_FG;
contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2;
contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2;
++num;
ii = contourLongitude;
contourButtons[ii].buttonX = contourLongitude_X;
contourButtons[ii].buttonY = contourLongitude_Y;
contourButtons[ii].buttonWidth = contourLongitude_W;
contourButtons[ii].buttonHeight = contourLongitude_H;
contourButtons[ii].buttonKey = ii;
contourButtons[ii].pot = yes;
contourButtons[ii].mask = potMASK;
contourButtons[ii].text = "XZ";
contourButtons[ii].textColor = long_FG;
contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2;
contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2;
++num;
ii = contourLatitude;
contourButtons[ii].buttonX = contourLatitude_X;
contourButtons[ii].buttonY = contourLatitude_Y;
contourButtons[ii].buttonWidth = contourLatitude_W;
contourButtons[ii].buttonHeight = contourLatitude_H;
contourButtons[ii].buttonKey = ii;
contourButtons[ii].pot = yes;
contourButtons[ii].mask = potMASK;
contourButtons[ii].text = "XZ";
contourButtons[ii].textColor = lat_FG;
contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2;
contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2;
++num;
ii = contourSliceNum;
contourButtons[ii].buttonX = contourSliceNum_X;
contourButtons[ii].buttonY = contourSliceNum_Y;
contourButtons[ii].buttonWidth = contourSliceNum_W;
contourButtons[ii].buttonHeight = contourSliceNum_H;
contourButtons[ii].buttonKey = ii;
contourButtons[ii].pot = yes;
contourButtons[ii].mask = potMASK;
contourButtons[ii].text = "XZ";
contourButtons[ii].textColor = slice_FG;
contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2;
contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2;
++num;
ii = contourAbort;
contourButtons[ii].buttonX = 36;
contourButtons[ii].buttonY = 370;
contourButtons[ii].buttonWidth = 110;
contourButtons[ii].buttonHeight = 24;
contourButtons[ii].buttonKey = ii;
contourButtons[ii].pot = no;
contourButtons[ii].mask = buttonMASK;
contourButtons[ii].text = "Abort";
contourButtons[ii].textColor = abort_FG;
contourButtons[ii].xHalf = contourButtons[ii].buttonWidth/2;
contourButtons[ii].yHalf = contourButtons[ii].buttonHeight/2;
++num;
return(num);
} /* initContourButtons() */
void drawContourPanel()
{
int i,strlength;
/*---------------------------------------------------*
Set the function to copy for first painting
*---------------------------------------------------*/
XSetFunction(dsply, contourGC, GXcopy);
/* Draw some lines for the contour panel, break up da space */
GSetForeground(contourGC /* ZZZ */,(float)foregroundColor,X);
GSetLineAttributes(contourGC /* ZZZ */,3,LineSolid,CapButt,JoinMiter,X);
GDrawLine(contourGC /* ZZZ */, contourWindow, 0, potA, controlWidth, potA, X);
GSetLineAttributes(contourGC /* ZZZ */,2,LineSolid,CapButt,JoinMiter,X);
GDrawLine(contourGC /* ZZZ */, contourWindow, 0, contourTitleA, controlWidth,
contourTitleA, X);
GDrawLine(contourGC /* ZZZ */, contourWindow, 0, contourTitleB, controlWidth,
contourTitleB, X);
writeControlTitle(contourWindow);
s = "Contour Slicing Panel";
strlength = strlen(s);
GSetForeground(anotherGC,(float)contourTitleColor,X);
GDrawString(anotherGC,contourWindow,
centerX(anotherGC,s,strlength,controlWidth),
contourTitleA+18,s,strlength,X);
for (i=contourButtonsStart; i<(contourButtonsEnd); i++) {
/*---------------------------------------------------*
NOTE: different from other control panels in that
the "monoColor" is defined in the button
and "moColor" is used there
*---------------------------------------------------*/
GSetForeground(contourGC /* ZZZ */,
#ifdef oldie
(float)monoColor((control->buttonQueue[i]).textColor),X);
#else
(float)((control->buttonQueue[i]).textColor),X);
#endif
switch (i) {
case contourFlatView:
case contourAppendSegs:
GSetForeground(contourGC,
(float)((control->buttonQueue[i]).textColor),X);
GDrawRectangle(contourGC,contourWindow,
(control->buttonQueue[i]).buttonX,
(control->buttonQueue[i]).buttonY,
(control->buttonQueue[i]).buttonWidth,
(control->buttonQueue[i]).buttonHeight,X);
GDrawString(contourGC,contourWindow,
(control->buttonQueue[i]).buttonX +
(control->buttonQueue[i]).buttonWidth + 4,
(control->buttonQueue[i]).buttonY +
centerY(contourGC,(control->buttonQueue[i]).buttonHeight),
(control->buttonQueue[i]).text,
strlen(control->buttonQueue[i].text),X);
if (i==contourFlatView && contour_flat_view_flag)
GDrawString(contourGC,contourWindow,
(control->buttonQueue[i]).buttonX +
centerX(contourGC,"x",1,
(control->buttonQueue[i]).buttonWidth),
(control->buttonQueue[i]).buttonY +
centerY(contourGC,(control->buttonQueue[i]).buttonHeight),
"x",1,X);
else if (i==contourAppendSegs && contour_append_lists_flag)
GDrawString(contourGC,contourWindow,
(control->buttonQueue[i]).buttonX +
centerX(contourGC,"x",1,
(control->buttonQueue[i]).buttonWidth),
(control->buttonQueue[i]).buttonY +
centerY(contourGC,(control->buttonQueue[i]).buttonHeight),
"x",1,X);
break;
case contourLongitude:
GDrawRectangle(contourGC /* ZZZ */,contourWindow,
(control->buttonQueue[i]).buttonX,
(control->buttonQueue[i]).buttonY,
(control->buttonQueue[i]).buttonWidth,
(control->buttonQueue[i]).buttonHeight,X);
draw_contour_longitude();
break;
case contourLatitude:
#ifdef oldie
GDrawRectangle(contourGC /* ZZZ */,contourWindow,
(control->buttonQueue[i]).buttonX,
(control->buttonQueue[i]).buttonY,
(control->buttonQueue[i]).buttonWidth,
(control->buttonQueue[i]).buttonHeight,X);
#else
XDrawRectangle(dsply,contourWindow, contourGC /* ZZZ */,
(control->buttonQueue[i]).buttonX,
(control->buttonQueue[i]).buttonY,
(control->buttonQueue[i]).buttonWidth,
(control->buttonQueue[i]).buttonHeight);
#endif
draw_contour_latitude();
break;
case contourSliceNum:
GDrawRectangle(contourGC /* ZZZ */,contourWindow,
(control->buttonQueue[i]).buttonX,
(control->buttonQueue[i]).buttonY,
(control->buttonQueue[i]).buttonWidth,
(control->buttonQueue[i]).buttonHeight,X);
draw_contour_slicing();
break;
default:
GDrawRectangle(contourGC /* ZZZ */,contourWindow,
(control->buttonQueue[i]).buttonX,
(control->buttonQueue[i]).buttonY,
(control->buttonQueue[i]).buttonWidth,
(control->buttonQueue[i]).buttonHeight,X);
s = (control->buttonQueue[i]).text;
strlength = strlen(s);
GSetForeground(contourGC /* ZZZ */,
#ifdef oldie
(float)monoColor((control->buttonQueue[i]).textColor),X);
#else
(float)((control->buttonQueue[i]).textColor),X);
#endif
GDrawString(trashGC /* ZZZ */,contourWindow,
(control->buttonQueue[i]).buttonX +
centerX(processGC,s,strlength,
(control->buttonQueue[i]).buttonWidth),
(control->buttonQueue[i]).buttonY +
centerY(processGC,(control->buttonQueue[i]).buttonHeight),
s,strlen(s),X);
break;
} /* switch on i */
} /* for contour buttons */
/*---------------------------------------------------*
Set the function to XOR for updating
*---------------------------------------------------*/
XSetFunction(dsply, contourGC, GXxor);
update_contour_longitude(); /* to get the xor stuff going */
update_contour_latitude(); /* to get the xor stuff going */
} /* drawContourPanel() */
/*---------------------------------------------------------------------*
draw_contour_longitude()
*---------------------------------------------------------------------*/
void draw_contour_longitude()
{
int tip_x, tip_y;
char stringo[20];
/*---------------------------------------------------*
print out the longitude in degrees
*---------------------------------------------------*/
sprintf(stringo,"Longitude: %d",(int)(rot_theta * DEGREES));
XClearArea(dsply, contourWindow, long_str_X, long_str_Y - 12,
long_W + 50, 18, False);
XDrawString(dsply, contourWindow, anotherGC,
long_str_X, long_str_Y,
stringo, strlen(stringo));
/*---------------------------------------------------*
draw the background artwork
*---------------------------------------------------*/
XClearArea(dsply, contourWindow,
contourLongitude_X, contourLongitude_Y,
contourLongitude_W, contourLongitude_H,
False);
#ifdef use_fat
XSetForeground(dsply, contourGC /* ZZZ */, long_FG);
XDrawArc(dsply, contourWindow, contourGC /* ZZZ */,
long_corner_X, long_corner_Y,
long_W, long_H,
0, 360*64);
#else
XSetForeground(dsply, contourGC, long_FG);
XSetForeground(dsply, trashGC, long_FG);
XDrawArc(dsply, contourWindow, trashGC /* ZZZ */,
long_corner_X, long_corner_Y,
long_W, long_H,
0, 360*64);
#endif
/*---------------------------------------------------*
some spokes to make it look purty
*---------------------------------------------------*/
{
float a, xp, yp;
for (a=0; a<pi; a+=pi/8) {
xp = long_RADIUS*cos(a);
yp = long_RADIUS*sin(a);
XDrawLine(dsply, contourWindow,
#ifdef use_fat
contourGC,
#else
trashGC,
#endif
(int)(xp + long_center_X), (int)(yp + long_center_Y),
(int)(-xp + long_center_X), (int)(-yp + long_center_Y));
}
}
/*---------------------------------------------------*
calculate and draw the longitudal pointer
*---------------------------------------------------*/
XSetFunction(dsply, contourGC, GXxor);
tip_x = (int)(cos(rot_theta) * (long_RADIUS + dotExt)) + long_center_X;
tip_y = (int)(-sin(rot_theta) * (long_RADIUS + dotExt)) + long_center_Y;
last_tip_long_x = tip_x;
last_tip_long_y = tip_y;
GSetForeground(contourGC,(float)stickColor,X);
GDrawLine(contourGC /* ZZZ */, contourWindow,
long_center_X, long_center_Y,
tip_x, tip_y, X);
GSetForeground(contourGC,(float)dotColor,X);
XFillArc(dsply, contourWindow, contourGC /* ZZZ */,
tip_x - (dotSize>>1), tip_y - (dotSize>>1),
dotSize, dotSize,
0, 360*64);
XSetFunction(dsply, contourGC, GXcopy);
} /* draw_contour_longitude() */
/*---------------------------------------------------------------------*
draw_contour_latitude()
*---------------------------------------------------------------------*/
void draw_contour_latitude()
{
int tip_x, tip_y;
char stringo[20];
/*---------------------------------------------------*
print out the latitude in degrees
*---------------------------------------------------*/
sprintf(stringo,"Latitude: %d",(int)(rot_phi * DEGREES));
XClearArea(dsply, contourWindow, lat_str_X, lat_str_Y - 12,
lat_W, 18, False);
XDrawString(dsply, contourWindow, anotherGC,
lat_str_X, lat_str_Y,
stringo, strlen(stringo));
/*---------------------------------------------------*
draw the background superduper work of art
*---------------------------------------------------*/
XClearArea(dsply, contourWindow,
contourLatitude_X, contourLatitude_Y,
contourLatitude_W, contourLatitude_H,
False);
XSetForeground(dsply, contourGC /* ZZZ */, lat_FG);
XDrawArc(dsply, contourWindow, contourGC /* ZZZ */,
lat_corner_X, lat_corner_Y,
lat_W, lat_H,
0, 90*64);
XDrawLine(dsply, contourWindow, contourGC,
lat_quad_X, lat_quad_Y,
lat_quad_X, lat_quad_Y - lat_RADIUS);
XDrawLine(dsply, contourWindow, contourGC,
lat_quad_X, lat_quad_Y,
lat_quad_X + lat_RADIUS, lat_quad_Y);
/*---------------------------------------------------*
purty leettle tabs
*---------------------------------------------------*/
{
float a, xp, yp;
for (a=0; a<pi_half; a+=pi/16) {
xp = cos(a);
yp = -sin(a);
XDrawLine(dsply, contourWindow, contourGC,
(int)((lat_RADIUS-3) * xp + lat_quad_X),
(int)((lat_RADIUS-3) * yp + lat_quad_Y),
(int)((lat_RADIUS+3) * xp + lat_quad_X),
(int)((lat_RADIUS+3) * yp + lat_quad_Y));
}
}
/*---------------------------------------------------*
calculate and draw the latitudal pointer
*---------------------------------------------------*/
XSetFunction(dsply, contourGC, GXxor);
tip_x = (int)(sin(rot_phi) * (lat_RADIUS + dotExt)) + lat_quad_X;
tip_y = (int)(-cos(rot_phi) * (lat_RADIUS + dotExt)) + lat_quad_Y;
last_tip_lat_x = tip_x;
last_tip_lat_y = tip_y;
GSetForeground(contourGC,(float)stickColor,X);
GDrawLine(contourGC /* ZZZ */, contourWindow,
lat_quad_X, lat_quad_Y,
tip_x, tip_y, X);
XSetForeground(dsply, contourGC, dotColor);
XFillArc(dsply, contourWindow, contourGC /* ZZZ */,
tip_x - (dotSize>>1), tip_y - (dotSize>>1),
dotSize, dotSize,
0, 360*64);
XSetFunction(dsply, contourGC, GXcopy);
} /* draw_contour_latitude() */
/*---------------------------------------------------------------------*
draw_contour_slicing()
*---------------------------------------------------------------------*/
void draw_contour_slicing()
{
int tip_y, cut_spacing;
#ifdef oldie
XDrawString(dsply, contourWindow, anotherGC,
slice_str_X, slice_str_Y,
"Slicer", 6);
#else
char stringo[20];
sprintf(stringo,"Cuts: %d",max_cuts);
XClearArea(dsply, contourWindow,
slice_str_X,
slice_str_Y - 12,
contourSliceNum_W, 16, False);
XDrawString(dsply, contourWindow, anotherGC,
slice_str_X, slice_str_Y,
stringo, strlen(stringo));
#endif
/*---------------------------------------------------*
put up the piece de resistance
*---------------------------------------------------*/
XClearArea(dsply, contourWindow,
contourSliceNum_X, contourSliceNum_Y,
contourSliceNum_W, contourSliceNum_H,
False);
XPutImage(dsply, contourWindow, contourGC,
slicer_image,
0, 0,
slicer_image_X,
slicer_image_Y,
slicer_width, slicer_height);
/*---------------------------------------------------*
draw the number of slices
*---------------------------------------------------*/
#define cuts_X (contourSliceNum_X + 15)
#define cuts_Y (contourSliceNum_Y + 15)
#define cuts_W 20
#define cuts_H 85
XSetLineAttributes(dsply, trashGC, 1, LineSolid, CapButt, JoinMiter);
XClearArea(dsply, contourWindow,
cuts_X, cuts_Y, cuts_W, cuts_H, False);
#ifdef oldie
cut_spacing = ( -(max_cuts - 1) + MAX_SLICES ) * cuts_H / MAX_SLICES;
#else
{
float tmp;
tmp = (float)(-(max_cuts - 1) + MAX_SLICES) / MAX_SLICES;
cut_spacing = tmp*tmp * cuts_H;
if (cut_spacing < 1) cut_spacing = 1;
else if (cut_spacing > cuts_H) cut_spacing = cuts_H;
}
#endif
XSetForeground(dsply, trashGC, moColor(violet0, pastel));
for (tip_y=cuts_Y+cuts_H; tip_y>=cuts_Y; tip_y-=cut_spacing) {
XDrawLine(dsply, contourWindow, trashGC,
cuts_X, tip_y,
cuts_X + cuts_W, tip_y);
}
#define slide_Y (contourSliceNum_Y + 30)
#define slide_H 55
{
float where;
int here;
where = (float)max_cuts/MAX_SLICES; /* [0..1] */
here = where * slide_H + slide_Y;
XSetForeground(dsply, contourGC, moColor(red1, normal));
XDrawLine(dsply, contourWindow, contourGC,
cuts_X + 45, here,
cuts_X + 55, here);
}
} /* draw_contour_slicing() */
/*---------------------------------------------------------------------*
update_contour_longitude()
To be called for all subsequent updates after the contour window has
been mapped and drawn.
*---------------------------------------------------------------------*/
void update_contour_longitude()
{
int tip_x, tip_y;
char stringo[20];
/*---------------------------------------------------*
print out the longitude in degrees
*---------------------------------------------------*/
sprintf(stringo,"Longitude: %d",(int)(rot_theta * DEGREES));
XClearArea(dsply, contourWindow, long_str_X, long_str_Y - 12,
long_W + 50, 18, False);
XDrawString(dsply, contourWindow, anotherGC,
long_str_X, long_str_Y,
stringo, strlen(stringo));
/*---------------------------------------------------*
calculate and draw the longitudal pointer
*---------------------------------------------------*/
GSetForeground(contourGC,(float)stickColor,X);
GDrawLine(contourGC /* ZZZ */, contourWindow,
long_center_X, long_center_Y,
last_tip_long_x, last_tip_long_y, X);
GSetForeground(contourGC,(float)dotColor,X);
XFillArc(dsply, contourWindow, contourGC /* ZZZ */,
last_tip_long_x - (dotSize>>1), last_tip_long_y - (dotSize>>1),
dotSize, dotSize,
0, 360*64);
tip_x = (int)(cos(rot_theta) * (long_RADIUS + dotExt)) + long_center_X;
tip_y = (int)(-sin(rot_theta) * (long_RADIUS + dotExt)) + long_center_Y;
last_tip_long_x = tip_x;
last_tip_long_y = tip_y;
GSetForeground(contourGC,(float)stickColor,X);
GDrawLine(contourGC /* ZZZ */, contourWindow,
long_center_X, long_center_Y,
tip_x, tip_y, X);
GSetForeground(contourGC,(float)dotColor,X);
XFillArc(dsply, contourWindow, contourGC /* ZZZ */,
tip_x - (dotSize>>1), tip_y - (dotSize>>1),
dotSize, dotSize,
0, 360*64);
} /* update_contour_longitude() */
/*---------------------------------------------------------------------*
update_contour_latitude()
To be called for all subsequent updates after the contour window has
been mapped and drawn.
*---------------------------------------------------------------------*/
void update_contour_latitude()
{
int tip_x, tip_y;
char stringo[20];
/*---------------------------------------------------*
print out the latitude in degrees
*---------------------------------------------------*/
sprintf(stringo,"Latitude: %d",(int)(rot_phi * DEGREES));
XClearArea(dsply, contourWindow, lat_str_X, lat_str_Y - 12,
lat_W, 18, False);
XDrawString(dsply, contourWindow, anotherGC,
lat_str_X, lat_str_Y,
stringo, strlen(stringo));
/*---------------------------------------------------*
calculate and draw the latitudal pointer
*---------------------------------------------------*/
GSetForeground(contourGC,(float)stickColor,X);
GDrawLine(contourGC /* ZZZ */, contourWindow,
lat_quad_X, lat_quad_Y,
last_tip_lat_x, last_tip_lat_y, X);
XSetForeground(dsply, contourGC, dotColor);
XFillArc(dsply, contourWindow, contourGC /* ZZZ */,
last_tip_lat_x - (dotSize>>1),
last_tip_lat_y - (dotSize>>1),
dotSize, dotSize,
0, 360*64);
tip_x = (int)(sin(rot_phi) * (lat_RADIUS + dotExt)) + lat_quad_X;
tip_y = (int)(-cos(rot_phi) * (lat_RADIUS + dotExt)) + lat_quad_Y;
last_tip_lat_x = tip_x;
last_tip_lat_y = tip_y;
GSetForeground(contourGC,(float)stickColor,X);
GDrawLine(contourGC /* ZZZ */, contourWindow,
lat_quad_X, lat_quad_Y,
tip_x, tip_y, X);
XSetForeground(dsply, contourGC, dotColor);
XFillArc(dsply, contourWindow, contourGC /* ZZZ */,
tip_x - (dotSize>>1), tip_y - (dotSize>>1),
dotSize, dotSize,
0, 360*64);
} /* update_contour_latitude() */