From a6efcfa82dae01859f0d6d3bbfbaaa6f2eeb8a9c Mon Sep 17 00:00:00 2001 From: Keith OHara Date: Thu, 29 Aug 2013 10:43:40 -0700 Subject: [PATCH] markup: some skylines should not follow printed shapes; issue 3522 Implement the stencil tag 'transparent to support proper skylining of stencils with extents different from their printed shapes, such as those created by \transparent and \with-dimensions, or where the printed shape is not yet known during layout, such as \page-ref. --- .../text-script-vertical-skylines.ly | 28 +++++--- lily/stencil-integral.cc | 2 + lily/stencil-interpret.cc | 2 + scm/define-markup-commands.scm | 67 +++++++++---------- scm/define-stencil-commands.scm | 1 + scm/harp-pedals.scm | 13 ++-- scm/stencil.scm | 6 ++ 7 files changed, 68 insertions(+), 51 deletions(-) diff --git a/input/regression/text-script-vertical-skylines.ly b/input/regression/text-script-vertical-skylines.ly index a32818cb6e..3657bc274d 100644 --- a/input/regression/text-script-vertical-skylines.ly +++ b/input/regression/text-script-vertical-skylines.ly @@ -1,13 +1,23 @@ -\version "2.16.0" +\version "2.17.21" \header { - texidoc = "By default, @code{TextScript} vertical skylines allow -for stack @code{TextScript} grobs to fit snugly over each other instead -of moving the entire distance of the bounding box. -" + texidoc = "@code{TextScript}s are spaced closely, following outlines of +the stencil. When markup commands like @code{pad-around} and +@code{with-dimensions} change the extent of a stencil, these changed +extents have effect in the stencil outline used to place the resulting +@code{TextScript}." } -\relative c' { - a^\markup { \filled-box #'(0 . 2) #'(0 . 20) #0 hello} - a^\markup { world } -} \ No newline at end of file +{ + g'2^\markup { g \line {. . . .} } + e'^\markup { e } + + g'2^\markup { g \transparent \line {. . . .} } + e'^\markup { e } + + g'2^\markup { g \pad-around #0.5 \line{. . . .} } + e'^\markup { e } + + g'2^\markup { g \with-dimensions #'(-0 . 0) #'(-0 . 0) \line {. . . .} } + e'^\markup { e } +} diff --git a/lily/stencil-integral.cc b/lily/stencil-integral.cc index dbd11f890e..4ae14e4609 100644 --- a/lily/stencil-integral.cc +++ b/lily/stencil-integral.cc @@ -953,6 +953,8 @@ stencil_traverser (PangoMatrix trans, SCM expr) return stencil_traverser (trans, scm_caddr (expr)); else if (scm_car (expr) == ly_symbol2scm ("color")) return stencil_traverser (trans, scm_caddr (expr)); + else if (scm_car (expr) == ly_symbol2scm ("transparent-stencil")) + return stencil_traverser (trans, scm_cadr (expr)); else if (scm_car (expr) == ly_symbol2scm ("id")) return stencil_traverser (trans, scm_caddr (expr)); else diff --git a/lily/stencil-interpret.cc b/lily/stencil-interpret.cc index ee5dce0b00..734eb60806 100644 --- a/lily/stencil-interpret.cc +++ b/lily/stencil-interpret.cc @@ -37,6 +37,8 @@ interpret_stencil_expression (SCM expr, interpret_stencil_expression (scm_force (scm_cadr (expr)), func, func_arg, o); return; } + if (head == ly_symbol2scm ("transparent-stencil")) + return; if (head == ly_symbol2scm ("footnote")) return; if (head == ly_symbol2scm ("translate-stencil")) diff --git a/scm/define-markup-commands.scm b/scm/define-markup-commands.scm index d5aef11140..88d33ecda9 100644 --- a/scm/define-markup-commands.scm +++ b/scm/define-markup-commands.scm @@ -503,19 +503,18 @@ only works in the PDF backend. (let* ((arg-stencil (interpret-markup layout props arg)) (x-ext (ly:stencil-extent arg-stencil X)) (y-ext (ly:stencil-extent arg-stencil Y))) - (ly:make-stencil - `(delay-stencil-evaluation - ,(delay (ly:stencil-expr - (let* ((table (ly:output-def-lookup layout 'label-page-table)) + (ly:stencil-add + (ly:make-stencil + `(delay-stencil-evaluation + ,(delay (let* ((table (ly:output-def-lookup layout 'label-page-table)) (page-number (if (list? table) (assoc-get label table) - #f)) - (link-expr (list 'page-link page-number - `(quote ,x-ext) `(quote ,y-ext)))) - (ly:stencil-add (ly:make-stencil link-expr x-ext y-ext) - arg-stencil))))) - x-ext - y-ext))) + #f))) + (list 'page-link page-number + `(quote ,x-ext) `(quote ,y-ext))))) + x-ext + y-ext) + arg-stencil))) (define-markup-command (beam layout props width slope thickness) @@ -705,6 +704,7 @@ Provide a white background for @var{arg}. @cindex putting space around text Add space around a markup object. +Identical to @code{pad-around}. @lilypond[verbatim,quote] \\markup { @@ -719,15 +719,11 @@ Add space around a markup object. } } @end lilypond" - (let* - ((stil (interpret-markup layout props arg)) - (xext (ly:stencil-extent stil X)) - (yext (ly:stencil-extent stil Y))) - - (ly:make-stencil - (ly:stencil-expr stil) - (interval-widen xext amount) - (interval-widen yext amount)))) + (let* ((m (interpret-markup layout props arg)) + (x (interval-widen (ly:stencil-extent m X) amount)) + (y (interval-widen (ly:stencil-extent m Y) amount))) + (ly:stencil-add (make-transparent-box-stencil x y) + m))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; space @@ -1965,8 +1961,12 @@ alignment accordingly. @cindex setting extent of text objects Set the dimensions of @var{arg} to @var{x} and@tie{}@var{y}." - (let* ((m (interpret-markup layout props arg))) - (ly:make-stencil (ly:stencil-expr m) x y))) + (let* ((expr (ly:stencil-expr (interpret-markup layout props arg)))) + (ly:stencil-add + (make-transparent-box-stencil x y) + (ly:make-stencil + `(delay-stencil-evaluation ,(delay expr)) + x y)))) (define-markup-command (pad-around layout props amount arg) (number? markup?) @@ -1987,11 +1987,10 @@ Set the dimensions of @var{arg} to @var{x} and@tie{}@var{y}." } @end lilypond" (let* ((m (interpret-markup layout props arg)) - (x (ly:stencil-extent m X)) - (y (ly:stencil-extent m Y))) - (ly:make-stencil (ly:stencil-expr m) - (interval-widen x amount) - (interval-widen y amount)))) + (x (interval-widen (ly:stencil-extent m X) amount)) + (y (interval-widen (ly:stencil-extent m Y) amount))) + (ly:stencil-add (make-transparent-box-stencil x y) + m))) (define-markup-command (pad-x layout props amount arg) (number? markup?) @@ -2044,7 +2043,7 @@ Add padding @var{amount} around @var{arg} in the X@tie{}direction. (let* ((m (interpret-markup layout props arg)) (x (ly:stencil-extent m X)) (y (ly:stencil-extent m Y))) - (ly:make-stencil "" x y))) + (ly:make-stencil (list 'transparent-stencil (ly:stencil-expr m)) x y))) (define-markup-command (pad-to-box layout props x-ext y-ext arg) (number-pair? number-pair? markup?) @@ -2064,12 +2063,8 @@ Add padding @var{amount} around @var{arg} in the X@tie{}direction. } } @end lilypond" - (let* ((m (interpret-markup layout props arg)) - (x (ly:stencil-extent m X)) - (y (ly:stencil-extent m Y))) - (ly:make-stencil (ly:stencil-expr m) - (interval-union x-ext x) - (interval-union y-ext y)))) + (ly:stencil-add (make-transparent-box-stencil x-ext y-ext) + (interpret-markup layout props arg))) (define-markup-command (hcenter-in layout props length arg) (number? markup?) @@ -3811,7 +3806,7 @@ an inverted glyph. Note that within music, one would usually use the (if (eqv? direction DOWN) (markup #:musicglyph "scripts.dfermata") (markup #:musicglyph "scripts.ufermata")))) - + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; translating. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -4155,6 +4150,8 @@ when @var{label} is not found." (let* ((gauge-stencil (interpret-markup layout props gauge)) (x-ext (ly:stencil-extent gauge-stencil X)) (y-ext (ly:stencil-extent gauge-stencil Y))) + (ly:stencil-add + (make-transparent-box-stencil x-ext y-ext)) (ly:make-stencil `(delay-stencil-evaluation ,(delay (ly:stencil-expr diff --git a/scm/define-stencil-commands.scm b/scm/define-stencil-commands.scm index dffb578c6e..a0a18603c2 100644 --- a/scm/define-stencil-commands.scm +++ b/scm/define-stencil-commands.scm @@ -67,6 +67,7 @@ are used internally in @file{lily/@/stencil-interpret.cc}." rotate-stencil scale-stencil translate-stencil + transparent-stencil )) (map ly:register-stencil-expression diff --git a/scm/harp-pedals.scm b/scm/harp-pedals.scm index c245c82477..ea5db93f18 100644 --- a/scm/harp-pedals.scm +++ b/scm/harp-pedals.scm @@ -124,13 +124,12 @@ spacing after the divider). (final-x (car result)) (stencils (cdr result))) ;; Add the horizontal line and combine all stencils: - (box-stencil - (apply ly:stencil-add - (cons - (make-line-stencil line-width 0 0 final-x 0) - stencils)) - 0.0 - 0.0))) + (apply ly:stencil-add + (make-line-stencil line-width 0 0 final-x 0) ; the horizontal line + (make-transparent-box-stencil ; space for absent boxes + (cons 0 final-x) + (interval-widen '(0 . 0) (+ box-hheight dy))) + stencils))) ;; Parse the harp pedal definition string into list of directions (-1/0/1), #\o and #\| (define (harp-pedals-parse-string definition-string) diff --git a/scm/stencil.scm b/scm/stencil.scm index 77a40026c0..65852fc305 100644 --- a/scm/stencil.scm +++ b/scm/stencil.scm @@ -181,6 +181,12 @@ the more angular the shape of the parenthesis." (interval-widen xext (/ width 2)) (interval-widen yext (/ width 2))))) +(define-public (make-transparent-box-stencil xext yext) + "Make a transparent box." + (ly:make-stencil + (list 'transparent-stencil + (ly:stencil-expr (make-filled-box-stencil xext yext))) + xext yext)) (define-public (make-filled-box-stencil xext yext) "Make a filled box." -- 2.39.2