1 /* $NetBSD: wsfont.c,v 1.44 2007/02/02 02:10:24 ober Exp $ */
4 * Copyright (c) 1999, 2000, 2001, 2002 The NetBSD Foundation, Inc.
7 * This code is derived from software contributed to The NetBSD Foundation
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
32 #include <sys/cdefs.h>
33 __KERNEL_RCSID(0, "$NetBSD: wsfont.c,v 1.44 2007/02/02 02:10:24 ober Exp $");
35 #include "opt_wsfont.h"
37 #include <sys/param.h>
38 #include <sys/systm.h>
40 #include <sys/malloc.h>
41 #include <sys/queue.h>
43 #include <dev/wscons/wsdisplayvar.h>
44 #include <dev/wscons/wsconsio.h>
45 #include <dev/wsfont/wsfont.h>
47 #include "wsfont_glue.h" /* NRASOPS_ROTATION */
53 #include <dev/wsfont/qvss8x15.h>
56 #ifdef FONT_GALLANT12x22
58 #include <dev/wsfont/gallant12x22.h>
61 #ifdef FONT_LUCIDA16x29
63 #include <dev/wsfont/lucida16x29.h>
68 #include <dev/wsfont/vt220l8x8.h>
71 #ifdef FONT_VT220L8x10
73 #include <dev/wsfont/vt220l8x10.h>
76 #ifdef FONT_VT220L8x16
78 #include <dev/wsfont/vt220l8x16.h>
81 #ifdef FONT_VT220ISO8x16
83 #include <dev/wsfont/vt220iso8x16.h>
86 #ifdef FONT_VT220KOI8x10_KOI8_R
88 #include <dev/wsfont/vt220koi8x10.h>
91 #ifdef FONT_VT220KOI8x10_KOI8_U
94 #include <dev/wsfont/vt220koi8x10.h>
100 #include <dev/wsfont/sony8x16.h>
103 #ifdef FONT_SONY12x24
105 #include <dev/wsfont/sony12x24.h>
108 #ifdef FONT_OMRON12x20
110 #include <dev/wsfont/omron12x20.h>
113 /* Make sure we always have at least one font. */
116 #define FONT_BOLD8x16 1
120 #include <dev/wsfont/bold8x16.h>
123 #define WSFONT_IDENT_MASK 0xffffff00
124 #define WSFONT_IDENT_SHIFT 8
125 #define WSFONT_BITO_MASK 0x000000f0
126 #define WSFONT_BITO_SHIFT 4
127 #define WSFONT_BYTEO_MASK 0x0000000f
128 #define WSFONT_BYTEO_SHIFT 0
130 #define WSFONT_BUILTIN 0x01 /* In wsfont.c */
131 #define WSFONT_STATIC 0x02 /* Font structures not malloc()ed */
132 #define WSFONT_COPY 0x04 /* Copy of existing font in table */
134 /* Placeholder struct used for linked list */
136 TAILQ_ENTRY(font
) chain
;
137 struct wsdisplay_font
*font
;
143 /* Our list of built-in fonts */
144 static struct font builtin_fonts
[] = {
146 { { NULL
, NULL
}, &bold8x16
, 0, 0, WSFONT_STATIC
| WSFONT_BUILTIN
},
149 { { NULL
, NULL
}, &iso8x16
, 0, 0, WSFONT_STATIC
| WSFONT_BUILTIN
},
151 #ifdef FONT_COURIER11x18
152 { { NULL
, NULL
}, &courier11x18
, 0, 0, WSFONT_STATIC
| WSFONT_BUILTIN
},
154 #ifdef FONT_GALLANT12x22
155 { { NULL
, NULL
}, &gallant12x22
, 0, 0, WSFONT_STATIC
| WSFONT_BUILTIN
},
157 #ifdef FONT_LUCIDA16x29
158 { { NULL
, NULL
}, &lucida16x29
, 0, 0, WSFONT_STATIC
| WSFONT_BUILTIN
},
161 { { NULL
, NULL
}, &qvss8x15
, 0, 0, WSFONT_STATIC
| WSFONT_BUILTIN
},
163 #ifdef FONT_VT220L8x8
164 { { NULL
, NULL
}, &vt220l8x8
, 0, 0, WSFONT_STATIC
| WSFONT_BUILTIN
},
166 #ifdef FONT_VT220L8x10
167 { { NULL
, NULL
}, &vt220l8x10
, 0, 0, WSFONT_STATIC
| WSFONT_BUILTIN
},
169 #ifdef FONT_VT220L8x16
170 { { NULL
, NULL
}, &vt220l8x16
, 0, 0, WSFONT_STATIC
| WSFONT_BUILTIN
},
172 #ifdef FONT_VT220ISO8x16
173 { { NULL
, NULL
}, &vt220iso8x16
, 0, 0, WSFONT_STATIC
| WSFONT_BUILTIN
},
175 #ifdef FONT_VT220KOI8x10_KOI8_R
176 { { NULL
, NULL
}, &vt220kr8x10
, 0, 0, WSFONT_STATIC
| WSFONT_BUILTIN
},
178 #ifdef FONT_VT220KOI8x10_KOI8_U
179 { { NULL
, NULL
}, &vt220ku8x10
, 0, 0, WSFONT_STATIC
| WSFONT_BUILTIN
},
182 { { NULL
, NULL
}, &sony8x16
, 0, 0, WSFONT_STATIC
| WSFONT_BUILTIN
},
184 #ifdef FONT_SONY12x24
185 { { NULL
, NULL
}, &sony12x24
, 0, 0, WSFONT_STATIC
| WSFONT_BUILTIN
},
187 #ifdef FONT_OMRON12x20
188 { { NULL
, NULL
}, &omron12x20
, 0, 0, WSFONT_STATIC
| WSFONT_BUILTIN
},
190 { { NULL
, NULL
}, NULL
, 0, 0, 0 },
193 static TAILQ_HEAD(,font
) list
;
196 /* Reverse the bit order in a byte */
197 static const u_char reverse
[256] = {
198 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
199 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
200 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
201 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
202 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
203 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
204 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
205 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
206 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
207 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
208 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
209 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
210 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
211 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
212 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
213 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
214 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
215 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
216 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
217 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
218 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
219 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
220 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
221 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
222 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
223 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
224 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
225 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
226 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
227 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
228 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
229 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
232 static struct font
*wsfont_find0(int, int);
233 static struct font
*wsfont_add0(struct wsdisplay_font
*, int);
234 static void wsfont_revbit(struct wsdisplay_font
*);
235 static void wsfont_revbyte(struct wsdisplay_font
*);
236 static inline int wsfont_make_cookie(int, int, int);
239 wsfont_make_cookie(int cident
, int bito
, int byteo
)
242 return ((cident
& WSFONT_IDENT_MASK
) |
243 (bito
<< WSFONT_BITO_SHIFT
) |
244 (byteo
<< WSFONT_BYTEO_SHIFT
));
248 wsfont_revbit(struct wsdisplay_font
*font
)
252 p
= (u_char
*)font
->data
;
253 m
= p
+ font
->stride
* font
->numchars
* font
->fontheight
;
260 wsfont_revbyte(struct wsdisplay_font
*font
)
265 if (font
->stride
== 1)
268 rp
= (u_char
*)font
->data
;
269 nr
= font
->numchars
* font
->fontheight
;
273 r
= font
->stride
- 1;
287 wsfont_enum(void (*cb
)(const char *, int, int, int))
289 struct wsdisplay_font
*f
;
292 TAILQ_FOREACH(ent
, &list
, chain
) {
294 cb(f
->name
, f
->fontwidth
, f
->fontheight
, f
->stride
);
298 #if NRASOPS_ROTATION > 0
300 struct wsdisplay_font
*wsfont_rotate_internal(struct wsdisplay_font
*);
302 struct wsdisplay_font
*
303 wsfont_rotate_internal(struct wsdisplay_font
*font
)
305 int b
, n
, r
, newstride
;
306 struct wsdisplay_font
*newfont
;
309 /* Duplicate the existing font... */
310 newfont
= malloc(sizeof(*font
), M_DEVBUF
, M_WAITOK
);
316 /* Allocate a buffer big enough for the rotated font. */
317 newstride
= (font
->fontheight
+ 7) / 8;
318 newbits
= malloc(newstride
* font
->fontwidth
* font
->numchars
,
319 M_DEVBUF
, M_WAITOK
|M_ZERO
);
320 if (newbits
== NULL
) {
321 free(newfont
, M_DEVBUF
);
327 /* Rotate the font a bit at a time. */
328 for (n
= 0; n
< font
->numchars
; n
++) {
329 unsigned char *ch
= (unsigned char *)font
->data
+
330 (n
* font
->stride
* font
->fontheight
);
332 for (r
= 0; r
< font
->fontheight
; r
++) {
333 for (b
= 0; b
< font
->fontwidth
; b
++) {
336 rb
= ch
+ (font
->stride
* r
) + (b
/ 8);
337 if (*rb
& (0x80 >> (b
% 8))) {
340 rrb
= newbits
+ newstride
- 1 - (r
/ 8)
341 + (n
* newstride
* font
->fontwidth
)
343 *rrb
|= (1 << (r
% 8));
349 newfont
->data
= newbits
;
351 /* Update font sizes. */
352 newfont
->stride
= newstride
;
353 newfont
->fontwidth
= font
->fontheight
;
354 newfont
->fontheight
= font
->fontwidth
;
356 if (wsfont_add(newfont
, 0) != 0) {
358 * If we seem to have rotated this font already, drop the
361 free(newbits
, M_DEVBUF
);
362 free(newfont
, M_DEVBUF
);
370 wsfont_rotate(int cookie
)
373 struct wsdisplay_font
*font
;
374 struct font
*origfont
;
377 origfont
= wsfont_find0(cookie
, 0xffffffff);
380 font
= wsfont_rotate_internal(origfont
->font
);
384 ncookie
= wsfont_find(font
->name
, font
->fontwidth
, font
->fontheight
,
390 #endif /* NRASOPS_ROTATION */
406 for (i
= 0; builtin_fonts
[i
].font
!= NULL
; i
++, ent
++) {
407 ident
+= (1 << WSFONT_IDENT_SHIFT
);
408 ent
->cookie
= wsfont_make_cookie(ident
,
409 ent
->font
->bitorder
, ent
->font
->byteorder
);
410 TAILQ_INSERT_TAIL(&list
, ent
, chain
);
415 wsfont_find0(int cookie
, int mask
)
419 TAILQ_FOREACH(ent
, &list
, chain
) {
420 if ((ent
->cookie
& mask
) == (cookie
& mask
))
428 wsfont_matches(struct wsdisplay_font
*font
, const char *name
,
429 int width
, int height
, int stride
)
432 if (height
!= 0 && font
->fontheight
!= height
)
435 if (width
!= 0 && font
->fontwidth
!= width
)
438 if (stride
!= 0 && font
->stride
!= stride
)
441 if (name
!= NULL
&& strcmp(font
->name
, name
) != 0)
448 wsfont_find(const char *name
, int width
, int height
, int stride
, int bito
, int byteo
)
452 TAILQ_FOREACH(ent
, &list
, chain
) {
453 if (wsfont_matches(ent
->font
, name
, width
, height
, stride
))
454 return (wsfont_make_cookie(ent
->cookie
, bito
, byteo
));
461 wsfont_add0(struct wsdisplay_font
*font
, int copy
)
466 ent
= malloc(sizeof(struct font
), M_DEVBUF
, M_WAITOK
| M_ZERO
);
468 /* Is this font statically allocated? */
471 ent
->flags
= WSFONT_STATIC
;
476 ent
->font
= malloc(sizeof(struct wsdisplay_font
), M_DEVBUF
,
478 memcpy(ent
->font
, font
, sizeof(*ent
->font
));
480 size
= font
->fontheight
* font
->numchars
* font
->stride
;
481 data
= malloc(size
, M_DEVBUF
, M_WAITOK
);
482 memcpy(data
, font
->data
, size
);
483 ent
->font
->data
= data
;
485 name
= malloc(strlen(font
->name
) + 1, M_DEVBUF
, M_WAITOK
);
486 strlcpy(name
, font
->name
, strlen(font
->name
) + 1);
487 ent
->font
->name
= name
;
490 TAILQ_INSERT_TAIL(&list
, ent
, chain
);
495 wsfont_add(struct wsdisplay_font
*font
, int copy
)
499 /* Don't allow exact duplicates */
500 if (wsfont_find(font
->name
, font
->fontwidth
, font
->fontheight
,
501 font
->stride
, 0, 0) >= 0)
504 ent
= wsfont_add0(font
, copy
);
506 ident
+= (1 << WSFONT_IDENT_SHIFT
);
507 ent
->cookie
= wsfont_make_cookie(ident
, font
->bitorder
,
514 wsfont_remove(int cookie
)
518 if ((ent
= wsfont_find0(cookie
, 0xffffffff)) == NULL
)
521 if ((ent
->flags
& WSFONT_BUILTIN
) != 0 || ent
->lockcount
!= 0)
524 if ((ent
->flags
& WSFONT_STATIC
) == 0) {
525 free(ent
->font
->data
, M_DEVBUF
);
526 free(__UNCONST(ent
->font
->name
), M_DEVBUF
); /*XXXUNCONST*/
527 free(ent
->font
, M_DEVBUF
);
530 TAILQ_REMOVE(&list
, ent
, chain
);
537 wsfont_lock(int cookie
, struct wsdisplay_font
**ptr
)
539 struct font
*ent
, *neu
;
542 if ((ent
= wsfont_find0(cookie
, 0xffffffff)) == NULL
) {
543 if ((ent
= wsfont_find0(cookie
, WSFONT_IDENT_MASK
)) == NULL
)
546 bito
= (cookie
& WSFONT_BITO_MASK
) >> WSFONT_BITO_SHIFT
;
547 byteo
= (cookie
& WSFONT_BYTEO_MASK
) >> WSFONT_BYTEO_SHIFT
;
549 if (ent
->lockcount
!= 0) {
550 neu
= wsfont_add0(ent
->font
, 1);
551 neu
->flags
|= WSFONT_COPY
;
553 aprint_debug("wsfont: font '%s' bito %d byteo %d "
554 "copied to bito %d byteo %d\n",
556 ent
->font
->bitorder
, ent
->font
->byteorder
,
562 if (bito
&& bito
!= ent
->font
->bitorder
) {
563 wsfont_revbit(ent
->font
);
564 ent
->font
->bitorder
= bito
;
567 if (byteo
&& byteo
!= ent
->font
->byteorder
) {
568 wsfont_revbyte(ent
->font
);
569 ent
->font
->byteorder
= byteo
;
572 ent
->cookie
= cookie
;
581 wsfont_unlock(int cookie
)
585 if ((ent
= wsfont_find0(cookie
, 0xffffffff)) == NULL
)
588 if (ent
->lockcount
== 0)
589 panic("wsfont_unlock: font not locked");
591 if (--ent
->lockcount
== 0 && (ent
->flags
& WSFONT_COPY
) != 0)
592 wsfont_remove(cookie
);
598 * Unicode to font encoding mappings
602 * To save memory, font encoding tables use a two level lookup. First the
603 * high byte of the Unicode is used to lookup the level 2 table, then the
604 * low byte indexes that table. Level 2 tables that are not needed are
605 * omitted (NULL), and both level 1 and level 2 tables have base and size
606 * attributes to keep their size down.
609 struct wsfont_level1_glyphmap
{
610 const struct wsfont_level2_glyphmap
**level2
;
611 int base
; /* High byte for first level2 entry */
612 int size
; /* Number of level2 entries */
615 struct wsfont_level2_glyphmap
{
616 int base
; /* Low byte for first character */
617 int size
; /* Number of characters */
618 const void *chars
; /* Pointer to character number entries */
619 int width
; /* Size of each entry in bytes (1,2,4) */
623 NULL, NULL, NULL, NULL, \
624 NULL, NULL, NULL, NULL, \
625 NULL, NULL, NULL, NULL, \
626 NULL, NULL, NULL, NULL
632 static const u_int8_t ibm437_chars_0
[] = {
633 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
634 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
635 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
636 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
637 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
638 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
639 96, 97, 98, 99, 100,101,102,103,104,105,106,107,108,109,110,111,
640 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
641 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
642 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
643 255,173,155,156, 0, 157, 0, 0, 0, 0, 166,174,170, 0, 0, 0,
644 0, 241,253, 0, 0, 0, 0, 249, 0, 0, 167,175,172,171, 0, 168,
645 0, 0, 0, 0, 142,143,146,128, 0, 144, 0, 0, 0, 0, 0, 0,
646 0, 165, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 154, 0, 0, 0,
647 133,160,131, 0, 132,134,145,135,138,130,136,137,141,161,140,139,
648 0, 164,149,162,147, 0, 148,246, 0, 151,163,150,129, 0, 0, 152
651 static const u_int8_t ibm437_chars_1
[] = {
655 static const u_int8_t ibm437_chars_3
[] = {
656 226, 0, 0, 0, 0, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
657 228, 0, 0, 232, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 224,225,
658 0, 235,238, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 227, 0, 0,
662 static const u_int8_t ibm437_chars_32
[] = {
663 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
664 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
665 0, 0, 0, 0, 0, 0, 0, 0, 158
668 static const u_int8_t ibm437_chars_34
[] = {
669 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
670 0, 0, 0, 248,250,251, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0,
671 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
672 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
673 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
674 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0,243,
678 static const u_int8_t ibm437_chars_35
[] = {
679 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
683 static const u_int8_t ibm437_chars_37
[] = {
684 196,205,179,186, 0, 0, 0, 0, 0, 0, 0, 0, 218,213,214,201,
685 191,184,183,187,192,212,211,200,217,190,189,188,195,198, 0, 0,
686 199, 0, 0, 204,180,181, 0, 0, 182, 0, 0, 185,194, 0, 0, 209,
687 210, 0, 0, 203,193, 0, 0, 207,208, 0, 0, 202,197, 0, 0, 216,
688 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0, 0, 0,
689 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
690 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
691 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
692 223, 0, 0, 0, 220, 0, 0, 0, 219, 0, 0, 0, 221, 0, 0, 0,
693 222,176,177,178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
697 static const struct wsfont_level2_glyphmap ibm437_level2_0
=
698 { 0, 256, ibm437_chars_0
, 1 };
700 static const struct wsfont_level2_glyphmap ibm437_level2_1
=
701 { 146, 1, ibm437_chars_1
, 1 };
703 static const struct wsfont_level2_glyphmap ibm437_level2_3
=
704 { 147, 50, ibm437_chars_3
, 1 };
706 static const struct wsfont_level2_glyphmap ibm437_level2_32
=
707 { 127, 41, ibm437_chars_32
, 1 };
709 static const struct wsfont_level2_glyphmap ibm437_level2_34
=
710 { 5, 97, ibm437_chars_34
, 1 };
712 static const struct wsfont_level2_glyphmap ibm437_level2_35
=
713 { 16, 18, ibm437_chars_35
, 1 };
715 static const struct wsfont_level2_glyphmap ibm437_level2_37
=
716 { 0, 161, ibm437_chars_37
, 1 };
718 static const struct wsfont_level2_glyphmap
*ibm437_level1
[] = {
719 &ibm437_level2_0
, &ibm437_level2_1
, NULL
, &ibm437_level2_3
,
720 NULL
, NULL
, NULL
, NULL
,
721 NULL
, NULL
, NULL
, NULL
,
722 NULL
, NULL
, NULL
, NULL
,
723 NULL
, NULL
, NULL
, NULL
,
724 NULL
, NULL
, NULL
, NULL
,
725 NULL
, NULL
, NULL
, NULL
,
726 NULL
, NULL
, NULL
, NULL
,
727 &ibm437_level2_32
, NULL
, &ibm437_level2_34
, &ibm437_level2_35
,
728 NULL
, &ibm437_level2_37
734 static const u_int8_t iso7_chars_0
[] = {
735 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
736 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
737 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
738 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
739 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
740 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
741 96, 97, 98, 99, 100,101,102,103,104,105,106,107,108,109,110,111,
742 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
743 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
744 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
745 160, 0, 0, 163, 0, 0, 166,167,168,169, 0, 171,172,173, 0, 0,
746 176,177,178,179,180, 0, 0, 183, 0, 0, 0, 187, 0, 189
749 static const u_int8_t iso7_chars_3
[] = {
750 182, 0, 184,185,186, 0, 188, 0, 190,191,192,193,194,195,196,197,
751 198,199,200,201,202,203,204,205,206,207,208,209, 0, 211,212,213,
752 214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,
753 230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,
754 246,247,248,249,250,251,252,253,254, 0, 0, 0, 0, 0, 0, 0,
755 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
756 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181
759 static const u_int8_t iso7_chars_32
[] = {
760 175, 0, 0, 0, 0, 162, 0, 161
763 static const struct wsfont_level2_glyphmap iso7_level2_0
=
764 { 0, 190, iso7_chars_0
, 1 };
766 static const struct wsfont_level2_glyphmap iso7_level2_3
=
767 { 134, 111, iso7_chars_3
, 1 };
769 static const struct wsfont_level2_glyphmap iso7_level2_32
=
770 { 20, 8, iso7_chars_32
, 1 };
772 static const struct wsfont_level2_glyphmap
*iso7_level1
[] = {
773 &iso7_level2_0
, NULL
, NULL
, &iso7_level2_3
,
774 NULL
, NULL
, NULL
, NULL
,
775 NULL
, NULL
, NULL
, NULL
,
776 NULL
, NULL
, NULL
, NULL
,
777 NULL
, NULL
, NULL
, NULL
,
778 NULL
, NULL
, NULL
, NULL
,
779 NULL
, NULL
, NULL
, NULL
,
780 NULL
, NULL
, NULL
, NULL
,
784 static const struct wsfont_level1_glyphmap encodings
[] = {
785 { NULL
, 0, 0 }, /* WSDISPLAY_FONTENC_ISO */
786 { ibm437_level1
, 0, 38 }, /* WSDISPLAY_FONTENC_IBM */
787 { NULL
, 0, 0 }, /* WSDISPLAY_FONTENC_PCVT */
788 { iso7_level1
, 0, 33 }, /* WSDISPLAY_FONTENC_ISO7 */
791 #define MAX_ENCODING (sizeof(encodings) / sizeof(encodings[0]))
794 * Remap Unicode character to glyph
797 wsfont_map_unichar(struct wsdisplay_font
*font
, int c
)
799 const struct wsfont_level1_glyphmap
*map1
;
800 const struct wsfont_level2_glyphmap
*map2
;
803 if (font
->encoding
== WSDISPLAY_FONTENC_ISO
)
806 if (font
->encoding
< 0 || font
->encoding
>= MAX_ENCODING
)
811 map1
= &encodings
[font
->encoding
];
813 if (hi
< map1
->base
|| hi
>= map1
->base
+ map1
->size
)
816 map2
= map1
->level2
[hi
- map1
->base
];
818 if (map2
== NULL
|| lo
< map2
->base
|| lo
>= map2
->base
+ map2
->size
)
823 switch(map2
->width
) {
825 c
= (((const u_int8_t
*)map2
->chars
)[lo
]);
828 c
= (((const u_int16_t
*)map2
->chars
)[lo
]);
831 c
= (((const u_int32_t
*)map2
->chars
)[lo
]);
835 if (c
== 0 && lo
!= 0)