erased_(pi.erased_),
xo_(x), yo_(y), width_(text_metrics_.width())
{
- Buffer const & buffer = *bv_.buffer();
- int const right_margin = text_metrics_.rightMargin(pm_);
RowMetrics m = text_metrics_.computeRowMetrics(pit_, row_);
x_ = m.x + xo_;
pain_.text(int(x_) + dx, yo_, str, font);
}
+
void RowPainter::paintChars(pos_type & vpos, LyXFont const & font,
bool hebrew, bool arabic)
{
str.push_back(c);
}
+ docstring s(&str[0], str.size());
+
if (prev_change != Change::UNCHANGED) {
LyXFont copy(font);
if (prev_change == Change::DELETED) {
} else if (prev_change == Change::INSERTED) {
copy.setColor(LColor::newtext);
}
- x_ += pain_.text(int(x_), yo_, &str[0], str.size(), copy);
+ x_ += pain_.text(int(x_), yo_, s, copy);
} else {
- x_ += pain_.text(int(x_), yo_, &str[0], str.size(), font);
+ x_ += pain_.text(int(x_), yo_, s, font);
}
}
}
-size_type calculateRowSignature(Row const & row, Paragraph const & par,
- int x, int y)
-{
- boost::crc_32_type crc;
- for (pos_type i = row.pos(); i < row.endpos(); ++i) {
- char_type const b[] = { par.getChar(i) };
- crc.process_bytes(b, 1);
- }
- char_type const b[] = { x, y, row.width() };
- crc.process_bytes(b, 3);
- return crc.checksum();
-}
-
-
bool CursorOnRow(PainterInfo & pi, pit_type const pit,
RowList::const_iterator rit, LyXText const & text)
{
bool tmp = refreshInside;
// Row signature; has row changed since last paint?
- size_type const row_sig = calculateRowSignature(*rit, par, x, y);
- bool row_has_changed = pm.rowSignature()[rowno] != row_sig;
+ bool row_has_changed = pm.rowChangeStatus()[rowno];
bool cursor_on_row = CursorOnRow(pi, pit, rit, text);
bool in_inset_alone_on_row = innerCursorOnRow(pi, pit, rit,
// from cache, or cursor is inside an inset _on this row_,
// then paint the row
if (repaintAll || row_has_changed || cursor_on_row) {
- // Add to row signature cache
- pm.rowSignature()[rowno] = row_sig;
-
bool const inside = (y + rit->descent() >= 0
&& y - rit->ascent() < ww);
// it is not needed to draw on screen if we are not inside.
PainterInfo pi(const_cast<BufferView *>(&bv), pain);
// Should the whole screen, including insets, be refreshed?
- bool repaintAll = select || !vi.singlepar;
+ // FIXME: We should also distinguish DecorationUpdate to avoid text
+ // drawing if possible. This is not possible to do easily right now
+ // because of the single backing pixmap.
+ bool repaintAll = select || vi.update_strategy != SingleParUpdate;
if (repaintAll) {
// Clear background (if not delegated to rows)
// and grey out above (should not happen later)
// lyxerr << "par ascent: " << text.getPar(vi.p1).ascent() << endl;
- if (vi.y1 > 0 && !vi.singlepar)
+ if (vi.y1 > 0 && vi.update_strategy != SingleParUpdate)
pain.fillRectangle(0, 0, bv.workWidth(), vi.y1, LColor::bottomarea);
// and possibly grey out below
// lyxerr << "par descent: " << text.getPar(vi.p1).ascent() << endl;
- if (vi.y2 < bv.workHeight() && !vi.singlepar)
+ if (vi.y2 < bv.workHeight() && vi.update_strategy != SingleParUpdate)
pain.fillRectangle(0, vi.y2, bv.workWidth(), bv.workHeight() - vi.y2, LColor::bottomarea);
}