X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Foutput-lib.scm;h=8a5cae2b23f0fbcc79ab61c6334dd0222b115380;hb=2ce9d3b0ac456df77a73342fdf802f2e198c3b4e;hp=96456b1b77fb436ae4a90b6b7ae851c30fa01678;hpb=d740612bb41672446873e307ba3b7c605be9b2f6;p=lilypond.git diff --git a/scm/output-lib.scm b/scm/output-lib.scm index 96456b1b77..8a5cae2b23 100644 --- a/scm/output-lib.scm +++ b/scm/output-lib.scm @@ -130,6 +130,44 @@ line-thickness)) +(define (grob::objects-from-interface grob iface) + "For grob @var{grob} return the name and contents of all properties + within interface @var{iface} having type @code{ly:grob?} or + @code{ly:grob-array?}." + (let* ((iface-entry (hashq-ref (ly:all-grob-interfaces) iface)) + (props (if iface-entry (last iface-entry) '())) + (pointer-props + (filter + (lambda (prop) + (let ((type (object-property prop 'backend-type?))) + (or (eq? type ly:grob?) + (eq? type ly:grob-array?)))) + props))) + (if (null? pointer-props) + '() + (list iface + (map + (lambda (prop) (list prop (ly:grob-object grob prop))) + pointer-props))))) + +(define-public (grob::all-objects grob) + "Return a list of the names and contents of all properties having type + @code{ly:grob?} or @code{ly:grob-array?} for all interfaces supported by + grob @var{grob}." + (let loop ((ifaces (ly:grob-interfaces grob)) (result '())) + (if (null? ifaces) + (cons grob (list result)) + (let ((entry (grob::objects-from-interface grob (car ifaces)))) + (if (pair? entry) + (loop (cdr ifaces) (append result (list entry))) + (loop (cdr ifaces) result)))))) + +(use-modules (ice-9 pretty-print)) +(define-public (grob::display-objects grob) + "Display all objects stored in properties of grob @var{grob}." + (pretty-print (grob::all-objects grob)) + (newline)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; beam slope @@ -864,15 +902,28 @@ and duration-log @var{log}." (set! rp (ly:make-stencil (ly:stencil-expr rp) rp-x-extent (ly:stencil-extent rp Y))) - (list (stencil-whiteout lp) - (stencil-whiteout rp)))) + (list (stencil-whiteout-box lp) + (stencil-whiteout-box rp)))) + +(define-public (parentheses-item::y-extent grob) (ly:grob::stencil-height grob)) (define (parenthesize-elements grob . rest) (let* ((refp (if (null? rest) grob (car rest))) - (elts (ly:grob-object grob 'elements)) - (x-ext (ly:relative-group-extent elts refp X)) + (elts (ly:grob-array->list (ly:grob-object grob 'elements))) + (get-friends + (lambda (g) + (let ((syms (ly:grob-property g 'parenthesis-friends '())) + (get-friend (lambda (s) + (let ((f (ly:grob-object g s))) + (cond + ((ly:grob? f) (list f)) + ((ly:grob-array? f) (ly:grob-array->list f)) + (else '())))))) + (apply append (map get-friend syms))))) + (friends (apply append elts (map get-friends elts))) + (x-ext (ly:relative-group-extent friends refp X)) (stencils (ly:grob-property grob 'stencils)) (lp (car stencils)) (rp (cadr stencils)) @@ -1187,8 +1238,19 @@ parent or the parent has no setting." (let* ((shift-when-alone (ly:grob-property grob 'toward-stem-shift 0.0)) (shift-in-column (ly:grob-property grob 'toward-stem-shift-in-column)) (script-column (ly:grob-object grob 'script-column)) - (shift (if (and (ly:grob? script-column) (number? shift-in-column)) - shift-in-column shift-when-alone)) + (shift + (if (and (ly:grob? script-column) + (number? shift-in-column) + ;; ScriptColumn can contain grobs other than Script. + ;; These should not result in a shift. + (any (lambda (s) + (and (not (eq? s grob)) + (grob::has-interface s 'script-interface) + (not (grob::has-interface s + 'accidental-suggestion-interface)))) + (ly:grob-array->list + (ly:grob-object script-column 'scripts)))) + shift-in-column shift-when-alone)) (note-head-location (ly:self-alignment-interface::aligned-on-x-parent grob)) (note-head-grob (ly:grob-parent grob X))