]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiFontLoader.cpp
Amend f441590c
[lyx.git] / src / frontends / qt4 / GuiFontLoader.cpp
index 031eef655562338c4f0787085779970c7a591cb7..9a662a893b3ce846386588370befeeaeae755f15 100644 (file)
@@ -96,10 +96,10 @@ static GuiFontInfo * fontinfo_[NUM_FAMILIES][NUM_SERIES][NUM_SHAPE][NUM_SIZE];
 GuiFontInfo & fontinfo(FontInfo const & f)
 {
        // LASSERT: Is there anything we might do here besides crash?
-       LBUFERR(f.family() < NUM_FAMILIES, _("Font lookup error."));
-       LBUFERR(f.series() < NUM_SERIES, _("Font lookup error."));
-       LBUFERR(f.realShape() < NUM_SHAPE, _("Font lookup error."));
-       LBUFERR(f.size() < NUM_SIZE, _("Font lookup error."));
+       LBUFERR(f.family() < NUM_FAMILIES);
+       LBUFERR(f.series() < NUM_SERIES);
+       LBUFERR(f.realShape() < NUM_SHAPE);
+       LBUFERR(f.size() < NUM_SIZE);
        // fi is a reference to the pointer type (GuiFontInfo *) in the
        // fontinfo_ table.
        GuiFontInfo * & fi =
@@ -131,13 +131,16 @@ QString symbolFamily(FontFamily family)
 }
 
 
+#if 0
 bool isSymbolFamily(FontFamily family)
 {
        return family >= SYMBOL_FAMILY && family <= ESINT_FAMILY;
 }
