- (let*
- ((header (gulp-file ps-name 10240))
- (match (string-match "%%Pages: ([0-9]+)" header))
- (count (if match
- (string->number (match:substring match 1))
- 0)))
- count))
-
-(define-public (make-ps-images ps-name . rest)
- (let-optional
- rest ((resolution 90)
- (paper-size "a4")
- (rename-page-1? #f)
- (verbose? #f)
- (aa-factor 1)
- )
-
- (let* ((base (basename (re-sub "[.]e?ps" "" ps-name)))
- (header (gulp-file ps-name 10240))
- (png1 (string-append base ".png"))
- (pngn (string-append base "-page%d.png"))
- (page-count (ps-page-count ps-name))
-
- (multi-page? (> page-count 1))
- (output-file (if multi-page? pngn png1))
-
- ;;png16m is because Lily produces color nowadays.
- (gs-variable-options
- (if multi-page?
- (format #f "-sPAPERSIZE=~a" paper-size)
- "-dEPSCrop"))
- (cmd (format #f "~a\
- ~a\
- ~a\
- -dGraphicsAlphaBits=4\
- -dTextAlphaBits=4\
- -dNOPAUSE\
- -sDEVICE=png16m\
- -sOutputFile=~S\
- -r~S\
- ~S\
- -c quit"
- (search-gs)
- (if verbose? "" "-q")
- gs-variable-options
- output-file
- (* aa-factor resolution) ps-name))
- (status 0)
- (files '()))
-
- ;; The wrapper on windows cannot handle `=' signs,
- ;; gs has a workaround with #.
- (if (eq? PLATFORM 'windows)
- (begin
- (set! cmd (re-sub "=" "#" cmd))
- (set! cmd (re-sub "-dSAFER " "" cmd))))
-
- (set! status (my-system verbose? #f cmd))
+ (let* ((byte-count 10240)
+ (header (gulp-file ps-name byte-count))
+ (first-null (string-index header #\nul))
+ (match (string-match "%%Pages: ([0-9]+)"
+ (if (number? first-null)
+ (substring header 0 first-null)
+ header))))
+ (if match (string->number (match:substring match 1)) 0)))
+
+(define-public (make-ps-images base-name tmp-name is-eps . rest)
+ (let-keywords*
+ rest #f
+ ((resolution 90)
+ (page-width 100)
+ (page-height 100)
+ (rename-page-1 #f)
+ (be-verbose (ly:get-option 'verbose))
+ (pixmap-format 'png16m)
+ (anti-alias-factor 1))
+
+ (let* ((format-str (format #f "~a" pixmap-format))
+ (extension (cond
+ ((string-contains format-str "png") "png")
+ ((string-contains format-str "jpg") "jpeg")
+ ((string-contains format-str "jpeg") "jpeg")
+ (else
+ (ly:error "Unknown pixmap format ~a" pixmap-format))))
+ (png1 (format #f "~a.~a" base-name extension))
+ (pngn (format #f "~a-page%d.~a" base-name extension))
+ (page-count (ps-page-count tmp-name))
+ (multi-page? (> page-count 1))
+
+ ;; Escape `%' (except `page%d') for ghostscript
+ (base-name-gs (string-join
+ (string-split base-name #\%)
+ "%%"))
+ (png1-gs (format #f "~a.~a" base-name-gs extension))
+ (pngn-gs (format #f "~a-page%d.~a" base-name-gs extension))
+ (output-file (if multi-page? pngn-gs png1-gs))
+
+ (*unspecified* (if #f #f))
+ (cmd
+ (remove (lambda (x) (eq? x *unspecified*))
+ (list
+ (search-gs)
+ (if (ly:get-option 'verbose) *unspecified* "-q")
+ (if (or (ly:get-option 'gs-load-fonts)
+ (ly:get-option 'gs-load-lily-fonts)
+ (eq? PLATFORM 'windows))
+ "-dNOSAFER"
+ "-dSAFER")
+
+ (if is-eps
+ "-dEPSCrop"
+ (ly:format "-dDEVICEWIDTHPOINTS=~$" page-width))
+ (if is-eps
+ *unspecified*
+ (ly:format "-dDEVICEHEIGHTPOINTS=~$" page-height))
+ "-dGraphicsAlphaBits=4"
+ "-dTextAlphaBits=4"
+ "-dNOPAUSE"
+ "-dBATCH"
+ (ly:format "-sDEVICE=~a" pixmap-format)
+ "-dAutoRotatePages=/None"
+ (string-append "-sOutputFile=" output-file)
+ (ly:format "-r~a" (* anti-alias-factor resolution))
+ (string-append "-f" tmp-name))))
+ (files '()))
+
+ (ly:system cmd)