X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Faxis-group-interface.cc;h=0a82fe67131c859afd8aa95ad3df752877fb62d6;hb=95c0da566d72ce0823a3f6ff0c1cf35e4b7433b3;hp=3e9450c846139f977af064db4ba1f596ae15f01c;hpb=ba8a253a14cfcbd757fef0ad36232d371b88d23b;p=lilypond.git diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index 3e9450c846..0a82fe6713 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -90,11 +90,14 @@ Axis_group_interface::cached_pure_height (Grob *me, int start, int end) SCM extents = me->get_property ("adjacent-pure-heights"); + if (!scm_is_vector (extents)) + return Interval (0, 0); + Interval ext; for (vsize i = 0; i + 1 < breaks.size (); i++) { int r = Paper_column::get_rank (cols[breaks[i]]); - if (r > end) + if (r >= end) break; if (r >= start) @@ -131,7 +134,8 @@ Axis_group_interface::adjacent_pure_heights (SCM smob) Item *it = dynamic_cast (items[j]); int rank = it->get_column ()->get_rank (); - if (rank <= end && it->pure_is_visible (start, end)) + if (rank <= end && it->pure_is_visible (start, end) + && !to_boolean (it->get_property ("cross-staff"))) { Interval dims = items[j]->pure_height (common, start, end); if (!dims.is_empty ()) @@ -147,7 +151,8 @@ Axis_group_interface::adjacent_pure_heights (SCM smob) for (vsize j = 0; j < spanners.size (); j++) { Interval_t rank_span = spanners[j]->spanned_rank_interval (); - if (rank_span[LEFT] <= end && rank_span[RIGHT] >= start) + if (rank_span[LEFT] <= end && rank_span[RIGHT] >= start + && !to_boolean (spanners[j]->get_property ("cross-staff"))) { Interval dims = spanners[j]->pure_height (common, start, end); if (!dims.is_empty ()) @@ -189,7 +194,8 @@ Axis_group_interface::relative_pure_height (Grob *me, int start, int end) if (rank > end) break; - else if (rank >= start && it->pure_is_visible (start, end)) + else if (rank >= start && it->pure_is_visible (start, end) + && !to_boolean (it->get_property ("cross-staff"))) { Interval dims = it->pure_height (common, start, end); if (!dims.is_empty ()) @@ -200,7 +206,8 @@ Axis_group_interface::relative_pure_height (Grob *me, int start, int end) for (vsize i = 0; i < spanners.size (); i++) { Interval_t rank_span = spanners[i]->spanned_rank_interval (); - if (rank_span[LEFT] <= end && rank_span[RIGHT] >= start) + if (rank_span[LEFT] <= end && rank_span[RIGHT] >= start + && !to_boolean (spanners[i]->get_property ("cross-staff"))) { Interval dims = spanners[i]->pure_height (common, start, end); if (!dims.is_empty ()) @@ -256,13 +263,6 @@ Axis_group_interface::calc_skylines (SCM smob) extract_grob_set (me, "elements", elts); Skyline_pair skylines = skyline_spacing (me, elts); - /* add a minimum-Y-extent-sized box to the skyline */ - SCM min_y_extent = me->get_property ("minimum-Y-extent"); - if (is_number_pair (min_y_extent)) - { - Box b (me->extent (me, X_AXIS), ly_scm2interval (min_y_extent)); - skylines.insert (b, 0, X_AXIS); - } return skylines.smobbed_copy (); } @@ -316,6 +316,22 @@ Axis_group_interface::generic_group_extent (Grob *me, Axis a) return ly_interval2scm (r - my_coord); } +/* This is like generic_group_extent, but it only counts the grobs that + are children of some other axis-group. This is uncached; if it becomes + commonly used, it may be necessary to cache it somehow. */ +Interval +Axis_group_interface::staff_extent (Grob *me, Grob *refp, Axis ext_a, Grob *staff, Axis parent_a) +{ + extract_grob_set (me, "elements", elts); + vector new_elts; + + for (vsize i = 0; i < elts.size (); i++) + if (elts[i]->common_refpoint (staff, parent_a) == staff) + new_elts.push_back (elts[i]); + + return relative_group_extent (new_elts, refp, ext_a); +} + Grob * Axis_group_interface::calc_pure_elts_and_common (Grob *me)