#include "line-of-score.hh"
#include "break-align-item.hh"
+
void
-Spanner::do_break_processing()
+Spanner::do_break_processing ()
{
//break_into_pieces
+ Item * left = spanned_drul_[LEFT];
+ Item * right = spanned_drul_[RIGHT];
+
+ if (left == right)
+ {
+ warning (_f ("Spanner `%s' has equal left and right spanpoints",
+ classname (this)));
+ }
+
+ /*
+ Check if our parent in X-direction spans equally wide
+ or wider than we do.
+ */
+ for (int a = X_AXIS; a < NO_AXES; a ++)
+ {
+ if (Spanner* parent = dynamic_cast<Spanner*> (parent_l ((Axis)a)))
+ {
+ if (!parent->spanned_rank_iv ().contains_b (this->spanned_rank_iv ()))
+ {
+ programming_error (to_str ("Spanner `%s' is not fully contained in parent spanner `%s'.",
+ classname (this),
+ classname (parent)));
+ }
+ }
+ }
if (line_l () || broken_b ())
return;
-
- Item * left = spanned_drul_[LEFT];
- Item * right = spanned_drul_[RIGHT];
if (left == right)
{
- warning (_ ("Left spanpoint is right spanpoint"));
-
/*
FIXME: this is broken.
*/
do
{
Item* bound = left->find_broken_piece (d);
- Spanner * span_p = dynamic_cast<Spanner*>( clone ());
- span_p->set_bound (LEFT, bound);
- span_p->set_bound (RIGHT, bound);
+ if (bound->line_l ())
+ {
+ Spanner * span_p = dynamic_cast<Spanner*>( clone ());
+ span_p->set_bound (LEFT, bound);
+ span_p->set_bound (RIGHT, bound);
- assert (span_p->line_l ());
- pscore_l_->typeset_element (span_p);
- broken_into_l_arr_.push (span_p);
+ assert (span_p->line_l ());
+ span_p->line_l ()->typeset_element (span_p);
+ broken_into_l_arr_.push (span_p);
+ }
}
while ((flip(&d))!= LEFT);
}
else
{
- Link_array<Item> break_points = pscore_l_->broken_col_range (left,right);
+ Link_array<Item> break_points = pscore_l_->line_l_->broken_col_range (left,right);
break_points.insert (left,0);
break_points.push (right);
Spanner *span_p = dynamic_cast<Spanner*>(clone ());
span_p->set_bound(LEFT,bounds[LEFT]);
span_p->set_bound(RIGHT,bounds[RIGHT]);
-
- pscore_l_->typeset_element (span_p);
+
+
+ assert (bounds[LEFT]->line_l () ==
+ bounds[RIGHT]->line_l ());
+
+ bounds[LEFT]->line_l ()->typeset_element (span_p);
broken_into_l_arr_.push (span_p);
}
}
while (flip(&i) != LEFT);
}
+Interval_t<int>
+Spanner::spanned_rank_iv ()
+{
+ Interval_t<int> iv (0, 0);
+
+ if (spanned_drul_[LEFT])
+ {
+ iv[LEFT] = spanned_drul_[LEFT]->column_l ()->rank_i ();
+ }
+ if ( spanned_drul_[RIGHT])
+ {
+ iv[RIGHT] = spanned_drul_[RIGHT]->column_l ()->rank_i ();
+ }
+ return iv;
+}
Item*
Spanner::get_bound (Direction d) const
if (spanned_drul_[Direction(-d)] == spanned_drul_[d]
&& i)
- warning (_f ("Spanner `%s' has equal left and right spanpoints", classname (this)));
+ warning (_f ("Spanner `%s' has equal left and right spanpoints",
+ classname (this)));
}