static Interval width (Grob *);
static Interval relative_width (Grob *, Grob *);
static Grob *extremal_break_aligned_grob (Grob *, Direction, Interval *);
- static void set_distance (Item *, Item *, Real);
+ static void set_distance (Drul_array<Item *>, Real);
+ static void set_skyline_distance (Drul_array<Item*>, Real);
static void add_item (Grob *, Item *);
static void add_conditional_item (Grob *, Grob *);
};
void
Separating_line_group_engraver::acknowledge_item (Grob_info i)
{
- Item *it = dynamic_cast<Item *> (i.grob ());
- if (!it)
- return;
+ Item *it = i.item ();
if (it->get_parent (X_AXIS)
- && Axis_group_interface::has_axis (it->get_parent (X_AXIS), X_AXIS))
+ && it->get_parent (X_AXIS) == it->get_parent (Y_AXIS)
+ && Axis_group_interface::has_axis (it->get_parent (X_AXIS), X_AXIS)
+ && Axis_group_interface::has_axis (it->get_parent (Y_AXIS), Y_AXIS))
return;
if (to_boolean (it->get_property ("no-spacing-rods")))
}
void
-Separation_item::set_distance (Item *l, Item *r,
+Separation_item::set_skyline_distance (Drul_array<Item *> items,
+ Real padding)
+{
+ Drul_array<Skyline> lines;
+ Direction d = LEFT;
+
+ do
+ {
+ SCM prop = items[d]->get_property ("skylines");
+ lines[d] =
+ Skyline (ly_scm2offsets (index_get_cell (prop, -d)),
+ 2.0,
+ -d);
+ }
+ while (flip (&d) != LEFT);
+
+ Real dist = padding + lines[LEFT].distance (lines[RIGHT]);
+ if (dist > 0)
+ {
+ Rod rod;
+
+ rod.item_drul_ = items;
+
+ rod.distance_ = dist;
+ rod.add_to_cols ();
+ }
+}
+
+void
+Separation_item::set_distance (Drul_array<Item *> items,
Real padding)
{
- Interval li (Separation_item::width (l));
- Interval ri (Separation_item::conditional_width (r, l));
+#if 0
+ if (0 && !Item::is_non_musical (items[LEFT])
+ && !Item::is_non_musical (items[RIGHT]))
+ {
+ set_skyline_distance (items, padding);
+ return;
+ }
+#endif
+
+ Interval li (Separation_item::width (items[LEFT]));
+ Interval ri (Separation_item::conditional_width (items[RIGHT], items[LEFT]));
if (!li.is_empty () && !ri.is_empty ())
{
Rod rod;
- rod.item_drul_[LEFT] = l;
- rod.item_drul_[RIGHT] = r;
+ rod.item_drul_ = items;
rod.distance_ = li[RIGHT] - ri[LEFT] + padding;
Item *il = dynamic_cast<Item *> (elts[i]);
if (pc != il->get_column ())
{
- /* this shouldn't happen, but let's continue anyway. */
- programming_error ("Separation_item: I've been drinking too much");
- continue; /*UGH UGH*/
+ programming_error ("Separation_item element from wrong column");
+ continue;
}
if (to_boolean (il->get_property ("no-spacing-rods")))
SCM lines = scm_cons (SCM_BOOL_F,SCM_BOOL_F);
Direction d = LEFT;
+ vector<Box> bs = boxes (me);
do
{
- Skyline l (boxes (me), X_AXIS, d);
+ Skyline l (bs, Y_AXIS, d);
index_set_cell (lines, d, ly_offsets2scm (l.to_points ()));
}
while (flip (&d) != LEFT);
if (to_boolean (il->get_property ("no-spacing-rods")))
continue;
- Box b (il->extent (pc, X_AXIS),
- il->pure_height (ycommon, 0, very_large));
+ Interval y (il->pure_height (ycommon, 0, very_large));
+ y.widen (0.01); // fixme
+ Box b (il->extent (pc, X_AXIS), y);
out.push_back (b);
}
"conditional-elements "
"elements"
"padding "
+ "skylines "
);
object.")
(side-axis ,number? "If the value is #X (or equivalently 1), the object is placed horizontally next to the other object. If the value is #Y or 0, it is placed vertically.")
(size ,number? "Size of object, relative to standard size.")
+ (skylines ,pair? "A pair of lists of (x height) pairs.")
(slope ,number? "The slope of this object.")
(slur-padding ,number? "Extra distance between slur and script.")
(space-alist ,list? "A table that specifies distances between