(FILECREATED " 1-Oct-85 19:58:33" {QV}<NOTECARDS>RELEASE1.2I>FGHPATCH026.;1 6047   

      changes to:  (VARS FGHPATCH026COMS)
		   (FNS NC.DrawArrowHead))


(* Copyright (c) 1985 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT FGHPATCH026COMS)

(RPAQQ FGHPATCH026COMS ((* * Fix to scale for press and interpress streams)
			(FNS NC.DrawArrowHead NC.DrawFlowerLink)))
(* * Fix to scale for press and interpress streams)

(DEFINEQ

(NC.DrawArrowHead
  (LAMBDA (X1 Y1 X2 Y2 Width Operation Stream Color MidpointFlg XOffset YOffset)
                                                             (* fgh: " 1-Oct-85 19:56")

          (* * Draw an arrowhead on the end of the line segment from X1,Y1 to X2,Y2.)



          (* * rht 8/12/85: Added check for whether point is inside clipping region before computing arrow head.)


    (PROG ((XDiff (IDIFFERENCE X1 X2))
	   (YDiff (IDIFFERENCE Y1 Y2))
	   LineLength A11 A12 A21 A22 Tmp1 Tmp2 ClippingRegion (WindowFlg (WINDOWP Stream))
	   (Scale (DSPSCALE NIL Stream))
	   ArrowHeadXVal ArrowHeadYVal ArrowHeadLength)
          (OR XOffset (SETQ XOffset 0))
          (OR YOffset (SETQ YOffset 0))
          (SETQ ArrowHeadXVal (FIXR (TIMES NC.ArrowHeadXVal Scale)))
          (SETQ ArrowHeadYVal (FIXR (TIMES NC.ArrowHeadYVal Scale)))
          (SETQ ArrowHeadLength (FIXR (TIMES NC.ArrowHeadLength Scale)))
          (COND
	    (MidpointFlg (SETQ XOffset (PLUS XOffset (DIFFERENCE (QUOTIENT (IPLUS X1 X2)
									   2)
								 X2)))
			 (SETQ YOffset (PLUS YOffset (DIFFERENCE (QUOTIENT (IPLUS Y1 Y2)
									   2)
								 Y2)))))
                                                             (* If the point at which the arrow head will be drawn 
							     isn't inside the clipping region together with a 
							     border, then bail out.)
          (SETQ ClippingRegion (DSPCLIPPINGREGION NIL Stream))
          (COND
	    ((AND ClippingRegion (NOT (INSIDEP (CREATEREGION (DIFFERENCE (fetch (REGION LEFT)
									    of ClippingRegion)
									 ArrowHeadLength)
							     (DIFFERENCE (fetch (REGION BOTTOM)
									    of ClippingRegion)
									 ArrowHeadLength)
							     (PLUS (fetch (REGION WIDTH)
								      of ClippingRegion)
								   ArrowHeadLength ArrowHeadLength)
							     (PLUS (fetch (REGION HEIGHT)
								      of ClippingRegion)
								   ArrowHeadLength ArrowHeadLength))
					       (PLUS X2 XOffset)
					       (PLUS Y2 YOffset))))
	      (RETURN)))
          (SETQ LineLength (SQRT (PLUS (TIMES XDiff XDiff)
				       (TIMES YDiff YDiff))))
          (SETQ A11 (QUOTIENT (FLOAT XDiff)
			      LineLength))
          (SETQ A21 (QUOTIENT (FLOAT YDiff)
			      LineLength))
          (SETQ A12 (MINUS A21))
          (SETQ A22 A11)
          (SETQ Tmp1 (TIMES A11 ArrowHeadXVal))
          (SETQ Tmp2 (TIMES A21 ArrowHeadXVal))
          (SETQ X2 (PLUS X2 XOffset))
          (SETQ Y2 (PLUS Y2 YOffset))
          (DRAWLINE X2 Y2 (PLUS X2 Tmp1 (TIMES A12 ArrowHeadYVal))
		    (PLUS Y2 Tmp2 (TIMES A22 ArrowHeadYVal))
		    Width Operation Stream Color)
          (DRAWLINE X2 Y2 (PLUS X2 Tmp1 (TIMES A12 (MINUS ArrowHeadYVal)))
		    (PLUS Y2 Tmp2 (TIMES A22 (MINUS ArrowHeadYVal)))
		    Width Operation Stream Color))))

(NC.DrawFlowerLink
  (LAMBDA (X1 Y1 X2 Y2 Brush Dashing Num Win Width Operation Color)
                                                             (* fgh: " 1-Oct-85 15:28")

          (* * Draw one link between given points according to given Dashing. If Num is 0, then draw straight line.
	  Otherwise, draw curves above for odd Num and below for even Num, getting wider for bigger values of Num.)


    (PROG ((MidpointX (QUOTIENT (IPLUS X1 X2)
				2))
	   (MidpointY (QUOTIENT (IPLUS Y1 Y2)
				2))
	   XOffset YOffset Scale)
          (COND
	    ((ZEROP Num)
	      (DRAWLINE X1 Y1 X2 Y2 Width Operation Win Color Dashing)
	      (AND (NEQ NC.ArrowHeadsInBrowser (QUOTE None))
		   (NC.DrawArrowHead X1 Y1 X2 Y2 Width Operation Win Color T)))
	    (T                                               (* Check slope of line. If < 45 degrees, then make 
							     spline nodes be vertically removed, otherwise 
							     horizontally removed.)
	       (COND
		 ((GREATERP (ABS (DIFFERENCE X2 X1))
			    (ABS (DIFFERENCE Y2 Y1)))
		   (SETQ YOffset (COND
		       ((ODDP Num)
			 (TIMES NC.GraphFlowerLinkSeparation (QUOTIENT (ADD1 Num)
								       2)))
		       (T (MINUS (TIMES NC.GraphFlowerLinkSeparation (QUOTIENT (ADD1 Num)
									       2))))))
		   (SETQ XOffset 0))
		 (T (SETQ XOffset (COND
			((ODDP Num)
			  (TIMES NC.GraphFlowerLinkSeparation (QUOTIENT (ADD1 Num)
									2)))
			(T (MINUS (TIMES NC.GraphFlowerLinkSeparation (QUOTIENT (ADD1 Num)
										2))))))
		    (SETQ YOffset 0)))
	       (SETQ Scale (DSPSCALE NIL Win))
	       (SETQ XOffset (FIXR (TIMES XOffset Scale)))
	       (SETQ YOffset (FIXR (TIMES YOffset Scale)))
	       (DRAWLINE X1 Y1 (PLUS MidpointX XOffset)
			 (PLUS MidpointY YOffset)
			 Width Operation Win NIL Dashing)
	       (DRAWLINE (PLUS MidpointX XOffset)
			 (PLUS MidpointY YOffset)
			 X2 Y2 Width Operation Win NIL Dashing)
	       (AND (NEQ NC.ArrowHeadsInBrowser (QUOTE None))
		    (NC.DrawArrowHead X1 Y1 (PLUS MidpointX XOffset)
				      (PLUS MidpointY YOffset)
				      Width Operation Win Color NIL)))))))
)
(PUTPROPS FGHPATCH026 COPYRIGHT ("Xerox Corporation" 1985))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (449 5965 (NC.DrawArrowHead 459 . 3613) (NC.DrawFlowerLink 3615 . 5963)))))
STOP