/*
[TODO]
+ * fix broken interstaff slurs
* begin and end should be treated as a/acknowledge Scripts.
* broken slur should have uniform trend
* smart changing of endings
#include "debug.hh"
#include "slur-bezier-bow.hh"
#include "main.hh"
-#include "cross-staff.hh"
#include "group-interface.hh"
#include "staff-symbol-referencer.hh"
if (!stem_l)
{
warning (_ ("Slur over rest?"));
- o[X_AXIS] = col->relative_coordinate (0, X_AXIS);
- o[Y_AXIS] = col->extent (Y_AXIS)[dir];
+ o[X_AXIS] = col->relative_coordinate (0, X_AXIS);
+ o[Y_AXIS] = col->relative_coordinate (0, Y_AXIS);
return o;
}
Direction stem_dir = Directional_element_interface (stem_l).get ();
if ((stem_dir == dir)
&& !stem_l->extent (Y_AXIS).empty_b ())
{
- o[Y_AXIS] = stem_l->extent (Y_AXIS)[dir];
+ o[Y_AXIS] = stem_l->relative_coordinate (0, Y_AXIS);
}
else
{
- o[Y_AXIS] = col->extent (Y_AXIS)[dir];
+ o[Y_AXIS] = col->relative_coordinate (0, Y_AXIS);
}
/*
leave a gap: slur mustn't touch head/stem
*/
o[Y_AXIS] += dir * paper_l ()->get_var ("slur_y_free");
- o[Y_AXIS] -= calc_interstaff_dist (stem_l, this);
return o;
}
}
}
-
- /*
- URG
- */
-
- if (str != "loose-end")
- {
- Link_array<Note_column> encompass_arr =
- Pointer_group_interface__extract_elements (this, (Note_column*)0,
- "note-columns");
- o -= Offset (0, calc_interstaff_dist (dir == LEFT ? encompass_arr[0]
- : encompass_arr.top (), this));
- }
+ if (str != "loose-end")
+ o += Offset (0, get_bound (dir)->relative_coordinate (0, Y_AXIS)
+ - relative_coordinate (0, Y_AXIS));
+
return o;
}
-int
-Slur::cross_staff_count ()const
-{
- Link_array<Note_column> encompass_arr =
- Pointer_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;
-}
-
-
Array<Offset>
Slur::get_encompass_offset_arr () const
{
Array<Offset> offset_arr;
- Offset origin (relative_coordinate (0, X_AXIS), 0);
+ Offset origin (relative_coordinate (0, X_AXIS),
+ relative_coordinate (0, Y_AXIS));
int first = 1;
int last = encompass_arr.size () - 2;
/*
left is broken edge
*/
- int cross_count = cross_staff_count ();
- /*
- URG
- */
- bool cross_b = cross_count && cross_count < encompass_arr.size ();
if (encompass_arr[0] != get_bound (LEFT))
{
first--;
- Real is = calc_interstaff_dist (encompass_arr[0], this);
- if (cross_b)
- offset_arr[0][Y_AXIS] += is;
+ offset_arr[0][Y_AXIS] -= encompass_arr[0]->relative_coordinate (0, Y_AXIS)
+ - relative_coordinate (0, Y_AXIS);
}
/*
offset_arr.push (Offset (spanner_length (), 0) + get_attachment (RIGHT));
+ if (encompass_arr[0] != get_bound (LEFT))
+ {
+ offset_arr.top ()[Y_AXIS] -= encompass_arr.top ()->relative_coordinate (0, Y_AXIS)
+ - relative_coordinate (0, Y_AXIS);
+ }
+
return offset_arr;
}
(get-pointer stem 'heads))))
-;; FIXME: document this.
+;; Slur-extremity-rules is a list of rules. Each rule is a pair
+;; (fuction . attachment), where function takes two arguments,
+;; the slur and the direction of the attachment.
+;;
+;; The rules are tried starting from the car of this list. If the
+;; function part (car) evaluates to #t, the corresponding
+;; attachment (cdr) is used for the slur's dir. Otherwise, the next
+;; rule is tried.
+;;
+;; Currently, we have attachments:
+;;
+;; 'head 'along-side-stem 'stem 'loose-end
+;;
+
(define slur-extremity-rules
(list
(cons (lambda (slur dir)
))
+;; This list defines the offsets for each type of attachment.
+;; The format of each element is
+;; (attachment stem-dir * attachment-dir slur-dir)
+;; Different attachments have different default points:
+;;
+;; head: Default position is centered in X, on outer side of head Y
+;; along-side-stem: Default position is on stem X, on outer side of head Y
+;; stem: Default position is on stem X, at stem end Y
(define slur-extremity-offset-alist
'(
((head 1 1) . (-0.25 . 0.2))