Improve detection of our math fonts

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.
This commit is contained in:
Enrico Forestieri 2024-08-13 22:51:40 +02:00
parent d813465690
commit d632753dea
3 changed files with 17 additions and 2 deletions

View 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 {
/**

View File

@ -13,11 +13,14 @@
#define GUI_FONTLOADER_H
class QFont;
class QString;
namespace lyx {
class FontInfo;
bool isMathFamily(QString const & name);
namespace frontend {
class GuiFontMetrics;

View 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