X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fscript-engraver.cc;h=924bde701fa12aac018c5a3b33559bd4f0e15332;hb=8bcab38894d0ec3451045356146d875c1d4f08b9;hp=20329c302f4eaa5a9d656b991b7c8be53590911f;hpb=df4a7c4a55148e065d878dcc2f7e09ac27ea9c32;p=lilypond.git diff --git a/lily/script-engraver.cc b/lily/script-engraver.cc index 20329c302f..924bde701f 100644 --- a/lily/script-engraver.cc +++ b/lily/script-engraver.cc @@ -1,38 +1,37 @@ /* script-engraver.cc -- implement Script_engraver - (c) 1997--2000 Han-Wen Nienhuys + (c) 1997--2002 Han-Wen Nienhuys */ - #include "script.hh" #include "side-position-interface.hh" #include "musical-request.hh" #include "stem.hh" #include "rhythmic-head.hh" #include "engraver.hh" +#include "note-column.hh" -class Script_engraver : public Engraver { +class Script_engraver : public Engraver +{ Link_array script_p_arr_; Link_array script_req_l_arr_; public: - VIRTUAL_COPY_CONS(Translator); - - Script_engraver(); + TRANSLATOR_DECLARATIONS(Script_engraver); protected: virtual bool try_music (Music*); - void deprecated_process_music (); + virtual void initialize (); virtual void stop_translation_timestep (); virtual void start_translation_timestep (); - virtual void create_grobs (); + virtual void process_music (); virtual void acknowledge_grob (Grob_info); }; - -Script_engraver::Script_engraver() +void +Script_engraver::initialize () { - start_translation_timestep(); + script_req_l_arr_.clear (); } bool @@ -40,7 +39,7 @@ Script_engraver::try_music (Music *r_l) { if (Articulation_req *mr = dynamic_cast (r_l)) { - for (int i=0; i < script_req_l_arr_.size(); i++) + for (int i=0; i < script_req_l_arr_.size (); i++) { if (script_req_l_arr_[i]->equal_b (mr)) return true; @@ -52,135 +51,161 @@ Script_engraver::try_music (Music *r_l) } void -Script_engraver::create_grobs () -{ - deprecated_process_music (); -} - -void -Script_engraver::deprecated_process_music() +Script_engraver::process_music () { - for (int i=0; i < script_req_l_arr_.size(); i++) + for (int i=0; i < script_req_l_arr_.size (); i++) { Articulation_req* l=script_req_l_arr_[i]; SCM alist = get_property ("scriptDefinitions"); - SCM list = scm_assoc (l->get_mus_property ("articulation-type"), alist); + SCM art = scm_assoc (l->get_mus_property ("articulation-type"), alist); - if (list == SCM_BOOL_F) + if (art == SCM_BOOL_F) { String a = ly_scm2string (l->get_mus_property ("articulation-type")); - l->origin ()->warning (_f ("Don't know how to interpret articulation `%s'", a.ch_C())); + l->origin ()->warning (_f ("Don't know how to interpret articulation `%s'", a.ch_C ())); continue; } // todo -> use result of articulation-to-scriptdef directly as basic prop list. Grob *p =new Item (get_property ("Script")); - list = gh_cdr (list); - p->set_grob_property ("molecule", - gh_car (list)); + art = ly_cdr (art); + p->set_grob_property ("script-molecule", ly_car (art)); - list = gh_cdr(list); - bool follow_staff = gh_scm2bool (gh_car (list)); - list = gh_cdr(list); - SCM relative_stem_dir = gh_car (list); - list = gh_cdr(list); + art = ly_cdr (art); + bool follow_staff = gh_scm2bool (ly_car (art)); + art = ly_cdr (art); + SCM relative_stem_dir = ly_car (art); + art = ly_cdr (art); SCM force_dir = l->get_mus_property ("direction"); - if (!isdir_b (force_dir)) - force_dir = gh_car (list); - list = gh_cdr(list); - SCM priority = gh_car (list); - + if (ly_dir_p (force_dir) && !to_dir (force_dir)) + force_dir = ly_car (art); - if (!isdir_b (force_dir) - && to_dir (relative_stem_dir)) - p->set_grob_property ("side-relative-direction", relative_stem_dir); - else + art = ly_cdr (art); + int priority = gh_scm2int (ly_car (art)); + + SCM s = p->get_grob_property ("script-priority"); + if (gh_number_p (s)) + priority = gh_scm2int (s); + + /* Make sure they're in order of user input by adding index i. */ + priority += i * (to_dir (force_dir) ? to_dir (force_dir) : 1); + + if (ly_dir_p (force_dir) && to_dir (force_dir)) p->set_grob_property ("direction", force_dir); + else if (to_dir (relative_stem_dir)) + p->set_grob_property ("side-relative-direction", relative_stem_dir); + /* FIXME: should figure this out in relation with basic props! */ SCM axisprop = get_property ("scriptHorizontal"); bool xaxis = to_boolean (axisprop); - Side_position::set_axis (p, xaxis ? X_AXIS : Y_AXIS); - + Side_position_interface::set_axis (p, xaxis ? X_AXIS : Y_AXIS); + if (!follow_staff && ! xaxis) p->set_grob_property ("staff-support", SCM_BOOL_T); if (!xaxis && follow_staff) - p->add_offset_callback (Side_position::quantised_position_proc, Y_AXIS); + p->add_offset_callback (Side_position_interface::quantised_position_proc, Y_AXIS); - p->set_grob_property ("script-priority", priority); + p->set_grob_property ("script-priority", gh_int2scm (priority)); script_p_arr_.push (p); - announce_grob (p, l); + announce_grob (p, l->self_scm()); } - script_req_l_arr_.clear (); } void Script_engraver::acknowledge_grob (Grob_info inf) { - bool them_grace = to_boolean (inf.elem_l_->get_grob_property ("grace")); - bool us_grace = to_boolean (get_property ("weAreGraceContext")); - - if (us_grace != them_grace) - return; - - if (Stem::has_interface (inf.elem_l_)) + if (Stem::has_interface (inf.grob_l_)) { - for (int i=0; i < script_p_arr_.size(); i++) + for (int i=0; i < script_p_arr_.size (); i++) { Grob*e = script_p_arr_[i]; - e->set_grob_property ("direction-source", inf.elem_l_->self_scm ()); - Side_position::add_support (e, inf.elem_l_); + e->set_grob_property ("direction-source", inf.grob_l_->self_scm ()); + e->add_dependency (inf.grob_l_); + Side_position_interface::add_support (e, inf.grob_l_); } } - else if (Rhythmic_head::has_interface (inf.elem_l_)) + else if (Rhythmic_head::has_interface (inf.grob_l_)) { - for (int i=0; i < script_p_arr_.size(); i++) + for (int i=0; i < script_p_arr_.size (); i++) { Grob *e = script_p_arr_[i]; - if (!e->parent_l (X_AXIS)) + if (Side_position_interface::get_axis (e) == X_AXIS + && !e->get_parent (Y_AXIS)) { - e->set_parent (inf.elem_l_, X_AXIS); + e->set_parent (inf.grob_l_, Y_AXIS); + e->add_dependency (inf.grob_l_); // ?? } - if (Side_position::get_axis (e) == X_AXIS - && !e->parent_l (Y_AXIS)) - e->set_parent (inf.elem_l_, Y_AXIS); + Side_position_interface::add_support (e,inf.grob_l_); + } + } + else if (Note_column::has_interface (inf.grob_l_)) + { + + /* + We make note column the parent of the script. That's not + correct, but due to seconds in a chord, noteheads may be + swapped around horizontally. We don't know which note head to + put it on, so we postpone this decision to + Script_interface::before_line_breaking (). + + */ + for (int i=0; i < script_p_arr_.size (); i++) + { + Grob *e = script_p_arr_[i]; - Side_position::add_support (e,inf.elem_l_); + if (!e->get_parent (X_AXIS) && + Side_position_interface::get_axis (e) == Y_AXIS) + { + e->set_parent (inf.grob_l_, X_AXIS); + } } - } + } } void -Script_engraver::stop_translation_timestep() +Script_engraver::stop_translation_timestep () { - for (int i=0; i < script_p_arr_.size(); i++) + for (int i=0; i < script_p_arr_.size (); i++) { + + /* + TODO: junk staff-support. + */ Grob * sc = script_p_arr_[i]; if (to_boolean (sc->get_grob_property ("staff-support"))) { - Side_position::add_staff_support (sc); + Side_position_interface::add_staff_support (sc); } typeset_grob (sc); } - script_p_arr_.clear(); + script_p_arr_.clear (); } void -Script_engraver::start_translation_timestep() +Script_engraver::start_translation_timestep () { - script_req_l_arr_.clear(); + script_req_l_arr_.clear (); } -ADD_THIS_TRANSLATOR(Script_engraver); +Script_engraver::Script_engraver(){} + +ENTER_DESCRIPTION(Script_engraver, +/* descr */ " Handles note ornaments generated by @code{\\script}. +", +/* creats*/ "Script", +/* acks */ "stem-interface rhythmic-head-interface note-column-interface", +/* reads */ "scriptDefinitions scriptHorizontal", +/* write */ "");