# HG changeset patch # User Kenichi Handa # Date 1074847638 0 # Node ID 00f3a7dc3a281e5e4e142ffd8bf40b484a9715c4 # Parent 7d1daf16ade9103f47ab042a11bed0639f2b8f6b (move_it_to): Optimize for the case (op & MOVE_TO_Y). (x_get_glyph_overhangs): Handle a composition glyph. (x_produce_glyphs): Setup lbearing and rbreaing for a composition glyph. diff -r 7d1daf16ade9 -r 00f3a7dc3a28 src/xdisp.c --- a/src/xdisp.c Fri Jan 23 08:44:57 2004 +0000 +++ b/src/xdisp.c Fri Jan 23 08:47:18 2004 +0000 @@ -5838,6 +5838,16 @@ the line. */ if (skip == MOVE_X_REACHED) { + /* Wait! We can conclude that TO_Y is in the line if + the already scanned glyphs make the line tall enough + because further scanning doesn't make it shorter. */ + line_height = it->max_ascent + it->max_descent; + if (to_y >= it->current_y + && to_y < it->current_y + line_height) + { + reached = 6; + break; + } it_backup = *it; TRACE_MOVE ((stderr, "move_it: from %d\n", IT_CHARPOS (*it))); skip2 = move_it_in_display_line_to (it, to_charpos, -1, @@ -16921,6 +16931,13 @@ *left = -pcm->lbearing; } } + else if (glyph->type == COMPOSITE_GLYPH) + { + struct composition *cmp = composition_table[glyph->u.cmp_id]; + + *right = cmp->rbearing - cmp->pixel_width; + *left = - cmp->lbearing; + } } @@ -18198,8 +18215,8 @@ now. Theoretically, we have to check all fonts for the glyphs, but that requires much time and memory space. So, here we check only the font of the first glyph. This leads - to incorrect display very rarely, and C-l (recenter) can - correct the display anyway. */ + to incorrect display, but it's very rare, and C-l (recenter) + can correct the display anyway. */ if (cmp->font != (void *) font) { /* Ascent and descent of the font of the first character of @@ -18208,8 +18225,10 @@ them respectively. */ int font_ascent = FONT_BASE (font) + boff; int font_descent = FONT_DESCENT (font) - boff; + int font_height = FONT_HEIGHT (font); /* Bounding box of the overall glyphs. */ int leftmost, rightmost, lowest, highest; + int lbearing, rbearing; int i, width, ascent, descent; cmp->font = (void *) font; @@ -18222,12 +18241,20 @@ width = pcm->width; ascent = pcm->ascent; descent = pcm->descent; + lbearing = pcm->lbearing; + if (lbearing > 0) + lbearing = 0; + rbearing = pcm->rbearing; + if (rbearing < width) + rbearing = width; } else { width = FONT_WIDTH (font); ascent = FONT_BASE (font); descent = FONT_DESCENT (font); + lbearing = 0; + rbearing = width; } rightmost = width; @@ -18247,6 +18274,8 @@ the left. */ cmp->offsets[0] = 0; cmp->offsets[1] = boff; + cmp->lbearing = lbearing; + cmp->rbearing = rbearing; /* Set cmp->offsets for the remaining glyphs. */ for (i = 1; i < cmp->glyph_len; i++) @@ -18281,12 +18310,20 @@ width = pcm->width; ascent = pcm->ascent; descent = pcm->descent; + lbearing = pcm->lbearing; + if (lbearing > 0) + lbearing = 0; + rbearing = pcm->rbearing; + if (rbearing < width) + rbearing = width; } else { width = FONT_WIDTH (font); ascent = 1; descent = 0; + lbearing = 0; + rbearing = width; } if (cmp->method != COMPOSITION_WITH_RULE_ALTCHARS) @@ -18327,15 +18364,21 @@ 6---7---8 -- descent */ int rule = COMPOSITION_RULE (cmp, i); - int gref, nref, grefx, grefy, nrefx, nrefy; - - COMPOSITION_DECODE_RULE (rule, gref, nref); + int gref, nref, grefx, grefy, nrefx, nrefy, xoff, yoff; + + COMPOSITION_DECODE_RULE (rule, gref, nref, xoff, yoff); grefx = gref % 3, nrefx = nref % 3; grefy = gref / 3, nrefy = nref / 3; + if (xoff) + xoff = font_height * (xoff - 128) / 256; + if (yoff) + yoff = font_height * (yoff - 128) / 256; left = (leftmost + grefx * (rightmost - leftmost) / 2 - - nrefx * width / 2); + - nrefx * width / 2 + + xoff); + btm = ((grefy == 0 ? highest : grefy == 1 ? 0 : grefy == 2 ? lowest @@ -18343,23 +18386,32 @@ - (nrefy == 0 ? ascent + descent : nrefy == 1 ? descent - boff : nrefy == 2 ? 0 - : (ascent + descent) / 2)); + : (ascent + descent) / 2) + + yoff); } cmp->offsets[i * 2] = left; cmp->offsets[i * 2 + 1] = btm + descent; /* Update the bounding box of the overall glyphs. */ - right = left + width; + if (width > 0) + { + right = left + width; + if (left < leftmost) + leftmost = left; + if (right > rightmost) + rightmost = right; + } top = btm + descent + ascent; - if (left < leftmost) - leftmost = left; - if (right > rightmost) - rightmost = right; if (top > highest) highest = top; if (btm < lowest) lowest = btm; + + if (cmp->lbearing > left + lbearing) + cmp->lbearing = left + lbearing; + if (cmp->rbearing < left + rbearing) + cmp->rbearing = left + rbearing; } /* If there are glyphs whose x-offsets are negative, @@ -18370,6 +18422,8 @@ for (i = 0; i < cmp->glyph_len; i++) cmp->offsets[i * 2] -= leftmost; rightmost -= leftmost; + cmp->lbearing -= leftmost; + cmp->rbearing -= leftmost; } cmp->pixel_width = rightmost; @@ -18381,6 +18435,11 @@ cmp->descent = font_descent; } + if (it->glyph_row + && (cmp->lbearing < 0 + || cmp->rbearing > cmp->pixel_width)) + it->glyph_row->contains_overlapping_glyphs_p = 1; + it->pixel_width = cmp->pixel_width; it->ascent = it->phys_ascent = cmp->ascent; it->descent = it->phys_descent = cmp->descent;