]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/MathData.cpp
Preserve \inputencoding value when switching to non-TeX fonts.
[lyx.git] / src / mathed / MathData.cpp
index 87b1820cba7d81b38a5c76b8e39c7e324d73fd69..0676dc732a7b72490c428331f12ec669f4931a93 100644 (file)
@@ -52,6 +52,14 @@ MathData::MathData(Buffer * buf, const_iterator from, const_iterator to)
 {}
 
 
+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 +267,6 @@ 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);
@@ -280,8 +281,7 @@ 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;
+       mrow.metrics(mi, dim);
        kerning_ = mrow.kerning(bv);
 
        // Set a minimal ascent/descent for the cell
@@ -296,12 +296,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 +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);
 }