]> git.donarmstrong.com Git - lilypond.git/commitdiff
Ensure that we find a constraint in set_column_rods.
authorJoe Neeman <joeneeman@gmail.com>
Sat, 28 Jul 2007 08:22:19 +0000 (18:22 +1000)
committerJoe Neeman <joeneeman@gmail.com>
Sat, 28 Jul 2007 08:22:19 +0000 (18:22 +1000)
lily/include/separation-item.hh
lily/separation-item.cc
lily/spacing-spanner.cc

index bf9681957ed36feae08351a3243d950f29a1cd57..c8d3b93e0f397338ef0b88b8d29b4efdb9a689a0 100644 (file)
@@ -23,7 +23,7 @@ struct Separation_item
   static vector<Box> 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<Item *>, Real);
+  static bool set_distance (Drul_array<Item *>, Real);
   static bool is_empty (Grob *me);
   static void add_item (Grob *, Item *);
   static void add_conditional_item (Grob *, Grob *);
index 00103c31d4ee5839682d375084b6c568ad39815f..6d721b639930337424aa2f5b5a290a6b9d36c1c4 100644 (file)
@@ -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<Item *> items,
-                                      Real padding)
+                              Real padding)
 {
   Drul_array<Skyline_pair*> 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<Item *> items,
 
       rod.distance_ = dist;
       rod.add_to_cols ();
-    }  
+    }
+
+  return dist > 0;
 }
 
 bool
index d878c58b7f83e2dfaae14d8b2f2fb99125f7515c..9078c54bd3bcdb09f73b772019b31f1246d74a71 100644 (file)
@@ -223,7 +223,11 @@ set_column_rods (vector<Grob*> 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<Item*> (cols[idx]);
       Item *lb = l->find_prebroken_piece (RIGHT);
@@ -231,9 +235,9 @@ set_column_rods (vector<Grob*> 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<Item *> (l, r), padding);
       if (lb)
        Separation_item::set_distance (Drul_array<Item*> (lb, r), padding);
+      constraint = Separation_item::set_distance (Drul_array<Item *> (l, r), padding);
 
 
       /*
@@ -241,14 +245,14 @@ set_column_rods (vector<Grob*> 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