]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/ligature-engraver.cc
Fix some bugs in the dynamic engraver and PostScript backend
[lilypond.git] / lily / ligature-engraver.cc
index 115eecb66287bbc2f9c5cd30eba191c22e6456c9..87db230110abe864de513ea2742c408a577b63f2 100644 (file)
@@ -3,17 +3,18 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2005 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2002--2006 Juergen Reuter <reuter@ipd.uka.de>
 */
 
 #include "ligature-engraver.hh"
 
-#include "spanner.hh"
-#include "score-engraver.hh"
+#include "context.hh"
+#include "international.hh"
 #include "note-head.hh"
 #include "rest.hh"
+#include "score-context.hh"
+#include "spanner.hh"
 #include "warn.hh"
-#include "context.hh"
 
 #include "translator.icc"
 
@@ -26,7 +27,7 @@
  *
  * A concrete ligature engraver must subclass this class and provide
  * functions create_ligature_spanner () and typeset_ligature
- * (Spanner *, Array<Grob_info>).  Subclasses of this class basically
+ * (Spanner *, vector<Grob_info>).  Subclasses of this class basically
  * fall into two categories.
  *
  * The first category consists of engravers that engrave ligatures in
@@ -89,61 +90,6 @@ Ligature_engraver::try_music (Music *m)
   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:
- *
- * \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 #'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_stencil_callback ()
-{
-  SCM target_callback = ly_symbol2scm ("print-function");
-  SCM source_callback = ly_symbol2scm ("ligature-primitive-callback");
-  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);
-}
-
-/*
- * This method should do something that comes close to the following
- * .ly snippet:
- *
- * \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 #'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_stencil_callback ()
-{
-  SCM symbol = ly_symbol2scm ("NoteHead");
-  SCM key = ly_symbol2scm ("print-function");
-  execute_pushpop_property (context (), symbol, key, SCM_UNDEFINED);
-}
-
 void
 Ligature_engraver::process_music ()
 {
@@ -156,27 +102,22 @@ Ligature_engraver::process_music ()
        }
 
       if (!last_bound_)
-       {
-         events_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_event_ = 0;
       finished_primitives_ = primitives_;
       finished_ligature_ = ligature_;
       primitives_.clear ();
       ligature_ = 0;
-      revert_stencil_callback ();
     }
   last_bound_ = unsmob_grob (get_property ("currentMusicalColumn"));
 
   if (ligature_)
     {
       // TODO: maybe forbid breaks only if not transcribing
-      get_score_engraver ()->forbid_breaks ();
+      context ()->get_score_context ()->set_property ("forbidBreak", SCM_BOOL_T);
     }
 
   if (events_drul_[START])
@@ -189,39 +130,20 @@ Ligature_engraver::process_music ()
 
       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");
-       }
 
       Grob *bound = unsmob_grob (get_property ("currentMusicalColumn"));
       if (!bound)
-       {
-         events_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_, 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 ()
 {
@@ -271,9 +193,11 @@ Ligature_engraver::acknowledge_note_head (Grob_info info)
 {
   if (ligature_)
     {
-      primitives_.push (info);
-      info.grob ()->set_property ("print-function",
-                                 brew_ligature_primitive_proc);
+      primitives_.push_back (info);
+      if (info.grob () && (brew_ligature_primitive_proc != SCM_EOL))
+       {
+         info.grob ()->set_property ("stencil", brew_ligature_primitive_proc);
+       }
     }
 }
 
@@ -289,12 +213,5 @@ Ligature_engraver::acknowledge_rest (Grob_info info)
     }
 }
 
-
-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",
-               /* reads */ "",
-               /* write */ "");
+// no ADD_ACKNOWLEDGER / ADD_ACKNOWLEDGER / ADD_TRANSLATOR macro calls
+// since this class is abstract