X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fitem.cc;h=fdf9b00ce9d36c1498076dc221e6ab01f992be61;hb=48c8ba6ff3dc9e22a3f0f7c94871c3508329010e;hp=c6ca1b2c6939778a77f096ba2671bac0ad0ecdd0;hpb=e79a1b386108bd84ef04a4a71b21b4049ca6b867;p=lilypond.git diff --git a/lily/item.cc b/lily/item.cc index c6ca1b2c69..fdf9b00ce9 100644 --- a/lily/item.cc +++ b/lily/item.cc @@ -16,6 +16,9 @@ #include "system.hh" #include "pointer-group-interface.hh" +#include "moment.hh" + + Grob * Item::clone () const { @@ -26,6 +29,7 @@ Item::Item (SCM s) : Grob (s) { broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] = 0; + cached_pure_height_valid_ = false; } /** @@ -35,6 +39,7 @@ Item::Item (Item const &s) : Grob (s) { broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] = 0; + cached_pure_height_valid_ = false; } bool @@ -146,14 +151,18 @@ Item::handle_prebroken_dependencies () 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 (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 @@ -174,12 +183,39 @@ Item::pure_is_visible (int start, int end) const } Interval_t -Item::spanned_rank_iv () +Item::spanned_rank_interval () const { int c = get_column ()->get_rank (); return Interval_t (c, c); } +Interval_t +spanned_time_interval (Item *l, Item *r) +{ + Drul_array bounds (l, r); + Interval_t 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 { @@ -195,6 +231,23 @@ unsmob_item (SCM s) return dynamic_cast (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 (g1)->get_column ()->get_rank () < dynamic_cast (g2)->get_column ()->get_rank (); +} + ADD_INTERFACE (Item, "Grobs can be distinguished in their role in the horizontal spacing.\n"