X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmelody-spanner.cc;h=2dbcd56cabc5eba65d7d1a389ff39ffc2a9b9127;hb=f5cb091a771d6a162e89f04639f124f93a19ae6d;hp=053c7c34ccdeef44e2dd385a38a739112034949c;hpb=25762c16c302852c0ef9e10202b30ef0b2801e31;p=lilypond.git diff --git a/lily/melody-spanner.cc b/lily/melody-spanner.cc index 053c7c34cc..2dbcd56cab 100644 --- a/lily/melody-spanner.cc +++ b/lily/melody-spanner.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005--2006 Han-Wen Nienhuys + (c) 2005--2009 Han-Wen Nienhuys */ @@ -20,18 +20,18 @@ /* Interpolate stem directions for neutral stems. */ -MAKE_SCHEME_CALLBACK(Melody_spanner,calc_neutral_stem_direction, 1); +MAKE_SCHEME_CALLBACK (Melody_spanner, calc_neutral_stem_direction, 1); SCM Melody_spanner::calc_neutral_stem_direction (SCM smob) { Grob *stem = unsmob_grob (smob); Grob *me = unsmob_grob (stem->get_object ("melody-spanner")); if (!me || !me->is_live ()) - return SCM_UNSPECIFIED; + return scm_from_int (DOWN); extract_grob_set (me, "stems", stems); - std::vector dirs; + vector dirs; for (vsize i = 0; i < stems.size (); i++) dirs.push_back (to_dir (stems[i]->get_property ("default-direction"))); @@ -41,7 +41,8 @@ Melody_spanner::calc_neutral_stem_direction (SCM smob) && !dirs[next_nonneutral]) next_nonneutral++; - while (last_nonneutral == VPOS || last_nonneutral < dirs.size () - 1) + SCM retval = SCM_EOL; + while (last_nonneutral == VPOS || last_nonneutral + 1 < dirs.size ()) { Direction d1 = CENTER; Direction d2 = CENTER; @@ -61,8 +62,12 @@ Melody_spanner::calc_neutral_stem_direction (SCM smob) total = to_dir (me->get_property ("neutral-direction")); for (vsize i = last_nonneutral + 1; i < next_nonneutral; i++) - stems[i]->set_property ("neutral-direction", scm_from_int (total)); - + { + if (stems[i] == stem) + retval = scm_from_int (total); + else + stems[i]->set_property ("neutral-direction", scm_from_int (total)); + } last_nonneutral = next_nonneutral; while (last_nonneutral < dirs.size () @@ -76,8 +81,7 @@ Melody_spanner::calc_neutral_stem_direction (SCM smob) next_nonneutral++; } - me->suicide (); - return SCM_UNSPECIFIED; + return retval; } void @@ -88,10 +92,12 @@ Melody_spanner::add_stem (Grob *me, Grob *stem) stem->set_property ("neutral-direction", Melody_spanner::calc_neutral_stem_direction_proc); } -ADD_INTERFACE (Melody_spanner, "melody-spanner-interface", +ADD_INTERFACE (Melody_spanner, "Context dependent typesetting decisions.", + /* properties */ "stems " - "neutral-direction "); + "neutral-direction " + );