LEFT | RIGHT |
1 /* | 1 /* |
2 extender-engraver.cc -- implement Extender_engraver | 2 extender-engraver.cc -- implement Extender_engraver |
3 | 3 |
4 source file of the GNU LilyPond music typesetter | 4 source file of the GNU LilyPond music typesetter |
5 | 5 |
6 (c) 1999--2009 Glen Prideaux <glenprideaux@iname.com>, | 6 (c) 1999--2009 Glen Prideaux <glenprideaux@iname.com>, |
7 Han-Wen Nienhuys <hanwen@xs4all.nl>, | 7 Han-Wen Nienhuys <hanwen@xs4all.nl>, |
8 Jan Nieuwenhuizen <janneke@gnu.org> | 8 Jan Nieuwenhuizen <janneke@gnu.org> |
9 */ | 9 */ |
10 | |
11 #include "context.hh" | 10 #include "context.hh" |
12 #include "engraver.hh" | 11 #include "engraver.hh" |
13 #include "international.hh" | 12 #include "international.hh" |
14 #include "item.hh" | 13 #include "item.hh" |
15 #include "lyric-extender.hh" | 14 #include "lyric-extender.hh" |
16 #include "note-head.hh" | 15 #include "note-head.hh" |
17 #include "pointer-group-interface.hh" | 16 #include "pointer-group-interface.hh" |
18 #include "stream-event.hh" | 17 #include "stream-event.hh" |
19 #include "warn.hh" | 18 #include "warn.hh" |
20 #include "spanner.hh" | 19 #include "spanner.hh" |
| 20 #include "paper-column.hh" |
21 | 21 |
22 #include "translator.icc" | 22 #include "translator.icc" |
23 | 23 |
24 void completize_extender (Spanner *sp); | 24 void completize_extender (Spanner *sp); |
25 | 25 |
26 class Extender_engraver : public Engraver | 26 class Extender_engraver : public Engraver |
27 { | 27 { |
28 Stream_event *ev_; | 28 Stream_event *ev_; |
29 Spanner *extender_; | 29 Spanner *extender_; |
30 Spanner *pending_extender_; | 30 Spanner *pending_extender_; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 Grob *h = voice ? get_current_note_head (voice) : 0; | 92 Grob *h = voice ? get_current_note_head (voice) : 0; |
93 | 93 |
94 if (h) | 94 if (h) |
95 { | 95 { |
96 if (extender_) | 96 if (extender_) |
97 { | 97 { |
98 Pointer_group_interface::add_grob (extender_, | 98 Pointer_group_interface::add_grob (extender_, |
99 ly_symbol2scm ("heads"), h); | 99 ly_symbol2scm ("heads"), h); |
100 } | 100 } |
101 | 101 |
102 » if (pending_extender_) | 102 if (pending_extender_) |
103 » { | 103 { |
104 » Pointer_group_interface::add_grob (pending_extender_, | 104 Pointer_group_interface::add_grob (pending_extender_, |
105 » » » » » » ly_symbol2scm ("heads"), h); | 105 ly_symbol2scm ("heads"), h); |
106 if (!melisma_busy (voice) && !current_lyric_is_skip_) | 106 /* |
107 { | 107 The following check addresses the case where the lyrics end before |
108 completize_extender (pending_extender_); | 108 the associated voice. The current_lyric_is_skip_ check is |
109 pending_extender_ = 0; | 109 necessary to handle manual melismata, which should not result in |
110 } | 110 extenders being completized. We also need to make sure that we're
not |
111 » } | 111 in the middle of a note (happens when this function is called beca
use |
112 » } | 112 of an event in a voice other than our associated one). |
| 113 */ |
| 114 if (!melisma_busy (voice) && !current_lyric_is_skip_) |
| 115 { |
| 116 Moment now = voice->now_mom (); |
| 117 Paper_column *column = (dynamic_cast<Item *> (h))->get_column ()
; |
| 118 Moment *start_mom = column ? unsmob_moment (column->get_property
("when")) : 0; |
| 119 if (!column || (start_mom->main_part_ == now.main_part_)) |
| 120 { |
| 121 completize_extender (pending_extender_); |
| 122 pending_extender_ = 0; |
| 123 } |
| 124 } |
| 125 } |
| 126 } |
113 else | 127 else |
114 { | 128 { |
115 if (pending_extender_ | 129 if (pending_extender_ |
116 && !get_property ("extendersOverRests")) | 130 && !get_property ("extendersOverRests")) |
117 { | 131 { |
118 completize_extender (pending_extender_); | 132 completize_extender (pending_extender_); |
119 pending_extender_ = 0; | 133 pending_extender_ = 0; |
120 } | 134 } |
121 ·········· | 135 ·········· |
122 } | 136 } |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 | 184 |
171 /* create */ | 185 /* create */ |
172 "LyricExtender ", | 186 "LyricExtender ", |
173 | 187 |
174 /* read */ | 188 /* read */ |
175 "extendersOverRests ", | 189 "extendersOverRests ", |
176 | 190 |
177 /* write */ | 191 /* write */ |
178 "" | 192 "" |
179 ); | 193 ); |
LEFT | RIGHT |