X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Faxis-group-interface.cc;h=0b399fd2482e5fa8ef9da603a416471dd9281ac8;hb=a811a3c91c05f33474c1d447bedaa1e089522532;hp=35ad189c13106673ee3e424a4509eb4a1ea22496;hpb=283734747d7f0f1d74be35617e69851b665d4858;p=lilypond.git diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index 35ad189c13..0b399fd248 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2000--2010 Han-Wen Nienhuys + Copyright (C) 2000--2011 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -90,7 +90,7 @@ Axis_group_interface::relative_group_extent (vector const &elts, } Interval -Axis_group_interface::cached_pure_height (Grob *me, int start, int end) +Axis_group_interface::sum_partial_pure_heights (Grob *me, int start, int end) { Interval iv = begin_of_line_pure_height (me, start); iv.unite (rest_of_line_pure_height (me, start, end)); @@ -99,27 +99,47 @@ Axis_group_interface::cached_pure_height (Grob *me, int start, int end) } Interval -Axis_group_interface::rest_of_line_pure_height (Grob *me, int start, int end) +Axis_group_interface::part_of_line_pure_height (Grob *me, bool begin, int start, int end) { + Spanner *sp = dynamic_cast (me); + SCM cache_symbol = begin + ? ly_symbol2scm ("begin-of-line-pure-height") + : ly_symbol2scm ("rest-of-line-pure-height"); + SCM cached = sp->get_cached_pure_property (cache_symbol, start, end); + if (scm_is_pair (cached)) + return robust_scm2interval (cached, Interval (0, 0)); + SCM adjacent_pure_heights = me->get_property ("adjacent-pure-heights"); + Interval ret; + + if (!scm_is_pair (adjacent_pure_heights)) + ret = Interval (0, 0); + else + { + SCM these_pure_heights = begin + ? scm_car (adjacent_pure_heights) + : scm_cdr (adjacent_pure_heights); - if (!scm_is_pair (adjacent_pure_heights) - || !scm_is_vector (scm_cdr (adjacent_pure_heights))) - return Interval (0, 0); + if (scm_is_vector (these_pure_heights)) + ret = combine_pure_heights (me, these_pure_heights, start, end); + else + ret = Interval (0, 0); + } - return combine_pure_heights (me, scm_cdr (adjacent_pure_heights), start, end); + sp->cache_pure_property (cache_symbol, start, end, ly_interval2scm (ret)); + return ret; } Interval Axis_group_interface::begin_of_line_pure_height (Grob *me, int start) { - SCM adjacent_pure_heights = me->get_property ("adjacent-pure-heights"); - - if (!scm_is_pair (adjacent_pure_heights) - || !scm_is_vector (scm_car (adjacent_pure_heights))) - return Interval (0, 0); + return part_of_line_pure_height (me, true, start, start + 1); +} - return combine_pure_heights (me, scm_car (adjacent_pure_heights), start, start+1); +Interval +Axis_group_interface::rest_of_line_pure_height (Grob *me, int start, int end) +{ + return part_of_line_pure_height (me, false, start, end); } Interval @@ -260,7 +280,7 @@ Axis_group_interface::relative_pure_height (Grob *me, int start, int end) we can assume additivity and cache things nicely. */ Grob *p = me->get_parent (Y_AXIS); if (p && Align_interface::has_interface (p)) - return Axis_group_interface::cached_pure_height (me, start, end); + return Axis_group_interface::sum_partial_pure_heights (me, start, end); Grob *common = unsmob_grob (me->get_object ("pure-Y-common")); extract_grob_set (me, "pure-relevant-grobs", elts); @@ -753,11 +773,11 @@ Axis_group_interface::calc_maybe_pure_staff_staff_spacing (Grob *me, bool pure, if (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_maybe_pure_property ("staffgroup-staff-spacing", pure, start, end); - else + bool within_group = Staff_grouper_interface::maybe_pure_within_group (grouper, me, pure, start, end); + if (within_group) return grouper->get_maybe_pure_property ("staff-staff-spacing", pure, start, end); + else + return grouper->get_maybe_pure_property ("staffgroup-staff-spacing", pure, start, end); } return me->get_maybe_pure_property ("default-staff-staff-spacing", pure, start, end); }