lilypond-devel
[Top][All Lists]
Advanced

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

Implement spacing-pair for MeasureCounter (issue 319610043 by address@hi


From: david . nalesnik
Subject: Implement spacing-pair for MeasureCounter (issue 319610043 by address@hidden)
Date: Thu, 30 Mar 2017 17:57:27 -0700

Reviewers: ,

Message:
Please review -- thanks!

Description:
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.

Please review this at https://codereview.appspot.com/319610043/

Affected files (+39, -26 lines):
  M lily/paper-column.cc
  M scm/define-grob-interfaces.scm
  M scm/define-grobs.scm
  M scm/output-lib.scm


Index: lily/paper-column.cc
diff --git a/lily/paper-column.cc b/lily/paper-column.cc
index 5462027928693c15aa9a85d00ccca134b8945173..85b60909c1bdb1fb6cf926c79da8bf42d2497f56 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 @code{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<Grob> (col), align_syms);
+  return ly_interval2scm (ext);
+}
+
 /*
Loop through elements of a PaperColumn, find all grobs implementing specified
   interface and return their combined extent.
Index: scm/define-grob-interfaces.scm
diff --git a/scm/define-grob-interfaces.scm b/scm/define-grob-interfaces.scm
index ffcfc355113af36777ec91bb8bce72930e5a870b..31188d0d8ea8156e1b762a7512522fbc39f120de 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
Index: scm/define-grobs.scm
diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm
index 45cac04bd3d65b1146beec8acdf89b42bcf8be7c..d3b4b9f06e42b73be7219067a80c9406261a2820 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)
         (meta . ((class . Spanner)
Index: scm/output-lib.scm
diff --git a/scm/output-lib.scm b/scm/output-lib.scm
index 8df9b56ef2489c4bcbd6737c71523016bf405d27..2f74918bdc7c3b292710bf170634128b23e7393f 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))






reply via email to

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