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 } 181