X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiFontMetrics.cpp;h=76ebd907064e088a442cdd03fb2097196c1a2f8e;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=5d3a0dd6721fa869bc4765b9dcc8ad63cb46ad70;hpb=bd720f7277c1aed9311011faee1ac999634b6867;p=lyx.git diff --git a/src/frontends/qt4/GuiFontMetrics.cpp b/src/frontends/qt4/GuiFontMetrics.cpp index 5d3a0dd672..76ebd90706 100644 --- a/src/frontends/qt4/GuiFontMetrics.cpp +++ b/src/frontends/qt4/GuiFontMetrics.cpp @@ -18,13 +18,29 @@ #include "Language.h" #include "Dimension.h" -#include "support/unicode.h" +#include "insets/Inset.h" -using std::string; +#include "support/lassert.h" + +using namespace std; namespace lyx { namespace frontend { +/** + * Convert a UCS4 character into a QChar. + * This is a hack (it does only make sense for the common part of the UCS4 + * and UTF16 encodings) and should not be used. + * This does only exist because of performance reasons (a real conversion + * using iconv is too slow on windows). + */ +static inline QChar const ucs4_to_qchar(char_type const ucs4) +{ + LASSERT(is_utf16(ucs4), /**/); + return QChar(static_cast(ucs4)); +} + + // Caution: When using ucs4_to_qchar() in these methods, this is no // real conversion but a simple cast in reality. This is the reason // why this works well for symbol fonts used in mathed too, even though @@ -63,7 +79,7 @@ int GuiFontMetrics::lbearing(char_type c) const if (!is_utf16(c)) // FIXME: QFontMetrics::leftBearingdoes not support the // full unicode range. Once it does, we could use: - //return metrics_.leftBearing(toqstr(docstring(1,c))); + //return metrics_.leftBearing(toqstr(docstring(1, c))); return 0; return metrics_.leftBearing(ucs4_to_qchar(c)); @@ -85,11 +101,12 @@ int GuiFontMetrics::rbearing(char_type c) const if (is_utf16(c)) { QChar sc = ucs4_to_qchar(c); value = width(c) - metrics_.rightBearing(sc); - } else - // FIXME: QFontMetrics::leftBearingdoes not support the + } else { + // FIXME: QFontMetrics::leftBearing does not support the // full unicode range. Once it does, we could use: - // metrics_.rightBearing(toqstr(docstring(1,c))); + // metrics_.rightBearing(toqstr(docstring(1, c))); value = width(c); + } rbearing_cache_.insert(c, value); @@ -108,7 +125,7 @@ int GuiFontMetrics::smallcapsWidth(char_type c) const else return metrics_.width(qc); } else { - QString const s = toqstr(docstring(1,c)); + QString const s = toqstr(docstring(1, c)); QString const us = s.toUpper(); if (s != us) return smallcaps_metrics_.width(us); @@ -163,8 +180,9 @@ int GuiFontMetrics::signedWidth(docstring const & s) const void GuiFontMetrics::rectText(docstring const & str, int & w, int & ascent, int & descent) const { - static int const d = 2; - w = width(str) + d * 2 + 2; + static int const d = Inset::TEXT_TO_INSET_OFFSET / 2; + + w = width(str) + Inset::TEXT_TO_INSET_OFFSET; ascent = metrics_.ascent() + d; descent = metrics_.descent() + d; } @@ -174,10 +192,8 @@ void GuiFontMetrics::rectText(docstring const & str, void GuiFontMetrics::buttonText(docstring const & str, int & w, int & ascent, int & descent) const { - static int const d = 3; - w = width(str) + d * 2 + 2; - ascent = metrics_.ascent() + d; - descent = metrics_.descent() + d; + rectText(str, w, ascent, descent); + w += Inset::TEXT_TO_INSET_OFFSET; } @@ -200,7 +216,7 @@ GuiFontMetrics::AscendDescend const GuiFontMetrics::fillMetricsCache( if (is_utf16(c)) r = metrics_.boundingRect(ucs4_to_qchar(c)); else - r = metrics_.boundingRect(toqstr(docstring(1,c))); + r = metrics_.boundingRect(toqstr(docstring(1, c))); AscendDescend ad = { -r.top(), r.bottom() + 1}; // We could as well compute the width but this is not really @@ -223,7 +239,7 @@ int GuiFontMetrics::width(char_type c) const if (is_utf16(c)) value = metrics_.width(ucs4_to_qchar(c)); else - value = metrics_.width(toqstr(docstring(1,c))); + value = metrics_.width(toqstr(docstring(1, c))); width_cache_.insert(c, value); @@ -256,5 +272,5 @@ int GuiFontMetrics::descent(char_type c) const return value.descent; } -} // frontend -} // lyx +} // namespace frontend +} // namespace lyx