]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/ligature-engraver.cc
*** empty log message ***
[lilypond.git] / lily / ligature-engraver.cc
index a026118b98667e4b2dc3406725988d42bd772aa6..7f47ce516572e1479b7137b582bf360d25b09702 100644 (file)
@@ -1,22 +1,23 @@
-/*   
+/*
   ligature-engraver.cc -- implement Ligature_engraver
-  
+
   source file of the GNU LilyPond music typesetter
-  
-  (c) 2002--2004 Juergen Reuter <reuter@ipd.uka.de>
-  
- */
+
+  (c) 2002--2005 Juergen Reuter <reuter@ipd.uka.de>
+*/
+
 #include "ligature-engraver.hh"
+
 #include "spanner.hh"
 #include "score-engraver.hh"
 #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
- * any kind.  It cares for handling start/stop ligatures requests and
+ * any kind.  It cares for handling start/stop ligatures events and
  * collecting all noteheads inbetween, but delegates creation of a
  * ligature spanner for each start/stop pair and typesetting of the
  * ligature spanner to a concrete subclass.
@@ -57,7 +58,7 @@
  * Mensural_ligature_engraver) to the proper translator
  * (e.g. VoiceContext) to choose between various representations.
  * Since adding/removing an engraver to a translator is a global
- * action in the paper block, you can not mix various representations
+ * action in the layout block, you cannot mix various representations
  * _within_ the same score.  Hence, for selecting a representation,
  * one would rather like to have a property that can be set e.g. for
  * several staves individually.  However, it seems that this approach
@@ -68,8 +69,8 @@ Ligature_engraver::Ligature_engraver ()
 {
   ligature_ = 0;
   finished_ligature_ = 0;
-  reqs_drul_[LEFT] = reqs_drul_[RIGHT] = 0;
-  prev_start_req_ = 0;
+  events_drul_[LEFT] = events_drul_[RIGHT] = 0;
+  prev_start_event_ = 0;
   last_bound_ = 0;
   brew_ligature_primitive_proc = SCM_EOL;
 }
