CVSROOT:        /cvsroot/lilypond
Module name:    lilypond
Branch:         
Changes by:     Han-Wen Nienhuys <[EMAIL PROTECTED]>    05/10/07 11:57:34

Modified files:
        .              : ChangeLog 
        lily           : new-figured-bass-engraver.cc 
Added files:
        input/regression: figured-bass-continuation-center.ly 

Log message:
        new file.

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/ChangeLog.diff?tr1=1.4162&tr2=1.4163&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/input/regression/figured-bass-continuation-center.ly?rev=1.1
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/new-figured-bass-engraver.cc.diff?tr1=1.4&tr2=1.5&r1=text&r2=text

Patches:
Index: lilypond/ChangeLog
diff -u lilypond/ChangeLog:1.4162 lilypond/ChangeLog:1.4163
--- lilypond/ChangeLog:1.4162   Fri Oct  7 10:46:31 2005
+++ lilypond/ChangeLog  Fri Oct  7 11:57:33 2005
@@ -1,5 +1,7 @@
 2005-10-07  Han-Wen Nienhuys  <[EMAIL PROTECTED]>
 
+       * input/regression/figured-bass-continuation-center.ly: new file.
+
        * input/regression/beam-outside-beamlets.ly: new file.
 
        * lily/beam.cc (set_beaming): don't clip edges.
Index: lilypond/lily/new-figured-bass-engraver.cc
diff -u lilypond/lily/new-figured-bass-engraver.cc:1.4 
lilypond/lily/new-figured-bass-engraver.cc:1.5
--- lilypond/lily/new-figured-bass-engraver.cc:1.4      Fri Oct  7 09:12:03 2005
+++ lilypond/lily/new-figured-bass-engraver.cc  Fri Oct  7 11:57:34 2005
@@ -17,6 +17,8 @@
 #include "align-interface.hh"
 #include "pointer-group-interface.hh"
 #include "text-interface.hh"
+#include "grob-array.hh"
+
 
 #include "translator.icc"
 
@@ -56,6 +58,9 @@
   void clear_spanners();
   void add_brackets ();
   void create_grobs ();
+
+  void center_continuations (Link_array<Spanner> const &consecutive_lines);
+  void center_repeated_continuations ();
 protected:
   Array<Figure_group> groups_;
   Spanner *alignment_;
@@ -155,12 +160,57 @@
 }
 
 void
+New_figured_bass_engraver::center_continuations (Link_array<Spanner> const 
&consecutive_lines)
+{
+  if (consecutive_lines.size () == 2)
+    {
+      Link_array<Grob> left_figs;
+      for (int j = consecutive_lines.size(); j--;)
+       left_figs.push (consecutive_lines[j]->get_bound (LEFT));
+
+      SCM  ga = Grob_array::make_array ();
+      unsmob_grob_array (ga)->set_array (left_figs);
+
+      for (int j = consecutive_lines.size(); j--;)
+       consecutive_lines[j]->set_object ("figures",
+                                         unsmob_grob_array (ga)->smobbed_copy 
());
+    }
+}
+
+void
+New_figured_bass_engraver::center_repeated_continuations ()
+{  
+  Link_array<Spanner> consecutive_lines;
+  for (int i = 0; i <= groups_.size(); i++)
+    {
+      if (i < groups_.size ()
+         && groups_[i].continuation_line_
+         && (consecutive_lines.is_empty ()
+             || (consecutive_lines[0]->get_bound(LEFT)->get_column ()
+                 == groups_[i].continuation_line_->get_bound 
(LEFT)->get_column ()
+                 && consecutive_lines[0]->get_bound(RIGHT)->get_column ()
+                 == groups_[i].continuation_line_->get_bound 
(RIGHT)->get_column ())))
+       {
+         consecutive_lines.push (groups_[i].continuation_line_);         
+       }
+      else 
+       {
+         center_continuations (consecutive_lines);
+         consecutive_lines.clear ();
+       }
+    }
+}
+
+void
 New_figured_bass_engraver::clear_spanners ()
 {
   if (!alignment_)
     return;
   
   alignment_ = 0;
+  center_repeated_continuations();
+
+  
   groups_.clear ();
 }
 
@@ -224,6 +274,7 @@
   bool use_extenders = to_boolean (get_property ("useBassFigureExtenders"));
   if (!use_extenders)
     {
+      center_repeated_continuations ();
       alignment_ = 0;
       for (int i = 0; i < groups_.size (); i++)
        {
@@ -266,31 +317,54 @@
     }
 
   if (use_extenders)
-    
-    for (int i = 0; i < groups_.size(); i++)
-      {
-       if (groups_[i].is_continuation ())
-         {
-           if (!groups_[i].continuation_line_)
-             {
-               Spanner * line = make_spanner ("BassFigureContinuation", 
SCM_EOL);
-               Item * item = groups_[i].figure_item_;
-               groups_[i].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 (groups_[i].group_, Y_AXIS);
-               Pointer_group_interface::add_grob (line, ly_symbol2scm 
("figures"), item);
+    {
+      Array<int> junk_continuations;
+      for (int i = 0; i < groups_.size(); i++)
+       {
+         if (groups_[i].is_continuation ())
+           {
+             if (!groups_[i].continuation_line_)
+               {
+                 Spanner * line = make_spanner ("BassFigureContinuation", 
SCM_EOL);
+                 Item * item = groups_[i].figure_item_;
+                 groups_[i].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 (groups_[i].group_, Y_AXIS);
+                 Pointer_group_interface::add_grob (line, ly_symbol2scm 
("figures"), item);
              
-               groups_[i].figure_item_ = 0;
-             }
-         }
-       else
-         groups_[i].continuation_line_ = 0;
-      }
+                 groups_[i].figure_item_ = 0;
+               }
+           }
+         else if (groups_[i].continuation_line_) 
+           junk_continuations.push (i); 
+       }
+
+      /*
+       Ugh, repeated code.
+       */
+      Link_array<Spanner> consecutive;
+      for (int i = 0; i <= junk_continuations.size (); i++)
+       {
+         if (i < junk_continuations.size()
+             && (i == 0 || junk_continuations[i-1] == junk_continuations[i] - 
1))
+           consecutive.push 
(groups_[junk_continuations[i]].continuation_line_);
+         else 
+           {
+             center_continuations (consecutive);
+             consecutive.clear ();
+             if (i < junk_continuations.size ())
+               consecutive.push 
(groups_[junk_continuations[i]].continuation_line_);
+           }
+       }
+      for (int i = 0; i < junk_continuations.size (); i++)
+       groups_[junk_continuations[i]].continuation_line_ = 0;
+    }
+  
   create_grobs ();
   add_brackets ();
 }


_______________________________________________
Lilypond-cvs mailing list
Lilypond-cvs@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-cvs

Reply via email to