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