From: fred Date: Sun, 24 Mar 2002 19:44:20 +0000 (+0000) Subject: lilypond-0.0.65 X-Git-Tag: release/1.5.59~4670 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=8d6ac67e2f9cbe157980858e3a9d99ae78427e5c;p=lilypond.git lilypond-0.0.65 --- diff --git a/lily/include/spanner.hh b/lily/include/spanner.hh index df5e9e58e9..074a555da2 100644 --- a/lily/include/spanner.hh +++ b/lily/include/spanner.hh @@ -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. @@ -30,28 +32,26 @@ 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 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 diff --git a/lily/spanner.cc b/lily/spanner.cc index 53d7bca6b1..4c8376ce5a 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -1,34 +1,80 @@ +/* + spanner.cc -- implement Spanner + + source file of the GNU LilyPond music typesetter + + (c) 1996,1997 Han-Wen Nienhuys +*/ + #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 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(); +}