]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/note-collision.cc
Merge with master
[lilypond.git] / lily / note-collision.cc
index d9a08dcdc87741f8f7b50b1466e8c4b40c8af208..7d92a76ec0600f33756094e3086ee711b8bcb453 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "note-collision.hh"
@@ -15,7 +15,9 @@
 #include "note-head.hh"
 #include "output-def.hh"
 #include "pointer-group-interface.hh"
+#include "item.hh"
 #include "rhythmic-head.hh"
+#include "staff-symbol-referencer.hh"
 #include "side-position-interface.hh"
 #include "stem.hh"
 #include "warn.hh"
@@ -38,6 +40,9 @@ check_meshing_chords (Grob *me,
   if (!Note_column::get_stem (cu) || !Note_column::get_stem (cd))
     return;
 
+  Drul_array<Grob*> stems (Note_column::get_stem (cd),
+                          Note_column::get_stem (cu));
+  
   Grob *nu = Note_column::first_head (cu);
   Grob *nd = Note_column::first_head (cd);
 
@@ -57,8 +62,8 @@ check_meshing_chords (Grob *me,
                    nd->get_property ("style")))
     merge_possible = false;
 
-  int upball_type = Note_head::get_balltype (nu);
-  int dnball_type = Note_head::get_balltype (nd);
+  int upball_type = Rhythmic_head::duration_log (nu);
+  int dnball_type = Rhythmic_head::duration_log (nd);
 
   /* Do not merge whole notes (or longer, like breve, longa, maxima).  */
   if (merge_possible && (upball_type <= 0 || dnball_type <= 0))
@@ -89,10 +94,10 @@ check_meshing_chords (Grob *me,
   /* Should never merge quarter and half notes, as this would make
      them indistinguishable.  */
   if (merge_possible
-      && ((Rhythmic_head::duration_log (nu) == 1
-          && Rhythmic_head::duration_log (nd) == 2)
-         || (Rhythmic_head::duration_log (nu) == 2
-             && Rhythmic_head::duration_log (nd) == 1)))
+      && ((Stem::duration_log (stems[UP]) == 1
+          && Stem::duration_log (stems[DOWN]) == 2)
+         || (Stem::duration_log (stems[UP]) == 2
+             && Stem::duration_log (stems[DOWN]) == 1)))
     merge_possible = false;
 
   /*
@@ -242,6 +247,44 @@ check_meshing_chords (Grob *me,
   else
     shift_amount *= 0.17;
 
+  /*
+    
+  */
+  if (full_collide
+      && dnball_type * upball_type == 0)
+    {
+      if (upball_type == 0 && dnball_type == 1)
+       shift_amount *= 1.25;
+      else if (upball_type == 0 && dnball_type == 2)
+       shift_amount *= 1.35;
+      else if (dnball_type == 0 && upball_type == 1)
+       shift_amount *= 0.7;
+      else if (dnball_type == 0 && upball_type == 2)
+       shift_amount *= 0.75;
+    }
+  
+  /*
+   * 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
@@ -381,7 +424,6 @@ Note_collision_interface::get_clash_groups (Grob *me)
 /** This complicated routine moves note columns around horizontally to
     ensure that notes don't clash.
 
-    This should be put into Scheme.
 */
 SCM
 Note_collision_interface::automatic_shift (Grob *me,
@@ -503,13 +545,14 @@ Note_collision_interface::add_column (Grob *me, Grob *ncol)
   Axis_group_interface::add_element (me, ncol);
 }
 
-ADD_INTERFACE (Note_collision_interface, "note-collision-interface",
+ADD_INTERFACE (Note_collision_interface,
               "An object that handles collisions between notes with different stem "
               "directions and horizontal shifts. Most of the interesting properties "
               "are to be set in @ref{note-column-interface}: these are "
               "@code{force-hshift} and @code{horizontal-shift}.",
 
               /* properties */
+              "ignore-collision "
               "merge-differently-dotted "
               "merge-differently-headed "
-              "positioning-done");
+              "positioning-done ");