]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/slur-scoring.cc
(grob-cause): Bugfix.
[lilypond.git] / lily / slur-scoring.cc
index 9539ced5c614011b417d10c9cda43ec04c0ec773..160e157089c104be4c3450d01b3f2370bdaa8162 100644 (file)
@@ -32,8 +32,6 @@
 
   - curve around flag for y coordinate
 
-  - this file is a mess, clean it up
-
   - short-cut: try a smaller region first.
 
   - handle non-visible stems better.
@@ -184,7 +182,7 @@ Slur_score_state::get_encompass_info (Grob *col) const
 
   if (!stem)
     {
-      programming_error ("No stem for note column?");
+      programming_error ("no stem for note column");
       ei.x_ = col->relative_coordinate (common_[X_AXIS], X_AXIS);
       ei.head_ = ei.stem_ = col->extent (common_[Y_AXIS],
                                         Y_AXIS)[dir_];
@@ -224,7 +222,6 @@ Slur_score_state::get_encompass_info (Grob *col) const
   return ei;
 }
 
-
 Drul_array<Bound_info>
 Slur_score_state::get_bound_info () const
 {
@@ -241,8 +238,20 @@ Slur_score_state::get_bound_info () const
          extremes[d].note_column_ = extremes[d].bound_;
          extremes[d].stem_ = Note_column::get_stem (extremes[d].note_column_);
          extremes[d].stem_dir_ = get_grob_direction (extremes[d].stem_);
-         extremes[d].stem_extent_[X_AXIS]
-           = extremes[d].stem_->extent (common_[X_AXIS], X_AXIS);
+
+         for (int a = X_AXIS; a < NO_AXES; a++)
+           {
+             Axis ax = Axis (a);
+             Interval s = extremes[d].stem_->extent (common_[ax], ax);
+             if (s.is_empty ())
+               {
+                 programming_error ("Stem has no extent in Slur_score_state");
+                 s = Interval (0,0)
+                   + extremes[d].stem_->relative_coordinate (common_[ax], ax);
+               }
+             extremes[d].stem_extent_[ax] = s; 
+           }
+         
          extremes[d].stem_extent_[Y_AXIS]
            = extremes[d].stem_->extent (common_[Y_AXIS], Y_AXIS);
          extremes[d].slur_head_
@@ -264,6 +273,7 @@ Slur_score_state::get_bound_info () const
        }
     }
   while (flip (&d) != LEFT);
+
   return extremes;
 }
 
@@ -440,7 +450,7 @@ Slur_score_state::get_closest_index (SCM inspect_quants) const
        }
     }
   if (mindist > 1e5)
-    programming_error ("Could not find quant.");
+    programming_error ("can't not find quant");
   return opt_idx;
 }
 
@@ -459,7 +469,7 @@ Slur_score_state::get_y_attachment_range () const
       if (extremes_[d].note_column_)
        {
          end_ys[d] = dir_
-           * ((dir_ * (base_attachments_[d][Y_AXIS] + parameters_.region_size_* dir_))
+           * ((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]));
@@ -507,6 +517,7 @@ Slur_score_state::get_base_attachments () const
            fixme: X coord should also be set in this case.
          */
          if (stem
+             && !Stem::is_invisible (stem)
              && extremes_[d].stem_dir_ == dir_
              && Stem::get_beaming (stem, -d)
              && (!spanner_less (slur_, Stem::get_beam (stem))
@@ -525,7 +536,6 @@ Slur_score_state::get_base_attachments () const
            .linear_combination (CENTER);
        }
       base_attachment[d] = Offset (x, y);
-
     }
   while (flip (&d) != LEFT);
 
@@ -564,6 +574,24 @@ Slur_score_state::get_base_attachments () const
     }
   while (flip (&d) != LEFT);
 
+
+  do
+    {
+      for (int a = X_AXIS; a < NO_AXES; a++)
+       {
+         Real &b = base_attachment[d][Axis (a)];
+
+         if (isinf (b) || isnan (b))
+           {
+             programming_error ("slur attachment is inf/nan");
+             b = 0.0;
+           }
+           
+       }
+    }
+  while (flip (&d) != LEFT);
+  
+  
   return base_attachment;
 }
 
@@ -588,16 +616,14 @@ void
 Slur_score_state::generate_curves () const
 {
   Real r_0 = robust_scm2double (slur_->get_property ("ratio"), 0.33);
-  Real h_inf = staff_space_ *scm_to_double (slur_->get_property ("height-limit"));
+  Real h_inf = staff_space_ * scm_to_double (slur_->get_property ("height-limit"));
   for (int i = 0; i < configurations_.size (); i++)
     configurations_[i]->generate_curve (*this, r_0, h_inf);
 }
 
-
 Link_array<Slur_configuration>
 Slur_score_state::enumerate_attachments (Drul_array<Real> end_ys) const
 {
-  /*ugh.   */
   Link_array<Slur_configuration> scores;
 
   Drul_array<Offset> os;
@@ -703,7 +729,7 @@ Slur_score_state::get_extra_encompass_infos () const
 
          for (int k = 0; k < 3; k++)
            {
-             Direction hdir = Direction (k /2 - 1);
+             Direction hdir = Direction (k / 2 - 1);
 
              /*
                Only take bound into account if small slur starts
@@ -720,7 +746,7 @@ Slur_score_state::get_extra_encompass_infos () const
              yext[dir_] = z[Y_AXIS] + dir_ * thickness_ * 1.0;
 
              Interval xext (-1, 1);
-             xext = xext * (thickness_*2) + z[X_AXIS];
+             xext = xext * (thickness_ * 2) + z[X_AXIS];
              Extra_collision_info info (small_slur,
                                         k - 1.0,
                                         xext,