]> git.donarmstrong.com Git - lilypond.git/blob - lily/collision-engraver.cc
* flower/include/pqueue.hh: Derive from std::vector.
[lilypond.git] / lily / collision-engraver.cc
1 /*
2   collision-engraver.cc -- implement 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 "engraver.hh"
10 #include "note-column.hh"
11 #include "note-collision.hh"
12 #include "axis-group-interface.hh"
13
14 class Collision_engraver : public Engraver
15 {
16   Item *col_;
17   Link_array__Grob_ note_columns_;
18
19 protected:
20   DECLARE_ACKNOWLEDGER (note_column);
21   void process_acknowledged ();
22   void stop_translation_timestep ();
23 public:
24   TRANSLATOR_DECLARATIONS (Collision_engraver);
25 };
26
27 void
28 Collision_engraver::process_acknowledged ()
29 {
30   if (col_ || note_columns_.size () < 2)
31     return;
32   if (!col_)
33     col_ = make_item ("NoteCollision", SCM_EOL);
34
35   for (vsize i = 0; i < note_columns_.size (); i++)
36     Note_collision_interface::add_column (col_, note_columns_[i]);
37 }
38
39 void
40 Collision_engraver::acknowledge_note_column (Grob_info i)
41 {
42   if (Note_column::has_interface (i.grob ()))
43     {
44       /*should check Y axis? */
45       if (Note_column::has_rests (i.grob ()) || i.grob ()->get_parent (X_AXIS))
46         return;
47
48       note_columns_.push_back (i.grob ());
49     }
50 }
51
52 void
53 Collision_engraver::stop_translation_timestep ()
54 {
55   col_ = 0;
56   note_columns_.clear ();
57 }
58
59 Collision_engraver::Collision_engraver ()
60 {
61   col_ = 0;
62 }
63
64 #include "translator.icc"
65
66 ADD_ACKNOWLEDGER (Collision_engraver, note_column);
67
68 ADD_TRANSLATOR (Collision_engraver,
69                 /* doc */ "Collect NoteColumns, and as soon as there are two or more, put them in a NoteCollision object.",
70                 /* create */ "NoteCollision",
71                 /* accept */ "",
72                 /* read */ "",
73                 /* write */ "");