[9] | 1 | /* loadfont.c - Load custom font into EGA, VGA video card
|
---|
| 2 | *
|
---|
| 3 | * Author: Hrvoje Stipetic (hs@hck.hr) Jun-1995.
|
---|
| 4 | *
|
---|
| 5 | */
|
---|
| 6 |
|
---|
| 7 | #include <sys/types.h>
|
---|
| 8 | #include <fcntl.h>
|
---|
| 9 | #include <unistd.h>
|
---|
| 10 | #include <stdlib.h>
|
---|
| 11 | #include <string.h>
|
---|
| 12 | #include <errno.h>
|
---|
| 13 | #include <termios.h>
|
---|
| 14 | #include <sys/ioctl.h>
|
---|
| 15 |
|
---|
| 16 | void tell(char *s)
|
---|
| 17 | {
|
---|
| 18 | write(2, s, strlen(s));
|
---|
| 19 | }
|
---|
| 20 |
|
---|
| 21 | char *itoa(unsigned i)
|
---|
| 22 | {
|
---|
| 23 | static char a[3*sizeof(int)];
|
---|
| 24 | char *p = a+sizeof(a)-1;
|
---|
| 25 |
|
---|
| 26 | do {
|
---|
| 27 | *--p = '0' + i%10;
|
---|
| 28 | } while ((i /= 10) > 0);
|
---|
| 29 |
|
---|
| 30 | return p;
|
---|
| 31 | }
|
---|
| 32 |
|
---|
| 33 | void report(char *say)
|
---|
| 34 | {
|
---|
| 35 | int err = errno;
|
---|
| 36 | tell("loadfont: ");
|
---|
| 37 | if (say != NULL) {
|
---|
| 38 | tell(say);
|
---|
| 39 | tell(": ");
|
---|
| 40 | }
|
---|
| 41 | tell(strerror(err));
|
---|
| 42 | tell("\n");
|
---|
| 43 | }
|
---|
| 44 |
|
---|
| 45 | void usage(void)
|
---|
| 46 | {
|
---|
| 47 | tell("Usage: loadfont fontfile\n");
|
---|
| 48 | exit(1);
|
---|
| 49 | }
|
---|
| 50 |
|
---|
| 51 |
|
---|
| 52 | int main(int argc, char *argv[])
|
---|
| 53 | {
|
---|
| 54 | static u8_t font[256][32];
|
---|
| 55 | static u8_t font_file[256 * (16+14+8) + 1];
|
---|
| 56 | u8_t *ff;
|
---|
| 57 | int fd, size, tsize, ch, ln;
|
---|
| 58 | struct winsize ws;
|
---|
| 59 |
|
---|
| 60 |
|
---|
| 61 | if (argc != 2)
|
---|
| 62 | usage();
|
---|
| 63 |
|
---|
| 64 | if ((fd = open(argv[1], O_RDONLY)) < 0) {
|
---|
| 65 | report(argv[1]);
|
---|
| 66 | exit(1);
|
---|
| 67 | }
|
---|
| 68 |
|
---|
| 69 | switch (read(fd, font_file, sizeof(font_file))) {
|
---|
| 70 | case 256 * 8:
|
---|
| 71 | size = 8;
|
---|
| 72 | break;
|
---|
| 73 | case 256 * 14:
|
---|
| 74 | size = 14;
|
---|
| 75 | break;
|
---|
| 76 | case 256 * 16:
|
---|
| 77 | size = 16;
|
---|
| 78 | break;
|
---|
| 79 | case 256 * (16+14+8):
|
---|
| 80 | size = 0;
|
---|
| 81 | break;
|
---|
| 82 | case -1:
|
---|
| 83 | report(argv[1]);
|
---|
| 84 | exit(1);
|
---|
| 85 | default:
|
---|
| 86 | tell("loadfont: ");
|
---|
| 87 | tell(argv[1]);
|
---|
| 88 | tell(": fontfile is not an 8x8, 8x14, 8x16, or compound font\n");
|
---|
| 89 | exit(1);
|
---|
| 90 | }
|
---|
| 91 | close(fd);
|
---|
| 92 |
|
---|
| 93 | if (ioctl(0, TIOCGWINSZ, &ws) < 0 || (errno= ENOTTY, ws.ws_row == 0)) {
|
---|
| 94 | report(NULL);
|
---|
| 95 | exit(1);
|
---|
| 96 | }
|
---|
| 97 | tsize = ws.ws_ypixel / ws.ws_row;
|
---|
| 98 |
|
---|
| 99 | if (size == 0) {
|
---|
| 100 | if (tsize >= 16) {
|
---|
| 101 | ff = font_file + 256 * (0);
|
---|
| 102 | } else
|
---|
| 103 | if (tsize >= 14) {
|
---|
| 104 | ff = font_file + 256 * (16);
|
---|
| 105 | } else {
|
---|
| 106 | ff = font_file + 256 * (16 + 14);
|
---|
| 107 | }
|
---|
| 108 | size = tsize;
|
---|
| 109 | } else {
|
---|
| 110 | ff = font_file;
|
---|
| 111 | }
|
---|
| 112 |
|
---|
| 113 | for (ch = 0; ch < 256; ch++) {
|
---|
| 114 | for (ln = 0; ln < size; ln++) font[ch][ln] = ff[ch * size + ln];
|
---|
| 115 | }
|
---|
| 116 |
|
---|
| 117 | if (ioctl(0, TIOCSFON, font) < 0) {
|
---|
| 118 | report(NULL);
|
---|
| 119 | exit(1);
|
---|
| 120 | }
|
---|
| 121 | exit(0);
|
---|
| 122 | }
|
---|