From: Kenichi Handa Date: Fri, 29 Aug 2008 07:57:31 +0000 (+0000) Subject: (x_draw_composite_glyph_string_foreground): Adjusted X-Git-Tag: emacs-pretest-23.0.90~3168 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=2b107652bf8f3e2b94824dc4fbfd6e8d0f3a0733;p=emacs.git (x_draw_composite_glyph_string_foreground): Adjusted for the change of struct glyph_string. (x_draw_glyph_string): Likewise. --- diff --git a/src/w32term.c b/src/w32term.c index 85ac8d948cd..c07d5b63524 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -1341,6 +1341,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. */ @@ -1350,9 +1351,9 @@ 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. */ SetTextColor (s->hdc, s->gc->foreground); @@ -1363,67 +1364,66 @@ x_draw_composite_glyph_string_foreground (s) first character of the composition could not be loaded. */ if (s->font_not_found_p) { - if (s->gidx == 0) + if (s->cmp_from == 0) w32_draw_rectangle (s->hdc, s->gc, x, s->y, s->width - 1, s->height - 1); } + else if (! s->first_glyph->u.cmp.automatic) + { + int y = s->ybase; + int width = 0; + HFONT old_font; + + old_font = SelectObject (s->hdc, FONT_HANDLE (font)); + + 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); + } + SelectObject (s->hdc, old_font); + } 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; HFONT old_font; old_font = SelectObject (s->hdc, FONT_HANDLE (font)); - 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]; + if (j < i) + font->driver->draw (s, j, i, x, y, 0); - 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); - } - } SelectObject (s->hdc, old_font); } } @@ -2283,7 +2283,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);