From 5f0e15c0862e3e9f024bfe1c763180e554f2e045 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Sat, 30 Sep 2006 11:29:26 +0000 Subject: [PATCH] * input/regression/repeat-percent-grace.ly: new file. * lily/percent-repeat-engraver.cc (start_translation_timestep): remember first currentCommandColumn of a grace run. Fixes issue 70. * lily/percent-repeat-iterator.cc (class Percent_repeat_iterator): move class definition to CC file. * lily/multi-measure-rest.cc (percent): use robust_relative_extent() * lily/slash-repeat-engraver.cc (listen_percent): don't warn for measure-long repeats. * flower/include/international.hh: include stdarg.h --- ChangeLog | 17 +++++++++ flower/include/international.hh | 2 ++ input/regression/repeat-percent-grace.ly | 14 ++++++++ lily/include/lily-guile-macros.hh | 7 ++-- lily/include/percent-repeat-iterator.hh | 25 -------------- lily/multi-measure-rest.cc | 6 ++-- lily/new-fingering-engraver.cc | 20 +++++++---- lily/percent-repeat-engraver.cc | 44 ++++++++++++++++-------- lily/percent-repeat-iterator.cc | 14 +++++++- lily/score-engraver.cc | 2 +- lily/slash-repeat-engraver.cc | 11 +++--- lily/slur.cc | 3 +- ly/engraver-init.ly | 2 +- scm/define-grobs.scm | 1 - 14 files changed, 108 insertions(+), 60 deletions(-) create mode 100644 input/regression/repeat-percent-grace.ly diff --git a/ChangeLog b/ChangeLog index a235bd2d78..48b257b8da 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2006-09-30 Han-Wen Nienhuys + + * input/regression/repeat-percent-grace.ly: new file. + + * lily/percent-repeat-engraver.cc (start_translation_timestep): + remember first currentCommandColumn of a grace run. Fixes issue 70. + + * lily/percent-repeat-iterator.cc (class Percent_repeat_iterator): + move class definition to CC file. + + * lily/multi-measure-rest.cc (percent): use robust_relative_extent() + + * lily/slash-repeat-engraver.cc (listen_percent): don't warn for + measure-long repeats. + + * flower/include/international.hh: include stdarg.h + 2006-09-30 Joe Neeman * lily/page-turn-page-breaking.cc (calc_demerits): now that we allow diff --git a/flower/include/international.hh b/flower/include/international.hh index 162e7ee38d..b515af64c4 100644 --- a/flower/include/international.hh +++ b/flower/include/international.hh @@ -9,6 +9,8 @@ #ifndef INTERNATIONAL_HH #define INTERNATIONAL_HH +#include + #include "std-string.hh" /** diff --git a/input/regression/repeat-percent-grace.ly b/input/regression/repeat-percent-grace.ly new file mode 100644 index 0000000000..920e21f423 --- /dev/null +++ b/input/regression/repeat-percent-grace.ly @@ -0,0 +1,14 @@ +\version "2.9.20" + +\header { + texidoc = "Percent repeats are also centered when there is a grace note in a parallel staff. " +} + +\layout { + ragged-right =##t +} + +\relative << + \new Staff { \repeat percent 3 c1} + \new Staff { c1 c \grace b8 c1 } +>> diff --git a/lily/include/lily-guile-macros.hh b/lily/include/lily-guile-macros.hh index 8374b0e247..77c4597364 100644 --- a/lily/include/lily-guile-macros.hh +++ b/lily/include/lily-guile-macros.hh @@ -96,14 +96,14 @@ inline SCM ly_symbol2scm (char const *x) { return scm_str2symbol ((x)); } Make TYPE::FUNC available as a Scheme function. */ string mangle_cxx_identifier (string); -#define MAKE_SCHEME_CALLBACK(TYPE, FUNC, ARGCOUNT) \ +#define MAKE_SCHEME_CALLBACK_WITH_OPTARGS(TYPE, FUNC, ARGCOUNT, OPTIONAL_COUNT) \ SCM TYPE ::FUNC ## _proc; \ void \ TYPE ## _ ## FUNC ## _init_functions () \ { \ string id = mangle_cxx_identifier (string (#TYPE) + "::" + string (#FUNC)); \ TYPE ::FUNC ## _proc = scm_c_define_gsubr (id.c_str(), \ - (ARGCOUNT), 0, 0, \ + (ARGCOUNT-OPTIONAL_COUNT), OPTIONAL_COUNT, 0, \ (Scheme_function_unknown) TYPE::FUNC); \ scm_c_export (id.c_str (), NULL); \ } \ @@ -111,6 +111,9 @@ string mangle_cxx_identifier (string); ADD_SCM_INIT_FUNC (TYPE ## _ ## FUNC ## _callback, \ TYPE ## _ ## FUNC ## _init_functions); +#define MAKE_SCHEME_CALLBACK(TYPE, FUNC, ARGCOUNT) \ + MAKE_SCHEME_CALLBACK_WITH_OPTARGS(TYPE,FUNC,ARGCOUNT,0); + void ly_add_function_documentation (SCM proc, char const *fname, char const *varlist, diff --git a/lily/include/percent-repeat-iterator.hh b/lily/include/percent-repeat-iterator.hh index 8637d9f7ae..e69de29bb2 100644 --- a/lily/include/percent-repeat-iterator.hh +++ b/lily/include/percent-repeat-iterator.hh @@ -1,25 +0,0 @@ -/* - percent-repeat-iterator.hh -- declare Percent_repeat_iterator - - source file of the GNU LilyPond music typesetter - - (c) 2001--2006 Han-Wen Nienhuys -*/ - -#ifndef PERCENT_REPEAT_ITERATOR_HH -#define PERCENT_REPEAT_ITERATOR_HH - -#include "sequential-iterator.hh" - -class Percent_repeat_iterator : public Sequential_iterator -{ -public: - DECLARE_CLASSNAME(Percent_repeat_iterator); - DECLARE_SCHEME_CALLBACK (constructor, ()); - Percent_repeat_iterator (); -protected: - virtual SCM get_music_list () const; -private: -}; - -#endif /* PERCENT_REPEAT_ITERATOR_HH */ diff --git a/lily/multi-measure-rest.cc b/lily/multi-measure-rest.cc index 997e76105d..0a87a137ed 100644 --- a/lily/multi-measure-rest.cc +++ b/lily/multi-measure-rest.cc @@ -32,20 +32,22 @@ Multi_measure_rest::percent (SCM smob) // ugh copy & paste. + Grob *common_x = sp->get_bound (LEFT)->common_refpoint (sp->get_bound (RIGHT), + X_AXIS); Interval sp_iv; Direction d = LEFT; do { Item *col = sp->get_bound (d)->get_column (); - Interval coldim = col->extent (0, X_AXIS); + Interval coldim = robust_relative_extent (col, common_x, X_AXIS); sp_iv[d] = coldim[-d]; } while ((flip (&d)) != LEFT); Real x_off = 0.0; - Real rx = sp->get_bound (LEFT)->relative_coordinate (0, X_AXIS); + Real rx = sp->get_bound (LEFT)->relative_coordinate (common_x, X_AXIS); /* we gotta stay clear of sp_iv, so move a bit to the right if needed. diff --git a/lily/new-fingering-engraver.cc b/lily/new-fingering-engraver.cc index 2e8c94399c..f91e804dde 100644 --- a/lily/new-fingering-engraver.cc +++ b/lily/new-fingering-engraver.cc @@ -52,6 +52,7 @@ class New_fingering_engraver : public Engraver vector heads_; Grob *stem_; + void position_all (); public: TRANSLATOR_DECLARATIONS (New_fingering_engraver); protected: @@ -120,10 +121,9 @@ New_fingering_engraver::add_script (Grob *head, if (g) { ft.script_ = g; + ft.script_->set_parent (head, X_AXIS); articulations_.push_back (ft); - - ft.script_->set_parent (head, X_AXIS); } } @@ -307,6 +307,15 @@ New_fingering_engraver::position_scripts (SCM orientations, void New_fingering_engraver::stop_translation_timestep () +{ + position_all(); + stem_ = 0; + heads_.clear (); +} + + +void +New_fingering_engraver::position_all () { if (fingerings_.size ()) { @@ -334,12 +343,7 @@ New_fingering_engraver::stop_translation_timestep () if (stem_ && to_boolean (script->get_property ("add-stem-support"))) Side_position_interface::add_support (script, stem_); - - } - - stem_ = 0; - heads_.clear (); articulations_.clear (); } @@ -347,6 +351,8 @@ New_fingering_engraver::New_fingering_engraver () { stem_ = 0; } + + ADD_ACKNOWLEDGER (New_fingering_engraver, rhythmic_head); ADD_ACKNOWLEDGER (New_fingering_engraver, stem); diff --git a/lily/percent-repeat-engraver.cc b/lily/percent-repeat-engraver.cc index 57357cb559..dc6ba4213f 100644 --- a/lily/percent-repeat-engraver.cc +++ b/lily/percent-repeat-engraver.cc @@ -14,7 +14,6 @@ #include "international.hh" #include "item.hh" #include "misc.hh" -#include "percent-repeat-iterator.hh" #include "repeated-music.hh" #include "side-position-interface.hh" #include "spanner.hh" @@ -52,6 +51,10 @@ protected: Spanner *percent_; Spanner *percent_counter_; + + Grob *first_command_column_; + Moment command_moment_; + protected: virtual void finalize (); DECLARE_TRANSLATOR_LISTENER (percent); @@ -65,8 +68,28 @@ Percent_repeat_engraver::Percent_repeat_engraver () { percent_ = 0; percent_counter_ = 0; - percent_event_ = 0; + + first_command_column_ = 0; + command_moment_ = Moment (-1); +} + +void +Percent_repeat_engraver::start_translation_timestep () +{ + if (now_mom ().main_part_ != command_moment_.main_part_) + { + first_command_column_ = unsmob_grob (get_property ("currentCommandColumn")); + command_moment_ = now_mom (); + } + + if (stop_mom_.main_part_ == now_mom ().main_part_) + { + if (percent_) + typeset_perc (); + percent_event_ = 0; + repeat_sign_type_ = UNKNOWN; + } } IMPLEMENT_TRANSLATOR_LISTENER (Percent_repeat_engraver, percent); @@ -114,9 +137,10 @@ Percent_repeat_engraver::process_music () { if (percent_) typeset_perc (); + percent_ = make_spanner ("PercentRepeat", percent_event_->self_scm ()); - Grob *col = unsmob_grob (get_property ("currentCommandColumn")); + Grob *col = first_command_column_; percent_->set_bound (LEFT, col); SCM count = percent_event_->get_property ("repeat-count"); @@ -181,7 +205,7 @@ Percent_repeat_engraver::typeset_perc () { if (percent_) { - Grob *col = unsmob_grob (get_property ("currentCommandColumn")); + Grob *col = first_command_column_; percent_->set_bound (RIGHT, col); percent_ = 0; @@ -192,17 +216,7 @@ Percent_repeat_engraver::typeset_perc () } } -void -Percent_repeat_engraver::start_translation_timestep () -{ - if (stop_mom_.main_part_ == now_mom ().main_part_) - { - if (percent_) - typeset_perc (); - percent_event_ = 0; - repeat_sign_type_ = UNKNOWN; - } -} + void Percent_repeat_engraver::stop_translation_timestep () diff --git a/lily/percent-repeat-iterator.cc b/lily/percent-repeat-iterator.cc index 27481cf1ab..495f30f33c 100644 --- a/lily/percent-repeat-iterator.cc +++ b/lily/percent-repeat-iterator.cc @@ -7,10 +7,20 @@ Erik Sandberg */ -#include "percent-repeat-iterator.hh" #include "input.hh" #include "music.hh" #include "repeated-music.hh" +#include "sequential-iterator.hh" + +class Percent_repeat_iterator : public Sequential_iterator +{ +public: + DECLARE_CLASSNAME(Percent_repeat_iterator); + DECLARE_SCHEME_CALLBACK (constructor, ()); + Percent_repeat_iterator (); +protected: + virtual SCM get_music_list () const; +}; IMPLEMENT_CTOR_CALLBACK (Percent_repeat_iterator); @@ -35,8 +45,10 @@ Percent_repeat_iterator::get_music_list () const percent->set_property ("length", length); if (repeats > 1) percent->set_property ("repeat-count", scm_int2num (i)); + child_list = scm_cons (percent->unprotect (), child_list); } + child_list = scm_cons (child->self_scm (), child_list); return child_list; diff --git a/lily/score-engraver.cc b/lily/score-engraver.cc index 09d1aa6a0f..c81c5fce6b 100644 --- a/lily/score-engraver.cc +++ b/lily/score-engraver.cc @@ -170,7 +170,7 @@ ADD_TRANSLATOR_GROUP (Score_engraver, "System ", /* accept */ - "break-event", + "", /* read */ "currentMusicalColumn " diff --git a/lily/slash-repeat-engraver.cc b/lily/slash-repeat-engraver.cc index 37595526c5..16d5c4ba5f 100644 --- a/lily/slash-repeat-engraver.cc +++ b/lily/slash-repeat-engraver.cc @@ -3,7 +3,8 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys , Erik Sandberg + (c) 2000--2006 Han-Wen Nienhuys , Erik Sandberg + */ #include "bar-line.hh" @@ -11,7 +12,6 @@ #include "international.hh" #include "item.hh" #include "misc.hh" -#include "percent-repeat-iterator.hh" #include "repeated-music.hh" #include "score-engraver.hh" #include "spanner.hh" @@ -50,8 +50,11 @@ Slash_repeat_engraver::listen_percent (Stream_event *ev) if (get_event_length (ev) < meas_length) ASSIGN_EVENT_ONCE (slash_, ev); - else - ev->origin ()->warning (_ ("Slash repeat doesn't fit in one measure, junking")); + + /* + don't warn if nothing happens: this can happen if there are whole + measure repeats. + */ } void diff --git a/lily/slur.cc b/lily/slur.cc index df529f7713..c78a066d06 100644 --- a/lily/slur.cc +++ b/lily/slur.cc @@ -266,7 +266,8 @@ Slur::outside_slur_callback (SCM grob, SCM offset_scm) */ void Slur::auxiliary_acknowledge_extra_object (Grob_info info, - vector& slurs, vector& end_slurs) + vector &slurs, + vector &end_slurs) { if (slurs.empty () && end_slurs.empty ()) return; diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly index 61bd5d7504..b7d1acfd70 100644 --- a/ly/engraver-init.ly +++ b/ly/engraver-init.ly @@ -202,7 +202,6 @@ contained staves are not connected vertically." \consists "Beam_engraver" \consists "Grace_beam_engraver" \consists "Auto_beam_engraver" - \consists "New_fingering_engraver" \consists "Chord_tremolo_engraver" \consists "Percent_repeat_engraver" \consists "Slash_repeat_engraver" @@ -219,6 +218,7 @@ contained staves are not connected vertically." \consists "Phrasing_slur_engraver" \consists "Cluster_spanner_engraver" \consists "Slur_engraver" + \consists "New_fingering_engraver" \consists "Tie_engraver" \consists "Tuplet_engraver" \consists "Grace_engraver" diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 0e9ae37693..2257b35f70 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -1300,7 +1300,6 @@ (staff-padding . 0.25) ;; (script-priority . 0) priorities for scripts, see script.scm (X-offset . , ly:self-alignment-interface::centered-on-x-parent) - (stencil . ,ly:script-interface::print) (direction . ,ly:script-interface::calc-direction) -- 2.39.2