Left: | ||
Right: |
LEFT | RIGHT |
---|---|
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) 1999--2015 Glen Prideaux <glenprideaux@iname.com>, | 4 Copyright (C) 1999--2015 Glen Prideaux <glenprideaux@iname.com>, |
5 Han-Wen Nienhuys <hanwen@xs4all.nl>, | 5 Han-Wen Nienhuys <hanwen@xs4all.nl>, |
6 Jan Nieuwenhuizen <janneke@gnu.org> | 6 Jan Nieuwenhuizen <janneke@gnu.org> |
7 | 7 |
8 LilyPond is free software: you can redistribute it and/or modify | 8 LilyPond is free software: you can redistribute it and/or modify |
9 it under the terms of the GNU General Public License as published by | 9 it under the terms of the GNU General Public License as published by |
10 the Free Software Foundation, either version 3 of the License, or | 10 the Free Software Foundation, either version 3 of the License, or |
(...skipping 12 matching lines...) Expand all Loading... | |
23 #include "engraver.hh" | 23 #include "engraver.hh" |
24 #include "international.hh" | 24 #include "international.hh" |
25 #include "item.hh" | 25 #include "item.hh" |
26 #include "lyric-extender.hh" | 26 #include "lyric-extender.hh" |
27 #include "note-head.hh" | 27 #include "note-head.hh" |
28 #include "pointer-group-interface.hh" | 28 #include "pointer-group-interface.hh" |
29 #include "stream-event.hh" | 29 #include "stream-event.hh" |
30 #include "warn.hh" | 30 #include "warn.hh" |
31 #include "spanner.hh" | 31 #include "spanner.hh" |
32 #include "translator.icc" | 32 #include "translator.icc" |
33 #include "iostream" | |
dak
2017/02/06 19:08:17
Why?
| |
33 | 34 |
34 void completize_extender (Spanner *sp); | 35 void completize_extender (Spanner *sp); |
35 | 36 |
36 class Extender_engraver : public Engraver | 37 class Extender_engraver : public Engraver |
37 { | 38 { |
38 Stream_event *ev_; | 39 Stream_event *syllable_; |
40 Stream_event *ex_; | |
41 Stream_event *hy_; | |
39 Spanner *extender_; | 42 Spanner *extender_; |
40 Spanner *pending_extender_; | 43 Spanner *pending_extender_; |
41 | 44 |
42 public: | 45 public: |
43 TRANSLATOR_DECLARATIONS (Extender_engraver); | 46 TRANSLATOR_DECLARATIONS (Extender_engraver); |
44 | 47 |
45 protected: | 48 protected: |
49 void listen_lyric (Stream_event *); | |
46 void listen_extender (Stream_event *); | 50 void listen_extender (Stream_event *); |
51 void listen_hyphen (Stream_event *); | |
47 void listen_completize_extender (Stream_event *); | 52 void listen_completize_extender (Stream_event *); |
48 void acknowledge_lyric_syllable (Grob_info); | 53 void acknowledge_lyric_syllable (Grob_info); |
49 | 54 |
50 virtual void finalize (); | 55 virtual void finalize (); |
51 | 56 |
52 void stop_translation_timestep (); | 57 void stop_translation_timestep (); |
53 void process_music (); | 58 void process_music (); |
54 }; | 59 }; |
55 | 60 |
56 Extender_engraver::Extender_engraver () | 61 Extender_engraver::Extender_engraver (Context *c) |
57 { | 62 : Engraver (c) |
63 { | |
64 syllable_ = 0; | |
58 extender_ = 0; | 65 extender_ = 0; |
59 pending_extender_ = 0; | 66 pending_extender_ = 0; |
60 ev_ = 0; | 67 ex_ = 0; |
68 hy_ = 0; | |
69 } | |
70 | |
71 void | |
72 Extender_engraver::listen_lyric (Stream_event *ev) | |
73 { | |
74 if (robust_scm2string (ev->get_property ("text"), "") != " ") | |
75 syllable_ = ev; | |
61 } | 76 } |
62 | 77 |
63 void | 78 void |
64 Extender_engraver::listen_extender (Stream_event *ev) | 79 Extender_engraver::listen_extender (Stream_event *ev) |
65 { | 80 { |
66 ASSIGN_EVENT_ONCE (ev_, ev); | 81 ASSIGN_EVENT_ONCE (ex_, ev); |
82 } | |
83 | |
84 void | |
85 Extender_engraver::listen_hyphen (Stream_event *ev) | |
86 { | |
87 ASSIGN_EVENT_ONCE (hy_, ev); | |
dak
2017/02/06 19:08:17
If we are not the primary engraver for an item, we
| |
67 } | 88 } |
68 | 89 |
69 /* | 90 /* |
70 A CompletizeExtenderEvent is sent at the end of each lyrics block | 91 A CompletizeExtenderEvent is sent at the end of each lyrics block |
71 to ensure any pending extender can be correctly terminated if the lyrics | 92 to ensure any pending extender can be correctly terminated if the lyrics |
72 end before the associated voice (this prevents the right bound being extended | 93 end before the associated voice (this prevents the right bound being extended |
73 to the next note-column if no lyric follows the extender) | 94 to the next note-column if no lyric follows the extender) |
74 */ | 95 */ |
75 void | 96 void |
76 Extender_engraver::listen_completize_extender (Stream_event * /* ev */) | 97 Extender_engraver::listen_completize_extender (Stream_event * /* ev */) |
77 { | 98 { |
78 if (pending_extender_) | 99 if (pending_extender_) |
79 { | 100 { |
80 completize_extender (pending_extender_); | 101 completize_extender (pending_extender_); |
81 pending_extender_ = 0; | 102 pending_extender_ = 0; |
82 } | 103 } |
83 } | 104 } |
84 | 105 |
85 void | 106 void |
86 Extender_engraver::process_music () | 107 Extender_engraver::process_music () |
87 { | 108 { |
88 if (ev_) | 109 if (ex_ && !hy_) |
dak
2017/02/06 19:08:17
Why check for hy_ here? If there is an explicit e
| |
89 extender_ = make_spanner ("LyricExtender", ev_->self_scm ()); | 110 { |
111 extender_ = make_spanner ("LyricExtender", ex_->self_scm ()); | |
112 extender_->set_property ("force-extender", SCM_BOOL_T); | |
dak
2017/02/06 19:08:17
I think it might make more sense to have, if at al
| |
113 } | |
114 else if (syllable_ && !hy_) | |
115 extender_ = make_spanner ("LyricExtender", syllable_->self_scm ()); | |
90 } | 116 } |
91 | 117 |
92 void | 118 void |
93 Extender_engraver::acknowledge_lyric_syllable (Grob_info i) | 119 Extender_engraver::acknowledge_lyric_syllable (Grob_info i) |
94 { | 120 { |
95 Item *item = i.item (); | 121 Item *item = i.item (); |
96 if (extender_) | 122 if (extender_) |
97 extender_->set_bound (LEFT, item); | 123 extender_->set_bound (LEFT, item); |
98 | 124 |
99 if (pending_extender_) | 125 if (pending_extender_) |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
135 pending_extender_ = 0; | 161 pending_extender_ = 0; |
136 } | 162 } |
137 } | 163 } |
138 if (extender_) | 164 if (extender_) |
139 { | 165 { |
140 pending_extender_ = extender_; | 166 pending_extender_ = extender_; |
141 extender_ = 0; | 167 extender_ = 0; |
142 } | 168 } |
143 } | 169 } |
144 | 170 |
145 ev_ = 0; | 171 ex_ = 0; |
172 hy_ = 0; | |
173 syllable_ = 0; | |
146 } | 174 } |
147 | 175 |
148 void | 176 void |
149 completize_extender (Spanner *sp) | 177 completize_extender (Spanner *sp) |
150 { | 178 { |
151 if (!sp->get_bound (RIGHT)) | 179 if (!sp->get_bound (RIGHT)) |
152 { | 180 { |
153 extract_item_set (sp, "heads", heads); | 181 extract_item_set (sp, "heads", heads); |
154 if (heads.size ()) | 182 if (heads.size ()) |
155 sp->set_bound (RIGHT, heads.back ()); | 183 sp->set_bound (RIGHT, heads.back ()); |
(...skipping 12 matching lines...) Expand all Loading... | |
168 if (pending_extender_) | 196 if (pending_extender_) |
169 { | 197 { |
170 completize_extender (pending_extender_); | 198 completize_extender (pending_extender_); |
171 pending_extender_ = 0; | 199 pending_extender_ = 0; |
172 } | 200 } |
173 } | 201 } |
174 | 202 |
175 void | 203 void |
176 Extender_engraver::boot () | 204 Extender_engraver::boot () |
177 { | 205 { |
206 ADD_LISTENER (Extender_engraver, lyric); | |
178 ADD_LISTENER (Extender_engraver, extender); | 207 ADD_LISTENER (Extender_engraver, extender); |
208 ADD_LISTENER (Extender_engraver, hyphen); | |
179 ADD_LISTENER (Extender_engraver, completize_extender); | 209 ADD_LISTENER (Extender_engraver, completize_extender); |
180 ADD_ACKNOWLEDGER (Extender_engraver, lyric_syllable); | 210 ADD_ACKNOWLEDGER (Extender_engraver, lyric_syllable); |
181 } | 211 } |
182 | 212 |
183 ADD_TRANSLATOR (Extender_engraver, | 213 ADD_TRANSLATOR (Extender_engraver, |
184 /* doc */ | 214 /* doc */ |
185 "Create lyric extenders.", | 215 "Create lyric extenders.", |
186 | 216 |
187 /* create */ | 217 /* create */ |
188 "LyricExtender ", | 218 "LyricExtender ", |
189 | 219 |
190 /* read */ | 220 /* read */ |
191 "extendersOverRests ", | 221 "extendersOverRests ", |
192 | 222 |
193 /* write */ | 223 /* write */ |
194 "" | 224 "" |
195 ); | 225 ); |
LEFT | RIGHT |