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-engraver.hh"
+#include "spanner.hh"
#include "warn.hh"
-#include "context.hh"
#include "translator.icc"
*
* 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
return false;
}
-/*
- * 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 ()
{
finished_ligature_ = ligature_;
primitives_.clear ();
ligature_ = 0;
- revert_stencil_callback ();
}
last_bound_ = unsmob_grob (get_property ("currentMusicalColumn"));
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)
// TODO: dump cause into make_item/spanner.
// announce_grob (ligature_, events_drul_[START]->self_scm ());
- override_stencil_callback ();
}
}
{
if (ligature_)
{
- primitives_.push (info);
- if (info.grob ())
+ primitives_.push_back (info);
+ if (info.grob () && (brew_ligature_primitive_proc != SCM_EOL))
{
- info.grob ()->set_property ("print-function",
- brew_ligature_primitive_proc);
+ info.grob ()->set_property ("stencil", brew_ligature_primitive_proc);
}
}
}