]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/ligature-engraver.cc
* po/nl.po: Update.
[lilypond.git] / lily / ligature-engraver.cc
index dfcb323ee9a81b0e80fdd04d89f49ee35f44a5f0..c74058e18c4c50bf181cb1c46abd41c4db230d7b 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 2002--2003 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2002--2004 Juergen Reuter <reuter@ipd.uka.de>
   
  */
 #include "ligature-engraver.hh"
@@ -12,7 +12,8 @@
 #include "note-head.hh"
 #include "rest.hh"
 #include "warn.hh"
-#include "translator-group.hh"
+#include "context.hh"
+
 
 /*
  * This abstract class provides the general framework for ligatures of
@@ -77,17 +78,9 @@ Ligature_engraver::Ligature_engraver ()
 bool
 Ligature_engraver::try_music (Music *m)
 {
-  if (m->is_mus_type ("abort-event"))
-    {
-      reqs_drul_[START] = 0;
-      reqs_drul_[STOP] = 0;
-      if (ligature_)
-       ligature_->suicide ();
-      ligature_ = 0;
-    }
-  else if (m->is_mus_type ("ligature-event"))
+  if (m->is_mus_type ("ligature-event"))
     {
-      Direction d = to_dir (m->get_mus_property ("span-direction"));
+      Direction d = to_dir (m->get_property ("span-direction"));
       reqs_drul_[d] = m;
       return true;
     }
@@ -107,46 +100,46 @@ Ligature_engraver::create_ligature_spanner ()
  * This method should do something that comes close to the following
  * .ly snippet:
  *
- * \property Voice.NoteHead \override #'molecule-callback =
+ * \property Voice.NoteHead \override #'print-function =
  *     < value of #'ligature-primitive-callback of Voice.NoteHead >
  *
  * TODO: What we are doing here on the c++ level, should actually be
  * performed on the SCM level.  However, I do not know how to teach
- * lilypond to apply an \override and \revert on #'molecule-callback,
+ * lilypond to apply an \override and \revert on #'print-function,
  * whenever lily encounters a \[ and \] in an .ly file, respectively.
  * Also encounter, that lily should not crash if a user erronously
  * nests \[ and \].
  */
 void
-Ligature_engraver::override_molecule_callback ()
+Ligature_engraver::override_stencil_callback ()
 {
-  SCM symbol = ly_symbol2scm ("NoteHead");
-  SCM target_callback = ly_symbol2scm ("molecule-callback");
+  SCM target_callback = ly_symbol2scm ("print-function");
   SCM source_callback = ly_symbol2scm ("ligature-primitive-callback");
-  SCM noteHeadProperties = daddy_trans_->get_property ("NoteHead");
+  SCM noteHeadProperties = updated_grob_properties (daddy_context_, ly_symbol2scm ("NoteHead"));
   SCM value = ly_cdr (scm_sloppy_assq (source_callback, noteHeadProperties));
-  daddy_trans_->execute_single_pushpop_property (symbol, target_callback, value);
+  execute_pushpop_property (daddy_context_, ly_symbol2scm ("NoteHead"),
+                           target_callback, value);
 }
 
 /*
  * This method should do something that comes close to the following
  * .ly snippet:
  *
- * \property Voice.NoteHead \revert #'molecule-callback
+ * \property Voice.NoteHead \revert #'print-function
  *
  * TODO: What we are doing here on the c++ level, should actually be
  * performed on the SCM level.  However, I do not know how to teach
- * lilypond to apply an \override and \revert on #'molecule-callback,
+ * lilypond to apply an \override and \revert on #'print-function,
  * whenever lily encounters a \[ and \] in an .ly file, respectively.
  * Also encounter, that lily should not crash if a user erronously
  * nests \[ and \].
  */
 void
