]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - tools/tools/vt/mkkfont/mkkfont.c
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / tools / tools / vt / mkkfont / mkkfont.c
1 /*-
2  * Copyright (c) 2009 The FreeBSD Foundation
3  * All rights reserved.
4  *
5  * This software was developed by Ed Schouten under sponsorship from the
6  * FreeBSD Foundation.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD$");
32
33 #include <sys/endian.h>
34 #include <sys/param.h>
35
36 #include <stdint.h>
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include <string.h>
40
41 struct file_mapping {
42         uint32_t        source;
43         uint16_t        destination;
44         uint16_t        length;
45 } __packed;
46
47 struct file_header {
48         uint8_t         magic[8];
49         uint8_t         width;
50         uint8_t         height;
51         uint16_t        pad;
52         uint32_t        glyph_count;
53         uint32_t        map_count[4];
54 } __packed;
55
56 static int
57 print_glyphs(struct file_header *fh)
58 {
59         unsigned int gbytes, glyph_count, j, k, total;
60         uint8_t *gbuf;
61
62         gbytes = howmany(fh->width, 8) * fh->height;
63         glyph_count = be32toh(fh->glyph_count);
64
65         printf("\nstatic uint8_t font_bytes[%u * %u] = {", glyph_count, gbytes);
66         total = glyph_count * gbytes;
67         gbuf = malloc(total);
68
69         if (fread(gbuf, total, 1, stdin) != 1) {
70                 perror("glyph");
71                 return (1);
72         }
73
74         for (j = 0; j < total; j += 12) {
75                 for (k = 0; k < 12 && k < total - j; k++) {
76                         printf(k == 0 ? "\n\t" : " ");
77                         printf("0x%02hhx,", gbuf[j + k]);
78                 }
79         }
80
81         free(gbuf);
82         printf("\n};\n");
83
84         return (0);
85 }
86
87 static const char *map_names[4] = {
88     "normal", "normal_right", "bold", "bold_right" };
89
90 static int
91 print_mappings(struct file_header *fh, int map_index)
92 {
93         struct file_mapping fm;
94         unsigned int nmappings, i, col = 0;
95
96         
97         nmappings = be32toh(fh->map_count[map_index]);
98
99         if (nmappings == 0)
100                 return (0);
101
102         printf("\nstatic struct vt_font_map font_mapping_%s[%u] = {",
103             map_names[map_index], nmappings);
104
105         for (i = 0; i < nmappings; i++) {
106                 if (fread(&fm, sizeof fm, 1, stdin) != 1) {
107                         perror("mapping");
108                         return (1);
109                 }
110
111                 printf(col == 0 ? "\n\t" : " ");
112                 printf("{ 0x%04x, 0x%04x, 0x%02x },",
113                     be32toh(fm.source), be16toh(fm.destination),
114                     be16toh(fm.length));
115                 col = (col + 1) % 2;
116         }
117
118         printf("\n};\n");
119
120         return (0);
121 }
122
123 static int
124 print_info(struct file_header *fh)
125 {
126         unsigned int i;
127
128         printf(
129             "\nstruct vt_font vt_font_default = {\n"
130             "\t.vf_width\t\t= %u,\n"
131             "\t.vf_height\t\t= %u,\n"
132             "\t.vf_bytes\t\t= font_bytes,\n",
133             fh->width, fh->height);
134
135         printf("\t.vf_map\t\t\t= {\n");
136         for (i = 0; i < 4; i++) {
137                 if (fh->map_count[i] > 0)
138                         printf("\t\t\t\t    font_mapping_%s,\n", map_names[i]);
139                 else
140                         printf("\t\t\t\t    NULL,\n");
141         }
142         printf("\t\t\t\t  },\n");
143         printf("\t.vf_map_count\t\t= { %u, %u, %u, %u },\n",
144             be32toh(fh->map_count[0]),
145             be32toh(fh->map_count[1]),
146             be32toh(fh->map_count[2]),
147             be32toh(fh->map_count[3]));
148         printf("\t.vf_refcount\t\t= 1,\n};\n");
149
150         return (0);
151 }
152
153 int
154 main(int argc __unused, char *argv[] __unused)
155 {
156         struct file_header fh;
157         unsigned int i;
158
159         if (fread(&fh, sizeof fh, 1, stdin) != 1) {
160                 perror("file_header");
161                 return (1);
162         }
163
164         if (memcmp(fh.magic, "VFNT0002", 8) != 0) {
165                 fprintf(stderr, "Bad magic\n");
166                 return (1);
167         }
168
169         printf("#include <dev/vt/vt.h>\n");
170
171         if (print_glyphs(&fh) != 0)
172                 return (1);
173         for (i = 0; i < 4; i++)
174                 if (print_mappings(&fh, i) != 0)
175                         return (1);
176         if (print_info(&fh) != 0)
177                 return (1);
178
179         return (0);
180 }