+std::vector<Offset>
+Slur_score_state::generate_avoid_offsets () const
+{
+ std::vector<Offset> avoid;
+ Link_array__Grob_ encompasses = columns_;
+
+ for (vsize i = 0; i < encompasses.size (); i++)
+ {
+ if (extremes_[LEFT].note_column_ == encompasses[i]
+ || extremes_[RIGHT].note_column_ == encompasses[i])
+ continue;
+
+ Encompass_info inf (get_encompass_info (encompasses[i]));
+ Real y = dir_ * (max (dir_ * inf.head_, dir_ * inf.stem_));
+
+ avoid.push_back (Offset (inf.x_, y + dir_ * parameters_.free_head_distance_));
+ }
+
+ extract_grob_set (slur_, "encompass-objects", extra_encompasses);
+ for (vsize i = 0; i < extra_encompasses.size (); i++)
+ {
+ if (Slur::has_interface (extra_encompasses[i]))
+ {
+ Grob *small_slur = extra_encompasses[i];
+ Bezier b = Slur::get_curve (small_slur);
+
+ Offset z = b.curve_point (0.5);
+ z += Offset (small_slur->relative_coordinate (common_[X_AXIS], X_AXIS),
+ small_slur->relative_coordinate (common_[Y_AXIS], Y_AXIS));
+
+ z[Y_AXIS] += dir_ * parameters_.free_slur_distance_;
+ avoid.push_back (z);
+ }
+ else if (extra_encompasses[i]->get_property ("avoid-slur") == ly_symbol2scm ("inside"))
+ {
+ Grob *g = extra_encompasses [i];
+ Interval xe = g->extent (common_[X_AXIS], X_AXIS);
+ Interval ye = g->extent (common_[Y_AXIS], Y_AXIS);
+
+ if (!xe.is_empty ()
+ && !ye.is_empty ())
+ avoid.push_back (Offset (xe.center(), ye[dir_]));
+ }
+ }
+ return avoid;
+}
+