-Ligature_engraver::revert_molecule_callback ()
+Ligature_engraver::revert_stencil_callback ()
 {
   SCM symbol = ly_symbol2scm ("NoteHead");
-  SCM key = ly_symbol2scm ("molecule-callback");
-  daddy_trans_->execute_single_pushpop_property (symbol, key, SCM_UNDEFINED);
+  SCM key = ly_symbol2scm ("print-function");
+  execute_pushpop_property (daddy_context_, symbol, key, SCM_UNDEFINED);
 }
 
 void
@@ -174,14 +167,14 @@ Ligature_engraver::process_music ()
       finished_ligature_ = ligature_;
       primitives_.clear ();
       ligature_ = 0;
-      revert_molecule_callback ();
+      revert_stencil_callback ();
     }
   last_bound_ = unsmob_grob (get_property ("currentMusicalColumn"));
 
   if (ligature_)
     {
       // TODO: maybe forbid breaks only if not transcribing
-      top_engraver ()->forbid_breaks ();
+      get_score_engraver ()->forbid_breaks ();
     }
 
   if (reqs_drul_[START])
@@ -195,7 +188,7 @@ Ligature_engraver::process_music ()
       prev_start_req_ = reqs_drul_[START];
       ligature_ = create_ligature_spanner ();
       brew_ligature_primitive_proc =
-       ligature_->get_grob_property ("ligature-primitive-callback");
+       ligature_->get_property ("ligature-primitive-callback");
       if (brew_ligature_primitive_proc == SCM_EOL)
        {
          warning ("Ligature_engraver: ligature-primitive-callback undefined");
@@ -213,18 +206,11 @@ Ligature_engraver::process_music ()
 
       ligature_start_mom_ = now_mom ();
       
-      announce_grob(ligature_, reqs_drul_[START]->self_scm());
-      override_molecule_callback ();
+      announce_grob (ligature_, reqs_drul_[START]->self_scm ());
+      override_stencil_callback ();
     }
 }
 
-void
-Ligature_engraver::start_translation_timestep ()
-{
-  reqs_drul_[START] = 0;
-  reqs_drul_[STOP] = 0;
-}
-
 void
 Ligature_engraver::typeset_ligature (Spanner *, Array<Grob_info>)
 {
@@ -238,10 +224,21 @@ Ligature_engraver::stop_translation_timestep ()
 {
   if (finished_ligature_)
     {
-      typeset_ligature (finished_ligature_, finished_primitives_);
-      finished_primitives_.clear ();
+      if (!finished_primitives_.size ())
+       {
+         finished_ligature_->programming_error ("Ligature_engraver::stop_translation_timestep (): "
+                                                "junking empty ligature");
+       }
+      else
+       {
+         typeset_ligature (finished_ligature_, finished_primitives_);
+         finished_primitives_.clear ();
+       }
       finished_ligature_ = 0;
     }
+
+  reqs_drul_[START] = 0;
+  reqs_drul_[STOP] = 0;
 }
 
 void
@@ -274,12 +271,12 @@ Ligature_engraver::acknowledge_grob (Grob_info info)
       if (Note_head::has_interface (info.grob_))
        {
          primitives_.push (info);
-         info.grob_->set_grob_property ("molecule-callback",
+         info.grob_->set_property ("print-function",
                                         brew_ligature_primitive_proc);
        }
       if (Rest::has_interface (info.grob_))
        {
-         info.music_cause ()->origin ()->warning (_ ("ligature may not contain rest; ignoring rest"));
+         info.music_cause ()->origin ()->warning (_ ("ignoring rest: ligature may not contain rest"));
          prev_start_req_->origin ()->warning (_ ("ligature was started here"));
          // TODO: maybe better should stop ligature here rather than
          // ignoring the rest?
@@ -290,7 +287,7 @@ Ligature_engraver::acknowledge_grob (Grob_info info)
 ENTER_DESCRIPTION (Ligature_engraver,
 /* descr */       "Abstract class; a concrete subclass handles Ligature_events by engraving Ligatures in a concrete style.",
 /* creats */      "",
-/* accepts */     "ligature-event abort-event",
+/* accepts */     "ligature-event",
 /* acks  */      "note-head-interface rest-interface",
 /* reads */       "",
 /* write */       "");