#include "stem.hh"
#include "warn.hh"
-using std::vector;
-
Real
check_meshing_chords (Grob *me,
Grob *clash_up, Grob *clash_down)
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 ())
// check if we cross the opposite-stemmed voices
if (d * extents[d][i][-d] < d * extent_union[-d][d])
- offset = std::max (offset, 0.5);
+ offset = max (offset, 0.5);
if (extents[-d].size ()
&& extents[d][i][UP] > extents[-d][0][DOWN]
&& extents[d][i][DOWN] < extents[-d][0][UP])
- offset = std::max (offset, 1.0);
+ offset = max (offset, 1.0);
}
offsets[d].push_back (d * offset);
}
out.insert (out.end (), nhp.begin (), nhp.end ());
}
- vector_sort (out, std::less<int> ());
+ vector_sort (out, less<int> ());
return out;
}
/* properties */
"merge-differently-dotted "
"merge-differently-headed "
+ "note-collision-threshold "
"positioning-done "
"prefer-dotted-right "
);