From e0d3a445093e910c4d1f4c031f9b0f90644d8dd2 Mon Sep 17 00:00:00 2001 From: Joe Neeman Date: Sat, 28 Jul 2007 18:22:19 +1000 Subject: [PATCH] Ensure that we find a constraint in set_column_rods. --- lily/include/separation-item.hh | 2 +- lily/separation-item.cc | 8 +++++--- lily/spacing-spanner.cc | 12 ++++++++---- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/lily/include/separation-item.hh b/lily/include/separation-item.hh index bf9681957e..c8d3b93e0f 100644 --- a/lily/include/separation-item.hh +++ b/lily/include/separation-item.hh @@ -23,7 +23,7 @@ struct Separation_item static vector boxes (Grob *me, Grob *left); static Skyline conditional_skyline (Grob *, Grob *); static Grob *extremal_break_aligned_grob (Grob *, Direction, Interval *); - static void set_distance (Drul_array, Real); + static bool set_distance (Drul_array, Real); static bool is_empty (Grob *me); static void add_item (Grob *, Item *); static void add_conditional_item (Grob *, Grob *); diff --git a/lily/separation-item.cc b/lily/separation-item.cc index 00103c31d4..6d721b6399 100644 --- a/lily/separation-item.cc +++ b/lily/separation-item.cc @@ -30,9 +30,9 @@ Separation_item::add_conditional_item (Grob *me, Grob *e) Pointer_group_interface::add_grob (me, ly_symbol2scm ("conditional-elements"), e); } -void +bool Separation_item::set_distance (Drul_array items, - Real padding) + Real padding) { Drul_array lines (Skyline_pair::unsmob (items[LEFT]->get_property ("horizontal-skylines")), Skyline_pair::unsmob (items[RIGHT]->get_property ("horizontal-skylines"))); @@ -48,7 +48,9 @@ Separation_item::set_distance (Drul_array items, rod.distance_ = dist; rod.add_to_cols (); - } + } + + return dist > 0; } bool diff --git a/lily/spacing-spanner.cc b/lily/spacing-spanner.cc index d878c58b7f..9078c54bd3 100644 --- a/lily/spacing-spanner.cc +++ b/lily/spacing-spanner.cc @@ -223,7 +223,11 @@ set_column_rods (vector const &cols, vsize idx, Real padding) if (Separation_item::is_empty (r)) return; - while (idx--) + bool constraint = false; + bool grace = false; + + idx--; + do { Item *l = dynamic_cast (cols[idx]); Item *lb = l->find_prebroken_piece (RIGHT); @@ -231,9 +235,9 @@ set_column_rods (vector const &cols, vsize idx, Real padding) if (Separation_item::is_empty (l) && (!lb || Separation_item::is_empty (lb))) continue; - Separation_item::set_distance (Drul_array (l, r), padding); if (lb) Separation_item::set_distance (Drul_array (lb, r), padding); + constraint = Separation_item::set_distance (Drul_array (l, r), padding); /* @@ -241,14 +245,14 @@ set_column_rods (vector const &cols, vsize idx, Real padding) the accidentals of main note may stick out so far to cover a barline preceding the grace note. */ - if (spanned_time_interval (l, r).length ().main_part_ > Rational (0)) - break; + grace = spanned_time_interval (l, r).length ().main_part_ == Rational (0); /* this grob doesn't cause a constraint. We look further until we find one that does. */ } + while (idx-- && (!constraint || grace)); } void -- 2.39.5