/*
- ligature-engraver.cc -- implement Ligature_engraver
+ This file is part of LilyPond, the GNU music typesetter.
- source file of the GNU LilyPond music typesetter
+ Copyright (C) 2002--2015 Juergen Reuter <reuter@ipd.uka.de>
- (c) 2002--2006 Juergen Reuter <reuter@ipd.uka.de>
+ 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 "ligature-engraver.hh"
#include "rest.hh"
#include "spanner.hh"
#include "stream-event.hh"
-#include "warn.hh"
-
#include "translator.icc"
/*
* produce a single connected graphical object of fixed width,
* consisting of noteheads and other primitives. Space may be
* inserted only after each ligature, if necessary, but in no case
- * between the primitives of the ligature. Accidentals have to be put
+ * between the primitives of the ligature. The same approach is
+ * used for Kievan notation ligatures, or, rather melismas.
+ * Though these are not single connected objects, they behave much
+ * in the same way and have a fixed, small amount of space between
+ * noteheads. Except in Kievan "ligatures", accidentals have to be put
* to the left of the ligature, and not to the left of individual
- * noteheads. Class Coherent_ligature_engraver is the common
+ * noteheads. In Kievan ligatures, the B-flat may be part of the
+ * ligature itself. Class Coherent_ligature_engraver is the common
* superclass for all of these engravers.
*
* The second category is for engravers that are relaxed in the sense
Ligature_engraver::listen_ligature (Stream_event *ev)
{
Direction d = to_dir (ev->get_property ("span-direction"));
- events_drul_[d] = ev;
+ ASSIGN_EVENT_ONCE (events_drul_[d], ev);
}
void
if (events_drul_[STOP])
{
if (!ligature_)
- {
- events_drul_[STOP]->origin ()->warning (_ ("can't find start of ligature"));
- return;
- }
+ {
+ events_drul_[STOP]->origin ()->warning (_ ("cannot find start of ligature"));
+ return;
+ }
if (!last_bound_)
- events_drul_[STOP]->origin ()->warning (_ ("no right bound"));
+ events_drul_[STOP]->origin ()->warning (_ ("no right bound"));
else
- ligature_->set_bound (RIGHT, last_bound_);
+ ligature_->set_bound (RIGHT, last_bound_);
prev_start_event_ = 0;
finished_primitives_ = primitives_;
primitives_.clear ();
ligature_ = 0;
}
- last_bound_ = unsmob_grob (get_property ("currentMusicalColumn"));
+ last_bound_ = unsmob<Grob> (get_property ("currentMusicalColumn"));
if (ligature_)
{
if (events_drul_[START])
{
if (ligature_)
- {
- events_drul_[START]->origin ()->warning (_ ("already have a ligature"));
- return;
- }
+ {
+ events_drul_[START]->origin ()->warning (_ ("already have a ligature"));
+ return;
+ }
prev_start_event_ = events_drul_[START];
ligature_ = create_ligature_spanner ();
- Grob *bound = unsmob_grob (get_property ("currentMusicalColumn"));
+ Grob *bound = unsmob<Grob> (get_property ("currentMusicalColumn"));
if (!bound)
- events_drul_[START]->origin ()->warning (_ ("no left bound"));
+ events_drul_[START]->origin ()->warning (_ ("no left bound"));
else
- ligature_->set_bound (LEFT, bound);
+ ligature_->set_bound (LEFT, bound);
ligature_start_mom_ = now_mom ();
- // TODO: dump cause into make_item/spanner.
+ // TODO: dump cause into make_item/spanner.
// announce_grob (ligature_, events_drul_[START]->self_scm ());
}
}
if (finished_ligature_)
{
if (!finished_primitives_.size ())
- {
- finished_ligature_->programming_error ("Ligature_engraver::stop_translation_timestep (): "
- "junking empty ligature");
- }
+ {
+ finished_ligature_->programming_error ("Ligature_engraver::stop_translation_timestep ():"
+ " junking empty ligature");
+ }
else
- {
- typeset_ligature (finished_ligature_, finished_primitives_);
- finished_primitives_.clear ();
- }
+ {
+ typeset_ligature (finished_ligature_, finished_primitives_);
+ finished_primitives_.clear ();
+ }
finished_ligature_ = 0;
}
}
void
-Ligature_engraver::acknowledge_note_head (Grob_info info)
+Ligature_engraver::acknowledge_ligature_head (Grob_info info)
{
if (ligature_)
{
primitives_.push_back (info);
- if (info.grob () && (brew_ligature_primitive_proc != SCM_EOL))
- {
- info.grob ()->set_property ("stencil", brew_ligature_primitive_proc);
- }
+ if (info.grob () && !scm_is_null (brew_ligature_primitive_proc))
+ info.grob ()->set_property ("stencil", brew_ligature_primitive_proc);
}
}