]> git.donarmstrong.com Git - lilypond.git/blob - lily/glissando-engraver.cc
* The grand 2005-2006 replace.
[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 "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     line_ = make_spanner ("Glissando", event_->self_scm ());
57 }
58
59 void
60 Glissando_engraver::acknowledge_rhythmic_head (Grob_info info)
61 {
62   Grob *g = info.grob ();
63   if (line_)
64     line_->set_bound (LEFT, g);
65
66   if (last_line_)
67     last_line_->set_bound (RIGHT, g);
68 }
69
70 void
71 Glissando_engraver::stop_translation_timestep ()
72 {
73   if (last_line_ && last_line_->get_bound (RIGHT))
74     last_line_ = 0;
75   if (line_)
76     {
77       if (last_line_)
78         programming_error ("overwriting glissando");
79       last_line_ = line_;
80     }
81   line_ = 0;
82   event_ = 0;
83 }
84
85 void
86 Glissando_engraver::finalize ()
87 {
88   if (line_)
89     {
90       String msg = _ ("unterminated glissando");
91
92       if (event_)
93         event_->origin ()->warning (msg);
94       else
95         warning (msg);
96
97       line_->suicide ();
98       line_ = 0;
99     }
100 }
101
102 #include "translator.icc"
103
104 ADD_ACKNOWLEDGER (Glissando_engraver, rhythmic_head);
105 ADD_TRANSLATOR (Glissando_engraver,
106                 /* doc */ "Engrave a glissandi",
107                 /* create */ "Glissando",
108                 /* accept */ "glissando-event",
109                 /* read */ "followVoice",
110                 /* write */ "");