Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/wsfont Added a function to remap Unicode character t...



details:   https://anonhg.NetBSD.org/src/rev/24347ecc6020
branches:  trunk
changeset: 503167:24347ecc6020
user:      marcus <marcus%NetBSD.org@localhost>
date:      Fri Feb 02 06:00:38 2001 +0000

description:
Added a function to remap Unicode character to font glyph index.

diffstat:

 sys/dev/wsfont/wsfont.c |  293 +++++++++++++++++++++++++++++++++++++++++++++++-
 sys/dev/wsfont/wsfont.h |    3 +-
 2 files changed, 293 insertions(+), 3 deletions(-)

diffs (truncated from 327 to 300 lines):

diff -r 7ed6e7aab8d1 -r 24347ecc6020 sys/dev/wsfont/wsfont.c
--- a/sys/dev/wsfont/wsfont.c   Fri Feb 02 05:59:53 2001 +0000
+++ b/sys/dev/wsfont/wsfont.c   Fri Feb 02 06:00:38 2001 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: wsfont.c,v 1.15 2000/11/24 15:47:15 tsutsui Exp $      */
+/*     $NetBSD: wsfont.c,v 1.16 2001/02/02 06:00:38 marcus Exp $       */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wsfont.c,v 1.15 2000/11/24 15:47:15 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wsfont.c,v 1.16 2001/02/02 06:00:38 marcus Exp $");
 
 #include "opt_wsfont.h"
 
@@ -512,3 +512,292 @@
        splx(s);
        return (lc);
 }
