From 4a935ed7683806e9ecc784e9f29cc59b6160a58d Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Fri, 20 Jan 2017 10:32:40 +0100 Subject: [PATCH] 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. Actually the problem had been worked around already in lib/symbol. The work around can therefore by removed now. [additionally, remove extra spacing from \mapsto, \Mapsto] --- lib/symbols | 10 +++++----- src/frontends/qt4/GuiFontMetrics.cpp | 29 +++++++++++++++++++--------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/lib/symbols b/lib/symbols index 82a6d132d5..31ba7f0eb1 100644 --- a/lib/symbols +++ b/lib/symbols @@ -314,7 +314,7 @@ spadesuit cmsy 127 170 mathord ♠ lyxnot cmsy 54 47 mathrel / hiddensymbol iffont cmsy # kerning is slightly imperfect so that one can see when \not is selected -\def\not{\lyxnot\mathrel{\kern-11mu}} +\def\not{\lyxnot} else \def\not{\kern4mu\lyxnot\kern-19mu} endif @@ -991,11 +991,11 @@ bignplus stmry 112 0 mathop x stmaryrd # caution: named hugenpl \def\varcopyright{\mathord{c\kern-11mu\varbigcirc}} stmaryrd # kerning is slightly imperfect so that one sees when \[Aa]rrownot is selected -\def\arrownot{\lyxarrownot\mathrel{\kern-11mu}} stmaryrd -\def\Arrownot{\lyxArrownot\mathrel{\kern-10.5mu}} stmaryrd +\def\arrownot{\lyxarrownot} stmaryrd +\def\Arrownot{\lyxArrownot\mathrel{\kern0.5mu}} stmaryrd \def\longarrownot{\mathrel{\kern5.5mu}\arrownot\mathrel{\kern-5.5mu}} stmaryrd \def\Longarrownot{\mathrel{\kern5.5mu}\Arrownot\mathrel{\kern-5.5mu}} stmaryrd -\def\Mapsto{\Mapstochar\mathrel{\kern-2mu}\Rightarrow} mathrel ⤇ stmaryrd +\def\Mapsto{\Mapstochar\mathrel\Rightarrow} mathrel ⤇ stmaryrd \def\mapsfrom{\leftarrow\kern-9mu\mapsfromchar} mathrel ↤ stmaryrd \def\Mapsfrom{\Leftarrow\kern-9mu\Mapsfromchar} mathrel ⤆ stmaryrd \def\Longmapsto{\Mapstochar\Longrightarrow} mathrel ⟾ stmaryrd @@ -1174,7 +1174,7 @@ iffont cmsy \def\Longleftarrow{\Leftarrow\joinrel\Relbar} mathrel ⟸ \def\implies{\Longrightarrow} mathrel ⟹ amsmath \def\impliedby{\Longleftarrow} mathrel ⟸ amsmath -\def\mapsto{\mapstochar\mathrel{\kern-2mu}\rightarrow} mathrel ↤ +\def\mapsto{\mapstochar\rightarrow} mathrel ↤ \def\longmapsto{\mapstochar\joinrel\relbar\joinrel\rightarrow} mathrel ⟻ \def\models{\mathrel{\vert}\joinrel\Relbar} mathrel ⊨ else diff --git a/src/frontends/qt4/GuiFontMetrics.cpp b/src/frontends/qt4/GuiFontMetrics.cpp index a0fa6998ab..2f598f43dc 100644 --- a/src/frontends/qt4/GuiFontMetrics.cpp +++ b/src/frontends/qt4/GuiFontMetrics.cpp @@ -182,17 +182,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)); PROFILE_CACHE_MISS(width) #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). + */ + 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