(c) 1996--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
#include <math.h>
+#include <libc-extension.hh>
#include "dimension-cache.hh"
#include "debug.hh"
//break_into_pieces
Item * left = spanned_drul_[LEFT];
Item * right = spanned_drul_[RIGHT];
+
+ if (!left || !right)
+ return;
if (left == right)
{
{
if (Spanner* parent = dynamic_cast<Spanner*> (parent_l ((Axis)a)))
{
-#if 1
- /*
- Urg, should use instantiate-compare, or maybe mysterious
- column_width/contains functions?
- */
- if (spanned_drul_[LEFT] && spanned_drul_[RIGHT]
- && parent->spanned_drul_[LEFT] && parent->spanned_drul_[RIGHT])
- {
- if (parent->spanned_drul_[LEFT]->column_l ()->rank_i ()
- > spanned_drul_[LEFT]->column_l ()->rank_i () > 0
- || parent->spanned_drul_[RIGHT]->column_l ()->rank_i ()
- < spanned_drul_[RIGHT]->column_l ()->rank_i ())
- {
- warning (_f ("Spanner `%s' is not fully contained in parent spanner `%s'.",
- classname (this), classname (parent)));
- }
- }
-#else
- /*
- column_width (), contains ()?
- */
- if (!parent->column_width ().contains (this->column_width ()))
+ if (!parent->spanned_rank_iv ().contains_b (this->spanned_rank_iv ()))
{
- warning (_f ("Spanner `%s' is not fully contained in parent spanner `%s'.",
- classname (this), classname (parent)));
+ programming_error (to_str ("Spanner `%s' is not fully contained in parent spanner `%s'.",
+ classname (this),
+ classname (parent)));
}
-#endif
}
}
Direction d = LEFT;
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);
+ Item* bound = left->find_prebroken_piece (d);
+ 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);
Direction d = LEFT;
do
{
- Item *&pc_l = bounds[d] ;
- if (!pc_l->line_l())
- pc_l = pc_l->find_broken_piece(- d);
-
- assert (pc_l);
+ if (!bounds[d]->line_l())
+ bounds[d] = bounds[d]->find_prebroken_piece(- d);
}
while ((flip(&d))!= LEFT);
+ if (!bounds[LEFT] || ! bounds[RIGHT])
+ {
+ programming_error ("bounds of this piece aren't breakable. ");
+ continue;
+ }
+
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);
}
}
do
{
if (!spanned_drul_[i]->line_l())
- set_bound(i,spanned_drul_[i]->find_broken_piece((Direction) -i));
+ set_bound(i,spanned_drul_[i]->find_prebroken_piece((Direction) -i));
}
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
Spanner::set_bound(Direction d, Item*i)
{
spanned_drul_[d] =i;
- if (i)
- {
- i->used_b_ = true;
- }
/**
- Prevent the column -> line_of_score -> column -> line_of_score -> etc situation
- */
+ We check for Line_of_score to prevent the column -> line_of_score
+ -> column -> line_of_score -> etc situation */
if (d== LEFT && !dynamic_cast<Line_of_score*> (this))
{
set_parent (i, X_AXIS);
}
-Spanner::Spanner ()
+Spanner::Spanner (SCM s)
+ : Score_element (s)
{
spanned_drul_[LEFT]=0;
spanned_drul_[RIGHT]=0;
return 0.0;
}
+
+void
+Spanner::do_derived_mark ()
+{
+ Direction d = LEFT;
+ do
+ if (spanned_drul_[d])
+ scm_gc_mark (spanned_drul_[d]->self_scm_);
+ while (flip (&d) != LEFT);
+}
+