From: Joe Neeman Date: Sun, 27 Jun 2010 20:44:45 +0000 (+0300) Subject: Fix 1062. X-Git-Tag: release/2.13.27-1~52 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=d2ad2a1a19ce018d741466a108caf2f87bf147fc;p=lilypond.git Fix 1062. Add RehearsalMarks, etc. to system skylines (this time with proper caching). --- diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index 578549a3d4..18994f19fd 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -170,6 +170,12 @@ 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; @@ -178,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); @@ -203,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); + } } } diff --git a/lily/include/system.hh b/lily/include/system.hh index b8fa6644d4..ee9f82f1e0 100644 --- a/lily/include/system.hh +++ b/lily/include/system.hh @@ -48,6 +48,10 @@ public: SCM get_paper_systems (); SCM get_broken_system_grobs (); + DECLARE_SCHEME_CALLBACK (calc_pure_relevant_grobs, (SCM)); + DECLARE_SCHEME_CALLBACK (height, (SCM)); + DECLARE_SCHEME_CALLBACK (calc_pure_height, (SCM, SCM, SCM)); + System (SCM); System (System const &); diff --git a/lily/system.cc b/lily/system.cc index e440bed35e..628603fa84 100644 --- a/lily/system.cc +++ b/lily/system.cc @@ -585,7 +585,7 @@ System::part_of_line_pure_height (vsize start, vsize end, bool begin) Interval ret; for (vsize i = 0; i < staves.size(); ++i) { - Interval iv = begin? + Interval iv = begin ? Axis_group_interface::begin_of_line_pure_height (staves[i], start) : Axis_group_interface::rest_of_line_pure_height (staves[i], start, end); if (i relevant_grobs; + SCM pure_relevant_p = ly_lily_module_constant ("pure-relevant?"); + + for (vsize i = 0; i < elts.size (); ++i) + { + if (!Axis_group_interface::has_interface (elts[i]) + && to_boolean (scm_apply_1 (pure_relevant_p, elts[i]->self_scm (), SCM_EOL))) + relevant_grobs.push_back (elts[i]); + } + + SCM grobs_scm = Grob_array::make_array (); + + unsmob_grob_array (grobs_scm)->set_array (relevant_grobs); + return grobs_scm; +} + +MAKE_SCHEME_CALLBACK (System, height, 1); +SCM +System::height (SCM smob) +{ + return Axis_group_interface::height (smob); +} + +MAKE_SCHEME_CALLBACK (System, calc_pure_height, 3); +SCM +System::calc_pure_height (SCM smob, SCM start_scm, SCM end_scm) +{ + System *me = dynamic_cast (unsmob_grob (smob)); + int start = scm_to_int (start_scm); + int end = scm_to_int (end_scm); + + Interval begin = me->begin_of_line_pure_height (start, end); + Interval rest = me->rest_of_line_pure_height (start, end); + begin.unite (rest); + + return ly_interval2scm (begin); +} + ADD_INTERFACE (System, "This is the top-level object: Each object in a score" " ultimately has a @code{System} object as its X and" diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 8ae81d7f65..3f3bcc6410 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -1885,9 +1885,9 @@ (axes . (,X ,Y)) (vertical-skylines . ,ly:axis-group-interface::calc-skylines) (X-extent . ,ly:axis-group-interface::width) - (Y-extent . ,ly:axis-group-interface::height) + (Y-extent . ,ly:system::height) (meta . ((class . System) - (object-callbacks . ((pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs) + (object-callbacks . ((pure-relevant-grobs . ,ly:system::calc-pure-relevant-grobs) (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items) (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners) (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common))) @@ -2478,7 +2478,8 @@ (,ly:side-position-interface::y-aligned-side . ,ly:side-position-interface::pure-y-aligned-side) (,ly:slur::height . ,ly:slur::pure-height) (,ly:slur::outside-slur-callback . ,ly:slur::pure-outside-slur-callback) - (,ly:stem::height . ,ly:stem::pure-height))) + (,ly:stem::height . ,ly:stem::pure-height) + (,ly:system::height . ,ly:system::calc-pure-height))) (define pure-functions (list