]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/stencil.scm
Merge branch 'master' of carldsorensen@git.sv.gnu.org:/srv/git/lilypond into fret...
[lilypond.git] / scm / stencil.scm
index 19303ae691bc85d1499de93ae24b19dc01161244..8513c6389a3bd95499315bf6ea54e743719e1485 100644 (file)
@@ -2,7 +2,14 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2003--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; (c) 2003--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+(define-public (translate-stencil stencil coordinate-pair)
+  "Translate @code{stencil} by the distances specified in
+@code{coordinate-pair}."
+  (ly:stencil-translate-axis
+    (ly:stencil-translate-axis stencil (cdr coordinate-pair) Y)
+    (car coordinate-pair) X))
 
 (define-public (stack-stencils axis dir padding stils)
   "Stack stencils STILS in direction AXIS, DIR, using PADDING."
       (interval-widen xext (/ width 2))
       (interval-widen yext (/ width 2)))))
 
+(define-public (make-round-filled-box-stencil xext yext blot-diameter)
+  "Make a filled rounded box."
+  
+  (ly:make-stencil
+      (list 'round-filled-box (- (car xext)) (cdr xext)
+                       (- (car yext)) (cdr yext) blot-diameter)
+      xext yext))
+
 (define-public (make-filled-box-stencil xext yext)
   "Make a filled box."
   
    (cons (- out-radius) out-radius)
    (cons (- out-radius) out-radius))))
 
+(define-public (make-oval-stencil x-radius y-radius thickness fill)
+  "Make an oval from two Bezier curves, of x radius @var{x-radius}, 
+    y radius @code{y-radius},
+    and thickness @var{thickness} with fill defined by @code{fill}."
+  (let*
+      ((x-out-radius (+ x-radius (/ thickness 2.0))) 
+       (y-out-radius (+ y-radius (/ thickness 2.0))) )
+    
+  (ly:make-stencil
+   (list 'oval x-radius y-radius thickness fill) 
+   (cons (- x-out-radius) x-out-radius)
+   (cons (- y-out-radius) y-out-radius))))
+
+(define-public (make-ellipse-stencil x-radius y-radius thickness fill)
+  "Make an ellipse of x radius @var{x-radius}, y radius @code{y-radius},
+    and thickness @var{thickness} with fill defined by @code{fill}."
+  (let*
+      ((x-out-radius (+ x-radius (/ thickness 2.0))) 
+       (y-out-radius (+ y-radius (/ thickness 2.0))) )
+    
+  (ly:make-stencil
+   (list 'ellipse x-radius y-radius thickness fill) 
+   (cons (- x-out-radius) x-out-radius)
+   (cons (- y-out-radius) y-out-radius))))
+
 (define-public (box-grob-stencil grob)
   "Make a box of exactly the extents of the grob.  The box precisely
 encloses the contents.
@@ -129,10 +169,10 @@ encloses the contents.
 
 (define-public (circle-stencil stencil thickness padding)
   "Add a circle around STENCIL, producing a new stencil."
-  (let* ((x-ext (ly:stencil-extent stencil 0))
-        (y-ext (ly:stencil-extent stencil 1))
-        (diameter (max (- (cdr x-ext) (car x-ext))
-                       (- (cdr y-ext) (car y-ext))))
+  (let* ((x-ext (ly:stencil-extent stencil X))
+        (y-ext (ly:stencil-extent stencil Y))
+        (diameter (max (interval-length x-ext)
+                        (interval-length y-ext))) 
         (radius (+ (/ diameter 2) padding thickness))
         (circle (make-circle-stencil radius thickness #f)))
 
@@ -143,6 +183,46 @@ encloses the contents.
                            (interval-center x-ext)
                            (interval-center y-ext))))))
 
+(define-public (oval-stencil stencil thickness x-padding y-padding)
+  "Add an oval around @code{stencil}, padded by the padding pair, 
+   producing a new stencil."
+  (let* ((x-ext (ly:stencil-extent stencil X))
+        (y-ext (ly:stencil-extent stencil Y))
+         (x-length (+ (interval-length x-ext) x-padding thickness))
+         (y-length (+ (interval-length y-ext) y-padding thickness))
+         (x-radius (* 0.707 x-length) )
+         (y-radius (* 0.707 y-length) )
+        (oval (make-oval-stencil x-radius y-radius thickness #f)))
+
+    (ly:stencil-add
+     stencil
+     (ly:stencil-translate oval
+                          (cons
+                           (interval-center x-ext)
+                           (interval-center y-ext))))))
+
+(define-public (ellipse-stencil stencil thickness x-padding y-padding)
+  "Add an ellipse around STENCIL, padded by the padding pair, 
+   producing a new stencil."
+  (let* ((x-ext (ly:stencil-extent stencil X))
+        (y-ext (ly:stencil-extent stencil Y))
+         (x-length (+ (interval-length x-ext) x-padding thickness))
+         (y-length (+ (interval-length y-ext) y-padding thickness))
+         ;(aspect-ratio (/ x-length y-length))
+         (x-radius (* 0.707 x-length) )
+         (y-radius (* 0.707 y-length) )
+        ;(diameter (max (- (cdr x-ext) (car x-ext))
+        ;              (- (cdr y-ext) (car y-ext))))
+        ;(radius (+ (/ diameter 2) padding thickness))
+        (ellipse (make-ellipse-stencil x-radius y-radius thickness #f)))
+
+    (ly:stencil-add
+     stencil
+     (ly:stencil-translate ellipse
+                          (cons
+                           (interval-center x-ext)
+                           (interval-center y-ext))))))
+
 (define-public (rounded-box-stencil stencil thickness padding blot)
    "Add a rounded box around STENCIL, producing a new stencil."