+#endif
 
 
-static bool isChosenFont(QFont & font, QString const & family)
+static bool isChosenFont(QFont & font, QString const & family,
+                        QString const & style)
 {
        // QFontInfo won't find a font that has only a few glyphs at unusual
        // positions, e.g. the original esint10 font.
@@ -147,7 +150,11 @@ static bool isChosenFont(QFont & font, QString const & family)
 
        LYXERR(Debug::FONT, "got: " << fi.family());
 
-       if (fi.family().contains(family)) {
+       if (fi.family().contains(family)
+#if QT_VERSION >= 0x040800
+           && (style.isEmpty() || fi.styleName().contains(style))
+#endif
+           ) {
                LYXERR(Debug::FONT, " got it ");
                return true;
        }
@@ -163,10 +170,21 @@ QFont symbolFont(QString const & family, bool * ok)
        upper[0] = family[0].toUpper();
 
        QFont font;
-       font.setKerning(false);
        font.setFamily(family);
+#if QT_VERSION >= 0x040800
+       font.setStyleName("LyX");
+
+       if (isChosenFont(font, family, "LyX")) {
+               LYXERR(Debug::FONT, "lyx!");
+               *ok = true;
+               return font;
+       }
+
+       LYXERR(Debug::FONT, "Trying normal " << family << " ... ");
+       font.setStyleName(QString());
+#endif
 
-       if (isChosenFont(font, family)) {
+       if (isChosenFont(font, family, QString())) {
                LYXERR(Debug::FONT, "normal!");
                *ok = true;
                return font;
@@ -175,7 +193,7 @@ QFont symbolFont(QString const & family, bool * ok)
        LYXERR(Debug::FONT, "Trying " << upper << " ... ");
        font.setFamily(upper);
 
-       if (isChosenFont(font, upper)) {
+       if (isChosenFont(font, upper, QString())) {
                LYXERR(Debug::FONT, "upper!");
                *ok = true;
                return font;
@@ -187,7 +205,7 @@ QFont symbolFont(QString const & family, bool * ok)
        LYXERR(Debug::FONT, "Trying " << raw << " ... ");
        font.setRawName(raw);
 
-       if (isChosenFont(font, family)) {
+       if (isChosenFont(font, family, QString())) {
                LYXERR(Debug::FONT, "raw version!");
                *ok = true;
                return font;
@@ -207,7 +225,7 @@ FontLoader::FontLoader()
                toqstr(addPath(package().system_support().absFileName(), "fonts"));
 
        for (int i = 0 ; i < num_math_fonts; ++i) {
-               QString const font_file = fonts_dir + '/' + math_fonts[i] + ".ttf";
+               QString const font_file = fonts_dir + math_fonts[i] + ".ttf";
                int fontID = QFontDatabase::addApplicationFont(font_file);
 
                LYXERR(Debug::FONT, "Adding font " << font_file
@@ -241,8 +259,9 @@ FontLoader::~FontLoader()
 
 /////////////////////////////////////////////////
 
+namespace {
 
-static QString makeFontName(QString const & family, QString const & foundry)
+QString makeFontName(QString const & family, QString const & foundry)
 {
        QString res = family;
        if (!foundry.isEmpty())
@@ -251,10 +270,9 @@ static QString makeFontName(QString const & family, QString const & foundry)
 }
 
 
-GuiFontInfo::GuiFontInfo(FontInfo const & f)
-       : metrics(QFont())
+QFont makeQFont(FontInfo const & f)
 {
-       font.setKerning(false);
+       QFont font;
        QString const pat = symbolFamily(f.family());
        if (!pat.isEmpty()) {
                bool ok;
@@ -265,7 +283,7 @@ GuiFontInfo::GuiFontInfo(FontInfo const & f)
                        QString family = makeFontName(toqstr(lyxrc.roman_font_name),
                                toqstr(lyxrc.roman_font_foundry)); 
                        font.setFamily(family);
-#ifdef Q_WS_MACX
+#ifdef Q_OS_MAC
 #if QT_VERSION >= 0x040300 //&& QT_VERSION < 0x040800
                        // Workaround for a Qt bug, see http://www.lyx.org/trac/ticket/3684
                        // and http://bugreports.qt.nokia.com/browse/QTBUG-11145.
@@ -302,8 +320,13 @@ GuiFontInfo::GuiFontInfo(FontInfo const & f)
 
        switch (f.realShape()) {
                case ITALIC_SHAPE:
+                       font.setStyle(QFont::StyleItalic);
+                       break;
                case SLANTED_SHAPE:
-                       font.setItalic(true);
+                       font.setStyle(QFont::StyleOblique);
+                       break;
+               case SMALLCAPS_SHAPE:
+                       font.setCapitalization(QFont::SmallCaps);
                        break;
                default:
                        break;
@@ -325,28 +348,34 @@ GuiFontInfo::GuiFontInfo(FontInfo const & f)
 
        LYXERR(Debug::FONT, "The font has size: " << font.pointSizeF());
 
-       if (f.realShape() != SMALLCAPS_SHAPE) {
-               metrics = GuiFontMetrics(font);
-       } else {
-               // handle small caps ourselves ...
-               FontInfo smallfont = f;
-               smallfont.decSize().decSize().setShape(UP_SHAPE);
-               QFont font2(font);
-               font2.setKerning(false);
-               font2.setPointSizeF(convert<double>(lyxrc.font_sizes[smallfont.size()])
-                              * lyxrc.zoom / 100.0);
-
-               metrics = GuiFontMetrics(font, font2);
-       }
+       return font;
 }
 
+} // anon namespace
+
+
+GuiFontInfo::GuiFontInfo(FontInfo const & f)
+       : font(makeQFont(f)), metrics(font)
+{}
+
 
 bool FontLoader::available(FontInfo const & f)
 {
+       // FIXME THREAD
        static vector<int> cache_set(NUM_FAMILIES, false);
        static vector<int> cache(NUM_FAMILIES, false);
 
        FontFamily family = f.family();
+#ifdef Q_OS_MAC
+       // Apple ships a font name "Symbol", which has more or less the same
+       // glyphs as the original PostScript Symbol font, but it uses a different
+       // encoding (see https://en.wikipedia.org/wiki/Symbol_(typeface)#cite_note-2).
+       // Since we expect the font specific encoding of the original
+       // PostScript Symbol font, we can't use the one provided on OS X.
+       // See also the discussion in bug 7954.
+       if (f.family() == SYMBOL_FAMILY)
+               return false;
+#endif
        if (cache_set[family])
                return cache[family];
        cache_set[family] = true;
@@ -366,6 +395,21 @@ bool FontLoader::available(FontInfo const & f)
 }
 
 
+bool FontLoader::canBeDisplayed(char_type c)
+{
+       // bug 8493
+       if (c == 0x0009)
+               // FIXME check whether this is still needed for Qt5
+               return false;
+#if QT_VERSION < 0x050000 && defined(QT_MAC_USE_COCOA) && (QT_MAC_USE_COCOA > 0)
+       // bug 7954, see also comment in GuiPainter::text()
+       if (c == 0x00ad)
+               return false;
+#endif
+       return true;
+}
+
+
 FontMetrics const & FontLoader::metrics(FontInfo const & f)
 {
        return fontinfo(f).metrics;