]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/staff-spacing.cc
Lilypond-book: Implement MusicXML support in lilypond-book
[lilypond.git] / lily / staff-spacing.cc
index 72b997514c9738e23613aaf7f88a1380bd1ecc70..58cfa4125ba1fec2e19e4c760737af24f86aaf8d 100644 (file)
@@ -1,9 +1,20 @@
 /*
-  staff-spacing.cc -- implement Staff_spacing
+  This file is part of LilyPond, the GNU music typesetter.
 
-  source file of the GNU LilyPond music typesetter
+  Copyright (C) 2001--2011  Han-Wen Nienhuys <hanwen@xs4all.nl>
 
-  (c) 2001--2007  Han-Wen Nienhuys <hanwen@xs4all.nl>
+  LilyPond is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  LilyPond is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "staff-spacing.hh"
@@ -44,24 +55,24 @@ Staff_spacing::optical_correction (Grob *me, Grob *g, Interval bar_height)
     {
       Direction d = get_grob_direction (stem);
       if (Stem::is_normal_stem (stem) && d == DOWN)
-       {
-
-         /*
-           can't look at stem-end-position, since that triggers
-           beam slope computations.
-         */
-         Real stem_start = Stem::head_positions (stem) [d];
-         Real stem_end = stem_start + 
-           d * robust_scm2double (stem->get_property ("length"), 7);
-         
-         Interval stem_posns (min (stem_start, stem_end),
-                              max (stem_end, stem_start));
-
-         stem_posns.intersect (bar_height);
-
-         ret = min (abs (stem_posns.length () / 7.0), 1.0);
-         ret *= robust_scm2double (me->get_property ("stem-spacing-correction"), 1);
-       }
+        {
+
+          /*
+            can't look at stem-end-position, since that triggers
+            beam slope computations.
+          */
+          Real stem_start = Stem::head_positions (stem) [d];
+          Real stem_end = stem_start
+                          + d * robust_scm2double (stem->get_property ("length"), 7);
+
+          Interval stem_posns (min (stem_start, stem_end),
+                               max (stem_end, stem_start));
+
+          stem_posns.intersect (bar_height);
+
+          ret = min (abs (stem_posns.length () / 7.0), 1.0);
+          ret *= robust_scm2double (me->get_property ("stem-spacing-correction"), 1);
+        }
     }
   return ret;
 }
@@ -81,23 +92,23 @@ Staff_spacing::bar_y_positions (Grob *bar_grob)
 
       string glyph_string = scm_is_string (glyph) ? ly_scm2string (glyph) : "";
       if (glyph_string.substr (0, 1) == "|"
-         || glyph_string.substr (0, 1) == ".")
-       {
-         Grob *common = bar_grob->common_refpoint (staff_sym, Y_AXIS);
-         bar_size = bar_grob->extent (common, Y_AXIS);
-         bar_size *= 1.0 / Staff_symbol_referencer::staff_space (bar_grob);
-       }
+          || glyph_string.substr (0, 1) == ".")
+        {
+          Grob *common = bar_grob->common_refpoint (staff_sym, Y_AXIS);
+          bar_size = bar_grob->extent (common, Y_AXIS);
+          bar_size *= 1.0 / Staff_symbol_referencer::staff_space (bar_grob);
+        }
     }
   return bar_size;
 }
 
 Real
 Staff_spacing::next_notes_correction (Grob *me,
-                                     Grob *last_grob)
+                                      Grob *last_grob)
 {
   Interval bar_size = bar_y_positions (last_grob);
   Grob *orig = me->original () ? me->original () : me;
-  vector<Item*> note_columns = Spacing_interface::right_note_columns (orig);
+  vector<Item *> note_columns = Spacing_interface::right_note_columns (orig);
 
   Real max_optical = 0.0;
 
@@ -108,7 +119,7 @@ Staff_spacing::next_notes_correction (Grob *me,
 }
 
 /* We calculate three things here: the ideal distance, the minimum distance
-   (which is the distance at which collisions will occure) and the "fixed"
+   (which is the distance at which collisions will occur) and the "fixed"
    distance, which is the distance at which things start to look really bad.
    We arrange things so that the fixed distance will be attained when the
    line is compressed with a force of 1.0 */
@@ -121,26 +132,26 @@ Staff_spacing::get_spacing (Grob *me, Grob *right_col)
   Interval last_ext;
   Direction break_dir = me_item->break_status_dir ();
   Grob *last_grob = Spacing_interface::extremal_break_aligned_grob (me, LEFT,
-                                                                   break_dir,
-                                                                   &last_ext);
+                    break_dir,
+                    &last_ext);
   if (!last_grob)
     {
       /*
-       TODO:
+        TODO:
 
-       Should  insert a adjustable space here? For excercises, you might want to
-       use a staff without a clef in the beginning.
+        Should  insert a adjustable space here? For excercises, you might want to
+        use a staff without a clef in the beginning.
       */
 
       /*
-       we used to have a warning here, but it generates a lot of
-       spurious error messages.
+        we used to have a warning here, but it generates a lot of
+        spurious error messages.
       */
       return Spring ();
     }
 
   SCM alist = last_grob->get_property ("space-alist");
-  if (!scm_list_p (alist))
+  if (!ly_is_list (alist))
     return Spring ();
 
   SCM space_def = scm_sloppy_assq (ly_symbol2scm ("first-note"), alist);
@@ -148,7 +159,7 @@ Staff_spacing::get_spacing (Grob *me, Grob *right_col)
     {
       SCM nndef = scm_sloppy_assq (ly_symbol2scm ("next-note"), alist);
       if (scm_is_pair (nndef))
-       space_def = nndef;
+        space_def = nndef;
     }
 
   if (!scm_is_pair (space_def))
@@ -184,7 +195,6 @@ Staff_spacing::get_spacing (Grob *me, Grob *right_col)
       ideal = fixed;
     }
 
-
   Real optical_correction = next_notes_correction (me, last_grob);
   Real min_dist = Paper_column::minimum_distance (left_col, right_col);
 
@@ -196,15 +206,15 @@ Staff_spacing::get_spacing (Grob *me, Grob *right_col)
   ideal += correction;
 
   Spring ret (ideal, min_dist);
-  ret.set_inverse_stretch_strength (ideal - fixed);
+  ret.set_inverse_stretch_strength (max (0.0, ideal - fixed));
   return ret;
 }
 
 ADD_INTERFACE (Staff_spacing,
-              "This object calculates spacing details from a "
-              " breakable symbol (left) to another object. For example, it takes care "
-              " of  optical spacing from  a bar lines to a note.",
+               "This object calculates spacing details from a breakable"
+               " symbol (left) to another object.  For example, it takes care"
+               " of optical spacing from a bar line to a note.",
 
-              /* properties */
-              "stem-spacing-correction "
-              );
+               /* properties */
+               "stem-spacing-correction "
+              );