@@ -79,8 +80,8 @@ Ligature_engraver::try_music (Music *m)
 {
   if (m->is_mus_type ("ligature-event"))
     {
-      Direction d = to_dir (m->get_mus_property ("span-direction"));
-      reqs_drul_[d] = m;
+      Direction d = to_dir (m->get_property ("span-direction"));
+      events_drul_[d] = m;
       return true;
     }
   return false;
@@ -114,9 +115,9 @@ Ligature_engraver::override_stencil_callback ()
 {
   SCM target_callback = ly_symbol2scm ("print-function");
   SCM source_callback = ly_symbol2scm ("ligature-primitive-callback");
-  SCM noteHeadProperties = updated_grob_properties (daddy_trans_, ly_symbol2scm ("NoteHead"));
-  SCM value = ly_cdr (scm_sloppy_assq (source_callback, noteHeadProperties));
-  execute_pushpop_property (daddy_trans_, ly_symbol2scm ("NoteHead"),
+  SCM noteHeadProperties = updated_grob_properties (context (), ly_symbol2scm ("NoteHead"));
+  SCM value = scm_cdr (scm_sloppy_assq (source_callback, noteHeadProperties));
+  execute_pushpop_property (context (), ly_symbol2scm ("NoteHead"),
                            target_callback, value);
 }
 
@@ -138,30 +139,30 @@ Ligature_engraver::revert_stencil_callback ()
 {
   SCM symbol = ly_symbol2scm ("NoteHead");
   SCM key = ly_symbol2scm ("print-function");
-  execute_pushpop_property (daddy_trans_, symbol, key, SCM_UNDEFINED);
+  execute_pushpop_property (context (), symbol, key, SCM_UNDEFINED);
 }
 
 void
 Ligature_engraver::process_music ()
 {
-  if (reqs_drul_[STOP])
+  if (events_drul_[STOP])
     {
       if (!ligature_)
        {
-         reqs_drul_[STOP]->origin ()->warning (_ ("can't find start of ligature"));
+         events_drul_[STOP]->origin ()->warning (_ ("can't find start of ligature"));
          return;
        }
 
       if (!last_bound_)
        {
-         reqs_drul_[STOP]->origin ()->warning (_ ("no right bound"));
+         events_drul_[STOP]->origin ()->warning (_ ("no right bound"));
        }
       else
        {
          ligature_->set_bound (RIGHT, last_bound_);
        }
 
-      prev_start_req_ = 0;
+      prev_start_event_ = 0;
       finished_primitives_ = primitives_;
       finished_ligature_ = ligature_;
       primitives_.clear ();
@@ -173,30 +174,30 @@ Ligature_engraver::process_music ()
   if (ligature_)
     {
       // TODO: maybe forbid breaks only if not transcribing
-      top_engraver ()->forbid_breaks ();
+      get_score_engraver ()->forbid_breaks ();
     }
 
-  if (reqs_drul_[START])
+  if (events_drul_[START])
     {
       if (ligature_)
        {
-         reqs_drul_[START]->origin ()->warning (_ ("already have a ligature"));
+         events_drul_[START]->origin ()->warning (_ ("already have a ligature"));
          return;
        }
 
-      prev_start_req_ = reqs_drul_[START];
+      prev_start_event_ = events_drul_[START];
       ligature_ = create_ligature_spanner ();
-      brew_ligature_primitive_proc =
-       ligature_->get_grob_property ("ligature-primitive-callback");
+      brew_ligature_primitive_proc
+       = ligature_->get_property ("ligature-primitive-callback");
       if (brew_ligature_primitive_proc == SCM_EOL)
        {
-         warning ("Ligature_engraver: ligature-primitive-callback undefined");
+         programming_error ("Ligature_engraver: ligature-primitive-callback undefined");
        }
 
       Grob *bound = unsmob_grob (get_property ("currentMusicalColumn"));
       if (!bound)
        {
-         reqs_drul_[START]->origin ()->warning (_ ("no left bound"));
+         events_drul_[START]->origin ()->warning (_ ("no left bound"));
        }
       else
        {
@@ -204,8 +205,9 @@ Ligature_engraver::process_music ()
        }
 
       ligature_start_mom_ = now_mom ();
-      
-      announce_grob(ligature_, reqs_drul_[START]->self_scm());
+
+      // TODO: dump cause into make_item/spanner. 
+      // announce_grob (ligature_, events_drul_[START]->self_scm ());
       override_stencil_callback ();
     }
 }
@@ -236,8 +238,8 @@ Ligature_engraver::stop_translation_timestep ()
       finished_ligature_ = 0;
     }
 
-  reqs_drul_[START] = 0;
-  reqs_drul_[STOP] = 0;
+  events_drul_[START] = 0;
+  events_drul_[STOP] = 0;
 }
 
 void
@@ -251,7 +253,7 @@ Ligature_engraver::finalize ()
     }
   if (ligature_)
     {
-      prev_start_req_->origin ()->warning (_ ("unterminated ligature"));
+      prev_start_event_->origin ()->warning (_ ("unterminated ligature"));
       ligature_->suicide ();
     }
 }
@@ -263,30 +265,34 @@ Ligature_engraver::current_ligature ()
 }
 
 void
-Ligature_engraver::acknowledge_grob (Grob_info info)
+Ligature_engraver::acknowledge_note_head (Grob_info info)
 {
   if (ligature_)
     {
-      if (Note_head::has_interface (info.grob_))
-       {
-         primitives_.push (info);
-         info.grob_->set_grob_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"));
-         prev_start_req_->origin ()->warning (_ ("ligature was started here"));
-         // TODO: maybe better should stop ligature here rather than
-         // ignoring the rest?
-       }
+      primitives_.push (info);
+      info.grob ()->set_property ("print-function",
+                                 brew_ligature_primitive_proc);
     }
 }
 
-ENTER_DESCRIPTION (Ligature_engraver,
-/* descr */       "Abstract class; a concrete subclass handles Ligature_events by engraving Ligatures in a concrete style.",
-/* creats */      "",
-/* accepts */     "ligature-event",
-/* acks  */      "note-head-interface rest-interface",
-/* reads */       "",
-/* write */       "");
+void
+Ligature_engraver::acknowledge_rest (Grob_info info)
+{
+  info.music_cause ()->origin ()->warning (_ ("ignoring rest: ligature may not contain rest"));
+  prev_start_event_->origin ()->warning (_ ("ligature was started here"));
+  // TODO: maybe better should stop ligature here rather than
+  // ignoring the rest?
+}
+
+
+#include "translator.icc"
+
+ADD_ACKNOWLEDGER(Ligature_engraver, rest);
+ADD_ACKNOWLEDGER(Ligature_engraver, note_head);
+ADD_TRANSLATOR (Ligature_engraver,
+               /* descr */ "Abstract class; a concrete subclass handles Ligature_events by engraving Ligatures in a concrete style.",
+               /* creats */ "",
+               /* accepts */ "ligature-event",
+               /* acks  */ "",
+               /* reads */ "",
+               /* write */ "");