aboutsummaryrefslogtreecommitdiff
path: root/sys/gio/sgikern/sgidrawch.x
blob: ab7500ea32c7662066b58f4043e4988c08601cbb (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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.

include	<math.h>
include	<gki.h>
include	<gset.h>
include	"sgi.h"
include	"font.h"

define	ITALIC_TILT	0.30	# fraction of xsize to tilt italics at top


# SGI_DRAWCHAR -- Draw a character of the given size and orientation at the
# given position.

int procedure sgi_drawchar (ch, x, y, xsize, ysize, orien, font)

char	ch			# character to be drawn
int	x, y			# lower left GKI coords of character
int	xsize, ysize		# width, height of char in GKI units
int	orien			# orientation of character (0 degrees normal)
int	font			# desired character font

int	mx, my
real	px, py, coso, sino, theta
int	stroke, tab1, tab2, i, pen, width
int	bitupk()
include	"font.com"
include	"greek.com"
include	"sgi.com"

begin
	if (ch < CHARACTER_START || ch > CHARACTER_END)
	    i = '?' - CHARACTER_START + 1
	else
	    i = ch  - CHARACTER_START + 1

	# Set the font.
	call sgi_font (font)

	if (font == GT_GREEK) {
	    width = gchwid[i]
	    tab1 = gchidx[i]
	    tab2 = gchidx[i+1] - 1
	} else {
	    width = chrwid[i]
	    tab1 = chridx[i]
	    tab2 = chridx[i+1] - 1
	}

	theta = -DEGTORAD(orien)
	coso = cos(theta)
	sino = sin(theta)

	do i = tab1, tab2 {
	    if (font == GT_GREEK)
	        stroke = gchtab[i]
	    else
	        stroke = chrtab[i]

	    px  = bitupk (stroke, COORD_X_START,   COORD_X_LEN)
	    py  = bitupk (stroke, COORD_Y_START,   COORD_Y_LEN)
	    pen = bitupk (stroke, COORD_PEN_START, COORD_PEN_LEN)

	    # Scale size of character.
	    px = px / width  * xsize
	    py = py / FONT_HEIGHT * ysize

	    # The italic font is implemented applying a tilt.
	    if (font == GT_ITALIC)
		px = px + ((py / ysize) * xsize * ITALIC_TILT)

	    # Rotate and shift.
	    mx = x + px * coso + py * sino
	    my = y - px * sino + py * coso

	    # Draw the line segment or move pen.
	    if (pen == 0)
		call sgk_move (g_out, mx, my)
	    else
		call sgk_draw (g_out, mx, my)
	}

	return (int(real(width) / real(FONT_WIDTH) * xsize))
end