diff options
author | ed <ed@FreeBSD.org> | 2013-12-20 21:31:50 +0000 |
---|---|---|
committer | ed <ed@FreeBSD.org> | 2013-12-20 21:31:50 +0000 |
commit | 4d1897863f30817d3e8beb6e3be1f1115402f8b5 (patch) | |
tree | 6b12de7f6b54baecfd56db911a6a2b9c8852b2d2 /sys/teken | |
parent | ae34685b8eb7435f5c01115fa64955dffffb03be (diff) | |
download | FreeBSD-src-4d1897863f30817d3e8beb6e3be1f1115402f8b5.zip FreeBSD-src-4d1897863f30817d3e8beb6e3be1f1115402f8b5.tar.gz |
Extend libteken to support CJK fullwidth characters.
Introduce a new formatting bit (TF_CJK_RIGHT) that is set when putting a
cell that is the right part of a CJK fullwidth character. This will
allow drivers like vt(9) to support fullwidth characters properly.
emaste@ has a patch to extend vt(9)'s font handling to increase the
number of Unicode -> glyph maps from 2 ({normal,bold)} to 4
({normal,bold} x {left,right}). This will need to use this formatting
bit to determine whether to draw the left or right glyph.
Reviewed by: emaste
Diffstat (limited to 'sys/teken')
-rw-r--r-- | sys/teken/demo/teken_demo.c | 7 | ||||
-rw-r--r-- | sys/teken/teken.h | 9 | ||||
-rw-r--r-- | sys/teken/teken_subr.h | 16 |
3 files changed, 16 insertions, 16 deletions
diff --git a/sys/teken/demo/teken_demo.c b/sys/teken/demo/teken_demo.c index 16bb4b7..08323dc 100644 --- a/sys/teken/demo/teken_demo.c +++ b/sys/teken/demo/teken_demo.c @@ -86,9 +86,10 @@ printchar(const teken_pos_t *p) assert(p->tp_row < NROWS); assert(p->tp_col < NCOLS); - getyx(stdscr, y, x); - px = &buffer[p->tp_col][p->tp_row]; + /* No need to print right hand side of CJK character manually. */ + if (px->a.ta_format & TF_CJK_RIGHT) + return; /* Convert Unicode to UTF-8. */ if (px->c < 0x80) { @@ -118,8 +119,8 @@ printchar(const teken_pos_t *p) bkgdset(attr | COLOR_PAIR(teken_256to8(px->a.ta_fgcolor) + 8 * teken_256to8(px->a.ta_bgcolor))); + getyx(stdscr, y, x); mvaddstr(p->tp_row, p->tp_col, str); - move(y, x); } diff --git a/sys/teken/teken.h b/sys/teken/teken.h index a9bca98..27d1ce4 100644 --- a/sys/teken/teken.h +++ b/sys/teken/teken.h @@ -41,10 +41,11 @@ typedef uint32_t teken_char_t; typedef unsigned short teken_unit_t; typedef unsigned char teken_format_t; -#define TF_BOLD 0x01 -#define TF_UNDERLINE 0x02 -#define TF_BLINK 0x04 -#define TF_REVERSE 0x08 +#define TF_BOLD 0x01 /* Bold character. */ +#define TF_UNDERLINE 0x02 /* Underline character. */ +#define TF_BLINK 0x04 /* Blinking character. */ +#define TF_REVERSE 0x08 /* Reverse rendered character. */ +#define TF_CJK_RIGHT 0x10 /* Right-hand side of CJK character. */ typedef unsigned char teken_color_t; #define TC_BLACK 0 #define TC_RED 1 diff --git a/sys/teken/teken_subr.h b/sys/teken/teken_subr.h index f25ab6a..be3ce8a 100644 --- a/sys/teken/teken_subr.h +++ b/sys/teken/teken_subr.h @@ -791,21 +791,19 @@ teken_subr_do_putchar(teken_t *t, const teken_pos_t *tp, teken_char_t c, teken_funcs_copy(t, &ctr, &ctp); } + teken_funcs_putchar(t, tp, c, &t->t_curattr); + if (width == 2 && tp->tp_col + 1 < t->t_winsize.tp_col) { teken_pos_t tp2; + teken_attr_t attr; - /* - * Store a space behind double width characters before - * actually printing them. This prevents artifacts when - * the consumer doesn't render it using double width - * glyphs. - */ + /* Print second half of CJK fullwidth character. */ tp2.tp_row = tp->tp_row; tp2.tp_col = tp->tp_col + 1; - teken_funcs_putchar(t, &tp2, BLANK, &t->t_curattr); + attr = t->t_curattr; + attr.ta_format |= TF_CJK_RIGHT; + teken_funcs_putchar(t, &tp2, c, &attr); } - - teken_funcs_putchar(t, tp, c, &t->t_curattr); } static void |