aboutsummaryrefslogtreecommitdiff
path: root/sys/plio/plline.x
blob: 54caf253b9f08399b3b3bb8988740c02beba6083 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.

include <math.h>
include <plset.h>
include <plio.h>

# PL_LINE -- Perform a rasterop operation upon a line of arbitrary width drawn
# at an arbitrary orientation in a 2-dimensional plane of a mask.  If the
# dimensionality of the mask exceeds 2, the pl_setplane() procedure should be
# called first to define the plane of the mask to be modified.

procedure pl_line (pl, x1, y1, x2, y2, width, rop)

pointer	pl			#I mask descriptor
int	x1,y1			#I start point of line
int	x2,y2			#I end point of line
int	width			#I width of line to be drawn, pixels
int	rop			#I rasterop defining operation

int	npts
int	x[4], y[4]
real	theta, hwidth, dx, dy

begin
	dx = x2 - x1
	dy = y2 - y1

	# Compute the line direction and halfwidth.
	hwidth = max (1.0, real(width)) / 2.0 - 0.001
	if (abs(dx) < 0.0001) {
	    if (dy > 0)
		theta = HALFPI
	    else
		theta = -HALFPI
	} else if (abs(dy) < 0.0001) {
	    if (dx > 0)
		theta = 0.0
	    else
		theta = PI
	} else
	    theta = atan2 (dy, dx)

	# Construct a polyline to be filled to draw the line.
	if (width < 1.0001) {
	    x[1] = x1;  y[1] = y1
	    x[2] = x2;  y[2] = y2
	    npts = 2

	} else {
	    x[1] = x1 + nint (hwidth * cos(theta+HALFPI))
	    y[1] = y1 + nint (hwidth * sin(theta+HALFPI))

	    x[2] = x1 + nint (hwidth * cos(theta-HALFPI))
	    y[2] = y1 + nint (hwidth * sin(theta-HALFPI))

	    x[3] = x2 + nint (hwidth * cos(theta-HALFPI))
	    y[3] = y2 + nint (hwidth * sin(theta-HALFPI))

	    x[4] = x2 + nint (hwidth * cos(theta+HALFPI))
	    y[4] = y2 + nint (hwidth * sin(theta+HALFPI))
	    npts = 4
	}

	# Draw the line.
	call pl_polygon (pl, x, y, npts, rop)
end