2 script-column.cc -- implement Script_column
4 source file of the GNU LilyPond music typesetter
6 (c) 1999--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "script-column.hh"
10 #include "side-position-interface.hh"
12 #include "group-interface.hh"
15 Script_column::add_staff_sided (Grob
*me
, Item
*i
)
17 SCM p
= i
->get_property ("script-priority");
21 Pointer_group_interface::add_grob (me
, ly_symbol2scm ("scripts"),i
);
23 me
->add_dependency (i
);
26 LY_DEFINE (grob_script_priority_less
, "ly:grob-script-priority-less",
27 2, 0, 0, (SCM a
, SCM b
),
28 "Compare two grobs by script priority. For internal use.")
30 Grob
*i1
= unsmob_grob (a
);
31 Grob
*i2
= unsmob_grob (b
);
33 SCM p1
= i1
->get_property ("script-priority");
34 SCM p2
= i2
->get_property ("script-priority");
36 return ly_scm2int (p1
) < ly_scm2int (p2
) ? SCM_BOOL_T
: SCM_BOOL_F
;
39 MAKE_SCHEME_CALLBACK (Script_column
, before_line_breaking
, 1);
41 Script_column::before_line_breaking (SCM smob
)
43 Grob
* me
= unsmob_grob (smob
);
44 Drul_array
<SCM
> scripts (SCM_EOL
, SCM_EOL
);
45 Link_array
<Grob
> staff_sided
;
47 for (SCM s
= me
->get_property ("scripts"); ly_pair_p (s
); s
= ly_cdr (s
))
49 Grob
*sc
= unsmob_grob (ly_car (s
));
51 if (!sc
->has_offset_callback (Side_position_interface::aligned_side_proc
,
53 staff_sided
.push (sc
);
56 for (int i
= 0; i
< staff_sided
.size (); i
++)
58 Grob
* g
= staff_sided
[i
];
59 Direction d
= Side_position_interface::get_direction (g
);
62 programming_error ( "No direction for script?");
64 g
->set_property ("direction", scm_int2num (d
));
67 scripts
[d
] = scm_cons (g
->self_scm (), scripts
[d
]);
73 SCM ss
= scm_reverse_x (scripts
[d
], SCM_EOL
);
74 ss
= scm_stable_sort_x (ss
, grob_script_priority_less_proc
);
77 for (SCM s
= ss
; ly_pair_p (s
); s
= ly_cdr (s
))
79 Grob
*g
= unsmob_grob (ly_car (s
));
81 Side_position_interface::add_support (g
,last
);
86 } while (flip (&d
) != DOWN
);
88 return SCM_UNSPECIFIED
;
91 ADD_INTERFACE (Script_column
,"script-column-interface",
92 "An interface that sorts scripts "
93 "according to their @code{script-priority}",