]> git.donarmstrong.com Git - lilypond.git/blob - lily/clef-grav.cc
release: 0.1.47
[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_ == "soprano")
34     {
35       c0_position_i_= -4;
36     }
37   else if (clef_type_str_ == "alto")
38     {
39       c0_position_i_= 0;
40     }
41   else if (clef_type_str_ == "tenor")
42     {
43       c0_position_i_= 2;
44     }
45   else if (clef_type_str_ == "bass")
46     {
47       c0_position_i_= 6;
48     }
49   else
50     return false;
51
52   return true;
53 }
54
55 void
56 Clef_engraver::fill_staff_info (Staff_info &i)
57 {
58   i.c0_position_i_l_ = &c0_position_i_;
59 }
60
61 void
62 Clef_engraver::read_req (Clef_change_req*c_l)
63 {
64   if (!set_type (c_l->clef_str_))
65     c_l->error (_("unknown clef type "));
66 }
67
68
69 /** 
70   Generate a clef at the start of a measure. (when you see a Bar,
71   ie. a breakpoint) 
72   */
73 void
74 Clef_engraver::acknowledge_element (Score_elem_info info)
75 {
76   if (info.elem_l_->is_type_b (Bar::static_name ()) 
77       && clef_type_str_.length_i())
78     {
79       create_clef();
80       if (!clef_req_l_)
81         clef_p_->default_b_ = true;
82     }
83 }
84
85 void
86 Clef_engraver::do_creation_processing()
87 {
88   Scalar def = get_property ("defaultclef");
89   if (def.operator bool ()) // egcs: Scalar to bool is ambiguous
90     set_type (def);
91   if (clef_type_str_.length_i ())
92     create_clef();
93   clef_p_->default_b_ = false;
94 }
95
96 bool
97 Clef_engraver::do_try_request (Request * r_l)
98 {
99   Command_req* creq_l= r_l->command();
100   if (!creq_l || !creq_l->clefchange())
101     return false;
102
103   clef_req_l_ = creq_l->clefchange();
104   read_req (clef_req_l_);
105   return true;
106 }
107
108 void
109 Clef_engraver::create_clef()
110 {
111   if (!clef_p_)
112     {
113       clef_p_ = new Clef_item;
114       clef_p_->break_priority_i_ = -2; // ugh
115       announce_element (Score_elem_info (clef_p_,clef_req_l_));
116     }
117   clef_p_->read (*this);
118 }
119
120 void
121 Clef_engraver::do_process_requests()
122 {
123   if (clef_req_l_)
124     {
125       create_clef();
126       clef_p_->default_b_ = false;
127     }
128 }
129
130 void
131 Clef_engraver::do_pre_move_processing()
132 {
133   if (clef_p_)
134     {
135       typeset_element (clef_p_);
136       clef_p_ = 0;
137     }
138 }
139 void
140 Clef_engraver::do_post_move_processing()
141 {
142   clef_req_l_ = 0;
143 }
144
145 void
146 Clef_engraver::do_removal_processing()
147 {
148   delete clef_p_;
149   clef_p_ =0;
150 }
151
152
153 IMPLEMENT_IS_TYPE_B1(Clef_engraver,Engraver);
154 ADD_THIS_TRANSLATOR(Clef_engraver);