]> git.donarmstrong.com Git - lilypond.git/commitdiff
fix Skyline::distance calculation
authorJoe Neeman <joeneeman@gmail.com>
Sun, 26 Nov 2006 16:45:59 +0000 (18:45 +0200)
committerJoe Neeman <joeneeman@gmail.com>
Sun, 26 Nov 2006 16:45:59 +0000 (18:45 +0200)
fix regressions for Beam and InstrumentName/SystemStartBar

lily/axis-group-interface.cc
lily/beam.cc
lily/instrument-name-engraver.cc
lily/skyline.cc
scm/define-grob-properties.scm
scm/define-grobs.scm

index 2821c38466fef9219c50b998f89a30c8a61d463a..c7a5b8eff90b5c0cd4b45501465987b94ee381b5 100644 (file)
@@ -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 "
               );
index dcbed75ce551b560df303f70dbd7118c014a23ed..0778c5838884749ae4a85bb2e912008c0100511a 100644 (file)
@@ -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);
index 377d66b832e7b9fe829aea2a219f9636495f1c8a..9290ef93e523bf984170e95d43839281d823ec01 100644 (file)
@@ -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;
 }
 
index 4cb07fc65fd9bf6b03adbb43ad9840a01703a731..e52a6277d50adfeeb44b6f9369944f8c4a900909 100644 (file)
@@ -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;
 }
index bd30ea9fb979c8e8d113a73fe8ffc5b5097f6100..38fe501282a58d85ec9f9ffb1667a473af1b988c 100644 (file)
@@ -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
index 3b8dd7abbce2e17335990f1f20801afacf8f6a35..08937eb37f75fc660a43950482d54333e68f6cc3 100644 (file)
        (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))))))
        (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