2 ligature-bracket-engraver.cc -- implement Ligature__bracket_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 2002 Juergen Reuter <reuter@ipd.uka.de>
10 #include "musical-request.hh"
12 #include "drul-array.hh"
15 #include "score-engraver.hh"
16 #include "note-head.hh"
20 class Ligature_bracket_engraver : public Engraver
22 Drul_array<Span_req*> reqs_drul_;
24 Spanner *finished_ligature_bracket_p_;
25 Spanner *ligature_bracket_p_;
26 Span_req *prev_start_req_;
28 // moment where ligature started.
29 Moment ligature_start_mom_;
33 virtual void stop_translation_timestep ();
34 virtual void start_translation_timestep ();
35 virtual void finalize ();
37 virtual void acknowledge_grob (Grob_info);
38 virtual bool try_music (Music*);
39 virtual void process_music ();
42 TRANSLATOR_DECLARATIONS(Ligature_bracket_engraver);
45 void typeset_ligature_bracket ();
49 Ligature_bracket_engraver::Ligature_bracket_engraver ()
51 ligature_bracket_p_ = 0;
52 finished_ligature_bracket_p_ = 0;
53 reqs_drul_[LEFT] = reqs_drul_[RIGHT] = 0;
59 Ligature_bracket_engraver::try_music (Music *m)
61 if (Span_req *req_ = dynamic_cast<Span_req*> (m))
63 if (scm_equal_p (req_->get_mus_property ("span-type"),
64 ly_str02scm ("abort")) == SCM_BOOL_T)
66 reqs_drul_[START] = 0;
68 if (ligature_bracket_p_)
69 ligature_bracket_p_->suicide ();
70 ligature_bracket_p_ = 0;
72 else if (scm_equal_p (req_->get_mus_property ("span-type"),
73 ly_str02scm ("ligature-bracket")) == SCM_BOOL_T)
75 Direction d = req_->get_span_dir ();
84 Ligature_bracket_engraver::process_music ()
88 if (!ligature_bracket_p_)
89 reqs_drul_[STOP]->origin ()->warning (_ ("can't find start of ligature"));
94 reqs_drul_[STOP]->origin ()->warning (_ ("no right bound"));
98 ligature_bracket_p_->set_bound (RIGHT, last_bound);
102 finished_ligature_bracket_p_ = ligature_bracket_p_;
103 ligature_bracket_p_ = 0;
105 last_bound = unsmob_grob (get_property ("currentMusicalColumn"));
107 if (ligature_bracket_p_)
109 // TODO: maybe forbid breaks only if not transcribing
110 top_engraver ()->forbid_breaks ();
112 if (reqs_drul_[START])
114 if (ligature_bracket_p_)
116 reqs_drul_[START]->origin ()->warning (_ ("already have a ligature"));
120 prev_start_req_ = reqs_drul_[START];
121 ligature_bracket_p_ = new Spanner (get_property ("LigatureBracket"));
123 Grob *bound = unsmob_grob (get_property ("currentMusicalColumn"));
126 reqs_drul_[START]->origin ()->warning (_ ("no left bound"));
130 ligature_bracket_p_->set_bound (LEFT, bound);
133 ligature_start_mom_ = now_mom ();
135 announce_grob(ligature_bracket_p_, reqs_drul_[START]->self_scm());
140 Ligature_bracket_engraver::start_translation_timestep ()
142 reqs_drul_[START] = 0;
143 reqs_drul_[STOP] = 0;
147 Ligature_bracket_engraver::typeset_ligature_bracket ()
149 if (finished_ligature_bracket_p_)
151 typeset_grob (finished_ligature_bracket_p_);
152 finished_ligature_bracket_p_ = 0;
157 Ligature_bracket_engraver::stop_translation_timestep ()
159 typeset_ligature_bracket ();
163 Ligature_bracket_engraver::finalize ()
165 typeset_ligature_bracket ();
166 if (ligature_bracket_p_)
168 prev_start_req_->origin ()->warning (_ ("unterminated ligature"));
169 ligature_bracket_p_->suicide ();
174 Ligature_bracket_engraver::acknowledge_grob (Grob_info info)
176 if (ligature_bracket_p_)
178 if (Rest::has_interface (info.grob_l_))
180 reqs_drul_[START]->origin ()->warning (_ ("ligature may not contain rest; ignoring rest"));
181 prev_start_req_->origin ()->warning (_ ("ligature was started here"));
182 // TODO: maybe better should stop ligature here rather than
183 // ignoring the rest?
188 ENTER_DESCRIPTION(Ligature_bracket_engraver,
189 /* descr */ "Handles Ligature_requests by engraving Ligature brackets.",
190 /* creats*/ "LigatureBracket",
191 /* acks */ "rest-interface",