X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FMathData.cpp;h=610a3e20eb64ebae7e237f77baa6c67ccf8ff5bf;hb=43b16548b473d93b26489d8c4bbd9bf1e903a35f;hp=d242a86f72c2d228c16a6a98b399e9457d4251a9;hpb=02028c0b12ba94093e4e77494e7158a58f1631e5;p=lyx.git diff --git a/src/mathed/MathData.cpp b/src/mathed/MathData.cpp index d242a86f72..610a3e20eb 100644 --- a/src/mathed/MathData.cpp +++ b/src/mathed/MathData.cpp @@ -27,6 +27,7 @@ #include "BufferView.h" #include "CoordCache.h" #include "Cursor.h" +#include "Dimension.h" #include "mathed/InsetMathUnknown.h" @@ -37,7 +38,6 @@ #include "support/docstream.h" #include "support/gettext.h" #include "support/lassert.h" -#include "support/lyxalgo.h" #include @@ -47,11 +47,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) + : base_type(from, to), 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,13 +266,14 @@ bool isInside(DocIterator const & it, MathData const & ar, #endif -void MathData::metrics(MetricsInfo & mi, Dimension & dim) const +void MathData::metrics(MetricsInfo & mi, Dimension & dim, bool tight) const { frontend::FontMetrics const & fm = theFontMetrics(mi.base.font); - dim = fm.dimension('I'); - int xascent = fm.dimension('x').ascent(); - if (xascent >= dim.asc) - xascent = (2 * dim.asc) / 3; + BufferView * bv = mi.base.bv; + int const Iascent = fm.dimension('I').ascent(); + int xascent = fm.xHeight(); + if (xascent >= Iascent) + xascent = (2 * Iascent) / 3; minasc_ = xascent; mindes_ = (3 * xascent) / 4; slevel_ = (4 * xascent) / 5; @@ -273,11 +281,32 @@ void MathData::metrics(MetricsInfo & mi, Dimension & dim) const MathRow mrow(mi, this); mrow.metrics(mi, dim); - mrow_cache_[mi.base.bv] = mrow; - kerning_ = mrow.kerning(mi.base.bv); - // Cache the dimension. - mi.base.bv->coordCache().arrays().add(this, 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.xHeight()); + else { + dim.asc = max(dim.asc, fm.maxAscent()); + dim.des = max(dim.des, fm.maxDescent()); + } + + // This is one of the the few points where the drawing font is known, + // so that we can set the caret vertical dimensions. + mrow.caret_dim.asc = min(dim.asc, fm.maxAscent()); + mrow.caret_dim.des = min(dim.des, fm.maxDescent()); + mrow.caret_dim.wid = fm.lineWidth(); + + /// do the same for math cells linearized in the row + MathRow caret_row = MathRow(mrow.caret_dim); + 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); } @@ -294,7 +323,7 @@ void MathData::drawSelection(PainterInfo & pi, int const x, int const y) const MathData const & c1 = inset->cell(s1.idx()); if (s1.idx() == s2.idx() && &c1 == this) { - // selection indide cell + // selection inside cell Dimension const dim = bv->coordCache().getArrays().dim(&c1); int const beg = c1.pos2x(bv, s1.pos()); int const end = c1.pos2x(bv, s2.pos()); @@ -321,7 +350,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); } @@ -344,20 +373,26 @@ void MathData::drawT(TextPainter & pain, int x, int y) const // FIXME: Abdel 16/10/2006 // This drawT() method is never used, this is dead code. - for (const_iterator it = begin(), et = end(); it != et; ++it) { - (*it)->drawT(pain, x, y); - //x += (*it)->width_; + for (auto const & it : *this) { + it->drawT(pain, x, y); + //x += it->width_; x += 2; } } -void MathData::updateBuffer(ParIterator const & it, UpdateType utype) +int MathData::kerning(BufferView const * bv) const +{ + return bv->mathRow(this).kerning(bv); +} + + +void MathData::updateBuffer(ParIterator const & it, UpdateType utype, bool const deleted) { // pass down for (size_t i = 0, n = size(); i != n; ++i) { MathAtom & at = operator[](i); - at.nucleus()->updateBuffer(it, utype); + at.nucleus()->updateBuffer(it, utype, deleted); } } @@ -932,6 +967,18 @@ MathClass MathData::mathClass() const } +MathClass MathData::lastMathClass() const +{ + MathClass res = MC_ORD; + for (MathAtom const & at : *this) { + MathClass mc = at->mathClass(); + if (mc != MC_UNKNOWN) + res = mc; + } + return res; +} + + ostream & operator<<(ostream & os, MathData const & ar) { odocstringstream oss;