]> git.donarmstrong.com Git - lilypond.git/blob - lily/rest-collision-engraver.cc
* configure.in (--enable-std-vector): New option.
[lilypond.git] / lily / rest-collision-engraver.cc
1 /*
2   rest-collision-engraver.cc -- implement Rest_collision_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #include "warn.hh"
10 #include "engraver.hh"
11 #include "rest-collision.hh"
12 #include "note-column.hh"
13
14 class Rest_collision_engraver : public Engraver
15 {
16   Item *rest_collision_;
17   int rest_count_;
18   Link_array<Grob> note_columns_;
19 protected:
20   DECLARE_ACKNOWLEDGER (note_column);
21   void process_acknowledged ();
22   void stop_translation_timestep ();
23 public:
24   TRANSLATOR_DECLARATIONS (Rest_collision_engraver);
25 };
26
27 Rest_collision_engraver::Rest_collision_engraver ()
28 {
29   rest_collision_ = 0;
30   rest_count_ = 0;
31 }
32
33 void
34 Rest_collision_engraver::process_acknowledged ()
35 {
36   if (rest_collision_
37       || note_columns_.empty ()
38       || !rest_count_
39       || (note_columns_.size () == rest_count_
40           && rest_count_ < 2))
41     return;
42
43   rest_collision_ = make_item ("RestCollision", SCM_EOL);
44
45   for (vsize i = 0; i < note_columns_.size (); i++)
46     Rest_collision::add_column (rest_collision_, note_columns_[i]);
47 }
48
49 void
50 Rest_collision_engraver::acknowledge_note_column (Grob_info i)
51 {
52   note_columns_.push_back (i.grob ());
53   if (Note_column::has_rests (i.grob ()))
54     rest_count_++;
55 }
56
57 void
58 Rest_collision_engraver::stop_translation_timestep ()
59 {
60   rest_collision_ = 0;
61   note_columns_.clear ();
62   rest_count_ = 0;
63 }
64
65 #include "translator.icc"
66
67 ADD_ACKNOWLEDGER (Rest_collision_engraver, note_column);
68 ADD_TRANSLATOR (Rest_collision_engraver,
69                 /* doc */ "Handles collisions of rests.",
70                 /* create */ "RestCollision",
71                 /* accept */ "",
72                 /* read */ "",
73                 /* write */ "");