/*********************************************************************** 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>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>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() */