#include "item.hh"
#include "note-head.hh"
#include "pointer-group-interface.hh"
+#include "stem.hh"
class Beam_collision_engraver : public Engraver
{
vector<Grob_info> covered_grobs_;
DECLARE_ACKNOWLEDGER (note_head);
+ DECLARE_ACKNOWLEDGER (stem);
DECLARE_ACKNOWLEDGER (accidental);
DECLARE_ACKNOWLEDGER (clef);
DECLARE_ACKNOWLEDGER (key_signature);
for (vsize i = 0; i < beams_.size (); i++)
{
Grob *beam_grob = beams_[i].grob ();
+
Context *beam_context = beams_[i].context ();
Interval_t<int> beam_spanned_rank_ = beam_grob->spanned_rank_interval ();
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.
- bool my_beam = false;
+ if (Stem::has_interface (covered_grob))
+ if (unsmob_grob (covered_grob->get_object ("beam")))
+ continue;
+
if (Grob *stem = unsmob_grob (covered_grob->get_object ("stem")))
if (Grob *beam = unsmob_grob (stem->get_object ("beam")))
if (beam == beam_grob)
- my_beam = true;
+ continue;
- if (!my_beam)
- Pointer_group_interface::add_grob (beam_grob, ly_symbol2scm ("covered-grobs"), covered_grob);
+ Pointer_group_interface::add_grob (beam_grob, ly_symbol2scm ("covered-grobs"), covered_grob);
}
}
}
covered_grobs_.push_back (i);
}
+void
+Beam_collision_engraver::acknowledge_stem (Grob_info i)
+{
+ covered_grobs_.push_back (i);
+}
+
void
Beam_collision_engraver::acknowledge_accidental (Grob_info i)
{
#include "translator.icc"
ADD_ACKNOWLEDGER (Beam_collision_engraver, note_head);
+ADD_ACKNOWLEDGER (Beam_collision_engraver, stem);
ADD_ACKNOWLEDGER (Beam_collision_engraver, accidental);
ADD_ACKNOWLEDGER (Beam_collision_engraver, clef);
ADD_ACKNOWLEDGER (Beam_collision_engraver, key_signature);
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 */
+ ""
+ );