/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2011 Mike Solomon <mike@apollinemike.com>
+ Copyright (C) 2011--2012 Mike Solomon <mike@apollinemike.com>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
DECLARE_ACKNOWLEDGER (key_signature);
DECLARE_ACKNOWLEDGER (time_signature);
DECLARE_ACKNOWLEDGER (beam);
+ DECLARE_ACKNOWLEDGER (flag);
virtual void finalize ();
for (vsize i = 0; i < beams_.size (); i++)
{
Grob *beam_grob = beams_[i].grob ();
+
+ extract_grob_set (beam_grob, "normal-stems", stems);
+ Interval_t<int> vertical_span;
+ for (vsize j = 0; j < stems.size (); j++)
+ {
+ int vag = Grob::get_vertical_axis_group_index (stems[j]);
+ if (vag >= 0)
+ vertical_span.add_point (vag);
+ }
Context *beam_context = beams_[i].context ();
Interval_t<int> beam_spanned_rank_ = beam_grob->spanned_rank_interval ();
for (vsize j = start; j < covered_grobs_.size (); j++)
{
Grob *covered_grob = covered_grobs_[j].grob ();
+ int vag = Grob::get_vertical_axis_group_index (covered_grob);
+ if (!vertical_span.contains (vag))
+ continue;
Context *covered_grob_context = covered_grobs_[j].context ();
Interval_t<int> covered_grob_spanned_rank = covered_grob->spanned_rank_interval ();
- if ((covered_grob_spanned_rank[LEFT] > beam_spanned_rank_[RIGHT]
- || !covered_grob_has_interface (covered_grob, beam_grob)))
+ if (covered_grob_spanned_rank[LEFT] > beam_spanned_rank_[RIGHT])
break;
/*
Only consider grobs whose end falls at or after the beam's beginning.
&& !(to_boolean (beam_grob->get_property ("collision-voice-only"))
&& (covered_grob_context != beam_context))
&& !(Beam::has_interface (covered_grob)
- && (covered_grob_spanned_rank[LEFT] <= beam_spanned_rank_[LEFT])))
+ && (covered_grob_spanned_rank[LEFT] <= beam_spanned_rank_[LEFT]))
+ && covered_grob_has_interface (covered_grob, beam_grob))
{
// Do not consider note heads attached to the beam.
if (Stem::has_interface (covered_grob))
covered_grobs_.push_back (i);
}
+void
+Beam_collision_engraver::acknowledge_flag (Grob_info i)
+{
+ covered_grobs_.push_back (i);
+}
+
void
Beam_collision_engraver::acknowledge_beam (Grob_info i)
{
ADD_ACKNOWLEDGER (Beam_collision_engraver, clef);
ADD_ACKNOWLEDGER (Beam_collision_engraver, key_signature);
ADD_ACKNOWLEDGER (Beam_collision_engraver, time_signature);
+ADD_ACKNOWLEDGER (Beam_collision_engraver, flag);
ADD_ACKNOWLEDGER (Beam_collision_engraver, beam);
ADD_TRANSLATOR (Beam_collision_engraver,
- /* doc */
- "Help beams avoid colliding with notes and clefs in other voices.",
+ /* doc */
+ "Help beams avoid colliding with notes and clefs in other voices.",
- /* create */
- "",
+ /* create */
+ "",
- /* read */
- "",
+ /* read */
+ "",
- /* write */
- ""
- );
+ /* write */
+ ""
+ );