]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/slur-scoring.cc
Doc: ensure all level 3 and 4 headings have nodes (2967)
[lilypond.git] / lily / slur-scoring.cc
index e137c11f013bd3cc6728102e2f7d22574e170961..47bb40611c483018713bae43ec380b3ed1cd9461 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <queue>
 
+#include "axis-group-interface.hh"
 #include "accidental-interface.hh"
 #include "beam.hh"
 #include "clef.hh"
@@ -426,10 +427,12 @@ Slur_score_state::get_best_curve () const
   return best;
 }
 
-Grob *
-Slur_score_state::breakable_bound_item (Direction d) const
+Interval
+Slur_score_state::breakable_bound_extent (Direction d) const
 {
   Grob *col = slur_->get_bound (d)->get_column ();
+  Interval ret;
+  ret.set_empty ();
 
   extract_grob_set (slur_, "encompass-objects", extra_encompasses);
 
@@ -437,10 +440,10 @@ Slur_score_state::breakable_bound_item (Direction d) const
     {
       Item *item = dynamic_cast<Item *> (extra_encompasses[i]);
       if (item && col == item->get_column ())
-        return item;
+        ret.unite (robust_relative_extent (item, common_[X_AXIS], X_AXIS));
     }
 
-  return 0;
+  return ret;
 }
 
 /*
@@ -456,11 +459,16 @@ Slur_score_state::get_y_attachment_range () const
     {
       if (extremes_[d].note_column_)
         {
-          end_ys[d] = dir_
-                      * max (max (dir_ * (base_attachments_[d][Y_AXIS]
-                                          + parameters_.region_size_ * dir_),
-                                  dir_ * (dir_ + extremes_[d].note_column_->extent (common_[Y_AXIS], Y_AXIS)[dir_])),
-                             dir_ * base_attachments_[-d][Y_AXIS]);
+          Interval nc_extent = extremes_[d].note_column_
+                               ->extent (common_[Y_AXIS], Y_AXIS);
+          if (nc_extent.is_empty ())
+            slur_->warning ("slur trying to encompass an empty note column.");
+          else
+            end_ys[d] = dir_
+                        * max (max (dir_ * (base_attachments_[d][Y_AXIS]
+                                            + parameters_.region_size_ * dir_),
+                                    dir_ * (dir_ + nc_extent[dir_])),
+                               dir_ * base_attachments_[-d][Y_AXIS]);
         }
       else
         end_ys[d] = base_attachments_[d][Y_AXIS] + parameters_.region_size_ * dir_;
@@ -530,14 +538,12 @@ Slur_score_state::get_base_attachments () const
           Real x = 0;
           Real y = 0;
 
-          if (Grob *g = breakable_bound_item (d))
-            {
-              x = robust_relative_extent (g, common_[X_AXIS], X_AXIS)[RIGHT];
-            }
-          else if (d == RIGHT)
-            x = robust_relative_extent (extremes_[d].bound_, common_[X_AXIS], X_AXIS)[d];
-          else
-            x = slur_->get_broken_left_end_align ();
+          Interval ext = breakable_bound_extent (d);
+          if (ext.is_empty ())
+            ext = Axis_group_interface::
+                  generic_bound_extent (extremes_[d].bound_,
+                                        common_[X_AXIS], X_AXIS);
+          x = ext[-d];
 
           Grob *col = (d == LEFT) ? columns_[0] : columns_.back ();