Axis_group_interface::calc_pure_relevant_grobs (SCM smob)
{
Grob *me = unsmob_grob (smob);
+ /* TODO: Filter out elements that belong to a different Axis_group,
+ such as the tie in
+ << \new Staff=A { c'1~ \change Staff=B c'}
+ \new Staff=B { \clef bass R1 R } >>
+ because thier location relative to this Axis_group is not known before
+ page layout. For now, we need to trap this case in calc_pure_y_common.
+ */
return internal_calc_pure_relevant_grobs (me, "elements");
}
SCM
-Axis_group_interface::internal_calc_pure_relevant_grobs (Grob *me, string grob_set_name)
+Axis_group_interface::internal_calc_pure_relevant_grobs (Grob *me, const string &grob_set_name)
{
extract_grob_set (me, grob_set_name.c_str (), elts);
for (vsize i = 0; i < elts.size (); i++)
{
if (elts[i] && elts[i]->is_live ())
+ relevant_grobs.push_back (elts[i]);
+ /*
+ TODO (mikesol): it is probably bad that we're reading prebroken
+ pieces from potentially suicided elements. This behavior
+ has been in current master since at least 2.16.
+
+ We need to fully suicide all Items, meaning that their
+ prebroken pieces should not be accessible, which means that
+ Item::handle_prebroken_dependencies should only be called
+ AFTER this list is composed. The list composition function
+ should probably not check for suicided items or NULL pointers
+ but leave that to the various methods that use it.
+ */
+ if (Item *it = dynamic_cast<Item *> (elts[i]))
{
- relevant_grobs.push_back (elts[i]);
- if (Item *it = dynamic_cast<Item *> (elts[i]))
+ for (LEFT_and_RIGHT (d))
{
- for (LEFT_and_RIGHT (d))
- {
- Item *piece = it->find_prebroken_piece (d);
- if (piece && piece->is_live ())
- relevant_grobs.push_back (piece);
- }
+ Item *piece = it->find_prebroken_piece (d);
+ if (piece && piece->is_live ())
+ relevant_grobs.push_back (piece);
}
}
}
extract_grob_set (me, "pure-relevant-grobs", elts);
Grob *common = common_refpoint_of_array (elts, me, Y_AXIS);
+ if (common != me && Align_interface::has_interface (common))
+ {
+ me->programming_error("My pure_y_common is a VerticalAlignment,"
+ " which might contain several staves.");
+ common = me;
+ }
if (!common)
{
me->programming_error ("No common parent found in calc_pure_y_common.");
for (vsize j = 0; j < other_v_skylines.size (); j++)
{
Skyline_pair const &v_other = other_v_skylines[j];
- Real pad = (padding + other_padding[j]);
- Real horizon_pad = (horizon_padding + other_horizon_padding[j]);
+ Real pad = max (padding, other_padding[j]);
+ Real horizon_pad = max (horizon_padding, other_horizon_padding[j]);
// We need to push elt up by at least this much to be above v_other.
Real up = (*v_skyline)[DOWN].distance (v_other[UP], horizon_pad) + pad;
{
Grob *elt = elements[i];
Real padding
- = robust_scm2double (elt->get_property ("outside-staff-padding"), 0.25);
+ = robust_scm2double (elt->get_property ("outside-staff-padding"),
+ Axis_group_interface
+ ::get_default_outside_staff_padding ());
Real horizon_padding
= robust_scm2double (elt->get_property ("outside-staff-horizontal-padding"), 0.0);
Interval x_extent = elt->extent (x_common, X_AXIS);
Grob *x_common = common_refpoint_of_array (elements, me, X_AXIS);
Grob *y_common = common_refpoint_of_array (elements, me, Y_AXIS);
- assert (y_common == me);
+ if (y_common != me)
+ {
+ me->programming_error("Some of my vertical-skyline-elements"
+ " are outside my VerticalAxisGroup.");
+ y_common = me;
+ }
// A rider is a grob that is not outside-staff, but has an outside-staff
// ancestor. In that case, the rider gets moved along with its ancestor.