]> git.donarmstrong.com Git - lilypond.git/blob - lily/concurrent-hairpin-engraver.cc
Web-ja: update introduction
[lilypond.git] / lily / concurrent-hairpin-engraver.cc
1 /*
2   This file is part of LilyPond, the GNU music typesetter.
3
4   Copyright (C) 2011--2015 Mike Solomon <mike@mikesolomon.org>
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 "engraver.hh"
21
22 #include "international.hh"
23 #include "pointer-group-interface.hh"
24 #include "spanner.hh"
25 #include "stream-event.hh"
26 #include "warn.hh"
27 #include "item.hh"
28
29 #include "translator.icc"
30
31 class Concurrent_hairpin_engraver : public Engraver
32 {
33 public:
34   TRANSLATOR_DECLARATIONS (Concurrent_hairpin_engraver);
35
36 protected:
37   void acknowledge_hairpin (Grob_info);
38   void acknowledge_end_hairpin (Grob_info);
39
40   void stop_translation_timestep ();
41   void finalize ();
42
43 private:
44   vector<Grob *> arriving_hairpins_;
45   vector<Grob *> departing_hairpins_;
46   vector<Grob *> hairpins_hanging_out_;
47 };
48
49 Concurrent_hairpin_engraver::Concurrent_hairpin_engraver (Context *c)
50   : Engraver (c)
51 {
52 }
53
54 void
55 Concurrent_hairpin_engraver::acknowledge_hairpin (Grob_info info)
56 {
57   arriving_hairpins_.push_back (info.grob ());
58 }
59
60 void
61 Concurrent_hairpin_engraver::acknowledge_end_hairpin (Grob_info info)
62 {
63   departing_hairpins_.push_back (info.grob ());
64 }
65
66 void
67 Concurrent_hairpin_engraver::stop_translation_timestep ()
68 {
69   for (vsize i = 0; i < departing_hairpins_.size (); i++)
70     for (vsize j = 0; j < hairpins_hanging_out_.size (); j++)
71       if (departing_hairpins_[i] == hairpins_hanging_out_[j])
72         {
73           hairpins_hanging_out_.erase (hairpins_hanging_out_.begin () + j);
74           break;
75         }
76   if (arriving_hairpins_.size ())
77     {
78       if (arriving_hairpins_.size () > 1)
79         for (vsize i = 0; i < arriving_hairpins_.size () - 1; i++)
80           for (vsize j = i + 1; j < arriving_hairpins_.size (); j++)
81             {
82               Pointer_group_interface::add_grob (arriving_hairpins_[i], ly_symbol2scm ("concurrent-hairpins"), arriving_hairpins_[j]);
83               Pointer_group_interface::add_grob (arriving_hairpins_[j], ly_symbol2scm ("concurrent-hairpins"), arriving_hairpins_[i]);
84             }
85
86       for (vsize i = 0; i < arriving_hairpins_.size (); i++)
87         for (vsize j = 0; j < hairpins_hanging_out_.size (); j++)
88           {
89             Pointer_group_interface::add_grob (arriving_hairpins_[i], ly_symbol2scm ("concurrent-hairpins"), hairpins_hanging_out_[j]);
90             Pointer_group_interface::add_grob (hairpins_hanging_out_[j], ly_symbol2scm ("concurrent-hairpins"), arriving_hairpins_[i]);
91           }
92     }
93   hairpins_hanging_out_.insert (hairpins_hanging_out_.end (), arriving_hairpins_.begin (), arriving_hairpins_.end ());
94   arriving_hairpins_.resize (0);
95   departing_hairpins_.resize (0);
96 }
97
98 void
99 Concurrent_hairpin_engraver::finalize ()
100 {
101   hairpins_hanging_out_.resize (0);
102 }
103
104
105 void
106 Concurrent_hairpin_engraver::boot ()
107 {
108   ADD_ACKNOWLEDGER (Concurrent_hairpin_engraver, hairpin);
109   ADD_END_ACKNOWLEDGER (Concurrent_hairpin_engraver, hairpin);
110 }
111
112 ADD_TRANSLATOR (Concurrent_hairpin_engraver,
113                 /* doc */
114                 "Collect concurrent hairpins.",
115
116                 /* create */
117                 "",
118
119                 /* read */
120                 "",
121
122                 /* write */
123                 ""
124                );