X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fligature-engraver.cc;h=08d3b419962ab833b4ead2389083662d0a87f0a0;hb=97a0169312a260933246ab224e4f8b0969871dd5;hp=98e840b1ffaadaaeed005192c62a978da5b7afe0;hpb=c4c0ba811cd526f047de3f4d3c77abcc32a3e076;p=lilypond.git diff --git a/lily/ligature-engraver.cc b/lily/ligature-engraver.cc index 98e840b1ff..08d3b41996 100644 --- a/lily/ligature-engraver.cc +++ b/lily/ligature-engraver.cc @@ -1,9 +1,20 @@ /* - 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 - (c) 2002--2006 Juergen Reuter + 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 . */ #include "ligature-engraver.hh" @@ -14,8 +25,6 @@ #include "rest.hh" #include "spanner.hh" #include "stream-event.hh" -#include "warn.hh" - #include "translator.icc" /* @@ -35,9 +44,14 @@ * 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 @@ -68,7 +82,8 @@ * would require to have a single, complicated Ligature_engraver that * consists of all the code... This needs further thoughts. */ -Ligature_engraver::Ligature_engraver () +Ligature_engraver::Ligature_engraver (Context *c) + : Engraver (c) { ligature_ = 0; finished_ligature_ = 0; @@ -82,7 +97,7 @@ void 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 @@ -91,15 +106,15 @@ Ligature_engraver::process_music () 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_; @@ -107,7 +122,7 @@ Ligature_engraver::process_music () primitives_.clear (); ligature_ = 0; } - last_bound_ = unsmob_grob (get_property ("currentMusicalColumn")); + last_bound_ = unsmob (get_property ("currentMusicalColumn")); if (ligature_) { @@ -118,23 +133,23 @@ Ligature_engraver::process_music () 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 (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 ()); } } @@ -145,15 +160,15 @@ Ligature_engraver::stop_translation_timestep () 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; } @@ -184,15 +199,13 @@ Ligature_engraver::current_ligature () } 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); } }