X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnote-collision.cc;h=d2d806eca1ececfbab940337487b24d47e81d193;hb=26253bd2625f96bdaed6689668d7c5ff1a98f132;hp=1432c27564c9c7a843ef6f09704d376f766b693e;hpb=304b5f3aa7eee7b0ff8d4ba7526a1410735f6e74;p=lilypond.git diff --git a/lily/note-collision.cc b/lily/note-collision.cc index 1432c27564..d2d806eca1 100644 --- a/lily/note-collision.cc +++ b/lily/note-collision.cc @@ -3,30 +3,30 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2004 Han-Wen Nienhuys + (c) 1997--2005 Han-Wen Nienhuys */ +#include "note-collision.hh" + #include #include "warn.hh" -#include "note-collision.hh" #include "note-column.hh" #include "note-head.hh" #include "rhythmic-head.hh" -#include "paper-def.hh" +#include "output-def.hh" #include "axis-group-interface.hh" -#include "item.hh" #include "stem.hh" #include "side-position-interface.hh" #include "dot-column.hh" -MAKE_SCHEME_CALLBACK (Note_collision_interface,force_shift_callback,2); +MAKE_SCHEME_CALLBACK (Note_collision_interface, force_shift_callback, 2); SCM Note_collision_interface::force_shift_callback (SCM element_smob, SCM axis) { Grob *me = unsmob_grob (element_smob); - Axis a = (Axis) gh_scm2int (axis); + Axis a = (Axis) scm_to_int (axis); assert (a == X_AXIS); me = me->get_parent (a); @@ -37,7 +37,7 @@ Note_collision_interface::force_shift_callback (SCM element_smob, SCM axis) do_shifts (me); } - return gh_double2scm (0.0); + return scm_make_real (0.0); } @@ -71,6 +71,13 @@ check_meshing_chords (Grob *me, // FIXME: what's this? bool merge_possible = (ups[0] >= dps[0]) && (ups.top () >= dps.top ()); + + + /* Do not merge notes typeset in different style. */ + if ( !ly_c_equal_p (nu->get_property ("style"), + nd->get_property ("style") ) ) + merge_possible = false; + int upball_type = Note_head::get_balltype (nu); int dnball_type = Note_head::get_balltype (nd); @@ -133,7 +140,7 @@ check_meshing_chords (Grob *me, bool distant_half_collide = false; bool full_collide = false; - int i = 0, j=0; + int i = 0, j = 0; while (i < ups.size () && j < dps.size ()) { if (abs (ups[i] - dps[j]) == 1) @@ -144,7 +151,7 @@ check_meshing_chords (Grob *me, else distant_half_collide = true; } - else if (ups[i]==dps[j]) + else if (ups[i]== dps[j]) full_collide = true; else if (ups[i] >dps[0] && ups[i] < dps.top ()) merge_possible = false; @@ -230,7 +237,7 @@ check_meshing_chords (Grob *me, d->suicide (); } - if (wipe_ball && wipe_ball->live ()) + if (wipe_ball && wipe_ball->is_live ()) { wipe_ball->set_property ("transparent", SCM_BOOL_T); wipe_ball->set_property ("stencil", SCM_EOL); @@ -261,6 +268,19 @@ check_meshing_chords (Grob *me, { Grob *d = unsmob_grob (nd->get_property ("dot")); Grob *parent = d->get_parent (X_AXIS); + + + /* + FIXME: + + | + x . o + | + + + the . is put right of o which is erroneous o force-shifted + far to the right. + */ if (Dot_column::has_interface (parent)) Side_position_interface::add_support (parent, nu); } @@ -268,7 +288,7 @@ check_meshing_chords (Grob *me, Direction d = UP; do { - for (int i=0; i < clash_groups[d].size (); i++) + for (int i = 0; i < clash_groups[d].size (); i++) (*offsets)[d][i] += d * shift_amount; } while ((flip (&d))!= UP); @@ -289,27 +309,43 @@ Note_collision_interface::do_shifts (Grob* me) if (cg[d].size ()) { Grob *h = cg[d][0]; - wid = Note_column::first_head (h)->extent (h,X_AXIS).length () ; + wid = Note_column::first_head (h)->extent (h, X_AXIS).length () ; } } while (flip (&d) != UP); Link_array done; - for (; gh_pair_p (hand); hand =ly_cdr (hand)) + Real left_most = 1e6; + + Array amounts; + for (; scm_is_pair (hand); hand = scm_cdr (hand)) { - Grob * s = unsmob_grob (ly_caar (hand)); - Real amount = gh_scm2double (ly_cdar (hand)); - - s->translate_axis (amount *wid, X_AXIS); + Grob * s = unsmob_grob (scm_caar (hand)); + Real amount = scm_to_double (scm_cdar (hand)) * wid; + done.push (s); + amounts.push (amount); + if (amount < left_most) + left_most = amount; + } - for (; gh_pair_p (autos); autos =ly_cdr (autos)) + for (; scm_is_pair (autos); autos = scm_cdr (autos)) { - Grob * s = unsmob_grob (ly_caar (autos)); - Real amount = gh_scm2double (ly_cdar (autos)); + Grob * s = unsmob_grob (scm_caar (autos)); + Real amount = scm_to_double (scm_cdar (autos)) *wid; if (!done.find (s)) - s->translate_axis (amount * wid, X_AXIS); + { + done.push (s); + amounts.push (amount); + if (amount < left_most) + left_most = amount; + } + } + + for (int i = 0; i < amounts.size(); i++) + { + done[i]->translate_axis (amounts[i] - left_most, X_AXIS); } } @@ -319,9 +355,9 @@ Note_collision_interface::get_clash_groups (Grob *me) Drul_array > clash_groups; SCM s = me->get_property ("elements"); - for (; gh_pair_p (s); s = ly_cdr (s)) + for (; scm_is_pair (s); s = scm_cdr (s)) { - SCM car = ly_car (s); + SCM car = scm_car (s); Grob * se = unsmob_grob (car); if (Note_column::has_interface (se)) @@ -359,18 +395,18 @@ Note_collision_interface::automatic_shift (Grob *me, Array & shift (shifts[d]); Link_array & clashes (clash_groups[d]); - for (int i=0; i < clashes.size (); i++) + for (int i = 0; i < clashes.size (); i++) { SCM sh = clashes[i]->get_property ("horizontal-shift"); - if (gh_number_p (sh)) - shift.push (gh_scm2int (sh)); + if (scm_is_number (sh)) + shift.push (scm_to_int (sh)); else shift.push (0); } - for (int i=1; i < shift.size (); i++) + for (int i =1; i < shift.size (); i++) { if (shift[i-1] == shift[i]) { @@ -386,7 +422,7 @@ Note_collision_interface::automatic_shift (Grob *me, d = UP; do { - for (int i=0; i < clash_groups[d].size (); i++) + for (int i = 0; i < clash_groups[d].size (); i++) { Slice s (Note_column::head_positions_interval (clash_groups[d][i])); s[LEFT] --; @@ -408,9 +444,9 @@ Note_collision_interface::automatic_shift (Grob *me, do { - for (int i=1; i < clash_groups[d].size (); i++) + for (int i =1; i < clash_groups[d].size (); i++) { - Slice prev =extents[d][i-1]; + Slice prev = extents[d][i-1]; prev.intersect (extents[d][i]); if (prev.length ()> 0 || (extents[-d].size () && d * (extents[d][i][-d] - extents[-d][0][d]) < 0)) @@ -429,9 +465,9 @@ Note_collision_interface::automatic_shift (Grob *me, do { - for (int i=0; i < clash_groups[d].size (); i++) - tups = gh_cons (gh_cons (clash_groups[d][i]->self_scm (), - gh_double2scm (offsets[d][i])), + for (int i = 0; i < clash_groups[d].size (); i++) + tups = scm_cons (scm_cons (clash_groups[d][i]->self_scm (), + scm_make_real (offsets[d][i])), tups); } while (flip (&d) != UP); @@ -445,14 +481,14 @@ Note_collision_interface::forced_shift (Grob *me) SCM tups = SCM_EOL; SCM s = me->get_property ("elements"); - for (; gh_pair_p (s); s = ly_cdr (s)) + for (; scm_is_pair (s); s = scm_cdr (s)) { - Grob * se = unsmob_grob (ly_car (s)); + Grob * se = unsmob_grob (scm_car (s)); SCM force = se->get_property ("force-hshift"); - if (gh_number_p (force)) + if (scm_is_number (force)) { - tups = gh_cons (gh_cons (se->self_scm (), force), + tups = scm_cons (scm_cons (se->self_scm (), force), tups); } } @@ -460,7 +496,7 @@ Note_collision_interface::forced_shift (Grob *me) } void -Note_collision_interface::add_column (Grob*me,Grob* ncol) +Note_collision_interface::add_column (Grob*me, Grob* ncol) { ncol->add_offset_callback (Note_collision_interface::force_shift_callback_proc, X_AXIS); Axis_group_interface::add_element (me, ncol);