]> git.donarmstrong.com Git - lilypond.git/blob - lily/glissando-engraver.cc
6368e05a09554f9549c501431ae6e9f4eed873ee
[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--2006 Jan Nieuwenhuizen <janneke@gnu.org>
7 */
8
9 #include "engraver.hh"
10 #include "international.hh"
11 #include "rhythmic-head.hh"
12 #include "spanner.hh"
13 #include "stream-event.hh"
14 #include "warn.hh"
15
16 #include "translator.icc"
17
18 /**
19    Create line-spanner grobs for glissandi lines that connect note
20    heads.
21 */
22 class Glissando_engraver : public Engraver
23 {
24 public:
25   TRANSLATOR_DECLARATIONS (Glissando_engraver);
26
27 protected:
28   DECLARE_TRANSLATOR_LISTENER (glissando);
29   DECLARE_ACKNOWLEDGER (rhythmic_head);
30   virtual void finalize ();
31
32   void stop_translation_timestep ();
33   void process_music ();
34 private:
35   Spanner *line_;
36   Spanner *last_line_;
37   Stream_event *event_;
38 };
39
40 Glissando_engraver::Glissando_engraver ()
41 {
42   last_line_ = line_ = 0;
43   event_ = 0;
44 }
45
46 IMPLEMENT_TRANSLATOR_LISTENER (Glissando_engraver, glissando);
47 void
48 Glissando_engraver::listen_glissando (Stream_event *ev)
49 {
50   ASSIGN_EVENT_ONCE (event_, ev);
51 }
52
53 void
54 Glissando_engraver::process_music ()
55 {
56   if (event_)
57     line_ = make_spanner ("Glissando", event_->self_scm ());
58 }
59
60 void
61 Glissando_engraver::acknowledge_rhythmic_head (Grob_info info)
62 {
63   Grob *g = info.grob ();
64   if (line_)
65     line_->set_bound (LEFT, g);
66
67   if (last_line_)
68     last_line_->set_bound (RIGHT, g);
69 }
70
71 void
72 Glissando_engraver::stop_translation_timestep ()
73 {
74   if (last_line_ && last_line_->get_bound (RIGHT))
75     last_line_ = 0;
76   if (line_)
77     {
78       if (last_line_)
79         programming_error ("overwriting glissando");
80       last_line_ = line_;
81     }
82   line_ = 0;
83   event_ = 0;
84 }
85
86 void
87 Glissando_engraver::finalize ()
88 {
89   if (line_)
90     {
91       string msg = _ ("unterminated glissando");
92
93       if (event_)
94         event_->origin ()->warning (msg);
95       else
96         warning (msg);
97
98       line_->suicide ();
99       line_ = 0;
100     }
101 }
102
103 ADD_ACKNOWLEDGER (Glissando_engraver, rhythmic_head);
104 ADD_TRANSLATOR (Glissando_engraver,
105                 /* doc */ "Engrave a glissandi",
106                 /* create */ "Glissando",
107                 /* accept */ "glissando-event",
108                 /* read */ "followVoice",
109                 /* write */ "");