X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbeam-collision-engraver.cc;h=35ef3e315184ea06aff9ee872a4a5811bfc73cac;hb=66aa1ea2486653a85857e863d24de2c3777189e3;hp=0f89eac89e8dc69484f7bfe336023981a4840536;hpb=069bab10a0735111453d9b3b45b9aff26b1d750b;p=lilypond.git diff --git a/lily/beam-collision-engraver.cc b/lily/beam-collision-engraver.cc index 0f89eac89e..35ef3e3151 100644 --- a/lily/beam-collision-engraver.cc +++ b/lily/beam-collision-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2011 Mike Solomon + Copyright (C) 2011--2014 Mike Solomon LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,6 +22,7 @@ #include "item.hh" #include "note-head.hh" #include "pointer-group-interface.hh" +#include "stem.hh" class Beam_collision_engraver : public Engraver { @@ -30,11 +31,14 @@ protected: vector covered_grobs_; DECLARE_ACKNOWLEDGER (note_head); + DECLARE_ACKNOWLEDGER (stem); DECLARE_ACKNOWLEDGER (accidental); DECLARE_ACKNOWLEDGER (clef); + DECLARE_ACKNOWLEDGER (clef_modifier); DECLARE_ACKNOWLEDGER (key_signature); DECLARE_ACKNOWLEDGER (time_signature); DECLARE_ACKNOWLEDGER (beam); + DECLARE_ACKNOWLEDGER (flag); virtual void finalize (); @@ -74,6 +78,15 @@ Beam_collision_engraver::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 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 beam_spanned_rank_ = beam_grob->spanned_rank_interval (); @@ -85,11 +98,13 @@ Beam_collision_engraver::finalize () 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 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. @@ -101,17 +116,20 @@ Beam_collision_engraver::finalize () && !(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); } } } @@ -123,6 +141,12 @@ Beam_collision_engraver::acknowledge_note_head (Grob_info i) 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) { @@ -142,12 +166,24 @@ Beam_collision_engraver::acknowledge_key_signature (Grob_info i) covered_grobs_.push_back (i); } +void +Beam_collision_engraver::acknowledge_clef_modifier (Grob_info i) +{ + covered_grobs_.push_back (i); +} + void Beam_collision_engraver::acknowledge_time_signature (Grob_info i) { 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) { @@ -158,22 +194,25 @@ Beam_collision_engraver::acknowledge_beam (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, time_signature); +ADD_ACKNOWLEDGER (Beam_collision_engraver, clef_modifier); +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 */ + "" + );