envbvs@epb2.lbl.gov (Brian V. Smith) (07/03/90)
Submitted-by: envbvs@epb2.lbl.gov (Brian V. Smith) Posting-number: Volume 8, Issue 16 Archive-name: xfig2.8/part07 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 7 (of 21)." # Contents: @figs/arithmetic.fig addpt.c copy.c draw.c global.c text.c # Wrapped by envbvs@epb2.lbl.gov on Thu Jun 28 08:51:42 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f '@figs/arithmetic.fig' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'@figs/arithmetic.fig'\" else echo shar: Extracting \"'@figs/arithmetic.fig'\" \(7345 characters\) sed "s/^X//" >'@figs/arithmetic.fig' <<'END_OF_FILE' X#FIG 1.4 X80 2 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 335 175 335 202 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 276 175 276 202 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 254 205 296 205 296 222 254 222 254 205 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 365 622 365 653 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 356 625 356 653 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 348 629 348 653 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 1 X 0 0 1.000 4.000 8.000 X 536 445 536 470 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 1 X 0 0 1.000 4.000 8.000 X 536 497 536 704 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 492 470 492 495 582 495 582 470 492 470 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 437 567 459 567 459 701 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 390 565 409 565 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 412 538 412 594 437 594 437 538 412 538 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 1 X 0 0 1.000 4.000 8.000 X 320 624 296 624 296 704 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 365 465 365 505 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 356 465 356 502 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 348 465 348 498 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 1 X 0 0 1.000 4.000 8.000 X 339 493 339 465 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 1 X 0 0 1.000 4.000 8.000 X 268 508 254 508 254 704 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 296 508 320 508 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 271 482 296 482 296 534 271 534 271 482 9999 9999 X2 3 0 1 0 0 0 0 0.000 0 0 X 323 487 390 517 390 610 323 640 323 602 348 589 348 538 323 525 323 487 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 536 222 527 226 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 1 X 0 0 1.000 4.000 8.000 X 531 283 531 303 595 303 595 401 569 401 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 1 X 0 0 1.000 4.000 8.000 X 531 177 531 264 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 501 264 501 281 561 281 561 264 501 264 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 501 333 501 443 569 443 569 333 501 333 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 487 386 500 399 487 412 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 445 405 492 405 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 445 393 492 393 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 399 337 390 341 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 399 222 390 226 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 395 393 395 283 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 365 264 365 281 425 281 425 264 365 264 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 1 X 0 0 1.000 4.000 8.000 X 395 177 395 264 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 429 367 429 431 445 431 445 367 429 367 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 113 405 429 405 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 113 393 429 393 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 105 175 574 175 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 105 162 574 162 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 130 175 130 202 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 109 205 152 205 152 222 109 222 109 205 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 169 205 211 205 211 222 169 222 169 205 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 190 175 190 202 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 130 247 130 307 190 307 190 247 130 247 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 130 222 146 244 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 190 222 172 244 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 135 183 126 187 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 194 183 186 187 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 160 307 160 330 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 130 333 130 350 190 350 190 333 130 333 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 160 350 160 390 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 164 316 156 320 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 164 367 156 371 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 309 367 301 371 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 309 316 301 320 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 305 350 305 390 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 276 333 276 350 335 350 335 333 276 333 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 305 307 305 333 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 339 183 331 187 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 279 183 271 187 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 335 222 317 244 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 0 X 0 0 1.000 4.000 8.000 X 276 222 292 244 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 276 247 276 307 335 307 335 247 276 247 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 313 205 356 205 356 222 313 222 313 205 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 152 567 219 567 219 585 152 585 152 567 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 152 585 219 585 219 602 152 602 152 585 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 152 602 219 602 219 619 152 619 152 602 9999 9999 X2 2 0 1 0 0 0 0 0.000 0 0 X 152 619 219 619 219 636 152 636 152 619 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 135 704 561 704 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 135 717 561 717 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 555 698 567 710 555 723 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 0 X 141 699 127 711 141 724 9999 9999 X2 1 0 1 0 0 0 0 0.000 1 1 X 0 0 1.000 4.000 8.000 X 0 0 1.000 4.000 8.000 X 186 638 186 701 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 1 X 0 0 1.000 4.000 8.000 X 107 214 92 214 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 1 X 0 0 1.000 4.000 8.000 X 213 214 229 214 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 1 X 0 0 1.000 4.000 8.000 X 251 214 237 214 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 1 X 0 0 1.000 4.000 8.000 X 191 341 207 341 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 1 X 0 0 1.000 4.000 8.000 X 337 341 352 341 9999 9999 X2 1 0 1 0 0 0 0 0.000 0 1 X 0 0 1.000 4.000 8.000 X 358 214 373 214 9999 9999 X2 1 0 2 0 0 0 0 0.000 0 0 X 171 288 151 268 9999 9999 X2 1 0 2 0 0 0 0 0.000 0 0 X 171 268 151 288 9999 9999 X2 1 0 2 0 0 0 0 0.000 0 0 X 305 268 305 288 9999 9999 X2 1 0 2 0 0 0 0 0.000 0 0 X 315 278 295 278 9999 9999 X4 0 0 12 0 0 0 0.000 1 9 90 263 145 ARITHMETIC UNIT X4 0 0 12 0 0 0 0.000 1 9 72 116 518 ADDRESS UNIT X4 0 0 12 0 0 0 0.000 1 9 54 326 457 OPERATION X4 0 0 12 0 0 0 0.000 1 9 30 497 508 (MAR) X4 0 0 12 0 0 0 0.000 1 9 72 258 738 ADDRESS BUS X4 0 0 12 0 0 0 0.000 1 9 66 335 671 COND CODES X4 0 0 12 0 0 0 0.000 1 9 18 412 534 OUT X4 0 0 12 0 0 0 0.000 1 9 66 496 487 MEM ADR REG X4 0 0 12 0 0 0 0.000 1 9 18 356 567 ALU X4 0 0 12 0 0 0 0.000 1 9 12 177 632 R0 X4 0 0 12 0 0 0 0.000 1 9 12 177 614 R1 X4 0 0 12 0 0 0 0.000 1 9 12 177 597 R2 X4 0 0 12 0 0 0 0.000 1 9 12 177 580 R3 X4 0 0 12 0 0 0 0.000 1 9 24 266 473 TEMP X4 0 0 12 0 0 0 0.000 1 9 42 509 440 ADDRESS X4 0 0 12 0 0 0 0.000 1 9 48 536 260 DATA OUT X4 0 0 12 0 0 0 0.000 1 9 36 536 247 MEMORY X4 0 0 12 0 0 0 0.000 1 9 18 519 277 MDO X4 0 0 12 0 0 0 0.000 1 9 24 378 277 YTOA X4 0 0 12 0 0 0 0.000 1 9 18 539 401 OUT X4 0 0 12 0 0 0 0.000 1 9 12 506 401 IN X4 0 0 12 0 0 0 0.000 1 9 18 519 376 RAM X4 0 0 12 0 0 0 0.000 1 9 24 514 358 DATA X4 0 0 12 0 0 0 0.000 1 9 36 420 358 YTOMEM X4 0 0 12 0 0 0 0.000 1 9 30 207 388 Y BUS X4 0 0 12 0 0 0 0.000 1 9 24 135 158 ABUS X4 0 0 12 0 0 0 0.000 1 9 24 113 217 MUL0 X4 0 0 12 0 0 0 0.000 1 9 24 172 217 MUL1 X4 0 0 12 0 0 0 0.000 1 9 36 135 346 MULOUT X4 0 0 12 0 0 0 0.000 1 9 36 279 346 ADDOUT X4 0 0 12 0 0 0 0.000 1 9 24 318 217 ADD1 X4 0 0 12 0 0 0 0.000 1 9 24 258 217 ADD0 END_OF_FILE echo shar: 32 control characters may be missing from \"'@figs/arithmetic.fig'\" if test 7345 -ne `wc -c <'@figs/arithmetic.fig'`; then echo shar: \"'@figs/arithmetic.fig'\" unpacked with wrong size! fi # end of '@figs/arithmetic.fig' fi if test -f 'addpt.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'addpt.c'\" else echo shar: Extracting \"'addpt.c'\" \(7922 characters\) sed "s/^X//" >'addpt.c' <<'END_OF_FILE' X/* X * FIG : Facility for Interactive Generation of figures X * X * Copyright (c) 1985 by Supoj Sutanthavibul (supoj@sally.UTEXAS.EDU) X * January 1985. X * 1st revision : August 1985. X * 2nd revision : March 1988. X * X * %W% %G% X*/ X#include "fig.h" X#include "resources.h" X#include "alloc.h" X#include "func.h" X#include "object.h" X#include "paintop.h" X X#define TOLERANCE 3 X Xextern F_line *line_search(); Xextern F_spline *spline_search(); Xextern (*canvas_kbd_proc)(); Xextern (*canvas_locmove_proc)(); Xextern (*canvas_leftbut_proc)(); Xextern (*canvas_middlebut_proc)(); Xextern (*canvas_rightbut_proc)(); Xextern null_proc(); Xextern set_popupmenu(); Xextern determine_angle(); X Xextern int manhattan_mode, mountain_mode; Xextern int latexline_mode, latexarrow_mode; Xextern int cur_x, cur_y, fix_x, fix_y; Xextern int pointmarker_shown; Xextern F_line *line; Xextern F_spline *spline; X Xextern F_point *added_point; Xextern F_point *left_point, *right_point; X Xextern int init_point_adding(); Xextern int move_addedpoint(); Xextern int fix_linepoint_adding(); Xextern int mm_fix_linepoint_adding(); Xextern int fix_splinepoint_adding(); Xextern int latex_elasticline(); X Xstatic F_line *cur_line; Xstatic F_spline *cur_spline; X Xpoint_adding_selected() X{ X canvas_kbd_proc = null_proc; X canvas_locmove_proc = null_proc; X canvas_leftbut_proc = init_point_adding; X canvas_middlebut_proc = null_proc; X canvas_rightbut_proc = set_popupmenu; X set_cursor(&pick9_cursor); X } X Xinit_point_adding(x, y) Xint x, y; X{ X int px, py; X X if ((cur_line = line_search(x, y, TOLERANCE, &px, &py)) != NULL) { X if (cur_line->type == T_BOX || cur_line->type == T_ARC_BOX) { X put_msg("Adding points to a box is not allowed"); X return; X } X init_linepointadding(px, py); X } X else if ((cur_spline = spline_search(x,y,TOLERANCE,&px,&py)) != NULL){ X init_splinepointadding(px, py); X } X else { X return; X } X canvas_leftbut_proc = canvas_rightbut_proc = null_proc; X erase_pointmarker(); X } X Xwrapup_pointadding() X{ X show_pointmarker(); X point_adding_selected(); X } X X/************************** spline *******************************/ X Xinit_splinepointadding(px, py) Xint px, py; X{ X find_endpoints(cur_spline->points, px, py, &left_point, &right_point); X set_temp_cursor(&null_cursor); X win_setmouseposition(canvas_win, px, py); X cur_x = px; cur_y = py; X if (left_point == NULL && closed_spline(cur_spline)) { X /* The added_point is between the 1st and 2nd point. */ X left_point = right_point; X right_point = right_point->next; X } X draw_addedlink(INV_PAINT); X canvas_locmove_proc = move_addedpoint; X canvas_middlebut_proc = fix_splinepoint_adding; X } X Xfix_splinepoint_adding(x, y) Xint x, y; X{ X F_point *p; X X if (NULL == (Point_malloc(p))) { X put_msg(Err_mem); X wrapup_pointadding(); X return; X } X clean_up(); X added_point = p; X added_point->x = x; X added_point->y = y; X draw_addedlink(INV_PAINT); X if (-1 == splinepoint_adding(cur_spline, added_point)) X wrapup_pointadding(); X set_action_object(F_ADD_POINT, O_SPLINE); X set_latestspline(cur_spline); X wrapup_pointadding(); X } X X/* XWarning: Do not change the value of the pointers left_point and Xright_point. Added_point is always inserted between left_point Xand right_point, except in two cases. X (1) left_point is NULL, the added_point will be prepended X to the list of points. This case will never X occur if the spline is closed (periodic). X (2) right_point is NULL, the added_point will be appended X to the end of the list. X*/ X Xsplinepoint_adding(spline, added_point) XF_spline *spline; XF_point *added_point; X{ X F_control *c; X X set_temp_cursor(&wait_cursor); X if (int_spline(spline)) { /* Interpolated spline */ X if (NULL == (Control_malloc(c))) { X put_msg(Err_mem); X return(-1); X } X } X if (pointmarker_shown) toggle_splinepointmarker(spline); X draw_spline(spline, ERASE); /* erase old spline */ X if (left_point == NULL) { X added_point->next = spline->points; X spline->points = added_point; X } X else { X added_point->next = right_point; X left_point->next = added_point; X } X X if (int_spline(spline)) { /* Interpolated spline */ X c->next = spline->controls; X spline->controls = c; X remake_control_points(spline); X } X X draw_spline(spline, PAINT); /* draw the modified spline */ X if (pointmarker_shown) toggle_splinepointmarker(spline); X reset_cursor(); X set_modifiedflag(); X return(1); X } X X/*************************** line ********************************/ X Xinit_linepointadding(px, py) Xint px, py; X{ X find_endpoints(cur_line->points,px,py,&left_point,&right_point); X set_temp_cursor(&null_cursor); X win_setmouseposition(canvas_win, px, py); X cur_x = fix_x = px; cur_y = fix_y = py; X if (left_point == NULL && cur_line->type == T_POLYGON) { X left_point = right_point; X right_point = right_point->next; X } X if (left_point != NULL && right_point != NULL) X pw_vector(canvas_win, left_point->x, left_point->y, X right_point->x, right_point->y, INV_PAINT, X cur_line->thickness, cur_line->style, cur_line->style_val); X draw_addedlink(INV_PAINT); X if (latexline_mode || latexarrow_mode) { X canvas_locmove_proc = latex_elasticline; X canvas_middlebut_proc = mm_fix_linepoint_adding; X } X if( (mountain_mode || manhattan_mode) && X (left_point == NULL || right_point == NULL) ) X { X canvas_locmove_proc = determine_angle; X canvas_middlebut_proc = mm_fix_linepoint_adding; X } X else X { X canvas_locmove_proc = move_addedpoint; X canvas_middlebut_proc = fix_linepoint_adding; X } X } X Xfix_linepoint_adding(x, y) Xint x, y; X{ X F_point *p; X X if (NULL == (Point_malloc(p))) { X put_msg(Err_mem); X wrapup_pointadding(); X return; X } X clean_up(); X added_point = p; X added_point->x = x; X added_point->y = y; X draw_addedlink(INV_PAINT); X linepoint_adding(cur_line, added_point); X set_action_object(F_ADD_POINT, O_POLYLINE); X set_latestline(cur_line); X wrapup_pointadding(); X } X Xmm_fix_linepoint_adding() X{ X F_point *p; X X if (NULL == (Point_malloc(p))) { X put_msg(Err_mem); X wrapup_pointadding(); X return; X } X clean_up(); X added_point = p; X added_point->x = cur_x; X added_point->y = cur_y; X draw_addedlink(INV_PAINT); X linepoint_adding(cur_line, added_point); X set_action_object(F_ADD_POINT, O_POLYLINE); X set_latestline(cur_line); X wrapup_pointadding(); X } X Xlinepoint_adding(line, added_point) XF_line *line; XF_point *added_point; X{ X if (pointmarker_shown) toggle_linepointmarker(line); X draw_line(line, ERASE); X if (left_point == NULL) { X added_point->next = line->points; X line->points = added_point; X } X else { X added_point->next = left_point->next; X left_point->next = added_point; X } X draw_line(line, PAINT); X if (pointmarker_shown) toggle_linepointmarker(line); X set_modifiedflag(); X } X X/*******************************************************************/ X X/* XIf (x,y) is close to a point, q, fp points to q and sp points to q->next X(right). However if q is the first point, fp contains NULL and sp points to q. X*/ X Xfind_endpoints(p, x, y, fp, sp) XF_point *p, **fp, **sp; Xint x, y; X{ X int d; X F_point *a = NULL, *b = p; X X if (x == b->x && y == b->y) { X *fp = a; X *sp = b; X return; X } X X for (a = p, b = p->next; b != NULL; a = b, b = b->next){ X if (x == b->x && y == b->y) { X *fp = b; X *sp = b->next; X return; X } X if (close_to_vector(a->x, a->y, b->x, b->y, x, y, 1, 1.0, &d, &d)) { X *fp = a; X *sp = b; X return; X } X } X *fp = a; X *sp = b; X } X Xdraw_addedlink(op) Xint op; X{ X if (left_point != NULL) { X pw_vector(canvas_win, left_point->x, left_point->y, X cur_x, cur_y, op, 1, SOLID_LINE, 0.0); X } X if (right_point != NULL) { X pw_vector(canvas_win, right_point->x, X right_point->y, cur_x, cur_y, op, 1, SOLID_LINE, 0.0); X } X } X Xmove_addedpoint(x, y) Xint x, y; X{ X draw_addedlink(INV_PAINT); X cur_x = x; X cur_y = y; X draw_addedlink(INV_PAINT); X } END_OF_FILE if test 7922 -ne `wc -c <'addpt.c'`; then echo shar: \"'addpt.c'\" unpacked with wrong size! fi # end of 'addpt.c' fi if test -f 'copy.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'copy.c'\" else echo shar: Extracting \"'copy.c'\" \(8048 characters\) sed "s/^X//" >'copy.c' <<'END_OF_FILE' X/* X * FIG : Facility for Interactive Generation of figures X * X * Copyright (c) 1985 by Supoj Sutanthavibul (supoj@sally.UTEXAS.EDU) X * January 1985. X * 1st revision : Aug 1985. X * X * %W% %G% X*/ X#include "fig.h" X#include "resources.h" X#include "alloc.h" X#include "func.h" X#include "object.h" X#include "paintop.h" X X#define TOLERANCE 7 X Xextern (*canvas_kbd_proc)(); Xextern (*canvas_locmove_proc)(); Xextern (*canvas_leftbut_proc)(); Xextern (*canvas_middlebut_proc)(); Xextern (*canvas_rightbut_proc)(); Xextern (*return_proc)(); Xextern null_proc(); Xextern set_popupmenu(); Xextern F_line *line_search(), *copy_line(); Xextern F_arc *arc_search(), *copy_arc(); Xextern F_ellipse *ellipse_search(), *copy_ellipse(); Xextern F_text *text_search(), *copy_text(); Xextern F_spline *spline_search(), *copy_spline(); Xextern F_compound *compound_search(), *copy_compound(); X Xextern F_compound objects; X Xextern int copy_selected(); Xextern int init_copy(); X Xcopy_selected() X{ X canvas_kbd_proc = null_proc; X canvas_locmove_proc = null_proc; X canvas_leftbut_proc = init_copy; X canvas_middlebut_proc = null_proc; X canvas_rightbut_proc = set_popupmenu; X return_proc = copy_selected; X set_cursor(&pick15_cursor); X reset_action_on(); X } X Xinit_copy(x, y) Xint x, y; X{ X F_line *l, *line; X F_ellipse *e, *ellipse; X F_text *t, *text; X F_spline *s, *spline; X F_arc *a, *arc; X F_compound *c, *compound; X int px, py; X X if ((c = compound_search(x, y, TOLERANCE, &px, &py)) != NULL) { X compound = copy_compound(c); X erase_pointmarker(); X set_temp_cursor(&null_cursor); X win_setmouseposition(canvas_win, px, py); X clean_up(); X set_action_object(F_CREATE, O_COMPOUND); X insert_compound(&objects.compounds, compound); X set_latestcompound(compound); X init_compounddragging(compound, px, py); X } X else if ((l = line_search(x, y, TOLERANCE, &px, &py)) != NULL) { X line = copy_line(l); X erase_pointmarker(); X set_temp_cursor(&null_cursor); X win_setmouseposition(canvas_win, px, py); X clean_up(); X set_action_object(F_CREATE, O_POLYLINE); X insert_line(&objects.lines, line); X set_latestline(line); X init_linedragging(line, px, py); X } X else if ((t = text_search(x, y)) != NULL) { X text = copy_text(t); X erase_pointmarker(); X set_temp_cursor(&null_cursor); X clean_up(); X set_action_object(F_CREATE, O_TEXT); X insert_text(&objects.texts, text); X set_latesttext(text); X init_textdragging(text, x, y); X } X else if ((e = ellipse_search(x, y, TOLERANCE, &px, &py)) != NULL) { X ellipse = copy_ellipse(e); X erase_pointmarker(); X set_temp_cursor(&null_cursor); X win_setmouseposition(canvas_win, px, py); X clean_up(); X set_action_object(F_CREATE, O_ELLIPSE); X insert_ellipse(&objects.ellipses, ellipse); X set_latestellipse(ellipse); X init_ellipsedragging(ellipse, px, py); X } X else if ((a = arc_search(x, y, TOLERANCE, &px, &py)) != NULL) { X arc = copy_arc(a); X erase_pointmarker(); X set_temp_cursor(&null_cursor); X win_setmouseposition(canvas_win, px, py); X clean_up(); X set_action_object(F_CREATE, O_ARC); X insert_arc(&objects.arcs, arc); X set_latestarc(arc); X init_arcdragging(arc, px, py); X } X else if ((s = spline_search(x, y, TOLERANCE, &px, &py)) != NULL) { X spline = copy_spline(s); X erase_pointmarker(); X set_temp_cursor(&null_cursor); X win_setmouseposition(canvas_win, px, py); X clean_up(); X set_action_object(F_CREATE, O_SPLINE); X insert_spline(&objects.splines, spline); X set_latestspline(spline); X init_splinedragging(spline, px, py); X } X else X return; X canvas_leftbut_proc = canvas_rightbut_proc = null_proc; X } X XF_arc * Xcopy_arc(a) XF_arc *a; X{ X F_arc *arc; X X if (NULL == (Arc_malloc(arc))) { X put_msg(Err_mem); X return(NULL); X } X *arc = *a; X arc->next = NULL; X return(arc); X } X XF_ellipse * Xcopy_ellipse(e) XF_ellipse *e; X{ X F_ellipse *ellipse; X X if (NULL == (Ellipse_malloc(ellipse))) { X put_msg(Err_mem); X return(NULL); X } X *ellipse = *e; X ellipse->next = NULL; X return(ellipse); X } X XF_line * Xcopy_line(l) XF_line *l; X{ X F_line *line; X F_point *p, *point, *last_point; X X if (NULL == (Line_malloc(line))) { X put_msg(Err_mem); X return(NULL); X } X *line = *l; X if (NULL == (Point_malloc(point))) { X put_msg(Err_mem); X free((char *)line); X return(NULL); X } X line->points = point; X last_point = point; X p = l->points; X *point = *p; X point->next = NULL; X for (p = p->next; p != NULL; p = p->next) { X last_point->next = Point_malloc(point); X if (point == NULL) return(NULL); X *point = *p; X point->next = NULL; X last_point = point; X } X line->next = NULL; X return(line); X } X XF_spline * Xcopy_spline(s) XF_spline *s; X{ X F_spline *spline; X F_point *p, *point, *last_point; X F_control *cntrl_pnt, *cp, *last_cntrl_pnt; X X if (NULL == (Spline_malloc(spline))) { X put_msg(Err_mem); X return(NULL); X } X *spline = *s; X spline->next = NULL; X X if (NULL == (Point_malloc(point))) { X put_msg(Err_mem); X free((char *)spline); X return(NULL); X } X last_point = spline->points = point; X p = s->points; X *point = *p; X for (p = p->next; p != NULL; p = p->next) { X last_point->next = Point_malloc(point); X if (point == NULL) return(NULL); X *point = *p; X last_point = point; X } X last_point->next = NULL; X X spline->controls = NULL; X if (s->controls == NULL) return(spline); X X if (NULL == (Control_malloc(cntrl_pnt))) { X put_msg(Err_mem); X free((char *)spline); X free((char *)point); X return(NULL); X } X last_cntrl_pnt = spline->controls = cntrl_pnt; X cp = s->controls; X *cntrl_pnt = *cp; X for (cp = cp->next; cp != NULL; cp = cp->next) { X last_cntrl_pnt->next = Control_malloc(cntrl_pnt); X if (cntrl_pnt == NULL) return(NULL); X *cntrl_pnt = *cp; X last_cntrl_pnt = cntrl_pnt; X } X last_cntrl_pnt->next = NULL; X X return(spline); X } X XF_text * Xcopy_text(t) XF_text *t; X{ X F_text *text; X extern char *calloc(); X X if (NULL == (Text_malloc(text))) { X put_msg(Err_mem); X return(NULL); X } X *text = *t; X text->cstring = calloc((unsigned)(strlen(t->cstring)+1), sizeof(char)); X if (text->cstring == NULL) { X free((char*)text); X text = NULL; X put_msg(Err_mem); X return(NULL); X } X strcpy(text->cstring, t->cstring); X text->next = NULL; X return(text); X } X XF_compound * Xcopy_compound(c) XF_compound *c; X{ X F_ellipse *e, *ee; X F_arc *a, *aa; X F_line *l, *ll; X F_spline *s, *ss; X F_text *t, *tt; X F_compound *cc, *ccc, *compound; X X if (NULL == (Compound_malloc(compound))) { X put_msg(Err_mem); X return(NULL); X } X compound->nwcorner = c->nwcorner; X compound->secorner = c->secorner; X compound->arcs = NULL; X compound->ellipses = NULL; X compound->lines = NULL; X compound->splines = NULL; X compound->texts = NULL; X compound->compounds = NULL; X compound->next = NULL; X for (e = c->ellipses; e != NULL; e = e->next) { X if (NULL == (ee = copy_ellipse(e))) { X put_msg(Err_mem); X return(NULL); X } X insert_ellipse(&compound->ellipses, ee); X } X for (a = c->arcs; a != NULL; a = a->next) { X if (NULL == (aa = copy_arc(a))) { X put_msg(Err_mem); X return(NULL); X } X insert_arc(&compound->arcs, aa); X } X for (l = c->lines; l != NULL; l = l->next) { X if (NULL == (ll = copy_line(l))) { X put_msg(Err_mem); X return(NULL); X } X insert_line(&compound->lines, ll); X } X for (s = c->splines; s != NULL; s = s->next) { X if (NULL == (ss = copy_spline(s))) { X put_msg(Err_mem); X return(NULL); X } X insert_spline(&compound->splines, ss); X } X for (t = c->texts; t != NULL; t = t->next) { X if (NULL == (tt = copy_text(t))) { X put_msg(Err_mem); X return(NULL); X } X insert_text(&compound->texts, tt); X } X for (cc = c->compounds; cc != NULL; cc = cc->next) { X if (NULL == (ccc = copy_compound(cc))) { X put_msg(Err_mem); X return(NULL); X } X insert_compound(&compound->compounds, ccc); X } X return(compound); X } END_OF_FILE if test 8048 -ne `wc -c <'copy.c'`; then echo shar: \"'copy.c'\" unpacked with wrong size! fi # end of 'copy.c' fi if test -f 'draw.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'draw.c'\" else echo shar: Extracting \"'draw.c'\" \(8203 characters\) sed "s/^X//" >'draw.c' <<'END_OF_FILE' X/* X * FIG : Facility for Interactive Generation of figures X * X * Copyright (c) 1988 by Supoj Sutanthavibul (supoj@sally.UTEXAS.EDU) X * March 1988. X * X * %W% %G% X*/ X#include "fig.h" X#include "resources.h" X#include "object.h" X#include "paintop.h" X Xextern int pointmarker_shown, compoundbox_shown; Xextern int background_color, foreground_color; X X/* COMMENTED OUT Xerase_objects(objects) XF_compound *objects; X{ X erase_arcs(objects->arcs); X erase_ellipses(objects->ellipses); X erase_lines(objects->lines); X erase_texts(objects->texts); X erase_splines(objects->splines); X erase_compounds(objects->compounds); X } X*/ X Xerase_splines(splines) XF_spline *splines; X{ X F_spline *s; X X for (s = splines; s != NULL; s = s->next) { X if (pointmarker_shown) toggle_splinepointmarker(s); X draw_spline(s, ERASE); X }; X } X Xerase_ellipses(ellipses) XF_ellipse *ellipses; X{ X F_ellipse *e; X X for (e = ellipses; e != NULL; e = e->next) { X if (pointmarker_shown) toggle_ellipsepointmarker(e); X draw_ellipse(e, background_color); X }; X } X Xerase_arcs(arcs) XF_arc *arcs; X{ X F_arc *a; X X for (a = arcs; a != NULL; a = a->next) { X if (pointmarker_shown) toggle_arcpointmarker(a); X draw_arc(a, background_color); X }; X } X Xerase_compounds(compounds) XF_compound *compounds; X{ X F_compound *c; X X for (c = compounds; c != NULL; c = c->next) { X if (compoundbox_shown) draw_compoundbox(c, INV_PAINT); X erase_compound(c); X }; X } X Xerase_lines(lines) XF_line *lines; X{ X F_line *l; X X for (l = lines; l != NULL; l = l->next) { X if (pointmarker_shown) toggle_linepointmarker(l); X draw_line(l, ERASE); X }; X } X Xerase_texts(texts) XF_text *texts; X{ X F_text *t; X X for (t = texts; t != NULL; t = t->next) { X draw_text(t, INV_PAINT); X }; X } X X/* Xdraw_objects(objects) XF_compound *objects; X{ X draw_arcs(objects->arcs); X draw_ellipses(objects->ellipses); X draw_lines(objects->lines); X draw_texts(objects->texts); X draw_splines(objects->splines); X draw_compounds(objects->compounds); X } X*/ X Xdraw_ellipses(ellipses) XF_ellipse *ellipses; X{ X F_ellipse *e; X X for (e = ellipses; e != NULL; e = e->next) { X draw_ellipse(e, foreground_color); X if (pointmarker_shown) toggle_ellipsepointmarker(e); X }; X } X Xdraw_arcs(arcs) XF_arc *arcs; X{ X F_arc *a; X X for (a = arcs; a != NULL; a = a->next) { X draw_arc(a, foreground_color); X if (pointmarker_shown) toggle_arcpointmarker(a); X }; X } X Xdraw_lines(lines) XF_line *lines; X{ X F_line *l; X X for (l = lines; l != NULL; l = l->next) { X draw_line(l, PAINT); X if (pointmarker_shown) X toggle_linepointmarker(l); X } X } X Xdraw_splines(splines) XF_spline *splines; X{ X F_spline *s; X X for (s = splines; s != NULL; s = s->next) { X draw_spline(s, PAINT); X if (pointmarker_shown) toggle_splinepointmarker(s); X }; X } X Xdraw_texts(texts) XF_text *texts; X{ X F_text *t; X X for (t = texts; t != NULL; t = t->next) { X draw_text(t, PAINT); X }; X } X Xdraw_compounds(compounds) XF_compound *compounds; X{ X F_compound *c; X X for (c = compounds; c != NULL; c = c->next) { X draw_compound(c); X if (compoundbox_shown) draw_compoundbox(c, INV_PAINT); X }; X } X X/* draw arrow heading from (x1, y1) to (x2, y2) */ X Xdraw_arrow(x1, y1, x2, y2, arrow, op) Xint x1, y1, x2, y2, op; XF_arrow *arrow; X{ X float x, y, xb, yb, dx, dy, l, sina, cosa; X int xc, yc, xd, yd; X float wid = arrow->wid, ht = arrow->ht; X X dx = x2 - x1; dy = y1 - y2; X l = sqrt((double)(dx*dx + dy*dy)); X if(l == 0) X return; X sina = dy / l; cosa = dx / l; X xb = x2*cosa - y2*sina; X yb = x2*sina + y2*cosa; X x = xb - ht; X y = yb - wid / 2; X xc = x*cosa + y*sina + .5; X yc = -x*sina + y*cosa + .5; X y = yb + wid / 2; X xd = x*cosa + y*sina + .5; X yd = -x*sina + y*cosa + .5; X pw_vector(canvas_win, xc, yc, x2, y2, op, X (int) arrow->thickness, arrow->style, 0.0); X pw_vector(canvas_win, xd, yd, x2, y2, op, X (int) arrow->thickness, arrow->style, 0.0); X } X Xdraw_spline(spline, op) XF_spline *spline; Xint op; X{ X if (int_spline(spline)) X draw_intspline(spline, op); X else if (spline->type == T_CLOSED_NORMAL) X draw_closed_spline(spline, op); X else if (spline->type == T_OPEN_NORMAL) X draw_open_spline(spline, op); X } X X#define STACK_DEPTH 32 Xtypedef struct stack { X float x1, y1, x2, y2, x3, y3, x4, y4; X } X Stack; Xstatic Stack stack[20]; Xstatic Stack *stack_top; Xstatic int stack_count; X Xclear_stack() X{ X stack_top = stack; X stack_count = 0; X } X Xpush(x1, y1, x2, y2, x3, y3, x4, y4) Xfloat x1, y1, x2, y2, x3, y3, x4, y4; X{ X stack_top->x1 = x1; X stack_top->y1 = y1; X stack_top->x2 = x2; X stack_top->y2 = y2; X stack_top->x3 = x3; X stack_top->y3 = y3; X stack_top->x4 = x4; X stack_top->y4 = y4; X stack_top++; X stack_count++; X } X Xint Xpop(x1, y1, x2, y2, x3, y3, x4, y4) Xfloat *x1, *y1, *x2, *y2, *x3, *y3, *x4, *y4; X{ X if (stack_count == 0) return(0); X stack_top--; X stack_count--; X *x1 = stack_top->x1; X *y1 = stack_top->y1; X *x2 = stack_top->x2; X *y2 = stack_top->y2; X *x3 = stack_top->x3; X *y3 = stack_top->y3; X *x4 = stack_top->x4; X *y4 = stack_top->y4; X return(1); X } X Xdraw_line(line, op) XF_line *line; Xint op; X{ X F_point *point; X XPoint *points, *pptr; X int npoints; X int xx, yy, x, y; X X /* fill the object first then draw outline */ X fill_object(line,op); X X if (line->type == T_ARC_BOX) /* box with rounded corners */ X { X draw_arc_box(line,op); X return; X } X X point = line->points; X /* get and save first point */ X x = point->x; X y = point->y; X if (line->points->next == NULL) { /* A single point */ X XDrawPoint(tool_d, canvas_win, gccache[op], x, y); X return; X } X if (line->back_arrow) /* backward arrow */ X draw_arrow(point->next->x, point->next->y, x, y, X line->back_arrow, op); X if (line->style == SOLID_LINE) /* accumulate the points for solid line */ X { X npoints = 0; X /* count number of points in this object */ X for ( ; point != NULL; point = point->next) X npoints++; X /* accumulate the points in an array */ X if ((points = (XPoint *) malloc(npoints*sizeof(XPoint))) == 0) X { X fprintf(stderr,"draw_line(): No memory\n"); X return; X } X pptr = points; X } X for (point=line->points; point != NULL; point = point->next) { X if (line->style == SOLID_LINE) X { X pptr->x = point->x; X pptr->y = point->y; X pptr++; X } X else /* draw dashed or dotted line segment by segment X otherwise when moving one segment later there X is an alignment problem with the dashes */ X pw_vector(canvas_win, x, y, point->x, point->y, op, X line->thickness, line->style, line->style_val); X xx = x; yy = y; X x = point->x; X y = point->y; X } X if (line->style == SOLID_LINE) X { X pw_lines(canvas_win, points, npoints, op, X line->thickness, line->style, line->style_val, 0); X free(points); X } X if (line->for_arrow) X draw_arrow(xx, yy, x, y, line->for_arrow, op); X } X Xdraw_arc_box(line, op) XF_line *line; Xint op; X { X F_point *point; X int xmin,xmax,ymin,ymax; X int thick, style; X float val; X int radius,diam; X GC gc; X X thick = line->thickness; X if (thick == 0) X return; X point = line->points; X style = line->style; X val = line->style_val; X radius = line->radius; X X xmin = xmax = point->x; X ymin = ymax = point->y; X while (point->next) /* find lower left (upper-left on screen) */ X { /* and upper right (lower right on screen) */ X point = point->next; X if (point->x < xmin) X xmin = point->x; X else if (point->x > xmax) X xmax = point->x; X if (point->y < ymin) X ymin = point->y; X else if (point->y > ymax) X ymax = point->y; X } X set_line_stuff(thick,style,val,op); X gc = gccache[op]; X diam = 2*radius; X XDrawArc(tool_d, canvas_win, gc, xmin, ymin, X diam, diam, 90*64, 90*64); X XDrawLine(tool_d, canvas_win, gc, xmin, ymin+radius, xmin, ymax-radius+1); X XDrawArc(tool_d, canvas_win, gc, xmin, ymax-diam, X diam, diam, 180*64, 90*64); X XDrawLine(tool_d, canvas_win, gc, xmin+radius, ymax, xmax-radius+1, ymax); X XDrawArc(tool_d, canvas_win, gc, xmax-diam, ymax-diam, X diam, diam, 270*64, 90*64); X XDrawLine(tool_d, canvas_win, gc, xmax, ymax-radius, xmax, ymin+radius-1); X XDrawArc(tool_d, canvas_win, gc, xmax-diam, ymin, X diam, diam, 0*64, 90*64); X XDrawLine(tool_d, canvas_win, gc, xmax-radius, ymin, xmin+radius-1, ymin); X } END_OF_FILE if test 8203 -ne `wc -c <'draw.c'`; then echo shar: \"'draw.c'\" unpacked with wrong size! fi # end of 'draw.c' fi if test -f 'global.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'global.c'\" else echo shar: Extracting \"'global.c'\" \(7384 characters\) sed "s/^X//" >'global.c' <<'END_OF_FILE' X/* X * FIG : Facility for Interactive Generation of figures X * X * Copyright (c) 1985 by Supoj Sutanthavibul (supoj@sally.UTEXAS.EDU) X * January 1985. X * 1st revision : Aug 1985. X * X * %W% %G% X*/ X#include "fig.h" X#define GLOBAL /* force resources and font to allocate space */ X#include "resources.h" X#include "font.h" X#undef GLOBAL X#include "const.h" X#include "func.h" X#include "object.h" X#include "paintop.h" X X/********************** canvas variables ************************/ X Xint (*canvas_kbd_proc)(); Xint (*canvas_locmove_proc)(); Xint (*canvas_leftbut_proc)(); Xint (*canvas_middlebut_proc)(); Xint (*canvas_rightbut_proc)(); Xint (*return_proc)(); Xint fix_x, fix_y; Xint cur_x, cur_y; X Xint action_on = 0; Xint pointmarker_shown = 0; Xint compoundbox_shown = 0; X Xint ICON_COLUMN; Xint CANVAS_HEIGHT, CANVAS_WIDTH; Xint PANEL_WID, PANEL2_WID; Xint SIDERULER_WIDTH, SIDERULER_HEIGHT; Xint TOPRULER_WIDTH, TOPRULER_HEIGHT; X Xint num_point; XF_point *first_point, *cur_point; X X/************************ Objects **********************/ X X/* XObject_tails (not always) point to the last objects in each linked list Xin objects. It is used to speed up an undo-read action. When a file Xis read, the lists of the objects read are stored in saved_objects Xand the pointers to tails of the lists in objects would kept in object_tails Xthe "next" members of the tail objects point to the lists in saved_objects. XTo undo, one would only set all the "next" of tail object to NULL; X XObject_tails is also used for speeding up the undo of compound breaking Xaction in similar fashion. X*/ XF_compound object_tails = {NULL,NULL,NULL,NULL,NULL,NULL,NULL}; XF_compound objects = {NULL,NULL,NULL,NULL,NULL,NULL,NULL}; XF_compound saved_objects = {NULL,NULL,NULL,NULL,NULL,NULL,NULL}; XF_compound *saved_compound = NULL; /* Saved the broken compound */ X X/************************* Undo variables **********************/ X Xint last_action = F_NULL; Xint last_object; Xint last_axis; Xint last_rotateangle; Xstruct {int x, y;} last_position, new_position; XF_point *moved_point; XF_point *deleted_point; XF_point *added_point; XF_point *left_point; XF_point *right_point; Xint movedpoint_num; X X/*************************** Modes ****************************/ X Xint manhattan_mode = 0; Xint mountain_mode = 0; Xint autoforwardarrow_mode = 0; Xint autobackwardarrow_mode = 0; Xint latexline_mode = 0; Xint latexarrow_mode = 0; Xint magnet_mode = 0; Xint line_thickness = 1; Xint line_style = SOLID_LINE; Xint cur_radius = 7; Xint pen_size = 0; Xint pen_type = 0; Xint flip_axis = -1; Xint rotate_angle = 0; Xint fill_mode = 0; Xint print_landscape = 0; /* def. orientation for printer */ Xint size_button; /* font size button value */ Xint font_button = 0; /* font button value */ Xint type_button = T_LEFT_JUSTIFIED; /* text type button value */ Xint cur_font; /* font of current text object */ Xint cur_fontsize; /* size of current text object font */ Xint cur_areafill = 1; Xfloat cur_dashlength = 4; Xfloat cur_dotgap = 3; Xfloat cur_styleval = 0.0; Xfloat cur_angle = 0.0; Xint cur_color = BLACK; Xint cur_textstyle = PLAIN; Xint cur_textjust = T_LEFT_JUSTIFIED; X /* line thicknesses for each gc */ Xint gc_thickness[NUMOPS] = {-1,-1,-1,-1}; Xint gc_line_style[NUMOPS] = {-1,-1,-1,-1}; X X/************************* Flags/Resources *******************************/ X Xint cur_command = -1; X X/* Resources */ X XappresStruct appres; X X/************************ Status ****************************/ X Xchar directory[1024]; Xchar current_file[200] = ""; Xint cur_printer=0; Xchar *printer=""; Xchar *printer_list[MAXPRINTERS]={"Specify","Default","File"}; Xint figure_modified = 0; X X/************************ Error messages ****************************/ X Xchar Err_incomp[] = "Incomplete %s object at line %d."; Xchar Err_mem[] = "Running out of memory."; X X/************************ Routines ****************************/ X Xnull_proc() X{ X } X Xset_modifiedflag() X{ X figure_modified = 1; X } X Xset_action_on() X{ X action_on = 1; X } X Xreset_action_on() X{ X action_on = 0; X } X Xreset_cursor() X{ X XDefineCursor(tool_d, canvas_win, (Cursor)cur_cursor->bitmap); X } X Xset_temp_cursor(cursor) XCURSOR cursor; X{ X XDefineCursor(tool_d, canvas_win, (Cursor)cursor->bitmap); X } X Xset_cursor(cursor) XCURSOR cursor; X{ X cur_cursor = cursor; X XDefineCursor(tool_d, canvas_win, (Cursor)cursor->bitmap); X } X Xset_lastaxis(a) Xint a; X{ X last_axis = a; X } X Xset_lastangle(a) Xint a; X{ X last_rotateangle = a; X } X Xset_lastposition(x, y) Xint x, y; X{ X last_position.x = x; X last_position.y = y; X } X Xset_action(action) Xint action; X{ X last_action = action; X } X Xset_action_object(action, object) Xint action, object; X{ X last_action = action; X last_object = object; X } X X/* XClean_up should be called before committing a user's request. XClean_up will attempt to free all the allocated memories which Xresulted from delete/remove action. It will set the last_action Xto F_NULL. Thus this routine should be before set_action_object(). Xif they are to be called in the same routine. X*/ Xclean_up() X{ X if (last_action == F_REMOVE) { X switch (last_object) { X case O_ARC : X free_arc(&saved_objects.arcs); X break; X case O_COMPOUND : X free_compound(&saved_objects.compounds); X break; X case O_ELLIPSE : X free_ellipse(&saved_objects.ellipses); X break; X case O_POLYLINE : X free_line(&saved_objects.lines); X break; X case O_SPLINE : X free_spline(&saved_objects.splines); X break; X case O_TEXT : X free_text(&saved_objects.texts); X break; X case O_ALL_OBJECT : X free_arc(&saved_objects.arcs); X free_compound(&saved_objects.compounds); X free_ellipse(&saved_objects.ellipses); X free_line(&saved_objects.lines); X free_spline(&saved_objects.splines); X free_text(&saved_objects.texts); X break; X } X } X else if (last_action == F_DELETE_POINT) { X free((char*)deleted_point); X deleted_point = NULL; X } X else if (last_action == F_REMOVE_ALL || last_action == F_EDIT) { X free_arc(&saved_objects.arcs); X free_compound(&saved_objects.compounds); X free_ellipse(&saved_objects.ellipses); X free_line(&saved_objects.lines); X free_spline(&saved_objects.splines); X free_text(&saved_objects.texts); X } X else if (last_action == F_BREAK) { X free_compound(&saved_compound); X } X else if (last_action == F_CREATE) { X saved_objects.arcs = NULL; X saved_objects.compounds = NULL; X saved_objects.ellipses = NULL; X saved_objects.lines = NULL; X saved_objects.splines = NULL; X saved_objects.texts = NULL; X } X else if (last_action == F_TURN) { X if (last_object == O_POLYLINE) { X free_line(&saved_objects.lines); X } X else { /* last_object == O_SPLINE */ X free_spline(&saved_objects.splines); X } X } X last_action = F_NULL; X } X Xset_latestarc(arc) XF_arc *arc; X{ X saved_objects.arcs = arc; X } X Xset_latestcompound(compound) XF_compound *compound; X{ X saved_objects.compounds = compound; X } X Xset_latestellipse(ellipse) XF_ellipse *ellipse; X{ X saved_objects.ellipses = ellipse; X } X Xset_latestline(line) XF_line *line; X{ X saved_objects.lines = line; X } X Xset_latestspline(spline) XF_spline *spline; X{ X saved_objects.splines = spline; X } X Xset_latesttext(text) XF_text *text; X{ X saved_objects.texts = text; X } END_OF_FILE if test 7384 -ne `wc -c <'global.c'`; then echo shar: \"'global.c'\" unpacked with wrong size! fi # end of 'global.c' fi if test -f 'text.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'text.c'\" else echo shar: Extracting \"'text.c'\" \(7248 characters\) sed "s/^X//" >'text.c' <<'END_OF_FILE' X/* X * FIG : Facility for Interactive Generation of figures X * X * Copyright (c) 1985 by Supoj Sutanthavibul (supoj@sally.UTEXAS.EDU) X * January 1985. X * 1st revision : Aug 1985. X * 2nd revision : Feb 1988. X * X * %W% %G% X*/ X#include "fig.h" X#include "resources.h" X#include "alloc.h" X#include "const.h" X#include "font.h" X#include "func.h" X#include "object.h" X#include "paintop.h" X Xextern (*canvas_kbd_proc)(); Xextern (*canvas_locmove_proc)(); Xextern (*canvas_leftbut_proc)(); Xextern (*canvas_middlebut_proc)(); Xextern (*canvas_rightbut_proc)(); Xextern null_proc(); Xextern char *calloc(); Xextern set_popupmenu(); Xextern F_text *text_search(); Xextern PIX_FONT lookfont(); X Xextern int font_button, size_button; Xextern int type_button; X Xextern int cur_font, cur_fontsize; Xextern char_handler(); Xextern int cur_x, cur_y; Xextern char prefix[], suffix[]; Xextern int leng_prefix, leng_suffix; Xextern int cur_color; Xextern int cur_textstyle; Xextern int cur_textjust; Xextern float cur_angle; X Xextern F_compound objects; X Xstatic int char_ht, char_wid; Xstatic int base_x, base_y; Xstatic F_text *cur_text; Xstatic PR_SIZE tsize; Xstatic PR_SIZE ssize; X XF_text *create_text(); Xstatic finish_text_input(); Xstatic finish_n_start(); Xstatic init_text_input(); Xstatic wrap_up(); X Xstatic Xfinish_n_start(x, y) X{ X wrap_up(); X init_text_input(x, y); X } X Xstatic Xfinish_text_input() X{ X wrap_up(); X text_drawing_selected(); X } X Xstatic Xwrap_up() X{ X PR_SIZE size; X int kbd_received; X X reset_action_on(); X kbd_received = terminate_char_handler(); X if ( ! kbd_received) return; X X if (cur_text == NULL) { /* a brand new text */ X if (leng_prefix == 0) return; X cur_text = create_text(); X insert_text(&objects.texts, cur_text); X } X else { /* existing text modified */ X strcat(prefix, suffix); X leng_prefix += leng_suffix; X if (leng_prefix == 0) { X delete_text(&objects.texts, cur_text); X cfree(cur_text->cstring); X free((char*)cur_text); X return; X } X if (strlen(cur_text->cstring) >= leng_prefix) { X strcpy(cur_text->cstring, prefix); X } X else { /* free old and allocate new */ X cfree(cur_text->cstring); X cur_text->cstring = calloc((unsigned)(leng_prefix+1), sizeof(char)); X if (cur_text->cstring != NULL) X strcpy(cur_text->cstring, prefix); X } X size = pf_textwidth(cur_text->font, cur_text->size, leng_prefix, prefix); X cur_text->height = size.y; X cur_text->length = size.x; /* in pixels */ X } X draw_text(cur_text, PAINT); X clean_up(); X set_action_object(F_TEXT, O_TEXT); X set_latesttext(cur_text); X set_modifiedflag(); X } X Xstatic Xinit_text_input(x, y) Xint x, y; X{ X int basx; X X cur_x = x; X cur_y = y; X X set_action_on(); X canvas_kbd_proc = char_handler; X canvas_middlebut_proc = finish_text_input; X canvas_leftbut_proc = finish_n_start; X canvas_rightbut_proc = null_proc; X X /* set current font info to indicator button settings */ X cur_fontsize = size_button; X cur_font = font_button; X cur_textjust = type_button; X X /* load the X font and get its id for this font, size */ X canvas_font = lookfont(cur_font, cur_fontsize); X char_ht = char_height(canvas_font); X char_wid = char_width(canvas_font); X X if ((cur_text = text_search(cur_x, cur_y)) == NULL) { /* new text input */ X leng_prefix = leng_suffix = 0; X *suffix = 0; X prefix[leng_prefix] = '\0'; X base_x = cur_x; X base_y = cur_y; X } X else { /* clicked on existing text */ X /* leng_prefix is # of char in the text before the cursor */ X leng_suffix = strlen(cur_text->cstring); X basx = cur_text->base_x; X if (cur_text->type == T_CENTER_JUSTIFIED) X basx -= cur_text->length/2; X else if (cur_text->type == T_RIGHT_JUSTIFIED) X basx -= cur_text->length; X leng_prefix = prefix_length(cur_text->cstring, cur_x - basx); X leng_suffix -= leng_prefix; X cpy_n_char(prefix, cur_text->cstring, leng_prefix); X strcpy(suffix, &cur_text->cstring[leng_prefix]); X tsize = pf_textwidth(cur_text->font, cur_text->size, leng_prefix, prefix); X ssize = pf_textwidth(cur_text->font, cur_text->size, leng_suffix, suffix); X cur_x = base_x = basx; X cur_y = base_y = cur_text->base_y; X cur_x += tsize.x; X cur_font = cur_text->font; X cur_fontsize = cur_text->size; X cur_textjust = cur_text->type; X } X initialize_char_handler(canvas_win, finish_text_input, X base_x, base_y); X } X X/* This procedure is called before any other text stuff here */ X Xtext_drawing_selected() X{ X canvas_kbd_proc = null_proc; X canvas_locmove_proc = null_proc; X canvas_middlebut_proc = null_proc; X canvas_leftbut_proc = init_text_input; X canvas_rightbut_proc = set_popupmenu; X X set_cursor(&pencil_cursor); X } X XF_text * Xcreate_text() X{ X F_text *text; X PR_SIZE size; X X if ((Text_malloc(text)) == NULL) { X put_msg(Err_mem); X return(NULL); X } X text->cstring = calloc((unsigned)(leng_prefix+1), sizeof(char)); X if (text->cstring == NULL) { X put_msg(Err_mem); X free((char *)text); X return(NULL); X } X text->type = cur_textjust;; X text->font = cur_font; /* put in current font number */ X text->size = cur_fontsize; /* added 9/25/89 B.V.Smith */ X text->angle = cur_angle; X text->style = cur_textstyle; X text->color = cur_color; X text->depth = 0; X text->pen = 0; X size = pf_textwidth(text->font, text->size, leng_prefix, prefix); X text->length = size.x; /* in pixels */ X text->height = size.y; /* in pixels */ X text->base_x = base_x; X text->base_y = base_y; X strcpy(text->cstring, prefix); X text->next = NULL; X return(text); X } X Xcpy_n_char(dst, src, n) Xchar *dst, *src; Xint n; X{ X /* src must be longer than n chars */ X X while (n--) *dst++ = *src++; X *dst = '\0'; X } X Xint Xprefix_length(string, where_p) Xchar *string; Xint where_p; X{ X /* c stands for character unit and p for pixel unit */ X int l, len_c, len_p; X int char_wid, where_c; X PR_SIZE size; X X if (canvas_font == NULL) X fprintf(stderr,"Error, in prefix_length, canvas_font = NULL\n"); X len_c = strlen(string); X size = pf_textwidth(cur_text->font, cur_text->size, len_c, string); X len_p = size.x; X if (where_p >= len_p) return(len_c); /* entire string is the preffix */ X X char_wid = char_width(canvas_font); X where_c = where_p / char_wid; /* estimated char position */ X size = pf_textwidth(cur_text->font, cur_text->size, where_c, string); X l = size.x; /* actual lenght (pixels) of string of where_c chars */ X if (l < where_p) { X do { /* add the width of next char to l */ X l += (char_wid = char_advance(canvas_font,string[where_c++])); X } while (l < where_p); X if (l-(char_wid>>1) >= where_p) where_c--; X } X else if (l > where_p) { X do { /* subtract the width of last char from l */ X l -= (char_wid = char_advance(canvas_font,string[--where_c])); X } while (l > where_p); X if (l+(char_wid>>1) >= where_p) where_c++; X } X return(where_c); X } X Xdraw_text(text, op) XF_text *text; Xint op; X{ X PR_SIZE size; X int x; X X x = text->base_x; X if (text->type == T_CENTER_JUSTIFIED || text->type == T_RIGHT_JUSTIFIED) X { X size = pf_textwidth(text->font,text->size,strlen(text->cstring),text->cstring); X if (text->type == T_CENTER_JUSTIFIED) X x -= size.x/2; X else X x -= size.x; X } X pw_text(canvas_win, x, text->base_y, X op, text->font, text->size, text->cstring); X } END_OF_FILE if test 7248 -ne `wc -c <'text.c'`; then echo shar: \"'text.c'\" unpacked with wrong size! fi # end of 'text.c' fi echo shar: End of archive 7 \(of 21\). cp /dev/null ark7isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 21 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 dan ---------------------------------------------------- O'Reilly && Associates argv@sun.com / argv@ora.com Opinions expressed reflect those of the author only.