Honor Update::SinglePar properly

The SinglePar update flags has been a no-op for a long time without
naybody noticing. This means that the current paragraph was
always rebroken and redrawn, even when only moving the cursor around.

Now we only do that when Update::SinglePar has been specified. This
means that there may be cases where update will not be correct
anymore, because this flag has not been specified. These places will
have to be found and fixed.

Update PAINTING_ANALYSIS.
This commit is contained in:
Jean-Marc Lasgouttes 2019-02-20 12:01:44 +01:00
parent a298fc55d9
commit 9bdc0dab31
2 changed files with 14 additions and 32 deletions

View File

@ -20,15 +20,9 @@ following section. Some actions are proposed.
** SinglePar update ** SinglePar update
The flag Update::SinglePar is set in many places but never acted on. This flag only has an effect in the current BufferView, but I think it
Instead, metrics update is skipped whenever the recorded height of is useful in other views too. Doing this will require some work on the
current paragraph did not change and Update::Force was not specified. update pipeline, though.
Is it better to keep that (which incurs extra work) or to condition it
on Update::SinglePar? If the first solution is kept, the flag
SingleParUpdate shall be removed.
Moreover, I fail to see (yet) where the 'single' part of the program
is acted on.
** Buffer::change issues ** Buffer::change issues
@ -40,6 +34,7 @@ a good value? NoScreenUpdate?
On a related note, what is the semantics of a call to On a related note, what is the semantics of a call to
Buffer::changed(false)? What does the caller mean? Buffer::changed(false)? What does the caller mean?
** How to avoid redraw with FitCursor when the cursor is already OK? ** How to avoid redraw with FitCursor when the cursor is already OK?
In this case, we invoke Buffer::change(false) with drawing disabled In this case, we invoke Buffer::change(false) with drawing disabled
@ -60,12 +55,6 @@ cursor.
* Clean-up of drawing code * Clean-up of drawing code
** Make SinglePar update flag useful again.
The current code can be very expensive when moving cursor inside a
huge table, for example. We should test the flag again, although this
will probably lead to some glitches here and there.
** Set Row::changed() in a finer way ** Set Row::changed() in a finer way
*** singleParUpdate *** singleParUpdate
@ -139,15 +128,14 @@ DecorationUpdate). It triggers a recomputation of the metrics when either:
+ Update::Force has been specified + Update::Force has been specified
+ Update::FitCursor has been specified and there is a need to scroll + Update::FitCursor has been specified and there is a need to scroll
the display. the display.
+ the current paragraph, after rebreak, does not have the same height as in + Update::SinglePar has been specified and the current paragraph has
existing metrics. Note that the Update::SinglePar flag is *never* not changed height.
taken into account.
If a computation of metrics has taken place, Force is removed from the If a computation of metrics has taken place, Force is removed from the
flags and ForceDraw is added instead. flags and ForceDraw is added instead.
It is OK to call processUptateFlags several times before an update. In It is OK to call processUpateFlags several times before an update. In
this case, the effects are cumulative.processUpdateFlags execute the this case, the effects are cumulative. processUpdateFlags executes the
metrics-related actions, but defers the actual drawing to the next metrics-related actions, but defers the actual drawing to the next
paint event. paint event.

View File

@ -500,11 +500,6 @@ void BufferView::processUpdateFlags(Update::flags flags)
*/ */
buffer_.updateMacros(); buffer_.updateMacros();
// SinglePar is ignored for now (this should probably change). We
// set it ourselves below, at the price of always rebreaking the
// paragraph at cursor. This can be expensive for large tables.
flags = flags & ~Update::SinglePar;
// First check whether the metrics and inset positions should be updated // First check whether the metrics and inset positions should be updated
if (flags & Update::Force) { if (flags & Update::Force) {
// This will update the CoordCache items and replace Force // This will update the CoordCache items and replace Force
@ -512,15 +507,14 @@ void BufferView::processUpdateFlags(Update::flags flags)
updateMetrics(flags); updateMetrics(flags);
} }
// Detect whether we can only repaint a single paragraph. // Detect whether we can only repaint a single paragraph (if we
// are not already redrawing all).
// We handle this before FitCursor because the later will require // We handle this before FitCursor because the later will require
// correct metrics at cursor position. // correct metrics at cursor position.
if (!(flags & Update::ForceDraw)) { if (!(flags & Update::ForceDraw)
if (singleParUpdate()) && (flags & Update::SinglePar)
flags = flags | Update::SinglePar; && !singleParUpdate())
else
updateMetrics(flags); updateMetrics(flags);
}
// Then make sure that the screen contains the cursor if needed // Then make sure that the screen contains the cursor if needed
if (flags & Update::FitCursor) { if (flags & Update::FitCursor) {
@ -538,7 +532,7 @@ void BufferView::processUpdateFlags(Update::flags flags)
LYXERR(Debug::PAINTING, "Cumulative flags: " << flagsAsString(flags)); LYXERR(Debug::PAINTING, "Cumulative flags: " << flagsAsString(flags));
// Now compute the update strategy // Now compute the update strategy
// Possibly values in flag are None, Decoration, ForceDraw // Possibly values in flag are None, SinglePar, Decoration, ForceDraw
LATTEST((d->update_flags_ & ~(Update::None | Update::SinglePar LATTEST((d->update_flags_ & ~(Update::None | Update::SinglePar
| Update::Decoration | Update::ForceDraw)) == 0); | Update::Decoration | Update::ForceDraw)) == 0);