From 19520fd5bbd221ca1d35011d7710e233c92a44b0 Mon Sep 17 00:00:00 2001 From: Mike Solomon Date: Wed, 28 Dec 2011 09:15:41 +0100 Subject: [PATCH] Adds vertical skylines to slurs. This assures that objects with an outside staff priority higher than that of slurs are placed directly above the slur at their horizontal position instead of above the slur's extrema in a given direction. This is done by giving slurs vertical skylines that are the integral of their curve. Because the axis-group-interface automatically uses vertical-skylines, no extra check for this property has to be added. --- input/regression/slur-vertical-skylines.ly | 16 +++++++++++++ lily/general-scheme.cc | 12 ++++++++++ lily/include/lily-guile.hh | 1 + lily/include/slur.hh | 1 + lily/lily-guile.cc | 12 ++++++++++ lily/slur.cc | 26 ++++++++++++++++++++++ scm/define-grob-properties.scm | 2 ++ scm/define-grobs.scm | 2 ++ scm/lily.scm | 1 + scm/safe-lily.scm | 1 + 10 files changed, 74 insertions(+) create mode 100644 input/regression/slur-vertical-skylines.ly diff --git a/input/regression/slur-vertical-skylines.ly b/input/regression/slur-vertical-skylines.ly new file mode 100644 index 0000000000..3fd51838fb --- /dev/null +++ b/input/regression/slur-vertical-skylines.ly @@ -0,0 +1,16 @@ +\version "2.15.22" + +\header { + texidoc = "Slurs do not force grobs with outside-staff-priority +too high. +" +} + +\relative c' { + f8^"rit"( c' f c' f) r8 r4 | + c2( c,2 | + g1)~\startTrillSpan + g1\stopTrillSpan + g1(\f + g,1) +} \ No newline at end of file diff --git a/lily/general-scheme.cc b/lily/general-scheme.cc index 8a84062bb6..e73ab0b927 100644 --- a/lily/general-scheme.cc +++ b/lily/general-scheme.cc @@ -114,6 +114,18 @@ LY_DEFINE (ly_dir_p, "ly:dir?", return SCM_BOOL_F; } +LY_DEFINE (ly_vsize_p, "ly:vsize?", + 1, 0, 0, (SCM s), + "Is @var{s} a vsize?") +{ + if (scm_is_integer (s)) + { + int i = scm_to_int (s); + return i >= 0 ? SCM_BOOL_T : SCM_BOOL_F; + } + return SCM_BOOL_F; +} + LY_DEFINE (ly_assoc_get, "ly:assoc-get", 2, 2, 0, (SCM key, SCM alist, SCM default_value, SCM strict_checking), diff --git a/lily/include/lily-guile.hh b/lily/include/lily-guile.hh index 8e6999ca1a..0690b073dc 100644 --- a/lily/include/lily-guile.hh +++ b/lily/include/lily-guile.hh @@ -72,6 +72,7 @@ char *ly_scm2str0 (SCM str); Real robust_scm2double (SCM, double); int robust_scm2int (SCM, int); +vsize robust_scm2vsize (SCM, vsize); Direction robust_scm2dir (SCM, Direction); Drul_array robust_scm2drul (SCM, Drul_array); Drul_array robust_scm2booldrul (SCM, Drul_array); diff --git a/lily/include/slur.hh b/lily/include/slur.hh index 78659c9317..70b6821315 100644 --- a/lily/include/slur.hh +++ b/lily/include/slur.hh @@ -36,6 +36,7 @@ public: DECLARE_SCHEME_CALLBACK (calc_direction, (SCM)); DECLARE_SCHEME_CALLBACK (pure_height, (SCM, SCM, SCM)); DECLARE_SCHEME_CALLBACK (height, (SCM)); + DECLARE_SCHEME_CALLBACK (vertical_skylines, (SCM)); DECLARE_SCHEME_CALLBACK (outside_slur_callback, (SCM, SCM)); DECLARE_SCHEME_CALLBACK (pure_outside_slur_callback, (SCM, SCM, SCM, SCM)); DECLARE_SCHEME_CALLBACK (outside_slur_cross_staff, (SCM, SCM)); diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc index 6aa40f7804..6035a91983 100644 --- a/lily/lily-guile.cc +++ b/lily/lily-guile.cc @@ -565,6 +565,18 @@ robust_scm2int (SCM k, int o) return o; } +vsize +robust_scm2vsize (SCM k, vsize o) +{ + if (scm_integer_p (k) == SCM_BOOL_T) + { + o = scm_to_int (k); + if (o >= 0) + return (vsize) o; + } + return o; +} + SCM ly_rational2scm (Rational r) { diff --git a/lily/slur.cc b/lily/slur.cc index 91b4e2bb2c..6fdbb41d1b 100644 --- a/lily/slur.cc +++ b/lily/slur.cc @@ -32,6 +32,7 @@ #include "note-column.hh" #include "output-def.hh" #include "spanner.hh" +#include "skyline-pair.hh" #include "staff-symbol-referencer.hh" #include "stem.hh" #include "text-interface.hh" @@ -373,6 +374,29 @@ Slur::outside_slur_callback (SCM grob, SCM offset_scm) return scm_from_double (offset + avoidance_offset); } +MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Slur, vertical_skylines, 1, 0, ""); +SCM +Slur::vertical_skylines (SCM smob) +{ + Grob *me = unsmob_grob (smob); + vector boxes; + + if (!me) + return Skyline_pair (boxes, 0.0, X_AXIS).smobbed_copy (); + + Bezier curve = Slur::get_curve (me); + vsize box_count = robust_scm2vsize (me->get_property ("skyline-quantizing"), 10); + for (vsize i = 0; i < box_count; i++) + { + Box b; + b.add_point (curve.curve_point (i * 1.0 / box_count)); + b.add_point (curve.curve_point ((i + 1) * 1.0 / box_count)); + boxes.push_back (b); + } + + return Skyline_pair (boxes, 0.0, X_AXIS).smobbed_copy (); +} + /* * Used by Slur_engraver:: and Phrasing_slur_engraver:: */ @@ -546,8 +570,10 @@ ADD_INTERFACE (Slur, "inspect-index " "line-thickness " "note-columns " + "skyline-quantizing " "positions " "ratio " "thickness " + "vertical-skylines " ); diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index b8c4ecc900..cef87c6254 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -1098,6 +1098,8 @@ relevant for finding the @code{pure-Y-extent}.") (side-support-elements ,ly:grob-array? "The side support, an array of grobs.") + (skyline-quantizing ,ly:vsize? "The number of boxes to break a +slur into when calculating its skyline.") (slur ,ly:grob? "A pointer to a @code{Slur} object.") (spacing ,ly:grob? "The spacing spanner governing this section.") (spacing-wishes ,ly:grob-array? "An array of note spacing or staff spacing diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 4c61c7c7fe..0a9a0e7385 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -1637,6 +1637,7 @@ (springs-and-rods . ,ly:spanner::set-spacing-rods) (stencil . ,ly:slur::print) (thickness . 1.1) + (vertical-skylines . ,ly:slur::vertical-skylines) (Y-extent . ,ly:slur::height) (meta . ((class . Spanner) (interfaces . (slur-interface)))))) @@ -1794,6 +1795,7 @@ (springs-and-rods . ,ly:spanner::set-spacing-rods) (stencil . ,ly:slur::print) (thickness . 1.2) + (vertical-skylines . ,ly:slur::vertical-skylines) (Y-extent . ,ly:slur::height) (meta . ((class . Spanner) (interfaces . (slur-interface)))))) diff --git a/scm/lily.scm b/scm/lily.scm index e9f728f854..63582939c5 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -551,6 +551,7 @@ messages into errors.") (,ly:translator? . "translator") (,ly:translator-group? . "translator group") (,ly:unpure-pure-container? . "unpure/pure container") + (,ly:vsize? . "vsize") )) diff --git a/scm/safe-lily.scm b/scm/safe-lily.scm index 269e99c270..0be4f8c558 100644 --- a/scm/safe-lily.scm +++ b/scm/safe-lily.scm @@ -144,6 +144,7 @@ ly:unit ly:usage ly:version + ly:vsize? ly:warning ;; FIXME: cannot change staff size in --safe-mode -- 2.39.2