source file of the GNU LilyPond music typesetter
- (c) 1996,1997 Han-Wen Nienhuys <hanwen@stack.nl>
+ (c) 1996, 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
#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);
void
Spanner::do_print() const
{
#ifndef NPRINT
- DOUT << "Between col ";
+ DOUT << "Between " << classname (spanned_drul_[LEFT])
+ << " and " << classname (spanned_drul_[RIGHT]) << '\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
}
Item * left = spanned_drul_[LEFT];
Item * right = spanned_drul_[RIGHT];
+ if (left == right)
+ {
+ warning (_ ("left spanpoint is right spanpoint\n"));
+ return;
+ }
Link_array<Item> break_cols = pscore_l_->broken_col_range (left,right);
Link_array<Spanner> broken_into_l_arr;
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<Spanner*> (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);
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);
}
if (i)
i->attached_span_l_arr_.push(this);
- assert (!spanned_drul_[d] ||
- spanned_drul_[Direction(-d)] != spanned_drul_[d]);
-
+ if (spanned_drul_[Direction(-d)] == spanned_drul_[d]
+ && i)
+ warning (_f ("Spanner `%s\' with equal left and right spanpoints", classname (this)));
}
void
{
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
{
}
}
-
-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 ()
+Spanner::output_processing ()
{
if (transparent_b_)
return ;
- Molecule *output= brew_molecule_p ();
+ output_p_ = do_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_p_, o, classname (this));
}
Interval
{
Real l = spanned_drul_[LEFT]->absolute_coordinate (X_AXIS);
Real r = spanned_drul_[RIGHT]->absolute_coordinate (X_AXIS);
- assert (r>=l);
+
+ if (r< l)
+ warning ("Spanner with negative length");
return Interval (0, r-l);
}
{
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
{
spanned_drul_[LEFT] = spanned_drul_[RIGHT] =0;
}
+
+Array<Rod>
+Spanner::get_rods () const
+{
+ Array<Rod> r;
+ return r;
+}
+
+void
+Spanner::do_space_processing ()
+{
+ Array<Rod> rs (get_rods ());
+ for (int i=0; i < rs.size (); i++)
+ {
+ rs[i].add_to_cols ();
+ }
+}