]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-0.0.65
authorfred <fred>
Sun, 24 Mar 2002 19:44:20 +0000 (19:44 +0000)
committerfred <fred>
Sun, 24 Mar 2002 19:44:20 +0000 (19:44 +0000)
lily/include/spanner.hh
lily/spanner.cc

index df5e9e58e9c1bab72434d01d6a74f1480e1d5e6a..074a555da2c7ab2e02dab150b57b2a6d1f4f4805 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  spanner.hh -- part of LilyPond
+  spanner.hh -- part of GNU LilyPond
 
   (c) 1996,97 Han-Wen Nienhuys
 */
@@ -7,10 +7,12 @@
 #ifndef SPANNER_HH
 #define SPANNER_HH
 
-#include "proto.hh"
-#include "staff-elem.hh"
+#include "lily-proto.hh"
+#include "score-elem.hh"
 
 
+#define SPANNER_CLONE(T) VIRTUAL_COPY_CONS(T, Spanner)
+
 /** a symbol which is attached between two columns. A spanner is a
   symbol which spans across several columns, so its final appearance
   can only be calculated after the breaking problem is solved.
   is absolutely necessary for beams, since they have to adjust the
   length of stems of notes they encompass.
 
-    */
+  */
 class Spanner:public virtual Score_elem {
 public:
     PCol *left_col_l_, *right_col_l_;
-
     
     /* *************** */
     NAME_MEMBERS(Spanner);
     virtual Spanner* spanner() { return this; }    
     Spanner();
-    Spanner *broken_at(PCol *c1,  PCol *c2) const;
+    bool broken_b() const;
+    Spanner* find_broken_piece(Line_of_score*)const;
 protected:
+    SPANNER_CLONE(Spanner)
+    virtual void break_into_pieces();
 
+    Link_array<Spanner> broken_into_l_arr_;
+       
+    virtual void do_break_processing();
     virtual Interval do_width()const;
-    void do_print()const;
-
-
-    /**
-      clone a piece of  this spanner.
-      PRE
-      c1 >= start, c2  <= stop
-    */
-    virtual Spanner *do_break_at( PCol *c1,  PCol *c2) const=0;
+    virtual void do_print()const;
+    virtual Line_of_score*line_l()const;
 };
 #endif
index 53d7bca6b10290baf00f4ece3748de8f961ffd4d..4c8376ce5a650a303710f8d51ae0823a388cc48b 100644 (file)
@@ -1,34 +1,80 @@
+/*
+  spanner.cc -- implement Spanner
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 1996,1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
 #include "debug.hh"
 #include "spanner.hh"
 #include "p-col.hh"
-
-
+#include "p-score.hh"
 
 IMPLEMENT_STATIC_NAME(Spanner);
 
 void
 Spanner::do_print()const
 {
-    mtor << " (unknown) ";
+    if (broken_into_l_arr_.size())
+       mtor << "Spanner with broken pieces\n";
 }
 
-Spanner*
-Spanner::broken_at(PCol*c1, PCol *c2)const
+void
+Spanner::break_into_pieces()
 {
-    Spanner *span_p = do_break_at(c1,c2);
-
-    for (int i=0; i < dependant_l_arr_.size(); i++) {
-       dependant_l_arr_[i]->
-           substitute_dependency((Score_elem*)this, span_p); 
+    PCol * left = left_col_l_;
+    PCol * right = right_col_l_;
+    if (left->daddy_l_)
+       left = left->daddy_l_;
+    if (right->daddy_l_)
+       right = right->daddy_l_;
+    
+    Link_array<PCol> all_cols = pscore_l_->col_range(left, right);
+    
+    Line_of_score *line = left->line_l_;
+    if (!line) {
+       left  = left->postbreak_p_;
+       line = left->line_l_;
     }
     
-    span_p->left_col_l_ = c1;
-    span_p->right_col_l_ = c2;
-    span_p->pstaff_l_ = pstaff_l_;
+    for (int i=1; i < all_cols.size(); i++) {
+       if (!all_cols[i]->line_l_) {
+
+           Spanner* span_p = clone();
+           right =  all_cols[i]->prebreak_p_;
+           assert(left&&right && left->line_l_ == right->line_l_);
+
+           span_p->left_col_l_  = left;
+           span_p->right_col_l_ = right;
+           left = all_cols[i]->postbreak_p_;
+           line = left->line_l_;
+           
+           pscore_l_->typeset_broken_spanner(span_p);
+           broken_into_l_arr_.push( span_p );
+       }
+    }
+}
+
+void
+Spanner::do_break_processing()
+{
+    if (!left_col_l_->line_l_)
+       left_col_l_ = left_col_l_->postbreak_p_;
+    if (!right_col_l_->line_l_)
+       right_col_l_ = right_col_l_->prebreak_p_;
+     
     
-    return span_p;
+    if (!line_l()) {
+       break_into_pieces();
+       for (int i=0; i < broken_into_l_arr_.size(); i++)
+           broken_into_l_arr_[i]->handle_broken_dependencies();
+    } else { 
+       handle_broken_dependencies();
+    }
 }
 
+
 Spanner::Spanner()
 {
     left_col_l_ = right_col_l_ = 0;
@@ -45,3 +91,28 @@ Spanner::do_width()const
        
     return Interval(0, r-l);
 }
+
+Line_of_score *
+Spanner::line_l()const
+{
+    if ( left_col_l_->line_l_ != right_col_l_->line_l_)
+       return 0;
+    return left_col_l_->line_l_;
+}
+
+
+Spanner*
+Spanner::find_broken_piece(Line_of_score*l)const
+{
+    for (int i=0; i < broken_into_l_arr_.size(); i++)
+       if(broken_into_l_arr_[i]->line_l() == l)
+           return broken_into_l_arr_[i];
+    return 0;                             
+         
+}
+
+bool
+Spanner::broken_b()const
+{
+    return broken_into_l_arr_.size();
+}