v12i030: tgif, Part14/23
William Cheng
william at CS.UCLA.EDU
Thu Mar 14 03:22:45 AEST 1991
Submitted-by: william at CS.UCLA.EDU (William Cheng)
Posting-number: Volume 12, Issue 30
Archive-name: tgif/part14
---------------------------------> cut here <---------------------------------
#! /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 14 (of 23)."
# Contents: special.c spline.c
# Wrapped by william at oahu on Wed Mar 6 09:57:44 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'special.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'special.c'\"
else
echo shar: Extracting \"'special.c'\" \(12418 characters\)
sed "s/^X//" >'special.c' <<'END_OF_FILE'
X/*
X * Author: William Chia-Wei Cheng (william at cs.ucla.edu)
X *
X * Copyright (C) 1990, 1991, William Cheng.
X */
X#ifndef lint
Xstatic char RCSid[] =
X "@(#)$Header: /tmp_mnt/n/kona/tangram/u/william/X11/TGIF2/RCS/special.c,v 2.0 91/03/05 12:48:26 william Exp $";
X#endif
X
X#include <stdio.h>
X#include <X11/Xlib.h>
X#include "const.h"
X#include "types.h"
X
X#include "animate.e"
X#include "attr.e"
X#include "choice.e"
X#include "color.e"
X#include "cursor.e"
X#include "dialog.e"
X#include "drawing.e"
X#include "dup.e"
X#include "edit.e"
X#include "file.e"
X#include "grid.e"
X#include "group.e"
X#include "mark.e"
X#include "msg.e"
X#include "move.e"
X#include "names.e"
X#include "obj.e"
X#include "raster.e"
X#include "select.e"
X#include "setup.e"
X#include "stk.e"
X
X#define SPECIAL_SYM 0
X#define SPECIAL_UNSYM 1
X#define SPECIAL_INST 2
X#define SPECIAL_ICON 3
X#define SPECIAL_UNICON 4
X#define SPECIAL_PUSH 5
X#define SPECIAL_POP 6
X#define SPECIAL_ADDATTR 7
X#define SPECIAL_DETACHATTR 8
X#define SPECIAL_SHOWATTRNAME 9
X#define SPECIAL_HIDEATTRNAME 10
X#define SPECIAL_MOVEATTR 11
X#define SPECIAL_ANIMATESEND 12
X#define SPECIAL_ANIMATEFLASH 13
X#define SPECIAL_UPDATESYMS 14
X
X#define MAXSPECIALMENUS 15
Xstatic char * specialMenuStr[] =
X{
X "MakeSymbolic ^#M",
X "UnMakeSymbolic ^#N",
X "Instantiate ^I",
X "MakeIconic ^#I",
X "UnMakeIconic ^#J",
X "Push ^V",
X "Pop ^K",
X "AddAttr #A",
X "DetachAttrs #T",
X "ShowAttrName #N",
X "HideAttrName #J",
X "MoveAttr #M",
X "AnimateSend #E",
X "AnimateFlash #F",
X "UpdateSymbols ^#U"
X};
X
Xstruct ObjRec * ReadSymbol (FP)
X FILE * FP;
X{
X register struct AttrRec * attr_ptr;
X struct ObjRec * obj_ptr;
X
X importingFile = TRUE; /* ignore 'state' info but set fileVersion */
X while (ReadObj (FP, &obj_ptr, FALSE))
X if (obj_ptr != NULL)
X {
X if (obj_ptr->type == OBJ_SYM)
X {
X obj_ptr->type = OBJ_ICON;
X attr_ptr = obj_ptr->lattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->prev)
X attr_ptr->inherited = TRUE;
X importingFile = FALSE;
X return (obj_ptr);
X }
X else
X FreeObj (obj_ptr);
X }
X importingFile = FALSE;
X return (NULL);
X}
X
Xstruct ObjRec * GetObjRepresentation (PathName, SymName)
X char * PathName, * SymName;
X{
X char file_name[MAXPATHLENGTH];
X struct ObjRec * obj_ptr;
X FILE * fp;
X
X sprintf (file_name, "%s/%s.sym", PathName, SymName);
X if ((fp = fopen (file_name, "r")) == NULL)
X { printf ("Can not open '%s'\n", file_name); return (NULL); }
X
X if ((obj_ptr = ReadSymbol (fp)) != NULL)
X {
X obj_ptr->id = objId++;
X obj_ptr->dirty = FALSE;
X strcpy (obj_ptr->detail.r->s, SymName);
X AdjObjBBox (obj_ptr);
X }
X fclose (fp);
X return (obj_ptr);
X}
X
Xvoid PlaceTopObj ()
X{
X int x, y, grid_x, grid_y, dx, dy, placing = TRUE;
X int cursor_x, cursor_y, orig_x, orig_y;
X int obj_ltx, obj_lty, obj_rbx, obj_rby;
X int grid_obj_ltx, grid_obj_lty, grid_dx, grid_dy;
X Window root_win, child_win;
X int root_x, root_y;
X unsigned int status;
X XEvent input;
X
X while (TRUE)
X {
X XQueryPointer (mainDisplay, drawWindow, &root_win, &child_win,
X &root_x, &root_y, &cursor_x, &cursor_y, &status);
X if (!(status & (Button1Mask | Button2Mask | Button3Mask))) break;
X }
X
X GridXY (cursor_x, cursor_y, &orig_x, &orig_y);
X obj_ltx = OFFSET_X(topObj->obbox.ltx); obj_lty = OFFSET_Y(topObj->obbox.lty);
X obj_rbx = OFFSET_X(topObj->obbox.rbx); obj_rby = OFFSET_Y(topObj->obbox.rby);
X GridXY (obj_ltx, obj_lty, &grid_obj_ltx, &grid_obj_lty);
X grid_dx = orig_x-grid_obj_ltx; grid_dy = orig_y-grid_obj_lty;
X SelBox (drawWindow, revDefaultGC, obj_ltx+grid_dx, obj_lty+grid_dy,
X obj_rbx+grid_dx, obj_rby+grid_dy);
X
X dx = dy = 0;
X XGrabPointer (mainDisplay, drawWindow, FALSE,
X PointerMotionMask | ButtonPressMask,
X GrabModeAsync, GrabModeAsync, None, handCursor, CurrentTime);
X
X while (placing)
X {
X XNextEvent (mainDisplay, &input);
X if (input.type == ButtonPress)
X {
X XUngrabPointer (mainDisplay, CurrentTime);
X placing = FALSE;
X SelBox (drawWindow, revDefaultGC, obj_ltx+grid_dx+dx,
X obj_lty+grid_dy+dy, obj_rbx+grid_dx+dx, obj_rby+grid_dy+dy);
X grid_dx = (grid_dx+dx)<<zoomScale;
X grid_dy = (grid_dy+dy)<<zoomScale;
X MoveObj (topObj, grid_dx, grid_dy);
X DrawObj (drawWindow, topObj);
X }
X else if (input.type == MotionNotify)
X {
X x = input.xmotion.x;
X y = input.xmotion.y;
X GridXY (x, y, &grid_x, &grid_y);
X SelBox (drawWindow, revDefaultGC, obj_ltx+grid_dx+dx,
X obj_lty+grid_dy+dy, obj_rbx+grid_dx+dx, obj_rby+grid_dy+dy);
X dx = grid_x - orig_x;
X dy = grid_y - orig_y;
X SelBox (drawWindow, revDefaultGC, obj_ltx+grid_dx+dx,
X obj_lty+grid_dy+dy, obj_rbx+grid_dx+dx, obj_rby+grid_dy+dy);
X MarkRulers (grid_x, grid_y);
X }
X }
X XSync (mainDisplay, True);
X}
X
Xvoid Instantiate ()
X{
X char file_name[MAXPATHLENGTH];
X char sym_name[MAXPATHLENGTH], path_name[MAXPATHLENGTH];
X struct ObjRec * obj_ptr;
X FILE * fp;
X
X if (SelectSymbolName (sym_name, path_name) == INVALID) return;
X
X TieLooseEnds ();
X SetCurChoice (NOTHING);
X
X sprintf (file_name, "%s/%s.sym", path_name, sym_name);
X if ((fp = fopen (file_name, "r")) == NULL)
X { printf ("Can not open %s\n", file_name); return; }
X
X if ((obj_ptr = ReadSymbol (fp)) != NULL)
X {
X if (topSel != NULL)
X {
X HighLightReverse ();
X RemoveAllSel ();
X }
X SetNullCursor (drawWindow);
X
X obj_ptr->id = objId++;
X obj_ptr->dirty = FALSE;
X strcpy (obj_ptr->detail.r->s, sym_name);
X AddObj (NULL, topObj, obj_ptr);
X AdjObjBBox (obj_ptr);
X
X PlaceTopObj ();
X SelectTopObj ();
X SetFileModified (TRUE);
X justDupped = FALSE;
X ShowCursor ();
X }
X fclose (fp);
X}
X
Xvoid MakeSymbolic ()
X{
X if (topSel!=NULL && topSel==botSel &&
X (topSel->obj->type==OBJ_GROUP || topSel->obj->type==OBJ_ICON))
X {
X HighLightReverse ();
X topSel->obj->type = OBJ_SYM;
X Msg ("Selected GROUP object is now SYMBOLIC.");
X SetFileModified (TRUE);
X AdjObjBBox (topSel->obj);
X UpdSelBBox ();
X RedrawAnArea (botObj,
X botSel->obj->obbox.ltx-QUARTER_INCH-(1<<zoomScale),
X botSel->obj->obbox.lty-QUARTER_INCH-(1<<zoomScale),
X botSel->obj->obbox.rbx+QUARTER_INCH+(1<<zoomScale),
X botSel->obj->obbox.rby+QUARTER_INCH+(1<<zoomScale));
X HighLightForward ();
X }
X else
X Msg ("Please select one GROUP or ICON object to make it Symbolic.");
X}
X
Xvoid UnMakeSymbolic ()
X{
X register struct ObjRec * obj_ptr;
X register int ltx = 0, lty = 0, rbx = 0, rby = 0;
X struct SelRec * sel_ptr = topSel;
X int modified = FALSE;
X
X for ( ; sel_ptr != NULL; sel_ptr = sel_ptr->next)
X {
X obj_ptr = sel_ptr->obj;
X if (obj_ptr->type == OBJ_SYM)
X {
X obj_ptr->type = OBJ_GROUP;
X AdjObjBBox (obj_ptr);
X if (modified)
X {
X if (ltx < obj_ptr->bbox.ltx) ltx = obj_ptr->bbox.ltx;
X if (lty < obj_ptr->bbox.lty) lty = obj_ptr->bbox.lty;
X if (rbx > obj_ptr->bbox.rbx) rbx = obj_ptr->bbox.rbx;
X if (rby > obj_ptr->bbox.rby) rby = obj_ptr->bbox.rby;
X }
X else
X {
X ltx = obj_ptr->bbox.ltx; lty = obj_ptr->bbox.lty;
X rbx = obj_ptr->bbox.rbx; rby = obj_ptr->bbox.rby;
X modified = TRUE;
X }
X }
X }
X if (modified)
X {
X HighLightReverse ();
X SetFileModified (TRUE);
X UpdSelBBox ();
X RedrawAnArea (botObj,
X ltx-QUARTER_INCH-(1<<zoomScale), lty-QUARTER_INCH-(1<<zoomScale),
X rbx+QUARTER_INCH+(1<<zoomScale), rby+QUARTER_INCH+(1<<zoomScale));
X HighLightForward ();
X }
X}
X
Xvoid MakeIconic ()
X{
X char icon_name[MAXPATHLENGTH], file_name[MAXPATHLENGTH];
X char s[MAXPATHLENGTH], icon_full_name[MAXPATHLENGTH];
X FILE * fp;
X struct ObjRec * saved_obj_ptr;
X int len;
X
X if (topSel!=NULL && topSel==botSel && topSel->obj->type==OBJ_GROUP)
X {
X Dialog ("Please Enter Name of the Icon:", icon_name);
X len = strlen (icon_name);
X if (*icon_name == '\0')
X {
X Msg ("Name not specified, icon not created.");
X return;
X }
X
X if (strlen (icon_name) >= 4)
X {
X if (strcmp (&icon_name[len-4], ".obj") == 0)
X {
X Msg ("Can not save as a .obj file, icon not created.");
X return;
X }
X else if (strcmp (&icon_name[len-4], ".sym") != 0)
X {
X strcpy (icon_full_name, icon_name);
X strcat (icon_full_name, ".sym");
X }
X
X if (strlen (icon_full_name) == 4)
X {
X Msg ("No file name specified. File not saved.");
X return;
X }
X }
X else
X {
X strcpy (icon_full_name, icon_name);
X strcat (icon_full_name, ".sym");
X }
X
X if (*curDomainName != '\0')
X sprintf (file_name, "%s/%s", curDomainName, icon_full_name);
X else
X sprintf (file_name, "%s", icon_full_name);
X if (!OkayToCreateFile (file_name)) return;
X if ((fp = fopen (file_name, "w")) == NULL)
X {
X sprintf (s, "Can not create '%s', icon not created.", file_name);
X Msg (s);
X return;
X }
X sprintf (s, "Creating '%s' ...", file_name);
X Msg (s);
X topSel->obj->type = OBJ_SYM;
X strcpy (topSel->obj->detail.r->s, icon_name);
X
X saved_obj_ptr = topSel->obj->prev;
X topSel->obj->prev = NULL;
X Save (fp, topSel->obj, 0);
X topSel->obj->prev = saved_obj_ptr;
X
X sprintf (s, "File '%s' created.", file_name);
X Msg (s);
X fclose (fp);
X
X HighLightReverse ();
X topSel->obj->type = OBJ_ICON;
X topSel->obj->id = objId++;
X Msg ("Selected GROUP object is now ICONIC.");
X SetFileModified (TRUE);
X AdjObjBBox (topSel->obj);
X UpdSelBBox ();
X RedrawAnArea (botObj,
X botSel->obj->bbox.ltx-(1<<zoomScale),
X botSel->obj->bbox.lty-(1<<zoomScale),
X botSel->obj->bbox.rbx+(1<<zoomScale),
X botSel->obj->bbox.rby+(1<<zoomScale));
X HighLightForward ();
X }
X else
X Msg ("Please select one GROUP object to make it ICONIC.");
X}
X
Xvoid UnMakeIconic ()
X{
X register struct ObjRec * obj_ptr;
X struct SelRec * sel_ptr;
X struct AttrRec * attr_ptr;
X int modified = FALSE;
X
X HighLightReverse ();
X for (sel_ptr = topSel; sel_ptr != NULL; sel_ptr = sel_ptr->next)
X {
X obj_ptr = sel_ptr->obj;
X if (obj_ptr->type == OBJ_ICON)
X {
X obj_ptr->type = OBJ_GROUP;
X AdjObjBBox (obj_ptr);
X modified = TRUE;
X attr_ptr = obj_ptr->fattr;
X for ( ; attr_ptr != NULL; attr_ptr = attr_ptr->next)
X attr_ptr->inherited = FALSE;
X }
X }
X if (modified)
X {
X Msg ("Selected ICONIC objects are GROUP objects now.");
X SetFileModified (TRUE);
X UpdSelBBox ();
X RedrawAnArea (botObj, selLtX-(1<<zoomScale), selLtY-(1<<zoomScale),
X selRbX+(1<<zoomScale), selRbY+(1<<zoomScale));
X }
X HighLightForward ();
X}
X
Xvoid SpecialMenu (X, Y)
X int X, Y;
X{
X register int index;
X int * fore_colors, * valid;
X
X DefaultColorArrays (MAXSPECIALMENUS, &fore_colors, &valid);
X index = TextMenuLoop (X, Y, specialMenuStr, MAXSPECIALMENUS, fore_colors,
X valid, SINGLECOLOR);
X switch (index)
X {
X case SPECIAL_SYM: MakeSymbolic (); break;
X case SPECIAL_UNSYM: UnMakeSymbolic (); break;
X case SPECIAL_INST: Instantiate (); break;
X case SPECIAL_ICON: MakeIconic (); break;
X case SPECIAL_UNICON: UnMakeIconic (); break;
X case SPECIAL_PUSH: PushIcon (); break;
X case SPECIAL_POP: PopIcon (); break;
X case SPECIAL_ADDATTR: AddAttrs (); break;
X case SPECIAL_SHOWATTRNAME: ShowAllAttrNames (); break;
X case SPECIAL_HIDEATTRNAME: HideAllAttrNames (); break;
X case SPECIAL_DETACHATTR: DetachAttrs (); break;
X case SPECIAL_MOVEATTR: MoveAttr (); break;
X case SPECIAL_ANIMATESEND: AnimateSel (); break;
X case SPECIAL_ANIMATEFLASH: FlashSelColor (); break;
X case SPECIAL_UPDATESYMS: UpdateSymbols (); break;
X }
X}
END_OF_FILE
if test 12418 -ne `wc -c <'special.c'`; then
echo shar: \"'special.c'\" unpacked with wrong size!
fi
# end of 'special.c'
fi
if test -f 'spline.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'spline.c'\"
else
echo shar: Extracting \"'spline.c'\" \(18843 characters\)
sed "s/^X//" >'spline.c' <<'END_OF_FILE'
X/*
X * Author: William Chia-Wei Cheng (william at cs.ucla.edu)
X *
X * Copyright (C) 1990, 1991, William Cheng.
X */
X#ifndef lint
Xstatic char RCSid[] =
X "@(#)$Header: /tmp_mnt/n/kona/tangram/u/william/X11/TGIF2/RCS/spline.c,v 2.0 91/03/05 12:48:28 william Exp $";
X#endif
X
X#include <math.h>
X#include <stdio.h>
X#include <X11/Xlib.h>
X#include <X11/Xutil.h>
X#include "const.h"
X#include "types.h"
X
X#include "poly.e"
X#include "raster.e"
X#include "rect.e"
X#include "setup.e"
X
X#define SPLINE_TOL 9
X
Xvoid Spline (Win, Pixel, Func, X1, Y1, X2, Y2, X3, Y3, X4, Y4)
X Window Win;
X int Pixel, Func;
X double X1, Y1, X2, Y2, X3, Y3, X4, Y4;
X /* X1, Y1, X2, Y2, X3, Y3, X4, Y4 are screen offsets */
X{
X double x, y;
X
X x = (X2 + X3) / 2.0;
X y = (Y2 + Y3) / 2.0;
X if (fabs (X1 - x) < SPLINE_TOL && fabs (Y1 - y) < SPLINE_TOL)
X XDrawLine (mainDisplay, Win, drawGC, round(X1), round(Y1), round(x),
X round(y));
X else
X Spline (Win, Pixel, Func, X1, Y1, ((X1+X2)/2.0), ((Y1+Y2)/2.0),
X ((3.0*X2+X3)/4.0), ((3.0*Y2+Y3)/4.0), x, y);
X
X if (fabs (x - X4) < SPLINE_TOL && fabs (y - Y4) < SPLINE_TOL)
X XDrawLine (mainDisplay, Win, drawGC, round(x), round(y), round(X4),
X round(Y4));
X else
X Spline (Win, Pixel, Func, x, y, ((X2+3.0*X3)/4.0), ((Y2+3.0*Y3)/4.0),
X ((X3+X4)/2.0), ((Y3+Y4)/2.0), X4, Y4);
X}
X
Xstatic XPoint * splineVs;
X
Xint AddSplinePt(N, MaxN, X, Y)
X int * N, * MaxN, X, Y;
X{
X if (*N == *MaxN)
X {
X splineVs = (XPoint *) realloc (splineVs, (*MaxN)*2*sizeof(XPoint));
X if (splineVs == NULL)
X {
X printf ("Can not realloc() in AddSplinePt ()\n");
X return (FALSE);
X }
X *MaxN = (*MaxN) * 2;
X }
X splineVs[*N].x = X;
X splineVs[*N].y = Y;
X (*N)++;
X}
X
Xstatic
Xvoid SetSplineVs (N, MaxN, X1, Y1, X2, Y2, X3, Y3, X4, Y4)
X int * N, * MaxN;
X double X1, Y1, X2, Y2, X3, Y3, X4, Y4;
X /* X1, Y1, X2, Y2, X3, Y3, X4, Y4 are screen offsets */
X{
X double x, y;
X
X x = (X2 + X3) / 2.0;
X y = (Y2 + Y3) / 2.0;
X if (fabs (X1 - x) < SPLINE_TOL && fabs (Y1 - y) < SPLINE_TOL)
X AddSplinePt (N, MaxN, round(x), round(y));
X else
X SetSplineVs (N, MaxN, X1, Y1, ((X1+X2)/2.0), ((Y1+Y2)/2.0),
X ((3.0*X2+X3)/4.0), ((3.0*Y2+Y3)/4.0), x, y);
X
X if (fabs (x - X4) < SPLINE_TOL && fabs (y - Y4) < SPLINE_TOL)
X AddSplinePt (N, MaxN, round(X4), round(Y4));
X else
X SetSplineVs (N, MaxN, x, y, ((X2+3.0*X3)/4.0), ((Y2+3.0*Y3)/4.0),
X ((X3+X4)/2.0), ((Y3+Y4)/2.0), X4, Y4);
X}
X
XXPoint * MakeSplinePolyVertex (N, XOff, YOff, NumVs, Vs)
X int * N, XOff, YOff, NumVs;
X XPoint * Vs;
X{
X double mx1, my1, mx2, my2, mx3, my3, mx4, my4, x1, y1, x2, y2;
X int i, x_off, y_off, max_n;
X
X x_off = (XOff >> zoomScale) << zoomScale;
X y_off = (YOff >> zoomScale) << zoomScale;
X
X switch (NumVs)
X {
X case 0:
X case 1:
X break;
X case 2:
X splineVs = (XPoint *) calloc (3, sizeof (XPoint));
X splineVs[0].x = (Vs[0].x-x_off)>>zoomScale;
X splineVs[0].y = (Vs[0].y-y_off)>>zoomScale;
X splineVs[1].x = (Vs[1].x-x_off)>>zoomScale;
X splineVs[1].y = (Vs[1].y-y_off)>>zoomScale;
X *N = 2;
X break;
X case 3:
X mx1 = (Vs->x-x_off)>>zoomScale; my1 = ((Vs++)->y-y_off)>>zoomScale;
X x1 = (Vs->x-x_off)>>zoomScale; y1 = ((Vs++)->y-y_off)>>zoomScale;
X mx2 = (mx1+x1)/2.0; my2 = (my1+y1)/2.0;
X mx4 = (Vs->x-x_off)>>zoomScale; my4 = (Vs->y-y_off)>>zoomScale;
X mx3 = (x1+mx4)/2.0; my3 = (y1+my4)/2.0;
X max_n = 100;
X splineVs = (XPoint *) calloc (max_n, sizeof (XPoint));
X splineVs[0].x = mx1;
X splineVs[0].y = my1;
X *N = 1;
X SetSplineVs (N, &max_n, mx1, my1, mx2, my2, mx3, my3, mx4, my4);
X break;
X default:
X mx1 = (Vs->x-x_off)>>zoomScale; my1 = ((Vs++)->y-y_off)>>zoomScale;
X x1 = (Vs->x-x_off)>>zoomScale; y1 = ((Vs++)->y-y_off)>>zoomScale;
X x2 = (Vs->x-x_off)>>zoomScale; y2 = ((Vs++)->y-y_off)>>zoomScale;
X mx2 = (mx1+x1)/2.0; my2 = (my1+y1)/2.0;
X mx3 = (3.0*x1+x2)/4.0; my3 = (3.0*y1+y2)/4.0;
X mx4 = (x1+x2)/2.0; my4 = (y1+y2)/2.0;
X max_n = 100;
X splineVs = (XPoint *) calloc (max_n, sizeof (XPoint));
X splineVs[0].x = mx1;
X splineVs[0].y = my1;
X *N = 1;
X SetSplineVs (N, &max_n, mx1, my1, mx2, my2, mx3, my3, mx4, my4);
X
X for (i = 2; i < NumVs-2; i++, Vs++)
X {
X mx1 = mx4; my1 = my4;
X mx2 = (x1 + 3.0*x2) / 4.0; my2 = (y1 + 3.0*y2) / 4.0;
X x1 = x2; y1 = y2;
X x2 = (Vs->x-x_off)>>zoomScale; y2 = (Vs->y-y_off)>>zoomScale;
X mx3 = (3.0*x1 + x2) / 4.0; my3 = (3.0*y1 + y2) / 4.0;
X mx4 = (x1 + x2) / 2.0; my4 = (y1 + y2) / 2.0;
X SetSplineVs (N, &max_n, mx1, my1, mx2, my2, mx3, my3, mx4, my4);
X }
X mx1 = mx4; my1 = my4;
X mx2 = (x1 + 3.0*x2) / 4.0; my2 = (y1 + 3.0*y2) / 4.0;
X x1 = x2; y1 = y2;
X mx4 = (Vs->x-x_off)>>zoomScale; my4 = (Vs->y-y_off)>>zoomScale;
X mx3 = (x1 + mx4) / 2.0; my3 = (y1 + my4) / 2.0;
X SetSplineVs (N, &max_n, mx1, my1, mx2, my2, mx3, my3, mx4, my4);
X break;
X }
X return (splineVs);
X}
X
Xstatic XPoint arrow_v[4];
X
Xvoid DrawSplinePolyObj (Win, XOff, YOff, Fill, Width, Pen, Dash, Pixel, PolyPtr)
X Window Win;
X int XOff, YOff, Fill, Width, Pen, Dash, Pixel;
X struct PolyRec * PolyPtr;
X{
X XPoint * sv = PolyPtr->svlist, * v;
X double dx, dy, len, sin, cos;
X int ah, aw, x_off, y_off, sn = PolyPtr->sn;
X XGCValues values;
X
X x_off = (XOff >> zoomScale) << zoomScale;
X y_off = (YOff >> zoomScale) << zoomScale;
X
X if (Fill != 0)
X {
X sv[sn].x = sv[0].x; sv[sn].y = sv[0].y;
X values.foreground = (Fill == 2) ? myBgPixel : Pixel;
X values.function = GXcopy;
X values.fill_style = FillOpaqueStippled;
X values.stipple = patPixmap[Fill];
X XChangeGC (mainDisplay, drawGC,
X GCForeground | GCFunction | GCFillStyle | GCStipple, &values);
X
X XFillPolygon (mainDisplay, Win, drawGC, sv, sn+1, Complex,
X CoordModeOrigin);
X }
X
X if (Pen != 0)
X {
X values.foreground = (Pen == 2) ? myBgPixel : Pixel;
X values.function = GXcopy;
X values.fill_style = FillOpaqueStippled;
X values.stipple = patPixmap[Pen];
X values.line_width = widthOfLine[Width] >> zoomScale;
X if (Dash != 0)
X {
X XSetDashes (mainDisplay, drawGC, 0, dashList[Dash],
X dashListLength[Dash]);
X values.line_style = LineOnOffDash;
X }
X else
X values.line_style = LineSolid;
X XChangeGC (mainDisplay, drawGC,
X GCForeground | GCFunction | GCFillStyle | GCStipple | GCLineWidth |
X GCLineStyle, &values);
X
X XDrawLines (mainDisplay, Win, drawGC, sv, sn, CoordModeOrigin);
X
X ah = arrowHeadH[Width] >> zoomScale; if (ah == 0) ah = 1;
X aw = arrowHeadW[Width] >> zoomScale; if (aw == 0) aw = 1;
X if (PolyPtr->style & LS_LEFT)
X {
X v = PolyPtr->vlist;
X arrow_v[0].x = arrow_v[3].x = (v->x-x_off)>>zoomScale;
X arrow_v[0].y = arrow_v[3].y = (v->y-y_off)>>zoomScale;
X dx = (double)(v[1].x - v[0].x);
X dy = (double)(v[1].y - v[0].y);
X len = (double) sqrt (dx * dx + dy * dy);
X sin = dy / len;
X cos = dx / len;
X arrow_v[1].x = round(((int)(v->x-x_off)>>zoomScale)+aw*cos-ah*sin);
X arrow_v[1].y = round(((int)(v->y-y_off)>>zoomScale)+aw*sin+ah*cos);
X arrow_v[2].x = round(((int)(v->x-x_off)>>zoomScale)+aw*cos+ah*sin);
X arrow_v[2].y = round(((int)(v->y-y_off)>>zoomScale)+aw*sin-ah*cos);
X
X XFillPolygon (mainDisplay, Win, drawGC, arrow_v, 4, Convex,
X CoordModeOrigin);
X }
X if (PolyPtr->style & LS_RIGHT)
X {
X v = &(PolyPtr->vlist[PolyPtr->n-2]);
X arrow_v[0].x = arrow_v[3].x = (v[1].x-x_off)>>zoomScale;
X arrow_v[0].y = arrow_v[3].y = (v[1].y-y_off)>>zoomScale;
X dx = (double)(v[1].x - v[0].x);
X dy = (double)(v[1].y - v[0].y);
X len = (double) sqrt (dx * dx + dy * dy);
X sin = dy / len;
X cos = dx / len;
X arrow_v[1].x = round(((int)(v[1].x-x_off)>>zoomScale)-aw*cos+ah*sin);
X arrow_v[1].y = round(((int)(v[1].y-y_off)>>zoomScale)-aw*sin-ah*cos);
X arrow_v[2].x = round(((int)(v[1].x-x_off)>>zoomScale)-aw*cos-ah*sin);
X arrow_v[2].y = round(((int)(v[1].y-y_off)>>zoomScale)-aw*sin+ah*cos);
X
X XFillPolygon (mainDisplay, Win, drawGC, arrow_v, 4, Convex,
X CoordModeOrigin);
X }
X }
X}
X
XXPoint * MakeSplinePolygonVertex (N, XOff, YOff, NumVs, Vs)
X int * N, XOff, YOff, NumVs;
X XPoint * Vs;
X{
X double mx1, my1, mx2, my2, mx3, my3, mx4, my4, x1, y1, x2, y2;
X int i, max_n, x_off, y_off;
X
X x_off = (XOff >> zoomScale) << zoomScale;
X y_off = (YOff >> zoomScale) << zoomScale;
X
X Vs[NumVs].x = Vs[1].x; Vs[NumVs].y = Vs[1].y;
X x1 = (Vs->x-x_off)>>zoomScale; y1 = ((Vs++)->y-y_off)>>zoomScale;
X x2 = (Vs->x-x_off)>>zoomScale; y2 = ((Vs++)->y-y_off)>>zoomScale;
X mx4 = (x1 + x2) / 2.0; my4 = (y1 + y2) / 2.0;
X
X max_n = 100;
X splineVs = (XPoint *) calloc (max_n, sizeof (XPoint));
X splineVs[0].x = mx4;
X splineVs[0].y = my4;
X *N = 1;
X
X for (i = 1; i < NumVs; i++, Vs++)
X {
X mx1 = mx4; my1 = my4;
X mx2 = (x1+3.0*x2)/4.0; my2 = (y1+3.0*y2)/4.0;
X x1 = x2; y1 = y2;
X x2 = (Vs->x-x_off)>>zoomScale; y2 = (Vs->y-y_off)>>zoomScale;
X mx3 = (3.0*x1+x2)/4.0; my3 = (3.0*y1+y2)/4.0;
X mx4 = (x1+x2)/2.0; my4 = (y1+y2)/2.0;
X SetSplineVs (N, &max_n, mx1, my1, mx2, my2, mx3, my3, mx4, my4);
X }
X return (splineVs);
X}
X
Xvoid DrawSplinePolygonObj (Win,XOff,YOff,Fill,Width,Pen,Dash,Pixel,PolygonPtr)
X Window Win;
X int XOff, YOff, Fill, Width, Pen, Dash, Pixel;
X struct PolygonRec * PolygonPtr;
X{
X XPoint * sv = PolygonPtr->svlist;
X int sn = PolygonPtr->sn;
X XGCValues values;
X
X if (Fill != 0)
X {
X values.foreground = (Fill == 2) ? myBgPixel : Pixel;
X values.function = GXcopy;
X values.fill_style = FillOpaqueStippled;
X values.stipple = patPixmap[Fill];
X XChangeGC (mainDisplay, drawGC,
X GCForeground | GCFunction | GCFillStyle | GCStipple, &values);
X
X XFillPolygon (mainDisplay, Win, drawGC, sv, sn, Complex, CoordModeOrigin);
X }
X if (Pen != 0)
X {
X values.foreground = (Pen == 2) ? myBgPixel : Pixel;
X values.function = GXcopy;
X values.fill_style = FillOpaqueStippled;
X values.stipple = patPixmap[Pen];
X values.line_width = widthOfLine[Width] >> zoomScale;
X if (Dash != 0)
X {
X XSetDashes (mainDisplay, drawGC, 0, dashList[Dash],
X dashListLength[Dash]);
X values.line_style = LineOnOffDash;
X }
X else
X values.line_style = LineSolid;
X XChangeGC (mainDisplay, drawGC,
X GCForeground | GCFunction | GCFillStyle | GCStipple | GCLineWidth |
X GCLineStyle, &values);
X
X XDrawLines (mainDisplay, Win, drawGC, sv, sn, CoordModeOrigin);
X }
X}
X
Xvoid DumpCurvedPolyPoints (FP, NumPts, V, Indent)
X FILE * FP;
X int NumPts, Indent;
X register XPoint * V;
X{
X register int j, i;
X double x1, y1, x2, y2;
X double mx1, my1, mx2, my2, mx3, my3, mx4, my4;
X
X switch (NumPts)
X {
X case 0:
X case 1:
X case 2:
X break;
X case 3:
X mx1 = V->x; my1 = (V++)->y;
X x1 = V->x; y1 = (V++)->y;
X x2 = V->x; y2 = (V++)->y;
X mx2 = (mx1 + 2.0*x1) / 3.0; my2 = (my1 + 2.0*y1) / 3.0;
X mx3 = (2.0*x1 + x2) / 3.0; my3 = (2.0*y1 + y2) / 3.0;
X for (j = 0; j < Indent; j++) fprintf (FP, " ");
X fprintf (FP, "%.2f %.2f %.2f %.2f\n", mx2, my2, mx3, my3);
X break;
X default:
X mx1 = V->x; my1 = (V++)->y;
X x1 = V->x; y1 = (V++)->y;
X x2 = V->x; y2 = (V++)->y;
X mx2 = (mx1 + 2.0*x1) / 3.0; my2 = (my1 + 2.0*y1) / 3.0;
X mx3 = (5.0*x1 + x2) / 6.0; my3 = (5.0*y1 + y2) / 6.0;
X mx4 = (x1 + x2) / 2.0; my4 = (y1 + y2) / 2.0;
X for (j = 0; j < Indent; j++) fprintf (FP, " ");
X fprintf (FP, "%.2f %.2f %.2f %.2f %.2f %.2f curveto\n",
X mx2, my2, mx3, my3, mx4, my4);
X
X for (i = 2; i < NumPts-2; i++, V++)
X {
X mx1 = mx4; my1 = my4;
X mx2 = (x1 + 5.0*x2) / 6.0; my2 = (y1 + 5.0*y2) / 6.0;
X x1 = x2; y1 = y2;
X x2 = V->x; y2 = V->y;
X mx3 = (5.0*x1 + x2) / 6.0; my3 = (5.0*y1 + y2) / 6.0;
X mx4 = (x1 + x2) / 2.0; my4 = (y1 + y2) / 2.0;
X for (j = 0; j < Indent; j++) fprintf (FP, " ");
X fprintf (FP, "%.2f %.2f %.2f %.2f %.2f %.2f curveto\n",
X mx2, my2, mx3, my3, mx4, my4);
X }
X mx1 = mx4; my1 = my4;
X mx2 = (x1 + 5.0*x2) / 6.0; my2 = (y1 + 5.0*y2) / 6.0;
X x1 = x2; y1 = y2;
X mx3 = (2.0*x1 + V->x) / 3.0; my3 = (2.0*y1 + V->y) / 3.0;
X for (j = 0; j < Indent; j++) fprintf (FP, " ");
X fprintf (FP, "%.2f %.2f %.2f %.2f\n", mx2, my2, mx3, my3);
X break;
X }
X}
X
Xvoid DumpCurvedPolygonPoints (FP, NumPts, V, Indent)
X FILE * FP;
X int NumPts, Indent;
X register XPoint * V;
X{
X register int j;
X double mx1, my1, mx2, my2, mx3, my3, mx4, my4, x1, y1, x2, y2;
X int i;
X
X V[NumPts].x = V[1].x; V[NumPts].y = V[1].y;
X x1 = V->x; y1 = (V++)->y;
X x2 = V->x; y2 = (V++)->y;
X mx4 = (x1 + x2) / 2.0; my4 = (y1 + y2) / 2.0;
X for (j = 0; j < Indent; j++) fprintf (FP, " ");
X fprintf (FP, "%.2f %.2f moveto\n", mx4, my4);
X
X for (i = 1; i < NumPts; i++, V++)
X {
X mx1 = mx4; my1 = my4;
X mx2 = (x1+5.0*x2)/6.0; my2 = (y1+5.0*y2)/6.0;
X x1 = x2; y1 = y2;
X x2 = V->x; y2 = V->y;
X mx3 = (5.0*x1+x2)/6.0; my3 = (5.0*y1+y2)/6.0;
X mx4 = (x1+x2)/2.0; my4 = (y1+y2)/2.0;
X for (j = 0; j < Indent; j++) fprintf (FP, " ");
X fprintf (FP, "%.2f %.2f %.2f %.2f %.2f %.2f curveto\n",
X mx2, my2, mx3, my3, mx4, my4);
X }
X}
X
Xstatic
Xint PointInSpline (PX, PY, W, X1, Y1, X2, Y2, X3, Y3, X4, Y4)
X int PX, PY, W;
X double X1, Y1, X2, Y2, X3, Y3, X4, Y4;
X /* X and Y are absolute coordinates */
X{
X register double x, y;
X
X x = (X2 + X3) / 2.0;
X y = (Y2 + Y3) / 2.0;
X if (fabs (X1 - x) < SPLINE_TOL && fabs (Y1 - y) < SPLINE_TOL)
X return (PX > min(X1,x)-W && PX < max(X1,x)+W &&
X PY > min(Y1,y)-W && PY < max(Y1,y)+W);
X else
X if (PointInSpline (PX, PY, W, X1, Y1, (X1+X2)/2.0, (Y1+Y2)/2.0,
X (3.0*X2+X3)/4.0, (3.0*Y2+Y3)/4.0, x, y))
X return (TRUE);
X
X if (fabs (x - X4) < SPLINE_TOL && fabs (y - Y4) < SPLINE_TOL)
X return (PX > min(X4,x)-W && PX < max(X4,x)+W &&
X PY > min(Y4,y)-W && PY < max(Y4,y)+W);
X else
X return (PointInSpline (PX, PY, W, x, y, (X2+3.0*X3)/4.0, (Y2+3.0*Y3)/4.0,
X (X3+X4)/2.0, (Y3+Y4)/2.0, X4, Y4));
X}
X
Xint PointInSplinePoly (X, Y, PolyPtr, W)
X int X, Y, W;
X struct PolyRec * PolyPtr;
X /* X and Y are absolute coordinates */
X{
X double mx1, my1, mx2, my2, mx3, my3, mx4, my4, x1, y1, x2, y2;
X int i, in_region, sn, num_pts = PolyPtr->n;
X XPoint * v = PolyPtr->vlist, * sv;
X Region region;
X
X if (PolyPtr->fill != NONEPAT)
X {
X sv = PolyPtr->svlist;
X sn = PolyPtr->sn;
X sv[sn].x = sv[0].x; sv[sn].y = sv[0].y;
X region = XPolygonRegion (sv, sn+1, EvenOddRule);
X in_region = XPointInRegion (region, (X-drawOrigX)>>zoomScale,
X (Y-drawOrigY)>>zoomScale);
X XDestroyRegion (region);
X if (in_region) return (TRUE);
X }
X
X switch (num_pts)
X {
X case 2:
X return (PointInPoly (X, Y, num_pts, v, W));
X case 3:
X mx1 = v->x; my1 = (v++)->y;
X x1 = v->x; y1 = (v++)->y;
X mx4 = v->x; my4 = v->y;
X mx2 = (mx1 + x1) / 2.0; my2 = (my1 + y1) / 2.0;
X mx3 = (x1 + mx4) / 2.0; my3 = (y1 + my4) / 2.0;
X return (PointInSpline (X, Y, W, mx1, my1, mx2, my2, mx3, my3, mx4, my4));
X default:
X mx1 = v->x; my1 = (v++)->y;
X x1 = v->x; y1 = (v++)->y;
X x2 = v->x; y2 = (v++)->y;
X mx2 = (mx1+x1)/2.0; my2 = (my1+y1)/2.0;
X mx3 = (3.0*x1+x2)/4.0; my3 = (3.0*y1+y2)/4.0;
X mx4 = (x1+x2)/2.0; my4 = (y1+y2)/2.0;
X if (PointInSpline (X, Y, W, mx1, my1, mx2, my2, mx3, my3, mx4, my4))
X return (TRUE);
X
X for (i = 2; i < num_pts-2; i++, v++)
X {
X mx1 = mx4; my1 = my4;
X mx2 = (x1+3.0*x2)/4.0; my2 = (y1+3.0*y2)/4.0;
X x1 = x2; y1 = y2;
X x2 = v->x; y2 = v->y;
X mx3 = (3.0*x1+x2)/4.0; my3 = (3.0*y1+y2)/4.0;
X mx4 = (x1+x2)/2.0; my4 = (y1+y2)/2.0;
X if (PointInSpline (X, Y, W, mx1, my1, mx2, my2, mx3, my3, mx4, my4))
X return (TRUE);
X }
X mx1 = mx4; my1 = my4;
X mx2 = (x1+3.0*x2)/4.0; my2 = (y1+3.0*y2)/4.0;
X x1 = x2; y1 = y2;
X mx4 = v->x; my4 = v->y;
X mx3 = (x1+mx4)/2.0; my3 = (y1+my4)/2.0;
X return (PointInSpline (X, Y, W, mx1, my1, mx2, my2, mx3, my3, mx4, my4));
X }
X}
X
Xint PointInSplinePolygon (X, Y, PolygonPtr, W)
X int X, Y, W;
X struct PolygonRec * PolygonPtr;
X /* X and Y are absolute coordinates */
X{
X double mx1, my1, mx2, my2, mx3, my3, mx4, my4, x1, y1, x2, y2;
X int i, in_region, num_pts = PolygonPtr->n;
X XPoint * v = PolygonPtr->vlist;
X Region region;
X
X if (PolygonPtr->fill != NONEPAT)
X {
X region = XPolygonRegion (PolygonPtr->svlist, PolygonPtr->sn, EvenOddRule);
X in_region = XPointInRegion (region, (X-drawOrigX)>>zoomScale,
X (Y-drawOrigY)>>zoomScale);
X XDestroyRegion (region);
X if (in_region) return (TRUE);
X }
X
X v[num_pts].x = v[1].x; v[num_pts].y = v[1].y;
X x1 = v->x; y1 = (v++)->y;
X x2 = v->x; y2 = (v++)->y;
X mx4 = (x1+x2)/2.0; my4 = (y1+y2)/2.0;
X
X for (i = 1; i < num_pts; i++, v++)
X {
X mx1 = mx4; my1 = my4;
X mx2 = (x1+3.0*x2)/4.0; my2 = (y1+3.0*y2)/4.0;
X x1 = x2; y1 = y2;
X x2 = v->x; y2 = v->y;
X mx3 = (3.0*x1+x2)/4.0; my3 = (3.0*y1+y2)/4.0;
X mx4 = (x1+x2)/2.0; my4 = (y1+y2)/2.0;
X if (PointInSpline (X, Y, W, mx1, my1, mx2, my2, mx3, my3, mx4, my4))
X return (TRUE);
X }
X return (FALSE);
X}
END_OF_FILE
if test 18843 -ne `wc -c <'spline.c'`; then
echo shar: \"'spline.c'\" unpacked with wrong size!
fi
# end of 'spline.c'
fi
echo shar: End of archive 14 \(of 23\).
cp /dev/null ark14isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 23 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
---------------------------------> cut here <---------------------------------
--
Bill Cheng // UCLA Computer Science Department // (213) 206-7135
3277 Boelter Hall // Los Angeles, California 90024 // USA
william at CS.UCLA.EDU ...!{uunet|ucbvax}!cs.ucla.edu!william
--
Dan Heller
------------------------------------------------
O'Reilly && Associates Z-Code Software
Senior Writer President
argv at ora.com argv at zipcode.com
------------------------------------------------
General Email: argv at sun.com
Comp-sources-x stuff: comp-sources.x at uunet.uu.net
More information about the Comp.sources.x
mailing list