]> git.donarmstrong.com Git - lilypond.git/blob - lily/ligature-bracket-engraver.cc
Admin: run yearly grand-replace.
[lilypond.git] / lily / ligature-bracket-engraver.cc
1 /*
2   This file is part of LilyPond, the GNU music typesetter.
3
4   Copyright (C) 2002--2011 Juergen Reuter <reuter@ipd.uka.de>
5
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
8   the Free Software Foundation, either version 3 of the License, or
9   (at your option) any later version.
10
11   LilyPond is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include "international.hh"
21
22 #include "ligature-engraver.hh"
23 #include "note-column.hh"
24 #include "tuplet-bracket.hh"
25 #include "spanner.hh"
26 #include "stream-event.hh"
27 #include "spanner.hh"
28 #include "item.hh"
29
30 #include "translator.icc"
31
32 class Ligature_bracket_engraver : public Engraver
33 {
34 protected:
35   virtual void process_music ();
36   virtual void stop_translation_timestep ();
37   DECLARE_ACKNOWLEDGER (rest);
38   DECLARE_ACKNOWLEDGER (note_column);
39   DECLARE_TRANSLATOR_LISTENER (ligature);
40 public:
41   TRANSLATOR_DECLARATIONS (Ligature_bracket_engraver);
42
43 private:
44   Drul_array<Stream_event *> events_drul_;
45   Spanner *finished_ligature_;
46   Spanner *ligature_;
47   Stream_event *previous_start_event_;
48 };
49
50 IMPLEMENT_TRANSLATOR_LISTENER (Ligature_bracket_engraver, ligature);
51 void
52 Ligature_bracket_engraver::listen_ligature (Stream_event *ev)
53 {
54   Direction d = to_dir (ev->get_property ("span-direction"));
55   ASSIGN_EVENT_ONCE (events_drul_[d], ev);
56 }
57
58 Ligature_bracket_engraver::Ligature_bracket_engraver ()
59 {
60   ligature_ = 0;
61   finished_ligature_ = 0;
62   events_drul_[LEFT] = events_drul_[RIGHT] = 0;
63   previous_start_event_ = 0;
64 }
65
66 void
67 Ligature_bracket_engraver::process_music()
68 {
69   if (events_drul_[STOP])
70     {
71       if (!ligature_)
72         {
73           events_drul_[STOP]->origin ()->warning (_ ("cannot find start of ligature"));
74           return;
75         }
76
77       finished_ligature_ = ligature_;
78       ligature_ = 0;
79       previous_start_event_ = 0;
80     }
81
82   if (events_drul_[START])
83     {
84       if (ligature_)
85         {
86           events_drul_[START]->origin ()->warning (_ ("already have a ligature"));
87           return;
88         }
89
90       previous_start_event_ = events_drul_[START];
91       ligature_ = make_spanner ("LigatureBracket", events_drul_[START]->self_scm ());
92     }
93 }
94
95 void
96 Ligature_bracket_engraver::acknowledge_note_column (Grob_info info)
97 {
98   if (ligature_)
99     {
100       Tuplet_bracket::add_column (ligature_,
101                                   info.item ());
102       add_bound_item (ligature_, info.item());
103     }
104 }
105
106 void
107 Ligature_bracket_engraver::acknowledge_rest (Grob_info info)
108 {
109   acknowledge_note_column(info);
110 }
111
112
113 void
114 Ligature_bracket_engraver::stop_translation_timestep ()
115 {
116   events_drul_[LEFT] =  
117     events_drul_[RIGHT] = 0;
118   finished_ligature_ = 0;
119 }
120
121 ADD_ACKNOWLEDGER (Ligature_bracket_engraver, rest);
122 ADD_ACKNOWLEDGER (Ligature_bracket_engraver, note_column);
123
124 ADD_TRANSLATOR (Ligature_bracket_engraver,
125                 /* doc */
126                 "Handle @code{Ligature_events} by engraving @code{Ligature}"
127                 " brackets.",
128
129                 /* create */
130                 "LigatureBracket ",
131
132                 /* read */
133                 "",
134
135                 /* write */
136                 ""
137                 );