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);
};
#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"
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"
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;
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);
}