X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ffigured-bass-position-engraver.cc;h=b35d037a35fb0ca8442a3fc3ad90db2b264e4e53;hb=97a0169312a260933246ab224e4f8b0969871dd5;hp=af0d3be772ba9b2c5344b635e3480a0fdd1f8418;hpb=548075f8c20d76600ee58e7ab90aae277ff03f39;p=lilypond.git diff --git a/lily/figured-bass-position-engraver.cc b/lily/figured-bass-position-engraver.cc index af0d3be772..b35d037a35 100644 --- a/lily/figured-bass-position-engraver.cc +++ b/lily/figured-bass-position-engraver.cc @@ -1,33 +1,47 @@ /* - figured-bass-position-engraver.cc -- implement Figured_bass_engraver + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2005--2015 Han-Wen Nienhuys - (c) 2005--2006 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 "engraver.hh" #include "context.hh" -#include "music.hh" #include "spanner.hh" +#include "item.hh" #include "side-position-interface.hh" #include "translator.icc" #include "axis-group-interface.hh" class Figured_bass_position_engraver : public Engraver { - TRANSLATOR_DECLARATIONS(Figured_bass_position_engraver); + TRANSLATOR_DECLARATIONS (Figured_bass_position_engraver); Spanner *bass_figure_alignment_; Spanner *positioner_; - vector note_columns_; - + vector support_; + vector span_support_; protected: - DECLARE_ACKNOWLEDGER (note_column); - DECLARE_ACKNOWLEDGER (bass_figure_alignment); - DECLARE_END_ACKNOWLEDGER (bass_figure_alignment); + void acknowledge_note_column (Grob_info); + void acknowledge_slur (Grob_info); + void acknowledge_end_slur (Grob_info); + void acknowledge_end_tie (Grob_info); + void acknowledge_bass_figure_alignment (Grob_info); + void acknowledge_end_bass_figure_alignment (Grob_info); virtual void finalize (); void start_spanner (); @@ -35,7 +49,8 @@ protected: void stop_translation_timestep (); }; -Figured_bass_position_engraver::Figured_bass_position_engraver () +Figured_bass_position_engraver::Figured_bass_position_engraver (Context *c) + : Engraver (c) { positioner_ = 0; bass_figure_alignment_ = 0; @@ -46,7 +61,7 @@ Figured_bass_position_engraver::start_spanner () { assert (!positioner_); - positioner_ = make_spanner("BassFigureAlignmentPositioning", bass_figure_alignment_->self_scm ()); + positioner_ = make_spanner ("BassFigureAlignmentPositioning", bass_figure_alignment_->self_scm ()); positioner_->set_bound (LEFT, bass_figure_alignment_->get_bound (LEFT)); Axis_group_interface::add_element (positioner_, bass_figure_alignment_); } @@ -58,13 +73,13 @@ Figured_bass_position_engraver::stop_spanner () { positioner_->set_bound (RIGHT, bass_figure_alignment_->get_bound (RIGHT)); } - + positioner_ = 0; bass_figure_alignment_ = 0; } void -Figured_bass_position_engraver::finalize () +Figured_bass_position_engraver::finalize () { stop_spanner (); } @@ -72,7 +87,29 @@ Figured_bass_position_engraver::finalize () void Figured_bass_position_engraver::acknowledge_note_column (Grob_info info) { - note_columns_.push_back (info.grob ()); + support_.push_back (info.grob ()); +} + +void +Figured_bass_position_engraver::acknowledge_end_slur (Grob_info info) +{ + vector::iterator i = find (span_support_.begin (), span_support_.end (), + info.grob ()); + + if (i < span_support_.end ()) + span_support_.erase (i); +} + +void +Figured_bass_position_engraver::acknowledge_slur (Grob_info info) +{ + span_support_.push_back (info.grob ()); +} + +void +Figured_bass_position_engraver::acknowledge_end_tie (Grob_info info) +{ + support_.push_back (info.grob ()); } void @@ -80,41 +117,51 @@ Figured_bass_position_engraver::stop_translation_timestep () { if (positioner_) { - for (vsize i = 0; i < note_columns_.size (); i++) - Side_position_interface::add_support (positioner_, note_columns_[i]); + for (vsize i = 0; i < span_support_.size (); i++) + Side_position_interface::add_support (positioner_, span_support_[i]); + for (vsize i = 0; i < support_.size (); i++) + Side_position_interface::add_support (positioner_, support_[i]); } - note_columns_.clear (); + support_.clear (); } void -Figured_bass_position_engraver::acknowledge_end_bass_figure_alignment (Grob_info info) +Figured_bass_position_engraver::acknowledge_end_bass_figure_alignment (Grob_info /* info */) { - (void)info; stop_spanner (); } void Figured_bass_position_engraver::acknowledge_bass_figure_alignment (Grob_info info) { - bass_figure_alignment_ = dynamic_cast (info.grob ()); + bass_figure_alignment_ = dynamic_cast (info.grob ()); start_spanner (); } -ADD_ACKNOWLEDGER(Figured_bass_position_engraver,note_column); -ADD_ACKNOWLEDGER(Figured_bass_position_engraver,bass_figure_alignment); -ADD_END_ACKNOWLEDGER(Figured_bass_position_engraver,bass_figure_alignment); + +void +Figured_bass_position_engraver::boot () +{ + ADD_ACKNOWLEDGER (Figured_bass_position_engraver, note_column); + ADD_ACKNOWLEDGER (Figured_bass_position_engraver, slur); + ADD_END_ACKNOWLEDGER (Figured_bass_position_engraver, slur); + ADD_END_ACKNOWLEDGER (Figured_bass_position_engraver, tie); + ADD_ACKNOWLEDGER (Figured_bass_position_engraver, bass_figure_alignment); + ADD_END_ACKNOWLEDGER (Figured_bass_position_engraver, bass_figure_alignment); +} ADD_TRANSLATOR (Figured_bass_position_engraver, - /* doc */ - "Position figured bass alignments over notes.", - - /* create */ - "BassFigureAlignmentPositioning ", + /* doc */ + "Position figured bass alignments over notes.", + + /* create */ + "BassFigureAlignmentPositioning ", - /* accept */ "", + /* read */ + "", - /* read */ - " ", - /* write */ ""); + /* write */ + "" + );