Another go at fixing string metrics

This time, it is the problems with \int in esint and cmex that we are
trying to work around. This code is becoming too complicated to my
taste.
This commit is contained in:
Jean-Marc Lasgouttes 2018-02-17 16:55:22 +01:00
parent 8f9b733e67
commit 5861df7172

View File

@ -181,26 +181,38 @@ int GuiFontMetrics::width(docstring const & s) const
if (strwidth_cache_.contains(s))
return strwidth_cache_[s];
PROFILE_CACHE_MISS(width);
/* For some reason QMetrics::width returns a wrong value with Qt5
* with some arabic text. OTOH, QTextLayout is broken for single
* characters with null width (like \not in mathed). Also, as a
* safety measure, always use QMetrics::width with our math fonts.
/* Several problems have to be taken into account:
* * QFontMetrics::width does not returns a wrong value with Qt5 with
* some arabic text, since the glyph-shaping operations are not
* done (documented in Qt5).
* * QTextLayout is broken for single characters with null width
* (like \not in mathed).
* * While QTextLine::horizontalAdvance is the right thing to use
* for text strings, it does not give a good result with some
* characters like the \int (gyph 4) of esint.
* Also, as a safety measure, always use QFontMetrics::width with
* our math fonts.
*/
int w = 0;
if (s.length() == 1
// is the string a single character from a math font ?
#if QT_VERSION >= 0x040800
|| font_.styleName() == "LyX"
bool const math_char = s.length() == 1 || font_.styleName() == "LyX";
#else
bool const math_char = s.length() == 1;
#endif
)
w = metrics_.width(toqstr(s));
else {
// keep value 0 for math chars with width 0
if (!math_char || metrics_.width(toqstr(s)) != 0) {
QTextLayout tl;
tl.setText(toqstr(s));
tl.setFont(font_);
tl.beginLayout();
QTextLine line = tl.createLine();
tl.endLayout();
w = iround(line.horizontalAdvance());
if (math_char)
w = iround(line.naturalTextWidth());
else
w = iround(line.horizontalAdvance());
}
strwidth_cache_.insert(s, w, s.size() * sizeof(char_type));
return w;