source file of the GNU LilyPond music typesetter
(c) 1998--2000 Jan Nieuwenhuizen <janneke@gnu.org>
+ Han-Wen Nienhuys
*/
-/*
- TODO: too complicated implementation. Why the dx_drul?.
- */
-#
-#include "dimension-cache.hh"
#include "box.hh"
#include "debug.hh"
#include "lookup.hh"
#include "molecule.hh"
#include "paper-column.hh"
#include "paper-def.hh"
-#include "extender-spanner.hh"
-
-Lyric_extender::Lyric_extender (SCM s)
- : Spanner (s)
-
-{
- dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
- set_extent_callback (Score_element::point_dimension_callback, Y_AXIS);
-}
+#include "lyric-extender.hh"
-
-
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Lyric_extender)
-Molecule
-Lyric_extender::do_brew_molecule () const
+MAKE_SCHEME_CALLBACK(Lyric_extender,brew_molecule,1)
+SCM
+Lyric_extender::brew_molecule (SCM smob)
{
- Molecule mol;
-
- Real w = spanner_length ();
+ Spanner *sp = dynamic_cast<Spanner*> (unsmob_element (smob));
+
+ // 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 righttrim = 0.5; // default to half a space gap on the right
+ SCM righttrim_scm = sp->get_elt_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_elt_property ("word-space");
+ if (gh_number_p (space))
+ {
+ leftext -= gh_scm2double (space)*ss;
+ }
+ Real w = sp->spanner_length () - leftext - righttrim*ss;
- w += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
- Real h = paper_l ()->get_var ("extender_height");
- Molecule a = lookup_l ()->filledbox ( Box (Interval (0,w), Interval (0,h)));
- a.translate (Offset (dx_f_drul_[LEFT], 0));
-
- mol.add_molecule (a);
-
- return mol;
+ Real h = sl * gh_scm2double (sp->get_elt_property ("height"));
+ Molecule mol (Lookup::filledbox ( Box (Interval (0,w), Interval (0,h))));
+ mol.translate (Offset (leftext, 0));
+ return mol.create_scheme();
}
-
-
void
-Lyric_extender::after_line_breaking ()
+Lyric_extender::set_textitem (Direction d, Score_element*s)
{
- // UGH
- Real gap = paper_l ()->get_var ("interline");
-
- Direction d = LEFT;
- do
- {
- Item* t = get_bound (d)
- ? get_bound (d) : get_bound ((Direction)-d);
- if (d == LEFT)
- dx_f_drul_[d] += t->extent (X_AXIS).length ();
- else
- dx_f_drul_[d] -= d * gap / 2;
- }
- while (flip(&d) != LEFT);
+ elt_l_->set_bound (d, s);
+ elt_l_->add_dependency (s);
}
-
-void
-Lyric_extender::set_textitem (Direction d, Item* textitem_l)
+Lyric_extender::Lyric_extender (Spanner*s)
{
- set_bound (d, textitem_l);
- add_dependency (textitem_l);
+ elt_l_ = s;
}
-