X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fnote-collision.cc;h=8ee404cb067e5a0d1468ed69112a09d9b88f516a;hb=18dd11a22dd6ceff74d039efc21862556d87acfc;hp=ddfbf19983e14572dcf8fe4eec4baae09489cce1;hpb=b1c421e9b4fae8a98703db55df29289ae191ea4a;p=lilypond.git diff --git a/lily/note-collision.cc b/lily/note-collision.cc index ddfbf19983..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" @@ -15,6 +15,7 @@ #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" @@ -246,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: * @@ -289,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; @@ -302,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 @@ -407,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; @@ -484,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 */ @@ -529,13 +568,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 ");