/*
- tie-engraver.cc -- implement Tie_engraver
+ This file is part of LilyPond, the GNU music typesetter.
- source file of the GNU LilyPond music typesetter
+ Copyright (C) 1998--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>
- (c) 1998--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ LilyPond is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ LilyPond is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
*/
#include "engraver.hh"
#include "context.hh"
-#include "grob-pitch-tuple.hh"
#include "international.hh"
#include "item.hh"
#include "note-head.hh"
Moment end_moment_;
SCM tie_definition_;
Stream_event *tie_stream_event_;
- Music *tie_event_;
+ Stream_event *tie_event_;
Head_event_tuple ()
{
void
Tie_engraver::listen_tie (Stream_event *ev)
{
- event_ = ev;
+ ASSIGN_EVENT_ONCE (event_, ev);
}
void
Tie_engraver::process_music ()
{
- for (vsize i = 0; i < heads_to_tie_.size (); i++)
- if (heads_to_tie_[i].tie_event_
- || heads_to_tie_[i].tie_stream_event_)
- {
- context ()->set_property ("tieMelismaBusy", SCM_BOOL_T);
- break;
- }
+ bool busy = event_;
+ for (vsize i = 0; !busy && i < heads_to_tie_.size (); i++)
+ busy |= (heads_to_tie_[i].tie_event_
+ || heads_to_tie_[i].tie_stream_event_);
+
+ if (busy)
+ context ()->set_property ("tieMelismaBusy", SCM_BOOL_T);
}
void
if (ly_is_equal (right_ev->get_property ("pitch"),
left_ev->get_property ("pitch")))
{
- Grob *p = new Spanner (heads_to_tie_[i].tie_definition_,
- context ()->get_grob_key ("Tie"));
+ Grob *p = new Spanner (heads_to_tie_[i].tie_definition_);
SCM cause = heads_to_tie_[i].tie_event_
? heads_to_tie_[i].tie_event_->self_scm ()
Tie::set_head (p, LEFT, th);
Tie::set_head (p, RIGHT, h);
+
+ if (is_direction (unsmob_stream_event (cause)->get_property ("direction")))
+ {
+ Direction d = to_dir (unsmob_stream_event (cause)->get_property ("direction"));
+ p->set_property ("direction", scm_from_int (d));
+ }
+
ties_.push_back (p);
heads_to_tie_.erase (heads_to_tie_.begin () + i);
}
{
context ()->set_property ("tieMelismaBusy",
ly_bool2scm (heads_to_tie_.size ()));
-
- if (!to_boolean (get_property ("tieWaitForNote")))
+
+ if (heads_to_tie_.size () && !to_boolean (get_property ("tieWaitForNote")))
{
Moment now = now_mom ();
for (vsize i = heads_to_tie_.size (); i--; )
heads_to_tie_.clear ();
for (vsize i = 0; i < ties_.size (); i++)
- typeset_tie (ties_[i]);
+ typeset_tie (ties_[i]);
ties_.clear ();
tie_column_ = 0;
SCM left_articulations = left_ev->get_property ("articulations");
- Music *tie_event = 0;
+ Stream_event *tie_event = 0;
Stream_event *tie_stream_event = event_;
for (SCM s = left_articulations;
!tie_event && !tie_stream_event && scm_is_pair (s);
s = scm_cdr (s))
{
- Music *m = unsmob_music (scm_car (s));
- if (!m)
+ Stream_event *ev = unsmob_stream_event (scm_car (s));
+ if (!ev)
continue;
- if (m->is_mus_type ("tie-event"))
- tie_event = m;
+ if (ev->in_event_class ("tie-event"))
+ tie_event = ev;
}
if (left_ev && (tie_event || tie_stream_event))
if (!wait && new_heads_to_tie.size ())
heads_to_tie_.clear ();
- // hmmm, how to do with copy() ?
+ // hmmm, how to do with copy () ?
for (vsize i = 0; i < new_heads_to_tie.size (); i++)
heads_to_tie_.push_back (new_heads_to_tie[i]);
ADD_ACKNOWLEDGER (Tie_engraver, note_head);
ADD_TRANSLATOR (Tie_engraver,
- /* doc */ "Generate ties between noteheads of equal pitch.",
+ /* doc */
+ "Generate ties between note heads of equal pitch.",
+
/* create */
"Tie "
"TieColumn ",
- /* accept */ "tie-event",
- /* read */ "tieWaitForNote",
- /* write */ "tieMelismaBusy");
+ /* read */
+ "tieWaitForNote ",
+
+ /* write */
+ "tieMelismaBusy "
+ );