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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
/* Tektronix terminal window interface for Metafont. */
#define EXTERN extern
#include "../mfd.h"
#ifdef TEKTRONIXWIN /* Whole file */
#define FORMFEED 12
#define ESCAPE 27
#define GS 29
#define US 31
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#define WIDTH 1024 /* Screen width */
#define HEIGHT 780 /* Screen height */
#define WIDTHINBYTES (WIDTH/8) /* Only works if WIDTH % 8 == 0 */
#define SETBIT(row,col) screen_pixel[row*WIDTHINBYTES+col/8] |= 1 << 7-col%8
#define CLEARBIT(row,col) screen_pixel[row*WIDTHINBYTES+col/8] &= \
~(1 << 7-col%8)
#define ISSET(row,col) (screen_pixel[row*WIDTHINBYTES+col/8] & 1 << 7-col%8)
char screen_pixel[WIDTHINBYTES*HEIGHT];
char zero_array[WIDTHINBYTES];
/*
* function init_screen: boolean;
*
* Return true if window operations legal.
* We always return true.
*/
int mf_tektronix_initscreen()
{
bzero(zero_array, sizeof(zero_array));
return 1;
}
/*
* procedure updatescreen;
*
* Print out the screen bitmap.
*/
void mf_tektronix_updatescreen()
{
int r, c, startc, makingline;
printf("%c%c", ESCAPE, FORMFEED);
for (r = 0; r < HEIGHT; r++) {
makingline = FALSE;
if (bcmp(&screen_pixel[r*WIDTHINBYTES],zero_array,WIDTHINBYTES) == 0)
continue;
for (c = 0; c < WIDTH; c++) {
if (ISSET(r, c)) {
if (!makingline) {
makingline = TRUE;
startc = c;
}
} else if (makingline) {
putchar(GS);
putchar(0x20|((HEIGHT-1)-r)>>5);
putchar(0x60|((HEIGHT-1)-r)&0x1F);
putchar(0x20|startc>>5);
putchar(0x40|startc&0x1F);
putchar(0x60|((HEIGHT-1)-r)&0x1F); /* Don't send high y */
putchar(0x20|c>>5);
putchar(0x40|c&0x1F);
makingline = FALSE;
}
}
if (makingline) {
putchar(GS);
putchar(0x20|((HEIGHT-1)-r)>>5);
putchar(0x60|((HEIGHT-1)-r)&0x1F);
putchar(0x20|startc>>5);
putchar(0x40|startc&0x1F);
putchar(0x60|((HEIGHT-1)-r)&0x1F); /* Don't send high y */
putchar(0x20|c>>5);
putchar(0x40|c&0x1F);
}
}
printf("%c%c%c%c%c", GS, 0x23, 0x66, 0x20, 0x40);
putchar(US);
fflush(stdout);
}
/*
* procedure blankrectangle(left, right, top, bottom: integer);
*
* Blanks out a port of the screen.
*/
void mf_tektronix_blankrectangle P4C(screencol, left,
screencol, right,
screenrow, top,
screenrow, bottom)
{
int r, c;
if (left == 0 && right == WIDTH && top == 0 && bottom == HEIGHT)
bzero(screen_pixel, sizeof(screen_pixel));
else
for (r = top; r < bottom; r++)
for (c = left; c < right; c++)
CLEARBIT(r, c);
}
/*
* procedure paintrow(
* row: screenrow;
* init_color: pixelcolor;
* var trans_vector: transspec;
* vector_size: screencol);
*
* Paint "row" starting with color "init_color", up to next
* transition specified by "transition_vector", switch colors,
* and continue for "vector_size" transitions.
*/
void mf_tektronix_paintrow P4C(screenrow, row,
pixelcolor, init_color,
transspec, transition_vector,
screencol, vector_size)
{
int k = 0;
int c = transition_vector[0];
do {
k++;
do {
if (init_color)
SETBIT(row, c);
else
CLEARBIT(row, c);
} while (++c != transition_vector[k]);
init_color = !init_color;
} while (k != vector_size);
}
#else
int tek_dummy;
#endif /* TEKTRONIXWIN */
|