From 8d44049552478a76b6ad8e7e1e65a04494dce7ac Mon Sep 17 00:00:00 2001 From: Mike Solomon Date: Mon, 3 Sep 2012 07:10:51 +0200 Subject: [PATCH] Caches all pure minimum translations --- lily/align-interface.cc | 36 ++++++++++++++++++++-------------- scm/define-grob-properties.scm | 4 ++-- scm/define-grobs.scm | 6 ++---- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/lily/align-interface.cc b/lily/align-interface.cc index e32cd11b2b..8a2a8d9b81 100644 --- a/lily/align-interface.cc +++ b/lily/align-interface.cc @@ -185,6 +185,16 @@ Align_interface::internal_get_minimum_translations (Grob *me, if (!pure && a == Y_AXIS && dynamic_cast (me) && !me->get_system ()) me->programming_error ("vertical alignment called before line-breaking"); + // check the cache + if (pure) + { + SCM fv = ly_assoc_get (scm_cons (scm_from_int (start), scm_from_int (end)), + me->get_property ("minimum-translations-alist"), + SCM_EOL); + if (fv != SCM_EOL) + return ly_scm2floatvector (fv); + } + // If include_fixed_spacing is true, we look at things like system-system-spacing // and alignment-distances, which only make sense for the toplevel VerticalAlignment. // If we aren't toplevel, we're working on something like BassFigureAlignment @@ -285,6 +295,15 @@ Align_interface::internal_get_minimum_translations (Grob *me, all_translates.push_back (w); } } + + if (pure) + { + SCM mta = me->get_property ("minimum-translations-alist"); + mta = scm_cons (scm_cons (scm_cons (scm_from_int (start), scm_from_int (end)), + ly_floatvector2scm (all_translates)), + mta); + me->set_property ("minimum-translations-alist", mta); + } return all_translates; } @@ -312,24 +331,11 @@ Align_interface::align_elements_to_minimum_distances (Grob *me, Axis a) all_grobs[j]->translate_axis (translates[j], a); } -MAKE_SCHEME_CALLBACK (Align_interface, full_score_pure_minimum_translations, 1); -SCM -Align_interface::full_score_pure_minimum_translations (SCM smob) -{ - Grob *me = unsmob_grob (smob); - extract_grob_set (me, "elements", all_grobs); - - vector pure_minimum_translations = Align_interface::get_pure_minimum_translations (me, all_grobs, Y_AXIS, 0, INT_MAX); - return ly_floatvector2scm (pure_minimum_translations); -} - Real Align_interface::get_pure_child_y_translation (Grob *me, Grob *ch, int start, int end) { extract_grob_set (me, "elements", all_grobs); - vector translates = start == 0 && end == INT_MAX - ? ly_scm2floatvector (me->get_object ("full-score-pure-minimum-translations")) - : get_pure_minimum_translations (me, all_grobs, Y_AXIS, start, end); + vector translates = get_pure_minimum_translations (me, all_grobs, Y_AXIS, start, end); if (translates.size ()) { @@ -386,8 +392,8 @@ ADD_INTERFACE (Align_interface, /* properties */ "align-dir " "axes " - "full-score-pure-minimum-translations " "elements " + "minimum-translations-alist " "padding " "positioning-done " "stacking-dir " diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index ce260d33cc..82102dd42e 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -1083,8 +1083,6 @@ in addition to notes and stems.") a whole system.") (footnotes-after-line-breaking ,ly:grob-array? "Footnote grobs of a broken system.") - (full-score-pure-minimum-translations ,list? "A list of translations -for a full score's worth of grobs.") (glissando-index ,integer? "The index of a glissando in its note column.") @@ -1109,6 +1107,8 @@ empty in a particular staff, then that staff is erased.") for this column.") (melody-spanner ,ly:grob? "The @code{MelodyItem} object for a stem.") + (minimum-translations-alist ,list? "An list of translations for a given +start and end point.") (neighbors ,ly:grob-array? "The X-axis neighbors of a grob. Used by the pure-from-neighbor-interface to determine various grob heights.") diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index df551b2d6f..5083b5053d 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -284,8 +284,7 @@ (stacking-dir . ,DOWN) (Y-extent . ,ly:axis-group-interface::height) (meta . ((class . Spanner) - (object-callbacks . ((full-score-pure-minimum-translations . ,ly:align-interface::full-score-pure-minimum-translations) - (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common) + (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common) (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs))) (interfaces . (align-interface axis-group-interface @@ -2548,8 +2547,7 @@ (X-extent . ,ly:axis-group-interface::width) (Y-extent . ,ly:axis-group-interface::height) (meta . ((class . Spanner) - (object-callbacks . ((full-score-pure-minimum-translations . ,ly:align-interface::full-score-pure-minimum-translations) - (Y-common . ,ly:axis-group-interface::calc-y-common) + (object-callbacks . ((Y-common . ,ly:axis-group-interface::calc-y-common) (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs) (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common))) (interfaces . (align-interface -- 2.39.5