]> git.donarmstrong.com Git - lilypond.git/blob - lily/glissando-engraver.cc
* ly/engraver-init.ly (VoiceContext): move Note_head_line_engraver
[lilypond.git] / lily / glissando-engraver.cc
1 /*   
2   note-head-line-engraver.cc -- implement Note_head_line_engraver
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 2000--2003 Jan Nieuwenhuizen <janneke@gnu.org>
7  */
8
9 #include "warn.hh"
10 #include "event.hh"
11 #include "spanner.hh"
12 #include "rhythmic-head.hh"
13 #include "engraver.hh"
14
15 /**
16    Create line-spanner grobs for glissandi lines that connect note
17    heads.
18 */
19 class Glissando_engraver : public Engraver
20 {
21 public:
22   TRANSLATOR_DECLARATIONS(Glissando_engraver);
23
24 protected:
25   virtual void acknowledge_grob (Grob_info);
26   virtual void finalize ();
27   virtual void stop_translation_timestep ();
28   virtual bool try_music (Music *);
29   virtual void process_music ();
30 private:
31   Spanner *line_; 
32   Spanner *last_line_; 
33   Music* event_;
34 };
35
36 Glissando_engraver::Glissando_engraver ()
37 {
38   last_line_ = line_ = 0;
39   event_ = 0;
40 }
41
42 bool
43 Glissando_engraver::try_music (Music* m)
44 {
45   if (!event_)
46     {
47       event_ = m;
48       return true;
49     }
50   return false;
51 }
52
53 void
54 Glissando_engraver::process_music ()
55 {
56   if (event_)
57     {
58       last_line_ = line_;
59       
60       line_ = new Spanner (get_property ("Glissando"));
61       announce_grob (line_, event_->self_scm ());
62     }
63 }
64
65
66 void
67 Glissando_engraver::acknowledge_grob (Grob_info info)
68 {
69   if (Rhythmic_head::has_interface (info.grob_))
70     {
71       Grob * g = info.grob_;
72       if (line_)
73         line_->set_bound (LEFT, g);
74
75       if (last_line_)
76         last_line_->set_bound (RIGHT, g);
77     }    
78 }
79
80
81 void
82 Glissando_engraver::stop_translation_timestep ()
83 {
84   if (last_line_ && last_line_->get_bound (RIGHT))
85     {
86       typeset_grob (last_line_);
87       last_line_ =0;
88     }
89
90   last_line_ = line_;
91   line_ = 0;
92   event_ = 0;
93 }
94
95 void
96 Glissando_engraver::finalize ()
97 {
98   if (line_)
99     {
100       String msg = _("Unterminated glissando.");
101       
102       if (event_)
103         event_->origin ()->warning (msg);
104       else
105         warning (msg);
106       
107       line_->suicide ();
108       line_ =0;
109     }
110 }
111
112
113
114 ENTER_DESCRIPTION(Glissando_engraver,
115 /* descr */       "Engrave a glissandi",
116 /* creats*/       "Glissando",
117 /* accepts */     "glissando-event",
118 /* acks  */       "rhythmic-head-interface",
119 /* reads */       "followVoice",
120 /* write */       "");