SCM extents = me->get_property ("adjacent-pure-heights");
+ if (!scm_is_vector (extents))
+ return Interval (0, 0);
+
Interval ext;
for (vsize i = 0; i + 1 < breaks.size (); i++)
{
int r = Paper_column::get_rank (cols[breaks[i]]);
- if (r > end)
+ if (r >= end)
break;
if (r >= start)
Item *it = dynamic_cast<Item*> (items[j]);
int rank = it->get_column ()->get_rank ();
- if (rank <= end && it->pure_is_visible (start, end))
+ if (rank <= end && it->pure_is_visible (start, end)
+ && !to_boolean (it->get_property ("cross-staff")))
{
Interval dims = items[j]->pure_height (common, start, end);
if (!dims.is_empty ())
for (vsize j = 0; j < spanners.size (); j++)
{
Interval_t<int> rank_span = spanners[j]->spanned_rank_interval ();
- if (rank_span[LEFT] <= end && rank_span[RIGHT] >= start)
+ if (rank_span[LEFT] <= end && rank_span[RIGHT] >= start
+ && !to_boolean (spanners[j]->get_property ("cross-staff")))
{
Interval dims = spanners[j]->pure_height (common, start, end);
if (!dims.is_empty ())
if (rank > end)
break;
- else if (rank >= start && it->pure_is_visible (start, end))
+ else if (rank >= start && it->pure_is_visible (start, end)
+ && !to_boolean (it->get_property ("cross-staff")))
{
Interval dims = it->pure_height (common, start, end);
if (!dims.is_empty ())
for (vsize i = 0; i < spanners.size (); i++)
{
Interval_t<int> rank_span = spanners[i]->spanned_rank_interval ();
- if (rank_span[LEFT] <= end && rank_span[RIGHT] >= start)
+ if (rank_span[LEFT] <= end && rank_span[RIGHT] >= start
+ && !to_boolean (spanners[i]->get_property ("cross-staff")))
{
Interval dims = spanners[i]->pure_height (common, start, end);
if (!dims.is_empty ())
extract_grob_set (me, "elements", elts);
Skyline_pair skylines = skyline_spacing (me, elts);
- /* add a minimum-Y-extent-sized box to the skyline */
- SCM min_y_extent = me->get_property ("minimum-Y-extent");
- if (is_number_pair (min_y_extent))
- {
- Box b (me->extent (me, X_AXIS), ly_scm2interval (min_y_extent));
- skylines.insert (b, 0, X_AXIS);
- }
return skylines.smobbed_copy ();
}
Grob *me = unsmob_grob (smob);
extract_grob_set (me, "elements", elements);
Grob *y_common = common_refpoint_of_array (elements, me, Y_AXIS);
+ Grob *x_common = common_refpoint_of_array (elements, me, X_AXIS);
- assert (y_common == me);
+ if (y_common != me)
+ programming_error ("combining skylines that don't belong to me");
Skyline_pair ret;
for (vsize i = 0; i < elements.size (); i++)
Real offset = elements[i]->relative_coordinate (y_common, Y_AXIS);
Skyline_pair other = *Skyline_pair::unsmob (skyline_scm);
other.raise (offset);
+ other.shift (elements[i]->relative_coordinate (x_common, X_AXIS));
ret.merge (other);
}
}
return ly_interval2scm (r - my_coord);
}
+/* This is like generic_group_extent, but it only counts the grobs that
+ are children of some other axis-group. This is uncached; if it becomes
+ commonly used, it may be necessary to cache it somehow. */
+Interval
+Axis_group_interface::staff_extent (Grob *me, Grob *refp, Axis ext_a, Grob *staff, Axis parent_a)
+{
+ extract_grob_set (me, "elements", elts);
+ vector<Grob*> new_elts;
+
+ for (vsize i = 0; i < elts.size (); i++)
+ if (elts[i]->common_refpoint (staff, parent_a) == staff)
+ new_elts.push_back (elts[i]);
+
+ return relative_group_extent (new_elts, refp, ext_a);
+}
+
Grob *
Axis_group_interface::calc_pure_elts_and_common (Grob *me)
return common;
}
-MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_x_common, 1);
SCM
-Axis_group_interface::calc_x_common (SCM grob)
+Axis_group_interface::calc_common (Grob *me, Axis axis)
{
- Grob *me = unsmob_grob (grob);
-
extract_grob_set (me, "elements", elts);
- Grob *common = common_refpoint_of_array (elts, me, X_AXIS);
+ Grob *common = common_refpoint_of_array (elts, me, axis);
+ if (!common)
+ {
+ me->programming_error ("No common parent found in calc_common axis.");
+ return SCM_EOL;
+ }
+
return common->self_scm ();
}
+
+MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_x_common, 1);
+SCM
+Axis_group_interface::calc_x_common (SCM grob)
+{
+ return calc_common (unsmob_grob (grob), X_AXIS);
+}
+
MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_y_common, 1);
SCM
Axis_group_interface::calc_y_common (SCM grob)
{
- Grob *me = unsmob_grob (grob);
-
- extract_grob_set (me, "elements", elts);
- Grob *common = common_refpoint_of_array (elts, me, Y_AXIS);
- return common->self_scm ();
+ return calc_common (unsmob_grob (grob), Y_AXIS);
}
Interval
positions, one for above the staff, one for below).
In each pass, we loop through the unplaced grobs from left to right.
- If the grob overlaps the right-most affected position, we place it
+ If the grob doesn't overlap the right-most affected position, we place it
(and then update the right-most affected position to point to the right
edge of the just-placed grob). Otherwise, we skip it until the next pass.
*/
}
ADD_INTERFACE (Axis_group_interface,
-
"An object that groups other layout objects.",
/* properties */
"elements "
"keep-fixed-while-stretching "
"max-stretch "
+ "no-alignment "
"pure-Y-common "
"pure-relevant-items "
"pure-relevant-spanners "