+2006-09-30 Han-Wen Nienhuys <hanwen@lilypond.org>
+
+ * 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 <joeneeman@gmail.com>
* lily/page-turn-page-breaking.cc (calc_demerits): now that we allow
#ifndef INTERNATIONAL_HH
#define INTERNATIONAL_HH
+#include <stdarg.h>
+
#include "std-string.hh"
/**
--- /dev/null
+\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 }
+>>
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); \
} \
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,
-/*
- percent-repeat-iterator.hh -- declare Percent_repeat_iterator
-
- source file of the GNU LilyPond music typesetter
-
- (c) 2001--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
-*/
-
-#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 */
// 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.
vector<Grob*> heads_;
Grob *stem_;
+ void position_all ();
public:
TRANSLATOR_DECLARATIONS (New_fingering_engraver);
protected:
if (g)
{
ft.script_ = g;
+ ft.script_->set_parent (head, X_AXIS);
articulations_.push_back (ft);
-
- ft.script_->set_parent (head, X_AXIS);
}
}
void
New_fingering_engraver::stop_translation_timestep ()
+{
+ position_all();
+ stem_ = 0;
+ heads_.clear ();
+}
+
+
+void
+New_fingering_engraver::position_all ()
{
if (fingerings_.size ())
{
if (stem_ && to_boolean (script->get_property ("add-stem-support")))
Side_position_interface::add_support (script, stem_);
-
-
}
-
- stem_ = 0;
- heads_.clear ();
articulations_.clear ();
}
{
stem_ = 0;
}
+
+
ADD_ACKNOWLEDGER (New_fingering_engraver, rhythmic_head);
ADD_ACKNOWLEDGER (New_fingering_engraver, stem);
#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"
Spanner *percent_;
Spanner *percent_counter_;
+
+ Grob *first_command_column_;
+ Moment command_moment_;
+
protected:
virtual void finalize ();
DECLARE_TRANSLATOR_LISTENER (percent);
{
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);
{
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");
{
if (percent_)
{
- Grob *col = unsmob_grob (get_property ("currentCommandColumn"));
+ Grob *col = first_command_column_;
percent_->set_bound (RIGHT, col);
percent_ = 0;
}
}
-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 ()
Erik Sandberg <mandolaerik@gmail.com>
*/
-#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);
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;
"System ",
/* accept */
- "break-event",
+ "",
/* read */
"currentMusicalColumn "
source file of the GNU LilyPond music typesetter
- (c) 2000--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>, Erik Sandberg <mandolaerik@gmail.com>
+ (c) 2000--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>, Erik Sandberg
+ <mandolaerik@gmail.com>
*/
#include "bar-line.hh"
#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"
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
*/
void
Slur::auxiliary_acknowledge_extra_object (Grob_info info,
- vector<Grob*>& slurs, vector<Grob*>& end_slurs)
+ vector<Grob*> &slurs,
+ vector<Grob*> &end_slurs)
{
if (slurs.empty () && end_slurs.empty ())
return;
\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"
\consists "Phrasing_slur_engraver"
\consists "Cluster_spanner_engraver"
\consists "Slur_engraver"
+ \consists "New_fingering_engraver"
\consists "Tie_engraver"
\consists "Tuplet_engraver"
\consists "Grace_engraver"
(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)