Cleanup: BufferView should not need to be friend of TextMetrics

It did access par_metrics_[] directly because there was no non-const
parMetrics().

This patch adds one and unfriends BufferView. The code is equivalent
since in all these cases, the metrics have just been computed with
redoParagraph().
This commit is contained in:
Jean-Marc Lasgouttes 2020-07-14 00:08:07 +02:00
parent 2e8c9cfc83
commit 501f4e848f
3 changed files with 13 additions and 6 deletions

View File

@ -2788,7 +2788,7 @@ bool BufferView::singleParUpdate()
// (if this paragraph contains insets etc., rebreaking will // (if this paragraph contains insets etc., rebreaking will
// recursively descend) // recursively descend)
tm.redoParagraph(bottom_pit); tm.redoParagraph(bottom_pit);
ParagraphMetrics & pm = tm.par_metrics_[bottom_pit]; ParagraphMetrics & pm = tm.parMetrics(bottom_pit);
if (pm.height() != old_dim.height()) { if (pm.height() != old_dim.height()) {
// Paragraph height has changed so we cannot proceed to // Paragraph height has changed so we cannot proceed to
// the singlePar optimisation. // the singlePar optimisation.
@ -2845,7 +2845,7 @@ void BufferView::updateMetrics(Update::flags & update_flags)
// Rebreak anchor paragraph. // Rebreak anchor paragraph.
tm.redoParagraph(d->anchor_pit_); tm.redoParagraph(d->anchor_pit_);
ParagraphMetrics & anchor_pm = tm.par_metrics_[d->anchor_pit_]; ParagraphMetrics & anchor_pm = tm.parMetrics(d->anchor_pit_);
// position anchor // position anchor
if (d->anchor_pit_ == 0) { if (d->anchor_pit_ == 0) {
@ -2872,7 +2872,7 @@ void BufferView::updateMetrics(Update::flags & update_flags)
pit_type pit1 = d->anchor_pit_ - 1; pit_type pit1 = d->anchor_pit_ - 1;
for (; pit1 >= 0 && y1 >= 0; --pit1) { for (; pit1 >= 0 && y1 >= 0; --pit1) {
tm.redoParagraph(pit1); tm.redoParagraph(pit1);
ParagraphMetrics & pm = tm.par_metrics_[pit1]; ParagraphMetrics & pm = tm.parMetrics(pit1);
y1 -= pm.descent(); y1 -= pm.descent();
// Save the paragraph position in the cache. // Save the paragraph position in the cache.
pm.setPosition(y1); pm.setPosition(y1);
@ -2886,7 +2886,7 @@ void BufferView::updateMetrics(Update::flags & update_flags)
pit_type pit2 = d->anchor_pit_ + 1; pit_type pit2 = d->anchor_pit_ + 1;
for (; pit2 < npit && y2 <= height_; ++pit2) { for (; pit2 < npit && y2 <= height_; ++pit2) {
tm.redoParagraph(pit2); tm.redoParagraph(pit2);
ParagraphMetrics & pm = tm.par_metrics_[pit2]; ParagraphMetrics & pm = tm.parMetrics(pit2);
y2 += pm.ascent(); y2 += pm.ascent();
// Save the paragraph position in the cache. // Save the paragraph position in the cache.
pm.setPosition(y2); pm.setPosition(y2);

View File

@ -185,6 +185,12 @@ ParagraphMetrics const & TextMetrics::parMetrics(pit_type pit) const
} }
ParagraphMetrics & TextMetrics::parMetrics(pit_type pit)
{
return parMetrics(pit, true);
}
void TextMetrics::newParMetricsDown() void TextMetrics::newParMetricsDown()
{ {
pair<pit_type, ParagraphMetrics> const & last = *par_metrics_.rbegin(); pair<pit_type, ParagraphMetrics> const & last = *par_metrics_.rbegin();

View File

@ -60,9 +60,11 @@ public:
/// ///
Point const & origin() const { return origin_; } Point const & origin() const { return origin_; }
/// ///
ParagraphMetrics const & parMetrics(pit_type) const; ParagraphMetrics const & parMetrics(pit_type) const;
///
ParagraphMetrics & parMetrics(pit_type);
/// ///
void newParMetricsDown(); void newParMetricsDown();
/// ///
@ -240,7 +242,6 @@ public:
Dimension & dim) const; Dimension & dim) const;
private: private:
friend class BufferView;
/// The BufferView owner. /// The BufferView owner.
BufferView * bv_; BufferView * bv_;