X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Faxis-group-interface.cc;h=f3a099b5df5dfb238fccf7a09768155c0fa8dedf;hb=a4d6cf4907b5ec9a897f2d8f142b0452222433d0;hp=143534edabe2874b4c73d2e314ed3fa5756dbea9;hpb=4a401ca1c60f428daa242dbdd102fdb3f327ebfb;p=lilypond.git diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index 143534edab..f3a099b5df 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -34,6 +34,7 @@ #include "stencil.hh" #include "system.hh" #include "warn.hh" +#include "unpure-pure-container.hh" static bool pure_staff_priority_less (Grob *const &g1, Grob *const &g2); @@ -74,6 +75,13 @@ Axis_group_interface::has_axis (Grob *me, Axis a) Interval Axis_group_interface::relative_group_extent (vector const &elts, Grob *common, Axis a) +{ + return relative_maybe_bound_group_extent (elts, common, a, false); +} + +Interval +Axis_group_interface::relative_maybe_bound_group_extent (vector const &elts, + Grob *common, Axis a, bool bound) { Interval r; for (vsize i = 0; i < elts.size (); i++) @@ -81,7 +89,9 @@ Axis_group_interface::relative_group_extent (vector const &elts, Grob *se = elts[i]; if (!to_boolean (se->get_property ("cross-staff"))) { - Interval dims = se->extent (common, a); + Interval dims = (bound && has_interface (se) + ? generic_bound_extent (se, common, a) + : se->extent (common, a)); if (!dims.is_empty ()) r.unite (dims); } @@ -89,6 +99,32 @@ Axis_group_interface::relative_group_extent (vector const &elts, return r; } +Interval +Axis_group_interface::generic_bound_extent (Grob *me, Grob *common, Axis a) +{ + /* trigger the callback to do skyline-spacing on the children */ + if (a == Y_AXIS) + (void) me->get_property ("vertical-skylines"); + + extract_grob_set (me, "elements", elts); + vector new_elts; + + SCM interfaces = me->get_property ("bound-alignment-interfaces"); + + for (vsize i = 0; i < elts.size (); i++) + for (SCM l = interfaces; scm_is_pair (l); l = scm_cdr (l)) + if (elts[i]->internal_has_interface (scm_car (l))) + new_elts.push_back (elts[i]); + + if (!new_elts.size ()) + return robust_relative_extent (me, common, a); + + if (!common) + common = common_refpoint_of_array (new_elts, me, a); + + return relative_maybe_bound_group_extent (new_elts, common, a, true); +} + Interval Axis_group_interface::sum_partial_pure_heights (Grob *me, int start, int end) { @@ -719,7 +755,7 @@ Axis_group_interface::skyline_spacing (Grob *me, vector elements) vector current_elts; current_elts.push_back (elements[i]); while (i + 1 < elements.size () - && scm_eq_p (elements[i + 1]->get_property ("outside-staff-priority"), priority)) + && scm_is_eq (elements[i + 1]->get_property ("outside-staff-priority"), priority)) { if (!to_boolean (elements[i + 1]->get_property ("cross-staff"))) current_elts.push_back (elements[i + 1]); @@ -808,6 +844,7 @@ ADD_INTERFACE (Axis_group_interface, /* properties */ "adjacent-pure-heights " "axes " + "bound-alignment-interfaces " "default-staff-staff-spacing " "elements " "max-stretch "