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 ♠
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 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