Thank you Harm, great work.
Cheers,
Pierre

2016-01-15 23:58 GMT+01:00 Thomas Morley <thomasmorle...@gmail.com>:

> 2016-01-13 22:14 GMT+01:00 Thomas Morley <thomasmorle...@gmail.com>:
> > 2016-01-13 16:17 GMT+01:00 Paul Morris <p...@paulwmorris.com>:
> >>> On Jan 12, 2016, at 6:09 PM, Thomas Morley <thomasmorle...@gmail.com>
> wrote:
> >>>
> >>> Though, there might be a bug in `stencil-whiteout-outline', Paul cc-ed.
> >>>
> >>> Look at:
> >>>
> >>> \markup \stencil
> >>> #(stencil-whiteout-outline
> >>>  (make-filled-box-stencil '(-1 . 1) '(-1 . 1))
> >>>  0.5
> >>>  red
> >>>  16
> >>>  1)
> >>>
> >>> \markup \stencil
> >>> #(stencil-whiteout-outline
> >>>  (stencil-with-color (make-filled-box-stencil '(-1 . 1) '(-1 . 1))
> green)
> >>>  0.5
> >>>  red
> >>>  16
> >>>  1)
> >>>
> >>> First one is ok.
> >>> But in the second one the color from the stencil is taken (green) and
> >>> the specified (red) is ignored.
> >>> Will investigate more detailed the upcoming days.
> >>
> >> Huh, that’s odd…  stencil-whiteout-box works as expected (see below),
> so the problem must indeed be in stencil-whiteout-outline.
> >>
> >> -Paul
> >
> > Yep.
> >
> > In this part of the code for stencil-whiteout-outline you try to apply
> > a color to a stencil, which is derived from the original one,
> >
> >                 (ly:stencil-expr
> >                  (stencil-with-color
> >                   (radial-plot thickness stil empty-stencil)
> >                   color))
> >
> > Though, if this original stencil is colored already, it will fail.
> > See:
> >
> > #(define my-box-stil (make-filled-box-stencil '(-1 . 1) '(-1 . 1)))
> >
> > \markup {
> >   \stencil #my-box-stil
> >   \stencil #(stencil-with-color my-box-stil green)
> >   \stencil #(stencil-with-color (stencil-with-color my-box-stil green)
> red)
> >      }
> >
> > Thinking about it, I came to the conclusion it's desired behaviour.
> > Otherwise the following wouldn't work:
> >
> > \markup \with-color #red { foo \with-color #green bar buzz }
> >
> > So far the reason, now looking forward to make it work anyway.
> >
> >
> > Cheers,
> >   Harm
>
> The only way I've found, is to delete all color-settings from the
> stencil-expr.
> Anyone with a better idea?
>
> Below you'll find what I did.
> Fixes `stencil-whiteout-outline' by applying newly defined
> `uncolor-stencil'
> Also adding `outliner'-markup-command
>
> \version "2.18.2"  %% sic !!
>
> #(define (lists-map function ls)
> "Apply @var{function} to @var{ls} and all of it sublists.
>
> First it recurses over the children, then the function is applied to
> @var{ls}."
>     (if (list? ls)
>         (set! ls (map (lambda (y) (lists-map function y)) ls))
>         ls)
>     (function ls))
>
> #(define (uncolor-stencil stil)
> "Delete colors from stencil @var{stil}"
>   (let* ((x-ext (ly:stencil-extent stil X))
>          (y-ext (ly:stencil-extent stil Y))
>          (stil-expr (ly:stencil-expr stil))
>          (get-caddr-if-condition
>            (lambda (e)
>              (if (and (list? e) (member 'color e))
>                  ;; the stencil-expr of a colored stencil is of type
>                  ;; (list 'color (list r g b) (list rest-of-stencil-expr))
>                  ;; Thus we can be sure that (caddr e) is valid
>                  ;; Even for an empty-stencil it evaluates to '()
>                  (caddr e)
>                  e))))
>      (ly:make-stencil
>        (lists-map get-caddr-if-condition stil-expr)
>        x-ext
>        y-ext)))
>
> #(define*-public (stencil-whiteout-outline
>                  stil #:optional (thickness 0.3) (color white)
>                  (angle-increments 16) (radial-increments 1))
>   "This function works by creating a series of white or @var{color}
> stencils radially offset from the original stencil with angles from
> 0 to 2*pi, at an increment of @code{angle-inc}, and with radii
> from @code{radial-inc} to @var{thickness}.  @var{thickness} is how big
> the white outline is, as a multiple of line-thickness.
> @var{radial-increments} is how many copies of the white stencil we make
> on our way out to thickness.  @var{angle-increments} is how many copies
> of the white stencil we make between 0 and 2*pi."
>   (if (or (not (positive? angle-increments))
>           (not (positive? radial-increments)))
>       (begin
>        (ly:warning "Both angle-increments and radial-increments must
> be positive numbers.")
>        stil)
>       (let* ((2pi 6.283185307)
>              (angle-inc (/ 2pi angle-increments))
>              (radial-inc (/ thickness radial-increments)))
>
>         (define (circle-plot ang dec radius original-stil new-stil)
>           ;; ang (angle) and dec (decrement) are in radians, not degrees
>           (if (<= ang 0)
>               new-stil
>               (circle-plot (- ang dec) dec radius original-stil
>                 (ly:stencil-add
>                  new-stil
>                  (ly:stencil-translate original-stil
>                    (cons
>                     (* radius (cos ang))
>                     (* radius (sin ang))))))))
>
>         (define (radial-plot radius original-stil new-stil)
>           (if (<= radius 0)
>               new-stil
>               (ly:stencil-add new-stil
>                 (radial-plot
>                  (- radius radial-inc)
>                  original-stil
>                  (circle-plot 2pi angle-inc
>                    radius original-stil empty-stencil)))))
>
>         (let ((whiteout-expr
>                 (ly:stencil-expr
>                  (stencil-with-color
>                   ;;;; `uncolor-stencil' applied
>                   (radial-plot thickness (uncolor-stencil stil)
> empty-stencil)
>                   color))))
>           (ly:stencil-add
>             (ly:make-stencil
>               `(delay-stencil-evaluation ,(delay whiteout-expr)))
>             stil)))))
>
> #(define-markup-command (outliner layout props thickness color arg)
>   (number? color? markup?)
>   #:category other
>   #:properties ((angle-increments 16)
>                 (radial-increments 1))
>
>   (stencil-whiteout-outline
>     (interpret-markup layout props arg)
>     (* thickness (ly:output-def-lookup layout 'line-thickness))
>     color
>     angle-increments
>     radial-increments))
>
> %%%%%%%%%%%%%%%%%%
> %% EXAMPLES
> %%%%%%%%%%%%%%%%%%
>
> %% nested colors
> \markup
>   \outliner #2 #(x11-color 'orange)
>   \with-color #(rgb-color 0.6 0.2 0.6)
>   \column {
>     \with-color #yellow \line { what ever this might be }
>     \line { \with-color #cyan "Some" \with-color #blue "Music" }
>     \line { what else this might be }
> }
>
> %% stencil-whiteout-outline with a precolored stencil
> \markup
>   \stencil
>   #(stencil-whiteout-outline
>     (stencil-with-color
>       (make-filled-box-stencil '(-1 . 1) '(-1 . 1))
>       green)
>     0.5
>     red
>     16
>     1)
>
> %% simple stencils, colored/uncolored
> #(define my-box-stil (make-filled-box-stencil '(-1 . 1) '(-1 . 1)))
>
> \markup {
>   \stencil
>     #my-box-stil
>   \stencil
>     #(stencil-with-color my-box-stil green)
>   \stencil
>     #(stencil-with-color
>       (uncolor-stencil
>         (stencil-with-color my-box-stil green))
>       red)
>   \stencil
>     #(stencil-with-color empty-stencil red)
> }
>
>
> Cheers,
>   Harm
>
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to