-(define (search-executable names)
- (define (helper path lst)
- (if (null? (cdr lst))
- (car lst)
- (if (search-path path (car lst)) (car lst)
- (helper path (cdr lst)))))
-
- (let ((path (parse-path (getenv "PATH"))))
- (helper path names)))
-
-(define (search-gs)
- (search-executable '("gs-nox" "gs-8.15" "gs")))
-
-(define (gulp-port port max-length)
- (let ((str (make-string max-length)))
- (read-string!/partial str port 0 max-length)
- str))
-
-(define (gulp-file nm len)
-
- ;; string routines barf when strlen() != string-length,.
- ;; which may happen as side effect of read-string!/partial.
-
- ; (gulp-port (open-file nm "r") len))
- (ly:gulp-file nm len))
-
-
-(define BOUNDING-BOX-RE
- "^%%BoundingBox: (-?[0-9]+) (-?[0-9]+) (-?[0-9]+) (-?[0-9]+)")
-
-(define (get-bbox file-name)
- (let* ((bbox (string-append file-name ".bbox"))
- ;; -sOutputFile does not work with bbox?
- (cmd (format #t "gs\
- -sDEVICE=bbox\
- -q\
- -dNOPAUSE\
- ~S\
- -c showpage\
- -c quit 2>~S"
- file-name bbox))
- (status (system cmd))
- (s (gulp-file d bbox 10240))
- (m (string-match BOUNDING_BOX_RE s)))
-
- (if m
- (list->vector
- (map (lambda (x) (string->number (car x))) (vector->list m)))
- #f)))
-
-
-;; copy of ly:system. ly:* not available via lilypond-ps2png.scm
-(define (my-system be-verbose exit-on-error cmd)
- (define status 0)
- (if be-verbose
- (begin
- (format (current-error-port) (_ "Invoking `~a'...") cmd)
- (newline (current-error-port))))
-
-
- (set! status (system cmd))
-
- (if (not (= status 0))
- (begin
- (format (current-error-port)
- (format #f (_ "~a exited with status: ~S") "GS" status))
- (if exit-on-error
- (exit 1))))
-
- status)
-
-(define (scale-down-image be-verbose factor file)
- (let* ((status 0)
- (percentage (* 100 (/ 1.0 factor)))
- (old (string-append file ".old")))
-
- (rename-file file old)
- (my-system be-verbose
- #t
- (format #f "convert -scale \"~a%\" -depth 8 ~a ~a" percentage old file))
- (delete-file old)
- ))
+(define-public (gulp-file file-name . max-size)
+ (ly:gulp-file file-name (if (pair? max-size) (car max-size))))
+
+(define (search-pngtopam)
+ (search-executable
+ (if (eq? PLATFORM 'windows)
+ '("pngtopam.exe" "pngtopnm.exe")
+ '("pngtopam" "pngtopnm"))))
+
+(define (search-pamscale)
+ (search-executable
+ (if (eq? PLATFORM 'windows)
+ '("pamscale.exe" "pnmscale.exe")
+ '("pamscale" "pnmscale"))))
+
+(define (search-pnmtopng)
+ (search-executable
+ (if (eq? PLATFORM 'windows)
+ '("pnmtopng.exe")
+ '("pnmtopng"))))
+
+(define (scale-down-image factor file)
+ (let* ((port-tmp1 (make-tmpfile))
+ (tmp1-name (port-filename port-tmp1))
+ (port-tmp2 (make-tmpfile))
+ (tmp2-name (port-filename port-tmp2))
+ ;; Netpbm commands (pngtopnm, pnmscale, pnmtopng)
+ ;; outputs only standard output instead of a file.
+ ;; So we need pipe and redirection.
+ ;; However, ly:system can't handle them.
+ ;; Therefore, we use ly:system-with-shell.
+ (cmd
+ (ly:format
+ "~a \"~a\" | ~a -reduce ~a | ~a -compression 9 > \"~a\""
+ (search-pngtopam) tmp1-name
+ (search-pamscale) factor
+ (search-pnmtopng)
+ tmp2-name)))
+
+ (close-port port-tmp1)
+ (close-port port-tmp2)
+ (ly:debug (_ "Copying `~a' to `~a'...") file tmp1-name)
+ (copy-binary-file file tmp1-name)
+ (ly:system-with-shell cmd)
+ (ly:debug (_ "Copying `~a' to `~a'...") tmp2-name file)
+ (copy-binary-file tmp2-name file)
+ (ly:debug (_ "Deleting `~a'...") tmp1-name)
+ (delete-file tmp1-name)
+ (ly:debug (_ "Deleting `~a'...") tmp2-name)
+ (delete-file tmp2-name)))