X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FMathData.cpp;h=9bfd558fe2856d8e1475648b8c9b1963255cf25a;hb=59fa0b25928b43c8d32d19a6193dc3bd07716947;hp=07decba9e5d26f4f66079e127a61e208ba017b18;hpb=a3868e40a40853bf3500ec4b3fb1a152f846464c;p=lyx.git diff --git a/src/mathed/MathData.cpp b/src/mathed/MathData.cpp index 07decba9e5..9bfd558fe2 100644 --- a/src/mathed/MathData.cpp +++ b/src/mathed/MathData.cpp @@ -48,10 +48,18 @@ namespace lyx { MathData::MathData(Buffer * buf, const_iterator from, const_iterator to) : base_type(from, to), minasc_(0), mindes_(0), slevel_(0), - sshift_(0), kerning_(0), buffer_(buf) + sshift_(0), buffer_(buf) {} +void MathData::setBuffer(Buffer & b) +{ + buffer_ = &b; + for (MathAtom & at : *this) + at.nucleus()->setBuffer(b); +} + + MathAtom & MathData::operator[](pos_type pos) { LBUFERR(pos < size()); @@ -259,19 +267,12 @@ bool isInside(DocIterator const & it, MathData const & ar, #endif -bool MathData::hasCaret(BufferView * bv) const -{ - Cursor & cur = bv->cursor(); - return cur.inMathed() && &cur.cell() == this; -} - - void MathData::metrics(MetricsInfo & mi, Dimension & dim, bool tight) const { frontend::FontMetrics const & fm = theFontMetrics(mi.base.font); BufferView * bv = mi.base.bv; int const Iascent = fm.dimension('I').ascent(); - int xascent = fm.dimension('x').ascent(); + int xascent = fm.xHeight(); if (xascent >= Iascent) xascent = (2 * Iascent) / 3; minasc_ = xascent; @@ -280,15 +281,13 @@ void MathData::metrics(MetricsInfo & mi, Dimension & dim, bool tight) const sshift_ = xascent / 4; MathRow mrow(mi, this); - bool has_caret = mrow.metrics(mi, dim); - mrow_cache_[bv] = mrow; - kerning_ = mrow.kerning(bv); + mrow.metrics(mi, dim); // Set a minimal ascent/descent for the cell if (tight) // FIXME: this is the minimal ascent seen empirically, check // what the TeXbook says. - dim.asc = max(dim.asc, fm.ascent('x')); + dim.asc = max(dim.asc, fm.xHeight()); else { dim.asc = max(dim.asc, fm.maxAscent()); dim.des = max(dim.des, fm.maxDescent()); @@ -296,12 +295,16 @@ void MathData::metrics(MetricsInfo & mi, Dimension & dim, bool tight) const // This is one of the the few points where the drawing font is known, // so that we can set the caret vertical dimensions. - has_caret |= hasCaret(bv); - if (has_caret) - bv->setCaretAscentDescent(min(dim.asc, fm.maxAscent()), - min(dim.des, fm.maxDescent())); - - // Cache the dimension. + mrow.caret_ascent = min(dim.asc, fm.maxAscent()); + mrow.caret_descent = min(dim.des, fm.maxDescent()); + /// do the same for math cells linearized in the row + MathRow caret_row = MathRow(mrow.caret_ascent, mrow.caret_descent); + for (auto const & e : mrow) + if (e.type == MathRow::BEGIN && e.ar) + bv->setMathRow(e.ar, caret_row); + + // Cache row and dimension. + bv->setMathRow(this, mrow); bv->coordCache().arrays().add(this, dim); } @@ -346,7 +349,7 @@ void MathData::draw(PainterInfo & pi, int const x, int const y) const setXY(*pi.base.bv, x, y); drawSelection(pi, x, y); - MathRow const & mrow = mrow_cache_[pi.base.bv]; + MathRow const & mrow = pi.base.bv->mathRow(this); mrow.draw(pi, x, y); } @@ -377,6 +380,12 @@ void MathData::drawT(TextPainter & pain, int x, int y) const } +int MathData::kerning(BufferView const * bv) const +{ + return bv->mathRow(this).kerning(bv); +} + + void MathData::updateBuffer(ParIterator const & it, UpdateType utype) { // pass down