ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/rxvtfont.C
(Generate patch)

Comparing rxvt-unicode/src/rxvtfont.C (file contents):
Revision 1.209 by root, Fri Jun 18 21:58:03 2021 UTC vs.
Revision 1.210 by root, Fri Jun 18 22:11:09 2021 UTC

1338bool 1338bool
1339rxvt_font_xft::has_char (unicode_t unicode, const rxvt_fontprop *prop, bool &careful) const 1339rxvt_font_xft::has_char (unicode_t unicode, const rxvt_fontprop *prop, bool &careful) const
1340{ 1340{
1341 careful = false; 1341 careful = false;
1342 1342
1343 rxvt_compose_expand_static<FcChar32> exp; 1343 // handle non-bmp chars when text_t is 16 bit
1344 FcChar32 *chrs = exp (unicode); 1344#if ENABLE_COMBINING && !UNICODE_3
1345 int nchrs = exp.length (chrs); 1345 if (ecb_expect_false (IS_COMPOSE (unicode)))
1346 1346 if (compose_char *cc = rxvt_composite [unicode])
1347 // allm chars in sequence must be available 1347 if (cc->c2 == NOCHAR)
1348 for (int i = 0; i < nchrs; ++i) 1348 unicode = cc->c1;
1349 if (!XftCharExists (term->dpy, f, chrs [i])) 1349 else
1350 return false;
1351 else
1350 return false; 1352 return false;
1353#endif
1354
1355 FcChar32 chr = unicode;
1356
1357 if (!XftCharExists (term->dpy, f, chr))
1358 return false;
1351 1359
1352 if (!prop || prop->width == rxvt_fontprop::unset) 1360 if (!prop || prop->width == rxvt_fontprop::unset)
1353 return true; 1361 return true;
1354 1362
1355 int wcw = max (WCWIDTH (chrs [0]), 1); 1363 int wcw = max (WCWIDTH (chr), 1);
1356 1364
1357 // we check against all glyph sizes. this is probably wrong,
1358 // due to the way ->draw positions these glyphs.
1359 for (int i = 0; i < nchrs; ++i)
1360 {
1361 XGlyphInfo g; 1365 XGlyphInfo g;
1362 XftTextExtents32 (term->dpy, f, chrs + i, 1, &g); 1366 XftTextExtents32 (term->dpy, f, &chr, 1, &g);
1363 1367
1364 int w = g.width - g.x; 1368 int w = g.width - g.x;
1365 1369
1366 careful = g.x > 0 || w > prop->width * wcw; 1370 careful = g.x > 0 || w > prop->width * wcw;
1367 1371
1368 if (careful && !OVERLAP_OK (w, wcw, prop)) 1372 if (careful && !OVERLAP_OK (w, wcw, prop))
1369 return false; 1373 return false;
1370 1374
1371 // this weeds out _totally_ broken fonts, or glyphs 1375 // this weeds out _totally_ broken fonts, or glyphs
1372 if (!OVERLAP_OK (g.xOff, wcw, prop)) 1376 if (!OVERLAP_OK (g.xOff, wcw, prop))
1373 return false; 1377 return false;
1374 }
1375 1378
1376 return true; 1379 return true;
1377} 1380}
1378 1381
1379void 1382void
1402 int y_ = buffered ? 0 : y; 1405 int y_ = buffered ? 0 : y;
1403 1406
1404 while (len) 1407 while (len)
1405 { 1408 {
1406 int cwidth = term->fwidth; 1409 int cwidth = term->fwidth;
1407
1408 rxvt_compose_expand_static<FcChar32> exp;
1409 FcChar32 *chrs = exp (*text++); len--; 1410 FcChar32 chr = *text++; len--;
1410 int nchrs = exp.length (chrs); 1411
1412 // handle non-bmp chars when text_t is 16 bit
1413 #if ENABLE_COMBINING && !UNICODE_3
1414 if (ecb_expect_false (IS_COMPOSE (chr)))
1415 if (compose_char *cc = rxvt_composite [chr])
1416 if (cc->c2 == NOCHAR)
1417 chr = cc->c1;
1418 #endif
1411 1419
1412 while (len && *text == NOCHAR) 1420 while (len && *text == NOCHAR)
1413 text++, len--, cwidth += term->fwidth; 1421 text++, len--, cwidth += term->fwidth;
1414 1422
1415 if (chrs [0] != ' ') // skip spaces 1423 if (chr != ' ') // skip spaces
1416 { 1424 {
1417 #if 1 1425 #if 0
1418 FT_UInt glyphs [decltype (exp)::max_size]; 1426 FT_UInt glyphs [decltype (exp)::max_size];
1419 1427
1420 for (int i = 0; i < nchrs; ++i) 1428 for (int i = 0; i < nchrs; ++i)
1421 glyphs [i] = XftCharIndex (disp, f, chrs [i]); 1429 glyphs [i] = XftCharIndex (disp, f, chrs [i]);
1422 1430
1426 XftGlyphExtents (disp, f, glyphs+i, 1, &ep); 1434 XftGlyphExtents (disp, f, glyphs+i, 1, &ep);
1427 printf ("gs %4x g %4x + %3d,%3d o %3d,%3d wh %3d,%3d\n", chrs[i],glyphs[i],ep.x,ep.y,ep.xOff,ep.yOff,ep.width,ep.height); 1435 printf ("gs %4x g %4x + %3d,%3d o %3d,%3d wh %3d,%3d\n", chrs[i],glyphs[i],ep.x,ep.y,ep.xOff,ep.yOff,ep.width,ep.height);
1428 } 1436 }
1429 #endif 1437 #endif
1430 1438
1431 FT_UInt glyph = XftCharIndex (disp, f, chrs [0]); 1439 FT_UInt glyph = XftCharIndex (disp, f, chr);
1432 XGlyphInfo extents0; 1440 XGlyphInfo extents;
1433 XftGlyphExtents (disp, f, &glyph, 1, &extents0); 1441 XftGlyphExtents (disp, f, &glyph, 1, &extents);
1434
1435 int cx = x_ + (cwidth - extents0.xOff >> 1);
1436 int cy = y_ + ascent;
1437 1442
1438 XftGlyphSpec ep; 1443 XftGlyphSpec ep;
1439 ep.glyph = glyph; 1444 ep.glyph = glyph;
1440 ep.x = cx + (extents0.xOff ? 0 : extents0.xOff);
1441 ep.y = cy; 1445 ep.x = x_;
1446 ep.y = y_ + ascent;
1447
1448 // the xft font cell might differ from the terminal font cell,
1449 // in which we use the average between the two
1450 ep.x += cwidth - extents.xOff >> 1;
1451
1452 // xft/freetype represent combining characters as characters with zero
1453 // width rendered over the previous character with some fonts, while
1454 // in other fonts, they are considered normal characters, while yet
1455 // in other fonts, they are shifted all over the place.
1456 // we handle the first two cases by keying off on xOff being 0
1457 // for zero-width chars. normally, we would add extents.xOff
1458 // of the base chaarcter here, but we don't have that, so we use cwidth.
1459 ep.x += extents.xOff ? 0 : cwidth;
1442 1460
1443 enc.push_back (ep); 1461 enc.push_back (ep);
1444
1445 for (int i = 1; ecb_expect_false (i < nchrs); ++i)
1446 {
1447 FT_UInt glyph = XftCharIndex (disp, f, chrs [i]);
1448 XGlyphInfo extents;
1449 XftGlyphExtents (disp, f, &glyph, 1, &extents);
1450
1451 ep.glyph = glyph;
1452 ep.x = cx + (extents.xOff ? 0 : extents0.xOff);
1453
1454 enc.push_back (ep);
1455 }
1456 } 1462 }
1457 1463
1458 x_ += cwidth; 1464 x_ += cwidth;
1459 } 1465 }
1460 1466

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines