Added to the LSR: http://lsr.di.unimi.it/LSR/Item?id=1016
Cheers,
Pierre

2016-01-16 11:26 GMT+01:00 Pierre Perol-Schneider <
[email protected]>:

> Thank you Harm, great work.
> Cheers,
> Pierre
>
> 2016-01-15 23:58 GMT+01:00 Thomas Morley <[email protected]>:
>
>> 2016-01-13 22:14 GMT+01:00 Thomas Morley <[email protected]>:
>> > 2016-01-13 16:17 GMT+01:00 Paul Morris <[email protected]>:
>> >>> On Jan 12, 2016, at 6:09 PM, Thomas Morley <[email protected]>
>> 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
[email protected]
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to