adapt better to available drawing and GUI libraries on Unix variants

This commit is contained in:
Matthew Flatt 2011-01-02 19:18:57 -07:00
parent 6fb6fca73b
commit df2351f90f
6 changed files with 61 additions and 43 deletions

View File

@ -56,19 +56,19 @@
(ffi-lib "libgio-2.0-0") (ffi-lib "libgio-2.0-0")
(ffi-lib "libgdk_pixbuf-2.0-0") (ffi-lib "libgdk_pixbuf-2.0-0")
(ffi-lib "libgdk-win32-2.0-0")] (ffi-lib "libgdk-win32-2.0-0")]
[else (ffi-lib "libgdk-x11-2.0" '("0"))])) [else (ffi-lib "libgdk-x11-2.0" '("0" ""))]))
(define gdk_pixbuf-lib (define gdk_pixbuf-lib
(case (system-type) (case (system-type)
[(windows) [(windows)
(ffi-lib "libgdk_pixbuf-2.0-0")] (ffi-lib "libgdk_pixbuf-2.0-0")]
[(unix) [(unix)
(ffi-lib "libgdk_pixbuf-2.0" '("0"))] (ffi-lib "libgdk_pixbuf-2.0" '("0" ""))]
[else gdk-lib])) [else gdk-lib]))
(define gtk-lib (define gtk-lib
(case (system-type) (case (system-type)
[(windows) [(windows)
(ffi-lib "libgtk-win32-2.0-0")] (ffi-lib "libgtk-win32-2.0-0")]
[else (ffi-lib "libgtk-x11-2.0" '("0"))])) [else (ffi-lib "libgtk-x11-2.0" '("0" ""))]))
(define-ffi-definer define-gtk gtk-lib) (define-ffi-definer define-gtk gtk-lib)
(define-ffi-definer define-gdk gdk-lib) (define-ffi-definer define-gdk gdk-lib)

View File

@ -7,7 +7,7 @@
"../private/utils.rkt") "../private/utils.rkt")
(define-runtime-lib cairo-lib (define-runtime-lib cairo-lib
[(unix) (ffi-lib "libcairo" '("2"))] [(unix) (ffi-lib "libcairo" '("2" ""))]
[(macosx) [(macosx)
(ffi-lib "libpixman-1.0.dylib") (ffi-lib "libpixman-1.0.dylib")
(ffi-lib "libpng14.14.dylib") (ffi-lib "libpng14.14.dylib")

View File

@ -9,12 +9,12 @@
define-gobj)) define-gobj))
(define-runtime-lib glib-lib (define-runtime-lib glib-lib
[(unix) (ffi-lib "libglib-2.0" '("0"))] [(unix) (ffi-lib "libglib-2.0" '("0" ""))]
[(macosx) (ffi-lib "libglib-2.0.0")] [(macosx) (ffi-lib "libglib-2.0.0")]
[(windows) (ffi-lib "libglib-2.0-0.dll")]) [(windows) (ffi-lib "libglib-2.0-0.dll")])
(define-runtime-lib gmodule-lib (define-runtime-lib gmodule-lib
[(unix) (ffi-lib "libgmodule-2.0" '("0"))] [(unix) (ffi-lib "libgmodule-2.0" '("0" ""))]
[(macosx) [(macosx)
(ffi-lib "libgmodule-2.0.0.dylib")] (ffi-lib "libgmodule-2.0.0.dylib")]
[(win32) [(win32)
@ -24,7 +24,7 @@
(ffi-lib "libgmodule-2.0-0.dll")]) (ffi-lib "libgmodule-2.0-0.dll")])
(define-runtime-lib gobj-lib (define-runtime-lib gobj-lib
[(unix) (ffi-lib "libgobject-2.0" '("0"))] [(unix) (ffi-lib "libgobject-2.0" '("0" ""))]
[(macosx) (ffi-lib "libgobject-2.0.0")] [(macosx) (ffi-lib "libgobject-2.0.0")]
[(windows) (ffi-lib "libgobject-2.0-0.dll")]) [(windows) (ffi-lib "libgobject-2.0-0.dll")])

View File

@ -8,22 +8,13 @@
"../private/utils.rkt" "../private/utils.rkt"
"../private/libs.rkt") "../private/libs.rkt")
(define-runtime-lib jpeg-lib (define-runtime-lib jpeg-lib
[(unix) (ffi-lib "libjpeg" '("62" ""))] [(unix) (ffi-lib "libjpeg" '("62" ""))]
[(macosx) [(macosx)
;; for PPC, it's actually version 8! ;; for PPC, it's actually version 8!
(ffi-lib "libjpeg.62.dylib")] (ffi-lib "libjpeg.62.dylib")]
[(windows) (ffi-lib "libjpeg-7.dll")]) [(windows) (ffi-lib "libjpeg-7.dll")])
(define JPEG_LIB_VERSION
(case (system-type)
[(macosx) (if (string=? "ppc-macosx"
(path->string (system-library-subpath #f)))
80
62)]
[(unix) 62]
[(windows) 70]))
(define-ffi-definer define-jpeg jpeg-lib (define-ffi-definer define-jpeg jpeg-lib
#:provide provide) #:provide provide)
(define-ffi-definer define-jpeg/private jpeg-lib) (define-ffi-definer define-jpeg/private jpeg-lib)
@ -70,19 +61,58 @@
;; and more ;; and more
)) ))
(define-cstruct _jpeg_any_struct ([err _jpeg_error_mgr-pointer]))
(define (error-exit m)
(let ([bstr (make-bytes JMSG_LENGTH_MAX)])
((jpeg_error_mgr-format_message
(jpeg_any_struct-err (cast m _pointer _jpeg_any_struct-pointer)))
m
bstr)
(error 'jpeg "~a" (bytes->string/latin-1 (subbytes bstr 0 (let loop ([i 0])
(if (zero? (bytes-ref bstr i))
i
(loop (add1 i)))))))))
(define-jpeg/private jpeg_std_error (_fun _jpeg_error_mgr-pointer -> _jpeg_error_mgr-pointer))
(define-jpeg/private jpeg_CreateDecompress/test (_fun _pointer _int _int -> _void)
#:c-id jpeg_CreateDecompress)
;; jpeglib offers no way to get the library version number dynamically,
;; so we hack it by intercepting an error from jpeg_CreateDecompress:
(define JPEG_LIB_VERSION
(let ([dummy-size 4096])
(let ([m (cast (malloc dummy-size 'raw) _pointer _jpeg_any_struct-pointer)]
[e (cast (malloc sizeof_jpeg_error_mgr 'raw) _pointer _jpeg_error_mgr-pointer)])
(set-jpeg_any_struct-err! m (jpeg_std_error e))
(set-jpeg_error_mgr-error_exit! e error-exit)
(let ([s (with-handlers ([exn:fail? (lambda (exn) (exn-message exn))])
(jpeg_CreateDecompress/test m 0 dummy-size)
"")])
(free m)
(free e)
(let ([m (regexp-match #rx"version: library is ([0-9]+)" s)])
(if m
(string->number (cadr m))
"unknown"))))))
(unless (member JPEG_LIB_VERSION '(62 64 70 80))
(error 'jpeg "unsupported library version: ~e" JPEG_LIB_VERSION))
(define _scaled_size (define _scaled_size
(case JPEG_LIB_VERSION (case JPEG_LIB_VERSION
[(62) _int] [(62 64) _int]
[else (make-cstruct-type (list _int _int))])) [else (make-cstruct-type (list _int _int))]))
(define _prog_scan_size (define _prog_scan_size
(case JPEG_LIB_VERSION (case JPEG_LIB_VERSION
[(62 70) (make-cstruct-type (list _int _int _int _int))] [(62 64 70) (make-cstruct-type (list _int _int _int _int))]
[else (make-cstruct-type (list _int _int _int _int _int _pointer _int))])) [else (make-cstruct-type (list _int _int _int _int _int _pointer _int))]))
(define _comp_info_size (define _comp_info_size
(case JPEG_LIB_VERSION (case JPEG_LIB_VERSION
[(62 70) _pointer] [(62 64 70) _pointer]
[else (make-cstruct-type (list _pointer _jbool))])) [else (make-cstruct-type (list _pointer _jbool))]))
(define-cstruct _jpeg_decompress_struct ([err _jpeg_error_mgr-pointer] (define-cstruct _jpeg_decompress_struct ([err _jpeg_error_mgr-pointer]
@ -294,7 +324,7 @@
[data_precision _int])) [data_precision _int]))
(define _compression_params_t (define _compression_params_t
(case JPEG_LIB_VERSION (case JPEG_LIB_VERSION
[(62) _int] ; just data_precission [(62 64) _int] ; just data_precission
[else _jpeg7_compression_params])) [else _jpeg7_compression_params]))
(define-cstruct _quant_tbl_62_t ([quant_tbl_ptrs_1 _pointer] (define-cstruct _quant_tbl_62_t ([quant_tbl_ptrs_1 _pointer]
@ -308,12 +338,12 @@
(define _quant_tbl_t (define _quant_tbl_t
(case JPEG_LIB_VERSION (case JPEG_LIB_VERSION
[(62) _quant_tbl_62_t] [(62 64) _quant_tbl_62_t]
[else _quant_tbl_70_t])) [else _quant_tbl_70_t]))
(define _sampling_t (define _sampling_t
(case JPEG_LIB_VERSION (case JPEG_LIB_VERSION
[(62) _jbool] ; just CCIR601_sampling [(62 64) _jbool] ; just CCIR601_sampling
[else (make-cstruct-type (list _jbool _jbool))])) ; CCIR601_sampling and do_fancy_downsampling [else (make-cstruct-type (list _jbool _jbool))])) ; CCIR601_sampling and do_fancy_downsampling
(define-cstruct _factors_62_t ([max_h_samp_factor _int] (define-cstruct _factors_62_t ([max_h_samp_factor _int]
@ -321,7 +351,7 @@
(define-cstruct (_factors_70_t _factors_62_t) ([scaled _scaled_size])) (define-cstruct (_factors_70_t _factors_62_t) ([scaled _scaled_size]))
(define _factors_t (define _factors_t
(case JPEG_LIB_VERSION (case JPEG_LIB_VERSION
[(62) _factors_62_t] [(62 64) _factors_62_t]
[else _factors_70_t])) [else _factors_70_t]))
@ -551,17 +581,6 @@
(let ([in (ptr-ref (jpeg_decompress_struct-client_data m) _scheme)]) (let ([in (ptr-ref (jpeg_decompress_struct-client_data m) _scheme)])
(close-input-port in)))) (close-input-port in))))
(define (error-exit m)
(let ([bstr (make-bytes JMSG_LENGTH_MAX)])
((jpeg_error_mgr-format_message
(jpeg_decompress_struct-err (ptr-cast m _jpeg_decompress_struct-pointer)))
m
bstr)
(error 'jpeg "~a" (bytes->string/latin-1 (subbytes bstr 0 (let loop ([i 0])
(if (zero? (bytes-ref bstr i))
i
(loop (add1 i)))))))))
(define (ptr-cast p t) (cast p _pointer t)) (define (ptr-cast p t) (cast p _pointer t))
(define destroy-decompress (define destroy-decompress
@ -634,8 +653,6 @@
1)]) 1)])
(values samps (scheme_make_sized_byte_string (ptr-ref samps _pointer) len 0)))) (values samps (scheme_make_sized_byte_string (ptr-ref samps _pointer) len 0))))
(define-jpeg/private jpeg_std_error (_fun _jpeg_error_mgr-pointer -> _jpeg_error_mgr-pointer))
(define-jpeg/private jpeg_CreateDecompress (_fun _j_decompress_ptr _int _int -> _void)) (define-jpeg/private jpeg_CreateDecompress (_fun _j_decompress_ptr _int _int -> _void))
(define-jpeg/private jpeg_resync_to_restart (_fun _j_decompress_ptr _int -> _jbool)) (define-jpeg/private jpeg_resync_to_restart (_fun _j_decompress_ptr _int -> _jbool))
(define-jpeg jpeg_read_header (_fun _j_decompress_ptr _jbool -> _void)) (define-jpeg jpeg_read_header (_fun _j_decompress_ptr _jbool -> _void))

View File

@ -10,7 +10,7 @@
"../private/libs.rkt") "../private/libs.rkt")
(define-runtime-lib pango-lib (define-runtime-lib pango-lib
[(unix) (ffi-lib "libpango-1.0" '("0"))] [(unix) (ffi-lib "libpango-1.0" '("0" ""))]
[(macosx) [(macosx)
(ffi-lib "libintl.8.dylib") (ffi-lib "libintl.8.dylib")
(ffi-lib "libpango-1.0.0.dylib")] (ffi-lib "libpango-1.0.0.dylib")]
@ -24,7 +24,7 @@
(ffi-lib "libpangowin32-1.0-0.dll")]) (ffi-lib "libpangowin32-1.0-0.dll")])
(define-runtime-lib pangocairo-lib (define-runtime-lib pangocairo-lib
[(unix) (ffi-lib "libpangocairo-1.0" '("0"))] [(unix) (ffi-lib "libpangocairo-1.0" '("0" ""))]
[(macosx) [(macosx)
(ffi-lib "libpangocairo-1.0.0.dylib")] (ffi-lib "libpangocairo-1.0.0.dylib")]
[(win32) [(win32)

View File

@ -10,10 +10,11 @@
(define-runtime-lib png-lib (define-runtime-lib png-lib
[(unix) [(unix)
(case (string->symbol (path->string (system-library-subpath #f))) ;; Most Linux distros supply "libpng12", while other Unix
[(i386-freebsd) (ffi-lib "libpng")] ;; variants often have just "libpng":
[else (with-handlers ([exn:fail:filesystem?
(ffi-lib "libpng12" '("0" ""))])] (lambda (exn) (ffi-lib "libpng"))])
(ffi-lib "libpng12" '("0" "")))]
[(macosx) (ffi-lib "libpng14.14.dylib")] [(macosx) (ffi-lib "libpng14.14.dylib")]
[(windows) [(windows)
(ffi-lib "zlib1.dll") (ffi-lib "zlib1.dll")