-UGH, we should take COMMON-Y as argument.
-*/
-Offset
-Slur::get_attachment (Grob *me, Direction dir,
- Grob **common)
-{
- SCM s = me->get_property ("attachment");
- if (!ly_pair_p (s) || !ly_symbol_p (index_get_cell (s, dir)))
- {
- s = set_extremities (me);
- }
-
- SCM a = (dir == LEFT) ? ly_car (s) : ly_cdr (s);
- Spanner*sp = dynamic_cast<Spanner*> (me);
- String str = ly_symbol2string (a);
-
- Real staff_space = Staff_symbol_referencer::staff_space ((Grob*)me);
- Real hs = staff_space / 2.0;
- Offset o;
-
- Direction slurdir = to_dir (me->get_property ("direction"));
-
- Grob *stem = 0;
- if (Note_column::has_interface (sp->get_bound (dir)))
- {
- Grob * n =sp->get_bound (dir);
- stem = Note_column::get_stem (n);
- if (stem)
- {
- Real x_extent;
- Grob *head = Note_column::first_head (n);
- if (head)
- x_extent = head->extent (head, X_AXIS).length ();
- else
- x_extent = n->extent (n, X_AXIS).length ();
-
- if (!head)
- {
- o = Offset (0, n->extent (n, Y_AXIS)[slurdir]);
- }
- else if (str == "head")
- {
- o = Offset (0, Stem::head_positions (stem)
- [slurdir] * hs);
- /*
- Default position is centered in X, on outer side of head Y
- */
- o += Offset (0.5 * x_extent,
- 0.5 * staff_space
- * slurdir);
- }
- else if (str == "alongside-stem")
- {
- o = Offset (0, Stem::chord_start_y (stem));
- /*
- Default position is on stem X, on outer side of head Y
- */
- o += Offset (x_extent * (1 + Stem::get_direction (stem)),
- 0.5 * staff_space
- * slurdir);
- }
- else if (str == "stem")
- {
- o = Offset (0, Stem::stem_end_position (stem) * hs);
- /*
- Default position is on stem X, at stem end Y
- */
- Real stem_thickness = Stem::thickness (stem);
- o += Offset (0.5 *
- x_extent * (1 + Stem::get_direction (stem))
- - ((dir + 1)/2) * stem_thickness
- + ((1 - slurdir)/2) * stem_thickness,
- 0);
- }
- }
- }