Left: | ||
Right: |
OLD | NEW |
---|---|
1 /* | 1 /* |
2 This file is part of LilyPond, the GNU music typesetter. | 2 This file is part of LilyPond, the GNU music typesetter. |
3 | 3 |
4 Copyright (C) 1997--2012 Han-Wen Nienhuys <hanwen@xs4all.nl> | 4 Copyright (C) 1997--2012 Han-Wen Nienhuys <hanwen@xs4all.nl> |
5 | 5 |
6 LilyPond is free software: you can redistribute it and/or modify | 6 LilyPond is free software: you can redistribute it and/or modify |
7 it under the terms of the GNU General Public License as published by | 7 it under the terms of the GNU General Public License as published by |
8 the Free Software Foundation, either version 3 of the License, or | 8 the Free Software Foundation, either version 3 of the License, or |
9 (at your option) any later version. | 9 (at your option) any later version. |
10 | 10 |
(...skipping 12 matching lines...) Expand all Loading... | |
23 #include "directional-element-interface.hh" | 23 #include "directional-element-interface.hh" |
24 #include "international.hh" | 24 #include "international.hh" |
25 #include "note-column.hh" | 25 #include "note-column.hh" |
26 #include "slur.hh" | 26 #include "slur.hh" |
27 #include "spanner.hh" | 27 #include "spanner.hh" |
28 #include "stream-event.hh" | 28 #include "stream-event.hh" |
29 #include "warn.hh" | 29 #include "warn.hh" |
30 | 30 |
31 #include "translator.icc" | 31 #include "translator.icc" |
32 | 32 |
33 #include <map> | |
34 | |
33 /* | 35 /* |
34 NOTE NOTE NOTE | 36 NOTE NOTE NOTE |
35 | 37 |
36 This is largely similar to Slur_engraver. Check if fixes | 38 This is largely similar to Slur_engraver. Check if fixes |
37 apply there too. | 39 apply there too. |
38 | 40 |
39 (on principle, engravers don't use inheritance for code sharing) | 41 (on principle, engravers don't use inheritance for code sharing) |
40 | 42 |
41 */ | 43 */ |
42 | 44 |
43 /* | 45 /* |
44 It is possible that a slur starts and ends on the same note. At | 46 It is possible that a slur starts and ends on the same note. At |
45 least, it is for phrasing slurs: a note can be both beginning and | 47 least, it is for phrasing slurs: a note can be both beginning and |
46 ending of a phrase. | 48 ending of a phrase. |
47 */ | 49 */ |
48 class Phrasing_slur_engraver : public Engraver | 50 class Phrasing_slur_engraver : public Engraver |
49 { | 51 { |
50 vector<Stream_event *> start_events_; | 52 vector<Stream_event *> start_events_; |
51 vector<Stream_event *> stop_events_; | 53 vector<Stream_event *> stop_events_; |
52 vector<Grob *> slurs_; | 54 vector<Grob *> slurs_; |
53 vector<Grob *> end_slurs_; | 55 vector<Grob *> end_slurs_; |
56 map<Grob *, vector<Grob *> > slur_stubs_; | |
54 vector<Grob_info> objects_to_acknowledge_; | 57 vector<Grob_info> objects_to_acknowledge_; |
55 | 58 |
56 protected: | 59 protected: |
57 DECLARE_TRANSLATOR_LISTENER (phrasing_slur); | 60 DECLARE_TRANSLATOR_LISTENER (phrasing_slur); |
58 DECLARE_ACKNOWLEDGER (inline_accidental); | 61 DECLARE_ACKNOWLEDGER (inline_accidental); |
59 DECLARE_ACKNOWLEDGER (fingering); | 62 DECLARE_ACKNOWLEDGER (fingering); |
60 DECLARE_ACKNOWLEDGER (note_column); | 63 DECLARE_ACKNOWLEDGER (note_column); |
61 DECLARE_ACKNOWLEDGER (slur); | 64 DECLARE_ACKNOWLEDGER (slur); |
62 DECLARE_ACKNOWLEDGER (script); | 65 DECLARE_ACKNOWLEDGER (script); |
63 DECLARE_ACKNOWLEDGER (dots); | 66 DECLARE_ACKNOWLEDGER (dots); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
103 } | 106 } |
104 | 107 |
105 void | 108 void |
106 Phrasing_slur_engraver::acknowledge_note_column (Grob_info info) | 109 Phrasing_slur_engraver::acknowledge_note_column (Grob_info info) |
107 { | 110 { |
108 Grob *e = info.grob (); | 111 Grob *e = info.grob (); |
109 for (vsize i = slurs_.size (); i--;) | 112 for (vsize i = slurs_.size (); i--;) |
110 Slur::add_column (slurs_[i], e); | 113 Slur::add_column (slurs_[i], e); |
111 for (vsize i = end_slurs_.size (); i--;) | 114 for (vsize i = end_slurs_.size (); i--;) |
112 Slur::add_column (end_slurs_[i], e); | 115 Slur::add_column (end_slurs_[i], e); |
116 | |
117 for (vsize j = 0; j < slurs_.size (); j++) | |
118 { | |
119 if (slur_stubs_.find (slurs_[j]) == slur_stubs_.end ()) | |
dak
2012/09/02 15:59:00
It is quite nonsensical to have slur_stubs be a ma
MikeSol
2012/09/02 16:45:14
It is sensical because:
--) It avoids having two v
dak
2012/09/02 17:02:12
I don't see that a "find" method is advantageous o
| |
120 slur_stubs_[slurs_[j]] = vector<Grob *> (); | |
121 | |
122 Grob *stub = make_spanner ("SlurStub", info.grob ()->self_scm ()); | |
123 slur_stubs_[slurs_[j]].push_back (stub); | |
124 } | |
125 | |
126 for (vsize j = 0; j < end_slurs_.size (); j++) | |
127 { | |
128 if (slur_stubs_.find (end_slurs_[j]) == slur_stubs_.end ()) | |
129 slur_stubs_[end_slurs_[j]] = vector<Grob *> (); | |
130 | |
131 Grob *stub = make_spanner ("SlurStub", info.grob ()->self_scm ()); | |
132 slur_stubs_[end_slurs_[j]].push_back (stub); | |
133 } | |
113 } | 134 } |
114 | 135 |
115 void | 136 void |
116 Phrasing_slur_engraver::acknowledge_extra_object (Grob_info info) | 137 Phrasing_slur_engraver::acknowledge_extra_object (Grob_info info) |
117 { | 138 { |
118 objects_to_acknowledge_.push_back (info); | 139 objects_to_acknowledge_.push_back (info); |
119 } | 140 } |
120 | 141 |
121 void | 142 void |
122 Phrasing_slur_engraver::acknowledge_inline_accidental (Grob_info info) | 143 Phrasing_slur_engraver::acknowledge_inline_accidental (Grob_info info) |
(...skipping 16 matching lines...) Expand all Loading... | |
139 void | 160 void |
140 Phrasing_slur_engraver::acknowledge_tuplet_number (Grob_info info) | 161 Phrasing_slur_engraver::acknowledge_tuplet_number (Grob_info info) |
141 { | 162 { |
142 acknowledge_extra_object (info); | 163 acknowledge_extra_object (info); |
143 } | 164 } |
144 | 165 |
145 void | 166 void |
146 Phrasing_slur_engraver::acknowledge_script (Grob_info info) | 167 Phrasing_slur_engraver::acknowledge_script (Grob_info info) |
147 { | 168 { |
148 if (!info.grob ()->internal_has_interface (ly_symbol2scm ("dynamic-interface") )) | 169 if (!info.grob ()->internal_has_interface (ly_symbol2scm ("dynamic-interface") )) |
170 ·· | |
149 acknowledge_extra_object (info); | 171 acknowledge_extra_object (info); |
150 } | 172 } |
151 | 173 |
152 void | 174 void |
153 Phrasing_slur_engraver::acknowledge_text_script (Grob_info info) | 175 Phrasing_slur_engraver::acknowledge_text_script (Grob_info info) |
154 { | 176 { |
155 acknowledge_extra_object (info); | 177 acknowledge_extra_object (info); |
156 } | 178 } |
157 | 179 |
158 void | 180 void |
159 Phrasing_slur_engraver::acknowledge_tie (Grob_info info) | 181 Phrasing_slur_engraver::acknowledge_tie (Grob_info info) |
160 { | 182 { |
161 acknowledge_extra_object (info); | 183 acknowledge_extra_object (info); |
162 } | 184 } |
163 | 185 |
164 void | 186 void |
165 Phrasing_slur_engraver::acknowledge_slur (Grob_info info) | 187 Phrasing_slur_engraver::acknowledge_slur (Grob_info info) |
166 { | 188 { |
167 acknowledge_extra_object (info); | 189 if (!info.grob ()->internal_has_interface (ly_symbol2scm ("slur-stub-interface "))) |
190 acknowledge_extra_object (info); | |
168 } | 191 } |
169 | 192 |
170 void | 193 void |
171 Phrasing_slur_engraver::finalize () | 194 Phrasing_slur_engraver::finalize () |
172 { | 195 { |
173 for (vsize i = 0; i < slurs_.size (); i++) | 196 for (vsize i = 0; i < slurs_.size (); i++) |
174 { | 197 { |
175 slurs_[i]->warning (_ ("unterminated phrasing slur")); | 198 slurs_[i]->warning (_ ("unterminated phrasing slur")); |
176 slurs_[i]->suicide (); | 199 slurs_[i]->suicide (); |
177 } | 200 } |
178 slurs_.clear (); | 201 slurs_.clear (); |
202 slur_stubs_.clear (); | |
179 } | 203 } |
180 | 204 |
181 void | 205 void |
182 Phrasing_slur_engraver::process_music () | 206 Phrasing_slur_engraver::process_music () |
183 { | 207 { |
184 for (vsize i = 0; i < stop_events_.size (); i++) | 208 for (vsize i = 0; i < stop_events_.size (); i++) |
185 { | 209 { |
186 Stream_event *ev = stop_events_[i]; | 210 Stream_event *ev = stop_events_[i]; |
187 string id = robust_scm2string (ev->get_property ("spanner-id"), ""); | 211 string id = robust_scm2string (ev->get_property ("spanner-id"), ""); |
188 | 212 |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
294 { | 318 { |
295 Spanner *s = dynamic_cast<Spanner *> (end_slurs_[i]); | 319 Spanner *s = dynamic_cast<Spanner *> (end_slurs_[i]); |
296 if (!s->get_bound (RIGHT)) | 320 if (!s->get_bound (RIGHT)) |
297 s->set_bound (RIGHT, unsmob_grob (get_property ("currentMusicalColumn")) ); | 321 s->set_bound (RIGHT, unsmob_grob (get_property ("currentMusicalColumn")) ); |
298 announce_end_grob (s, SCM_EOL); | 322 announce_end_grob (s, SCM_EOL); |
299 } | 323 } |
300 | 324 |
301 for (vsize i = 0; i < objects_to_acknowledge_.size (); i++) | 325 for (vsize i = 0; i < objects_to_acknowledge_.size (); i++) |
302 Slur::auxiliary_acknowledge_extra_object (objects_to_acknowledge_[i], slurs_ , end_slurs_); | 326 Slur::auxiliary_acknowledge_extra_object (objects_to_acknowledge_[i], slurs_ , end_slurs_); |
303 | 327 |
328 for (vsize i = 0; i < end_slurs_.size (); i++) | |
329 if (slur_stubs_.find (end_slurs_[i]) != slur_stubs_.end ()) | |
330 { | |
331 // We likely SlurStubs we don't need. Get rid of them. | |
332 map<Grob *, Grob *> vag_to_slur; | |
dak
2012/09/02 15:59:00
Again: why a map here?
MikeSol
2012/09/02 16:45:14
find method, see above.
I know that find exists fo
dak
2012/09/02 17:02:12
You are apparently going to a lot of effort of get
| |
333 for (vsize j = 0; j < slur_stubs_[end_slurs_[i]].size (); j++) | |
334 { | |
335 Grob *vag = Grob::get_vertical_axis_group (slur_stubs_[end_slurs_[i] ][j]); | |
336 if (vag) | |
337 { | |
338 if (vag_to_slur.find (vag) != vag_to_slur.end ()) | |
339 slur_stubs_[end_slurs_[i]][j]->suicide (); | |
340 else | |
341 vag_to_slur[vag] = slur_stubs_[end_slurs_[i]][j]; | |
342 } | |
343 else | |
344 { | |
345 end_slurs_[i]->programming_error ("Cannot find vertical axis gro up for NoteColumn."); | |
346 slur_stubs_[end_slurs_[i]][j]->suicide (); | |
347 } | |
348 } | |
349 map<Grob *, Grob *>::const_iterator it; | |
350 for (it = vag_to_slur.begin (); | |
351 it != vag_to_slur.end (); | |
352 it++) | |
353 Slur::main_to_stub (end_slurs_[i], it->second); | |
354 | |
355 slur_stubs_.erase (end_slurs_[i]); | |
356 } | |
357 | |
304 objects_to_acknowledge_.clear (); | 358 objects_to_acknowledge_.clear (); |
305 end_slurs_.clear (); | 359 end_slurs_.clear (); |
306 start_events_.clear (); | 360 start_events_.clear (); |
307 stop_events_.clear (); | 361 stop_events_.clear (); |
308 } | 362 } |
309 | 363 |
310 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, inline_accidental); | 364 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, inline_accidental); |
311 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, fingering) | 365 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, fingering) |
312 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, note_column); | 366 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, note_column); |
313 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, slur); | 367 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, slur); |
314 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, script); | 368 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, script); |
315 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, dots); | 369 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, dots); |
316 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, text_script); | 370 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, text_script); |
317 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, tie); | 371 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, tie); |
318 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, tuplet_number); | 372 ADD_ACKNOWLEDGER (Phrasing_slur_engraver, tuplet_number); |
319 | 373 |
320 ADD_TRANSLATOR (Phrasing_slur_engraver, | 374 ADD_TRANSLATOR (Phrasing_slur_engraver, |
321 /* doc */ | 375 /* doc */ |
322 "Print phrasing slurs. Similar to @ref{Slur_engraver}.", | 376 "Print phrasing slurs. Similar to @ref{Slur_engraver}.", |
323 | 377 |
324 /* create */ | 378 /* create */ |
325 "PhrasingSlur ", | 379 "PhrasingSlur ", |
326 | 380 |
327 /* read */ | 381 /* read */ |
328 "", | 382 "", |
329 | 383 |
330 /* write */ | 384 /* write */ |
331 "" | 385 "" |
332 ); | 386 ); |
OLD | NEW |