X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Faxis-group-interface.cc;h=0d786c3a2959aa201470f761c27ee3cd6a98645d;hb=bd26755d6208ce93e12d701e9f0b4ac72180bacd;hp=707e045c9b1a13b3127997d8c1ec05fed81467b7;hpb=28f3294954eff1f263d3b2e3de1c520f4d2fbdfc;p=lilypond.git diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index 707e045c9b..0d786c3a29 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -51,6 +51,19 @@ Axis_group_interface::get_default_outside_staff_padding () return default_outside_staff_padding_; } +MAKE_SCHEME_CALLBACK (Axis_group_interface, cross_staff, 1); +SCM +Axis_group_interface::cross_staff (SCM smob) +{ + Grob *me = unsmob_grob (smob); + extract_grob_set (me, "elements", elts); + for (vsize i = 0; i < elts.size (); i++) + if (to_boolean (elts[i]->get_property ("cross-staff"))) + return SCM_BOOL_T; + + return SCM_BOOL_F; +} + void Axis_group_interface::add_element (Grob *me, Grob *e) { @@ -99,7 +112,8 @@ Axis_group_interface::relative_maybe_bound_group_extent (vector const &e for (vsize i = 0; i < elts.size (); i++) { Grob *se = elts[i]; - if (!to_boolean (se->get_property ("cross-staff"))) + if (has_interface (se) + || !to_boolean (se->get_property ("cross-staff"))) { Interval dims = (bound && has_interface (se) ? generic_bound_extent (se, common, a) @@ -240,7 +254,11 @@ Axis_group_interface::adjacent_pure_heights (SCM smob) { Grob *g = elts[i]; - if (to_boolean (g->get_property ("cross-staff"))) + if (to_boolean (g->get_property ("cross-staff")) + && !has_interface (g)) + continue; + + if (!g->is_live ()) continue; bool outside_staff = scm_is_number (g->get_property ("outside-staff-priority")); @@ -392,9 +410,7 @@ SCM Axis_group_interface::calc_skylines (SCM smob) { Grob *me = unsmob_grob (smob); - extract_grob_set (me, Grob_array::unsmob (me->get_object ("vertical-skyline-elements")) ? "vertical-skyline-elements" : "elements", elts); - Skyline_pair skylines = skyline_spacing (me, elts); - + Skyline_pair skylines = skyline_spacing (me); return skylines.smobbed_copy (); } @@ -435,11 +451,13 @@ Axis_group_interface::combine_skylines (SCM smob) SCM Axis_group_interface::generic_group_extent (Grob *me, Axis a) { + extract_grob_set (me, "elements", elts); + /* trigger the callback to do skyline-spacing on the children */ if (a == Y_AXIS) - (void) me->get_property ("vertical-skylines"); + for (vsize i = 0; i < elts.size (); i++) + (void) elts[i]->get_property ("vertical-skylines"); - extract_grob_set (me, "elements", elts); Grob *common = common_refpoint_of_array (elts, me, a); Real my_coord = me->relative_coordinate (common, a); @@ -478,20 +496,20 @@ Axis_group_interface::internal_calc_pure_relevant_grobs (Grob *me, string grob_s extract_grob_set (me, grob_set_name.c_str (), elts); vector relevant_grobs; - SCM pure_relevant_p = ly_lily_module_constant ("pure-relevant?"); for (vsize i = 0; i < elts.size (); i++) { - if (to_boolean (scm_apply_1 (pure_relevant_p, elts[i]->self_scm (), SCM_EOL))) - relevant_grobs.push_back (elts[i]); - - if (Item *it = dynamic_cast (elts[i])) + if (elts[i] && elts[i]->is_live ()) { - for (LEFT_and_RIGHT (d)) + relevant_grobs.push_back (elts[i]); + if (Item *it = dynamic_cast (elts[i])) { - Item *piece = it->find_prebroken_piece (d); - if (piece && to_boolean (scm_apply_1 (pure_relevant_p, piece->self_scm (), SCM_EOL))) - relevant_grobs.push_back (piece); + for (LEFT_and_RIGHT (d)) + { + Item *piece = it->find_prebroken_piece (d); + if (piece && piece->is_live ()) + relevant_grobs.push_back (piece); + } } } } @@ -558,7 +576,7 @@ Axis_group_interface::pure_group_height (Grob *me, int start, int end) programming_error ("no pure Y common refpoint"); return Interval (); } - Real my_coord = me->relative_coordinate (common, Y_AXIS); + Real my_coord = me->pure_relative_y_coordinate (common, start, end); Interval r (relative_pure_height (me, start, end)); return r - my_coord; @@ -834,8 +852,10 @@ Axis_group_interface::outside_staff_ancestor (Grob *me) // that there is no room for the cross-staff grob. It also means, of course, that // we don't get the benefits of skyline placement for cross-staff grobs. Skyline_pair -Axis_group_interface::skyline_spacing (Grob *me, vector elements) +Axis_group_interface::skyline_spacing (Grob *me) { + extract_grob_set (me, Grob_array::unsmob (me->get_object ("vertical-skyline-elements")) ? "vertical-skyline-elements" : "elements", fakeelements); + vector elements (fakeelements); for (vsize i = 0; i < elements.size (); i++) /* As a sanity check, we make sure that no grob with an outside staff priority @@ -870,12 +890,13 @@ Axis_group_interface::skyline_spacing (Grob *me, vector elements) vsize i = 0; vector inside_staff_skylines; + for (i = 0; i < elements.size () && !scm_is_number (elements[i]->get_property ("outside-staff-priority")); i++) { Grob *elt = elements[i]; Grob *ancestor = outside_staff_ancestor (elt); - if (!(to_boolean (elt->get_property ("cross-staff")) || ancestor)) + if (!ancestor) add_interior_skylines (elt, x_common, y_common, &inside_staff_skylines); if (ancestor) riders.insert (pair (ancestor, elt));