+ if (groups_.empty ()
+ || now_mom ().main_part_ < stop_moment_.main_part_
+ || now_mom ().grace_part_ < Rational (0))
+ return ;
+
+ bool found = false;
+ for (vsize i = 0; !found && i < groups_.size (); i++)
+ found = found || groups_[i].current_event_;
+
+ if (!found)
+ clear_spanners ();
+}
+
+Figured_bass_engraver::Figured_bass_engraver ()
+{
+ alignment_ = 0;
+ continuation_ = false;
+ rest_event_ = 0;
+ new_event_found_ = false;
+}
+
+void
+Figured_bass_engraver::start_translation_timestep ()
+{
+ if (now_mom ().main_part_ < stop_moment_.main_part_
+ || now_mom ().grace_part_ < Rational (0))
+ return ;
+
+ rest_event_ = 0;
+ new_events_.clear ();
+ for (vsize i = 0; i < groups_.size (); i++)
+ groups_[i].current_event_ = 0;
+
+ continuation_ = false;
+
+
+}
+
+IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, rest);
+void
+Figured_bass_engraver::listen_rest (Stream_event *ev)
+{
+ if (to_boolean (get_property ("ignoreFiguredBassRest")))
+ {
+ new_event_found_ = true;
+
+ /*
+ No ASSIGN_EVENT_ONCE () ; otherwise we get warnings about
+ polyphonic rests.
+ */
+ rest_event_ = ev;
+ }
+}
+
+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 ());
+ stop_moment_ = max (stop_moment_, stop);
+
+ if (to_boolean (get_property ("useBassFigureExtenders")))
+ {
+ SCM fig = ev->get_property ("figure");
+ for (vsize i = 0; i < groups_.size (); i++)
+ {
+ if (!groups_[i].current_event_
+ && ly_is_equal (groups_[i].number_, fig))
+ {
+ groups_[i].current_event_ = ev;
+ groups_[i].force_no_continuation_
+ = to_boolean (ev->get_property ("no-continuation"));
+ continuation_ = true;
+ return;
+ }
+ }
+ }
+ new_events_.push_back (ev);
+}
+
+void
+Figured_bass_engraver::center_continuations (vector<Spanner*> const &consecutive_lines)
+{
+ if (consecutive_lines.size () == 2)
+ {
+ vector<Grob*> 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);
+
+ for (vsize j = consecutive_lines.size (); j--;)
+ consecutive_lines[j]->set_object ("figures",
+ unsmob_grob_array (ga)->smobbed_copy ());
+ }
+}