X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fside-position-interface.cc;h=d5e9a4f0f3d96be24f5c56b586aaa135e427f149;hb=06dbc712c654888708b9feabbd0affe9ff2e4902;hp=ad7f50b90321973b2058ec10c94decdde26336a9;hpb=1d29117649b9c635e6fda19a6c3003f5f31770f8;p=lilypond.git diff --git a/lily/side-position-interface.cc b/lily/side-position-interface.cc index ad7f50b903..d5e9a4f0f3 100644 --- a/lily/side-position-interface.cc +++ b/lily/side-position-interface.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2002 Han-Wen Nienhuys + (c) 1998--2003 Han-Wen Nienhuys */ #include // ceil. @@ -162,10 +162,10 @@ Side_position_interface::quantised_position (SCM element_smob, SCM) { Grob *me = unsmob_grob (element_smob); - Direction d = Side_position_interface::get_direction (me); - if (Staff_symbol_referencer::has_interface (me)) + Grob * stsym = Staff_symbol_referencer::get_staff_symbol (me); + if (stsym) { Real p = Staff_symbol_referencer::get_position (me); Real rp = directed_round (p, d); @@ -207,14 +207,41 @@ Side_position_interface::aligned_side (SCM element_smob, SCM axis) d = DOWN; } o += - iv[-d]; - - SCM pad = me->get_grob_property ("padding"); - if (gh_number_p (pad)) - o += d *gh_scm2double (pad) ; } return gh_double2scm (o); } +/* + Maintain a minimum distance to the staff. This is similar to side + position with padding, but it will put adjoining objects on a row if + stuff sticks out of the staff a little. + */ +MAKE_SCHEME_CALLBACK (Side_position_interface,out_of_staff,2); +SCM +Side_position_interface::out_of_staff (SCM element_smob, SCM axis) +{ + Grob *me = unsmob_grob (element_smob); + Axis a = (Axis) gh_scm2int (axis); + + Grob * st = Staff_symbol_referencer::get_staff_symbol (me); + + if (!st) + return gh_int2scm (0); + + Real padding=0.0; + SCM spad = me->get_grob_property ("staff-padding"); + + if (gh_number_p (spad)) + padding = gh_scm2double (spad); + + Grob *common = me->common_refpoint (st, Y_AXIS); + Direction d = Side_position_interface::get_direction (me); + Interval staff_size = st->extent (common, Y_AXIS); + Interval me_ext = me->extent (common, a); + Real diff = d*staff_size[d] + padding - d*me_ext[-d]; + return gh_double2scm (diff >? 0); +} + void Side_position_interface::add_staff_support (Grob*me) { @@ -275,8 +302,8 @@ Side_position_interface::supported_b (Grob*me) ADD_INTERFACE (Side_position_interface,"side-position-interface", - "Position a victim object (this one) next to other objects (the -support). In this case, the direction signifies where to put the -victim object relative to the support (left or right, up or down?) -", - "side-support-elements direction-source direction side-relative-direction minimum-space padding"); + "Position a victim object (this one) next to other objects (the " +"support). In this case, the direction signifies where to put the " +"victim object relative to the support (left or right, up or down?) " +, + "staff-padding side-support-elements direction-source direction side-relative-direction minimum-space padding");