From 192b0bcc1b2d5396b0f2ff53798dc33c571152ae Mon Sep 17 00:00:00 2001 From: David Nalesnik Date: Thu, 30 Mar 2017 12:44:20 -0500 Subject: [PATCH] Issue 5111: Implement spacing-pair for MeasureCounter Since MeasureCounter grobs are bounded by columns, sophisticated horizontal positioning is available relative to "prefatory materials" (such as barlines, clefs, and key signatures) at the beginning and end of measures. This allows numbers to be placed above full-measure rests which have been similarly adjusted with 'spacing-pair. The previous default is established in the grob description: count objects are centered between BreakAlignment grobs. Paper_column::break_align_width is made available to Scheme as ly:paper-column:break-align-width. A regression test is provided. --- .../measure-counter-spacing-pair.ly | 57 +++++++++++++++++++ lily/paper-column.cc | 16 ++++++ scm/define-grob-interfaces.scm | 3 +- scm/define-grobs.scm | 1 + scm/output-lib.scm | 45 +++++++-------- 5 files changed, 96 insertions(+), 26 deletions(-) create mode 100644 input/regression/measure-counter-spacing-pair.ly diff --git a/input/regression/measure-counter-spacing-pair.ly b/input/regression/measure-counter-spacing-pair.ly new file mode 100644 index 0000000000..0bef0b11aa --- /dev/null +++ b/input/regression/measure-counter-spacing-pair.ly @@ -0,0 +1,57 @@ +\version "2.19.59" + +\header { + texidoc = "The @code{spacing-pair} property may be used to adjust +the horizontal positioning of @code{MeasureCounter} objects relative to +prefatory material. In the following example, the count should be +aligned with the full-measure rests. +" +} + +\layout { + ragged-right = ##t + \context { + \Staff + \consists #Measure_counter_engraver + } +} + +music = { + \key bes \major + \time 3/4 + R2. +} + +{ + \startMeasureCount + \music + \override Staff.MeasureCounter.spacing-pair = + #'(staff-bar. staff-bar) + \override Staff.MultiMeasureRest.spacing-pair = + #'(staff-bar . staff-bar) + \music + \override Staff.MeasureCounter.spacing-pair = + #'(key-signature . staff-bar) + \override Staff.MultiMeasureRest.spacing-pair = + #'(key-signature . staff-bar) + \music + \override Staff.MeasureCounter.spacing-pair = + #'(time-signature . staff-bar) + \override Staff.MultiMeasureRest.spacing-pair = + #'(time-signature . staff-bar) + \music + % time-signature is used on left + \override Staff.MeasureCounter.spacing-pair = + #'((left-edge time-signature) . time-signature) + \override Staff.MultiMeasureRest.spacing-pair = + #'((left-edge time-signature) . time-signature) + \music + \break + % left-edge is used + \override Staff.MeasureCounter.spacing-pair = + #'((left-edge key-signature) . staff-bar) + \override Staff.MultiMeasureRest.spacing-pair = + #'((left-edge key-signature) . staff-bar) + \music + \stopMeasureCount +} diff --git a/lily/paper-column.cc b/lily/paper-column.cc index 5462027928..bcb4804515 100644 --- a/lily/paper-column.cc +++ b/lily/paper-column.cc @@ -226,6 +226,22 @@ Paper_column::break_align_width (Grob *me, SCM align_syms) return align->extent (p, X_AXIS); } +LY_DEFINE (ly_paper_column__break_align_width, "ly:paper-column::break-align-width", + 2, 0, 0, (SCM col, SCM align_syms), + "Determine the extent along the X-axis of a grob used for" + " break-alignment organized by column @var{col}. The grob is" + " specified by @var{align-syms}, which contains either a" + " single @code{break-align-symbol} or a list of such" + " symbols.") +{ + LY_ASSERT_SMOB (Grob, col, 1); + SCM_ASSERT_TYPE (scm_is_symbol (align_syms) || ly_is_list (align_syms), + align_syms, SCM_ARG2, __FUNCTION__, "symbol or list"); + + Interval ext = Paper_column::break_align_width (unsmob (col), align_syms); + return ly_interval2scm (ext); +} + /* Loop through elements of a PaperColumn, find all grobs implementing specified interface and return their combined extent. diff --git a/scm/define-grob-interfaces.scm b/scm/define-grob-interfaces.scm index ffcfc35511..31188d0d8e 100644 --- a/scm/define-grob-interfaces.scm +++ b/scm/define-grob-interfaces.scm @@ -204,7 +204,8 @@ accidentals)." 'measure-counter-interface "A counter for numbering measures." '(columns - count-from)) + count-from + spacing-pair)) (ly:add-interface 'metronome-mark-interface diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index cdea705c4d..e162b408b9 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -1453,6 +1453,7 @@ (outside-staff-priority . 750) (self-alignment-X . ,CENTER) (side-axis . ,Y) + (spacing-pair . (break-alignment . break-alignment)) (staff-padding . 0.5) (stencil . ,measure-counter-stencil) (Y-offset . ,side-position-interface::y-aligned-side) diff --git a/scm/output-lib.scm b/scm/output-lib.scm index 8df9b56ef2..56e348da3d 100644 --- a/scm/output-lib.scm +++ b/scm/output-lib.scm @@ -1508,43 +1508,38 @@ parent or the parent has no setting." ;; measure counter (define-public (measure-counter-stencil grob) - "Print a number for a measure count. The number is centered using -the extents of @code{BreakAlignment} grobs associated with the left and -right bounds of a @code{MeasureCounter} spanner. Broken measures are -numbered in parentheses." + "Print a number for a measure count. Broken measures are numbered in +parentheses." (let* ((num (make-simple-markup - (number->string (ly:grob-property grob 'count-from)))) + (number->string (ly:grob-property grob 'count-from)))) (orig (ly:grob-original grob)) (siblings (ly:spanner-broken-into orig)) ; have we been split? (num - (if (or (null? siblings) - (eq? grob (car siblings))) + (if (or (null? siblings) + (eq? grob (car siblings))) num (make-parenthesize-markup num))) (num (grob-interpret-markup grob num)) - (num (ly:stencil-aligned-to num X (ly:grob-property grob 'self-alignment-X))) + (num (ly:stencil-aligned-to + num X (ly:grob-property grob 'self-alignment-X))) (left-bound (ly:spanner-bound grob LEFT)) (right-bound (ly:spanner-bound grob RIGHT)) - (elts-L (ly:grob-array->list (ly:grob-object left-bound 'elements))) - (elts-R (ly:grob-array->list (ly:grob-object right-bound 'elements))) - (break-alignment-L - (filter - (lambda (elt) (grob::has-interface elt 'break-alignment-interface)) - elts-L)) - (break-alignment-R - (filter - (lambda (elt) (grob::has-interface elt 'break-alignment-interface)) - elts-R)) - (refp (ly:grob-system grob)) - (break-alignment-L-ext (ly:grob-extent (car break-alignment-L) refp X)) - (break-alignment-R-ext (ly:grob-extent (car break-alignment-R) refp X)) + (refp (ly:grob-common-refpoint left-bound right-bound X)) + (spacing-pair + (ly:grob-property grob + 'spacing-pair + '(break-alignment . break-alignment))) + (ext-L (ly:paper-column::break-align-width left-bound + (car spacing-pair))) + (ext-R (ly:paper-column::break-align-width right-bound + (cdr spacing-pair))) (num (ly:stencil-translate-axis num - (+ (interval-length break-alignment-L-ext) - (* 0.5 - (- (car break-alignment-R-ext) - (cdr break-alignment-L-ext)))) + (+ (* 0.5 (- (car ext-R) + (cdr ext-L))) + (- (cdr ext-L) + (ly:grob-relative-coordinate grob refp X))) X))) num)) -- 2.39.2