From 32426e733840b1d33afbf023639ca7e21a9f647e Mon Sep 17 00:00:00 2001 From: Joe Neeman Date: Sun, 26 Nov 2006 18:45:59 +0200 Subject: [PATCH] fix Skyline::distance calculation fix regressions for Beam and InstrumentName/SystemStartBar --- lily/axis-group-interface.cc | 7 +++++-- lily/beam.cc | 4 ++++ lily/instrument-name-engraver.cc | 19 +++++++++---------- lily/skyline.cc | 9 +++++---- scm/define-grob-properties.scm | 3 +++ scm/define-grobs.scm | 2 ++ 6 files changed, 28 insertions(+), 16 deletions(-) diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index 2821c38466..c7a5b8eff9 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -184,7 +184,7 @@ SCM Axis_group_interface::generic_group_extent (Grob *me, Axis a) { extract_grob_set (me, "elements", elts); - if (a == Y_AXIS) + if (a == Y_AXIS && to_boolean (me->get_property ("skyline-spacing"))) skyline_spacing (me, elts); Grob *common = common_refpoint_of_array (elts, me, a); @@ -281,11 +281,13 @@ Axis_group_interface::skyline_spacing (Grob *me, vector elements) vsize i = 0; vector boxes; + for (i = 0; i < elements.size () - && !scm_is_number (elements[i]->get_property ("outside-staff-priority")); i++) + && !scm_is_number (elements[i]->get_property ("outside-staff-priority")); i++) boxes.push_back (Box (elements[i]->extent (x_common, X_AXIS), elements[i]->extent (y_common, Y_AXIS))); + Drul_array skylines (Skyline (boxes, X_AXIS, DOWN), Skyline (boxes, X_AXIS, UP)); for (; i < elements.size (); i++) @@ -322,5 +324,6 @@ ADD_INTERFACE (Axis_group_interface, "axis-group-interface", "elements " "common-refpoint-of-elements " "pure-relevant-elements " + "skyline-spacing " "cached-pure-extents " ); diff --git a/lily/beam.cc b/lily/beam.cc index dcbed75ce5..0778c58388 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -296,6 +296,10 @@ typedef map > Position_stem_segments_map; vector Beam::get_beam_segments (Grob *me_grob, Grob **common) { + /* ugh, this has a side-effect that we need to ensure that + Stem #'beaming is correct */ + (void) me_grob->get_property ("quantized-positions"); + Spanner *me = dynamic_cast (me_grob); extract_grob_set (me, "stems", stems); diff --git a/lily/instrument-name-engraver.cc b/lily/instrument-name-engraver.cc index 377d66b832..9290ef93e5 100644 --- a/lily/instrument-name-engraver.cc +++ b/lily/instrument-name-engraver.cc @@ -91,6 +91,15 @@ Instrument_name_engraver::start_spanner () text_spanner_->set_bound (LEFT, col); text_spanner_->set_property ("text", short_text_); text_spanner_->set_property ("long-text", long_text_); + + /* + UGH, should handle this in Score_engraver. + */ + Grob *system = unsmob_grob (get_property ("rootSystem")); + if (system) + Axis_group_interface::add_element (system, text_spanner_); + else + text_spanner_->programming_error ("can't find root system"); } @@ -130,16 +139,6 @@ Instrument_name_engraver::stop_spanner () Pointer_group_interface::set_ordered (text_spanner_, ly_symbol2scm ("elements"), false); - System *system = get_root_system (text_spanner_); - - /* - UGH, should handle this in Score_engraver. - */ - if (system) - Axis_group_interface::add_element (system, text_spanner_); - else - text_spanner_->programming_error ("can't find root system"); - text_spanner_ = 0; } diff --git a/lily/skyline.cc b/lily/skyline.cc index 4cb07fc65f..e52a6277d5 100644 --- a/lily/skyline.cc +++ b/lily/skyline.cc @@ -300,14 +300,15 @@ Skyline::distance (Skyline const &other) const list::const_iterator j = other.buildings_.begin (); Real dist = -infinity_f; - for (; i != buildings_.end () && j != other.buildings_.end (); i++) + while (i != buildings_.end () && j != other.buildings_.end ()) { - while (j->iv_[RIGHT] < i->iv_[LEFT]) - j++; - Interval iv = intersection (i->iv_, j->iv_); dist = max (dist, max (i->height (iv[LEFT]) + j->height (iv[LEFT]), i->height (iv[RIGHT]) + j->height (iv[RIGHT]))); + if (i->iv_[RIGHT] <= j->iv_[RIGHT]) + i++; + else + j++; } return dist; } diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index bd30ea9fb9..38fe501282 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -553,6 +553,9 @@ than a whole rest.") (spaceable-staves ,ly:grob-array? "Objects to be spaced during page layout.") (skyline-distance ,number? "The distance between this staff and the next one, as determined by a skyline algorithm.") + (skyline-spacing ,boolean? "When true, this axis-group will vertically space its children +using a skyline algorithm.") + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ancient notation diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 3b8dd7abbc..08937eb37f 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -1641,6 +1641,7 @@ (axes . (0 1)) (X-extent . ,ly:axis-group-interface::width) (Y-extent . ,ly:axis-group-interface::height) + (skyline-spacing . #t) (meta . ((class . System) (interfaces . (system-interface axis-group-interface)))))) @@ -1964,6 +1965,7 @@ (Y-offset . ,ly:hara-kiri-group-spanner::force-hara-kiri-callback) (Y-extent . ,ly:hara-kiri-group-spanner::y-extent) (X-extent . ,ly:axis-group-interface::width) + (skyline-spacing . #t) (meta . ((class . Spanner) (interfaces . (axis-group-interface hara-kiri-group-interface -- 2.39.2