2 script-engraver.cc -- implement Script_engraver
4 (c) 1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
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 #include "engraver.hh"
18 class Script_engraver : public Engraver {
19 Link_array<Script> script_p_arr_;
20 Link_array<Articulation_req> script_req_l_arr_;
23 VIRTUAL_COPY_CONS(Translator);
27 virtual bool do_try_music (Music*);
28 virtual void do_process_music ();
29 virtual void do_pre_move_processing ();
30 virtual void do_post_move_processing ();
31 virtual void acknowledge_element (Score_element_info);
35 Script_engraver::Script_engraver()
37 do_post_move_processing();
41 Script_engraver::do_try_music (Music *r_l)
43 if (Articulation_req *mr = dynamic_cast <Articulation_req *> (r_l))
45 for (int i=0; i < script_req_l_arr_.size(); i++)
47 if (script_req_l_arr_[i]->equal_b (mr))
50 script_req_l_arr_.push (mr);
57 Script_engraver::do_process_music()
59 for (int i=0; i < script_req_l_arr_.size(); i++)
61 Articulation_req* l=script_req_l_arr_[i];
63 SCM list = scm_eval (gh_list (ly_symbol2scm ("articulation-to-scriptdef"),
64 ly_str02scm (l->articulation_str_.ch_C()),
67 if (list == SCM_BOOL_F)
69 l->warning (_f ("Don't know how to interpret articulation `%s'",
70 l->articulation_str_.ch_C ()));
73 // todo -> use result of articulation-to-scriptdef directly as basic prop list.
74 Script *p =new Script (get_property ("basicScriptProperties"));
75 Side_position_interface stafy (p);
79 p->set_elt_property ("molecule",
83 bool follow_staff = gh_scm2bool (gh_car (list));
85 int relative_stem_dir = gh_scm2int (gh_car (list));
87 int force_dir =gh_scm2int (gh_car (list));
89 SCM priority = gh_car (list);
92 if (relative_stem_dir)
93 p->set_elt_property ("side-relative-direction", gh_int2scm (relative_stem_dir));
95 stafy.set_direction ((Direction)force_dir);
97 if (l->get_direction ())
98 stafy.set_direction (l->get_direction ());
100 SCM axisprop = get_property ("scriptHorizontal");
101 bool xaxis = to_boolean (axisprop);
103 stafy.set_axis (X_AXIS);
105 stafy.set_axis (Y_AXIS);
107 if (!follow_staff && ! xaxis)
108 p->set_elt_property ("staff-support", SCM_BOOL_T);
110 if (!xaxis && follow_staff)
111 stafy.set_quantised (Y_AXIS);
113 p->set_elt_property ("script-priority", priority);
115 script_p_arr_.push (p);
117 announce_element (Score_element_info (p, l));
122 Script_engraver::acknowledge_element (Score_element_info inf)
124 bool them_grace = to_boolean (inf.elem_l_->get_elt_property ("grace"));
125 bool us_grace = to_boolean (get_property ("weAreGraceContext"));
127 if (us_grace != them_grace)
130 if (Stem *s = dynamic_cast<Stem*>(inf.elem_l_))
132 for (int i=0; i < script_p_arr_.size(); i++)
134 Side_position_interface stafy (script_p_arr_[i]);
135 stafy.elt_l_->set_elt_property ("direction-source", s->self_scm_);
136 stafy.add_support (s);
139 else if (Rhythmic_head * rh = dynamic_cast<Rhythmic_head*>(inf.elem_l_))
141 for (int i=0; i < script_p_arr_.size(); i++)
143 Side_position_interface stafy(script_p_arr_[i]);
145 if (!stafy.elt_l_->parent_l (X_AXIS))
147 stafy.elt_l_->set_parent (inf.elem_l_, X_AXIS);
149 if (stafy.get_axis () == X_AXIS
150 && !stafy.elt_l_->parent_l (Y_AXIS))
151 stafy.elt_l_->set_parent (rh, Y_AXIS);
153 stafy.add_support (rh);
159 Script_engraver::do_pre_move_processing()
161 for (int i=0; i < script_p_arr_.size(); i++)
163 Script * sc = script_p_arr_[i];
164 if (to_boolean (sc->remove_elt_property ("staff-support")))
166 Side_position_interface (sc).add_staff_support ();
168 typeset_element (sc);
170 script_p_arr_.clear();
174 Script_engraver::do_post_move_processing()
176 script_req_l_arr_.clear();
179 ADD_THIS_TRANSLATOR(Script_engraver);