# HG changeset patch # User Kenichi Handa # Date 1219996633 0 # Node ID 62a07e57ef40256dc8db641a84f33934e9cfe261 # Parent 99a0b68bcc29bcbeaa88ac4635035d079f1923ca (encode_terminal_code): Adjusted for the change of struct glyph. (append_composite_glyph): Adjusted for the change of struct it and struct glyph. (produce_composite_glyph): Likewise. diff -r 99a0b68bcc29 -r 62a07e57ef40 src/term.c --- a/src/term.c Fri Aug 29 07:56:59 2008 +0000 +++ b/src/term.c Fri Aug 29 07:57:13 2008 +0000 @@ -596,11 +596,21 @@ { if (src->type == COMPOSITE_GLYPH) { - struct composition *cmp = composition_table[src->u.cmp_id]; + struct composition *cmp; + Lisp_Object gstring; int i; nbytes = buf - encode_terminal_src; - required = MAX_MULTIBYTE_LENGTH * cmp->glyph_len; + if (src->u.cmp.automatic) + { + gstring = composition_gstring_from_id (src->u.cmp.id); + required = src->u.cmp.to - src->u.cmp.from; + } + else + { + cmp = composition_table[src->u.cmp.id]; + required = MAX_MULTIBYTE_LENGTH * cmp->glyph_len; + } if (encode_terminal_src_size < nbytes + required) { @@ -610,15 +620,27 @@ buf = encode_terminal_src + nbytes; } - for (i = 0; i < cmp->glyph_len; i++) - { - int c = COMPOSITION_GLYPH (cmp, i); - - if (! char_charset (c, charset_list, NULL)) - break; - buf += CHAR_STRING (c, buf); - nchars++; - } + if (src->u.cmp.automatic) + for (i = src->u.cmp.from; i < src->u.cmp.to; i++) + { + Lisp_Object g = LGSTRING_GLYPH (gstring, i); + int c = LGLYPH_CHAR (g); + + if (! char_charset (c, charset_list, NULL)) + break; + buf += CHAR_STRING (c, buf); + nchars++; + } + else + for (i = 0; i < cmp->glyph_len; i++) + { + int c = COMPOSITION_GLYPH (cmp, i); + + if (! char_charset (c, charset_list, NULL)) + break; + buf += CHAR_STRING (c, buf); + nchars++; + } if (i == 0) { /* The first character of the composition is not encodable. */ @@ -1745,7 +1767,20 @@ { glyph->type = COMPOSITE_GLYPH; glyph->pixel_width = it->pixel_width; - glyph->u.cmp_id = it->cmp_id; + glyph->u.cmp.id = it->cmp_it.id; + if (it->cmp_it.ch < 0) + { + glyph->u.cmp.automatic = 0; + glyph->u.cmp.id = it->cmp_it.id; + } + else + { + glyph->u.cmp.automatic = 1; + glyph->u.cmp.id = it->cmp_it.id; + glyph->u.cmp.from = it->cmp_it.from; + glyph->u.cmp.to = it->cmp_it.to; + } + glyph->face_id = it->face_id; glyph->padding_p = 0; glyph->charpos = CHARPOS (it->position); @@ -1766,14 +1801,23 @@ produce_composite_glyph (it) struct it *it; { - struct composition *cmp = composition_table[it->cmp_id]; int c; - xassert (cmp->glyph_len > 0); - c = COMPOSITION_GLYPH (cmp, 0); - it->pixel_width = CHAR_WIDTH (it->c); + if (it->cmp_it.ch < 0) + { + struct composition *cmp = composition_table[it->cmp_it.id]; + + c = COMPOSITION_GLYPH (cmp, 0); + it->pixel_width = CHAR_WIDTH (it->c); + } + else + { + Lisp_Object gstring = composition_gstring_from_id (it->cmp_it.id); + + it->pixel_width = composition_gstring_width (gstring, it->cmp_it.from, + it->cmp_it.to, NULL); + } it->nglyphs = 1; - if (it->glyph_row) append_composite_glyph (it); }