lilypond-devel
[Top][All Lists]
Advanced

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

Oval stencil and oval markup suggestions


From: Pierre Perol-Schneider
Subject: Oval stencil and oval markup suggestions
Date: Thu, 4 Apr 2019 17:33:39 +0200

Hi Dev Team,
Here's some thougts:

%%%%%%
\version "2.19.83"

%% The oval stencil commands uses beziers curves that cause some side
effects:
\markuplist {
  \line\vcenter {
    "Circle, radius = 2 : "
    \stencil #(make-circle-stencil 2 .13 #f)
  }
  \line\vcenter {
    "Oval, x-radius = y-radius = 2 : "
    \stencil #(make-oval-stencil 2 2 .13 #f)
  }
  \line\vcenter {
    "Oval extents, x-radius = y-radius = 2 : "
    \box\stencil #(make-oval-stencil 2 2 .13 #f)
  }
}

%% Here's a suggestion with a corrected y-radius in order to reach a quasi
circle:
#(define-public (make-oval-stencil-var x-radius y-radius thickness fill)
  "Make an oval from two Bezier curves, of address@hidden @var{x-radius},
  address@hidden @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)))
         (x-max x-radius)
         (x-min (- x-radius))
         (y-max (* y-radius (+ 1 (/ 1 3)))) ; <= max deviation < 1%
         (y-min (* (- y-radius) (+ 1 (/ 1 3)))) ; <= max deviation < 1%
         (commands `(,(list 'moveto x-max 0)
                     ,(list 'curveto x-max y-max x-min y-max x-min 0)
                     ,(list 'curveto x-min y-min x-max y-min x-max 0)
                     ,(list 'closepath)
                     ))
         (command-list (fold-right append '() commands)))
      (ly:make-stencil
       `(path ,thickness `(,@',command-list) 'round 'round ,fill)
       (cons (- x-out-radius) x-out-radius)
       (cons (- y-out-radius) y-out-radius))))


\markuplist {
  % Test #1:
  \line\vcenter {
    "make-oval-stencil-var: "
    \box\stencil #(make-oval-stencil-var 2 2 .13 #f)
    " v.s. make-circle-stencil: "
    \box\stencil #(make-circle-stencil 2 .13 #f)
  }
  % Test #2:
  \vspace #1 "make-oval-stencil-var & make-circle-stencil combined:"
\vspace #.3
  \translate #'(8 . 0)
  \line {
    \scale #'(5 . 5) {
      \combine
      \with-color #blue
      \draw-circle #2 #.13 ##f
      \with-color #red
      \stencil #(make-oval-stencil-var 2 2 .13 #f)
    }
    \scale #'(5 . 5) {
      \combine
      \with-color #red
      \stencil #(make-oval-stencil-var 2 2 .13 #f)
      \with-color #blue
      \draw-circle #2 #.13 ##f
    }
  }
  \vspace #1
}

%% Here comes a suggestion for the markup command:
#(define-public (oval-stencil-var stencil thickness x-padding y-padding)
  "Add an oval around @code{stencil}, padded by the padding pair,
producing a var stencil."
  (let* ((x-ext (ly:stencil-extent stencil X))
         (y-ext (ly:stencil-extent stencil Y))
         (x-length (+ (interval-length x-ext) x-padding thickness))
         (y-length (+ (interval-length y-ext) y-padding thickness))
         (x-radius (* 0.707 x-length) )
         (y-radius (* 0.707 y-length) )
         (oval (make-oval-stencil-var x-radius y-radius thickness #f)))

    (ly:stencil-add
     stencil
     (ly:stencil-translate oval
                           (cons
                            (interval-center x-ext)
                            (interval-center y-ext))))))

#(define-markup-command (oval-var layout props arg)
  (markup?)
  #:category graphic
  #:properties ((thickness 1)
                (font-size 0)
                (x-padding .1) ; <= possible corrected padding
                (y-padding .1)) ; <= possible corrected padding
  "
@cindex drawing oval around text

Draw an oval around @var{arg}.  Use @code{thickness},
@code{x-padding}, @code{x-padding} and @code{font-size} properties to
determine
line thickness and padding around the markup.

@lilypond[verbatim,quote]
\\markup {
  \\oval-var {
    Hi
  }
}
@end lilypond"
  (let ((th (* (ly:output-def-lookup layout 'line-thickness)
               thickness))
        (pad-x (* (magstep font-size) x-padding))
        (pad-y (* (magstep font-size) y-padding))
        (m (interpret-markup layout props arg)))
    (oval-stencil-var m th pad-x pad-y)))


%% Comparative test:
\markup {
  "oval: "
  \box\oval "Hi"
  " v.s. oval-var markups: "
  \box\oval-var "Hi"
}

%%%%%

Cheers,
Pierre


reply via email to

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