From 9115b5f48f2f52110585d575af777f75e86ce64c Mon Sep 17 00:00:00 2001
From: Joe Neeman <joeneeman@gmail.com>
Date: Sun, 26 Nov 2006 18:45:59 +0200
Subject: [PATCH] fix Skyline::distance calculation fix regressions for Beam
 and InstrumentName/SystemStartBar (cherry picked from
 69863917056892b87691140e28cb197089c9dc4c commit)

---
 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<Grob*> elements)
 
   vsize i = 0;
   vector<Box> 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<Skyline> 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<int, vector<Beam_stem_segment> >  Position_stem_segments_map;
 vector<Beam_segment>
 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<Spanner*> (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<Building>::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 bd5dee7706..5e2dd4d86c 100644
--- a/scm/define-grobs.scm
+++ b/scm/define-grobs.scm
@@ -1643,6 +1643,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))))))
@@ -1967,6 +1968,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.5