(stencil (make-filled-box-stencil
(box-x-dimensions prev-x p space)
(box-y-dimensions prev-x p space)))
- ;(circle-stencil (if circled (rounded-box-stencil stencil 0.05 0.3 0.1 ) stencil))
- (circle-stencil (if circled (circle-stencil stencil 0.05 0.2 ) stencil))
+ (pedal-stencil
+ (if circled
+ (ellipse-stencil stencil 0.05 0.1 )
+ stencil))
(new-prev-x (+ prev-x space box-width)))
- (process-pedal (cdr remaining) new-prev-x (cons circle-stencil stencils) #f space)))
+ (process-pedal (cdr remaining) new-prev-x
+ (cons pedal-stencil stencils) #f space)))
((#\|) ; Divider line
(let* ((xpos (+ prev-x space))
(stencil (divider-stencil xpos))
(new-prev-x (+ prev-x space)))
- (process-pedal (cdr remaining) new-prev-x (cons stencil stencils) circled spaceafterdivider)))
+ (process-pedal (cdr remaining) new-prev-x
+ (cons stencil stencils)
+ circled spaceafterdivider)))
((#\o) ; Next pedal should be circled
(process-pedal (cdr remaining) prev-x stencils #t space))
(else
- (ly:warning "Unhandled entry in harp-pedal: ~a" (car remaining))
- (process-pedal (cdr remaining) prev-x stencils circled space))))))
+ (ly:warning "Unhandled entry in harp-pedal: ~a"
+ (car remaining))
+ (process-pedal (cdr remaining)
+ prev-x stencils circled space))))))
(final-x (car result))
(stencils (cdr result)))
; Add the horizontal line and combine all stencils:
`(stroke-width . ,thick)
`(r . ,radius)))
+(define (ellipse x-radius y-radius thick is-filled)
+ (entity
+ 'ellipse ""
+ '(stroke-linejoin . "round")
+ '(stroke-linecap . "round")
+ `(fill . ,(if is-filled "currentColor" "none"))
+ `(stroke . "currentColor")
+ `(stroke-width . ,thick)
+ `(rx . ,x-radius)
+ `(ry . ,y-radius)))
+
(define (text font string)
(dispatch `(fontify ,font ,(entity 'tspan (string->entities string)))))
(cons (- out-radius) out-radius)
(cons (- out-radius) out-radius))))
+(define-public (make-ellipse-stencil x-radius y-radius thickness fill)
+ "Make an ellipse of x radius @var{x-radius}, y radius @code{y-radius},
+ and thickness @var{thickness} with fill defined by @code{fill}."
+ (let*
+ ((x-out-radius (+ x-radius (/ thickness 2.0)))
+ (y-out-radius (+ y-radius (/ thickness 2.0))) )
+
+ (ly:make-stencil
+ (list 'ellipse x-radius y-radius thickness fill)
+ (cons (- x-out-radius) x-out-radius)
+ (cons (- y-out-radius) y-out-radius))))
+
(define-public (box-grob-stencil grob)
"Make a box of exactly the extents of the grob. The box precisely
encloses the contents.
(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))))
+ (let* ((x-ext (ly:stencil-extent stencil X))
+ (y-ext (ly:stencil-extent stencil Y))
+ (diameter (max (interval-length x-ext)
+ (interval-length y-ext)))
(radius (+ (/ diameter 2) padding thickness))
(circle (make-circle-stencil radius thickness #f)))
(interval-center x-ext)
(interval-center y-ext))))))
+(define-public (ellipse-stencil stencil thickness padding)
+ "Add an ellipse around STENCIL, producing a new stencil."
+ (let* ((x-ext (ly:stencil-extent stencil X))
+ (y-ext (ly:stencil-extent stencil Y))
+ (x-length (+ (interval-length x-ext) padding thickness))
+ (y-length (+ (interval-length y-ext) padding thickness))
+ ;(aspect-ratio (/ x-length y-length))
+ (x-radius (* 0.707 x-length) )
+ (y-radius (* 0.707 y-length) )
+ ;(diameter (max (- (cdr x-ext) (car x-ext))
+ ; (- (cdr y-ext) (car y-ext))))
+ ;(radius (+ (/ diameter 2) padding thickness))
+ (ellipse (make-ellipse-stencil x-radius y-radius thickness #f)))
+
+ (ly:stencil-add
+ stencil
+ (ly:stencil-translate ellipse
+ (cons
+ (interval-center x-ext)
+ (interval-center y-ext))))))
+
(define-public (rounded-box-stencil stencil thickness padding blot)
"Add a rounded box around STENCIL, producing a new stencil."