source file of the GNU LilyPond music typesetter
- (c) 1996,1997 Han-Wen Nienhuys <hanwen@stack.nl>
+ (c) 1996, 1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
#include "debug.hh"
#include "spanner.hh"
#include "p-col.hh"
#include "p-score.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
}
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);
}
spanned_drul_[d] =i;
if (i)
i->attached_span_l_arr_.push(this);
+
+ if (spanned_drul_[Direction(-d)] == spanned_drul_[d]
+ && i)
+ warning (_f ("Spanner `%s\' with equal left and right spanpoints", name ()));
}
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::access_Spanner ()
+{
+ return this;
+}
-Spanner::Spanner()
+Spanner::Spanner ()
{
+ unbroken_original_l_ =0;
spanned_drul_[LEFT]=0;
spanned_drul_[RIGHT]=0;
}
-String
-Spanner::do_TeX_output_str () const
+Spanner::Spanner (Spanner const &s)
+ :Score_element (s)
+{
+ spanned_drul_[LEFT] = spanned_drul_[RIGHT] =0;
+ unbroken_original_l_ = &s;
+}
+
+void
+Spanner::do_brew_molecule ()
{
+ if (transparent_b_)
+ return ;
+ Molecule *output= brew_molecule_p ();
Offset left_off (spanned_drul_[LEFT]->absolute_coordinate(X_AXIS), 0);
- return make_TeX_string (absolute_offset() + left_off);
+ Offset o = absolute_offset() + left_off;
+ pscore_l_->outputter_l_->output_molecule (output, o, name ());
+ delete output;
}
Interval
void
Spanner::do_unlink()
{
- if (spanned_drul_[LEFT])
- {
- spanned_drul_[LEFT]->attached_span_l_arr_.substitute (this,0);
- spanned_drul_[LEFT] =0;
- }
- if (spanned_drul_[RIGHT])
+ set_bounds (LEFT, 0);
+ set_bounds (RIGHT, 0);
+
+ if (unbroken_original_l_)
{
- spanned_drul_[RIGHT]->attached_span_l_arr_.substitute (this,0);
- spanned_drul_[RIGHT] = 0;
+ unbroken_original_l_->broken_into_l_arr_.substitute (this, 0);
+ unbroken_original_l_ =0;
}
}
{
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 ();
+ }
+}