[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Creates pure closures (issue 4894052)
From: |
Mike Solomon |
Subject: |
Re: Creates pure closures (issue 4894052) |
Date: |
Thu, 18 Aug 2011 14:31:55 +0200 |
On Aug 18, 2011, at 1:06 PM, Reinhold Kainhofer wrote:
> Am Thursday, 18. August 2011, 11:21:59 schrieb address@hidden:
>> This is a more extensible way to deal with pure properties. I'd like
>> this patch to be the first step, with the second step being rewriting
>> define-grob-properties.scm such that it uses pure closures as much as
>> possible. First, create a procedure:
>>
>> #(define-public (pure-wrapper proc)
>> (lambda (grob start end) (proc grob)))
>>
>> Then, for example:
>>
>> (stencil . ,ly:clef::print)
>>
>> becomes
>>
>> (stencil . ,(ly:pure-closure ly:clef::print (pure-wrapper
>> ly:clef::print)))
>
> Wow, that would be VERY user-unfriendly. Just imagine explaining that to
> someone on -user...
> (or even to the average lilypond developer... I still haven't understood what
> closures are).
>
I think it is rather easy (and necessary) to explain this to a user, especially
if there are helper functions.
Example:
in output-lib.scm, write
#(define-public (pure-wrapper proc)
(lambda (grob start end) (proc grob)))
#(define-public (simple-pure proc)
(ly:pure-closure proc (pure-wrapper proc))
#(define-public (simple-pure-height proc)
(ly:pure-closure ly:grob::stencil-height (pure-wrapper proc))
The, in the documentations on overrides:
Sometimes, you will want to override a stencil and will want this stencil to be
taken into account when LilyPond does horizontal spacing. For LilyPond to know
that a stencil will not lead to things going bad (i.e. triggering a calculation
that should happen at the end of a series of calculations at the beginning), it
needs what are called "pure" approximations of grobs. If you know that your
grob's height will be pure (meaning it can be calculated without triggering
lots of other calculations in other grobs), you can help the horizontal spacing
engine by adding the following override:
\override Clef #'stencil = #my-stencil-proc
\override Clef #'Y-extent = #(simple-pure-height my-stencil-proc)
Of course, if you think that your stencil function will wreak havoc on other
grobs, don't use simple-pure-height. Some suggestions:
1) If your stencil does not use the grob at all and just draws shapes, you can
use simple-pure-height.
2) If you are positive that your stencil does not trigger a VerticalAlignment
grob, you can use simple-pure-height.
A good way to know if your stencil is pure or not is to run it through LilyPond.
#(define (my-good-unpure-property grob) (ly:stem::height grob))
#(define (my-bad-pure-property grob start end) (ly:stem::height grob))
#(define (my-good-pure-property grob start end) (ly:stem::pure-height grob
start end))
First, try:
\relative c' {
\override Stem #'Y-extent =
#(ly:make-pure-closure my-good-unpure-property my-bad-pure-property)
\repeat unfold 10 { d8 fis e gis }
}
Then, try:
\relative c' {
\override Stem #'Y-extent =
#(ly:make-pure-closure my-good-unpure-property my-good-pure-property)
\repeat unfold 10 { d8 fis e gis }
}
The first will issue a series of warning messages, whereas the second will not.
***
You get the idea.
I think that, even with this introduced, the average user can keep on doing
exactly what she was doing before this patch - this just gives her the ability
to introduce her stencils into skyline calculations.
Cheers,
MS
- Creates pure closures (issue 4894052), mtsolo, 2011/08/18
- Re: Creates pure closures (issue 4894052), n . puttock, 2011/08/19
- Re: Creates pure closures (issue 4894052), pkx166h, 2011/08/27
- Re: Creates pure closures (issue 4894052), n . puttock, 2011/08/31
- Re: Creates pure closures (issue 4894052), n . puttock, 2011/08/31