source file of the GNU LilyPond music typesetter
- (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ (c) 1997--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
*/
#include "item.hh"
#include "system.hh"
#include "pointer-group-interface.hh"
+#include "moment.hh"
+
+
Grob *
-Item::clone (int count) const
+Item::clone () const
{
- return new Item (*this, count);
+ return new Item (*this);
}
-Item::Item (SCM s, Object_key const *key)
- : Grob (s, key)
+Item::Item (SCM s)
+ : Grob (s)
{
broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] = 0;
+ cached_pure_height_valid_ = false;
}
/**
Item copy ctor. Copy nothing: everything should be a elt property
or a special purpose pointer (such as broken_to_drul_[]) */
-Item::Item (Item const &s, int copy_count)
- : Grob (s, copy_count)
+Item::Item (Item const &s)
+ : Grob (s)
{
broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] = 0;
+ cached_pure_height_valid_ = false;
}
bool
{
Drul_array<Item *> new_copies;
Direction i = LEFT;
- int count = 0;
do
{
- Grob *dolly = clone (count++);
+ Grob *dolly = clone ();
Item *item = dynamic_cast<Item *> (dolly);
get_root_system (this)->typeset_grob (item);
new_copies[i] = item;
Can't do this earlier, because try_visibility_lambda () might set
the elt property transparent, which would then be copied.
*/
- SCM vis = get_property ("break-visibility");
- if (scm_is_vector (vis))
- {
- bool visible = to_boolean (scm_c_vector_ref (vis, break_status_dir () + 1));
+ if (!Item::break_visible (this))
+ suicide ();
+}
- if (!visible)
- suicide ();
- }
+bool
+Item::break_visible (Grob *g)
+{
+ Item *it = dynamic_cast<Item*> (g);
+ SCM vis = g->get_property ("break-visibility");
+ if (scm_is_vector (vis))
+ return to_boolean (scm_c_vector_ref (vis, it->break_status_dir () + 1));
+ return true;
}
bool
}
Interval_t<int>
-Item::spanned_rank_iv ()
+Item::spanned_rank_interval () const
{
int c = get_column ()->get_rank ();
return Interval_t<int> (c, c);
}
+Interval_t<Moment>
+spanned_time_interval (Item *l, Item *r)
+{
+ Drul_array<Item*> bounds (l, r);
+ Interval_t<Moment> iv;
+
+ Direction d = LEFT;
+ do
+ {
+ if (bounds[d] && bounds[d]->get_column ())
+ iv[d] = robust_scm2moment (bounds[d]->get_column ()->get_property ("when"),
+ iv[d]);
+ }
+ while (flip (&d) != LEFT);
+
+ do
+ {
+ if (!bounds[d] || !bounds[d]->get_column ())
+ iv[d] = iv[-d];
+ }
+ while (flip (&d) != LEFT);
+
+
+ return iv;
+}
+
+
void
Item::derived_mark () const
{
return dynamic_cast<Item *> (unsmob_grob (s));
}
+Interval
+Item::pure_height (Grob *g, int start, int end)
+{
+ if (cached_pure_height_valid_)
+ return cached_pure_height_ + pure_relative_y_coordinate (g, start, end);
+
+ cached_pure_height_ = Grob::pure_height (this, start, end);
+ cached_pure_height_valid_ = true;
+ return cached_pure_height_ + pure_relative_y_coordinate (g, start, end);
+}
+
+bool
+Item::less (Grob * const &g1, Grob * const &g2)
+{
+ return dynamic_cast<Item*> (g1)->get_column ()->get_rank () < dynamic_cast<Item*> (g2)->get_column ()->get_rank ();
+}
+
ADD_INTERFACE (Item,
"Grobs can be distinguished in their role in the horizontal spacing.\n"
/* properties */
"break-visibility "
- "no-spacing-rods "
+ "extra-spacing-width "
+ "infinite-spacing-height "
"non-musical")