--- rxvt-unicode/src/rxvtfont.C 2005/04/17 22:36:13 1.69 +++ rxvt-unicode/src/rxvtfont.C 2005/06/18 10:59:21 1.72 @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *---------------------------------------------------------------------*/ #include "../config.h" @@ -853,7 +853,7 @@ int dir_ret, asc_ret, des_ret; XTextExtents16 (f, &ch, 1, &dir_ret, &asc_ret, &des_ret, &g); - int wcw = wcwidth (*t); if (wcw > 0) g.width = g.width / wcw; + int wcw = wcwidth (*t); if (wcw > 0) g.width = (g.width + wcw - 1) / wcw; if (width < g.width) width = g.width; } @@ -938,7 +938,7 @@ // check character against base font bounding box int w = xcs->width; int wcw = wcwidth (unicode); - if (wcw > 0) w /= wcw; + if (wcw > 0) w = (w + wcw - 1) / wcw; careful = w > prop->width; if (careful && w > prop->width * MAX_OVERLAP >> 2) @@ -1156,6 +1156,8 @@ XftUnlockFace (f); + int glheight = height; + for (uint16_t *t = extent_test_chars + NUM_EXTENT_TEST_CHARS; t-- > extent_test_chars; ) { FcChar16 ch = *t; @@ -1173,15 +1175,18 @@ XGlyphInfo g; XftTextExtents16 (disp, f, &ch, 1, &g); + g.width -= g.x; + int wcw = wcwidth (ch); - if (wcw > 0) g.width = g.width / wcw; + if (wcw > 0) g.width = (g.width + wcw - 1) / wcw; - if (width < g.width) width = g.width; - if (height < g.height) height = g.height; + if (width < g.width ) width = g.width; + if (height < g.height ) height = g.height; + if (glheight < g.height - g.y) glheight = g.height - g.y; } if (prop.height == rxvt_fontprop::unset - || height <= prop.height + || (height <= prop.height && glheight <= prop.height) || height <= 2 || !scalable) break; @@ -1232,9 +1237,9 @@ XGlyphInfo g; XftTextExtents32 (DISPLAY, f, &ch, 1, &g); - int w = g.width; + int w = g.width - g.x; int wcw = wcwidth (unicode); - if (wcw > 0) w /= wcw; + if (wcw > 0) w = (w + wcw - 1) / wcw; careful = w > prop->width; if (careful && w > prop->width * MAX_OVERLAP >> 2) @@ -1256,54 +1261,53 @@ FcChar32 *enc = (FcChar32 *) get_enc_buf (len * sizeof (FcChar32)); FcChar32 *ep = enc; int ewidth = 0; - int xoff = 0; while (len) { int cwidth = r->TermWin.fwidth; FcChar32 fc = *text++; len--; - FT_UInt gl; while (len && *text == NOCHAR) text++, len--, cwidth += r->TermWin.fwidth; - gl = XftCharIndex (d.display->display, f, fc); - XftGlyphExtents (d.display->display, f, &gl, 1, &extents); - - if (extents.xOff != cwidth && ep != enc) - { - if (xoff > ewidth) xoff = ewidth; - XftDrawGlyphs (d, &r->pix_colors[fg].c, f, - x + (ewidth - xoff >> 1), - y + base, enc, ep - enc); - x += ewidth; - - ep = enc; - ewidth = 0; - xoff = 0; - } - if (fc == ' ' && ep == enc) // skip leading spaces - { - x += cwidth; - continue; - } - + x += cwidth; else { - *ep++ = gl; - ewidth += cwidth; - xoff += extents.xOff; + FT_UInt gl = XftCharIndex (d.display->display, f, fc); + XftGlyphExtents (d.display->display, f, &gl, 1, &extents); + + if (extents.xOff != cwidth) + { + if (ewidth) + { + XftDrawGlyphs (d, &r->pix_colors[fg].c, f, + x, y + base, enc, ep - enc); + x += ewidth; + + ep = enc; + ewidth = 0; + } + + if (extents.xOff > cwidth) + extents.xOff = cwidth; + + XftDrawGlyphs (d, &r->pix_colors[fg].c, f, + x + (cwidth - extents.xOff >> 1), + y + base, &gl, 1); + x += cwidth; + } + else + { + *ep++ = gl; + ewidth += cwidth; + } } } if (ep != enc) - { - if (xoff > ewidth) xoff = ewidth; - XftDrawGlyphs (d, &r->pix_colors[fg].c, f, - x + (ewidth - xoff >> 1), - y + base, enc, ep - enc); - } + XftDrawGlyphs (d, &r->pix_colors[fg].c, f, + x, y + base, enc, ep - enc); } #endif