]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/beam-collision-engraver.cc
Imported Upstream version 2.16.0
[lilypond.git] / lily / beam-collision-engraver.cc
index cdb4be6270dad054ee13c8a8d55d88e52ef12285..b700dc733d39c1ac25d8905186eb8194582139bb 100644 (file)
@@ -1,7 +1,7 @@
 /*
   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
@@ -37,6 +37,7 @@ protected:
   DECLARE_ACKNOWLEDGER (key_signature);
   DECLARE_ACKNOWLEDGER (time_signature);
   DECLARE_ACKNOWLEDGER (beam);
+  DECLARE_ACKNOWLEDGER (flag);
 
   virtual void finalize ();
 
@@ -77,6 +78,14 @@ Beam_collision_engraver::finalize ()
     {
       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 ();
@@ -88,6 +97,9 @@ 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<int> covered_grob_spanned_rank = covered_grob->spanned_rank_interval ();
@@ -159,6 +171,12 @@ 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)
 {
@@ -174,18 +192,19 @@ 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, 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 */
+                ""
+               );