Update to latest release of bindgen

Note that all of the enum definitions changed (again?), and now they are
flattened into the 'bindings' namespace. This breaks the API in a way that
is relatively easy to fix, albeit annoying. Attempts to change the enum
generation using default_enum_style() resulted in endless compiler errors.

cargo test passes
This commit is contained in:
Nathan Fiedler
2018-10-06 15:05:16 -07:00
parent 336606f121
commit 8a4fced836
10 changed files with 86 additions and 93 deletions

View File

@ -5,6 +5,12 @@ This project adheres to [Semantic Versioning](http://semver.org/).
This file follows the convention described at This file follows the convention described at
[Keep a Changelog](http://keepachangelog.com/en/1.0.0/). [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
## [Unreleased]
### Changed
- Updated `bindgen` dependency to latest release and fixed compiler issues.
Enum definitions changed again, default in bindgen is different now, and
using `default_enum_style()` caused endless compiler errors.
## [0.10.0] - 2018-08-11 ## [0.10.0] - 2018-08-11
### Added ### Added
- Mewp: Add ping_image and ping_image_blob functions. - Mewp: Add ping_image and ping_image_blob functions.

View File

@ -14,5 +14,5 @@ build = "build.rs"
libc = ">=0.2" libc = ">=0.2"
[build-dependencies] [build-dependencies]
bindgen = "0.29" bindgen = "0.42"
pkg-config = "0.3.9" pkg-config = "0.3"

View File

@ -20,7 +20,7 @@ A somewhat safe Rust interface to the [ImageMagick](http://www.imagemagick.org/)
Pretty simple for now. Pretty simple for now.
``` ```shell
$ cargo build $ cargo build
$ cargo test $ cargo test
``` ```
@ -38,7 +38,7 @@ It can be found in *Start menu -> Visual Studio < VERSION > -> Visual Studio Too
Choose the architecture corresponding to architecture of your rust compiler. Choose the architecture corresponding to architecture of your rust compiler.
This is required for the proper functioning of `rust-bindgen`. This is required for the proper functioning of `rust-bindgen`.
``` ```shell
> set IMAGE_MAGICK_DIR=<path to ImageMagick installation directory> > set IMAGE_MAGICK_DIR=<path to ImageMagick installation directory>
> cargo build > cargo build
> cargo test > cargo test
@ -77,7 +77,7 @@ There are still many missing functions, so if you find there is something you wo
[Docker](https://www.docker.com) can be used to build and test the code without affecting your development environment, which may have a different version of ImageMagick installed. The use of `docker-compose`, as shown in the example below, is optional, but it makes the process very simple. [Docker](https://www.docker.com) can be used to build and test the code without affecting your development environment, which may have a different version of ImageMagick installed. The use of `docker-compose`, as shown in the example below, is optional, but it makes the process very simple.
``` ```shell
$ cd docker $ cd docker
$ docker-compose build $ docker-compose build
$ docker-compose run magick-rust $ docker-compose run magick-rust

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2016-2017 Nathan Fiedler * Copyright 2016-2018 Nathan Fiedler
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -91,16 +91,16 @@ fn main() {
.raw_line("extern crate libc;") .raw_line("extern crate libc;")
.header(gen_h_path.to_str().unwrap()) .header(gen_h_path.to_str().unwrap())
// https://github.com/rust-lang-nursery/rust-bindgen/issues/687 // https://github.com/rust-lang-nursery/rust-bindgen/issues/687
.hide_type("FP_NAN") .blacklist_type("FP_NAN")
.hide_type("FP_INFINITE") .blacklist_type("FP_INFINITE")
.hide_type("FP_ZERO") .blacklist_type("FP_ZERO")
.hide_type("FP_SUBNORMAL") .blacklist_type("FP_SUBNORMAL")
.hide_type("FP_NORMAL") .blacklist_type("FP_NORMAL")
.hide_type("FP_INT_UPWARD") .blacklist_type("FP_INT_UPWARD")
.hide_type("FP_INT_DOWNWARD") .blacklist_type("FP_INT_DOWNWARD")
.hide_type("FP_INT_TOWARDZERO") .blacklist_type("FP_INT_TOWARDZERO")
.hide_type("FP_INT_TONEARESTFROMZERO") .blacklist_type("FP_INT_TONEARESTFROMZERO")
.hide_type("FP_INT_TONEAREST"); .blacklist_type("FP_INT_TONEAREST");
for d in include_dirs { for d in include_dirs {
builder = builder.clang_arg(format!("-I{}", d.to_string_lossy())); builder = builder.clang_arg(format!("-I{}", d.to_string_lossy()));

View File

@ -22,9 +22,9 @@ pub trait FromRust<T> {
impl FromRust<bool> for bindings::MagickBooleanType { impl FromRust<bool> for bindings::MagickBooleanType {
fn from_rust(b: bool) -> Self { fn from_rust(b: bool) -> Self {
if b { if b {
bindings::MagickBooleanType::MagickTrue bindings::MagickBooleanType_MagickTrue
} else { } else {
bindings::MagickBooleanType::MagickFalse bindings::MagickBooleanType_MagickFalse
} }
} }
} }

View File

@ -49,7 +49,7 @@ use libc::ssize_t;
pub fn magick_wand_genesis() { pub fn magick_wand_genesis() {
unsafe { unsafe {
match bindings::IsMagickWandInstantiated() { match bindings::IsMagickWandInstantiated() {
bindings::MagickBooleanType::MagickTrue => (), bindings::MagickBooleanType_MagickTrue => (),
_ => bindings::MagickWandGenesis() _ => bindings::MagickWandGenesis()
} }
} }
@ -60,7 +60,7 @@ pub fn magick_wand_genesis() {
pub fn magick_wand_terminus() { pub fn magick_wand_terminus() {
unsafe { unsafe {
match bindings::IsMagickWandInstantiated() { match bindings::IsMagickWandInstantiated() {
bindings::MagickBooleanType::MagickTrue => bindings::MagickWandTerminus(), bindings::MagickBooleanType_MagickTrue => bindings::MagickWandTerminus(),
_ => () _ => ()
} }
} }

View File

@ -35,7 +35,7 @@ macro_rules! wand_common {
fn clear_exception(&mut self) -> Result<(), &'static str> { fn clear_exception(&mut self) -> Result<(), &'static str> {
match unsafe { ::bindings::$clear_exc(self.wand) } { match unsafe { ::bindings::$clear_exc(self.wand) } {
::bindings::MagickBooleanType::MagickTrue => Ok(()), ::bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err(concat!("failed to clear", stringify!($wand), "exception")) _ => Err(concat!("failed to clear", stringify!($wand), "exception"))
} }
} }
@ -45,7 +45,7 @@ macro_rules! wand_common {
} }
fn get_exception(&self) -> Result<(String, ::bindings::ExceptionType), &'static str> { fn get_exception(&self) -> Result<(String, ::bindings::ExceptionType), &'static str> {
let mut severity: ::bindings::ExceptionType = ::bindings::ExceptionType::UndefinedException; let mut severity: ::bindings::ExceptionType = ::bindings::ExceptionType_UndefinedException;
// TODO: memory management // TODO: memory management
let ptr = unsafe { ::bindings::$get_exc(self.wand, &mut severity as *mut _) }; let ptr = unsafe { ::bindings::$get_exc(self.wand, &mut severity as *mut _) };
if ptr.is_null() { if ptr.is_null() {
@ -58,7 +58,7 @@ macro_rules! wand_common {
pub fn is_wand(&self) -> Result<(), &'static str> { pub fn is_wand(&self) -> Result<(), &'static str> {
match unsafe { ::bindings::$is_wand(self.wand) } { match unsafe { ::bindings::$is_wand(self.wand) } {
::bindings::MagickBooleanType::MagickTrue => Ok(()), ::bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err(concat!(stringify!($wand), " not a wand")) _ => Err(concat!(stringify!($wand), " not a wand"))
} }
} }
@ -101,7 +101,7 @@ macro_rules! set_get {
} }
pub fn $set(&mut self, v: $typ) -> Result<(), &'static str> { pub fn $set(&mut self, v: $typ) -> Result<(), &'static str> {
match unsafe { ::bindings::$c_set(self.wand, v) } { match unsafe { ::bindings::$c_set(self.wand, v) } {
::bindings::MagickBooleanType::MagickTrue => Ok(()), ::bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err(concat!(stringify!($set), " returned false")) _ => Err(concat!(stringify!($set), " returned false"))
} }
} }
@ -153,7 +153,7 @@ macro_rules! string_set_get {
pub fn $set(&mut self, s: &str) -> Result<(), &'static str> { pub fn $set(&mut self, s: &str) -> Result<(), &'static str> {
let c_string = try!(::std::ffi::CString::new(s).map_err(|_| "could not convert to cstring")); let c_string = try!(::std::ffi::CString::new(s).map_err(|_| "could not convert to cstring"));
match unsafe { ::bindings::$c_set(self.wand, c_string.as_ptr()) } { match unsafe { ::bindings::$c_set(self.wand, c_string.as_ptr()) } {
::bindings::MagickBooleanType::MagickTrue => Ok(()), ::bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err(concat!(stringify!($set), " returned false")) _ => Err(concat!(stringify!($set), " returned false"))
} }
} }
@ -245,7 +245,7 @@ macro_rules! mutations {
$(#[$attr])* $(#[$attr])*
pub fn $fun(&self $(, $arg: $ty)*) -> Result<(), &'static str> { pub fn $fun(&self $(, $arg: $ty)*) -> Result<(), &'static str> {
match unsafe { bindings::$c_fun(self.wand $(, $arg)*) } { match unsafe { bindings::$c_fun(self.wand $(, $arg)*) } {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err(concat!(stringify!($c_fun), " invocation failed")) _ => Err(concat!(stringify!($c_fun), " invocation failed"))
} }
} }

View File

@ -41,7 +41,7 @@ impl MagickWand {
pub fn new_image(&self, columns: size_t, rows: size_t, pixel_wand: &PixelWand) -> Result<(), &'static str> { pub fn new_image(&self, columns: size_t, rows: size_t, pixel_wand: &PixelWand) -> Result<(), &'static str> {
match unsafe { bindings::MagickNewImage(self.wand, columns, rows, pixel_wand.wand) } { match unsafe { bindings::MagickNewImage(self.wand, columns, rows, pixel_wand.wand) } {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("Could not create image"), _ => Err("Could not create image"),
} }
} }
@ -53,7 +53,7 @@ impl MagickWand {
bindings::MagickSetOption(self.wand, c_key.as_ptr(), c_value.as_ptr()) bindings::MagickSetOption(self.wand, c_key.as_ptr(), c_value.as_ptr())
}; };
match result { match result {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to set option"), _ => Err("failed to set option"),
} }
} }
@ -61,7 +61,7 @@ impl MagickWand {
pub fn annotate_image(&mut self, drawing_wand: &DrawingWand, x: f64, y: f64, angle: f64, text: &str) -> Result<(), &'static str> { pub fn annotate_image(&mut self, drawing_wand: &DrawingWand, x: f64, y: f64, angle: f64, text: &str) -> Result<(), &'static str> {
let c_string = try!(CString::new(text).map_err(|_| "could not convert to cstring")); let c_string = try!(CString::new(text).map_err(|_| "could not convert to cstring"));
match unsafe { bindings::MagickAnnotateImage(self.wand, drawing_wand.wand, x, y, angle, c_string.as_ptr() as *const _) } { match unsafe { bindings::MagickAnnotateImage(self.wand, drawing_wand.wand, x, y, angle, c_string.as_ptr() as *const _) } {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("unable to annotate image") _ => Err("unable to annotate image")
} }
} }
@ -69,7 +69,7 @@ impl MagickWand {
/// Add all images from another wand to this wand at the current index. /// Add all images from another wand to this wand at the current index.
pub fn add_image(&mut self, other_wand: &MagickWand) -> Result<(), &'static str> { pub fn add_image(&mut self, other_wand: &MagickWand) -> Result<(), &'static str> {
match unsafe { bindings::MagickAddImage(self.wand, other_wand.wand) } { match unsafe { bindings::MagickAddImage(self.wand, other_wand.wand) } {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("unable to add images from another wand") _ => Err("unable to add images from another wand")
} }
} }
@ -87,7 +87,7 @@ impl MagickWand {
bindings::MagickLabelImage(self.wand, c_label.as_ptr()) bindings::MagickLabelImage(self.wand, c_label.as_ptr())
}; };
match result { match result {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to add label") _ => Err("failed to add label")
} }
} }
@ -98,7 +98,7 @@ impl MagickWand {
bindings::MagickWriteImages(self.wand, c_name.as_ptr(), adjoin.to_magick()) bindings::MagickWriteImages(self.wand, c_name.as_ptr(), adjoin.to_magick())
}; };
match result { match result {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to write images") _ => Err("failed to write images")
} }
} }
@ -110,7 +110,7 @@ impl MagickWand {
bindings::MagickReadImage(self.wand, c_name.as_ptr()) bindings::MagickReadImage(self.wand, c_name.as_ptr())
}; };
match result { match result {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to read image") _ => Err("failed to read image")
} }
} }
@ -124,7 +124,7 @@ impl MagickWand {
self.wand, int_slice.as_ptr() as *const c_void, size as size_t) self.wand, int_slice.as_ptr() as *const c_void, size as size_t)
}; };
match result { match result {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to read image") _ => Err("failed to read image")
} }
} }
@ -137,7 +137,7 @@ impl MagickWand {
bindings::MagickPingImage(self.wand, c_name.as_ptr()) bindings::MagickPingImage(self.wand, c_name.as_ptr())
}; };
match result { match result {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to ping image") _ => Err("failed to ping image")
} }
} }
@ -152,7 +152,7 @@ impl MagickWand {
self.wand, int_slice.as_ptr() as *const c_void, size as size_t) self.wand, int_slice.as_ptr() as *const c_void, size as size_t)
}; };
match result { match result {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to ping image") _ => Err("failed to ping image")
} }
} }
@ -175,14 +175,18 @@ impl MagickWand {
/// Compose another image onto self at (x, y) using composition_operator /// Compose another image onto self at (x, y) using composition_operator
pub fn compose_images(&self, reference: &MagickWand, composition_operator: bindings::CompositeOperator, clip_to_self: bool, x: isize, y: isize) -> Result<(), &'static str> { pub fn compose_images(&self, reference: &MagickWand, composition_operator: bindings::CompositeOperator, clip_to_self: bool, x: isize, y: isize) -> Result<(), &'static str> {
let native_clip_to_self = if clip_to_self {
bindings::MagickBooleanType_MagickTrue
} else {
bindings::MagickBooleanType_MagickFalse
};
let result = unsafe { let result = unsafe {
bindings::MagickCompositeImage(self.wand, reference.wand, bindings::MagickCompositeImage(self.wand, reference.wand,
composition_operator, bindings::MagickBooleanType::from_rust(clip_to_self), composition_operator, native_clip_to_self, x, y
x, y
) )
}; };
match result { match result {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to compose images") _ => Err("failed to compose images")
} }
} }
@ -194,7 +198,7 @@ impl MagickWand {
bindings::MagickExtentImage(self.wand, width, height, x, y) bindings::MagickExtentImage(self.wand, width, height, x, y)
}; };
match result { match result {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to extend image") _ => Err("failed to extend image")
} }
} }
@ -214,7 +218,7 @@ impl MagickWand {
bindings::MagickProfileImage(self.wand, c_name.as_ptr(), profile_ptr, profile_len) bindings::MagickProfileImage(self.wand, c_name.as_ptr(), profile_ptr, profile_len)
}; };
match result { match result {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to profile image") _ => Err("failed to profile image")
} }
} }
@ -224,7 +228,7 @@ impl MagickWand {
bindings::MagickFlipImage(self.wand) bindings::MagickFlipImage(self.wand)
}; };
match result { match result {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to flip image") _ => Err("failed to flip image")
} }
} }
@ -234,7 +238,7 @@ impl MagickWand {
bindings::MagickFlopImage(self.wand) bindings::MagickFlopImage(self.wand)
}; };
match result { match result {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to flip image") _ => Err("failed to flip image")
} }
} }
@ -242,7 +246,7 @@ impl MagickWand {
/// Adaptively resize the currently selected image. /// Adaptively resize the currently selected image.
pub fn adaptive_resize_image(&self, width: usize, height: usize) -> Result<(), &'static str> { pub fn adaptive_resize_image(&self, width: usize, height: usize) -> Result<(), &'static str> {
match unsafe { bindings::MagickAdaptiveResizeImage(self.wand, width, height)} { match unsafe { bindings::MagickAdaptiveResizeImage(self.wand, width, height)} {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to adaptive-resize image") _ => Err("failed to adaptive-resize image")
} }
} }
@ -251,7 +255,7 @@ impl MagickWand {
/// filling any empty space with the background color of a given PixelWand /// filling any empty space with the background color of a given PixelWand
pub fn rotate_image(&self, background: &PixelWand, degrees: f64) -> Result<(), &'static str> { pub fn rotate_image(&self, background: &PixelWand, degrees: f64) -> Result<(), &'static str> {
match unsafe { bindings::MagickRotateImage(self.wand, background.wand, degrees) } { match unsafe { bindings::MagickRotateImage(self.wand, background.wand, degrees) } {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to rotate image") _ => Err("failed to rotate image")
} }
} }
@ -262,7 +266,7 @@ impl MagickWand {
bindings::MagickTrimImage(self.wand, fuzz) bindings::MagickTrimImage(self.wand, fuzz)
}; };
match result { match result {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to trim image") _ => Err("failed to trim image")
} }
} }
@ -296,7 +300,7 @@ impl MagickWand {
let result = unsafe { let result = unsafe {
bindings::MagickResetImagePage(self.wand, c_page_geometry.as_ptr()) bindings::MagickResetImagePage(self.wand, c_page_geometry.as_ptr())
}; };
if result == bindings::MagickBooleanType::MagickTrue { if result == bindings::MagickBooleanType_MagickTrue {
Ok(()) Ok(())
} else { } else {
Err("Resetting page geometry failed.") Err("Resetting page geometry failed.")
@ -329,7 +333,7 @@ impl MagickWand {
let result = unsafe { let result = unsafe {
bindings::MagickSetImageProperty(self.wand, c_name.as_ptr(), c_value.as_ptr()) bindings::MagickSetImageProperty(self.wand, c_name.as_ptr(), c_value.as_ptr())
}; };
if result == bindings::MagickBooleanType::MagickTrue { if result == bindings::MagickBooleanType_MagickTrue {
Ok(()) Ok(())
} else { } else {
Err("Setting image property failed.") Err("Setting image property failed.")
@ -341,7 +345,7 @@ impl MagickWand {
let pw = PixelWand::new(); let pw = PixelWand::new();
unsafe { unsafe {
if bindings::MagickGetImagePixelColor(self.wand, x, y, pw.wand) == bindings::MagickBooleanType::MagickTrue { if bindings::MagickGetImagePixelColor(self.wand, x, y, pw.wand) == bindings::MagickBooleanType_MagickTrue {
Some(pw) Some(pw)
} else { } else {
None None
@ -354,7 +358,7 @@ impl MagickWand {
/// samplingFactors: An array of floats representing the sampling factor for each color component (in RGB order). /// samplingFactors: An array of floats representing the sampling factor for each color component (in RGB order).
pub fn set_sampling_factors(&self, samplingFactors: &[f64]) -> Result<(), &'static str> { pub fn set_sampling_factors(&self, samplingFactors: &[f64]) -> Result<(), &'static str> {
match unsafe { bindings::MagickSetSamplingFactors(self.wand, samplingFactors.len(), &samplingFactors[0]) } { match unsafe { bindings::MagickSetSamplingFactors(self.wand, samplingFactors.len(), &samplingFactors[0]) } {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("SetSamplingFactors returned false") _ => Err("SetSamplingFactors returned false")
} }
} }
@ -384,7 +388,7 @@ impl MagickWand {
pub fn sharpen_image(&self, radius: f64, sigma: f64) -> Result<(), &'static str> { pub fn sharpen_image(&self, radius: f64, sigma: f64) -> Result<(), &'static str> {
match unsafe { bindings::MagickSharpenImage(self.wand, radius, sigma) } { match unsafe { bindings::MagickSharpenImage(self.wand, radius, sigma) } {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("SharpenImage returned false") _ => Err("SharpenImage returned false")
@ -396,7 +400,7 @@ impl MagickWand {
match unsafe { bindings::MagickSetImageBackgroundColor(self.wand, pixel_wand.wand) } { match unsafe { bindings::MagickSetImageBackgroundColor(self.wand, pixel_wand.wand) } {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("SetImageBackgroundColor returned false") _ => Err("SetImageBackgroundColor returned false")
@ -409,7 +413,7 @@ impl MagickWand {
let mut x_resolution = 0f64; let mut x_resolution = 0f64;
let mut y_resolution = 0f64; let mut y_resolution = 0f64;
unsafe { unsafe {
if bindings::MagickGetImageResolution(self.wand, &mut x_resolution, &mut y_resolution) == bindings::MagickBooleanType::MagickTrue { if bindings::MagickGetImageResolution(self.wand, &mut x_resolution, &mut y_resolution) == bindings::MagickBooleanType_MagickTrue {
Ok((x_resolution, y_resolution)) Ok((x_resolution, y_resolution))
} else { } else {
Err("GetImageResolution returned false") Err("GetImageResolution returned false")
@ -420,7 +424,7 @@ impl MagickWand {
/// Sets the image resolution /// Sets the image resolution
pub fn set_image_resolution(&self, x_resolution: f64, y_resolution: f64) -> Result<(), &'static str> { pub fn set_image_resolution(&self, x_resolution: f64, y_resolution: f64) -> Result<(), &'static str> {
unsafe { unsafe {
if bindings::MagickSetImageResolution(self.wand, x_resolution, y_resolution) == bindings::MagickBooleanType::MagickTrue { if bindings::MagickSetImageResolution(self.wand, x_resolution, y_resolution) == bindings::MagickBooleanType_MagickTrue {
Ok(()) Ok(())
} else { } else {
Err("SetImageResolution returned false") Err("SetImageResolution returned false")
@ -431,7 +435,7 @@ impl MagickWand {
/// Sets the wand resolution /// Sets the wand resolution
pub fn set_resolution(&self, x_resolution: f64, y_resolution: f64) -> Result<(), &'static str> { pub fn set_resolution(&self, x_resolution: f64, y_resolution: f64) -> Result<(), &'static str> {
unsafe { unsafe {
if bindings::MagickSetResolution(self.wand, x_resolution, y_resolution) == bindings::MagickBooleanType::MagickTrue { if bindings::MagickSetResolution(self.wand, x_resolution, y_resolution) == bindings::MagickBooleanType_MagickTrue {
Ok(()) Ok(())
} else { } else {
Err("SetResolution returned false") Err("SetResolution returned false")
@ -442,7 +446,7 @@ impl MagickWand {
/// Returns the image resolution as a pair (horizontal resolution, vertical resolution) /// Returns the image resolution as a pair (horizontal resolution, vertical resolution)
pub fn sepia_tone_image(&self, threshold: f64) -> Result<(), &'static str> { pub fn sepia_tone_image(&self, threshold: f64) -> Result<(), &'static str> {
unsafe { unsafe {
if bindings::MagickSepiaToneImage(self.wand, threshold * bindings::QuantumRange) == bindings::MagickBooleanType::MagickTrue { if bindings::MagickSepiaToneImage(self.wand, threshold * bindings::QuantumRange) == bindings::MagickBooleanType_MagickTrue {
Ok(()) Ok(())
} else { } else {
Err("SepiaToneImage returned false") Err("SepiaToneImage returned false")
@ -460,7 +464,7 @@ impl MagickWand {
unsafe { unsafe {
pixels.set_len(capacity as usize); pixels.set_len(capacity as usize);
if bindings::MagickExportImagePixels(self.wand, x, y, width, height, c_map.as_ptr(), if bindings::MagickExportImagePixels(self.wand, x, y, width, height, c_map.as_ptr(),
bindings::StorageType::CharPixel, pixels.as_mut_ptr() as *mut c_void) == bindings::MagickBooleanType::MagickTrue { bindings::StorageType_CharPixel, pixels.as_mut_ptr() as *mut c_void) == bindings::MagickBooleanType_MagickTrue {
Some(pixels) Some(pixels)
} else { } else {
None None
@ -486,7 +490,7 @@ impl MagickWand {
bindings::MagickCropImage(self.wand, width, height, x, y) bindings::MagickCropImage(self.wand, width, height, x, y)
}; };
match result { match result {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to crop image") _ => Err("failed to crop image")
} }
} }
@ -520,9 +524,9 @@ impl MagickWand {
} }
unsafe { unsafe {
bindings::MagickResetIterator(self.wand); bindings::MagickResetIterator(self.wand);
while bindings::MagickNextImage(self.wand) != bindings::MagickBooleanType::MagickFalse { while bindings::MagickNextImage(self.wand) != bindings::MagickBooleanType_MagickFalse {
bindings::MagickResizeImage(self.wand, new_width, new_height, bindings::MagickResizeImage(self.wand, new_width, new_height,
bindings::FilterType::LanczosFilter); bindings::FilterType_LanczosFilter);
} }
} }
} }
@ -531,7 +535,7 @@ impl MagickWand {
/// hence should be "auto" oriented so it is suitable for viewing. /// hence should be "auto" oriented so it is suitable for viewing.
pub fn requires_orientation(&self) -> bool { pub fn requires_orientation(&self) -> bool {
unsafe { unsafe {
bindings::MagickGetImageOrientation(self.wand) != bindings::OrientationType::TopLeftOrientation bindings::MagickGetImageOrientation(self.wand) != bindings::OrientationType_TopLeftOrientation
} }
} }
@ -541,7 +545,7 @@ impl MagickWand {
/// Returns `true` if successful or `false` if an error occurred. /// Returns `true` if successful or `false` if an error occurred.
pub fn auto_orient(&self) -> bool { pub fn auto_orient(&self) -> bool {
unsafe { unsafe {
bindings::MagickAutoOrientImage(self.wand) == bindings::MagickBooleanType::MagickTrue bindings::MagickAutoOrientImage(self.wand) == bindings::MagickBooleanType_MagickTrue
} }
} }
@ -552,7 +556,7 @@ impl MagickWand {
bindings::MagickWriteImage(self.wand, c_name.as_ptr()) bindings::MagickWriteImage(self.wand, c_name.as_ptr())
}; };
match result { match result {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to write image") _ => Err("failed to write image")
} }
} }

View File

@ -37,7 +37,7 @@ wand_common!(
impl PixelWand { impl PixelWand {
pub fn is_similar(&self, other: &PixelWand, fuzz: f64) -> Result<(), &'static str> { pub fn is_similar(&self, other: &PixelWand, fuzz: f64) -> Result<(), &'static str> {
match unsafe { bindings::IsPixelWandSimilar(self.wand, other.wand, fuzz) } { match unsafe { bindings::IsPixelWandSimilar(self.wand, other.wand, fuzz) } {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("not similar") _ => Err("not similar")
} }
} }
@ -76,7 +76,7 @@ impl PixelWand {
pub fn set_color(&mut self, s: &str) -> Result<(), &'static str> { pub fn set_color(&mut self, s: &str) -> Result<(), &'static str> {
let c_string = try!(CString::new(s).map_err(|_| "could not convert to cstring")); let c_string = try!(CString::new(s).map_err(|_| "could not convert to cstring"));
match unsafe { bindings::PixelSetColor(self.wand, c_string.as_ptr())} { match unsafe { bindings::PixelSetColor(self.wand, c_string.as_ptr())} {
bindings::MagickBooleanType::MagickTrue => Ok(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
_ => Err("failed to set color") _ => Err("failed to set color")
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2015-2017 Nathan Fiedler * Copyright 2015-2018 Nathan Fiedler
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,7 +16,7 @@
extern crate magick_rust; extern crate magick_rust;
use magick_rust::{MagickWand, magick_wand_genesis, MetricType, ColorspaceType, FilterType, DitherMethod, PixelWand, bindings}; use magick_rust::{MagickWand, magick_wand_genesis, PixelWand, bindings};
use std::error::Error; use std::error::Error;
use std::fs::File; use std::fs::File;
@ -54,7 +54,7 @@ fn test_resize_image() {
1 => 1, 1 => 1,
height => height / 2 height => height / 2
}; };
wand.resize_image(halfwidth, halfheight, FilterType::LanczosFilter); wand.resize_image(halfwidth, halfheight, bindings::FilterType_LanczosFilter);
assert_eq!(256, wand.get_image_width()); assert_eq!(256, wand.get_image_width());
assert_eq!(192, wand.get_image_height()); assert_eq!(192, wand.get_image_height());
} }
@ -186,7 +186,7 @@ fn test_compare_images() {
assert!(wand2.read_image("tests/data/IMG_5745_rotl.JPG").is_ok()); assert!(wand2.read_image("tests/data/IMG_5745_rotl.JPG").is_ok());
wand2.auto_orient(); wand2.auto_orient();
let (distortion, diff) = wand1.compare_images(&wand2, MetricType::RootMeanSquaredErrorMetric); let (distortion, diff) = wand1.compare_images(&wand2, bindings::MetricType_RootMeanSquaredErrorMetric);
assert!(distortion < 0.01); assert!(distortion < 0.01);
assert!(diff.is_some()); assert!(diff.is_some());
} }
@ -225,13 +225,13 @@ fn test_transform_image_colorspace() {
}); });
let wand = MagickWand::new(); let wand = MagickWand::new();
assert!(wand.read_image("tests/data/IMG_5745.JPG").is_ok()); assert!(wand.read_image("tests/data/IMG_5745.JPG").is_ok());
assert_eq!(wand.get_image_colorspace(), ColorspaceType::sRGBColorspace); assert_eq!(wand.get_image_colorspace(), bindings::ColorspaceType_sRGBColorspace);
let pixel_color = wand.get_image_pixel_color(10, 10).unwrap(); let pixel_color = wand.get_image_pixel_color(10, 10).unwrap();
assert_ne!(pixel_color.get_hsl().hue, 0.0); assert_ne!(pixel_color.get_hsl().hue, 0.0);
assert!(wand.transform_image_colorspace(ColorspaceType::GRAYColorspace).is_ok()); assert!(wand.transform_image_colorspace(bindings::ColorspaceType_GRAYColorspace).is_ok());
assert_eq!(wand.get_image_colorspace(), ColorspaceType::GRAYColorspace); assert_eq!(wand.get_image_colorspace(), bindings::ColorspaceType_GRAYColorspace);
let pixel_grayscale = wand.get_image_pixel_color(10, 10).unwrap(); let pixel_grayscale = wand.get_image_pixel_color(10, 10).unwrap();
assert_eq!(pixel_grayscale.get_hsl().hue, 0.0); assert_eq!(pixel_grayscale.get_hsl().hue, 0.0);
@ -254,8 +254,8 @@ fn test_color_reduction() {
let image_colors = wand.get_image_colors(); let image_colors = wand.get_image_colors();
assert!(image_colors > 38000 || image_colors < 40000); assert!(image_colors > 38000 || image_colors < 40000);
assert!(wand.quantize_image(6, ColorspaceType::RGBColorspace, 1, assert!(wand.quantize_image(6, bindings::ColorspaceType_RGBColorspace, 1,
DitherMethod::UndefinedDitherMethod, false.to_magick()).is_ok()); bindings::DitherMethod_UndefinedDitherMethod, false.to_magick()).is_ok());
assert_eq!(6, wand.get_image_colors()); assert_eq!(6, wand.get_image_colors());
let histogram = wand.get_image_histogram().unwrap(); let histogram = wand.get_image_histogram().unwrap();
@ -267,33 +267,16 @@ fn test_color_reduction() {
#[test] #[test]
fn test_set_image_background_color() { fn test_set_image_background_color() {
START.call_once(|| { START.call_once(|| {
magick_wand_genesis(); magick_wand_genesis();
}); });
let wand = MagickWand::new(); let wand = MagickWand::new();
assert!(wand.read_image("tests/data/rust.png").is_ok()); assert!(wand.read_image("tests/data/rust.png").is_ok());
let mut pw = PixelWand::new(); let mut pw = PixelWand::new();
pw.set_color("#0000FF").unwrap(); pw.set_color("#0000FF").unwrap();
wand.set_image_background_color(&pw).unwrap(); wand.set_image_background_color(&pw).unwrap();
wand.set_image_alpha_channel(bindings::AlphaChannelOption_RemoveAlphaChannel).unwrap();
wand.set_image_alpha_channel(bindings::AlphaChannelOption::RemoveAlphaChannel).unwrap();
let blob = wand.write_image_blob("rgb").unwrap(); let blob = wand.write_image_blob("rgb").unwrap();
assert_eq!(0u8, blob[0]); assert_eq!(0u8, blob[0]);
assert_eq!(0u8, blob[1]); assert_eq!(0u8, blob[1]);
assert_eq!(255u8, blob[2]); assert_eq!(255u8, blob[2]);
} }