]> git.donarmstrong.com Git - lilypond.git/blob - lily/glissando-engraver.cc
* lily/include/translator.hh (class Translator): remove
[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   DECLARE_ACKNOWLEDGER(rhythmic_head);
25   virtual void finalize ();
26   void stop_translation_timestep ();
27   virtual bool try_music (Music *);
28   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_rhythmic_head (Grob_info info)
63 {
64   Grob *g = info.grob ();
65   if (line_)
66     line_->set_bound (LEFT, g);
67
68   if (last_line_)
69     last_line_->set_bound (RIGHT, g);
70 }
71
72 void
73 Glissando_engraver::stop_translation_timestep ()
74 {
75   if (last_line_ && last_line_->get_bound (RIGHT))
76     {
77       last_line_ = 0;
78     }
79   if (line_)
80     {
81       if (last_line_)
82         programming_error ("overwriting glissando");
83       last_line_ = line_;
84     }
85   line_ = 0;
86   event_ = 0;
87 }
88
89 void
90 Glissando_engraver::finalize ()
91 {
92   if (line_)
93     {
94       String msg = _ ("unterminated glissando");
95
96       if (event_)
97         event_->origin ()->warning (msg);
98       else
99         warning (msg);
100
101       line_->suicide ();
102       line_ = 0;
103     }
104 }
105
106 #include "translator.icc"
107
108 ADD_ACKNOWLEDGER(Glissando_engraver,rhythmic_head);
109 ADD_TRANSLATOR (Glissando_engraver,
110                 /* descr */ "Engrave a glissandi",
111                 /* creats*/ "Glissando",
112                 /* accepts */ "glissando-event",
113                 /* reads */ "followVoice",
114                 /* write */ "");