X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiFontLoader.cpp;h=ff3fe53675c1bdaf1b0a2f632d72b0278afab574;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=3fde5a096836836fa1e6c82a94b76076fe417686;hpb=de174939327a2e371340313498d44a44310a867b;p=lyx.git diff --git a/src/frontends/qt4/GuiFontLoader.cpp b/src/frontends/qt4/GuiFontLoader.cpp index 3fde5a0968..ff3fe53675 100644 --- a/src/frontends/qt4/GuiFontLoader.cpp +++ b/src/frontends/qt4/GuiFontLoader.cpp @@ -14,7 +14,7 @@ #include "FontLoader.h" #include "FontInfo.h" -#include "GuiFontLoader.h" +#include "GuiFontMetrics.h" #include "qt_helpers.h" #include "LyXRC.h" @@ -30,7 +30,7 @@ #include #include -#include +#include "support/lassert.h" using namespace std; using namespace lyx::support; @@ -45,6 +45,21 @@ extern docstring const stateText(FontInfo const & f); namespace frontend { +/** + * Matches Fonts against + * actual QFont instances, and also caches metrics. + */ +class GuiFontInfo +{ +public: + GuiFontInfo(FontInfo const & f); + + /// The font instance + QFont font; + /// Metrics on the font + GuiFontMetrics metrics; +}; + namespace { struct SymbolFont { @@ -54,45 +69,16 @@ struct SymbolFont { }; SymbolFont symbol_fonts[] = { - { SYMBOL_FAMILY, - "symbol", - "-*-symbol-*-*-*-*-*-*-*-*-*-*-adobe-fontspecific" }, - - { CMR_FAMILY, - "cmr10", - "-*-cmr10-medium-*-*-*-*-*-*-*-*-*-*-*" }, - - { CMSY_FAMILY, - "cmsy10", - "-*-cmsy10-*-*-*-*-*-*-*-*-*-*-*-*" }, - - { CMM_FAMILY, - "cmmi10", - "-*-cmmi10-medium-*-*-*-*-*-*-*-*-*-*-*" }, - - { CMEX_FAMILY, - "cmex10", - "-*-cmex10-*-*-*-*-*-*-*-*-*-*-*-*" }, - - { MSA_FAMILY, - "msam10", - "-*-msam10-*-*-*-*-*-*-*-*-*-*-*-*" }, - - { MSB_FAMILY, - "msbm10", - "-*-msbm10-*-*-*-*-*-*-*-*-*-*-*-*" }, - - { EUFRAK_FAMILY, - "eufm10", - "-*-eufm10-medium-*-*-*-*-*-*-*-*-*-*-*" }, - - { WASY_FAMILY, - "wasy10", - "-*-wasy10-medium-*-*-*-*-*-*-*-*-*-*-*" }, - - { ESINT_FAMILY, - "esint10", - "-*-esint10-medium-*-*-*-*-*-*-*-*-*-*-*" } + { SYMBOL_FAMILY,"symbol", "-*-symbol-*-*-*-*-*-*-*-*-*-*-adobe-fontspecific"}, + { CMR_FAMILY, "cmr10", "-*-cmr10-medium-*-*-*-*-*-*-*-*-*-*-*" }, + { CMSY_FAMILY, "cmsy10", "-*-cmsy10-*-*-*-*-*-*-*-*-*-*-*-*" }, + { CMM_FAMILY, "cmmi10", "-*-cmmi10-medium-*-*-*-*-*-*-*-*-*-*-*" }, + { CMEX_FAMILY, "cmex10", "-*-cmex10-*-*-*-*-*-*-*-*-*-*-*-*" }, + { MSA_FAMILY, "msam10", "-*-msam10-*-*-*-*-*-*-*-*-*-*-*-*" }, + { MSB_FAMILY, "msbm10", "-*-msbm10-*-*-*-*-*-*-*-*-*-*-*-*" }, + { EUFRAK_FAMILY,"eufm10", "-*-eufm10-medium-*-*-*-*-*-*-*-*-*-*-*" }, + { WASY_FAMILY, "wasy10", "-*-wasy10-medium-*-*-*-*-*-*-*-*-*-*-*" }, + { ESINT_FAMILY, "esint10","-*-esint10-medium-*-*-*-*-*-*-*-*-*-*-*" } }; size_t const nr_symbol_fonts = sizeof(symbol_fonts) / sizeof(symbol_fonts[0]); @@ -105,10 +91,10 @@ static GuiFontInfo * fontinfo_[NUM_FAMILIES][2][4][10]; // if not cached, create it. GuiFontInfo & fontinfo(FontInfo const & f) { - BOOST_ASSERT(f.family() < NUM_FAMILIES); - BOOST_ASSERT(f.series() < 2); - BOOST_ASSERT(f.realShape() < 4); - BOOST_ASSERT(f.size() < 10); + LASSERT(f.family() < NUM_FAMILIES, /**/); + LASSERT(f.series() < 2, /**/); + LASSERT(f.realShape() < 4, /**/); + LASSERT(f.size() < 10, /**/); // fi is a reference to the pointer type (GuiFontInfo *) in the // fontinfo_ table. GuiFontInfo * & fi = @@ -154,7 +140,7 @@ static bool isChosenFont(QFont & font, QString const & family) // positions. QFontInfo fi(font); - LYXERR(Debug::FONT, "got: " << fromqstr(fi.family())); + LYXERR(Debug::FONT, "got: " << fi.family()); if (fi.family().contains(family)) { LYXERR(Debug::FONT, " got it "); @@ -167,8 +153,7 @@ static bool isChosenFont(QFont & font, QString const & family) QFont symbolFont(QString const & family, bool * ok) { - LYXERR(Debug::FONT, "Looking for font family " - << fromqstr(family) << " ... "); + LYXERR(Debug::FONT, "Looking for font family " << family << " ... "); QString upper = family; upper[0] = family[0].toUpper(); @@ -182,7 +167,7 @@ QFont symbolFont(QString const & family, bool * ok) return font; } - LYXERR(Debug::FONT, "Trying " << fromqstr(upper) << " ... "); + LYXERR(Debug::FONT, "Trying " << upper << " ... "); font.setFamily(upper); if (isChosenFont(font, upper)) { @@ -193,9 +178,9 @@ QFont symbolFont(QString const & family, bool * ok) // A simple setFamily() fails on Qt 2 - QString const rawName = rawName(family); - LYXERR(Debug::FONT, "Trying " << fromqstr(rawName) << " ... "); - font.setRawName(rawName); + QString const raw = rawName(family); + LYXERR(Debug::FONT, "Trying " << raw << " ... "); + font.setRawName(raw); if (isChosenFont(font, family)) { LYXERR(Debug::FONT, "raw version!"); @@ -220,9 +205,8 @@ FontLoader::FontLoader() QString const font_file = fonts_dir + '/' + math_fonts[i] + ".ttf"; int fontID = QFontDatabase::addApplicationFont(font_file); - LYXERR(Debug::FONT, "Adding font " << fromqstr(font_file) - << static_cast - (fontID < 0 ? " FAIL" : " OK")); + LYXERR(Debug::FONT, "Adding font " << font_file + << (fontID < 0 ? " FAIL" : " OK")); } for (int i1 = 0; i1 < NUM_FAMILIES; ++i1) @@ -235,14 +219,13 @@ FontLoader::FontLoader() void FontLoader::update() { - for (int i1 = 0; i1 < NUM_FAMILIES; ++i1) { + for (int i1 = 0; i1 < NUM_FAMILIES; ++i1) for (int i2 = 0; i2 < 2; ++i2) for (int i3 = 0; i3 < 4; ++i3) for (int i4 = 0; i4 < 10; ++i4) { delete fontinfo_[i1][i2][i3][i4]; fontinfo_[i1][i2][i3][i4] = 0; } - } } @@ -279,7 +262,7 @@ GuiFontInfo::GuiFontInfo(FontInfo const & f) font.setFamily(family); #ifdef Q_WS_MACX #if QT_VERSION >= 0x040300 - // Workaround for a Qt bug, see http://bugzilla.lyx.org/show_bug.cgi?id=3684 + // Workaround for a Qt bug, see http://www.lyx.org/trac/ticket/3684 // It is reported to Trolltech at 02/06/07 against 4.3 final. // FIXME: Add an upper version limit as soon as the bug is fixed in Qt. if (family == "Times" && !font.exactMatch()) @@ -321,8 +304,8 @@ GuiFontInfo::GuiFontInfo(FontInfo const & f) break; } - LYXERR(Debug::FONT, "Font '" << to_utf8(stateText(f)) - << "' matched by\n" << fromqstr(font.family())); + LYXERR(Debug::FONT, "Font '" << stateText(f) + << "' matched by\n" << font.family()); // Is this an exact match? if (font.exactMatch()) @@ -330,7 +313,7 @@ GuiFontInfo::GuiFontInfo(FontInfo const & f) else LYXERR(Debug::FONT, "This font is NOT an exact match"); - LYXERR(Debug::FONT, "XFLD: " << fromqstr(font.rawName())); + LYXERR(Debug::FONT, "XFLD: " << font.rawName()); font.setPointSizeF(convert(lyxrc.font_sizes[f.size()]) * lyxrc.zoom / 100.0); @@ -377,21 +360,22 @@ bool FontLoader::available(FontInfo const & f) return true; } + FontMetrics const & FontLoader::metrics(FontInfo const & f) { return fontinfo(f).metrics; } -/// Get the QFont for this FontInfo -QFont const & getFont(FontInfo const & f) + +GuiFontMetrics const & getFontMetrics(FontInfo const & f) { - return fontinfo(f).font; + return fontinfo(f).metrics; } -/// Get the QFont for this FontInfo -GuiFontInfo const & getFontInfo(FontInfo const & f) + +QFont const & getFont(FontInfo const & f) { - return fontinfo(f); + return fontinfo(f).font; } } // namespace frontend