]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/backend-library.scm
partial update of text, fixes doc build
[lilypond.git] / scm / backend-library.scm
index 71275a9ea938de74fe33931a30d6a97e2826c3b9..8963fe15caf9b344f55ec26cd19a1aba39d0bcfa 100644 (file)
@@ -2,13 +2,13 @@
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;; 
-;;;; (c) 2005--2006 Jan Nieuwenhuizen <janneke@gnu.org>
-;;;; Han-Wen Nienhuys <hanwen@cs.uu.nl>
+;;;; (c) 2005--2007 Jan Nieuwenhuizen <janneke@gnu.org>
+;;;; Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
 ;; backend helpers.
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
 ;; backend helpers.
 
-(define-public (ly:system command)
+(define-public (ly:system command . rest)
   (let* ((status 0)
         (dev-null "/dev/null")
         (silenced (if (or (ly:get-option 'verbose)
   (let* ((status 0)
         (dev-null "/dev/null")
         (silenced (if (or (ly:get-option 'verbose)
                       (format #f "~a > ~a 2>&1 " command dev-null))))
     (if (ly:get-option 'verbose)
        (ly:message (_ "Invoking `~a'...") command))
                       (format #f "~a > ~a 2>&1 " command dev-null))))
     (if (ly:get-option 'verbose)
        (ly:message (_ "Invoking `~a'...") command))
-    
-    (set! status (system silenced))
+
+    (set! status
+         (if (pair? rest)
+             (system-with-env silenced (car rest))
+             (system silenced)))
+       
     (if (> status 0)
        (begin
          (ly:message (_ "`~a' failed (~a)") command status)
     (if (> status 0)
        (begin
          (ly:message (_ "`~a' failed (~a)") command status)
          ;; hmmm.  what's the best failure option? 
          (throw 'ly-file-failed)))))
 
          ;; hmmm.  what's the best failure option? 
          (throw 'ly-file-failed)))))
 
+(define-public (system-with-env cmd env)
+
+  "Execute CMD in fork, with ENV (a list of strings) as the environment"
+  (let*
+      ;; laziness: should use execle?
+      
+      ((pid (primitive-fork)))
+    (if (= 0 pid)
+       ;; child
+       (begin
+         (environ env)
+         (system cmd))
+       
+       ;; parent
+       (cdr (waitpid pid)))))
+
 (define-public (sanitize-command-option str)
   "Kill dubious shell quoting"
   
 (define-public (sanitize-command-option str)
   "Kill dubious shell quoting"
   
     (helper path names)))
 
 (define-public (search-gs)
     (helper path names)))
 
 (define-public (search-gs)
-  (search-executable '("gs-nox" "gs-8.15" "gs")))
-
-(define-public (postscript->pdf papersizename name)
-  (let* ((pdf-name (string-append (basename name ".ps") ".pdf"))
-        (cmd (format #f
+  
+  ;; must be sure that we don't catch stuff from old GUBs.
+  (search-executable '("gs")))
+  
+(define-public (postscript->pdf paper-width paper-height name)
+  (let* ((pdf-name (string-append
+                   (dir-basename name ".ps" ".eps")
+                   ".pdf"))
+        (is-eps (string-match "\\.eps$" name))
+        (paper-size-string (if is-eps
+                               " -dEPSCrop "
+                               (ly:format "-dDEVICEWIDTHPOINTS=~$ \
+-dDEVICEHEIGHTPOINTS=~$ "
+                                       paper-width paper-height )))
+
+        (cmd (simple-format #f
                      "~a\
  ~a\
  ~a\
                      "~a\
  ~a\
  ~a\
+ ~a\
  -dCompatibilityLevel=1.4 \
  -dCompatibilityLevel=1.4 \
- -sPAPERSIZE=~a\
  -dNOPAUSE\
  -dBATCH\
  -r1200 \
  -dNOPAUSE\
  -dBATCH\
  -r1200 \
 "
                      (search-gs)
                      (if (ly:get-option 'verbose) "" "-q")
 "
                      (search-gs)
                      (if (ly:get-option 'verbose) "" "-q")
-                     (if (ly:get-option 'gs-font-load)
+                     (if (or (ly:get-option 'gs-load-fonts)
+                             (ly:get-option 'gs-load-lily-fonts))
+                             
                          " -dNOSAFER "
                          " -dSAFER ")
                          " -dNOSAFER "
                          " -dSAFER ")
-                     (sanitize-command-option papersizename)
+                     paper-size-string
                      pdf-name
                      name)))
     ;; The wrapper on windows cannot handle `=' signs,
                      pdf-name
                      name)))
     ;; The wrapper on windows cannot handle `=' signs,
 
     (ly:message (_ "Converting to `~a'...") pdf-name)
     (ly:progress "\n")
 
     (ly:message (_ "Converting to `~a'...") pdf-name)
     (ly:progress "\n")
-    (ly:system cmd)
-    ))
+    (ly:system cmd)))
 
 (use-modules (scm ps-to-png))
 
 
 (use-modules (scm ps-to-png))
 
-(define-public (postscript->png resolution paper-size-name name)
+(define-public (postscript->png resolution paper-width paper-height name)
+  (let* ((verbose (ly:get-option 'verbose))
+        (rename-page-1 #f))
+
     ;; Do not try to guess the name of the png file,
     ;; GS produces PNG files like BASE-page%d.png.
     ;; Do not try to guess the name of the png file,
     ;; GS produces PNG files like BASE-page%d.png.
-    ;;(ly:message (_ "Converting to `~a'...")
-    ;;     (string-append (basename name ".ps") "-page1.png" )))
-  (let ((paper-size (sanitize-command-option paper-size-name))
-       (verbose (ly:get-option 'verbose))
-       (rename-page-1 #f))
-
     (ly:message (_ "Converting to ~a...") "PNG")
     (ly:message (_ "Converting to ~a...") "PNG")
-    (make-ps-images name resolution paper-size rename-page-1 verbose
-                   (ly:get-option 'anti-alias-factor))
+    (make-ps-images name
+                   #:resolution resolution
+                   #:page-width paper-width
+                   #:page-height paper-height
+                   #:rename-page-1 rename-page-1
+                   #:be-verbose verbose
+                   #:anti-alias-factor (ly:get-option 'anti-alias-factor)
+                   #:pixmap-format (ly:get-option 'pixmap-format))
     (ly:progress "\n")))
 
 (define-public (postprocess-output paper-book module filename formats)
     (ly:progress "\n")))
 
 (define-public (postprocess-output paper-book module filename formats)
-  (let*
-      ((completed (completize-formats formats))
-       (base (string-regexp-substitute "\\.[a-z]+$" "" filename))
-       (intermediate (remove
-                     (lambda (x)
-                       (member x formats)) 
-                     completed)))
-    (for-each
-     (lambda (f)
-       ((eval (string->symbol (string-append "convert-to-" f)) module)
-       paper-book filename))
-     completed)
-
+  (let* ((completed (completize-formats formats))
+        (base (string-regexp-substitute "\\.[a-z]+$" "" filename))
+        (intermediate (remove (lambda (x) (member x formats)) completed)))
+    
+    (for-each (lambda (f)
+               ((eval (string->symbol (format "convert-to-~a" f))
+                      module) paper-book filename)) completed)
     (if (ly:get-option 'delete-intermediate-files)
     (if (ly:get-option 'delete-intermediate-files)
-       (for-each
-        (lambda (f)
-          (delete-file (string-append base "." f)))
-        intermediate))
-    ))
+       (for-each (lambda (f)
+                   (delete-file (string-append base "." f))) intermediate))))
 
 (define-public (completize-formats formats)
   (define new-fmts '())
 
 (define-public (completize-formats formats)
   (define new-fmts '())
-
   (if (member "png" formats)
       (set! formats (cons "ps" formats)))
   (if (member "pdf" formats)
       (set! formats (cons "ps" formats)))
   (if (member "png" formats)
       (set! formats (cons "ps" formats)))
   (if (member "pdf" formats)
       (set! formats (cons "ps" formats)))
-
-  (for-each
-   (lambda (x)
-     (if (member x formats) (set! new-fmts (cons x new-fmts))))
-   '("tex" "dvi" "ps" "pdf" "png"))
-
+  (for-each (lambda (x)
+             (if (member x formats) (set! new-fmts (cons x new-fmts))))
+           '("tex" "dvi" "ps" "pdf" "png"))
   (uniq-list (reverse new-fmts)))
 
 (define (header-to-file file-name key value)
   (uniq-list (reverse new-fmts)))
 
 (define (header-to-file file-name key value)
              (if (equal? "-" file-name) "<stdout>" file-name))
   (if (equal? file-name "-")
       (display value)
              (if (equal? "-" file-name) "<stdout>" file-name))
   (if (equal? file-name "-")
       (display value)
-      (display value (open-file file-name "w")))
+      (let ((port (open-file file-name "w")))
+       (display value port)
+       (close-port port)))
+
   (ly:progress "\n")
   "")
 
   (ly:progress "\n")
   "")