#include "separation-item.hh"
+#include "axis-group-interface.hh"
#include "lookup.hh"
+#include "note-head.hh"
#include "stencil.hh"
#include "skyline.hh"
#include "paper-column.hh"
Pointer_group_interface::add_grob (me, ly_symbol2scm ("conditional-elements"), e);
}
-void
-Separation_item::set_distance (Drul_array<Item *> items,
- Real padding)
+Real
+Separation_item::set_distance (Item *l, Item *r, Real padding)
{
- Drul_array<Skyline_pair*> lines (Skyline_pair::unsmob (items[LEFT]->get_property ("horizontal-skylines")),
- Skyline_pair::unsmob (items[RIGHT]->get_property ("horizontal-skylines")));
- Skyline right = conditional_skyline (items[RIGHT], items[LEFT]);
+ Drul_array<Skyline_pair*> lines (Skyline_pair::unsmob (l->get_property ("horizontal-skylines")),
+ Skyline_pair::unsmob (r->get_property ("horizontal-skylines")));
+ Skyline right = conditional_skyline (r, l);
right.merge ((*lines[RIGHT])[LEFT]);
Real dist = padding + (*lines[LEFT])[RIGHT].distance (right);
{
Rod rod;
- rod.item_drul_ = items;
+ rod.item_drul_ = Drul_array<Item*> (l, r);
rod.distance_ = dist;
rod.add_to_cols ();
- }
+ }
+
+ return max (dist, 0.0);
}
bool
{
Item *il = dynamic_cast<Item *> (elts[i]);
if (pc != il->get_column ())
- {
- continue;
- }
+ continue;
+
+ /* ugh. We want to exclude groups of grobs (so that we insert each grob
+ individually into the skyline instead of adding a single box that
+ bounds all of them). However, we can't exclude an axis-group that
+ adds to its childrens' stencil. Currently, this is just TrillPitchGroup;
+ hence the check for note-head-interface. */
+ if (Axis_group_interface::has_interface (il)
+ && !Note_head::has_interface (il))
+ continue;
Interval y (il->pure_height (ycommon, 0, very_large));
Interval x (il->extent (pc, X_AXIS));
Interval extra = robust_scm2interval (elts[i]->get_property ("extra-spacing-width"),
- Interval (0, 0));
+ Interval (-0.1, 0.1));
x[LEFT] += extra[LEFT];
x[RIGHT] += extra[RIGHT];
if (to_boolean (elts[i]->get_property ("infinite-spacing-height")))
y = Interval (-infinity_f, infinity_f);
+ if (!x.is_empty () && !y.is_empty ())
out.push_back (Box (x, y));
}
return out;
}
-/*
- Try to find the break-aligned symbol in SEPARATION_ITEM that is
- sticking out at direction D. The x size is put in LAST_EXT
-*/
-Grob *
-Separation_item::extremal_break_aligned_grob (Grob *me,
- Direction d,
- Interval *last_ext)
-{
- Grob *col = dynamic_cast<Item *> (me)->get_column ();
- last_ext->set_empty ();
- Grob *last_grob = 0;
-
- extract_grob_set (me, "elements", elts);
- for (vsize i = elts.size (); i--;)
- {
- Grob *break_item = elts[i];
- if (!scm_is_symbol (break_item->get_property ("break-align-symbol")))
- continue;
-
- if (!scm_is_pair (break_item->get_property ("space-alist")))
- continue;
-
- Interval ext = break_item->extent (col, X_AXIS);
-
- if (ext.is_empty ())
- continue;
-
- if (!last_grob
- || (last_grob && d * (ext[d]- (*last_ext)[d]) > 0))
- {
- *last_ext = ext;
- last_grob = break_item;
- }
- }
-
- return last_grob;
-}
-
extern bool debug_skylines;
MAKE_SCHEME_CALLBACK (Separation_item, print, 1)
SCM