]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/beam-collision-engraver.cc
Fix printing of our manuals (CSS messup, forgot to update the definitions when the...
[lilypond.git] / lily / beam-collision-engraver.cc
index 0f89eac89e8dc69484f7bfe336023981a4840536..fa829325593d7cd3beb45037bc22267c6ea5ae7c 100644 (file)
@@ -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,6 +31,7 @@ protected:
   vector<Grob_info> covered_grobs_;
 
   DECLARE_ACKNOWLEDGER (note_head);
+  DECLARE_ACKNOWLEDGER (stem);
   DECLARE_ACKNOWLEDGER (accidental);
   DECLARE_ACKNOWLEDGER (clef);
   DECLARE_ACKNOWLEDGER (key_signature);
@@ -74,6 +76,7 @@ Beam_collision_engraver::finalize ()
   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 ();
@@ -88,8 +91,7 @@ Beam_collision_engraver::finalize ()
           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.
@@ -101,17 +103,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 +128,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)
 {
@@ -158,6 +169,7 @@ 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);
@@ -165,15 +177,15 @@ ADD_ACKNOWLEDGER (Beam_collision_engraver, time_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 */
+                ""
+               );