From 4b5d91b8d2a6f8a689c946f25f290934ab32f19d Mon Sep 17 00:00:00 2001 From: Keith OHara Date: Fri, 21 Sep 2012 14:41:33 -0700 Subject: [PATCH] Revert "spacing-spanner: rods for non-adjacent paper-columns; issue 1700" This reverts commit ad55b046668fb00a6f80684e4caa4e4de982e399. --- .../spacing-non-adjacent-columns3.ly | 21 -------- lily/spacing-spanner.cc | 53 +++++++++---------- 2 files changed, 24 insertions(+), 50 deletions(-) delete mode 100644 input/regression/spacing-non-adjacent-columns3.ly diff --git a/input/regression/spacing-non-adjacent-columns3.ly b/input/regression/spacing-non-adjacent-columns3.ly deleted file mode 100644 index 4a7c0568a7..0000000000 --- a/input/regression/spacing-non-adjacent-columns3.ly +++ /dev/null @@ -1,21 +0,0 @@ -\version "2.17.3" -\header { - texidoc = "The spacing engine avoids collisions between non-adjacent columns." -} - -\paper{ragged-right = ##t } -<< - \new ChordNames \chordmode { - \set additionalPitchPrefix = #"add" - f2:13.15 f2 - } - \new Staff { - f'4 f'8 f' f'2 \break - \set fingeringOrientations = #'(left) - \grace { 8[ f a] } - 4 r4 - \set fingeringOrientations = #'(right) - 4 \grace { d''8[ e'' d'']} - g'4 - } ->> diff --git a/lily/spacing-spanner.cc b/lily/spacing-spanner.cc index 51ae51319d..e4035b5d0d 100644 --- a/lily/spacing-spanner.cc +++ b/lily/spacing-spanner.cc @@ -223,13 +223,11 @@ Spacing_spanner::generate_pair_spacing (Grob *me, static void set_column_rods (vector const &cols, Real padding) { - /* distances[i] will be the distance betwen cols[i-1] and cols[i], and - overhangs[j] the amount by which cols[0 thru j] extend beyond cols[j] + /* distances[i] will be the distance betwen cols[i-1] and cols[i] when each column is placed as far to the left as possible. */ vector distances (cols.size ()); - vector overhangs (cols.size ()); - for (vsize i = 0; i < cols.size (); i++) + for (vsize i = 1; i < cols.size (); i++) { Item *r = dynamic_cast (cols[i]); Item *rb = r->find_prebroken_piece (LEFT); @@ -237,15 +235,12 @@ set_column_rods (vector const &cols, Real padding) if (Separation_item::is_empty (r) && (!rb || Separation_item::is_empty (rb))) continue; - Interval r_ext = r->extent (r, X_AXIS); - overhangs[i] = r_ext[RIGHT]; - - if (0 == i) continue; + Skyline_pair *skys = Skyline_pair::unsmob (r->get_property ("horizontal-skylines")); - /* min rather than max because stickout will be negative if the right-hand column + /* min rather than max because stickout_i will be negative if the right-hand column sticks out a lot to the left */ - Real stickout = min (r_ext[LEFT], - Separation_item::conditional_skyline (r, cols[i - 1]).max_height ()); + Real stickout_i = min (skys ? (*skys)[LEFT].max_height () : 0.0, + Separation_item::conditional_skyline (r, cols[i - 1]).max_height ()); Real prev_distances = 0.0; @@ -254,35 +249,35 @@ set_column_rods (vector const &cols, Real padding) a constant number of times per iteration of the outer loop. */ for (vsize j = i; j--;) { - if (overhangs[j] + padding <= prev_distances + distances[i] + stickout) - break; // cols[0 thru j] cannot reach cols[i] - Item *l = dynamic_cast (cols[j]); Item *lb = l->find_prebroken_piece (RIGHT); + Skyline_pair *skys = Skyline_pair::unsmob (l->get_property ("horizontal-skylines")); + Real stickout_j = skys ? (*skys)[RIGHT].max_height () : 0.0; - Real dist = Separation_item::set_distance (l, r, padding); - distances[i] = max (distances[i], dist - prev_distances); + bool touches = stickout_i - stickout_j + prev_distances + distances[i] < 0.0; + Real dist = 0.0; - if (lb) + if (touches || j == i - 1) { - dist = Separation_item::set_distance (lb, r, padding); - // The left-broken version might reach more columns to the - // right than the unbroken version, by extending farther and/or - // nesting more closely; - if (j == i - 1) // check this, the first time we see each lb. - overhangs[j] = max (overhangs[j], - lb->extent (lb, X_AXIS)[RIGHT] - + distances[i] - dist); + dist = Separation_item::set_distance (l, r, padding); + if (rb) + Separation_item::set_distance (l, rb, padding); } - if (rb) - Separation_item::set_distance (l, rb, padding); + distances[i] = max (distances[i], dist - prev_distances); + + /* we set a distance for the line-starter column even if its non-broken counterpart + doesn't touch the right column. */ + if (lb) + Separation_item::set_distance (lb, r, padding); if (lb && rb) Separation_item::set_distance (lb, rb, padding); prev_distances += distances[j]; + /* we need the empty check for gregorian notation, where there are a lot of + extraneous paper-columns that we need to skip over */ + if (!touches && !Separation_item::is_empty (l)) + break; } - overhangs[i] = max (overhangs[i], - overhangs[i - 1] - distances[i]); } } -- 2.39.5