This source file includes following definitions.
- wsfont_revbit
- wsfont_revbyte
- wsfont_enum
- wsfont_rotate_internal
- wsfont_rotate
- wsfont_init
- wsfont_find0
- wsfont_find
- wsfont_add
- wsfont_remove
- wsfont_lock
- wsfont_getflg
- wsfont_unlock
- wsfont_map_unichar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 #include <sys/types.h>
41 #include <sys/param.h>
42 #include <sys/systm.h>
43 #include <sys/time.h>
44 #include <sys/malloc.h>
45
46 #include <dev/wscons/wsdisplayvar.h>
47 #include <dev/wscons/wsconsio.h>
48 #include <dev/wsfont/wsfont.h>
49
50 #include "wsfont_glue.h"
51
52 #undef HAVE_FONT
53
54 #ifdef FONT_QVSS8x15
55 #define HAVE_FONT 1
56 #include <dev/wsfont/qvss8x15.h>
57 #endif
58
59 #ifdef FONT_LUCIDA16x29
60 #define HAVE_FONT 1
61 #include <dev/wsfont/lucida16x29.h>
62 #endif
63
64 #ifdef FONT_VT220L8x8
65 #define HAVE_FONT 1
66 #include <dev/wsfont/vt220l8x8.h>
67 #endif
68
69 #ifdef FONT_VT220L8x10
70 #define HAVE_FONT 1
71 #include <dev/wsfont/vt220l8x10.h>
72 #endif
73
74 #ifdef FONT_SONY8x16
75 #define HAVE_FONT 1
76 #include <dev/wsfont/sony8x16.h>
77 #endif
78
79 #ifdef FONT_SONY12x24
80 #define HAVE_FONT 1
81 #include <dev/wsfont/sony12x24.h>
82 #endif
83
84 #ifdef FONT_OMRON12x20
85 #define HAVE_FONT 1
86 #include <dev/wsfont/omron12x20.h>
87 #endif
88
89 #ifdef FONT_BOLD8x16
90 #define HAVE_FONT 1
91 #include <dev/wsfont/bold8x16.h>
92 #endif
93
94 #ifdef FONT_GALLANT12x22
95 #define HAVE_FONT 1
96 #endif
97
98 #ifdef FONT_BOLD8x16_ISO1
99 #define HAVE_FONT 1
100 #endif
101
102
103
104
105
106
107
108 #ifndef HAVE_FONT
109 #define HAVE_FONT 1
110
111 #define FONT_BOLD8x16_ISO1
112 #if defined(__sparc__) || defined(__sparc64__) || defined(luna88k) || !defined(SMALL_KERNEL)
113 #define FONT_GALLANT12x22
114 #endif
115
116 #endif
117
118 #ifdef FONT_BOLD8x16_ISO1
119 #include <dev/wsfont/bold8x16-iso1.h>
120 #endif
121
122 #ifdef FONT_GALLANT12x22
123 #include <dev/wsfont/gallant12x22.h>
124 #endif
125
126
127 struct font {
128 struct font *next;
129 struct font *prev;
130 struct wsdisplay_font *font;
131 u_short lockcount;
132 u_short cookie;
133 u_short flg;
134 };
135
136
137 static struct font *list, builtin_fonts[] = {
138 #ifdef FONT_BOLD8x16
139 { NULL, NULL, &bold8x16, 0, 1, WSFONT_STATIC | WSFONT_BUILTIN },
140 #endif
141 #ifdef FONT_BOLD8x16_ISO1
142 { NULL, NULL, &bold8x16_iso1, 0, 2, WSFONT_STATIC | WSFONT_BUILTIN },
143 #endif
144 #ifdef FONT_COURIER11x18
145 { NULL, NULL, &courier11x18, 0, 3, WSFONT_STATIC | WSFONT_BUILTIN },
146 #endif
147 #ifdef FONT_GALLANT12x22
148 { NULL, NULL, &gallant12x22, 0, 4, WSFONT_STATIC | WSFONT_BUILTIN },
149 #endif
150 #ifdef FONT_LUCIDA16x29
151 { NULL, NULL, &lucida16x29, 0, 5, WSFONT_STATIC | WSFONT_BUILTIN },
152 #endif
153 #ifdef FONT_QVSS8x15
154 { NULL, NULL, &qvss8x15, 0, 6, WSFONT_STATIC | WSFONT_BUILTIN },
155 #endif
156 #ifdef FONT_VT220L8x8
157 { NULL, NULL, &vt220l8x8, 0, 7, WSFONT_STATIC | WSFONT_BUILTIN },
158 #endif
159 #ifdef FONT_VT220L8x10
160 { NULL, NULL, &vt220l8x10, 0, 8, WSFONT_STATIC | WSFONT_BUILTIN },
161 #endif
162 #ifdef FONT_SONY8x16
163 { NULL, NULL, &sony8x16, 0, 9, WSFONT_STATIC | WSFONT_BUILTIN },
164 #endif
165 #ifdef FONT_SONY12x24
166 { NULL, NULL, &sony12x24, 0, 10, WSFONT_STATIC | WSFONT_BUILTIN },
167 #endif
168 #ifdef FONT_OMRON12x20
169 { NULL, NULL, &omron12x20, 0, 11, WSFONT_STATIC | WSFONT_BUILTIN },
170 #endif
171 { NULL, NULL, NULL, 0 },
172 };
173
174 #if !defined(SMALL_KERNEL) || defined(__alpha__)
175
176
177 static const u_char reverse[256] = {
178 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
179 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
180 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
181 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
182 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
183 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
184 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
185 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
186 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
187 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
188 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
189 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
190 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
191 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
192 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
193 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
194 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
195 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
196 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
197 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
198 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
199 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
200 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
201 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
202 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
203 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
204 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
205 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
206 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
207 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
208 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
209 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
210 };
211
212 #endif
213
214 static struct font *wsfont_find0(int);
215
216 #if !defined(SMALL_KERNEL) || defined(__alpha__)
217
218
219
220
221 static void wsfont_revbit(struct wsdisplay_font *);
222 static void
223 wsfont_revbit(font)
224 struct wsdisplay_font *font;
225 {
226 u_char *p, *m;
227
228 p = (u_char *)font->data;
229 m = p + font->stride * font->numchars * font->fontheight;
230
231 for (; p < m; p++)
232 *p = reverse[*p];
233 }
234
235 #endif
236
237 #if !defined(SMALL_KERNEL)
238
239
240
241
242 static void wsfont_revbyte(struct wsdisplay_font *);
243 static void
244 wsfont_revbyte(font)
245 struct wsdisplay_font *font;
246 {
247 int x, l, r, nr;
248 u_char *rp;
249
250 if (font->stride == 1)
251 return;
252
253 rp = (u_char *)font->data;
254 nr = font->numchars * font->fontheight;
255
256 while (nr--) {
257 l = 0;
258 r = font->stride - 1;
259
260 while (l < r) {
261 x = rp[l];
262 rp[l] = rp[r];
263 rp[r] = x;
264 l++, r--;
265 }
266
267 rp += font->stride;
268 }
269 }
270
271 #endif
272
273
274
275
276 void
277 wsfont_enum(cb)
278 void (*cb)(char *, int, int, int);
279 {
280 struct wsdisplay_font *f;
281 struct font *ent;
282 int s;
283
284 s = splhigh();
285
286 for (ent = list; ent; ent = ent->next) {
287 f = ent->font;
288 cb(f->name, f->fontwidth, f->fontheight, f->stride);
289 }
290
291 splx(s);
292 }
293
294 #if NRASOPS_ROTATION > 0
295
296 struct wsdisplay_font *wsfont_rotate_internal(struct wsdisplay_font *);
297
298 struct wsdisplay_font *
299 wsfont_rotate_internal(struct wsdisplay_font *font)
300 {
301 int b, n, r, newstride;
302 struct wsdisplay_font *newfont;
303 char *newbits;
304
305
306 newfont = malloc(sizeof *font, M_DEVBUF, M_WAITOK);
307 if (newfont == NULL)
308 return (NULL);
309
310 bcopy(font, newfont, sizeof *font);
311 newfont->cookie = NULL;
312
313
314 newstride = (font->fontheight + 7) / 8;
315 newbits = malloc(newstride * font->fontwidth * font->numchars,
316 M_DEVBUF, M_WAITOK);
317 if (newbits == NULL) {
318 free(newfont, M_DEVBUF);
319 return (NULL);
320 }
321
322 bzero(newbits, newstride * font->fontwidth * font->numchars);
323
324
325 for (n = 0; n < font->numchars; n++) {
326 char *ch = font->data + (n * font->stride * font->fontheight);
327
328 for (r = 0; r < font->fontheight; r++) {
329 for (b = 0; b < font->fontwidth; b++) {
330 unsigned char *rb;
331
332 rb = ch + (font->stride * r) + (b / 8);
333 if (*rb & (0x80 >> (b % 8))) {
334 unsigned char *rrb;
335
336 rrb = newbits + newstride - 1 - (r / 8)
337 + (n * newstride * font->fontwidth)
338 + (newstride * b);
339 *rrb |= (1 << (r % 8));
340 }
341 }
342 }
343 }
344
345 newfont->data = newbits;
346
347
348 newfont->stride = newstride;
349 newfont->fontwidth = font->fontheight;
350 newfont->fontheight = font->fontwidth;
351
352 if (wsfont_add(newfont, 0) != 0) {
353
354
355
356
357 free(newbits, M_DEVBUF);
358 free(newfont, M_DEVBUF);
359 newfont = NULL;
360 }
361
362 return (newfont);
363 }
364
365 int
366 wsfont_rotate(int cookie)
367 {
368 int s, ncookie;
369 struct wsdisplay_font *font;
370 struct font *origfont;
371
372 s = splhigh();
373 origfont = wsfont_find0(cookie);
374 splx(s);
375
376 font = wsfont_rotate_internal(origfont->font);
377 if (font == NULL)
378 return (-1);
379
380 ncookie = wsfont_find(font->name, font->fontwidth, font->fontheight,
381 font->stride);
382
383 return (ncookie);
384 }
385
386 #endif
387
388
389
390
391 void
392 wsfont_init(void)
393 {
394 static int again;
395 int i;
396
397 if (again != 0)
398 return;
399 again = 1;
400
401 for (i = 0; builtin_fonts[i].font != NULL; i++) {
402 builtin_fonts[i].next = list;
403 list = &builtin_fonts[i];
404 }
405 }
406
407
408
409
410 static struct font *
411 wsfont_find0(cookie)
412 int cookie;
413 {
414 struct font *ent;
415
416 for (ent = list; ent != NULL; ent = ent->next)
417 if (ent->cookie == cookie)
418 return (ent);
419
420 return (NULL);
421 }
422
423
424
425
426 int
427 wsfont_find(name, width, height, stride)
428 char *name;
429 int width, height, stride;
430 {
431 struct font *ent;
432 int s;
433
434 s = splhigh();
435
436 for (ent = list; ent != NULL; ent = ent->next) {
437 if (height != 0 && ent->font->fontheight != height)
438 continue;
439
440 if (width != 0 && ent->font->fontwidth != width)
441 continue;
442
443 if (stride != 0 && ent->font->stride != stride)
444 continue;
445
446 if (name != NULL && strcmp(ent->font->name, name) != 0)
447 continue;
448
449 splx(s);
450 return (ent->cookie);
451 }
452
453 splx(s);
454 return (-1);
455 }
456
457
458
459
460 int
461 wsfont_add(font, copy)
462 struct wsdisplay_font *font;
463 int copy;
464 {
465 static int cookiegen = 666;
466 struct font *ent;
467 size_t size;
468 int s;
469
470 s = splhigh();
471
472
473 if (wsfont_find(font->name, font->fontwidth, font->fontheight,
474 font->stride) >= 0) {
475 splx(s);
476 return (-1);
477 }
478
479 MALLOC(ent, struct font *, sizeof *ent, M_DEVBUF, M_WAITOK);
480
481 ent->lockcount = 0;
482 ent->flg = 0;
483 ent->cookie = cookiegen++;
484 ent->next = list;
485 ent->prev = NULL;
486
487
488 if (!copy) {
489 ent->font = font;
490 ent->flg = WSFONT_STATIC;
491 } else {
492 MALLOC(ent->font, struct wsdisplay_font *, sizeof *ent->font,
493 M_DEVBUF, M_WAITOK);
494 memcpy(ent->font, font, sizeof(*ent->font));
495
496 size = font->fontheight * font->numchars * font->stride;
497 MALLOC(ent->font->data, void *, size, M_DEVBUF, M_WAITOK);
498 memcpy(ent->font->data, font->data, size);
499 ent->flg = 0;
500 }
501
502
503 list = ent;
504 splx(s);
505 return (0);
506 }
507
508
509
510
511 #ifdef notyet
512 int
513 wsfont_remove(cookie)
514 int cookie;
515 {
516 struct font *ent;
517 int s;
518
519 s = splhigh();
520
521 if ((ent = wsfont_find0(cookie)) == NULL) {
522 splx(s);
523 return (-1);
524 }
525
526 if ((ent->flg & WSFONT_BUILTIN) != 0 || ent->lockcount != 0) {
527 splx(s);
528 return (-1);
529 }
530
531
532 if ((ent->flg & WSFONT_STATIC) != 0) {
533 FREE(ent->font->data, M_DEVBUF);
534 FREE(ent->font, M_DEVBUF);
535 }
536
537
538 if (ent->prev)
539 ent->prev->next = ent->next;
540 else
541 list = ent->next;
542
543 if (ent->next)
544 ent->next->prev = ent->prev;
545
546 FREE(ent, M_DEVBUF);
547 splx(s);
548 return (0);
549 }
550 #endif
551
552
553
554
555
556
557 int
558 wsfont_lock(cookie, ptr, bitorder, byteorder)
559 int cookie;
560 struct wsdisplay_font **ptr;
561 int bitorder, byteorder;
562 {
563 struct font *ent;
564 int s, lc;
565
566 s = splhigh();
567
568 if ((ent = wsfont_find0(cookie)) != NULL) {
569 if (bitorder && bitorder != ent->font->bitorder) {
570 #if !defined(SMALL_KERNEL) || defined(__alpha__)
571 if (ent->lockcount) {
572 splx(s);
573 return (-1);
574 }
575 wsfont_revbit(ent->font);
576 ent->font->bitorder = bitorder;
577 #else
578 splx(s);
579 return (-1);
580 #endif
581 }
582
583 if (byteorder && byteorder != ent->font->byteorder) {
584 #if !defined(SMALL_KERNEL)
585 if (ent->lockcount) {
586 splx(s);
587 return (-1);
588 }
589 wsfont_revbyte(ent->font);
590 ent->font->byteorder = byteorder;
591 #else
592 splx(s);
593 return (-1);
594 #endif
595 }
596
597 lc = ++ent->lockcount;
598 *ptr = ent->font;
599 } else
600 lc = -1;
601
602 splx(s);
603 return (lc);
604 }
605
606
607
608
609 int
610 wsfont_getflg(cookie, flg, lc)
611 int cookie, *flg, *lc;
612 {
613 struct font *ent;
614 int s;
615
616 s = splhigh();
617
618 if ((ent = wsfont_find0(cookie)) != NULL) {
619 *flg = ent->flg;
620 *lc = ent->lockcount;
621 }
622
623 splx(s);
624 return (ent != NULL ? 0 : -1);
625 }
626
627
628
629
630 int
631 wsfont_unlock(cookie)
632 int cookie;
633 {
634 struct font *ent;
635 int s, lc;
636
637 s = splhigh();
638
639 if ((ent = wsfont_find0(cookie)) != NULL) {
640 if (ent->lockcount == 0)
641 panic("wsfont_unlock: font not locked");
642 lc = --ent->lockcount;
643 } else
644 lc = -1;
645
646 splx(s);
647 return (lc);
648 }
649
650 #if !defined(SMALL_KERNEL)
651
652
653
654
655
656
657
658
659
660
661
662
663
664 struct wsfont_level1_glyphmap {
665 struct wsfont_level2_glyphmap **level2;
666 int base;
667 int size;
668 };
669
670 struct wsfont_level2_glyphmap {
671 int base;
672 int size;
673 void *chars;
674 int width;
675 };
676
677 #define null16 \
678 NULL, NULL, NULL, NULL, \
679 NULL, NULL, NULL, NULL, \
680 NULL, NULL, NULL, NULL, \
681 NULL, NULL, NULL, NULL
682
683
684
685
686
687 static u_int8_t
688 ibm437_chars_0[] = {
689 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
690 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
691 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
692 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
693 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
694 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
695 96, 97, 98, 99, 100,101,102,103,104,105,106,107,108,109,110,111,
696 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
697 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
698 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
699 255,173,155,156, 0, 157, 0, 0, 0, 0, 166,174,170, 0, 0, 0,
700 0, 241,253, 0, 0, 0, 0, 249, 0, 0, 167,175,172,171, 0, 168,
701 0, 0, 0, 0, 142,143,146,128, 0, 144, 0, 0, 0, 0, 0, 0,
702 0, 165, 0, 0, 0, 0, 153, 0, 0, 0, 0, 0, 154, 0, 0, 0,
703 133,160,131, 0, 132,134,145,135,138,130,136,137,141,161,140,139,
704 0, 164,149,162,147, 0, 148,246, 0, 151,163,150,129, 0, 0, 152
705 },
706 ibm437_chars_1[] = {
707 159
708 },
709 ibm437_chars_3[] = {
710 226, 0, 0, 0, 0, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
711 228, 0, 0, 232, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, 224,225,
712 0, 235,238, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 227, 0, 0,
713 229,231
714 },
715 ibm437_chars_32[] = {
716 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
717 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
718 0, 0, 0, 0, 0, 0, 0, 0, 158
719 },
720 ibm437_chars_34[] = {
721 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
722 0, 0, 0, 248,250,251, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0,
723 0, 0, 0, 0, 239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
724 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
725 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
726 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0,243,
727 242
728 },
729 ibm437_chars_35[] = {
730 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
731 244,245
732 },
733 ibm437_chars_37[] = {
734 196,205,179,186, 0, 0, 0, 0, 0, 0, 0, 0, 218,213,214,201,
735 191,184,183,187,192,212,211,200,217,190,189,188,195,198, 0, 0,
736 199, 0, 0, 204,180,181, 0, 0, 182, 0, 0, 185,194, 0, 0, 209,
737 210, 0, 0, 203,193, 0, 0, 207,208, 0, 0, 202,197, 0, 0, 216,
738 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0, 0, 0,
739 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
740 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
741 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
742 223, 0, 0, 0, 220, 0, 0, 0, 219, 0, 0, 0, 221, 0, 0, 0,
743 222,176,177,178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
744 254
745 };
746
747 static struct wsfont_level2_glyphmap
748 ibm437_level2_0 = { 0, 256, ibm437_chars_0, 1 },
749 ibm437_level2_1 = { 146, 1, ibm437_chars_1, 1 },
750 ibm437_level2_3 = { 147, 50, ibm437_chars_3, 1 },
751 ibm437_level2_32 = { 127, 41, ibm437_chars_32, 1 },
752 ibm437_level2_34 = { 5, 97, ibm437_chars_34, 1 },
753 ibm437_level2_35 = { 16, 18, ibm437_chars_35, 1 },
754 ibm437_level2_37 = { 0, 161, ibm437_chars_37, 1 };
755
756 static struct wsfont_level2_glyphmap *ibm437_level1[] = {
757 &ibm437_level2_0, &ibm437_level2_1, NULL, &ibm437_level2_3,
758 NULL, NULL, NULL, NULL,
759 NULL, NULL, NULL, NULL,
760 NULL, NULL, NULL, NULL,
761 NULL, NULL, NULL, NULL,
762 NULL, NULL, NULL, NULL,
763 NULL, NULL, NULL, NULL,
764 NULL, NULL, NULL, NULL,
765 &ibm437_level2_32, NULL, &ibm437_level2_34, &ibm437_level2_35,
766 NULL, &ibm437_level2_37
767 };
768
769
770
771
772
773
774 static u_int8_t
775 iso7_chars_0[] = {
776 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
777 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
778 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
779 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
780 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
781 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
782 96, 97, 98, 99, 100,101,102,103,104,105,106,107,108,109,110,111,
783 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
784 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
785 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
786 160, 0, 0, 163, 0, 0, 166,167,168,169, 0, 171,172,173, 0, 0,
787 176,177,178,179,180, 0, 0, 183, 0, 0, 0, 187, 0, 189
788 },
789 iso7_chars_3[] = {
790 182, 0, 184,185,186, 0, 188, 0, 190,191,192,193,194,195,196,197,
791 198,199,200,201,202,203,204,205,206,207,208,209, 0, 211,212,213,
792 214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,
793 230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,
794 246,247,248,249,250,251,252,253,254, 0, 0, 0, 0, 0, 0, 0,
795 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
796 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 181
797 },
798 iso7_chars_32[] = {
799 175, 0, 0, 0, 0, 162, 0, 161
800 };
801
802 static struct wsfont_level2_glyphmap
803 iso7_level2_0 = { 0, 190, iso7_chars_0, 1 },
804 iso7_level2_3 = { 134, 111, iso7_chars_3, 1 },
805 iso7_level2_32 = { 20, 8, iso7_chars_32, 1 };
806
807 static struct wsfont_level2_glyphmap *iso7_level1[] = {
808 &iso7_level2_0, NULL, NULL, &iso7_level2_3,
809 NULL, NULL, NULL, NULL,
810 NULL, NULL, NULL, NULL,
811 NULL, NULL, NULL, NULL,
812 NULL, NULL, NULL, NULL,
813 NULL, NULL, NULL, NULL,
814 NULL, NULL, NULL, NULL,
815 NULL, NULL, NULL, NULL,
816 &iso7_level2_32
817 };
818
819
820 static struct wsfont_level1_glyphmap encodings[] = {
821 { NULL, 0, 0 },
822 { ibm437_level1, 0, 38 },
823 { NULL, 0, 0 },
824 { iso7_level1, 0, 33 },
825 };
826
827 #define MAX_ENCODING (sizeof(encodings) / sizeof(encodings[0]))
828
829 #endif
830
831
832
833
834 int
835 wsfont_map_unichar(font, c)
836 struct wsdisplay_font *font;
837 int c;
838 {
839 if (font->encoding == WSDISPLAY_FONTENC_ISO)
840 return c;
841 else
842 #if !defined(SMALL_KERNEL)
843 if (font->encoding < 0 || font->encoding > MAX_ENCODING)
844 return (-1);
845 else {
846 int hi = (c >> 8), lo = c & 255;
847 struct wsfont_level1_glyphmap *map1 =
848 &encodings[font->encoding];
849
850 if (hi >= map1->base && hi < map1->base + map1->size) {
851 struct wsfont_level2_glyphmap *map2 =
852 map1->level2[hi - map1->base];
853
854 if (map2 != NULL &&
855 lo >= map2->base && lo < map2->base + map2->size) {
856
857 lo -= map2->base;
858
859 switch(map2->width) {
860 case 1:
861 c = (((u_int8_t *)map2->chars)[lo]);
862 break;
863 case 2:
864 c = (((u_int16_t *)map2->chars)[lo]);
865 break;
866 case 4:
867 c = (((u_int32_t *)map2->chars)[lo]);
868 break;
869 }
870
871 if (c == 0 && lo != 0)
872 return (-1);
873 else
874 return (c);
875
876 } else {
877 return (-1);
878 }
879
880 } else {
881 return (-1);
882 }
883
884 }
885 #else
886 return (-1);
887 #endif
888 }