X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Faxis-group-interface.cc;h=6d7074fe98f18152c84e620d6131e6f08cbebc9e;hb=b8f63200f0dde97e6d066e5f1082808e224d9774;hp=2ede25493acad7693f5b8dc8c19cd446d7a87b10;hpb=25190a4637753e6439c445d2d4fe9323b7945d32;p=lilypond.git diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index 2ede25493a..6d7074fe98 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -87,6 +87,8 @@ Axis_group_interface::cached_pure_height (Grob *me, if (end == r) end_index = i; } + if (end == INT_MAX) + end_index = breaks.size () - 1; if (start_index == VPOS || end_index == VPOS) { @@ -269,24 +271,39 @@ staff_priority_less (Grob * const &g1, Grob * const &g2) return rank_1 < rank_2; } +static void +add_boxes (Grob *me, Grob *x_common, Grob *y_common, vector *const boxes) +{ + if (Axis_group_interface::has_interface (me) + && Axis_group_interface::has_axis (me, Y_AXIS)) + { + Grob_array *elements = unsmob_grob_array (me->get_object ("elements")); + if (elements) + for (vsize i = 0; i < elements->size (); i++) + add_boxes (elements->grob (i), x_common, y_common, boxes); + } + else + boxes->push_back (Box (me->extent (x_common, X_AXIS), + me->extent (y_common, Y_AXIS))); +} + void Axis_group_interface::skyline_spacing (Grob *me, vector elements) { vector_sort (elements, staff_priority_less); Grob *x_common = common_refpoint_of_array (elements, me, X_AXIS); Grob *y_common = common_refpoint_of_array (elements, me, Y_AXIS); + Real max_slope = robust_scm2double (me->get_property ("skyline-max-slope"), 4); vsize i = 0; vector boxes; for (i = 0; i < elements.size () && !scm_is_number (elements[i]->get_property ("outside-staff-priority")); i++) - boxes.push_back (Box (elements[i]->extent (x_common, X_AXIS), - elements[i]->extent (y_common, Y_AXIS))); + add_boxes (elements[i], x_common, y_common, &boxes); - - Drul_array skylines (Skyline (boxes, X_AXIS, DOWN), - Skyline (boxes, X_AXIS, UP)); + Drul_array skylines (Skyline (boxes, max_slope, X_AXIS, DOWN), + Skyline (boxes, max_slope, X_AXIS, UP)); for (; i < elements.size (); i++) { Direction dir = get_grob_direction (elements[i]); @@ -298,17 +315,24 @@ Axis_group_interface::skyline_spacing (Grob *me, vector elements) Box b (elements[i]->extent (x_common, X_AXIS), elements[i]->extent (y_common, Y_AXIS)); + if (b[X_AXIS].is_empty () || b[Y_AXIS].is_empty ()) + { + warning (_f ("outside-staff object %s has an empty extent", elements[i]->name ().c_str ())); + continue; + } + boxes.clear (); boxes.push_back (b); - Skyline other = Skyline (boxes, X_AXIS, -dir); - Real dist = skylines[dir].distance (other); + Skyline other = Skyline (boxes, max_slope, X_AXIS, -dir); + Real padding = robust_scm2double (elements[i]->get_property ("outside-staff-padding"), 0.5); + Real dist = skylines[dir].distance (other) + padding; if (dist > 0) { b.translate (Offset (0, dir*dist)); elements[i]->translate_axis (dir*dist, Y_AXIS); } - skylines[dir].insert (b, X_AXIS); + skylines[dir].insert (b, max_slope, X_AXIS); } } @@ -321,6 +345,7 @@ ADD_INTERFACE (Axis_group_interface, "elements " "common-refpoint-of-elements " "pure-relevant-elements " + "skyline-max-slope " "skyline-spacing " "cached-pure-extents " );