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,
- "item-interface",
- "\n"
- "\n"
+
"Grobs can be distinguished in their role in the horizontal spacing.\n"
"Many grobs define constraints on the spacing by their sizes. For\n"
"example, note heads, clefs, stems, and all other symbols with a fixed\n"
/* properties */
"break-visibility "
- "no-spacing-rods "
+ "extra-spacing-width "
+ "infinite-spacing-height "
"non-musical")