X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbar-check-iterator.cc;h=2a3efe757c74fee0746b691a595f366e24e19d87;hb=47db9a3883d726ca53e2133a3b2298f78dd6a32e;hp=6405496abc97eb553a9e78735de85ad552897f67;hpb=a6ee9dcd388111e842064a8d46ab06c4897a00d2;p=lilypond.git diff --git a/lily/bar-check-iterator.cc b/lily/bar-check-iterator.cc index 6405496abc..2a3efe757c 100644 --- a/lily/bar-check-iterator.cc +++ b/lily/bar-check-iterator.cc @@ -1,68 +1,88 @@ -/* +/* + This file is part of LilyPond, the GNU music typesetter. - bar-check-iterator.cc -- implement Bar_check_iterator + Copyright (C) 2001--2015 Han-Wen Nienhuys - source file of the GNU LilyPond music typesetter + 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. - (c) 2001--2002 Han-Wen Nienhuys + 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 "context.hh" +#include "input.hh" +#include "international.hh" +#include "music.hh" #include "simple-music-iterator.hh" -#include "command-request.hh" -#include "translator-group.hh" /* Check bar checks. We do this outside the engravers so that you can race through the score using skipTypesetting to correct durations. - */ +*/ class Bar_check_iterator : Simple_music_iterator { public: - VIRTUAL_COPY_CONS(Bar_check_iterator); virtual void process (Moment); - Bar_check_iterator( ); - static SCM constructor_cxx_function; + Bar_check_iterator (); + DECLARE_SCHEME_CALLBACK (constructor, ()); }; IMPLEMENT_CTOR_CALLBACK (Bar_check_iterator); -Music * get_barcheck () -{ - Music *bc = new Music; - bc->set_mus_property ("iterator-ctor", Bar_check_iterator::constructor_cxx_function); - return bc; -} - -Bar_check_iterator::Bar_check_iterator() +Bar_check_iterator::Bar_check_iterator () { } void Bar_check_iterator::process (Moment m) { - Simple_music_iterator::process(m); + Simple_music_iterator::process (m); if (!m.to_bool ()) { - Translator_group *tr = report_to (); + Context *tr = get_outlet (); + + SCM check = tr->get_property ("ignoreBarChecks"); + if (to_boolean (check)) + return; SCM mp = tr->get_property ("measurePosition"); - SCM sync= tr->get_property ("barCheckSynchronize"); + SCM sync = tr->get_property ("barCheckSynchronize"); - Moment * where =unsmob_moment (mp); + Moment *where = Moment::unsmob (mp); if (!where) - return; - + return; + if (where->main_part_) - { - get_music ()->origin ()->warning (_f ("barcheck failed at: %s", - where->string ())); - if (to_boolean (sync)) - { - tr = tr->where_defined (ly_symbol2scm("measurePosition")); - Moment zero; - tr->set_property ("measurePosition", zero.smobbed_copy ()); - } - } + { + bool warn = true; + if (to_boolean (sync)) + { + SCM mp; + tr = tr->where_defined (ly_symbol2scm ("measurePosition"), &mp); + Moment zero; + tr->set_property ("measurePosition", zero.smobbed_copy ()); + } + else + { + SCM lf = tr->get_property ("barCheckLastFail"); + if (Moment::is_smob (lf) + && *Moment::unsmob (lf) == *where) + warn = false; + else + tr->set_property ("barCheckLastFail", mp); + } + + if (warn) + get_music ()->origin ()->warning (_f ("barcheck failed at: %s", + where->to_string ())); + } } -} +}