-;;;; define-grobs.scm --
+;;;; This file is part of LilyPond, the GNU music typesetter.
;;;;
-;;;; source file of the GNU LilyPond music typesetter
-;;;;
-;;;; (c) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; Copyright (C) 1998--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>
;;;; Jan Nieuwenhuizen <janneke@gnu.org>
+;;;;
+;;;; LilyPond is free software: you can redistribute it and/or modify
+;;;; it under the terms of the GNU General Public License as published by
+;;;; the Free Software Foundation, either version 3 of the License, or
+;;;; (at your option) any later version.
+;;;;
+;;;; LilyPond is distributed in the hope that it will be useful,
+;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;;; GNU General Public License for more details.
+;;;;
+;;;; You should have received a copy of the GNU General Public License
+;;;; along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
;;;; distances are given in line-thickness (thicknesses) and
;;;; staff-space (distances)
(AccidentalPlacement
. (
(direction . ,LEFT)
- (left-padding . 0.2)
(positioning-done . ,ly:accidental-placement::calc-positioning-done)
;; this is quite small, but it is very ugly to have
(X-extent . ,ly:axis-group-interface::width)
(Y-extent . ,ly:axis-group-interface::height)
(meta . ((class . Item)
+ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
+ (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
+ (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
(interfaces . (ambitus-interface
axis-group-interface
break-aligned-interface))))))
(AmbitusAccidental
. (
(direction . ,LEFT)
- (font-family . music)
(glyph-name-alist . ,standard-alteration-glyph-name-alist)
(padding . 0.5)
(side-axis . ,X)
(stencil . ,ly:arpeggio::print)
(X-extent . ,ly:arpeggio::width)
(X-offset . ,ly:side-position-interface::x-aligned-side)
- (Y-extent . ,ly:arpeggio::height)
(Y-offset . ,ly:staff-symbol-referencer::callback)
(meta . ((class . Item)
(interfaces . (arpeggio-interface
(stacking-dir . ,DOWN)
(Y-extent . ,ly:axis-group-interface::height)
(meta . ((class . Spanner)
+ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
+ (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
+ (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
(interfaces . (align-interface
axis-group-interface
bass-figure-alignment-interface))))))
(Y-extent . ,ly:axis-group-interface::height)
(Y-offset . ,ly:side-position-interface::y-aligned-side)
(meta . ((class . Spanner)
+ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
+ (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
+ (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
(interfaces . (axis-group-interface
side-position-interface))))))
(vertical-skylines . ,ly:axis-group-interface::calc-skylines)
(Y-extent . ,ly:axis-group-interface::height)
(meta . ((class . Spanner)
+ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
+ (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
+ (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
(interfaces . (axis-group-interface))))))
(break-align-anchor . ,ly:break-aligned-interface::calc-extent-aligned-anchor)
(break-align-symbol . clef)
(break-visibility . ,begin-of-line-visible)
- (font-family . music)
(glyph-name . ,ly:clef::calc-glyph-name)
(non-musical . #t)
(space-alist . ((ambitus . (extra-space . 2.0))
(next-note . (extra-space . 0.5))
(right-edge . (extra-space . 0.5))))
(stencil . ,ly:clef::print)
+ (extra-spacing-height . (-0.5 . 0.5))
(Y-offset . ,ly:staff-symbol-referencer::callback)
(meta . ((class . Item)
(interfaces . (break-aligned-interface
(direction . ,UP)
(extra-spacing-width . (+inf.0 . -inf.0))
(font-series . bold)
+ (outside-staff-priority . 450)
(padding . 0.5)
(script-priority . 200)
(side-axis . ,Y)
(dot-count . ,dots::calc-dot-count)
(staff-position . ,dots::calc-staff-position)
(stencil . ,ly:dots::print)
+ (extra-spacing-height . (-0.5 . 0.5))
(meta . ((class . Item)
(interfaces . (dots-interface
font-interface
(DoublePercentRepeatCounter
. (
(direction . ,UP)
- (font-encoding . fetaNumber)
+ (font-encoding . fetaText)
(font-size . -2)
(padding . 0.2)
(self-alignment-X . ,CENTER)
(Y-extent . ,ly:axis-group-interface::height)
(Y-offset . ,ly:side-position-interface::y-aligned-side)
(meta . ((class . Spanner)
+ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
+ (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
+ (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
(interfaces . (axis-group-interface
dynamic-interface
dynamic-line-spanner-interface
(direction . ,ly:script-interface::calc-direction)
(extra-spacing-width . (+inf.0 . -inf.0))
- (font-encoding . fetaDynamic)
+ (font-encoding . fetaText)
(font-series . bold)
(font-shape . italic)
(outside-staff-priority . 250)
(positioning-done . ,ly:script-interface::calc-positioning-done)
+ (right-padding . 0.5)
(self-alignment-X . ,CENTER)
(self-alignment-Y . ,CENTER)
(stencil . ,ly:text-interface::print)
(Y-offset . ,ly:self-alignment-interface::y-aligned-on-self)
(meta . ((class . Item)
(interfaces . (dynamic-interface
+ dynamic-text-interface
font-interface
script-interface
self-alignment-interface
(DynamicTextSpanner
. (
+ (before-line-breaking . ,dynamic-text-spanner::before-line-breaking)
(bound-details . ((right . ((attach-dir . ,LEFT)
(Y . 0)
(padding . 0.75)
(left . ((attach-dir . ,LEFT)
(Y . 0)
- (stencil-offset . (0 . -0.5))
- (padding . 0.5)
+ (stencil-offset . (-0.75 . -0.5))
+ (padding . 0.75)
))
(left-broken . ((attach-dir . ,RIGHT)
))
text-interface))))))
+ (Episema
+ . (
+ (bound-details . ((left . ((Y . 0)
+ (padding . 0)
+ (attach-dir . ,LEFT)
+ ))
+ (right . ((Y . 0)
+ (padding . 0)
+ (attach-dir . ,RIGHT)
+ ))
+ ))
+ (direction . ,UP)
+ (left-bound-info . ,ly:line-spanner::calc-left-bound-info)
+ (quantize-position . #t)
+ (right-bound-info . ,ly:line-spanner::calc-right-bound-info)
+ (side-axis . ,Y)
+ (stencil . ,ly:line-spanner::print)
+ (style . line)
+ (Y-offset . ,ly:side-position-interface::y-aligned-side)
+ (meta . ((class . Spanner)
+ (interfaces . (episema-interface
+ font-interface
+ line-interface
+ line-spanner-interface
+ side-position-interface))))))
+
+
(Fingering
. (
(avoid-slur . around)
(cross-staff . ,ly:side-position-interface::calc-cross-staff)
(direction . ,ly:script-interface::calc-direction)
- (font-encoding . fetaNumber)
+ (font-encoding . fetaText)
(font-size . -5) ; don't overlap when next to heads.
(padding . 0.5)
(positioning-done . ,ly:script-interface::calc-positioning-done)
(stencil . ,ly:hairpin::print)
(thickness . 1.0)
(to-barline . #t)
- (Y-extent . ,ly:hairpin::height)
(Y-offset . ,ly:self-alignment-interface::y-aligned-on-self)
(meta . ((class . Spanner)
(interfaces . (dynamic-interface
(height-limit . 1.0)))
(direction . ,ly:tie::calc-direction)
(head-direction . ,LEFT)
- (stencil . ,ly:tie::print)
+ (stencil . ,laissez-vibrer::print)
(thickness . 1.0)
+ (extra-spacing-height . (-0.5 . 0.5))
(meta . ((class . Item)
(interfaces . (semi-tie-interface))))))
(LaissezVibrerTieColumn
. (
- (head-direction . ,LEFT)
+ (head-direction . ,ly:semi-tie-column::calc-head-direction)
(positioning-done . ,ly:semi-tie-column::calc-positioning-done)
(X-extent . #f)
(Y-extent . #f)
(clef . (extra-space . 0.8))
(first-note . (fixed-space . 2.0))
(right-edge . (extra-space . 0.0))
- (key-signature . (extra-space . 0.0))
+ (key-signature . (extra-space . 0.8))
(key-cancellation . (extra-space . 0.0))
))
(X-extent . (0 . 0))
(expand-limit . 10)
(hair-thickness . 2.0)
(padding . 1)
+ (spacing-pair . (break-alignment . staff-bar))
(springs-and-rods . ,ly:multi-measure-rest::set-spacing-rods)
(staff-position . 0)
(stencil . ,ly:multi-measure-rest::print)
. (
(bound-padding . 2.0)
(direction . ,UP)
- (font-encoding . fetaNumber)
+ (font-encoding . fetaText)
(padding . 0.4)
(self-alignment-X . ,CENTER)
(side-axis . ,Y)
(X-extent . ,ly:axis-group-interface::width)
(meta . ((class . Paper_column)
+ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
+ (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
+ (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
(interfaces . (axis-group-interface
font-interface
paper-column-interface
(X-extent . ,ly:axis-group-interface::width)
(Y-extent . ,ly:axis-group-interface::height)
(meta . ((class . Item)
+ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
+ (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
+ (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
(interfaces . (axis-group-interface
note-collision-interface))))))
(X-extent . ,ly:axis-group-interface::width)
(Y-extent . ,ly:axis-group-interface::height)
(meta . ((class . Item)
+ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
+ (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
+ (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
(interfaces . (axis-group-interface
note-column-interface
separation-item-interface))))))
(NoteHead
. (
(duration-log . ,note-head::calc-duration-log)
+ (extra-spacing-height . ,ly:note-head::include-ledger-line-height)
(glyph-name . ,note-head::calc-glyph-name)
(stem-attachment . ,ly:note-head::calc-stem-attachment)
(stencil . ,ly:note-head::print)
;; debugging
;; (font-size . -6) (font-name . "sans") (Y-extent . #f)
(meta . ((class . Paper_column)
+ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
+ (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
+ (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
(interfaces . (axis-group-interface
font-interface
paper-column-interface
(dot-negative-kern . 0.75)
(font-encoding . fetaMusic)
(slope . 1.0)
+ (spacing-pair . (break-alignment . staff-bar))
(springs-and-rods . ,ly:multi-measure-rest::set-spacing-rods)
(stencil . ,ly:multi-measure-rest::percent)
(thickness . 0.48)
(PercentRepeatCounter
. (
(direction . ,UP)
- (font-encoding . fetaNumber)
+ (font-encoding . fetaText)
(font-size . -2)
(padding . 0.2)
(self-alignment-X . ,CENTER)
(head-direction . ,RIGHT)
(stencil . ,ly:tie::print)
(thickness . 1.0)
+ (extra-spacing-height . (-0.5 . 0.5))
(meta . ((class . Item)
(interfaces . (semi-tie-interface))))))
(Script
. (
+ (add-stem-support . #t)
(cross-staff . ,ly:script-interface::calc-cross-staff)
(direction . ,ly:script-interface::calc-direction)
(font-encoding . fetaMusic)
(meta . ((class . Item)
(interfaces . (script-column-interface))))))
- (SeparationItem
- . (
- (avoid-slur . inside)
- (horizontal-skylines . ,ly:separation-item::calc-skylines)
- (stencil . ,ly:separation-item::print)
- (X-extent . ,ly:axis-group-interface::width)
- (Y-extent . ,ly:axis-group-interface::height)
- (meta . ((class . Item)
- (interfaces . (separation-item-interface))))))
-
(Slur
. (
(avoid-slur . inside)
(Y-extent . ,ly:axis-group-interface::height)
(Y-offset . ,ly:side-position-interface::y-aligned-side)
(meta . ((class . Spanner)
+ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
+ (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
+ (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
(interfaces . (axis-group-interface
piano-pedal-interface
side-position-interface))))))
(X-extent . ,ly:span-bar::width)
(Y-extent . ,ly:axis-group-interface::height)
(meta . ((class . Item)
+ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
+ (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
+ (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
(interfaces . (bar-line-interface
font-interface
span-bar-interface))))))
(StaffGrouper
. (
- (between-staff-spacing . ((space . 9) (minimum-distance . 7)))
- (after-last-staff-spacing . ((space . 10.5) (minimum-distance . 8)))
+ (between-staff-spacing . ((space . 9)
+ (minimum-distance . 7)
+ (padding . 1)))
+ (after-last-staff-spacing . ((space . 10.5)
+ (minimum-distance . 8)
+ (padding . 1)))
(meta . ((class . Spanner)
(interfaces . (staff-grouper-interface))))))
(StringNumber
. (
(avoid-slur . around)
- (font-encoding . fetaNumber)
+ (font-encoding . fetaText)
(font-size . -5) ; don't overlap when next to heads.
(padding . 0.5)
(script-priority . 100)
(Y-extent . ,ly:axis-group-interface::height)
(Y-offset . ,ly:side-position-interface::y-aligned-side)
(meta . ((class . Spanner)
+ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
+ (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
+ (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
(interfaces . (axis-group-interface
piano-pedal-interface
side-position-interface))))))
(System
. (
+ (adjacent-pure-heights . ,ly:axis-group-interface::adjacent-pure-heights)
(axes . (,X ,Y))
(vertical-skylines . ,ly:axis-group-interface::calc-skylines)
(X-extent . ,ly:axis-group-interface::width)
- (Y-extent . ,ly:axis-group-interface::height)
+ (Y-extent . ,ly:system::height)
(meta . ((class . System)
+ (object-callbacks . ((pure-relevant-grobs . ,ly:system::calc-pure-relevant-grobs)
+ (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
+ (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)
+ (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)))
(interfaces . (axis-group-interface
system-interface))))))
(font-size . -2)
(stem-attachment . (0.0 . 1.35))
(stencil . ,ly:text-interface::print)
+ (whiteout . #t)
(X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
(Y-offset . ,ly:staff-symbol-referencer::callback)
(meta . ((class . Item)
(padding . 0.25)
(attach-dir . ,LEFT)
))
+ (left-broken . ((end-on-note . #t)))
(right . ((Y . 0)
(padding . 0.25)
))
(TrillSpanner
. (
(after-line-breaking . ,ly:spanner::kill-zero-spanned-time)
- (bound-details . ((left . ((text . ,(make-translate-scaled-markup
- '(0.0 . -1.0)
- (make-musicglyph-markup "scripts.trill")))
+ (bound-details . ((left . ((text . ,(make-musicglyph-markup "scripts.trill"))
(Y . 0)
- (stencil-offset . (-0.5 . 0))
- (padding . 1.5)
+ (stencil-offset . (-0.5 . -1))
+ (padding . 0.5)
(attach-dir . ,CENTER)
- ;; this isn't CENTER because the trill glyph's origin
- ;; is not centered in its extent; to have the trill
- ;; spanner aligned the same as a trill, we need a slight offset
- (anchor-alignment . 0.15)
))
(left-broken . ((end-on-note . #t)))
(right . ((Y . 0)))
(Y-extent . ,ly:axis-group-interface::height)
(Y-offset . ,ly:side-position-interface::y-aligned-side)
(meta . ((class . Spanner)
+ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
+ (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
+ (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
(interfaces . (axis-group-interface
piano-pedal-interface
side-position-interface))))))
(X-extent . ,ly:axis-group-interface::width)
(Y-extent . ,ly:axis-group-interface::height)
(meta . ((class . Spanner)
- (object-callbacks . ((Y-common . ,ly:axis-group-interface::calc-y-common)))
+ (object-callbacks . ((Y-common . ,ly:axis-group-interface::calc-y-common)
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
+ (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
+ (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)
+ (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)))
(interfaces . (align-interface
axis-group-interface))))))
. (
(adjacent-pure-heights . ,ly:axis-group-interface::adjacent-pure-heights)
(axes . (,Y))
- (default-next-staff-spacing . ((space . 9) (minimum-distance . 8)))
+ (default-next-staff-spacing . ((space . 9)
+ (minimum-distance . 8)
+ (padding . 1)))
(next-staff-spacing . ,ly:axis-group-interface::calc-next-staff-spacing)
+ (non-affinity-spacing . ((padding . 0.5)))
(stencil . ,ly:axis-group-interface::print)
(vertical-skylines . ,ly:hara-kiri-group-spanner::calc-skylines)
(X-extent . ,ly:axis-group-interface::width)
(Y-extent . ,ly:hara-kiri-group-spanner::y-extent)
(Y-offset . ,ly:hara-kiri-group-spanner::force-hara-kiri-callback)
(meta . ((class . Spanner)
- (object-callbacks . ((X-common . ,ly:axis-group-interface::calc-x-common)))
+ (object-callbacks . (
+ (X-common . ,ly:axis-group-interface::calc-x-common)
+ (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
+ (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
+ (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+
(interfaces . (axis-group-interface
- hara-kiri-group-spanner-interface
- vertically-spaceable-interface))))))
+ hara-kiri-group-spanner-interface))))))
(VoiceFollower
. (
. (
(direction . ,UP)
(edge-height . (2.0 . 2.0)) ;; staff-space;
- (font-encoding . fetaNumber)
+ (font-encoding . fetaText)
(font-size . -4)
(stencil . ,ly:volta-bracket-interface::print)
- (thickness . 1.6) ;; line-thickness
+ (thickness . 1.6) ;; line-thickness
(word-space . 0.6)
(meta . ((class . Spanner)
(interfaces . (font-interface
line-interface
side-position-interface
text-interface
- volta-bracket-interface))))))
+ volta-bracket-interface
+ volta-interface))))))
(VoltaBracketSpanner
. (
(after-line-breaking . ,ly:side-position-interface::move-to-extremal-staff)
(axes . (,Y))
(direction . ,UP)
- (no-alignment . ,#t)
+ (no-alignment . #t)
(outside-staff-priority . 600)
(padding . 1)
(side-axis . ,Y)
(Y-extent . ,ly:axis-group-interface::height)
(Y-offset . ,ly:side-position-interface::y-aligned-side)
(meta . ((class . Spanner)
+ (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
+ (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
+ (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
(interfaces . (axis-group-interface
- side-position-interface))))))
+ side-position-interface
+ volta-interface))))))
))
(set! all-grob-descriptions (sort all-grob-descriptions alist<?))
+(define (volta-bracket-interface::pure-height grob start end)
+ (let ((edge-height (ly:grob-property grob 'edge-height)))
+ (if (number-pair? edge-height)
+ (let ((smaller (min (car edge-height) (cdr edge-height)))
+ (larger (max (car edge-height) (cdr edge-height))))
+ (interval-union '(0 . 0) (cons smaller larger)))
+ '(0 . 0))))
+
(define pure-print-callbacks
(list
fret-board::calc-stencil
+ note-head::brew-ez-stencil
print-circled-text-callback
+ laissez-vibrer::print
lyric-text::print
- ly:arpeggio::print
- ly:arpeggio::brew-chord-bracket
ly:bar-line::print
ly:mensural-ligature::brew-ligature-primitive
ly:note-head::print
ly:dots::print
ly:clef::print
+ ly:percent-repeat-item-interface::beat-slash
ly:text-interface::print
- ly:script-interface::print))
+ ly:script-interface::print
+ ly:sustain-pedal::print))
+
+;; Sometimes we have grobs with (Y-extent . ,ly:grob::stencil-height)
+;; and the print function is not pure, but there is a easy way to
+;; figure out the Y-extent from the print function.
+(define pure-print-to-height-conversions
+ `(
+ (,ly:arpeggio::print . ,ly:arpeggio::pure-height)
+ (,ly:arpeggio::brew-chord-bracket . ,ly:arpeggio::pure-height)
+ (,ly:hairpin::print . ,ly:hairpin::pure-height)
+ (,ly:volta-bracket-interface::print . ,volta-bracket-interface::pure-height)))
-;; ly:grob::stencil-extent is safe iff the print callback is safe too
+;; ly:grob::stencil-extent is safe if the print callback is safe too
(define (pure-stencil-height grob start stop)
- (let ((sten (ly:grob-property-data grob 'stencil)))
- (if (or
- (ly:stencil? sten)
- (memq sten pure-print-callbacks))
- (ly:grob::stencil-height grob)
- '(0 . 0))))
+ (let* ((sten (ly:grob-property-data grob 'stencil))
+ (pure-height-callback (assoc-get sten pure-print-to-height-conversions)))
+ (cond ((or
+ (ly:stencil? sten)
+ (memq sten pure-print-callbacks))
+ (ly:grob::stencil-height grob))
+ ((procedure? pure-height-callback)
+ (pure-height-callback grob start stop))
+ (else
+ '(0 . 0)))))
+
+;; Sometimes, a pure callback will be chained to a non-pure callback via
+;; chain_offset_callback, in which case this provides a default by simply
+;; passing through the value from the pure callback.
+(define (pure-chain-offset-callback grob start end prev-offset) prev-offset)
(define pure-conversions-alist
`(
(,ly:accidental-interface::height . ,ly:accidental-interface::pure-height)
- (,ly:arpeggio::height . ,ly:arpeggio::pure-height)
- (,ly:slur::outside-slur-callback . ,ly:slur::pure-outside-slur-callback)
- (,ly:hairpin::height . ,ly:hairpin::pure-height)
- (,ly:stem::height . ,ly:stem::pure-height)
- (,ly:rest::height . ,ly:rest::pure-height)
+ (,ly:axis-group-interface::calc-next-staff-spacing . ,ly:axis-group-interface::calc-pure-next-staff-spacing)
+ (,ly:axis-group-interface::height . ,ly:axis-group-interface::pure-height)
(,ly:grob::stencil-height . ,pure-stencil-height)
+ (,ly:hara-kiri-group-spanner::y-extent . ,ly:hara-kiri-group-spanner::pure-height)
+ (,ly:rest-collision::force-shift-callback-rest . ,pure-chain-offset-callback)
+ (,ly:rest::height . ,ly:rest::pure-height)
(,ly:self-alignment-interface::y-aligned-on-self . ,ly:self-alignment-interface::pure-y-aligned-on-self)
(,ly:side-position-interface::y-aligned-side . ,ly:side-position-interface::pure-y-aligned-side)
- (,ly:axis-group-interface::height . ,ly:axis-group-interface::pure-height)
- (,ly:hara-kiri-group-spanner::y-extent . ,ly:hara-kiri-group-spanner::pure-height)
(,ly:slur::height . ,ly:slur::pure-height)
- (,ly:side-position-interface::y-aligned-side . ,ly:side-position-interface::pure-y-aligned-side)))
+ (,ly:slur::outside-slur-callback . ,ly:slur::pure-outside-slur-callback)
+ (,ly:stem::height . ,ly:stem::pure-height)
+ (,ly:system::height . ,ly:system::calc-pure-height)))
(define pure-functions
(list
parenthesize-elements
+ laissez-vibrer::print
ly:rest::y-offset-callback
ly:staff-symbol-referencer::callback
ly:staff-symbol::height))
(memq extent-callback pure-functions)
(and
(pair? (assq extent-callback pure-conversions-alist))
- (begin
+ (let ((stencil (ly:grob-property-data grob 'stencil)))
(or
(not (eq? extent-callback ly:grob::stencil-height))
- (memq (ly:grob-property-data grob 'stencil) pure-print-callbacks)
- (ly:stencil? (ly:grob-property-data grob 'stencil))
-
- ))))))))
+ (memq stencil pure-print-callbacks)
+ (assq stencil pure-print-to-height-conversions)
+ (ly:stencil? stencil)))))))))
(define-public (call-pure-function unpure args start end)
(if (ly:simple-closure? unpure)