X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ffigured-bass-engraver.cc;h=b2a79262bb64727f7b4421dfb54981032f01e278;hb=97a0169312a260933246ab224e4f8b0969871dd5;hp=b4c92f8862060ac3c8270f9b76672b3f6f107c20;hpb=736a3513783c7411eb9feeab2d98363da9dc7ec5;p=lilypond.git diff --git a/lily/figured-bass-engraver.cc b/lily/figured-bass-engraver.cc index b4c92f8862..b2a79262bb 100644 --- a/lily/figured-bass-engraver.cc +++ b/lily/figured-bass-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2010 Han-Wen Nienhuys + Copyright (C) 2005--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -110,7 +110,7 @@ struct Figured_bass_engraver : public Engraver void add_brackets (); void create_grobs (); - void center_continuations (vector const &consecutive_lines); + void center_continuations (vector const &consecutive_lines); void center_repeated_continuations (); protected: vector groups_; @@ -122,8 +122,8 @@ protected: Moment stop_moment_; bool have_rest_; - DECLARE_TRANSLATOR_LISTENER (rest); - DECLARE_TRANSLATOR_LISTENER (bass_figure); + void listen_rest (Stream_event *); + void listen_bass_figure (Stream_event *); virtual void derived_mark () const; @@ -132,7 +132,8 @@ protected: void process_music (); }; -Figured_bass_engraver::Figured_bass_engraver () +Figured_bass_engraver::Figured_bass_engraver (Context *c) + : Engraver (c) { alignment_ = 0; continuation_ = false; @@ -154,7 +155,7 @@ Figured_bass_engraver::start_translation_timestep () { if (now_mom ().main_part_ < stop_moment_.main_part_ || now_mom ().grace_part_ < Rational (0)) - return ; + return; have_rest_ = 0; new_events_.clear (); @@ -170,29 +171,27 @@ Figured_bass_engraver::stop_translation_timestep () if (groups_.empty () || now_mom ().main_part_ < stop_moment_.main_part_ || now_mom ().grace_part_ < Rational (0)) - return ; + return; bool found = false; for (vsize i = 0; !found && i < groups_.size (); i++) - found = found || groups_[i].current_event_; + found = found || groups_[i].current_event_; if (!found) clear_spanners (); } -IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, rest); void -Figured_bass_engraver::listen_rest (Stream_event *ev) +Figured_bass_engraver::listen_rest (Stream_event *) { have_rest_ = true; } -IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, bass_figure); void Figured_bass_engraver::listen_bass_figure (Stream_event *ev) { new_event_found_ = true; - Moment stop = now_mom () + get_event_length (ev, now_mom ()); + Moment stop = now_mom () + get_event_length (ev, now_mom ()); stop_moment_ = max (stop_moment_, stop); // Handle no-continuation here, don't even add it to the already existing @@ -215,27 +214,24 @@ Figured_bass_engraver::listen_bass_figure (Stream_event *ev) } void -Figured_bass_engraver::center_continuations (vector const &consecutive_lines) +Figured_bass_engraver::center_continuations (vector const &consecutive_lines) { - if (consecutive_lines.size () == 2) - { - vector left_figs; - for (vsize j = consecutive_lines.size (); j--;) - left_figs.push_back (consecutive_lines[j]->get_bound (LEFT)); + vector left_figs; + for (vsize j = consecutive_lines.size (); j--;) + left_figs.push_back (consecutive_lines[j]->get_bound (LEFT)); - SCM ga = Grob_array::make_array (); - unsmob_grob_array (ga)->set_array (left_figs); + SCM ga = Grob_array::make_array (); + unsmob (ga)->set_array (left_figs); - for (vsize j = consecutive_lines.size (); j--;) - consecutive_lines[j]->set_object ("figures", - unsmob_grob_array (ga)->smobbed_copy ()); - } + for (vsize j = consecutive_lines.size (); j--;) + consecutive_lines[j]->set_object ("figures", + unsmob (ga)->smobbed_copy ()); } void Figured_bass_engraver::center_repeated_continuations () { - vector consecutive_lines; + vector consecutive_lines; for (vsize i = 0; i <= groups_.size (); i++) { if (i < groups_.size () @@ -270,13 +266,13 @@ Figured_bass_engraver::clear_spanners () { if (groups_[i].group_) { - announce_end_grob (groups_[i].group_ , SCM_EOL); + announce_end_grob (groups_[i].group_, SCM_EOL); groups_[i].group_ = 0; } if (groups_[i].continuation_line_) { - announce_end_grob (groups_[i].continuation_line_ , SCM_EOL); + announce_end_grob (groups_[i].continuation_line_, SCM_EOL); groups_[i].continuation_line_ = 0; } } @@ -293,8 +289,8 @@ Figured_bass_engraver::process_music () // If we have a rest, or we have no new or continued events, clear all spanners bool ignore_rest = to_boolean (get_property ("ignoreFiguredBassRest")); - if ((ignore_rest && have_rest_) || - (!continuation_ && new_events_.empty ())) + if ((ignore_rest && have_rest_) + || (!continuation_ && new_events_.empty ())) { clear_spanners (); groups_.clear (); @@ -358,9 +354,9 @@ Figured_bass_engraver::process_music () { if (!group.continuation_line_) { - Spanner * line + Spanner *line = make_spanner ("BassFigureContinuation", SCM_EOL); - Item * item = group.figure_item_; + Item *item = group.figure_item_; group.continuation_line_ = line; line->set_bound (LEFT, item); @@ -381,13 +377,13 @@ Figured_bass_engraver::process_music () /* Ugh, repeated code. */ - vector consecutive; + vector consecutive; if (to_boolean (get_property ("figuredBassCenterContinuations"))) { for (vsize i = 0; i <= junk_continuations.size (); i++) { if (i < junk_continuations.size () - && (i == 0 || junk_continuations[i-1] == junk_continuations[i] - 1)) + && (i == 0 || junk_continuations[i - 1] == junk_continuations[i] - 1)) consecutive.push_back (groups_[junk_continuations[i]].continuation_line_); else { @@ -410,7 +406,7 @@ void Figured_bass_engraver::create_grobs () { Grob *muscol - = dynamic_cast (unsmob_grob (get_property ("currentMusicalColumn"))); + = unsmob (get_property ("currentMusicalColumn")); if (!alignment_) { alignment_ = make_spanner ("BassFigureAlignment", SCM_EOL); @@ -436,7 +432,7 @@ Figured_bass_engraver::create_grobs () Align_interface::add_element (alignment_, group.group_); } - if (scm_memq (group.number_, get_property ("implicitBassFigures")) != SCM_BOOL_F) + if (scm_is_true (scm_memq (group.number_, get_property ("implicitBassFigures")))) { item->set_property ("transparent", SCM_BOOL_T); item->set_property ("implicit", SCM_BOOL_T); @@ -478,9 +474,9 @@ Figured_bass_engraver::create_grobs () void Figured_bass_engraver::add_brackets () { - vector encompass; + vector encompass; bool inside = false; - for (vsize i = 0; i < groups_.size (); i ++) + for (vsize i = 0; i < groups_.size (); i++) { if (!groups_[i].current_event_) continue; @@ -491,11 +487,11 @@ Figured_bass_engraver::add_brackets () if (inside && groups_[i].figure_item_) encompass.push_back (groups_[i].figure_item_); - if (to_boolean (groups_[i].current_event_->get_property ("bracket-stop"))) + if (to_boolean (groups_[i].current_event_->get_property ("bracket-stop"))) { inside = false; - Item * brack = make_item ("BassFigureBracket", groups_[i].current_event_->self_scm ()); + Item *brack = make_item ("BassFigureBracket", groups_[i].current_event_->self_scm ()); for (vsize j = 0; j < encompass.size (); j++) { Pointer_group_interface::add_grob (brack, @@ -507,6 +503,13 @@ Figured_bass_engraver::add_brackets () } } +void +Figured_bass_engraver::boot () +{ + ADD_LISTENER (Figured_bass_engraver, rest); + ADD_LISTENER (Figured_bass_engraver, bass_figure); +} + ADD_TRANSLATOR (Figured_bass_engraver, /* doc */ "Make figured bass numbers.", @@ -528,4 +531,4 @@ ADD_TRANSLATOR (Figured_bass_engraver, /* write */ "" - ); + );