+ clear_spanners ();
+ groups_.clear ();
+ return;
+ }
+
+ if (!continuation_
+ && new_events_.empty ())
+ {
+ clear_spanners ();
+ groups_.clear ();
+ return;
+ }
+
+ if (!new_event_found_)
+ return;
+
+ new_event_found_ = false;
+
+ /*
+ Don't need to sync alignments, if we're not using extenders.
+ */
+ bool use_extenders = to_boolean (get_property ("useBassFigureExtenders"));
+ if (!use_extenders)
+ {
+ clear_spanners ();
+ }
+
+ if (!continuation_)
+ {
+ clear_spanners ();
+ groups_.clear ();
+ }
+
+ vsize k = 0;
+ for (vsize i = 0; i < new_events_.size (); i++)
+ {
+ while (k < groups_.size ()
+ && groups_[k].current_event_)
+ k++;
+
+ if (k >= groups_.size ())
+ {
+ Figure_group group;
+ groups_.push_back (group);
+ }
+
+ groups_[k].current_event_ = new_events_[i];
+ groups_[k].figure_item_ = 0;
+ k++;
+ }
+
+ for (vsize i = 0; i < groups_.size (); i++)
+ {
+ if (!groups_[i].is_continuation ())
+ {
+ groups_[i].number_ = SCM_BOOL_F;
+ groups_[i].alteration_ = SCM_BOOL_F;
+ }
+ }
+
+ if (use_extenders)
+ {
+ vector<int> junk_continuations;
+ for (vsize i = 0; i < groups_.size(); i++)
+ {
+ Figure_group &group = groups_[i];
+
+ if (group.is_continuation ())
+ {
+ if (!group.continuation_line_)
+ {
+ Spanner * line = make_spanner ("BassFigureContinuation", SCM_EOL);
+ Item * item = group.figure_item_;
+ group.continuation_line_ = line;
+ line->set_bound (LEFT, item);
+
+ /*
+ Don't add as child. This will cache the wrong
+ (pre-break) stencil when callbacks are triggered.
+ */
+ line->set_parent (group.group_, Y_AXIS);
+ Pointer_group_interface::add_grob (line, ly_symbol2scm ("figures"), item);
+
+ group.figure_item_ = 0;
+ }
+ }
+ else if (group.continuation_line_)
+ junk_continuations.push_back (i);
+ }
+
+ /*
+ Ugh, repeated code.
+ */
+ vector<Spanner*> 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))
+ consecutive.push_back (groups_[junk_continuations[i]].continuation_line_);
+ else
+ {
+ center_continuations (consecutive);
+ consecutive.clear ();
+ if (i < junk_continuations.size ())
+ consecutive.push_back (groups_[junk_continuations[i]].continuation_line_);
+ }
+ }
+ }
+ for (vsize i = 0; i < junk_continuations.size (); i++)
+ groups_[junk_continuations[i]].continuation_line_ = 0;
+ }
+
+ create_grobs ();
+ add_brackets ();
+}
+
+void
+Figured_bass_engraver::create_grobs ()
+{
+ Grob *muscol = dynamic_cast<Item*> (unsmob_grob (get_property ("currentMusicalColumn")));
+ if (!alignment_)
+ {
+ alignment_ = make_spanner ("BassFigureAlignment", SCM_EOL);
+ alignment_->set_bound (LEFT, muscol);