From 79cc56a24f4d03a27630f897139731cd84e495ca Mon Sep 17 00:00:00 2001
From: hanwen <hanwen>
Date: Mon, 26 Jan 2004 10:36:07 +0000
Subject: [PATCH] (stop_translation_timestep): align all stanza numbers.

---
 ChangeLog                          |  5 ++++
 VERSION                            |  4 +--
 lily/beam.cc                       | 12 ++++++--
 lily/engraver.cc                   |  6 ++--
 lily/lyric-phrasing-engraver.cc    | 46 ++++++++++++++++++++++++++----
 lily/mensural-ligature-engraver.cc |  7 -----
 lily/spacing-engraver.cc           |  2 +-
 lily/stem-tremolo.cc               |  7 +++--
 scm/define-grob-interfaces.scm     |  7 +++++
 scm/define-grobs.scm               |  2 +-
 10 files changed, 76 insertions(+), 22 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 285e2dd643..620132cbc2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2004-01-26  Han-Wen Nienhuys   <hanwen@xs4all.nl>
+
+	* lily/lyric-phrasing-engraver.cc (stop_translation_timestep):
+	align all stanza numbers.
+
 2004-01-26  Heikki Junes <hjunes@cc.hut.fi>
 
 	* Documentation/user/{introduction.itely,refman.itely,
diff --git a/VERSION b/VERSION
index e2f0006468..aaa77e5b2b 100644
--- a/VERSION
+++ b/VERSION
@@ -1,6 +1,6 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=2
 MINOR_VERSION=1
-PATCH_LEVEL=14
-MY_PATCH_LEVEL=hwn1
+PATCH_LEVEL=15
+MY_PATCH_LEVEL=
 
diff --git a/lily/beam.cc b/lily/beam.cc
index 4c5f743030..60b6944a80 100644
--- a/lily/beam.cc
+++ b/lily/beam.cc
@@ -83,8 +83,16 @@ Real
 Beam::get_beam_translation (Grob *me)
 {
   SCM func = me->get_grob_property ("space-function");
-  SCM s = gh_call2 (func, me->self_scm (), scm_int2num (get_beam_count (me)));
-  return gh_scm2double (s);
+
+  if (gh_procedure_p (func))
+    {
+      SCM s = gh_call2 (func, me->self_scm (), scm_int2num (get_beam_count (me)));
+      return gh_scm2double (s);
+    }
+  else
+    {
+      return 0.81;
+    }
 }
 
 /* Maximum beam_count. */
diff --git a/lily/engraver.cc b/lily/engraver.cc
index 57c4298c39..b009c3cb32 100644
--- a/lily/engraver.cc
+++ b/lily/engraver.cc
@@ -71,13 +71,15 @@ Engraver::process_music ()
 Item*
 Engraver::internal_make_item (SCM x)
 {
-  return new Item (x);
+  SCM props = internal_get_property (x);
+  return new Item (props);
 }
 
 Spanner*
 Engraver::internal_make_spanner (SCM x)
 {
-  return new Spanner (x);
+  SCM props = internal_get_property (x);
+  return new Spanner (props);
 }
 
 Engraver::Engraver()
diff --git a/lily/lyric-phrasing-engraver.cc b/lily/lyric-phrasing-engraver.cc
index f33a10de35..2787980474 100644
--- a/lily/lyric-phrasing-engraver.cc
+++ b/lily/lyric-phrasing-engraver.cc
@@ -14,6 +14,7 @@ source file of the GNU LilyPond music typesetter
 #include "lyric-extender.hh"
 #include "item.hh"
 #include "group-interface.hh"
+#include "side-position-interface.hh"
 
 struct Phrasing_association
 {
@@ -22,6 +23,8 @@ struct Phrasing_association
   Link_array<Grob> heads_;
   Link_array<Spanner> past_extenders_;
   Link_array<Spanner> new_extenders_;
+  Link_array<Grob> stanza_numbers_;
+
   
   bool melisma_;
   
@@ -45,6 +48,7 @@ private:
   void add_lyric_phrasing (Grob_info);
   void add_voice_phrasing (Grob_info);
   void add_lyric_extender (Grob_info);
+  void add_stanza_number (Grob_info);
   Phrasing_association *get_phrasing_assoc (String nm);
   String get_voice_name_for_lyric (Translator_group*tr);
   Link_array<Phrasing_association> assocs_;
@@ -65,6 +69,8 @@ Lyric_phrasing_engraver::acknowledge_grob (Grob_info i)
     add_lyric_phrasing (i);
   else if (Lyric_extender::has_interface (h))
     add_lyric_extender (i);
+  else if (h->internal_has_interface (ly_symbol2scm ("stanza-number-interface")))
+    add_stanza_number (i);
 }
 
 Phrasing_association *
@@ -127,6 +133,19 @@ Lyric_phrasing_engraver::add_lyric_extender (Grob_info inf)
   a->new_extenders_.push (dynamic_cast<Spanner*> (inf.grob_));  
 }
 
+void
+Lyric_phrasing_engraver::add_stanza_number  (Grob_info inf)
+{
+  Translator_group * tr = inf.origin_trans_->daddy_trans_;
+  while (tr && !tr->is_alias (ly_symbol2scm ("LyricsVoice")))
+    tr = tr->daddy_trans_;
+
+  if (!tr)
+    return;
+
+  Phrasing_association *a =  get_phrasing_assoc (get_voice_name_for_lyric (tr));
+  a->stanza_numbers_.push (inf.grob_);
+}
 
 void
 Lyric_phrasing_engraver::add_voice_phrasing (Grob_info inf)
