X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnote-collision.cc;h=8ee404cb067e5a0d1468ed69112a09d9b88f516a;hb=2c09cab3cbf12753e7cc8b69e20b21b009ea7e92;hp=e880c6cc295e78c685036a8a09f0876d13f591dc;hpb=2c8c61b3a5cddbb155786a1ca027528701c91ac9;p=lilypond.git diff --git a/lily/note-collision.cc b/lily/note-collision.cc index e880c6cc29..8ee404cb06 100644 --- a/lily/note-collision.cc +++ b/lily/note-collision.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "note-collision.hh" @@ -247,6 +247,22 @@ 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: * @@ -290,7 +306,12 @@ check_meshing_chords (Grob *me, far to the right. */ if (Dot_column::has_interface (parent)) - Side_position_interface::add_support (parent, nu); + { + Grob *stem = unsmob_grob (nu->get_object ("stem")); + extract_grob_set (stem, "note-heads", heads); + for (vsize i = 0; i < heads.size (); i++) + Side_position_interface::add_support (parent, heads[i]); + } } Direction d = UP; @@ -303,17 +324,19 @@ check_meshing_chords (Grob *me, } -MAKE_SCHEME_CALLBACK(Note_collision_interface, calc_positioning_done, 1) +MAKE_SCHEME_CALLBACK (Note_collision_interface, calc_positioning_done, 1) SCM Note_collision_interface::calc_positioning_done (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = unsmob_grob (smob); + me->set_property ("positioning-done", SCM_BOOL_T); + Drul_array > cg = get_clash_groups (me); Direction d = UP; do { - for (vsize i = cg[d].size(); i--; ) + for (vsize i = cg[d].size (); i--; ) { /* Trigger positioning @@ -408,12 +431,10 @@ 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, - Drul_array < vector - > clash_groups) + Drul_array > clash_groups) { Drul_array < vector > shifts; SCM tups = SCM_EOL; @@ -485,6 +506,23 @@ Note_collision_interface::automatic_shift (Grob *me, } while ((flip (&d)) != UP); + + /* + see input/regression/dot-up-voice-collision.ly + */ + for (vsize i = 0; i < clash_groups[UP].size (); i++) + { + Grob *g = clash_groups[UP][i]; + Grob *dc = Note_column::dot_column (g); + + if (dc) + for (vsize j = i + 1; j < clash_groups[UP].size (); j++) + { + Grob *stem = Note_column::get_stem (clash_groups[UP][j]); + Side_position_interface::add_support (dc, stem); + } + } + /* Check if chords are meshing */ @@ -537,6 +575,7 @@ ADD_INTERFACE (Note_collision_interface, "@code{force-hshift} and @code{horizontal-shift}.", /* properties */ + "ignore-collision " "merge-differently-dotted " "merge-differently-headed " "positioning-done ");