commit 4a935ed7683806e9ecc784e9f29cc59b6160a58d
Author: Jean-Marc Lasgouttes <[email protected]>
Date:   Fri Jan 20 10:32:40 2017 +0100

    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 82a6d13..31ba7f0 100644
--- a/lib/symbols
+++ b/lib/symbols
@@ -314,7 +314,7 @@ spadesuit          cmsy        127 170 mathord  &spades;
 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 &#x2907; 
stmaryrd
+\def\Mapsto{\Mapstochar\mathrel\Rightarrow}              mathrel &#x2907; 
stmaryrd
 \def\mapsfrom{\leftarrow\kern-9mu\mapsfromchar}          mathrel &#x21a4; 
stmaryrd
 \def\Mapsfrom{\Leftarrow\kern-9mu\Mapsfromchar}          mathrel &#x2906; 
stmaryrd
 \def\Longmapsto{\Mapstochar\Longrightarrow}              mathrel &#x27fe; 
stmaryrd
@@ -1174,7 +1174,7 @@ iffont cmsy
 \def\Longleftarrow{\Leftarrow\joinrel\Relbar}                   mathrel 
&#x27F8;
 \def\implies{\Longrightarrow}                                   mathrel 
&#x27F9; amsmath
 \def\impliedby{\Longleftarrow}                                  mathrel 
&#x27F8; amsmath
-\def\mapsto{\mapstochar\mathrel{\kern-2mu}\rightarrow}          mathrel 
&#x21A4;
+\def\mapsto{\mapstochar\rightarrow}                             mathrel 
&#x21A4;
 \def\longmapsto{\mapstochar\joinrel\relbar\joinrel\rightarrow}  mathrel 
&#x27FB;
 \def\models{\mathrel{\vert}\joinrel\Relbar}                     mathrel &vDash;
 else
diff --git a/src/frontends/qt4/GuiFontMetrics.cpp 
b/src/frontends/qt4/GuiFontMetrics.cpp
index a0fa699..2f598f4 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

Reply via email to