2 * \file qfont_metrics.C
3 * Copyright 1995-2002 the LyX Team
4 * Read the file COPYING
7 * \author John Levon <moz@compsoc.man.ac.uk>
14 #pragma implementation "frontends/font_metrics.h"
17 #include "support/lstrings.h"
18 #include "font_metrics.h"
19 #include "qfont_loader.h"
22 #include <qfontmetrics.h>
26 QFontMetrics const & metrics(LyXFont const & f) {
27 return fontloader.metrics(f);
32 namespace font_metrics {
34 int maxAscent(LyXFont const & f)
36 return metrics(f).ascent();
40 int maxDescent(LyXFont const & f)
42 return metrics(f).descent();
46 int ascent(char /*c*/, LyXFont const & f)
48 // LyX is broken - returning accurate metrics breaks mathed
49 // because the cursor extends outside of its region.
50 // http://marc.theaimsgroup.com/?l=lyx-devel&m=103060206211300&w=2
52 QRect r = metrics(f).boundingRect(c);
55 return metrics(f).ascent();
59 int descent(char /*c*/, LyXFont const & f)
61 // LyX is broken - returning accurate metrics breaks mathed
62 // because the cursor extends outside of its region.
63 // http://marc.theaimsgroup.com/?l=lyx-devel&m=103060206211300&w=2
65 QRect r = metrics(f).boundingRect(c);
66 return abs(r.bottom());
68 return metrics(f).descent();
72 int lbearing(char c, LyXFont const & f)
74 return metrics(f).leftBearing(c);
78 int rbearing(char c, LyXFont const & f)
80 return metrics(f).rightBearing(c);
84 int width(char const * s, size_t ls, LyXFont const & f)
86 if (f.realShape() != LyXFont::SMALLCAPS_SHAPE) {
87 return metrics(f).width(s, ls);
90 // handle small caps ourselves ...
93 smallfont.decSize().decSize().setShape(LyXFont::UP_SHAPE);
95 QFontMetrics qm = fontloader.metrics(f);
96 QFontMetrics qsmallm = fontloader.metrics(smallfont);
100 for (size_t i = 0; i < ls; ++i) {
101 char const c = uppercase(s[i]);
103 w += qsmallm.width(&c, 1);
105 w += qm.width(&c, 1);
111 int signedWidth(string const & s, LyXFont const & f)
114 return -width(s.substr(1, s.length() - 1), f);
120 void rectText(string const & str, LyXFont const & f,
125 QFontMetrics const & m(metrics(f));
129 descent = m.descent();
134 void buttonText(string const & str, LyXFont const & f,
139 QFontMetrics const & m(metrics(f));
141 static int const d = 3;
143 w = width(str, f) + d * 2 + 2;
144 ascent = m.ascent() + d;
145 descent = m.descent() + d;
148 } // namespace font_metrics