X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Faxis-group-interface.cc;h=cc6ff24fc7d6a30fda4f7764b83cb9695bcface8;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=b589ff671ec52d8e34db78f10ce5196b1fc1866a;hpb=9f5a5b04d31e08ddb6b3bd439fc16b104de43759;p=lilypond.git diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index b589ff671e..cc6ff24fc7 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2007 Han-Wen Nienhuys + (c) 2000--2008 Han-Wen Nienhuys */ #include "axis-group-interface.hh" @@ -18,6 +18,7 @@ #include "paper-column.hh" #include "paper-score.hh" #include "separation-item.hh" +#include "skyline-pair.hh" #include "stencil.hh" #include "system.hh" #include "warn.hh" @@ -97,7 +98,7 @@ Axis_group_interface::cached_pure_height (Grob *me, int start, int end) 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) @@ -263,13 +264,6 @@ Axis_group_interface::calc_skylines (SCM smob) 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 (); } @@ -392,26 +386,33 @@ 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 @@ -566,9 +567,27 @@ add_grobs_of_one_priority (Skyline_pair *const skylines, } } +// TODO: it is tricky to correctly handle skyline placement of cross-staff grobs. +// For example, cross-staff beams cannot be formatted until the distance between +// staves is known and therefore any grobs that depend on the beam cannot be placed +// until the skylines are known. On the other hand, the distance between staves should +// really depend on position of the cross-staff grobs that lie between them. +// Currently, we just leave cross-staff grobs out of the +// skyline altogether, but this could mean that staves are placed so close together +// 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) { + /* For grobs with an outside-staff-priority, the sorting function might + call extent and cause suicide. This breaks the contract that is required + for the STL sort function. To avoid this, we make sure that any suicides + are triggered beforehand. + */ + for (vsize i = 0; i < elements.size (); i++) + if (scm_is_number (elements[i]->get_property ("outside-staff-priority"))) + elements[i]->extent (elements[i], X_AXIS); + vector_sort (elements, staff_priority_less); Grob *x_common = common_refpoint_of_array (elements, me, X_AXIS); Grob *y_common = common_refpoint_of_array (elements, me, Y_AXIS); @@ -581,13 +600,17 @@ Axis_group_interface::skyline_spacing (Grob *me, vector elements) Skyline_pair skylines; for (i = 0; i < elements.size () && !scm_is_number (elements[i]->get_property ("outside-staff-priority")); i++) - add_boxes (elements[i], x_common, y_common, &boxes, &skylines); + if (!to_boolean (elements[i]->get_property ("cross-staff"))) + add_boxes (elements[i], x_common, y_common, &boxes, &skylines); SCM padding_scm = me->get_property ("skyline-horizontal-padding"); Real padding = robust_scm2double (padding_scm, 0.1); skylines.merge (Skyline_pair (boxes, padding, X_AXIS)); for (; i < elements.size (); i++) { + if (to_boolean (elements[i]->get_property ("cross-staff"))) + continue; + SCM priority = elements[i]->get_property ("outside-staff-priority"); vector current_elts; current_elts.push_back (elements[i]); @@ -616,7 +639,6 @@ Axis_group_interface::calc_max_stretch (SCM smob) return scm_from_double (ret); } -extern bool debug_skylines; MAKE_SCHEME_CALLBACK (Axis_group_interface, print, 1) SCM Axis_group_interface::print (SCM smob) @@ -628,14 +650,15 @@ Axis_group_interface::print (SCM smob) Stencil ret; if (Skyline_pair *s = Skyline_pair::unsmob (me->get_property ("vertical-skylines"))) { - ret.add_stencil (Lookup::points_to_line_stencil (0.1, (*s)[UP].to_points (X_AXIS)).in_color (255, 0, 255)); - ret.add_stencil (Lookup::points_to_line_stencil (0.1, (*s)[DOWN].to_points (X_AXIS)).in_color (0, 255, 255)); + ret.add_stencil (Lookup::points_to_line_stencil (0.1, (*s)[UP].to_points (X_AXIS)) + .in_color (255, 0, 255)); + ret.add_stencil (Lookup::points_to_line_stencil (0.1, (*s)[DOWN].to_points (X_AXIS)) + .in_color (0, 255, 255)); } return ret.smobbed_copy (); } ADD_INTERFACE (Axis_group_interface, - "An object that groups other layout objects.", /* properties */