vector<int> ups = Stem::note_head_positions (stems[UP]);
vector<int> dps = Stem::note_head_positions (stems[DOWN]);
+ int threshold = robust_scm2int (me->get_property ("note-collision-threshold"), 1);
+
/* Too far apart to collide. */
- if (ups[0] > dps.back () + 1)
+ if (ups[0] > dps.back () + threshold)
return 0.0;
/* If the chords just 'touch' their extreme noteheads,
*/
bool touch = false;
if (ups[0] >= dps.back ()
- && (dps.size () < 2 || ups[0] >= dps[dps.size () - 2] + 2)
- && (ups.size () < 2 || ups[1] >= dps.back () + 2))
+ && (dps.size () < 2 || ups[0] >= dps[dps.size () - 2] + threshold + 1)
+ && (ups.size () < 2 || ups[1] >= dps.back () + threshold + 1))
touch = true;
/* Filter out the 'o's in this configuration, since they're no
for (vsize i = 0, j = 0; i < ups.size () && j < dps.size ();)
{
- if (abs (ups[i] - dps[j]) == 1)
+ if (ups[i] == dps[j])
+ full_collide = true;
+ else if (abs (ups[i] - dps[j]) <= threshold)
{
merge_possible = false;
if (ups[i] > dps[j])
else
distant_half_collide = true;
}
- else if (ups[i] == dps[j])
- full_collide = true;
else if (ups[i] > dps[0] && ups[i] < dps.back ())
merge_possible = false;
else if (dps[j] > ups[0] && dps[j] < ups.back ())
SCM up_style = head_up->get_property ("style");
SCM down_style = head_down->get_property ("style");
if (merge_possible
- && (up_style == ly_symbol2scm ("fa") || up_style == ly_symbol2scm ("faThin"))
- && (down_style == ly_symbol2scm ("fa") || down_style == ly_symbol2scm ("faThin")))
+ && (scm_is_eq (up_style, ly_symbol2scm ("fa"))
+ || scm_is_eq (up_style, ly_symbol2scm ("faThin")))
+ && (scm_is_eq (down_style, ly_symbol2scm ("fa"))
+ || scm_is_eq (down_style, ly_symbol2scm ("faThin"))))
{
Offset att = Offset (0.0, -1.0);
head_up->set_property ("stem-attachment", ly_offset2scm (att));
if (dot_wipe_head)
{
- if (Grob *d = Grob::unsmob (dot_wipe_head->get_object ("dot")))
+ if (Grob *d = unsmob<Grob> (dot_wipe_head->get_object ("dot")))
d->suicide ();
}
if (shift_amount < -1e-6
&& Rhythmic_head::dot_count (head_up))
{
- Grob *d = Grob::unsmob (head_up->get_object ("dot"));
+ Grob *d = unsmob<Grob> (head_up->get_object ("dot"));
Grob *parent = d->get_parent (X_AXIS);
- if (Dot_column::has_interface (parent))
+ if (has_interface<Dot_column> (parent))
Side_position_interface::add_support (parent, head_down);
}
else if (Rhythmic_head::dot_count (head_down))
{
- Grob *d = Grob::unsmob (head_down->get_object ("dot"));
+ Grob *d = unsmob<Grob> (head_down->get_object ("dot"));
Grob *parent = d->get_parent (X_AXIS);
- if (Dot_column::has_interface (parent))
+ if (has_interface<Dot_column> (parent))
{
- Grob *stem = Grob::unsmob (head_up->get_object ("stem"));
+ Grob *stem = unsmob<Grob> (head_up->get_object ("stem"));
// Loop over all heads on an up-pointing-stem to see if dots
// need to clear any heads suspended on its right side.
extract_grob_set (stem, "note-heads", heads);
if (shift_amount > 1e-6
&& Rhythmic_head::dot_count (head_down))
{
- Grob *dot_down = Grob::unsmob (head_down->get_object ("dot"));
+ Grob *dot_down = unsmob<Grob> (head_down->get_object ("dot"));
Grob *col_down = dot_down->get_parent (X_AXIS);
Direction dir = UP;
if (Rhythmic_head::dot_count (head_up))
{
- Grob *dot_up = Grob::unsmob (head_up->get_object ("dot"));
+ Grob *dot_up = unsmob<Grob> (head_up->get_object ("dot"));
Grob *col_up = dot_up->get_parent (X_AXIS);
if (col_up == col_down) // let the common DotColumn arrange dots
dir = CENTER;
}
if (dir != CENTER)
{
- Grob *stem = Grob::unsmob (head_down->get_object ("stem"));
+ Grob *stem = unsmob<Grob> (head_down->get_object ("stem"));
extract_grob_set (stem, "note-heads", heads);
for (vsize i = 0; i < heads.size (); i++)
- if (Grob *dot = Grob::unsmob (heads[i]->get_object ("dot")))
+ if (Grob *dot = unsmob<Grob> (heads[i]->get_object ("dot")))
dot->set_property ("direction", scm_from_int (dir));
}
}
SCM
Note_collision_interface::calc_positioning_done (SCM smob)
{
- Grob *me = Grob::unsmob (smob);
+ Grob *me = unsmob<Grob> (smob);
me->set_property ("positioning-done", SCM_BOOL_T);
Drul_array<vector<Grob *> > clash_groups = get_clash_groups (me);
}
vector<Grob *> done;
- Real left_most = 1e6;
+ Real left_most = 0.0;
vector<Real> amounts;
for (; scm_is_pair (hand); hand = scm_cdr (hand))
{
- Grob *s = Grob::unsmob (scm_caar (hand));
+ Grob *s = unsmob<Grob> (scm_caar (hand));
Real amount = scm_to_double (scm_cdar (hand)) * wid;
done.push_back (s);
amounts.push_back (amount);
- if (amount < left_most)
- left_most = amount;
}
for (; scm_is_pair (autos); autos = scm_cdr (autos))
{
- Grob *s = Grob::unsmob (scm_caar (autos));
+ Grob *s = unsmob<Grob> (scm_caar (autos));
Real amount = scm_to_double (scm_cdar (autos)) * wid;
vsize x = find (done, s) - done.begin ();
for (vsize i = 0; i < elements.size (); i++)
{
Grob *se = elements[i];
- if (Note_column::has_interface (se))
+ if (has_interface<Note_column> (se))
{
if (!Note_column::dir (se))
se->programming_error ("note-column has no direction");
vector<int> out;
extract_grob_set (me, "elements", elts);
for (vsize i = 0; i < elts.size (); i++)
- if (Grob *stem = Grob::unsmob (elts[i]->get_object ("stem")))
+ if (Grob *stem = unsmob<Grob> (elts[i]->get_object ("stem")))
{
vector<int> nhp = Stem::note_head_positions (stem);
out.insert (out.end (), nhp.begin (), nhp.end ());
/* properties */
"merge-differently-dotted "
"merge-differently-headed "
+ "note-collision-threshold "
"positioning-done "
"prefer-dotted-right "
);