+MAKE_SCHEME_CALLBACK (Script_column, before_line_breaking, 1);
+SCM
+Script_column::before_line_breaking (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ vector<Grob*> staff_sided;
+
+ extract_grob_set (me, "scripts", scripts);
+ for (vsize i = 0; i < scripts.size (); i++)
+ {
+ Grob *sc = scripts[i];
+ /*
+ Don't want to consider scripts horizontally next to notes.
+ */
+ if (sc->get_property_data ("X-offset") !=
+ Side_position_interface::x_aligned_side_proc)
+ staff_sided.push_back (sc);
+ }
+
+ order_grobs (staff_sided);
+ return SCM_UNSPECIFIED;
+}
+
+void
+Script_column::order_grobs (vector<Grob*> grobs)
+{
+ Drul_array<SCM> scripts_drul (SCM_EOL, SCM_EOL);
+ for (vsize i = 0; i < grobs.size (); i++)
+ {
+ Grob *g = grobs[i];
+ Direction d = get_grob_direction (g);
+
+ scripts_drul[d] = scm_cons (g->self_scm (), scripts_drul[d]);
+ }
+
+ Direction d = DOWN;
+ do
+ {
+ SCM ss = scm_reverse_x (scripts_drul[d], SCM_EOL);
+ ss = scm_stable_sort_x (ss, ly_grob_script_priority_less_proc);
+
+ Grob *g = 0; // current grob in list
+ Grob *last = 0; // previous grob in list
+ SCM initial_outside_staff = SCM_EOL; // initial outside_staff_priority of current grob
+ SCM last_initial_outside_staff = SCM_EOL; // initial outside_staff_priority of previous grob
+
+ // loop over all grobs in script column (already sorted by script_priority)
+ for (SCM s = ss; scm_is_pair (s);
+ s = scm_cdr (s), last = g, last_initial_outside_staff = initial_outside_staff)
+ {
+ g = unsmob_grob (scm_car (s));
+ initial_outside_staff = g->get_property ("outside-staff-priority");
+ if (last) //not the first grob in the list
+ {
+ SCM last_outside_staff = last->get_property ("outside-staff-priority");
+ /*
+ if outside_staff_priority is missing for previous grob, just
+ use it as a support for the current grob
+ */
+ if (!scm_is_number (last_outside_staff))
+ Side_position_interface::add_support (g, last);
+ /*
+ if outside_staff_priority is missing or is equal to original
+ outside_staff_priority of previous grob, set new
+ outside_staff_priority to just higher than outside_staff_priority
+ of previous grob in order to preserve ordering.
+ */
+ else if ((!scm_is_number (initial_outside_staff)) ||
+ (fabs (scm_to_double (initial_outside_staff) -
+ robust_scm2double (last_initial_outside_staff, 0)) < 0.001))
+ g->set_property ("outside-staff-priority",
+ scm_from_double (
+ scm_to_double (last_outside_staff) + 0.1));
+ }
+ }
+ }
+ while (flip (&d) != DOWN);
+}