X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fligature-bracket-engraver.cc;h=4c3cd4b9b67ceb9e745614491557ef99676168b4;hb=3aadd90d55f7c838071411ca839307e4500e6ad6;hp=d933448862f12c7357225e3a12e712133bbddb6f;hpb=b55303a78f027962dbebf62dbe396325f3b6e1a5;p=lilypond.git diff --git a/lily/ligature-bracket-engraver.cc b/lily/ligature-bracket-engraver.cc index d933448862..4c3cd4b9b6 100644 --- a/lily/ligature-bracket-engraver.cc +++ b/lily/ligature-bracket-engraver.cc @@ -1,193 +1,137 @@ -/* - 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" +/* + This file is part of LilyPond, the GNU music typesetter. + + Copyright (C) 2002--2010 Juergen Reuter + + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . +*/ + +#include "international.hh" + +#include "ligature-engraver.hh" +#include "note-column.hh" +#include "tuplet-bracket.hh" #include "spanner.hh" -#include "score-engraver.hh" -#include "note-head.hh" -#include "stem.hh" -#include "rest.hh" +#include "stream-event.hh" +#include "spanner.hh" +#include "item.hh" + +#include "translator.icc" class Ligature_bracket_engraver : public Engraver { - Drul_array reqs_drul_; - - Spanner *finished_ligature_bracket_p_; - Spanner *ligature_bracket_p_; - Span_req *prev_start_req_; - - // moment where ligature started. - Moment ligature_start_mom_; - Grob *last_bound; - protected: - virtual void stop_translation_timestep (); - virtual void start_translation_timestep (); - virtual void finalize (); - - virtual void acknowledge_grob (Grob_info); - virtual bool try_music (Music*); virtual void process_music (); - + virtual void stop_translation_timestep (); + DECLARE_ACKNOWLEDGER (rest); + DECLARE_ACKNOWLEDGER (note_column); + DECLARE_TRANSLATOR_LISTENER (ligature); public: - TRANSLATOR_DECLARATIONS(Ligature_bracket_engraver); + TRANSLATOR_DECLARATIONS (Ligature_bracket_engraver); private: - void typeset_ligature_bracket (); + Drul_array events_drul_; + Spanner *finished_ligature_; + Spanner *ligature_; + Stream_event *previous_start_event_; }; - -Ligature_bracket_engraver::Ligature_bracket_engraver () +IMPLEMENT_TRANSLATOR_LISTENER (Ligature_bracket_engraver, ligature); +void +Ligature_bracket_engraver::listen_ligature (Stream_event *ev) { - ligature_bracket_p_ = 0; - finished_ligature_bracket_p_ = 0; - reqs_drul_[LEFT] = reqs_drul_[RIGHT] = 0; - prev_start_req_ = 0; - last_bound = 0; + Direction d = to_dir (ev->get_property ("span-direction")); + ASSIGN_EVENT_ONCE (events_drul_[d], ev); } -bool -Ligature_bracket_engraver::try_music (Music *m) +Ligature_bracket_engraver::Ligature_bracket_engraver () { - 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; + ligature_ = 0; + finished_ligature_ = 0; + events_drul_[LEFT] = events_drul_[RIGHT] = 0; + previous_start_event_ = 0; } void -Ligature_bracket_engraver::process_music () +Ligature_bracket_engraver::process_music() { - if (reqs_drul_[STOP]) + if (events_drul_[STOP]) { - if (!ligature_bracket_p_) - reqs_drul_[STOP]->origin ()->warning (_ ("can't find start of ligature")); - else + if (!ligature_) { - if (!last_bound) - { - reqs_drul_[STOP]->origin ()->warning (_ ("no right bound")); - } - else - { - ligature_bracket_p_->set_bound (RIGHT, last_bound); - } + events_drul_[STOP]->origin ()->warning (_ ("cannot find start of ligature")); + return; } - 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 (); + finished_ligature_ = ligature_; + ligature_ = 0; + previous_start_event_ = 0; } - if (reqs_drul_[START]) + + if (events_drul_[START]) { - if (ligature_bracket_p_) + if (ligature_) { - reqs_drul_[START]->origin ()->warning (_ ("already have a ligature")); + events_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()); + previous_start_event_ = events_drul_[START]; + ligature_ = make_spanner ("LigatureBracket", events_drul_[START]->self_scm ()); } } void -Ligature_bracket_engraver::start_translation_timestep () +Ligature_bracket_engraver::acknowledge_note_column (Grob_info info) { - reqs_drul_[START] = 0; - reqs_drul_[STOP] = 0; -} - -void -Ligature_bracket_engraver::typeset_ligature_bracket () -{ - if (finished_ligature_bracket_p_) + if (ligature_) { - typeset_grob (finished_ligature_bracket_p_); - finished_ligature_bracket_p_ = 0; + Tuplet_bracket::add_column (ligature_, + info.item ()); + add_bound_item (ligature_, info.item()); } } void -Ligature_bracket_engraver::stop_translation_timestep () +Ligature_bracket_engraver::acknowledge_rest (Grob_info info) { - typeset_ligature_bracket (); + acknowledge_note_column(info); } -void -Ligature_bracket_engraver::finalize () -{ - typeset_ligature_bracket (); - if (ligature_bracket_p_) - { - prev_start_req_->origin ()->warning (_ ("unterminated ligature")); - ligature_bracket_p_->suicide (); - } -} void -Ligature_bracket_engraver::acknowledge_grob (Grob_info info) +Ligature_bracket_engraver::stop_translation_timestep () { - 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? - } - } + events_drul_[LEFT] = + events_drul_[RIGHT] = 0; + finished_ligature_ = 0; } -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 */ + "Handle @code{Ligature_events} by engraving @code{Ligature}" + " brackets.", + + /* create */ + "LigatureBracket ", + + /* read */ + "", + + /* write */ + "" + );