From caa28cbdc8801edf6f1bd04e2598a05bef28ae06 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Thu, 8 Dec 2005 13:10:38 +0000 Subject: [PATCH] * 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 --- ChangeLog | 11 +++++++++ lily/hyphen-engraver.cc | 34 ++++++++++++++++++++------ lily/lyric-hyphen.cc | 33 ++++++++++++------------- lily/separating-line-group-engraver.cc | 2 +- ly/engraver-init.ly | 1 - scm/define-grobs.scm | 15 ++++++++++-- 6 files changed, 66 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index 91e02553d8..643bebc3fa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,16 @@ 2005-12-08 Han-Wen Nienhuys + * 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. diff --git a/lily/hyphen-engraver.cc b/lily/hyphen-engraver.cc index 0f54038353..8140386a24 100644 --- a/lily/hyphen-engraver.cc +++ b/lily/hyphen-engraver.cc @@ -18,24 +18,30 @@ 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; } @@ -43,9 +49,13 @@ void 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); } @@ -93,7 +103,8 @@ Hyphen_engraver::finalize () 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; @@ -111,18 +122,25 @@ void 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; } @@ -132,7 +150,7 @@ ADD_ACKNOWLEDGER (Hyphen_engraver, lyric_syllable); ADD_TRANSLATOR (Hyphen_engraver, /* doc */ "Create lyric hyphens", - /* create */ "LyricHyphen", + /* create */ "LyricHyphen LyricsSpace", /* accept */ "hyphen-event", /* read */ "", /* write */ ""); diff --git a/lily/lyric-hyphen.cc b/lily/lyric-hyphen.cc index f06bf9d8ba..6988209c74 100644 --- a/lily/lyric-hyphen.cc +++ b/lily/lyric-hyphen.cc @@ -15,8 +15,10 @@ #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) @@ -106,26 +108,20 @@ Hyphen_spanner::set_spacing_rods (SCM smob) Rod r; Spanner *sp = dynamic_cast (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; } @@ -139,5 +135,6 @@ ADD_INTERFACE (Hyphen_spanner, "lyric-hyphen-interface", "height " "dash-period " "minimum-length " + "minimum-distance " "length"); diff --git a/lily/separating-line-group-engraver.cc b/lily/separating-line-group-engraver.cc index 53e669483d..8b69639899 100644 --- a/lily/separating-line-group-engraver.cc +++ b/lily/separating-line-group-engraver.cc @@ -1,5 +1,5 @@ /* - ' 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 diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index 8e332495ef..c051a64451 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -338,7 +338,6 @@ connected vertically. " printing of a single line of lyrics. " \name Lyrics - \consists "Separating_line_group_engraver" \consists "Lyric_engraver" \consists "Extender_engraver" \consists "Hyphen_engraver" diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index f4ac31d258..7528f93ef6 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -879,9 +879,10 @@ (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)) @@ -902,6 +903,16 @@ (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 . ( -- 2.39.5