source file of the GNU LilyPond music typesetter
- (c) 1996--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1996--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
+
+#include "spanner.hh"
+
#include <math.h>
-#include <libc-extension.hh>
+#include <libc-extension.hh>
#include "warn.hh"
-#include "spanner.hh"
#include "paper-column.hh"
#include "paper-score.hh"
-#include "molecule.hh"
-#include "paper-outputter.hh"
+#include "stencil.hh"
#include "paper-column.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);
break_points.insert (left,0);
break_points.push (right);
- for (int i=1; i < break_points.size (); i++)
+ for (int i =1; i < break_points.size (); i++)
{
Drul_array<Item*> bounds;
bounds[LEFT] = break_points[i-1];
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
+{
+ return break_index_;
+}
+
void
Spanner::set_my_columns ()
{
{
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;
}
return;
}
- spanned_drul_[d] =i;
+ spanned_drul_[d] = i;
/**
We check for System to prevent the column -> line_of_score
-> column -> line_of_score -> etc situation */
- if (d== LEFT && !dynamic_cast<System*> (this))
+ if (d == LEFT && !dynamic_cast<System*> (this))
{
set_parent (i, X_AXIS);
}
}
}
-Spanner::Spanner (SCM s)
- : Grob (s)
+Spanner::Spanner (SCM s, Object_key const*key)
+ : Grob (s, key)
{
break_index_ = 0;
- spanned_drul_[LEFT]=0;
- spanned_drul_[RIGHT]=0;
+ spanned_drul_[LEFT]= 0;
+ spanned_drul_[RIGHT]= 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;
+ spanned_drul_[LEFT] = spanned_drul_[RIGHT] = 0;
}
Real
}
bool
-Spanner::broken_b () const
+Spanner::is_broken () const
{
return broken_intos_.size ();
}
// Relevant only if left span point is first column in line
if (sc != NULL &&
- sc->break_status_dir () == RIGHT)
+ sc->break_status_dir () == RIGHT)
{
/*
}
SCM
-Spanner::do_derived_mark ()
+Spanner::do_derived_mark () const
{
/*
We'd be fucked if this is called before spanned_drul_[] is inited. */
scm_gc_mark (spanned_drul_[d]->self_scm ());
while (flip (&d) != LEFT);
- for (int i= broken_intos_.size () ; i--;)
+ for (int i = broken_intos_.size () ; i--;)
scm_gc_mark (broken_intos_[i]->self_scm ());
return SCM_EOL;
r.item_l_drul_[LEFT] = sp->get_bound (LEFT);
r.item_l_drul_[RIGHT] = sp->get_bound (RIGHT);
r.distance_ =
- gh_scm2double (me->get_grob_property ("minimum-length"))
- * 1.0;
+ robust_scm2double (me->get_property ("minimum-length"), 0);
r.add_to_cols ();
return SCM_UNSPECIFIED;
}
+/*
+ Return I such that SP == SP->ORIGINAL_->BROKEN_INTOS_[I].
+ */
+int
+broken_spanner_index (Spanner * sp)
+{
+ Spanner * parent = dynamic_cast<Spanner*> (sp->original_);
+ return parent->broken_intos_.find_index (sp);
+}
+
+
Spanner*
unsmob_spanner (SCM s )
{
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
-example, slur, beam, tie, etc. These grobs form a subtype called
-@code{Spanner}. All spanners have two span-points (these must be
-@code{Item}s), one on the left and one on the right. The left bound is
-also the X-reference point of the spanner.
-",
+"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} 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");