diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | ascii.c | 222 | ||||
-rw-r--r-- | font_load.c | 18 | ||||
-rw-r--r-- | main.c | 11 | ||||
-rw-r--r-- | refresh.c | 26 | ||||
-rw-r--r-- | ucf.c | 133 | ||||
-rw-r--r-- | ucf.h | 14 | ||||
-rw-r--r-- | uuterm.h | 1 |
8 files changed, 413 insertions, 14 deletions
@@ -1,7 +1,7 @@ # uuterm, Copyright (C) 2006 Rich Felker; licensed under GNU GPL v2 only -SRCS = main.c term.c comb.c tty.c alloc.c refresh.c ascii.c fbcon.c dblbuf.c +SRCS = main.c term.c comb.c tty.c alloc.c refresh.c ascii.c ucf.c font_load.c fbcon.c dblbuf.c OBJS = $(SRCS:.c=.o) CFLAGS = -O2 -s #-g @@ -1,7 +1,149 @@ /* Standard ASCII console font. If you want to pretend there's a copyright * on this you'll just be making a fool of yourself. Public domain. */ -static const unsigned char ascii[] = { +/* ... converted to UCF format; added linedraw chars */ + +const unsigned char vga_ascii_ucf[] = { +0x75,0x63,0x66,0xc0,0x00,0x01,0x00,0x00,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x08,0xb8,0x00,0x00,0x08,0xc0, +0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xa2,0x00,0x00,0x1f,0x5e,0x00,0x00,0x00,0x61, +0x00,0x00,0x01,0x2f,0x00,0x00,0x00,0x27,0x00,0x00,0x02,0x52,0x00,0x00,0x00,0x1d, +0x00,0x00,0x00,0xda,0x00,0x00,0x00,0xc8,0x00,0x00,0xd2,0x38,0x00,0x00,0x00,0x06, +0x00,0x00,0x07,0xf7,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x00,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04, +0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x08, +0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x0c, +0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x10, +0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x14, +0x00,0x00,0x00,0x15,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x18, +0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x1c, +0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x20, +0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x24, +0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x28, +0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x2c, +0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x30, +0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x34, +0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x38, +0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x3c, +0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x40, +0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x44, +0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x48, +0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x4c, +0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x50, +0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x54, +0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x58, +0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x5c, +0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x5e,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, +0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0d, +0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0d,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x60, +0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x64, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x65, +0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x68, +0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x6a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x00,0x00,0x00,0x6b,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x6d, +0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x6f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x70,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x72,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x74,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x76,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x78,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x7a,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7c,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x7e,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x7f,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x81,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x83, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x84,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x85,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x00,0x00,0x00,0x86,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x87, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x88,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x89,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x00,0x00,0x00,0x8a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x8b, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x8c,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x8d,0x00,0x00,0x00,0x8e, +0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x92, +0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x94,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x95,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x96,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x97,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x98,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x99,0x00,0x00,0x00,0x9a, +0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x9c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x00,0x00,0x00,0x9d,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x9e,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x00,0x00,0x00,0x9f,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0xa1, +0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0xa3,0xff,0xff,0xff,0xff, +0x80,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0xa4,0x01,0x00,0x00,0xa5, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x3c,0x3c,0x3c,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, 0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, @@ -97,10 +239,76 @@ static const unsigned char ascii[] = { 0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x18,0x18,0x18,0x0e,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00, 0x00,0x00,0x76,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x7f,0x20,0x10,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x08,0x1c,0x2a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x02,0x7f,0x02,0x04,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x2a,0x1c,0x08,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x22,0x7f,0x22,0x14,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x08,0x1c,0x2a,0x08,0x08,0x08,0x08,0x2a,0x1c,0x08,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x02,0x12,0x22,0x7e,0x20,0x10,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x28,0x28,0x38,0x28,0x28,0x00,0x1c,0x08,0x08,0x08,0x08,0x00,0x00,0x00, +0x00,0x00,0x20,0x20,0x20,0x20,0x38,0x00,0x0e,0x08,0x0c,0x08,0x08,0x00,0x00,0x00, +0x00,0x00,0x28,0x28,0x28,0x10,0x10,0x00,0x1c,0x08,0x08,0x08,0x08,0x00,0x00,0x00, +0x00,0x00,0x1c,0x10,0x18,0x10,0x10,0x00,0x0e,0x08,0x0c,0x08,0x08,0x00,0x00,0x00, +0x00,0x00,0x18,0x20,0x20,0x20,0x18,0x00,0x0e,0x0a,0x0c,0x0a,0x0a,0x00,0x00,0x00, +0x00,0x00,0x24,0x34,0x3c,0x2c,0x24,0x00,0x08,0x08,0x08,0x08,0x0e,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00, +0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x08,0x08,0x08,0x08,0x08,0x08,0x08, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x20,0x27,0x24,0x24,0x24,0x24,0x24,0x24, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x08,0x08,0x08,0x08,0x08,0x08,0x08, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x04,0xe4,0x24,0x24,0x24,0x24,0x24,0x24, +0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x27,0x20,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, +0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0xe4,0x04,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, +0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0f,0x08,0x08,0x08,0x08,0x08,0x08,0x08, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x27,0x20,0x27,0x24,0x24,0x24,0x24,0x24,0x24, +0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xf8,0x08,0x08,0x08,0x08,0x08,0x08,0x08, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0xe4,0x04,0xe4,0x24,0x24,0x24,0x24,0x24,0x24, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x08,0x08,0x08,0x08,0x08,0x08,0x08, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xe7,0x24,0x24,0x24,0x24,0x24,0x24, +0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0xe7,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00, +0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xff,0x08,0x08,0x08,0x08,0x08,0x08,0x08, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0xe7,0x00,0xe7,0x24,0x24,0x24,0x24,0x24,0x24, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x20,0x27,0x24,0x24,0x24,0x24,0x24,0x24, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x04,0xe4,0x24,0x24,0x24,0x24,0x24,0x24, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x27,0x20,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0xe4,0x04,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x27,0x20,0x27,0x24,0x24,0x24,0x24,0x24,0x24, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0xe4,0x04,0xe4,0x24,0x24,0x24,0x24,0x24,0x24, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xe7,0x24,0x24,0x24,0x24,0x24,0x24, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0xe7,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0xe7,0x00,0xe7,0x24,0x24,0x24,0x24,0x24,0x24, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x04,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, +0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x3c,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x20,0x3f,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, +0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f, +0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44, +0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa, +0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77, +0x00,0x00,0x00,0x00,0x00,0xc0,0xf0,0xfc,0xfe,0xfc,0xf0,0xc0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x06,0x1e,0x7e,0xfe,0x7e,0x1e,0x06,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x10,0x38,0x7c,0xfe,0x7c,0x38,0x10,0x00,0x00,0x00,0x00, +0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00, +0x00,0x00,0x3e,0x63,0x5d,0x5d,0x7d,0x7b,0x77,0x77,0x7f,0x77,0x77,0x3e,0x00,0x00, +0x00,0x00,0x0f,0x38,0x33,0x67,0x7f,0x7f,0x7f,0x7e,0x7f,0x3e,0x3e,0x0f,0x00,0x00, +0x00,0x00,0xf0,0x1c,0xcc,0xe6,0xe6,0xce,0x3e,0x7e,0xfe,0x7c,0x7c,0xf0,0x00,0x00, }; - -const void *ascii_get_glyph(unsigned c) -{ - if (c - 32 < 95) return ascii + 16*(c-32); - else return ascii; -} diff --git a/font_load.c b/font_load.c new file mode 100644 index 0000000..33f92dd --- /dev/null +++ b/font_load.c @@ -0,0 +1,18 @@ +#include <fcntl.h> +#include <unistd.h> +#include <sys/mman.h> + +#include "ucf.h" + +int ucf_load(struct ucf *f, const char *filename) +{ + int fd = open(filename, O_RDONLY); + unsigned char *map; + size_t l; + + if (fd < 0) return -1; + map = mmap(0, l=lseek(fd, 0, SEEK_END), PROT_READ, MAP_SHARED, fd, 0); + close(fd); + if (map == MAP_FAILED) return -1; + return ucf_init(f, map, l); +} @@ -1,5 +1,6 @@ /* uuterm, Copyright (C) 2006 Rich Felker; licensed under GNU GPL v2 only */ +#include <stdlib.h> #include <string.h> #include <unistd.h> #include <signal.h> @@ -8,11 +9,16 @@ #include <sys/time.h> /* for broken systems */ #include "uuterm.h" +#include "ucf.h" + +int ucf_load(struct ucf *, const char *); +extern const unsigned char vga_ascii_ucf[]; int main(int argc, char *argv[]) { struct uuterm t = { }; struct uudisp d = { }; + struct ucf f = { }; int tty, max; int i, l; unsigned char b[256]; @@ -22,8 +28,13 @@ int main(int argc, char *argv[]) setlocale(LC_CTYPE, ""); + if (ucf_load(&f, getenv("UUTERM_FONT")) < 0 + && ucf_init(&f, vga_ascii_ucf, -1) < 0) + return 1; + d.cell_w = 8; d.cell_h = 16; + d.font = &f; if (uudisp_open(&d) < 0) return 1; @@ -1,6 +1,7 @@ /* uuterm, Copyright (C) 2006 Rich Felker; licensed under GNU GPL v2 only */ #include "uuterm.h" +#include "ucf.h" static void extract_cell(unsigned *ch, struct uucell *cell) { @@ -19,15 +20,21 @@ static void extract_cell(unsigned *ch, struct uucell *cell) const void *ascii_get_glyph(unsigned); -static const void *lookup_glyph(unsigned *this, int i, unsigned *prev, unsigned *next) +static const void *lookup_glyph(struct ucf *f, int i, unsigned *this, unsigned *prev, unsigned *next, int width, int part) { - return ascii_get_glyph(this[i]); + const unsigned char *a; + static const unsigned c[2] = { 0xfffd, 0 }; + int g = ucf_lookup(f, i, this, prev, next, width); + if (g<0 && !i) g = ucf_lookup(f, i, c, c, c, width); + if (g>=0) return f->glyphs + f->S * (g + part); + return 0; } void uuterm_refresh_row(struct uudisp *d, struct uurow *row, int x1, int x2) { - unsigned ch[4][sizeof(row->cells[0].c)+1]; + unsigned ch[4][sizeof(row->cells[0].c)+1], *chp; int x, i; + int width, part; if (x1) extract_cell(ch[(x1-1)&3], &row->cells[x1-1]); else memset(ch[3], 0, sizeof(ch[3])); @@ -35,9 +42,16 @@ void uuterm_refresh_row(struct uudisp *d, struct uurow *row, int x1, int x2) for (x=x1; x<=x2; x++) { extract_cell(ch[(x+1)&3], &row->cells[x+1]); - for (i=0; i<sizeof(ch[0]) && ch[x&3][i]; i++) { - const void *glyph = lookup_glyph(ch[x&3], i, ch[(x+3)&3], ch[(x+1)&3]); - uudisp_draw_glyph(d, row->idx, x, glyph, row->cells[x].a & 0xff); + if (ch[x&3][0] == UU_FULLWIDTH) { + width = 2; part = 0; chp = ch[(x+1)&3]; + } else if (ch[(x+3)&3][0] == UU_FULLWIDTH) { + width = 2; part = 1; chp = ch[x&3]; + } else { + width = 1; part = 0; chp = ch[x&3]; + } + for (i=0; i<sizeof(ch[0]) && chp[i]; i++) { + const void *glyph = lookup_glyph(d->font, i, chp, ch[(x+3)&3], ch[(x+1)&3], width, part); + if (glyph) uudisp_draw_glyph(d, row->idx, x, glyph, row->cells[x].a & 0xff); } } } @@ -0,0 +1,133 @@ +/* uuterm, Copyright (C) 2006 Rich Felker; licensed under GNU GPL v2 only */ + +/* note: the following implementation of ucf is NOT SECURE. malicious or + * damaged files can cause it to crash or possibly enter into an infinite + * loop, or cause other parts of the process core to be read as a font, + * possibly leading to information leaks. however there is no possibility + * of privilege elevation as ucf never writes to memory. + * + * users needing a robust implementation would be advised to simply run a + * sanity check across the whole font file before accepting it, rather than + * incurring large bounds-checking penalties at each glyph lookup. + */ + +#include <stddef.h> +#include "ucf.h" + +#define U24(p) ( ((p)[0]<<16) | ((p)[1]<<8) | (p)[2] ) +#define U32(p) ( ((p)[0]<<24) | U24((p)+1) ) + +int ucf_init(struct ucf *f, const unsigned char *map, size_t len) +{ + size_t n; + if (memcmp(map, "ucf\300\000\001\000\000", 8)) + return -1; + f->w = map[8]; + f->h = map[9]; + f->s = (f->w+7)>>3; + f->S = f->s * f->h; + f->ranges = map + U32(map+20) + 4; + f->gmap = map + U32(map+24); + f->glyphs = map + U32(map+28); + f->ctab = f->ranges + 8*(f->nranges = U32(f->ranges - 4)); + return 0; +} + +#define GMAP_WIDTH 1 + +#define GMAP_FINAL1 0 +#define GMAP_FINAL2 1 +#define GMAP_GLYPH1 2 +#define GMAP_GLYPH2 3 + +#define RULE_RANGE 4 +#define RULE_ATTACHED_TO 5 +#define RULE_WITH_ATTACHED 6 +#define RULE_FOLLOWS 7 +#define RULE_PRECEDES 8 + +#define CTAB_MASK 0x3fffffff +#define CTAB_INDIRECT 0x80000000 +#define CTAB_WIDTH 30 + +int ucf_lookup(struct ucf *f, int idx, const unsigned *cc, + const unsigned *pc, const unsigned *nc, int width) +{ + unsigned ch = cc[idx]; + unsigned a, l, x, i; + const unsigned *c; + const unsigned char *p; + + for (p=f->ranges, a=0; ch>=(a+=U32(p)); p+=8) { + if (ch-a < (l=U32(p+4))) { + x = U32(f->ctab+4*(a-1)); + if (x>>30 != width-1) + return -1; + return (x & 0x3fffffff) + (ch-a)*width; + } + ch -= l; + } + x = U32(f->ctab+4*ch); + if (!((x+1) & CTAB_INDIRECT)) { + if (x>>CTAB_WIDTH != width-1) return -1; + return x & CTAB_MASK; + } + x &= 0x7fffffff; + i = idx; + c = cc; + for (p=f->gmap+x; ; p+=4) { + if (*p <= GMAP_GLYPH2) { + if ((*p & GMAP_WIDTH) == width-1) break; + else if (*p <= GMAP_FINAL2) return -1; + i = idx; c = cc; + continue; + } + x = *p; + a = U24(p+1); + if (p[4] == RULE_RANGE) { + p += 4; + l = U24(p+1); + } else l = 1; + switch (x) { + case RULE_ATTACHED_TO: + if (i && c[--i]-a < l) continue; + break; + case RULE_WITH_ATTACHED: + if (c[++i]-a < l) continue; + break; + case RULE_FOLLOWS: + if ((c=pc)[i=0]-a < l) continue; + break; + case RULE_PRECEDES: + if ((c=nc)[i=0]-a < l) continue; + break; + } + /* Skip until the next mapping */ + for (; *p > GMAP_GLYPH2; p+=4); + i = idx; c = cc; + } + return U24(p+1); +} + +#if 0 +#include <stdio.h> +#include <stdlib.h> + +int main(int argc, char *argv[]) +{ + int i, j; + struct ucf f; + static char tmp[1000000]; + ucf_init(&f, tmp, fread(tmp, 1, sizeof tmp, stdin)); + for (i=1; i<argc; i++) { + unsigned x[5] = { strtol(argv[i], NULL, 16), 0 }; + int g; + if (i+1<argc) x[1] = strtol(argv[i+1], NULL, 16); + printf("char %.4x maps to glyph %d\n", x[1], g=ucf_lookup(&f, 1, x, x+4, x+4, 1)); + if (g >= 0) for (j=0; j<16; j++) + printf("%.2X", f.glyphs[16*g+j]); + printf("\n"); + } + return 0; +} +#endif @@ -0,0 +1,14 @@ +/* uuterm, Copyright (C) 2006 Rich Felker; licensed under GNU GPL v2 only */ + +#include <stddef.h> + +struct ucf +{ + int w, h, s, S; + const unsigned char *ranges, *ctab, *gmap, *glyphs; + unsigned nranges; +}; + +int ucf_init(struct ucf *, const unsigned char *, size_t); +int ucf_lookup(struct ucf *, int, const unsigned *, + const unsigned *, const unsigned *, int); @@ -69,6 +69,7 @@ struct uudisp unsigned char *intext; unsigned char inbuf[16]; int blink; + void *font; long priv[64]; }; |