1
(*******************************************************************
3
* gmain graphics utility main interface 1.1
5
* This file defines a common interface, implemented in the body
6
* file 'gmain.c'. It relies on system dependent driver files,
7
* like 'gfs_os.c', whose interface is described in 'gdriver.h'.
9
* Copyright 1996 David Turner, Robert Wilhelm and Werner Lemberg.
11
* This file is part of the FreeType project, and may only be used
12
* modified and distributed under the terms of the FreeType project
13
* license, LICENSE.TXT. By continuing to use, modify or distribute
14
* this file you indicate that you have read the license and
15
* understand and accept it fully.
17
******************************************************************)
24
Graphics_Mode_Mono = 1;
25
Graphics_Mode_Gray = 2;
28
TVioScreenBuffer = array[0..0] of Byte;
29
PVioScreenBuffer = ^TVioScreenBuffer;
39
Vio : PVioScreenBuffer;
40
(* pointer to VRAM or display buffer *)
42
vio_ScanLineWidth : Int;
46
gray_palette : array[0..4] of Byte; (* gray palette *)
54
function Set_Graph_Screen( mode : int ) : boolean;
55
(* Set a Graphics Mode, chosen from the Graphics_Mode_xxx list *)
57
function Restore_Screen : boolean;
58
(* Restore a previous ( or text ) video mode *)
60
procedure Display_Bitmap_On_Screen( var buff; line, col : Int );
61
(* display bitmap of 'line' line, and 'col' columns ( each *)
62
(* column mode of 1 byte *)
64
procedure Goto_XY( x, y : int );
66
procedure Print_Str( str : string );
68
procedure Print_XY ( x, y : int; str : string );
75
TFunction_8x8 = procedure( x, y : Int; c : char );
77
TByte = array[0..0] of Byte;
82
Print_8x8 : TFunction_8x8;
85
Font_8x8 : array[0..2047] of Byte
87
$00, $00, $00, $00, $00, $00, $00, $00,
88
$7E, $81, $A5, $81, $BD, $99, $81, $7E,
89
$7E, $FF, $DB, $FF, $C3, $E7, $FF, $7E,
90
$6C, $FE, $FE, $FE, $7C, $38, $10, $00,
91
$10, $38, $7C, $FE, $7C, $38, $10, $00,
92
$38, $7C, $38, $FE, $FE, $92, $10, $7C,
93
$00, $10, $38, $7C, $FE, $7C, $38, $7C,
94
$00, $00, $18, $3C, $3C, $18, $00, $00,
95
$FF, $FF, $E7, $C3, $C3, $E7, $FF, $FF,
96
$00, $3C, $66, $42, $42, $66, $3C, $00,
97
$FF, $C3, $99, $BD, $BD, $99, $C3, $FF,
98
$0F, $07, $0F, $7D, $CC, $CC, $CC, $78,
99
$3C, $66, $66, $66, $3C, $18, $7E, $18,
100
$3F, $33, $3F, $30, $30, $70, $F0, $E0,
101
$7F, $63, $7F, $63, $63, $67, $E6, $C0,
102
$99, $5A, $3C, $E7, $E7, $3C, $5A, $99,
103
$80, $E0, $F8, $FE, $F8, $E0, $80, $00,
104
$02, $0E, $3E, $FE, $3E, $0E, $02, $00,
105
$18, $3C, $7E, $18, $18, $7E, $3C, $18,
106
$66, $66, $66, $66, $66, $00, $66, $00,
107
$7F, $DB, $DB, $7B, $1B, $1B, $1B, $00,
108
$3E, $63, $38, $6C, $6C, $38, $86, $FC,
109
$00, $00, $00, $00, $7E, $7E, $7E, $00,
110
$18, $3C, $7E, $18, $7E, $3C, $18, $FF,
111
$18, $3C, $7E, $18, $18, $18, $18, $00,
112
$18, $18, $18, $18, $7E, $3C, $18, $00,
113
$00, $18, $0C, $FE, $0C, $18, $00, $00,
114
$00, $30, $60, $FE, $60, $30, $00, $00,
115
$00, $00, $C0, $C0, $C0, $FE, $00, $00,
116
$00, $24, $66, $FF, $66, $24, $00, $00,
117
$00, $18, $3C, $7E, $FF, $FF, $00, $00,
118
$00, $FF, $FF, $7E, $3C, $18, $00, $00,
119
$00, $00, $00, $00, $00, $00, $00, $00,
120
$18, $3C, $3C, $18, $18, $00, $18, $00,
121
$6C, $6C, $6C, $00, $00, $00, $00, $00,
122
$6C, $6C, $FE, $6C, $FE, $6C, $6C, $00,
123
$18, $7E, $C0, $7C, $06, $FC, $18, $00,
124
$00, $C6, $CC, $18, $30, $66, $C6, $00,
125
$38, $6C, $38, $76, $DC, $CC, $76, $00,
126
$30, $30, $60, $00, $00, $00, $00, $00,
127
$18, $30, $60, $60, $60, $30, $18, $00,
128
$60, $30, $18, $18, $18, $30, $60, $00,
129
$00, $66, $3C, $FF, $3C, $66, $00, $00,
130
$00, $18, $18, $7E, $18, $18, $00, $00,
131
$00, $00, $00, $00, $00, $18, $18, $30,
132
$00, $00, $00, $7E, $00, $00, $00, $00,
133
$00, $00, $00, $00, $00, $18, $18, $00,
134
$06, $0C, $18, $30, $60, $C0, $80, $00,
135
$7C, $CE, $DE, $F6, $E6, $C6, $7C, $00,
136
$30, $70, $30, $30, $30, $30, $FC, $00,
137
$78, $CC, $0C, $38, $60, $CC, $FC, $00,
138
$78, $CC, $0C, $38, $0C, $CC, $78, $00,
139
$1C, $3C, $6C, $CC, $FE, $0C, $1E, $00,
140
$FC, $C0, $F8, $0C, $0C, $CC, $78, $00,
141
$38, $60, $C0, $F8, $CC, $CC, $78, $00,
142
$FC, $CC, $0C, $18, $30, $30, $30, $00,
143
$78, $CC, $CC, $78, $CC, $CC, $78, $00,
144
$78, $CC, $CC, $7C, $0C, $18, $70, $00,
145
$00, $18, $18, $00, $00, $18, $18, $00,
146
$00, $18, $18, $00, $00, $18, $18, $30,
147
$18, $30, $60, $C0, $60, $30, $18, $00,
148
$00, $00, $7E, $00, $7E, $00, $00, $00,
149
$60, $30, $18, $0C, $18, $30, $60, $00,
150
$3C, $66, $0C, $18, $18, $00, $18, $00,
151
$7C, $C6, $DE, $DE, $DC, $C0, $7C, $00,
152
$30, $78, $CC, $CC, $FC, $CC, $CC, $00,
153
$FC, $66, $66, $7C, $66, $66, $FC, $00,
154
$3C, $66, $C0, $C0, $C0, $66, $3C, $00,
155
$F8, $6C, $66, $66, $66, $6C, $F8, $00,
156
$FE, $62, $68, $78, $68, $62, $FE, $00,
157
$FE, $62, $68, $78, $68, $60, $F0, $00,
158
$3C, $66, $C0, $C0, $CE, $66, $3A, $00,
159
$CC, $CC, $CC, $FC, $CC, $CC, $CC, $00,
160
$78, $30, $30, $30, $30, $30, $78, $00,
161
$1E, $0C, $0C, $0C, $CC, $CC, $78, $00,
162
$E6, $66, $6C, $78, $6C, $66, $E6, $00,
163
$F0, $60, $60, $60, $62, $66, $FE, $00,
164
$C6, $EE, $FE, $FE, $D6, $C6, $C6, $00,
165
$C6, $E6, $F6, $DE, $CE, $C6, $C6, $00,
166
$38, $6C, $C6, $C6, $C6, $6C, $38, $00,
167
$FC, $66, $66, $7C, $60, $60, $F0, $00,
168
$7C, $C6, $C6, $C6, $D6, $7C, $0E, $00,
169
$FC, $66, $66, $7C, $6C, $66, $E6, $00,
170
$7C, $C6, $E0, $78, $0E, $C6, $7C, $00,
171
$FC, $B4, $30, $30, $30, $30, $78, $00,
172
$CC, $CC, $CC, $CC, $CC, $CC, $FC, $00,
173
$CC, $CC, $CC, $CC, $CC, $78, $30, $00,
174
$C6, $C6, $C6, $C6, $D6, $FE, $6C, $00,
175
$C6, $C6, $6C, $38, $6C, $C6, $C6, $00,
176
$CC, $CC, $CC, $78, $30, $30, $78, $00,
177
$FE, $C6, $8C, $18, $32, $66, $FE, $00,
178
$78, $60, $60, $60, $60, $60, $78, $00,
179
$C0, $60, $30, $18, $0C, $06, $02, $00,
180
$78, $18, $18, $18, $18, $18, $78, $00,
181
$10, $38, $6C, $C6, $00, $00, $00, $00,
182
$00, $00, $00, $00, $00, $00, $00, $FF,
183
$30, $30, $18, $00, $00, $00, $00, $00,
184
$00, $00, $78, $0C, $7C, $CC, $76, $00,
185
$E0, $60, $60, $7C, $66, $66, $DC, $00,
186
$00, $00, $78, $CC, $C0, $CC, $78, $00,
187
$1C, $0C, $0C, $7C, $CC, $CC, $76, $00,
188
$00, $00, $78, $CC, $FC, $C0, $78, $00,
189
$38, $6C, $64, $F0, $60, $60, $F0, $00,
190
$00, $00, $76, $CC, $CC, $7C, $0C, $F8,
191
$E0, $60, $6C, $76, $66, $66, $E6, $00,
192
$30, $00, $70, $30, $30, $30, $78, $00,
193
$0C, $00, $1C, $0C, $0C, $CC, $CC, $78,
194
$E0, $60, $66, $6C, $78, $6C, $E6, $00,
195
$70, $30, $30, $30, $30, $30, $78, $00,
196
$00, $00, $CC, $FE, $FE, $D6, $D6, $00,
197
$00, $00, $B8, $CC, $CC, $CC, $CC, $00,
198
$00, $00, $78, $CC, $CC, $CC, $78, $00,
199
$00, $00, $DC, $66, $66, $7C, $60, $F0,
200
$00, $00, $76, $CC, $CC, $7C, $0C, $1E,
201
$00, $00, $DC, $76, $62, $60, $F0, $00,
202
$00, $00, $7C, $C0, $70, $1C, $F8, $00,
203
$10, $30, $FC, $30, $30, $34, $18, $00,
204
$00, $00, $CC, $CC, $CC, $CC, $76, $00,
205
$00, $00, $CC, $CC, $CC, $78, $30, $00,
206
$00, $00, $C6, $C6, $D6, $FE, $6C, $00,
207
$00, $00, $C6, $6C, $38, $6C, $C6, $00,
208
$00, $00, $CC, $CC, $CC, $7C, $0C, $F8,
209
$00, $00, $FC, $98, $30, $64, $FC, $00,
210
$1C, $30, $30, $E0, $30, $30, $1C, $00,
211
$18, $18, $18, $00, $18, $18, $18, $00,
212
$E0, $30, $30, $1C, $30, $30, $E0, $00,
213
$76, $DC, $00, $00, $00, $00, $00, $00,
214
$00, $10, $38, $6C, $C6, $C6, $FE, $00,
215
$7C, $C6, $C0, $C6, $7C, $0C, $06, $7C,
216
$00, $CC, $00, $CC, $CC, $CC, $76, $00,
217
$1C, $00, $78, $CC, $FC, $C0, $78, $00,
218
$7E, $81, $3C, $06, $3E, $66, $3B, $00,
219
$CC, $00, $78, $0C, $7C, $CC, $76, $00,
220
$E0, $00, $78, $0C, $7C, $CC, $76, $00,
221
$30, $30, $78, $0C, $7C, $CC, $76, $00,
222
$00, $00, $7C, $C6, $C0, $78, $0C, $38,
223
$7E, $81, $3C, $66, $7E, $60, $3C, $00,
224
$CC, $00, $78, $CC, $FC, $C0, $78, $00,
225
$E0, $00, $78, $CC, $FC, $C0, $78, $00,
226
$CC, $00, $70, $30, $30, $30, $78, $00,
227
$7C, $82, $38, $18, $18, $18, $3C, $00,
228
$E0, $00, $70, $30, $30, $30, $78, $00,
229
$C6, $10, $7C, $C6, $FE, $C6, $C6, $00,
230
$30, $30, $00, $78, $CC, $FC, $CC, $00,
231
$1C, $00, $FC, $60, $78, $60, $FC, $00,
232
$00, $00, $7F, $0C, $7F, $CC, $7F, $00,
233
$3E, $6C, $CC, $FE, $CC, $CC, $CE, $00,
234
$78, $84, $00, $78, $CC, $CC, $78, $00,
235
$00, $CC, $00, $78, $CC, $CC, $78, $00,
236
$00, $E0, $00, $78, $CC, $CC, $78, $00,
237
$78, $84, $00, $CC, $CC, $CC, $76, $00,
238
$00, $E0, $00, $CC, $CC, $CC, $76, $00,
239
$00, $CC, $00, $CC, $CC, $7C, $0C, $F8,
240
$C3, $18, $3C, $66, $66, $3C, $18, $00,
241
$CC, $00, $CC, $CC, $CC, $CC, $78, $00,
242
$18, $18, $7E, $C0, $C0, $7E, $18, $18,
243
$38, $6C, $64, $F0, $60, $E6, $FC, $00,
244
$CC, $CC, $78, $30, $FC, $30, $FC, $30,
245
$F8, $CC, $CC, $FA, $C6, $CF, $C6, $C3,
246
$0E, $1B, $18, $3C, $18, $18, $D8, $70,
247
$1C, $00, $78, $0C, $7C, $CC, $76, $00,
248
$38, $00, $70, $30, $30, $30, $78, $00,
249
$00, $1C, $00, $78, $CC, $CC, $78, $00,
250
$00, $1C, $00, $CC, $CC, $CC, $76, $00,
251
$00, $F8, $00, $B8, $CC, $CC, $CC, $00,
252
$FC, $00, $CC, $EC, $FC, $DC, $CC, $00,
253
$3C, $6C, $6C, $3E, $00, $7E, $00, $00,
254
$38, $6C, $6C, $38, $00, $7C, $00, $00,
255
$18, $00, $18, $18, $30, $66, $3C, $00,
256
$00, $00, $00, $FC, $C0, $C0, $00, $00,
257
$00, $00, $00, $FC, $0C, $0C, $00, $00,
258
$C6, $CC, $D8, $36, $6B, $C2, $84, $0F,
259
$C3, $C6, $CC, $DB, $37, $6D, $CF, $03,
260
$18, $00, $18, $18, $3C, $3C, $18, $00,
261
$00, $33, $66, $CC, $66, $33, $00, $00,
262
$00, $CC, $66, $33, $66, $CC, $00, $00,
263
$22, $88, $22, $88, $22, $88, $22, $88,
264
$55, $AA, $55, $AA, $55, $AA, $55, $AA,
265
$DB, $F6, $DB, $6F, $DB, $7E, $D7, $ED,
266
$18, $18, $18, $18, $18, $18, $18, $18,
267
$18, $18, $18, $18, $F8, $18, $18, $18,
268
$18, $18, $F8, $18, $F8, $18, $18, $18,
269
$36, $36, $36, $36, $F6, $36, $36, $36,
270
$00, $00, $00, $00, $FE, $36, $36, $36,
271
$00, $00, $F8, $18, $F8, $18, $18, $18,
272
$36, $36, $F6, $06, $F6, $36, $36, $36,
273
$36, $36, $36, $36, $36, $36, $36, $36,
274
$00, $00, $FE, $06, $F6, $36, $36, $36,
275
$36, $36, $F6, $06, $FE, $00, $00, $00,
276
$36, $36, $36, $36, $FE, $00, $00, $00,
277
$18, $18, $F8, $18, $F8, $00, $00, $00,
278
$00, $00, $00, $00, $F8, $18, $18, $18,
279
$18, $18, $18, $18, $1F, $00, $00, $00,
280
$18, $18, $18, $18, $FF, $00, $00, $00,
281
$00, $00, $00, $00, $FF, $18, $18, $18,
282
$18, $18, $18, $18, $1F, $18, $18, $18,
283
$00, $00, $00, $00, $FF, $00, $00, $00,
284
$18, $18, $18, $18, $FF, $18, $18, $18,
285
$18, $18, $1F, $18, $1F, $18, $18, $18,
286
$36, $36, $36, $36, $37, $36, $36, $36,
287
$36, $36, $37, $30, $3F, $00, $00, $00,
288
$00, $00, $3F, $30, $37, $36, $36, $36,
289
$36, $36, $F7, $00, $FF, $00, $00, $00,
290
$00, $00, $FF, $00, $F7, $36, $36, $36,
291
$36, $36, $37, $30, $37, $36, $36, $36,
292
$00, $00, $FF, $00, $FF, $00, $00, $00,
293
$36, $36, $F7, $00, $F7, $36, $36, $36,
294
$18, $18, $FF, $00, $FF, $00, $00, $00,
295
$36, $36, $36, $36, $FF, $00, $00, $00,
296
$00, $00, $FF, $00, $FF, $18, $18, $18,
297
$00, $00, $00, $00, $FF, $36, $36, $36,
298
$36, $36, $36, $36, $3F, $00, $00, $00,
299
$18, $18, $1F, $18, $1F, $00, $00, $00,
300
$00, $00, $1F, $18, $1F, $18, $18, $18,
301
$00, $00, $00, $00, $3F, $36, $36, $36,
302
$36, $36, $36, $36, $FF, $36, $36, $36,
303
$18, $18, $FF, $18, $FF, $18, $18, $18,
304
$18, $18, $18, $18, $F8, $00, $00, $00,
305
$00, $00, $00, $00, $1F, $18, $18, $18,
306
$FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF,
307
$00, $00, $00, $00, $FF, $FF, $FF, $FF,
308
$F0, $F0, $F0, $F0, $F0, $F0, $F0, $F0,
309
$0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F,
310
$FF, $FF, $FF, $FF, $00, $00, $00, $00,
311
$00, $00, $76, $DC, $C8, $DC, $76, $00,
312
$00, $78, $CC, $F8, $CC, $F8, $C0, $C0,
313
$00, $FC, $CC, $C0, $C0, $C0, $C0, $00,
314
$00, $00, $FE, $6C, $6C, $6C, $6C, $00,
315
$FC, $CC, $60, $30, $60, $CC, $FC, $00,
316
$00, $00, $7E, $D8, $D8, $D8, $70, $00,
317
$00, $66, $66, $66, $66, $7C, $60, $C0,
318
$00, $76, $DC, $18, $18, $18, $18, $00,
319
$FC, $30, $78, $CC, $CC, $78, $30, $FC,
320
$38, $6C, $C6, $FE, $C6, $6C, $38, $00,
321
$38, $6C, $C6, $C6, $6C, $6C, $EE, $00,
322
$1C, $30, $18, $7C, $CC, $CC, $78, $00,
323
$00, $00, $7E, $DB, $DB, $7E, $00, $00,
324
$06, $0C, $7E, $DB, $DB, $7E, $60, $C0,
325
$38, $60, $C0, $F8, $C0, $60, $38, $00,
326
$78, $CC, $CC, $CC, $CC, $CC, $CC, $00,
327
$00, $7E, $00, $7E, $00, $7E, $00, $00,
328
$18, $18, $7E, $18, $18, $00, $7E, $00,
329
$60, $30, $18, $30, $60, $00, $FC, $00,
330
$18, $30, $60, $30, $18, $00, $FC, $00,
331
$0E, $1B, $1B, $18, $18, $18, $18, $18,
332
$18, $18, $18, $18, $18, $D8, $D8, $70,
333
$18, $18, $00, $7E, $00, $18, $18, $00,
334
$00, $76, $DC, $00, $76, $DC, $00, $00,
335
$38, $6C, $6C, $38, $00, $00, $00, $00,
336
$00, $00, $00, $18, $18, $00, $00, $00,
337
$00, $00, $00, $00, $18, $00, $00, $00,
338
$0F, $0C, $0C, $0C, $EC, $6C, $3C, $1C,
339
$58, $6C, $6C, $6C, $6C, $00, $00, $00,
340
$70, $98, $30, $60, $F8, $00, $00, $00,
341
$00, $00, $3C, $3C, $3C, $3C, $00, $00,
342
$00, $00, $00, $00, $00, $00, $00, $00
346
procedure Print_8x8_Mono( x, y : Int; c : char );
351
offset := x + y*Vio_ScanLineWidth*8;
352
bitm := @Font_8x8[ ord(c)*8 ];
356
Vio^[offset] := bitm^[i];
357
inc( offset, Vio_ScanLineWidth );
361
procedure Print_8x8_Gray( x, y : Int; c : char );
363
offset, i, bit : Int;
367
offset := ( x + y*Vio_ScanLineWidth )*8;
368
bitm := @font_8x8[ ord(c)*8 ];
375
if ( bit and bitm^[i] <> 0 ) then Vio^[offset] := $FF
376
else Vio^[offset] := $00;
381
inc( offset, Vio_ScanLineWidth-8 );
387
function Set_Graph_Screen( mode : Int ): boolean;
389
Set_Graph_Screen := False;
396
Graphics_Mode_Mono : begin
397
if not Driver_Set_Graphics(mode) then exit;
398
gwindow_width := vio_ScanLineWidth;
399
gwindow_height := vio_Height div 8;
401
Print_8x8 := Print_8x8_Mono;
404
Graphics_Mode_Gray : begin
405
if not Driver_Set_Graphics(mode) then exit;
406
gwindow_width := vio_ScanLineWidth div 8;
407
gwindow_height := vio_Height div 8;
409
Print_8x8 := Print_8x8_Gray;
415
Set_Graph_Screen := True;
419
function Restore_Screen : boolean;
427
Restore_Screen := Driver_Restore_Mode;
430
procedure Display_Bitmap_On_Screen;
432
Driver_Display_Bitmap( buff, line, col );
435
procedure Goto_XY( x, y : Int );
441
procedure Print_Str( str : string );
445
for i := 1 to length(str) do
452
if gcursor_y > gwindow_height then gcursor_y := 0;
455
Print_8x8( gcursor_x, gcursor_y, str[i] );
457
if gcursor_x >= gwindow_width then
461
if gcursor_y >= gwindow_height then gcursor_y := 0;
467
procedure Print_XY( x, y : Int; str : string );