/*
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 "stem-staff-side.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"
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 = gh_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'\n",
+ l->articulation_str_.ch_C()));
+ continue;
+ }
Script *p =new Script;
- p->dir_ = l->dir_;
- p->specs_p_ = l->scriptdef_p_->clone ();
+ Stem_staff_side_item * ss =new Stem_staff_side_item;
+ list = SCM_CDR (list);
+
+ p->set_elt_property (molecule_scm_sym,
+ SCM_CAR(list));
+
+ list = SCM_CDR(list);
+ bool follow_staff = gh_scm2bool (SCM_CAR(list));
+ list = SCM_CDR(list);
+ int relative_stem_dir = gh_scm2int (SCM_CAR(list));
+ list = SCM_CDR(list);
+ int force_dir =gh_scm2int (SCM_CAR(list));
+ list = SCM_CDR(list);
+ SCM priority = SCM_CAR(list);
+
+ if (relative_stem_dir)
+ ss->relative_dir_ = relative_stem_dir;
+ else
+ ss->dir_ = force_dir;
+
+ Scalar dir_prop (get_property ("articulationScriptVerticalDirection", 0));
+ if (dir_prop.isnum_b () && (int) dir_prop != CENTER)
+ ss->dir_ = (int) dir_prop;
+
+ if (l->dir_)
+ ss->dir_ = l->dir_;
+
+ Real padding = 1.0;
+ Scalar paddingprop = get_property ("articulationScriptPadding", 0);
+ if (paddingprop.length_i() && paddingprop.isnum_b ())
+ {
+ padding = (Real)paddingprop;
+ }
+
+ ss->staff_support_b_ = !follow_staff;
+ p->set_staff_side (ss);
+ ss->set_elt_property (script_priority_scm_sym, priority);
+ ss->set_elt_property (padding_scm_sym, gh_double2scm(padding));
script_p_arr_.push (p);
+ staff_side_p_arr_.push (ss);
+
announce_element (Score_element_info (p, l));
+ announce_element (Score_element_info (ss, 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 < staff_side_p_arr_.size(); i++)
+ if (Stem_staff_side_item * ss = dynamic_cast<Stem_staff_side_item*>(staff_side_p_arr_[i]))
+ {
+ ss->set_stem (s);
+ ss->add_support (s);
+ }
+ }
+ else if (Rhythmic_head * rh = dynamic_cast<Rhythmic_head*>(inf.elem_l_))
+ {
+ for (int i=0; i < staff_side_p_arr_.size(); i++)
{
- if (!td_l->style_str_.length_i ())
+ Staff_side_item * ss = dynamic_cast<Staff_side_item*>(staff_side_p_arr_[i]);
+
+ if (!ss->dim_cache_[X_AXIS]->parent_l_)
{
- 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())
- {
- td_l->align_dir_= (Direction)(int)alignment;
+ ss->dim_cache_[X_AXIS]->parent_l_ = inf.elem_l_->dim_cache_[X_AXIS];
}
+ ss->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]);
+ typeset_element (staff_side_p_arr_[i]);
}
script_p_arr_.clear();
+ staff_side_p_arr_.clear ();
}
void
ADD_THIS_TRANSLATOR(Script_engraver);
+