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
144
145
146
147
148
149
|
/* 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];
#include <mfdisplay.h>
/*
* function init_screen: boolean;
*
* Return true if window operations legal.
* We always return true.
*/
int
mf_tektronix_initscreen(void)
{
memset(zero_array, 0, sizeof(zero_array));
return 1;
}
/*
* procedure updatescreen;
*
* Print out the screen bitmap.
*/
void
mf_tektronix_updatescreen(void)
{
int r, c, startc, makingline;
printf("%c%c", ESCAPE, FORMFEED);
for (r = 0; r < HEIGHT; r++) {
makingline = FALSE;
if (memcmp(&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 (screencol left,
screencol right,
screenrow top,
screenrow bottom)
{
int r, c;
if (left == 0 && right == WIDTH && top == 0 && bottom == HEIGHT)
memset(screen_pixel, 0, 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 (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 */
|