X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Frest-collision.cc;h=f18c63a10cc466be2d2cfe5099decb0a8599c610;hb=128e91673163c6beeea6b9328e507d87be7175c9;hp=588df93abeb33fa99002fd442dcecc0f8716bf1c;hpb=711cf44d0ab28f3159230c84d63c0b19199408b0;p=lilypond.git diff --git a/lily/rest-collision.cc b/lily/rest-collision.cc index 588df93abe..f18c63a10c 100644 --- a/lily/rest-collision.cc +++ b/lily/rest-collision.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2009 Han-Wen Nienhuys */ #include "rest-collision.hh" @@ -41,7 +41,7 @@ Rest_collision::force_shift_callback (SCM smob) return scm_from_double (0.0); } -MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Rest_collision, force_shift_callback_rest, 2, 1); +MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Rest_collision, force_shift_callback_rest, 2, 1, ""); SCM Rest_collision::force_shift_callback_rest (SCM rest, SCM offset) { @@ -87,11 +87,14 @@ Rest_collision::add_column (Grob *me, Grob *p) TODO: look at horizontal-shift to determine ordering between rests for more than two voices. */ -MAKE_SCHEME_CALLBACK(Rest_collision, calc_positioning_done, 1); +MAKE_SCHEME_CALLBACK (Rest_collision, calc_positioning_done, 1); SCM Rest_collision::calc_positioning_done (SCM smob) { Grob *me = unsmob_grob (smob); + + me->set_property ("positioning-done", SCM_BOOL_T); + extract_grob_set (me, "elements", elts); vector rests; @@ -224,8 +227,24 @@ Rest_collision::calc_positioning_done (SCM smob) Interval notedim; for (vsize i = 0; i < notes.size (); i++) - notedim.unite (notes[i]->extent (common, Y_AXIS)); - + { + if (Note_column::dir (notes[i]) == -dir) + { + /* try not to look at the stem, as looking at a beamed + note may trigger beam positioning prematurely. + + This happens with dotted rests, which need Y + positioning to compute X-positioning. + */ + Grob *head = Note_column::first_head (notes[i]); + if (head) + notedim.unite (head->extent (common, Y_AXIS)); + else + programming_error ("Note_column without first_head()"); + } + else + notedim.unite (notes[i]->extent (common, Y_AXIS)); + } Real y = dir * max (0.0, -dir * restdim[-dir] + dir * notedim[dir] + minimum_dist); @@ -253,11 +272,12 @@ Rest_collision::calc_positioning_done (SCM smob) } ADD_INTERFACE (Rest_collision, - "Move around ordinary rests (not multi-measure-rests) to avoid " - "conflicts.", + "Move around ordinary rests (not multi-measure-rests) to avoid" + " conflicts.", /* properties */ "minimum-distance " "positioning-done " - "elements"); + "elements " + );