]> git.lyx.org Git - lyx.git/commitdiff
Improve detection of our math fonts
authorEnrico Forestieri <forenr@lyx.org>
Tue, 13 Aug 2024 20:51:40 +0000 (22:51 +0200)
committerEnrico Forestieri <forenr@lyx.org>
Tue, 13 Aug 2024 20:51:40 +0000 (22:51 +0200)
It turns out that Qt font selection via style name is broken on
Windows (QTBUG-101436). As we use our own style name for discriminating
our math fonts and applying proper kerning, we need a fallback method.
With this commit we check for the family name when the style name does
not match. In computing the kerning we also consider the right bearing
reported by the font instead of the width of the enclosing bounding box,
as this produces better results (see bug 13087).

Fixes #13087.

src/frontends/qt/GuiFontLoader.cpp
src/frontends/qt/GuiFontLoader.h
src/frontends/qt/GuiFontMetrics.cpp

index cf6c205d2d331e53bcc98456f709ff6e4145d42f..a808431d1040c09c9f3e3098c652362c80b60176 100644 (file)
@@ -44,6 +44,15 @@ int const num_math_fonts = sizeof(math_fonts) / sizeof(*math_fonts);
 
 namespace lyx {
 
+bool isMathFamily(QString const & name)
+{
+       for (int i = 0; i < num_math_fonts; ++i) {
+               if (math_fonts[i] == name)
+                       return true;
+       }
+       return false;
+}
+
 namespace frontend {
 
 /**
index 40c15f5ea0b60ab6391a5ae2532d76257b34f23d..21e24a7ef49e60370ca26cb5ec2b591b9cbad93f 100644 (file)
 #define GUI_FONTLOADER_H
 
 class QFont;
+class QString;
 
 namespace lyx {
 
 class FontInfo;
 
+bool isMathFamily(QString const & name);
+
 namespace frontend {
 
 class GuiFontMetrics;
index 631aecc062818d89e49acf7d865604f9562c2ec1..f0300f16ea9efc45af04dfad8f9ad356c8ce3240 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <config.h>
 
+#include "GuiFontLoader.h"
 #include "GuiFontMetrics.h"
 
 #include "qt_helpers.h"
@@ -276,10 +277,12 @@ int GuiFontMetrics::width(docstring const & s) const
        */
        int w = 0;
        // is the string a single character from a math font ?
-       bool const math_char = s.length() == 1 && font_.styleName() == "LyX";
+       // we have to also explicitly check for the family, see bug 13087
+       bool const math_char = s.length() == 1
+               && (font_.styleName() == "LyX" || isMathFamily(font_.family()));
        if (math_char) {
                QString const qs = toqstr(s);
-               int br_width = metrics_.boundingRect(qs).width();
+               int br_width = rbearing(s[0]);
 #if QT_VERSION >= 0x050b00
                int s_width = metrics_.horizontalAdvance(qs);
 #else