/*
script-engraver.cc -- implement Script_engraver
- (c) 1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
#include "script-engraver.hh"
#include "script.hh"
+#include "side-position-interface.hh"
#include "musical-request.hh"
#include "stem.hh"
-#include "staff-sym.hh"
-#include "general-script-def.hh"
-#include "text-def.hh"
-
+#include "staff-symbol.hh"
+#include "rhythmic-head.hh"
+#include "dimension-cache.hh"
Script_engraver::Script_engraver()
{
bool
Script_engraver::do_try_music (Music *r_l)
{
- if (Musical_script_req *mr = dynamic_cast <Musical_script_req *> (r_l))
+ if (Articulation_req *mr = dynamic_cast <Articulation_req *> (r_l))
{
for (int i=0; i < script_req_l_arr_.size(); i++)
{
void
Script_engraver::do_process_requests()
{
- if (script_p_arr_.size ())
- return ;
-
for (int i=0; i < script_req_l_arr_.size(); i++)
{
- Script_req* l=script_req_l_arr_[i];
+ Articulation_req* l=script_req_l_arr_[i];
+
+ SCM list = ly_eval_str (("(articulation-to-scriptdef \"" + l->articulation_str_ + "\")").ch_C());
+
+ if (list == SCM_BOOL_F)
+ {
+ l->warning (_f ("Don't know how to interpret articulation `%s'",
+ l->articulation_str_.ch_C ()));
+ continue;
+ }
Script *p =new Script;
- p->dir_ = l->dir_;
- p->specs_p_ = l->scriptdef_p_->clone ();
+ Side_position_interface stafy (p);
+
+
+ list = gh_cdr (list);
+ p->set_elt_property ("molecule",
+ gh_car (list));
+
+ list = gh_cdr(list);
+ bool follow_staff = gh_scm2bool (gh_car (list));
+ list = gh_cdr(list);
+ int relative_stem_dir = gh_scm2int (gh_car (list));
+ list = gh_cdr(list);
+ int force_dir =gh_scm2int (gh_car (list));
+ list = gh_cdr(list);
+ SCM priority = gh_car (list);
+
+
+ if (relative_stem_dir)
+ p->set_elt_property ("side-relative-direction", gh_int2scm (relative_stem_dir));
+ else
+ stafy.set_direction ((Direction)force_dir);
+
+ if (l->get_direction ())
+ stafy.set_direction (l->get_direction ());
+
+ SCM axisprop = get_property ("scriptHorizontal",0);
+ bool xaxis = gh_boolean_p (axisprop) && gh_scm2bool (axisprop);
+ if (xaxis)
+ stafy.set_axis (X_AXIS);
+ else
+ stafy.set_axis (Y_AXIS);
+
+ if (!follow_staff && ! xaxis)
+ p->set_elt_property ("staff-support", SCM_BOOL_T);
+
+ if (!xaxis && follow_staff)
+ stafy.set_quantised (Y_AXIS);
+
+ p->set_elt_property ("script-priority", priority);
+
script_p_arr_.push (p);
+
announce_element (Score_element_info (p, l));
}
}
void
-Script_engraver::do_pre_move_processing()
+Script_engraver::acknowledge_element (Score_element_info inf)
{
- Staff_symbol* s_l = get_staff_info().staff_sym_l_;
- for (int i=0; i < script_p_arr_.size(); i++)
+ if (Stem *s = dynamic_cast<Stem*>(inf.elem_l_))
{
- Script*script_p = script_p_arr_[i];
- if (!script_p->specs_p_->inside_b())
- script_p->add_support (s_l);
-
- if (Text_def*td_l = dynamic_cast<Text_def *> (script_p->specs_p_)) // UGH
+ for (int i=0; i < script_p_arr_.size(); i++)
{
- if (!td_l->style_str_.length_i ())
- {
- Scalar style = get_property ("textstyle", 0);
- if (style.to_bool ())
- td_l->style_str_= style;
- }
- // urg, what if this is already set? in-band signaling...
- Scalar alignment = get_property ("textalignment", 0);
- if (alignment.isnum_b())
+ Side_position_interface stafy (script_p_arr_[i]);
+ stafy.elt_l_->set_elt_property ("direction-source", s->self_scm_);
+ stafy.add_support (s);
+ }
+ }
+ else if (Rhythmic_head * rh = dynamic_cast<Rhythmic_head*>(inf.elem_l_))
+ {
+ for (int i=0; i < script_p_arr_.size(); i++)
+ {
+ Side_position_interface stafy(script_p_arr_[i]);
+
+ if (!stafy.elt_l_->parent_l (X_AXIS))
{
- td_l->align_dir_= (Direction)(int)alignment;
+ stafy.elt_l_->set_parent (inf.elem_l_, X_AXIS);
}
+ if (stafy.get_axis () == X_AXIS
+ && !stafy.elt_l_->parent_l (Y_AXIS))
+ stafy.elt_l_->set_parent (rh, Y_AXIS);
+
+ stafy.add_support (rh);
}
- typeset_element (script_p);
+ }
+}
+
+void
+Script_engraver::do_pre_move_processing()
+{
+ for (int i=0; i < script_p_arr_.size(); i++)
+ {
+ typeset_element (script_p_arr_[i]);
}
script_p_arr_.clear();
}
script_req_l_arr_.clear();
}
+ADD_THIS_TRANSLATOR(Script_engraver);
-ADD_THIS_TRANSLATOR(Script_engraver);