Fix metrics of math characters with 0 width

It seems that QTextLayout does not handle properly a single character
with 0 width. This breaks drawing of things like \not.

No status line needed as this amends 24648404.
This commit is contained in:
Jean-Marc Lasgouttes 2017-01-21 00:30:20 +01:00 committed by Enrico Forestieri
parent 8740cd4c26
commit 81465da5d5

View File

@ -178,16 +178,28 @@ int GuiFontMetrics::width(docstring const & s) const
int * pw = strwidth_cache_[s];
if (pw)
return *pw;
// For some reason QMetrics::width returns a wrong value with Qt5
// int w = metrics_.width(toqstr(s));
#endif
QTextLayout tl;
tl.setText(toqstr(s));
tl.setFont(font_);
tl.beginLayout();
QTextLine line = tl.createLine();
tl.endLayout();
int w = int(line.naturalTextWidth());
/* 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.
*/
int w = 0;
if (s.length() == 1
#if QT_VERSION >= 0x040800
|| font_.styleName() == "LyX"
#endif
)
w = metrics_.width(toqstr(s));
else {
QTextLayout tl;
tl.setText(toqstr(s));
tl.setFont(font_);
tl.beginLayout();
QTextLine line = tl.createLine();
tl.endLayout();
w = int(line.naturalTextWidth());
}
#ifdef CACHE_METRICS_WIDTH
strwidth_cache_.insert(s, new int(w), s.size() * sizeof(char_type));
#endif