diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 96c7dfe55f..58e4f8640f 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -2645,6 +2645,7 @@ bool BufferView::singleParUpdate() // the singlePar optimisation. return false; + tm.updatePosCache(bottom_pit); d->update_strategy_ = SingleParUpdate; LYXERR(Debug::PAINTING, "\ny1: " << pm.position() - pm.ascent() @@ -2698,6 +2699,7 @@ void BufferView::updateMetrics() } } anchor_pm.setPosition(d->anchor_ypos_); + tm.updatePosCache(d->anchor_pit_); LYXERR(Debug::PAINTING, "metrics: " << " anchor pit = " << d->anchor_pit_ @@ -2713,6 +2715,7 @@ void BufferView::updateMetrics() y1 -= pm.descent(); // Save the paragraph position in the cache. pm.setPosition(y1); + tm.updatePosCache(pit1); y1 -= pm.ascent(); } @@ -2726,6 +2729,7 @@ void BufferView::updateMetrics() y2 += pm.ascent(); // Save the paragraph position in the cache. pm.setPosition(y2); + tm.updatePosCache(pit2); y2 += pm.descent(); } diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 52717400d5..5eb85bf118 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -43,6 +43,7 @@ #include "frontends/FontMetrics.h" #include "frontends/Painter.h" +#include "frontends/NullPainter.h" #include "support/debug.h" #include "support/lassert.h" @@ -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; @@ -1214,6 +1223,7 @@ void TextMetrics::newParMetricsDown() redoParagraph(pit); par_metrics_[pit].setPosition(last.second.position() + last.second.descent() + par_metrics_[pit].ascent()); + updatePosCache(pit); } @@ -1228,6 +1238,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 diff --git a/src/TextMetrics.h b/src/TextMetrics.h index 3000b218bf..ae99490955 100644 --- a/src/TextMetrics.h +++ b/src/TextMetrics.h @@ -62,6 +62,11 @@ public: /// void newParMetricsUp(); + /// The "nodraw" drawing stage for one single paragraph: set the + /// positions of the insets contained this paragraph in metrics + /// cache. Related to BufferView::updatePosCache. + void updatePosCache(pit_type pit) const; + /// Gets the fully instantiated font at a given position in a paragraph /// Basically the same routine as Paragraph::getFont() in Paragraph.cpp. /// The difference is that this one is used for displaying, and thus we