X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnote-collision.cc;h=664ce234a7ea92fc1aa06ae3d2800cac70c74932;hb=97a0169312a260933246ab224e4f8b0969871dd5;hp=0ef6b7b4e0b322ba767d35a8684402fbb1e7f2fa;hpb=28417a72cb60cc69ac5a4916d0dfdda9b78079fa;p=lilypond.git diff --git a/lily/note-collision.cc b/lily/note-collision.cc index 0ef6b7b4e0..664ce234a7 100644 --- a/lily/note-collision.cc +++ b/lily/note-collision.cc @@ -55,8 +55,10 @@ check_meshing_chords (Grob *me, vector ups = Stem::note_head_positions (stems[UP]); vector dps = Stem::note_head_positions (stems[DOWN]); + int threshold = robust_scm2int (me->get_property ("note-collision-threshold"), 1); + /* Too far apart to collide. */ - if (ups[0] > dps.back () + 1) + if (ups[0] > dps.back () + threshold) return 0.0; /* If the chords just 'touch' their extreme noteheads, @@ -64,8 +66,8 @@ check_meshing_chords (Grob *me, */ bool touch = false; if (ups[0] >= dps.back () - && (dps.size () < 2 || ups[0] >= dps[dps.size () - 2] + 2) - && (ups.size () < 2 || ups[1] >= dps.back () + 2)) + && (dps.size () < 2 || ups[0] >= dps[dps.size () - 2] + threshold + 1) + && (ups.size () < 2 || ups[1] >= dps.back () + threshold + 1)) touch = true; /* Filter out the 'o's in this configuration, since they're no @@ -141,7 +143,9 @@ check_meshing_chords (Grob *me, for (vsize i = 0, j = 0; i < ups.size () && j < dps.size ();) { - if (abs (ups[i] - dps[j]) == 1) + if (ups[i] == dps[j]) + full_collide = true; + else if (abs (ups[i] - dps[j]) <= threshold) { merge_possible = false; if (ups[i] > dps[j]) @@ -149,8 +153,6 @@ check_meshing_chords (Grob *me, else distant_half_collide = true; } - else if (ups[i] == dps[j]) - full_collide = true; else if (ups[i] > dps[0] && ups[i] < dps.back ()) merge_possible = false; else if (dps[j] > ups[0] && dps[j] < ups.back ()) @@ -309,14 +311,14 @@ check_meshing_chords (Grob *me, { Grob *d = unsmob (head_up->get_object ("dot")); Grob *parent = d->get_parent (X_AXIS); - if (Dot_column::has_interface (parent)) + if (has_interface (parent)) Side_position_interface::add_support (parent, head_down); } else if (Rhythmic_head::dot_count (head_down)) { Grob *d = unsmob (head_down->get_object ("dot")); Grob *parent = d->get_parent (X_AXIS); - if (Dot_column::has_interface (parent)) + if (has_interface (parent)) { Grob *stem = unsmob (head_up->get_object ("stem")); // Loop over all heads on an up-pointing-stem to see if dots @@ -433,7 +435,7 @@ Note_collision_interface::get_clash_groups (Grob *me) for (vsize i = 0; i < elements.size (); i++) { Grob *se = elements[i]; - if (Note_column::has_interface (se)) + if (has_interface (se)) { if (!Note_column::dir (se)) se->programming_error ("note-column has no direction"); @@ -607,6 +609,7 @@ ADD_INTERFACE (Note_collision_interface, /* properties */ "merge-differently-dotted " "merge-differently-headed " + "note-collision-threshold " "positioning-done " "prefer-dotted-right " );