mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-26 19:25:39 +00:00
This commit is a big rework of the FontLoader/FontMetrics interaction. Only Qt4 for now, I would be grateful is somebody steps up for qt3 and gtk.
Basically, I replaced all methods in the font_metrics namespace by a proper virtual interface FontMetrics. The FontLoader is _the_ container for FontMetrics. This patch should also bring some optimizations in a number of place in the code. This is because we do not need any more to search for the LyXFont at each font_metrics call. In effect, the speed advantage is not as sensible and this is a bit deceiving considering that this was my primary motivation behind the patch. But I like the patch anyway as it cleans up the relation and interfacing between fonts, metrics and frontends. * frontends/FontMetrics.h: new virtual interface. Renamed from font_metrics.h * qt4/GuiFontMetrics: corresponding qt4 implememtation. Renamed from qfont_metrics.C. The smallCaps particular case treatment has been transfered here as well as the width cache for MacOSX and Windows. * qt4/QLPainter.C: the smallCapsText has been reworked to return the width of the drawn text.C all other files: replace font_metric helper function call with corresponding FontMetrics method calls. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@15265 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
99fc6935a5
commit
00edcc582f
@ -433,6 +433,7 @@ src_frontends_header_files = Split('''
|
|||||||
Dialogs.h
|
Dialogs.h
|
||||||
FileDialog.h
|
FileDialog.h
|
||||||
FontLoader.h
|
FontLoader.h
|
||||||
|
FontMetrics.h
|
||||||
Gui.h
|
Gui.h
|
||||||
LyXKeySym.h
|
LyXKeySym.h
|
||||||
LyXKeySymFactory.h
|
LyXKeySymFactory.h
|
||||||
@ -443,7 +444,6 @@ src_frontends_header_files = Split('''
|
|||||||
Timeout.h
|
Timeout.h
|
||||||
Toolbars.h
|
Toolbars.h
|
||||||
WorkArea.h
|
WorkArea.h
|
||||||
font_metrics.h
|
|
||||||
guiapi.h
|
guiapi.h
|
||||||
key_state.h
|
key_state.h
|
||||||
lyx_gui.h
|
lyx_gui.h
|
||||||
@ -1236,6 +1236,7 @@ src_frontends_qt4_files = Split('''
|
|||||||
GuiApplication.C
|
GuiApplication.C
|
||||||
GuiClipboard.C
|
GuiClipboard.C
|
||||||
GuiFontLoader.C
|
GuiFontLoader.C
|
||||||
|
GuiFontMetrics.C
|
||||||
GuiImplementation.C
|
GuiImplementation.C
|
||||||
GuiSelection.C
|
GuiSelection.C
|
||||||
GuiView.C
|
GuiView.C
|
||||||
@ -1335,7 +1336,6 @@ src_frontends_qt4_files = Split('''
|
|||||||
lengthcombo.C
|
lengthcombo.C
|
||||||
lyx_gui.C
|
lyx_gui.C
|
||||||
panelstack.C
|
panelstack.C
|
||||||
qfont_metrics.C
|
|
||||||
qfontexample.C
|
qfontexample.C
|
||||||
qsetborder.C
|
qsetborder.C
|
||||||
qtTimeout.C
|
qtTimeout.C
|
||||||
|
@ -62,7 +62,8 @@
|
|||||||
#include "frontends/Alert.h"
|
#include "frontends/Alert.h"
|
||||||
#include "frontends/Application.h"
|
#include "frontends/Application.h"
|
||||||
#include "frontends/FileDialog.h"
|
#include "frontends/FileDialog.h"
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
|
|
||||||
#include "graphics/Previews.h"
|
#include "graphics/Previews.h"
|
||||||
|
|
||||||
@ -330,9 +331,10 @@ void BufferView::resize()
|
|||||||
bool BufferView::fitCursor()
|
bool BufferView::fitCursor()
|
||||||
{
|
{
|
||||||
if (bv_funcs::status(this, cursor_) == bv_funcs::CUR_INSIDE) {
|
if (bv_funcs::status(this, cursor_) == bv_funcs::CUR_INSIDE) {
|
||||||
LyXFont const font = cursor_.getFont();
|
lyx::frontend::FontMetrics const & fm
|
||||||
int const asc = font_metrics::maxAscent(font);
|
= theApp->fontLoader().metrics(cursor_.getFont());
|
||||||
int const des = font_metrics::maxDescent(font);
|
int const asc = fm.maxAscent();
|
||||||
|
int const des = fm.maxDescent();
|
||||||
Point const p = bv_funcs::getPos(cursor_, cursor_.boundary());
|
Point const p = bv_funcs::getPos(cursor_, cursor_.boundary());
|
||||||
if (p.y_ - asc >= 0 && p.y_ + des < height_)
|
if (p.y_ - asc >= 0 && p.y_ + des < height_)
|
||||||
return false;
|
return false;
|
||||||
|
@ -44,7 +44,6 @@
|
|||||||
#include "support/limited_stack.h"
|
#include "support/limited_stack.h"
|
||||||
|
|
||||||
#include "frontends/Application.h"
|
#include "frontends/Application.h"
|
||||||
#include "frontends/font_metrics.h"
|
|
||||||
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
|
@ -11,7 +11,9 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#include "dimension.h"
|
#include "dimension.h"
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
|
|
||||||
|
|
||||||
void Dimension::operator+=(Dimension const & dim)
|
void Dimension::operator+=(Dimension const & dim)
|
||||||
@ -26,7 +28,8 @@ void Dimension::operator+=(Dimension const & dim)
|
|||||||
|
|
||||||
void Dimension::clear(LyXFont const & font)
|
void Dimension::clear(LyXFont const & font)
|
||||||
{
|
{
|
||||||
asc = font_metrics::maxAscent(font);
|
lyx::frontend::FontMetrics const & fm = theApp->fontLoader().metrics(font);
|
||||||
des = font_metrics::maxDescent(font);
|
asc = fm.maxAscent();
|
||||||
|
des = fm.maxDescent();
|
||||||
wid = 0;
|
wid = 0;
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,8 @@ class LyXFont;
|
|||||||
namespace lyx {
|
namespace lyx {
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
|
|
||||||
|
class FontMetrics;
|
||||||
|
|
||||||
/// Hold info about a particular font
|
/// Hold info about a particular font
|
||||||
class FontLoader
|
class FontLoader
|
||||||
{
|
{
|
||||||
@ -31,6 +33,9 @@ public:
|
|||||||
|
|
||||||
/// Is the given font available ?
|
/// Is the given font available ?
|
||||||
virtual bool available(LyXFont const & f) = 0;
|
virtual bool available(LyXFont const & f) = 0;
|
||||||
|
|
||||||
|
/// Get the Font metrics for this LyXFont
|
||||||
|
virtual FontMetrics const & metrics(LyXFont const & f) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace frontend
|
} // namespace frontend
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
// -*- C++ -*-
|
// -*- C++ -*-
|
||||||
/**
|
/**
|
||||||
* \file font_metrics.h
|
* \file FontMetrics.h
|
||||||
* This file is part of LyX, the document processor.
|
* This file is part of LyX, the document processor.
|
||||||
* Licence details can be found in the file COPYING.
|
* Licence details can be found in the file COPYING.
|
||||||
*
|
*
|
||||||
* \author unknown
|
* \author unknown
|
||||||
* \author John Levon
|
* \author John Levon
|
||||||
|
* \author Abdelrazak Younes
|
||||||
*
|
*
|
||||||
* Full author contact details are available in file CREDITS.
|
* Full author contact details are available in file CREDITS.
|
||||||
*/
|
*/
|
||||||
@ -15,11 +16,8 @@
|
|||||||
|
|
||||||
#include "support/docstring.h"
|
#include "support/docstring.h"
|
||||||
|
|
||||||
|
|
||||||
class LyXFont;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A namespace holding helper functions for determining
|
* A class holding helper functions for determining
|
||||||
* the screen dimensions of fonts.
|
* the screen dimensions of fonts.
|
||||||
*
|
*
|
||||||
* The geometry is the standard typographical geometry,
|
* The geometry is the standard typographical geometry,
|
||||||
@ -41,63 +39,79 @@ class LyXFont;
|
|||||||
* --------------+----------+-------<maxDescent
|
* --------------+----------+-------<maxDescent
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
namespace font_metrics {
|
|
||||||
|
namespace lyx {
|
||||||
|
namespace frontend {
|
||||||
|
|
||||||
|
class FontMetrics
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~FontMetrics() {}
|
||||||
|
|
||||||
/// return the maximum ascent of the font
|
/// return the maximum ascent of the font
|
||||||
int maxAscent(LyXFont const & f);
|
virtual int maxAscent() const = 0;
|
||||||
/// return the maximum descent of the font
|
/// return the maximum descent of the font
|
||||||
int maxDescent(LyXFont const & f);
|
virtual int maxDescent() const = 0;
|
||||||
/// return the maximum descent of the font
|
|
||||||
inline int maxHeight(LyXFont const & f) {
|
|
||||||
return maxAscent(f) + maxDescent(f);
|
|
||||||
}
|
|
||||||
/// return the ascent of the char in the font
|
/// return the ascent of the char in the font
|
||||||
int ascent(lyx::char_type c, LyXFont const & f);
|
virtual int ascent(lyx::char_type c) const = 0;
|
||||||
/// return the descent of the char in the font
|
/// return the descent of the char in the font
|
||||||
int descent(lyx::char_type c, LyXFont const & f);
|
virtual int descent(lyx::char_type c) const = 0;
|
||||||
/// return the descent of the char in the font
|
|
||||||
inline int height(lyx::char_type c, LyXFont const & f)
|
|
||||||
{
|
|
||||||
return ascent(c, f) + descent(c, f);
|
|
||||||
}
|
|
||||||
/// return the left bearing of the char in the font
|
/// return the left bearing of the char in the font
|
||||||
int lbearing(lyx::char_type c, LyXFont const & f);
|
virtual int lbearing(lyx::char_type c) const = 0;
|
||||||
/// return the right bearing of the char in the font
|
/// return the right bearing of the char in the font
|
||||||
int rbearing(lyx::char_type c, LyXFont const & f);
|
virtual int rbearing(lyx::char_type c) const = 0;
|
||||||
/// return the inner width of the char in the font
|
|
||||||
inline int center(lyx::char_type c, LyXFont const & f) {
|
|
||||||
return (rbearing(c, f) - lbearing(c, f)) / 2;
|
|
||||||
}
|
|
||||||
/// return the width of the string in the font
|
/// return the width of the string in the font
|
||||||
int width(lyx::char_type const * s, size_t n, LyXFont const & f);
|
virtual int width(lyx::char_type const * s, size_t n) const = 0;
|
||||||
/// return the width of the char in the font
|
|
||||||
inline int width(lyx::char_type c, LyXFont const & f)
|
|
||||||
{
|
|
||||||
lyx::char_type tmp[2] = { c, L'\0'};
|
|
||||||
return width(tmp, 1, f);
|
|
||||||
}
|
|
||||||
/// return the width of the string in the font
|
|
||||||
inline int width(lyx::docstring const & s, LyXFont const & f)
|
|
||||||
{
|
|
||||||
return s.empty() ? 0 : width(s.data(), s.length(), f);
|
|
||||||
}
|
|
||||||
/// FIXME ??
|
/// FIXME ??
|
||||||
int signedWidth(lyx::docstring const & s, LyXFont const & f);
|
virtual int signedWidth(lyx::docstring const & s) const = 0;
|
||||||
/**
|
/**
|
||||||
* fill in width,ascent,descent with the values for the
|
* fill in width,ascent,descent with the values for the
|
||||||
* given string in the font.
|
* given string in the font.
|
||||||
*/
|
*/
|
||||||
void rectText(lyx::docstring const & str, LyXFont const & font,
|
virtual void rectText(lyx::docstring const & str,
|
||||||
int & width,
|
int & width,
|
||||||
int & ascent,
|
int & ascent,
|
||||||
int & descent);
|
int & descent) const = 0;
|
||||||
/**
|
/**
|
||||||
* fill in width,ascent,descent with the values for the
|
* fill in width,ascent,descent with the values for the
|
||||||
* given string in the font for a button.
|
* given string in the font for a button.
|
||||||
*/
|
*/
|
||||||
void buttonText(lyx::docstring const & str, LyXFont const & font,
|
virtual void buttonText(lyx::docstring const & str,
|
||||||
int & width,
|
int & width,
|
||||||
int & ascent,
|
int & ascent,
|
||||||
int & descent);
|
int & descent) const = 0;
|
||||||
|
|
||||||
|
/// return the maximum descent of the font
|
||||||
|
inline int maxHeight() const {
|
||||||
|
return maxAscent() + maxDescent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// return the descent of the char in the font
|
||||||
|
inline int height(lyx::char_type c) const
|
||||||
|
{
|
||||||
|
return ascent(c) + descent(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return the inner width of the char in the font
|
||||||
|
inline int center(lyx::char_type c) const {
|
||||||
|
return (rbearing(c) - lbearing(c)) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return the width of the char in the font
|
||||||
|
inline int width(lyx::char_type c) const
|
||||||
|
{
|
||||||
|
lyx::char_type tmp[2] = { c, L'\0'};
|
||||||
|
return width(tmp, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return the width of the string in the font
|
||||||
|
inline int width(lyx::docstring const & s) const
|
||||||
|
{
|
||||||
|
return s.empty() ? 0 : width(s.data(), s.length());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace frontend
|
||||||
|
} // namespace lyx
|
||||||
|
|
||||||
#endif // FONT_METRICS_H
|
#endif // FONT_METRICS_H
|
@ -22,6 +22,7 @@ libfrontends_la_SOURCES = \
|
|||||||
Dialogs.h \
|
Dialogs.h \
|
||||||
FileDialog.h \
|
FileDialog.h \
|
||||||
FontLoader.h \
|
FontLoader.h \
|
||||||
|
FontMetrics.h \
|
||||||
LyXKeySym.h \
|
LyXKeySym.h \
|
||||||
LyXKeySymFactory.h \
|
LyXKeySymFactory.h \
|
||||||
LyXView.C \
|
LyXView.C \
|
||||||
@ -38,7 +39,6 @@ libfrontends_la_SOURCES = \
|
|||||||
Selection.h \
|
Selection.h \
|
||||||
WorkArea.C \
|
WorkArea.C \
|
||||||
WorkArea.h \
|
WorkArea.h \
|
||||||
font_metrics.h \
|
|
||||||
guiapi.h \
|
guiapi.h \
|
||||||
guiapi.C \
|
guiapi.C \
|
||||||
key_state.h \
|
key_state.h \
|
||||||
|
@ -11,8 +11,11 @@
|
|||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#include "Painter.h"
|
#include "frontends/Painter.h"
|
||||||
#include "font_metrics.h"
|
|
||||||
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
|
|
||||||
#include "LColor.h"
|
#include "LColor.h"
|
||||||
#include "lyxfont.h"
|
#include "lyxfont.h"
|
||||||
@ -59,7 +62,8 @@ void Painter::rectText(int x, int y,
|
|||||||
int ascent;
|
int ascent;
|
||||||
int descent;
|
int descent;
|
||||||
|
|
||||||
font_metrics::rectText(str, font, width, ascent, descent);
|
FontMetrics const & fm = theApp->fontLoader().metrics(font);
|
||||||
|
fm.rectText(str, width, ascent, descent);
|
||||||
|
|
||||||
if (back != LColor::none)
|
if (back != LColor::none)
|
||||||
fillRectangle(x + 1, y - ascent + 1, width - 1,
|
fillRectangle(x + 1, y - ascent + 1, width - 1,
|
||||||
@ -78,7 +82,8 @@ void Painter::buttonText(int x, int y, docstring const & str, LyXFont const & fo
|
|||||||
int ascent;
|
int ascent;
|
||||||
int descent;
|
int descent;
|
||||||
|
|
||||||
font_metrics::buttonText(str, font, width, ascent, descent);
|
FontMetrics const & fm = theApp->fontLoader().metrics(font);
|
||||||
|
fm.buttonText(str, width, ascent, descent);
|
||||||
|
|
||||||
button(x, y - ascent, width, descent + ascent);
|
button(x, y - ascent, width, descent + ascent);
|
||||||
text(x + 4, y, str, font);
|
text(x + 4, y, str, font);
|
||||||
@ -87,8 +92,10 @@ void Painter::buttonText(int x, int y, docstring const & str, LyXFont const & fo
|
|||||||
|
|
||||||
void Painter::underline(LyXFont const & f, int x, int y, int width)
|
void Painter::underline(LyXFont const & f, int x, int y, int width)
|
||||||
{
|
{
|
||||||
int const below = max(font_metrics::maxDescent(f) / 2, 2);
|
FontMetrics const & fm = theApp->fontLoader().metrics(f);
|
||||||
int const height = max((font_metrics::maxDescent(f) / 4) - 1, 1);
|
|
||||||
|
int const below = max(fm.maxDescent() / 2, 2);
|
||||||
|
int const height = max((fm.maxDescent() / 4) - 1, 1);
|
||||||
|
|
||||||
if (height < 2)
|
if (height < 2)
|
||||||
line(x, y + below, x + width, y + below, f.color());
|
line(x, y + below, x + width, y + below, f.color());
|
||||||
|
@ -13,9 +13,12 @@
|
|||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#include "WorkArea.h"
|
#include "frontends/WorkArea.h"
|
||||||
|
|
||||||
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
|
|
||||||
#include "font_metrics.h"
|
|
||||||
#include "funcrequest.h"
|
#include "funcrequest.h"
|
||||||
#include "lyx_gui.h"
|
#include "lyx_gui.h"
|
||||||
#include "lyxfunc.h"
|
#include "lyxfunc.h"
|
||||||
@ -372,8 +375,9 @@ void WorkArea::showCursor()
|
|||||||
shape = BAR_SHAPE;
|
shape = BAR_SHAPE;
|
||||||
|
|
||||||
LyXFont const font = buffer_view_->cursor().getFont();
|
LyXFont const font = buffer_view_->cursor().getFont();
|
||||||
int const asc = font_metrics::maxAscent(font);
|
FontMetrics const & fm = theApp->fontLoader().metrics(font);
|
||||||
int const des = font_metrics::maxDescent(font);
|
int const asc = fm.maxAscent();
|
||||||
|
int const des = fm.maxDescent();
|
||||||
int h = asc + des;
|
int h = asc + des;
|
||||||
int x = 0;
|
int x = 0;
|
||||||
int y = 0;
|
int y = 0;
|
||||||
|
@ -220,9 +220,7 @@ void GuiFontLoader::update()
|
|||||||
|
|
||||||
|
|
||||||
QLFontInfo::QLFontInfo(LyXFont const & f)
|
QLFontInfo::QLFontInfo(LyXFont const & f)
|
||||||
: metrics(font)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
string const pat = symbolFamily(f.family());
|
string const pat = symbolFamily(f.family());
|
||||||
if (!pat.empty()) {
|
if (!pat.empty()) {
|
||||||
bool tmp;
|
bool tmp;
|
||||||
@ -246,9 +244,6 @@ QLFontInfo::QLFontInfo(LyXFont const & f)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
font.setPointSizeF(convert<double>(lyxrc.font_sizes[f.size()])
|
|
||||||
* lyxrc.zoom / 100.0);
|
|
||||||
|
|
||||||
switch (f.series()) {
|
switch (f.series()) {
|
||||||
case LyXFont::MEDIUM_SERIES:
|
case LyXFont::MEDIUM_SERIES:
|
||||||
font.setWeight(QFont::Normal);
|
font.setWeight(QFont::Normal);
|
||||||
@ -274,9 +269,6 @@ QLFontInfo::QLFontInfo(LyXFont const & f)
|
|||||||
<< "' matched by\n" << fromqstr(font.rawName()) << endl;
|
<< "' matched by\n" << fromqstr(font.rawName()) << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
lyxerr[Debug::FONT] << "The font has size: "
|
|
||||||
<< font.pointSizeF() << endl;
|
|
||||||
|
|
||||||
// Is this an exact match?
|
// Is this an exact match?
|
||||||
if (font.exactMatch())
|
if (font.exactMatch())
|
||||||
lyxerr[Debug::FONT] << "This font is an exact match" << endl;
|
lyxerr[Debug::FONT] << "This font is an exact match" << endl;
|
||||||
@ -286,21 +278,27 @@ QLFontInfo::QLFontInfo(LyXFont const & f)
|
|||||||
|
|
||||||
lyxerr[Debug::FONT] << "XFLD: " << fromqstr(font.rawName()) << endl;
|
lyxerr[Debug::FONT] << "XFLD: " << fromqstr(font.rawName()) << endl;
|
||||||
|
|
||||||
metrics = QFontMetrics(font);
|
font.setPointSizeF(convert<double>(lyxrc.font_sizes[f.size()])
|
||||||
|
* lyxrc.zoom / 100.0);
|
||||||
|
|
||||||
|
lyxerr[Debug::FONT] << "The font has size: "
|
||||||
|
<< font.pointSizeF() << endl;
|
||||||
|
|
||||||
|
if (f.realShape() != LyXFont::SMALLCAPS_SHAPE) {
|
||||||
|
metrics.reset(new GuiFontMetrics(font));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// handle small caps ourselves ...
|
||||||
|
LyXFont smallfont = f;
|
||||||
|
smallfont.decSize().decSize().setShape(LyXFont::UP_SHAPE);
|
||||||
|
QFont font2(font);
|
||||||
|
font2.setPointSizeF(convert<double>(lyxrc.font_sizes[smallfont.size()])
|
||||||
|
* lyxrc.zoom / 100.0);
|
||||||
|
|
||||||
|
metrics.reset(new GuiFontMetrics(font, font2));
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_LYX_FONTCACHE
|
|
||||||
int QLFontInfo::width(Uchar val)
|
|
||||||
{
|
|
||||||
QLFontInfo::WidthCache::const_iterator cit = widthcache.find(val);
|
|
||||||
if (cit != widthcache.end())
|
|
||||||
return cit->second;
|
|
||||||
|
|
||||||
int const w = metrics.width(QChar(val));
|
|
||||||
widthcache[val] = w;
|
|
||||||
return w;
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
bool GuiFontLoader::available(LyXFont const & f)
|
bool GuiFontLoader::available(LyXFont const & f)
|
||||||
|
@ -14,18 +14,12 @@
|
|||||||
|
|
||||||
#include "frontends/FontLoader.h"
|
#include "frontends/FontLoader.h"
|
||||||
|
|
||||||
|
#include "GuiFontMetrics.h"
|
||||||
|
|
||||||
#include "encoding.h"
|
#include "encoding.h"
|
||||||
#include "lyxfont.h"
|
#include "lyxfont.h"
|
||||||
|
|
||||||
#include <QFont>
|
#include <QFont>
|
||||||
#include <QFontMetrics>
|
|
||||||
|
|
||||||
// Starting with version 3.1.0, Qt/X11 does its own caching of
|
|
||||||
// character width, so it is not necessary to provide ours.
|
|
||||||
#if defined(Q_WS_MACX) || defined(Q_WS_WIN32)
|
|
||||||
#define USE_LYX_FONTCACHE
|
|
||||||
#include <map>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace lyx {
|
namespace lyx {
|
||||||
namespace frontend {
|
namespace frontend {
|
||||||
@ -41,21 +35,7 @@ public:
|
|||||||
/// The font instance
|
/// The font instance
|
||||||
QFont font;
|
QFont font;
|
||||||
/// Metrics on the font
|
/// Metrics on the font
|
||||||
QFontMetrics metrics;
|
boost::scoped_ptr<GuiFontMetrics> metrics;
|
||||||
|
|
||||||
#ifndef USE_LYX_FONTCACHE
|
|
||||||
/// Return pixel width for the given unicode char
|
|
||||||
int width(Uchar val) { return metrics.width(QChar(val)); }
|
|
||||||
|
|
||||||
#else
|
|
||||||
/// Return pixel width for the given unicode char
|
|
||||||
int width(Uchar val);
|
|
||||||
|
|
||||||
private:
|
|
||||||
typedef std::map<Uchar, int> WidthCache;
|
|
||||||
/// Cache of char widths
|
|
||||||
WidthCache widthcache;
|
|
||||||
#endif // USE_LYX_FONTCACHE
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -69,21 +49,17 @@ public:
|
|||||||
/// Destructor
|
/// Destructor
|
||||||
virtual ~GuiFontLoader();
|
virtual ~GuiFontLoader();
|
||||||
|
|
||||||
/// Update fonts after zoom, dpi, font names, or norm change
|
|
||||||
virtual void update();
|
virtual void update();
|
||||||
|
|
||||||
/// Do we have anything matching?
|
|
||||||
virtual bool available(LyXFont const & f);
|
virtual bool available(LyXFont const & f);
|
||||||
|
inline virtual FontMetrics const & metrics(LyXFont const & f) {
|
||||||
|
return *fontinfo(f).metrics.get();
|
||||||
|
}
|
||||||
|
|
||||||
/// Get the QFont for this LyXFont
|
/// Get the QFont for this LyXFont
|
||||||
QFont const & get(LyXFont const & f) {
|
QFont const & get(LyXFont const & f) {
|
||||||
return fontinfo(f).font;
|
return fontinfo(f).font;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the QFont metrics for this LyXFont
|
|
||||||
QFontMetrics const & metrics(LyXFont const & f) {
|
|
||||||
return fontinfo(f).metrics;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get font info (font + metrics) for the given LyX font.
|
/// Get font info (font + metrics) for the given LyX font.
|
||||||
QLFontInfo & fontinfo(LyXFont const & f) {
|
QLFontInfo & fontinfo(LyXFont const & f) {
|
||||||
|
200
src/frontends/qt4/GuiFontMetrics.C
Normal file
200
src/frontends/qt4/GuiFontMetrics.C
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
/**
|
||||||
|
* \file GuiFontMetrics.C
|
||||||
|
* This file is part of LyX, the document processor.
|
||||||
|
* Licence details can be found in the file COPYING.
|
||||||
|
*
|
||||||
|
* \author unknown
|
||||||
|
* \author John Levon
|
||||||
|
*
|
||||||
|
* Full author contact details are available in file CREDITS.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "GuiFontMetrics.h"
|
||||||
|
|
||||||
|
#include "qt_helpers.h"
|
||||||
|
|
||||||
|
#include "language.h"
|
||||||
|
|
||||||
|
#include "frontends/lyx_gui.h"
|
||||||
|
|
||||||
|
#include "support/unicode.h"
|
||||||
|
|
||||||
|
using lyx::char_type;
|
||||||
|
using lyx::docstring;
|
||||||
|
|
||||||
|
using std::string;
|
||||||
|
|
||||||
|
|
||||||
|
namespace lyx {
|
||||||
|
namespace frontend {
|
||||||
|
|
||||||
|
|
||||||
|
GuiFontMetrics::GuiFontMetrics(QFont const & font)
|
||||||
|
: metrics_(font), smallcaps_metrics_(font), smallcaps_shape_(false)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GuiFontMetrics::GuiFontMetrics(QFont const & font, QFont const & smallcaps_font)
|
||||||
|
: metrics_(font), smallcaps_metrics_(smallcaps_font), smallcaps_shape_(true)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int GuiFontMetrics::maxAscent() const
|
||||||
|
{
|
||||||
|
if (!lyx_gui::use_gui)
|
||||||
|
return 1;
|
||||||
|
return metrics_.ascent();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int GuiFontMetrics::maxDescent() const
|
||||||
|
{
|
||||||
|
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 metrics_.descent() + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int GuiFontMetrics::ascent(char_type c) const
|
||||||
|
{
|
||||||
|
if (!lyx_gui::use_gui)
|
||||||
|
return 1;
|
||||||
|
QRect const & r = metrics_.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)
|
||||||
|
#if defined(Q_WS_WIN) && (QT_VERSION == 0x030201)
|
||||||
|
return -r.top() - r.height();
|
||||||
|
#else
|
||||||
|
return -r.top();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int GuiFontMetrics::descent(char_type c) const
|
||||||
|
{
|
||||||
|
if (!lyx_gui::use_gui)
|
||||||
|
return 1;
|
||||||
|
QRect const & r = metrics_.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)
|
||||||
|
#if defined(Q_WS_WIN) && (QT_VERSION == 0x030201)
|
||||||
|
return r.bottom() + r.height() + 1;
|
||||||
|
#else
|
||||||
|
return r.bottom() + 1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int GuiFontMetrics::lbearing(char_type c) const
|
||||||
|
{
|
||||||
|
if (!lyx_gui::use_gui)
|
||||||
|
return 1;
|
||||||
|
return metrics_.leftBearing(ucs4_to_qchar(c));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int GuiFontMetrics::rbearing(char_type c) const
|
||||||
|
{
|
||||||
|
if (!lyx_gui::use_gui)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
// Qt rbearing is from the right edge of the char's width().
|
||||||
|
QChar sc = ucs4_to_qchar(c);
|
||||||
|
return metrics_.width(sc) - metrics_.rightBearing(sc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int GuiFontMetrics::smallcapsWidth(QString const & s) const
|
||||||
|
{
|
||||||
|
if (!lyx_gui::use_gui)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
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 += smallcaps_metrics_.width(uc);
|
||||||
|
else
|
||||||
|
w += metrics_.width(c);
|
||||||
|
}
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int GuiFontMetrics::width(char_type const * s, size_t ls) const
|
||||||
|
{
|
||||||
|
if (!lyx_gui::use_gui)
|
||||||
|
return ls;
|
||||||
|
|
||||||
|
QString ucs2 = ucs4_to_qstring(s, ls);
|
||||||
|
|
||||||
|
if (smallcaps_shape_)
|
||||||
|
return smallcapsWidth(ucs2);
|
||||||
|
|
||||||
|
if (ls == 1)
|
||||||
|
return width(ucs2[0].unicode());
|
||||||
|
|
||||||
|
int w = 0;
|
||||||
|
for (unsigned int i = 0; i < ls; ++i)
|
||||||
|
w += width(ucs2[i].unicode());
|
||||||
|
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int GuiFontMetrics::signedWidth(docstring const & s) const
|
||||||
|
{
|
||||||
|
if (s[0] == '-')
|
||||||
|
return -FontMetrics::width(s.substr(1, s.length() - 1));
|
||||||
|
else
|
||||||
|
return FontMetrics::width(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GuiFontMetrics::rectText(docstring const & str,
|
||||||
|
int & w, int & ascent, int & descent) const
|
||||||
|
{
|
||||||
|
static int const d = 2;
|
||||||
|
w = FontMetrics::width(str) + d * 2 + 2;
|
||||||
|
ascent = metrics_.ascent() + d;
|
||||||
|
descent = metrics_.descent() + d;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void GuiFontMetrics::buttonText(docstring const & str,
|
||||||
|
int & w, int & ascent, int & descent) const
|
||||||
|
{
|
||||||
|
QFontMetrics const & m = metrics_;
|
||||||
|
static int const d = 3;
|
||||||
|
w = FontMetrics::width(str) + d * 2 + 2;
|
||||||
|
ascent = metrics_.ascent() + d;
|
||||||
|
descent = metrics_.descent() + d;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef USE_LYX_FONTCACHE
|
||||||
|
int GuiFontMetrics::width(unsigned short val) const
|
||||||
|
{
|
||||||
|
GuiFontMetrics::WidthCache::const_iterator cit = widthcache.find(val);
|
||||||
|
if (cit != widthcache.end())
|
||||||
|
return cit->second;
|
||||||
|
|
||||||
|
int const w = metrics_.width(QChar(val));
|
||||||
|
widthcache[val] = w;
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
83
src/frontends/qt4/GuiFontMetrics.h
Normal file
83
src/frontends/qt4/GuiFontMetrics.h
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
/**
|
||||||
|
* \file FontMetrics.h
|
||||||
|
* This file is part of LyX, the document processor.
|
||||||
|
* Licence details can be found in the file COPYING.
|
||||||
|
*
|
||||||
|
* \author Abdelrazak Younes
|
||||||
|
*
|
||||||
|
* Full author contact details are available in file CREDITS.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QT4_FONT_METRICS_H
|
||||||
|
#define QT4_FONT_METRICS_H
|
||||||
|
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
|
|
||||||
|
#include "support/docstring.h"
|
||||||
|
|
||||||
|
#include <QFontMetrics>
|
||||||
|
|
||||||
|
// Starting with version 3.1.0, Qt/X11 does its own caching of
|
||||||
|
// character width, so it is not necessary to provide ours.
|
||||||
|
#if defined(Q_WS_MACX) || defined(Q_WS_WIN32)
|
||||||
|
#define USE_LYX_FONTCACHE
|
||||||
|
#include <map>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace lyx {
|
||||||
|
namespace frontend {
|
||||||
|
|
||||||
|
class GuiFontMetrics: public FontMetrics
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
GuiFontMetrics(QFont const & font);
|
||||||
|
GuiFontMetrics(QFont const & font, QFont const & smallcaps_font);
|
||||||
|
|
||||||
|
virtual ~GuiFontMetrics() {}
|
||||||
|
|
||||||
|
virtual int maxAscent() const;
|
||||||
|
virtual int maxDescent() const;
|
||||||
|
virtual int ascent(lyx::char_type c) const;
|
||||||
|
int descent(lyx::char_type c) const;
|
||||||
|
virtual int lbearing(lyx::char_type c) const;
|
||||||
|
virtual int rbearing(lyx::char_type c) const;
|
||||||
|
virtual int width(lyx::char_type const * s, size_t n) const;
|
||||||
|
virtual int signedWidth(lyx::docstring const & s) const;
|
||||||
|
virtual void rectText(lyx::docstring const & str,
|
||||||
|
int & width,
|
||||||
|
int & ascent,
|
||||||
|
int & descent) const;
|
||||||
|
virtual void buttonText(lyx::docstring const & str,
|
||||||
|
int & width,
|
||||||
|
int & ascent,
|
||||||
|
int & descent) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int smallcapsWidth(QString const & s) const;
|
||||||
|
|
||||||
|
/// Metrics on the font
|
||||||
|
QFontMetrics metrics_;
|
||||||
|
QFontMetrics smallcaps_metrics_;
|
||||||
|
|
||||||
|
bool smallcaps_shape_;
|
||||||
|
|
||||||
|
#ifndef USE_LYX_FONTCACHE
|
||||||
|
/// Return pixel width for the given unicode char
|
||||||
|
int width(unsigned short val) const { return metrics_.width(QChar(val)); }
|
||||||
|
|
||||||
|
#else
|
||||||
|
/// Return pixel width for the given unicode char
|
||||||
|
int width(unsigned short val) const;
|
||||||
|
|
||||||
|
typedef std::map<unsigned short, int> WidthCache;
|
||||||
|
/// Cache of char widths
|
||||||
|
mutable WidthCache widthcache;
|
||||||
|
#endif // USE_LYX_FONTCACHE
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace frontend
|
||||||
|
} // namespace lyx
|
||||||
|
|
||||||
|
#endif // QT4_FONT_METRICS_H
|
@ -37,6 +37,7 @@ libqt4_la_SOURCES = \
|
|||||||
GuiApplication.C GuiApplication.h \
|
GuiApplication.C GuiApplication.h \
|
||||||
GuiClipboard.h GuiClipboard.C \
|
GuiClipboard.h GuiClipboard.C \
|
||||||
GuiFontLoader.h GuiFontLoader.C \
|
GuiFontLoader.h GuiFontLoader.C \
|
||||||
|
GuiFontMetrics.h GuiFontMetrics.C \
|
||||||
GuiSelection.h GuiSelection.C \
|
GuiSelection.h GuiSelection.C \
|
||||||
GuiImplementation.h GuiImplementation.C \
|
GuiImplementation.h GuiImplementation.C \
|
||||||
LyXKeySymFactory.C \
|
LyXKeySymFactory.C \
|
||||||
@ -86,7 +87,6 @@ libqt4_la_SOURCES = \
|
|||||||
lyx_gui.C \
|
lyx_gui.C \
|
||||||
panelstack.h panelstack.C \
|
panelstack.h panelstack.C \
|
||||||
qfontexample.h qfontexample.C \
|
qfontexample.h qfontexample.C \
|
||||||
qfont_metrics.C \
|
|
||||||
qlkey.h \
|
qlkey.h \
|
||||||
qt_helpers.h qt_helpers.C \
|
qt_helpers.h qt_helpers.C \
|
||||||
qtTimeout.C qtTimeout.h \
|
qtTimeout.C qtTimeout.h \
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#include "language.h"
|
#include "language.h"
|
||||||
#include "LColor.h"
|
#include "LColor.h"
|
||||||
|
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/FontMetrics.h"
|
||||||
|
|
||||||
#include "support/unicode.h"
|
#include "support/unicode.h"
|
||||||
|
|
||||||
@ -196,7 +196,7 @@ void QLPainter::text(int x, int y, char_type c, LyXFont const & f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void QLPainter::smallCapsText(int x, int y,
|
int QLPainter::smallCapsText(int x, int y,
|
||||||
QString const & s, LyXFont const & f)
|
QString const & s, LyXFont const & f)
|
||||||
{
|
{
|
||||||
LyXFont smallfont(f);
|
LyXFont smallfont(f);
|
||||||
@ -204,24 +204,21 @@ void QLPainter::smallCapsText(int x, int y,
|
|||||||
|
|
||||||
QFont const & qfont = guiApp->guiFontLoader().get(f);
|
QFont const & qfont = guiApp->guiFontLoader().get(f);
|
||||||
QFont const & qsmallfont = guiApp->guiFontLoader().get(smallfont);
|
QFont const & qsmallfont = guiApp->guiFontLoader().get(smallfont);
|
||||||
QFontMetrics const & qfontm = QFontMetrics(qfont);
|
|
||||||
QFontMetrics const & qsmallfontm = QFontMetrics(qsmallfont);
|
|
||||||
|
|
||||||
setQPainterPen(f.realColor());
|
setQPainterPen(f.realColor());
|
||||||
int tmpx = x;
|
int textwidth = 0;
|
||||||
size_t ls = s.length();
|
size_t ls = s.length();
|
||||||
for (unsigned int i = 0; i < ls; ++i) {
|
for (unsigned int i = 0; i < ls; ++i) {
|
||||||
QChar const c = s[i].toUpper();
|
QChar const c = s[i].toUpper();
|
||||||
if (c != s.at(i)) {
|
if (c != s.at(i)) {
|
||||||
qp_->setFont(qsmallfont);
|
qp_->setFont(qsmallfont);
|
||||||
qp_->drawText(tmpx, y, c);
|
|
||||||
tmpx += qsmallfontm.width(c);
|
|
||||||
} else {
|
} else {
|
||||||
qp_->setFont(qfont);
|
qp_->setFont(qfont);
|
||||||
qp_->drawText(tmpx, y, c);
|
|
||||||
tmpx += qfontm.width(c);
|
|
||||||
}
|
}
|
||||||
|
qp_->drawText(x + textwidth, y, c);
|
||||||
|
textwidth += qp_->fontMetrics().width(c);
|
||||||
}
|
}
|
||||||
|
return textwidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -250,18 +247,23 @@ void QLPainter::text(int x, int y, char_type const * s, size_t ls,
|
|||||||
str = ' ' + str;
|
str = ' ' + str;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
QLFontInfo & fi = guiApp->guiFontLoader().fontinfo(f);
|
||||||
|
|
||||||
|
int textwidth;
|
||||||
|
|
||||||
if (f.realShape() != LyXFont::SMALLCAPS_SHAPE) {
|
if (f.realShape() != LyXFont::SMALLCAPS_SHAPE) {
|
||||||
setQPainterPen(f.realColor());
|
setQPainterPen(f.realColor());
|
||||||
qp_->setFont(guiApp->guiFontLoader().get(f));
|
qp_->setFont(fi.font);
|
||||||
// We need to draw the text as LTR as we use our own bidi code.
|
// We need to draw the text as LTR as we use our own bidi code.
|
||||||
qp_->setLayoutDirection(Qt::LeftToRight);
|
qp_->setLayoutDirection(Qt::LeftToRight);
|
||||||
qp_->drawText(x, y, str);
|
qp_->drawText(x, y, str);
|
||||||
|
textwidth = qp_->fontMetrics().width(str);
|
||||||
} else {
|
} else {
|
||||||
smallCapsText(x, y, str, f);
|
textwidth = smallCapsText(x, y, str, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (f.underbar() == LyXFont::ON) {
|
if (f.underbar() == LyXFont::ON) {
|
||||||
underline(f, x, y, font_metrics::width(s, ls, f));
|
underline(f, x, y, textwidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -125,7 +125,10 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
/// draw small caps text
|
/// draw small caps text
|
||||||
void smallCapsText(int x, int y,
|
/**
|
||||||
|
\return width of the drawn text.
|
||||||
|
*/
|
||||||
|
int smallCapsText(int x, int y,
|
||||||
QString const & str, LyXFont const & f);
|
QString const & str, LyXFont const & f);
|
||||||
|
|
||||||
/// set pen parameters
|
/// set pen parameters
|
||||||
|
@ -1,186 +0,0 @@
|
|||||||
/**
|
|
||||||
* \file qfont_metrics.C
|
|
||||||
* This file is part of LyX, the document processor.
|
|
||||||
* Licence details can be found in the file COPYING.
|
|
||||||
*
|
|
||||||
* \author unknown
|
|
||||||
* \author John Levon
|
|
||||||
*
|
|
||||||
* Full author contact details are available in file CREDITS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include "frontends/font_metrics.h"
|
|
||||||
#include "frontends/lyx_gui.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 {
|
|
||||||
|
|
||||||
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 font_metrics::maxAscent(LyXFont const & f)
|
|
||||||
{
|
|
||||||
if (!lyx_gui::use_gui)
|
|
||||||
return 1;
|
|
||||||
return guiApp->guiFontLoader().metrics(f).ascent();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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 guiApp->guiFontLoader().metrics(f).descent() + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int font_metrics::ascent(char_type c, LyXFont const & f)
|
|
||||||
{
|
|
||||||
if (!lyx_gui::use_gui)
|
|
||||||
return 1;
|
|
||||||
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)
|
|
||||||
#if defined(Q_WS_WIN) && (QT_VERSION == 0x030201)
|
|
||||||
return -r.top() - r.height();
|
|
||||||
#else
|
|
||||||
return -r.top();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int font_metrics::descent(char_type c, LyXFont const & f)
|
|
||||||
{
|
|
||||||
if (!lyx_gui::use_gui)
|
|
||||||
return 1;
|
|
||||||
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)
|
|
||||||
#if defined(Q_WS_WIN) && (QT_VERSION == 0x030201)
|
|
||||||
return r.bottom() + r.height() + 1;
|
|
||||||
#else
|
|
||||||
return r.bottom() + 1;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int font_metrics::lbearing(char_type c, LyXFont const & f)
|
|
||||||
{
|
|
||||||
if (!lyx_gui::use_gui)
|
|
||||||
return 1;
|
|
||||||
return guiApp->guiFontLoader().metrics(f).leftBearing(ucs4_to_qchar(c));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int font_metrics::rbearing(char_type c, LyXFont const & f)
|
|
||||||
{
|
|
||||||
if (!lyx_gui::use_gui)
|
|
||||||
return 1;
|
|
||||||
QFontMetrics const & m = guiApp->guiFontLoader().metrics(f);
|
|
||||||
|
|
||||||
// Qt rbearing is from the right edge of the char's width().
|
|
||||||
QChar sc = ucs4_to_qchar(c);
|
|
||||||
return m.width(sc) - m.rightBearing(sc);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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(ucs2, f);
|
|
||||||
|
|
||||||
lyx::frontend::QLFontInfo & fi = guiApp->guiFontLoader().fontinfo(f);
|
|
||||||
|
|
||||||
if (ls == 1)
|
|
||||||
return fi.width(ucs2[0].unicode());
|
|
||||||
|
|
||||||
int w = 0;
|
|
||||||
for (unsigned int i = 0; i < ls; ++i)
|
|
||||||
w += fi.width(ucs2[i].unicode());
|
|
||||||
|
|
||||||
return w;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int font_metrics::signedWidth(docstring const & s, LyXFont const & f)
|
|
||||||
{
|
|
||||||
if (s[0] == '-')
|
|
||||||
return -width(s.substr(1, s.length() - 1), f);
|
|
||||||
else
|
|
||||||
return width(s, f);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void font_metrics::rectText(docstring const & str, LyXFont const & f,
|
|
||||||
int & w, int & ascent, int & descent)
|
|
||||||
{
|
|
||||||
QFontMetrics const & m = guiApp->guiFontLoader().metrics(f);
|
|
||||||
static int const d = 2;
|
|
||||||
w = width(str, f) + d * 2 + 2;
|
|
||||||
ascent = m.ascent() + d;
|
|
||||||
descent = m.descent() + d;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void font_metrics::buttonText(docstring const & str, LyXFont const & f,
|
|
||||||
int & w, int & ascent, int & descent)
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
@ -123,6 +123,7 @@ QString const toqstr(string const & str)
|
|||||||
QString const ucs4_to_qstring(char_type const * str, size_t ls)
|
QString const ucs4_to_qstring(char_type const * str, size_t ls)
|
||||||
{
|
{
|
||||||
QString s;
|
QString s;
|
||||||
|
s.reserve(ls);
|
||||||
|
|
||||||
for (size_t i = 0; i < ls; ++i)
|
for (size_t i = 0; i < ls; ++i)
|
||||||
s.append(ucs4_to_qchar(str[i]));
|
s.append(ucs4_to_qchar(str[i]));
|
||||||
|
@ -20,7 +20,9 @@
|
|||||||
#include "paragraph.h"
|
#include "paragraph.h"
|
||||||
#include "ParagraphList.h"
|
#include "ParagraphList.h"
|
||||||
|
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
|
|
||||||
#include "support/lstrings.h"
|
#include "support/lstrings.h"
|
||||||
#include "support/std_ostream.h"
|
#include "support/std_ostream.h"
|
||||||
@ -136,7 +138,10 @@ string const bibitemWidest(Buffer const & buffer)
|
|||||||
// Does look like a hack? It is! (but will change at 0.13)
|
// Does look like a hack? It is! (but will change at 0.13)
|
||||||
|
|
||||||
InsetBibitem const * bitem = 0;
|
InsetBibitem const * bitem = 0;
|
||||||
|
// FIXME font is used unitialized, is that correct?
|
||||||
LyXFont font;
|
LyXFont font;
|
||||||
|
lyx::frontend::FontMetrics const & fm =
|
||||||
|
theApp->fontLoader().metrics(font);
|
||||||
|
|
||||||
ParagraphList::const_iterator it = buffer.paragraphs().begin();
|
ParagraphList::const_iterator it = buffer.paragraphs().begin();
|
||||||
ParagraphList::const_iterator end = buffer.paragraphs().end();
|
ParagraphList::const_iterator end = buffer.paragraphs().end();
|
||||||
@ -147,7 +152,7 @@ string const bibitemWidest(Buffer const & buffer)
|
|||||||
docstring const dlab(label.begin(), label.end());
|
docstring const dlab(label.begin(), label.end());
|
||||||
|
|
||||||
int const wx =
|
int const wx =
|
||||||
font_metrics::width(dlab, font);
|
fm.width(dlab);
|
||||||
if (wx > w) {
|
if (wx > w) {
|
||||||
w = wx;
|
w = wx;
|
||||||
bitem = it->bibitem();
|
bitem = it->bibitem();
|
||||||
|
@ -26,7 +26,9 @@
|
|||||||
#include "metricsinfo.h"
|
#include "metricsinfo.h"
|
||||||
#include "paragraph.h"
|
#include "paragraph.h"
|
||||||
|
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
|
|
||||||
#include "support/lstrings.h"
|
#include "support/lstrings.h"
|
||||||
@ -125,7 +127,7 @@ void InsetCaption::metrics(MetricsInfo & mi, Dimension & dim) const
|
|||||||
LCursor cur = mi.base.bv->cursor();
|
LCursor cur = mi.base.bv->cursor();
|
||||||
setLabel(cur);
|
setLabel(cur);
|
||||||
docstring dlab(label.begin(), label.end());
|
docstring dlab(label.begin(), label.end());
|
||||||
labelwidth_ = font_metrics::width(dlab, mi.base.font);
|
labelwidth_ = theApp->fontLoader().metrics(mi.base.font).width(dlab);
|
||||||
dim.wid = labelwidth_;
|
dim.wid = labelwidth_;
|
||||||
Dimension textdim;
|
Dimension textdim;
|
||||||
InsetText::metrics(mi, textdim);
|
InsetText::metrics(mi, textdim);
|
||||||
@ -153,7 +155,9 @@ void InsetCaption::draw(PainterInfo & pi, int x, int y) const
|
|||||||
LCursor cur = pi.base.bv->cursor();
|
LCursor cur = pi.base.bv->cursor();
|
||||||
setLabel(cur);
|
setLabel(cur);
|
||||||
docstring dlab(label.begin(), label.end());
|
docstring dlab(label.begin(), label.end());
|
||||||
labelwidth_ = font_metrics::width(dlab, pi.base.font);
|
// FXIME: instead of using the fontLoader metrics, we should make
|
||||||
|
// painter::text() returns the drawn text witdh.
|
||||||
|
labelwidth_ = theApp->fontLoader().metrics(pi.base.font).width(dlab);
|
||||||
pi.pain.text(x, y, dlab, pi.base.font);
|
pi.pain.text(x, y, dlab, pi.base.font);
|
||||||
InsetText::draw(pi, x + labelwidth_, y);
|
InsetText::draw(pi, x + labelwidth_, y);
|
||||||
setPosCache(pi, x, y);
|
setPosCache(pi, x, y);
|
||||||
|
@ -31,7 +31,9 @@
|
|||||||
#include "paragraph_funcs.h"
|
#include "paragraph_funcs.h"
|
||||||
#include "sgml.h"
|
#include "sgml.h"
|
||||||
|
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@ -157,7 +159,7 @@ void InsetCharStyle::metrics(MetricsInfo & mi, Dimension & dim) const
|
|||||||
// FIXME UNICODE
|
// FIXME UNICODE
|
||||||
s = lyx::to_utf8(_("Undef: ")) + s;
|
s = lyx::to_utf8(_("Undef: ")) + s;
|
||||||
docstring ds(s.begin(), s.end());
|
docstring ds(s.begin(), s.end());
|
||||||
font_metrics::rectText(ds, font, w, a, d);
|
theApp->fontLoader().metrics(font).rectText(ds, w, a, d);
|
||||||
dim.wid = max(dim.wid, w);
|
dim.wid = max(dim.wid, w);
|
||||||
}
|
}
|
||||||
dim.asc += TEXT_TO_INSET_OFFSET;
|
dim.asc += TEXT_TO_INSET_OFFSET;
|
||||||
@ -205,7 +207,7 @@ void InsetCharStyle::draw(PainterInfo & pi, int x, int y) const
|
|||||||
// FIXME UNICODE
|
// FIXME UNICODE
|
||||||
s = lyx::to_utf8(_("Undef: ")) + s;
|
s = lyx::to_utf8(_("Undef: ")) + s;
|
||||||
docstring ds(s.begin(), s.end());
|
docstring ds(s.begin(), s.end());
|
||||||
font_metrics::rectText(ds, font, w, a, d);
|
theApp->fontLoader().metrics(font).rectText(ds, w, a, d);
|
||||||
pi.pain.rectText(x + (dim_.wid - w) / 2, y + desc + a,
|
pi.pain.rectText(x + (dim_.wid - w) / 2, y + desc + a,
|
||||||
ds, font, LColor::none, LColor::none);
|
ds, font, LColor::none, LColor::none);
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,9 @@
|
|||||||
#include "metricsinfo.h"
|
#include "metricsinfo.h"
|
||||||
#include "paragraph.h"
|
#include "paragraph.h"
|
||||||
|
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
|
|
||||||
using lyx::docstring;
|
using lyx::docstring;
|
||||||
@ -122,7 +124,8 @@ Dimension InsetCollapsable::dimensionCollapsed() const
|
|||||||
{
|
{
|
||||||
Dimension dim;
|
Dimension dim;
|
||||||
docstring dlab(label.begin(), label.end());
|
docstring dlab(label.begin(), label.end());
|
||||||
font_metrics::buttonText(dlab, labelfont_, dim.wid, dim.asc, dim.des);
|
theApp->fontLoader().metrics(labelfont_).buttonText(
|
||||||
|
dlab, dim.wid, dim.asc, dim.des);
|
||||||
return dim;
|
return dim;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,9 @@
|
|||||||
#include "lyxrc.h"
|
#include "lyxrc.h"
|
||||||
#include "metricsinfo.h"
|
#include "metricsinfo.h"
|
||||||
|
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
|
|
||||||
#include "support/lstrings.h"
|
#include "support/lstrings.h"
|
||||||
@ -244,48 +246,39 @@ void InsetLatexAccent::checkContents()
|
|||||||
void InsetLatexAccent::metrics(MetricsInfo & mi, Dimension & dim) const
|
void InsetLatexAccent::metrics(MetricsInfo & mi, Dimension & dim) const
|
||||||
{
|
{
|
||||||
LyXFont & font = mi.base.font;
|
LyXFont & font = mi.base.font;
|
||||||
|
lyx::frontend::FontMetrics const & fm =
|
||||||
|
theApp->fontLoader().metrics(font);
|
||||||
|
|
||||||
// This function is a bit too simplistic and is just a
|
// This function is a bit too simplistic and is just a
|
||||||
// "try to make a fit for all accents" approach, to
|
// "try to make a fit for all accents" approach, to
|
||||||
// make it better we need to know what kind of accent is
|
// make it better we need to know what kind of accent is
|
||||||
// used and add to max based on that.
|
// used and add to max based on that.
|
||||||
if (candisp) {
|
if (candisp) {
|
||||||
if (ic == ' ')
|
if (ic == ' ')
|
||||||
dim.asc = font_metrics::ascent('a', font);
|
dim.asc = fm.ascent('a');
|
||||||
else
|
else
|
||||||
dim.asc = font_metrics::ascent(ic, font);
|
dim.asc = fm.ascent(ic);
|
||||||
if (plusasc)
|
if (plusasc)
|
||||||
dim.asc += (font_metrics::maxAscent(font) + 3) / 3;
|
dim.asc += (fm.maxAscent() + 3) / 3;
|
||||||
|
|
||||||
if (ic == ' ')
|
if (ic == ' ')
|
||||||
dim.des = font_metrics::descent('a', font);
|
dim.des = fm.descent('a');
|
||||||
else
|
else
|
||||||
dim.des = font_metrics::descent(ic, font);
|
dim.des = fm.descent(ic);
|
||||||
if (plusdesc)
|
if (plusdesc)
|
||||||
dim.des += 3;
|
dim.des += 3;
|
||||||
|
|
||||||
dim.wid = font_metrics::width(ic, font);
|
dim.wid = fm.width(ic);
|
||||||
} else {
|
} else {
|
||||||
dim.asc = font_metrics::maxAscent(font) + 4;
|
dim.asc = fm.maxAscent() + 4;
|
||||||
dim.des = font_metrics::maxDescent(font) + 4;
|
dim.des = fm.maxDescent() + 4;
|
||||||
docstring dcon(contents.begin(), contents.end());
|
docstring dcon(contents.begin(), contents.end());
|
||||||
dim.wid = font_metrics::width(dcon, font) + 4;
|
dim.wid = fm.width(dcon) + 4;
|
||||||
}
|
}
|
||||||
dim_ = dim;
|
dim_ = dim;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int InsetLatexAccent::lbearing(LyXFont const & font) const
|
|
||||||
{
|
|
||||||
return font_metrics::lbearing(ic, font);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int InsetLatexAccent::rbearing(LyXFont const & font) const
|
|
||||||
{
|
|
||||||
return font_metrics::rbearing(ic, font);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool InsetLatexAccent::displayISO8859_9(PainterInfo & pi, int x, int y) const
|
bool InsetLatexAccent::displayISO8859_9(PainterInfo & pi, int x, int y) const
|
||||||
{
|
{
|
||||||
unsigned char tmpic = ic;
|
unsigned char tmpic = ic;
|
||||||
@ -338,10 +331,13 @@ void InsetLatexAccent::drawAccent(PainterInfo const & pi, int x, int y,
|
|||||||
char_type accent) const
|
char_type accent) const
|
||||||
{
|
{
|
||||||
LyXFont const & font = pi.base.font;
|
LyXFont const & font = pi.base.font;
|
||||||
x -= font_metrics::center(accent, font);
|
lyx::frontend::FontMetrics const & fm =
|
||||||
y -= font_metrics::ascent(ic, font);
|
theApp->fontLoader().metrics(font);
|
||||||
y -= font_metrics::descent(accent, font);
|
|
||||||
y -= font_metrics::height(accent, font) / 2;
|
x -= fm.center(accent);
|
||||||
|
y -= fm.ascent(ic);
|
||||||
|
y -= fm.descent(accent);
|
||||||
|
y -= fm.height(accent) / 2;
|
||||||
pi.pain.text(x, y, accent, font);
|
pi.pain.text(x, y, accent, font);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -360,13 +356,16 @@ void InsetLatexAccent::draw(PainterInfo & pi, int x, int baseline) const
|
|||||||
if (lyxrc.font_norm_type == LyXRC::ISO_10646_1)
|
if (lyxrc.font_norm_type == LyXRC::ISO_10646_1)
|
||||||
font.setLanguage(english_language);
|
font.setLanguage(english_language);
|
||||||
|
|
||||||
|
lyx::frontend::FontMetrics const & fm =
|
||||||
|
theApp->fontLoader().metrics(font);
|
||||||
|
|
||||||
if (candisp) {
|
if (candisp) {
|
||||||
int x2 = int(x + (rbearing(font) - lbearing(font)) / 2);
|
int x2 = int(x + (fm.rbearing(ic) - fm.lbearing(ic)) / 2);
|
||||||
int hg;
|
int hg;
|
||||||
int y;
|
int y;
|
||||||
if (plusasc) {
|
if (plusasc) {
|
||||||
// mark at the top
|
// mark at the top
|
||||||
hg = font_metrics::maxDescent(font);
|
hg = fm.maxDescent();
|
||||||
y = baseline - dim_.asc;
|
y = baseline - dim_.asc;
|
||||||
if (font.shape() == LyXFont::ITALIC_SHAPE)
|
if (font.shape() == LyXFont::ITALIC_SHAPE)
|
||||||
x2 += int(0.8 * hg); // italic
|
x2 += int(0.8 * hg); // italic
|
||||||
@ -383,15 +382,15 @@ void InsetLatexAccent::draw(PainterInfo & pi, int x, int baseline) const
|
|||||||
pi.pain.text(x, baseline, ic, font);
|
pi.pain.text(x, baseline, ic, font);
|
||||||
|
|
||||||
if (remdot) {
|
if (remdot) {
|
||||||
int tmpvar = baseline - font_metrics::ascent('i', font);
|
int tmpvar = baseline - fm.ascent('i');
|
||||||
int tmpx = 0;
|
int tmpx = 0;
|
||||||
if (font.shape() == LyXFont::ITALIC_SHAPE)
|
if (font.shape() == LyXFont::ITALIC_SHAPE)
|
||||||
tmpx += int(0.8 * hg); // italic
|
tmpx += int(0.8 * hg); // italic
|
||||||
lyxerr[Debug::KEY] << "Removing dot." << endl;
|
lyxerr[Debug::KEY] << "Removing dot." << endl;
|
||||||
// remove the dot first
|
// remove the dot first
|
||||||
pi.pain.fillRectangle(x + tmpx, tmpvar, dim_.wid,
|
pi.pain.fillRectangle(x + tmpx, tmpvar, dim_.wid,
|
||||||
font_metrics::ascent('i', pi.base.font) -
|
fm.ascent('i') -
|
||||||
font_metrics::ascent('x', pi.base.font) - 1,
|
fm.ascent('x') - 1,
|
||||||
backgroundColor());
|
backgroundColor());
|
||||||
// the five lines below is a simple hack to
|
// the five lines below is a simple hack to
|
||||||
// make the display of accent 'i' and 'j'
|
// make the display of accent 'i' and 'j'
|
||||||
@ -430,21 +429,21 @@ void InsetLatexAccent::draw(PainterInfo & pi, int x, int baseline) const
|
|||||||
|
|
||||||
case UNDERBAR: {
|
case UNDERBAR: {
|
||||||
char_type const underbar = 0x5F; //('\x5F');
|
char_type const underbar = 0x5F; //('\x5F');
|
||||||
pi.pain.text(x2 - font_metrics::center(underbar, font),
|
pi.pain.text(x2 - fm.center(underbar),
|
||||||
baseline, underbar, font);
|
baseline, underbar, font);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case CEDILLA: {
|
case CEDILLA: {
|
||||||
char_type const cedilla = 0xB8; //('\xB8');
|
char_type const cedilla = 0xB8; //('\xB8');
|
||||||
pi.pain.text(x2 - font_metrics::center(cedilla, font),
|
pi.pain.text(x2 - fm.center(cedilla),
|
||||||
baseline, cedilla, font);
|
baseline, cedilla, font);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case UNDERDOT:
|
case UNDERDOT:
|
||||||
pi.pain.text(x2 - font_metrics::center('.', font),
|
pi.pain.text(x2 - fm.center('.'),
|
||||||
int(baseline + 1.5 * font_metrics::height('.', font)),
|
int(baseline + 1.5 * fm.height('.')),
|
||||||
'.', font);
|
'.', font);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -496,8 +495,8 @@ void InsetLatexAccent::draw(PainterInfo & pi, int x, int baseline) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
case HUNGARIAN_UMLAUT:
|
case HUNGARIAN_UMLAUT:
|
||||||
drawAccent(pi, x2 - font_metrics::center('´', font), baseline, '´');
|
drawAccent(pi, x2 - fm.center('´'), baseline, '´');
|
||||||
drawAccent(pi, x2 + font_metrics::center('´', font), baseline, '´');
|
drawAccent(pi, x2 + fm.center('´'), baseline, '´');
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case UMLAUT:
|
case UMLAUT:
|
||||||
|
@ -37,10 +37,6 @@ public:
|
|||||||
///
|
///
|
||||||
void draw(PainterInfo & pi, int x, int y) const;
|
void draw(PainterInfo & pi, int x, int y) const;
|
||||||
///
|
///
|
||||||
int lbearing(LyXFont const & font) const;
|
|
||||||
///
|
|
||||||
int rbearing(LyXFont const & font) const;
|
|
||||||
///
|
|
||||||
bool displayISO8859_9(PainterInfo & pi, int x, int y) const;
|
bool displayISO8859_9(PainterInfo & pi, int x, int y) const;
|
||||||
///
|
///
|
||||||
void write(Buffer const &, std::ostream &) const;
|
void write(Buffer const &, std::ostream &) const;
|
||||||
|
@ -19,7 +19,9 @@
|
|||||||
#include "paragraph.h"
|
#include "paragraph.h"
|
||||||
#include "paragraph_funcs.h"
|
#include "paragraph_funcs.h"
|
||||||
|
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
|
|
||||||
using std::endl;
|
using std::endl;
|
||||||
@ -40,10 +42,11 @@ void InsetNewline::write(Buffer const &, ostream & os) const
|
|||||||
|
|
||||||
void InsetNewline::metrics(MetricsInfo & mi, Dimension & dim) const
|
void InsetNewline::metrics(MetricsInfo & mi, Dimension & dim) const
|
||||||
{
|
{
|
||||||
LyXFont & font = mi.base.font;
|
lyx::frontend::FontMetrics const & fm =
|
||||||
dim.asc = font_metrics::maxAscent(font);
|
theApp->fontLoader().metrics(mi.base.font);
|
||||||
dim.des = font_metrics::maxDescent(font);
|
dim.asc = fm.maxAscent();
|
||||||
dim.wid = font_metrics::width('n', font);
|
dim.des = fm.maxDescent();
|
||||||
|
dim.wid = fm.width('n');
|
||||||
dim_ = dim;
|
dim_ = dim;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,8 +77,10 @@ int InsetNewline::docbook(Buffer const &, std::ostream & os,
|
|||||||
|
|
||||||
void InsetNewline::draw(PainterInfo & pi, int x, int y) const
|
void InsetNewline::draw(PainterInfo & pi, int x, int y) const
|
||||||
{
|
{
|
||||||
int const wid = font_metrics::width('n', pi.base.font);
|
lyx::frontend::FontMetrics const & fm =
|
||||||
int const asc = font_metrics::maxAscent(pi.base.font);
|
theApp->fontLoader().metrics(pi.base.font);
|
||||||
|
int const wid = fm.width('n');
|
||||||
|
int const asc = fm.maxAscent();
|
||||||
|
|
||||||
int xp[3];
|
int xp[3];
|
||||||
int yp[3];
|
int yp[3];
|
||||||
|
@ -18,8 +18,10 @@
|
|||||||
#include "metricsinfo.h"
|
#include "metricsinfo.h"
|
||||||
#include "gettext.h"
|
#include "gettext.h"
|
||||||
|
|
||||||
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
#include "frontends/font_metrics.h"
|
|
||||||
|
|
||||||
using lyx::docstring;
|
using lyx::docstring;
|
||||||
using lyx::frontend::Painter;
|
using lyx::frontend::Painter;
|
||||||
@ -60,7 +62,7 @@ void InsetPagebreak::draw(PainterInfo & pi, int x, int y) const
|
|||||||
int w = 0;
|
int w = 0;
|
||||||
int a = 0;
|
int a = 0;
|
||||||
int d = 0;
|
int d = 0;
|
||||||
font_metrics::rectText(label, font, w, a, d);
|
theApp->fontLoader().metrics(font).rectText(label, w, a, d);
|
||||||
|
|
||||||
int const text_start = int(x + (dim_.wid - w) / 2);
|
int const text_start = int(x + (dim_.wid - w) / 2);
|
||||||
int const text_end = text_start + w;
|
int const text_end = text_start + w;
|
||||||
|
@ -24,7 +24,9 @@
|
|||||||
#include "paragraph.h"
|
#include "paragraph.h"
|
||||||
#include "paragraph_funcs.h"
|
#include "paragraph_funcs.h"
|
||||||
|
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
|
|
||||||
#include "support/lstrings.h"
|
#include "support/lstrings.h"
|
||||||
@ -199,18 +201,20 @@ string const InsetQuotes::dispString(Language const * loclang) const
|
|||||||
void InsetQuotes::metrics(MetricsInfo & mi, Dimension & dim) const
|
void InsetQuotes::metrics(MetricsInfo & mi, Dimension & dim) const
|
||||||
{
|
{
|
||||||
LyXFont & font = mi.base.font;
|
LyXFont & font = mi.base.font;
|
||||||
dim.asc = font_metrics::maxAscent(font);
|
lyx::frontend::FontMetrics const & fm =
|
||||||
dim.des = font_metrics::maxDescent(font);
|
theApp->fontLoader().metrics(font);
|
||||||
|
dim.asc = fm.maxAscent();
|
||||||
|
dim.des = fm.maxDescent();
|
||||||
dim.wid = 0;
|
dim.wid = 0;
|
||||||
|
|
||||||
string const text = dispString(font.language());
|
string const text = dispString(font.language());
|
||||||
for (string::size_type i = 0; i < text.length(); ++i) {
|
for (string::size_type i = 0; i < text.length(); ++i) {
|
||||||
if (text[i] == ' ')
|
if (text[i] == ' ')
|
||||||
dim.wid += font_metrics::width('i', font);
|
dim.wid += fm.width('i');
|
||||||
else if (i == 0 || text[i] != text[i - 1])
|
else if (i == 0 || text[i] != text[i - 1])
|
||||||
dim.wid += font_metrics::width(text[i], font);
|
dim.wid += fm.width(text[i]);
|
||||||
else
|
else
|
||||||
dim.wid += font_metrics::width(',', font);
|
dim.wid += fm.width(',');
|
||||||
}
|
}
|
||||||
dim_ = dim;
|
dim_ = dim;
|
||||||
}
|
}
|
||||||
@ -235,7 +239,8 @@ void InsetQuotes::draw(PainterInfo & pi, int x, int y) const
|
|||||||
|
|
||||||
if (text.length() == 2 && text[0] == text[1]) {
|
if (text.length() == 2 && text[0] == text[1]) {
|
||||||
pi.pain.text(x, y, text[0], pi.base.font);
|
pi.pain.text(x, y, text[0], pi.base.font);
|
||||||
int const t = font_metrics::width(',', pi.base.font);
|
int const t = theApp->fontLoader().metrics(pi.base.font)
|
||||||
|
.width(',');
|
||||||
pi.pain.text(x + t, y, text[0], pi.base.font);
|
pi.pain.text(x + t, y, text[0], pi.base.font);
|
||||||
} else {
|
} else {
|
||||||
docstring dtext(text.begin(), text.end());
|
docstring dtext(text.begin(), text.end());
|
||||||
|
@ -21,7 +21,9 @@
|
|||||||
#include "metricsinfo.h"
|
#include "metricsinfo.h"
|
||||||
#include "outputparams.h"
|
#include "outputparams.h"
|
||||||
|
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
|
|
||||||
|
|
||||||
@ -48,18 +50,19 @@ InsetSpace::Kind InsetSpace::kind() const
|
|||||||
|
|
||||||
void InsetSpace::metrics(MetricsInfo & mi, Dimension & dim) const
|
void InsetSpace::metrics(MetricsInfo & mi, Dimension & dim) const
|
||||||
{
|
{
|
||||||
LyXFont & font = mi.base.font;
|
lyx::frontend::FontMetrics const & fm =
|
||||||
dim.asc = font_metrics::maxAscent(font);
|
theApp->fontLoader().metrics(mi.base.font);
|
||||||
dim.des = font_metrics::maxDescent(font);
|
dim.asc = fm.maxAscent();
|
||||||
|
dim.des = fm.maxDescent();
|
||||||
|
|
||||||
switch (kind_) {
|
switch (kind_) {
|
||||||
case THIN:
|
case THIN:
|
||||||
case NEGTHIN:
|
case NEGTHIN:
|
||||||
dim.wid = font_metrics::width(lyx::char_type('x'), font) / 3;
|
dim.wid = fm.width(lyx::char_type('x')) / 3;
|
||||||
break;
|
break;
|
||||||
case PROTECTED:
|
case PROTECTED:
|
||||||
case NORMAL:
|
case NORMAL:
|
||||||
dim.wid = font_metrics::width(lyx::char_type('x'), font);
|
dim.wid = fm.width(lyx::char_type('x'));
|
||||||
break;
|
break;
|
||||||
case QUAD:
|
case QUAD:
|
||||||
dim.wid = 20;
|
dim.wid = 20;
|
||||||
@ -79,7 +82,8 @@ void InsetSpace::metrics(MetricsInfo & mi, Dimension & dim) const
|
|||||||
void InsetSpace::draw(PainterInfo & pi, int x, int y) const
|
void InsetSpace::draw(PainterInfo & pi, int x, int y) const
|
||||||
{
|
{
|
||||||
int const w = width();
|
int const w = width();
|
||||||
int const h = font_metrics::ascent('x', pi.base.font);
|
int const h = theApp->fontLoader().metrics(pi.base.font)
|
||||||
|
.ascent('x');
|
||||||
int xp[4], yp[4];
|
int xp[4], yp[4];
|
||||||
|
|
||||||
xp[0] = x;
|
xp[0] = x;
|
||||||
|
@ -20,7 +20,9 @@
|
|||||||
#include "lyxlex.h"
|
#include "lyxlex.h"
|
||||||
#include "metricsinfo.h"
|
#include "metricsinfo.h"
|
||||||
|
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
|
|
||||||
using lyx::docstring;
|
using lyx::docstring;
|
||||||
@ -43,9 +45,10 @@ InsetSpecialChar::Kind InsetSpecialChar::kind() const
|
|||||||
|
|
||||||
void InsetSpecialChar::metrics(MetricsInfo & mi, Dimension & dim) const
|
void InsetSpecialChar::metrics(MetricsInfo & mi, Dimension & dim) const
|
||||||
{
|
{
|
||||||
LyXFont & font = mi.base.font;
|
lyx::frontend::FontMetrics const & fm =
|
||||||
dim.asc = font_metrics::maxAscent(font);
|
theApp->fontLoader().metrics(mi.base.font);
|
||||||
dim.des = font_metrics::maxDescent(font);
|
dim.asc = fm.maxAscent();
|
||||||
|
dim.des = fm.maxDescent();
|
||||||
|
|
||||||
string s;
|
string s;
|
||||||
switch (kind_) {
|
switch (kind_) {
|
||||||
@ -56,7 +59,7 @@ void InsetSpecialChar::metrics(MetricsInfo & mi, Dimension & dim) const
|
|||||||
case HYPHENATION: s = "-"; break;
|
case HYPHENATION: s = "-"; break;
|
||||||
}
|
}
|
||||||
docstring ds(s.begin(), s.end());
|
docstring ds(s.begin(), s.end());
|
||||||
dim.wid = font_metrics::width(ds, font);
|
dim.wid = fm.width(ds);
|
||||||
if (kind_ == HYPHENATION && dim.wid > 5)
|
if (kind_ == HYPHENATION && dim.wid > 5)
|
||||||
dim.wid -= 2; // to make it look shorter
|
dim.wid -= 2; // to make it look shorter
|
||||||
dim_ = dim;
|
dim_ = dim;
|
||||||
@ -96,10 +99,13 @@ void InsetSpecialChar::draw(PainterInfo & pi, int x, int y) const
|
|||||||
}
|
}
|
||||||
case MENU_SEPARATOR:
|
case MENU_SEPARATOR:
|
||||||
{
|
{
|
||||||
|
lyx::frontend::FontMetrics const & fm =
|
||||||
|
theApp->fontLoader().metrics(font);
|
||||||
|
|
||||||
// A triangle the width and height of an 'x'
|
// A triangle the width and height of an 'x'
|
||||||
int w = font_metrics::width(lyx::char_type('x'), font);
|
int w = fm.width(lyx::char_type('x'));
|
||||||
int ox = font_metrics::width(lyx::char_type(' '), font) + x;
|
int ox = fm.width(lyx::char_type(' ')) + x;
|
||||||
int h = font_metrics::ascent(lyx::char_type('x'), font);
|
int h = fm.ascent(lyx::char_type('x'));
|
||||||
int xp[4], yp[4];
|
int xp[4], yp[4];
|
||||||
|
|
||||||
xp[0] = ox; yp[0] = y;
|
xp[0] = ox; yp[0] = y;
|
||||||
|
@ -38,7 +38,6 @@
|
|||||||
|
|
||||||
#include "frontends/Alert.h"
|
#include "frontends/Alert.h"
|
||||||
#include "frontends/Application.h"
|
#include "frontends/Application.h"
|
||||||
#include "frontends/font_metrics.h"
|
|
||||||
#include "frontends/Clipboard.h"
|
#include "frontends/Clipboard.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
#include "frontends/Selection.h"
|
#include "frontends/Selection.h"
|
||||||
|
@ -43,7 +43,6 @@
|
|||||||
#include "undo.h"
|
#include "undo.h"
|
||||||
|
|
||||||
#include "frontends/Alert.h"
|
#include "frontends/Alert.h"
|
||||||
#include "frontends/font_metrics.h"
|
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
|
|
||||||
#include "support/lyxalgo.h" // lyx::count
|
#include "support/lyxalgo.h" // lyx::count
|
||||||
|
@ -23,7 +23,9 @@
|
|||||||
#include "lyxtext.h"
|
#include "lyxtext.h"
|
||||||
#include "metricsinfo.h"
|
#include "metricsinfo.h"
|
||||||
|
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@ -131,7 +133,7 @@ void InsetVSpace::metrics(MetricsInfo & mi, Dimension & dim) const
|
|||||||
int d = 0;
|
int d = 0;
|
||||||
string lab = label();
|
string lab = label();
|
||||||
docstring dlab(lab.begin(), lab.end());
|
docstring dlab(lab.begin(), lab.end());
|
||||||
font_metrics::rectText(dlab, font, w, a, d);
|
theApp->fontLoader().metrics(font).rectText(dlab, w, a, d);
|
||||||
|
|
||||||
height = max(height, a + d);
|
height = max(height, a + d);
|
||||||
|
|
||||||
@ -183,7 +185,7 @@ void InsetVSpace::draw(PainterInfo & pi, int x, int y) const
|
|||||||
font.decSize();
|
font.decSize();
|
||||||
string lab = label();
|
string lab = label();
|
||||||
docstring dlab(lab.begin(), lab.end());
|
docstring dlab(lab.begin(), lab.end());
|
||||||
font_metrics::rectText(dlab, font, w, a, d);
|
theApp->fontLoader().metrics(font).rectText(dlab, w, a, d);
|
||||||
|
|
||||||
pi.pain.rectText(x + 2 * arrow_size + 5,
|
pi.pain.rectText(x + 2 * arrow_size + 5,
|
||||||
start + (end - start) / 2 + (a - d) / 2,
|
start + (end - start) / 2 + (a - d) / 2,
|
||||||
|
@ -15,7 +15,9 @@
|
|||||||
#include "LColor.h"
|
#include "LColor.h"
|
||||||
#include "metricsinfo.h"
|
#include "metricsinfo.h"
|
||||||
|
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
|
|
||||||
using lyx::docstring;
|
using lyx::docstring;
|
||||||
@ -46,13 +48,15 @@ void RenderButton::metrics(MetricsInfo &, Dimension & dim) const
|
|||||||
{
|
{
|
||||||
LyXFont font(LyXFont::ALL_SANE);
|
LyXFont font(LyXFont::ALL_SANE);
|
||||||
font.decSize();
|
font.decSize();
|
||||||
|
lyx::frontend::FontMetrics const & fm =
|
||||||
|
theApp->fontLoader().metrics(font);
|
||||||
|
|
||||||
docstring dtext(text_.begin(), text_.end());
|
docstring dtext(text_.begin(), text_.end());
|
||||||
|
|
||||||
if (editable_)
|
if (editable_)
|
||||||
font_metrics::buttonText(dtext, font, dim.wid, dim.asc, dim.des);
|
fm.buttonText(dtext, dim.wid, dim.asc, dim.des);
|
||||||
else
|
else
|
||||||
font_metrics::rectText(dtext, font, dim.wid, dim.asc, dim.des);
|
fm.rectText(dtext, dim.wid, dim.asc, dim.des);
|
||||||
|
|
||||||
dim.wid += 4;
|
dim.wid += 4;
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,9 @@
|
|||||||
#include "lyxrc.h"
|
#include "lyxrc.h"
|
||||||
#include "metricsinfo.h"
|
#include "metricsinfo.h"
|
||||||
|
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
|
|
||||||
#include "graphics/GraphicsImage.h"
|
#include "graphics/GraphicsImage.h"
|
||||||
@ -163,15 +165,16 @@ void RenderGraphic::metrics(MetricsInfo & mi, Dimension & dim) const
|
|||||||
docstring djust(justname.begin(), justname.end());
|
docstring djust(justname.begin(), justname.end());
|
||||||
if (!justname.empty()) {
|
if (!justname.empty()) {
|
||||||
msgFont.setSize(LyXFont::SIZE_FOOTNOTE);
|
msgFont.setSize(LyXFont::SIZE_FOOTNOTE);
|
||||||
font_width = font_metrics::width(djust, msgFont);
|
font_width = theApp->fontLoader().metrics(msgFont)
|
||||||
|
.width(djust);
|
||||||
}
|
}
|
||||||
|
|
||||||
string const msg = statusMessage(params_, loader_.status());
|
string const msg = statusMessage(params_, loader_.status());
|
||||||
if (!msg.empty()) {
|
if (!msg.empty()) {
|
||||||
docstring dmsg(msg.begin(), msg.end());
|
docstring dmsg(msg.begin(), msg.end());
|
||||||
msgFont.setSize(LyXFont::SIZE_TINY);
|
msgFont.setSize(LyXFont::SIZE_TINY);
|
||||||
font_width = std::max(font_width,
|
font_width = std::max(font_width, theApp->fontLoader()
|
||||||
font_metrics::width(dmsg, msgFont));
|
.metrics(msgFont).width(dmsg));
|
||||||
}
|
}
|
||||||
|
|
||||||
dim.wid = std::max(50, font_width + 15);
|
dim.wid = std::max(50, font_width + 15);
|
||||||
@ -216,7 +219,7 @@ void RenderGraphic::draw(PainterInfo & pi, int x, int y) const
|
|||||||
docstring djust(justname.begin(), justname.end());
|
docstring djust(justname.begin(), justname.end());
|
||||||
msgFont.setSize(LyXFont::SIZE_FOOTNOTE);
|
msgFont.setSize(LyXFont::SIZE_FOOTNOTE);
|
||||||
pi.pain.text(x + InsetOld::TEXT_TO_INSET_OFFSET + 6,
|
pi.pain.text(x + InsetOld::TEXT_TO_INSET_OFFSET + 6,
|
||||||
y - font_metrics::maxAscent(msgFont) - 4,
|
y - theApp->fontLoader().metrics(msgFont).maxAscent() - 4,
|
||||||
djust, msgFont);
|
djust, msgFont);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,7 +21,9 @@
|
|||||||
#include "lyxrc.h"
|
#include "lyxrc.h"
|
||||||
#include "metricsinfo.h"
|
#include "metricsinfo.h"
|
||||||
|
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
|
|
||||||
#include "graphics/PreviewImage.h"
|
#include "graphics/PreviewImage.h"
|
||||||
@ -133,7 +135,7 @@ void RenderPreview::metrics(MetricsInfo & mi, Dimension & dim) const
|
|||||||
font.setSize(LyXFont::SIZE_FOOTNOTE);
|
font.setSize(LyXFont::SIZE_FOOTNOTE);
|
||||||
string stat = statusMessage(mi.base.bv, snippet_);
|
string stat = statusMessage(mi.base.bv, snippet_);
|
||||||
docstring dstat(stat.begin(), stat.end());
|
docstring dstat(stat.begin(), stat.end());
|
||||||
dim.wid = 15 + font_metrics::width(dstat, font);
|
dim.wid = 15 + theApp->fontLoader().metrics(font).width(dstat);
|
||||||
}
|
}
|
||||||
|
|
||||||
dim_ = dim;
|
dim_ = dim;
|
||||||
@ -168,7 +170,7 @@ void RenderPreview::draw(PainterInfo & pi, int x, int y) const
|
|||||||
string stat = statusMessage(pi.base.bv, snippet_);
|
string stat = statusMessage(pi.base.bv, snippet_);
|
||||||
docstring dstat(stat.begin(), stat.end());
|
docstring dstat(stat.begin(), stat.end());
|
||||||
pi.pain.text(x + offset + 6,
|
pi.pain.text(x + offset + 6,
|
||||||
y - font_metrics::maxAscent(font) - 4,
|
y - theApp->fontLoader().metrics(font).maxAscent() - 4,
|
||||||
dstat, font);
|
dstat, font);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -136,7 +136,7 @@ int LyXLength::inPixels(int text_width, int em_width_base) const
|
|||||||
? em_width_base
|
? em_width_base
|
||||||
: 10*(dpi/72.27)*zoom;
|
: 10*(dpi/72.27)*zoom;
|
||||||
// A different estimate for em_width is
|
// A different estimate for em_width is
|
||||||
// font_metrics::width('M', LyXFont(LyXFont::ALL_SANE))
|
// theApp->fontLoader().metrics(LyXFont(LyXFont::ALL_SANE)).width('M')
|
||||||
// but this estimate might not be more accurate as the screen font
|
// but this estimate might not be more accurate as the screen font
|
||||||
// is different then the latex font.
|
// is different then the latex font.
|
||||||
|
|
||||||
|
@ -24,8 +24,10 @@
|
|||||||
#include "lyxlex.h"
|
#include "lyxlex.h"
|
||||||
#include "outputparams.h"
|
#include "outputparams.h"
|
||||||
|
|
||||||
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
#include "frontends/font_metrics.h"
|
|
||||||
|
|
||||||
#include "support/lstrings.h"
|
#include "support/lstrings.h"
|
||||||
|
|
||||||
@ -127,7 +129,8 @@ void InsetFormulaMacro::metrics(MetricsInfo & mi, Dimension & dim) const
|
|||||||
tmpl()->metrics(mi, dim);
|
tmpl()->metrics(mi, dim);
|
||||||
dim.asc += 5;
|
dim.asc += 5;
|
||||||
dim.des += 5;
|
dim.des += 5;
|
||||||
dim.wid += 10 + font_metrics::width(prefix(), mi.base.font);
|
dim.wid += 10
|
||||||
|
+ theApp->fontLoader().metrics(mi.base.font).width(prefix());
|
||||||
dim_ = dim;
|
dim_ = dim;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,7 +165,9 @@ void InsetFormulaMacro::draw(PainterInfo & p, int x, int y) const
|
|||||||
pi.pain.text(x + 2, y, prefix(), font);
|
pi.pain.text(x + 2, y, prefix(), font);
|
||||||
|
|
||||||
// body
|
// body
|
||||||
tmpl()->draw(pi, x + font_metrics::width(prefix(), p.base.font) + 5, y);
|
tmpl()->draw(pi,
|
||||||
|
x + theApp->fontLoader().metrics(p.base.font).width(prefix()) + 5,
|
||||||
|
y);
|
||||||
|
|
||||||
setPosCache(pi, x, y);
|
setPosCache(pi, x, y);
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,10 @@
|
|||||||
#include "MathMLStream.h"
|
#include "MathMLStream.h"
|
||||||
#include "MathStream.h"
|
#include "MathStream.h"
|
||||||
|
|
||||||
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
|
|
||||||
#include "support/lstrings.h"
|
#include "support/lstrings.h"
|
||||||
|
|
||||||
|
|
||||||
@ -61,7 +65,8 @@ double InsetMathBig::increase() const
|
|||||||
|
|
||||||
void InsetMathBig::metrics(MetricsInfo & mi, Dimension & dim) const
|
void InsetMathBig::metrics(MetricsInfo & mi, Dimension & dim) const
|
||||||
{
|
{
|
||||||
double const h = mathed_char_ascent(mi.base.font, 'I');
|
double const h
|
||||||
|
= theApp->fontLoader().metrics(mi.base.font).ascent('I');
|
||||||
double const f = increase();
|
double const f = increase();
|
||||||
dim_.wid = 6;
|
dim_.wid = 6;
|
||||||
dim_.asc = int(h + f * h);
|
dim_.asc = int(h + f * h);
|
||||||
|
@ -20,6 +20,10 @@
|
|||||||
#include "support/lstrings.h"
|
#include "support/lstrings.h"
|
||||||
#include "TextPainter.h"
|
#include "TextPainter.h"
|
||||||
|
|
||||||
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
|
|
||||||
using std::auto_ptr;
|
using std::auto_ptr;
|
||||||
|
|
||||||
extern bool has_math_fonts;
|
extern bool has_math_fonts;
|
||||||
@ -76,7 +80,7 @@ void InsetMathChar::metrics(MetricsInfo & mi, Dimension & dim) const
|
|||||||
whichFont(font_, code_, mi);
|
whichFont(font_, code_, mi);
|
||||||
mathed_char_dim(font_, char_, dim_);
|
mathed_char_dim(font_, char_, dim_);
|
||||||
if (isBinaryOp(char_, code_))
|
if (isBinaryOp(char_, code_))
|
||||||
width_ += 2 * font_metrics::width(' ', font_);
|
width_ += 2 * theApp->fontLoader().metrics(font_).width(' ');
|
||||||
lyxerr << "InsetMathChar::metrics: " << dim << endl;
|
lyxerr << "InsetMathChar::metrics: " << dim << endl;
|
||||||
#endif
|
#endif
|
||||||
width_ = dim.wid;
|
width_ = dim.wid;
|
||||||
|
@ -21,8 +21,10 @@
|
|||||||
#include "lyxlex.h"
|
#include "lyxlex.h"
|
||||||
#include "LColor.h"
|
#include "LColor.h"
|
||||||
|
|
||||||
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
#include "frontends/font_metrics.h"
|
|
||||||
|
|
||||||
#include "support/lstrings.h"
|
#include "support/lstrings.h"
|
||||||
|
|
||||||
@ -117,7 +119,7 @@ void MathMacroTemplate::metrics(MetricsInfo & mi, Dimension & dim) const
|
|||||||
cell(1).metrics(mi);
|
cell(1).metrics(mi);
|
||||||
docstring dp = prefix();
|
docstring dp = prefix();
|
||||||
dim.wid = cell(0).width() + cell(1).width() + 20
|
dim.wid = cell(0).width() + cell(1).width() + 20
|
||||||
+ font_metrics::width(dp, mi.base.font);
|
+ theApp->fontLoader().metrics(mi.base.font).width(dp);
|
||||||
dim.asc = std::max(cell(0).ascent(), cell(1).ascent()) + 7;
|
dim.asc = std::max(cell(0).ascent(), cell(1).ascent()) + 7;
|
||||||
dim.des = std::max(cell(0).descent(), cell(1).descent()) + 7;
|
dim.des = std::max(cell(0).descent(), cell(1).descent()) + 7;
|
||||||
dim_ = dim;
|
dim_ = dim;
|
||||||
@ -155,7 +157,8 @@ void MathMacroTemplate::draw(PainterInfo & p, int x, int y) const
|
|||||||
#endif
|
#endif
|
||||||
docstring dp = prefix();
|
docstring dp = prefix();
|
||||||
pi.pain.text(x + 2, y, dp, font);
|
pi.pain.text(x + 2, y, dp, font);
|
||||||
x += font_metrics::width(dp, pi.base.font) + 6;
|
// FIXME: Painter text should retain the drawn text width
|
||||||
|
x += theApp->fontLoader().metrics(font).width(dp) + 6;
|
||||||
|
|
||||||
int const w0 = cell(0).width();
|
int const w0 = cell(0).width();
|
||||||
int const w1 = cell(1).width();
|
int const w1 = cell(1).width();
|
||||||
|
@ -21,9 +21,9 @@
|
|||||||
#include "LColor.h"
|
#include "LColor.h"
|
||||||
|
|
||||||
#include "frontends/Application.h"
|
#include "frontends/Application.h"
|
||||||
#include "frontends/Painter.h"
|
|
||||||
#include "frontends/font_metrics.h"
|
|
||||||
#include "frontends/FontLoader.h"
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
|
#include "frontends/Painter.h"
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@ -368,52 +368,44 @@ deco_struct const * search_deco(string const & name)
|
|||||||
|
|
||||||
void mathed_char_dim(LyXFont const & font, unsigned char c, Dimension & dim)
|
void mathed_char_dim(LyXFont const & font, unsigned char c, Dimension & dim)
|
||||||
{
|
{
|
||||||
dim.des = font_metrics::descent(c, font);
|
lyx::frontend::FontMetrics const & fm =
|
||||||
dim.asc = font_metrics::ascent(c, font);
|
theApp->fontLoader().metrics(font);
|
||||||
dim.wid = mathed_char_width(font, c);
|
dim.des = fm.descent(c);
|
||||||
}
|
dim.asc = fm.ascent(c);
|
||||||
|
dim.wid = fm.width(c);
|
||||||
|
|
||||||
int mathed_char_ascent(LyXFont const & font, unsigned char c)
|
|
||||||
{
|
|
||||||
return font_metrics::ascent(c, font);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int mathed_char_descent(LyXFont const & font, unsigned char c)
|
|
||||||
{
|
|
||||||
return font_metrics::descent(c, font);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int mathed_char_width(LyXFont const & font, unsigned char c)
|
int mathed_char_width(LyXFont const & font, unsigned char c)
|
||||||
{
|
{
|
||||||
return font_metrics::width(c, font);
|
return theApp->fontLoader().metrics(font).width(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void mathed_string_dim(LyXFont const & font, string const & s, Dimension & dim)
|
void mathed_string_dim(LyXFont const & font, string const & s, Dimension & dim)
|
||||||
{
|
{
|
||||||
|
lyx::frontend::FontMetrics const & fm =
|
||||||
|
theApp->fontLoader().metrics(font);
|
||||||
#if 1
|
#if 1
|
||||||
dim.asc = 0;
|
dim.asc = 0;
|
||||||
dim.des = 0;
|
dim.des = 0;
|
||||||
for (string::const_iterator it = s.begin(); it != s.end(); ++it) {
|
for (string::const_iterator it = s.begin(); it != s.end(); ++it) {
|
||||||
dim.asc = max(dim.asc, font_metrics::ascent(*it, font));
|
dim.asc = max(dim.asc, fm.ascent(*it));
|
||||||
dim.des = max(dim.des, font_metrics::descent(*it, font));
|
dim.des = max(dim.des, fm.descent(*it));
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
dim.asc = font_metrics::maxAscent(font);
|
dim.asc = fm.maxAscent();
|
||||||
dim.des = font_metrics::maxDescent(font);
|
dim.des = fm.maxDescent();
|
||||||
#endif
|
#endif
|
||||||
docstring ds(s.begin(), s.end());
|
docstring ds(s.begin(), s.end());
|
||||||
dim.wid = font_metrics::width(ds, font);
|
dim.wid = fm.width(ds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int mathed_string_width(LyXFont const & font, string const & s)
|
int mathed_string_width(LyXFont const & font, string const & s)
|
||||||
{
|
{
|
||||||
docstring ds(s.begin(), s.end());
|
docstring ds(s.begin(), s.end());
|
||||||
return font_metrics::width(ds, font);
|
return theApp->fontLoader().metrics(font).width(ds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -507,8 +499,10 @@ void drawStrBlack(PainterInfo & pi, int x, int y, string const & str)
|
|||||||
|
|
||||||
void math_font_max_dim(LyXFont const & font, int & asc, int & des)
|
void math_font_max_dim(LyXFont const & font, int & asc, int & des)
|
||||||
{
|
{
|
||||||
asc = font_metrics::maxAscent(font);
|
lyx::frontend::FontMetrics const & fm =
|
||||||
des = font_metrics::maxDescent(font);
|
theApp->fontLoader().metrics(font);
|
||||||
|
asc = fm.maxAscent();
|
||||||
|
des = fm.maxDescent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -25,8 +25,6 @@ class InsetMath;
|
|||||||
|
|
||||||
void mathed_char_dim(LyXFont const &, unsigned char c, Dimension & dim);
|
void mathed_char_dim(LyXFont const &, unsigned char c, Dimension & dim);
|
||||||
int mathed_char_width(LyXFont const &, unsigned char c);
|
int mathed_char_width(LyXFont const &, unsigned char c);
|
||||||
int mathed_char_ascent(LyXFont const &, unsigned char c);
|
|
||||||
int mathed_char_descent(LyXFont const &, unsigned char c);
|
|
||||||
|
|
||||||
void mathed_draw_deco(PainterInfo & pi, int x, int y, int w, int h,
|
void mathed_draw_deco(PainterInfo & pi, int x, int y, int w, int h,
|
||||||
std::string const & name);
|
std::string const & name);
|
||||||
|
@ -32,7 +32,9 @@
|
|||||||
#include "ParagraphParameters.h"
|
#include "ParagraphParameters.h"
|
||||||
#include "vspace.h"
|
#include "vspace.h"
|
||||||
|
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
#include "frontends/nullpainter.h"
|
#include "frontends/nullpainter.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
|
|
||||||
@ -45,6 +47,8 @@
|
|||||||
using lyx::docstring;
|
using lyx::docstring;
|
||||||
using lyx::frontend::Painter;
|
using lyx::frontend::Painter;
|
||||||
using lyx::frontend::NullPainter;
|
using lyx::frontend::NullPainter;
|
||||||
|
using lyx::frontend::FontMetrics;
|
||||||
|
|
||||||
using lyx::char_type;
|
using lyx::char_type;
|
||||||
using lyx::pos_type;
|
using lyx::pos_type;
|
||||||
using lyx::pit_type;
|
using lyx::pit_type;
|
||||||
@ -198,7 +202,7 @@ void RowPainter::paintHebrewComposeChar(pos_type & vpos, LyXFont const & font)
|
|||||||
str += c;
|
str += c;
|
||||||
++vpos;
|
++vpos;
|
||||||
|
|
||||||
int const width = font_metrics::width(c, font);
|
int const width = theApp->fontLoader().metrics(font).width(c);
|
||||||
int dx = 0;
|
int dx = 0;
|
||||||
|
|
||||||
for (pos_type i = pos - 1; i >= 0; --i) {
|
for (pos_type i = pos - 1; i >= 0; --i) {
|
||||||
@ -233,7 +237,7 @@ void RowPainter::paintArabicComposeChar(pos_type & vpos, LyXFont const & font)
|
|||||||
str += c;
|
str += c;
|
||||||
++vpos;
|
++vpos;
|
||||||
|
|
||||||
int const width = font_metrics::width(c, font);
|
int const width = theApp->fontLoader().metrics(font).width(c);
|
||||||
int dx = 0;
|
int dx = 0;
|
||||||
|
|
||||||
for (pos_type i = pos - 1; i >= 0; --i) {
|
for (pos_type i = pos - 1; i >= 0; --i) {
|
||||||
@ -313,10 +317,10 @@ void RowPainter::paintChars(pos_type & vpos, LyXFont font,
|
|||||||
//lyxerr << "paint row: yo_ " << yo_ << "\n";
|
//lyxerr << "paint row: yo_ " << yo_ << "\n";
|
||||||
#if 0
|
#if 0
|
||||||
pain_.text(int(x_), yo_, str, font);
|
pain_.text(int(x_), yo_, str, font);
|
||||||
x_ += font_metrics::width(str, font);
|
x_ += theApp->fontLoader().metrics(font).width(str);
|
||||||
#else
|
#else
|
||||||
pain_.text(int(x_), yo_, &str[0], str.size(), font);
|
pain_.text(int(x_), yo_, &str[0], str.size(), font);
|
||||||
x_ += font_metrics::width(&str[0], str.size(), font);
|
x_ += theApp->fontLoader().metrics(font).width(&str[0], str.size());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -460,7 +464,7 @@ int RowPainter::paintAppendixStart(int y)
|
|||||||
int a = 0;
|
int a = 0;
|
||||||
int d = 0;
|
int d = 0;
|
||||||
docstring dlab(label.begin(), label.end());
|
docstring dlab(label.begin(), label.end());
|
||||||
font_metrics::rectText(dlab, pb_font, w, a, d);
|
theApp->fontLoader().metrics(pb_font).rectText(dlab, w, a, d);
|
||||||
|
|
||||||
int const text_start = int(xo_ + (width_ - w) / 2);
|
int const text_start = int(xo_ + (width_ - w) / 2);
|
||||||
int const text_end = text_start + w;
|
int const text_end = text_start + w;
|
||||||
@ -515,6 +519,9 @@ void RowPainter::paintFirst()
|
|||||||
|| is_seq)) {
|
|| is_seq)) {
|
||||||
|
|
||||||
LyXFont const font = getLabelFont();
|
LyXFont const font = getLabelFont();
|
||||||
|
FontMetrics const & fm =
|
||||||
|
theApp->fontLoader().metrics(font);
|
||||||
|
|
||||||
string const str = par_.getLabelstring();
|
string const str = par_.getLabelstring();
|
||||||
if (!str.empty()) {
|
if (!str.empty()) {
|
||||||
double x = x_;
|
double x = x_;
|
||||||
@ -531,14 +538,14 @@ void RowPainter::paintFirst()
|
|||||||
spacing_val = buffer.params().spacing().getValue();
|
spacing_val = buffer.params().spacing().getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
int const labeladdon = int(font_metrics::maxHeight(font) * layout->spacing.getValue() * spacing_val);
|
int const labeladdon = int(fm.maxHeight() * layout->spacing.getValue() * spacing_val);
|
||||||
|
|
||||||
int const maxdesc = int(font_metrics::maxDescent(font) * layout->spacing.getValue() * spacing_val)
|
int const maxdesc = int(fm.maxDescent() * layout->spacing.getValue() * spacing_val)
|
||||||
+ int(layout->parsep) * defaultRowHeight();
|
+ int(layout->parsep) * defaultRowHeight();
|
||||||
|
|
||||||
if (is_rtl) {
|
if (is_rtl) {
|
||||||
x = width_ - leftMargin() -
|
x = width_ - leftMargin() -
|
||||||
font_metrics::width(dstr, font);
|
fm.width(dstr);
|
||||||
}
|
}
|
||||||
|
|
||||||
pain_.text(int(x), yo_ - maxdesc - labeladdon, dstr, font);
|
pain_.text(int(x), yo_ - maxdesc - labeladdon, dstr, font);
|
||||||
@ -547,10 +554,10 @@ void RowPainter::paintFirst()
|
|||||||
docstring dlab(lab.begin(), lab.end());
|
docstring dlab(lab.begin(), lab.end());
|
||||||
if (is_rtl) {
|
if (is_rtl) {
|
||||||
x = width_ - leftMargin()
|
x = width_ - leftMargin()
|
||||||
+ font_metrics::width(dlab, font);
|
+ fm.width(dlab);
|
||||||
} else {
|
} else {
|
||||||
x = x_ - font_metrics::width(dlab, font)
|
x = x_ - fm.width(dlab)
|
||||||
- font_metrics::width(dstr, font);
|
- fm.width(dstr);
|
||||||
}
|
}
|
||||||
|
|
||||||
pain_.text(int(x), yo_, dstr, font);
|
pain_.text(int(x), yo_, dstr, font);
|
||||||
@ -573,10 +580,14 @@ void RowPainter::paintFirst()
|
|||||||
else
|
else
|
||||||
spacing_val = buffer.params().spacing().getValue();
|
spacing_val = buffer.params().spacing().getValue();
|
||||||
|
|
||||||
int const labeladdon = int(font_metrics::maxHeight(font) * layout->spacing.getValue() * spacing_val);
|
FontMetrics const & fm =
|
||||||
|
theApp->fontLoader().metrics(font);
|
||||||
|
|
||||||
|
int const labeladdon = int(fm.maxHeight()
|
||||||
|
* layout->spacing.getValue() * spacing_val);
|
||||||
|
|
||||||
int maxdesc =
|
int maxdesc =
|
||||||
int(font_metrics::maxDescent(font) * layout->spacing.getValue() * spacing_val
|
int(fm.maxDescent() * layout->spacing.getValue() * spacing_val
|
||||||
+ (layout->labelbottomsep * defaultRowHeight()));
|
+ (layout->labelbottomsep * defaultRowHeight()));
|
||||||
|
|
||||||
double x = x_;
|
double x = x_;
|
||||||
@ -584,10 +595,9 @@ void RowPainter::paintFirst()
|
|||||||
if (is_rtl)
|
if (is_rtl)
|
||||||
x = leftMargin();
|
x = leftMargin();
|
||||||
x += (width_ - text_.rightMargin(par_) - leftMargin()) / 2;
|
x += (width_ - text_.rightMargin(par_) - leftMargin()) / 2;
|
||||||
x -= font_metrics::width(dstr, font) / 2;
|
x -= fm.width(dstr) / 2;
|
||||||
} else if (is_rtl) {
|
} else if (is_rtl) {
|
||||||
x = width_ - leftMargin() -
|
x = width_ - leftMargin() - fm.width(dstr);
|
||||||
font_metrics::width(dstr, font);
|
|
||||||
}
|
}
|
||||||
pain_.text(int(x), yo_ - maxdesc - labeladdon, dstr, font);
|
pain_.text(int(x), yo_ - maxdesc - labeladdon, dstr, font);
|
||||||
}
|
}
|
||||||
@ -605,7 +615,8 @@ void RowPainter::paintLast()
|
|||||||
case END_LABEL_BOX:
|
case END_LABEL_BOX:
|
||||||
case END_LABEL_FILLED_BOX: {
|
case END_LABEL_FILLED_BOX: {
|
||||||
LyXFont const font = getLabelFont();
|
LyXFont const font = getLabelFont();
|
||||||
int const size = int(0.75 * font_metrics::maxAscent(font));
|
FontMetrics const & fm = theApp->fontLoader().metrics(font);
|
||||||
|
int const size = int(0.75 * fm.maxAscent());
|
||||||
int const y = yo_ - size;
|
int const y = yo_ - size;
|
||||||
int x = is_rtl ? nestMargin() + changebarMargin() : width_ - size;
|
int x = is_rtl ? nestMargin() + changebarMargin() : width_ - size;
|
||||||
|
|
||||||
@ -621,10 +632,11 @@ void RowPainter::paintLast()
|
|||||||
|
|
||||||
case END_LABEL_STATIC: {
|
case END_LABEL_STATIC: {
|
||||||
LyXFont font = getLabelFont();
|
LyXFont font = getLabelFont();
|
||||||
|
FontMetrics const & fm = theApp->fontLoader().metrics(font);
|
||||||
string const & str = par_.layout()->endlabelstring();
|
string const & str = par_.layout()->endlabelstring();
|
||||||
docstring dstr(str.begin(), str.end());
|
docstring dstr(str.begin(), str.end());
|
||||||
double const x = is_rtl ?
|
double const x = is_rtl ?
|
||||||
x_ - font_metrics::width(dstr, font)
|
x_ - fm.width(dstr)
|
||||||
: - text_.rightMargin(par_) - row_.width();
|
: - text_.rightMargin(par_) - row_.width();
|
||||||
pain_.text(int(x), yo_, dstr, font);
|
pain_.text(int(x), yo_, dstr, font);
|
||||||
break;
|
break;
|
||||||
@ -695,9 +707,9 @@ void RowPainter::paintText()
|
|||||||
// We also don't paint across things like tables
|
// We also don't paint across things like tables
|
||||||
if (running_strikeout && (highly_editable_inset || !is_struckout)) {
|
if (running_strikeout && (highly_editable_inset || !is_struckout)) {
|
||||||
// Calculate 1/3 height of the buffer's default font
|
// Calculate 1/3 height of the buffer's default font
|
||||||
int const middle =
|
FontMetrics const & fm = theApp->fontLoader().metrics(
|
||||||
yo_ -
|
bv_.buffer()->params().getFont());
|
||||||
font_metrics::maxAscent(bv_.buffer()->params().getFont()) / 3;
|
int const middle = yo_ - fm.maxAscent() / 3;
|
||||||
pain_.line(last_strikeout_x, middle, int(x_), middle,
|
pain_.line(last_strikeout_x, middle, int(x_), middle,
|
||||||
LColor::strikeout, Painter::line_solid, Painter::line_thin);
|
LColor::strikeout, Painter::line_solid, Painter::line_thin);
|
||||||
running_strikeout = false;
|
running_strikeout = false;
|
||||||
@ -706,8 +718,8 @@ void RowPainter::paintText()
|
|||||||
if (body_pos > 0 && pos == body_pos - 1) {
|
if (body_pos > 0 && pos == body_pos - 1) {
|
||||||
string lab = layout->labelsep;
|
string lab = layout->labelsep;
|
||||||
docstring dlab(lab.begin(), lab.end());
|
docstring dlab(lab.begin(), lab.end());
|
||||||
int const lwidth = font_metrics::width(dlab,
|
int const lwidth =
|
||||||
getLabelFont());
|
theApp->fontLoader().metrics(getLabelFont()).width(dlab);
|
||||||
|
|
||||||
x_ += label_hfill_ + lwidth - width_pos;
|
x_ += label_hfill_ + lwidth - width_pos;
|
||||||
}
|
}
|
||||||
@ -751,9 +763,9 @@ void RowPainter::paintText()
|
|||||||
// if we reach the end of a struck out range, paint it
|
// if we reach the end of a struck out range, paint it
|
||||||
if (running_strikeout) {
|
if (running_strikeout) {
|
||||||
// calculate 1/3 height of the buffer's default font
|
// calculate 1/3 height of the buffer's default font
|
||||||
int const middle =
|
FontMetrics const & fm = theApp->fontLoader().metrics(
|
||||||
yo_ -
|
bv_.buffer()->params().getFont());
|
||||||
font_metrics::maxAscent(bv_.buffer()->params().getFont()) / 3;
|
int const middle = yo_ - fm.maxAscent() / 3;
|
||||||
pain_.line(last_strikeout_x, middle, int(x_), middle,
|
pain_.line(last_strikeout_x, middle, int(x_), middle,
|
||||||
LColor::strikeout, Painter::line_solid, Painter::line_thin);
|
LColor::strikeout, Painter::line_solid, Painter::line_thin);
|
||||||
running_strikeout = false;
|
running_strikeout = false;
|
||||||
|
101
src/text.C
101
src/text.C
@ -51,7 +51,9 @@
|
|||||||
#include "vspace.h"
|
#include "vspace.h"
|
||||||
#include "WordLangTuple.h"
|
#include "WordLangTuple.h"
|
||||||
|
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/Application.h"
|
||||||
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
|
|
||||||
#include "insets/insettext.h"
|
#include "insets/insettext.h"
|
||||||
@ -89,6 +91,8 @@ using lyx::support::uppercase;
|
|||||||
using lyx::cap::cutSelection;
|
using lyx::cap::cutSelection;
|
||||||
using lyx::cap::pasteParagraphList;
|
using lyx::cap::pasteParagraphList;
|
||||||
|
|
||||||
|
using lyx::frontend::FontMetrics;
|
||||||
|
|
||||||
using std::auto_ptr;
|
using std::auto_ptr;
|
||||||
using std::advance;
|
using std::advance;
|
||||||
using std::distance;
|
using std::distance;
|
||||||
@ -462,13 +466,13 @@ int LyXText::singleWidth(Paragraph const & par,
|
|||||||
Encodings::isComposeChar_hebrew(c))
|
Encodings::isComposeChar_hebrew(c))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return font_metrics::width(c, font);
|
return theApp->fontLoader().metrics(font).width(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c == Paragraph::META_INSET)
|
if (c == Paragraph::META_INSET)
|
||||||
return par.getInset(pos)->width();
|
return par.getInset(pos)->width();
|
||||||
|
|
||||||
return font_metrics::width(c, font);
|
return theApp->fontLoader().metrics(font).width(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -501,7 +505,7 @@ int LyXText::leftMargin(pit_type const pit, pos_type const pos) const
|
|||||||
|
|
||||||
string leftm = tclass.leftmargin();
|
string leftm = tclass.leftmargin();
|
||||||
docstring dleft(leftm.begin(), leftm.end());
|
docstring dleft(leftm.begin(), leftm.end());
|
||||||
l_margin += font_metrics::signedWidth(dleft, params.getFont());
|
l_margin += theApp->fontLoader().metrics(params.getFont()).signedWidth(dleft);
|
||||||
|
|
||||||
if (par.getDepth() != 0) {
|
if (par.getDepth() != 0) {
|
||||||
// find the next level paragraph
|
// find the next level paragraph
|
||||||
@ -527,43 +531,41 @@ int LyXText::leftMargin(pit_type const pit, pos_type const pos) const
|
|||||||
parindent.erase();
|
parindent.erase();
|
||||||
|
|
||||||
LyXFont const labelfont = getLabelFont(par);
|
LyXFont const labelfont = getLabelFont(par);
|
||||||
|
FontMetrics const & labelfont_metrics = theApp->fontLoader().metrics(labelfont);
|
||||||
|
|
||||||
switch (layout->margintype) {
|
switch (layout->margintype) {
|
||||||
case MARGIN_DYNAMIC:
|
case MARGIN_DYNAMIC:
|
||||||
if (!layout->leftmargin.empty()) {
|
if (!layout->leftmargin.empty()) {
|
||||||
string leftm = layout->leftmargin;
|
string leftm = layout->leftmargin;
|
||||||
docstring dleft(leftm.begin(), leftm.end());
|
docstring dleft(leftm.begin(), leftm.end());
|
||||||
l_margin += font_metrics::signedWidth(dleft,
|
l_margin += theApp->fontLoader().metrics(params.getFont()).signedWidth(dleft);
|
||||||
params.getFont());
|
|
||||||
}
|
}
|
||||||
if (!par.getLabelstring().empty()) {
|
if (!par.getLabelstring().empty()) {
|
||||||
string labin = layout->labelindent;
|
string labin = layout->labelindent;
|
||||||
docstring dlabin(labin.begin(), labin.end());
|
docstring dlabin(labin.begin(), labin.end());
|
||||||
l_margin += font_metrics::signedWidth(dlabin,
|
l_margin += labelfont_metrics.signedWidth(dlabin);
|
||||||
labelfont);
|
|
||||||
string labstr = par.getLabelstring();
|
string labstr = par.getLabelstring();
|
||||||
docstring dlabstr(labstr.begin(), labstr.end());
|
docstring dlabstr(labstr.begin(), labstr.end());
|
||||||
l_margin += font_metrics::width(dlabstr,
|
l_margin += labelfont_metrics.width(dlabstr);
|
||||||
labelfont);
|
|
||||||
string labsep = layout->labelsep;
|
string labsep = layout->labelsep;
|
||||||
docstring dlabsep(labsep.begin(), labsep.end());
|
docstring dlabsep(labsep.begin(), labsep.end());
|
||||||
l_margin += font_metrics::width(dlabsep, labelfont);
|
l_margin += labelfont_metrics.width(dlabsep);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MARGIN_MANUAL: {
|
case MARGIN_MANUAL: {
|
||||||
string labin = layout->labelindent;
|
string labin = layout->labelindent;
|
||||||
docstring dlabin(labin.begin(), labin.end());
|
docstring dlabin(labin.begin(), labin.end());
|
||||||
l_margin += font_metrics::signedWidth(dlabin, labelfont);
|
l_margin += labelfont_metrics.signedWidth(dlabin);
|
||||||
// The width of an empty par, even with manual label, should be 0
|
// The width of an empty par, even with manual label, should be 0
|
||||||
if (!par.empty() && pos >= par.beginOfBody()) {
|
if (!par.empty() && pos >= par.beginOfBody()) {
|
||||||
if (!par.getLabelWidthString().empty()) {
|
if (!par.getLabelWidthString().empty()) {
|
||||||
string labstr = par.getLabelWidthString();
|
string labstr = par.getLabelWidthString();
|
||||||
docstring dlabstr(labstr.begin(), labstr.end());
|
docstring dlabstr(labstr.begin(), labstr.end());
|
||||||
l_margin += font_metrics::width(dlabstr,
|
l_margin += labelfont_metrics.width(dlabstr);
|
||||||
labelfont);
|
|
||||||
string labsep = layout->labelsep;
|
string labsep = layout->labelsep;
|
||||||
docstring dlabsep(labsep.begin(), labsep.end());
|
docstring dlabsep(labsep.begin(), labsep.end());
|
||||||
l_margin += font_metrics::width(dlabsep, labelfont);
|
l_margin += labelfont_metrics.width(dlabsep);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -572,8 +574,9 @@ int LyXText::leftMargin(pit_type const pit, pos_type const pos) const
|
|||||||
case MARGIN_STATIC: {
|
case MARGIN_STATIC: {
|
||||||
string leftm = layout->leftmargin;
|
string leftm = layout->leftmargin;
|
||||||
docstring dleft(leftm.begin(), leftm.end());
|
docstring dleft(leftm.begin(), leftm.end());
|
||||||
l_margin += font_metrics::signedWidth(dleft, params.getFont()) * 4
|
l_margin +=
|
||||||
/ (par.getDepth() + 4);
|
theApp->fontLoader().metrics(params.getFont()).signedWidth(dleft)
|
||||||
|
* 4 / (par.getDepth() + 4);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -582,13 +585,11 @@ int LyXText::leftMargin(pit_type const pit, pos_type const pos) const
|
|||||||
if (pos >= par.beginOfBody()) {
|
if (pos >= par.beginOfBody()) {
|
||||||
string leftm = layout->leftmargin;
|
string leftm = layout->leftmargin;
|
||||||
docstring dleft(leftm.begin(), leftm.end());
|
docstring dleft(leftm.begin(), leftm.end());
|
||||||
l_margin += font_metrics::signedWidth(dleft,
|
l_margin += labelfont_metrics.signedWidth(dleft);
|
||||||
labelfont);
|
|
||||||
} else {
|
} else {
|
||||||
string labin = layout->labelindent;
|
string labin = layout->labelindent;
|
||||||
docstring dlabin(labin.begin(), labin.end());
|
docstring dlabin(labin.begin(), labin.end());
|
||||||
l_margin += font_metrics::signedWidth(dlabin,
|
l_margin += labelfont_metrics.signedWidth(dlabin);
|
||||||
labelfont);
|
|
||||||
}
|
}
|
||||||
} else if (pos != 0
|
} else if (pos != 0
|
||||||
// Special case to fix problems with
|
// Special case to fix problems with
|
||||||
@ -598,22 +599,20 @@ int LyXText::leftMargin(pit_type const pit, pos_type const pos) const
|
|||||||
&& !isFirstInSequence(pit, pars_))) {
|
&& !isFirstInSequence(pit, pars_))) {
|
||||||
string leftm = layout->leftmargin;
|
string leftm = layout->leftmargin;
|
||||||
docstring dleft(leftm.begin(), leftm.end());
|
docstring dleft(leftm.begin(), leftm.end());
|
||||||
l_margin += font_metrics::signedWidth(dleft,
|
l_margin += labelfont_metrics.signedWidth(dleft);
|
||||||
labelfont);
|
|
||||||
} else if (layout->labeltype != LABEL_TOP_ENVIRONMENT
|
} else if (layout->labeltype != LABEL_TOP_ENVIRONMENT
|
||||||
&& layout->labeltype != LABEL_BIBLIO
|
&& layout->labeltype != LABEL_BIBLIO
|
||||||
&& layout->labeltype !=
|
&& layout->labeltype !=
|
||||||
LABEL_CENTERED_TOP_ENVIRONMENT) {
|
LABEL_CENTERED_TOP_ENVIRONMENT) {
|
||||||
string labin = layout->labelindent;
|
string labin = layout->labelindent;
|
||||||
docstring dlabin(labin.begin(), labin.end());
|
docstring dlabin(labin.begin(), labin.end());
|
||||||
l_margin += font_metrics::signedWidth(dlabin,
|
l_margin += labelfont_metrics.signedWidth(dlabin);
|
||||||
labelfont);
|
|
||||||
string labsep = layout->labelsep;
|
string labsep = layout->labelsep;
|
||||||
docstring dlabsep(labsep.begin(), labsep.end());
|
docstring dlabsep(labsep.begin(), labsep.end());
|
||||||
l_margin += font_metrics::width(dlabsep, labelfont);
|
l_margin += labelfont_metrics.width(dlabsep);
|
||||||
string labstr = par.getLabelstring();
|
string labstr = par.getLabelstring();
|
||||||
docstring dlabstr(labstr.begin(), labstr.end());
|
docstring dlabstr(labstr.begin(), labstr.end());
|
||||||
l_margin += font_metrics::width(dlabstr, labelfont);
|
l_margin += labelfont_metrics.width(dlabstr);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -630,8 +629,7 @@ int LyXText::leftMargin(pit_type const pit, pos_type const pos) const
|
|||||||
for ( ; rit != end; ++rit)
|
for ( ; rit != end; ++rit)
|
||||||
if (rit->fill() < minfill)
|
if (rit->fill() < minfill)
|
||||||
minfill = rit->fill();
|
minfill = rit->fill();
|
||||||
l_margin += font_metrics::signedWidth(layout->leftmargin,
|
l_margin += theApp->fontLoader().metrics(params.getFont()).signedWidth(layout->leftmargin);
|
||||||
params.getFont());
|
|
||||||
l_margin += minfill;
|
l_margin += minfill;
|
||||||
#endif
|
#endif
|
||||||
// also wrong, but much shorter.
|
// also wrong, but much shorter.
|
||||||
@ -671,7 +669,7 @@ int LyXText::leftMargin(pit_type const pit, pos_type const pos) const
|
|||||||
BufferParams::PARSEP_INDENT))
|
BufferParams::PARSEP_INDENT))
|
||||||
{
|
{
|
||||||
docstring din(parindent.begin(), parindent.end());
|
docstring din(parindent.begin(), parindent.end());
|
||||||
l_margin += font_metrics::signedWidth(din, params.getFont());
|
l_margin += theApp->fontLoader().metrics(params.getFont()).signedWidth(din);
|
||||||
}
|
}
|
||||||
|
|
||||||
return l_margin;
|
return l_margin;
|
||||||
@ -693,12 +691,11 @@ int LyXText::rightMargin(Paragraph const & par) const
|
|||||||
docstring dtrmarg(trmarg.begin(), trmarg.end());
|
docstring dtrmarg(trmarg.begin(), trmarg.end());
|
||||||
string lrmarg = par.layout()->rightmargin;
|
string lrmarg = par.layout()->rightmargin;
|
||||||
docstring dlrmarg(lrmarg.begin(), lrmarg.end());
|
docstring dlrmarg(lrmarg.begin(), lrmarg.end());
|
||||||
|
FontMetrics const & fm = theApp->fontLoader().metrics(params.getFont());
|
||||||
int const r_margin =
|
int const r_margin =
|
||||||
::rightMargin()
|
::rightMargin()
|
||||||
+ font_metrics::signedWidth(dtrmarg,
|
+ fm.signedWidth(dtrmarg)
|
||||||
params.getFont())
|
+ fm.signedWidth(dlrmarg)
|
||||||
+ font_metrics::signedWidth(dlrmarg,
|
|
||||||
params.getFont())
|
|
||||||
* 4 / (par.getDepth() + 4);
|
* 4 / (par.getDepth() + 4);
|
||||||
|
|
||||||
return r_margin;
|
return r_margin;
|
||||||
@ -772,6 +769,7 @@ void LyXText::rowBreakPoint(pit_type const pit, Row & row) const
|
|||||||
FontIterator fi = FontIterator(*this, par, pos);
|
FontIterator fi = FontIterator(*this, par, pos);
|
||||||
pos_type point = end;
|
pos_type point = end;
|
||||||
pos_type i = pos;
|
pos_type i = pos;
|
||||||
|
FontMetrics const & fm = theApp->fontLoader().metrics(getLabelFont(par));
|
||||||
for ( ; i < end; ++i, ++fi) {
|
for ( ; i < end; ++i, ++fi) {
|
||||||
char_type const c = par.getChar(i);
|
char_type const c = par.getChar(i);
|
||||||
int thiswidth = singleWidth(par, i, c, *fi);
|
int thiswidth = singleWidth(par, i, c, *fi);
|
||||||
@ -780,7 +778,7 @@ void LyXText::rowBreakPoint(pit_type const pit, Row & row) const
|
|||||||
if (body_pos && i == body_pos) {
|
if (body_pos && i == body_pos) {
|
||||||
string lsep = layout->labelsep;
|
string lsep = layout->labelsep;
|
||||||
docstring dlsep(lsep.begin(), lsep.end());
|
docstring dlsep(lsep.begin(), lsep.end());
|
||||||
int add = font_metrics::width(dlsep, getLabelFont(par));
|
int add = fm.width(dlsep);
|
||||||
if (par.isLineSeparator(i - 1))
|
if (par.isLineSeparator(i - 1))
|
||||||
add -= singleWidth(par, i - 1);
|
add -= singleWidth(par, i - 1);
|
||||||
|
|
||||||
@ -860,11 +858,13 @@ void LyXText::setRowWidth(pit_type const pit, Row & row) const
|
|||||||
pos_type const body_pos = par.beginOfBody();
|
pos_type const body_pos = par.beginOfBody();
|
||||||
pos_type i = row.pos();
|
pos_type i = row.pos();
|
||||||
|
|
||||||
|
FontMetrics const & fm = theApp->fontLoader().metrics(getLabelFont(par));
|
||||||
|
|
||||||
if (i < end) {
|
if (i < end) {
|
||||||
FontIterator fi = FontIterator(*this, par, i);
|
FontIterator fi = FontIterator(*this, par, i);
|
||||||
for ( ; i < end; ++i, ++fi) {
|
for ( ; i < end; ++i, ++fi) {
|
||||||
if (body_pos > 0 && i == body_pos) {
|
if (body_pos > 0 && i == body_pos) {
|
||||||
w += font_metrics::width(dlsep, getLabelFont(par));
|
w += fm.width(dlsep);
|
||||||
if (par.isLineSeparator(i - 1))
|
if (par.isLineSeparator(i - 1))
|
||||||
w -= singleWidth(par, i - 1);
|
w -= singleWidth(par, i - 1);
|
||||||
w = max(w, labelEnd(pit));
|
w = max(w, labelEnd(pit));
|
||||||
@ -875,7 +875,7 @@ void LyXText::setRowWidth(pit_type const pit, Row & row) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (body_pos > 0 && body_pos >= end) {
|
if (body_pos > 0 && body_pos >= end) {
|
||||||
w += font_metrics::width(dlsep, getLabelFont(par));
|
w += fm.width(dlsep);
|
||||||
if (end > 0 && par.isLineSeparator(end - 1))
|
if (end > 0 && par.isLineSeparator(end - 1))
|
||||||
w -= singleWidth(par, end - 1);
|
w -= singleWidth(par, end - 1);
|
||||||
w = max(w, labelEnd(pit));
|
w = max(w, labelEnd(pit));
|
||||||
@ -908,7 +908,10 @@ int LyXText::labelFill(Paragraph const & par, Row const & row) const
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
docstring dlab(label.begin(), label.end());
|
docstring dlab(label.begin(), label.end());
|
||||||
return max(0, font_metrics::width(dlab, getLabelFont(par)) - w);
|
|
||||||
|
FontMetrics const & fm = theApp->fontLoader().metrics(getLabelFont(par));
|
||||||
|
|
||||||
|
return max(0, fm.width(dlab) - w);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -943,11 +946,14 @@ void LyXText::setHeightOfRow(pit_type const pit, Row & row)
|
|||||||
|
|
||||||
LyXFont labelfont = getLabelFont(par);
|
LyXFont labelfont = getLabelFont(par);
|
||||||
|
|
||||||
|
FontMetrics const & labelfont_metrics = theApp->fontLoader().metrics(labelfont);
|
||||||
|
FontMetrics const & fontmetrics = theApp->fontLoader().metrics(font);
|
||||||
|
|
||||||
// these are minimum values
|
// these are minimum values
|
||||||
double const spacing_val = layout->spacing.getValue() * spacing(par);
|
double const spacing_val = layout->spacing.getValue() * spacing(par);
|
||||||
//lyxerr << "spacing_val = " << spacing_val << endl;
|
//lyxerr << "spacing_val = " << spacing_val << endl;
|
||||||
int maxasc = int(font_metrics::maxAscent(font) * spacing_val);
|
int maxasc = int(fontmetrics.maxAscent() * spacing_val);
|
||||||
int maxdesc = int(font_metrics::maxDescent(font) * spacing_val);
|
int maxdesc = int(fontmetrics.maxDescent() * spacing_val);
|
||||||
|
|
||||||
// insets may be taller
|
// insets may be taller
|
||||||
InsetList::const_iterator ii = par.insetlist.begin();
|
InsetList::const_iterator ii = par.insetlist.begin();
|
||||||
@ -969,8 +975,8 @@ void LyXText::setHeightOfRow(pit_type const pit, Row & row)
|
|||||||
par.highestFontInRange(row.pos(), pos_end, size);
|
par.highestFontInRange(row.pos(), pos_end, size);
|
||||||
if (maxsize > font.size()) {
|
if (maxsize > font.size()) {
|
||||||
font.setSize(maxsize);
|
font.setSize(maxsize);
|
||||||
maxasc = max(maxasc, font_metrics::maxAscent(font));
|
maxasc = max(maxasc, fontmetrics.maxAscent());
|
||||||
maxdesc = max(maxdesc, font_metrics::maxDescent(font));
|
maxdesc = max(maxdesc, fontmetrics.maxDescent());
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is nicer with box insets:
|
// This is nicer with box insets:
|
||||||
@ -1000,7 +1006,7 @@ void LyXText::setHeightOfRow(pit_type const pit, Row & row)
|
|||||||
// layout is printed in an extra row
|
// layout is printed in an extra row
|
||||||
if (layout->counter == "chapter"
|
if (layout->counter == "chapter"
|
||||||
&& !par.params().labelString().empty()) {
|
&& !par.params().labelString().empty()) {
|
||||||
labeladdon = int(font_metrics::maxHeight(labelfont)
|
labeladdon = int(labelfont_metrics.maxHeight()
|
||||||
* layout->spacing.getValue()
|
* layout->spacing.getValue()
|
||||||
* spacing(par));
|
* spacing(par));
|
||||||
}
|
}
|
||||||
@ -1013,7 +1019,7 @@ void LyXText::setHeightOfRow(pit_type const pit, Row & row)
|
|||||||
&& !par.getLabelstring().empty())
|
&& !par.getLabelstring().empty())
|
||||||
{
|
{
|
||||||
labeladdon = int(
|
labeladdon = int(
|
||||||
font_metrics::maxHeight(labelfont)
|
labelfont_metrics.maxHeight()
|
||||||
* layout->spacing.getValue()
|
* layout->spacing.getValue()
|
||||||
* spacing(par)
|
* spacing(par)
|
||||||
+ (layout->topsep + layout->labelbottomsep) * dh);
|
+ (layout->topsep + layout->labelbottomsep) * dh);
|
||||||
@ -1390,7 +1396,7 @@ LyXText::computeRowMetrics(pit_type const pit, Row const & row) const
|
|||||||
{
|
{
|
||||||
string lsep = layout->labelsep;
|
string lsep = layout->labelsep;
|
||||||
docstring dlsep(lsep.begin(), lsep.end());
|
docstring dlsep(lsep.begin(), lsep.end());
|
||||||
result.x += font_metrics::width(dlsep, getLabelFont(par));
|
result.x += theApp->fontLoader().metrics(getLabelFont(par)).width(dlsep);
|
||||||
if (body_pos <= end)
|
if (body_pos <= end)
|
||||||
result.x += result.label_hfill;
|
result.x += result.label_hfill;
|
||||||
}
|
}
|
||||||
@ -2294,15 +2300,14 @@ int LyXText::cursorX(CursorSlice const & sl, bool boundary) const
|
|||||||
// Use font span to speed things up, see below
|
// Use font span to speed things up, see below
|
||||||
FontSpan font_span;
|
FontSpan font_span;
|
||||||
LyXFont font;
|
LyXFont font;
|
||||||
|
FontMetrics const & labelfm = theApp->fontLoader().metrics(getLabelFont(par));
|
||||||
|
|
||||||
for (pos_type vpos = row_pos; vpos < cursor_vpos; ++vpos) {
|
for (pos_type vpos = row_pos; vpos < cursor_vpos; ++vpos) {
|
||||||
pos_type pos = bidi.vis2log(vpos);
|
pos_type pos = bidi.vis2log(vpos);
|
||||||
if (body_pos > 0 && pos == body_pos - 1) {
|
if (body_pos > 0 && pos == body_pos - 1) {
|
||||||
string lsep = par.layout()->labelsep;
|
string lsep = par.layout()->labelsep;
|
||||||
docstring dlsep(lsep.begin(), lsep.end());
|
docstring dlsep(lsep.begin(), lsep.end());
|
||||||
x += m.label_hfill
|
x += m.label_hfill + labelfm.width(dlsep);
|
||||||
+ font_metrics::width(dlsep,
|
|
||||||
getLabelFont(par));
|
|
||||||
if (par.isLineSeparator(body_pos - 1))
|
if (par.isLineSeparator(body_pos - 1))
|
||||||
x -= singleWidth(par, body_pos - 1);
|
x -= singleWidth(par, body_pos - 1);
|
||||||
}
|
}
|
||||||
|
11
src/text2.C
11
src/text2.C
@ -51,7 +51,8 @@
|
|||||||
#include "vspace.h"
|
#include "vspace.h"
|
||||||
|
|
||||||
#include "frontends/Application.h"
|
#include "frontends/Application.h"
|
||||||
#include "frontends/font_metrics.h"
|
#include "frontends/FontLoader.h"
|
||||||
|
#include "frontends/FontMetrics.h"
|
||||||
|
|
||||||
#include "insets/insetenv.h"
|
#include "insets/insetenv.h"
|
||||||
|
|
||||||
@ -804,14 +805,16 @@ pos_type LyXText::getColumnNearX(pit_type const pit,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lyx::frontend::FontMetrics const & fm = theApp->fontLoader().metrics(
|
||||||
|
getLabelFont(par));
|
||||||
|
|
||||||
while (vc < end && tmpx <= x) {
|
while (vc < end && tmpx <= x) {
|
||||||
c = bidi.vis2log(vc);
|
c = bidi.vis2log(vc);
|
||||||
last_tmpx = tmpx;
|
last_tmpx = tmpx;
|
||||||
if (body_pos > 0 && c == body_pos - 1) {
|
if (body_pos > 0 && c == body_pos - 1) {
|
||||||
string lsep = layout->labelsep;
|
string lsep = layout->labelsep;
|
||||||
docstring dlsep(lsep.begin(), lsep.end());
|
docstring dlsep(lsep.begin(), lsep.end());
|
||||||
tmpx += r.label_hfill +
|
tmpx += r.label_hfill + fm.width(dlsep);
|
||||||
font_metrics::width(dlsep, getLabelFont(par));
|
|
||||||
if (par.isLineSeparator(body_pos - 1))
|
if (par.isLineSeparator(body_pos - 1))
|
||||||
tmpx -= singleWidth(par, body_pos - 1);
|
tmpx -= singleWidth(par, body_pos - 1);
|
||||||
}
|
}
|
||||||
@ -1342,5 +1345,5 @@ void LyXText::recUndo(pit_type par) const
|
|||||||
|
|
||||||
int defaultRowHeight()
|
int defaultRowHeight()
|
||||||
{
|
{
|
||||||
return int(font_metrics::maxHeight(LyXFont(LyXFont::ALL_SANE)) * 1.2);
|
return int(theApp->fontLoader().metrics(LyXFont(LyXFont::ALL_SANE)).maxHeight() * 1.2);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user