]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/note-spacing.cc
Fix some bugs in the dynamic engraver and PostScript backend
[lilypond.git] / lily / note-spacing.cc
index 8f55664c331711cc79ad1bbdf2a15cf043563f5d..8586cc5f4cd209d6dd508117795eb587d61600d3 100644 (file)
@@ -3,11 +3,12 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2005  Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 2001--2006  Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "note-spacing.hh"
 
+#include "directional-element-interface.hh"
 #include "grob-array.hh"
 #include "paper-column.hh"
 #include "moment.hh"
@@ -38,8 +39,8 @@ Note_spacing::get_spacing (Grob *me, Item *right_col,
   Interval left_head_wid;
   do
     {
-      Link_array<Grob> const &items (ly_scm2link_array (props [d]));
-      for (int i = items.size (); i--;)
+      vector<Grob*> const &items (ly_scm2link_array (props [d]));
+      for (vsize i = items.size (); i--;)
        {
          Item *it = dynamic_cast<Item *> (items[i]);
 
@@ -75,7 +76,12 @@ Note_spacing::get_spacing (Grob *me, Item *right_col,
                first note head will be.
              */
              if (g)
-               left_head_wid = g->extent (it_col, X_AXIS);
+               {
+                 if (g->common_refpoint (it_col, X_AXIS) != it_col)
+                   programming_error ("Note_spacing::get_spacing(): Common refpoint incorrect");
+                 else
+                   left_head_wid = g->extent (it_col, X_AXIS);
+               }
            }
 
          extents[d].unite (it->extent (it_col, X_AXIS));
@@ -105,6 +111,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
@@ -134,7 +141,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
@@ -151,8 +158,7 @@ Note_spacing::get_spacing (Grob *me, Item *right_col,
     we drop it.
    */
   if (!extents[RIGHT].is_empty ()
-      && (Item::is_breakable (right_col)
-         || right_col->original_))
+      && (Paper_column::is_breakable (right_col)))
     {
       /*
        This is for the situation
@@ -198,7 +204,7 @@ Note_spacing::right_column (Grob *me)
   Item *mincol = 0;
   int min_rank = INT_MAX;
   bool prune = false;
-  for (int i = 0; a && i < a->size (); i++)
+  for (vsize i = 0; a && i < a->size (); i++)
     {
       Item *ri = a->item (i);
       Item *col = ri->get_column ();
@@ -217,11 +223,11 @@ Note_spacing::right_column (Grob *me)
 
   if (prune && a)
     {
-      Link_array<Grob> &right = a->array_reference ();
-      for (int i = right.size (); i--;)
+      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);
        }
     }
 
@@ -263,8 +269,8 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn,
 
   do
     {
-      Link_array<Grob> const &items (ly_scm2link_array (props [d]));
-      for (int i = 0; i < items.size (); i++)
+      vector<Grob*> const &items (ly_scm2link_array (props [d]));
+      for (vsize i = 0; i < items.size (); i++)
        {
          Item *it = dynamic_cast<Item *> (items[i]);
 
@@ -300,7 +306,7 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn,
          stems_drul[d] = stem;
          beams_drul[d] = Stem::get_beam (stem);
 
-         Direction sd = Stem::get_direction (stem);
+         Direction sd = get_grob_direction (stem);
          if (stem_dirs[d] && stem_dirs[d] != sd)
            {
              correct_stem_dirs = false;