v06i020: xfig, Part12/15
Dan Heller
argv%turnpike at Sun.COM
Tue Mar 6 08:51:20 AEST 1990
Submitted-by: Brian Smith <bvsmith at lbl.gov>
Posting-number: Volume 6, Issue 20
Archive-name: xfig2/part12
#! /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 at 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 12 (of 15)."
# Contents: xfig/arc.c xfig/cursor.c xfig/deletept.c xfig/geom.c
# xfig/msgsw.c xfig/popup.c xfig/printfonts.c xfig/save.c
# xfig/spline.c
# Wrapped by argv at turnpike on Wed Feb 28 10:53:24 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'xfig/arc.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xfig/arc.c'\"
else
echo shar: Extracting \"'xfig/arc.c'\" \(5265 characters\)
sed "s/^X//" >'xfig/arc.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 "alloc.h"
X#include "func.h"
X#include "object.h"
X#include "paintop.h"
X
X#define PI 3.14159
X
Xextern int foreground_color, background_color;
Xextern int fix_x, fix_y, cur_x, cur_y;
X
Xextern int autoforwardarrow_mode, autobackwardarrow_mode;
Xextern int cur_line_style, line_thickness;
Xextern float cur_styleval;
Xextern int cur_color;
Xextern int cur_areafill;
Xextern int fill_mode;
Xextern float cur_dashlength;
Xextern int num_point;
Xextern int DEBUG;
Xextern F_compound objects;
X
Xextern freehand_elasticline();
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
XF_pos point[3];
X
X create_arcobject();
X get_arcpoint();
X init_arc_drawing();
X
Xarc_drawing_selected()
X{
X canvas_kbd_proc = null_proc;
X canvas_locmove_proc = null_proc;
X canvas_leftbut_proc = init_arc_drawing;
X canvas_middlebut_proc = null_proc;
X canvas_rightbut_proc = set_popupmenu;
X set_cursor(&arrow_cursor);
X reset_action_on();
X }
X
Xinit_arc_drawing(x, y)
Xint x, y;
X{
X num_point = 0;
X point[num_point].x = fix_x = cur_x = x;
X point[num_point++].y = fix_y = cur_y = y;
X canvas_locmove_proc = freehand_elasticline; /* in line.c */
X canvas_leftbut_proc = get_arcpoint;
X canvas_middlebut_proc = create_arcobject;
X draw_elasticline(); /* in line.c */
X set_temp_cursor(&null_cursor);
X set_action_on();
X }
X
Xget_arcpoint(x, y)
Xint x, y;
X{
X if (x == fix_x && y == fix_y) return;
X
X if (num_point == 2)
X {
X create_arcobject(x, y);
X return;
X }
X draw_elasticline(); /* in line.c */
X cur_x = x; cur_y = y;
X draw_elasticline(); /* in line.c */
X point[num_point].x = fix_x = x;
X point[num_point++].y = fix_y = y;
X draw_elasticline(); /* in line.c */
X }
X
Xcreate_arcobject(lx, ly)
Xint lx, ly;
X{
X extern F_arrow *forward_arrow(), *backward_arrow();
X F_arc *arc;
X int x, y, i;
X float xx, yy;
X
X draw_elasticline();
X cur_x = lx; cur_y = ly;
X draw_elasticline(); /* in line.c */
X if (num_point == 1) {
X arc_drawing_selected();
X return;
X }
X else if (num_point == 2) {
X point[num_point].x = lx;
X point[num_point++].y = ly;
X }
X
X x = point[0].x; y = point[0].y;
X for (i = 1; i < num_point; i++) {
X pw_vector(canvas_pixwin, x, y, point[i].x, point[i].y, INV_PAINT,
X 1);
X x = point[i].x; y = point[i].y;
X }
X if (num_point < 3) {
X arc_drawing_selected();
X return;
X }
X if (! compute_arccenter(point[0], point[1], point[2], &xx, &yy)) {
X arc_drawing_selected();
X return;
X }
X Arc_malloc(arc);
X if (arc == NULL) {
X blink_msg();
X put_msg(Err_mem);
X arc_drawing_selected();
X return;
X }
X arc->type = T_3_POINTS_ARC;
X arc->style = cur_line_style;
X arc->thickness = line_thickness;
X arc->style_val = cur_styleval;
X arc->pen = NULL;
X /* added 3/1/89 B.V.Smith */
X arc->area_fill = fill_mode? cur_areafill : 0;
X arc->color = cur_color;
X arc->depth = 0;
X arc->direction = compute_direction(point[0], point[1], point[2]);
X if (autoforwardarrow_mode)
X arc->for_arrow = forward_arrow();
X else
X arc->for_arrow = NULL;
X if (autobackwardarrow_mode)
X arc->back_arrow = backward_arrow();
X else
X arc->back_arrow = NULL;
X arc->center.x = xx;
X arc->center.y = yy;
X arc->point[0].x = point[0].x;
X arc->point[0].y = point[0].y;
X arc->point[1].x = point[1].x;
X arc->point[1].y = point[1].y;
X arc->point[2].x = point[2].x;
X arc->point[2].y = point[2].y;
X arc->next = NULL;
X pw_batch_on(canvas_pixwin);
X draw_arc(arc, foreground_color);
X if (DEBUG) {
X int xmin, ymin, xmax, ymax;
X arc_bound(arc, &xmin, &ymin, &xmax, &ymax);
X draw_rectbox(xmin, ymin, xmax, ymax, PAINT, 1);
X }
X pw_batch_off(canvas_pixwin);
X clean_up();
X set_action_object(F_CREATE, O_ARC);
X insert_arc(&objects.arcs, arc);
X set_latestarc(arc);
X set_modifiedflag();
X arc_drawing_selected();
X }
X
X#define round(x) ((int)((x) + .5))
X
Xdraw_arc(a, op)
XF_arc *a;
Xint op;
X{
X extern int foreground_color, background_color;
X
X curve(canvas_pixwin, round(a->point[0].x - a->center.x),
X round(a->center.y - a->point[0].y),
X round(a->point[2].x - a->center.x),
X round(a->center.y - a->point[2].y),
X a->direction, 1, 1,
X round(a->center.x), round(a->center.y), op,
X a->thickness, a->area_fill);
X draw_arcarrow(a, op);
X }
X
Xdraw_arcarrow(a, op)
XF_arc *a;
Xint op;
X{
X int x, y;
X
X if (a->for_arrow) {
X compute_normal(a->center.x, a->center.y, a->point[2].x,
X a->point[2].y, a->direction, &x, &y);
X if (op == foreground_color)
X draw_arrow(x, y, a->point[2].x, a->point[2].y,
X a->for_arrow, PAINT);
X else
X draw_arrow(x, y, a->point[2].x, a->point[2].y,
X a->for_arrow, ERASE);
X }
X if (a->back_arrow) {
X compute_normal(a->center.x, a->center.y, a->point[0].x,
X a->point[0].y, a->direction ^ 1, &x, &y);
X if (op == foreground_color)
X draw_arrow(x, y, a->point[0].x, a->point[0].y,
X a->back_arrow, PAINT);
X else
X draw_arrow(x, y, a->point[0].x, a->point[0].y,
X a->back_arrow, ERASE);
X }
X }
END_OF_FILE
if test 5265 -ne `wc -c <'xfig/arc.c'`; then
echo shar: \"'xfig/arc.c'\" unpacked with wrong size!
fi
# end of 'xfig/arc.c'
fi
if test -f 'xfig/cursor.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xfig/cursor.c'\"
else
echo shar: Extracting \"'xfig/cursor.c'\" \(5400 characters\)
sed "s/^X//" >'xfig/cursor.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 "paintop.h"
X
Xstatic u_int arrow_cursor_array[8] = {
X 0xC000E000, 0xF000F800, 0xFC00F000, 0x90001800,
X 0x18000C00, 0x0C000600, 0x06000300, 0x03000100 };
Xmpr_static(arrow_cursor_pr, 16, 16, 1, arrow_cursor_array);
XCURSORREC arrow_cursor = { 0, 0, MERGE, &arrow_cursor_pr };
X
Xstatic short bull_cursor_array[16] = {
X 0x0F00,0x30C0,0x4020,0x4020,0x8010,0x8610,0x8610,0x8010,
X 0x4020,0x4020,0x30C0,0x0F00,0x0000,0x0000,0x0000,0x0000
X };
Xmpr_static(bull_cursor_pr, 16, 16, 1, bull_cursor_array);
XCURSORREC bull_cursor = { 5, 5, INV_PAINT, &bull_cursor_pr };
X
Xstatic u_int buster_cursor_array[8] = {
X 0x0FE01010, 0x20085004, 0x88028402, 0x82028102,
X 0x80828042, 0x80224014, 0x20081010, 0x0FE00000, };
Xmpr_static(buster_cursor_pr, 16, 16, 1, buster_cursor_array);
XCURSORREC buster_cursor = { 7, 7, MERGE, &buster_cursor_pr };
X
Xstatic short char_cursor_data[16] = {
X 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00,
X 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00, 0xFF00,
X };
Xmpr_static(char_cursor_pr, 16, 16, 1, char_cursor_data);
XCURSORREC char_cursor = { 0, 13, INV_PAINT, &char_cursor_pr };
X
Xstatic short crosshair_cursor_data[16] = {
X 0x1000, 0x1000, 0x1000, 0xFE00, 0x1000, 0x1000, 0x1000, 0x0000,
X 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X };
Xmpr_static(crosshair_cursor_pr, 16, 16, 1, crosshair_cursor_data);
XCURSORREC crosshair_cursor = { 3, 3, INV_PAINT, &crosshair_cursor_pr };
X
XCURSORREC null_cursor = { 0, 0, MERGE, 0 };
X
Xstatic short magnifier_cursor_array[16] = {
X 0x0F80, 0x3060, 0x4010, 0x4010, 0x8008, 0x8008, 0x8008, 0x8008,
X 0x8008, 0x4010, 0x4010, 0x3078, 0x0F9C, 0x000E, 0x0007, 0x0003,
X };
Xmpr_static(magnifier_cursor_pr, 16, 16, 1, magnifier_cursor_array);
XCURSORREC magnifier_cursor = { 6, 6, MERGE, &magnifier_cursor_pr };
X
Xstatic short pencil_cursor_array[16] = {
X 0x0000, 0x0018, 0x0024, 0x0075, 0x009B, 0x0117, 0x022E, 0x045C,
X 0x08B8, 0x1170, 0x22E0, 0x25C0, 0x7B80, 0x6700, 0x8600, 0x0800,
X };
Xmpr_static(pencil_cursor_pr, 16, 16, 1, pencil_cursor_array);
XCURSORREC pencil_cursor = { 0, 14, MERGE, &pencil_cursor_pr };
X
Xstatic u_int pick15_cursor_array[8] = {
X 0x0FE01010, 0x20084004, 0x80028002, 0x80028002,
X 0x80028002, 0x80024004, 0x20081010, 0x0FE00000, };
Xmpr_static(pick15_cursor_pr, 16, 16, 1, pick15_cursor_array);
XCURSORREC pick15_cursor = { 7, 7, MERGE, &pick15_cursor_pr };
X
Xstatic short pick9_cursor_array[16] = {
X 0x3E00, 0x4100, 0x8080, 0x8080, 0x8080, 0x8080, 0x8080, 0x4100,
X 0x3E00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
X };
Xmpr_static(pick9_cursor_pr, 16, 16, 1, pick9_cursor_array);
XCURSORREC pick9_cursor = { 4, 4, MERGE, &pick9_cursor_pr };
X
Xstatic short vbar_cursor_array[16] = {
X 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
X 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000,
X };
Xmpr_static(vbar_cursor_pr, 16, 16, 1, vbar_cursor_array);
XCURSORREC vbar_cursor = { 0, 13, INV_PAINT, &vbar_cursor_pr };
X
Xstatic u_int wait_cursor_array[8] = {
X 0xFFE04040, 0x40403F80, 0x3F801F00, 0x0E000400,
X 0x0A001100, 0x20802080, 0x40404040, 0xFFE00000, };
Xmpr_static(wait_cursor_pr, 16, 16, 1, wait_cursor_array);
XCURSORREC wait_cursor = { 7, 5, MERGE, &wait_cursor_pr };
X
XCURSOR cur_cursor = &arrow_cursor; /* current cursor */
X
Xinit_cursor()
X{
X register Display *d = tool_d;
X
X arrow_cursor.bitmap = (XImage *)XCreateFontCursor(d, XC_left_ptr);
X bull_cursor.bitmap = (XImage *)XCreateFontCursor(d, XC_circle);
X buster_cursor.bitmap = (XImage *)XCreateFontCursor(d, XC_pirate);
X char_cursor.bitmap = (XImage *)XCreateFontCursor(d, XC_question_arrow);
X crosshair_cursor.bitmap = (XImage *)XCreateFontCursor(d, XC_crosshair);
X null_cursor.bitmap = (XImage *)XCreateFontCursor(d, XC_tcross);
X magnifier_cursor.bitmap = (XImage *)XCreateFontCursor(d, XC_question_arrow);
X pencil_cursor.bitmap = (XImage *)XCreateFontCursor(d, XC_pencil);
X pick15_cursor.bitmap = (XImage *)XCreateFontCursor(d, XC_dotbox);
X pick9_cursor.bitmap = (XImage *)XCreateFontCursor(d, XC_hand1);
X vbar_cursor.bitmap = (XImage *)XCreateFontCursor(d, XC_xterm);
X wait_cursor.bitmap = (XImage *)XCreateFontCursor(d, XC_watch);
X}
Xrecolor_cursors()
X{
X register Display *d = tool_d;
X
X XRecolorCursor(d, (Cursor)arrow_cursor.bitmap, &x_fg_color, &x_bg_color);
X XRecolorCursor(d, (Cursor)bull_cursor.bitmap, &x_fg_color, &x_bg_color);
X XRecolorCursor(d, (Cursor)buster_cursor.bitmap, &x_fg_color, &x_bg_color);
X XRecolorCursor(d, (Cursor)char_cursor.bitmap, &x_fg_color, &x_bg_color);
X XRecolorCursor(d, (Cursor)crosshair_cursor.bitmap, &x_fg_color,
X &x_bg_color);
X XRecolorCursor(d, (Cursor)null_cursor.bitmap, &x_fg_color, &x_bg_color);
X XRecolorCursor(d, (Cursor)magnifier_cursor.bitmap, &x_fg_color,
X &x_bg_color);
X XRecolorCursor(d, (Cursor)pencil_cursor.bitmap, &x_fg_color, &x_bg_color);
X XRecolorCursor(d, (Cursor)pick15_cursor.bitmap, &x_fg_color, &x_bg_color);
X XRecolorCursor(d, (Cursor)pick9_cursor.bitmap, &x_fg_color, &x_bg_color);
X XRecolorCursor(d, (Cursor)vbar_cursor.bitmap, &x_fg_color, &x_bg_color);
X XRecolorCursor(d, (Cursor)wait_cursor.bitmap, &x_fg_color, &x_bg_color);
X}
END_OF_FILE
if test 5400 -ne `wc -c <'xfig/cursor.c'`; then
echo shar: \"'xfig/cursor.c'\" unpacked with wrong size!
fi
# end of 'xfig/cursor.c'
fi
if test -f 'xfig/deletept.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xfig/deletept.c'\"
else
echo shar: Extracting \"'xfig/deletept.c'\" \(5987 characters\)
sed "s/^X//" >'xfig/deletept.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 "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 null_proc();
Xextern set_popupmenu();
X
Xextern F_line *line_point_search();
Xextern F_spline *spline_point_search();
Xextern int last_object;
Xextern int fix_x, fix_y, cur_x, cur_y;
Xextern int pointmarker_shown;
X
Xextern F_point *left_point, *right_point;
Xextern F_point *deleted_point;
Xextern F_line *line;
Xextern F_spline *spline;
X
X init_delete_point();
X
Xdelete_point_selected()
X{
X canvas_kbd_proc = null_proc;
X canvas_locmove_proc = null_proc;
X canvas_leftbut_proc = init_delete_point;
X canvas_middlebut_proc = null_proc;
X canvas_rightbut_proc = set_popupmenu;
X set_cursor(&pick9_cursor);
X reset_action_on();
X }
X
Xinit_delete_point(x, y)
Xint x, y;
X{
X F_spline *spline;
X F_line *line;
X F_point *p, *q;
X int n;
X
X /*
X If the attemp to delete point fails, we wouldn't want any important
X variables (left_point, right_point and delted_point) to change.
X So we used p and q in the search.
X */
X
X if ((line = line_point_search(x, y, TOLERANCE, &p, &q)) != NULL) {
X if (line->type == T_BOX || line->type == T_ARC_BOX) {
X put_msg("Deleting box corners is not allowed");
X return;
X }
X n = num_points(line->points);
X if (line->type == T_POLYGON) {
X if (n <= 4) {
X put_msg("A polygon cannot have less than 3 points");
X return;
X }
X }
X else if (n <= 1) {
X put_msg("A line cannot have less than 2 points");
X return;
X }
X clean_up();
X left_point = p;
X deleted_point = q;
X right_point = q->next;
X linepoint_deleting(line);
X set_action_object(F_DELETE_POINT, O_POLYLINE);
X set_latestline(line);
X }
X else if ((spline=spline_point_search(x, y, TOLERANCE, &p, &q)) != NULL){
X n = num_points(spline->points);
X if (closed_spline(spline)) {
X if (n <= 4) {
X put_msg("A closed spline cannot have less than 3 points");
X return;
X }
X }
X else if (normal_spline(spline)) {
X if (n <= 1) {
X put_msg("A spline cannot have less than 2 points");
X return;
X }
X }
X else if (n <= 2) { /* it must be an interpolated spline */
X put_msg("An interpolated spline may have less than 3 points");
X return;
X }
X clean_up();
X left_point = p;
X deleted_point = q;
X right_point = q->next;
X splinepoint_deleting(spline);
X set_action_object(F_DELETE_POINT, O_SPLINE);
X set_latestspline(spline);
X }
X }
X
X/************************** spline *******************************/
X
Xsplinepoint_deleting(spline)
XF_spline *spline;
X{
X F_point *p;
X
X set_temp_cursor(&wait_cursor);
X if (closed_spline(spline)) {
X pw_batch_on(canvas_pixwin);
X if (pointmarker_shown) toggle_splinepointmarker(spline);
X draw_spline(spline, ERASE); /*erase the spline */
X if (left_point == NULL) {
X /* The deleted point is the first point */
X spline->points = right_point;
X for (left_point = right_point, p = left_point->next;
X p->next != NULL;
X left_point = p, p = p->next);
X /*
X left_point now points at next to last point
X (the last point is a copy of the first).
X */
X p->x = spline->points->x;
X p->y = spline->points->y;
X right_point = p;
X /*
X Right_point becomes the last point. If this operation
X (point deletion) is reversed (undo), the deleted_point
X will not be inserted into it original place, but will
X be between left_point and right_point.
X */
X }
X else
X left_point->next = right_point;
X }
X else { /* open spline */
X pw_batch_on(canvas_pixwin);
X if (pointmarker_shown) toggle_splinepointmarker(spline);
X draw_spline(spline, ERASE); /*erase the spline */
X if (left_point == NULL)
X spline->points = right_point;
X else
X left_point->next = right_point;
X }
X if (int_spline(spline)) {
X F_control *c;
X
X c = spline->controls;
X spline->controls = c->next;
X c->next = NULL;
X free((char*)c);
X remake_control_points(spline);
X }
X draw_spline(spline, PAINT);
X if (pointmarker_shown) toggle_splinepointmarker(spline);
X pw_batch_off(canvas_pixwin);
X set_modifiedflag();
X reset_cursor();
X }
X
X/*************************** line ********************************/
X
X/*
XIn deleting a point p, linepoint_deleting uses left_point and
Xright_point of point p. The relationship of the three points
Xare : left_point->p->right_point except when p is the first
Xpoint in the list, in which case left_point will be NULL.
X*/
Xlinepoint_deleting(line)
XF_line *line;
X{
X F_point *p;
X
X if (line->type == T_POLYGON) {
X if (pointmarker_shown) toggle_linepointmarker(line);
X draw_line(line, ERASE); /*erase the line */
X if (left_point == NULL) {
X /* The deleted point is the first point */
X line->points = right_point;
X for (left_point = right_point, p = left_point->next;
X p->next != NULL;
X left_point = p, p = p->next);
X /*
X left_point now points at next to last point
X (the last point is a copy of the first).
X */
X p->x = right_point->x;
X p->y = right_point->y;
X right_point = p;
X /*
X Right_point becomes the last point. If this operation
X (point deletion) is reversed (undo), the deleted_point
X will not be inserted into it original place, but will
X be between left_point and right_point.
X */
X }
X else
X left_point->next = right_point;
X }
X else { /* polyline */
X if (pointmarker_shown) toggle_linepointmarker(line);
X draw_line(line, ERASE); /*erase the line */
X if (left_point == NULL)
X line->points = right_point;
X else
X left_point->next = right_point;
X }
X draw_line(line, PAINT);
X if (pointmarker_shown) toggle_linepointmarker(line);
X set_modifiedflag();
X }
END_OF_FILE
if test 5987 -ne `wc -c <'xfig/deletept.c'`; then
echo shar: \"'xfig/deletept.c'\" unpacked with wrong size!
fi
# end of 'xfig/deletept.c'
fi
if test -f 'xfig/geom.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xfig/geom.c'\"
else
echo shar: Extracting \"'xfig/geom.c'\" \(4668 characters\)
sed "s/^X//" >'xfig/geom.c' <<'END_OF_FILE'
X/*
X * FIG : Facility for Interactive Generation of figures
X *
X * Copyright (c) 1988 by Supoj Sutanthavibul (supoj at sally.UTEXAS.EDU)
X * March 1988.
X *
X * %W% %G%
X*/
X#include "fig.h"
X#include "object.h"
X
X#define PI 3.14159
X#define round(x) ((int)((x) + .5))
X
X/*
XInput arguments :
X (x1,y1)(x2,y2) : the vector
X direction : direction of the normal vector to (x1,y1)(x2,y2)
XOutput arguments :
X (*x,*y)(x2,y2) : a normal vector.
XReturn value : none
X*/
X
Xcompute_normal(x1, y1, x2, y2, direction, x, y)
Xfloat x1, y1;
Xint x2, y2, direction, *x, *y;
X{
X if (direction) { /* counter clockwise */
X *x = round(x2 - (y2 - y1));
X *y = round(y2 - (x1 - x2));
X }
X else {
X *x = round(x2 + (y2 - y1));
X *y = round(y2 + (x1 - x2));
X }
X }
X
X/*
XInput arguments:
X (x1,y1)(x2,y2) : the vector
X (xp,yp) : the point
X d : tolerance (max. allowable distance from the point to the vector)
X dd : d * d
XOutput arguments:
X (*px,*py) : a point on the vector which is not far from (xp,yp)
X by more than d. Normally the vector (*px,*py)(xp,yp)
X is normal to vector (x1,y1)(x2,y2) except when (xp,yp)
X is within d from (x1,y1) or (x2,y2), in which cases,
X (*px,*py) = (x1,y1) or (x2,y2) respectively.
XReturn value :
X 0 : No point on the vector is within d from (xp, yp)
X 1 : (*px, *py) is such a point.
X*/
X
Xclose_to_vector(x1, y1, x2, y2, xp, yp, d, dd, px, py)
Xint x1, y1, x2, y2, xp, yp, d;
Xfloat dd;
Xint *px, *py;
X{
X int xmin, ymin, xmax, ymax;
X float x, y, slope, D2, dx, dy;
X
X if (abs(xp - x1) <= d && abs(yp - y1) <= d) {
X *px = x1; *py = y1;
X return(1);
X }
X if (abs(xp - x2) <= d && abs(yp - y2) <= d) {
X *px = x2; *py = y2;
X return(1);
X }
X
X if (x1 < x2) {
X xmin = x1 - d; xmax = x2 + d;
X }
X else {
X xmin = x2 - d; xmax = x1 + d;
X }
X if (xp < xmin || xmax < xp) return(0);
X
X if (y1 < y2) {
X ymin = y1 - d; ymax = y2 + d;
X }
X else {
X ymin = y2 - d; ymax = y1 + d;
X }
X if (yp < ymin || ymax < yp) return(0);
X
X if (x2 == x1) {
X x = x1; y = yp;
X }
X else if (y1 == y2) {
X x = xp;
X y = y1;
X }
X else {
X slope = ((float) (x2 - x1)) / ((float) (y2 - y1));
X y = (slope * (xp - x1 + slope * y1) + yp) / (1 + slope * slope);
X x = ((float) x1) + slope * (y - y1);
X }
X dx = ((float) xp) - x;
X dy = ((float) yp) - y;
X D2 = dx * dx + dy * dy;
X if (D2 < dd) {
X *px = (int)(x + .5); *py = (int)(y +.5);
X return(1);
X }
X return(0);
X }
X
X/*
XInput arguments :
X p1, p2, p3 : 3 points on the arc
XOutput arguments :
X (*x,*y) : Center of the arc
XReturn value :
X 0 : if p1, p2, p3 are co-linear.
X 1 : if they are not.
X*/
X
Xint
Xcompute_arccenter(p1, p2, p3, x, y)
XF_pos p1, p2, p3;
Xfloat *x, *y;
X{
X float s12, s13, len1, len2, len3, dx12, dy12, dx13, dy13;
X
X dx12 = p1.x - p2.x; dy12 = p1.y - p2.y;
X dx13 = p1.x - p3.x; dy13 = p1.y - p3.y;
X s12 = asin((double)(dy12 / sqrt((double)(dx12*dx12 + dy12*dy12))));
X s13 = asin((double)(dy13 / sqrt((double)(dx13*dx13 + dy13*dy13))));
X if (fabs(s12 - s13) < .01) return(0);
X
X len1 = p1.x * p1.x + p1.y * p1.y;
X len2 = p2.x * p2.x + p2.y * p2.y;
X len3 = p3.x * p3.x + p3.y * p3.y;
X *y = (dx12 * (len3 - len1) - dx13 * (len2 - len1)) /
X (2 * (dx13 * dy12 - dx12 * dy13));
X if (dx13 != 0)
X *x = (len3 + 2 * (*y) * dy13 - len1) / (2 * (-dx13));
X else
X *x = (len2 + 2 * (*y) * dy12 - len1) / (2 * (-dx12));
X return(1);
X }
X
X/*
XCompute_angle
XInput arguments :
X (dx,dy) : the vector (0,0)(dx,dy)
XOutput arguments : none
XReturn value : the angle of the vector in the range [0, 2PI)
X*/
X
Xfloat
Xcompute_angle(dx, dy) /* compute the angle between 0 to 2PI */
Xfloat dx, dy;
X{
X float alpha;
X
X if (dx == 0) {
X if (dy > 0)
X alpha = PI / 2;
X else
X alpha = 3 * PI / 2;
X }
X else if (dy == 0) {
X if (dx > 0)
X alpha = 0;
X else
X alpha = PI;
X }
X else {
X alpha = atan((double)(dy / dx)); /* range = -PI/2 to PI/2 */
X if (dx < 0) alpha += PI;
X else if (dy < 0) alpha += 2 * PI;
X }
X return(alpha);
X }
X
X/*
XInput arguments :
X p1, p2, p3 : 3 points of an arc with p1 the first and p3 the last.
XOutput arguments : none
XReturn value :
X 0 : if the arc passes p1, p2 and p3 (in that order) in
X clockwise direction
X 1 : if direction is counterclockwise
X*/
X
Xint
Xcompute_direction(p1, p2, p3)
XF_pos p1, p2, p3;
X{
X float diff, dx, dy, alpha, theta;
X
X dx = p2.x - p1.x;
X dy = p1.y - p2.y; /* because origin of the screen is on
X the upper left corner */
X
X alpha = compute_angle(dx, dy);
X
X dx = p3.x - p2.x;
X dy = p2.y - p3.y;
X theta = compute_angle(dx, dy);
X
X diff = theta - alpha;
X if ((0 < diff && diff < PI) || diff < -PI) {
X return(1); /* counterclockwise */
X }
X return(0); /* clockwise */
X }
END_OF_FILE
if test 4668 -ne `wc -c <'xfig/geom.c'`; then
echo shar: \"'xfig/geom.c'\" unpacked with wrong size!
fi
# end of 'xfig/geom.c'
fi
if test -f 'xfig/msgsw.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xfig/msgsw.c'\"
else
echo shar: Extracting \"'xfig/msgsw.c'\" \(3980 characters\)
sed "s/^X//" >'xfig/msgsw.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 * 2nd revision : Feb 1988.
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#include "psfonts.h"
X
Xextern int errno;
Xextern int receiving_msg;
Xextern int action_on;
Xextern null_proc();
X
Xextern int CANVAS_WIDTH;
Xextern int PANEL_WID;
Xextern int SIDERULER_WIDTH;
Xextern char prefix[], suffix[];
Xextern int leng_prefix, leng_suffix;
Xextern int cur_x, cur_y;
X
Xextern (*canvas_kbd_proc)();
Xextern (*canvas_locmove_proc)();
Xextern (*canvas_leftbut_proc)();
Xextern (*canvas_middlebut_proc)();
Xextern (*canvas_rightbut_proc)();
X
X/***************** exported variables and procedures *****************/
X
X put_msg();
X init_msgreceiving();
X
X/************************ local variables and routines ******************/
X
X#define BUF_SIZE 80
X
Xstatic (*msgsw_kbd_proc)();
Xstatic (*msgsw_leftbut_proc)();
Xstatic (*msgsw_rightbut_proc)();
Xstatic (*recipient)();
X
Xstatic char msg_received[BUF_SIZE];
Xstatic char prompt[BUF_SIZE];
Xstatic int len_prompt;
Xstatic int input_base_x;
X
Xstatic msg_selected();
Xstatic msg_sighandler();
X
Xstatic (*saved_canvas_kbd_proc)();
Xstatic (*saved_canvas_locmove_proc)();
Xstatic (*saved_canvas_leftbut_proc)();
Xstatic (*saved_canvas_middlebut_proc)();
Xstatic (*saved_canvas_rightbut_proc)();
X
Xstatic Arg msg_args[] =
X{
X /* 0 */ { XtNx, (XtArgVal)0 },
X /* 1 */ { XtNy, (XtArgVal)0 },
X /* 2 */ { XtNwidth, (XtArgVal)0 },
X /* 3 */ { XtNheight, (XtArgVal)MSG_HEIGHT },
X /* 4 */ { XtNlabel, (XtArgVal)"" },
X /* 5 */ { XtNfromHoriz, (XtArgVal)NULL },
X /* 6 */ { XtNhorizDistance, (XtArgVal) 2 },
X /* 7 */ { XtNfromVert, (XtArgVal)NULL },
X /* 8 */ { XtNvertDistance, (XtArgVal) 1 },
X /* 9 */ { XtNleft, (XtArgVal) XtChainLeft },
X /*10 */ { XtNinput, (XtArgVal) TRUE }, /* doesn't seem to work for DECwindows */
X};
X
Xint init_msg(tool)
X TOOL tool;
X{
X msg_args[2].value = PANEL_WID+CANVAS_WIDTH+SIDERULER_WIDTH-FONT_PANE_WIDTH;
X msg_args[5].value = (XtArgVal)psfont; /* right edge of font ind. */
X msg_args[7].value = (XtArgVal)canvas_sw; /* just below the canvas */
X msg_sw = XtCreateManagedWidget("message", commandWidgetClass, tool,
X msg_args, XtNumber(msg_args));
X return (1);
X}
X
X/*
X** We have to do this after realizing the widget otherwise
X** the width is computed wrong and you get a tiny text box.
X*/
Xsetup_msg()
X{
X static Arg addn_args[] =
X {
X { XtNfont, (XtArgVal)NULL },
X };
X
X if (bold_font != NULL)
X {
X addn_args[0].value = (XtArgVal)bold_font;
X XtSetValues(msg_sw, addn_args, XtNumber(addn_args));
X }
X msgswfd = XtWindow(msg_sw);
X XDefineCursor(tool_d, msgswfd, (Cursor)pencil_cursor.bitmap);
X}
X
X/*VARARGS1*/
Xput_msg(format, arg1, arg2, arg3, arg4, arg5)
X char *format;
X int arg1, arg2, arg3, arg4, arg5;
X{
X sprintf(prompt, format, arg1, arg2, arg3, arg4, arg5);
X msg_args[4].value = (XtArgVal)prompt;
X XtSetValues(msg_sw, &msg_args[4], 1);
X}
X
Xclear_message()
X{
X msg_args[4].value = (XtArgVal)"";
X XtSetValues(msg_sw, &msg_args[4], 1);
X}
X
Xstatic
Xend_char_input()
X{
X receiving_msg = 0; /* msg input has been received */
X terminate_char_handler();
X strcpy(&prefix[leng_prefix], suffix);
X strcpy(msg_received, prefix);
X strcpy(&prompt[len_prompt], prefix);
X if (recipient != NULL) (* recipient) (msg_received);
X restore_event_proc();
X return;
X }
X
Xinit_msg_receiving(msg_recipient, p)
X int (*msg_recipient)();
X char *p;
X{
X char reply[100];
X
X prompt_string(p, reply);
X (*msg_recipient)(reply);
X}
X
Xrestore_event_proc()
X{
X canvas_kbd_proc = saved_canvas_kbd_proc;
X canvas_locmove_proc = saved_canvas_locmove_proc;
X canvas_leftbut_proc = saved_canvas_leftbut_proc;
X canvas_middlebut_proc = saved_canvas_middlebut_proc;
X canvas_rightbut_proc = saved_canvas_rightbut_proc;
X }
X
Xblink_msg()
X{
X int i;
X
X for (i = 0; i < 2000; i++)
X ;
X clear_message();
X }
END_OF_FILE
if test 3980 -ne `wc -c <'xfig/msgsw.c'`; then
echo shar: \"'xfig/msgsw.c'\" unpacked with wrong size!
fi
# end of 'xfig/msgsw.c'
fi
if test -f 'xfig/popup.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xfig/popup.c'\"
else
echo shar: Extracting \"'xfig/popup.c'\" \(6300 characters\)
sed "s/^X//" >'xfig/popup.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 "func.h"
X#include "font.h"
X
X/******************* imported global variables and procedures **************/
X
Xextern int figure_modified;
Xextern char current_file[];
X
Xextern put_msg();
Xextern init_msg_receiving();
Xextern read_file();
Xextern edit_file();
Xextern change_directory();
Xextern save_current_file();
Xextern save_file();
Xextern save_and_exit();
Xextern write_bitmap();
X
X/******************** local variables ***************************/
X
Xstatic MENUITEM pumenu_items[] = {
X {MENU_IMAGESTRING, "Quit", (caddr_t) F_QUIT},
X {MENU_IMAGESTRING, "Undo", (caddr_t) F_UNDO},
X {MENU_IMAGESTRING, "Redisplay", (caddr_t) F_REDISPLAY},
X {MENU_IMAGESTRING, "Remove all", (caddr_t) F_REMOVE_ALL},
X {MENU_IMAGESTRING, "Edit file ...", (caddr_t) F_EDIT},
X {MENU_IMAGESTRING, "Save", (caddr_t) F_SAVE},
X {MENU_IMAGESTRING, "Read file ...", (caddr_t) F_READ},
X {MENU_IMAGESTRING, "Save in ...", (caddr_t) F_SAVE_IN},
X {MENU_IMAGESTRING, "Print Figure", (caddr_t) F_PRINT},
X {MENU_IMAGESTRING, "Status", (caddr_t) F_STATUS},
X {MENU_IMAGESTRING, "Change Directory", (caddr_t) F_CHDIR},
X {MENU_IMAGESTRING, "Print Working Directory", (caddr_t) F_PWDIR},
X {MENU_IMAGESTRING, "Save & Quit", (caddr_t) F_SAVE_N_EXIT},
X /*
X {MENU_IMAGESTRING, "Save as BITMAP ..", (caddr_t) F_SAVE_BITMAP},
X */
X };
Xstatic MENU menu_body = {
X MENU_IMAGESTRING,
X "commands",
X sizeof(pumenu_items)/sizeof(MENUITEM),
X pumenu_items,
X (MENU *) NULL,
X (caddr_t) NULL
X };
Xstatic MENU *menu_ptr = &menu_body;
Xstatic char quit_msg[] = "CONFIRM with LEFT button, CANCEL with RIGHT or MIDDLE button";
Xstatic char edit_msg[] = "Figures are modified; please CONFIRM with LEFT button or CANCEL with RIGHT button";
X
Xstatic Arg menu_args[] =
X{
X { XtNx, (XtArgVal)0 },
X { XtNy, (XtArgVal)0 },
X { XtNwidth, (XtArgVal)0 },
X { XtNheight, (XtArgVal)0 },
X};
X
Xextern void pane_select();
X
Xstatic XtCallbackRec pane_callbacks[] =
X{
X { pane_select, NULL },
X { NULL, NULL },
X};
X
Xstatic Arg pane_args[] =
X{
X { XtNx, (XtArgVal)10 },
X { XtNy, (XtArgVal)30 },
X { XtNlabel, (XtArgVal)" " },
X { XtNwidth, (XtArgVal)0 },
X { XtNheight, (XtArgVal)0 },
X { XtNcallback, (XtArgVal)pane_callbacks },
X};
X
XTOOL menu;
X
Xint
Xinit_menu(tool)
X TOOL tool;
X{
X TOOL panes, pane, title;
X register int i, tlen, rlen = 0;
X register MENUITEM *mi;
X XtTranslations popdown_actions, pane_actions;
X Arg my_list;
X PIX_FONT temp_font;
X
X menu = XtCreatePopupShell("popup_menu", overrideShellWidgetClass, tool,
X menu_args, XtNumber(menu_args));
X popdown_actions = XtParseTranslationTable(
X "<Btn3Up>:MenuPopdown()\n");
X /*
X <LeaveWindow>:MenuPopdown()\n");
X */
X XtOverrideTranslations(menu, popdown_actions);
X panes = XtCreateManagedWidget("menu", boxWidgetClass, menu, menu_args,
X XtNumber(menu_args));
X pane_actions = XtParseTranslationTable(
X "<EnterWindow>:set()\n\
X <Btn3Up>:notify()unset()\n");
X for (i = 0; i < XtNumber(pumenu_items); i++)
X {
X mi = &pumenu_items[i];
X tlen = strlen(mi->label);
X if( tlen > rlen )
X rlen = tlen;
X }
X
X pane_args[2].value = (XtArgVal)"COMMANDS";
X title = XtCreateManagedWidget("title", labelWidgetClass,
X panes, pane_args, 4);
X
X /* create the first pane */
X mi = &pumenu_items[0];
X pane_args[2].value = (XtArgVal)mi->label;
X pane_callbacks[0].closure = (caddr_t)mi;
X pane = XtCreateManagedWidget("pane", commandWidgetClass,
X panes, pane_args, XtNumber(pane_args));
X XtOverrideTranslations(pane, pane_actions);
X
X /* get the default font */
X my_list.value = (XtArgVal)&temp_font;
X my_list.name = XtNfont;
X XtGetValues(pane, &my_list, 1);
X
X /* set the width of this pane and the title to the correct width */
X pane_args[3].value = char_width(temp_font) * rlen + 10;
X XtSetValues(title, &pane_args[3], 1);
X XtSetValues(pane, &pane_args[3], 1);
X
X for (i = 1; i < XtNumber(pumenu_items); ++i)
X {
X mi = &pumenu_items[i];
X pane_args[2].value = (XtArgVal)mi->label;
X pane_callbacks[0].closure = (caddr_t)mi;
X pane = XtCreateManagedWidget("pane", commandWidgetClass,
X panes, pane_args, XtNumber(pane_args));
X XtOverrideTranslations(pane, pane_actions);
X }
X return (1);
X}
X
Xset_popupmenu(event)
X INPUTEVENT *event;
X{
X}
X
Xvoid pane_select(widget, mi)
X TOOL widget;
X MENUITEM *mi;
X{
X int menu_code = (int)mi->info;
X
X switch(menu_code) {
X case F_UNDO :
X undo();
X break;
X case F_READ :
X init_msg_receiving(read_file, "Read file : ");
X break;
X case F_SAVE :
X (void)save_current_file();
X break;
X case F_SAVE_IN :
X if (no_object()) {
X put_msg("No figure to save; ignored");
X break;
X }
X init_msg_receiving(save_file, "Save in file : ");
X break;
X case F_REDISPLAY :
X redisplay_canvas();
X break;
X case F_EDIT :
X if (!no_object() && figure_modified) {
X if (wmgr_confirm(canvas_swfd, edit_msg) != -1) break;
X }
X init_msg_receiving(edit_file, "Edit file : ");
X break;
X case F_PRINT:
X print_figure();
X break;
X case F_REMOVE_ALL :
X remove_all();
X put_msg("Immediate Undo will restore the figure.");
X redisplay_canvas();
X break;
X case F_CHDIR :
X init_msg_receiving(change_directory, "Directory : ");
X break;
X case F_PWDIR:
X print_directory();
X break;
X case F_STATUS :
X status();
X break;
X case F_SAVE_N_EXIT :
X save_n_exit();
X break;
X case F_QUIT :
X quit();
X break;
X case F_SAVE_BITMAP :
X if (no_object()) {
X put_msg("No figure to save");
X break;
X }
X init_msg_receiving(write_bitmap, "Save bitmap to file : ");
X break;
X }
X XtPopdown(menu);
X }
X
Xquit()
X{
X if (no_object()) {
X tool_destroy(tool);
X exit(0);
X }
X if (! figure_modified) {
X tool_destroy(tool);
X exit(0);
X }
X if (wmgr_confirm(canvas_swfd, quit_msg) == -1) {
X tool_destroy(tool);
X exit(0);
X }
X }
X
Xsave_n_exit()
X {
X if (! figure_modified)
X quit();
X if (no_object())
X quit();
X if (*current_file != 0) {
X if (0 == write_file(current_file, 0))
X quit();
X }
X else {
X blink_msg();
X init_msg_receiving(save_and_exit, "Save in file : ");
X }
X }
X
END_OF_FILE
if test 6300 -ne `wc -c <'xfig/popup.c'`; then
echo shar: \"'xfig/popup.c'\" unpacked with wrong size!
fi
# end of 'xfig/popup.c'
fi
if test -f 'xfig/printfonts.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xfig/printfonts.c'\"
else
echo shar: Extracting \"'xfig/printfonts.c'\" \(6010 characters\)
sed "s/^X//" >'xfig/printfonts.c' <<'END_OF_FILE'
X/*
X * FIG : Facility for Interactive Generation of figures
X *
X * Added by Brian V. Smith
X *
X * %W% %G%
X*/
X#include "fig.h"
X#include "const.h"
X#include "resources.h"
X#include "func.h"
X#include "psfonts.h" /* printer font names */
X
X/******************** global variables ***************************/
X
Xextern int font_button; /* font number */
Xextern char *font_menu_bits[];
Xextern Pixmap font_menu_bitmaps[];
Xextern struct _fstruct fontnames[]; /* font names */
X
X/******************** local variables ***************************/
X
Xstatic MENUITEM fontmenu_items[NUMFONTS];
X
Xstatic MENU fontmenu_body = {
X MENU_IMAGESTRING,
X "printerfonts",
X sizeof(fontmenu_items)/sizeof(MENUITEM),
X fontmenu_items,
X (MENU *) NULL,
X (caddr_t) NULL
X };
Xstatic MENU *fontmenu_ptr = &fontmenu_body;
X
Xstatic Arg fontmenu_args[] =
X{
X /* 0 */{ XtNx, (XtArgVal) 0 },
X /* 1 */{ XtNy, (XtArgVal) 0 },
X /* 2 */{ XtNwidth, (XtArgVal) 0 },
X /* 3 */{ XtNheight, (XtArgVal) 0 },
X /* 4 */{ XtNvSpace, (XtArgVal) 1 },
X};
X
Xextern void fontpane_select();
X
Xstatic XtCallbackRec pane_callbacks[] =
X{
X { fontpane_select, NULL },
X { NULL, NULL },
X};
X
Xstatic Arg main_pane_args[] =
X{
X /* 0 */ { XtNx, (XtArgVal)10 },
X /* 1 */ { XtNy, (XtArgVal)30 },
X /* 2 */ { XtNlabel, (XtArgVal)" " },
X /* 3 */ { XtNwidth, (XtArgVal) FONT_PANE_WIDTH },
X};
X
Xstatic Arg pane_args[] =
X{
X /* 0 */ { XtNx, (XtArgVal) 0 },
X /* 1 */ { XtNy, (XtArgVal) 0 },
X /* 2 */ { XtNwidth, (XtArgVal) FONT_PANE_WIDTH },
X /* 3 */ { XtNheight, (XtArgVal) 20 },
X /* 4 */ { XtNcallback, (XtArgVal)pane_callbacks },
X /* 5 */ { XtNbitmap, (XtArgVal) NULL },
X /* 6 */ { XtNinternalWidth, (XtArgVal) 0 }, /* space between pixmap and edge */
X /* 7 */ { XtNinternalHeight, (XtArgVal) 0 },
X /* 8 */ { XtNresize, (XtArgVal) FALSE }, /* don't allow resize */
X};
X
Xstatic Arg psfont_args[] =
X{
X /* 0 */ { XtNx, (XtArgVal)0 },
X /* 1 */ { XtNy, (XtArgVal)0 },
X /* 2 */ { XtNwidth, (XtArgVal) FONT_PANE_WIDTH },
X /* 3 */ { XtNheight, (XtArgVal) MSG_HEIGHT }, /* same height as message panel */
X /* 4 */ { XtNfromHoriz, (XtArgVal) NULL }, /* flush with panel indicator */
X /* 5 */ { XtNhorizDistance, (XtArgVal) -3*SWITCH_ICON_WIDTH-6*SWITCH_ICON_SPACING },
X /* 6 */ { XtNfromVert, (XtArgVal) NULL },
X /* 7 */ { XtNvertDistance, (XtArgVal) 1 }, /* dist from canvas_sw window */
X /* 8 */ { XtNbitmap, (XtArgVal) NULL },
X /* 9 */ { XtNinternalWidth, (XtArgVal) 0 }, /* space between pixmap and edge */
X /*10 */ { XtNinternalHeight, (XtArgVal) 0 },
X /*11 */ { XtNleft, (XtArgVal) XtChainLeft },
X /*12 */ { XtNright, (XtArgVal) XtChainLeft },
X};
X
Xstatic TOOL fontpanes;
Xstatic TOOL fontpane[NUMFONTS];
X
Xinit_fontmenu(tool)
X TOOL tool;
X{
X TOOL title;
X register int i;
X register MENUITEM *mi;
X XtTranslations popdown_actions, pane_actions;
X Arg my_list;
X
X fontmenu = XtCreatePopupShell("popup_menu", overrideShellWidgetClass, tool,
X fontmenu_args, XtNumber(fontmenu_args));
X popdown_actions = XtParseTranslationTable(
X "<Btn1Up>:MenuPopdown()\n");
X XtOverrideTranslations(fontmenu, popdown_actions);
X
X fontpanes = XtCreateManagedWidget("menu", boxWidgetClass, fontmenu, fontmenu_args,
X XtNumber(fontmenu_args));
X pane_actions = XtParseTranslationTable(
X "<EnterWindow>:set()\n\
X <Btn1Up>:notify()unset()\n");
X for (i = 0; i < NUMFONTS; i++)
X {
X fontmenu_items[i].type = MENU_IMAGESTRING; /* put the fontnames in menu */
X fontmenu_items[i].label = fontnames[i].psfont;
X fontmenu_items[i].info = (caddr_t) i; /* index for font # */
X mi = &fontmenu_items[i];
X }
X
X main_pane_args[2].value = (XtArgVal)"Printer Fonts";
X title = XtCreateManagedWidget("title", labelWidgetClass,
X fontpanes, main_pane_args, XtNumber(main_pane_args));
X
X /* create the first pane */
X mi = &fontmenu_items[0];
X pane_callbacks[0].closure = (caddr_t)mi;
X
X fontpane[0] = XtCreateManagedWidget("pane", commandWidgetClass,
X fontpanes, pane_args, XtNumber(pane_args));
X XtOverrideTranslations(fontpane[0], pane_actions);
X
X for (i = 1; i < NUMFONTS; ++i)
X {
X mi = &fontmenu_items[i];
X pane_callbacks[0].closure = (caddr_t)mi;
X fontpane[i] = XtCreateManagedWidget("pane", commandWidgetClass,
X fontpanes, pane_args, XtNumber(pane_args));
X XtOverrideTranslations(fontpane[i], pane_actions);
X }
X
X /* Now set up the font indicator window */
X
X /* position */
X psfont_args[4].value = (XtArgVal)panel_sw; /* flush left with panel window */
X psfont_args[6].value = (XtArgVal)canvas_sw; /* just below the canvas window */
X psfont = XtCreateManagedWidget("indicator", labelWidgetClass, tool,
X psfont_args, XtNumber(psfont_args));
X return (1);
X}
X
X/* create the bitmaps for the font menu */
X
Xsetup_fontmenu()
X {
X Arg psargs[2];
X register int i;
X
X /* Create the bitmaps */
X
X for (i=0; i<NUMFONTS; i++)
X font_menu_bitmaps[i] = XCreatePixmapFromBitmapData(tool_d, XtWindow(psfont),
X font_menu_bits[i], FONT_PANE_WIDTH, FONT_PANE_HEIGHT,
X x_bg_color.pixel, x_fg_color.pixel, DefaultDepthOfScreen(tool_s));
X psfont_args[8].value = (XtArgVal) font_menu_bitmaps[0];
X XtSetValues(psfont, &psfont_args[8], 1); /* show default font in window */
X
X /* Store the bitmaps in the menu panes */
X for (i=0; i< NUMFONTS; i++)
X {
X pane_args[5].value = (XtArgVal) font_menu_bitmaps[i];
X XtSetValues(fontpane[i], &pane_args[5], 1); /* bitmap */
X }
X }
X
X/* At this point (called from popup_fonts()), we have the font menu windows
X to work with so we can define the cursor */
X
Xstatic int cursinit = 0;
X
Xsetup_fontmenu_cursor()
X {
X register int i;
X
X if (cursinit) /* already defined */
X return;
X
X cursinit = 1;
X /* Define the cursor for the main menu form */
X XDefineCursor(tool_d, XtWindow(fontpanes), (Cursor)arrow_cursor.bitmap);
X }
X
Xvoid fontpane_select(widget, mi)
XTOOL widget;
XMENUITEM *mi;
X{
X char * font_name = mi->label;
X
X font_button = (int) mi->info;
X put_msg("Font: %s",font_name);
X /* put image of font in indicator window */
X psfont_args[8].value = (XtArgVal) font_menu_bitmaps[font_button];
X XtSetValues(psfont, &psfont_args[8], 1);
X XtPopdown(fontmenu);
X }
END_OF_FILE
if test 6010 -ne `wc -c <'xfig/printfonts.c'`; then
echo shar: \"'xfig/printfonts.c'\" unpacked with wrong size!
fi
# end of 'xfig/printfonts.c'
fi
if test -f 'xfig/save.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xfig/save.c'\"
else
echo shar: Extracting \"'xfig/save.c'\" \(6610 characters\)
sed "s/^X//" >'xfig/save.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 "const.h"
X
Xextern F_compound objects;
X
Xextern int figure_modified;
Xextern int errno;
X
Xextern null_proc();
X
Xextern char *sys_errlist[];
Xextern int sys_nerr, errno;
Xextern int num_object;
X
Xwrite_file(file_name, prompt)
Xchar *file_name;
Xint prompt;
X{
X FILE *fp;
X struct stat file_status;
X char string[180];
X
X if (*file_name == 0) {
X put_msg("No file. Abort save operation.");
X return(-1);
X }
X if (stat(file_name, &file_status) == 0) { /* file exists */
X if (file_status.st_mode & S_IFDIR) {
X put_msg("\"%s\" is a directory", file_name);
X return(-1);
X }
X if (file_status.st_mode & S_IWRITE) { /* writing is permitted */
X if (file_status.st_uid != geteuid()) {
X put_msg("\"%s\" permission is denied", file_name);
X return(-1);
X }
X else if (prompt) {
X sprintf(string, "\"%s\" File exists. Please click the LEFT button to COMFIRM overwrite. To cancel, click the MIDDLE or RIGHT button.", file_name);
X if (wmgr_confirm(canvas_swfd, string) != -1) {
X put_msg("Cancel save");
X return(-1);
X }
X }
X }
X else {
X put_msg("\"%s\" File is read only", file_name);
X return(-1);
X }
X }
X else if (errno != ENOENT)
X return(-1); /* file does exist but stat fails */
X
X if ((fp = fopen(file_name, "w")) == NULL) {
X blink_msg();
X put_msg("Couldn't open file %s, %s", file_name, sys_errlist[errno]);
X return(-1);
X }
X else {
X figure_modified = 0;
X num_object = 0;
X write_objects(fp);
X put_msg("%d objects saved in \"%s\"", num_object, file_name);
X return(0);
X }
X }
X
Xwrite_objects(fp)
XFILE *fp;
X{
X extern char file_header[];
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 /* Number 2 means that the origin (0,0) is at the upper
X left corner of the screen (2nd quadrant) */
X
X put_msg("Writing . . .");
X fprintf(fp, "%s\n", file_header);
X fprintf(fp, "%d %d\n", PIX_PER_INCH, 2);
X for (a = objects.arcs; a != NULL; a = a-> next) {
X num_object++;
X write_arc(fp, a);
X }
X for (c = objects.compounds; c != NULL; c = c-> next) {
X num_object++;
X write_compound(fp, c);
X }
X for (e = objects.ellipses; e != NULL; e = e-> next) {
X num_object++;
X write_ellipse(fp, e);
X }
X for (l = objects.lines; l != NULL; l = l-> next) {
X num_object++;
X write_line(fp, l);
X }
X for (s = objects.splines; s != NULL; s = s-> next) {
X num_object++;
X write_spline(fp, s);
X }
X for (t = objects.texts; t != NULL; t = t-> next) {
X num_object++;
X write_text(fp, t);
X }
X fclose(fp);
X }
X
Xwrite_arc(fp, a)
XFILE *fp;
XF_arc *a;
X{
X F_arrow *f, *b;
X
X fprintf(fp, "%d %d %d %d %d %d %d %d %.3f %d %d %d %.3f %.3f %d %d %d %d %d %d\n",
X O_ARC, a->type, a->style, a->thickness,
X a->color, a->depth, a->pen, a->area_fill,
X a->style_val, a->direction,
X ((f = a->for_arrow) ? 1 : 0), ((b = a->back_arrow) ? 1 : 0),
X a->center.x, a->center.y,
X a->point[0].x, a->point[0].y,
X a->point[1].x, a->point[1].y,
X a->point[2].x, a->point[2].y);
X if (f)
X fprintf(fp, "\t%d %d %.3f %.3f %.3f\n", f->type, f->style,
X f->thickness, f->wid, f->ht);
X if (b)
X fprintf(fp, "\t%d %d %.3f %.3f %.3f\n", b->type, b->style,
X b->thickness, b->wid, b->ht);
X }
X
Xwrite_compound(fp, com)
XFILE *fp;
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 fprintf(fp, "%d %d %d %d %d\n", O_COMPOUND, com->nwcorner.x,
X com->nwcorner.y, com->secorner.x, com->secorner.y);
X for (a = com->arcs; a != NULL; a = a-> next) write_arc(fp, a);
X for (c = com->compounds; c != NULL; c = c-> next) write_compound(fp, c);
X for (e = com->ellipses; e != NULL; e = e-> next) write_ellipse(fp, e);
X for (l = com->lines; l != NULL; l = l-> next) write_line(fp, l);
X for (s = com->splines; s != NULL; s = s-> next) write_spline(fp, s);
X for (t = com->texts; t != NULL; t = t-> next) write_text(fp, t);
X fprintf(fp, "%d\n", O_END_COMPOUND);
X }
X
Xwrite_ellipse(fp, e)
XFILE *fp;
XF_ellipse *e;
X{
X if( e->radiuses.x == 0 || e->radiuses.y == 0 )
X return;
X
X fprintf(fp, "%d %d %d %d %d %d %d %d %.3f %d %.3f %d %d %d %d %d %d %d %d\n",
X O_ELLIPSE, e->type, e->style, e->thickness,
X e->color, e->depth, e->pen, e->area_fill,
X e->style_val, e->direction, e->angle,
X e->center.x, e->center.y,
X e->radiuses.x, e->radiuses.y,
X e->start.x, e->start.y,
X e->end.x, e->end.y);
X }
X
Xwrite_line(fp, l)
XFILE *fp;
XF_line *l;
X{
X F_point *p;
X F_arrow *f, *b;
X
X if( l->points == NULL )
X return;
X fprintf(fp, "%d %d %d %d %d %d %d %d %.3f %d %d\n",
X O_POLYLINE, l->type, l->style, l->thickness,
X l->color, l->depth, l->pen, l->area_fill, l->style_val,
X ((f = l->for_arrow) ? 1 : 0), ((b = l->back_arrow) ? 1 : 0));
X if (f)
X fprintf(fp, "\t%d %d %.3f %.3f %.3f\n", f->type, f->style,
X f->thickness, f->wid, f->ht);
X if (b)
X fprintf(fp, "\t%d %d %.3f %.3f %.3f\n", b->type, b->style,
X b->thickness, b->wid, b->ht);
X fprintf(fp, "\t");
X for (p = l->points; p!= NULL; p = p->next) {
X fprintf(fp, " %d %d", p->x, p->y);
X };
X fprintf(fp, " 9999 9999\n");
X }
X
Xwrite_spline(fp, s)
XFILE *fp;
XF_spline *s;
X{
X F_control *cp;
X F_point *p;
X F_arrow *f, *b;
X
X if( s->points == NULL )
X return;
X fprintf(fp, "%d %d %d %d %d %d %d %d %.3f %d %d\n",
X O_SPLINE, s->type, s->style, s->thickness,
X s->color, s->depth, s->pen, s->area_fill, s->style_val,
X ((f = s->for_arrow) ? 1 : 0), ((b = s->back_arrow) ? 1 : 0));
X if (f)
X fprintf(fp, "\t%d %d %.3f %.3f %.3f\n", f->type, f->style,
X f->thickness, f->wid, f->ht);
X if (b)
X fprintf(fp, "\t%d %d %.3f %.3f %.3f\n", b->type, b->style,
X b->thickness, b->wid, b->ht);
X fprintf(fp, "\t");
X for (p = s->points; p != NULL; p = p->next) {
X fprintf(fp, " %d %d", p->x, p->y);
X };
X fprintf(fp, " 9999 9999\n"); /* terminating code */
X
X if (s->controls == NULL) return;
X fprintf(fp, "\t");
X for (cp = s->controls; cp != NULL; cp = cp->next) {
X fprintf(fp, " %.3f %.3f %.3f %.3f",
X cp->lx, cp->ly, cp->rx, cp->ry);
X };
X fprintf(fp, "\n");
X }
X
Xwrite_text(fp, t)
XFILE *fp;
XF_text *t;
X{
X if( t->length == 0 )
X return;
X fprintf(fp, "%d %d %d %d %d %d %d %.3f %d %d %d %d %d %s\1\n",
X O_TEXT, t->type, t->font, t->size, t->pen,
X t->color, t->depth, t->angle,
X t->style, t->height, t->length,
X t->base_x, t->base_y, t->cstring);
X }
END_OF_FILE
if test 6610 -ne `wc -c <'xfig/save.c'`; then
echo shar: \"'xfig/save.c'\" unpacked with wrong size!
fi
# end of 'xfig/save.c'
fi
if test -f 'xfig/spline.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'xfig/spline.c'\"
else
echo shar: Extracting \"'xfig/spline.c'\" \(5914 characters\)
sed "s/^X//" >'xfig/spline.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, Add closed spline.
X *
X * %W% %G%
X*/
X#include "fig.h"
X#include "resources.h"
X#include "alloc.h"
X#include "func.h"
X#include "object.h"
X#include "paintop.h"
X
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 int cur_line_style, line_thickness;
Xextern float cur_styleval;
Xextern int cur_color;
Xextern int cur_areafill;
Xextern int fill_mode;
Xextern int fix_x, fix_y, cur_x, cur_y;
Xextern int cur_command;
Xextern int manhattan_mode, mountain_mode;
Xextern int autoforwardarrow_mode;
Xextern int autobackwardarrow_mode;
Xextern int arrow_ht, arrow_wid;
Xextern F_compound objects;
Xextern int num_point;
Xextern int DEBUG;
Xextern F_point *first_point, *cur_point;
X
Xint create_splineobject();
X init_spline_drawing();
X
Xdraw_spline_selected()
X{
X canvas_kbd_proc = null_proc;
X canvas_locmove_proc = null_proc;
X canvas_leftbut_proc = init_spline_drawing;
X canvas_middlebut_proc = null_proc;
X canvas_rightbut_proc = set_popupmenu;
X set_cursor(&arrow_cursor);
X reset_action_on();
X }
X
Xinit_spline_drawing(x, y)
Xint x, y;
X{
X init_line_drawing(x, y);
X canvas_middlebut_proc = create_splineobject;
X canvas_rightbut_proc = null_proc;
X }
X
Xcreate_splineobject(x, y)
Xint x, y;
X{
X extern F_arrow *forward_arrow(), *backward_arrow();
X F_spline *spline;
X
X if (x != fix_x || y != fix_y) get_intermediatepoint(x, y);
X draw_elasticline();
X if (num_point <= 2) {
X pw_vector(canvas_pixwin, first_point->x, first_point->y,
X cur_point->x, cur_point->y, PAINT, 0);
X if (num_point == 1) free((char*)cur_point);
X free((char*)first_point);
X draw_spline_selected();
X return;
X }
X Spline_malloc(spline);
X spline->style = cur_line_style;
X spline->thickness = line_thickness;
X spline->style_val = cur_styleval;
X spline->color = cur_color;
X spline->depth = 0;
X spline->pen = NULL;
X spline->area_fill = 0;
X spline->points = first_point;
X spline->controls = NULL;
X spline->next = NULL;
X cur_x = cur_y = fix_x = fix_y = 0; /* used in draw_movingpoint */
X draw_movingpoint(spline->points, INV_PAINT); /* erase control vector */
X pw_batch_on(canvas_pixwin);
X if (cur_command == F_CLOSED_SPLINE) {
X spline->type = T_CLOSED_NORMAL;
X spline->for_arrow = NULL;
X spline->back_arrow = NULL;
X /* added 3/1/89 B.V.Smith */
X /* The current area fill color will be saved in the object if
X fill_mode is != 0, but the method presently used to draw
X the spline doesn't easily lend itself to area fill,
X so it is not filled.
X The spline is drawn in sections that aren't adjacent,
X and have overlapping sections. */
X spline->area_fill = fill_mode? cur_areafill : 0;
X num_point++;
X append_point(first_point->x, first_point->y, &cur_point);
X draw_closed_spline(spline, PAINT);
X }
X else { /* It must be F_SPLINE */
X if (autoforwardarrow_mode)
X spline->for_arrow = forward_arrow();
X else
X spline->for_arrow = NULL;
X if (autobackwardarrow_mode)
X spline->back_arrow = backward_arrow();
X else
X spline->back_arrow = NULL;
X spline->type = T_OPEN_NORMAL;
X draw_open_spline(spline, PAINT);
X }
X pw_batch_off(canvas_pixwin);
X if (DEBUG) {
X int xmin, ymin, xmax, ymax;
X spline_bound(spline, &xmin, &ymin, &xmax, &ymax);
X draw_rectbox(xmin, ymin, xmax, ymax, PAINT, 1);
X }
X clean_up();
X insert_spline(&objects.splines, spline);
X set_action_object(F_CREATE, O_SPLINE);
X set_latestspline(spline);
X set_modifiedflag();
X draw_spline_selected();
X }
X
X#define round(x) ((int) (x + .5))
X
Xdraw_open_spline(spline, op)
XF_spline *spline;
Xint op;
X{
X F_point *p;
X float cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4;
X float x1, y1, x2, y2;
X
X p = spline->points;
X x1 = p->x; y1 = p->y;
X p = p->next;
X x2 = p->x; y2 = p->y;
X cx1 = (x1 + x2) / 2; cy1 = (y1 + y2) / 2;
X cx2 = (cx1 + x2) / 2; cy2 = (cy1 + y2) / 2;
X if (spline->back_arrow) /* backward arrow */
X draw_arrow((int)x2, (int)y2, (int)x1, (int)y1,
X spline->back_arrow, op);
X pw_vector(canvas_pixwin, (int)x1, (int)y1, round(cx1),
X round(cy1), op, spline->thickness);
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; cy4 = (y1 + y2) / 2;
X cx3 = (x1 + cx4) / 2; cy3 = (y1 + cy4) / 2;
X quadratic_spline(cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4, op,
X spline->thickness);
X cx1 = cx4; cy1 = cy4;
X cx2 = (cx1 + x2) / 2; cy2 = (cy1 + y2) / 2;
X }
X pw_vector(canvas_pixwin, round(cx1), round(cy1),
X (int)x2, (int)y2, op, spline->thickness);
X if (spline->for_arrow) /* forward arrow */
X draw_arrow((int)x1, (int)y1, (int)x2, (int)y2,
X spline->for_arrow, op);
X }
X
Xdraw_closed_spline(spline, op)
XF_spline *spline;
Xint op;
X{
X F_point *p;
X float cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4;
X float x1, y1, x2, y2;
X
X p = spline->points;
X x1 = p->x; y1 = p->y;
X p = p->next;
X x2 = p->x; y2 = p->y;
X cx1 = (x1 + x2) / 2; cy1 = (y1 + y2) / 2;
X cx2 = (x1 + 3 * x2) / 4; cy2 = (y1 + 3 * y2) / 4;
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; cy4 = (y1 + y2) / 2;
X cx3 = (x1 + cx4) / 2; cy3 = (y1 + cy4) / 2;
X quadratic_spline(cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4, op,
X spline->thickness);
X cx1 = cx4; cy1 = cy4;
X cx2 = (cx1 + x2) / 2; cy2 = (cy1 + y2) / 2;
X }
X x1 = x2; y1 = y2;
X p = spline->points->next;
X x2 = p->x; y2 = p->y;
X cx4 = (x1 + x2) / 2; cy4 = (y1 + y2) / 2;
X cx3 = (x1 + cx4) / 2; cy3 = (y1 + cy4) / 2;
X quadratic_spline(cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4, op,
X spline->thickness);
X }
END_OF_FILE
if test 5914 -ne `wc -c <'xfig/spline.c'`; then
echo shar: \"'xfig/spline.c'\" unpacked with wrong size!
fi
# end of 'xfig/spline.c'
fi
echo shar: End of archive 12 \(of 15\).
cp /dev/null ark12isdone
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 at sun.com / argv at 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.
More information about the Comp.sources.x
mailing list