X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fledger-line-engraver.cc;h=cde6f5817cde603cca91c6d5b214cd7a739d35ac;hb=77267b700c377fd170abcbf4863728937038eb5e;hp=ad15e9f4957dadcf475a50d6f84689b0b9b04ba4;hpb=811be522d0b79493159f47789e5621dc85493495;p=lilypond.git diff --git a/lily/ledger-line-engraver.cc b/lily/ledger-line-engraver.cc index ad15e9f495..cde6f5817c 100644 --- a/lily/ledger-line-engraver.cc +++ b/lily/ledger-line-engraver.cc @@ -1,9 +1,20 @@ /* - ledger-line-engraver.cc -- implement Ledger_line_engraver + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2004--2015 Han-Wen Nienhuys - (c) 2004--2005 Han-Wen Nienhuys + 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 "pointer-group-interface.hh" @@ -11,9 +22,12 @@ #include "engraver.hh" #include "staff-symbol.hh" +#include "translator.icc" + class Ledger_line_engraver : public Engraver { Spanner *span_; + vector ledgered_grobs_; public: TRANSLATOR_DECLARATIONS (Ledger_line_engraver); @@ -21,15 +35,17 @@ public: protected: virtual void finalize (); void process_music (); - - DECLARE_ACKNOWLEDGER (ledgered); - DECLARE_ACKNOWLEDGER (staff_symbol); + + void acknowledge_ledgered (Grob_info); + void acknowledge_staff_symbol (Grob_info); void start_spanner (); void stop_spanner (); + void stop_translation_timestep (); }; -Ledger_line_engraver::Ledger_line_engraver () +Ledger_line_engraver::Ledger_line_engraver (Context *c) + : Engraver (c) { span_ = 0; } @@ -38,14 +54,34 @@ void Ledger_line_engraver::start_spanner () { assert (!span_); + span_ = make_spanner ("LedgerLineSpanner", SCM_EOL); + span_->set_bound (LEFT, unsmob (get_property ("currentCommandColumn"))); +} - span_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn"))); +void +Ledger_line_engraver::stop_translation_timestep () +{ + if (span_) + { + for (vsize i = 0; i < ledgered_grobs_.size (); i++) + { + if (!to_boolean (ledgered_grobs_[i]->get_property ("no-ledgers"))) + Pointer_group_interface::add_grob (span_, + ly_symbol2scm ("note-heads"), + ledgered_grobs_[i]); + } + } + + ledgered_grobs_.clear (); } void Ledger_line_engraver::process_music () { + /* + Need to do this, otherwise the first note might miss ledgers. + */ if (!span_) start_spanner (); } @@ -53,7 +89,7 @@ Ledger_line_engraver::process_music () void Ledger_line_engraver::finalize () { - stop_spanner(); + stop_spanner (); } void @@ -61,7 +97,7 @@ Ledger_line_engraver::stop_spanner () { if (span_) { - span_->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn"))); + span_->set_bound (RIGHT, unsmob (get_property ("currentCommandColumn"))); span_ = 0; } } @@ -69,10 +105,10 @@ Ledger_line_engraver::stop_spanner () void Ledger_line_engraver::acknowledge_staff_symbol (Grob_info s) { - Spanner *sym = dynamic_cast (s.grob ()); + Spanner *sym = dynamic_cast (s.grob ()); if (!span_ - || span_->get_bound (LEFT) != sym->get_bound (LEFT)) + || (span_->get_bound (LEFT) != sym->get_bound (LEFT))) { stop_spanner (); start_spanner (); @@ -82,21 +118,27 @@ Ledger_line_engraver::acknowledge_staff_symbol (Grob_info s) void Ledger_line_engraver::acknowledge_ledgered (Grob_info s) { - if (span_) - { - if (!to_boolean (s.grob ()->get_property ("no-ledgers"))) - Pointer_group_interface::add_grob (span_, ly_symbol2scm ("note-heads"), - s.grob ()); - } + ledgered_grobs_.push_back (s.grob ()); } -#include "translator.icc" +void +Ledger_line_engraver::boot () +{ + ADD_ACKNOWLEDGER (Ledger_line_engraver, ledgered); + ADD_ACKNOWLEDGER (Ledger_line_engraver, staff_symbol); +} -ADD_ACKNOWLEDGER (Ledger_line_engraver,ledgered); -ADD_ACKNOWLEDGER (Ledger_line_engraver,staff_symbol); ADD_TRANSLATOR (Ledger_line_engraver, - "Creates the spanner to draw ledger lines, and notices objects that need ledger lines", - /* creats*/ "LedgerLineSpanner", - /* accepts */ "", - /* reads */ "", - /* write */ "") + /* doc */ + "Create the spanner to draw ledger lines, and notices" + " objects that need ledger lines.", + + /* create */ + "LedgerLineSpanner ", + + /* read */ + "", + + /* write */ + "" + );