X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiFontLoader.cpp;h=ff3fe53675c1bdaf1b0a2f632d72b0278afab574;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=aaa2d59f0dc36a6ea393d5e624b68cdc56115467;hpb=4b465cfc264b5b01ae4c884a9c093ba7245b0062;p=lyx.git diff --git a/src/frontends/qt4/GuiFontLoader.cpp b/src/frontends/qt4/GuiFontLoader.cpp index aaa2d59f0d..ff3fe53675 100644 --- a/src/frontends/qt4/GuiFontLoader.cpp +++ b/src/frontends/qt4/GuiFontLoader.cpp @@ -1,5 +1,5 @@ /** - * \file GuiFontLoader.cpp + * \file FontLoader.cpp * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * @@ -11,13 +11,16 @@ #include -#include "GuiFontLoader.h" +#include "FontLoader.h" + +#include "FontInfo.h" +#include "GuiFontMetrics.h" #include "qt_helpers.h" -#include "support/debug.h" #include "LyXRC.h" #include "support/convert.h" +#include "support/debug.h" #include "support/filetools.h" #include "support/lstrings.h" #include "support/Systemcall.h" @@ -27,23 +30,36 @@ #include #include +#include "support/lassert.h" + +using namespace std; +using namespace lyx::support; QString const math_fonts[] = {"cmex10", "cmmi10", "cmr10", "cmsy10", "eufm10", "msam10", "msbm10", "wasy10", "esint10"}; int const num_math_fonts = sizeof(math_fonts) / sizeof(*math_fonts); - namespace lyx { -using support::contains; -using support::package; -using support::addPath; -using support::addName; - 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 { @@ -53,51 +69,43 @@ 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-*-*-*-*-*-*-*-*-*-*-*-*" }, + { 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-*-*-*-*-*-*-*-*-*-*-*" } +}; - { EUFRAK_FAMILY, - "eufm10", - "-*-eufm10-medium-*-*-*-*-*-*-*-*-*-*-*" }, +size_t const nr_symbol_fonts = sizeof(symbol_fonts) / sizeof(symbol_fonts[0]); - { WASY_FAMILY, - "wasy10", - "-*-wasy10-medium-*-*-*-*-*-*-*-*-*-*-*" }, +/// BUTT ugly ! +static GuiFontInfo * fontinfo_[NUM_FAMILIES][2][4][10]; - { ESINT_FAMILY, - "esint10", - "-*-esint10-medium-*-*-*-*-*-*-*-*-*-*-*" } -}; -size_t const nr_symbol_fonts = sizeof(symbol_fonts) / sizeof(SymbolFont); +/// Get font info (font + metrics) for the given LyX font. +// if not cached, create it. +GuiFontInfo & fontinfo(FontInfo const & f) +{ + 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 = + fontinfo_[f.family()][f.series()][f.realShape()][f.size()]; + if (!fi) + fi = new GuiFontInfo(f); + return *fi; +} -QString getRawName(QString const & family) +QString rawName(QString const & family) { for (size_t i = 0; i < nr_symbol_fonts; ++i) if (family == symbol_fonts[i].family) @@ -108,7 +116,7 @@ QString getRawName(QString const & family) } -QString const symbolFamily(FontFamily family) +QString symbolFamily(FontFamily family) { for (size_t i = 0; i < nr_symbol_fonts; ++i) { if (family == symbol_fonts[i].lyx_family) @@ -132,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 "); @@ -145,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(); @@ -160,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)) { @@ -171,9 +178,9 @@ QFont symbolFont(QString const & family, bool * ok) // A simple setFamily() fails on Qt 2 - QString const rawName = getRawName(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!"); @@ -189,7 +196,7 @@ QFont symbolFont(QString const & family, bool * ok) } // namespace anon -GuiFontLoader::GuiFontLoader() +FontLoader::FontLoader() { QString const fonts_dir = toqstr(addPath(package().system_support().absFilename(), "fonts")); @@ -198,9 +205,8 @@ GuiFontLoader::GuiFontLoader() 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) @@ -211,20 +217,19 @@ GuiFontLoader::GuiFontLoader() } -void GuiFontLoader::update() +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; } - } } -GuiFontLoader::~GuiFontLoader() +FontLoader::~FontLoader() { update(); } @@ -257,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()) @@ -299,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()) @@ -308,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); @@ -331,10 +336,10 @@ GuiFontInfo::GuiFontInfo(FontInfo const & f) } -bool GuiFontLoader::available(FontInfo const & f) +bool FontLoader::available(FontInfo const & f) { - static std::vector cache_set(NUM_FAMILIES, false); - static std::vector cache(NUM_FAMILIES, false); + static vector cache_set(NUM_FAMILIES, false); + static vector cache(NUM_FAMILIES, false); FontFamily family = f.family(); if (cache_set[family]) @@ -355,5 +360,23 @@ bool GuiFontLoader::available(FontInfo const & f) return true; } + +FontMetrics const & FontLoader::metrics(FontInfo const & f) +{ + return fontinfo(f).metrics; +} + + +GuiFontMetrics const & getFontMetrics(FontInfo const & f) +{ + return fontinfo(f).metrics; +} + + +QFont const & getFont(FontInfo const & f) +{ + return fontinfo(f).font; +} + } // namespace frontend } // namespace lyx