X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Faxis-group-interface.cc;h=f4b652c6e2affb7e5bc0b7befa3e5a480dc97bae;hb=b950bfac562447bf1870db4bfcbaa9ecbd3e1c0e;hp=2eb061f83409ba73e1b4f4c87665ba471deae376;hpb=e18531db1f79fb685fbd16d6a2a67bf4b6c09915;p=lilypond.git diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index 2eb061f834..f4b652c6e2 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -153,7 +153,7 @@ Axis_group_interface::adjacent_pure_heights (SCM smob) { Grob *me = unsmob_grob (smob); - Grob *common = calc_pure_elts_and_common (me); + Grob *common = unsmob_grob (me->get_object ("pure-Y-common")); extract_grob_set (me, "pure-relevant-items", items); extract_grob_set (me, "pure-relevant-spanners", spanners); @@ -169,6 +169,13 @@ Axis_group_interface::adjacent_pure_heights (SCM smob) { int start = Paper_column::get_rank (cols[breaks[i]]); int end = Paper_column::get_rank (cols[breaks[i+1]]); + + // Take grobs that are visible with respect to a slightly longer line. + // Otherwise, we will never include grobs at breakpoints which aren't + // end-of-line-visible. + int visibility_end = i + 2 < breaks.size () ? + Paper_column::get_rank (cols[breaks[i+2]]) : end; + Interval begin_line_iv; Interval mid_line_iv; @@ -177,7 +184,7 @@ Axis_group_interface::adjacent_pure_heights (SCM smob) Item *it = dynamic_cast (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, visibility_end) && !to_boolean (it->get_property ("cross-staff"))) { Interval dims = items[j]->pure_height (common, start, end); @@ -202,7 +209,11 @@ Axis_group_interface::adjacent_pure_heights (SCM smob) Interval dims = spanners[j]->pure_height (common, start, end); if (!dims.is_empty ()) - mid_line_iv.unite (dims); + { + mid_line_iv.unite (dims); + if (rank_span[LEFT] <= start) + begin_line_iv.unite (dims); + } } } @@ -228,7 +239,7 @@ Axis_group_interface::relative_pure_height (Grob *me, int start, int end) if (p && Align_interface::has_interface (p)) return Axis_group_interface::cached_pure_height (me, start, end); - Grob *common = calc_pure_elts_and_common (me); + Grob *common = unsmob_grob (me->get_object ("pure-Y-common")); extract_grob_set (me, "pure-relevant-items", items); extract_grob_set (me, "pure-relevant-spanners", spanners); @@ -380,56 +391,94 @@ Axis_group_interface::staff_extent (Grob *me, Grob *refp, Axis ext_a, Grob *staf } -Grob * -Axis_group_interface::calc_pure_elts_and_common (Grob *me) +MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_pure_relevant_grobs, 1); +SCM +Axis_group_interface::calc_pure_relevant_grobs (SCM smob) { - if (Grob *c = unsmob_grob (me->get_object ("pure-Y-common"))) - return c; + Grob *me = unsmob_grob (smob); extract_grob_set (me, "elements", elts); - vector relevant_items; - vector relevant_spanners; + 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 (dynamic_cast (elts[i])) - relevant_items.push_back (elts[i]); - else if (dynamic_cast (elts[i])) - relevant_spanners.push_back (elts[i]); + Direction d = LEFT; + do + { + 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); + } + while (flip (&d) != LEFT); } - - - 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 (pure_relevant_p, piece->self_scm (), SCM_EOL))) - relevant_items.push_back (piece); - } - while (flip (&d) != LEFT); } - vector_sort (relevant_items, Item::less); - Grob *common = common_refpoint_of_array (relevant_items, me, Y_AXIS); - common = common_refpoint_of_array (relevant_spanners, common, Y_AXIS); + SCM grobs_scm = Grob_array::make_array (); + unsmob_grob_array (grobs_scm)->set_array (relevant_grobs); - me->set_object ("pure-Y-common", common->self_scm ()); - - SCM items_scm = Grob_array::make_array (); - SCM spanners_scm = Grob_array::make_array (); + return grobs_scm; +} +MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_pure_relevant_items, 1); +SCM +Axis_group_interface::calc_pure_relevant_items (SCM smob) +{ + Grob *me = unsmob_grob (smob); + + extract_grob_set (me, "pure-relevant-grobs", elts); + + vector relevant_items; + for (vsize i = 0; i < elts.size (); i++) + if (Item *it = dynamic_cast (elts[i])) + relevant_items.push_back (it); + + vector_sort (relevant_items, Item::less); + + SCM items_scm = Grob_array::make_array (); unsmob_grob_array (items_scm)->set_array (relevant_items); + return items_scm; +} + +MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_pure_relevant_spanners, 1); +SCM +Axis_group_interface::calc_pure_relevant_spanners (SCM smob) +{ + Grob *me = unsmob_grob (smob); + + extract_grob_set (me, "pure-relevant-grobs", elts); + + vector relevant_spanners; + for (vsize i = 0; i < elts.size (); i++) + if (dynamic_cast (elts[i])) + relevant_spanners.push_back (elts[i]); + + SCM spanners_scm = Grob_array::make_array (); unsmob_grob_array (spanners_scm)->set_array (relevant_spanners); - me->set_object ("pure-relevant-items", items_scm); - me->set_object ("pure-relevant-spanners", spanners_scm); + return spanners_scm; +} + +MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_pure_y_common, 1); +SCM +Axis_group_interface::calc_pure_y_common (SCM smob) +{ + Grob *me = unsmob_grob (smob); + + extract_grob_set (me, "pure-relevant-grobs", elts); + Grob *common = common_refpoint_of_array (elts, me, Y_AXIS); + if (!common) + { + me->programming_error ("No common parent found in calc_pure_y_common."); + return SCM_EOL; + } - return common; + return common->self_scm (); } SCM @@ -442,7 +491,7 @@ Axis_group_interface::calc_common (Grob *me, Axis axis) me->programming_error ("No common parent found in calc_common axis."); return SCM_EOL; } - + return common->self_scm (); } @@ -464,8 +513,13 @@ Axis_group_interface::calc_y_common (SCM grob) Interval Axis_group_interface::pure_group_height (Grob *me, int start, int end) { - Grob *common = calc_pure_elts_and_common (me); - + Grob *common = unsmob_grob (me->get_object ("pure-Y-common")); + + if (!common) + { + programming_error ("no pure Y common refpoint"); + return Interval (); + } Real my_coord = me->relative_coordinate (common, Y_AXIS); Interval r (relative_pure_height (me, start, end)); @@ -693,22 +747,40 @@ Axis_group_interface::print (SCM smob) return ret.smobbed_copy (); } +MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_pure_next_staff_spacing, 3) +SCM +Axis_group_interface::calc_pure_next_staff_spacing (SCM smob, SCM start, SCM end) +{ + return calc_maybe_pure_next_staff_spacing (unsmob_grob (smob), + true, + scm_to_int (start), + scm_to_int (end)); +} + MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_next_staff_spacing, 1) SCM Axis_group_interface::calc_next_staff_spacing (SCM smob) { - Grob *me = unsmob_grob (smob); + return calc_maybe_pure_next_staff_spacing (unsmob_grob (smob), + false, + 0, + INT_MAX); +} + +SCM +Axis_group_interface::calc_maybe_pure_next_staff_spacing (Grob *me, bool pure, int start, int end) +{ Grob *grouper = unsmob_grob (me->get_object ("staff-grouper")); if (grouper) { - Grob *last_in_group = Staff_grouper_interface::get_last_grob (grouper); + Grob *last_in_group = Staff_grouper_interface::get_maybe_pure_last_grob (grouper, pure, start, end); if (me == last_in_group) - return grouper->get_property ("after-last-staff-spacing"); + return grouper->get_maybe_pure_property ("after-last-staff-spacing", pure, start, end); else - return grouper->get_property ("between-staff-spacing"); + return grouper->get_maybe_pure_property ("between-staff-spacing", pure, start, end); } - return me->get_property ("default-next-staff-spacing"); + return me->get_maybe_pure_property ("default-next-staff-spacing", pure, start, end); } Real @@ -738,12 +810,12 @@ ADD_INTERFACE (Axis_group_interface, "elements " "inter-loose-line-spacing " "inter-staff-spacing " - "keep-fixed-while-stretching " "max-stretch " "non-affinity-spacing " "next-staff-spacing " "no-alignment " "pure-Y-common " + "pure-relevant-grobs " "pure-relevant-items " "pure-relevant-spanners " "staff-affinity "