(c) 1996--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
-#include <math.h>
-#include <libc-extension.hh>
+#include "spanner.hh"
+
+#include <cmath>
+
+#include <libc-extension.hh>
#include "warn.hh"
-#include "spanner.hh"
#include "paper-column.hh"
#include "paper-score.hh"
#include "stencil.hh"
#include "system.hh"
#include "group-interface.hh"
+
+
+Grob *
+Spanner::clone (int count) const
+{
+ return new Spanner (*this, count);
+}
+
void
Spanner::do_break_processing ()
{
{
if (Spanner* parent = dynamic_cast<Spanner*> (get_parent ((Axis)a)))
{
- if (!parent->spanned_rank_iv ().contains_b (this->spanned_rank_iv ()))
+ if (!parent->spanned_rank_iv ().superset (this->spanned_rank_iv ()))
{
programming_error (to_string ("Spanner `%s' is not fully contained in parent spanner `%s'.",
name ().to_str0 (),
}
}
- if (get_system () || broken_b ())
+ if (get_system () || is_broken ())
return;
if (left == right)
programming_error ("no broken bound");
else if (bound->get_system ())
{
- Spanner * span = dynamic_cast<Spanner*> (clone ());
+ Spanner * span = dynamic_cast<Spanner*> (clone (broken_intos_.size ()));
span->set_bound (LEFT, bound);
span->set_bound (RIGHT, bound);
continue;
}
- Spanner *span = dynamic_cast<Spanner*> (clone ());
+ Spanner *span = dynamic_cast<Spanner*> (clone (broken_intos_.size ()));
span->set_bound (LEFT,bounds[LEFT]);
span->set_bound (RIGHT,bounds[RIGHT]);
}
}
broken_intos_.sort (Spanner::compare);
- for (int i= broken_intos_.size();i--;)
+ for (int i= broken_intos_.size ();i--;)
broken_intos_[i]->break_index_ = i;
}
int
-Spanner::get_break_index ()const
+Spanner::get_break_index () const
{
return break_index_;
}
{
Interval_t<int> iv (0, 0);
- if (spanned_drul_[LEFT])
- {
- iv[LEFT] = Paper_column::get_rank (spanned_drul_[LEFT]->get_column ());
- }
- if (spanned_drul_[RIGHT])
- {
- iv[RIGHT] = Paper_column::get_rank (spanned_drul_[RIGHT]->get_column ());
- }
+ if (spanned_drul_[LEFT] && spanned_drul_[LEFT]->get_column ())
+ iv[LEFT] = Paper_column::get_rank (spanned_drul_[LEFT]->get_column ());
+ if (spanned_drul_[RIGHT] && spanned_drul_[RIGHT]->get_column ())
+ iv[RIGHT] = Paper_column::get_rank (spanned_drul_[RIGHT]->get_column ());
return iv;
}
}
}
-Spanner::Spanner (SCM s)
- : Grob (s)
+Spanner::Spanner (SCM s, Object_key const*key)
+ : Grob (s, key)
{
break_index_ = 0;
spanned_drul_[LEFT]=0;
Group_interface::add_thing (this, ly_symbol2scm ("interfaces"), ly_symbol2scm ("spanner-interface"));
}
-Spanner::Spanner (Spanner const &s)
- : Grob (s)
+Spanner::Spanner (Spanner const &s, int count)
+ : Grob (s, count)
{
spanned_drul_[LEFT] = spanned_drul_[RIGHT] =0;
}
}
bool
-Spanner::broken_b () const
+Spanner::is_broken () const
{
return broken_intos_.size ();
}
r.item_l_drul_[LEFT] = sp->get_bound (LEFT);
r.item_l_drul_[RIGHT] = sp->get_bound (RIGHT);
r.distance_ =
- robust_scm2double (me->get_grob_property ("minimum-length"), 0);
+ robust_scm2double (me->get_property ("minimum-length"), 0);
r.add_to_cols ();
return SCM_UNSPECIFIED;
return dynamic_cast<Spanner*> (unsmob_grob (s));
}
-ADD_INTERFACE(Spanner,
+ADD_INTERFACE (Spanner,
"spanner-interface",
-"Other grobs have a shape that depends on the horizontal spacing. For\n"
+"Some objects are horizontally spanned between objects. For\n"
"example, slur, beam, tie, etc. These grobs form a subtype called\n"
"@code{Spanner}. All spanners have two span-points (these must be\n"
-"@code{Item}s), one on the left and one on the right. The left bound is\n"
+"@code{Item} objects), one on the left and one on the right. The left bound is\n"
"also the X-reference point of the spanner.\n"
,
"minimum-length");