- tie->add_dependency (me);
-}
-
-void
-Tie_column::set_directions (Grob *me)
-{
- if (!to_boolean (me->get_property ("positioning-done")))
- {
- me->set_property ("positioning-done", SCM_BOOL_T);
- new_directions (me);
- }
-}
-
-int
-Tie::compare (Grob *const &s1,
- Grob *const &s2)
-{
- return sign (Tie::get_position (s1) - Tie::get_position (s2));
-}
-
-/*
- Werner:
-
- . The algorithm to choose the direction of the ties doesn't work
- properly. I suggest the following for applying ties sequentially
- from top to bottom:
-
- + The topmost tie is always `up'.
-
- + If there is a vertical gap to the last note above larger than
- or equal to a fifth (or sixth?), the tie is `up', otherwise it
- is `down'.
-
- + The bottommost tie is always `down'.
-*/
-void
-Tie_column::werner_directions (Grob *me)
-{
- extract_grob_set (me, "ties", ro_ties);
- Link_array<Grob> ties (ro_ties);
- if (!ties.size ())
- return;
-
- ties.sort (&Tie::compare);
-
- Direction d = get_grob_direction (me);
- if (d)
- {
- for (int i = ties.size (); i--;)
- {
- Grob *t = ties[i];
- if (!get_grob_direction (t))
- set_grob_direction (t, d);
- }
- return;
- }
-
- if (ties.size () == 1)
- {
- Grob *t = ties[0];
- if (t->is_live ()
- && !get_grob_direction (t))
- set_grob_direction (t, Tie::get_default_dir (t));
- return;
- }
-
- Real last_down_pos = 10000;
- if (!get_grob_direction (ties[0]))
- set_grob_direction (ties[0], DOWN);
-
- /*
- Go downward.
- */
- Grob *last_tie = 0;
- for (int i = ties.size (); i--;)
- {
- Grob *t = ties[i];
-
- Direction d = get_grob_direction (t);
- Real p = Tie::get_position (t);
- if (!d)
- {
- if (last_tie
- && Tie::get_column_rank (t, LEFT)
- < Tie::get_column_rank (last_tie, LEFT))
- d = DOWN;
- else if (last_down_pos - p > 5)
- d = UP;
- else
- d = DOWN;
-
- set_grob_direction (t, d);
- }
-
- if (d == DOWN)
- last_down_pos = p;
-
- last_tie = t;
- }
-
- return;
-}
-
-MAKE_SCHEME_CALLBACK (Tie_column, after_line_breaking, 1);
-SCM
-Tie_column::after_line_breaking (SCM smob)
-{
- set_directions (unsmob_grob (smob));
- return SCM_UNSPECIFIED;