Author: ed
Date: Fri Dec 20 21:31:50 2013
New Revision: 259667
URL: http://svnweb.freebsd.org/changeset/base/259667

Log:
  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

Modified:
  head/sys/dev/syscons/scterm-teken.c
  head/sys/dev/vt/vt_font.c
  head/sys/kern/subr_terminal.c
  head/sys/sys/terminal.h
  head/sys/teken/demo/teken_demo.c
  head/sys/teken/teken.h
  head/sys/teken/teken_subr.h

Modified: head/sys/dev/syscons/scterm-teken.c
==============================================================================
--- head/sys/dev/syscons/scterm-teken.c Fri Dec 20 20:57:13 2013        
(r259666)
+++ head/sys/dev/syscons/scterm-teken.c Fri Dec 20 21:31:50 2013        
(r259667)
@@ -553,7 +553,14 @@ scteken_putchar(void *arg, const teken_p
        vm_offset_t p;
        int cursor, attr;
 
+       /*
+        * No support for printing right hand sides for CJK fullwidth
+        * characters. Simply print a space and assume that the left
+        * hand side describes the entire character.
+        */
        attr = scteken_attr(a) << 8;
+       if (a->ta_format & TF_CJK_RIGHT)
+               c = ' ';
 #ifdef TEKEN_UTF8
        scteken_get_cp437(&c, &attr);
 #endif /* TEKEN_UTF8 */

Modified: head/sys/dev/vt/vt_font.c
==============================================================================
--- head/sys/dev/vt/vt_font.c   Fri Dec 20 20:57:13 2013        (r259666)
+++ head/sys/dev/vt/vt_font.c   Fri Dec 20 21:31:50 2013        (r259667)
@@ -87,7 +87,15 @@ vtfont_lookup(const struct vt_font *vf, 
        uint16_t dst;
        size_t stride;
 
+       /*
+        * No support for printing right hand sides for CJK fullwidth
+        * characters. Simply print a space and assume that the left
+        * hand side describes the entire character.
+        */
        src = TCHAR_CHARACTER(c);
+       if (TCHAR_FORMAT(c) & TF_CJK_RIGHT)
+               src = ' ';
+
        if (TCHAR_FORMAT(c) & TF_BOLD) {
                dst = vtfont_bisearch(vf->vf_bold, vf->vf_bold_length, src);
                if (dst != 0)

Modified: head/sys/kern/subr_terminal.c
==============================================================================
--- head/sys/kern/subr_terminal.c       Fri Dec 20 20:57:13 2013        
(r259666)
+++ head/sys/kern/subr_terminal.c       Fri Dec 20 21:31:50 2013        
(r259667)
@@ -128,7 +128,7 @@ static const teken_attr_t default_messag
 };
 
 #define        TCHAR_CREATE(c, a)      ((c) | \
-       (a)->ta_format << 22 | \
+       (a)->ta_format << 21 | \
        teken_256to8((a)->ta_fgcolor) << 26 | \
        teken_256to8((a)->ta_bgcolor) << 29)
 

Modified: head/sys/sys/terminal.h
==============================================================================
--- head/sys/sys/terminal.h     Fri Dec 20 20:57:13 2013        (r259666)
+++ head/sys/sys/terminal.h     Fri Dec 20 21:31:50 2013        (r259667)
@@ -62,15 +62,14 @@ struct tty;
  *
  *  Bits  Meaning
  *  0-20: Character value
- *    21: Unused
- * 22-25: Bold, underline, blink, reverse
+ * 21-25: Bold, underline, blink, reverse, right part of CJK fullwidth 
character
  * 26-28: Foreground color
  * 29-31: Background color
  */
 
 typedef uint32_t term_char_t;
 #define        TCHAR_CHARACTER(c)      ((c) & 0x1fffff)
-#define        TCHAR_FORMAT(c)         (((c) >> 22) & 0xf)
+#define        TCHAR_FORMAT(c)         (((c) >> 21) & 0x1f)
 #define        TCHAR_FGCOLOR(c)        (((c) >> 26) & 0x7)
 #define        TCHAR_BGCOLOR(c)        ((c) >> 29)
 

Modified: head/sys/teken/demo/teken_demo.c
==============================================================================
--- head/sys/teken/demo/teken_demo.c    Fri Dec 20 20:57:13 2013        
(r259666)
+++ head/sys/teken/demo/teken_demo.c    Fri Dec 20 21:31:50 2013        
(r259667)
@@ -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);
 }
 

Modified: head/sys/teken/teken.h
==============================================================================
--- head/sys/teken/teken.h      Fri Dec 20 20:57:13 2013        (r259666)
+++ head/sys/teken/teken.h      Fri Dec 20 21:31:50 2013        (r259667)
@@ -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

Modified: head/sys/teken/teken_subr.h
==============================================================================
--- head/sys/teken/teken_subr.h Fri Dec 20 20:57:13 2013        (r259666)
+++ head/sys/teken/teken_subr.h Fri Dec 20 21:31:50 2013        (r259667)
@@ -791,21 +791,19 @@ teken_subr_do_putchar(teken_t *t, const 
                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
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to