v08i021: xfig -- X Drawing Tool, Part12/21
Brian V. Smith
envbvs at epb2.lbl.gov
Wed Jul 4 04:01:22 AEST 1990
Submitted-by: envbvs at epb2.lbl.gov (Brian V. Smith)
Posting-number: Volume 8, Issue 21
Archive-name: xfig2.8/part12
#! /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 12 (of 21)."
# Contents: f2p.c ruler.c undo.c
# Wrapped by envbvs at epb2.lbl.gov on Thu Jun 28 08:52:38 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'f2p.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'f2p.c'\"
else
echo shar: Extracting \"'f2p.c'\" \(13361 characters\)
sed "s/^X//" >'f2p.c' <<'END_OF_FILE'
X/*
X * F2p : Fig-to-pic translator
X *
X * Copyright (c) 1985, 1988 by Supoj Sutanthavibul (supoj at sally.UTEXAS.EDU)
X * January 1985.
X * 1st revision : October 1985.
X * 2nd revision : March 1988 - read fig 1.4
X * Support for fonts and point sizes added by daved at physiol.su.oz.au
X * March 1990
X *
X * %W% %G%
X*/
X#include "fig.h"
X#include "object.h"
X#include "troff_fonts.h"
X#include "psfonts.h"
X
Xchar Usage[] = "Usage: f2p [ -f font_file ] [ input_file [ output_file ] ]\n";
Xchar *from = NULL,
X *to = NULL;
XFILE *tfp = NULL;
Xchar Err_incomp[] = "Incomplete %s object at line %d.";
Xchar Err_mem[] = "Running out of memory.";
X
Xint line_thickness; /* not for f2ps - arrow.c needs it for fig */
Xextern struct _fstruct fontnames[]; /* printer font names */
Xint dotps, /* most recent size passed to .ps */
X dotft; /* one more than num of font passed to .ft */
X
X/*VARARGS1*/
Xput_msg(format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)
Xchar *format, *arg1, *arg2, *arg3, *arg4, *arg5, *arg6, *arg7, *arg8;
X{
X fprintf(stderr, format, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
X fputc('\n',stderr);
X}
X
Xget_args(argc, argv)
Xint argc;
Xchar *argv[];
X{
X char *a;
X int first = 1;
X
X while (--argc)
X {
X a = *++argv;
X if (*a == '-')
X {
X if (*++a == 'f')
X {
X if (--argc)
X font_file = *++argv;
X else
X {
X fprintf(stderr, Usage);
X exit(1);
X }
X }
X else
X {
X fprintf(stderr, Usage);
X exit(1);
X }
X }
X else if (first)
X {
X from = a; /* from file */
X first = 0;
X }
X else if (first == 0)
X {
X to = a; /* to file */
X first = -1;
X }
X else
X {
X fprintf(stderr, Usage);
X exit(1);
X }
X }
X}
X
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
X F_compound objects;
X int status;
X
X get_args(argc, argv);
X troff_init();
X if (to == NULL)
X tfp = stdout;
X else if ((tfp = fopen(to, "w")) == NULL)
X {
X fprintf(stderr, "Couldn't open %s\n", to);
X fprintf(stderr, Usage);
X exit(1);
X }
X
X if (from)
X status = read_fig(from, &objects);
X else /* read from stdin */
X status = readfp_fig(stdin, &objects);
X
X if (status != 0)
X {
X if (from) read_fail_message(from, status);
X exit(1);
X }
X genpic_objects(&objects);
X if (tfp != stdout) fclose(tfp);
X exit(0);
X}
X
X#define TOP 10.5 /* top of page is 10.5 inch */
Xstatic double ppi;
Xstatic int CONV = 0;
X
Xdouble
Xconvy(a)
Xdouble a;
X{
X return((double)(CONV ? TOP-a : a));
X}
X
Xgenpic_objects(objects)
XF_compound *objects;
X{
X int coord_system;
X F_arc *a;
X F_compound *c;
X F_ellipse *e;
X F_line *l;
X F_spline *s;
X F_text *t;
X
X if (0 == (ppi = (double)objects->nwcorner.x))
X {
X fprintf(stderr, "Resolution is zero!! default to 80 ppi\n");
X ppi = 80.0;
X }
X coord_system = objects->nwcorner.y;
X if (coord_system != 1 && coord_system != 2)
X {
X fprintf(stderr, "Wrong coordinate system; cannot continue\n");
X return;
X }
X if (coord_system == 2) CONV = 1;
X
X fprintf(tfp, ".PS\n"); /* start of pic macro */
X
X for (a = objects->arcs; a != NULL; a = a->next) genpic_arc(a);
X for (c = objects->compounds; c != NULL; c = c->next) genpic_compound(c);
X for (e = objects->ellipses; e != NULL; e = e->next) genpic_ellipse(e);
X for (l = objects->lines; l != NULL; l = l->next) genpic_line(l);
X for (s = objects->splines; s != NULL; s = s->next) genpic_spline(s);
X for (t = objects->texts; t != NULL; t = t->next) genpic_text(t);
X if(dotps)
X fprintf(tfp, ".ps\n"); /* back to initial point size */
X if(dotft)
X fprintf(tfp, ".ft\n"); /* back to initial font */
X fprintf(tfp, ".PE\n");
X}
X
X/*
X** linewidth can be controlled with pointsize, but this means we have
X** to be rigorous about using a .ps (null) every time, so a real point size
X** request can revert to previous size
X*/
Xset_linewidth(w)
Xint w;
X{
X if (w == 0 || w*10 == dotps) return;
X fprintf(tfp,".ps\n.ps %d\n",dotps = 10*w);
X}
X
Xset_style(s, v)
Xint s;
Xfloat v;
X{
X static float style_val = -1;
X
X if (s == DASH_LINE || s == DOTTED_LINE)
X {
X if (v == style_val) return;
X if (v == 0.0) return;
X style_val = v;
X fprintf(tfp, "dashwid = %.3fi\n", style_val/ppi);
X }
X}
X
Xgenpic_compound(com)
XF_compound *com;
X{
X F_arc *a;
X F_compound *c;
X F_ellipse *e;
X F_line *l;
X F_spline *s;
X F_text *t;
X
X for (a = com->arcs; a != NULL; a = a->next) genpic_arc(a);
X for (c = com->compounds; c != NULL; c = c->next) genpic_compound(c);
X for (e = com->ellipses; e != NULL; e = e->next) genpic_ellipse(e);
X for (l = com->lines; l != NULL; l = l->next) genpic_line(l);
X for (s = com->splines; s != NULL; s = s->next) genpic_spline(s);
X for (t = com->texts; t != NULL; t = t->next) genpic_text(t);
X}
X
Xgenpic_line(l)
XF_line *l;
X{
X F_point *p, *q;
X
X set_linewidth(l->thickness);
X set_style(l->style, l->style_val);
X p = l->points;
X q = p->next;
X if (q == NULL)
X { /* A single point line */
X fprintf(tfp, "line from %.3f,%.3f to %.3f,%.3f\n",
X p->x/ppi, convy(p->y/ppi), p->x/ppi, convy(p->y/ppi));
X return;
X }
X if (l->back_arrow)
X draw_arrow_head(q->x/ppi, convy(q->y/ppi), p->x/ppi,
X convy(p->y/ppi), l->back_arrow->ht/ppi, l->back_arrow->wid/ppi);
X if (l->style == DASH_LINE && l->style_val > 0.0)
X fprintf(tfp, "line dashed from");
X else if (l->style == DOTTED_LINE && l->style_val > 0.0)
X fprintf(tfp, "line dotted from");
X else
X fprintf(tfp, "line from");
X fprintf(tfp, " %.3f,%.3f to", p->x/ppi, convy(p->y/ppi));
X while (q->next != NULL)
X {
X p = q;
X q = q->next;
X fprintf(tfp, " %.3f,%.3f to", p->x/ppi, convy(p->y/ppi));
X }
X fprintf(tfp, " %.3f,%.3f\n", q->x/ppi, convy(q->y/ppi));
X if (l->for_arrow)
X draw_arrow_head(p->x/ppi, convy(p->y/ppi), q->x/ppi,
X convy(q->y/ppi), l->for_arrow->ht/ppi, l->for_arrow->wid/ppi);
X}
X
Xgenpic_spline(s)
XF_spline *s;
X{
X set_linewidth(s->thickness);
X if (int_spline(s))
X genpic_itp_spline(s);
X else
X genpic_ctl_spline(s);
X}
X
Xgenpic_ctl_spline(s)
XF_spline *s;
X{
X if (closed_spline(s))
X genpic_closed_spline(s);
X else
X genpic_open_spline(s);
X}
X
Xgenpic_open_spline(s)
XF_spline *s;
X{
X double x1, y1, x2, y2;
X F_point *p, *q;
X
X p = s->points;
X x1 = p->x/ppi;
X y1 = convy(p->y/ppi);
X p = p->next;
X x2 = p->x/ppi;
X y2 = convy(p->y/ppi);
X
X if (s->back_arrow)
X draw_arrow_head(x2, y2, x1, y1,
X s->back_arrow->ht/ppi, s->back_arrow->wid/ppi);
X
X /* Pic's spline supports only solid line style */
X
X if (p->next == NULL)
X {
X fprintf(tfp, "line from %.3f,%.3f to %.3f,%.3f\n", x1, y1, x2, y2);
X if (s->for_arrow)
X draw_arrow_head(x1, y1, x2, y2, s->for_arrow->ht/ppi,
X s->for_arrow->wid/ppi);
X return;
X }
X
X fprintf(tfp, "spline from %.3f,%.3f to %.3f,%.3f", x1, y1, x2, y2);
X
X for (q = p->next; q->next != NULL; p = q, q = q->next)
X fprintf(tfp, " to %.3f,%.3f", q->x/ppi, convy(q->y/ppi));
X fprintf(tfp, " to %.3f,%.3f\n", (x2=q->x/ppi), (y2=convy(q->y/ppi)));
X
X if (s->for_arrow)
X draw_arrow_head(p->x/ppi, convy(p->y/ppi), x2, y2,
X s->for_arrow->ht/ppi, s->for_arrow->wid/ppi);
X}
X
Xgenpic_ellipse(e)
XF_ellipse *e;
X{
X set_linewidth(e->thickness);
X fprintf(tfp, "ellipse at %.3f,%.3f wid %.3f ht %.3f\n",
X e->center.x/ppi, convy(e->center.y/ppi),
X 2 * e->radiuses.x/ppi, 2 * e->radiuses.y/ppi);
X}
X
X/*
XText is display on the screen with the base line starting at
X(base_x, base_y); some characters extend below this line.
XPic displays the center of the height of text at the given
Xcoordinate. HT_OFFSET is use to compensate all the above factors
Xso text position in fig 1.4 should be at the same position on
Xthe screen as on the hard copy.
X*/
X#define HT_OFFSET (0.2 / 72.0)
X
Xgenpic_text(t)
XF_text *t;
X{
X float y;
X static char fontcode[NUMFONTS][3];
X int i;
X
X if(fontcode[t->font][0] == '\0')
X for(i=0; *troff_fonts[i].lwname != '\0'; i++)
X {
X if(strcmp(troff_fonts[i].lwname,fontnames[t->font].psfont)==0)
X {
X strncpy(&fontcode[t->font][0],troff_fonts[i].trname,2);
X break;
X }
X }
X if(fontcode[t->font][0] == '\0')
X fontcode[t->font][0] = 'R'; /* default */
X
X if(t->size != dotps)
X fprintf(tfp, ".ps\n.ps %d\n", dotps = t->size);
X if(t->font != dotft - 1)
X {
X fprintf(tfp, ".ft\n.ft %s\n", &fontcode[t->font][0]);
X dotft = t->font + 1;
X }
X
X y = convy(t->base_y/ppi) + t->size * HT_OFFSET;
X fprintf(tfp, "\"%s\" at %.3f,%.3f",
X t->cstring, t->base_x/ppi, y);
X
X switch(t->type)
X {
X case T_RIGHT_JUSTIFIED:
X fprintf(tfp, " rjust\n");
X break;
X case T_LEFT_JUSTIFIED:
X fprintf(tfp, " ljust\n");
X break;
X default:
X putc('\n',tfp);
X }
X}
X
Xgenpic_arc(a)
XF_arc *a;
X{
X double x, y;
X double cx, cy, sx, sy, ex, ey;
X
X cx = a->center.x/ppi;
X cy = convy(a->center.y/ppi);
X sx = a->point[0].x/ppi;
X sy = convy(a->point[0].y/ppi);
X ex = a->point[2].x/ppi;
X ey = convy(a->point[2].y/ppi);
X
X set_linewidth(a->thickness);
X
X if (a->for_arrow)
X {
X arc_tangent(cx, cy, ex, ey, a->direction, &x, &y);
X draw_arrow_head(x, y, ex, ey,
X a->for_arrow->ht/ppi, a->for_arrow->wid/ppi);
X }
X if (a->back_arrow)
X {
X arc_tangent(cx, cy, sx, sy, !a->direction, &x, &y);
X draw_arrow_head(x, y, sx, sy,
X a->back_arrow->ht/ppi, a->back_arrow->wid/ppi);
X }
X
X if (a->direction)
X fprintf(tfp, "arc at %.3f,%.3f from %.3f,%.3f to %.3f,%.3f\n",
X cx, cy, sx, sy, ex, ey);
X else
X fprintf(tfp, "arc at %.3f,%.3f from %.3f,%.3f to %.3f,%.3f cw\n",
X cx, cy, sx, sy, ex, ey);
X
X}
X
Xarc_tangent(x1, y1, x2, y2, direction, x, y)
Xdouble x1, y1, x2, y2, *x, *y;
Xint direction;
X{
X if (direction)
X { /* counter clockwise */
X *x = x2 + (y2 - y1);
X *y = y2 - (x2 - x1);
X }
X else
X {
X *x = x2 - (y2 - y1);
X *y = y2 + (x2 - x1);
X }
X}
X
X/* draw arrow heading from (x1, y1) to (x2, y2) */
X
Xdraw_arrow_head(x1, y1, x2, y2, arrowht, arrowwid)
Xdouble x1, y1, x2, y2, arrowht, arrowwid;
X{
X double x, y, xb, yb, dx, dy, l, sina, cosa;
X double xc, yc, xd, yd;
X
X dx = x2 - x1;
X dy = y1 - y2;
X l = sqrt((dx*dx + dy*dy));
X sina = dy / l;
X cosa = dx / l;
X xb = x2*cosa - y2*sina;
X yb = x2*sina + y2*cosa;
X x = xb - arrowht;
X y = yb - arrowwid / 2;
X xc = x*cosa + y*sina;
X yc = -x*sina + y*cosa;
X y = yb + arrowwid / 2;
X xd = x*cosa + y*sina;
X yd = -x*sina + y*cosa;
X fprintf(tfp, "line from %.3f,%.3f to %.3f,%.3f to %.3f,%.3f\n",
X xc, yc, x2, y2, xd, yd);
X}
X
X#define THRESHOLD .05 /* inch */
X
Xquadratic_spline(a1, b1, a2, b2, a3, b3, a4, b4)
Xdouble a1, b1, a2, b2, a3, b3, a4, b4;
X{
X double x1, y1, x4, y4;
X double xmid, ymid;
X
X x1 = a1;
X y1 = b1;
X x4 = a4;
X y4 = b4;
X
X xmid = (a2 + a3) / 2;
X ymid = (b2 + b3) / 2;
X if (fabs(x1 - xmid) < THRESHOLD && fabs(y1 - ymid) < THRESHOLD)
X {
X fprintf(tfp, "\tto %.3f,%.3f\\\n", xmid, ymid);
X }
X else
X {
X quadratic_spline(x1, y1, ((x1+a2)/2), ((y1+b2)/2),
X ((3*a2+a3)/4), ((3*b2+b3)/4), xmid, ymid);
X }
X
X if (fabs(xmid - x4) < THRESHOLD && fabs(ymid - y4) < THRESHOLD)
X {
X fprintf(tfp, "\tto %.3f,%.3f\\\n", x4, y4);
X }
X else
X {
X quadratic_spline(xmid, ymid, ((a2+3*a3)/4), ((b2+3*b3)/4),
X ((a3+x4)/2), ((b3+y4)/2), x4, y4);
X }
X}
X
Xgenpic_closed_spline(s)
XF_spline *s;
X{
X F_point *p;
X double cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4;
X double x1, y1, x2, y2;
X
X set_linewidth(s->thickness);
X p = s->points;
X x1 = p->x/ppi;
X y1 = convy(p->y/ppi);
X p = p->next;
X x2 = p->x/ppi;
X y2 = convy(p->y/ppi);
X cx1 = (x1 + x2) / 2;
X cy1 = (y1 + y2) / 2;
X cx2 = (x1 + 3 * x2) / 4;
X cy2 = (y1 + 3 * y2) / 4;
X
X for (p = p->next; p != NULL; p = p->next)
X {
X fprintf(tfp, "line from %.3f,%.3f ", cx1, cy1);
X x1 = x2;
X y1 = y2;
X x2 = p->x/ppi;
X y2 = convy(p->y/ppi);
X cx3 = (3 * x1 + x2) / 4;
X cy3 = (3 * y1 + y2) / 4;
X cx4 = (x1 + x2) / 2;
X cy4 = (y1 + y2) / 2;
X quadratic_spline(cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4);
X fprintf(tfp, "\n");
X cx1 = cx4;
X cy1 = cy4;
X cx2 = (x1 + 3 * x2) / 4;
X cy2 = (y1 + 3 * y2) / 4;
X }
X x1 = x2;
X y1 = y2;
X p = s->points->next;
X x2 = p->x/ppi;
X y2 = convy(p->y/ppi);
X cx3 = (3 * x1 + x2) / 4;
X cy3 = (3 * y1 + y2) / 4;
X cx4 = (x1 + x2) / 2;
X cy4 = (y1 + y2) / 2;
X fprintf(tfp, "line from %.3f,%.3f ", cx1, cy1);
X quadratic_spline(cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4);
X fprintf(tfp, "\n");
X}
X
Xgenpic_itp_spline(s)
XF_spline *s;
X{
X F_point *p1, *p2;
X F_control *cp1, *cp2;
X double x1, x2, y1, y2;
X
X p1 = s->points;
X cp1 = s->controls;
X cp2 = cp1->next;
X x2 = p1->x/ppi;
X y2 = convy(p1->y/ppi);
X
X if (s->back_arrow)
X draw_arrow_head(cp2->lx/ppi, convy(cp2->ly/ppi), x2, y2,
X s->back_arrow->ht/ppi, s->back_arrow->wid/ppi);
X
X for (p2 = p1->next, cp2 = cp1->next; p2 != NULL;
X cp1 = cp2, p2 = p2->next, cp2 = cp2->next)
X {
X fprintf(tfp, "line from %.3f,%.3f ", x2, y2);
X x1 = x2;
X y1 = y2;
X x2 = p2->x/ppi;
X y2 = convy(p2->y/ppi);
X bezier_spline(x1, y1, (double)cp1->rx/ppi, convy(cp1->ry/ppi),
X (double)cp2->lx/ppi, convy(cp2->ly/ppi), x2, y2);
X fprintf(tfp, "\n");
X }
X
X if (s->for_arrow)
X draw_arrow_head((double)cp1->lx/ppi, convy(cp1->ly/ppi), x1, y1,
X (double)s->for_arrow->ht/ppi, (double)s->for_arrow->wid/ppi);
X}
X
Xbezier_spline(a0, b0, a1, b1, a2, b2, a3, b3)
Xdouble a0, b0, a1, b1, a2, b2, a3, b3;
X{
X double x0, y0, x3, y3;
X double sx1, sy1, sx2, sy2, tx, ty, tx1, ty1, tx2, ty2, xmid, ymid;
X
X x0 = a0;
X y0 = b0;
X x3 = a3;
X y3 = b3;
X if (fabs(x0 - x3) < THRESHOLD && fabs(y0 - y3) < THRESHOLD)
X {
X fprintf(tfp, "\tto %.3f,%.3f\\\n", x3, y3);
X }
X else
X {
X tx = (a1 + a2) / 2;
X ty = (b1 + b2) / 2;
X sx1 = (x0 + a1) / 2;
X sy1 = (y0 + b1) / 2;
X sx2 = (sx1 + tx) / 2;
X sy2 = (sy1 + ty) / 2;
X tx2 = (a2 + x3) / 2;
X ty2 = (b2 + y3) / 2;
X tx1 = (tx2 + tx) / 2;
X ty1 = (ty2 + ty) / 2;
X xmid = (sx2 + tx1) / 2;
X ymid = (sy2 + ty1) / 2;
X
X bezier_spline(x0, y0, sx1, sy1, sx2, sy2, xmid, ymid);
X bezier_spline(xmid, ymid, tx1, ty1, tx2, ty2, x3, y3);
X }
X}
X
END_OF_FILE
if test 13361 -ne `wc -c <'f2p.c'`; then
echo shar: \"'f2p.c'\" unpacked with wrong size!
fi
# end of 'f2p.c'
fi
if test -f 'ruler.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'ruler.c'\"
else
echo shar: Extracting \"'ruler.c'\" \(12537 characters\)
sed "s/^X//" >'ruler.c' <<'END_OF_FILE'
X/*
X * FIG : Facility for Interactive Generation of figures
X *
X * Copyright (c) 1985 by Supoj Sutanthavibul (supoj at 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 "const.h"
X#include "font.h"
X#include "paintop.h"
X
X#define INCH_MARK 8
X#define HALF_MARK 8
X#define QUARTER_MARK 6
X#define SIXTEENTH_MARK 4
X
X#define TRM_WID 16
X#define TRM_HT 8
X#define SRM_WID 8
X#define SRM_HT 16
X
Xextern int CANVAS_HEIGHT, CANVAS_WIDTH;
Xextern int SIDERULER_WIDTH, SIDERULER_HEIGHT;
Xextern int TOPRULER_WIDTH, TOPRULER_HEIGHT;
Xextern int SIDERULER_HEIGHT, SIDERULER_START;
Xextern int TOPRULER_LEFT, TOPRULER_TOP;
Xextern null_proc();
Xextern appresStruct appres;
X
Xstatic lasty = -100;
Xstatic lastx = -100;
Xstatic int troffx = -7, troffy = -10;
Xstatic char tr_marker_image[16] = {
X 0xFE, 0xFF, /* *************** */
X 0xFC, 0x7F, /* ************* */
X 0xF8, 0x3F, /* *********** */
X 0xF0, 0x1F, /* ********* */
X 0xE0, 0x0F, /* ******* */
X 0xC0, 0x07, /* ***** */
X 0x80, 0x03, /* *** */
X 0x00, 0x01, /* * */
X };
Xstatic mpr_static(trm_pr, TRM_WID, TRM_HT, 1, tr_marker_image);
Xstatic int srroffx = 2, srroffy = -7;
Xstatic char srr_marker_image[16] = {
X 0x80, /* * */
X 0xC0, /* ** */
X 0xE0, /* *** */
X 0xF0, /* **** */
X 0xF8, /* ***** */
X 0xFC, /* ****** */
X 0xFE, /* ******* */
X 0xFF, /* ******** */
X 0xFE, /* ******* */
X 0xFC, /* ****** */
X 0xF8, /* ***** */
X 0xF0, /* **** */
X 0xE0, /* *** */
X 0xC0, /* ** */
X 0x80, /* * */
X 0x00
X };
Xstatic mpr_static(srrm_pr, SRM_WID, SRM_HT, 1, srr_marker_image);
X
Xstatic int srloffx = -10, srloffy = -7;
Xstatic char srl_marker_image[16] = {
X 0x01, /* * */
X 0x03, /* ** */
X 0x07, /* *** */
X 0x0F, /* **** */
X 0x1F, /* ***** */
X 0x3F, /* ****** */
X 0x7F, /* ******* */
X 0xFF, /* ******** */
X 0x7F, /* ******* */
X 0x3F, /* ****** */
X 0x1F, /* ***** */
X 0x0F, /* **** */
X 0x07, /* *** */
X 0x03, /* ** */
X 0x01, /* * */
X 0x00
X };
Xstatic mpr_static(srlm_pr, SRM_WID, SRM_HT, 1, srl_marker_image);
X
Xstatic Pixmap toparrow_pm, sidearrow_pm;
X
Xset_toprulermark(x)
Xint x;
X{
X XClearArea(tool_d, topruler_win,lastx + troffx,
X TOPRULER_HEIGHT + troffy,trm_pr.width,
X trm_pr.height, False);
X XCopyArea(tool_d, toparrow_pm, topruler_win, topgc,
X 0, 0, trm_pr.width, trm_pr.height,
X x + troffx, TOPRULER_HEIGHT + troffy);
X lastx = x;
X }
X
Xstatic Arg ruler_args[] =
X{
X /* 0 */ { XtNwidth, (XtArgVal) 0 },
X /* 1 */ { XtNheight, (XtArgVal) 0 },
X /* 2 */ { XtNlabel, (XtArgVal) "" },
X /* 3 */ { XtNfromHoriz, (XtArgVal) NULL },
X /* 4 */ { XtNhorizDistance, (XtArgVal) 0 },
X /* 5 */ { XtNfromVert, (XtArgVal) NULL },
X /* 6 */ { XtNvertDistance, (XtArgVal) 0 },
X /* 7 */ { XtNresizable, (XtArgVal) False },
X /* 8 */ { XtNtop, (XtArgVal) XtRubber }, /* these will be changed */
X /* 9 */ { XtNbottom, (XtArgVal) XtRubber },
X /* 10 */ { XtNleft, (XtArgVal) XtRubber },
X /* 11 */ { XtNright, (XtArgVal) XtRubber },
X};
X
Xextern int SIDERULER_WIDTH, SIDERULER_HEIGHT;
Xextern int TOPRULER_WIDTH, TOPRULER_HEIGHT;
X
Xint
Xinit_sideruler(tool)
X TOOL tool;
X{
X ruler_args[0].value = SIDERULER_WIDTH = RULER_WIDTH;
X ruler_args[1].value = SIDERULER_HEIGHT = CANVAS_HEIGHT;
X ruler_args[3].value = (XtArgVal) canvas_sw; /* from right edge of canvas */
X ruler_args[5].value = (XtArgVal) topruler_sw; /* down from top ruler */
X /* Place the sideruler below the topruler, next to the canvas,
X but fixed offset from the top of the form */
X ruler_args[8].value = (XtArgVal) XtChainTop;
X ruler_args[9].value = (XtArgVal) XtRubber;
X ruler_args[10].value = (XtArgVal) XtChainRight;
X ruler_args[11].value = (XtArgVal) XtChainRight;
X
X sideruler_sw = XtCreateWidget("sruler", labelWidgetClass, tool,
X ruler_args, XtNumber(ruler_args));
X return(1);
X}
X
Xredisplay_sideruler()
X{
X XClearWindow(tool_d, sideruler_win);
X}
X
Xint
Xinit_topruler(tool)
X TOOL tool;
X{
X ruler_args[0].value = TOPRULER_WIDTH = CANVAS_WIDTH;; /* width */
X ruler_args[1].value = TOPRULER_HEIGHT = RULER_WIDTH; /* height */
X ruler_args[3].value = (XtArgVal) panel_sw;
X ruler_args[5].value = (XtArgVal) NULL;
X /* fix the top & bottom to the top of the form,
X the left to the panel, and the right is rubber */
X ruler_args[8].value = (XtArgVal) XtChainTop;
X ruler_args[9].value = (XtArgVal) XtChainTop;
X ruler_args[10].value = (XtArgVal) XtChainLeft;
X ruler_args[11].value = (XtArgVal) XtRubber;
X
X topruler_sw = XtCreateWidget("truler", labelWidgetClass, tool,
X ruler_args, XtNumber(ruler_args));
X return(1);
X}
X
Xredisplay_topruler()
X{
X XClearWindow(tool_d, topruler_win);
X}
X
Xsetup_rulers()
X{
X register int i, j;
X register Pixmap p;
X#define HINCH (PIX_PER_INCH / 2)
X#define QINCH (PIX_PER_INCH / 4)
X#define SINCH (PIX_PER_INCH / 16)
X#define TWOMM (PIX_PER_CM / 5)
X char number[3];
X Arg tmp_arg[3];
X unsigned long bg, fg;
X static Arg ruler_args[] =
X {
X { XtNbackgroundPixmap, (XtArgVal)NULL },
X };
X
X topruler_win = XtWindow(topruler_sw);
X sideruler_win = XtWindow(sideruler_sw);
X XDefineCursor(tool_d, topruler_win, (Cursor)bull_cursor.bitmap);
X XDefineCursor(tool_d, sideruler_win, (Cursor)bull_cursor.bitmap);
X
X /* top ruler, adjustments for digits are kludges based on 6x13 char */
X p = XCreatePixmap(tool_d, topruler_win,
X TOPRULER_WIDTH, TOPRULER_HEIGHT,
X DefaultDepthOfScreen(tool_s));
X
X XtSetArg(tmp_arg[0], XtNbackground, &bg);
X XtSetArg(tmp_arg[1], XtNforeground, &fg);
X XtGetValues(topruler_sw, tmp_arg, 2);
X
X XSetBackground(tool_d, gc, bg);
X XSetForeground(tool_d, gc, bg);
X XFillRectangle(tool_d, p, gc, 0, 0, TOPRULER_WIDTH,
X TOPRULER_HEIGHT);
X XSetForeground(tool_d, gc, fg);
X
X XDrawString(tool_d, p, gc, 2, TOPRULER_HEIGHT - INCH_MARK - 3,
X appres.INCHES ? "in" : "cm", 2);
X if(appres.INCHES)
X for (i = SINCH - 1; i <= TOPRULER_WIDTH; i += SINCH)
X {
X j = i + 1;
X if (j % PIX_PER_INCH == 0)
X {
X XDrawLine(tool_d, p, gc, i, TOPRULER_HEIGHT - 1, i,
X TOPRULER_HEIGHT - INCH_MARK - 1);
X sprintf(number, "%d", j / PIX_PER_INCH);
X XDrawString(tool_d, p, gc, i - 3,
X TOPRULER_HEIGHT - INCH_MARK - 3, number,
X j < PIX_PER_INCH * 10 ? 1 : 2);
X }
X else if (j % HINCH == 0)
X XDrawLine(tool_d, p, gc, i, TOPRULER_HEIGHT - 1, i,
X TOPRULER_HEIGHT - HALF_MARK - 1);
X else if (j % QINCH == 0)
X XDrawLine(tool_d, p, gc, i, TOPRULER_HEIGHT - 1, i,
X TOPRULER_HEIGHT - QUARTER_MARK - 1);
X else if (j % SINCH == 0)
X XDrawLine(tool_d, p, gc, i, TOPRULER_HEIGHT - 1, i,
X TOPRULER_HEIGHT - SIXTEENTH_MARK - 1);
X }
X else
X for (i = TWOMM - 1; i <= TOPRULER_WIDTH; i++)
X {
X j = i + 1;
X if (j % PIX_PER_CM == 0)
X {
X XDrawLine(tool_d, p, gc, i, TOPRULER_HEIGHT - 1, i,
X TOPRULER_HEIGHT - INCH_MARK - 1);
X sprintf(number, "%d", j / PIX_PER_CM);
X XDrawString(tool_d, p, gc, i - 3,
X TOPRULER_HEIGHT - INCH_MARK - 3, number,
X j < PIX_PER_CM * 10 ? 1 : 2);
X }
X else if (j % TWOMM == 0)
X XDrawLine(tool_d, p, gc, i, TOPRULER_HEIGHT - 1, i,
X TOPRULER_HEIGHT - QUARTER_MARK - 1);
X }
X ruler_args[0].value = (XtArgVal) p;
X XtSetValues(topruler_sw, ruler_args, 1);
X
X /* The arrows will be XORed into the rulers.
X We want the foreground color in the arrow to result in
X the foreground or background color in the display.
X so if the source pixel is fg^bg, it produces fg when XOR'ed
X with bg, and bg when XOR'ed with bg.
X
X If the source pixel is zero, it produces fg when XOR'ed with
X fg, and bg when XOR'ed with bg.
X */
X XSetForeground(tool_d, gc, fg ^ bg);
X XSetBackground(tool_d, gc, 0);
X
X /* make pixmaps for top ruler arrow */
X toparrow_pm = XCreatePixmap(tool_d, topruler_win, trm_pr.width,
X trm_pr.height,
X DefaultDepthOfScreen(tool_s));
X XPutImage(tool_d, toparrow_pm, gc, &trm_pr, 0, 0, 0, 0,
X trm_pr.width, trm_pr.height);
X
X /* side ruler, adjustments for digits are kludges based on 6x13 char */
X p = XCreatePixmap(tool_d, sideruler_win,
X SIDERULER_WIDTH, SIDERULER_HEIGHT,
X DefaultDepthOfScreen(tool_s));
X XtSetArg(tmp_arg[0], XtNbackground, &bg);
X XtSetArg(tmp_arg[1], XtNforeground, &fg);
X XtGetValues(sideruler_sw, tmp_arg, 2);
X
X XSetBackground(tool_d, gc, bg);
X XSetForeground(tool_d, gc, bg);
X XFillRectangle(tool_d, p, gc, 0, 0, SIDERULER_WIDTH,
X SIDERULER_HEIGHT);
X XSetForeground(tool_d, gc, fg);
X
X if( appres.INCHES )
X {
X if( appres.RHS_PANEL )
X {
X for (i = SINCH - 1; i <= SIDERULER_HEIGHT; i += SINCH)
X {
X j = i + 1;
X if (j % PIX_PER_INCH == 0)
X {
X XDrawLine(tool_d, p, gc, RULER_WIDTH-INCH_MARK,
X i, RULER_WIDTH, i);
X sprintf(number, "%d", j / PIX_PER_INCH);
X XDrawString(tool_d, p, gc,
X RULER_WIDTH-INCH_MARK - 8, i + 3,
X number, j < PIX_PER_INCH * 10 ? 1 : 2);
X }
X else if (j % QINCH == 0)
X XDrawLine(tool_d, p, gc,
X RULER_WIDTH-QUARTER_MARK, i,
X RULER_WIDTH, i);
X else if (j % SINCH == 0)
X XDrawLine(tool_d, p, gc,
X RULER_WIDTH-SIXTEENTH_MARK, i,
X RULER_WIDTH, i);
X }
X }
X else
X {
X for (i = SINCH - 1; i <= SIDERULER_HEIGHT; i += SINCH)
X {
X j = i + 1;
X if (j % PIX_PER_INCH == 0)
X {
X XDrawLine(tool_d, p, gc, 0, i,
X INCH_MARK - 1, i);
X sprintf(number, "%d", j / PIX_PER_INCH);
X XDrawString(tool_d, p, gc, INCH_MARK + 3,
X i + 3, number,
X j < PIX_PER_INCH * 10 ? 1 : 2);
X }
X else if (j % QINCH == 0)
X XDrawLine(tool_d, p, gc, 0, i,
X QUARTER_MARK - 1, i);
X else if (j % SINCH == 0)
X XDrawLine(tool_d, p, gc, 0, i,
X SIXTEENTH_MARK - 1, i);
X }
X }
X }
X else
X {
X if( appres.RHS_PANEL )
X {
X for (i = TWOMM - 1; i <= SIDERULER_HEIGHT; i++)
X {
X j = i + 1;
X if (j % PIX_PER_CM == 0)
X {
X XDrawLine(tool_d, p, gc, RULER_WIDTH-INCH_MARK,
X i, RULER_WIDTH, i);
X sprintf(number, "%d", j / PIX_PER_CM);
X XDrawString(tool_d, p, gc,
X RULER_WIDTH-INCH_MARK - 8, i + 3,
X number, j < PIX_PER_CM * 10 ? 1 : 2);
X }
X else if (j % TWOMM == 0)
X XDrawLine(tool_d, p, gc,
X RULER_WIDTH-QUARTER_MARK, i,
X RULER_WIDTH, i);
X }
X }
X else
X {
X for (i = TWOMM - 1; i <= SIDERULER_HEIGHT; i++)
X {
X j = i + 1;
X if (j % PIX_PER_CM == 0)
X {
X XDrawLine(tool_d, p, gc, 0, i,
X INCH_MARK - 1, i);
X sprintf(number, "%d", j / PIX_PER_CM);
X XDrawString(tool_d, p, gc, INCH_MARK + 3,
X i + 3, number,
X j < PIX_PER_CM * 10 ? 1 : 2);
X }
X else if (j % TWOMM == 0)
X XDrawLine(tool_d, p, gc, 0, i,
X QUARTER_MARK - 1, i);
X }
X }
X }
X ruler_args[0].value = (XtArgVal) p;
X XtSetValues(sideruler_sw, ruler_args, 1);
X
X /* Colors set as above */
X XSetForeground(tool_d, gc, fg ^ bg);
X XSetBackground(tool_d, gc, 0);
X
X /* make pixmaps for side ruler arrow */
X if( appres.RHS_PANEL )
X {
X sidearrow_pm = XCreatePixmap(tool_d, sideruler_win,
X srlm_pr.width, srlm_pr.height,
X DefaultDepthOfScreen(tool_s));
X XPutImage(tool_d, sidearrow_pm, gc, &srlm_pr, 0, 0, 0, 0,
X srlm_pr.width, srlm_pr.height);
X }
X else
X {
X sidearrow_pm = XCreatePixmap(tool_d, sideruler_win,
X srrm_pr.width, srrm_pr.height,
X DefaultDepthOfScreen(tool_s));
X XPutImage(tool_d, sidearrow_pm, gc, &srrm_pr, 0, 0, 0, 0,
X srrm_pr.width, srrm_pr.height);
X }
X}
X
Xset_rulermark(x, y)
Xint x, y;
X{
X if( appres.TRACKING )
X {
X set_siderulermark(y);
X set_toprulermark(x);
X }
X}
X
Xredisplay_rulers()
X{
X redisplay_topruler();
X redisplay_sideruler();
X}
X
Xset_siderulermark(y)
Xint y;
X{
X if( appres.RHS_PANEL ) {
X /* Because the ruler uses a background pixmap, we can win
X here by using XClearArea to erase the old thing. */
X XClearArea(tool_d, sideruler_win,
X RULER_WIDTH+srloffx, lasty + srloffy,
X srlm_pr.width, srlm_pr.height, False);
X XCopyArea(tool_d, sidearrow_pm, sideruler_win,
X sidegc, 0, 0, srlm_pr.width,
X srlm_pr.height, RULER_WIDTH+srloffx, y + srloffy);
X }
X else
X {
X /* Because the ruler uses a background pixmap, we can win
X here by using XClearArea to erase the old thing. */
X XClearArea(tool_d, sideruler_win,
X srroffx, lasty + srroffy,
X srlm_pr.width, srlm_pr.height, False);
X XCopyArea(tool_d, sidearrow_pm, sideruler_win,
X sidegc, 0, 0, srrm_pr.width,
X srrm_pr.height, srroffx, y + srroffy);
X }
X lasty = y;
X}
END_OF_FILE
if test 12537 -ne `wc -c <'ruler.c'`; then
echo shar: \"'ruler.c'\" unpacked with wrong size!
fi
# end of 'ruler.c'
fi
if test -f 'undo.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'undo.c'\"
else
echo shar: Extracting \"'undo.c'\" \(13353 characters\)
sed "s/^X//" >'undo.c' <<'END_OF_FILE'
X/*
X * FIG : Facility for Interactive Generation of figures
X *
X * Copyright (c) 1985, 1988 by Supoj Sutanthavibul (supoj at 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 "func.h"
X#include "object.h"
X#include "paintop.h"
X
Xextern int pointmarker_shown, compoundbox_shown;
X
Xextern int foreground_color, background_color;
Xextern int last_action, last_object;
Xextern int last_axis, last_rotateangle;
Xextern int movedpoint_num;
Xextern int fix_x, fix_y;
Xextern F_pos last_position, new_position;
X
Xextern F_compound objects;
Xextern F_compound saved_objects;
Xextern F_compound object_tails;
X
Xextern F_point *left_point;
Xextern F_point *moved_point;
Xextern F_point *deleted_point;
Xextern F_point *added_point;
X
Xundo()
X{
X switch(last_action) {
X case F_CREATE :
X undo_create();
X break;
X case F_REMOVE :
X undo_remove();
X break;
X case F_MOVE :
X undo_move();
X break;
X case F_MOVE_POINT :
X undo_movepoint();
X break;
X case F_FLIP :
X undo_flip();
X break;
X case F_ROTATE :
X undo_rotate();
X break;
X case F_GLUE :
X undo_glue();
X break;
X case F_BREAK :
X undo_break();
X break;
X case F_SCALE :
X undo_scale();
X break;
X case F_ADD_POINT :
X undo_addpoint();
X break;
X case F_DELETE_POINT :
X undo_deletepoint();
X break;
X case F_CHANGE :
X undo_change();
X default :
X return;
X }
X }
X
Xundo_addpoint()
X{
X if (last_object == O_POLYLINE)
X linepoint_deleting(saved_objects.lines);
X else
X splinepoint_deleting(saved_objects.splines);
X last_action = F_DELETE_POINT;
X deleted_point = added_point;
X }
X
Xundo_deletepoint()
X{
X if (last_object == O_POLYLINE)
X linepoint_adding(saved_objects.lines, deleted_point);
X else
X splinepoint_adding(saved_objects.splines, deleted_point);
X last_action = F_ADD_POINT;
X added_point = deleted_point;
X }
X
Xundo_break()
X{
X if (compoundbox_shown)
X draw_compoundbox(saved_objects.compounds, INV_PAINT);
X cut_objects(&objects, &object_tails);
X insert_compound(&objects.compounds, saved_objects.compounds);
X last_action = F_GLUE;
X }
X
Xundo_glue()
X{
X put_msg("UNDO for GLUE not working");
X return;
X
X if (compoundbox_shown)
X draw_compoundbox(saved_objects.compounds, INV_PAINT);
X delete_compound(&objects.compounds, saved_objects.compounds);
X append_objects(&objects, saved_objects.compounds, &object_tails);
X last_action = F_BREAK;
X }
X
Xundo_change()
X{
X switch (last_object) {
X case O_POLYLINE :
X change_line(saved_objects.lines->next,saved_objects.lines);
X break;
X case O_ELLIPSE:
X change_ellipse(saved_objects.ellipses->next,saved_objects.ellipses);
X break;
X case O_TEXT :
X change_text(saved_objects.texts->next,saved_objects.texts);
X break;
X case O_SPLINE :
X change_spline(saved_objects.splines->next,saved_objects.splines);
X break;
X case O_ARC :
X change_arc(saved_objects.arcs->next,saved_objects.arcs);
X break;
X }
X last_action = F_CHANGE;
X}
X
X/*
XWhen a single object is created, it is inserted as the first object in
Xthe appropriate list in objects. It is also placed in the appropriate
Xlist in saved_objects.
X
XHowever when a number of objects are created (usually by reading them
Xin from a file or undoing a remove-all action), they are appended to
Xthe lists in objects and also saved in saved_objects. The pointers
Xin object_tails will be set to point to the last members of the lists
Xin objects prior to the appending.
X
XNote: The read operation will set the pointers in object_tails
Xwhile the remove-all operation will zero pointers in objects.
X*/
X
Xundo_create()
X{
X switch(last_object) {
X case O_POLYLINE :
X objects.lines = saved_objects.lines->next;
X saved_objects.lines->next = NULL;
X erase_lines(saved_objects.lines);
X break;
X case O_ELLIPSE :
X objects.ellipses = saved_objects.ellipses->next;
X saved_objects.ellipses->next = NULL;
X erase_ellipses(saved_objects.ellipses);
X break;
X case O_TEXT :
X objects.texts = saved_objects.texts->next;
X saved_objects.texts->next = NULL;
X erase_texts(saved_objects.texts);
X break;
X case O_SPLINE :
X objects.splines = saved_objects.splines->next;
X saved_objects.splines->next = NULL;
X erase_splines(saved_objects.splines);
X break;
X case O_ARC :
X objects.arcs = saved_objects.arcs->next;
X saved_objects.arcs->next = NULL;
X erase_arcs(saved_objects.arcs);
X break;
X case O_COMPOUND :
X objects.compounds = saved_objects.compounds->next;
X saved_objects.compounds->next = NULL;
X erase_compounds(saved_objects.compounds);
X break;
X case O_ALL_OBJECT :
X cut_objects(&objects, &object_tails);
X redisplay_canvas();
X break;
X }
X last_action = F_REMOVE;
X }
X
Xundo_remove()
X{
X switch (last_object) {
X case O_POLYLINE :
X draw_lines(saved_objects.lines);
X insert_line(&objects.lines, saved_objects.lines);
X break;
X case O_ELLIPSE :
X draw_ellipses(saved_objects.ellipses);
X insert_ellipse(&objects.ellipses, saved_objects.ellipses);
X break;
X case O_TEXT :
X draw_texts(saved_objects.texts);
X insert_text(&objects.texts, saved_objects.texts);
X break;
X case O_SPLINE :
X draw_splines(saved_objects.splines);
X insert_spline(&objects.splines, saved_objects.splines);
X break;
X case O_ARC :
X draw_arcs(saved_objects.arcs);
X insert_arc(&objects.arcs, saved_objects.arcs);
X break;
X case O_COMPOUND :
X draw_compounds(saved_objects.compounds);
X insert_compound(&objects.compounds, saved_objects.compounds);
X break;
X case O_ALL_OBJECT :
X append_objects(&objects, &saved_objects, &object_tails);
X redisplay_canvas();
X break;
X }
X last_action = F_CREATE;
X }
X
Xundo_flip()
X{
X switch (last_object) {
X case O_POLYLINE :
X if (pointmarker_shown)
X toggle_linepointmarker(saved_objects.lines);
X draw_line(saved_objects.lines, ERASE);
X flip_line(saved_objects.lines,
X last_position.x, last_position.y,
X last_axis);
X draw_line(saved_objects.lines, PAINT);
X if (pointmarker_shown)
X toggle_linepointmarker(saved_objects.lines);
X break;
X case O_ELLIPSE :
X if (pointmarker_shown)
X toggle_ellipsepointmarker(saved_objects.ellipses);
X draw_ellipse(saved_objects.ellipses, background_color);
X flip_ellipse(saved_objects.ellipses,
X last_position.x, last_position.y,
X last_axis);
X draw_ellipse(saved_objects.ellipses, foreground_color);
X if (pointmarker_shown)
X toggle_ellipsepointmarker(saved_objects.ellipses);
X break;
X case O_SPLINE :
X if (pointmarker_shown)
X toggle_splinepointmarker(saved_objects.splines);
X draw_spline(saved_objects.splines, ERASE);
X flip_spline(saved_objects.splines,
X last_position.x, last_position.y,
X last_axis);
X draw_spline(saved_objects.splines, PAINT);
X if (pointmarker_shown)
X toggle_splinepointmarker(saved_objects.splines);
X break;
X case O_ARC :
X if (pointmarker_shown)
X toggle_arcpointmarker(saved_objects.arcs);
X draw_arc(saved_objects.arcs, background_color);
X flip_arc(saved_objects.arcs,
X last_position.x, last_position.y,
X last_axis);
X draw_arc(saved_objects.arcs, foreground_color);
X if (pointmarker_shown)
X toggle_arcpointmarker(saved_objects.arcs);
X break;
X case O_COMPOUND :
X if (compoundbox_shown)
X draw_compoundbox(saved_objects.compounds, INV_PAINT);
X erase_compound(saved_objects.compounds);
X flip_compound(saved_objects.compounds,
X last_position.x, last_position.y,
X last_axis);
X draw_compound(saved_objects.compounds);
X if (compoundbox_shown)
X draw_compoundbox(saved_objects.compounds, INV_PAINT);
X break;
X }
X }
X
Xundo_move()
X{
X int dx, dy;
X
X dx = last_position.x - new_position.x;
X dy = last_position.y - new_position.y;
X switch (last_object) {
X case O_POLYLINE :
X if (pointmarker_shown)
X toggle_linepointmarker(saved_objects.lines);
X draw_line(saved_objects.lines, ERASE);
X translate_line(saved_objects.lines, dx, dy);
X draw_line(saved_objects.lines, PAINT);
X if (pointmarker_shown)
X toggle_linepointmarker(saved_objects.lines);
X break;
X case O_ELLIPSE :
X if (pointmarker_shown)
X toggle_ellipsepointmarker(saved_objects.ellipses);
X draw_ellipse(saved_objects.ellipses, background_color);
X translate_ellipse(saved_objects.ellipses, dx, dy);
X draw_ellipse(saved_objects.ellipses, foreground_color);
X if (pointmarker_shown)
X toggle_ellipsepointmarker(saved_objects.ellipses);
X break;
X case O_TEXT :
X draw_text(saved_objects.texts, INV_PAINT);
X translate_text(saved_objects.texts, dx, dy);
X draw_text(saved_objects.texts, PAINT);
X break;
X case O_SPLINE :
X if (pointmarker_shown)
X toggle_splinepointmarker(saved_objects.splines);
X draw_spline(saved_objects.splines, ERASE);
X translate_spline(saved_objects.splines, dx, dy);
X draw_spline(saved_objects.splines, PAINT);
X if (pointmarker_shown)
X toggle_splinepointmarker(saved_objects.splines);
X break;
X case O_ARC :
X if (pointmarker_shown)
X toggle_arcpointmarker(saved_objects.arcs);
X draw_arc(saved_objects.arcs, background_color);
X translate_arc(saved_objects.arcs, dx, dy);
X draw_arc(saved_objects.arcs, foreground_color);
X if (pointmarker_shown)
X toggle_arcpointmarker(saved_objects.arcs);
X break;
X case O_COMPOUND :
X if (compoundbox_shown)
X draw_compoundbox(saved_objects.compounds, INV_PAINT);
X erase_compound(saved_objects.compounds);
X translate_compound(saved_objects.compounds, dx, dy);
X draw_compound(saved_objects.compounds);
X if (compoundbox_shown)
X draw_compoundbox(saved_objects.compounds, INV_PAINT);
X break;
X }
X swap_newp_lastp();
X }
X
Xundo_movepoint()
X{
X switch (last_object) {
X case O_POLYLINE :
X relocate_linepoint(saved_objects.lines,
X last_position.x, last_position.y,
X saved_objects.lines->points->x,
X saved_objects.lines->points->y,
X moved_point, left_point);
X break;
X case O_SPLINE :
X relocate_splinepoint(saved_objects.splines, last_position.x,
X last_position.y, moved_point);
X break;
X case O_ARC :
X relocate_arcpoint(saved_objects.arcs, last_position.x,
X last_position.y, movedpoint_num);
X break;
X case O_ELLIPSE :
X relocate_ellipsepoint(saved_objects.ellipses, last_position.x,
X last_position.y, movedpoint_num);
X break;
X }
X swap_newp_lastp();
X }
X
Xundo_rotate()
X{
X switch (last_object) {
X case O_POLYLINE :
X if (pointmarker_shown)
X toggle_linepointmarker(saved_objects.lines);
X draw_line(saved_objects.lines, ERASE);
X if (last_rotateangle == 90) last_rotateangle = 270;
X else last_rotateangle = 90;
X rotate_line(saved_objects.lines,
X last_position.x, last_position.y,
X last_rotateangle);
X draw_line(saved_objects.lines, PAINT);
X if (pointmarker_shown)
X toggle_linepointmarker(saved_objects.lines);
X break;
X case O_ELLIPSE :
X if (pointmarker_shown)
X toggle_ellipsepointmarker(saved_objects.ellipses);
X draw_ellipse(saved_objects.ellipses, background_color);
X if (last_rotateangle == 90) last_rotateangle = 270;
X else last_rotateangle = 90;
X rotate_ellipse(saved_objects.ellipses,
X last_position.x, last_position.y,
X last_rotateangle);
X draw_ellipse(saved_objects.ellipses, foreground_color);
X if (pointmarker_shown)
X toggle_ellipsepointmarker(saved_objects.ellipses);
X break;
X case O_SPLINE :
X if (pointmarker_shown)
X toggle_splinepointmarker(saved_objects.splines);
X draw_spline(saved_objects.splines, ERASE);
X if (last_rotateangle == 90) last_rotateangle = 270;
X else last_rotateangle = 90;
X rotate_spline(saved_objects.splines,
X last_position.x, last_position.y,
X last_rotateangle);
X draw_spline(saved_objects.splines, PAINT);
X if (pointmarker_shown)
X toggle_splinepointmarker(saved_objects.splines);
X break;
X case O_ARC :
X if (pointmarker_shown)
X toggle_arcpointmarker(saved_objects.arcs);
X draw_arc(saved_objects.arcs, background_color);
X if (last_rotateangle == 90) last_rotateangle = 270;
X else last_rotateangle = 90;
X rotate_arc(saved_objects.arcs,
X last_position.x, last_position.y,
X last_rotateangle);
X draw_arc(saved_objects.arcs, foreground_color);
X if (pointmarker_shown)
X toggle_arcpointmarker(saved_objects.arcs);
X break;
X case O_COMPOUND :
X if (compoundbox_shown)
X draw_compoundbox(saved_objects.compounds, INV_PAINT);
X erase_compound(saved_objects.compounds);
X if (last_rotateangle == 90) last_rotateangle = 270;
X else last_rotateangle = 90;
X rotate_compound(saved_objects.compounds,
X last_position.x, last_position.y,
X last_rotateangle);
X draw_compound(saved_objects.compounds);
X if (compoundbox_shown)
X draw_compoundbox(saved_objects.compounds, INV_PAINT);
X break;
X }
X }
X
Xundo_scale()
X{
X float scalex, scaley;
X
X if (compoundbox_shown)
X draw_compoundbox(saved_objects.compounds, INV_PAINT);
X erase_compound(saved_objects.compounds);
X scalex = ((float)(last_position.x-fix_x)) / (new_position.x-fix_x);
X scaley = ((float)(last_position.y-fix_y)) / (new_position.y-fix_y);
X scale_compound(saved_objects.compounds, scalex, scaley, fix_x, fix_y);
X draw_compound(saved_objects.compounds);
X if (compoundbox_shown) draw_compoundbox(saved_objects.compounds, INV_PAINT);
X swap_newp_lastp();
X }
X
Xswap_newp_lastp()
X{
X int t; /* swap new_position and last_position */
X
X t = new_position.x;
X new_position.x = last_position.x;
X last_position.x = t;
X t = new_position.y;
X new_position.y = last_position.y;
X last_position.y = t;
X }
END_OF_FILE
if test 13353 -ne `wc -c <'undo.c'`; then
echo shar: \"'undo.c'\" unpacked with wrong size!
fi
# end of 'undo.c'
fi
echo shar: End of archive 12 \(of 21\).
cp /dev/null ark12isdone
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 at sun.com / argv at ora.com
Opinions expressed reflect those of the author only.
More information about the Comp.sources.x
mailing list