2 script-engraver.cc -- implement G_script_engraver
4 (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 #include "g-script-engraver.hh"
9 #include "g-stem-staff-side.hh"
10 #include "musical-request.hh"
12 #include "staff-symbol.hh"
13 #include "rhythmic-head.hh"
15 G_script_engraver::G_script_engraver()
17 do_post_move_processing();
21 G_script_engraver::do_try_music (Music
*r_l
)
23 if (Articulation_req
*mr
= dynamic_cast <Articulation_req
*> (r_l
))
25 for (int i
=0; i
< script_req_l_arr_
.size(); i
++)
27 if (script_req_l_arr_
[i
]->equal_b (mr
))
30 script_req_l_arr_
.push (mr
);
37 G_script_engraver::do_process_requests()
39 for (int i
=0; i
< script_req_l_arr_
.size(); i
++)
41 Articulation_req
* l
=script_req_l_arr_
[i
];
44 SCM list
= gh_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'\n",
49 l
->articulation_str_
.ch_C()));
52 G_script
*p
=new G_script
;
53 G_stem_staff_side_item
* ss
=new G_stem_staff_side_item
;
54 list
= SCM_CDR (list
);
56 p
->set_elt_property (molecule_scm_sym
,
60 bool follow_staff
= gh_scm2bool (SCM_CAR(list
));
62 int relative_stem_dir
= gh_scm2int (SCM_CAR(list
));
64 int force_dir
=gh_scm2int (SCM_CAR(list
));
66 SCM priority
= SCM_CAR(list
);
68 if (relative_stem_dir
)
69 ss
->relative_dir_
= relative_stem_dir
;
77 Scalar paddingprop
= get_property ("articulationScriptPadding", 0);
78 if (paddingprop
.length_i() && paddingprop
.isnum_b ())
80 padding
= (Real
)paddingprop
;
83 ss
->staff_support_b_
= !follow_staff
;
84 p
->set_staff_side (ss
);
85 ss
->set_elt_property (script_priority_scm_sym
, priority
);
86 ss
->set_elt_property (padding_scm_sym
, gh_double2scm(padding
));
87 script_p_arr_
.push (p
);
88 staff_side_p_arr_
.push (ss
);
90 announce_element (Score_element_info (p
, l
));
91 announce_element (Score_element_info (ss
, l
));
96 G_script_engraver::acknowledge_element (Score_element_info inf
)
98 if (Stem
*s
= dynamic_cast<Stem
*>(inf
.elem_l_
))
100 for (int i
=0; i
< staff_side_p_arr_
.size(); i
++)
101 if (G_stem_staff_side_item
* ss
= dynamic_cast<G_stem_staff_side_item
*>(staff_side_p_arr_
[i
]))
107 else if (Rhythmic_head
* rh
= dynamic_cast<Rhythmic_head
*>(inf
.elem_l_
))
109 for (int i
=0; i
< staff_side_p_arr_
.size(); i
++)
111 G_staff_side_item
* ss
= dynamic_cast<G_staff_side_item
*>(staff_side_p_arr_
[i
]);
113 if (!ss
->dim_cache_
[X_AXIS
]->parent_l_
)
115 ss
->dim_cache_
[X_AXIS
]->parent_l_
= inf
.elem_l_
->dim_cache_
[X_AXIS
];
117 ss
->add_support (rh
);
123 G_script_engraver::do_pre_move_processing()
125 for (int i
=0; i
< script_p_arr_
.size(); i
++)
127 typeset_element (script_p_arr_
[i
]);
128 typeset_element (staff_side_p_arr_
[i
]);
130 script_p_arr_
.clear();
131 staff_side_p_arr_
.clear ();
135 G_script_engraver::do_post_move_processing()
137 script_req_l_arr_
.clear();
142 ADD_THIS_TRANSLATOR(G_script_engraver
);