X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Ffootnote-engraver.cc;h=78d2f0e6d3b8edaa761dbf243522d2691d432ecf;hb=0d13da15da86d830bc2ae00da6cfc38b99653d6d;hp=89cecc3a0080b2fc48b1fa8f1b7dacafe6f88c32;hpb=a42aaa559b71ce5776795fa11a7e1df9110d85b7;p=lilypond.git diff --git a/lily/footnote-engraver.cc b/lily/footnote-engraver.cc index 89cecc3a00..78d2f0e6d3 100644 --- a/lily/footnote-engraver.cc +++ b/lily/footnote-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011 Mike Solomon + Copyright (C) 2011--2012 Mike Solomon LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,7 +19,9 @@ #include "engraver.hh" +#include "music.hh" #include "stream-event.hh" +#include "international.hh" #include "item.hh" #include "pointer-group-interface.hh" #include "spanner.hh" @@ -39,6 +41,7 @@ class Footnote_engraver : public Engraver void stop_translation_timestep (); void finalize (); + virtual void derived_mark () const; void footnotify (Grob *, Stream_event *); }; @@ -59,7 +62,14 @@ Footnote_engraver::stop_translation_timestep () void Footnote_engraver::finalize () { - annotated_spanners_.resize (0); + annotated_spanners_.clear (); +} + +void +Footnote_engraver::derived_mark () const +{ + for (vsize i = 0; i < events_.size (); ++i) + scm_gc_mark (events_[i]->self_scm ()); } Footnote_engraver::Footnote_engraver () @@ -91,6 +101,26 @@ Footnote_engraver::footnotify (Grob *g, Stream_event *event) void Footnote_engraver::acknowledge_grob (Grob_info info) { + Music *mus = unsmob_music (info.grob ()->get_property ("footnote-music")); + + if (mus) + { + if (!mus->is_mus_type ("footnote-event")) { + mus->origin ()->programming_error (_ ("Must be footnote-event.")); + return; + } + Stream_event *ev = mus->to_event (context ()); + footnotify (info.grob (), ev); + ev->unprotect (); + return; + } + + // The following performance hog should eventually be removed: + // instead of adding a -\footnote ... \default articulation at the + // end of a note, you can perfectly well use \footnote ... before + // the note. This is just for the sake of automatic convert-ly + // rules. + Stream_event *cause = info.event_cause (); SCM arts = cause ? cause->get_property ("articulations") : SCM_EOL; @@ -101,6 +131,10 @@ Footnote_engraver::acknowledge_grob (Grob_info info) footnotify (info.grob (), e); } + // In contrast, the following code is only called when actual + // footnote events have been listened to. It should not affect + // performance. + for (vsize i = 0; i < events_.size (); i++) { if (info.grob ()->name () == ly_symbol2string (events_[i]->get_property ("symbol")))