]> git.lyx.org Git - lyx.git/blobdiff - src/TextMetrics.cpp
de.po
[lyx.git] / src / TextMetrics.cpp
index 0d60e0bcdd4b1f02d86598e8d7bf8c97058fbd4a..c4ed9ca4af607d7ae46a2c71d108410b8dd643f5 100644 (file)
@@ -43,6 +43,7 @@
 
 #include "frontends/FontMetrics.h"
 #include "frontends/Painter.h"
+#include "frontends/NullPainter.h"
 
 #include "support/debug.h"
 #include "support/lassert.h"
@@ -97,7 +98,7 @@ int numberOfHfills(Row const & row, ParagraphMetrics const & pm,
 }
 
 
-}
+} // namespace
 
 /////////////////////////////////////////////////////////////////////
 //
@@ -198,6 +199,14 @@ bool TextMetrics::metrics(MetricsInfo & mi, Dimension & dim, int min_width)
 }
 
 
+void TextMetrics::updatePosCache(pit_type pit) const
+{
+       frontend::NullPainter np;
+       PainterInfo pi(bv_, np);
+       drawParagraph(pi, pit, origin_.x_, par_metrics_[pit].position());
+}
+
+
 int TextMetrics::rightMargin(ParagraphMetrics const & pm) const
 {
        return text_->isMainText() ? pm.rightMargin(*bv_) : 0;
@@ -640,8 +649,10 @@ void TextMetrics::computeRowMetrics(Row & row, int width) const
                        break;
                case LYX_ALIGN_LEFT:
                        // a displayed inset that is flushed
-                       if (Inset const * inset = par.getInset(row.pos()))
+                       if (Inset const * inset = par.getInset(row.pos())) {
                                row.left_margin += inset->indent(*bv_);
+                               row.dimension().wid += inset->indent(*bv_);
+                       }
                        break;
                case LYX_ALIGN_RIGHT:
                        if (Inset const * inset = par.getInset(row.pos())) {
@@ -806,7 +817,7 @@ private:
        pos_type bodypos_;
 };
 
-} // anon namespace
+} // namespace
 
 /** This is the function where the hard work is done. The code here is
  * very sensitive to small changes :) Note that part of the
@@ -966,7 +977,8 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const
        int const next_width = max_width_ - leftMargin(row.pit(), row.endpos())
                - rightMargin(row.pit());
 
-       row.shortenIfNeeded(body_pos, width, next_width);
+       if (row.shortenIfNeeded(body_pos, width, next_width))
+               row.flushed(false);
        row.right_boundary(!row.empty() && row.endpos() < end
                           && row.back().endpos == row.endpos());
        // Last row in paragraph is flushed
@@ -1219,6 +1231,7 @@ void TextMetrics::newParMetricsDown()
        redoParagraph(pit);
        par_metrics_[pit].setPosition(last.second.position()
                + last.second.descent() + par_metrics_[pit].ascent());
+       updatePosCache(pit);
 }
 
 
@@ -1233,6 +1246,7 @@ void TextMetrics::newParMetricsUp()
        redoParagraph(pit);
        par_metrics_[pit].setPosition(first.second.position()
                - first.second.ascent() - par_metrics_[pit].descent());
+       updatePosCache(pit);
 }
 
 // y is screen coordinate
@@ -1802,8 +1816,8 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const
                return;
        size_t const nrows = pm.rows().size();
 
-       // Use fast lane when drawing is disabled.
-       if (!pi.pain.isDrawingEnabled()) {
+       // Use fast lane in nodraw stage.
+       if (pi.pain.isNull()) {
                for (size_t i = 0; i != nrows; ++i) {
 
                        Row const & row = pm.rows()[i];
@@ -1855,17 +1869,11 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const
                if (i)
                        y += row.ascent();
 
-               RowPainter rp(pi, *text_, row, row_x, y);
-
                // It is not needed to draw on screen if we are not inside.
                bool const inside = (y + row.descent() >= 0
                        && y - row.ascent() < ww);
-               pi.pain.setDrawingEnabled(inside);
                if (!inside) {
-                       // Paint only the insets to set inset cache correctly
-                       // FIXME: remove paintOnlyInsets when we know that positions
-                       // have already been set.
-                       rp.paintOnlyInsets();
+                       // Inset positions have already been set in nodraw stage.
                        y += row.descent();
                        continue;
                }
@@ -1887,13 +1895,16 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const
                // Row signature; has row changed since last paint?
                row.setCrc(pm.computeRowSignature(row, *bv_));
                bool row_has_changed = row.changed()
-                       || bv_->hadHorizScrollOffset(text_, pit, row.pos());
+                       || bv_->hadHorizScrollOffset(text_, pit, row.pos())
+                       || bv_->needRepaint(text_, row);
 
                // Take this opportunity to spellcheck the row contents.
                if (row_has_changed && pi.do_spellcheck && lyxrc.spellcheck_continuously) {
                        text_->getPar(pit).spellCheck();
                }
 
+               RowPainter rp(pi, *text_, row, row_x, y);
+
                // Don't paint the row if a full repaint has not been requested
                // and if it has not changed.
                if (!pi.full_repaint && !row_has_changed) {
@@ -1917,14 +1928,14 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const
                // Instrumentation for testing row cache (see also
                // 12 lines lower):
                if (lyxerr.debugging(Debug::PAINTING)
-                       && (row.selection() || pi.full_repaint || row_has_changed)) {
-                               string const foreword = text_->isMainText() ?
-                                       "main text redraw " : "inset text redraw: ";
-                       LYXERR(Debug::PAINTING, foreword << "pit=" << pit << " row=" << i
+                   && (row.selection() || pi.full_repaint || row_has_changed)) {
+                       string const foreword = text_->isMainText() ? "main text redraw "
+                               : "inset text redraw: ";
+                       LYXERR0(foreword << "pit=" << pit << " row=" << i
                                << " row_selection="    << row.selection()
                                << " full_repaint="     << pi.full_repaint
                                << " row_has_changed="  << row_has_changed
-                               << " drawingEnabled=" << pi.pain.isDrawingEnabled());
+                               << " null painter=" << pi.pain.isNull());
                }
 
                // Backup full_repaint status and force full repaint
@@ -1952,8 +1963,6 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const
                // Restore full_repaint status.
                pi.full_repaint = tmp;
        }
-       // Re-enable screen drawing for future use of the painter.
-       pi.pain.setDrawingEnabled(true);
 
        //LYXERR(Debug::PAINTING, ".");
 }