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