X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Frest-collision.cc;h=57e6f9310af1744f3a61c98f2c8f0603611ade91;hb=955f829883aa125b2b633b1e71f6256da5b773fa;hp=49e85e2d955e2c50a776e154706510381e8996dc;hpb=667d9bdb6227dd10819599c6d069a5eeb67eedd7;p=lilypond.git diff --git a/lily/rest-collision.cc b/lily/rest-collision.cc index 49e85e2d95..57e6f9310a 100644 --- a/lily/rest-collision.cc +++ b/lily/rest-collision.cc @@ -3,12 +3,12 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2002 Han-Wen Nienhuys + (c) 1997--2003 Han-Wen Nienhuys */ #include // ceil. -#include "debug.hh" +#include "warn.hh" #include "rest-collision.hh" #include "note-column.hh" #include "stem.hh" @@ -29,17 +29,11 @@ Rest_collision::force_shift_callback (SCM element_smob, SCM axis) Grob * rc = unsmob_grob (them->get_grob_property ("rest-collision")); - if (rc) + if (rc && !to_boolean (rc->get_grob_property ("rest-collision-done"))) { - /* - Done: destruct pointers, so we do the shift only once. - - TODO: use rest-collision-done - */ - SCM elts = rc->get_grob_property ("elements"); - rc->set_grob_property ("elements", SCM_EOL); + rc->set_grob_property ("rest-collision-done", SCM_BOOL_T); - do_shift (rc, elts); + do_shift (rc); } return gh_double2scm (0.0); @@ -52,7 +46,8 @@ Rest_collision::add_column (Grob*me,Grob *p) Pointer_group_interface::add_grob (me, ly_symbol2scm ("elements"), p); /* - only add callback for the rests, since we don't move anything else. + only add callback for the rests, since we don't move anything + else. (not?) */ @@ -81,13 +76,15 @@ head_characteristic (Grob * col) TODO: look at horizontal-shift to determine ordering between rests for more than two voices. + + TODO: look at previous note to determine vertical position? + */ SCM -Rest_collision::do_shift (Grob *me, SCM elts) +Rest_collision::do_shift (Grob *me) { - /* - ugh. -> score elt type - */ + SCM elts = me->get_grob_property ("elements"); + Link_array rests; Link_array notes; @@ -144,9 +141,25 @@ Rest_collision::do_shift (Grob *me, SCM elts) for (; i > display_count; i--) { Grob* r = unsmob_grob (rests[i-1]->get_grob_property ("rest")); +#if 1 if (r) - r->suicide (); + { + Grob * d = unsmob_grob (r->get_grob_property ("dot")); + if (d) + d->suicide(); + r->suicide (); + } rests[i-1]->suicide (); +#else + if (r) + { + + r->set_grob_property ("transparent", gh_bool2scm(1)); + r = unsmob_grob (r->get_grob_property ("dot")); + if (r) + r->set_grob_property ("transparent", gh_bool2scm(1)); + } +#endif } } else @@ -239,7 +252,7 @@ Rest_collision::do_shift (Grob *me, SCM elts) ADD_INTERFACE (Rest_collision,"rest-collision-interface", - "Move around ordinary rests (not multi-measure-rests) to avoid -conflicts.", - "maximum-rest-count minimum-distance elements"); + "Move around ordinary rests (not multi-measure-rests) to avoid " +"conflicts.", + "maximum-rest-count minimum-distance rest-collision-done elements");