]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/figured-bass-engraver.cc
Fix some bugs in the dynamic engraver and PostScript backend
[lilypond.git] / lily / figured-bass-engraver.cc
index ee5517e94bcec9fca3a5f05b1477d3122d68fc33..01b352f28d647f067eab52bb7f2b4fd42f9944d0 100644 (file)
@@ -63,12 +63,12 @@ struct Figured_bass_engraver : public Engraver
   void add_brackets ();
   void create_grobs ();
 
-  void center_continuations (Link_array<Spanner> const &consecutive_lines);
+  void center_continuations (vector<Spanner*> const &consecutive_lines);
   void center_repeated_continuations ();
 protected:
-  std::vector<Figure_group> groups_;
+  vector<Figure_group> groups_;
   Spanner *alignment_;
-  Link_array<Music> new_musics_;
+  vector<Music*> new_musics_;
   bool continuation_;
   bool new_music_found_;
   
@@ -165,11 +165,11 @@ Figured_bass_engraver::try_music (Music *m)
 }
 
 void
-Figured_bass_engraver::center_continuations (Link_array<Spanner> const &consecutive_lines)
+Figured_bass_engraver::center_continuations (vector<Spanner*> const &consecutive_lines)
 {
   if (consecutive_lines.size () == 2)
     {
-      Link_array<Grob> left_figs;
+      vector<Grob*> left_figs;
       for (vsize j = consecutive_lines.size(); j--;)
        left_figs.push_back (consecutive_lines[j]->get_bound (LEFT));
 
@@ -185,7 +185,7 @@ Figured_bass_engraver::center_continuations (Link_array<Spanner> const &consecut
 void
 Figured_bass_engraver::center_repeated_continuations ()
 {  
-  Link_array<Spanner> consecutive_lines;
+  vector<Spanner*> consecutive_lines;
   for (vsize i = 0; i <= groups_.size(); i++)
     {
       if (i < groups_.size ()
@@ -209,18 +209,38 @@ Figured_bass_engraver::clear_spanners ()
 {
   if (!alignment_)
     return;
-  
-  alignment_ = 0;
+
+  if (alignment_)
+    {
+      announce_end_grob (alignment_, SCM_EOL);
+      alignment_ = 0;
+    }
+
   if (to_boolean (get_property ("figuredBassCenterContinuations")))
     center_repeated_continuations();
   
-  groups_.clear ();
+  for (vsize i = 0; i < groups_.size (); i++)
+    {
+      if (groups_[i].group_)
+       {
+         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);
+         groups_[i].continuation_line_ = 0;
+       }
+    }
+
+  /* Check me, groups_.clear () ? */
 }
 
 void
 Figured_bass_engraver::add_brackets ()
 {
-  Link_array<Grob> encompass;
+  vector<Grob*> encompass;
   bool inside = false;
   for (vsize i = 0; i < groups_.size (); i ++)
     {
@@ -255,6 +275,7 @@ Figured_bass_engraver::process_music ()
   if (rest_event_)
     {
       clear_spanners ();
+      groups_.clear ();
       return;
     }
   
@@ -262,6 +283,7 @@ Figured_bass_engraver::process_music ()
       && new_musics_.empty ())
     {
       clear_spanners ();
+      groups_.clear ();
       return;
     }
 
@@ -276,19 +298,15 @@ Figured_bass_engraver::process_music ()
   bool use_extenders = to_boolean (get_property ("useBassFigureExtenders"));
   if (!use_extenders)
     {
-      if (to_boolean (get_property ("figuredBassCenterContinuations")))
-       center_repeated_continuations ();
-      alignment_ = 0;
-      for (vsize i = 0; i < groups_.size (); i++)
-       {
-         groups_[i].group_ = 0;
-         groups_[i].continuation_line_ = 0;
-       }
+      clear_spanners ();
     }
   
   if (!continuation_)
-    clear_spanners ();
-  
+    {
+      clear_spanners ();
+      groups_.clear ();
+    }
+
   vsize k = 0;
   for (vsize i = 0; i < new_musics_.size (); i++)
     {
@@ -318,7 +336,7 @@ Figured_bass_engraver::process_music ()
 
   if (use_extenders)
     {
-      std::vector<int> junk_continuations;
+      vector<int> junk_continuations;
       for (vsize i = 0; i < groups_.size(); i++)
        {
                Figure_group &group = groups_[i];
@@ -349,7 +367,7 @@ Figured_bass_engraver::process_music ()
       /*
        Ugh, repeated code.
        */
-      Link_array<Spanner> consecutive;
+      vector<Spanner*> consecutive;
       if (to_boolean (get_property ("figuredBassCenterContinuations")))
        {
          for (vsize i = 0; i <= junk_continuations.size (); i++)
@@ -437,10 +455,10 @@ Figured_bass_engraver::create_grobs ()
          group.figure_item_->set_property ("transparent", SCM_BOOL_T);
          group.continuation_line_->set_bound (RIGHT, group.figure_item_);
        }
-
       
       if (groups_[i].group_)
        groups_[i].group_->set_bound (RIGHT, muscol);
+
     }
 
 }