X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmelody-spanner.cc;h=7ee731a9bc43debfe44172cd014e689083cdf0c0;hb=9e781b7dc83b60a543ce218aa1a5f139f74c760f;hp=d4901f2c9b1a12a9958132fdc7b133e0af3ef928;hpb=9e69cb84d6ee5b0a861cd97869b10e3bdf0c833c;p=lilypond.git diff --git a/lily/melody-spanner.cc b/lily/melody-spanner.cc index d4901f2c9b..7ee731a9bc 100644 --- a/lily/melody-spanner.cc +++ b/lily/melody-spanner.cc @@ -1,10 +1,21 @@ /* - melody-spanner.cc -- implement Melody_spanner + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2005--2014 Han-Wen Nienhuys - (c) 2005--2006 Han-Wen Nienhuys + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "melody-spanner.hh" @@ -16,19 +27,18 @@ let's take item for now. */ - /* 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")); + 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); vector dirs; @@ -38,46 +48,50 @@ Melody_spanner::calc_neutral_stem_direction (SCM smob) vsize last_nonneutral = VPOS; vsize next_nonneutral = 0; while (next_nonneutral != VPOS && next_nonneutral < dirs.size () - && !dirs[next_nonneutral]) + && !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; if (last_nonneutral != VPOS) - d1 = dirs[last_nonneutral]; + d1 = dirs[last_nonneutral]; if (next_nonneutral < dirs.size ()) - d2 = dirs[next_nonneutral]; + d2 = dirs[next_nonneutral]; Direction total = CENTER; if (d1 && d1 == d2) - total = d1; + total = d1; else if (d1 && !d2) - total = d1; + total = d1; else if (d2 && !d1) - total = d2; + total = d2; else - 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)); + total = to_dir (me->get_property ("neutral-direction")); + for (vsize i = last_nonneutral + 1; i < next_nonneutral; i++) + { + 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 () - && dirs[last_nonneutral]) - last_nonneutral++; + && dirs[last_nonneutral]) + last_nonneutral++; next_nonneutral = last_nonneutral; last_nonneutral--; while (next_nonneutral < dirs.size () - && !dirs[next_nonneutral]) - next_nonneutral++; + && !dirs[next_nonneutral]) + next_nonneutral++; } - me->suicide (); - return SCM_UNSPECIFIED; + return retval; } void @@ -89,9 +103,10 @@ Melody_spanner::add_stem (Grob *me, Grob *stem) } ADD_INTERFACE (Melody_spanner, - "Context dependent typesetting decisions.", + "Context dependent typesetting decisions.", - "stems " - "neutral-direction "); + /* properties */ + "stems " + "neutral-direction " + ); -