-
- do {
- x_off[idx(d, true)] = d*0.5;
- } while ((d *= -1) != 1);
-
- do {
- int i1 = idx(d, false);
- int i2 = idx(d,true);
- if (!intersection(y_extent[i1] ,
- y_extent[i2]).empty_b()) {
- if (rest_b_a[i1]) {
- y_off[i1] = -y_extent[i1][-d] + y_extent[1][d] + d*4; // ugh
- y_extent[i1] += y_off[i1];
- }
- }
- } while ((d *= -1) != 1);
-
- do {
- int i1 = idx(d, false);
- int i2 = idx(-d,false);
-
- if (d*(y_extent[i1][-d] - y_extent[i2][d] )< 0&& rest_b_a[i1]) {
- y_off[i1] = -y_extent[i1][-d] + y_extent[i2][d] +d* 4; // ugh
- y_extent[i1] += y_off[i1];
- }
- } while ((d *= -1) != 1);
-
- Interval_t<int> middle( y_extent[0].min(), y_extent[3].max());
- Interval_t<int> open_middle( y_extent[3].max()+1, y_extent[0].min()-1);
- do{
- if (!open_middle.contains_b(y_extent[idx(d,true)]))
- x_off[idx(d, true)] = d *1.0 ;
- } while ((d *= -1) != 1);
-
- if (!middle.empty_b() &&
- middle.length() <= 1 && col_l_a[idx(1,0)] && col_l_a[idx(-1,0)]
- && !rest_b_a[idx(1,0)] && !rest_b_a[idx(-1,0)]) {
-
- Notehead * nu_l= col_l_a[idx(1,0)]->head_l_arr_[idx(1,0)];
- Notehead * nd_l = col_l_a[idx(-1,0)]->head_l_arr_[idx(1,0)];
- if (! (nu_l->balltype == nd_l->balltype && nu_l->dots == nd_l->dots)) {
- x_off[idx(1,0)] -= 0.5;
- x_off[1] -= 0.5;
- x_off[2] += 0.5;
- x_off[idx(-1,0)] += 0.5;
+
+ do
+ {
+ for (int i=0; i < clash_groups[d].size (); i++)
+ tups = gh_cons (gh_cons (clash_groups[d][i]->self_scm (), gh_double2scm (offsets[d][i])),
+ tups);
+ }
+ while (flip (&d) != UP);
+ return tups;
+}
+
+
+SCM
+Collision::forced_shift (Grob *me)
+{
+ SCM tups = SCM_EOL;
+
+ SCM s = me->get_grob_property ("elements");
+ for (; gh_pair_p (s); s = gh_cdr (s))
+ {
+ Grob * se = unsmob_grob (gh_car (s));
+
+ SCM force = se->remove_grob_property ("force-hshift");
+ if (gh_number_p (force))
+ {
+ tups = gh_cons (gh_cons (se->self_scm (), force),
+ tups);