]> git.donarmstrong.com Git - lilypond.git/commitdiff
Allows users to opt out of beam collision on an interface by interface basis.
authorMike Solomon <mike@apollinemike.com>
Tue, 5 Apr 2011 20:55:28 +0000 (16:55 -0400)
committerMike Solomon <mike@apollinemike.com>
Tue, 5 Apr 2011 20:55:28 +0000 (16:55 -0400)
This is controlled by the property collision-interfaces, which is a list
of interfaces to which automatic collision resolution will be applied.

input/regression/beam-collision-off.ly [new file with mode: 0644]
lily/beam-collision-engraver.cc
lily/beam.cc
scm/define-grob-properties.scm
scm/define-grobs.scm

diff --git a/input/regression/beam-collision-off.ly b/input/regression/beam-collision-off.ly
new file mode 100644 (file)
index 0000000..b0a020f
--- /dev/null
@@ -0,0 +1,32 @@
+\version "2.13.47"
+\header {
+  texidoc = "Beams can be allowed to collide with grobs by overriding
+the collision-interfaces property."
+}
+
+\relative c' {
+  c8 [ des' ]
+  \once \override Beam #'collision-interfaces = #'(beam-interface
+                                                   clef-interface
+                                                   ;inline-accidental-interface
+                                                   key-signature-interface
+                                                   note-head-interface
+                                                   time-signature-interface)
+  c,8 [ des'! ]
+  c, [ \key des \major d ]
+  \once \override Beam #'collision-interfaces = #'(beam-interface
+                                                   clef-interface
+                                                   inline-accidental-interface
+                                                   ;key-signature-interface
+                                                   note-head-interface
+                                                   time-signature-interface)
+  c [ \key c \major d ]
+  g [ \grace { a [ d ] } g, ]
+  \once \override Beam #'collision-interfaces = #'(;beam-interface
+                                                   clef-interface
+                                                   inline-accidental-interface
+                                                   key-signature-interface
+                                                   note-head-interface
+                                                   time-signature-interface)
+  g [ \grace { a [ d ] } g, ]
+}
index a12311602cc5ff1c5ffc579f9823dbe6b5b9888a..5e9006f9b6f62ee1a2420d0e950caaaf5682593b 100644 (file)
@@ -38,12 +38,29 @@ protected:
 
   virtual void finalize ();
 
+private:
+  bool covered_grob_has_interface (Grob *covered_grob, Grob *beam);
+
 public:
   TRANSLATOR_DECLARATIONS (Beam_collision_engraver);
 };
 
 Beam_collision_engraver::Beam_collision_engraver () {}
 
+bool
+Beam_collision_engraver::covered_grob_has_interface (Grob *covered_grob, Grob *beam)
+{
+  SCM interfaces = beam->get_property ("collision-interfaces");
+
+  for (SCM l = interfaces; scm_is_pair (l); l = scm_cdr (l))
+    {
+      if (covered_grob->internal_has_interface (scm_car (l)));
+        return true;
+    }
+
+  return false;
+}
+
 void
 Beam_collision_engraver::finalize ()
 {
@@ -65,7 +82,8 @@ Beam_collision_engraver::finalize ()
       for (vsize j = start; j < covered_grobs_.size (); j++)
         {
           Interval_t<int> covered_grob_spanned_rank = covered_grobs_[j]->spanned_rank_interval ();
-          if (covered_grob_spanned_rank[LEFT] > beam_spanned_rank_[RIGHT])
+          if ((covered_grob_spanned_rank[LEFT] > beam_spanned_rank_[RIGHT]
+              || !covered_grob_has_interface (covered_grobs_[j], beams_[i])))
             break;
           /*
              Only consider grobs whose end falls at or after the beam's beginning.
index 6fbd71d7d6a6d4ddcda0a7fbd7782f8e6eef43c4..6ae2ed4819bd43d75c03869a5be7085abf56b9ee 100644 (file)
@@ -1818,6 +1818,7 @@ ADD_INTERFACE (Beam,
               "break-overshoot "
               "clip-edges "
               "concaveness "
+              "collision-interfaces "
               "covered-grobs "
               "damping "
               "details "
index 83b327413dc1cb2eca4b3ea79283b1a79e21ab31..62d7cf070c14fab3791b193a90c262c266a17c21 100644 (file)
@@ -170,6 +170,8 @@ hairpins (al/del niente).")
 edges of beams?")
      (collapse-height ,ly:dimension? "Minimum height of system start
 delimiter.  If equal or smaller, the bracket/brace/line is removed.")
+     (collision-interfaces ,list? "A list of interfaces for which
+automatic beam-collision resolution is run.")
      (color ,color? "The color of this grob.")
      (common-shortest-duration ,ly:moment? "The most common shortest
 note length.  This is used in spacing.  Enlarging this sets the score
@@ -184,7 +186,6 @@ this grob looks as a continued break.")
 control points for the tie, slur, or bracket shape.  For B@'eziers,
 this should list the control points of a third-order B@'ezier curve.")
 
-
 ;;
 ;; d
 ;;
index ab2a87ae3f862eb26565c2c7efb36a6ca5acf426..83336748509f9849e574e2735a3a96b13023c86d 100644 (file)
 
        (beaming . ,ly:beam::calc-beaming)
        (clip-edges . #t)
+       (collision-interfaces . (beam-interface
+                                clef-interface
+                                inline-accidental-interface
+                                key-signature-interface
+                                note-head-interface
+                                time-signature-interface))
        (concaveness . ,ly:beam::calc-concaveness)
        (cross-staff . ,ly:beam::calc-cross-staff)
        (damping . 1)