[Top][All Lists]
[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)
- Allows beam collision to be turned off for certain interfaces. (issue4339053),
mtsolo <=