diff options
author | Joe Neeman <joeneeman@gmail.com> | 2010-10-01 16:10:54 -0700 |
---|---|---|
committer | Joe Neeman <joeneeman@gmail.com> | 2010-10-01 16:16:03 -0700 |
commit | bd815715c3aa550810f75529a8c0bfb092856668 (patch) | |
tree | 8fc7bb8c48e6451dd6061e05f6777529421da656 | |
parent | 4229c17e857363657ccc567b6fa172f60b40cf2c (diff) |
Fix drastic overestimation of staff heights.
The outside-staff simulation in f530eeb5bba has severe problems
when there many outside-staff objects per bar. This patch
mitigates the problems by assuming that outside-staff objects
don't intersect with each other (but only with the staff).
-rw-r--r-- | flower/include/interval.hh | 1 | ||||
-rw-r--r-- | flower/include/interval.tcc | 9 | ||||
-rw-r--r-- | input/regression/page-breaking-outside-staff-estimation2.ly | 12 | ||||
-rw-r--r-- | lily/axis-group-interface.cc | 22 |
4 files changed, 40 insertions, 4 deletions
diff --git a/flower/include/interval.hh b/flower/include/interval.hh index 4a08e27813..512200f6cf 100644 --- a/flower/include/interval.hh +++ b/flower/include/interval.hh @@ -73,6 +73,7 @@ struct Interval_t : public Drul_array<T> void set_full (); void unite_disjoint (Interval_t<T> h, T padding, Direction d); + Interval_t<T> union_disjoint (Interval_t<T> h, T padding, Direction d) const; bool is_empty () const { diff --git a/flower/include/interval.tcc b/flower/include/interval.tcc index 7a1440a319..35dd8ebb29 100644 --- a/flower/include/interval.tcc +++ b/flower/include/interval.tcc @@ -124,6 +124,15 @@ Interval_t<T>::unite_disjoint (Interval_t<T> h, T padding, Direction d) } template<class T> +Interval_t<T> +Interval_t<T>::union_disjoint (Interval_t<T> h, T padding, Direction d) const +{ + Interval_t<T> iv = *this; + iv.unite_disjoint (h, padding, d); + return iv; +} + +template<class T> void Interval_t<T>::intersect (Interval_t<T> h) { diff --git a/input/regression/page-breaking-outside-staff-estimation2.ly b/input/regression/page-breaking-outside-staff-estimation2.ly new file mode 100644 index 0000000000..6a33ca7e39 --- /dev/null +++ b/input/regression/page-breaking-outside-staff-estimation2.ly @@ -0,0 +1,12 @@ +\version "2.13.35" + +\header { + texidoc = "The height-estimation routine doesn't get confused +by multiple outside-staff grobs in the same measure." +} + +#(set-default-paper-size "a7") + +\book { + \repeat unfold 4 { \repeat unfold 4 {g'''4^"Text"} \break} +} diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index 1ec518feff..85d2d36588 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -143,14 +143,12 @@ Axis_group_interface::combine_pure_heights (Grob *me, SCM measure_extents, int s return ext; } - // adjacent-pure-heights is a pair of vectors, each of which has one element // for every measure in the score. The first vector stores, for each measure, // the combined height of the elements that are present only when the bar // is at the beginning of a line. The second vector stores, for each measure, // the combined height of the elements that are present only when the bar // is not at the beginning of a line. - MAKE_SCHEME_CALLBACK (Axis_group_interface, adjacent_pure_heights, 1) SCM Axis_group_interface::adjacent_pure_heights (SCM smob) @@ -165,6 +163,8 @@ Axis_group_interface::adjacent_pure_heights (SCM smob) vector<Interval> begin_line_heights; vector<Interval> mid_line_heights; + vector<Interval> begin_line_staff_heights; + vector<Interval> mid_line_staff_heights; begin_line_heights.resize (ranks.size () - 1); mid_line_heights.resize (ranks.size () - 1); @@ -178,6 +178,18 @@ Axis_group_interface::adjacent_pure_heights (SCM smob) bool outside_staff = scm_is_number (g->get_property ("outside-staff-priority")); Real padding = robust_scm2double (g->get_property ("outside-staff-padding"), 0.5); + // When we encounter the first outside-staff grob, make a copy + // of the current heights to use as an estimate for the staff heights. + // Note that the outside-staff approximation that we use here doesn't + // consider any collisions that might occur between outside-staff grobs, + // but only the fact that outside-staff grobs may need to be raised above + // the staff. + if (outside_staff && begin_line_staff_heights.empty ()) + { + begin_line_staff_heights = begin_line_heights; + mid_line_staff_heights = mid_line_heights; + } + // TODO: consider a pure version of get_grob_direction? Direction d = to_dir (g->get_property_data ("direction")); d = (d == CENTER) ? UP : d; @@ -205,14 +217,16 @@ Axis_group_interface::adjacent_pure_heights (SCM smob) if (rank_span[LEFT] <= start) { if (outside_staff) - begin_line_heights[j].unite_disjoint (dims, padding, d); + begin_line_heights[j].unite ( + begin_line_staff_heights[j].union_disjoint (dims, padding, d)); else begin_line_heights[j].unite (dims); } if (rank_span[RIGHT] > start) { if (outside_staff) - mid_line_heights[j].unite_disjoint (dims, padding, d); + mid_line_heights[j].unite ( + mid_line_staff_heights[j].union_disjoint (dims, padding, d)); else mid_line_heights[j].unite (dims); } |