svn commit: r187562 - head/sys/dev/syscons/teken
Ed Schouten
ed at FreeBSD.org
Wed Jan 21 11:43:12 PST 2009
Author: ed
Date: Wed Jan 21 19:43:10 2009
New Revision: 187562
URL: http://svn.freebsd.org/changeset/base/187562
Log:
Add Unicode rendering to the teken demo application.
Some time ago I tried adding Unicode rendering to the teken demo
application, but I didn't get it working. It seems I forgot to call
setlocale(). Polish this code and make sure it doesn't get lost.
Also a small fix for my previous commit: all Unicode characters in
teken_boxdrawing are below 0x10000, so store them as 16-bit values.
Modified:
head/sys/dev/syscons/teken/teken_demo.c
head/sys/dev/syscons/teken/teken_scs.h
Modified: head/sys/dev/syscons/teken/teken_demo.c
==============================================================================
--- head/sys/dev/syscons/teken/teken_demo.c Wed Jan 21 18:54:35 2009 (r187561)
+++ head/sys/dev/syscons/teken/teken_demo.c Wed Jan 21 19:43:10 2009 (r187562)
@@ -31,6 +31,7 @@
#include <assert.h>
#include <errno.h>
#include <inttypes.h>
+#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
@@ -83,7 +84,8 @@ static void
printchar(const teken_pos_t *p)
{
int y, x, attr = 0;
- struct pixel *px, pt;
+ struct pixel *px;
+ char str[5] = { 0 };
assert(p->tp_row < NROWS);
assert(p->tp_col < NCOLS);
@@ -92,14 +94,26 @@ printchar(const teken_pos_t *p)
px = &buffer[p->tp_col][p->tp_row];
- if (px->c >= 0x80) {
- /* Mark UTF-8 chars (we don't support it). */
- px = &pt;
- px->c = '?';
- px->a.ta_format = TF_BOLD;
- px->a.ta_fgcolor = TC_BROWN;
- px->a.ta_bgcolor = TC_RED;
+ /* Convert Unicode to UTF-8. */
+#ifdef TEKEN_UTF8
+ if (px->c < 0x80) {
+ str[0] = px->c;
+ } else if (px->c < 0x800) {
+ str[0] = 0xc0 | (px->c >> 6);
+ str[1] = 0x80 | (px->c & 0x3f);
+ } else if (px->c < 0x10000) {
+ str[0] = 0xe0 | (px->c >> 12);
+ str[1] = 0x80 | ((px->c >> 6) & 0x3f);
+ str[2] = 0x80 | (px->c & 0x3f);
+ } else {
+ str[0] = 0xf0 | (px->c >> 18);
+ str[1] = 0x80 | ((px->c >> 12) & 0x3f);
+ str[2] = 0x80 | ((px->c >> 6) & 0x3f);
+ str[3] = 0x80 | (px->c & 0x3f);
}
+#else /* !TEKEN_UTF8 */
+ str[0] = px->c;
+#endif /* TEKEN_UTF8 */
if (px->a.ta_format & TF_BOLD)
attr |= A_BOLD;
@@ -109,7 +123,7 @@ printchar(const teken_pos_t *p)
attr |= A_BLINK;
bkgdset(attr | COLOR_PAIR(px->a.ta_fgcolor + 8 * px->a.ta_bgcolor));
- mvaddch(p->tp_row, p->tp_col, px->c);
+ mvaddstr(p->tp_row, p->tp_col, str);
move(y, x);
}
@@ -272,9 +286,16 @@ main(int argc __unused, char *argv[] __u
fd_set rfds;
char b[256];
ssize_t bl;
- const int ccolors[8] = { COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW, COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE };
+ const int ccolors[8] = {
+ COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW,
+ COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE
+ };
int i, j;
+#ifdef TEKEN_UTF8
+ setlocale(LC_CTYPE, "UTF-8");
+#endif /* TEKEN_UTF8 */
+
tp.tp_row = ws.ws_row = NROWS;
tp.tp_col = ws.ws_col = NCOLS;
Modified: head/sys/dev/syscons/teken/teken_scs.h
==============================================================================
--- head/sys/dev/syscons/teken/teken_scs.h Wed Jan 21 18:54:35 2009 (r187561)
+++ head/sys/dev/syscons/teken/teken_scs.h Wed Jan 21 19:43:10 2009 (r187562)
@@ -62,7 +62,7 @@ teken_scs_process(teken_t *t, teken_char
}
/* Unicode points for VT100 box drawing. */
-static const teken_char_t teken_boxdrawing[31] = {
+static const uint16_t teken_boxdrawing[31] = {
0x25c6, 0x2592, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0, 0x00b1,
0x2424, 0x240b, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c, 0x23ba,
0x23bb, 0x2500, 0x23bc, 0x23bd, 0x251c, 0x2524, 0x2534, 0x252c,
More information about the svn-src-all
mailing list