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