Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(774)

Side by Side Diff: lily/phrasing-slur-engraver.cc

Issue 6498077: Approximates cross-staff slurs in VerticalAxisGroup vertical-skylines. Base URL: http://git.savannah.gnu.org/gitweb/?p=lilypond.git/trunk/
Patch Set: Builds cross-staff-stub skylines directly into VerticalAxisGroup skylines Created 12 years, 7 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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 );
OLDNEW

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b