#include "frontends/font_metrics.h"
#include "frontends/lyx_gui.h"
-#include "qfont_loader.h"
+#include "GuiApplication.h"
+#include "FontLoader.h"
+#include "qt_helpers.h"
#include "language.h"
+#include "support/unicode.h"
+
+using lyx::char_type;
+using lyx::docstring;
using std::string;
-namespace font_metrics {
+namespace {
+
+int smallcapswidth(QString const & s, LyXFont const & f)
+{
+ if (!lyx_gui::use_gui)
+ return 1;
+ // handle small caps ourselves ...
+
+ LyXFont smallfont = f;
+ smallfont.decSize().decSize().setShape(LyXFont::UP_SHAPE);
+
+ QFontMetrics const & qm = guiApp->guiFontLoader().metrics(f);
+ QFontMetrics const & qsmallm = guiApp->guiFontLoader().metrics(smallfont);
+
+ int w = 0;
+
+ int const ls = s.size();
+
+ for (int i = 0; i < ls; ++i) {
+ QChar const & c = s[i];
+ QChar const uc = c.toUpper();
+ if (c != uc)
+ w += qsmallm.width(uc);
+ else
+ w += qm.width(c);
+ }
+ return w;
+}
+
+
+} // anon namespace
-int maxAscent(LyXFont const & f)
+
+int font_metrics::maxAscent(LyXFont const & f)
{
if (!lyx_gui::use_gui)
return 1;
- return fontloader.metrics(f).ascent();
+ return guiApp->guiFontLoader().metrics(f).ascent();
}
-int maxDescent(LyXFont const & f)
+int font_metrics::maxDescent(LyXFont const & f)
{
if (!lyx_gui::use_gui)
return 1;
// We add 1 as the value returned by QT is different than X
// See http://doc.trolltech.com/2.3/qfontmetrics.html#200b74
- return fontloader.metrics(f).descent() + 1;
+ return guiApp->guiFontLoader().metrics(f).descent() + 1;
}
-int ascent(char c, LyXFont const & f)
+int font_metrics::ascent(char_type c, LyXFont const & f)
{
if (!lyx_gui::use_gui)
return 1;
- QRect const & r = fontloader.metrics(f).boundingRect(c);
+ QRect const & r = guiApp->guiFontLoader().metrics(f).boundingRect(ucs4_to_qchar(c));
// Qt/Win 3.2.1nc (at least) corrects the GetGlyphOutlineA|W y
// value by the height: (x, -y-height, width, height).
// Other versions return: (x, -y, width, height)
}
-int descent(char c, LyXFont const & f)
+int font_metrics::descent(char_type c, LyXFont const & f)
{
if (!lyx_gui::use_gui)
return 1;
- QRect const & r = fontloader.metrics(f).boundingRect(c);
+ QRect const & r = guiApp->guiFontLoader().metrics(f).boundingRect(ucs4_to_qchar(c));
// Qt/Win 3.2.1nc (at least) corrects the GetGlyphOutlineA|W y
// value by the height: (x, -y-height, width, height).
// Other versions return: (x, -y, width, height)
}
-int lbearing(char c, LyXFont const & f)
+int font_metrics::lbearing(char_type c, LyXFont const & f)
{
if (!lyx_gui::use_gui)
return 1;
- return fontloader.metrics(f).leftBearing(c);
+ return guiApp->guiFontLoader().metrics(f).leftBearing(ucs4_to_qchar(c));
}
-int rbearing(char c, LyXFont const & f)
+int font_metrics::rbearing(char_type c, LyXFont const & f)
{
if (!lyx_gui::use_gui)
return 1;
- QFontMetrics const & m = fontloader.metrics(f);
+ QFontMetrics const & m = guiApp->guiFontLoader().metrics(f);
// Qt rbearing is from the right edge of the char's width().
- return m.width(c) - m.rightBearing(c);
-}
-
-
-Encoding const * fontencoding(LyXFont const & f)
-{
- Encoding const * encoding = f.language()->encoding();
- if (f.isSymbolFont())
- encoding = encodings.symbol_encoding();
- return encoding;
-}
-
-
-int smallcapswidth(char const * s, size_t ls, LyXFont const & f)
-{
- if (!lyx_gui::use_gui)
- return 1;
- // handle small caps ourselves ...
-
- LyXFont smallfont = f;
- smallfont.decSize().decSize().setShape(LyXFont::UP_SHAPE);
-
- QFontMetrics const & qm = fontloader.metrics(f);
- QFontMetrics const & qsmallm = fontloader.metrics(smallfont);
-
- Encoding const * encoding = fontencoding(f);
-
- int w = 0;
-
- for (size_t i = 0; i < ls; ++i) {
- QChar const c = QChar(encoding->ucs(s[i]));
- QChar const uc = c.upper();
- if (c != uc)
- w += qsmallm.width(uc);
- else
- w += qm.width(c);
- }
- return w;
+ QChar sc = ucs4_to_qchar(c);
+ return m.width(sc) - m.rightBearing(sc);
}
-int width(char const * s, size_t ls, LyXFont const & f)
+int font_metrics::width(char_type const * s, size_t ls, LyXFont const & f)
{
if (!lyx_gui::use_gui)
return ls;
+ QString ucs2 = ucs4_to_qstring(s, ls);
+
if (f.realShape() == LyXFont::SMALLCAPS_SHAPE)
- return smallcapswidth(s, ls, f);
+ return smallcapswidth(ucs2, f);
- Encoding const * encoding = fontencoding(f);
- QLFontInfo & fi = fontloader.fontinfo(f);
+ lyx::frontend::QLFontInfo & fi = guiApp->guiFontLoader().fontinfo(f);
- if (ls == 1)
- return fi.width(encoding->ucs(s[0]));
+ if (ls == 1)
+ return fi.width(ucs2[0].unicode());
int w = 0;
- for (size_t i = 0; i < ls; ++i)
- w += fi.width(encoding->ucs(s[i]));
+ for (unsigned int i = 0; i < ls; ++i)
+ w += fi.width(ucs2[i].unicode());
return w;
}
-int signedWidth(string const & s, LyXFont const & f)
+int font_metrics::signedWidth(docstring const & s, LyXFont const & f)
{
if (s[0] == '-')
return -width(s.substr(1, s.length() - 1), f);
}
-void rectText(string const & str, LyXFont const & f,
+void font_metrics::rectText(docstring const & str, LyXFont const & f,
int & w, int & ascent, int & descent)
{
- QFontMetrics const & m = fontloader.metrics(f);
+ QFontMetrics const & m = guiApp->guiFontLoader().metrics(f);
static int const d = 2;
w = width(str, f) + d * 2 + 2;
ascent = m.ascent() + d;
-void buttonText(string const & str, LyXFont const & f,
+void font_metrics::buttonText(docstring const & str, LyXFont const & f,
int & w, int & ascent, int & descent)
{
- QFontMetrics const & m = fontloader.metrics(f);
+ QFontMetrics const & m = guiApp->guiFontLoader().metrics(f);
static int const d = 3;
w = width(str, f) + d * 2 + 2;
ascent = m.ascent() + d;
descent = m.descent() + d;
}
-
-} // namespace font_metrics
-