]> git.donarmstrong.com Git - lilypond.git/commitdiff
Merge branch 'master' of ssh://jneem@git.sv.gnu.org/srv/git/lilypond
authorJoe Neeman <joeneeman@gmail.com>
Thu, 11 Dec 2008 20:45:33 +0000 (12:45 -0800)
committerJoe Neeman <joeneeman@gmail.com>
Thu, 11 Dec 2008 20:45:33 +0000 (12:45 -0800)
lily/include/paper-column.hh
lily/paper-column.cc
lily/separation-item.cc
lily/spacing-spanner.cc

index 314f52ec8f578e3d44842774f3611bdb13139a3a..cc2e2b90f1f530fe7ae14e077077d1381380c145 100644 (file)
@@ -48,6 +48,7 @@ public:
   static Moment when_mom (Grob *);
   static bool is_used (Grob *);
   static bool is_breakable (Grob *);
+  static bool is_extraneous_column_from_ligature (Grob *);
   static Real minimum_distance (Grob *l, Grob *r);
   static Interval break_align_width (Grob *me);
 };
index b30c7de32fec89688d4e0d5e2b0893bca07bc73c..c6b7c9c85c1aec0f9f5f9957937bd2b785f6b495 100644 (file)
@@ -18,6 +18,7 @@
 #include "output-def.hh"
 #include "paper-score.hh"
 #include "pointer-group-interface.hh"
+#include "rhythmic-head.hh"
 #include "separation-item.hh"
 #include "skyline-pair.hh"
 #include "spaceable-grob.hh"
@@ -313,6 +314,33 @@ Paper_column::before_line_breaking (SCM grob)
   return SCM_UNSPECIFIED;
 }
 
+/* FIXME: This is a hack that we use to identify columns that used to
+   contain note-heads but whose note-heads were moved by one of the ligature
+   engravers. Once the ligature engravers are fixed to behave nicely, this
+   function can be removed.
+*/
+bool
+Paper_column::is_extraneous_column_from_ligature (Grob *me)
+{
+  if (!is_musical (me))
+    return false;
+
+  // If all the note-heads that I think are my children actually belong
+  // to another column, then I am extraneous.
+  extract_grob_set (me, "elements", elts);
+  bool has_notehead = false;
+  for (vsize i = 0; i < elts.size (); i++)
+    {
+      if (Rhythmic_head::has_interface (elts[i]))
+       {
+         has_notehead = true;
+         if (dynamic_cast<Item*> (elts[i])->get_column () == me)
+           return false;
+       }
+    }
+  return has_notehead;
+}
+
 
 ADD_INTERFACE (Paper_column,
               "@code{Paper_column} objects form the top-most X@tie{}parents"
index 2483bac0d67a6bbbd07ffdbde5b3e10a78b308f0..4a9eec3ea6291915d455a046a39792fccf69d0b0 100644 (file)
@@ -146,7 +146,7 @@ Separation_item::boxes (Grob *me, Grob *left)
       y[UP] += extra_height[UP];
  
       if (!x.is_empty () && !y.is_empty ())
-      out.push_back (Box (x, y));
+       out.push_back (Box (x, y));
     }
 
   return out;      
index 4a6d0b05156dd602f7bcefde0261f539f00ad0aa..be0cd01a450883c1d3bb3dbe6e6a3226f8780c49 100644 (file)
@@ -405,8 +405,20 @@ Spacing_spanner::musical_column_spacing (Grob *me,
        Note that we don't actually pack things as tightly as possible:
        we don't allow the next column to begin before this one ends.
       */
-      spring.set_distance (max (left_col->extent (left_col, X_AXIS)[RIGHT],
-                               spring.min_distance ()));
+      /* FIXME: the else clause below is the "right" thing to do,
+        but we can't do it because of all the empty columns that the
+        ligature-engravers leave lying around. In that case, the extent of
+        the column is incorrect because it includes note-heads that aren't
+        there. We get around this by only including the column extent if
+        the left-hand column is "genuine". This is a dirty hack and it
+        should be fixed in the ligature-engravers. --jneem
+      */
+      if (Paper_column::is_extraneous_column_from_ligature (left_col))
+       spring.set_distance (spring.min_distance ());
+      else
+       spring.set_distance (max (left_col->extent (left_col, X_AXIS)[RIGHT],
+                                 spring.min_distance ()));
+
       spring.set_inverse_stretch_strength (1.0);
     }