[PATCH 2/2] Some CJK glyphs are wide, which occupy two columns. If the glyph is wide, then use two columns instead of one.

Thomas Daede daede003 at umn.edu
Mon Jul 8 15:29:43 PDT 2013


A similar function is wcwidth(). There is an implementation here:

http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c

I don't know how it compares to the complexity or feature completeness
of Pango's implementation (which I think is a wrapper around HarfBuzz)

On Mon, Jul 8, 2013 at 5:07 PM, Kristian Høgsberg <hoegsberg at gmail.com> wrote:
> On Thu, Jun 06, 2013 at 03:32:42PM +0800, Peng Wu wrote:
>> ---
>>  clients/Makefile.am |  2 +-
>>  clients/terminal.c  | 18 ++++++++++++++++--
>>  2 files changed, 17 insertions(+), 3 deletions(-)
>
> This makes sense, but I'm not happy about the pango dependency.  One
> of the few reasons (if not the only reason) for weston-terminal to
> exist is that it only depends on a few wayland libraries.  In
> particular, it doesn't pull in any of the major toolkit silos.
>
> I suspect that we would have to copy some unicode table into the
> weston terminal to replace g_unichar_iswide(), and if that's a crazy
> suggestion, let's just not do it.  But if it's feasible, let's do
> that, and maybe also see if you can make selection work with wide characters?
>
> Kristian
>
>> diff --git a/clients/Makefile.am b/clients/Makefile.am
>> index cad0d40..d37d66a 100644
>> --- a/clients/Makefile.am
>> +++ b/clients/Makefile.am
>> @@ -104,7 +104,7 @@ weston_screenshooter_SOURCES =                    \
>>  weston_screenshooter_LDADD = libtoytoolkit.la
>>
>>  weston_terminal_SOURCES = terminal.c
>> -weston_terminal_LDADD = libtoytoolkit.la -lutil
>> +weston_terminal_LDADD = libtoytoolkit.la -lutil $(PANGO_LIBS)
>>
>>  image_SOURCES = image.c
>>  image_LDADD = libtoytoolkit.la
>> diff --git a/clients/terminal.c b/clients/terminal.c
>> index 0d4f726..4495530 100644
>> --- a/clients/terminal.c
>> +++ b/clients/terminal.c
>> @@ -33,6 +33,7 @@
>>  #include <ctype.h>
>>  #include <cairo.h>
>>  #include <sys/epoll.h>
>> +#include <glib.h>
>>
>>  #include <wayland-client.h>
>>
>> @@ -942,6 +943,9 @@ redraw_handler(struct widget *widget, void *data)
>>       struct glyph_run run;
>>       cairo_font_extents_t extents;
>>       double average_width;
>> +     gunichar unichar;
>> +     gboolean iswide;
>> +     int extracol;
>>
>>       surface = window_get_surface(terminal->window);
>>       widget_get_allocation(terminal->widget, &allocation);
>> @@ -991,22 +995,32 @@ redraw_handler(struct widget *widget, void *data)
>>       glyph_run_init(&run, terminal, cr);
>>       for (row = 0; row < terminal->height; row++) {
>>               p_row = terminal_get_row(terminal, row);
>> +             extracol = 0;
>>               for (col = 0; col < terminal->width; col++) {
>>                       /* get the attributes for this character cell */
>>                       terminal_decode_attr(terminal, row, col, &attr);
>>
>>                       glyph_run_flush(&run, attr);
>>
>> -                     text_x = col * average_width;
>> +                     /* check dual width unicode character */
>> +                     unichar = g_utf8_get_char((const char*) p_row[col].byte);
>> +                     iswide = g_unichar_iswide(unichar);
>> +
>> +                     text_x = (col + extracol) * average_width;
>>                       text_y = extents.ascent + row * extents.height;
>>                       if (attr.attr.a & ATTRMASK_UNDERLINE) {
>>                               terminal_set_color(terminal, cr, attr.attr.fg);
>>                               cairo_move_to(cr, text_x, (double)text_y + 1.5);
>> -                             cairo_line_to(cr, text_x + average_width, (double) text_y + 1.5);
>> +                             if (iswide)
>> +                                     cairo_line_to(cr, text_x + average_width * 2, (double) text_y + 1.5);
>> +                             else
>> +                                     cairo_line_to(cr, text_x + average_width, (double) text_y + 1.5);
>>                               cairo_stroke(cr);
>>                       }
>>
>>                       glyph_run_add(&run, text_x, text_y, &p_row[col]);
>> +                     if (iswide)
>> +                             extracol++;
>>               }
>>       }
>>
>> --
>> 1.8.1.4
>>
>> _______________________________________________
>> wayland-devel mailing list
>> wayland-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list