v01i009: xfig: a MacDraw style line editor(X11), Part08/11
Mike Wexler
mikew at wyse.wyse.com
Wed Aug 17 06:29:00 AEST 1988
Submitted-by: ken at cs.rochester.edu (Ken Yap)
Posting-number: Volume 1, Issue 9
Archive-name: xfig/part08
#! /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 8 (of 11)."
# Contents: main.c read.c ruler.c
# Wrapped by mikew at wyse on Tue Aug 16 13:14:40 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f main.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"main.c\"
else
echo shar: Extracting \"main.c\" \(14448 characters\)
sed "s/^X//" >main.c <<'END_OF_main.c'
X/*
X * FIG : Facility for Interactive Generation of figures
X *
X * Copyright (c) 1985 by Supoj Sutanthavibul (supoj at sally.UTEXAS.EDU)
X * 1st revision : Aug 1985.
X *
X * %W% %G%
X*/
X#include "fig.h"
X#include "const.h"
X#include "version.h"
X
Xextern int borderwid, windowspacing, toolstripeht;
Xextern int ICON_COLUMN;
Xextern int CANVAS_HEIGHT, CANVAS_WIDTH;
Xextern int CANVAS_LEFT, CANVAS_TOP;
Xextern int PANEL_LEFT, PANEL_TOP, PANEL_HEIGHT, PANEL_WID;
Xextern int MSG_LEFT, MSG_TOP, MSG_WIDTH;
Xextern int SIDERULER_LEFT, SIDERULER_TOP;
Xextern int SIDERULER_WIDTH, SIDERULER_HEIGHT;
Xextern int SIDERULER_START;
Xextern int TOPRULER_LEFT, TOPRULER_TOP;
Xextern int TOPRULER_WIDTH, TOPRULER_HEIGHT;
Xextern (*canvas_rightbut_proc)();
Xextern set_popupmenu();
X
X#include "fig.icon"
X#include "resources.h"
X
X#define FIG_ICON_WIDTH MY_ICON_WIDTH
X#define FIG_ICON_HEIGHT MY_ICON_HEIGHT
X#define SCREEN_WIDTH 1152
X#define SCREEN_HEIGHT 900
X#define min(a,b) (((a) < (b)) ? (a) : (b))
X
Xmpr_static(fig_icon_pr, FIG_ICON_WIDTH, FIG_ICON_HEIGHT, 1, icon_data);
Xstatic struct icon fig_icon = {
X FIG_ICON_WIDTH+4, FIG_ICON_HEIGHT+4, NULL,
X {2, 2, FIG_ICON_WIDTH, FIG_ICON_HEIGHT},
X &fig_icon_pr, {0, 0, 0, 0}, NULL, NULL,
X ICON_BKGRDSET };
X
Xstatic char tool_name[80] = " FIG : FACILITY FOR INTERACTIVE GENERATION OF FIGURES ";
Xstatic RECT icon_rect, tool_rect;
Xstatic sigwinched();
X
X/************** FIG options ******************/
X
Xextern int DEBUG;
Xextern int RHS_PANEL;
Xextern int INVERSE;
X
XTOOL tool;
Xint WINDOW_WIDTH, WINDOW_HEIGHT;
Xchar file_header[32] = "#FIG ";
Xstatic char *file = NULL;
X
Xget_args(argc, argv)
Xint argc;
Xchar **argv;
X{
X char *option;
X
X CANVAS_HEIGHT = DEF_CANVAS_HEIGHT;
X CANVAS_WIDTH = DEF_CANVAS_WIDTH;
X ICON_COLUMN = ICON_COLUMN_PORT;
X while (--argc > 0) {
X option = *++argv;
X if (*option == '-') {
X while(*++option != '\0') {
X switch(*option) {
X case 'r': /* put panel on right side */
X RHS_PANEL = 1;
X break;
X
X case 'd': /* turn on debugging */
X DEBUG = 1;
X break;
X
X case 'p': /* 8 X 10 portrait mode */
X case 'P':
X CANVAS_HEIGHT = DEF_CANVAS_HEIGHT;
X CANVAS_WIDTH = DEF_CANVAS_WIDTH;
X ICON_COLUMN = ICON_COLUMN_PORT;
X break;
X
X case 'l': /* 10 X 8 landscape mode */
X case 'L':
X CANVAS_HEIGHT = DEF_CANVAS_WIDTH;
X CANVAS_WIDTH = DEF_CANVAS_HEIGHT;
X ICON_COLUMN = ICON_COLUMN_LAND;
X break;
X
X case 'w': /* set width to size you want */
X CANVAS_WIDTH = atof(*++argv) * PIX_PER_INCH;
X argc--;
X break;
X
X case 'h': /* set height to size you want */
X CANVAS_HEIGHT = atof(*++argv) * PIX_PER_INCH;
X if( CANVAS_HEIGHT < DEF_CANVAS_HEIGHT)
X ICON_COLUMN = ICON_COLUMN_LAND;
X argc--;
X break;
X
X case 'i': /* reverse video */
X INVERSE = 1;
X invert_color();
X break;
X
X default:
X printf ("%s: Flag <%c> unrecognized\n", argv[0], *option);
X exit(1);
X
X }
X }
X }
X else
X {
X file = option;
X }
X }
X}
X
X#ifndef X11
Xmain(argc, argv)
Xint argc;
Xchar **argv;
X{
X ICON_COLUMN = ICON_COLUMN_PORT;
X get_args(argc, argv);
X strcat(tool_name, FIG_VERSION);
X strcat(file_header, FIG_VERSION);
X printf("Initializing FIG %s%s (SunView) ...\n", FIG_VERSION, MINOR_VERSION);
X tool = tool_create(tool_name, TOOL_NAMESTRIPE, NULL, &fig_icon);
X if (tool == (TOOL)0) exit(1);
X compute_window_sizes();
X set_window_size();
X
X init_font();
X if (init_panel(tool) == 0) exit(1);
X if (init_canvas(tool) == 0) exit(1);
X if (init_msg(tool) == 0) exit(1);
X if (init_sideruler(tool) == 0) exit(1);
X if (init_topruler(tool) == 0) exit(1);
X set_subwindow_sizes();
X
X if (file != NULL) {
X edit_file(file);
X }
X signal(SIGWINCH, sigwinched);
X canvas_rightbut_proc = set_popupmenu;
X tool_install(tool);
X for(;;) {
X tool_select(tool, 0);
X quit(); /* This is where one of the exit points is */
X }
X}
X#else
X
Xstatic int zero = 0;
Xint landscape;
Xfloat tmp_width = 0.0, tmp_height = 0.0;
X
Xstatic XtResource application_resources[] = {
X {XtNjustify, XtCJustify, XtRBoolean, sizeof(int),
X (Cardinal)&RHS_PANEL, XtRString, "False"},
X {"debug", "Debug", XtRBoolean, sizeof(int),
X (Cardinal)&DEBUG, XtRString, "False"},
X {XtNorientation, XtCOrientation, XtRBoolean, sizeof(int),
X (Cardinal)&landscape, XtRBoolean, False},
X {XtNwidth, XtCWidth, XtRFloat, sizeof(float),
X (Cardinal)&tmp_width, XtRInt, (caddr_t)&zero},
X {XtNheight, XtCHeight, XtRFloat, sizeof(float),
X (Cardinal)&tmp_height, XtRInt, (caddr_t)&zero},
X {XtNreverseVideo, XtCReverseVideo, XtRBoolean, sizeof(int),
X (Cardinal)&INVERSE, XtRString, "False"},
X};
X
Xstatic XrmOptionDescRec options[] =
X{
X {"-right", ".justify", XrmoptionNoArg, "True" },
X {"-debug", ".debug", XrmoptionNoArg, "True"},
X {"-landscape", ".orientation", XrmoptionNoArg, "True"},
X {"-Landscape", ".orientation", XrmoptionNoArg, "True"},
X {"-portrait", ".orientation", XrmoptionNoArg, "False"},
X {"-Portrait", ".orientation", XrmoptionNoArg, "False"},
X {"-width", ".width", XrmoptionSepArg, 0},
X {"-height", ".height", XrmoptionSepArg, 0},
X {"-inverse", ".reverseVideo", XrmoptionNoArg, "True"}
X};
X
Xstatic XtCallbackRec callbacks[] =
X{
X { NULL, NULL },
X};
X
Xstatic Arg form_args[] =
X{
X { XtNcallback, (XtArgVal)callbacks },
X};
X
Xmain(argc,argv)
X int argc;
X char *argv[];
X{
X TOOL form, children[5];
X Arg tmp_arg[2];
X int init_panel(), init_msg(), init_canvas(),
X init_sideruler(), init_topruler();
X
X strcat(tool_name, FIG_VERSION);
X strcat(file_header, FIG_VERSION);
X printf("Initializing FIG %s%s (X11) ... \n", FIG_VERSION, MINOR_VERSION);
X tool = XtInitialize("fig", "Fig", options, XtNumber(options),
X &argc, argv);
X
X XtSetArg(tmp_arg[0], XtNtitle, tool_name);
X XtSetValues(tool, tmp_arg, 1);
X
X fix_converters();
X XtGetApplicationResources(tool, 0, application_resources,
X XtNumber(application_resources), NULL, 0 );
X if (argc > 1)
X file = argv[1];
X
X tool_d = XtDisplay(tool);
X tool_s = XtScreen(tool);
X tool_sn = DefaultScreen(tool_d);
X gc = DefaultGC(tool_d, tool_sn);
X init_font();
X init_cursor();
X form = XtCreateManagedWidget("form", formWidgetClass, tool,
X form_args, XtNumber(form_args));
X
X ICON_COLUMN = ICON_COLUMN_PORT;
X CANVAS_WIDTH = tmp_width * PIX_PER_INCH;
X CANVAS_HEIGHT = tmp_height * PIX_PER_INCH;
X
X if( CANVAS_WIDTH == 0 )
X CANVAS_WIDTH = landscape ? DEF_CANVAS_HEIGHT :
X DEF_CANVAS_WIDTH;
X
X if( CANVAS_HEIGHT == 0 )
X CANVAS_HEIGHT = landscape ? DEF_CANVAS_WIDTH :
X DEF_CANVAS_HEIGHT;
X
X if( CANVAS_HEIGHT < DEF_CANVAS_HEIGHT )
X ICON_COLUMN = ICON_COLUMN_LAND;
X
X (void)init_panel(form);
X children[0] = panel_sw;
X (void)init_topruler(form);
X children[1] = topruler_sw;
X (void)init_menu(form);
X (void)init_canvas(form);
X children[2] = canvas_sw;
X (void)init_msg(form);
X children[3] = msg_sw;
X (void)init_sideruler(form);
X children[4] = sideruler_sw;
X XtManageChildren(children, 5);
X XtRealizeWidget(tool);
X if( RHS_PANEL )
X {
X XtSetArg(tmp_arg[0], XtNfromHoriz, 0);
X XtSetArg(tmp_arg[1], XtNhorizDistance, RULER_WIDTH+2);
X XtSetValues(topruler_sw, tmp_arg, 2);
X XtSetArg(tmp_arg[0], XtNfromHoriz, 0);
X XtSetArg(tmp_arg[1], XtNfromVert, topruler_sw);
X XtSetValues(sideruler_sw, tmp_arg, 2);
X XtUnmanageChild(msg_sw);
X XtSetArg(tmp_arg[0], XtNfromHoriz, sideruler_sw);
X XtSetArg(tmp_arg[1], XtNfromVert, topruler_sw);
X XtSetValues(canvas_sw, tmp_arg, 2);
X XtManageChild(msg_sw);
X XtSetArg(tmp_arg[0], XtNfromHoriz, canvas_sw);
X XtSetArg(tmp_arg[1], XtNfromVert, 0);
X XtSetValues(panel_sw, tmp_arg, 2);
X XtSetArg(tmp_arg[0], XtNfromHoriz, sideruler_sw);
X XtSetArg(tmp_arg[1], XtNfromVert, canvas_sw);
X XtSetValues(msg_sw, tmp_arg, 2);
X XtUnmanageChild(msg_sw);
X XtManageChild(msg_sw);
X }
X init_gc();
X setup_panel();
X setup_rulers();
X setup_canvas();
X setup_msg();
X canvas_rightbut_proc = set_popupmenu;
X if (file != NULL)
X edit_file(file);
X (void)signal(SIGINT, SIG_IGN); /* so we don't lose work accidentally */
X XtMainLoop();
X}
X#endif X11
X
X#ifndef X11
X#define TOPRULER_CANVAS_SPACING 5
X#define SIDERULER_CANVAS_SPACING 5
X#define PANEL_CANVAS_SPACING 5
X#define PANEL_MSG_SPACING 5
X
Xcompute_window_sizes()
X{
X borderwid = tool_borderwidth(tool);
X windowspacing = tool_subwindowspacing(tool);
X toolstripeht = tool_stripeheight(tool);
X PANEL_WID = ICON_COLUMN * SWITCH_ICON_WIDTH;
X PANEL_HEIGHT = RULER_WIDTH + CANVAS_HEIGHT + TOPRULER_CANVAS_SPACING;
X PANEL_TOP = toolstripeht + 2;
X MSG_WIDTH = PANEL_WID + RULER_WIDTH + CANVAS_WIDTH
X + SIDERULER_CANVAS_SPACING + PANEL_CANVAS_SPACING;
X MSG_TOP = PANEL_HEIGHT + PANEL_TOP + PANEL_MSG_SPACING;
X MSG_LEFT = borderwid;
X
X TOPRULER_TOP = PANEL_TOP;
X TOPRULER_WIDTH = CANVAS_WIDTH;
X TOPRULER_HEIGHT = RULER_WIDTH;
X
X CANVAS_TOP = TOPRULER_TOP + RULER_WIDTH + TOPRULER_CANVAS_SPACING;
X
X SIDERULER_TOP = TOPRULER_TOP;
X SIDERULER_WIDTH = RULER_WIDTH;
X SIDERULER_HEIGHT = PANEL_HEIGHT;
X SIDERULER_START = RULER_WIDTH + TOPRULER_CANVAS_SPACING;
X
X WINDOW_WIDTH = borderwid + borderwid + MSG_WIDTH;
X WINDOW_HEIGHT = MSG_TOP + MSG_HEIGHT + borderwid;
X
X if (RHS_PANEL) { /* panel on the right of drawing area */
X SIDERULER_LEFT = borderwid;
X CANVAS_LEFT = SIDERULER_LEFT + RULER_WIDTH
X + SIDERULER_CANVAS_SPACING;
X PANEL_LEFT = CANVAS_LEFT + CANVAS_WIDTH + PANEL_CANVAS_SPACING;
X TOPRULER_LEFT = CANVAS_LEFT;
X }
X else {
X PANEL_LEFT = borderwid;
X CANVAS_LEFT = PANEL_LEFT + PANEL_WID + PANEL_CANVAS_SPACING;
X SIDERULER_LEFT = CANVAS_LEFT + CANVAS_WIDTH
X + SIDERULER_CANVAS_SPACING;
X TOPRULER_LEFT = CANVAS_LEFT;
X }
X }
X
Xset_window_size()
X{
X if (wmgr_iswindowopen(tool->tl_windowfd) ) {
X win_getrect(tool->tl_windowfd, &tool_rect);
X win_getsavedrect(tool->tl_windowfd, &icon_rect);
X }
X else {
X win_getrect(tool->tl_windowfd, &icon_rect);
X win_getsavedrect(tool->tl_windowfd, &tool_rect);
X }
X if (tool_rect.r_width != WINDOW_WIDTH
X || tool_rect.r_height != WINDOW_HEIGHT) {
X tool_rect.r_width = WINDOW_WIDTH;
X tool_rect.r_height = WINDOW_HEIGHT;
X icon_rect.r_left = min(icon_rect.r_left, SCREEN_WIDTH-FIG_ICON_WIDTH-4);
X icon_rect.r_top = min(icon_rect.r_top, SCREEN_HEIGHT-FIG_ICON_HEIGHT-4);
X if (tool_rect.r_left < 0
X || tool_rect.r_left + tool_rect.r_width > SCREEN_WIDTH
X || tool_rect.r_top < 0
X || tool_rect.r_top + tool_rect.r_height > SCREEN_HEIGHT) {
X tool_rect.r_left = 300;
X tool_rect.r_top = 10;
X }
X if (wmgr_iswindowopen(tool->tl_windowfd) ) {
X win_setrect(tool->tl_windowfd, &tool_rect);
X win_setsavedrect(tool->tl_windowfd, &icon_rect);
X }
X else {
X win_setrect(tool->tl_windowfd, &icon_rect);
X win_setsavedrect(tool->tl_windowfd, &tool_rect);
X }
X }
X }
X
Xstatic
Xsigwinched()
X{
X tool_sigwinch(tool);
X set_window_size();
X set_subwindow_sizes();
X }
X
Xset_subwindow_sizes()
X{
X set_window(panel_sw, PANEL_TOP, PANEL_LEFT, PANEL_WID, PANEL_HEIGHT);
X set_window(msg_sw, MSG_TOP, MSG_LEFT, MSG_WIDTH, MSG_HEIGHT);
X set_window(canvas_sw, CANVAS_TOP, CANVAS_LEFT, CANVAS_WIDTH,
X CANVAS_HEIGHT);
X set_window(sideruler_sw, SIDERULER_TOP, SIDERULER_LEFT, RULER_WIDTH,
X SIDERULER_HEIGHT);
X set_window(topruler_sw, TOPRULER_TOP, TOPRULER_LEFT, CANVAS_WIDTH,
X RULER_WIDTH);
X }
X
Xset_window(win, t, l, w, h)
XTOOLSW win;
Xint t, l, w, h;
X{
X RECT r;
X
X if (wmgr_iswindowopen(tool->tl_windowfd) )
X win_getrect(win->ts_windowfd, &r);
X else
X win_getsavedrect(win->ts_windowfd, &r);
X
X if (r.r_top!= t || r.r_left != l || r.r_width != w || r.r_height != h) {
X r.r_top = t;
X r.r_left = l;
X r.r_width = w;
X r.r_height = h;
X if (wmgr_iswindowopen(tool->tl_windowfd))
X win_setrect(win->ts_windowfd, &r);
X else
X win_setsavedrect(win->ts_windowfd, &r);
X }
X }
X#endif X11
X
X/*
X if (wmgr_iswindowopen(tool->tl_windowfd) )
X win_getrect(msg_sw->ts_windowfd, &msg_rect);
X else
X win_getsavedrect(msg_sw->ts_windowfd, &msg_rect);
X if ( msg_rect.r_top != MSG_TOP || msg_rect.r_left != MSG_LEFT ||
X msg_rect.r_width != MSG_WIDTH ||
X msg_rect.r_height != MSG_HEIGHT) {
X msg_rect.r_top = MSG_TOP;
X msg_rect.r_left = MSG_LEFT;
X msg_rect.r_width = MSG_WIDTH;
X msg_rect.r_height = MSG_HEIGHT;
X if (wmgr_iswindowopen(tool->tl_windowfd))
X win_setrect(msg_sw->ts_windowfd, &msg_rect);
X else
X win_setsavedrect(msg_sw->ts_windowfd, &msg_rect);
X }
X
X if (wmgr_iswindowopen(tool->tl_windowfd) )
X win_getrect(canvas_sw->ts_windowfd, &canvas_rect);
X else
X win_getsavedrect(canvas_sw->ts_windowfd, &canvas_rect);
X if (canvas_rect.r_top != CANVAS_TOP ||
X canvas_rect.r_left != CANVAS_LEFT ||
X canvas_rect.r_width != CANVAS_WIDTH ||
X canvas_rect.r_height != CANVAS_HEIGHT) {
X canvas_rect.r_top = CANVAS_TOP;
X canvas_rect.r_left = CANVAS_LEFT;
X canvas_rect.r_width = CANVAS_WIDTH;
X canvas_rect.r_height = CANVAS_HEIGHT;
X if (wmgr_iswindowopen(tool->tl_windowfd))
X win_setrect(canvas_sw->ts_windowfd, &canvas_rect);
X else
X win_setsavedrect(canvas_sw->ts_windowfd, &canvas_rect);
X }
X
X if (wmgr_iswindowopen(tool->tl_windowfd) )
X win_getrect(topruler_sw->ts_windowfd, &topruler_rect);
X else
X win_getsavedrect(topruler_sw->ts_windowfd, &topruler_rect);
X if (topruler_rect.r_top != TOPRULER_TOP ||
X topruler_rect.r_left != TOPRULER_LEFT ||
X topruler_rect.r_width != CANVAS_WIDTH ||
X topruler_rect.r_height != RULER_WIDTH) {
X topruler_rect.r_top = TOPRULER_TOP;
X topruler_rect.r_left = TOPRULER_LEFT;
X topruler_rect.r_width = TOPRULER_WIDTH;
X topruler_rect.r_height = TOPRULER_HEIGHT;
X if (wmgr_iswindowopen(tool->tl_windowfd))
X win_setrect(topruler_sw->ts_windowfd, &topruler_rect);
X else
X win_setsavedrect(topruler_sw->ts_windowfd, &topruler_rect);
X }
X
X if (wmgr_iswindowopen(tool->tl_windowfd) )
X win_getrect(sideruler_sw->ts_windowfd, &sideruler_rect);
X else
X win_getsavedrect(sideruler_sw->ts_windowfd, &sideruler_rect);
X if (sideruler_rect.r_top != SIDERULER_TOP ||
X sideruler_rect.r_left != SIDERULER_LEFT ||
X sideruler_rect.r_width != RULER_WIDTH ||
X sideruler_rect.r_height != SIDERULER_HEIGHT) {
X sideruler_rect.r_top = SIDERULER_TOP;
X sideruler_rect.r_left = SIDERULER_LEFT;
X sideruler_rect.r_width = SIDERULER_WIDTH;
X sideruler_rect.r_height = SIDERULER_HEIGHT;
X if (wmgr_iswindowopen(tool->tl_windowfd))
X win_setrect(sideruler_sw->ts_windowfd, &sideruler_rect);
X else
X win_setsavedrect(sideruler_sw->ts_windowfd, &sideruler_rect);
X }
X }
X*/
END_OF_main.c
if test 14448 -ne `wc -c <main.c`; then
echo shar: \"main.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f read.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"read.c\"
else
echo shar: Extracting \"read.c\" \(14208 characters\)
sed "s/^X//" >read.c <<'END_OF_read.c'
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 "alloc.h"
X#include "object.h"
X
Xextern F_arrow *make_arrow();
Xextern char *calloc();
Xextern int errno;
X
Xstatic F_ellipse *read_ellipseobject();
Xstatic F_line *read_lineobject();
Xstatic F_text *read_textobject();
Xstatic F_spline *read_splineobject();
Xstatic F_arc *read_arcobject();
Xstatic F_compound *read_compoundobject();
X
X#define BUF_SIZE 1024
X
Xchar buf[BUF_SIZE];
Xint line_no = 0;
Xint num_object;
X
Xread_fail_message(file, err)
Xchar *file;
Xint err;
X{
X extern char *sys_errlist[];
X
X if (err == 0) /* Successful read */
X return;
X else if (err == ENAMETOOLONG)
X put_msg("File name \"%s\" is too long", file);
X else if (err == ENOENT)
X put_msg("File \"%s\" does not exist", file);
X else if (err == ENOTDIR)
X put_msg("A name in the path \"%s\" is not a directory", file);
X else if (err == EACCES)
X put_msg("Read access to file \"%s\" is blocked", file);
X else if (err == EISDIR)
X put_msg("File \"%s\" is a directory", file);
X else if (err == -2) {
X put_msg("File \"%s\" is empty", file);
X }
X else if (err == -1) {
X /* Format error; relevant error message is already delivered */
X }
X else
X put_msg("File \"%s\" is not accessable; %s", file, sys_errlist[err]);
X }
X
X/**********************************************************
XRead_fig returns :
X
X 0 : successful read.
X -1 : File is in incorrect format
X -2 : File is empty
Xerr_no : if file can not be read for various reasons
X
XThe resolution (ppi) and the cooridnate system (coord_sys) are
Xstored in obj->nwcorner.x and obj->nwcorner.x respectively.
X**********************************************************/
X
Xread_fig(file_name, obj)
Xchar *file_name;
XF_compound *obj;
X{
X FILE *fp;
X
X if ((fp = fopen(file_name, "r")) == NULL)
X return(errno);
X else
X return(readfp_fig(fp, obj));
X }
X
Xreadfp_fig(fp, obj)
XFILE *fp;
XF_compound *obj;
X{
X char c;
X int status;
X
X num_object = 0;
X c = fgetc(fp);
X if (feof(fp)) return(-2);
X ungetc(c, fp);
X bzero((char*)obj, COMOBJ_SIZE);
X if (c == '#')
X status = read_objects(fp, obj);
X else
X status = read_1_3_objects(fp, obj);
X fclose(fp);
X return(status);
X }
X
Xint
Xread_objects(fp, obj)
XFILE *fp;
XF_compound *obj;
X{
X F_ellipse *e, *le = NULL;
X F_line *l, *ll = NULL;
X F_text *t, *lt = NULL;
X F_spline *s, *ls = NULL;
X F_arc *a, *la = NULL;
X F_compound *c, *lc = NULL;
X int object, ppi, coord_sys;
X
X fgets(buf, BUF_SIZE, fp); /* get the line "#FIG 1.4" */
X line_no++;
X if (get_line(fp) < 0) {
X put_msg("File is truncated");
X return(-1);
X }
X if (2 != sscanf(buf,"%d%d\n", &ppi, &coord_sys)) {
X put_msg("Incomplete data at line %d", line_no);
X return(-1);
X }
X
X obj->nwcorner.x = ppi;
X obj->nwcorner.y = coord_sys;
X while (get_line(fp) > 0) {
X if (1 != sscanf(buf, "%d", &object)) {
X put_msg("Incorrect format at line %d", line_no);
X return(-1);
X }
X switch (object) {
X case O_POLYLINE :
X if ((l = read_lineobject(fp)) == NULL) return(-1);
X if (ll)
X ll = (ll->next = l);
X else
X ll = obj->lines = l;
X num_object++;
X break;
X case O_SPLINE :
X if ((s = read_splineobject(fp)) == NULL) return(-1);
X if (ls)
X ls = (ls->next = s);
X else
X ls = obj->splines = s;
X num_object++;
X break;
X case O_ELLIPSE :
X if ((e = read_ellipseobject()) == NULL) return(-1);
X if (le)
X le = (le->next = e);
X else
X le = obj->ellipses = e;
X num_object++;
X break;
X case O_ARC :
X if ((a = read_arcobject(fp)) == NULL) return(-1);
X if (la)
X la = (la->next = a);
X else
X la = obj->arcs = a;
X num_object++;
X break;
X case O_TEXT :
X if ((t = read_textobject()) == NULL) return(-1);
X if (lt)
X lt = (lt->next = t);
X else
X lt = obj->texts = t;
X num_object++;
X break;
X case O_COMPOUND :
X if ((c = read_compoundobject(fp)) == NULL) return(-1);
X if (lc)
X lc = (lc->next = c);
X else
X lc = obj->compounds = c;
X num_object++;
X break;
X default :
X put_msg("Incorrect object code at line %d", line_no);
X return(-1);
X } /* switch */
X } /* while */
X if (feof(fp))
X return(0);
X else
X return(errno);
X } /* read_objects */
X
Xstatic F_arc *
Xread_arcobject(fp)
XFILE *fp;
X{
X F_arc *a;
X int n, fa, ba;
X int type, style;
X float thickness, wid, ht;
X
X if (NULL == (Arc_malloc(a))) {
X put_msg(Err_mem);
X return(NULL);
X }
X a->pen = NULL;
X a->area_fill = NULL;
X a->next = NULL;
X n = sscanf(buf, "%*d%d%d%d%d%d%*d%*d%f%d%d%d%f%f%d%d%d%d%d%d\n",
X &a->type, &a->style, &a->thickness,
X &a->color, &a->depth, /* skip pen and area_fill */
X &a->style_val, &a->direction, &fa, &ba,
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 (n != 17) {
X put_msg(Err_incomp, "arc", line_no);
X free((char*)a);
X return(NULL);
X }
X
X skip_comment(fp);
X if (fa) {
X line_no++;
X if (5 != fscanf(fp, "%d%d%f%f%f", &type, &style, &thickness, &wid, &ht)) {
X fprintf(stderr, Err_incomp, "arc", line_no);
X return(NULL);
X }
X skip_line(fp);
X a->for_arrow = make_arrow(type, style, thickness, wid, ht);
X skip_comment(fp);
X }
X skip_comment(fp);
X if (ba) {
X line_no++;
X if (5 != fscanf(fp, "%d%d%f%f%f", &type, &style, &thickness, &wid, &ht)) {
X fprintf(stderr, Err_incomp, "arc", line_no);
X return(NULL);
X }
X skip_line(fp);
X a->back_arrow = make_arrow(type, style, thickness, wid, ht);
X }
X return(a);
X }
X
Xstatic F_compound *
Xread_compoundobject(fp)
XFILE *fp;
X{
X F_arc *a, *la = NULL;
X F_ellipse *e, *le = NULL;
X F_line *l, *ll = NULL;
X F_spline *s, *ls = NULL;
X F_text *t, *lt = NULL;
X F_compound *com, *c, *lc = NULL;
X int n, object;
X
X Compound_malloc(com);
X com->arcs = NULL;
X com->ellipses = NULL;
X com->lines = NULL;
X com->splines = NULL;
X com->texts = NULL;
X com->compounds = NULL;
X com->next = NULL;
X n = sscanf(buf, "%*d%d%d%d%d\n", &com->nwcorner.x, &com->nwcorner.y,
X &com->secorner.x, &com->secorner.y);
X if (4 != n) {
X put_msg(Err_incomp, "compound", line_no);
X free((char*)com);
X return(NULL);
X }
X while (get_line(fp) > 0) {
X if (1 != sscanf(buf, "%d", &object)) {
X put_msg(Err_incomp, "compound", line_no);
X free_compound(&com);
X return(NULL);
X }
X switch (object) {
X case O_POLYLINE :
X if ((l = read_lineobject(fp)) == NULL) {
X free_line(&l);
X return(NULL);
X }
X if (ll)
X ll = (ll->next = l);
X else
X ll = com->lines = l;
X break;
X case O_SPLINE :
X if ((s = read_splineobject(fp)) == NULL) {
X free_spline(&s);
X return(NULL);
X }
X if (ls)
X ls = (ls->next = s);
X else
X ls = com->splines = s;
X break;
X case O_ELLIPSE :
X if ((e = read_ellipseobject()) == NULL) {
X free_ellipse(&e);
X return(NULL);
X }
X if (le)
X le = (le->next = e);
X else
X le = com->ellipses = e;
X break;
X case O_ARC :
X if ((a = read_arcobject(fp)) == NULL) {
X free_arc(&a);
X return(NULL);
X }
X if (la)
X la = (la->next = a);
X else
X la = com->arcs = a;
X break;
X case O_TEXT :
X if ((t = read_textobject()) == NULL) {
X free_text(&t);
X return(NULL);
X }
X if (lt)
X lt = (lt->next = t);
X else
X lt = com->texts = t;
X break;
X case O_COMPOUND :
X if ((c = read_compoundobject(fp)) == NULL) {
X free_compound(&c);
X return(NULL);
X }
X if (lc)
X lc = (lc->next = c);
X else
X lc = com->compounds = c;
X break;
X case O_END_COMPOUND :
X return(com);
X default :
X put_msg("Wrong object code at line %d", line_no);
X return(NULL);
X } /* switch */
X }
X if (feof(fp))
X return(com);
X else
X return(NULL);
X }
X
Xstatic F_ellipse *
Xread_ellipseobject()
X{
X F_ellipse *e;
X int n, pen, fill;
X
X Ellipse_malloc(e);
X e->area_fill = NULL;
X e->pen = NULL;
X e->next = NULL;
X n = sscanf(buf, "%*d%d%d%d%d%d%d%d%f%d%f%d%d%d%d%d%d%d%d\n",
X &e->type, &e->style, &e->thickness,
X &e->color, &e->depth, &pen, &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 if (n != 18) {
X put_msg(Err_incomp, "ellipse", line_no);
X free((char*)e);
X return(NULL);
X }
X return(e);
X }
X
Xstatic F_line *
Xread_lineobject(fp)
XFILE *fp;
X{
X F_line *l;
X F_point *p, *q;
X int n, x, y, pen, fill, fa, ba;
X int type, style;
X float thickness, wid, ht;
X
X Line_malloc(l);
X l->points = NULL;
X l->pen = NULL;
X l->area_fill = NULL;
X l->for_arrow = NULL;
X l->back_arrow = NULL;
X l->next = NULL;
X
X n = sscanf(buf, "%*d%d%d%d%d%d%d%d%f%d%d%d%d",
X &l->type, &l->style, &l->thickness, &l->color,
X &l->depth, &pen, &fill, &l->style_val, &fa, &ba);
X if (n != 10) {
X put_msg(Err_incomp, "line", line_no);
X free((char*)l);
X return(NULL);
X }
X skip_comment(fp);
X if (fa) {
X line_no++;
X if (5 != fscanf(fp, "%d%d%f%f%f", &type, &style, &thickness, &wid, &ht)) {
X fprintf(stderr, Err_incomp, "line", line_no);
X return(NULL);
X }
X skip_line(fp);
X l->for_arrow = make_arrow(type, style, thickness, wid, ht);
X skip_comment(fp);
X }
X if (ba) {
X line_no++;
X if (5 != fscanf(fp, "%d%d%f%f%f", &type, &style, &thickness, &wid, &ht)) {
X fprintf(stderr, Err_incomp, "line", line_no);
X return(NULL);
X }
X skip_line(fp);
X l->back_arrow = make_arrow(type, style, thickness, wid, ht);
X skip_comment(fp);
X }
X
X if (NULL == (l->points = Point_malloc(p))) {
X put_msg(Err_mem);
X return(NULL);
X }
X if (fscanf(fp, "%d%d", &p->x, &p->y) != 2) {
X put_msg(Err_incomp, "line", line_no);
X free_linestorage(l);
X return(NULL);
X }
X for (;;) {
X if (fscanf(fp, "%d%d", &x, &y) != 2) {
X put_msg(Err_incomp, "line", line_no);
X free_linestorage(l);
X return(NULL);
X }
X if (x == 9999) break;
X if (NULL == (Point_malloc(q))) {
X put_msg(Err_mem);
X free_linestorage(l);
X return(NULL);
X }
X q->x = x;
X q->y = y;
X q->next = NULL;
X p->next = q;
X p = q;
X }
X skip_line(fp);
X return(l);
X }
X
Xstatic F_spline *
Xread_splineobject(fp)
XFILE *fp;
X{
X F_spline *s;
X F_point *p, *q;
X F_control *cp, *cq;
X int c, n, x, y, pen, fill, fa, ba;
X int type, style;
X float thickness, wid, ht;
X float lx, ly, rx, ry;
X
X Spline_malloc(s);
X s->points = NULL;
X s->controls = NULL;
X s->pen = NULL;
X s->area_fill = NULL;
X s->for_arrow = NULL;
X s->back_arrow = NULL;
X s->next = NULL;
X
X n = sscanf(buf, "%*d%d%d%d%d%d%d%d%f%d%d%d%d%d%d",
X &s->type, &s->style, &s->thickness, &s->color,
X &s->depth, &pen, &fill, &s->style_val, &fa, &ba);
X if (n != 10) {
X put_msg(Err_incomp, "spline", line_no);
X free((char*)s);
X return(NULL);
X }
X skip_comment(fp);
X if (fa) {
X line_no++;
X if (5 != fscanf(fp, "%d%d%f%f%f", &type, &style, &thickness, &wid, &ht)) {
X fprintf(stderr, Err_incomp, "spline", line_no);
X return(NULL);
X }
X skip_line(fp);
X s->for_arrow = make_arrow(type, style, thickness, wid, ht);
X skip_comment(fp);
X }
X if (ba) {
X line_no++;
X if (5 != fscanf(fp, "%d%d%f%f%f", &type, &style, &thickness, &wid, &ht)) {
X fprintf(stderr, Err_incomp, "spline", line_no);
X return(NULL);
X }
X skip_line(fp);
X s->back_arrow = make_arrow(type, style, thickness, wid, ht);
X skip_comment(fp);
X }
X
X /* Read points */
X if ((n = fscanf(fp, "%d%d", &x, &y)) != 2) {
X put_msg(Err_incomp, "spline", line_no);
X free_splinestorage(s);
X return(NULL);
X };
X if (NULL == (s->points = Point_malloc(p))) {
X put_msg(Err_mem);
X free_splinestorage(s);
X return(NULL);
X }
X p->x = x; p->y = y;
X for (c = 1;;) {
X if (fscanf(fp, "%d%d", &x, &y) != 2) {
X put_msg(Err_incomp, "spline", line_no);
X p->next = NULL;
X free_splinestorage(s);
X return(NULL);
X };
X if (x == 9999) break;
X if (NULL == (Point_malloc(q))) {
X put_msg(Err_mem);
X free_splinestorage(s);
X return(NULL);
X }
X q->x = x;
X q->y = y;
X p->next = q;
X p = q;
X c++;
X }
X p->next = NULL;
X skip_line(fp);
X
X if (normal_spline(s)) return(s);
X
X skip_comment(fp);
X /* Read controls */
X if ((n = fscanf(fp, "%f%f%f%f", &lx, &ly, &rx, &ry)) != 4) {
X put_msg(Err_incomp, "spline", line_no);
X free_splinestorage(s);
X return(NULL);
X };
X if (NULL == (s->controls = Control_malloc(cp))) {
X put_msg(Err_mem);
X free_splinestorage(s);
X return(NULL);
X }
X cp->lx = lx; cp->ly = ly;
X cp->rx = rx; cp->ry = ry;
X while (--c) {
X if (fscanf(fp, "%f%f%f%f", &lx, &ly, &rx, &ry) != 4) {
X put_msg(Err_incomp, "spline", line_no);
X cp->next = NULL;
X free_splinestorage(s);
X return(NULL);
X };
X if (NULL == (Control_malloc(cq))) {
X put_msg(Err_mem);
X cp->next = NULL;
X free_splinestorage(s);
X return(NULL);
X }
X cq->lx = lx; cq->ly = ly;
X cq->rx = rx; cq->ry = ry;
X cp->next = cq;
X cp = cq;
X }
X cp->next = NULL;
X
X skip_line(fp);
X return(s);
X }
X
Xstatic F_text *
Xread_textobject()
X{
X F_text *t;
X int n, pen;
X char s[BUF_SIZE];
X
X Text_malloc(t);
X t->next = NULL;
X n = sscanf(buf,"%*d%d%d%d%d%d%d%f%d%d%d%d%d %[^\1]",
X &t->font, &t->type, &t->size, &pen,
X &t->color, &t->depth, &t->angle,
X &t->style, &t->height, &t->length,
X &t->base_x, &t->base_y, s);
X if (n != 13) {
X put_msg(Err_incomp, "text", line_no);
X free((char*)t);
X return(NULL);
X }
X t->cstring = (char*)calloc((unsigned)(strlen(s)+1), sizeof(char));
X if (NULL == t->cstring) {
X put_msg(Err_mem);
X free((char*)t);
X return(NULL);
X }
X strcpy(t->cstring, s);
X return(t);
X }
X
Xget_line(fp)
XFILE *fp;
X{
X while (1) {
X if (NULL == fgets(buf, BUF_SIZE, fp)) {
X return(-1);
X }
X line_no++;
X if (*buf != '#') return(1); /* Skip comment lines */
X }
X }
X
Xskip_comment(fp)
XFILE *fp;
X{
X char c;
X
X while ((c = fgetc(fp)) == '#') skip_line(fp);
X if (c != '#') ungetc(c, fp);
X }
X
Xskip_line(fp)
XFILE *fp;
X{
X while (fgetc(fp) != '\n') {
X if (feof(fp)) return;
X }
X }
END_OF_read.c
if test 14208 -ne `wc -c <read.c`; then
echo shar: \"read.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f ruler.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"ruler.c\"
else
echo shar: Extracting \"ruler.c\" \(14178 characters\)
sed "s/^X//" >ruler.c <<'END_OF_ruler.c'
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 12
X#define HALF_MARK 11
X#define QUARTER_MARK 8
X#define SIXTEENTH_MARK 6
X
X#define MARK_HT 5
X#define TRM_WID 15
X#define TRM_HT 8
X#define SRM_WID 8
X#define SRM_HT 15
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 int RHS_PANEL;
X
Xstatic lasty = -100;
Xstatic lastx = -100;
Xstatic int start;
Xstatic char *number[] = {"0", "1", "2", "3", "4", "5",
X "6", "7", "8", "9", "10", "11" };
Xstatic int troffx = -7, troffy = -10;
Xstatic short tr_marker_image[8] = {
X 0xFFFE, /* *************** */
X 0x7FFC, /* ************* */
X 0x3FF8, /* *********** */
X 0x1FF0, /* ********* */
X 0x0FE0, /* ******* */
X 0x07C0, /* ***** */
X 0x0380, /* *** */
X 0x0100 /* * */
X };
Xstatic mpr_static(trm_pr, TRM_WID, TRM_HT, 1, tr_marker_image);
Xstatic int srroffx = 2, srroffy = -7;
Xstatic short srr_marker_image[15] = {
X 0x0100, /* * */
X 0x0300, /* ** */
X 0x0700, /* *** */
X 0x0F00, /* **** */
X 0x1F00, /* ***** */
X 0x3F00, /* ****** */
X 0x7F00, /* ******* */
X 0xFF00, /* ******** */
X 0x7F00, /* ******* */
X 0x3F00, /* ****** */
X 0x1F00, /* ***** */
X 0x0F00, /* **** */
X 0x0700, /* *** */
X 0x0300, /* ** */
X 0x0100 /* * */
X };
X#ifndef X11
Xstatic mpr_static(srrm_pr, SRM_WID, SRM_HT, 1, srr_marker_image);
X#else
Xstatic mpr_static(srrm_pr, 16, SRM_HT, 1, srr_marker_image);
X#endif
X
Xstatic int srloffx = -10, srloffy = -7;
Xstatic short srl_marker_image[15] = {
X 0x8000, /* * */
X 0xC000, /* ** */
X 0xE000, /* *** */
X 0xF000, /* **** */
X 0xF800, /* ***** */
X 0xFC00, /* ****** */
X 0xFE00, /* ******* */
X 0xFF00, /* ******** */
X 0xFE00, /* ******* */
X 0xFC00, /* ****** */
X 0xF800, /* ***** */
X 0xF000, /* **** */
X 0xE000, /* *** */
X 0xC000, /* ** */
X 0x8000 /* * */
X };
X#ifndef X11
Xstatic mpr_static(srlm_pr, SRM_WID, SRM_HT, 1, srl_marker_image);
X#else
Xstatic mpr_static(srlm_pr, 16, SRM_HT, 1, srl_marker_image);
X#endif
X
X#ifdef X11
Xstatic Pixmap toparrow_pm, sidearrow_pm;
X#endif
X
Xset_toprulermark(x)
Xint x;
X{
X#ifndef X11
X pw_write(topruler_pixwin, lastx + troffx, RULER_WIDTH + troffy,
X TRM_WID, TRM_HT, INV_PAINT, &trm_pr, 0, 0);
X pw_write(topruler_pixwin, x + troffx, RULER_WIDTH + troffy,
X TRM_WID, TRM_HT, INV_PAINT, &trm_pr, 0, 0);
X#else
X XCopyArea(tool_d, toparrow_pm, topruler_pixwin, gccache[INV_PAINT],
X 0, 0, trm_pr.width, trm_pr.height,
X lastx + troffx, TOPRULER_HEIGHT + troffy);
X XCopyArea(tool_d, toparrow_pm, topruler_pixwin, gccache[INV_PAINT],
X 0, 0, trm_pr.width, trm_pr.height,
X x + troffx, TOPRULER_HEIGHT + troffy);
X#endif X11
X lastx = x;
X }
X
X#ifndef X11
Xstatic
Xsideruler_sighandler()
X{
X pw_damaged(sideruler_pixwin);
X pw_repairretained(sideruler_pixwin);
X pw_donedamaged(sideruler_pixwin);
X }
X
Xstatic
Xflush_input(nullsw, ibits, obits, ebits, timer)
Xcaddr_t nullsw;
Xint *ibits, *obits, *ebits;
Xstruct timeval *timer;
X{
X INPUTEVENT ie;
X
X (void)input_readevent(srswfd, &ie);
X *ibits = *obits = *ebits = 0;
X }
X
X
Xint
Xinit_sideruler(tool)
XTOOL tool;
X{
X INPUTMASK mask;
X
X sideruler_sw = tool_createsubwindow(tool, "side ruler",
X SIDERULER_WIDTH, SIDERULER_HEIGHT);
X if (sideruler_sw == (TOOLSW)0) return(0);
X (int) sideruler_sw->ts_data = srswfd = sideruler_sw->ts_windowfd;
X
X sideruler_pixwin = pw_open(srswfd);
X sideruler_pixwin->pw_prretained = mem_create(SIDERULER_WIDTH,
X SIDERULER_HEIGHT, 1);
X input_imnull(&mask);
X win_setinputcodebit(&mask, MS_RIGHT);
X /* Pass input events other than right mouse to parent window */
X win_setinputmask(srswfd, &mask, NULL, WIN_NULLLINK);
X win_setcursor(srswfd, &bull_cursor);
X sideruler_sw->ts_io.tio_selected = flush_input;
X sideruler_sw->ts_io.tio_handlesigwinch = sideruler_sighandler;
X sideruler_sw->ts_destroy = null_proc;
X
X show_sideruler();
X return(1);
X }
X#else
Xstatic Arg ruler_args[] =
X{
X { XtNx, (XtArgVal)0 },
X { XtNy, (XtArgVal)0 },
X { XtNwidth, (XtArgVal)0 },
X { XtNheight, (XtArgVal)0 },
X { XtNlabel, (XtArgVal)"" },
X { XtNfromHoriz, (XtArgVal)NULL },
X { XtNhorizDistance, (XtArgVal)0 },
X { XtNfromVert, (XtArgVal)NULL },
X { XtNvertDistance, (XtArgVal)0 },
X};
X
Xextern int SIDERULER_WIDTH, SIDERULER_HEIGHT;
Xextern int TOPRULER_WIDTH, TOPRULER_HEIGHT;
X
Xint init_sideruler(tool)
X TOOL tool;
X{
X ruler_args[2].value = SIDERULER_WIDTH = RULER_WIDTH;
X ruler_args[3].value = SIDERULER_HEIGHT = CANVAS_HEIGHT;
X ruler_args[5].value = (XtArgVal)canvas_sw;
X ruler_args[7].value = (XtArgVal)topruler_sw;
X sideruler_sw = XtCreateWidget("sruler", labelWidgetClass, tool,
X ruler_args, XtNumber(ruler_args));
X return(1);
X}
X
Xsetup_rulers()
X{
X register int i, j;
X register Pixmap p;
X#define QINCH (PIX_PER_INCH / 4)
X#define SINCH (PIX_PER_INCH / 16)
X char number[3];
X static Arg ruler_args[] =
X {
X { XtNbackgroundPixmap, (XtArgVal)NULL },
X };
X
X topruler_pixwin = trswfd = XtWindow(topruler_sw);
X sideruler_pixwin = srswfd = XtWindow(sideruler_sw);
X XDefineCursor(tool_d, trswfd, (Cursor)bull_cursor.bitmap);
X XDefineCursor(tool_d, srswfd, (Cursor)bull_cursor.bitmap);
X
X /* top ruler, adjustments for digits are kludges based on 6x13 char */
X p = XCreatePixmap(tool_d, topruler_pixwin,
X TOPRULER_WIDTH, TOPRULER_HEIGHT, 1);
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 - 2,
X TOPRULER_HEIGHT - INCH_MARK - 3, number,
X j < PIX_PER_INCH * 10 ? 1 : 2);
X }
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 ruler_args[0].value = (XtArgVal)p;
X XtSetValues(topruler_sw, ruler_args, 1);
X
X /* side ruler, adjustments for digits are kludges based on 6x13 char */
X p = XCreatePixmap(tool_d, sideruler_pixwin,
X SIDERULER_WIDTH, SIDERULER_HEIGHT, 1);
X if( 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 ruler_args[0].value = (XtArgVal)p;
X XtSetValues(sideruler_sw, ruler_args, 1);
X
X /* make pixmaps for ruler arrows */
X toparrow_pm = XCreatePixmap(tool_d, topruler_pixwin, trm_pr.width,
X trm_pr.height, trm_pr.depth);
X XPutImage(tool_d, toparrow_pm, gc, &trm_pr, 0, 0, 0, 0,
X trm_pr.width, trm_pr.height);
X
X if( RHS_PANEL )
X {
X sidearrow_pm = XCreatePixmap(tool_d, sideruler_pixwin, srlm_pr.width,
X srlm_pr.height, srlm_pr.depth);
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_pixwin, srrm_pr.width,
X srrm_pr.height, srrm_pr.depth);
X XPutImage(tool_d, sidearrow_pm, gc, &srrm_pr, 0, 0, 0, 0,
X srrm_pr.width, srrm_pr.height);
X }
X}
X#endif X11
X
X#ifndef X11
Xshow_sideruler()
X{
X int i, qinch, sinch, charht, charx, end;
X char **d;
X
X pw_writebackground(sideruler_pixwin, 0, 0, 2048, 2048, PAINT);
X if (RHS_PANEL){
X start = RULER_WIDTH;
X charx = RULER_WIDTH - INCH_MARK - char_width(bold_font);
X }
X else {
X start = 0;
X charx = INCH_MARK + 2;
X }
X
X charht = char_height(bold_font);
X for (d = number, i = SIDERULER_START + charht / 2 - 3;
X i < SIDERULER_HEIGHT;
X d++, i += PIX_PER_INCH) {
X pw_text(sideruler_pixwin, charx, i, PAINT, bold_font, *d);
X }
X qinch = PIX_PER_INCH / 4;
X sinch = PIX_PER_INCH / 16;
X /* Draw Scale */
X end = abs(start - INCH_MARK);
X for (i = SIDERULER_START - 1; i < SIDERULER_HEIGHT; i += PIX_PER_INCH)
X pw_vector(sideruler_pixwin, start, i, end, i, PAINT, 1);
X end = abs(start - HALF_MARK);
X for (i = SIDERULER_START - 1 + PIX_PER_INCH / 2;
X i < SIDERULER_HEIGHT; i += PIX_PER_INCH)
X pw_vector(sideruler_pixwin, start, i, end, i, PAINT, 1);
X end = abs(start - QUARTER_MARK);
X for (i = SIDERULER_START - 1; i < SIDERULER_HEIGHT; i += qinch)
X pw_vector(sideruler_pixwin, start, i, end, i, PAINT, 1);
X end = abs(start - SIXTEENTH_MARK);
X for (i = SIDERULER_START - 1; i < SIDERULER_HEIGHT; i += sinch)
X pw_vector(sideruler_pixwin, start, i, end, i, PAINT, 1);
X /* Darw marker */
X if (RHS_PANEL) { /* side ruler is on the LSH of canvas */
X pw_write(sideruler_pixwin, RULER_WIDTH+srloffx, lasty+srloffy,
X SRM_WID, SRM_HT, INV_PAINT, &srlm_pr, 0, 0);
X }
X else { /* side ruler is on the RSH of canvas */
X pw_write(sideruler_pixwin, srroffx, lasty+srroffy,
X SRM_WID, SRM_HT, INV_PAINT, &srrm_pr, 0, 0);
X }
X }
X#endif X11
X
X#ifndef X11
Xstatic
Xtopruler_sighandler()
X{
X pw_damaged(topruler_pixwin);
X pw_repairretained(topruler_pixwin);
X pw_donedamaged(topruler_pixwin);
X }
X
Xint
Xinit_topruler(tool)
XTOOL tool;
X{
X INPUTMASK mask;
X
X topruler_sw = tool_createsubwindow(tool, "top ruler",
X TOPRULER_WIDTH, TOPRULER_HEIGHT);
X if (topruler_sw == (TOOLSW)0) return(0);
X (int) topruler_sw->ts_data = trswfd = topruler_sw->ts_windowfd;
X
X topruler_pixwin = pw_open(trswfd);
X topruler_pixwin->pw_prretained = mem_create(TOPRULER_WIDTH,
X TOPRULER_HEIGHT, 1);
X topruler_sw->ts_io.tio_selected = flush_input;
X input_imnull(&mask);
X win_setinputcodebit(&mask, MS_RIGHT);
X win_setinputmask(trswfd, &mask, NULL, WIN_NULLLINK);
X win_setcursor(srswfd, &bull_cursor);
X topruler_sw->ts_io.tio_handlesigwinch = topruler_sighandler;
X topruler_sw->ts_destroy = null_proc;
X
X show_topruler();
X return(1);
X }
X#else
Xint init_topruler(tool)
X TOOL tool;
X{
X ruler_args[2].value = TOPRULER_WIDTH = CANVAS_WIDTH;;
X ruler_args[3].value = TOPRULER_HEIGHT = RULER_WIDTH;
X ruler_args[5].value = (XtArgVal)panel_sw;
X topruler_sw = XtCreateWidget("truler", labelWidgetClass, tool,
X ruler_args, XtNumber(ruler_args));
X return(1);
X}
X#endif X11
X
X#ifndef X11
Xshow_topruler()
X{
X int i, qinch, len, sinch, charwid;
X char **d;
X
X pw_writebackground(topruler_pixwin, 0, 0, 2048, 2048, PAINT);
X
X charwid = char_width(bold_font);
X len = RULER_WIDTH - INCH_MARK;
X for (d = number, d++, i = PIX_PER_INCH - charwid / 2;
X i < CANVAS_WIDTH;
X d++, i += PIX_PER_INCH) {
X pw_text(topruler_pixwin, i, len, PAINT, bold_font, *d);
X }
X qinch = PIX_PER_INCH / 4;
X sinch = PIX_PER_INCH / 16;
X /* Draw Scale */
X len = RULER_WIDTH - INCH_MARK;
X for (i = -1; i < CANVAS_WIDTH; i += PIX_PER_INCH)
X pw_vector(topruler_pixwin, i, RULER_WIDTH, i, len, PAINT, 1);
X len = RULER_WIDTH - HALF_MARK;
X for (i = -1; i < CANVAS_WIDTH; i += PIX_PER_INCH)
X pw_vector(topruler_pixwin, i, RULER_WIDTH, i, len, PAINT, 1);
X len = RULER_WIDTH - QUARTER_MARK;
X for (i = -1; i < CANVAS_WIDTH; i += qinch)
X pw_vector(topruler_pixwin, i, RULER_WIDTH, i, len, PAINT, 1);
X len = RULER_WIDTH - SIXTEENTH_MARK;
X for (i = -1; i < CANVAS_WIDTH; i += sinch)
X pw_vector(topruler_pixwin, i, RULER_WIDTH, i, len, PAINT, 1);
X /* Darw marker */
X pw_write(topruler_pixwin, lastx + troffx, RULER_WIDTH + troffy,
X TRM_WID, TRM_HT, INV_PAINT, &trm_pr, 0, 0);
X }
X#endif X11
X
Xset_rulermark(x, y)
Xint x, y;
X{
X set_siderulermark(y);
X set_toprulermark(x);
X }
X
Xset_siderulermark(y)
Xint y;
X{
X int sy;
X
X#ifndef X11
X sy = SIDERULER_START + y;
X if (RHS_PANEL) { /* side ruler is on the LSH of canvas */
X pw_write(sideruler_pixwin, RULER_WIDTH+srloffx, lasty+srloffy,
X SRM_WID, SRM_HT, INV_PAINT, &srlm_pr, 0, 0);
X pw_write(sideruler_pixwin, RULER_WIDTH+srloffx, sy+srloffy,
X SRM_WID, SRM_HT, INV_PAINT, &srlm_pr, 0, 0);
X }
X else { /* side ruler is on the RSH of canvas */
X pw_write(sideruler_pixwin, srroffx, lasty+srroffy,
X SRM_WID, SRM_HT, INV_PAINT, &srrm_pr, 0, 0);
X pw_write(sideruler_pixwin, srroffx, sy+srroffy,
X SRM_WID, SRM_HT, INV_PAINT, &srrm_pr, 0, 0);
X }
X lasty = sy;
X#else
X if( RHS_PANEL ) {
X XCopyArea(tool_d, sidearrow_pm, sideruler_pixwin,
X gccache[INV_PAINT], 0, 0, srlm_pr.width,
X srlm_pr.height, RULER_WIDTH+srloffx, lasty + srloffy);
X XCopyArea(tool_d, sidearrow_pm, sideruler_pixwin,
X gccache[INV_PAINT], 0, 0, srlm_pr.width,
X srlm_pr.height, RULER_WIDTH+srloffx, y + srloffy);
X }
X else
X {
X XCopyArea(tool_d, sidearrow_pm, sideruler_pixwin,
X gccache[INV_PAINT], 0, 0, srrm_pr.width,
X srrm_pr.height, -srroffx, lasty + srroffy);
X XCopyArea(tool_d, sidearrow_pm, sideruler_pixwin,
X gccache[INV_PAINT], 0, 0, srrm_pr.width,
X srrm_pr.height, -srroffx, y + srroffy);
X }
X lasty = y;
X#endif X11
X}
END_OF_ruler.c
if test 14178 -ne `wc -c <ruler.c`; then
echo shar: \"ruler.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 8 \(of 11\).
cp /dev/null ark8isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 11 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
--
Mike Wexler(wyse!mikew) Phone: (408)433-1000 x1330
More information about the Comp.sources.x
mailing list