2 script-engraver.cc -- implement Script_engraver
4 (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 #include "script-engraver.hh"
9 #include "side-position-interface.hh"
10 #include "musical-request.hh"
12 #include "staff-symbol.hh"
13 #include "rhythmic-head.hh"
14 #include "dimension-cache.hh"
16 Script_engraver::Script_engraver()
18 do_post_move_processing();
22 Script_engraver::do_try_music (Music
*r_l
)
24 if (Articulation_req
*mr
= dynamic_cast <Articulation_req
*> (r_l
))
26 for (int i
=0; i
< script_req_l_arr_
.size(); i
++)
28 if (script_req_l_arr_
[i
]->equal_b (mr
))
31 script_req_l_arr_
.push (mr
);
38 Script_engraver::do_process_requests()
40 for (int i
=0; i
< script_req_l_arr_
.size(); i
++)
42 Articulation_req
* l
=script_req_l_arr_
[i
];
44 SCM list
= ly_eval_str (("(articulation-to-scriptdef \"" + l
->articulation_str_
+ "\")").ch_C());
46 if (list
== SCM_BOOL_F
)
48 l
->warning (_f ("Don't know how to interpret articulation `%s'",
49 l
->articulation_str_
.ch_C ()));
52 Script
*p
=new Script
;
53 Side_position_interface
stafy (p
);
57 p
->set_elt_property ("molecule",
61 bool follow_staff
= gh_scm2bool (SCM_CAR(list
));
63 int relative_stem_dir
= gh_scm2int (SCM_CAR(list
));
65 int force_dir
=gh_scm2int (SCM_CAR(list
));
67 SCM priority
= SCM_CAR(list
);
70 if (relative_stem_dir
)
71 p
->set_elt_property ("side-relative-direction", gh_int2scm (relative_stem_dir
));
73 stafy
.set_direction ((Direction
)force_dir
);
75 if (l
->get_direction ())
76 stafy
.set_direction (l
->get_direction ());
78 SCM axisprop
= get_property ("scriptHorizontal",0);
79 bool xaxis
= gh_boolean_p (axisprop
) && gh_scm2bool (axisprop
);
81 stafy
.set_axis (X_AXIS
);
83 stafy
.set_axis (Y_AXIS
);
85 if (!follow_staff
&& ! xaxis
)
86 p
->set_elt_property ("staff-support", SCM_BOOL_T
);
88 if (!xaxis
&& follow_staff
)
89 stafy
.set_quantised (Y_AXIS
);
91 p
->set_elt_property ("script-priority", priority
);
93 script_p_arr_
.push (p
);
95 announce_element (Score_element_info (p
, l
));
100 Script_engraver::acknowledge_element (Score_element_info inf
)
102 if (Stem
*s
= dynamic_cast<Stem
*>(inf
.elem_l_
))
104 for (int i
=0; i
< script_p_arr_
.size(); i
++)
106 Side_position_interface
stafy (script_p_arr_
[i
]);
107 stafy
.elt_l_
->set_elt_property ("direction-source", s
->self_scm_
);
108 stafy
.add_support (s
);
111 else if (Rhythmic_head
* rh
= dynamic_cast<Rhythmic_head
*>(inf
.elem_l_
))
113 for (int i
=0; i
< script_p_arr_
.size(); i
++)
115 Side_position_interface
stafy(script_p_arr_
[i
]);
117 if (!stafy
.elt_l_
->parent_l (X_AXIS
))
119 stafy
.elt_l_
->set_parent (inf
.elem_l_
, X_AXIS
);
121 if (stafy
.get_axis () == X_AXIS
122 && !stafy
.elt_l_
->parent_l (Y_AXIS
))
123 stafy
.elt_l_
->set_parent (rh
, Y_AXIS
);
125 stafy
.add_support (rh
);
131 Script_engraver::do_pre_move_processing()
133 for (int i
=0; i
< script_p_arr_
.size(); i
++)
135 typeset_element (script_p_arr_
[i
]);
137 script_p_arr_
.clear();
141 Script_engraver::do_post_move_processing()
143 script_req_l_arr_
.clear();
146 ADD_THIS_TRANSLATOR(Script_engraver
);