From: fred Date: Sun, 24 Mar 2002 20:08:16 +0000 (+0000) Subject: lilypond-1.0.1 X-Git-Tag: release/1.5.59~3292 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=9baf4c2cab76b01378d50050eb0024e8792c661c;p=lilypond.git lilypond-1.0.1 --- diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc new file mode 100644 index 0000000000..9fc4704f2c --- /dev/null +++ b/lily/dynamic-engraver.cc @@ -0,0 +1,202 @@ +/* + dynamic-reg.cc -- implement Dynamic_engraver + + source file of the GNU LilyPond music typesetter + + (c) 1997--1998 Han-Wen Nienhuys +*/ +#include "debug.hh" +#include "crescendo.hh" +#include "dynamic-engraver.hh" +#include "musical-request.hh" +#include "text-item.hh" +#include "lookup.hh" +#include "paper-def.hh" +#include "score-column.hh" +#include "staff-sym.hh" +#include "note-column.hh" + +Dynamic_engraver::Dynamic_engraver() +{ + do_post_move_processing(); + dir_ = CENTER; + dynamic_p_ =0; + to_end_cresc_p_ = cresc_p_ = 0; + cresc_req_l_ = 0; +} + +void +Dynamic_engraver::do_post_move_processing() +{ + dynamic_req_l_arr_.clear(); +} + +bool +Dynamic_engraver::do_try_request (Request * r) +{ + Musical_req * m = r->access_Musical_req (); + if (!m) + return false; + Dynamic_req * d = m->access_Dynamic_req (); + if (!d) + return false; + +#if 0 + if (cresc_p_ && d->access_Span_dynamic_req () + && d->access_Span_dynamic_req ()->spantype == Span_req::START) + return false; +#endif + for (int i=0; i < dynamic_req_l_arr_.size (); i++) + if (d->equal_b (dynamic_req_l_arr_[i])) + return true; + + dynamic_req_l_arr_.push (m->access_Dynamic_req ()); + return true; +} +void +Dynamic_engraver::do_process_requests() +{ + Crescendo* new_cresc_p=0; + for (int i=0; i < dynamic_req_l_arr_.size(); i++) + { + Dynamic_req *dreq_l = dynamic_req_l_arr_[i]; + if (dreq_l->access_Absolute_dynamic_req ()) + { + + if (dynamic_p_) + { + dynamic_req_l_arr_[i]->warning (_("Got a dynamic already. Continuing dazed and confused")); + continue; + } + + Text_def * td_p = new Text_def; + td_p->align_dir_ = CENTER; + String loud = dreq_l->access_Absolute_dynamic_req ()->loudness_str (); + td_p->text_str_ = paper ()->lookup_l (0)->dynamic (loud).tex_; + td_p->style_str_ = "dynamic"; + + + + dynamic_p_ = new Text_item (td_p); + announce_element (Score_element_info (dynamic_p_, dreq_l)); + } + else if (dreq_l->access_Span_dynamic_req ()) + { + Span_dynamic_req* span_l = dreq_l->access_Span_dynamic_req (); + if (span_l->spantype == Span_req::STOP) + { + if (!cresc_p_) + { + span_l->warning (_ ("can't find (de)crescendo to end")); + } + else + { + assert (!to_end_cresc_p_); + to_end_cresc_p_ =cresc_p_; + cresc_p_ = 0; + } + } + else if (span_l->spantype == Span_req::START) + { + cresc_req_l_ = span_l; + assert (!new_cresc_p); + new_cresc_p = new Crescendo; + new_cresc_p->grow_dir_ = span_l->dynamic_dir_; + announce_element (Score_element_info (new_cresc_p, span_l)); + } + } + } + + if (new_cresc_p) + { + if (cresc_p_) + { + ::warning (_ ("Too many crescendi here")); + typeset_element (cresc_p_); + cresc_p_ = 0; + } + + cresc_p_ = new_cresc_p; + cresc_p_->set_bounds(LEFT,get_staff_info().musical_l ()); + if (dynamic_p_) + { + cresc_p_->dyn_b_drul_[LEFT] = true; + } + } +} + +void +Dynamic_engraver::do_pre_move_processing() +{ + Staff_symbol* s_l = get_staff_info().staff_sym_l_; + if (to_end_cresc_p_) + { + if (dynamic_p_) + to_end_cresc_p_->dyn_b_drul_[RIGHT]=true; + + + Scalar prop = get_property ("dynamicdir"); + if (prop.isnum_b ()) + { + to_end_cresc_p_->dir_ = (Direction) (int) prop; + } + to_end_cresc_p_->set_bounds(RIGHT,get_staff_info().musical_l ()); + to_end_cresc_p_->add_support (s_l); + typeset_element (to_end_cresc_p_); + to_end_cresc_p_ = 0; + } + if (dynamic_p_) + { + Scalar prop = get_property ("dynamicdir"); + if (prop.isnum_b ()) + { + dynamic_p_->dir_ = (Direction) (int) prop; + } + + dynamic_p_->add_support (s_l); + typeset_element (dynamic_p_); + dynamic_p_ = 0; + } +} + + +IMPLEMENT_IS_TYPE_B1(Dynamic_engraver,Engraver); +ADD_THIS_TRANSLATOR(Dynamic_engraver); + +void +Dynamic_engraver::do_removal_processing () +{ + if (cresc_p_) + { + typeset_element (cresc_p_ ); + + cresc_req_l_->warning (_ ("unended crescendo")); + cresc_p_ =0; + } + if (to_end_cresc_p_) + { + typeset_element (to_end_cresc_p_); + to_end_cresc_p_ =0; + } + if (dynamic_p_) + { + typeset_element (dynamic_p_); + dynamic_p_ =0; + } +} + +void +Dynamic_engraver::acknowledge_element (Score_element_info i) +{ + if (i.elem_l_->is_type_b (Note_column::static_name ())) + { + if (dynamic_p_) + dynamic_p_->add_support (i.elem_l_); + + if (to_end_cresc_p_) + to_end_cresc_p_->add_support (i.elem_l_); + + if (cresc_p_) + cresc_p_->add_support (i.elem_l_); + } +} diff --git a/lily/include/text-def.hh b/lily/include/text-def.hh index 13fb25511b..296350de45 100644 --- a/lily/include/text-def.hh +++ b/lily/include/text-def.hh @@ -1,7 +1,7 @@ /* text-def.hh -- part of GNU LilyPond - (c) 1996,97 Han-Wen Nienhuys + (c) 1996--1998 Han-Wen Nienhuys */ #ifndef TEXT_DEF_HH @@ -19,11 +19,11 @@ public: VIRTUAL_COPY_CONS(Text_def,General_script_def); /** - centered , or aligned? + Alignment of typeset text wrt center. - -1 = raggedright, 0 = center, 1 = raggedleft + LEFT = raggedright, CENTER = centered, RIGHT = raggedleft */ - Direction align_i_; + Direction align_dir_; String text_str_; String style_str_;