diff --git a/collects/mred/private/wx/gtk/utils.rkt b/collects/mred/private/wx/gtk/utils.rkt index 069e4d42ed..ac35d2764e 100644 --- a/collects/mred/private/wx/gtk/utils.rkt +++ b/collects/mred/private/wx/gtk/utils.rkt @@ -56,19 +56,19 @@ (ffi-lib "libgio-2.0-0") (ffi-lib "libgdk_pixbuf-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 (case (system-type) [(windows) (ffi-lib "libgdk_pixbuf-2.0-0")] [(unix) - (ffi-lib "libgdk_pixbuf-2.0" '("0"))] + (ffi-lib "libgdk_pixbuf-2.0" '("0" ""))] [else gdk-lib])) (define gtk-lib (case (system-type) [(windows) (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-gdk gdk-lib) diff --git a/collects/racket/draw/unsafe/cairo.rkt b/collects/racket/draw/unsafe/cairo.rkt index 4452bd5ae9..8dcdfed668 100644 --- a/collects/racket/draw/unsafe/cairo.rkt +++ b/collects/racket/draw/unsafe/cairo.rkt @@ -7,7 +7,7 @@ "../private/utils.rkt") (define-runtime-lib cairo-lib - [(unix) (ffi-lib "libcairo" '("2"))] + [(unix) (ffi-lib "libcairo" '("2" ""))] [(macosx) (ffi-lib "libpixman-1.0.dylib") (ffi-lib "libpng14.14.dylib") diff --git a/collects/racket/draw/unsafe/glib.rkt b/collects/racket/draw/unsafe/glib.rkt index f38bdf594b..f1b7964eb8 100644 --- a/collects/racket/draw/unsafe/glib.rkt +++ b/collects/racket/draw/unsafe/glib.rkt @@ -9,12 +9,12 @@ define-gobj)) (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")] [(windows) (ffi-lib "libglib-2.0-0.dll")]) (define-runtime-lib gmodule-lib - [(unix) (ffi-lib "libgmodule-2.0" '("0"))] + [(unix) (ffi-lib "libgmodule-2.0" '("0" ""))] [(macosx) (ffi-lib "libgmodule-2.0.0.dylib")] [(win32) @@ -24,7 +24,7 @@ (ffi-lib "libgmodule-2.0-0.dll")]) (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")] [(windows) (ffi-lib "libgobject-2.0-0.dll")]) diff --git a/collects/racket/draw/unsafe/jpeg.rkt b/collects/racket/draw/unsafe/jpeg.rkt index 3b184e45bb..08e7753d1c 100644 --- a/collects/racket/draw/unsafe/jpeg.rkt +++ b/collects/racket/draw/unsafe/jpeg.rkt @@ -8,22 +8,13 @@ "../private/utils.rkt" "../private/libs.rkt") -(define-runtime-lib jpeg-lib +(define-runtime-lib jpeg-lib [(unix) (ffi-lib "libjpeg" '("62" ""))] [(macosx) ;; for PPC, it's actually version 8! (ffi-lib "libjpeg.62.dylib")] [(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 #:provide provide) (define-ffi-definer define-jpeg/private jpeg-lib) @@ -70,19 +61,58 @@ ;; 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 (case JPEG_LIB_VERSION - [(62) _int] + [(62 64) _int] [else (make-cstruct-type (list _int _int))])) (define _prog_scan_size (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))])) (define _comp_info_size (case JPEG_LIB_VERSION - [(62 70) _pointer] + [(62 64 70) _pointer] [else (make-cstruct-type (list _pointer _jbool))])) (define-cstruct _jpeg_decompress_struct ([err _jpeg_error_mgr-pointer] @@ -294,7 +324,7 @@ [data_precision _int])) (define _compression_params_t (case JPEG_LIB_VERSION - [(62) _int] ; just data_precission + [(62 64) _int] ; just data_precission [else _jpeg7_compression_params])) (define-cstruct _quant_tbl_62_t ([quant_tbl_ptrs_1 _pointer] @@ -308,12 +338,12 @@ (define _quant_tbl_t (case JPEG_LIB_VERSION - [(62) _quant_tbl_62_t] + [(62 64) _quant_tbl_62_t] [else _quant_tbl_70_t])) (define _sampling_t (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 (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 _factors_t (case JPEG_LIB_VERSION - [(62) _factors_62_t] + [(62 64) _factors_62_t] [else _factors_70_t])) @@ -551,17 +581,6 @@ (let ([in (ptr-ref (jpeg_decompress_struct-client_data m) _scheme)]) (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 destroy-decompress @@ -634,8 +653,6 @@ 1)]) (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_resync_to_restart (_fun _j_decompress_ptr _int -> _jbool)) (define-jpeg jpeg_read_header (_fun _j_decompress_ptr _jbool -> _void)) diff --git a/collects/racket/draw/unsafe/pango.rkt b/collects/racket/draw/unsafe/pango.rkt index 75ff685126..471e809e37 100644 --- a/collects/racket/draw/unsafe/pango.rkt +++ b/collects/racket/draw/unsafe/pango.rkt @@ -10,7 +10,7 @@ "../private/libs.rkt") (define-runtime-lib pango-lib - [(unix) (ffi-lib "libpango-1.0" '("0"))] + [(unix) (ffi-lib "libpango-1.0" '("0" ""))] [(macosx) (ffi-lib "libintl.8.dylib") (ffi-lib "libpango-1.0.0.dylib")] @@ -24,7 +24,7 @@ (ffi-lib "libpangowin32-1.0-0.dll")]) (define-runtime-lib pangocairo-lib - [(unix) (ffi-lib "libpangocairo-1.0" '("0"))] + [(unix) (ffi-lib "libpangocairo-1.0" '("0" ""))] [(macosx) (ffi-lib "libpangocairo-1.0.0.dylib")] [(win32) diff --git a/collects/racket/draw/unsafe/png.rkt b/collects/racket/draw/unsafe/png.rkt index 8d28e6dd3d..0740ed261e 100644 --- a/collects/racket/draw/unsafe/png.rkt +++ b/collects/racket/draw/unsafe/png.rkt @@ -10,10 +10,11 @@ (define-runtime-lib png-lib [(unix) - (case (string->symbol (path->string (system-library-subpath #f))) - [(i386-freebsd) (ffi-lib "libpng")] - [else - (ffi-lib "libpng12" '("0" ""))])] + ;; Most Linux distros supply "libpng12", while other Unix + ;; variants often have just "libpng": + (with-handlers ([exn:fail:filesystem? + (lambda (exn) (ffi-lib "libpng"))]) + (ffi-lib "libpng12" '("0" "")))] [(macosx) (ffi-lib "libpng14.14.dylib")] [(windows) (ffi-lib "zlib1.dll")