]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/ligature-engraver.cc
* lily/include/tie.hh (struct Tie_details): add x_gap_
[lilypond.git] / lily / ligature-engraver.cc
index 70f490e3b48ea7df52e6be95c0f7d3acb5c75ec2..cd975b71e98c8f72244ee7e380b44b9210f03ee3 100644 (file)
 #include "warn.hh"
 #include "context.hh"
 
+#include "translator.icc"
+
 /*
  * 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.
@@ -69,8 +71,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;
 }
@@ -81,21 +83,12 @@ Ligature_engraver::try_music (Music *m)
   if (m->is_mus_type ("ligature-event"))
     {
       Direction d = to_dir (m->get_property ("span-direction"));
-      reqs_drul_[d] = m;
+      events_drul_[d] = m;
       return true;
     }
   return false;
 }
 
-Spanner *
-Ligature_engraver::create_ligature_spanner ()
-{
-  programming_error ("Ligature_engraver::create_ligature_spanner (): "
-                    "this is an abstract method that should not be called, "
-                    "but overridden by a subclass");
-  return 0;
-}
-
 /*
  * This method should do something that comes close to the following
  * .ly snippet:
@@ -145,24 +138,20 @@ Ligature_engraver::revert_stencil_callback ()
 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_);
-       }
+       ligature_->set_bound (RIGHT, last_bound_);
 
-      prev_start_req_ = 0;
+      prev_start_event_ = 0;
       finished_primitives_ = primitives_;
       finished_ligature_ = ligature_;
       primitives_.clear ();
@@ -177,49 +166,35 @@ Ligature_engraver::process_music ()
       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_property ("ligature-primitive-callback");
       if (brew_ligature_primitive_proc == SCM_EOL)
-       {
-         programming_error ("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
-       {
-         ligature_->set_bound (LEFT, bound);
-       }
+       ligature_->set_bound (LEFT, bound);
 
       ligature_start_mom_ = now_mom ();
 
       // TODO: dump cause into make_item/spanner. 
-      // announce_grob (ligature_, reqs_drul_[START]->self_scm ());
+      // announce_grob (ligature_, events_drul_[START]->self_scm ());
       override_stencil_callback ();
     }
 }
 
-void
-Ligature_engraver::typeset_ligature (Spanner *, Array<Grob_info>)
-{
-  programming_error ("Ligature_engraver::typeset_ligature (): "
-                    "this is an abstract method that should not be called, "
-                    "but overridden by a subclass");
-}
-
 void
 Ligature_engraver::stop_translation_timestep ()
 {
@@ -238,8 +213,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
@@ -253,7 +228,7 @@ Ligature_engraver::finalize ()
     }
   if (ligature_)
     {
-      prev_start_req_->origin ()->warning (_ ("unterminated ligature"));
+      prev_start_event_->origin ()->warning (_ ("unterminated ligature"));
       ligature_->suicide ();
     }
 }
@@ -265,30 +240,30 @@ 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);
+      if (info.grob ())
        {
-         primitives_.push (info);
          info.grob ()->set_property ("print-function",
-                                   brew_ligature_primitive_proc);
-       }
-      if (Rest::has_interface (info.grob ()))
-       {
-         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?
+                                     brew_ligature_primitive_proc);
        }
     }
 }
 
-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  */ "note-head-interface rest-interface",
-               /* reads */ "",
-               /* write */ "");
+void
+Ligature_engraver::acknowledge_rest (Grob_info info)
+{
+  if (ligature_)
+    {
+      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?
+    }
+}
+
+// no ADD_ACKNOWLEDGER / ADD_ACKNOWLEDGER / ADD_TRANSLATOR macro calls
+// since this class is abstract