]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/note-collision.cc
bugfixes for git-update-changelog.py
[lilypond.git] / lily / note-collision.cc
index 24a9a532cfdd28492e097cc4e1f5399ea087f539..7bcfa464ceee01b6da9138def0fec95d13d6ba02 100644 (file)
@@ -16,6 +16,7 @@
 #include "output-def.hh"
 #include "pointer-group-interface.hh"
 #include "rhythmic-head.hh"
+#include "staff-symbol-referencer.hh"
 #include "side-position-interface.hh"
 #include "stem.hh"
 #include "warn.hh"
@@ -48,7 +49,8 @@ check_meshing_chords (Grob *me,
   if (ups[0] > dps.back () + 1)
     return;
 
-  // FIXME: what's this?
+  /* Merge heads if the notes lie the same line, or if the "stem-up-note" is
+     above the "stem-down-note". */
   bool merge_possible = (ups[0] >= dps[0]) && (ups.back () >= dps.back ());
 
   /* Do not merge notes typeset in different style. */
@@ -241,6 +243,28 @@ check_meshing_chords (Grob *me,
   else
     shift_amount *= 0.17;
 
+  /*
+   * Fix issue #44:
+   *
+   * Dots from left note head collide with right note head. Only occurs
+   * with a close half collide, if the left note head is between
+   * lines and the right note head is on a line, and if right note head
+   * hasn't got any dots.
+   */
+  if (close_half_collide
+      && Rhythmic_head::dot_count (nu)
+      && !Rhythmic_head::dot_count (nd))
+    {
+      Grob *staff = Staff_symbol_referencer::get_staff_symbol (me);
+      if (!Staff_symbol_referencer::on_line (staff, ups[0]))
+       {
+         Grob *d = unsmob_grob (nu->get_object ("dot"));
+         Grob *parent = d->get_parent (X_AXIS);
+         if (Dot_column::has_interface (parent))
+           Side_position_interface::add_support (parent, nd);
+       }
+    }
+
   /* For full or close half collisions, the right hand head may
      obscure dots.  Move dots to the right.  */
   if (abs (shift_amount) > 1e-6
@@ -304,7 +328,9 @@ Note_collision_interface::calc_positioning_done (SCM smob)
       if (cg[d].size ())
        {
          Grob *h = cg[d][0];
-         wid = Note_column::first_head (h)->extent (h, X_AXIS).length ();
+         Grob *fh = Note_column::first_head (h);
+         if (fh)
+           wid = fh->extent (h, X_AXIS).length ();
        }
     }
   while (flip (&d) != UP);
@@ -368,7 +394,7 @@ Note_collision_interface::get_clash_groups (Grob *me)
   do
     {
       vector<Grob*> &clashes (clash_groups[d]);
-      vector_sort (clashes, Note_column::shift_compare);
+      vector_sort (clashes, Note_column::shift_less);
     }
   while ((flip (&d)) != UP);