Home | History | Annotate | Line # | Download | only in wsfont
wsfont.c revision 1.20.2.3
      1  1.20.2.3  jdolecek /* 	$NetBSD: wsfont.c,v 1.20.2.3 2002/03/16 16:01:45 jdolecek Exp $	*/
      2       1.1        ad 
      3       1.7        ad /*-
      4  1.20.2.3  jdolecek  * Copyright (c) 1999, 2000, 2001, 2002 The NetBSD Foundation, Inc.
      5       1.1        ad  * All rights reserved.
      6       1.1        ad  *
      7       1.7        ad  * This code is derived from software contributed to The NetBSD Foundation
      8      1.13        ad  * by Andrew Doran.
      9       1.7        ad  *
     10       1.1        ad  * Redistribution and use in source and binary forms, with or without
     11       1.1        ad  * modification, are permitted provided that the following conditions
     12       1.1        ad  * are met:
     13       1.1        ad  * 1. Redistributions of source code must retain the above copyright
     14       1.1        ad  *    notice, this list of conditions and the following disclaimer.
     15       1.1        ad  * 2. Redistributions in binary form must reproduce the above copyright
     16       1.1        ad  *    notice, this list of conditions and the following disclaimer in the
     17       1.1        ad  *    documentation and/or other materials provided with the distribution.
     18       1.7        ad  * 3. All advertising materials mentioning features or use of this software
     19       1.7        ad  *    must display the following acknowledgement:
     20       1.7        ad  *	This product includes software developed by the NetBSD
     21       1.7        ad  *	Foundation, Inc. and its contributors.
     22       1.7        ad  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23       1.7        ad  *    contributors may be used to endorse or promote products derived
     24       1.7        ad  *    from this software without specific prior written permission.
     25       1.1        ad  *
     26       1.7        ad  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27       1.7        ad  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28       1.7        ad  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29       1.7        ad  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30       1.7        ad  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31       1.7        ad  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32       1.7        ad  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33       1.7        ad  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34       1.7        ad  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35       1.7        ad  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36       1.7        ad  * POSSIBILITY OF SUCH DAMAGE.
     37       1.1        ad  */
     38       1.2        ad 
     39       1.1        ad #include <sys/cdefs.h>
     40  1.20.2.3  jdolecek __KERNEL_RCSID(0, "$NetBSD: wsfont.c,v 1.20.2.3 2002/03/16 16:01:45 jdolecek Exp $");
     41       1.1        ad 
     42       1.1        ad #include "opt_wsfont.h"
     43       1.1        ad 
     44       1.1        ad #include <sys/param.h>
     45       1.1        ad #include <sys/systm.h>
     46       1.1        ad #include <sys/time.h>
     47       1.1        ad #include <sys/malloc.h>
     48       1.1        ad 
     49       1.1        ad #include <dev/wscons/wsdisplayvar.h>
     50       1.1        ad #include <dev/wscons/wsconsio.h>
     51       1.1        ad #include <dev/wsfont/wsfont.h>
     52       1.1        ad 
     53       1.1        ad #undef HAVE_FONT
     54       1.1        ad 
     55       1.4        ad #ifdef FONT_QVSS8x15
     56       1.1        ad #define HAVE_FONT 1
     57       1.4        ad #include <dev/wsfont/qvss8x15.h>
     58       1.1        ad #endif
     59       1.1        ad 
     60       1.1        ad #ifdef FONT_GALLANT12x22
     61       1.1        ad #define HAVE_FONT 1
     62       1.1        ad #include <dev/wsfont/gallant12x22.h>
     63       1.1        ad #endif
     64       1.1        ad 
     65       1.1        ad #ifdef FONT_LUCIDA16x29
     66       1.1        ad #define HAVE_FONT 1
     67       1.1        ad #include <dev/wsfont/lucida16x29.h>
     68       1.1        ad #endif
     69       1.1        ad 
     70       1.8  takemura #ifdef FONT_VT220L8x8
     71       1.8  takemura #define HAVE_FONT 1
     72       1.8  takemura #include <dev/wsfont/vt220l8x8.h>
     73       1.8  takemura #endif
     74       1.8  takemura 
     75       1.8  takemura #ifdef FONT_VT220L8x10
     76       1.8  takemura #define HAVE_FONT 1
     77       1.8  takemura #include <dev/wsfont/vt220l8x10.h>
     78       1.8  takemura #endif
     79       1.8  takemura 
     80      1.14   tsutsui #ifdef FONT_SONY8x16
     81      1.14   tsutsui #define HAVE_FONT 1
     82      1.14   tsutsui #include <dev/wsfont/sony8x16.h>
     83      1.14   tsutsui #endif
     84      1.14   tsutsui 
     85      1.14   tsutsui #ifdef FONT_SONY12x24
     86      1.14   tsutsui #define HAVE_FONT 1
     87      1.14   tsutsui #include <dev/wsfont/sony12x24.h>
     88      1.14   tsutsui #endif
     89      1.14   tsutsui 
     90      1.15   tsutsui #ifdef FONT_OMRON12x20
     91      1.15   tsutsui #define HAVE_FONT 1
     92      1.15   tsutsui #include <dev/wsfont/omron12x20.h>
     93      1.15   tsutsui #endif
     94      1.15   tsutsui 
     95       1.4        ad /* Make sure we always have at least one font. */
     96       1.1        ad #ifndef HAVE_FONT
     97       1.1        ad #define HAVE_FONT 1
     98       1.4        ad #define FONT_BOLD8x16 1
     99       1.1        ad #endif
    100       1.1        ad 
    101       1.4        ad #ifdef FONT_BOLD8x16
    102       1.4        ad #include <dev/wsfont/bold8x16.h>
    103       1.1        ad #endif
    104       1.1        ad 
    105  1.20.2.3  jdolecek #define	WSFONT_IDENT_MASK	0xffffff00
    106  1.20.2.3  jdolecek #define	WSFONT_IDENT_SHIFT	8
    107  1.20.2.3  jdolecek #define	WSFONT_BITO_MASK	0x000000f0
    108  1.20.2.3  jdolecek #define	WSFONT_BITO_SHIFT	4
    109  1.20.2.3  jdolecek #define	WSFONT_BYTEO_MASK	0x0000000f
    110  1.20.2.3  jdolecek #define	WSFONT_BYTEO_SHIFT	0
    111  1.20.2.3  jdolecek 
    112  1.20.2.3  jdolecek #define WSFONT_BUILTIN	0x01	/* In wsfont.c */
    113  1.20.2.3  jdolecek #define WSFONT_STATIC	0x02	/* Font structures not malloc()ed */
    114  1.20.2.3  jdolecek #define WSFONT_COPY	0x04	/* Copy of existing font in table */
    115  1.20.2.3  jdolecek 
    116       1.1        ad /* Placeholder struct used for linked list */
    117       1.1        ad struct font {
    118  1.20.2.3  jdolecek 	TAILQ_ENTRY(font) chain;
    119       1.1        ad 	struct	wsdisplay_font *font;
    120  1.20.2.3  jdolecek 	u_int	lockcount;
    121  1.20.2.3  jdolecek 	u_int	cookie;
    122  1.20.2.3  jdolecek 	u_int	flags;
    123  1.20.2.3  jdolecek };
    124       1.1        ad 
    125       1.1        ad /* Our list of built-in fonts */
    126  1.20.2.3  jdolecek static struct font builtin_fonts[] = {
    127       1.1        ad #ifdef FONT_BOLD8x16
    128  1.20.2.3  jdolecek 	{ { NULL }, &bold8x16, 0, 0, WSFONT_STATIC | WSFONT_BUILTIN  },
    129       1.1        ad #endif
    130       1.1        ad #ifdef FONT_ISO8x16
    131  1.20.2.3  jdolecek 	{ { NULL }, &iso8x16, 0, 0, WSFONT_STATIC | WSFONT_BUILTIN },
    132       1.1        ad #endif
    133       1.1        ad #ifdef FONT_COURIER11x18
    134  1.20.2.3  jdolecek 	{ { NULL }, &courier11x18, 0, 0, WSFONT_STATIC | WSFONT_BUILTIN },
    135       1.1        ad #endif
    136       1.1        ad #ifdef FONT_GALLANT12x22
    137  1.20.2.3  jdolecek 	{ { NULL }, &gallant12x22, 0, 0, WSFONT_STATIC | WSFONT_BUILTIN },
    138       1.1        ad #endif
    139       1.1        ad #ifdef FONT_LUCIDA16x29
    140  1.20.2.3  jdolecek 	{ { NULL }, &lucida16x29, 0, 0, WSFONT_STATIC | WSFONT_BUILTIN },
    141       1.1        ad #endif
    142       1.1        ad #ifdef FONT_QVSS8x15
    143  1.20.2.3  jdolecek 	{ { NULL }, &qvss8x15, 0, 0, WSFONT_STATIC | WSFONT_BUILTIN },
    144       1.8  takemura #endif
    145       1.8  takemura #ifdef FONT_VT220L8x8
    146  1.20.2.3  jdolecek 	{ { NULL }, &vt220l8x8, 0, 0, WSFONT_STATIC | WSFONT_BUILTIN },
    147       1.8  takemura #endif
    148       1.8  takemura #ifdef FONT_VT220L8x10
    149  1.20.2.3  jdolecek 	{ { NULL }, &vt220l8x10, 0, 0, WSFONT_STATIC | WSFONT_BUILTIN },
    150      1.14   tsutsui #endif
    151      1.14   tsutsui #ifdef FONT_SONY8x16
    152  1.20.2.3  jdolecek 	{ { NULL }, &sony8x16, 0, 0, WSFONT_STATIC | WSFONT_BUILTIN },
    153      1.14   tsutsui #endif
    154      1.14   tsutsui #ifdef FONT_SONY12x24
    155  1.20.2.3  jdolecek 	{ { NULL }, &sony12x24, 0, 0, WSFONT_STATIC | WSFONT_BUILTIN },
    156      1.15   tsutsui #endif
    157      1.15   tsutsui #ifdef FONT_OMRON12x20
    158  1.20.2.3  jdolecek 	{ { NULL }, &omron12x20, 0, 0, WSFONT_STATIC | WSFONT_BUILTIN },
    159       1.1        ad #endif
    160  1.20.2.3  jdolecek 	{ { NULL }, NULL, 0, 0, 0 },
    161       1.1        ad };
    162       1.1        ad 
    163  1.20.2.3  jdolecek static TAILQ_HEAD(,font)	list;
    164  1.20.2.3  jdolecek static int	ident;
    165  1.20.2.3  jdolecek 
    166       1.1        ad /* Reverse the bit order in a byte */
    167       1.1        ad static const u_char reverse[256] = {
    168       1.1        ad 	0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
    169       1.1        ad 	0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
    170       1.1        ad 	0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
    171       1.1        ad 	0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
    172       1.1        ad 	0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
    173       1.1        ad 	0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
    174       1.1        ad 	0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
    175       1.1        ad 	0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
    176       1.1        ad 	0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
    177       1.1        ad 	0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
    178       1.1        ad 	0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
    179       1.1        ad 	0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
    180       1.1        ad 	0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
    181       1.1        ad 	0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
    182       1.1        ad 	0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
    183       1.1        ad 	0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
    184       1.1        ad 	0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
    185       1.1        ad 	0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
    186       1.1        ad 	0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
    187       1.1        ad 	0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
    188       1.1        ad 	0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
    189       1.1        ad 	0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
    190       1.1        ad 	0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
    191       1.1        ad 	0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
    192       1.1        ad 	0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
    193       1.1        ad 	0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
    194       1.1        ad 	0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
    195       1.1        ad 	0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
    196       1.1        ad 	0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
    197       1.1        ad 	0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
    198       1.1        ad 	0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
    199       1.1        ad 	0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
    200       1.1        ad };
    201       1.1        ad 
    202  1.20.2.3  jdolecek static struct	font *wsfont_find0(int, int);
    203  1.20.2.3  jdolecek static struct	font *wsfont_add0(struct wsdisplay_font *, int);
    204  1.20.2.2   thorpej static void	wsfont_revbit(struct wsdisplay_font *);
    205  1.20.2.2   thorpej static void	wsfont_revbyte(struct wsdisplay_font *);
    206  1.20.2.3  jdolecek static int __inline__ wsfont_make_cookie(int, int, int);
    207  1.20.2.3  jdolecek 
    208  1.20.2.3  jdolecek static int __inline__
    209  1.20.2.3  jdolecek wsfont_make_cookie(int ident, int bito, int byteo)
    210  1.20.2.3  jdolecek {
    211  1.20.2.3  jdolecek 
    212  1.20.2.3  jdolecek 	return ((ident & WSFONT_IDENT_MASK) |
    213  1.20.2.3  jdolecek 	    (bito << WSFONT_BITO_SHIFT) |
    214  1.20.2.3  jdolecek 	    (byteo << WSFONT_BYTEO_SHIFT));
    215  1.20.2.3  jdolecek }
    216       1.1        ad 
    217       1.1        ad static void
    218  1.20.2.2   thorpej wsfont_revbit(struct wsdisplay_font *font)
    219       1.1        ad {
    220       1.1        ad 	u_char *p, *m;
    221  1.20.2.3  jdolecek 
    222       1.1        ad 	p = (u_char *)font->data;
    223       1.1        ad 	m = p + font->stride * font->numchars * font->fontheight;
    224      1.18       cgd 
    225      1.18       cgd 	for (; p < m; p++)
    226      1.18       cgd 		*p = reverse[*p];
    227       1.1        ad }
    228       1.1        ad 
    229       1.1        ad static void
    230  1.20.2.2   thorpej wsfont_revbyte(struct wsdisplay_font *font)
    231       1.1        ad {
    232       1.1        ad 	int x, l, r, nr;
    233       1.1        ad 	u_char *rp;
    234  1.20.2.3  jdolecek 
    235       1.1        ad 	if (font->stride == 1)
    236       1.1        ad 		return;
    237       1.1        ad 
    238       1.1        ad 	rp = (u_char *)font->data;
    239       1.1        ad 	nr = font->numchars * font->fontheight;
    240  1.20.2.3  jdolecek 
    241       1.1        ad 	while (nr--) {
    242       1.1        ad 		l = 0;
    243       1.1        ad 		r = font->stride - 1;
    244  1.20.2.3  jdolecek 
    245       1.1        ad 		while (l < r) {
    246       1.1        ad 			x = rp[l];
    247       1.1        ad 			rp[l] = rp[r];
    248       1.1        ad 			rp[r] = x;
    249       1.1        ad 			l++, r--;
    250       1.1        ad 		}
    251  1.20.2.3  jdolecek 
    252       1.1        ad 		rp += font->stride;
    253       1.1        ad 	}
    254       1.1        ad }
    255       1.1        ad 
    256       1.1        ad void
    257  1.20.2.2   thorpej wsfont_enum(void (*cb)(char *, int, int, int))
    258       1.1        ad {
    259       1.9        ad 	struct wsdisplay_font *f;
    260       1.1        ad 	struct font *ent;
    261  1.20.2.3  jdolecek 
    262  1.20.2.3  jdolecek 	TAILQ_FOREACH(ent, &list, chain) {
    263       1.9        ad 		f = ent->font;
    264       1.9        ad 		cb(f->name, f->fontwidth, f->fontheight, f->stride);
    265       1.1        ad 	}
    266       1.1        ad }
    267       1.1        ad 
    268       1.1        ad void
    269       1.1        ad wsfont_init(void)
    270       1.1        ad {
    271  1.20.2.3  jdolecek 	struct font *ent;
    272       1.1        ad 	static int again;
    273       1.1        ad 	int i;
    274  1.20.2.3  jdolecek 
    275       1.9        ad 	if (again != 0)
    276       1.1        ad 		return;
    277       1.1        ad 	again = 1;
    278  1.20.2.3  jdolecek 
    279  1.20.2.3  jdolecek 	TAILQ_INIT(&list);
    280  1.20.2.3  jdolecek 	ent = builtin_fonts;
    281  1.20.2.3  jdolecek 
    282  1.20.2.3  jdolecek 	for (i = 0; builtin_fonts[i].font != NULL; i++, ent++) {
    283  1.20.2.3  jdolecek 		ident += (1 << WSFONT_IDENT_SHIFT);
    284  1.20.2.3  jdolecek 		ent->cookie = wsfont_make_cookie(ident,
    285  1.20.2.3  jdolecek 		    ent->font->bitorder, ent->font->byteorder);
    286  1.20.2.3  jdolecek 		TAILQ_INSERT_TAIL(&list, ent, chain);
    287       1.1        ad 	}
    288       1.1        ad }
    289       1.1        ad 
    290       1.1        ad static struct font *
    291  1.20.2.3  jdolecek wsfont_find0(int cookie, int mask)
    292       1.1        ad {
    293       1.1        ad 	struct font *ent;
    294  1.20.2.3  jdolecek 
    295  1.20.2.3  jdolecek 	TAILQ_FOREACH(ent, &list, chain) {
    296  1.20.2.3  jdolecek 		if ((ent->cookie & mask) == (cookie & mask))
    297       1.1        ad 			return (ent);
    298  1.20.2.3  jdolecek 	}
    299  1.20.2.3  jdolecek 
    300       1.1        ad 	return (NULL);
    301       1.1        ad }
    302       1.1        ad 
    303  1.20.2.1   thorpej int
    304  1.20.2.2   thorpej wsfont_matches(struct wsdisplay_font *font, char *name,
    305  1.20.2.2   thorpej 	       int width, int height, int stride)
    306  1.20.2.1   thorpej {
    307  1.20.2.1   thorpej 
    308  1.20.2.1   thorpej 	if (height != 0 && font->fontheight != height)
    309  1.20.2.1   thorpej 		return (0);
    310  1.20.2.1   thorpej 
    311  1.20.2.1   thorpej 	if (width != 0 && font->fontwidth != width)
    312  1.20.2.1   thorpej 		return (0);
    313  1.20.2.1   thorpej 
    314  1.20.2.1   thorpej 	if (stride != 0 && font->stride != stride)
    315  1.20.2.1   thorpej 		return (0);
    316  1.20.2.3  jdolecek 
    317  1.20.2.1   thorpej 	if (name != NULL && strcmp(font->name, name) != 0)
    318  1.20.2.1   thorpej 		return (0);
    319  1.20.2.1   thorpej 
    320  1.20.2.1   thorpej 	return (1);
    321  1.20.2.1   thorpej }
    322  1.20.2.1   thorpej 
    323       1.1        ad int
    324  1.20.2.3  jdolecek wsfont_find(char *name, int width, int height, int stride, int bito, int byteo)
    325       1.1        ad {
    326       1.1        ad 	struct font *ent;
    327  1.20.2.3  jdolecek 
    328  1.20.2.3  jdolecek 	TAILQ_FOREACH(ent, &list, chain) {
    329  1.20.2.3  jdolecek 		if (wsfont_matches(ent->font, name, width, height, stride))
    330  1.20.2.3  jdolecek 			return (wsfont_make_cookie(ent->cookie, bito, byteo));
    331       1.1        ad 	}
    332       1.1        ad 
    333       1.1        ad 	return (-1);
    334       1.1        ad }
    335       1.1        ad 
    336  1.20.2.3  jdolecek static struct font *
    337  1.20.2.3  jdolecek wsfont_add0(struct wsdisplay_font *font, int copy)
    338       1.1        ad {
    339       1.1        ad 	struct font *ent;
    340       1.9        ad 	size_t size;
    341  1.20.2.3  jdolecek 
    342  1.20.2.3  jdolecek 	ent = malloc(sizeof(struct font *), M_DEVBUF, M_WAITOK | M_ZERO);
    343  1.20.2.3  jdolecek 
    344       1.1        ad 	/* Is this font statically allocated? */
    345       1.1        ad 	if (!copy) {
    346       1.1        ad 		ent->font = font;
    347  1.20.2.3  jdolecek 		ent->flags = WSFONT_STATIC;
    348       1.1        ad 	} else {
    349  1.20.2.3  jdolecek 		ent->font = malloc(sizeof(struct wsdisplay_font), M_DEVBUF,
    350  1.20.2.3  jdolecek 		    M_WAITOK | M_ZERO);
    351  1.20.2.3  jdolecek 
    352       1.1        ad 		size = font->fontheight * font->numchars * font->stride;
    353  1.20.2.3  jdolecek 		ent->font->data = malloc(size, M_DEVBUF, M_WAITOK);
    354       1.1        ad 		memcpy(ent->font->data, font->data, size);
    355  1.20.2.3  jdolecek 
    356  1.20.2.3  jdolecek 		ent->font->name = malloc(strlen(font->name) + 1, M_DEVBUF,
    357  1.20.2.3  jdolecek 		    M_WAITOK);
    358  1.20.2.1   thorpej 		strcpy(ent->font->name, font->name);
    359       1.1        ad 	}
    360  1.20.2.3  jdolecek 
    361  1.20.2.3  jdolecek 	TAILQ_INSERT_TAIL(&list, ent, chain);
    362  1.20.2.3  jdolecek 	return (ent);
    363  1.20.2.3  jdolecek }
    364  1.20.2.3  jdolecek 
    365  1.20.2.3  jdolecek int
    366  1.20.2.3  jdolecek wsfont_add(struct wsdisplay_font *font, int copy)
    367  1.20.2.3  jdolecek {
    368  1.20.2.3  jdolecek 	struct font *ent;
    369  1.20.2.3  jdolecek 
    370  1.20.2.3  jdolecek 	/* Don't allow exact duplicates */
    371  1.20.2.3  jdolecek 	if (wsfont_find(font->name, font->fontwidth, font->fontheight,
    372  1.20.2.3  jdolecek 	    font->stride, 0, 0) >= 0)
    373  1.20.2.3  jdolecek 		return (EEXIST);
    374  1.20.2.3  jdolecek 
    375  1.20.2.3  jdolecek 	ent = wsfont_add0(font, copy);
    376  1.20.2.3  jdolecek 
    377  1.20.2.3  jdolecek 	ident += (1 << WSFONT_IDENT_SHIFT);
    378  1.20.2.3  jdolecek 	ent->cookie = wsfont_make_cookie(ident, font->bitorder,
    379  1.20.2.3  jdolecek 	    font->byteorder);
    380  1.20.2.3  jdolecek 
    381       1.1        ad 	return (0);
    382       1.1        ad }
    383  1.20.2.3  jdolecek 
    384       1.1        ad int
    385  1.20.2.2   thorpej wsfont_remove(int cookie)
    386       1.1        ad {
    387       1.1        ad 	struct font *ent;
    388       1.1        ad 
    389  1.20.2.3  jdolecek 	if ((ent = wsfont_find0(cookie, 0xffffffff)) == NULL)
    390  1.20.2.1   thorpej 		return (ENOENT);
    391  1.20.2.3  jdolecek 
    392  1.20.2.3  jdolecek 	if ((ent->flags & WSFONT_BUILTIN) != 0 || ent->lockcount != 0)
    393  1.20.2.1   thorpej 		return (EBUSY);
    394  1.20.2.3  jdolecek 
    395  1.20.2.3  jdolecek 	if ((ent->flags & WSFONT_STATIC) == 0) {
    396  1.20.2.3  jdolecek 		free(ent->font->data, M_DEVBUF);
    397  1.20.2.3  jdolecek 		free(ent->font->name, M_DEVBUF);
    398  1.20.2.3  jdolecek 		free(ent->font, M_DEVBUF);
    399       1.1        ad 	}
    400  1.20.2.3  jdolecek 
    401  1.20.2.3  jdolecek 	TAILQ_REMOVE(&list, ent, chain);
    402  1.20.2.3  jdolecek 	free(ent, M_DEVBUF);
    403  1.20.2.3  jdolecek 
    404       1.9        ad 	return (0);
    405       1.1        ad }
    406       1.1        ad 
    407       1.1        ad int
    408  1.20.2.3  jdolecek wsfont_lock(int cookie, struct wsdisplay_font **ptr)
    409       1.1        ad {
    410  1.20.2.3  jdolecek 	struct font *ent, *neu;
    411  1.20.2.3  jdolecek 	int bito, byteo;
    412  1.20.2.3  jdolecek 
    413  1.20.2.3  jdolecek 	if ((ent = wsfont_find0(cookie, 0xffffffff)) == NULL) {
    414  1.20.2.3  jdolecek 		if ((ent = wsfont_find0(cookie, WSFONT_IDENT_MASK)) == NULL)
    415  1.20.2.3  jdolecek 			return (ENOENT);
    416  1.20.2.3  jdolecek 
    417  1.20.2.3  jdolecek 		if (ent->lockcount != 0) {
    418  1.20.2.3  jdolecek 			neu = wsfont_add0(ent->font, 1);
    419  1.20.2.3  jdolecek 			neu->flags |= WSFONT_COPY;
    420  1.20.2.3  jdolecek 			ent = neu;
    421  1.20.2.3  jdolecek 		}
    422  1.20.2.3  jdolecek 
    423  1.20.2.3  jdolecek 		bito = (cookie & WSFONT_BITO_MASK) >> WSFONT_BITO_SHIFT;
    424  1.20.2.3  jdolecek 		byteo = (cookie & WSFONT_BYTEO_MASK) >> WSFONT_BYTEO_SHIFT;
    425  1.20.2.3  jdolecek 
    426  1.20.2.3  jdolecek 		if (bito && bito != ent->font->bitorder) {
    427       1.1        ad 			wsfont_revbit(ent->font);
    428  1.20.2.3  jdolecek 			ent->font->bitorder = bito;
    429       1.1        ad 		}
    430       1.1        ad 
    431  1.20.2.3  jdolecek 		if (byteo && byteo != ent->font->byteorder) {
    432       1.1        ad 			wsfont_revbyte(ent->font);
    433  1.20.2.3  jdolecek 			ent->font->byteorder = byteo;
    434       1.1        ad 		}
    435       1.1        ad 
    436  1.20.2.3  jdolecek 		ent->cookie = cookie;
    437       1.1        ad 	}
    438  1.20.2.3  jdolecek 
    439  1.20.2.3  jdolecek 	ent->lockcount++;
    440  1.20.2.3  jdolecek 	*ptr = ent->font;
    441  1.20.2.3  jdolecek 	return (0);
    442       1.1        ad }
    443       1.1        ad 
    444       1.1        ad int
    445  1.20.2.2   thorpej wsfont_unlock(int cookie)
    446       1.1        ad {
    447       1.1        ad 	struct font *ent;
    448      1.16    marcus 
    449  1.20.2.3  jdolecek 	if ((ent = wsfont_find0(cookie, 0xffffffff)) == NULL)
    450  1.20.2.3  jdolecek 		return (ENOENT);
    451  1.20.2.3  jdolecek 
    452  1.20.2.3  jdolecek 	if (ent->lockcount == 0)
    453  1.20.2.3  jdolecek 		panic("wsfont_unlock: font not locked\n");
    454  1.20.2.3  jdolecek 
    455  1.20.2.3  jdolecek 	if (--ent->lockcount == 0 && (ent->flags & WSFONT_COPY) != 0)
    456  1.20.2.3  jdolecek 		wsfont_remove(cookie);
    457  1.20.2.3  jdolecek 
    458  1.20.2.3  jdolecek 	return (0);
    459  1.20.2.3  jdolecek }
    460      1.16    marcus 
    461      1.16    marcus /*
    462      1.16    marcus  * Unicode to font encoding mappings
    463      1.16    marcus  */
    464      1.16    marcus 
    465      1.16    marcus /*
    466  1.20.2.3  jdolecek  * To save memory, font encoding tables use a two level lookup.  First the
    467  1.20.2.3  jdolecek  * high byte of the Unicode is used to lookup the level 2 table, then the
    468  1.20.2.3  jdolecek  * low byte indexes that table.  Level 2 tables that are not needed are
    469  1.20.2.3  jdolecek  * omitted (NULL), and both level 1 and level 2 tables have base and size
    470  1.20.2.3  jdolecek  * attributes to keep their size down.
    471      1.16    marcus  */
    472      1.16    marcus 
    473      1.16    marcus struct wsfont_level1_glyphmap {
    474  1.20.2.3  jdolecek 	const struct	wsfont_level2_glyphmap **level2;
    475  1.20.2.3  jdolecek 	int	base;	/* High byte for first level2 entry	*/
    476  1.20.2.3  jdolecek 	int	size;	/* Number of level2 entries		*/
    477      1.16    marcus };
    478      1.16    marcus 
    479      1.16    marcus struct wsfont_level2_glyphmap {
    480  1.20.2.3  jdolecek 	int	base;	/* Low byte for first character		*/
    481  1.20.2.3  jdolecek 	int	size;	/* Number of characters			*/
    482  1.20.2.3  jdolecek 	const void	*chars;	/* Pointer to character number entries  */
    483  1.20.2.3  jdolecek 	int	width;	/* Size of each entry in bytes (1,2,4)  */
    484      1.16    marcus };
    485      1.16    marcus 
    486      1.16    marcus #define null16			\
    487      1.16    marcus 	NULL, NULL, NULL, NULL,	\
    488      1.16    marcus 	NULL, NULL, NULL, NULL,	\
    489      1.16    marcus 	NULL, NULL, NULL, NULL,	\
    490      1.16    marcus 	NULL, NULL, NULL, NULL
    491      1.16    marcus 
    492      1.16    marcus /*
    493      1.16    marcus  * IBM 437 maps
    494      1.16    marcus  */
    495      1.16    marcus 
    496  1.20.2.3  jdolecek static const u_int8_t ibm437_chars_0[] = {
    497      1.16    marcus 	 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    498      1.16    marcus 	16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
    499      1.16    marcus 	32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
    500      1.16    marcus 	48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
    501      1.16    marcus 	64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
    502      1.16    marcus 	80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
    503      1.16    marcus 	96, 97, 98, 99, 100,101,102,103,104,105,106,107,108,109,110,111,
    504      1.16    marcus 	112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
    505      1.16    marcus 	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    506      1.16    marcus 	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    507      1.16    marcus 	255,173,155,156, 0, 157, 0,  0,  0,  0, 166,174,170, 0,  0,  0,
    508      1.16    marcus 	 0, 241,253, 0,  0,  0,  0, 249, 0,  0, 167,175,172,171, 0, 168,
    509      1.16    marcus 	 0,  0,  0,  0, 142,143,146,128, 0, 144, 0,  0,  0,  0,  0,  0,
    510      1.16    marcus 	 0, 165, 0,  0,  0,  0, 153, 0,  0,  0,  0,  0, 154, 0,  0,  0,
    511      1.16    marcus 	133,160,131, 0, 132,134,145,135,138,130,136,137,141,161,140,139,
    512      1.16    marcus 	 0, 164,149,162,147, 0, 148,246, 0, 151,163,150,129, 0,  0, 152
    513  1.20.2.3  jdolecek };
    514  1.20.2.3  jdolecek 
    515  1.20.2.3  jdolecek static const u_int8_t ibm437_chars_1[] = {
    516      1.16    marcus 	159
    517  1.20.2.3  jdolecek };
    518  1.20.2.3  jdolecek 
    519  1.20.2.3  jdolecek static const u_int8_t ibm437_chars_3[] = {
    520      1.16    marcus 	226, 0,  0,  0,  0, 233, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    521      1.16    marcus 	228, 0,  0, 232, 0,  0, 234, 0,  0,  0,  0,  0,  0,  0, 224,225,
    522      1.16    marcus 	 0, 235,238, 0,  0,  0,  0,  0,  0, 230, 0,  0,  0, 227, 0,  0,
    523      1.16    marcus 	229,231
    524  1.20.2.3  jdolecek };
    525  1.20.2.3  jdolecek 
    526  1.20.2.3  jdolecek static const u_int8_t ibm437_chars_32[] = {
    527      1.16    marcus 	252, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    528      1.16    marcus 	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    529      1.16    marcus 	 0,  0,  0,  0,  0,  0,  0,  0, 158
    530  1.20.2.3  jdolecek };
    531  1.20.2.3  jdolecek 
    532  1.20.2.3  jdolecek static const u_int8_t ibm437_chars_34[] = {
    533      1.16    marcus 	237, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    534      1.16    marcus 	 0,  0,  0, 248,250,251, 0,  0,  0, 236, 0,  0,  0,  0,  0,  0,
    535      1.16    marcus 	 0,  0,  0,  0, 239, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    536      1.16    marcus 	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    537      1.16    marcus 	 0,  0,  0, 247, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    538      1.16    marcus 	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,240,  0,  0,243,
    539      1.16    marcus 	242
    540  1.20.2.3  jdolecek };
    541  1.20.2.3  jdolecek 
    542  1.20.2.3  jdolecek static const u_int8_t ibm437_chars_35[] = {
    543      1.16    marcus 	169, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    544      1.16    marcus 	244,245
    545  1.20.2.3  jdolecek };
    546  1.20.2.3  jdolecek 
    547  1.20.2.3  jdolecek static const u_int8_t ibm437_chars_37[] = {
    548      1.16    marcus 	196,205,179,186, 0,  0,  0,  0,  0,  0,  0,  0, 218,213,214,201,
    549      1.16    marcus 	191,184,183,187,192,212,211,200,217,190,189,188,195,198, 0,  0,
    550      1.16    marcus 	199, 0,  0, 204,180,181, 0,  0, 182, 0,  0, 185,194, 0,  0, 209,
    551      1.16    marcus 	210, 0,  0, 203,193, 0,  0, 207,208, 0,  0, 202,197, 0,  0, 216,
    552      1.16    marcus 	 0,  0, 215, 0,  0,  0,  0,  0,  0,  0,  0, 206, 0,  0,  0,  0,
    553      1.16    marcus 	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    554      1.16    marcus 	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    555      1.16    marcus 	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    556      1.16    marcus 	223, 0,  0,  0, 220, 0,  0,  0, 219, 0,  0,  0, 221, 0,  0,  0,
    557      1.16    marcus 	222,176,177,178, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    558      1.16    marcus 	254
    559      1.16    marcus };
    560      1.16    marcus 
    561  1.20.2.3  jdolecek static const struct wsfont_level2_glyphmap ibm437_level2_0 =
    562  1.20.2.3  jdolecek     { 0, 256, ibm437_chars_0, 1 };
    563  1.20.2.3  jdolecek 
    564  1.20.2.3  jdolecek static const struct wsfont_level2_glyphmap ibm437_level2_1 =
    565  1.20.2.3  jdolecek     { 146, 1, ibm437_chars_1, 1 };
    566  1.20.2.3  jdolecek 
    567  1.20.2.3  jdolecek static const struct wsfont_level2_glyphmap ibm437_level2_3 =
    568  1.20.2.3  jdolecek     { 147, 50, ibm437_chars_3, 1 };
    569  1.20.2.3  jdolecek 
    570  1.20.2.3  jdolecek static const struct wsfont_level2_glyphmap ibm437_level2_32 =
    571  1.20.2.3  jdolecek     { 127, 41, ibm437_chars_32, 1 };
    572  1.20.2.3  jdolecek 
    573  1.20.2.3  jdolecek static const struct wsfont_level2_glyphmap ibm437_level2_34 =
    574  1.20.2.3  jdolecek     { 5, 97, ibm437_chars_34, 1 };
    575  1.20.2.3  jdolecek 
    576  1.20.2.3  jdolecek static const struct wsfont_level2_glyphmap ibm437_level2_35 =
    577  1.20.2.3  jdolecek     { 16, 18, ibm437_chars_35, 1 };
    578  1.20.2.3  jdolecek 
    579  1.20.2.3  jdolecek static const struct wsfont_level2_glyphmap ibm437_level2_37 =
    580  1.20.2.3  jdolecek     { 0, 161, ibm437_chars_37, 1 };
    581      1.16    marcus 
    582  1.20.2.3  jdolecek static const struct wsfont_level2_glyphmap *ibm437_level1[] = {
    583      1.16    marcus 	&ibm437_level2_0, &ibm437_level2_1, NULL, &ibm437_level2_3,
    584      1.16    marcus 	NULL, NULL, NULL, NULL,
    585      1.16    marcus 	NULL, NULL, NULL, NULL,
    586      1.16    marcus 	NULL, NULL, NULL, NULL,
    587      1.16    marcus 	NULL, NULL, NULL, NULL,
    588      1.16    marcus 	NULL, NULL, NULL, NULL,
    589      1.16    marcus 	NULL, NULL, NULL, NULL,
    590      1.16    marcus 	NULL, NULL, NULL, NULL,
    591      1.16    marcus 	&ibm437_level2_32, NULL, &ibm437_level2_34, &ibm437_level2_35,
    592      1.16    marcus 	NULL, &ibm437_level2_37
    593      1.16    marcus };
    594      1.16    marcus 
    595      1.16    marcus /*
    596      1.16    marcus  * ISO-8859-7 maps
    597      1.16    marcus  */
    598  1.20.2.3  jdolecek static const u_int8_t iso7_chars_0[] = {
    599      1.16    marcus 	 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    600      1.16    marcus 	16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
    601      1.16    marcus 	32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
    602      1.16    marcus 	48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
    603      1.16    marcus 	64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
    604      1.16    marcus 	80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
    605      1.16    marcus 	96, 97, 98, 99, 100,101,102,103,104,105,106,107,108,109,110,111,
    606      1.16    marcus 	112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
    607      1.16    marcus 	128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
    608      1.16    marcus 	144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
    609      1.16    marcus 	160, 0,  0, 163, 0,  0, 166,167,168,169, 0, 171,172,173, 0,  0,
    610      1.16    marcus 	176,177,178,179,180, 0,  0, 183, 0,  0,  0, 187, 0, 189
    611  1.20.2.3  jdolecek };
    612  1.20.2.3  jdolecek 
    613  1.20.2.3  jdolecek static const u_int8_t iso7_chars_3[] = {
    614      1.16    marcus 	182, 0, 184,185,186, 0, 188, 0, 190,191,192,193,194,195,196,197,
    615      1.16    marcus 	198,199,200,201,202,203,204,205,206,207,208,209, 0, 211,212,213,
    616      1.16    marcus 	214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,
    617      1.16    marcus 	230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,
    618      1.16    marcus 	246,247,248,249,250,251,252,253,254, 0,  0,  0,  0,  0,  0,  0,
    619      1.16    marcus 	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    620      1.16    marcus 	 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 181
    621  1.20.2.3  jdolecek };
    622  1.20.2.3  jdolecek 
    623  1.20.2.3  jdolecek static const u_int8_t iso7_chars_32[] = {
    624      1.16    marcus 	175, 0,  0,  0,  0, 162, 0, 161
    625      1.16    marcus };
    626      1.16    marcus 
    627  1.20.2.3  jdolecek static const struct wsfont_level2_glyphmap iso7_level2_0 =
    628  1.20.2.3  jdolecek     { 0, 190, iso7_chars_0, 1 };
    629  1.20.2.3  jdolecek 
    630  1.20.2.3  jdolecek static const struct wsfont_level2_glyphmap iso7_level2_3 =
    631  1.20.2.3  jdolecek     { 134, 111, iso7_chars_3, 1 };
    632  1.20.2.3  jdolecek 
    633  1.20.2.3  jdolecek static const struct wsfont_level2_glyphmap iso7_level2_32 =
    634  1.20.2.3  jdolecek     { 20, 8, iso7_chars_32, 1 };
    635      1.16    marcus 
    636  1.20.2.3  jdolecek static const struct wsfont_level2_glyphmap *iso7_level1[] = {
    637      1.16    marcus 	&iso7_level2_0, NULL, NULL, &iso7_level2_3,
    638      1.16    marcus 	NULL, NULL, NULL, NULL,
    639      1.16    marcus 	NULL, NULL, NULL, NULL,
    640      1.16    marcus 	NULL, NULL, NULL, NULL,
    641      1.16    marcus 	NULL, NULL, NULL, NULL,
    642      1.16    marcus 	NULL, NULL, NULL, NULL,
    643      1.16    marcus 	NULL, NULL, NULL, NULL,
    644      1.16    marcus 	NULL, NULL, NULL, NULL,
    645      1.16    marcus 	&iso7_level2_32
    646      1.16    marcus };
    647      1.16    marcus 
    648  1.20.2.3  jdolecek static const struct wsfont_level1_glyphmap encodings[] = {
    649      1.16    marcus 	{ NULL, 0, 0 },			/* WSDISPLAY_FONTENC_ISO */
    650      1.16    marcus 	{ ibm437_level1, 0, 38 },	/* WSDISPLAY_FONTENC_IBM */
    651      1.16    marcus 	{ NULL, 0, 0 },			/* WSDISPLAY_FONTENC_PCVT */
    652      1.16    marcus 	{ iso7_level1, 0, 33 },		/* WSDISPLAY_FONTENC_ISO7 */
    653      1.16    marcus };
    654      1.16    marcus 
    655      1.19     enami #define MAX_ENCODING (sizeof(encodings) / sizeof(encodings[0]))
    656      1.16    marcus 
    657      1.16    marcus /*
    658      1.16    marcus  * Remap Unicode character to glyph
    659      1.16    marcus  */
    660      1.16    marcus int
    661  1.20.2.2   thorpej wsfont_map_unichar(struct wsdisplay_font *font, int c)
    662      1.16    marcus {
    663  1.20.2.3  jdolecek 	const struct wsfont_level1_glyphmap *map1;
    664  1.20.2.3  jdolecek 	const struct wsfont_level2_glyphmap *map2;
    665  1.20.2.3  jdolecek 	int hi, lo;
    666      1.16    marcus 
    667  1.20.2.3  jdolecek 	if (font->encoding == WSDISPLAY_FONTENC_ISO)
    668  1.20.2.3  jdolecek 		return (c);
    669      1.16    marcus 
    670  1.20.2.3  jdolecek 	if (font->encoding < 0 || font->encoding > MAX_ENCODING)
    671  1.20.2.3  jdolecek 		return (-1);
    672  1.20.2.3  jdolecek 
    673  1.20.2.3  jdolecek 	hi = (c >> 8);
    674  1.20.2.3  jdolecek 	lo = c & 255;
    675  1.20.2.3  jdolecek 	map1 = &encodings[font->encoding];
    676      1.16    marcus 
    677  1.20.2.3  jdolecek 	if (hi < map1->base || hi >= map1->base + map1->size)
    678      1.16    marcus 		return (-1);
    679      1.16    marcus 
    680  1.20.2.3  jdolecek 	map2 = map1->level2[hi - map1->base];
    681      1.16    marcus 
    682  1.20.2.3  jdolecek 	if (map2 == NULL || lo < map2->base || lo >= map2->base + map2->size)
    683  1.20.2.3  jdolecek 		return (-1);
    684      1.16    marcus 
    685  1.20.2.3  jdolecek 	lo -= map2->base;
    686      1.16    marcus 
    687  1.20.2.3  jdolecek 	switch(map2->width) {
    688  1.20.2.3  jdolecek 	case 1:
    689  1.20.2.3  jdolecek 		c = (((const u_int8_t *)map2->chars)[lo]);
    690  1.20.2.3  jdolecek 		break;
    691  1.20.2.3  jdolecek 	case 2:
    692  1.20.2.3  jdolecek 		c = (((const u_int16_t *)map2->chars)[lo]);
    693  1.20.2.3  jdolecek 		break;
    694  1.20.2.3  jdolecek 	case 4:
    695  1.20.2.3  jdolecek 		c = (((const u_int32_t *)map2->chars)[lo]);
    696  1.20.2.3  jdolecek 		break;
    697      1.16    marcus 	}
    698      1.16    marcus 
    699  1.20.2.3  jdolecek 	if (c == 0 && lo != 0)
    700  1.20.2.3  jdolecek 		return (-1);
    701  1.20.2.3  jdolecek 
    702  1.20.2.3  jdolecek 	return (c);
    703       1.1        ad }
    704