(c) 1996--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
#include <math.h>
+#include <libc-extension.hh>
+
-#include "dimension-cache.hh"
#include "debug.hh"
#include "spanner.hh"
#include "paper-column.hh"
//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)));
- }
+ if (!left || !right)
+ return;
+
/*
Check if our parent in X-direction spans equally wide
or wider than we do.
if (left == right)
{
- /*
- FIXME: this is broken.
- */
/*
If we have a spanner spanning one column, we must break it
anyway because it might provide a parent for another item. */
Direction d = LEFT;
do
{
- Item* bound = left->find_broken_piece (d);
- if (bound->line_l ())
+ Item* bound = left->find_prebroken_piece (d);
+ if (!bound)
+ programming_error ("no broken bound");
+ else if (bound->line_l ())
{
Spanner * span_p = dynamic_cast<Spanner*>( clone ());
span_p->set_bound (LEFT, bound);
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]);
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);
}
if (spanned_drul_[LEFT])
{
- iv[LEFT] = spanned_drul_[LEFT]->column_l ()->rank_i ();
+ iv[LEFT] = Paper_column::rank_i (spanned_drul_[LEFT]->column_l ());
}
- if ( spanned_drul_[RIGHT])
+ if (spanned_drul_[RIGHT])
{
- iv[RIGHT] = spanned_drul_[RIGHT]->column_l ()->rank_i ();
+ iv[RIGHT] = Paper_column::rank_i (spanned_drul_[RIGHT]->column_l ());
}
return iv;
}
}
void
-Spanner::set_bound(Direction d, Item*i)
+Spanner::set_bound(Direction d, Score_element*s)
{
- spanned_drul_[d] =i;
- if (i)
+ Item * i = dynamic_cast<Item*> (s);
+ if (!i)
{
- i->used_b_ = true;
+ programming_error ("Must have Item for spanner bound.");
+ return;
}
+
+ spanned_drul_[d] =i;
/**
- 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);
}
-
- if (spanned_drul_[Direction(-d)] == spanned_drul_[d]
- && i)
- warning (_f ("Spanner `%s' has equal left and right spanpoints",
- classname (this)));
}
-Spanner::Spanner ()
+Spanner::Spanner (SCM s)
+ : Score_element (s)
{
spanned_drul_[LEFT]=0;
spanned_drul_[RIGHT]=0;
int
Spanner::compare (Spanner * const &p1, Spanner * const &p2)
{
- return p1->line_l ()->rank_i_ - p2->line_l ()->rank_i_;
+ return p1->line_l ()->rank_i_ - p2->line_l ()->rank_i_;
}
bool
return broken_into_l_arr_.size();
}
-Array<Rod>
-Spanner::get_rods () const
-{
- Array<Rod> r;
- return r;
-}
-
-Array<Spring>
-Spanner::get_springs () const
-{
- Array<Spring> s;
- return s;
-}
-
-void
-Spanner::do_space_processing ()
-{
- Array<Rod> rs (get_rods ());
- for (int i=0; i < rs.size (); i++)
- {
- rs[i].add_to_cols ();
- }
-
- Array<Spring> ss (get_springs ());
- for (int i=0; i < ss.size (); i++)
- {
- if (isinf (ss[i].distance_f_))
- programming_error ("weird spring");
- else
- ss[i].add_to_cols ();
- }
-}
/*
If this is a broken spanner, return the amount the left end is to be
return 0.0;
}
+
+SCM
+Spanner::do_derived_mark ()
+{
+ /*
+ We'd be fucked if this is called before spanned_drul_[] is inited. */
+ if (status_i_ == ORPHAN)
+ return SCM_EOL;
+
+ Direction d = LEFT;
+ do
+ if (spanned_drul_[d])
+ scm_gc_mark (spanned_drul_[d]->self_scm ());
+ while (flip (&d) != LEFT);
+
+ for (int i= broken_into_l_arr_.size () ; i--;)
+ scm_gc_mark (broken_into_l_arr_[i]->self_scm ());
+
+ return SCM_EOL;
+}
+
+void
+add_bound_item (Spanner* sp, Item*it)
+{
+ if (!sp->get_bound (LEFT))
+ sp->set_bound (LEFT, it);
+ else
+ sp->set_bound (RIGHT, it);
+}