lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Allows beam collision to be turned off for certain interfaces. (issue433


From: mtsolo
Subject: Allows beam collision to be turned off for certain interfaces. (issue4339053)
Date: Tue, 05 Apr 2011 11:17:01 +0000

Reviewers: ,

Message:
After some discussion on devel, it seems like a suitable thing to do in
the beam collision engraver would be to provide an opt-out for beam
collision.  Irrespective of how the stem thing winds up getting
resolved, I think it's a good idea to be able to switch avoidance on and
off so that users are not boxed into beam-collision if they don't want
it (i.e. in the quotation of other lines of music).

As always, comments and regtest checks are appreciated.

Cheers,
Mike

Description:
Allows beam collision to be turned off for certain interfaces.

Please review this at http://codereview.appspot.com/4339053/

Affected files:
  A input/regression/beam-collision-off.ly
  M lily/beam-collision-engraver.cc
  M lily/beam.cc
  M scm/define-grob-properties.scm
  M scm/define-grobs.scm


Index: input/regression/beam-collision-off.ly
diff --git a/input/regression/beam-collision-off.ly b/input/regression/beam-collision-off.ly
new file mode 100644
index 0000000000000000000000000000000000000000..b8b4ae1027d0438d82b80deebff4ada959efadbf
--- /dev/null
+++ b/input/regression/beam-collision-off.ly
@@ -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, ]
+}
\ No newline at end of file
Index: lily/beam-collision-engraver.cc
diff --git a/lily/beam-collision-engraver.cc b/lily/beam-collision-engraver.cc index a12311602cc5ff1c5ffc579f9823dbe6b5b9888a..ee383404eaa7e404c5422161d8a69f98ec31be9c 100644
--- a/lily/beam-collision-engraver.cc
+++ b/lily/beam-collision-engraver.cc
@@ -38,12 +38,31 @@ 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");
+  bool has_interface = false;
+
+  for (SCM l = interfaces; scm_is_pair (l); l = scm_cdr (l))
+    {
+ has_interface = has_interface || covered_grob->internal_has_interface (scm_car (l));
+      if (has_interface)
+        break;
+    }
+
+  return has_interface;
+}
+
 void
 Beam_collision_engraver::finalize ()
 {
@@ -65,7 +84,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: lily/beam.cc
diff --git a/lily/beam.cc b/lily/beam.cc
index 6fbd71d7d6a6d4ddcda0a7fbd7782f8e6eef43c4..6ae2ed4819bd43d75c03869a5be7085abf56b9ee 100644
--- a/lily/beam.cc
+++ b/lily/beam.cc
@@ -1818,6 +1818,7 @@ ADD_INTERFACE (Beam,
               "break-overshoot "
               "clip-edges "
               "concaveness "
+              "collision-interfaces "
               "covered-grobs "
               "damping "
               "details "
Index: scm/define-grob-properties.scm
diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm
index 83b327413dc1cb2eca4b3ea79283b1a79e21ab31..c097eb46f530ad5afa97e1306c653d79266f69a4 100644
--- a/scm/define-grob-properties.scm
+++ b/scm/define-grob-properties.scm
@@ -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 the interfaces with
+which a beam should not collide.")
      (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: scm/define-grobs.scm
diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm
index ab2a87ae3f862eb26565c2c7efb36a6ca5acf426..83336748509f9849e574e2735a3a96b13023c86d 100644
--- a/scm/define-grobs.scm
+++ b/scm/define-grobs.scm
@@ -349,6 +349,12 @@

        (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)





reply via email to

[Prev in Thread] Current Thread [Next in Thread]