]> git.donarmstrong.com Git - lilypond.git/blob - lily/rest-collision-engraver.cc
* lily/rest.cc (polyphonic_offset_callback): new function. Do
[lilypond.git] / lily / rest-collision-engraver.cc
1 /*
2   rest-collision-reg.cc -- implement Rest_collision_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.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   virtual void acknowledge_grob (Grob_info);
21   virtual void process_acknowledged_grobs ();
22   virtual 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_grobs ()
35 {
36   if (rest_collision_
37       || note_columns_.is_empty ()
38       || !rest_count_ 
39       || (note_columns_.size () == rest_count_
40           && rest_count_  < 2))
41     return;
42
43   rest_collision_ = make_item ("RestCollision");
44
45   announce_grob(rest_collision_, SCM_EOL);
46   for (int i=0; i < note_columns_.size (); i++)
47     Rest_collision::add_column (rest_collision_,note_columns_[i]);
48 }
49
50 void
51 Rest_collision_engraver::acknowledge_grob (Grob_info i)
52 {
53   if (Note_column::has_interface (i.grob_))
54     {
55       note_columns_.push (i.grob_);
56       if (Note_column::has_rests (i.grob_))
57         rest_count_ ++;
58     }
59 }
60
61 void
62 Rest_collision_engraver::stop_translation_timestep ()
63 {
64   if (rest_collision_) 
65     {
66       typeset_grob (rest_collision_);
67       rest_collision_ = 0;
68     }
69   note_columns_.clear ();
70   rest_count_ = 0;
71 }
72
73 ENTER_DESCRIPTION(Rest_collision_engraver,
74 /* descr */       "Handles collisions of rests.",
75 /* creats*/       "RestCollision",
76 /* accepts */     "",
77 /* acks  */      "note-column-interface",
78 /* reads */       "",
79 /* write */       "");