@@ -89,3 +190,47 @@ return ly_interval2scm (r - my_coord); } +SCM +Axis_group_interface::pure_group_height (Grob *me, int start, int end) +{ + Grob *common = unsmob_grob (me->get_object ("common-refpoint-of-elements")); + + if (!common) + { + extract_grob_set (me, "elements", elts); + + vector relevant_elts; + SCM is_relevant = ly_lily_module_constant ("pure-relevant"); + + for (vsize i = 0; i < elts.size (); i++) + { + if (to_boolean (scm_apply_1 (is_relevant, elts[i]->self_scm (), SCM_EOL))) + relevant_elts.push_back (elts[i]); + + Item *it = dynamic_cast (elts[i]); + Direction d = LEFT; + if (it) + do + { + Item *piece = it->find_prebroken_piece (d); + if (piece && to_boolean (scm_apply_1 (is_relevant, piece->self_scm (), SCM_EOL))) + relevant_elts.push_back (elts[i]); + } + while (flip (&d) != LEFT); + } + + common = common_refpoint_of_array (relevant_elts, me, Y_AXIS); + me->set_object ("common-refpoint-of-elements", common->self_scm ()); + + SCM ga_scm = Grob_array::make_array (); + Grob_array *ga = unsmob_grob_array (ga_scm); + ga->set_array (relevant_elts); + me->set_object ("pure-relevant-elements", ga_scm); + } + + extract_grob_set (me, "pure-relevant-elements", elts); + Real my_coord = me->relative_coordinate (common, Y_AXIS); + Interval r (relative_pure_height (me, elts, common, start, end, true)); + + return ly_interval2scm (r - my_coord); +} +