]> git.donarmstrong.com Git - lilypond.git/commitdiff
Adds stem avoidance to the beam collision engraver.
authorMike Solomon <mike@apollinemike.com>
Sat, 9 Apr 2011 01:27:11 +0000 (21:27 -0400)
committerMike Solomon <mike@apollinemike.com>
Sat, 9 Apr 2011 01:27:11 +0000 (21:27 -0400)
input/regression/beam-collision-grace.ly
lily/beam-collision-engraver.cc
scm/define-grobs.scm

index 49d038919219fa82f21220893bc0a92ae47dac30..e4a30c5acab5733b014fca441c5ba6a67a898a90 100644 (file)
@@ -1,6 +1,6 @@
 
 
-\version "2.13.49"
+\version "2.13.57"
 
 \header { texidoc = "
 The beaming algorithm handles collisions between beams and
@@ -11,3 +11,6 @@ grace notes too.
  e'8[ f  e \grace { f,16[ a] } e'8]
 }
 
+\relative c'{
+ d16 e f \grace d'8 g,16
+}
\ No newline at end of file
index 0f89eac89e8dc69484f7bfe336023981a4840536..8880e9c6e34bf68c306fe9d47005fac3e280a3fd 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);
@@ -104,14 +106,16 @@ Beam_collision_engraver::finalize ()
                    && (covered_grob_spanned_rank[LEFT] <= beam_spanned_rank_[LEFT])))
             {
               // 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 +127,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 +168,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);
index 83336748509f9849e574e2735a3a96b13023c86d..0be8fb44fd1f5c140f456d63e6912028f9e941fc 100644 (file)
                                 inline-accidental-interface
                                 key-signature-interface
                                 note-head-interface
+                                stem-interface
                                 time-signature-interface))
        (concaveness . ,ly:beam::calc-concaveness)
        (cross-staff . ,ly:beam::calc-cross-staff)