]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/beam-quanting.cc
Merge branch 'lilypond/translation' of ssh://jomand@git.sv.gnu.org/srv/git/lilypond
[lilypond.git] / lily / beam-quanting.cc
index 0338ecd7ecccc6b1caccfa26f0905385790ed06e..06b7c2d80be86fe2f6fb4690709ee720ced8a57c 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
@@ -37,10 +37,6 @@ Beam_quant_parameters::fill (Grob *him)
 {
   SCM details = him->get_property ("details");
 
-  /*
-    TODO: put in define-grobs.scm
-   */
-  INTER_QUANT_PENALTY = get_detail (details, ly_symbol2scm ("inter-quant-penalty"), 1000.0);
   SECONDARY_BEAM_DEMERIT = get_detail (details, ly_symbol2scm ("secondary-beam-demerit"), 10.0);
   STEM_LENGTH_DEMERIT_FACTOR = get_detail (details, ly_symbol2scm ("stem-length-demerit-factor"), 5);
   REGION_SIZE = get_detail (details, ly_symbol2scm ("region-size"), 2);
@@ -113,17 +109,16 @@ Beam::quanting (SCM smob, SCM posns)
   /*
     Calculations are relative to a unit-scaled staff, i.e. the quants are
     divided by the current staff_space.
-
   */
   Real ss = Staff_symbol_referencer::staff_space (me);
-  Real thickness = Beam::get_thickness (me) / ss;
+  Real beam_thickness = Beam::get_beam_thickness (me) / ss;
   Real slt = Staff_symbol_referencer::line_thickness (me) / ss;
 
   Real dy_mus = robust_scm2double (me->get_property ("least-squares-dy"), 0);
   Real straddle = 0.0;
-  Real sit = (thickness - slt) / 2;
+  Real sit = (beam_thickness - slt) / 2;
   Real inter = 0.5;
-  Real hang = 1.0 - (thickness - slt) / 2;
+  Real hang = 1.0 - (beam_thickness - slt) / 2;
   Real quants [] = {straddle, sit, inter, hang };
 
   int num_quants = int (sizeof (quants) / sizeof (Real));
@@ -134,7 +129,6 @@ Beam::quanting (SCM smob, SCM posns)
     going to REGION_SIZE == 2, yields another 0.6 second with
     wtk1-fugue2.
 
-
     (result indexes between 70 and 575)  ? --hwn.
 
   */
@@ -160,10 +154,8 @@ Beam::quanting (SCM smob, SCM posns)
   Real xr = fvs ? lvs->relative_coordinate (common[X_AXIS], X_AXIS) : 0.0;
 
   /*
-    We store some info to quickly interpolate.
-
-    Sometimes my head is screwed on backwards.  The stemlength are
-    AFFINE linear in YL and YR. If YL == YR == 0, then we might have
+    We store some info to quickly interpolate.  The stemlength are
+    affine linear in YL and YR. If YL == YR == 0, then we might have
     stem_y != 0.0, when we're cross staff.
 
   */
@@ -179,17 +171,19 @@ Beam::quanting (SCM smob, SCM posns)
       bool f = to_boolean (s->get_property ("french-beaming"))
        && s != lvs && s != fvs;
 
-      base_lengths.push_back (calc_stem_y (me, s, common, xl, xr,
-                                     Interval (0, 0), f) / ss);
-      stem_xposns.push_back (s->relative_coordinate (common[X_AXIS], X_AXIS));
-    }
+      if (Stem::is_normal_stem (s))
+       {
+         base_lengths.push_back (calc_stem_y (me, s, common, xl, xr, CENTER, 
+                                              Interval (0, 0), f) / ss);
+       }
+      else
+       {
+         base_lengths.push_back (0);
+       }
 
-  bool xstaff = false;
-  if (lvs && fvs)
-    {
-      Grob *commony = fvs->common_refpoint (lvs, Y_AXIS);
-      xstaff = Align_interface::has_interface (commony);
+      stem_xposns.push_back (s->relative_coordinate (common[X_AXIS], X_AXIS));
     }
+  bool xstaff = Align_interface::has_interface (common[Y_AXIS]);
 
   Direction ldir = Direction (stem_infos[0].dir_);
   Direction rdir = Direction (stem_infos.back ().dir_);
@@ -255,7 +249,7 @@ Beam::quanting (SCM smob, SCM posns)
     if (qscores[i].demerits < reasonable_score)
       {
        Real d = score_forbidden_quants (qscores[i].yl, qscores[i].yr,
-                                        rad, slt, thickness, beam_translation,
+                                        rad, slt, beam_thickness, beam_translation,
                                         edge_beam_counts, ldir, rdir, &parameters);
        qscores[i].demerits += d;
 
@@ -348,7 +342,7 @@ Beam::score_stem_lengths (vector<Grob*> const &stems,
   for (vsize i = 0; i < stems.size (); i++)
     {
       Grob *s = stems[i];
-      if (Stem::is_invisible (s))
+      if (!Stem::is_normal_stem (s))
        continue;
 
       Real x = stem_xs[i];
@@ -379,8 +373,7 @@ Beam::score_stem_lengths (vector<Grob*> const &stems,
   Direction d = DOWN;
   do
     score[d] /= max (count[d], 1);
-  while (flip (&d) != DOWN)
-    ;
+  while (flip (&d) != DOWN);
 
   return score[LEFT] + score[RIGHT];
 }
@@ -448,7 +441,7 @@ Real
 Beam::score_forbidden_quants (Real yl, Real yr,
                              Real radius,
                              Real slt,
-                             Real thickness, Real beam_translation,
+                             Real beam_thickness, Real beam_translation,
                              Drul_array<int> beam_counts,
                              Direction ldir, Direction rdir,
 
@@ -476,8 +469,8 @@ Beam::score_forbidden_quants (Real yl, Real yr,
            will be in the gap of the (2, sit) quant, leading to a
            false demerit.
          */
-         Real gap1 = y[d] - stem_dir * ((j - 1) * beam_translation + thickness / 2 - slt / 2.2);
-         Real gap2 = y[d] - stem_dir * (j * beam_translation - thickness / 2 + slt / 2.2);
+         Real gap1 = y[d] - stem_dir * ((j - 1) * beam_translation + beam_thickness / 2 - slt / 2.2);
+         Real gap2 = y[d] - stem_dir * (j * beam_translation - beam_thickness / 2 + slt / 2.2);
 
          Interval gap;
          gap.add_point (gap1);
@@ -505,9 +498,9 @@ Beam::score_forbidden_quants (Real yl, Real yr,
   if (max (beam_counts[LEFT], beam_counts[RIGHT]) >= 2)
     {
       Real straddle = 0.0;
-      Real sit = (thickness - slt) / 2;
+      Real sit = (beam_thickness - slt) / 2;
       Real inter = 0.5;
-      Real hang = 1.0 - (thickness - slt) / 2;
+      Real hang = 1.0 - (beam_thickness - slt) / 2;
 
       Direction d = LEFT;
       do