use the FontSpan trick in drawing as well

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@10326 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2005-07-18 14:25:20 +00:00
parent df6d16e689
commit 1e65605e25
3 changed files with 40 additions and 51 deletions

View File

@ -1527,17 +1527,18 @@ void Buffer::buildMacros()
pimpl_->macros = MacroTable::globalMacros();
// Now add our own.
ParagraphList & pars = text().paragraphs();
ParagraphList const & pars = text().paragraphs();
for (size_t i = 0, n = pars.size(); i != n; ++i) {
//lyxerr << "searching main par " << i
// << " for macro definitions" << std::endl;
InsetList::iterator it = pars[i].insetlist.begin();
InsetList::iterator end = pars[i].insetlist.end();
InsetList const & insets = pars[i].insetlist;
InsetList::const_iterator it = insets.begin();
InsetList::const_iterator end = insets.end();
for ( ; it != end; ++it) {
//lyxerr << "found inset code " << it->inset->lyxCode() << std::endl;
if (it->inset->lyxCode() == InsetBase::MATHMACRO_CODE) {
MathMacroTemplate & mac
= static_cast<MathMacroTemplate &>(*it->inset);
MathMacroTemplate const & mac
= static_cast<MathMacroTemplate const &>(*it->inset);
insertMacro(mac.name(), mac.asMacroData());
}
}

View File

@ -48,10 +48,14 @@ class TexRow;
class FontSpan {
public:
FontSpan() : first(0), last(0) {}
/// Invalid font span containing no character
FontSpan() : first(0), last(-1) {}
/// Span including first and last
FontSpan(lyx::pos_type f, lyx::pos_type l) : first(f), last(l) {}
lyx::pos_type first;
lyx::pos_type last;
public:
/// Range including first and last.
lyx::pos_type first, last;
};

View File

@ -81,16 +81,9 @@ private:
/// return left margin
int leftMargin() const;
/// return the font at the given pos
LyXFont const getFont(lyx::pos_type pos) const;
/// return the label font for this row
LyXFont const getLabelFont() const;
/// return pixel width for the given pos
int singleWidth(lyx::pos_type pos) const;
int singleWidth(lyx::pos_type pos, char c) const;
/// bufferview to paint on
BufferView const & bv_;
@ -140,28 +133,6 @@ RowPainter::RowPainter(PainterInfo & pi,
}
/// "temporary"
LyXFont const RowPainter::getFont(pos_type pos) const
{
LyXFont pf(text_.getFont(par_, pos));
text_.applyOuterFont(pf);
return pf;
}
int RowPainter::singleWidth(lyx::pos_type pos) const
{
return text_.singleWidth(par_, pos);
}
int RowPainter::singleWidth(lyx::pos_type pos, char c) const
{
LyXFont const & font = text_.getFont(par_, pos);
return text_.singleWidth(par_, pos, c, font);
}
LyXFont const RowPainter::getLabelFont() const
{
return text_.getLabelFont(par_);
@ -206,7 +177,8 @@ void RowPainter::paintHebrewComposeChar(pos_type & vpos, LyXFont const & font)
c = par_.getChar(i);
if (!Encodings::IsComposeChar_hebrew(c)) {
if (IsPrintableNonspace(c)) {
int const width2 = singleWidth(i, c);
int const width2 =
text_.singleWidth(par_, i, c, text_.getFont(par_, i));
// dalet / resh
dx = (c == 'ø' || c == 'ã')
? width2 - width
@ -239,7 +211,8 @@ void RowPainter::paintArabicComposeChar(pos_type & vpos, LyXFont const & font)
c = par_.getChar(i);
if (!Encodings::IsComposeChar_arabic(c)) {
if (IsPrintableNonspace(c)) {
int const width2 = singleWidth(i, c);
int const width2 =
text_.singleWidth(par_, i, c, text_.getFont(par_, i));
dx = (width2 - width) / 2;
}
break;
@ -321,8 +294,8 @@ void RowPainter::paintForeignMark(double orig_x, LyXFont const & font)
void RowPainter::paintFromPos(pos_type & vpos)
{
pos_type const pos = text_.bidi.vis2log(vpos);
LyXFont const & orig_font = getFont(pos);
LyXFont orig_font = text_.getFont(par_, pos);
text_.applyOuterFont(orig_font);
double const orig_x = x_;
@ -338,9 +311,9 @@ void RowPainter::paintFromPos(pos_type & vpos)
// usual characters, no insets
// special case languages
bool const hebrew = (orig_font.language()->lang() == "hebrew");
bool const arabic =
orig_font.language()->lang() == "arabic" &&
std::string const & lang = orig_font.language()->lang();
bool const hebrew = lang == "hebrew";
bool const arabic = lang == "arabic" &&
(lyxrc.font_norm_type == LyXRC::ISO_8859_6_8 ||
lyxrc.font_norm_type == LyXRC::ISO_10646_1);
@ -549,11 +522,10 @@ void RowPainter::paintFirst()
if (!par_.getLabelstring().empty()) {
string const str = par_.getLabelstring();
double spacing_val = 1.0;
if (!parparams.spacing().isDefault()) {
if (!parparams.spacing().isDefault())
spacing_val = parparams.spacing().getValue();
} else {
else
spacing_val = buffer.params().spacing().getValue();
}
int maxdesc =
int(font_metrics::maxDescent(font) * layout->spacing.getValue() * spacing_val
@ -629,6 +601,10 @@ void RowPainter::paintText()
bool is_struckout = false;
int last_strikeout_x = 0;
// Use font span to speed things up, see below
FontSpan font_span;
LyXFont font;
for (pos_type vpos = row_.pos(); vpos < end; ) {
if (x_ > bv_.workWidth())
break;
@ -640,7 +616,15 @@ void RowPainter::paintText()
continue;
}
const int width_pos = singleWidth(pos);
// Use font span to speed things up, see above
if (vpos < font_span.first || vpos > font_span.last) {
font_span = par_.fontSpan(vpos);
font = text_.getFont(par_, vpos);
}
const int width_pos =
text_.singleWidth(par_, vpos, par_.getChar(vpos), font);
if (x_ + width_pos < 0) {
x_ += width_pos;
++vpos;
@ -657,10 +641,10 @@ void RowPainter::paintText()
bool const highly_editable_inset = par_.isInset(pos)
&& isHighlyEditableInset(par_.getInset(pos));
// if we reach the end of a struck out range, paint it
// we also don't paint across things like tables
// If we reach the end of a struck out range, paint it.
// We also don't paint across things like tables
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 =
yo_ - font_metrics::maxAscent(text_.defaultfont_) / 3;
pain_.line(last_strikeout_x, middle, int(x_), middle,