@@ -162,12 +181,28 @@ Lyric_phrasing_engraver::add_lyric_phrasing (Grob_info inf)
 void
 Lyric_phrasing_engraver::stop_translation_timestep ()
 {
+  Link_array<Grob> stzs;
+  Link_array<Grob> lyrs;
   for (int i = assocs_.size ();  i--; )
     {
-      assocs_[i]->heads_.clear ();
-      assocs_[i]->lyrics_.clear ();
-      assocs_[i]->past_extenders_.concat (assocs_[i]->new_extenders_) ;
-      assocs_[i]->new_extenders_.clear ();
+      Phrasing_association * a = assocs_[i];
+      stzs.concat (a->stanza_numbers_);
+      lyrs.concat (a->lyrics_);
+    }
+
+  for(int i= lyrs.size(); i--;)
+    for (int j = stzs.size (); j--;)
+      Side_position_interface::add_support (stzs[j], lyrs[i]);
+    
+  for (int i = assocs_.size ();  i--; )
+    {
+      Phrasing_association * a = assocs_[i];
+
+      a->stanza_numbers_.clear ();
+      a->heads_.clear ();
+      a->lyrics_.clear ();
+      a->past_extenders_.concat (assocs_[i]->new_extenders_) ;
+      a->new_extenders_.clear ();
     }
 }
 
@@ -211,7 +246,8 @@ ENTER_DESCRIPTION(Lyric_phrasing_engraver,
 		  "This engraver combines note heads and lyrics for alignment. ",
 		  "",
 		  "",
-		  "lyric-syllable-interface note-head-interface lyric-extender-interface",
+		  "stanza-number-interface lyric-syllable-interface "
+		  "note-head-interface lyric-extender-interface",
 		  "associatedVoice",
 		  "");
 
diff --git a/lily/mensural-ligature-engraver.cc b/lily/mensural-ligature-engraver.cc
index 4f915714da..f982a11ac7 100644
--- a/lily/mensural-ligature-engraver.cc
+++ b/lily/mensural-ligature-engraver.cc
@@ -403,13 +403,6 @@ Mensural_ligature_engraver::fold_up_primitives (Array<Grob_info> primitives)
 
       if (i > 0)
 	{
-#if 0
-	  Rod r;
-	  r.distance_ = distance;
-	  r.item_l_drul_[LEFT] = first;
-	  r.item_l_drul_[RIGHT] = current;
-	  r.add_to_cols ();
-#endif
 	  current->translate_axis (distance, X_AXIS);
 	}
 
diff --git a/lily/spacing-engraver.cc b/lily/spacing-engraver.cc
index 377d88bbdf..5e1f6371b5 100644
--- a/lily/spacing-engraver.cc
+++ b/lily/spacing-engraver.cc
@@ -78,7 +78,7 @@ Spacing_engraver::process_music ()
 {
   if (!spacing_)
     {
-      spacing_  =make_spanner ("SpacingSpanner");
+      spacing_ = make_spanner ("SpacingSpanner");
       spacing_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn")));  
       announce_grob(spacing_, SCM_EOL);
     }
diff --git a/lily/stem-tremolo.cc b/lily/stem-tremolo.cc
index 886c9df71d..9a0fb6f171 100644
--- a/lily/stem-tremolo.cc
+++ b/lily/stem-tremolo.cc
@@ -129,14 +129,17 @@ Stem_tremolo::brew_molecule (SCM grob)
   Grob *stem = unsmob_grob (me->get_grob_property ("stem"));
   Grob *beam = Stem::get_beam (stem);
   Direction stemdir = Stem::get_direction (stem);
-  Real beam_translation = beam ? Beam::get_beam_translation (beam) : 0.81;
+  Real beam_translation
+    = (beam && beam->live ())
+    ? Beam::get_beam_translation (beam)
+    : 0.81;
 
   Molecule mol = raw_molecule (me);
   Interval mol_ext = mol.extent (Y_AXIS);
   Real ss = Staff_symbol_referencer::staff_space (me);
 
   // ugh, rather calc from Stem_tremolo_req
-  int beam_count = (beam) ? (Stem::beam_multiplicity (stem).length ()+ 1): 0;
+  int beam_count = (beam) ? (Stem::beam_multiplicity (stem).length () + 1): 0;
 
   /*
     TODO.
diff --git a/scm/define-grob-interfaces.scm b/scm/define-grob-interfaces.scm
index 26e050f838..9012a85e45 100644
--- a/scm/define-grob-interfaces.scm
+++ b/scm/define-grob-interfaces.scm
@@ -80,6 +80,13 @@ extents of a cluster spanner at this X position.
 are interesting enough to maintain a hara-kiri staff."
  '()
  )
+
+(ly:add-interface
+ 'stanza-number-interface
+ ""
+ '()
+ )
+
 ;;; todo: this is not typesetting info. Move to interpretation.
 (ly:add-interface
  'tablature-interface
diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm
index ec4977d958..dcdb696410 100644
--- a/scm/define-grobs.scm
+++ b/scm/define-grobs.scm
@@ -849,7 +849,7 @@
 	(padding . 1.0)
 	(X-offset-callbacks . (,Side_position_interface::aligned_side))
 	(direction . ,LEFT) 
-	(meta . ((interfaces . (side-position-interface text-interface font-interface item-interface ))))		
+	(meta . ((interfaces . (side-position-interface stanza-number-interface text-interface font-interface item-interface ))))		
 	))
 
     (StaffSpacing
-- 
2.39.5