+ for (int i = 0; i < 3; i++)
+ {
+ Real height_f = curve_extent (Y_AXIS).length ();
+ Real width_f = curve_extent (X_AXIS).length ();
+
+ dy_f = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
+ if (!fix_broken_b)
+ dy_f -= interstaff_f;
+
+ Real height_ratio_f = abs (height_f / width_f);
+ if (height_ratio_f > height_damp_f)
+ {
+ Direction d = (Direction)(- my_dir * (sign (dy_f)));
+ if (!d)
+ d = LEFT;
+ /* take third step */
+ Real damp_f = (height_ratio_f - height_damp_f) * width_f / 3;
+ /*
+ if y positions at about the same height, correct both ends
+ */
+ if (abs (dy_f / dx_f ) < slope_damp_f)
+ {
+ dy_f_drul_[-d] += my_dir * damp_f;
+ dy_f_drul_[d] += my_dir * damp_f;
+ }
+ /*
+ don't change slope too much, would have been catched by slope damping
+ */
+ else
+ {
+ damp_f = damp_f <? abs (dy_f/2);
+ dy_f_drul_[d] += my_dir * damp_f;
+ }
+ }
+ }
+
+ /*
+ If, after correcting, we're close to stem-end...
+ */
+ Drul_array<Real> snapy_f_drul;
+ snapy_f_drul[LEFT] = snapy_f_drul[RIGHT] = 0;
+ Drul_array<Real> snapx_f_drul;
+ snapx_f_drul[LEFT] = snapx_f_drul[RIGHT] = 0;
+ Drul_array<bool> snapped_b_drul;
+ snapped_b_drul[LEFT] = snapped_b_drul[RIGHT] = false;
+ do
+ {
+ Note_column * nc = note_column_drul[d];
+ if (nc == spanned_drul_[d]
+ && nc->stem_l ()
+ && nc->stem_l ()->get_direction () == my_dir
+ && abs (nc->stem_l ()->extent (Y_AXIS)[my_dir]
+ - dy_f_drul_[d] + (d == LEFT ? 0 : interstaff_f))
+ <= snap_f)
+ {
+ /*
+ prepare to attach to stem-end
+ */
+ snapx_f_drul[d] = nc->stem_l ()->hpos_f ()
+ - spanned_drul_[d]->relative_coordinate (0, X_AXIS);
+
+ snapy_f_drul[d] = nc->stem_l ()->extent (Y_AXIS)[my_dir]
+ + interstaff_interval[d]
+ + my_dir * 2 * y_gap_f;
+
+ snapped_b_drul[d] = true;
+ }
+ }
+ while (flip (&d) != LEFT);
+
+ /*
+ only use snapped positions if sign (dy) will not change
+ and dy doesn't change too much
+ */
+ if (!fix_broken_b)
+ dy_f += interstaff_f;
+
+
+ /*
+ (sigh)
+
+ More refactoring could be done.
+ */
+ Real maxsnap = abs (dy_f * snap_max_dy_f);
+ if (snapped_b_drul[LEFT] && snapped_b_drul[RIGHT]
+ && ((sign (snapy_f_drul[RIGHT] - snapy_f_drul[LEFT]) == sign (dy_f)))
+ && (!dy_f || (abs (snapy_f_drul[RIGHT] - snapy_f_drul[LEFT] - dy_f)
+ < maxsnap)))
+ {
+ dy_f_drul_ = snapy_f_drul;
+ dx_f_drul_ = snapx_f_drul;
+ }
+ else
+ do
+ {
+ Direction od = (Direction)-d;
+ if (snapped_b_drul[d]
+ && d * sign (snapy_f_drul[d] - dy_f_drul_[od]) == sign (dy_f)
+ && (!dy_f || (abs (snapy_f_drul[d] - dy_f_drul_[od] - d * dy_f)
+ < maxsnap)))
+ {
+ dy_f_drul_[d] = snapy_f_drul[d];
+ dx_f_drul_[d] = snapx_f_drul[d];
+ }
+ }
+ while (flip (&d) != LEFT);
+}
+
+
+int
+Slur::cross_staff_count ()const
+{
+ Link_array<Note_column> encompass_arr =
+ Group_interface__extract_elements (this, (Note_column*)0, "note-columns");
+
+ int k=0;
+
+ for (int i = 0; i < encompass_arr.size (); i++)
+ {
+ if (calc_interstaff_dist (encompass_arr[i], this))
+ k++;
+ }
+ return k;