lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

\vshape and custom curve-stencil for TextSpanner


From: Thomas Morley
Subject: \vshape and custom curve-stencil for TextSpanner
Date: Sat, 23 Jul 2022 10:59:56 +0200

Hi,

I'm attempting to create a s-curve stencil for TextSpanner.
While so far all works as wished and it is possibel to use \shape,
\vshape doesn't print the control-points.

What am I missing?

Code below.
Thanks to Jean how fixed make-path-stencil!

Thanks,
  Harm

\version "2.23.11"

#(define (make-s-curve-stencil line-thickness thickness control-points)
  (let* ((start-pt (car control-points))
         (end-pt (last control-points))
         (lngth (- (car end-pt) (car start-pt)))
         (second-cp (second control-points))
         (third-cp (third control-points))
         (second-delta
           (* (- (car second-cp) (car start-pt)) (/ thickness (/ lngth 2))))
         (second-out
           (cons (car second-cp)
                 (+ (cdr second-cp) second-delta)))
         (second-in
           (cons (car second-cp)
                 (- (cdr second-cp) second-delta)))
         (third-delta
           (* (- (car end-pt) (car third-cp)) (/ thickness (/ lngth 2))))
         (third-out
           (cons (car third-cp)
                 (+ (cdr third-cp) third-delta)))
         (third-in
           (cons (car third-cp)
                 (- (cdr third-cp) third-delta)))
         (coord-list
           (list
             start-pt
             second-out
             third-out
             end-pt
             third-in
             second-in)))
    ((@@ (lily) make-bezier-sandwich-stencil) coord-list line-thickness)))

#(define horizontal-spanner-cps
  (lambda (grob)
    (let* ((left-info (ly:grob-property grob 'left-bound-info))
           (right-info (ly:grob-property grob 'right-bound-info))
           (left-x (assoc-get 'X left-info))
           (right-x (assoc-get 'X right-info))
           (lngth (- right-x left-x))
           (height 2)
           (cp-2 (cons (* lngth 0.25) height))
           (cp-3 (cons (* lngth 0.75) (- height))))
      (list
        '(0 . 0)
        cp-2
        cp-3
        (cons (- right-x left-x) 0)))))

#(define text-spanner::s-curve-stencil
  (lambda (grob)
    (let* ((layout (ly:grob-layout grob))
           (line-thick (ly:output-def-lookup layout 'line-thickness))
           (thickness (ly:grob-property grob 'thickness 1.2))
           (thick (* line-thick thickness)))
;    (box-stencil
     (make-s-curve-stencil line-thick thick
       (ly:grob-property grob 'control-points))
;     0 0)
    )))

{
  \override TextSpanner.control-points = #horizontal-spanner-cps
  \override TextSpanner.show-control-points = ##t
  \override TextSpanner.stencil = #text-spanner::s-curve-stencil

  \vshape #'((0 . 0)(0 . 10)(0 . -10)(0 . 0)) TextSpanner
  b1\startTextSpan
  b\stopTextSpan
}



reply via email to

[Prev in Thread] Current Thread [Next in Thread]