X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flyric-extender.cc;h=7d1166c063fb8c506aadd02f9a097969fd4d8361;hb=233b5a1921a6c2c438fb1516abdcc01cc5a244e8;hp=3deeb0e24b6ee1d4655d5cbb38cdc11aa612e689;hpb=df4a7c4a55148e065d878dcc2f7e09ac27ea9c32;p=lilypond.git diff --git a/lily/lyric-extender.cc b/lily/lyric-extender.cc index 3deeb0e24b..7d1166c063 100644 --- a/lily/lyric-extender.cc +++ b/lily/lyric-extender.cc @@ -2,13 +2,13 @@ lyric-extender.cc -- implement Lyric_extender source file of the GNU LilyPond music typesetter - (c) 1998--2000 Jan Nieuwenhuizen + (c) 1998--2003 Jan Nieuwenhuizen Han-Wen Nienhuys */ #include "box.hh" -#include "debug.hh" +#include "warn.hh" #include "lookup.hh" #include "molecule.hh" #include "paper-column.hh" @@ -16,45 +16,57 @@ #include "lyric-extender.hh" -MAKE_SCHEME_CALLBACK(Lyric_extender,brew_molecule,1) +MAKE_SCHEME_CALLBACK (Lyric_extender,brew_molecule,1) SCM Lyric_extender::brew_molecule (SCM smob) { - Spanner *sp = dynamic_cast (unsmob_element (smob)); + Spanner *sp = unsmob_spanner (smob); + Item* l = sp->get_bound (LEFT); + Item*r = sp->get_bound (RIGHT); + + Real leftext = l->extent (l, X_AXIS).length (); - // ugh: refp - Real leftext = sp->get_bound (LEFT)->extent (sp->get_bound (LEFT), - X_AXIS).length (); - Real ss = 1.0; - Real sl = sp->paper_l ()->get_var ("stafflinethickness"); + Real sl = sp->get_paper ()->get_realvar (ly_symbol2scm ("linethickness")); Real righttrim = 0.5; // default to half a space gap on the right - SCM righttrim_scm = sp->get_grob_property("right-trim-amount"); - if (gh_number_p (righttrim_scm)) { - righttrim = gh_scm2double (righttrim_scm); - } + + + /* + If we're broken, we shouldn't extend past the end of the line. + */ + if (r->break_status_dir () == CENTER) + { + SCM righttrim_scm = sp->get_grob_property ("right-trim-amount"); + if (gh_number_p (righttrim_scm)) + { + righttrim = gh_scm2double (righttrim_scm); + } + } + // The extender can exist in the word space of the left lyric ... SCM space = sp->get_bound (LEFT)->get_grob_property ("word-space"); if (gh_number_p (space)) { - leftext -= gh_scm2double (space)*ss; + leftext -= gh_scm2double (space); } - Real w = sp->spanner_length () - leftext - righttrim*ss; + Real w = sp->spanner_length () - leftext - righttrim; - Real h = sl * gh_scm2double (sp->get_grob_property ("height")); - Molecule mol (Lookup::filledbox ( Box (Interval (0,w), Interval (0,h)))); + Real h = sl * gh_scm2double (sp->get_grob_property ("height")); + Molecule mol (Lookup::filledbox (Box (Interval (0,w), Interval (0,h)))); mol.translate (Offset (leftext, 0)); - return mol.smobbed_copy(); + return mol.smobbed_copy (); } void -Lyric_extender::set_textitem (Direction d, Grob*s) +Lyric_extender::set_textitem (Spanner*sp, Direction d, Grob*s) { - elt_l_->set_bound (d, s); - elt_l_->add_dependency (s); + sp->set_bound (d, s); + sp->add_dependency (s); } -Lyric_extender::Lyric_extender (Spanner*s) -{ - elt_l_ = s; -} + + +ADD_INTERFACE (Lyric_extender,"lyric-extender-interface", + "The extender is a simple line at the baseline of the lyric " +" that helps show the length of a melissima (tied/slurred note).", + "word-space height right-trim-amount");