X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fslur.cc;h=28eed394739e50217a3b1b74f4fcd8c7f459f8d2;hb=91a7d8ea51745072e2bd1a2407c17e58c45f74c6;hp=3d47e876fc07ce0c18d21803f0ce2840f3f52ae5;hpb=41e45dd730c075e78065dfa78e5e54be664d905e;p=lilypond.git diff --git a/lily/slur.cc b/lily/slur.cc index 3d47e876fc..28eed39473 100644 --- a/lily/slur.cc +++ b/lily/slur.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2007 Han-Wen Nienhuys + (c) 1996--2009 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -119,15 +119,11 @@ Slur::print (SCM smob) Bezier one = get_curve (me); Stencil a; - SCM p = me->get_property ("dash-period"); - SCM f = me->get_property ("dash-fraction"); - if (scm_is_number (p) && scm_is_number (f)) - a = Lookup::dashed_slur (one, line_thick, robust_scm2double (p, 1.0), - robust_scm2double (f, 0)); - else - a = Lookup::slur (one, - get_grob_direction (me) * base_thick, - line_thick); + SCM dash_definition = me->get_property ("dash-definition"); + a = Lookup::slur (one, + get_grob_direction (me) * base_thick, + line_thick, + dash_definition); #if DEBUG_SLUR_SCORING SCM annotation = me->get_property ("annotation"); @@ -160,7 +156,7 @@ Slur::print (SCM smob) /* it would be better to do this at engraver level, but that is - fragile, as the breakabl items are generated on staff level, at + fragile, as the breakable items are generated on staff level, at which point slur starts and ends have to be tracked */ void @@ -279,9 +275,9 @@ Slur::outside_slur_callback (SCM grob, SCM offset_scm) 0.0); yext.widen (slur_padding); - Real EPS = 1e-3; + const Real EPS = 1e-3; Interval bezext (curve.control_[0][X_AXIS], curve.control_[3][X_AXIS]); - bool consider[] = { false, false, false }; + bool consider[] = {false, false, false}; Real ys[] = {0, 0, 0}; bool do_shift = false; @@ -308,11 +304,13 @@ Slur::outside_slur_callback (SCM grob, SCM offset_scm) } Real avoidance_offset = 0.0; - for (int d = LEFT, k = 0; d <= RIGHT; d++, k++) - if (consider[k]) - avoidance_offset = dir * (max (dir * avoidance_offset, - dir * (ys[k] - yext[-dir] + dir * slur_padding))); - + if (do_shift) + { + for (int d = LEFT, k = 0; d <= RIGHT; d++, k++) + if (consider[k]) + avoidance_offset = dir * (max (dir * avoidance_offset, + dir * (ys[k] - yext[-dir] + dir * slur_padding))); + } return scm_from_double (offset + avoidance_offset); } @@ -349,14 +347,36 @@ Slur::auxiliary_acknowledge_extra_object (Grob_info const &info, if (slur) { chain_offset_callback (e, outside_slur_callback_proc, Y_AXIS); + chain_callback (e, outside_slur_cross_staff_proc, ly_symbol2scm("cross-staff")); e->set_object ("slur", slur->self_scm ()); } } - else + else if (avoid != ly_symbol2scm ("ignore")) e->warning (_f ("Ignoring grob for slur: %s. avoid-slur not set?", e->name().c_str ())); } +/* + A callback that will be chained together with the original cross-staff + value of a grob that is placed 'outside or 'around a slur. This just says + that any grob becomes cross-staff if it is placed 'outside or 'around a + cross-staff slur. +*/ +MAKE_SCHEME_CALLBACK (Slur, outside_slur_cross_staff, 2) +SCM +Slur::outside_slur_cross_staff (SCM smob, SCM previous) +{ + if (previous == SCM_BOOL_T) + return previous; + + Grob *me = unsmob_grob (smob); + Grob *slur = unsmob_grob (me->get_object ("slur")); + + if (!slur) + return SCM_BOOL_F; + return slur->get_property ("cross-staff"); +} + MAKE_SCHEME_CALLBACK (Slur, calc_cross_staff, 1) SCM Slur::calc_cross_staff (SCM smob) @@ -393,8 +413,7 @@ ADD_INTERFACE (Slur, "annotation " "avoid-slur " /* UGH. */ "control-points " - "dash-fraction " - "dash-period " + "dash-definition " "details " "direction " "eccentricity "