]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/beam-quanting.cc
Divide collision Y extent by staff_space; add regression test.
[lilypond.git] / lily / beam-quanting.cc
index 4445305db8da19941c427bc9d82216dbfa16515e..c5cafd5cfa9acb63e93723eaa7aa76347b06cc8a 100644 (file)
@@ -31,6 +31,7 @@ using namespace std;
 #include "directional-element-interface.hh"
 #include "grob.hh"
 #include "international.hh"
+#include "libc-extension.hh"
 #include "main.hh"
 #include "output-def.hh"
 #include "pointer-group-interface.hh"
@@ -175,6 +176,8 @@ void Beam_scoring_problem::add_collision (Real x, Interval y,
   c.beam_y_.widen (0.5 * beam_thickness);
   
   c.x_ = x;
+
+  y *= 1/staff_space;
   c.y_ = y;
   c.base_penalty_ = score_factor;
   collisions_.push_back (c);
@@ -446,6 +449,12 @@ Beam_scoring_problem::solve () const {
   vector<Beam_configuration*> configs;
   generate_quants (&configs);
 
+  if (configs.empty ())
+    {
+      programming_error ("No viable beam quanting found.  Using unquanted y value.");
+      return unquanted_y;
+    }
+
   Beam_configuration *best = NULL;  
 
   bool debug =
@@ -629,10 +638,11 @@ my_modf (Real x)
 void
 Beam_scoring_problem::score_horizontal_inter_quants (Beam_configuration *config) const
 {
-  if (config->y.delta() == 0.0 && abs (config->y[LEFT]) < staff_radius * staff_space)
+  if (config->y.delta () == 0.0
+      && abs (config->y[LEFT]) < staff_radius * staff_space)
     {
       Real yshift = config->y[LEFT] - 0.5 * staff_space;
-      if (abs ((int)(yshift + 0.5) - yshift) < 0.01 * staff_space)
+      if (fabs (my_round (yshift) - yshift) < 0.01 * staff_space)
         config->add (parameters.HORIZONTAL_INTER_QUANT_PENALTY, "H");
     }
 }