X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ffootnote-engraver.cc;h=ea5c4781b55532da20566082a7e6b2dc5b386349;hb=97a0169312a260933246ab224e4f8b0969871dd5;hp=830fdfe97227c6b06412bd4ab66d8a73f69891c0;hpb=6bc024330084b2d23ca58c4075c75fe0b4257060;p=lilypond.git diff --git a/lily/footnote-engraver.cc b/lily/footnote-engraver.cc index 830fdfe972..ea5c4781b5 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--2012 Mike Solomon + Copyright (C) 2011--2015 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 @@ -33,66 +33,44 @@ class Footnote_engraver : public Engraver { TRANSLATOR_DECLARATIONS (Footnote_engraver); - DECLARE_TRANSLATOR_LISTENER (footnote); - DECLARE_ACKNOWLEDGER (grob); - DECLARE_END_ACKNOWLEDGER (grob); - vector events_; + void acknowledge_grob (Grob_info); + void acknowledge_end_grob (Grob_info); + vector > annotated_spanners_; - void stop_translation_timestep (); void finalize (); - virtual void derived_mark () const; - void footnotify (Grob *, Stream_event *); + void footnotify (Grob *, SCM); }; -IMPLEMENT_TRANSLATOR_LISTENER (Footnote_engraver, footnote); -void -Footnote_engraver::listen_footnote (Stream_event *ev) -{ - events_.push_back (ev); -} - -void -Footnote_engraver::stop_translation_timestep () -{ - events_.clear (); -} - void Footnote_engraver::finalize () { 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 () +Footnote_engraver::Footnote_engraver (Context *c) + : Engraver (c) { } void -Footnote_engraver::footnotify (Grob *g, Stream_event *event) +Footnote_engraver::footnotify (Grob *g, SCM cause) { Spanner *s = dynamic_cast(g); if (s) { - Spanner *b = make_spanner ("FootnoteSpanner", event->self_scm ()); + Spanner *b = make_spanner ("FootnoteSpanner", cause); b->set_parent (s, Y_AXIS); b->set_parent (s, X_AXIS); - Grob *bound = unsmob_grob (get_property ("currentMusicalColumn")); + Grob *bound = unsmob (get_property ("currentMusicalColumn")); b->set_bound (LEFT, bound); annotated_spanners_.push_back (Drul_array (s, b)); } else { - Grob *b = make_item ("FootnoteItem", event->self_scm ()); + Grob *b = make_item ("FootnoteItem", cause); b->set_parent (g, Y_AXIS); b->set_parent (g, X_AXIS); } @@ -101,46 +79,22 @@ 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")); + Music *mus = unsmob (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. + if (!mus->is_mus_type ("footnote-event")) + { + mus->origin ()->programming_error (_ ("Must be footnote-event.")); + return; + } - Stream_event *cause = info.event_cause (); - - SCM arts = cause ? cause->get_property ("articulations") : SCM_EOL; - for (SCM s = arts; scm_is_pair (s); s = scm_cdr (s)) - { - Stream_event *e = unsmob_stream_event (scm_car (s)); - if (e->in_event_class ("footnote-event")) - footnotify (info.grob (), e); - } + footnotify (info.grob (), mus->to_event ()->unprotect ()); - // In contrast, the following code is only called when actual - // footnote events have been listened to. It should not affect - // performance. + // This grob has exhausted its footnote + info.grob ()->set_property ("footnote-music", SCM_EOL); - for (vsize i = 0; i < events_.size (); i++) - { - SCM name = events_[i]->get_property ("symbol"); - if (!scm_is_symbol (name) - || info.grob ()->name () == ly_symbol2string (name)) - footnotify (info.grob (), events_[i]); + return; } } @@ -154,15 +108,20 @@ Footnote_engraver::acknowledge_end_grob (Grob_info info) { if (annotated_spanners_[i][LEFT] == s) { - Grob *bound = unsmob_grob (get_property ("currentMusicalColumn")); + Grob *bound = unsmob (get_property ("currentMusicalColumn")); annotated_spanners_[i][RIGHT]->set_bound (RIGHT, bound); break; } } } -ADD_ACKNOWLEDGER (Footnote_engraver, grob); -ADD_END_ACKNOWLEDGER (Footnote_engraver, grob); + +void +Footnote_engraver::boot () +{ + ADD_ACKNOWLEDGER (Footnote_engraver, grob); + ADD_END_ACKNOWLEDGER (Footnote_engraver, grob); +} ADD_TRANSLATOR (Footnote_engraver, /* doc */