]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/spacing-interface.cc
Imported Upstream version 2.14.2
[lilypond.git] / lily / spacing-interface.cc
index 93bd1c2cfaf0549de703ef1892748916729b818e..f9d3287cb0cf45f1b20846332a7adb59be29e02f 100644 (file)
@@ -1,10 +1,20 @@
 /*
-  spacing-interface.cc -- functionality that is shared between Note_spacing
-  and Staff_spacing
+  This file is part of LilyPond, the GNU music typesetter.
 
-  source file of the GNU LilyPond music typesetter
+  Copyright (C) 2007--2011 Joe Neeman <joeneeman@gmail.com>
 
-  (c) 2007 Joe Neeman <joeneeman@gmail.com>
+  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 "spacing-interface.hh"
@@ -17,6 +27,8 @@
 #include "paper-column.hh"
 #include "separation-item.hh"
 #include "skyline.hh"
+#include "skyline-pair.hh"
+#include "system.hh"
 
 /* return the right-pointing skyline of the left-items and the left-pointing
    skyline of the right-items (with the skyline of the left-items in
@@ -38,29 +50,41 @@ Spacing_interface::skylines (Grob *me, Grob *right_col)
   Drul_array<vector<Grob*> > items (ly_scm2link_array (orig->get_object ("left-items")),
                                    ly_scm2link_array (orig->get_object ("right-items")));
 
+  Grob *system = me->get_system ();
+  Grob *left_col = dynamic_cast<Item*> (me)->get_column ();
+
+  Drul_array<Grob*> columns (left_col, right_col);
+
   Direction d = LEFT;
   do
     {
-      skylines[d].set_minimum_height (0.0);
-
       for (vsize i = 0; i < items[d].size (); i++)
        {
-         Grob *g = items[d][i];
-         if (Item *it = dynamic_cast<Item*> (g))
-           if (Grob *piece = it->find_prebroken_piece (break_dirs[d]))
+         Item *g = dynamic_cast<Item*> (items[d][i]);
+         if (g)
+           if (Item *piece = g->find_prebroken_piece (break_dirs[d]))
              g = piece;
 
-         if (Separation_item::has_interface (g))
+         if (g && Separation_item::has_interface (g) && g->get_column () == columns[d])
            {
              SCM sky_scm = g->get_property ("horizontal-skylines");
              Skyline_pair *sky = Skyline_pair::unsmob (sky_scm);
+
+             extract_grob_set (g, "elements", elts);
+             Grob *ycommon = common_refpoint_of_array (elts, g, Y_AXIS);
+             Real shift = ycommon->pure_relative_y_coordinate (system, 0, INT_MAX);
+
+             skylines[d].shift (-shift);
+
              if (sky)
                skylines[d].merge ((*sky)[-d]);
              else
                programming_error ("separation item has no skyline");
-           
+
              if (d == RIGHT && items[LEFT].size ())
                skylines[d].merge (Separation_item::conditional_skyline (items[d][i], items[LEFT][0]));
+
+             skylines[d].shift (shift);
            }
        }
     }
@@ -78,11 +102,7 @@ Spacing_interface::minimum_distance (Grob *me, Grob *right)
 }
 
 /*
-  Compute the column of the right-items.  This is a big function,
-  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.
+  Compute the left-most column of the right-items.
 */
 Item *
 Spacing_interface::right_column (Grob *me)
@@ -93,7 +113,6 @@ Spacing_interface::right_column (Grob *me)
   Grob_array *a = unsmob_grob_array (me->get_object ("right-items"));
   Item *mincol = 0;
   int min_rank = INT_MAX;
-  bool prune = false;
   for (vsize i = 0; a && i < a->size (); i++)
     {
       Item *ri = a->item (i);
@@ -104,23 +123,10 @@ Spacing_interface::right_column (Grob *me)
       if (rank < min_rank)
        {
          min_rank = rank;
-         if (mincol)
-           prune = true;
-
          mincol = col;
        }
     }
 
-  if (prune && a)
-    {
-      vector<Grob*> &right = a->array_reference ();
-      for (vsize i = right.size (); i--;)
-       {
-         if (dynamic_cast<Item *> (right[i])->get_column () != mincol)
-           right.erase (right.begin () + i);
-       }
-    }
-
   return mincol;
 }
 
@@ -215,8 +221,10 @@ Spacing_interface::extremal_break_aligned_grob (Grob *me,
 
 
 ADD_INTERFACE (Spacing_interface,
-              "This object calculates the desired and minimum distances between two columns.",
+              "This object calculates the desired and minimum distances"
+              " between two columns.",
 
+              /* properties */
               "left-items "
               "right-items "
               );