commit d2e15bd1893e288f3177dbec15b82b723bfca6a6
Author: Jean-Marc Lasgouttes <[email protected]>
Date: Sat Nov 11 11:57:39 2017 +0100
Store change bar information in row element
It is wrong to compute this at paint time. In general, painting a row
should not require any access to a paragraph object, but we are far
from there now.
(cherry picked from commit 4858bb3bb68aac142815b530a017e3776d1c7c11)
---
src/Row.cpp | 5 ++++-
src/Row.h | 7 +++++++
src/RowPainter.cpp | 12 ------------
src/TextMetrics.cpp | 7 ++++++-
4 files changed, 17 insertions(+), 14 deletions(-)
diff --git a/src/Row.cpp b/src/Row.cpp
index db1bd28..20ff63e 100644
--- a/src/Row.cpp
+++ b/src/Row.cpp
@@ -164,7 +164,8 @@ Row::Row()
begin_margin_sel(false), end_margin_sel(false),
changed_(false), crc_(0),
pit_(0), pos_(0), end_(0),
- right_boundary_(false), flushed_(false), rtl_(false)
+ right_boundary_(false), flushed_(false), rtl_(false),
+ changebar_(false)
{}
@@ -371,6 +372,8 @@ void Row::finalizeLast()
if (elt.final)
return;
elt.final = true;
+ if (elt.change.changed())
+ changebar_ = true;
if (elt.type == STRING) {
dim_.wid -= elt.dim.wid;
diff --git a/src/Row.h b/src/Row.h
index 498fd07..a2e77fb 100644
--- a/src/Row.h
+++ b/src/Row.h
@@ -266,6 +266,11 @@ public:
void reverseRTL(bool rtl_par);
///
bool isRTL() const { return rtl_; }
+ ///
+ bool needsChangeBar() const { return changebar_; }
+ ///
+ void needsChangeBar(bool ncb) { changebar_ = ncb; }
+
/// Find row element that contains \c pos, and compute x offset.
const_iterator const findElement(pos_type pos, bool boundary, double &
x) const;
@@ -326,6 +331,8 @@ private:
Dimension dim_;
/// true when this row lives in a right-to-left paragraph
bool rtl_;
+ /// true when a changebar should be drawn in the margin
+ bool changebar_;
};
diff --git a/src/RowPainter.cpp b/src/RowPainter.cpp
index c4b9034..38bcefa 100644
--- a/src/RowPainter.cpp
+++ b/src/RowPainter.cpp
@@ -247,18 +247,6 @@ void RowPainter::paintChange(Row::Element const & e) const
void RowPainter::paintChangeBar() const
{
- pos_type const start = row_.pos();
- pos_type end = row_.endpos();
-
- if (par_.size() == end) {
- // this is the last row of the paragraph;
- // thus, we must also consider the imaginary end-of-par
character
- end++;
- }
-
- if (start == end || !par_.isChanged(start, end))
- return;
-
int const height = tm_.isLastRow(row_)
? row_.ascent()
: row_.height();
diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp
index 325b0b9..cd33f7f 100644
--- a/src/TextMetrics.cpp
+++ b/src/TextMetrics.cpp
@@ -964,6 +964,10 @@ bool TextMetrics::breakRow(Row & row, int const
right_margin) const
row.addVirtual(end, docstring(1, char_type(0x00B6)), f,
Change());
}
+ // Is there a end-of-paragaph change?
+ if (i == end && par.lookupChange(end).changed() && !need_new_row)
+ row.needsChangeBar(true);
+
// if the row is too large, try to cut at last separator. In case
// of success, reset indication that the row was broken abruptly.
int const next_width = max_width_ - leftMargin(row.pit(), row.endpos())
@@ -1937,7 +1941,8 @@ void TextMetrics::drawParagraph(PainterInfo & pi,
pit_type const pit, int const
rp.paintSelection();
rp.paintAppendix();
rp.paintDepthBar();
- rp.paintChangeBar();
+ if (row.needsChangeBar())
+ rp.paintChangeBar();
if (i == 0 && !row.isRTL())
rp.paintFirst();
if (i == nrows - 1 && row.isRTL())