2005-12-08 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ * scm/define-grobs.scm (all-grob-descriptions): add LyricSpace
+ grob
+
+ * lily/lyric-hyphen.cc (set_spacing_rods): use minimum-distance
+ iso. minimum-length property for rods.
+
+ * lily/hyphen-engraver.cc (acknowledge_lyric_syllable): create
+ LyricSpace item to keep lyrics spaced apart.
+
+ * ly/engraver-init.ly: remove Separating_line_group_engraver
+
* Documentation/user/music-glossary.tely: do setfilename before
music-glossary.
class Hyphen_engraver : public Engraver
{
Music *ev_;
+ Music *finished_ev_;
+
Spanner *hyphen_;
Spanner *finished_hyphen_;
+
public:
TRANSLATOR_DECLARATIONS (Hyphen_engraver);
protected:
+
DECLARE_ACKNOWLEDGER (lyric_syllable);
+
virtual void finalize ();
virtual bool try_music (Music *);
+
void stop_translation_timestep ();
void process_music ();
-private:
};
Hyphen_engraver::Hyphen_engraver ()
{
hyphen_ = 0;
finished_hyphen_ = 0;
+ finished_ev_ = 0;
ev_ = 0;
}
Hyphen_engraver::acknowledge_lyric_syllable (Grob_info i)
{
Item *item = i.item ();
+
+ if (!hyphen_)
+ hyphen_ = make_spanner ("LyricSpace", item->self_scm ());
+
if (hyphen_)
hyphen_->set_bound (LEFT, item);
-
+
if (finished_hyphen_)
finished_hyphen_->set_bound (RIGHT, item);
}
if (!finished_hyphen_->get_bound (RIGHT))
{
- finished_hyphen_->warning (_ ("unterminated hyphen; removing"));
+ if (finished_ev_)
+ finished_hyphen_->warning (_ ("unterminated hyphen; removing"));
finished_hyphen_->suicide ();
}
finished_hyphen_ = 0;
Hyphen_engraver::stop_translation_timestep ()
{
if (finished_hyphen_ && finished_hyphen_->get_bound (RIGHT))
- finished_hyphen_ = 0;
-
+ {
+ finished_hyphen_ = 0;
+ finished_ev_ = 0;
+ }
+
if (finished_hyphen_ && hyphen_)
{
programming_error ("hyphen not finished yet");
finished_hyphen_ = 0;
+ finished_ev_ = 0;
}
if (hyphen_)
- finished_hyphen_ = hyphen_;
+ {
+ finished_hyphen_ = hyphen_;
+ finished_ev_ = ev_;
+ }
+
hyphen_ = 0;
-
ev_ = 0;
}
ADD_TRANSLATOR (Hyphen_engraver,
/* doc */ "Create lyric hyphens",
- /* create */ "LyricHyphen",
+ /* create */ "LyricHyphen LyricsSpace",
/* accept */ "hyphen-event",
/* read */ "",
/* write */ "");
#include "moment.hh"
/*
- TODO: should extract hyphen from the font.
+ TODO: should extract hyphen dimensions or hyphen glyph from the
+ font.
*/
+
MAKE_SCHEME_CALLBACK (Hyphen_spanner, print, 1);
SCM
Hyphen_spanner::print (SCM smob)
Rod r;
Spanner *sp = dynamic_cast<Spanner *> (me);
- r.distance_
- = robust_scm2double (me->get_property ("minimum-length"), 0);
- if (r.distance_ > 0.0)
+ r.distance_ = robust_scm2double (me->get_property ("minimum-distance"), 0);
+ Direction d = LEFT;
+ do
{
- Real padding = robust_scm2double (me->get_property ("padding"), 0.1);
- r.distance_ += 2*padding;
- Direction d = LEFT;
- do
- {
- r.item_drul_[d] = sp->get_bound (d);
- if (r.item_drul_[d])
- r.distance_ += r.item_drul_[d]->extent (r.item_drul_[d], X_AXIS)[-d];
- }
- while (flip (&d) != LEFT);
-
- if (r.item_drul_[LEFT]
- && r.item_drul_[RIGHT])
- r.add_to_cols ();
+ r.item_drul_[d] = sp->get_bound (d);
+ if (r.item_drul_[d])
+ r.distance_ += r.item_drul_[d]->extent (r.item_drul_[d], X_AXIS)[-d];
}
+ while (flip (&d) != LEFT);
+
+ if (r.item_drul_[LEFT]
+ && r.item_drul_[RIGHT])
+ r.add_to_cols ();
return SCM_UNSPECIFIED;
}
"height "
"dash-period "
"minimum-length "
+ "minimum-distance "
"length");
/*
- ' separating-line-group-engraver.cc -- implement Separating_line_group_engraver
+ separating-line-group-engraver.cc -- implement Separating_line_group_engraver
source file of the GNU LilyPond music typesetter
printing of a single line of lyrics. "
\name Lyrics
- \consists "Separating_line_group_engraver"
\consists "Lyric_engraver"
\consists "Extender_engraver"
\consists "Hyphen_engraver"
(dash-period . 10.0)
(length . 0.66)
(minimum-length . 0.3)
+ (minimum-distance . 0.5)
(padding . 0.07)
- ;; (springs-and-rods . ,Hyphen_spanner::set_spacing_rods)
-
+ (springs-and-rods . ,Hyphen_spanner::set_spacing_rods)
+
(stencil . ,Hyphen_spanner::print)
(Y-extent . (0 . 0))
(interfaces . (lyric-interface
lyric-extender-interface))))))
+ (LyricSpace
+ . ((minimum-distance . 0.3)
+ (springs-and-rods . ,Hyphen_spanner::set_spacing_rods)
+ (padding . 0.0)
+ (Y-extent . #f)
+ (X-extent . #f)
+ (meta . ((class . Spanner)
+ (interfaces . (spanner-interface spacing-interface))
+ ))
+ ))
(LyricText
. (