]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/note-spacing.cc
cleanups in Note_spacing
[lilypond.git] / lily / note-spacing.cc
index 8206b3b4e92ce77f96ca5e5c3a5c11b4671c321d..ed18b919138782d6fea80806fcb6c5f8ed7547b2 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2006  Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2001--2007  Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "note-spacing.hh"
@@ -39,7 +39,7 @@ Note_spacing::get_spacing (Grob *me, Item *right_col,
   Interval left_head_wid;
   do
     {
-      Link_array<Grob> const &items (ly_scm2link_array (props [d]));
+      vector<Grob*> const &items (ly_scm2link_array (props [d]));
       for (vsize i = items.size (); i--;)
        {
          Item *it = dynamic_cast<Item *> (items[i]);
@@ -64,7 +64,8 @@ Note_spacing::get_spacing (Grob *me, Item *right_col,
              continue;
            }
 
-         if (d == LEFT)
+         if (d == LEFT
+             && Note_column::has_interface (it))
            {
              SCM r = it->get_object ("rest");
              Grob *g = unsmob_grob (r);
@@ -78,7 +79,7 @@ Note_spacing::get_spacing (Grob *me, Item *right_col,
              if (g)
                {
                  if (g->common_refpoint (it_col, X_AXIS) != it_col)
-                   programming_error ("Note_spacing::get_spacing(): Common refpoint incorrect");
+                   programming_error ("Note_spacing::get_spacing (): Common refpoint incorrect");
                  else
                    left_head_wid = g->extent (it_col, X_AXIS);
                }
@@ -111,6 +112,7 @@ Note_spacing::get_spacing (Grob *me, Item *right_col,
 
   /*
     We look at the width of the note head, since smaller heads get less space
+
     eg. a quarter rest gets almost 0.5 ss less horizontal space than a note.
 
     What is sticking out of the note head (eg. a flag), doesn't get
@@ -140,7 +142,7 @@ Note_spacing::get_spacing (Grob *me, Item *right_col,
          /*
            Add that which sticks out a lot.
          */
-         + max (0.0, -extents[RIGHT][LEFT] - (base_space - increment))));
+         + max (0.0, -extents[RIGHT][LEFT] - (base_space - 0.5 * increment))));
 
   /*
     We don't do complicated stuff: (base_space - increment) is the
@@ -150,31 +152,6 @@ Note_spacing::get_spacing (Grob *me, Item *right_col,
   */
   *space = (base_space - increment) + *fixed;
 
-#if 0
-  /*
-    The below situation is now handled by the "sticks out a lot" case
-    above. However we keep around the code for a few releases before
-    we drop it.
-   */
-  if (!extents[RIGHT].is_empty ()
-      && (Item::is_breakable (right_col)
-         || right_col->original ()))
-    {
-      /*
-       This is for the situation
-
-       rest | 3/4 (eol)
-
-       Since we only take half of the right-object space above, the
-       barline will bump into the notes preceding it, if the right
-       thing is big. We add the rest of the extents here:
-      */
-
-      *space += -extents[RIGHT][LEFT] / 2;
-      *fixed += -extents[RIGHT][LEFT] / 2;
-    }
-#endif
-  
   stem_dir_correction (me, right_col, increment, space, fixed);
 }
 
@@ -189,8 +166,8 @@ Note_spacing::left_column (Grob *me)
 
 /*
   Compute the column of the right-items.  This is a big function,
-  since RIGHT-ITEMS may span more columns (eg. if a clef if inserted,
-  this will add a new columns to RIGHT-ITEMS. Here we look at the
+  since RIGHT-ITEMS may span more columns (eg. if a clef is inserted,
+  this will add a new column to RIGHT-ITEMS. Here we look at the
   columns, and return the left-most. If there are multiple columns, we
   prune RIGHT-ITEMS.
 */
@@ -223,17 +200,14 @@ Note_spacing::right_column (Grob *me)
 
   if (prune && a)
     {
-      Link_array<Grob> &right = a->array_reference ();
+      vector<Grob*> &right = a->array_reference ();
       for (vsize i = right.size (); i--;)
        {
          if (dynamic_cast<Item *> (right[i])->get_column () != mincol)
-           right.del (i);
+           right.erase (right.begin () + i);
        }
     }
 
-  if (!mincol)
-    return 0;
-
   return mincol;
 }
 
@@ -269,7 +243,7 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn,
 
   do
     {
-      Link_array<Grob> const &items (ly_scm2link_array (props [d]));
+      vector<Grob*> const &items (ly_scm2link_array (props [d]));
       for (vsize i = 0; i < items.size (); i++)
        {
          Item *it = dynamic_cast<Item *> (items[i]);
@@ -306,13 +280,13 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn,
          stems_drul[d] = stem;
          beams_drul[d] = Stem::get_beam (stem);
 
-         Direction sd = get_grob_direction (stem);
-         if (stem_dirs[d] && stem_dirs[d] != sd)
+         Direction stem_dir = get_grob_direction (stem);
+         if (stem_dirs[d] && stem_dirs[d] != stem_dir)
            {
              correct_stem_dirs = false;
              continue;
            }
-         stem_dirs[d] = sd;
+         stem_dirs[d] = stem_dir;
 
          /*
            Correction doesn't seem appropriate  when there is a large flag
@@ -323,12 +297,20 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn,
            correct_stem_dirs = false;
 
          Interval hp = Stem::head_positions (stem);
-         if (!hp.is_empty ())
+         if (correct_stem_dirs
+             && !hp.is_empty ())
            {
-             Real chord_start = hp[sd];
-             Real stem_end = Stem::stem_end_position (stem);
+             Real chord_start = hp[stem_dir];
+
+             /*
+               can't look at stem-end-position, since that triggers
+               beam slope computations.
+             */
+             Real stem_end = hp[stem_dir] +
+               stem_dir * robust_scm2double (stem->get_property ("length"), 7);
 
-             stem_posns[d] = Interval (min (chord_start, stem_end), max (chord_start, stem_end));
+             stem_posns[d] = Interval (min (chord_start, stem_end),
+                                       max (chord_start, stem_end));
              head_posns[d].unite (hp);
            }
        }
@@ -347,6 +329,7 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn,
     {
       stem_dirs[RIGHT] = -stem_dirs[LEFT];
       stem_posns[RIGHT] = bar_yextent;
+      stem_posns[RIGHT] *= 2;
     }
 
   if (correct_stem_dirs && stem_dirs[LEFT] * stem_dirs[RIGHT] == -1)
@@ -447,7 +430,15 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn,
   */
 }
 
-ADD_INTERFACE (Note_spacing, "note-spacing-interface",
+ADD_INTERFACE (Note_spacing,
               "This object calculates spacing wishes for individual voices.",
-              "left-items right-items stem-spacing-correction same-direction-correction knee-spacing-correction");
+
+              
+              "knee-spacing-correction "
+              "left-items "
+              "right-items "
+              "same-direction-correction "
+              "stem-spacing-correction "
+
+              );