argv%turnpike@Sun.COM (Dan Heller) (03/06/90)
Submitted-by: Brian Smith <bvsmith@lbl.gov> Posting-number: Volume 6, Issue 18 Archive-name: xfig2/part10 #! /bin/sh # This is a shell archive. Remove anything before this line, then feed it # into a shell via "sh file" or similar. To overwrite existing files, # type "sh file -c". # The tool that generated this appeared in the comp.sources.unix newsgroup; # send mail to comp-sources-unix@uunet.uu.net if you want that tool. # If this archive is complete, you will see the following message at the end: # "End of archive 10 (of 15)." # Contents: xfig/FORMAT1.4 xfig/bound.c xfig/flip.c xfig/main.c # xfig/move.c xfig/scale.c # Wrapped by argv@turnpike on Wed Feb 28 10:53:22 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'xfig/FORMAT1.4' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'xfig/FORMAT1.4'\" else echo shar: Extracting \"'xfig/FORMAT1.4'\" \(9677 characters\) sed "s/^X//" >'xfig/FORMAT1.4' <<'END_OF_FILE' XThe following is the format of fig output (fig 1.4X). X X(0) The only difference between 1.4 and 1.4X is that the interpretation X of the "pen" value in ARC_BOX is now the radius of the corners of the box. X Also, the ARC_BOX is sub-type 4 of POLYLINE. X X(1) The very first line is a comment line containing the name and version: X #FIG 1.4X X X The character # at the first column of a line indicates that the line X is a comment line which will be ignored. X X(2) The first non-comment line consists of two numbers : X X int fig_resolution (pixels/inch) X int coordinate_system (1 : origin is at the lower left corner X 2 : Upper left) X X Fig_resolution is the resolution fig is using for the current file. X It may not be the same as screen resolution (which can be higher or X lower). I assume that a pixel is square, therefore this number X represents drawing resolution in both direction. I've experimented X with fig automatically changing this number according to the resolution X of the monitor it is running on (The screen resolution, width and height X in pixels, not pixel/inch, can be done by doing a ioctl on the /dev/fb). X I've found that for monitors with higher resolution but same size X (19" diagonal), I preferred using the pixels for other things than X having fig occupying most of the screen. Thus I opted for a fixed X pixel-per-inch number which make fig window smaller on higher resolution X monitor (than the standard sun monitor). This however may change in X the future version. X X(3) The rest of the file contains various objects. An object can be one X of six classes (or types). X X i) Ellipse which is a generalization of circle. X ii) Polyline which includes polygon and box. X iii) Spline which includes closed/open control/interpolated spline. X iv) Text. X v) Arc. X vi) Compound object which is composed of one or more objects. X X In the following elaboration on object formats, every value of fig X output are separated by blank characters or new line ('\n'). The X value of the not-used parameters will be -1. X X A number of values are described as unused or not applicable to some X object even though they are defined for those objects. These value X will (hopefully) be used in the future version of fig. The intention X of their uses are the following. X X Value Usage X ----- ----- X area_fill The stipple pattern (which will be align) for X filling object internals. For example, an filled X arc will look like a piece of pie. X X** pen This will be a structure defining the shape of X pen used in drawing objects. It also includes X the the stipple pattern for line filling. X The default pen is a circular pen with black X filling. X X ** In 1.4X, pen is the radius (pixels) of the rounded-corner boxes. X X thickness Every pen has the thickness of one. X Thickness scales the size of a pen. X X depth This value adds a half dimension to fig. X It is useful when we have overlapping filled X objects and we want one to obliterate another. X An object can have only one depth (including X compound object). An object that is in less X depth can obscure the one with greater depth X if they overlap. X X style Only polyline (including polygon and box) can X be rendered with dashed line. However the X objects created when the dash-line mode was on X will be recorded as such. Currently the filter X f2ps (1) is able to render the desired line style X effect on hard copy. Three line styles are defined. X X 0 : SOLID_LINE X 1 : DASH_LINE X 2 : DOTTED_LINE X X style_val For dash style, it is the length of a dash. X For dotted line it indicates the approximated X gap of consecutive dots. X X (3.1) ARC X X First line : X type name (brief description) X ---- ---- ------------------- X int object_code (always 5) X int sub_type (always 1) X int style (See the end of this section) X int line_thickness (pixels, not used) X int color (not used) X int depth (not used) X int pen (not used) X int area_fill (not used) X float style_val (pixels, not used) X int direction (0 : clockwise, 1 : counterclockwise) X int forward_arrow (0: no forward arrow, 1: on) X int backward_arrow (0: no forward arrow, 1: on) X float center_x, center_y (center of the arc) X int x1, y1 (pixels, the 1st point the user entered) X int x2, y2 (pixels, the 2nd point) X int x3, y3 (pixels, the last point) X X Forward arrow line (Optional; absent if forward_arrow is 0) : X type name (brief description) X ---- ---- ------------------- X int arrow_type (not used) X int arrow_style (not used) X float arrow_thickness (not used) X float arrow_width (pixels) X float arrow_height (pixels) X X Backward arrow line (Optional; absent if backward_arrow is 0) : X type name (brief description) X ---- ---- ------------------- X int arrow_type (not used) X int arrow_style (not used) X float arrow_thickness (not used) X float arrow_width (pixels) X float arrow_height (pixels) X X (3.2) COMPOUND X X A line with object code 6 signifies the start of a compound. X There are four more numbers on this line which indicate the X upper right corner and the lower left corner of the bounding X box of this compound. A line with object code -6 signifies X the end of the compound. Compound may be nested. X X First line : X type name (brief description) X ---- ---- ------------------- X int object_code (always 6) X int upperright_corner_x (pixels) X int upperright_corner_y (pixels) X int lowerleft_corner_x (pixels) X int lowerleft_corner_y (pixels) X X Subsequent lines : X objects X . X . X X Last line : X -6 X X (3.3) ELLIPSE X X First line : X type name (brief description) X ---- ---- ------------------- X int object_code (always 1) X int sub_type (1 : ellipse defined by radiuses X 2 : ellipse defined by diameters X 3 : circle defined by radius X 4 : circle defined by diameter) X int style (See the end of this section) X int thickness (pixels, not used) X int color (not used) X int depth (not used) X int pen (not used) X int area_fill (not used) X float style_val (pixels, not used) X int direction (always 1) X float angle (radian, the angle of the x-axis) X int center_x, center_y (pixels) X int radius_x, radius_y (pixels) X int start_x, start_y (pixels; the 1st point entered) X int end_x, end_y (pixels; the last point entered) X X (3.4) POLYLINE X X First line : X type name (brief description) X ---- ---- ------------------- X int object_code (always 2) X int sub_type (1 : polyline, 2 : box, X 3 : polygon, 4 : rounded-corner box) X int style (See the end of this section) X int thickness (pixels, not used) X int color (not used) X int depth (not used) X int pen **** (pixels, radius of rounded-corner boxes) X int area_fill (not used) X float style_val (pixels) X int forward_arrow (0: off, 1: on) X int backward_arrow (0: off, 1: on) X X Forward arrow line : same as ARC object X X Backward arrow line : same as ARC object X X Points line : X type name (brief description) X ---- ---- ------------------- X int x1, y1 (pixels) X int x2, y2 (pixels) X . X . X int xn, yn (this will be the same as the 1st X point for polygon and box) X int x, y (always 9999, 9999; marks the end of X point for polygon and box) X X (3.5) SPLINE X X First line : X type name (brief description) X ---- ---- ------------------- X int object_code (always 3) X int sub_type (0 : open spline X 1 : closed spline X 2 : open interpolated spline X 3 : closed interpolated spline) X int style (See the end of this section) X int thickness (pixels, not used) X int color (not used) X int depth (not used) X int pen (not used) X int area_fill (not used) X float style_val (pixels, not used) X int forward_arrow (0: off, 1: on) X int backward_arrow (0: off, 1: on) X X Forward arrow line : same as ARC object X X Backward arrow line : same as ARC object X X Points line : same as POLYLINE object X X Control points line (absent if sub_type is 1 or 2) : X Control points of interpolated spline. There are two control X points for each knots. A section i, of the spline is drawn X using Bezier cubic with the following four points: X (x ,y ), (rx ,ry ), (lx , ly ), (x , y ). X i i i i i+1 i+1 i+1 i+1 X For closed interpolated spline the last pair of control points, X (lxn,lyn) and (rxn,ryn) (which can be ignored), are the same as X (lx1,ly1) and (rx1,ry1) respectively. X X type name (brief description) X ---- ---- ------------------- X float lx1, ly1 (pixels) X float rx1, ry1 (pixels) X float lx2, ly2 (pixels) X float rx2, ry2 (pixels) X . X . X float lxn, lyn (pixels) X float rxn, ryn (pixels) X X (3.6) TEXT X type name (brief description) X ---- ---- ------------------- X int object (always 4) X int sub_type (0 : Left justified X 1 : Center justified X 2 : Right justified) X int font (font number 0-...) X int font_size (point size) X int pen (not used) X int color (not used) X int depth (not used) X int angle (radian, not used, the angle of the X the base line of the string) X int font_style (not used) X int height (pixels) X int length (pixels) X int x, y (pixels, coordinate of the origin X of the string. If sub_type = 0, it is X the lower left corner of the string. X If sub_type = 1, it is the lower X center. Otherwise it is the lower X right corner of the string.) X char string[] (ascii characters; starts after a blank X character following the last number and X ends before the character '\1'. This X character is not part of the string. X Note that the string may contain '\n'.) END_OF_FILE if test 9677 -ne `wc -c <'xfig/FORMAT1.4'`; then echo shar: \"'xfig/FORMAT1.4'\" unpacked with wrong size! fi # end of 'xfig/FORMAT1.4' fi if test -f 'xfig/bound.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'xfig/bound.c'\" else echo shar: Extracting \"'xfig/bound.c'\" \(9642 characters\) sed "s/^X//" >'xfig/bound.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 : April 1988. X * X * %W% %G% X*/ X#include "fig.h" X#include "object.h" X X#define Ninety_deg M_PI_2 X#define One_eighty_deg M_PI X#define Two_seventy_deg (M_PI + M_PI_2) X#define Three_sixty_deg (M_PI + M_PI) X#define round(x) ((int)((x) + .5)) X#define half(z1 ,z2) ((z1+z2)/2.0) X#define max(a, b) (((a) > (b)) ? (a) : (b)) X#define min(a, b) (((a) < (b)) ? (a) : (b)) X Xarc_bound(arc, xmin, ymin, xmax, ymax) XF_arc *arc; Xint *xmin, *ymin, *xmax, *ymax; X{ X float alpha, beta; X double dx, dy, radius; X int bx, by, sx, sy; X X dx = arc->point[0].x - arc->center.x; X dy = arc->center.y - arc->point[0].y; X alpha = atan2(dy, dx); X if (alpha < 0.0) alpha += Three_sixty_deg; X /* compute_angle returns value between 0 to 2PI */ X X radius = sqrt((double)(dx * dx + dy * dy)); X X dx = arc->point[2].x - arc->center.x; X dy = arc->center.y - arc->point[2].y; X beta = atan2(dy, dx); X if (beta < 0.0) beta += Three_sixty_deg; X X bx = max(arc->point[0].x, arc->point[1].x); X bx = max(arc->point[2].x, bx); X by = max(arc->point[0].y, arc->point[1].y); X by = max(arc->point[2].y, by); X sx = min(arc->point[0].x, arc->point[1].x); X sx = min(arc->point[2].x, sx); X sy = min(arc->point[0].y, arc->point[1].y); X sy = min(arc->point[2].y, sy); X X if (arc->direction == 1) { /* counter clockwise */ X if (alpha > beta) { X if (alpha <= 0 || 0 <= beta) X bx = (int)(arc->center.x + radius + 1.0); X if (alpha <= Ninety_deg || Ninety_deg <= beta) X sy = (int)(arc->center.y - radius - 1.0); X if (alpha <= One_eighty_deg || One_eighty_deg <= beta) X sx = (int)(arc->center.x - radius - 1.0); X if (alpha <= Two_seventy_deg || Two_seventy_deg <= beta) X by = (int)(arc->center.y + radius + 1.0); X } X else { X if (0 <= beta && alpha <= 0) X bx = (int)(arc->center.x + radius + 1.0); X if (Ninety_deg <= beta && alpha <= Ninety_deg) X sy = (int)(arc->center.y - radius - 1.0); X if (One_eighty_deg <= beta && alpha <= One_eighty_deg) X sx = (int)(arc->center.x - radius - 1.0); X if (Two_seventy_deg <= beta && alpha <= Two_seventy_deg) X by = (int)(arc->center.y + radius + 1.0); X } X } X else { /* clockwise */ X if (alpha > beta) { X if (beta <= 0 && 0 <= alpha) X bx = (int)(arc->center.x + radius + 1.0); X if (beta <= Ninety_deg && Ninety_deg <= alpha) X sy = (int)(arc->center.y - radius - 1.0); X if (beta <= One_eighty_deg && One_eighty_deg <= alpha) X sx = (int)(arc->center.x - radius - 1.0); X if (beta <= Two_seventy_deg && Two_seventy_deg <= alpha) X by = (int)(arc->center.y + radius + 1.0); X } X else { X if (0 <= alpha || beta <= 0) X bx = (int)(arc->center.x + radius + 1.0); X if (Ninety_deg <= alpha || beta <= Ninety_deg) X sy = (int)(arc->center.y - radius - 1.0); X if (One_eighty_deg <= alpha || beta <= One_eighty_deg) X sx = (int)(arc->center.x - radius - 1.0); X if (Two_seventy_deg <= alpha || beta <= Two_seventy_deg) X by = (int)(arc->center.y + radius + 1.0); X } X } X *xmax = bx; *ymax = by; X *xmin = sx; *ymin = sy; X } X Xcompound_bound(compound, xmin, ymin, xmax, ymax) XF_compound *compound; Xint *xmin, *ymin, *xmax, *ymax; X{ X F_arc *a; X F_ellipse *e; X F_compound *c; X F_spline *s; X F_line *l; X F_text *t; X int bx, by, sx, sy, first = 1; X int llx, lly, urx, ury; X X for (a = compound->arcs; a != NULL; a = a->next) { X arc_bound(a, &sx, &sy, &bx, &by); X if (first) { X first = 0; X llx = sx; lly = sy; X urx = bx; ury = by; X } X else { X llx = min(llx, sx); lly = min(lly, sy); X urx = max(urx, bx); ury = max(ury, by); X } X } X X for (c = compound->compounds; c != NULL; c = c->next) { X compound_bound(c, &sx, &sy, &bx, &by); X if (first) { X first = 0; X llx = sx; lly = sy; X urx = bx; ury = by; X } X else { X llx = min(llx, sx); lly = min(lly, sy); X urx = max(urx, bx); ury = max(ury, by); X } X } X X for (e = compound->ellipses; e != NULL; e = e->next) { X ellipse_bound(e, &sx, &sy, &bx, &by); X if (first) { X first = 0; X llx = sx; lly = sy; X urx = bx; ury = by; X } X else { X llx = min(llx, sx); lly = min(lly, sy); X urx = max(urx, bx); ury = max(ury, by); X } X } X X for (l = compound->lines; l != NULL; l = l->next) { X line_bound(l, &sx, &sy, &bx, &by); X if (first) { X first = 0; X llx = sx; lly = sy; X urx = bx; ury = by; X } X else { X llx = min(llx, sx); lly = min(lly, sy); X urx = max(urx, bx); ury = max(ury, by); X } X } X X for (s = compound->splines; s != NULL; s = s->next) { X spline_bound(s, &sx, &sy, &bx, &by); X if (first) { X first = 0; X llx = sx; lly = sy; X urx = bx; ury = by; X } X else { X llx = min(llx, sx); lly = min(lly, sy); X urx = max(urx, bx); ury = max(ury, by); X } X } X X for (t = compound->texts; t != NULL; t = t->next) { X text_bound(t, &sx, &sy, &bx, &by); X if (first) { X first = 0; X llx = sx; lly = sy; X urx = bx; ury = by; X } X else { X llx = min(llx, sx); lly = min(lly, sy); X urx = max(urx, bx); ury = max(ury, by); X } X } X X *xmin = llx; *ymin = lly; X *xmax = urx; *ymax = ury; X } X Xellipse_bound(e, xmin, ymin, xmax, ymax) XF_ellipse *e; Xint *xmin, *ymin, *xmax, *ymax; X{ X *xmin = e->center.x - e->radiuses.x; X *ymin = e->center.y - e->radiuses.y; X *xmax = e->center.x + e->radiuses.x; X *ymax = e->center.y + e->radiuses.y; X } X Xline_bound(l, xmin, ymin, xmax, ymax) XF_line *l; Xint *xmin, *ymin, *xmax, *ymax; X{ X points_bound(l->points, xmin, ymin, xmax, ymax); X } X Xspline_bound(s, xmin, ymin, xmax, ymax) XF_spline *s; Xint *xmin, *ymin, *xmax, *ymax; X{ X if (int_spline(s)) { X int_spline_bound(s, xmin, ymin, xmax, ymax); X } X else { X normal_spline_bound(s, xmin, ymin, xmax, ymax); X } X } X Xint_spline_bound(s, xmin, ymin, xmax, ymax) XF_spline *s; Xint *xmin, *ymin, *xmax, *ymax; X{ X F_point *p1, *p2; X F_control *cp1, *cp2; X float x0, y0, x1, y1, x2, y2, x3, y3, sx1, sy1, sx2, sy2; X float tx, ty, tx1, ty1, tx2, ty2; X float sx, sy, bx, by; X X p1 = s->points; X sx = bx = p1->x; X sy = by = p1->y; X cp1 = s->controls; X for (p2 = p1->next, cp2 = cp1->next; p2 != NULL; X p1 = p2, cp1 = cp2, p2 = p2->next, cp2 = cp2->next) { X x0 = p1->x; y0 = p1->y; X x1 = cp1->rx; y1 = cp1->ry; X x2 = cp2->lx; y2 = cp2->ly; X x3 = p2->x; y3 = p2->y; X tx = half(x1, x2); ty = half(y1, y2); X sx1 = half(x0, x1); sy1 = half(y0, y1); X sx2 = half(sx1, tx); sy2 = half(sy1, ty); X tx2 = half(x2, x3); ty2 = half(y2, y3); X tx1 = half(tx2, tx); ty1 = half(ty2, ty); X X sx = min(x0, sx); sy = min(y0, sy); X sx = min(sx1, sx); sy = min(sy1, sy); X sx = min(sx2, sx); sy = min(sy2, sy); X sx = min(tx1, sx); sy = min(ty1, sy); X sx = min(tx2, sx); sy = min(ty2, sy); X sx = min(x3, sx); sy = min(y3, sy); X X bx = max(x0, bx); by = max(y0, by); X bx = max(sx1, bx); by = max(sy1, by); X bx = max(sx2, bx); by = max(sy2, by); X bx = max(tx1, bx); by = max(ty1, by); X bx = max(tx2, bx); by = max(ty2, by); X bx = max(x3, bx); by = max(y3, by); X } X *xmin = round(sx); X *ymin = round(sy); X *xmax = round(bx); X *ymax = round(by); X } X Xnormal_spline_bound(s, xmin, ymin, xmax, ymax) XF_spline *s; Xint *xmin, *ymin, *xmax, *ymax; X{ X F_point *p; X float cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4; X float x1, y1, x2, y2, sx, sy, bx, by; X float px, py, qx, qy; X X p = s->points; X x1 = p->x; y1 = p->y; X p = p->next; X x2 = p->x; y2 = p->y; X cx1 = (x1 + x2) / 2.0; cy1 = (y1 + y2) / 2.0; X cx2 = (cx1 + x2) / 2.0; cy2 = (cy1 + y2) / 2.0; X if (closed_spline(s)) { X x1 = (cx1 + x1) / 2.0; X y1 = (cy1 + y1) / 2.0; X } X sx = min(x1, cx2); sy = min(y1, cy2); X bx = max(x1, cx2); by = max(y1, cy2); X X for (p = p->next; p != NULL; p = p->next) { X x1 = x2; y1 = y2; X x2 = p->x; y2 = p->y; X cx4 = (x1 + x2) / 2.0; cy4 = (y1 + y2) / 2.0; X cx3 = (x1 + cx4) / 2.0; cy3 = (y1 + cy4) / 2.0; X cx2 = (cx4 + x2) / 2.0; cy2 = (cy4 + y2) / 2.0; X X px = min(cx2, cx3); py = min(cy2, cy3); X qx = max(cx2, cx3); qy = max(cy2, cy3); X X sx = min(sx, px); sy = min(sy, py); X bx = max(bx, qx); by = max(by, qy); X } X if (closed_spline(s)) { X *xmin = round(sx); *ymin = round(sy); X *xmax = round(bx); *ymax = round(by); X } X else { X *xmin = round(min(sx, x2)); *ymin = round(min(sy, y2)); X *xmax = round(max(bx, x2)); *ymax = round(max(by, y2)); X } X } X Xtext_bound(t, xmin, ymin, xmax, ymax) XF_text *t; Xint *xmin, *ymin, *xmax, *ymax; X{ X *xmin = t->base_x; X *ymin = t->base_y - t->height; X *xmax = t->base_x + t->length; X *ymax = t->base_y; X } X Xpoints_bound(points, xmin, ymin, xmax, ymax) XF_point *points; Xint *xmin, *ymin, *xmax, *ymax; X{ X int bx, by, sx, sy; X F_point *p; X X bx = sx = points->x; by = sy = points->y; X for (p = points->next; p != NULL; p = p->next) { X sx = min(sx, p->x); sy = min(sy, p->y); X bx = max(bx, p->x); by = max(by, p->y); X } X *xmin = sx; *ymin = sy; X *xmax = bx; *ymax = by; X } X Xcontrol_points_bound(cps, xmin, ymin, xmax, ymax) XF_control *cps; Xint *xmin, *ymin, *xmax, *ymax; X{ X F_control *c; X float bx, by, sx, sy; X X bx = sx = cps->lx; X by = sy = cps->ly; X sx = min(sx, cps->rx); sy = min(sy, cps->ry); X bx = max(bx, cps->rx); by = max(by, cps->ry); X for (c = cps->next; c != NULL; c = c->next) { X sx = min(sx, c->lx); sy = min(sy, c->ly); X bx = max(bx, c->lx); by = max(by, c->ly); X sx = min(sx, c->rx); sy = min(sy, c->ry); X bx = max(bx, c->rx); by = max(by, c->ry); X } X *xmin = round(sx); *ymin = round(sy); X *xmax = round(bx); *ymax = round(by); X } END_OF_FILE if test 9642 -ne `wc -c <'xfig/bound.c'`; then echo shar: \"'xfig/bound.c'\" unpacked with wrong size! fi # end of 'xfig/bound.c' fi if test -f 'xfig/flip.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'xfig/flip.c'\" else echo shar: Extracting \"'xfig/flip.c'\" \(9464 characters\) sed "s/^X//" >'xfig/flip.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 "func.h" X#include "object.h" X#include "paintop.h" X X#define TOLERANCE 7 X#define min(a, b) (((a) < (b)) ? (a) : (b)) X#define max(a, b) (((a) > (b)) ? (a) : (b)) 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 set_popupmenu(); X Xextern F_line *line_search(), *copy_line(); Xextern F_ellipse *ellipse_search(), *copy_ellipse(); Xextern F_ellipse *ellipse_point_search(); Xextern F_text *copy_text(); Xextern F_spline *spline_search(), *copy_spline(); Xextern F_arc *arc_point_search(), *copy_arc(); Xextern F_compound *compound_search(), *copy_compound(); X Xextern F_compound objects; X Xextern int flip_axis; Xextern int pointmarker_shown; Xextern int foreground_color, background_color; X Xstatic int copy; X init_flip(); X init_copynflip(); X Xflip_selected() X{ X canvas_kbd_proc = null_proc; X canvas_locmove_proc = null_proc; X canvas_leftbut_proc = init_copynflip; X canvas_middlebut_proc = init_flip; X canvas_rightbut_proc = set_popupmenu; X set_cursor(&pick15_cursor); X } X Xinit_flip(x, y) Xint x, y; X{ X copy = 0; X flip_search(x, y); X flip_selected(); X } X Xinit_copynflip(x, y) Xint x, y; X{ X copy = 1; X flip_search(x, y); X flip_selected(); X } X Xflip_search(x, y) Xint x, y; X{ X F_line *l; X F_arc *a; X F_ellipse *e; X F_spline *s; X F_compound *c; X int px, py; X X if ((l = line_search(x, y, TOLERANCE, &px, &py)) != NULL) { X init_flipline(l, px, py); X } X else if ((a = arc_point_search(x, y, TOLERANCE, &px)) != NULL) { X init_fliparc(a, a->point[px].x, a->point[px].y); X } X else if ((e = ellipse_point_search(x, y, TOLERANCE, &px)) != NULL) { X if (px == 0) /* start point */ X init_flipellipse(e, e->start.x, e->start.y); X else X init_flipellipse(e, e->end.x, e->end.y); X } X else if ((e = ellipse_search(x, y, TOLERANCE, &px, &py)) != NULL) { X init_flipellipse(e, px, py); X } X else if ((s = spline_search(x, y, TOLERANCE, &px, &py)) != NULL) { X init_flipspline(s, px, py); X } X else if ((c = compound_search(x, y, TOLERANCE, &px, &py)) != NULL) { X init_flipcompound(c, px, py); X } X set_modifiedflag(); X } X Xinit_fliparc(a, px, py) XF_arc *a; Xint px, py; X{ X F_arc *arc; X X win_setmouseposition(canvas_swfd, px, py); X if (pointmarker_shown) toggle_arcpointmarker(a); X if (copy) { X arc = copy_arc(a); X flip_arc(arc, px, py, flip_axis); X clean_up(); X set_action_object(F_CREATE, O_ARC); X insert_arc(&objects.arcs, arc); X } X else { X draw_arc(a, background_color); X flip_arc(a, px, py, flip_axis); X clean_up(); X set_action_object(F_FLIP, O_ARC); X set_lastaxis(flip_axis); X set_lastposition(px, py); X arc = a; X } X draw_arc(arc, foreground_color); X if (pointmarker_shown) { X toggle_arcpointmarker(arc); X if (copy) toggle_arcpointmarker(a); X } X set_latestarc(arc); X } X Xinit_flipcompound(c, px, py) XF_compound *c; Xint px, py; X{ X F_compound *compound; X X win_setmouseposition(canvas_swfd, px, py); X set_temp_cursor(&wait_cursor); X if (copy) { X compound = copy_compound(c); X flip_compound(compound, px, py, flip_axis); X clean_up(); X set_action_object(F_CREATE, O_COMPOUND); X insert_compound(&objects.compounds, compound); X } X else { X draw_compoundbox(c, INV_PAINT); X erase_compound(c); X flip_compound(c, px, py, flip_axis); X clean_up(); X set_action_object(F_FLIP, O_COMPOUND); X set_lastaxis(flip_axis); X set_lastposition(px, py); X compound = c; X } X draw_compoundbox(compound, INV_PAINT); X draw_compound(compound); X set_latestcompound(compound); X set_temp_cursor(cur_cursor); X } X Xinit_flipellipse(e, px, py) XF_ellipse *e; X{ X F_ellipse *ellipse; X X win_setmouseposition(canvas_swfd, px, py); X if (pointmarker_shown) toggle_ellipsepointmarker(e); X if (copy) { X ellipse = copy_ellipse(e); X flip_ellipse(ellipse, px, py, flip_axis); X clean_up(); X set_action_object(F_CREATE, O_ELLIPSE); X insert_ellipse(&objects.ellipses, ellipse); X } X else { X draw_ellipse(e, background_color); X flip_ellipse(e, px, py, flip_axis); X clean_up(); X set_action_object(F_FLIP, O_ELLIPSE); X set_lastaxis(flip_axis); X set_lastposition(px, py); X ellipse = e; X } X draw_ellipse(ellipse, foreground_color); X if (pointmarker_shown) { X toggle_ellipsepointmarker(ellipse); X if (copy) toggle_ellipsepointmarker(e); X } X set_latestellipse(ellipse); X } X Xinit_flipline(l, px, py) XF_line *l; Xint px, py; X{ X F_line *line; X X win_setmouseposition(canvas_swfd, px, py); X if (pointmarker_shown) toggle_linepointmarker(l); X if (copy) { X line = copy_line(l); X flip_line(line, px, py, flip_axis); X clean_up(); X set_action_object(F_CREATE, O_POLYLINE); X insert_line(&objects.lines, line); X } X else { X draw_line(l, ERASE); X flip_line(l, px, py, flip_axis); X clean_up(); X set_action_object(F_FLIP, O_POLYLINE); X set_lastaxis(flip_axis); X set_lastposition(px, py); X line = l; X } X draw_line(line, PAINT); X if (pointmarker_shown) { X toggle_linepointmarker(line); X if (copy) toggle_linepointmarker(l); X } X set_latestline(line); X } X Xinit_flipspline(s, px, py) XF_spline *s; Xint px, py; X{ X F_spline *spline; X X win_setmouseposition(canvas_swfd, px, py); X if (pointmarker_shown) toggle_splinepointmarker(s); X if (copy) { X spline = copy_spline(s); X flip_spline(spline, px, py, flip_axis); X clean_up(); X set_action_object(F_CREATE, O_SPLINE); X insert_spline(&objects.splines, spline); X } X else { /* delete the original */ X draw_spline(s, ERASE); X flip_spline(s, px, py, flip_axis); X clean_up(); X set_action_object(F_FLIP, O_SPLINE); X set_lastaxis(flip_axis); X set_lastposition(px, py); X spline = s; X } X draw_spline(spline, PAINT); X if (pointmarker_shown) { X toggle_splinepointmarker(spline); X if (copy) toggle_splinepointmarker(s); X } X set_latestspline(spline); X } X Xflip_line(l, x, y, flip_axis) XF_line *l; Xint x, y, flip_axis; X{ X F_point *p; X X switch(flip_axis) { X case 1 : /* x axis */ X for (p = l->points; p != NULL; p = p->next) X p->y = y + (y - p->y); X break; X case 2 : /* y axis */ X for (p = l->points; p != NULL; p = p->next) X p->x = x + (x - p->x); X break; X } X } X Xflip_spline(s, x, y, flip_axis) XF_spline *s; Xint x, y, flip_axis; X{ X F_point *p; X F_control *cp; X X switch(flip_axis) { X case 1 : /* x axis */ X for (p = s->points; p != NULL; p = p->next) X p->y = y + (y - p->y); X for (cp = s->controls; cp != NULL; cp = cp->next) { X cp->ly = y + (y - cp->ly); X cp->ry = y + (y - cp->ry); X } X break; X case 2 : /* y axis */ X for (p = s->points; p != NULL; p = p->next) X p->x = x + (x - p->x); X for (cp = s->controls; cp != NULL; cp = cp->next) { X cp->lx = x + (x - cp->lx); X cp->rx = x + (x - cp->rx); X } X break; X } X } X Xflip_text(t, x, y, flip_axis) XF_text *t; Xint x, y, flip_axis; X{ X switch(flip_axis) { X case 1 : /* x axis */ X t->base_y = y + (y - t->base_y); X break; X case 2 : /* y axis */ X t->base_x = x + (x - t->base_x); X break; X } X } X Xflip_ellipse(e, x, y, flip_axis) XF_ellipse *e; Xint x, y, flip_axis; X{ X switch(flip_axis) { X case 1 : /* x axis */ X e->direction ^= 1; X e->center.y = y + (y - e->center.y); X e->start.y = y + (y - e->start.y); X e->end.y = y + (y - e->end.y); X break; X case 2 : /* y axis */ X e->direction ^= 1; X e->center.x = x + (x - e->center.x); X e->start.x = x + (x - e->start.x); X e->end.x = x + (x - e->end.x); X break; X } X } X Xflip_arc(a, x, y, flip_axis) XF_arc *a; Xint x, y, flip_axis; X{ X switch(flip_axis) { X case 1 : /* x axis */ X a->direction ^= 1; X a->center.y = y + (y - a->center.y); X a->point[0].y = y + (y - a->point[0].y); X a->point[1].y = y + (y - a->point[1].y); X a->point[2].y = y + (y - a->point[2].y); X break; X case 2 : /* y axis */ X a->direction ^= 1; X a->center.x = x + (x - a->center.x); X a->point[0].x = x + (x - a->point[0].x); X a->point[1].x = x + (x - a->point[1].x); X a->point[2].x = x + (x - a->point[2].x); X break; X } X } X Xflip_compound(c, x, y, flip_axis) XF_compound *c; Xint x, y, flip_axis; X{ X F_line *l; X F_arc *a; X F_ellipse *e; X F_spline *s; X F_text *t; X F_compound *c1; X int p, q; X X switch(flip_axis) { X case 1 : /* x axis */ X p = y + (y - c->nwcorner.y); X q = y + (y - c->secorner.y); X c->nwcorner.y = min(p, q); X c->secorner.y = max(p, q); X break; X case 2 : /* y axis */ X p = x + (x - c->nwcorner.x); X q = x + (x - c->secorner.x); X c->nwcorner.x = min(p, q); X c->secorner.x = max(p, q); X break; X } X for (l = c->lines; l != NULL; l = l->next) X flip_line(l, x, y, flip_axis); X for (a = c->arcs; a != NULL; a = a->next) X flip_arc(a, x, y, flip_axis); X for (e = c->ellipses; e != NULL; e = e->next) X flip_ellipse(e, x, y, flip_axis); X for (s = c->splines; s != NULL; s = s->next) X flip_spline(s, x, y, flip_axis); X for (t = c->texts; t != NULL; t = t->next) X flip_text(t, x, y, flip_axis); X for (c1 = c->compounds; c1 != NULL; c1 = c1->next) X flip_compound(c1, x, y, flip_axis); X } END_OF_FILE if test 9464 -ne `wc -c <'xfig/flip.c'`; then echo shar: \"'xfig/flip.c'\" unpacked with wrong size! fi # end of 'xfig/flip.c' fi if test -f 'xfig/main.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'xfig/main.c'\" else echo shar: Extracting \"'xfig/main.c'\" \(9698 characters\) sed "s/^X//" >'xfig/main.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 * 1st revision : Aug 1985. X * X * %W% %G% X*/ X#include "fig.h" X#include "const.h" X#include "version.h" X#include "patchlevel.h" X#include "resources.h" X#include "font.h" X Xextern int borderwid, windowspacing, toolstripeht; Xextern int ICON_COLUMN; Xextern int CANVAS_HEIGHT, CANVAS_WIDTH; Xextern int CANVAS_LEFT, CANVAS_TOP; Xextern int PANEL_LEFT, PANEL_TOP, PANEL_HEIGHT, PANEL_WID; Xextern int PANEL2_LEFT, PANEL2_TOP, PANEL2_HEIGHT, PANEL2_WID; Xextern int MSG_LEFT, MSG_TOP, MSG_WIDTH; Xextern int SIDERULER_LEFT, SIDERULER_TOP; Xextern int SIDERULER_WIDTH, SIDERULER_HEIGHT; Xextern int SIDERULER_START; Xextern int TOPRULER_LEFT, TOPRULER_TOP; Xextern int TOPRULER_WIDTH, TOPRULER_HEIGHT; Xextern int INCHES; Xextern (*canvas_rightbut_proc)(); Xextern set_popupmenu(); Xextern int cur_areafill; Xextern int landscape; Xextern int print_landscape; Xextern int size_button; X X#include "fig.icon.X" XPixmap fig_icon; Xextern char *boldFont; Xextern char *normalFont; X X#define SCREEN_WIDTH 1152 /* only used in Sunview */ X#define SCREEN_HEIGHT 900 X#define min(a,b) (((a) < (b)) ? (a) : (b)) X Xstatic char tool_name[100] = " FIG : FACILITY FOR INTERACTIVE GENERATION OF FIGURES "; Xstatic RECT icon_rect, tool_rect; Xstatic sigwinched(); X X/************** FIG options ******************/ X Xextern int DEBUG; Xextern int RHS_PANEL; Xextern int INVERSE; Xextern int TRACKING; X XTOOL tool; Xint WINDOW_WIDTH, WINDOW_HEIGHT; Xchar file_header[32] = "#FIG "; Xstatic char *file = NULL; X Xstatic int true = True; Xstatic int false = False; Xstatic int zero = 0; Xstatic float tmp_width = 0.0, tmp_height = 0.0; X Xstatic XtResource application_resources[] = { X {XtNjustify, XtCJustify, XtRBoolean, sizeof(int), X (Cardinal)&RHS_PANEL, XtRBoolean, (caddr_t)&false}, X {"debug", "Debug", XtRBoolean, sizeof(int), X (Cardinal)&DEBUG, XtRBoolean, (caddr_t)&false}, X {"landscape", XtCOrientation, XtRBoolean, sizeof(int), X (Cardinal)&landscape, XtRBoolean, (caddr_t)&true}, X {XtNwidth, XtCWidth, XtRFloat, sizeof(float), X (Cardinal)&tmp_width, XtRInt, (caddr_t)&zero}, X {XtNheight, XtCHeight, XtRFloat, sizeof(float), X (Cardinal)&tmp_height, XtRInt, (caddr_t)&zero}, X {XtNreverseVideo, XtCReverseVideo, XtRBoolean, sizeof(int), X (Cardinal)&INVERSE, XtRBoolean, (caddr_t)&false}, X {"trackCursor", "Track", XtRBoolean, sizeof(int), X (Cardinal)&TRACKING, XtRBoolean, (caddr_t)&false}, X {"inches", "Inches", XtRBoolean, sizeof(int), X (Cardinal)&INCHES, XtRBoolean, (caddr_t)&true}, X {"boldFont", "BoldFont", XtRString, sizeof(caddr_t), X (Cardinal)&boldFont, XtRString, (caddr_t)NULL}, X {"normalFont", "NormalFont", XtRString, sizeof(caddr_t), X (Cardinal)&normalFont, XtRString, (caddr_t)NULL}, X}; X Xstatic XrmOptionDescRec options[] = X{ X {"-right", ".justify", XrmoptionNoArg, "True" }, X {"-left", ".justify", XrmoptionNoArg, "False"}, X {"-debug", ".debug", XrmoptionNoArg, "True"}, X {"-landscape", ".landscape", XrmoptionNoArg, "True"}, X {"-Landscape", ".landscape", XrmoptionNoArg, "True"}, X {"-portrait", ".landscape", XrmoptionNoArg, "False"}, X {"-Portrait", ".landscape", XrmoptionNoArg, "False"}, X {"-width", ".width", XrmoptionSepArg, 0}, X {"-height", ".height", XrmoptionSepArg, 0}, X {"-inverse", ".reverseVideo", XrmoptionNoArg, "True"}, X {"-notrack", ".trackCursor", XrmoptionNoArg, "False"}, X {"-track", ".trackCursor", XrmoptionNoArg, "True"}, X {"-inches", ".inches", XrmoptionNoArg, "True"}, X {"-imperial", ".inches", XrmoptionNoArg, "True"}, X {"-centimeters", ".inches", XrmoptionNoArg, "False"}, X {"-metric", ".inches", XrmoptionNoArg, "False"}, X {"-boldFont", ".boldFont", XrmoptionSepArg, 0}, X {"-normalFont", ".normalFont", XrmoptionSepArg, 0}, X}; X Xstatic XtCallbackRec callbacks[] = X{ X { NULL, NULL }, X}; X Xstatic Arg form_args[] = X{ X { XtNcallback, (XtArgVal)callbacks }, X { XtNinput, (XtArgVal) TRUE }, X}; X Xmain(argc,argv) X int argc; X char *argv[]; X{ X#define NCHILDREN 10 X TOOL form, children[NCHILDREN]; X Arg tmp_arg[2]; X int ichild; X char tstr[10]; X XWMHints *wmhints; X X strcat(tool_name, " V. "); X strcat(tool_name, FIG_VERSION); X strcat(tool_name, " Protocol V. "); X strcat(tool_name, PROTOCOL_VERSION); X strcat(tool_name, " Patch Lev. "); X sprintf(tstr,"%d",PATCHLEVEL); X strcat(tool_name, tstr); X strcat(file_header, PROTOCOL_VERSION); X printf("Initializing FIG v%s Protocol v%s (X11 patchlevel %d) ... \n", X FIG_VERSION, PROTOCOL_VERSION, PATCHLEVEL); X tool = XtInitialize("fig", "Fig", options, XtNumber(options), X &argc, argv); X X fix_converters(); X XtGetApplicationResources(tool, 0, application_resources, X XtNumber(application_resources), NULL, 0 ); X if (argc > 1) X file = argv[1]; X X if (landscape==0) /* match print and screen format to start */ X print_landscape=0; X X tool_d = XtDisplay(tool); X tool_s = XtScreen(tool); X tool_sn = DefaultScreen(tool_d); X X if( CellsOfScreen(tool_s) == 2 && INVERSE ) X { X XrmValue value; X XrmDatabase newdb = (XrmDatabase) 0; X /* extern XrmDatabase XtDefaultDB; */ X extern XrmDatabase XtDatabase(); X X /* XtDefaultDB = XtDatabase(tool_d); */ X value.size = sizeof("White"); X value.addr = "White"; X XrmPutResource(&newdb, "xfig*borderColor", "String", X &value); X value.size = sizeof("White"); X value.addr = "White"; X XrmPutResource(&newdb, "xfig*foreground", "String", X &value); X value.size = sizeof("Black"); X value.addr = "Black"; X XrmPutResource(&newdb, "xfig*background", "String", X &value); X /* XrmMergeDatabases(newdb, &XtDefaultDB); */ X XrmMergeDatabases(newdb, XtDatabase(tool_d)); X X /* now set the tool part, since its already created */ X XtSetArg(tmp_arg[0], XtNborderColor, X WhitePixelOfScreen(tool_s)); X XtSetArg(tmp_arg[1], XtNforeground, X WhitePixelOfScreen(tool_s)); X XtSetArg(tmp_arg[2], XtNbackground, X BlackPixelOfScreen(tool_s)); X XtSetValues(tool, tmp_arg, 3); X } X X init_font(); X X gc = DefaultGC(tool_d, tool_sn); X bold_gc = DefaultGC(tool_d, tool_sn); X X /* set the roman and bold fonts for the message windows */ X XSetFont(tool_d, gc, roman_font->fid); X XSetFont(tool_d, bold_gc, bold_font->fid); X X init_cursor(); X form = XtCreateManagedWidget("form", formWidgetClass, tool, X form_args, XtNumber(form_args)); X X if (size_button == 0) X size_button = DEF_PRINTFONTSIZE; X X ICON_COLUMN = ICON_COLUMN_PORT; X CANVAS_WIDTH = tmp_width * (INCHES ? PIX_PER_INCH : PIX_PER_CM); X CANVAS_HEIGHT = tmp_height * (INCHES ? PIX_PER_INCH : PIX_PER_CM); X X if( CANVAS_WIDTH == 0 ) X CANVAS_WIDTH = landscape ? DEF_CANVAS_WIDTH_L : DEF_CANVAS_WIDTH_P; X X if( CANVAS_HEIGHT == 0 ) X CANVAS_HEIGHT = landscape ? DEF_CANVAS_HEIGHT_L : DEF_CANVAS_HEIGHT_P; X X X if( (CANVAS_HEIGHT < DEF_CANVAS_HEIGHT_P) || X (HeightOfScreen(tool_s) < DEF_CANVAS_HEIGHT_P) ) X ICON_COLUMN = ICON_COLUMN_LAND; X X (void) init_panel(form); X (void) init_topruler(form) ; X (void) init_menu(form); /* command menu */ X (void) init_canvas(form); X (void) init_fontmenu(form); /* printer font menu */ X (void) init_sideruler(form); X (void) init_msg(form); X (void) init_panel2(form); /* second panel */ X (void) init_indicator_panel(form); /* current line size, area fill, etc */ X X ichild = 0; X children[ichild++] = panel_sw; X children[ichild++] = topruler_sw; X children[ichild++] = psfont; /* shows current printer font name */ X children[ichild++] = canvas_sw; /* main drawing canvas */ X children[ichild++] = msg_sw; /* message window */ X children[ichild++] = sideruler_sw; /* side ruler */ X children[ichild++] = panel2_sw; /* lower button panel */ X children[ichild++] = fill_panel; /* current fill pattern window */ X children[ichild++] = line_thick_panel; /* current line thickness window */ X children[ichild++] = radius_panel; /* current arc-corner box radius window */ X X /* until the following XtRealizeWidget() is called, there X are NO windows in existence */ X X XtManageChildren(children, NCHILDREN); X XtRealizeWidget(tool); X X /* Set the input field to true to allow keyboard input */ X wmhints = XGetWMHints(tool_d, XtWindow(tool)); X wmhints->flags = InputHint; X wmhints->input = True; X XSetWMHints(tool_d, XtWindow(tool),wmhints); X X if( RHS_PANEL ) X { X XtSetArg(tmp_arg[0], XtNfromHoriz, 0); X XtSetArg(tmp_arg[1], XtNhorizDistance, RULER_WIDTH+2); X XtSetValues(topruler_sw, tmp_arg, 2); X XtSetArg(tmp_arg[0], XtNfromHoriz, 0); X XtSetArg(tmp_arg[1], XtNfromVert, topruler_sw); X XtSetValues(sideruler_sw, tmp_arg, 2); X XtUnmanageChild(msg_sw); X XtSetArg(tmp_arg[0], XtNfromHoriz, sideruler_sw); X XtSetArg(tmp_arg[1], XtNfromVert, topruler_sw); X XtSetValues(canvas_sw, tmp_arg, 2); X XtManageChild(msg_sw); X XtSetArg(tmp_arg[0], XtNfromHoriz, canvas_sw); X XtSetArg(tmp_arg[1], XtNfromVert, 0); X XtSetValues(panel_sw, tmp_arg, 2); X XtSetArg(tmp_arg[0], XtNfromHoriz, sideruler_sw); X XtSetArg(tmp_arg[1], XtNfromVert, canvas_sw); X XtSetValues(msg_sw, tmp_arg, 2); X XtUnmanageChild(msg_sw); X XtManageChild(msg_sw); X } X X init_gc(); X init_fill_gc(); X show_fill_color(); X show_radius(); X setup_panel(); X setup_rulers(); X setup_canvas(); X setup_msg(); X setup_fontmenu(); /* install bitmaps in printer font menu */ X printer_select(); X show_fontsize(); X show_line_thickness(); X put_msg("READY"); X canvas_rightbut_proc = set_popupmenu; X if (file != NULL) X edit_file(file); X (void)signal(SIGINT, SIG_IGN); /* so we don't lose work accidentally */ X fig_icon = XCreateBitmapFromData(tool_d, XtWindow(tool), X fig_bits, fig_width, fig_height); X X XtSetArg(tmp_arg[0], XtNtitle, tool_name); X XtSetArg(tmp_arg[1], XtNiconPixmap, fig_icon); X XtSetValues(tool, tmp_arg, 2); X X XtMainLoop(); X} END_OF_FILE if test 9698 -ne `wc -c <'xfig/main.c'`; then echo shar: \"'xfig/main.c'\" unpacked with wrong size! fi # end of 'xfig/main.c' fi if test -f 'xfig/move.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'xfig/move.c'\" else echo shar: Extracting \"'xfig/move.c'\" \(4187 characters\) sed "s/^X//" >'xfig/move.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 "font.h" X#include "func.h" X#include "object.h" X#include "paintop.h" X X#define TOLERANCE 3 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(); X Xextern F_line *line_search(); Xextern F_arc *arc_search(); Xextern F_ellipse *ellipse_search(); Xextern F_text *text_search(); Xextern F_spline *spline_search(); Xextern F_compound *compound_search(); X Xextern int foreground_color, background_color; Xextern int pointmarker_shown, compoundbox_shown; Xextern int last_object; Xextern int last_action; X X init_move(); X Xmove_selected() X{ X canvas_kbd_proc = null_proc; X canvas_locmove_proc = null_proc; X canvas_leftbut_proc = init_move; X canvas_middlebut_proc = null_proc; X canvas_rightbut_proc = set_popupmenu; X return_proc = move_selected; X set_cursor(&pick9_cursor); X reset_action_on(); X } X Xinit_move(x, y) Xint x, y; X{ X F_line *l; X F_arc *a; X F_ellipse *e; X F_text *t; X F_spline *s; X F_compound *c; X int px, py; X PR_SIZE size; X X if ((c = compound_search(x, y, TOLERANCE, &px, &py)) != NULL) { X set_temp_cursor(&wait_cursor); X win_setmouseposition(canvas_swfd, px, py); X if (compoundbox_shown) draw_compoundbox(c, INV_PAINT); X erase_compound(c); X init_compounddragging(c, px, py); X set_temp_cursor(&null_cursor); X clean_up(); X set_action_object(F_MOVE, O_COMPOUND); X set_latestcompound(c); X } X else if ((l = line_search(x, y, TOLERANCE, &px, &py)) != NULL) { X set_temp_cursor(&wait_cursor); X erase_pointmarker(); X win_setmouseposition(canvas_swfd, px, py); X draw_line(l, ERASE); X init_linedragging(l, px, py); X set_temp_cursor(&null_cursor); X clean_up(); X set_action_object(F_MOVE, O_POLYLINE); X set_latestline(l); X } X else if ((t = text_search(x, y)) != NULL) { X set_temp_cursor(&wait_cursor); X erase_pointmarker(); X px = 0; X if (t->type == T_CENTER_JUSTIFIED || t->type == T_RIGHT_JUSTIFIED) X { X size = pf_textwidth(t->font, t->size, strlen(t->cstring), t->cstring); X if (t->type == T_CENTER_JUSTIFIED) X px = size.x/2; X else X px = size.x; X } X pw_text(canvas_pixwin, t->base_x - px, t->base_y, INV_PAINT, X t->font, t->size, t->cstring); X init_textdragging(t, x, y); X set_temp_cursor(&null_cursor); X clean_up(); X set_action_object(F_MOVE, O_TEXT); X set_latesttext(t); X } X else if ((e = ellipse_search(x, y, TOLERANCE, &px, &py)) != NULL) { X set_temp_cursor(&wait_cursor); X erase_pointmarker(); X set_temp_cursor(&null_cursor); X win_setmouseposition(canvas_swfd, px, py); X pw_batch_on(canvas_pixwin); X draw_ellipse(e, background_color); X pw_batch_off(canvas_pixwin); X init_ellipsedragging(e, px, py); X set_temp_cursor(&null_cursor); X clean_up(); X set_action_object(F_MOVE, O_ELLIPSE); X set_latestellipse(e); X } X else if ((a = arc_search(x, y, TOLERANCE, &px, &py)) != NULL) { X set_temp_cursor(&wait_cursor); X erase_pointmarker(); X win_setmouseposition(canvas_swfd, px, py); X pw_batch_on(canvas_pixwin); X draw_arc(a, background_color); X pw_batch_off(canvas_pixwin); X init_arcdragging(a, px, py); X set_temp_cursor(&null_cursor); X clean_up(); X set_action_object(F_MOVE, O_ARC); X set_latestarc(a); X } X else if ((s = spline_search(x, y, TOLERANCE, &px, &py)) != NULL) { X set_temp_cursor(&wait_cursor); X win_setmouseposition(canvas_swfd, px, py); X erase_pointmarker(); X pw_batch_on(canvas_pixwin); X draw_spline(s, ERASE); X pw_batch_off(canvas_pixwin); X init_splinedragging(s, px, py); X set_temp_cursor(&null_cursor); X clean_up(); X set_action_object(F_MOVE, O_SPLINE); X set_latestspline(s); X } X else X return; X canvas_leftbut_proc = canvas_rightbut_proc = null_proc; X } END_OF_FILE if test 4187 -ne `wc -c <'xfig/move.c'`; then echo shar: \"'xfig/move.c'\" unpacked with wrong size! fi # end of 'xfig/move.c' fi if test -f 'xfig/scale.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'xfig/scale.c'\" else echo shar: Extracting \"'xfig/scale.c'\" \(8385 characters\) sed "s/^X//" >'xfig/scale.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 "func.h" X#include "object.h" X#include "paintop.h" X X#define TOLERANCE 7 X#define min(a, b) (((a) < (b)) ? (a) : (b)) X#define max(a, b) (((a) > (b)) ? (a) : (b)) X#define round(a) (int)(a + 0.5) X Xextern int fix_x, fix_y, cur_x, cur_y; Xextern F_pos last_position, new_position; /* used in undo */ X Xextern F_compound *compound_point_search(), *compound_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(); X X prescale_compound(), elastic_compoundbox(); X Xstatic enum {WEST, NORTH, EAST, SOUTH, CORNER} side; Xstatic int save_coord; Xstatic F_compound *compound; Xstatic double cosa, sina; Xstatic int fromx, fromy; X init_scale_compound(); X Xscale_compound_selected() X{ X canvas_kbd_proc = null_proc; X canvas_locmove_proc = null_proc; X canvas_leftbut_proc = init_scale_compound; X canvas_middlebut_proc = null_proc; X canvas_rightbut_proc = set_popupmenu; X set_cursor(&pick15_cursor); X reset_action_on(); X } X Xinit_scale_compound(x, y) Xint x, y; X{ X double dx, dy, l; X X if ((compound = compound_point_search(x, y, TOLERANCE, &cur_x, X &cur_y)) != NULL) X { X if (compound->nwcorner.x == cur_x) X fix_x = compound->secorner.x; X else X fix_x = compound->nwcorner.x; X if (compound->nwcorner.y == cur_y) X fix_y = compound->secorner.y; X else X fix_y = compound->nwcorner.y; X X side = CORNER; X dx = cur_x - fix_x; dy = cur_y - fix_y; X l = sqrt(dx*dx + dy*dy); X cosa = fabs(dx / l); sina = fabs(dy / l); X X fromx = cur_x; fromy = cur_y; X win_setmouseposition(canvas_swfd, cur_x, cur_y); X draw_compoundbox(compound, INV_PAINT); X draw_rectbox(fix_x, fix_y, cur_x, cur_y, INV_PAINT, 1); X set_latestcompound(compound); X canvas_locmove_proc = elastic_compoundbox; X canvas_middlebut_proc = prescale_compound; X canvas_leftbut_proc = canvas_rightbut_proc = null_proc; X set_action_on(); X set_temp_cursor(&null_cursor); X win_setmouseposition(canvas_swfd, x, y); X } X else if ((compound = compound_search(x, y, TOLERANCE, &cur_x, &cur_y)) X != NULL ) X { X /* figure out which side the cursor is close to. */ X if (compound->nwcorner.x == cur_x) X side = WEST; X else if (compound->nwcorner.y == cur_y) X side = NORTH; X else if (compound->secorner.x == cur_x) X side = EAST; X else if (compound->secorner.y == cur_y) X side = SOUTH; X else X return; X X /* figure out a fixed point of the compound for scaling */ X switch (side) { X case WEST: X case NORTH: X fix_x = compound->secorner.x; X fix_y = compound->secorner.y; X cur_x = compound->nwcorner.x; X cur_y = compound->nwcorner.y; X break; X case EAST: X case SOUTH: X fix_x = compound->nwcorner.x; X fix_y = compound->nwcorner.y; X cur_x = compound->secorner.x; X cur_y = compound->secorner.y; X break; X } X X /* save initial corner position */ X fromx = cur_x; fromy = cur_y; X /* save x or y coordinate for restoring the cursor */ X /* at the end of the scaling */ X switch (side) { X case NORTH: case SOUTH: X save_coord = x; X break; X case EAST: case WEST: X save_coord = y; X break; X } X /* erase the compound box. */ X win_setmouseposition(canvas_swfd, cur_x, cur_y); X draw_compoundbox(compound, INV_PAINT); X draw_rectbox(fix_x, fix_y, cur_x, cur_y, INV_PAINT, 1); X set_latestcompound(compound); X canvas_locmove_proc = elastic_compoundbox; X canvas_middlebut_proc = prescale_compound; X canvas_leftbut_proc = canvas_rightbut_proc = null_proc; X set_action_on(); X set_temp_cursor(&null_cursor); X win_setmouseposition(canvas_swfd, x, y); X } X} X X Xelastic_compoundbox(x, y) Xint x, y; X{ X draw_rectbox(fix_x, fix_y, cur_x, cur_y, INV_PAINT, 1); X compute_adjustposition(x, y); X win_setmouseposition(canvas_swfd, cur_x, cur_y); X draw_rectbox(fix_x, fix_y, cur_x, cur_y, INV_PAINT, 1); X } X Xcompute_adjustposition(x, y) Xint x, y; X{ X double xx, yy, d; X X switch(side) { X case CORNER: X xx = x - fix_x; X yy = y - fix_y; X d = sqrt(xx*xx + yy*yy); X if (xx < 0) X cur_x = fix_x - round(d * cosa); X else X cur_x = fix_x + round(d * cosa); X if (yy < 0) X cur_y = fix_y - round(d * sina); X else X cur_y = fix_y + round(d * sina); X break; X case NORTH: X case SOUTH: X cur_y = y; X break; X case EAST: X case WEST: X cur_x = x; X break; X } X} X Xprescale_compound(x, y) Xint x, y; X{ X float scalex, scaley; X X draw_rectbox(fix_x, fix_y, cur_x, cur_y, INV_PAINT, 1); X compute_adjustposition(x, y); X erase_compound(compound); X X scalex = ((float) (cur_x - fix_x)) / (fromx - fix_x); X scaley = ((float) (cur_y - fix_y)) / (fromy - fix_y); X scale_compound(compound, scalex, scaley, fix_x, fix_y); X X draw_compound(compound); X draw_compoundbox(compound, INV_PAINT); X last_position.x = fromx; X last_position.y = fromy; X new_position.x = cur_x; X new_position.y = cur_y; X /* update cursor position for single axis scaling. */ X switch (side) { X case NORTH: case SOUTH: X /* maintain old horiz. pos. */ X cur_x = save_coord; X break; X case EAST: case WEST: X /* maintain old vert. pos. */ X cur_y = save_coord; X break; X } X clean_up(); X set_action_object(F_SCALE, O_COMPOUND); X set_latestcompound(compound); X set_modifiedflag(); X scale_compound_selected(); X } X Xscale_compound(c, sx, sy, refx, refy) XF_compound *c; Xfloat sx, sy; Xint refx, refy; X{ X F_line *l; X F_spline *s; X F_ellipse *e; X F_text *t; X F_arc *a; X F_compound *c1; X int x1, y1, x2, y2; X X x1 = round(refx + (c->nwcorner.x - refx) * sx); X y1 = round(refy + (c->nwcorner.y - refy) * sy); X x2 = round(refx + (c->secorner.x - refx) * sx); X y2 = round(refy + (c->secorner.y - refy) * sy); X c->nwcorner.x = min(x1, x2); X c->nwcorner.y = min(y1, y2); X c->secorner.x = max(x1, x2); X c->secorner.y = max(y1, y2); X X for (l = c->lines; l != NULL; l = l->next) { X scale_line(l, sx, sy, refx, refy); X } X for (s = c->splines; s != NULL; s = s->next) { X scale_spline(s, sx, sy, refx, refy); X } X for (a = c->arcs; a != NULL; a = a->next) { X scale_arc(a, sx, sy, refx, refy); X } X for (e = c->ellipses; e != NULL; e = e->next) { X scale_ellipse(e, sx, sy, refx, refy); X } X for (t = c->texts; t != NULL; t = t->next) { X scale_text(t, sx, sy, refx, refy); X } X for (c1 = c->compounds; c1 != NULL; c1 = c1->next) { X scale_compound(c1, sx, sy, refx, refy); X } X } X Xscale_line(l, sx, sy, refx, refy) XF_line *l; Xfloat sx, sy; Xint refx, refy; X{ X F_point *p; X X for (p = l->points; p != NULL; p = p->next) { X p->x = round(refx + (p->x - refx) * sx); X p->y = round(refy + (p->y - refy) * sy); X } X } X Xscale_spline(s, sx, sy, refx, refy) XF_spline *s; Xfloat sx, sy; Xint refx, refy; X{ X F_point *p; X F_control *c; X X for (p = s->points; p != NULL; p = p->next) { X p->x = round(refx + (p->x - refx) * sx); X p->y = round(refy + (p->y - refy) * sy); X } X for (c = s->controls; c != NULL; c = c->next) { X c->lx = refx + (c->lx - refx) * sx; X c->ly = refy + (c->ly - refy) * sy; X c->rx = refx + (c->rx - refx) * sx; X c->ry = refy + (c->ry - refy) * sy; X } X } X Xscale_arc(a, sx, sy, refx, refy) XF_arc *a; Xfloat sx, sy; Xint refx, refy; X{ X int i; X X for (i = 0; i < 3; i++) { X a->point[i].x = round(refx + (a->point[i].x - refx) * sx); X a->point[i].y = round(refy + (a->point[i].y - refy) * sy); X } X compute_arccenter(a->point[0], a->point[1], a->point[2], X &a->center.x, &a->center.y); X a->direction = compute_direction(a->point[0], a->point[1], a->point[2]); X } X Xscale_ellipse(e, sx, sy, refx, refy) XF_ellipse *e; Xfloat sx, sy; Xint refx, refy; X{ X e->center.x = round(refx + (e->center.x - refx) * sx); X e->center.y = round(refy + (e->center.y - refy) * sy); X e->start.x = round(refx + (e->start.x - refx) * sx); X e->start.y = round(refy + (e->start.y - refy) * sy); X e->end.x = round(refx + (e->end.x - refx) * sx); X e->end.y = round(refy + (e->end.y - refy) * sy); X e->radiuses.x = round(e->radiuses.x * sx); X e->radiuses.y = round(e->radiuses.y * sy); X } X Xscale_text(t, sx, sy, refx, refy) XF_text *t; Xfloat sx, sy; Xint refx, refy; X{ X t->base_x = round(refx + (t->base_x - refx) * sx); X t->base_y = round(refy + (t->base_y - refy) * sy); X } END_OF_FILE if test 8385 -ne `wc -c <'xfig/scale.c'`; then echo shar: \"'xfig/scale.c'\" unpacked with wrong size! fi # end of 'xfig/scale.c' fi echo shar: End of archive 10 \(of 15\). cp /dev/null ark10isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 15 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 632 Petaluma Ave, Sebastopol, CA 95472 800-338-NUTS, in CA: 800-533-NUTS, FAX 707-829-0104 Opinions expressed reflect those of the author only.