X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Frhythmic-column-engraver.cc;h=eb378b7410cdf1990b38848c99936c71fd803804;hb=89bf299597169eeaa5ed7a215b6e808fa849c8cd;hp=5483ff9ace026a385bee7646257e81806ee3836a;hpb=d36e8ced83cfeabcf4ec3840ffe93a717a17ac4d;p=lilypond.git diff --git a/lily/rhythmic-column-engraver.cc b/lily/rhythmic-column-engraver.cc index 5483ff9ace..eb378b7410 100644 --- a/lily/rhythmic-column-engraver.cc +++ b/lily/rhythmic-column-engraver.cc @@ -3,15 +3,39 @@ source file of the GNU LilyPond music typesetter - (c) 1997--1999 Han-Wen Nienhuys + (c) 1997--2000 Han-Wen Nienhuys */ -#include "rhythmic-column-engraver.hh" -#include "note-head.hh" + +#include "slur.hh" +#include "engraver.hh" +#include "rhythmic-head.hh" #include "stem.hh" #include "note-column.hh" #include "dot-column.hh" #include "musical-request.hh" +#include "item.hh" + +class Rhythmic_column_engraver :public Engraver +{ + Link_array rhead_l_arr_; + Link_array grace_slur_endings_; + Grob * stem_l_; + Grob *ncol_p_; + Grob *dotcol_l_; + +protected: + VIRTUAL_COPY_CONS(Translator); + virtual void acknowledge_grob (Grob_info); + virtual void create_grobs (); + virtual void stop_translation_timestep(); + virtual void start_translation_timestep(); +public: + Rhythmic_column_engraver(); + +}; + + Rhythmic_column_engraver::Rhythmic_column_engraver() { @@ -22,19 +46,21 @@ Rhythmic_column_engraver::Rhythmic_column_engraver() void -Rhythmic_column_engraver::process_acknowledged () +Rhythmic_column_engraver::create_grobs () { if (rhead_l_arr_.size ()) { if (!ncol_p_) { - ncol_p_ = new Note_column; - announce_element (Score_element_info (ncol_p_, 0)); + ncol_p_ = new Item (get_property("NoteColumn")); + Note_column::set_interface (ncol_p_); + announce_grob (ncol_p_, 0); } for (int i=0; i < rhead_l_arr_.size (); i++) { - ncol_p_->add_head (rhead_l_arr_[i]); + if (!rhead_l_arr_[i]->parent_l(X_AXIS)) + Note_column::add_head (ncol_p_, rhead_l_arr_[i]); } rhead_l_arr_.set_size (0); } @@ -42,64 +68,79 @@ Rhythmic_column_engraver::process_acknowledged () if (ncol_p_) { - if (dotcol_l_) + if (dotcol_l_ + && !dotcol_l_->parent_l (X_AXIS)) { - ncol_p_->set_dotcol (dotcol_l_); + Note_column::set_dotcol (ncol_p_, dotcol_l_); } - if (stem_l_) + if (stem_l_ + && !stem_l_->parent_l(X_AXIS)) { - ncol_p_->set_stem (stem_l_); + Note_column::set_stem (ncol_p_, stem_l_); stem_l_ = 0; } + + SCM wg = get_property ("weAreGraceContext"); + bool wegrace = to_boolean (wg); + + if (!wegrace) + for (int i=0; i < grace_slur_endings_.size(); i++) + Slur::add_column (grace_slur_endings_[i], ncol_p_); + grace_slur_endings_.clear (); } } void -Rhythmic_column_engraver::acknowledge_element (Score_element_info i) +Rhythmic_column_engraver::acknowledge_grob (Grob_info i) { + SCM wg = get_property ("weAreGraceContext"); + bool wegrace = to_boolean (wg); + if (wegrace != to_boolean (i.elem_l_->get_grob_property ("grace")) + && !Slur::has_interface (i.elem_l_)) + return ; + Item * item = dynamic_cast (i.elem_l_); - if (!item) - return; - if (Stem*s=dynamic_cast (item)) + if (item && Stem::has_interface (item)) { - stem_l_ = s; + stem_l_ = item; } - else if (Rhythmic_head*r=dynamic_cast (item)) + else if (item && Rhythmic_head::has_interface (item)) { - rhead_l_arr_.push (r); + rhead_l_arr_.push (item); } - else if (Dot_column*d =dynamic_cast (item)) + else if (item && Dot_column::has_interface (item)) { - dotcol_l_ = d; + dotcol_l_ = item; } + else if (Slur::has_interface (i.elem_l_)) + { + /* + end slurs starting on grace notes + */ + + if (to_boolean (i.elem_l_->get_grob_property ("grace"))) + grace_slur_endings_.push (i.elem_l_); + } } void -Rhythmic_column_engraver::do_pre_move_processing() +Rhythmic_column_engraver::stop_translation_timestep() { if (ncol_p_) { - // egcs - if (get_property ("hshift", 0).operator bool ()) - { - ncol_p_->set_elt_property (horizontal_shift_scm_sym, SCM_BOOL_T); - } - - typeset_element (ncol_p_); + typeset_grob (ncol_p_); ncol_p_ =0; } } void -Rhythmic_column_engraver::do_post_move_processing() +Rhythmic_column_engraver::start_translation_timestep() { + grace_slur_endings_.clear (); dotcol_l_ =0; stem_l_ =0; } - - - - ADD_THIS_TRANSLATOR(Rhythmic_column_engraver); +