X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fspanner.cc;h=25b9855f23d4e11bf5c494cdec7214a70f830e40;hb=31653bf1d61a33ef8bc8c871d60c6b3452d04d28;hp=a10cf1446f3cee6378d278b618615500ec8b457d;hpb=5cfb4ad642561dcb61593b1aeb24717c5eb110da;p=lilypond.git diff --git a/lily/spanner.cc b/lily/spanner.cc index a10cf1446f..25b9855f23 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -3,24 +3,30 @@ source file of the GNU LilyPond music typesetter - (c) 1996,1997 Han-Wen Nienhuys + (c) 1996, 1997--1998 Han-Wen Nienhuys */ #include "debug.hh" #include "spanner.hh" #include "p-col.hh" #include "p-score.hh" -#include "outputter.hh" +#include "molecule.hh" +#include "paper-outputter.hh" -IMPLEMENT_IS_TYPE_B1(Spanner,Score_elem); +IMPLEMENT_IS_TYPE_B1(Spanner,Score_element); void Spanner::do_print() const { #ifndef NPRINT - DOUT << "Between col "; + DOUT << "Between " << spanned_drul_[LEFT]->name () + << " and " << spanned_drul_[RIGHT]->name() << '\n'; if (broken_into_l_arr_.size()) - DOUT << "with broken pieces\n"; + { + DOUT << "with broken pieces:\n"; + for (int i=0; i < broken_into_l_arr_.size (); i++) + broken_into_l_arr_[i]->print (); + } #endif } @@ -33,6 +39,11 @@ Spanner::break_into_pieces () Item * left = spanned_drul_[LEFT]; Item * right = spanned_drul_[RIGHT]; + if (left == right) + { + warning (_ ("left spanpoint is right spanpoint\n")); + return; + } Link_array break_cols = pscore_l_->broken_col_range (left,right); Link_array broken_into_l_arr; @@ -42,15 +53,15 @@ Spanner::break_into_pieces () for (int i=1; i < break_cols.size(); i++) { - Spanner* span_p = clone()->spanner (); - left = break_cols[i-1]; - right = break_cols[i]; + Spanner* span_p = dynamic_cast (clone()); + Item *left = break_cols[i-1]; + Item *right = break_cols[i]; if (!right->line_l()) - right = right->find_prebroken_piece(-1); + right = right->find_prebroken_piece(LEFT); if (!left->line_l()) - left = left->find_prebroken_piece(1); + left = left->find_prebroken_piece(RIGHT); - assert (left&&right && left->line_l() == right->line_l()); + assert (left&&right && left->line_l() == right->line_l()); span_p->set_bounds(LEFT,left); span_p->set_bounds(RIGHT,right); @@ -69,9 +80,9 @@ Spanner::set_my_columns() do { if (!spanned_drul_[i]->line_l()) - set_bounds(i,spanned_drul_[i]->find_prebroken_piece(-i)); + set_bounds(i,spanned_drul_[i]->find_prebroken_piece((Direction)-i)); } - while ((i*=-1) != 1); + while (flip(&i) != 1); } @@ -87,7 +98,7 @@ Spanner::set_bounds(Direction d, Item*i) if (spanned_drul_[Direction(-d)] == spanned_drul_[d] && i) - warning ("Spanner (" + String (name ()) + ") with equal left and right spanpoints."); + warning (_f ("Spanner `%s\' with equal left and right spanpoints", name ())); } void @@ -97,7 +108,9 @@ Spanner::do_break_processing() { break_into_pieces (); for (int i=0; i < broken_into_l_arr_.size(); i++) - broken_into_l_arr_[i]->handle_broken_dependencies(); + { + broken_into_l_arr_[i]->handle_broken_dependencies(); + } } else { @@ -105,13 +118,20 @@ Spanner::do_break_processing() } } - -Spanner::Spanner() +Spanner::Spanner () { + unbroken_original_l_ =0; spanned_drul_[LEFT]=0; spanned_drul_[RIGHT]=0; } +Spanner::Spanner (Spanner const &s) + :Score_element (s) +{ + spanned_drul_[LEFT] = spanned_drul_[RIGHT] =0; + unbroken_original_l_ = &s; +} + void Spanner::do_brew_molecule () { @@ -120,7 +140,8 @@ Spanner::do_brew_molecule () Molecule *output= brew_molecule_p (); Offset left_off (spanned_drul_[LEFT]->absolute_coordinate(X_AXIS), 0); Offset o = absolute_offset() + left_off; - pscore_l_->outputter_l_->output_molecule (output, o); + pscore_l_->outputter_l_->output_molecule (output, o, name ()); + delete output; } Interval @@ -165,6 +186,12 @@ Spanner::do_unlink() { set_bounds (LEFT, 0); set_bounds (RIGHT, 0); + + if (unbroken_original_l_) + { + unbroken_original_l_->broken_into_l_arr_.substitute (this, 0); + unbroken_original_l_ =0; + } } void @@ -172,3 +199,20 @@ Spanner::do_junk_links() { spanned_drul_[LEFT] = spanned_drul_[RIGHT] =0; } + +Array +Spanner::get_rods () const +{ + Array r; + return r; +} + +void +Spanner::do_space_processing () +{ + Array rs (get_rods ()); + for (int i=0; i < rs.size (); i++) + { + rs[i].add_to_cols (); + } +}