X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fligature-bracket-engraver.cc;h=85cd473ecd21ee4e0ffbb5bdd7a281bd9c687700;hb=70cc70f3a6183472b93fc4c2b4c60cc0375b6d64;hp=d933448862f12c7357225e3a12e712133bbddb6f;hpb=b55303a78f027962dbebf62dbe396325f3b6e1a5;p=lilypond.git diff --git a/lily/ligature-bracket-engraver.cc b/lily/ligature-bracket-engraver.cc index d933448862..85cd473ecd 100644 --- a/lily/ligature-bracket-engraver.cc +++ b/lily/ligature-bracket-engraver.cc @@ -1,193 +1,89 @@ -/* - ligature-bracket-engraver.cc -- implement Ligature__bracket_engraver - - source file of the GNU LilyPond music typesetter - - (c) 2002 Juergen Reuter - - */ -#include "engraver.hh" -#include "musical-request.hh" -#include "warn.hh" -#include "drul-array.hh" -#include "item.hh" -#include "spanner.hh" -#include "score-engraver.hh" -#include "note-head.hh" -#include "stem.hh" -#include "rest.hh" +/* + ligature-bracket-engraver.cc -- implement Ligature_bracket_engraver -class Ligature_bracket_engraver : public Engraver -{ - Drul_array reqs_drul_; - - Spanner *finished_ligature_bracket_p_; - Spanner *ligature_bracket_p_; - Span_req *prev_start_req_; + source file of the GNU LilyPond music typesetter - // moment where ligature started. - Moment ligature_start_mom_; - Grob *last_bound; + (c) 2002--2007 Juergen Reuter +*/ -protected: - virtual void stop_translation_timestep (); - virtual void start_translation_timestep (); - virtual void finalize (); +#include "ligature-engraver.hh" +#include "note-column.hh" +#include "tuplet-bracket.hh" +#include "spanner.hh" +#include "stream-event.hh" +#include "spanner.hh" +#include "item.hh" - virtual void acknowledge_grob (Grob_info); - virtual bool try_music (Music*); - virtual void process_music (); +#include "translator.icc" +/* + * This engraver marks ligatures of any kind by just printing a + * horizontal square bracket on top of each ligature. See class + * Ligature_engraver for more information on the interaction between + * this class and its superclass. + */ +class Ligature_bracket_engraver : public Ligature_engraver +{ +protected: + virtual Spanner *create_ligature_spanner (); + virtual void typeset_ligature (Spanner *ligature, + vector primitives); + DECLARE_ACKNOWLEDGER (rest); + DECLARE_ACKNOWLEDGER (note_column); + DECLARE_TRANSLATOR_LISTENER (ligature); public: - TRANSLATOR_DECLARATIONS(Ligature_bracket_engraver); - -private: - void typeset_ligature_bracket (); + TRANSLATOR_DECLARATIONS (Ligature_bracket_engraver); }; - -Ligature_bracket_engraver::Ligature_bracket_engraver () -{ - ligature_bracket_p_ = 0; - finished_ligature_bracket_p_ = 0; - reqs_drul_[LEFT] = reqs_drul_[RIGHT] = 0; - prev_start_req_ = 0; - last_bound = 0; -} - -bool -Ligature_bracket_engraver::try_music (Music *m) -{ - if (Span_req *req_ = dynamic_cast (m)) - { - if (scm_equal_p (req_->get_mus_property ("span-type"), - ly_str02scm ("abort")) == SCM_BOOL_T) - { - reqs_drul_[START] = 0; - reqs_drul_[STOP] = 0; - if (ligature_bracket_p_) - ligature_bracket_p_->suicide (); - ligature_bracket_p_ = 0; - } - else if (scm_equal_p (req_->get_mus_property ("span-type"), - ly_str02scm ("ligature-bracket")) == SCM_BOOL_T) - { - Direction d = req_->get_span_dir (); - reqs_drul_[d] = req_; - return true; - } - } - return false; -} - +IMPLEMENT_TRANSLATOR_LISTENER (Ligature_bracket_engraver, ligature); void -Ligature_bracket_engraver::process_music () +Ligature_bracket_engraver::listen_ligature (Stream_event *ev) { - if (reqs_drul_[STOP]) - { - if (!ligature_bracket_p_) - reqs_drul_[STOP]->origin ()->warning (_ ("can't find start of ligature")); - else - { - if (!last_bound) - { - reqs_drul_[STOP]->origin ()->warning (_ ("no right bound")); - } - else - { - ligature_bracket_p_->set_bound (RIGHT, last_bound); - } - } - prev_start_req_ = 0; - finished_ligature_bracket_p_ = ligature_bracket_p_; - ligature_bracket_p_ = 0; - } - last_bound = unsmob_grob (get_property ("currentMusicalColumn")); - - if (ligature_bracket_p_) - { - // TODO: maybe forbid breaks only if not transcribing - top_engraver ()->forbid_breaks (); - } - if (reqs_drul_[START]) - { - if (ligature_bracket_p_) - { - reqs_drul_[START]->origin ()->warning (_ ("already have a ligature")); - return; - } - - prev_start_req_ = reqs_drul_[START]; - ligature_bracket_p_ = new Spanner (get_property ("LigatureBracket")); - - Grob *bound = unsmob_grob (get_property ("currentMusicalColumn")); - if (!bound) - { - reqs_drul_[START]->origin ()->warning (_ ("no left bound")); - } - else - { - ligature_bracket_p_->set_bound (LEFT, bound); - } - - ligature_start_mom_ = now_mom (); - - announce_grob(ligature_bracket_p_, reqs_drul_[START]->self_scm()); - } + Ligature_engraver::listen_ligature (ev); } -void -Ligature_bracket_engraver::start_translation_timestep () +Ligature_bracket_engraver::Ligature_bracket_engraver () { - reqs_drul_[START] = 0; - reqs_drul_[STOP] = 0; } -void -Ligature_bracket_engraver::typeset_ligature_bracket () +Spanner * +Ligature_bracket_engraver::create_ligature_spanner () { - if (finished_ligature_bracket_p_) - { - typeset_grob (finished_ligature_bracket_p_); - finished_ligature_bracket_p_ = 0; - } + return make_spanner ("LigatureBracket", SCM_EOL); } void -Ligature_bracket_engraver::stop_translation_timestep () +Ligature_bracket_engraver::typeset_ligature (Spanner *, vector) { - typeset_ligature_bracket (); + // no real ligature to typeset; the LigatureBracket just does it } void -Ligature_bracket_engraver::finalize () +Ligature_bracket_engraver::acknowledge_note_column (Grob_info info) { - typeset_ligature_bracket (); - if (ligature_bracket_p_) + if (current_ligature ()) { - prev_start_req_->origin ()->warning (_ ("unterminated ligature")); - ligature_bracket_p_->suicide (); + Tuplet_bracket::add_column (current_ligature (), + dynamic_cast (info.grob ())); + + // avoid "junking empty ligature" message by acknowledging dummy + // note head + Ligature_engraver::acknowledge_note_head (Grob_info ()); } } void -Ligature_bracket_engraver::acknowledge_grob (Grob_info info) +Ligature_bracket_engraver::acknowledge_rest (Grob_info info) { - if (ligature_bracket_p_) - { - if (Rest::has_interface (info.grob_l_)) - { - reqs_drul_[START]->origin ()->warning (_ ("ligature may not contain rest; ignoring rest")); - prev_start_req_->origin ()->warning (_ ("ligature was started here")); - // TODO: maybe better should stop ligature here rather than - // ignoring the rest? - } - } + if (current_ligature ()) + Ligature_engraver::acknowledge_rest (info); } -ENTER_DESCRIPTION(Ligature_bracket_engraver, -/* descr */ "Handles Ligature_requests by engraving Ligature brackets.", -/* creats*/ "LigatureBracket", -/* acks */ "rest-interface", -/* reads */ "", -/* write */ ""); +ADD_ACKNOWLEDGER (Ligature_bracket_engraver, rest); +ADD_ACKNOWLEDGER (Ligature_bracket_engraver, note_column); + +ADD_TRANSLATOR (Ligature_bracket_engraver, + /* doc */ "Handles Ligature_events by engraving Ligature brackets.", + /* create */ "TupletBracket", + /* read */ "", + /* write */ "");