]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/rest-collision.cc
* VERSION (MY_PATCH_LEVEL): make 1.7.0
[lilypond.git] / lily / rest-collision.cc
index 9f4588d0ed75bacfc166afc36b3776acd1a9cabb..0292881cb4e64b09aa4bdde35c761867bf33984f 100644 (file)
@@ -8,7 +8,7 @@
 
 #include <math.h>              // ceil.
 
-#include "debug.hh"
+#include "warn.hh"
 #include "rest-collision.hh"
 #include "note-column.hh"
 #include "stem.hh"
@@ -81,7 +81,6 @@ head_characteristic (Grob * col)
 
   TODO: look at horizontal-shift to determine ordering between rests
   for more than two voices.
-  
  */
 SCM
 Rest_collision::do_shift (Grob *me, SCM elts)
@@ -91,19 +90,10 @@ Rest_collision::do_shift (Grob *me, SCM elts)
    */
   Link_array<Grob> rests;
   Link_array<Grob> notes;
-  Grob * commony = 0;
+
   for (SCM s = elts; gh_pair_p (s); s = ly_cdr (s))
     {
-      
       Grob * e = unsmob_grob (ly_car (s));
-      if (!e)
-       continue;
-      
-      if (!commony)
-       commony = e;
-      else
-       commony= commony->common_refpoint (e, Y_AXIS);
-      
       if (unsmob_grob (e->get_grob_property ("rest")))
        rests.push (e);
       else
@@ -197,7 +187,11 @@ Rest_collision::do_shift (Grob *me, SCM elts)
        }
       Grob * rcol = rests[0];
       Direction dir = Note_column::dir (rests[0]);
+
+      if (!dir)
+       {
+         dir = - Note_column::dir (notes[0]);
+       }
       Grob * r = unsmob_grob (rcol->get_grob_property ("rest"));
       Interval restdim = r->extent (r, Y_AXIS);        // ??
 
@@ -210,9 +204,7 @@ Rest_collision::do_shift (Grob *me, SCM elts)
       Real minimum_dist = gh_scm2double (me->get_grob_property ("minimum-distance")) * staff_space;
 
 
-      Grob *common = rcol;
-      for (int i = 0; i < notes.size (); i++)
-       common = common->common_refpoint (notes[i], Y_AXIS);
+      Grob *common = common_refpoint_of_array (notes, rcol, Y_AXIS);
 
       Interval notedim;
       for (int i = 0; i < notes.size (); i++) 
@@ -245,12 +237,9 @@ Rest_collision::do_shift (Grob *me, SCM elts)
   return SCM_UNSPECIFIED;
 }
 
-void
-Rest_collision::set_interface (Grob*me)
-{
-  me->set_extent_callback (SCM_EOL, X_AXIS);
-  me->set_extent_callback (SCM_EOL, Y_AXIS);
-}
-
 
+ADD_INTERFACE (Rest_collision,"rest-collision-interface",
+  "Move around ordinary rests (not multi-measure-rests) to avoid
+conflicts.",
+  "maximum-rest-count minimum-distance elements");