]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/output-lib.scm
Fix some bugs in the dynamic engraver and PostScript backend
[lilypond.git] / scm / output-lib.scm
index 96cc55cdd62260915b25a41b9f18713364eab4c6..bf98dbab41487de60be66c96050353531f7e01cc 100644 (file)
@@ -2,14 +2,14 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 1998--2005 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; (c) 1998--2006 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;; Han-Wen Nienhuys <hanwen@cs.uu.nl>
 
 
 ;;; Tablature functions, by Jiba (jiba@tuxfamily.org)
 
 ;; The TabNoteHead stem attachment function.
-(define (tablature-stem-attachment-function style duration)
+(define (note-head::calc-tablature-stem-attachment grob)
   (cons 0.0 1.35))
 
 ;; The TabNoteHead tablatureFormat callback.
                       (else fret)))))))
 
 
+; default tunings for common string instruments
 (define-public guitar-tuning '(4 -1 -5 -10 -15 -20))
+(define-public guitar-open-g-tuning '(2 -1 -5 -10 -17 -22))
 (define-public bass-tuning '(-17 -22 -27 -32))
+(define-public mandolin-tuning '(16 9 2 -5))
 
 ;; tunings for 5-string banjo
 (define-public banjo-open-g-tuning '(2 -1 -5 -10 7))
 (define-public banjo-modal-tuning '(2 0 -5 -10 7))
 (define-public banjo-open-d-tuning '(2 -3 -6 -10 9))
 (define-public banjo-open-dm-tuning '(2 -3 -6 -10 9))
-;; convert 5-string banjo tunings to 4-string tunings by
-;; removing the 5th string
-;;
-;; example:
-;; \set TabStaff.stringTunings = #(four-string-banjo banjo-open-g-tuning)
+;; convert 5-string banjo tuning to 4-string by removing the 5th string
 (define-public (four-string-banjo tuning)
   (reverse (cdr (reverse tuning))))
 
 ;;; end of tablature functions
 
 (define-public (make-stencil-boxer thickness padding callback)
+
   "Return function that adds a box around the grob passed as argument."
-  (lambda (grob) (box-stencil (callback grob) thickness padding)))
+  (lambda (grob)
+    
+    (box-stencil (callback grob) thickness padding)))
 
 (define-public (make-stencil-circler thickness padding callback)
   "Return function that adds a circle around the grob passed as argument."
 
 (define-public (print-circled-text-callback grob)
   (let* ((text (ly:grob-property grob 'text))
+        
         (layout (ly:grob-layout grob))
         (defs (ly:output-def-lookup layout 'text-font-defaults))
         (props (ly:grob-alist-chain grob defs))
-        (circle (Text_interface::interpret_markup
-                 layout props (make-draw-circle-markup 0.8 0.1 #f)))
-        (text-stencil (Text_interface::interpret_markup layout props text)))
-    
-    (ly:stencil-add (centered-stencil text-stencil) circle)))
+        (circle (ly:text-interface::interpret-markup
+                 layout props (make-circle-markup text))))
+    circle))
 
 
 ;;(define (mm-to-pt x)
 
 
 ;; silly, use alist? 
-(define-public (find-notehead-symbol duration style)
-  (case style
-    ((xcircle) "2xcircle")
-    ((harmonic) "0harmonic")
-    ((baroque) 
-     ;; Oops, I actually would not call this "baroque", but, for
-     ;; backwards compatibility to 1.4, this is supposed to take
-     ;; brevis, longa and maxima from the neo-mensural font and all
-     ;; other note heads from the default font.  -- jr
-     (if (< duration 0)
-        (string-append (number->string duration) "neomensural")
-        (number->string duration)))
-    ((mensural)
-     (string-append (number->string duration) (symbol->string style)))
-    ((petrucci)
-     (if (< duration 0)
-        (string-append (number->string duration) "mensural")
-        (string-append (number->string duration) (symbol->string style))))
-    ((neomensural)
-     (string-append (number->string duration) (symbol->string style)))
-    ((default)
-     ;; The default font in mf/feta-bolletjes.mf defines a brevis, but
-     ;; neither a longa nor a maxima.  Hence let us, for the moment,
-     ;; take these from the neo-mensural font.  TODO: mf/feta-bolletjes
-     ;; should define at least a longa for the default font.  The longa
-     ;; should look exactly like the brevis of the default font, but
-     ;; with a stem exactly like that of the quarter note. -- jr
-     (if (< duration -1)
-        (string-append (number->string duration) "neomensural")
-        (number->string duration)))
-    (else
-     (if (string-match "vaticana*|hufnagel*|medicaea*" (symbol->string style))
-        (symbol->string style)
-        (string-append (number->string (max 0 duration))
-                       (symbol->string style))))))
+(define-public (note-head::calc-glyph-name grob)
+  (let*
+      ((style (ly:grob-property grob 'style))
+       (log (min 2 (ly:grob-property grob 'duration-log))))
+    
+    (case style
+      ((xcircle) "2xcircle")
+      ((harmonic) "0harmonic")
+      ((baroque) 
+       ;; Oops, I actually would not call this "baroque", but, for
+       ;; backwards compatibility to 1.4, this is supposed to take
+       ;; brevis, longa and maxima from the neo-mensural font and all
+       ;; other note heads from the default font.  -- jr
+       (if (< log 0)
+          (string-append (number->string log) "neomensural")
+          (number->string log)))
+      ((mensural)
+       (string-append (number->string log) (symbol->string style)))
+      ((petrucci)
+       (if (< log 0)
+          (string-append (number->string log) "mensural")
+          (string-append (number->string log) (symbol->string style))))
+      ((neomensural)
+       (string-append (number->string log) (symbol->string style)))
+      ((default)
+       ;; The default font in mf/feta-bolletjes.mf defines a brevis, but
+       ;; neither a longa nor a maxima.  Hence let us, for the moment,
+       ;; take these from the neo-mensural font.  TODO: mf/feta-bolletjes
+       ;; should define at least a longa for the default font.  The longa
+       ;; should look exactly like the brevis of the default font, but
+       ;; with a stem exactly like that of the quarter note. -- jr
+       (if (< log -1)
+          (string-append (number->string log) "neomensural")
+          (number->string log)))
+      (else
+       (if (string-match "vaticana*|hufnagel*|medicaea*" (symbol->string style))
+          (symbol->string style)
+          (string-append (number->string (max 0 log))
+                         (symbol->string style)))))))
 
 ;; TODO junk completely?
 (define (note-head-style->attachment-coordinates grob axis)
@@ -172,7 +177,7 @@ centered, X==1 is at the right, X == -1 is at the left."
 
 (define-public (first-bar-number-invisible barnum) (> barnum 1))
 
-;; See documentation of Item::visibility_lambda_
+;; See documentation of ly:item::visibility-lambda-
 (define-public begin-of-line-visible
   #(#f #f #t))
 (define-public end-of-line-visible
@@ -194,8 +199,11 @@ centered, X==1 is at the right, X == -1 is at the left."
 ;; How should a  bar line behave at a break? 
 ;;
 ;; Why prepend `default-' to every scm identifier?
-(define-public (default-break-barline glyph dir)
-  (let ((result (assoc glyph 
+(define-public (bar-line::calc-glyph-name grob)
+  (let* (
+        (glyph (ly:grob-property grob 'glyph))
+        (dir (ly:item-break-dir grob))
+        (result (assoc glyph 
                       '((":|:" . (":|" . "|:"))
                         ("||:" . ("||" . "|:"))
                         ("|" . ("|" . ()))
@@ -211,13 +219,22 @@ centered, X==1 is at the right, X == -1 is at the left."
                         (".|." . (".|." . ()))
                         ("" . ("" . ""))
                         (":" . (":" . ""))
+                        ("." . ("." . ()))
                         ("empty" . (() . ()))
                         ("brace" . (() . "brace"))
-                        ("bracket" . (() . "bracket"))  ))))
+                        ("bracket" . (() . "bracket"))  )))
+        (glyph-name (if (= dir CENTER)
+                        glyph
+                        (if (and result (string? (index-cell (cdr result) dir)))
+                            (index-cell (cdr result) dir)
+                            #f)))
+        )
+
+    (if (not glyph-name)
+       (ly:grob-suicide! grob))
+
+    glyph-name))
 
-    (if (equal? result #f)
-       (ly:warning (_ "unknown bar glyph: `~S'" glyph))
-       (index-cell (cdr result) dir))))
 
 (define-public (shift-right-at-line-begin g)
   "Shift an item to the right, but only at the start of the line."
@@ -237,31 +254,72 @@ centered, X==1 is at the right, X == -1 is at the left."
 (define-public red         '(1.0 0.0 0.0))
 (define-public green       '(0.0 1.0 0.0))
 (define-public blue        '(0.0 0.0 1.0))
-(define-public cyan        '(1.0 1.0 0.0))
+(define-public cyan        '(0.0 1.0 1.0))
 (define-public magenta     '(1.0 0.0 1.0))
-(define-public yellow      '(0.0 1.0 1.0))
+(define-public yellow      '(1.0 1.0 0.0))
 
 (define-public grey        '(0.5 0.5 0.5))
 (define-public darkred     '(0.5 0.0 0.0))
 (define-public darkgreen   '(0.0 0.5 0.0))
 (define-public darkblue    '(0.0 0.0 0.5))
-(define-public darkcyan    '(0.5 0.5 0.0))
+(define-public darkcyan    '(0.0 0.5 0.5))
 (define-public darkmagenta '(0.5 0.0 0.5))
-(define-public darkyellow  '(0.0 0.5 0.5))
+(define-public darkyellow  '(0.5 0.5 0.0))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Pitch Trill Heads
+;; * Pitch Trill Heads
+;; * Parentheses
 
-(define (parenthesize-elements grob)
+(define (parenthesize-elements grob . rest)
   (let*
-      ((elts (ly:grob-object grob 'elements))
-       (x-ext (ly:relative-group-extent elts grob X))
+      (
+       (refp (if (null? rest)
+                grob
+                (car rest)))
+       (elts (ly:grob-object grob 'elements))
+       (x-ext (ly:relative-group-extent elts refp X))
+
        (font (ly:grob-default-font grob))
        (lp (ly:font-get-glyph font "accidentals.leftparen"))
        (rp (ly:font-get-glyph font "accidentals.rightparen"))
-       (padding 0.1))
+       (padding (ly:grob-property grob 'padding 0.1)))
 
     (ly:stencil-add
      (ly:stencil-translate-axis lp (- (car x-ext) padding) X)
      (ly:stencil-translate-axis rp (+ (cdr x-ext) padding) X))
   ))
+
+
+(define (parentheses-item::print me)
+  (let*
+      ((elts (ly:grob-object me 'elements))
+       (y-ref (ly:grob-common-refpoint-of-array me elts Y))
+       (x-ref (ly:grob-common-refpoint-of-array me elts X))
+       (stencil (parenthesize-elements me x-ref))
+       (elt-y-ext  (ly:relative-group-extent elts y-ref Y))
+       (y-center (interval-center elt-y-ext)))
+
+    (ly:stencil-translate
+     stencil
+     (cons
+      (-
+       (ly:grob-relative-coordinate me x-ref X))
+      (-
+       y-center
+       (ly:grob-relative-coordinate me y-ref Y))))
+    ))
+
+       
+       
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; 
+
+(define-public (chain-grob-member-functions grob value . funcs)
+  (for-each
+   (lambda (func)
+     (set! value (func grob value)))
+   funcs)
+
+  value)
+