X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fclef-engraver.cc;h=97cbe2049284ef8266e9fff649c9556789e9028e;hb=e2263620675cc1467e01a6ec67f55ffdb56361e4;hp=0e0c79cc84ecd06f0953cf1c2496af2fb1a77049;hpb=862cb234ae538fec06672800f2bd776afc50e6a8;p=lilypond.git diff --git a/lily/clef-engraver.cc b/lily/clef-engraver.cc index 0e0c79cc84..97cbe20492 100644 --- a/lily/clef-engraver.cc +++ b/lily/clef-engraver.cc @@ -1,120 +1,124 @@ /* - clef.cc -- implement Clef_engraver + + clef-engraver.cc -- implement Clef_engraver source file of the GNU LilyPond music typesetter - (c) 1997--1999 Han-Wen Nienhuys , + (c) 1997--2000 Han-Wen Nienhuys , Mats Bengtsson */ #include + +#include "translator-group.hh" +#include "key-item.hh" +#include "local-key-item.hh" #include "bar.hh" -#include "clef-engraver.hh" -#include "clef-item.hh" +#include "note-head.hh" +#include "staff-symbol-referencer.hh" #include "debug.hh" #include "command-request.hh" -#include "time-description.hh" -#include "note-head.hh" -#include "key-item.hh" -#include "local-key-item.hh" +#include "engraver.hh" +#include "direction.hh" +#include "side-position-interface.hh" +#include "item.hh" -Clef_engraver::Clef_engraver() +/// where is c-0 in the staff? +class Clef_engraver : public Engraver { +public: + VIRTUAL_COPY_CONS (Translator); + Clef_engraver (); + + Direction octave_dir_; + bool first_b_; + +protected: + virtual void do_process_music (); + virtual void do_pre_move_processing (); + virtual void do_creation_processing (); + virtual void do_post_move_processing (); + virtual bool do_try_music (Music*); + virtual void acknowledge_element (Score_element_info); + +private: + Item * clef_p_; + Item * octavate_p_; + Clef_change_req * clef_req_l_; + + void create_clef (); + bool set_type (String); +}; + + +Clef_engraver::Clef_engraver () +{ + first_b_ = true; clef_p_ = 0; clef_req_l_ = 0; - clef_type_str_ = ""; - c0_position_i_ = 0; - clef_position_i_ = 0; octave_dir_ = CENTER; + octavate_p_ = 0; } -/* - PUT THIS IN GUILE! - */ -struct Clef_settings { - char const *name; - char const *cleftype; - int position; -} clef_settings[] = { - {"treble", "treble", -2}, - {"violin", "treble", -2}, - {"G", "treble", -2}, - {"G2", "treble", -2}, - {"french", "treble",-4 }, - {"soprano", "alto",-4 }, - {"mezzosoprano", "alto",-2 }, - {"alto", "alto",0 }, - {"tenor", "alto",2 }, - {"baritone", "alto",4 }, - {"varbaritone", "bass",0 }, - {"bass" , "bass",2 }, - {"F", "bass", 2}, - {"subbass", "bass",4}, - {0,0,0} -}; - bool Clef_engraver::set_type (String s) { - if (s.right_str(2) == "_8") // Down one octave + if (s.right_str (2) == "_8") // Down one octave { octave_dir_ = DOWN; - s = s.left_str(s.length_i() - 2); + s = s.left_str (s.length_i () - 2); } - else if (s.right_str(2) == "^8") // Up one octave + else if (s.right_str (2) == "^8") // Up one octave { octave_dir_ = UP; - s = s.left_str(s.length_i() - 2); + s = s.left_str (s.length_i () - 2); } else octave_dir_ = CENTER; - bool found = 0; - for (Clef_settings *c = clef_settings; !found && c->name; c++) + SCM c = get_property ("supportedClefTypes"); + SCM p = get_property ("clefPitches"); + + if (gh_list_p (c)) { - if (c->name == s) - { - clef_type_str_ = c->cleftype; - clef_position_i_ = c->position; - found = 1; - } - } + SCM found = scm_assoc (ly_str02scm (s.ch_C ()), c); + if (found == SCM_BOOL_F) + return false; + + SCM glyph = gh_cadr (found); + SCM pos = gh_caddr (found); - if (!found) - { - switch(toupper (s[0])) - { - case 'F': - clef_type_str_ = "bass"; - break; - case 'G': - clef_type_str_ = "treble"; - break; - case 'C': - clef_type_str_ = "alto"; - break; - default: - return false; - } - clef_position_i_ = 2 * (s[1] - '0') - 6; + daddy_trans_l_->set_property ("glyph", glyph); + daddy_trans_l_->set_property ("position", pos); + + found = scm_assoc (glyph, p); + if (found == SCM_BOOL_F) + return false; + + int c0_position = gh_scm2int (pos) + gh_scm2int (gh_cdr (found)); + daddy_trans_l_->set_property ("c0-position", gh_int2scm (c0_position)); } - if (clef_type_str_ == "treble") - c0_position_i_ = clef_position_i_ - 4; - else if (clef_type_str_ == "alto") - c0_position_i_ = clef_position_i_; - else if (clef_type_str_ == "bass") - c0_position_i_ = clef_position_i_ + 4; - else - assert (false); - - c0_position_i_ -= (int) octave_dir_ * 7; - + int c0_position = gh_scm2int (get_property ("c0-position")); + c0_position -= (int)octave_dir_ * 7; + daddy_trans_l_->set_property ("c0-position", gh_int2scm (c0_position)); + + + SCM basic = ly_symbol2scm ("Clef"); + SCM c0 = ly_symbol2scm ("c0-position"); + SCM gl = ly_symbol2scm ("glyph"); + + daddy_trans_l_->execute_single_pushpop_property (basic, gl, SCM_UNDEFINED); + daddy_trans_l_->execute_single_pushpop_property (basic, c0, SCM_UNDEFINED); + daddy_trans_l_->execute_single_pushpop_property (basic, gl, + get_property ("glyph")); + daddy_trans_l_->execute_single_pushpop_property (basic, c0, + get_property ("c0_position") + ); return true; } - /** Generate a clef at the start of a measure. (when you see a Bar, ie. a breakpoint) @@ -122,48 +126,39 @@ Clef_engraver::set_type (String s) void Clef_engraver::acknowledge_element (Score_element_info info) { - if (dynamic_cast(info.elem_l_) - && clef_type_str_.length_i()) + Item * item =dynamic_cast (info.elem_l_); + if (item) { - bool def = !clef_p_; - create_clef(); - if(def) - clef_p_->set_elt_property(visibility_lambda_scm_sym, - gh_eval_str ("postbreak_only_visibility")); - } + if (Bar::has_interface (info.elem_l_) + && gh_string_p (get_property ("glyph"))) + create_clef (); + - /* ugh; should make Clef_referenced baseclass */ - Item * it_l =dynamic_cast (info.elem_l_); - if (it_l) - { - if (Note_head * h = dynamic_cast(it_l)) + if (Note_head::has_interface (item) + || Local_key_item::has_interface (item)) { - // h->position_i_ += c0_position_i_; - h->position_i_ += c0_position_i_; + int p = int (Staff_symbol_referencer::position_f (item)) + + gh_scm2int (get_property ("c0-position")); + Staff_symbol_referencer::set_position (item, p); } - else if (Local_key_item *i = dynamic_cast (it_l)) + else if (Key_item::has_interface (item)) { - i->c0_position_i_ =c0_position_i_; - } - else if (Key_item *k = dynamic_cast(it_l)) - { - k-> set_c_position (c0_position_i_); + item->set_elt_property ("c0-position", get_property ("c0-position")); } } } void -Clef_engraver::do_creation_processing() +Clef_engraver::do_creation_processing () { - create_default_b_ = true; // should read property. - Scalar def = get_property ("createInitdefaultClef", 0); - if (def.to_bool ()) // egcs: Scalar to bool is ambiguous - set_type (def); - - if (clef_type_str_.length_i ()) - { - create_clef(); - clef_p_->set_elt_property (non_default_scm_sym, SCM_BOOL_T); + daddy_trans_l_->set_property ("position", gh_int2scm (0)); + daddy_trans_l_->set_property ("glyph", SCM_EOL); + daddy_trans_l_->set_property ("c0-position", gh_int2scm (0)); + + SCM def = get_property ("defaultClef"); + if (gh_string_p (def)) + { + set_type (ly_scm2string (def)); } } @@ -174,79 +169,88 @@ Clef_engraver::do_try_music (Music * r_l) { clef_req_l_ = cl; if (!set_type (cl->clef_str_)) - cl->error (_ ("unknown clef type ")); + cl->origin ()->warning (_ ("unknown clef type")); return true; } - else - return false; - + return false; } void -Clef_engraver::create_clef() +Clef_engraver::create_clef () { if (!clef_p_) { - Clef_item *c= new Clef_item; - c->set_elt_property (break_priority_scm_sym, gh_int2scm (-2)); // ugh - String clefstyle = get_property ("clefStyle", 0); - if (clefstyle.length_i ()) - c->set_elt_property (style_scm_sym, - gh_str02scm (clefstyle.ch_C())); + Item *c= new Item (get_property ("Clef")); + announce_element (c, clef_req_l_); + + Staff_symbol_referencer::set_interface (c); - announce_element (Score_element_info (c, clef_req_l_)); clef_p_ = c; } - - clef_p_->symbol_ = clef_type_str_; - clef_p_->y_position_i_ = clef_position_i_; + Staff_symbol_referencer::set_position (clef_p_, + gh_scm2int (get_property ("position") + )); if (octave_dir_) { - clef_p_->set_elt_property (octave_dir_scm_sym, gh_int2scm (octave_dir_)); + Item * g = new Item (get_property ("OctavateEight")); + + Side_position::add_support (g,clef_p_); + + g->set_parent (clef_p_, Y_AXIS); + g->set_parent (clef_p_, X_AXIS); + + g->set_elt_property ("direction", gh_int2scm (octave_dir_)); + octavate_p_ = g; + announce_element (octavate_p_, clef_req_l_); } } - void -Clef_engraver::do_process_requests() +Clef_engraver::do_process_music () { - if (clef_req_l_) + if (clef_req_l_ || first_b_) { - create_clef(); - } - else if (create_default_b_) - { - String type = get_property ("defaultClef", 0); - set_type (type.length_i () ? type : "treble"); create_clef (); - create_default_b_ =0; + clef_p_->set_elt_property ("non-default", SCM_BOOL_T); } } void -Clef_engraver::do_pre_move_processing() +Clef_engraver::do_pre_move_processing () { if (clef_p_) { + SCM vis = 0; + if (to_boolean (clef_p_->get_elt_property ("non-default"))) + { + vis = get_property ("explicitClefVisibility"); + } + + if (vis) + { + clef_p_->set_elt_property ("visibility-lambda", vis); + if (octavate_p_) + octavate_p_->set_elt_property ("visibility-lambda", vis); + } + typeset_element (clef_p_); clef_p_ =0; + + if (octavate_p_) + typeset_element (octavate_p_); + + octavate_p_ = 0; } - create_default_b_ = false; -} -void -Clef_engraver::do_post_move_processing() -{ - clef_req_l_ = 0; + first_b_ = 0; } void -Clef_engraver::do_removal_processing() +Clef_engraver::do_post_move_processing () { - assert (!clef_p_); + clef_req_l_ = 0; } +ADD_THIS_TRANSLATOR (Clef_engraver); - -ADD_THIS_TRANSLATOR(Clef_engraver);