]> git.donarmstrong.com Git - lilypond.git/blob - lily/clef-grav.cc
6bb055c2faeea36a0459d67bdbf0e7714389a4d4
[lilypond.git] / lily / clef-grav.cc
1 /*
2   clef.cc -- implement Clef_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>,
7   Mats Bengtsson <matsb@s3.kth.se>
8 */
9
10 #include "bar.hh"
11 #include "clef-grav.hh"
12 #include "clef-item.hh"
13 #include "debug.hh"
14 #include "command-request.hh"
15 #include "time-description.hh"
16
17 Clef_engraver::Clef_engraver()
18 {
19   clef_p_ = 0;
20   clef_req_l_ =0;
21   clef_type_str_ = 0;
22   c0_position_i_ =0;
23 }
24
25 bool
26 Clef_engraver::set_type (String s)
27 {
28   clef_type_str_  = s;
29   if (clef_type_str_ == "violin")
30     {
31       c0_position_i_= -6;
32     }
33   else if (clef_type_str_ == "alto")
34     {
35       c0_position_i_= 0;
36     }
37   else if (clef_type_str_ == "tenor")
38     {
39       c0_position_i_= 2;
40     }
41   else if (clef_type_str_ == "bass")
42     {
43       c0_position_i_= 6;
44     }
45   else
46     return false;
47
48   return true;
49 }
50
51 void
52 Clef_engraver::fill_staff_info (Staff_info &i)
53 {
54   i.c0_position_i_l_ = &c0_position_i_;
55 }
56
57 void
58 Clef_engraver::read_req (Clef_change_req*c_l)
59 {
60   if (!set_type (c_l->clef_str_))
61     c_l->error (_("unknown clef type "));
62 }
63
64
65 /** 
66   Generate a clef at the start of a measure. (when you see a Bar,
67   ie. a breakpoint) 
68   */
69 void
70 Clef_engraver::acknowledge_element (Score_elem_info info)
71 {
72   if (info.elem_l_->is_type_b (Bar::static_name ()) 
73       && clef_type_str_.length_i())
74     {
75       create_clef();
76       if (!clef_req_l_)
77         clef_p_->default_b_ = true;
78     }
79 }
80
81 void
82 Clef_engraver::do_creation_processing()
83 {
84   Scalar def = get_property ("defaultclef");
85   if (def.operator bool ()) // egcs: Scalar to bool is ambiguous
86     set_type (def);
87   if (clef_type_str_.length_i ())
88     create_clef();
89   clef_p_->default_b_ = false;
90 }
91
92 bool
93 Clef_engraver::do_try_request (Request * r_l)
94 {
95   Command_req* creq_l= r_l->command();
96   if (!creq_l || !creq_l->clefchange())
97     return false;
98
99   clef_req_l_ = creq_l->clefchange();
100   read_req (clef_req_l_);
101   return true;
102 }
103
104 void
105 Clef_engraver::create_clef()
106 {
107   if (!clef_p_)
108     {
109       clef_p_ = new Clef_item;
110       clef_p_->break_priority_i_ = -2; // ugh
111       announce_element (Score_elem_info (clef_p_,clef_req_l_));
112     }
113   clef_p_->read (*this);
114 }
115
116 void
117 Clef_engraver::do_process_requests()
118 {
119   if (clef_req_l_)
120     {
121       create_clef();
122       clef_p_->default_b_ = false;
123     }
124 }
125
126 void
127 Clef_engraver::do_pre_move_processing()
128 {
129   if (clef_p_)
130     {
131       typeset_element (clef_p_);
132       clef_p_ = 0;
133     }
134 }
135 void
136 Clef_engraver::do_post_move_processing()
137 {
138   clef_req_l_ = 0;
139 }
140
141 void
142 Clef_engraver::do_removal_processing()
143 {
144   delete clef_p_;
145   clef_p_ =0;
146 }
147
148
149 IMPLEMENT_IS_TYPE_B1(Clef_engraver,Engraver);
150 ADD_THIS_TRANSLATOR(Clef_engraver);