+
+
+/*
+ * Unicode to font encoding mappings
+ */
+
+/*
+ * To save memory, font encoding tables use a two level lookup.
+ * First the high byte of the Unicode is used to lookup the level 2
+ * table, then the low byte indexes that table.  Level 2 tables that are
+ * not needed are omitted (NULL), and both level 1 and level 2 tables
+ * have base and size attributes to keep their size down.
+ */
+
+struct wsfont_level1_glyphmap {
+       struct wsfont_level2_glyphmap **level2;
+       int base;       /* High byte for first level2 entry     */
+       int size;       /* Number of level2 entries             */
+};
+
+struct wsfont_level2_glyphmap {
+       int base;       /* Low byte for first character         */
+       int size;       /* Number of characters                 */
+       void *chars;    /* Pointer to character number entries  */
+       int width;      /* Size of each entry in bytes (1,2,4)  */
+};
+
+#define null16                 \
+       NULL, NULL, NULL, NULL, \
+       NULL, NULL, NULL, NULL, \
+       NULL, NULL, NULL, NULL, \
+       NULL, NULL, NULL, NULL
+
+/*
+ * IBM 437 maps
+ */
+
+static u_int8_t
+ibm437_chars_0[] = {
+        0,  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, 41, 42, 43, 44, 45, 46, 47,
+       48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+       64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+       80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
+       96, 97, 98, 99, 100,101,102,103,104,105,106,107,108,109,110,111,
+       112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+       255,173,155,156, 0, 157, 0,  0,  0,  0, 166,174,170, 0,  0,  0,
+        0, 241,253, 0,  0,  0,  0, 249, 0,  0, 167,175,172,171, 0, 168,
+        0,  0,  0,  0, 142,143,146,128, 0, 144, 0,  0,  0,  0,  0,  0,
+        0, 165, 0,  0,  0,  0, 153, 0,  0,  0,  0,  0, 154, 0,  0,  0,
+       133,160,131, 0, 132,134,145,135,138,130,136,137,141,161,140,139,
+        0, 164,149,162,147, 0, 148,246, 0, 151,163,150,129, 0,  0, 152
+},
+ibm437_chars_1[] = {
+       159
+},
+ibm437_chars_3[] = {
+       226, 0,  0,  0,  0, 233, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+       228, 0,  0, 232, 0,  0, 234, 0,  0,  0,  0,  0,  0,  0, 224,225,
+        0, 235,238, 0,  0,  0,  0,  0,  0, 230, 0,  0,  0, 227, 0,  0,
+       229,231
+},
+ibm437_chars_32[] = {
+       252, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0, 158
+},
+ibm437_chars_34[] = {
+       237, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0, 248,250,251, 0,  0,  0, 236, 0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0, 239, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0, 247, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,240,  0,  0,243,
+       242
+},
+ibm437_chars_35[] = {
+       169, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+       244,245
+},
+ibm437_chars_37[] = {
+       196,205,179,186, 0,  0,  0,  0,  0,  0,  0,  0, 218,213,214,201,
+       191,184,183,187,192,212,211,200,217,190,189,188,195,198, 0,  0,
+       199, 0,  0, 204,180,181, 0,  0, 182, 0,  0, 185,194, 0,  0, 209,
+       210, 0,  0, 203,193, 0,  0, 207,208, 0,  0, 202,197, 0,  0, 216,
+        0,  0, 215, 0,  0,  0,  0,  0,  0,  0,  0, 206, 0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+       223, 0,  0,  0, 220, 0,  0,  0, 219, 0,  0,  0, 221, 0,  0,  0,
+       222,176,177,178, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+       254
+};
+
+static struct wsfont_level2_glyphmap
+ibm437_level2_0 = { 0, 256, ibm437_chars_0, 1 },
+ibm437_level2_1 = { 146, 1, ibm437_chars_1, 1 },
+ibm437_level2_3 = { 147, 50, ibm437_chars_3, 1 },
+ibm437_level2_32 = { 127, 41, ibm437_chars_32, 1 },
+ibm437_level2_34 = { 5, 97, ibm437_chars_34, 1 },
+ibm437_level2_35 = { 16, 18, ibm437_chars_35, 1 },
+ibm437_level2_37 = { 0, 161, ibm437_chars_37, 1 };
+
+static struct wsfont_level2_glyphmap *ibm437_level1[] = {
+       &ibm437_level2_0, &ibm437_level2_1, NULL, &ibm437_level2_3,
+       NULL, NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL,
+       &ibm437_level2_32, NULL, &ibm437_level2_34, &ibm437_level2_35,
+       NULL, &ibm437_level2_37
+};
+
+
+/*
+ * ISO-8859-7 maps
+ */
+
+static u_int8_t
+iso7_chars_0[] = {
+        0,  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, 41, 42, 43, 44, 45, 46, 47,
+       48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+       64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+       80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
+       96, 97, 98, 99, 100,101,102,103,104,105,106,107,108,109,110,111,
+       112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
+       128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
+       144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
+       160, 0,  0, 163, 0,  0, 166,167,168,169, 0, 171,172,173, 0,  0,
+       176,177,178,179,180, 0,  0, 183, 0,  0,  0, 187, 0, 189
+},
+iso7_chars_3[] = {
+       182, 0, 184,185,186, 0, 188, 0, 190,191,192,193,194,195,196,197,
+       198,199,200,201,202,203,204,205,206,207,208,209, 0, 211,212,213,
+       214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,
+       230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,
+       246,247,248,249,250,251,252,253,254, 0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 181
+},
+iso7_chars_32[] = {
+       175, 0,  0,  0,  0, 162, 0, 161
+};
+
+static struct wsfont_level2_glyphmap
+iso7_level2_0 = { 0, 190, iso7_chars_0, 1 },
+iso7_level2_3 = { 134, 111, iso7_chars_3, 1 },
+iso7_level2_32 = { 20, 8, iso7_chars_32, 1 };
+
+static struct wsfont_level2_glyphmap *iso7_level1[] = {
+       &iso7_level2_0, NULL, NULL, &iso7_level2_3,
+       NULL, NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL,
+       &iso7_level2_32
+};
+
+
+/*
+ * SONY maps
+ */
+
+static u_int8_t
+sony_chars_0[] = {
+        0,  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, 41, 42, 43, 44, 45, 46, 47,
+       48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+       64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+       80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
+       96, 97, 98, 99, 100,101,102,103,104,105,106,107,108,109,110,111,
+       112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+       128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
+       144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
+       160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
+       176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
+       192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
+       208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223
+};
+static u_int16_t
+sony_chars_255[] = {
+       225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,
+       241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,
+       257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,
+       273,274,275,276,277,278,279,280,281,282,283,284,285,286,287
+};
+
+static struct wsfont_level2_glyphmap
+sony_level2_0 = { 0, 256, sony_chars_0, 1 },
+sony_level2_255 = { 97, 63, sony_chars_255, 2 };
+
+static struct wsfont_level2_glyphmap *sony_level1[] = {
+       &sony_level2_0, NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL,
+       null16, null16, null16, null16,
+       null16, null16, null16, null16,
+       null16, null16, null16, null16,
+       null16, null16,
+       NULL, NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL,
+       NULL, NULL, NULL, NULL,
+       NULL, NULL, NULL, &sony_level2_255
+};
+
+static struct wsfont_level1_glyphmap encodings[] = {
+       { NULL, 0, 0 },                 /* WSDISPLAY_FONTENC_ISO */
+       { ibm437_level1, 0, 38 },       /* WSDISPLAY_FONTENC_IBM */
+       { NULL, 0, 0 },                 /* WSDISPLAY_FONTENC_PCVT */
+       { iso7_level1, 0, 33 },         /* WSDISPLAY_FONTENC_ISO7 */
+       { sony_level1, 0, 256 },        /* WSDISPLAY_FONTENC_SONY */
+};
+
+#define MAX_ENCODING WSDISPLAY_FONTENC_SONY
+
+/*
+ * Remap Unicode character to glyph
+ */
+int
+wsfont_map_unichar(font, c)
+       struct wsdisplay_font *font;
+       int c;
+{
+       if (font->encoding == WSDISPLAY_FONTENC_ISO) {
+
+               return c;
+
+       } else if (font->encoding < 0 || font->encoding > MAX_ENCODING) {
+
+               return (-1);
+
+       } else {
+
+               int hi = (c >> 8), lo = c & 255;
+               struct wsfont_level1_glyphmap *map1 =
+                       &encodings[font->encoding];
+
+               if (hi >= map1->base && hi < map1->base + map1->size) {
+                       struct wsfont_level2_glyphmap *map2 =
+                         map1->level2[hi - map1->base];
+
+                       if (map2 != NULL &&
+                           lo >= map2->base && hi < map2->base + map2->size) {
+
+                               lo -= map2->base;
+
+                               switch(map2->width) {
+                                case 1:
+                                  c = (((u_int8_t *)map2->chars)[lo]);
+                                  break;
+                                case 2:
+                                  c = (((u_int16_t *)map2->chars)[lo]);
+                                  break;
+                                case 4:
+                                  c = (((u_int32_t *)map2->chars)[lo]);
+                                  break;
+                               }
+
+                               if (c == 0 && lo != 0)
+                                       return (-1);
+                               else
+                                       return (c);
+



Home | Main Index | Thread Index | Old Index