]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/spanner.cc
release: 1.3.58
[lilypond.git] / lily / spanner.cc
index 9a8ed71038379a4cc4de36abed5e67c7144d7153..c620ab64a32b19a72d291d557e2e616342e86617 100644 (file)
@@ -6,6 +6,7 @@
   (c) 1996--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
 #include <math.h>
+#include <libc-extension.hh>
 
 #include "dimension-cache.hh"
 #include "debug.hh"
@@ -25,6 +26,9 @@ Spanner::do_break_processing ()
   //break_into_pieces
   Item * left = spanned_drul_[LEFT];
   Item * right = spanned_drul_[RIGHT];
+
+  if (!left || !right)
+    return;
   
   if  (left == right)
     {
@@ -63,7 +67,7 @@ Spanner::do_break_processing ()
       Direction d = LEFT;
       do
        {
-         Item* bound = left->find_broken_piece (d);
+         Item* bound = left->find_prebroken_piece (d);
          if (bound->line_l ())
            {
              Spanner * span_p = dynamic_cast<Spanner*>( clone ());
@@ -92,14 +96,17 @@ Spanner::do_break_processing ()
          Direction d = LEFT;
          do
            {
-             Item *&pc_l = bounds[d] ;
-             if (!pc_l->line_l())
-               pc_l =  pc_l->find_broken_piece(- d);
-         
-             assert (pc_l);
+             if (!bounds[d]->line_l())
+               bounds[d] = bounds[d]->find_prebroken_piece(- d);
            }
          while ((flip(&d))!= LEFT);
 
+         if (!bounds[LEFT] ||  ! bounds[RIGHT])
+           {
+             programming_error ("bounds of this piece aren't breakable. ");
+             continue; 
+           }
+
          Spanner *span_p = dynamic_cast<Spanner*>(clone ());
          span_p->set_bound(LEFT,bounds[LEFT]);
          span_p->set_bound(RIGHT,bounds[RIGHT]);
@@ -122,7 +129,7 @@ Spanner::set_my_columns()
   do 
     {
       if (!spanned_drul_[i]->line_l())
-       set_bound(i,spanned_drul_[i]->find_broken_piece((Direction) -i));
+       set_bound(i,spanned_drul_[i]->find_prebroken_piece((Direction) -i));
     } 
   while (flip(&i) != LEFT);
 }       
@@ -136,7 +143,7 @@ Spanner::spanned_rank_iv ()
     {
       iv[LEFT] = spanned_drul_[LEFT]->column_l ()->rank_i ();
     }
-  if ( spanned_drul_[RIGHT])
+  if (spanned_drul_[RIGHT])
     {
       iv[RIGHT] = spanned_drul_[RIGHT]->column_l ()->rank_i ();
     }
@@ -153,14 +160,10 @@ void
 Spanner::set_bound(Direction d, Item*i)
 {
   spanned_drul_[d] =i;
-  if (i)
-    {
-      i->used_b_ = true;
-    }
 
   /**
-     Prevent the column -> line_of_score -> column -> line_of_score -> etc situation
-  */
+     We check for Line_of_score to prevent the column -> line_of_score
+     -> column -> line_of_score -> etc situation */
   if (d== LEFT && !dynamic_cast<Line_of_score*> (this))
     {
       set_parent (i, X_AXIS);
@@ -173,7 +176,8 @@ Spanner::set_bound(Direction d, Item*i)
 }
 
 
-Spanner::Spanner ()
+Spanner::Spanner (SCM s)
+  : Score_element (s)
 {
   spanned_drul_[LEFT]=0;
   spanned_drul_[RIGHT]=0;
@@ -292,3 +296,14 @@ Spanner::get_broken_left_end_align () const
 
   return 0.0;
 }
+
+void
+Spanner::do_derived_mark ()
+{
+  Direction d = LEFT;
+  do
+    if (spanned_drul_[d])
+      scm_gc_mark (spanned_drul_[d]->self_scm_);
+  while (flip (&d) != LEFT);
+}
+