From 24553805cbc1743546735d6584ad4a8b53b79fa6 Mon Sep 17 00:00:00 2001 From: Kenichi Handa Date: Fri, 29 Aug 2008 07:58:40 +0000 Subject: (x_draw_composite_glyph_string_foreground): Adjusted for the change of struct glyph_string. (x_draw_glyph_string): Likewise. --- src/xterm.c | 79 +++++++++++++++++++++++++++++-------------------------------- 1 file changed, 37 insertions(+), 42 deletions(-) (limited to 'src/xterm.c') diff --git a/src/xterm.c b/src/xterm.c index b3b3d961cb..88fb04d665 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -1312,6 +1312,7 @@ x_draw_composite_glyph_string_foreground (s) struct glyph_string *s; { int i, j, x; + struct font *font = s->font; /* If first glyph of S has a left box line, start drawing the text of S to the right of that box line. */ @@ -1321,73 +1322,66 @@ x_draw_composite_glyph_string_foreground (s) else x = s->x; - /* S is a glyph string for a composition. S->gidx is the index of - the first character drawn for glyphs of this composition. - S->gidx == 0 means we are drawing the very first character of + /* S is a glyph string for a composition. S->cmp_from is the index + of the first character drawn for glyphs of this composition. + S->cmp_from == 0 means we are drawing the very first character of this composition. */ /* Draw a rectangle for the composition if the font for the very first character of the composition could not be loaded. */ if (s->font_not_found_p) { - if (s->gidx == 0) + if (s->cmp_from == 0) XDrawRectangle (s->display, s->window, s->gc, x, s->y, s->width - 1, s->height - 1); } + else if (! s->first_glyph->u.cmp.automatic) + { + int y = s->ybase; + + for (i = 0, j = s->cmp_from; i < s->nchars; i++, j++) + if (COMPOSITION_GLYPH (s->cmp, j) != '\t') + { + int xx = x + s->cmp->offsets[j * 2]; + int yy = y - s->cmp->offsets[j * 2 + 1]; + + font->driver->draw (s, j, j + 1, xx, yy, 0); + if (s->face->overstrike) + font->driver->draw (s, j, j + 1, xx + 1, yy, 0); + } + } else { - struct font *font = s->font; + Lisp_Object gstring = composition_gstring_from_id (s->cmp_id); + Lisp_Object glyph; int y = s->ybase; int width = 0; - if (s->cmp->method == COMPOSITION_WITH_GLYPH_STRING) + for (i = j = s->cmp_from; i < s->cmp_to; i++) { - Lisp_Object gstring = AREF (XHASH_TABLE (composition_hash_table) - ->key_and_value, - s->cmp->hash_index * 2); - int from; - - for (i = from = 0; i < s->nchars; i++) + glyph = LGSTRING_GLYPH (gstring, i); + if (NILP (LGLYPH_ADJUSTMENT (glyph))) + width += LGLYPH_WIDTH (glyph); + else { - Lisp_Object g = LGSTRING_GLYPH (gstring, i); - Lisp_Object adjustment = LGLYPH_ADJUSTMENT (g); int xoff, yoff, wadjust; - if (! VECTORP (adjustment)) + if (j < i) { - width += LGLYPH_WIDTH (g); - continue; - } - if (from < i) - { - font->driver->draw (s, from, i, x, y, 0); + font->driver->draw (s, j, i, x, y, 0); x += width; } - xoff = XINT (AREF (adjustment, 0)); - yoff = XINT (AREF (adjustment, 1)); - wadjust = XINT (AREF (adjustment, 2)); - + xoff = LGLYPH_XOFF (glyph); + yoff = LGLYPH_YOFF (glyph); + wadjust = LGLYPH_WADJUST (glyph); font->driver->draw (s, i, i + 1, x + xoff, y + yoff, 0); x += wadjust; - from = i + 1; + j = i + 1; width = 0; } - if (from < i) - font->driver->draw (s, from, i, x, y, 0); - } - else - { - for (i = 0, j = s->gidx; i < s->nchars; i++, j++) - if (COMPOSITION_GLYPH (s->cmp, j) != '\t') - { - int xx = x + s->cmp->offsets[j * 2]; - int yy = y - s->cmp->offsets[j * 2 + 1]; - - font->driver->draw (s, j, j + 1, xx, yy, 0); - if (s->face->overstrike) - font->driver->draw (s, j, j + 1, xx + 1, yy, 0); - } } + if (j < i) + font->driver->draw (s, j, i, x, y, 0); } } @@ -2701,7 +2695,8 @@ x_draw_glyph_string (s) break; case COMPOSITE_GLYPH: - if (s->for_overlaps || s->gidx > 0) + if (s->for_overlaps || (s->cmp_from > 0 + && ! s->first_glyph->u.cmp.automatic)) s->background_filled_p = 1; else x_draw_glyph_string_background (s, 1); -- cgit v1.2.3