[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
markups and extents
From: |
address@hidden |
Subject: |
markups and extents |
Date: |
Thu, 20 Oct 2011 11:00:57 +0200 |
Hey all,
I'm starting to work on a markup overhaul and I've been able to frame the
problem with the code below. There are two callbacks each for X and pure-Y:
my-x-callback-one
my-x-callback-two
my-y-callback-one
my-y-callback-two
my-*-callback-one gives minimal estimates for the given dimension, whereas
my-*-callback-two gives maximal estimates.
The only code that doesn't lead to overlap is the use of maximal estimates for
everything (my-*-callback-two, which I pasted below). Subbing in
my-*-callback-one for either value will lead to overlapping. However,
my-*-callback-two being very generous, the vertical spacing becomes too large.
So, my question before I start fiddling with the C++ side is: is there a way to
use non-pure-heights in LilyPond's vertical layout?
If not, my proposed game plan is the following (suggestions welcome!):
1) Create a variable in the Paper_column class called pure_x_offset_
2) From constrained-breaking.cc, run the spring and rods problem on an
infinitely long line. Give all paper columns a pure_x_offset_ that comes from
this spring and rods problem (this, I'd argue, is the ideal horizontal spacing,
unfettered by the length and width of a page).
3) Create a TextScriptSpanner
4) The pure height function of a text script spanner
(Text_script_spanner::pure_height (SCM smob, SCM start, SCM end)) would go like
such:
---) if `start' is to the right of the TextScriptSpanner's left bound, return 0.
---) otherwise, find the distance between the pure_x_offset_ of the
TextScriptSpanner's left bound and the pure_x_offset_ of the column at `end'
---) use this line-width to justify the text, then find the Y-extent of this
stencil. this is the pure-Y value between `start' and `end'.
Obviously, pure_x_offset_ will get progressively off as a piece continues, but
for small ranges of columns, it will likely provide a good estimation of grobs'
spacing.
But, again, before I spend the 4ish hours necessary to do this, does anyone see
any problems with it?
Cheers,
MS
#(define (define-grob-property symbol type? description)
(if (not (equal? (object-property symbol 'backend-doc) #f))
(ly:error (_ "symbol ~S redefined") symbol))
(set-object-property! symbol 'backend-type? type?)
(set-object-property! symbol 'backend-doc description)
symbol)
#(define (has-interface? grob interface)
(member interface
(assoc-get 'interfaces
(ly:grob-property grob 'meta))))
#(define-grob-property 'nuggets list? "List of text for a markup.")
#(define (my-max x y) (if (> (interval-length x) (interval-length y)) x y))
#(define (my-add x y) (cons (car x) (+ (cdr x) (interval-length y))))
#(define (my-x-callback-one grob)
(reduce my-max -1000 (map (lambda (x) (ly:stencil-extent
(grob-interpret-markup grob x) X))
(ly:grob-property grob 'nuggets))))
#(define (my-x-callback-two grob)
(ly:stencil-extent (grob-interpret-markup grob (make-line-markup
(ly:grob-property grob 'nuggets))) X))
#(define (my-y-callback-one grob start end)
(ly:stencil-extent (grob-interpret-markup grob (make-line-markup
(ly:grob-property grob 'nuggets))) Y))
#(define (my-y-callback-two grob start end)
(reduce my-add '(0 . 0) (map (lambda (x) (ly:stencil-extent
(grob-interpret-markup grob x) X))
(ly:grob-property grob 'nuggets))))
#(define (find-system grob)
(if (has-interface? grob 'system-interface)
grob
(find-system (ly:grob-parent grob X))))
#(define (my-stencil grob)
(let* ((system (find-system grob))
(mkups (map (lambda (x) (markup x)) (ly:grob-property grob 'nuggets)))
(r-bound (ly:spanner-bound system RIGHT))
(l-coord (ly:grob-relative-coordinate grob system X))
(r-coord (ly:grob-relative-coordinate r-bound system X)))
(grob-interpret-markup grob (markup #:override `(line-width . ,(- r-coord
l-coord)) (make-justify-markup mkups)))))
foo =
#(define-music-function (parser location s) (string?)
#{
\once \override TextScript #'nuggets = #(string-split $s #\space)
\once \override TextScript #'Y-extent = #(ly:make-unpure-pure-container
ly:grob::stencil-height my-y-callback-two)
\once \override TextScript #'X-extent = #my-x-callback-two
\once \override TextScript #'stencil = #my-stencil
#})
\relative c' {
\override Score . PaperColumn #'keep-inside-line = ##f
\repeat unfold 40 { \foo #"Hello world this is a test of a Scheme markup
splitting system." d^\markup { \null } a b c d e f g }
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- markups and extents,
address@hidden <=