Home | History | Annotate | Line # | Download | only in wsfont
wsfont.c revision 1.2
      1  1.2  ad /*	$NetBSD: wsfont.c,v 1.2 1999/04/13 00:40:11 ad Exp $ */
      2  1.1  ad 
      3  1.1  ad /*-
      4  1.2  ad  * Copyright (c) 1999 Andy Doran <ad (at) NetBSD.org>
      5  1.1  ad  * All rights reserved.
      6  1.1  ad  *
      7  1.1  ad  * Redistribution and use in source and binary forms, with or without
      8  1.1  ad  * modification, are permitted provided that the following conditions
      9  1.1  ad  * are met:
     10  1.1  ad  * 1. Redistributions of source code must retain the above copyright
     11  1.1  ad  *    notice, this list of conditions and the following disclaimer.
     12  1.1  ad  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1  ad  *    notice, this list of conditions and the following disclaimer in the
     14  1.1  ad  *    documentation and/or other materials provided with the distribution.
     15  1.1  ad  *
     16  1.2  ad  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     17  1.2  ad  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     18  1.2  ad  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     19  1.2  ad  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     20  1.2  ad  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21  1.2  ad  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     22  1.2  ad  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     23  1.2  ad  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     24  1.2  ad  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     25  1.2  ad  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  1.2  ad  * SUCH DAMAGE.
     27  1.2  ad  *
     28  1.1  ad  */
     29  1.2  ad 
     30  1.1  ad #include <sys/cdefs.h>
     31  1.2  ad __KERNEL_RCSID(0, "$NetBSD: wsfont.c,v 1.2 1999/04/13 00:40:11 ad Exp $");
     32  1.1  ad 
     33  1.1  ad #include "opt_wsfont.h"
     34  1.1  ad 
     35  1.1  ad #include <sys/types.h>
     36  1.1  ad #include <sys/param.h>
     37  1.1  ad #include <sys/systm.h>
     38  1.1  ad #include <sys/time.h>
     39  1.1  ad #include <sys/malloc.h>
     40  1.1  ad 
     41  1.1  ad #include <dev/wscons/wsdisplayvar.h>
     42  1.1  ad #include <dev/wscons/wsconsio.h>
     43  1.1  ad #include <dev/wsfont/wsfont.h>
     44  1.1  ad 
     45  1.1  ad #undef HAVE_FONT
     46  1.1  ad 
     47  1.1  ad #ifdef FONT_ISO8x16
     48  1.1  ad #define HAVE_FONT 1
     49  1.1  ad #include <dev/wsfont/iso8x16.h>
     50  1.1  ad #endif
     51  1.1  ad 
     52  1.1  ad #ifdef FONT_BOLD8x16
     53  1.1  ad #define HAVE_FONT 1
     54  1.1  ad #include <dev/wsfont/bold8x16.h>
     55  1.1  ad #endif
     56  1.1  ad 
     57  1.1  ad #ifdef FONT_COURIER11x18
     58  1.1  ad #define HAVE_FONT 1
     59  1.1  ad #include <dev/wsfont/courier11x18.h>
     60  1.1  ad #endif
     61  1.1  ad 
     62  1.1  ad #ifdef FONT_GALLANT12x22
     63  1.1  ad #define HAVE_FONT 1
     64  1.1  ad #include <dev/wsfont/gallant12x22.h>
     65  1.1  ad #endif
     66  1.1  ad 
     67  1.1  ad #ifdef FONT_LUCIDA16x29
     68  1.1  ad #define HAVE_FONT 1
     69  1.1  ad #include <dev/wsfont/lucida16x29.h>
     70  1.1  ad #endif
     71  1.1  ad 
     72  1.1  ad /* Make sure we always have at least one font. Choose the most ugly one.  */
     73  1.1  ad #ifndef HAVE_FONT
     74  1.1  ad #define HAVE_FONT 1
     75  1.1  ad #define FONT_QVSS8x15 1
     76  1.1  ad #endif
     77  1.1  ad 
     78  1.1  ad #ifdef FONT_QVSS8x15
     79  1.1  ad #include <dev/wsfont/qvss8x15.h>
     80  1.1  ad #endif
     81  1.1  ad 
     82  1.1  ad /* Placeholder struct used for linked list */
     83  1.1  ad struct font {
     84  1.1  ad 	struct	font *next;
     85  1.1  ad 	struct	font *prev;
     86  1.1  ad 	struct	wsdisplay_font *font;
     87  1.1  ad 	u_short	lockcount;
     88  1.1  ad 	u_short	cookie;
     89  1.1  ad 	u_short	flg;
     90  1.1  ad 	u_char	bitorder;	/* XXX move to wsdisplay_font */
     91  1.1  ad 	u_char	byteorder;	/* XXX move to wsdisplay_font */
     92  1.1  ad };
     93  1.1  ad 
     94  1.1  ad #define WSFONT_BUILTIN	(0x01)
     95  1.1  ad #define WSFONT_STATIC	(0x02)
     96  1.1  ad 
     97  1.1  ad #define WSFONT_LITTLE	(0)
     98  1.1  ad #define WSFONT_BIG	(1)
     99  1.1  ad 
    100  1.1  ad /* Our list of built-in fonts */
    101  1.1  ad static struct font *list, builtin_fonts[] = {
    102  1.1  ad #ifdef FONT_BOLD8x16
    103  1.1  ad 	{ NULL, NULL, &bold8x16, 0, 1, WSFONT_STATIC | WSFONT_BUILTIN, 0, 0 },
    104  1.1  ad #endif
    105  1.1  ad #ifdef FONT_ISO8x16
    106  1.1  ad 	{ NULL, NULL, &iso8x16, 0, 2, WSFONT_STATIC | WSFONT_BUILTIN, 0, 0 },
    107  1.1  ad #endif
    108  1.1  ad #ifdef FONT_COURIER11x18
    109  1.1  ad 	{ NULL, NULL, &courier11x18, 0, 3, WSFONT_STATIC | WSFONT_BUILTIN, 0, 0 },
    110  1.1  ad #endif
    111  1.1  ad #ifdef FONT_GALLANT12x22
    112  1.1  ad 	{ NULL, NULL, &gallant12x22, 0, 4, WSFONT_STATIC | WSFONT_BUILTIN, 0, 0 },
    113  1.1  ad #endif
    114  1.1  ad #ifdef FONT_LUCIDA16x29
    115  1.1  ad 	{ NULL, NULL, &lucida16x29, 0, 5, WSFONT_STATIC | WSFONT_BUILTIN, 0, 0 },
    116  1.1  ad #endif
    117  1.1  ad #ifdef FONT_QVSS8x15
    118  1.1  ad 	{ NULL, NULL, &qvss8x15, 0, 6, WSFONT_STATIC | WSFONT_BUILTIN, 0, 0 },
    119  1.1  ad #endif
    120  1.1  ad 	{ NULL, NULL, NULL, 0, 0, 0 },
    121  1.1  ad };
    122  1.1  ad 
    123  1.1  ad /* Reverse the bit order in a byte */
    124  1.1  ad static const u_char reverse[256] = {
    125  1.1  ad 	0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
    126  1.1  ad 	0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
    127  1.1  ad 	0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
    128  1.1  ad 	0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
    129  1.1  ad 	0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
    130  1.1  ad 	0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
    131  1.1  ad 	0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
    132  1.1  ad 	0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
    133  1.1  ad 	0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
    134  1.1  ad 	0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
    135  1.1  ad 	0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
    136  1.1  ad 	0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
    137  1.1  ad 	0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
    138  1.1  ad 	0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
    139  1.1  ad 	0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
    140  1.1  ad 	0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
    141  1.1  ad 	0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
    142  1.1  ad 	0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
    143  1.1  ad 	0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
    144  1.1  ad 	0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
    145  1.1  ad 	0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
    146  1.1  ad 	0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
    147  1.1  ad 	0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
    148  1.1  ad 	0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
    149  1.1  ad 	0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
    150  1.1  ad 	0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
    151  1.1  ad 	0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
    152  1.1  ad 	0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
    153  1.1  ad 	0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
    154  1.1  ad 	0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
    155  1.1  ad 	0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
    156  1.1  ad 	0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
    157  1.1  ad };
    158  1.1  ad 
    159  1.1  ad static struct	font *wsfont_find0 __P((int));
    160  1.1  ad static void	wsfont_revbit __P((struct wsdisplay_font *));
    161  1.1  ad static void	wsfont_revbyte __P((struct wsdisplay_font *));
    162  1.1  ad 
    163  1.1  ad 
    164  1.1  ad /*
    165  1.1  ad  * Reverse the bit order of a font
    166  1.1  ad  */
    167  1.1  ad static void
    168  1.1  ad wsfont_revbit(font)
    169  1.1  ad 	struct wsdisplay_font *font;
    170  1.1  ad {
    171  1.1  ad 	u_char *p, *m;
    172  1.1  ad 
    173  1.1  ad 	p = (u_char *)font->data;
    174  1.1  ad 	m = p + font->stride * font->numchars * font->fontheight;
    175  1.1  ad 
    176  1.1  ad 	while (p < m)
    177  1.1  ad 		*p++ = reverse[*p];
    178  1.1  ad }
    179  1.1  ad 
    180  1.1  ad 
    181  1.1  ad /*
    182  1.1  ad  * Reverse the byte order of a font
    183  1.1  ad  */
    184  1.1  ad static void
    185  1.1  ad wsfont_revbyte(font)
    186  1.1  ad 	struct wsdisplay_font *font;
    187  1.1  ad {
    188  1.1  ad 	int x, l, r, nr;
    189  1.1  ad 	u_char *rp;
    190  1.1  ad 
    191  1.1  ad 	if (font->stride == 1)
    192  1.1  ad 		return;
    193  1.1  ad 
    194  1.1  ad 	rp = (u_char *)font->data;
    195  1.1  ad 	nr = font->numchars * font->fontheight;
    196  1.1  ad 
    197  1.1  ad 	while (nr--) {
    198  1.1  ad 		l = 0;
    199  1.1  ad 		r = font->stride - 1;
    200  1.1  ad 
    201  1.1  ad 		while (l < r) {
    202  1.1  ad 			x = rp[l];
    203  1.1  ad 			rp[l] = rp[r];
    204  1.1  ad 			rp[r] = x;
    205  1.1  ad 			l++, r--;
    206  1.1  ad 		}
    207  1.1  ad 
    208  1.1  ad 		rp += font->stride;
    209  1.1  ad 	}
    210  1.1  ad }
    211  1.1  ad 
    212  1.1  ad 
    213  1.1  ad /*
    214  1.1  ad  * Enumarate the list of fonts
    215  1.1  ad  */
    216  1.1  ad void
    217  1.1  ad wsfont_enum(func)
    218  1.1  ad 	void (*func) __P((char *, int, int, int));
    219  1.1  ad {
    220  1.1  ad 	struct font *ent;
    221  1.1  ad 	struct wsdisplay_font *font;
    222  1.1  ad 	int s;
    223  1.1  ad 
    224  1.1  ad 	s = splhigh();
    225  1.1  ad 
    226  1.1  ad 	for (ent = list; ent; ent = ent->next) {
    227  1.1  ad 		font = ent->font;
    228  1.1  ad 		func(font->name, font->fontwidth, font->fontheight,
    229  1.1  ad 		    font->stride);
    230  1.1  ad 	}
    231  1.1  ad 
    232  1.1  ad 	splx(s);
    233  1.1  ad }
    234  1.1  ad 
    235  1.1  ad 
    236  1.1  ad /*
    237  1.1  ad  * Initialize list with WSFONT_BUILTIN fonts
    238  1.1  ad  */
    239  1.1  ad void
    240  1.1  ad wsfont_init(void)
    241  1.1  ad {
    242  1.1  ad 	static int again;
    243  1.1  ad 	int i;
    244  1.1  ad 
    245  1.1  ad 	if (again)
    246  1.1  ad 		return;
    247  1.1  ad 
    248  1.1  ad 	again = 1;
    249  1.1  ad 
    250  1.1  ad 	for (i = 0; builtin_fonts[i].font; i++) {
    251  1.1  ad 		builtin_fonts[i].next = list;
    252  1.1  ad 		list = &builtin_fonts[i];
    253  1.1  ad 	}
    254  1.1  ad }
    255  1.1  ad 
    256  1.1  ad 
    257  1.1  ad /*
    258  1.1  ad  * Find a font by cookie. Called at splhigh.
    259  1.1  ad  */
    260  1.1  ad static struct font *
    261  1.1  ad wsfont_find0(cookie)
    262  1.1  ad 	int cookie;
    263  1.1  ad {
    264  1.1  ad 	struct font *ent;
    265  1.1  ad 
    266  1.1  ad 	for (ent = list; ent; ent = ent->next)
    267  1.1  ad 		if (ent->cookie == cookie)
    268  1.1  ad 			return (ent);
    269  1.1  ad 
    270  1.1  ad 	return (NULL);
    271  1.1  ad }
    272  1.1  ad 
    273  1.1  ad 
    274  1.1  ad /*
    275  1.1  ad  * Find a font.
    276  1.1  ad  */
    277  1.1  ad int
    278  1.1  ad wsfont_find(name, width, height, stride)
    279  1.1  ad 	char *name;
    280  1.1  ad 	int width, height, stride;
    281  1.1  ad {
    282  1.1  ad 	struct font *ent;
    283  1.1  ad 	int s;
    284  1.1  ad 
    285  1.1  ad 	s = splhigh();
    286  1.1  ad 
    287  1.1  ad 	for (ent = list; ent; ent = ent->next) {
    288  1.1  ad 		if (height && ent->font->fontheight != height)
    289  1.1  ad 			continue;
    290  1.1  ad 
    291  1.1  ad 		if (width && ent->font->fontwidth != width)
    292  1.1  ad 			continue;
    293  1.1  ad 
    294  1.1  ad 		if (stride && ent->font->stride != stride)
    295  1.1  ad 			continue;
    296  1.1  ad 
    297  1.1  ad 		if (name && strcmp(ent->font->name, name))
    298  1.1  ad 			continue;
    299  1.1  ad 
    300  1.1  ad 		splx(s);
    301  1.1  ad 		return (ent->cookie);
    302  1.1  ad 	}
    303  1.1  ad 
    304  1.1  ad 	splx(s);
    305  1.1  ad 	return (-1);
    306  1.1  ad }
    307  1.1  ad 
    308  1.1  ad 
    309  1.1  ad /*
    310  1.1  ad  * Add a font to the list.
    311  1.1  ad  */
    312  1.1  ad #ifdef notyet
    313  1.1  ad int
    314  1.1  ad wsfont_add(font, copy)
    315  1.1  ad 	struct wsdisplay_font *font;
    316  1.1  ad 	int copy;
    317  1.1  ad {
    318  1.1  ad 	struct font *ent;
    319  1.1  ad 	static int cookiegen = 666;
    320  1.1  ad 	int s;
    321  1.1  ad 	size_t size;
    322  1.1  ad 
    323  1.1  ad 	/* Don't allow exact duplicates */
    324  1.1  ad 	s = splhigh();
    325  1.1  ad 
    326  1.1  ad 	if (wsfont_find(font->name, font->fontwidth, font->fontheight,
    327  1.1  ad 	    font->stride) >= 0) {
    328  1.1  ad 		splx(s);
    329  1.1  ad 		return (-1);
    330  1.1  ad 	}
    331  1.1  ad 
    332  1.1  ad 	MALLOC(ent, struct font *, sizeof *ent, M_WSCONS, M_WAITOK);
    333  1.1  ad 
    334  1.1  ad 	ent->lockcount = 0;
    335  1.1  ad 	ent->flg = 0;
    336  1.1  ad 	ent->cookie = cookiegen++;
    337  1.1  ad 	ent->next = list;
    338  1.1  ad 	ent->prev = NULL;
    339  1.1  ad 
    340  1.1  ad 	/* Is this font statically allocated? */
    341  1.1  ad 	if (!copy) {
    342  1.1  ad 		ent->font = font;
    343  1.1  ad 		ent->flg = WSFONT_STATIC;
    344  1.1  ad 	} else {
    345  1.1  ad 		MALLOC(ent->font, struct wsdisplay_font *, sizeof *ent->font,
    346  1.1  ad 		    M_WSCONS, M_WAITOK);
    347  1.1  ad 		memcpy(ent->font, font, sizeof(*ent->font));
    348  1.1  ad 
    349  1.1  ad 		size = font->fontheight * font->numchars * font->stride;
    350  1.1  ad 		MALLOC(ent->font->data, void *, size, M_WSCONS, M_WAITOK);
    351  1.1  ad 		memcpy(ent->font->data, font->data, size);
    352  1.1  ad 		ent->flg = 0;
    353  1.1  ad 	}
    354  1.1  ad 
    355  1.1  ad 	/* Now link into the list and return */
    356  1.1  ad 	list = ent;
    357  1.1  ad 	splx(s);
    358  1.1  ad 	return (0);
    359  1.1  ad }
    360  1.1  ad #endif
    361  1.1  ad 
    362  1.1  ad 
    363  1.1  ad /*
    364  1.1  ad  * Remove a font.
    365  1.1  ad  */
    366  1.1  ad #ifdef notyet
    367  1.1  ad int
    368  1.1  ad wsfont_remove(cookie)
    369  1.1  ad 	int cookie;
    370  1.1  ad {
    371  1.1  ad 	struct font *ent;
    372  1.1  ad 	int s;
    373  1.1  ad 
    374  1.1  ad 	s = splhigh();
    375  1.1  ad 
    376  1.1  ad 	if ((ent = wsfont_find0(cookie)) == NULL) {
    377  1.1  ad 		splx(s);
    378  1.1  ad 		return (-1);
    379  1.1  ad 	}
    380  1.1  ad 
    381  1.1  ad 	if ((ent->flg & WSFONT_BUILTIN) || ent->lockcount != 0) {
    382  1.1  ad 		splx(s);
    383  1.1  ad 		return (-1);
    384  1.1  ad 	}
    385  1.1  ad 
    386  1.1  ad 	/* Don't free statically allocated font data */
    387  1.1  ad 	if (!(ent->flg & WSFONT_STATIC)) {
    388  1.1  ad 		FREE(ent->font->data, M_WSCONS);
    389  1.1  ad 		FREE(ent->font, M_WSCONS);
    390  1.1  ad 	}
    391  1.1  ad 
    392  1.1  ad 	/* Remove from list, free entry */
    393  1.1  ad 	if (ent->prev)
    394  1.1  ad 		ent->prev->next = ent->next;
    395  1.1  ad 	else
    396  1.1  ad 		list = ent->next;
    397  1.1  ad 
    398  1.1  ad 	if (ent->next)
    399  1.1  ad 		ent->next->prev = ent->prev;
    400  1.1  ad 
    401  1.1  ad 	FREE(ent, M_WSCONS);
    402  1.1  ad 	splx(s);
    403  1.1  ad 	return (ent ? 0 : -1);
    404  1.1  ad }
    405  1.1  ad #endif
    406  1.1  ad 
    407  1.1  ad 
    408  1.1  ad /*
    409  1.1  ad  * Lock a given font and return new lockcount.
    410  1.1  ad  */
    411  1.1  ad int
    412  1.1  ad wsfont_lock(cookie, ptr, bitorder, byteorder)
    413  1.1  ad 	int cookie;
    414  1.1  ad 	struct wsdisplay_font **ptr;
    415  1.1  ad 	int bitorder, byteorder;
    416  1.1  ad {
    417  1.1  ad 	struct font *ent;
    418  1.1  ad 	int s, lc;
    419  1.1  ad 
    420  1.1  ad 	s = splhigh();
    421  1.1  ad 
    422  1.1  ad 	if ((ent = wsfont_find0(cookie)) != NULL) {
    423  1.1  ad 		if (bitorder != ent->bitorder) {
    424  1.1  ad 			if (ent->lockcount)
    425  1.1  ad 				return (-1);
    426  1.1  ad 
    427  1.1  ad 			wsfont_revbit(ent->font);
    428  1.1  ad 			ent->bitorder = bitorder;
    429  1.1  ad 		}
    430  1.1  ad 
    431  1.1  ad 		if (byteorder != ent->byteorder) {
    432  1.1  ad 			if (ent->lockcount)
    433  1.1  ad 				return (-1);
    434  1.1  ad 
    435  1.1  ad 			wsfont_revbyte(ent->font);
    436  1.1  ad 			ent->byteorder = byteorder;
    437  1.1  ad 		}
    438  1.1  ad 
    439  1.1  ad 		lc = ++ent->lockcount;
    440  1.1  ad 		*ptr = ent->font;
    441  1.1  ad 	} else
    442  1.1  ad 		lc = -1;
    443  1.1  ad 
    444  1.1  ad 
    445  1.1  ad 	splx(s);
    446  1.1  ad 	return (lc);
    447  1.1  ad }
    448  1.1  ad 
    449  1.1  ad 
    450  1.1  ad /*
    451  1.1  ad  * Get font flags and lockcount.
    452  1.1  ad  */
    453  1.1  ad int
    454  1.1  ad wsfont_getflg(cookie, flg, lc)
    455  1.1  ad 	int cookie, *flg, *lc;
    456  1.1  ad {
    457  1.1  ad 	struct font *ent;
    458  1.1  ad 	int s;
    459  1.1  ad 
    460  1.1  ad 	s = splhigh();
    461  1.1  ad 
    462  1.1  ad 	if ((ent = wsfont_find0(cookie)) != NULL) {
    463  1.1  ad 		*flg = ent->flg;
    464  1.1  ad 		*lc = ent->lockcount;
    465  1.1  ad 	}
    466  1.1  ad 
    467  1.1  ad 	splx(s);
    468  1.1  ad 	return (ent ? 0 : -1);
    469  1.1  ad }
    470  1.1  ad 
    471  1.1  ad 
    472  1.1  ad /*
    473  1.1  ad  * Unlock a given font and return new lockcount.
    474  1.1  ad  */
    475  1.1  ad int
    476  1.1  ad wsfont_unlock(cookie)
    477  1.1  ad 	int cookie;
    478  1.1  ad {
    479  1.1  ad 	struct font *ent;
    480  1.1  ad 	int s, lc;
    481  1.1  ad 
    482  1.1  ad 	s = splhigh();
    483  1.1  ad 
    484  1.1  ad 	if ((ent = wsfont_find0(cookie)) != NULL) {
    485  1.1  ad 		if (ent->lockcount == 0)
    486  1.1  ad 			panic("wsfont_unlock: font not locked\n");
    487  1.1  ad 
    488  1.1  ad 		lc = --ent->lockcount;
    489  1.1  ad 	} else
    490  1.1  ad 		lc = -1;
    491  1.1  ad 
    492  1.1  ad 	splx(s);
    493  1.1  ad 	return (lc);
    494  1.1  ad }
    495