]> git.donarmstrong.com Git - lilypond.git/blob - input/test/boxed-molecule.ly
e4b660d41d09a4326417ba9c21cf1dc2aa63b802
[lilypond.git] / input / test / boxed-molecule.ly
1 \version "1.3.146"
2 \header {
3
4 texidoc = "overriding the molecule callback can also be used to draw a
5  box around arbitrary grobs.
6
7  TODO: check whether the corners are really correct.
8  
9  "
10 }
11 #(define (box-molecule xext yext)
12   (ly-make-molecule
13       (list 'filledbox (- (car xext)) (cdr xext)
14                        (- (car yext)) (cdr yext))
15       xext yext)                       
16 )
17
18 #(define (widen-interval iv amount)
19    (cons (- (car iv) amount)
20          (+ (cdr iv) amount))
21 )
22
23 #(define (make-molecule-boxer callback)
24   (define (molecule-boxer grob)
25   (let*
26    (
27     (mol    (callback grob))
28     (box-padding 0.1)
29     (x-ext (widen-interval (ly-get-molecule-extent mol 0) box-padding))
30     (y-ext (widen-interval (ly-get-molecule-extent mol 1) box-padding))
31     (rule-thick 0.1)
32     (x-rule (box-molecule (widen-interval x-ext rule-thick)
33                               (cons 0 rule-thick)))
34     (y-rule (box-molecule (cons 0 rule-thick) y-ext))
35     )
36     
37     (set! mol (ly-combine-molecule-at-edge mol 0 1 y-rule (* 0.5 box-padding)))
38     (set! mol (ly-combine-molecule-at-edge mol 0 -1  y-rule (* 0.5 box-padding)))
39     (set! mol (ly-combine-molecule-at-edge mol 1 1  x-rule 0.0))  
40     (set! mol (ly-combine-molecule-at-edge mol 1 -1 x-rule 0.0))
41     
42     mol
43  ))
44  molecule-boxer
45  )
46
47
48  \score { \notes  {
49
50  \property Voice.TextScript \override #'molecule-callback =
51    #(make-molecule-boxer Text_item::brew_molecule)
52
53    c'4^"foo"
54
55 \property Voice.Stem \override #'molecule-callback =
56    #(make-molecule-boxer Stem::brew_molecule)
57
58       c''8
59    }}