X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Faxis-group-interface.cc;h=0a82fe67131c859afd8aa95ad3df752877fb62d6;hb=78b1072d477435d5f2725b7e3c6c40af8d90f1ab;hp=da08f53526eb4f1fa333df1126cd3ccdb77478c1;hpb=af42a04d7235bfc3cb2cd1a6df92153d8be7867f;p=lilypond.git diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index da08f53526..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 (); } @@ -279,8 +279,10 @@ Axis_group_interface::combine_skylines (SCM smob) Grob *me = unsmob_grob (smob); extract_grob_set (me, "elements", elements); Grob *y_common = common_refpoint_of_array (elements, me, Y_AXIS); + Grob *x_common = common_refpoint_of_array (elements, me, X_AXIS); - assert (y_common == me); + if (y_common != me) + programming_error ("combining skylines that don't belong to me"); Skyline_pair ret; for (vsize i = 0; i < elements.size (); i++) @@ -291,6 +293,7 @@ Axis_group_interface::combine_skylines (SCM smob) Real offset = elements[i]->relative_coordinate (y_common, Y_AXIS); Skyline_pair other = *Skyline_pair::unsmob (skyline_scm); other.raise (offset); + other.shift (elements[i]->relative_coordinate (x_common, X_AXIS)); ret.merge (other); } } @@ -313,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) @@ -478,7 +497,7 @@ add_boxes (Grob *me, Grob *x_common, Grob *y_common, vector *const boxes, S positions, one for above the staff, one for below). In each pass, we loop through the unplaced grobs from left to right. - If the grob overlaps the right-most affected position, we place it + If the grob doesn't overlap the right-most affected position, we place it (and then update the right-most affected position to point to the right edge of the just-placed grob). Otherwise, we skip it until the next pass. */ @@ -620,6 +639,7 @@ ADD_INTERFACE (Axis_group_interface, "elements " "keep-fixed-while-stretching " "max-stretch " + "no-alignment " "pure-Y-common " "pure-relevant-items " "pure-relevant-spanners "