X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Fstencil.scm;h=81e1d9a40c28253fcd3d5b5d0b88774340f02480;hb=b3768e70f4497923ad4c1400c4da88e1808c1b22;hp=3957d40f046d2fd8cd59d1825be2297b9b26f14a;hpb=c0ba46b982f0bb0544c5267b5176c17d8d9d1447;p=lilypond.git diff --git a/scm/stencil.scm b/scm/stencil.scm index 3957d40f04..81e1d9a40c 100644 --- a/scm/stencil.scm +++ b/scm/stencil.scm @@ -2,16 +2,29 @@ ;;;; ;;;; source file of the GNU LilyPond music typesetter ;;;; -;;;; (c) 2003--2004 Han-Wen Nienhuys +;;;; (c) 2003--2005 Han-Wen Nienhuys (define-public (stack-stencils axis dir padding stils) "Stack stencils STILS in direction AXIS, DIR, using PADDING." - (if (null? stils) - empty-stencil - (if (pair? stils) - (ly:stencil-combine-at-edge - (car stils) axis dir (stack-stencils axis dir padding (cdr stils)) - padding)))) + (cond + ((null? stils) empty-stencil) + ((null? (cdr stils)) (car stils)) + (else (ly:stencil-combine-at-edge + (car stils) axis dir (stack-stencils axis dir padding (cdr stils)) + padding)))) + +(define-public (stack-stencils-padding-list axis dir padding stils) + "Stack stencils STILS in direction AXIS, DIR, using a list of PADDING." + (cond + ((null? stils) empty-stencil) + ((null? (cdr stils)) (car stils)) + (else (ly:stencil-combine-at-edge + (car stils) axis dir (stack-stencils-padding-list axis dir (cdr padding) (cdr stils)) + (car padding))))) + +(define-public (centered-stencil stencil) + "Center stencil @var{stencil} in both the X and Y directions" + (ly:stencil-aligned-to (ly:stencil-aligned-to stencil X CENTER) Y CENTER)) (define-public (stack-lines dir padding baseline stils) "Stack vertically with a baseline-skip." @@ -44,6 +57,12 @@ (- (car yext)) (cdr yext)) xext yext)) +(define-public (make-circle-stencil radius thickness fill) + "Make a circle of radius @var{radius} and thickness @var{thickness}" + (ly:make-stencil + (list 'circle radius thickness fill) + (cons (- radius) radius) + (cons (- radius) radius))) (define-public (box-grob-stencil grob) "Make a box of exactly the extents of the grob. The box precisely @@ -55,34 +74,44 @@ encloses the contents. (ly:stencil-add (make-filled-box-stencil xext (cons (- (car yext) thick) (car yext))) - (make-filled-box-stencil xext (cons (cdr yext) (+ (cdr yext) thick))) + (make-filled-box-stencil xext (cons (cdr yext) (+ (cdr yext) thick))) (make-filled-box-stencil (cons (cdr xext) (+ (cdr xext) thick)) yext) (make-filled-box-stencil (cons (- (car xext) thick) (car xext)) yext)))) ;; TODO merge this and prev function. -(define-public (box-stencil stil thick padding) - "Add a box around STIL, producing a new stencil." - (let* ((x-ext (interval-widen (ly:stencil-extent stil 0) padding)) - (y-ext (interval-widen (ly:stencil-extent stil 1) padding)) - (y-rule (make-filled-box-stencil (cons 0 thick) y-ext)) - (x-rule (make-filled-box-stencil (interval-widen x-ext thick) - (cons 0 thick)))) - - (set! stil (ly:stencil-combine-at-edge stil X 1 y-rule padding)) - (set! stil (ly:stencil-combine-at-edge stil X -1 y-rule padding)) - (set! stil (ly:stencil-combine-at-edge stil Y 1 x-rule 0.0)) - (set! stil (ly:stencil-combine-at-edge stil Y -1 x-rule 0.0)) - - stil)) +(define-public (box-stencil stencil thickness padding) + "Add a box around STENCIL, producing a new stencil." + (let* ((x-ext (interval-widen (ly:stencil-extent stencil 0) padding)) + (y-ext (interval-widen (ly:stencil-extent stencil 1) padding)) + (y-rule (make-filled-box-stencil (cons 0 thickness) y-ext)) + (x-rule (make-filled-box-stencil + (interval-widen x-ext thickness) (cons 0 thickness)))) + (set! stencil (ly:stencil-combine-at-edge stencil X 1 y-rule padding)) + (set! stencil (ly:stencil-combine-at-edge stencil X -1 y-rule padding)) + (set! stencil (ly:stencil-combine-at-edge stencil Y 1 x-rule 0.0)) + (set! stencil (ly:stencil-combine-at-edge stencil Y -1 x-rule 0.0)) + stencil)) + +(define-public (circle-stencil stencil thickness padding) + "Add a circle around STENCIL, producing a new stencil." + (let* ((x-ext (ly:stencil-extent stencil 0)) + (y-ext (ly:stencil-extent stencil 1)) + (diameter (max (- (cdr x-ext) (car x-ext)) + (- (cdr y-ext) (car y-ext)))) + (radius (+ (/ diameter 2) padding thickness))) + (ly:stencil-add + (centered-stencil stencil) (make-circle-stencil radius thickness #f)))) (define-public (fontify-text font-metric text) "Set TEXT with font FONT-METRIC, returning a stencil." - (let* ((b (ly:text-dimension font-metric text))) + (let* ((b (ly:text-dimension font-metric text))) (ly:make-stencil `(text ,font-metric ,text) (car b) (cdr b)))) (define-public (fontify-text-white scale font-metric text) "Set TEXT with scale factor s" - (let* ((b (ly:text-dimension font-metric text)) - (c `(white-text ,(* 2 scale) ,text))) ;urg -- workaround for using ps font - (ly:make-stencil c (car b) (cdr b)))) ;urg -- extent is not from ps font, but we hope it's close + (let* ((b (ly:text-dimension font-metric text)) + ;;urg -- workaround for using ps font + (c `(white-text ,(* 2 scale) ,text))) + ;;urg -- extent is not from ps font, but we hope it's close + (ly:make-stencil c (car b) (cdr b))))