Comment #58 on issue 2801 by [email protected]: Patch: Approximates
cross-staff slurs in VerticalAxisGroup vertical-skylines.
http://code.google.com/p/lilypond/issues/detail?id=2801
I think I've found the nature of the problem. I did a run of the regtests
with a bunch of messages printed to std:err and it looks like every time
there is a divergence, the order in which the grobs are read changes. This
comes from sorting grobs by pointers and then running ::uniq. In theory
this shouldn't matter, but in practice...
1) LilyPond requests pure height from grob X.
2) Grob X's pure height is somehow dependent on grob Y.
3) Depending on how a vector has been pointer-sorted...
3a) Grob Y's actual offset has not yet been calculated because of the way
a given vector is sorted, in which is pure offset is returned.
3b) Grob Y's actual offset has been calculated because it was triggered
first and stashed in dim_cache_. Grob::pure_relative_y_coordinate will
always return this as opposed to the pure value.
So there you have it. One way to solve this may be to disallow
Grob::pure_relative_y_coordinate from ever returning something out of
dim_cache_. This has no bearing on the caching in item.cc, so it shouldn't
result in too much of a slow-down. I'll run regtests on a patch doing
this...