diff --git a/src/wand/magick.rs b/src/wand/magick.rs index 0ee0c77..2497d0a 100644 --- a/src/wand/magick.rs +++ b/src/wand/magick.rs @@ -37,6 +37,23 @@ wand_common!( MagickGetException ); +/// Resource type to use with [set_resource_limit](MagickWand::set_resource_limit) +#[derive(Debug, Clone, Copy)] +pub enum ResourceType { + Undefined = bindings::ResourceType_UndefinedResource as isize, + Area = bindings::ResourceType_AreaResource as isize, + Disk = bindings::ResourceType_DiskResource as isize, + File = bindings::ResourceType_FileResource as isize, + Height = bindings::ResourceType_HeightResource as isize, + Map = bindings::ResourceType_MapResource as isize, + Memory = bindings::ResourceType_MemoryResource as isize, + Thread = bindings::ResourceType_ThreadResource as isize, + Throttle = bindings::ResourceType_ThrottleResource as isize, + Time = bindings::ResourceType_TimeResource as isize, + Width = bindings::ResourceType_WidthResource as isize, + ListLength = bindings::ResourceType_ListLengthResource as isize, +} + /// MagickWand is a Rustic wrapper to the Rust bindings to ImageMagick. /// /// Instantiating a `MagickWand` will construct an ImageMagick "wand" @@ -56,6 +73,19 @@ impl MagickWand { } } + pub fn set_resource_limit(resource: ResourceType, limit: u64) -> Result<(), &'static str> { + let result = unsafe { + bindings::SetMagickResourceLimit( + resource as bindings::ResourceType, + limit as bindings::MagickSizeType, + ) + }; + match result { + bindings::MagickBooleanType_MagickTrue => Ok(()), + _ => Err("failed to set resource limit"), + } + } + pub fn set_option(&mut self, key: &str, value: &str) -> Result<(), &'static str> { let c_key = CString::new(key).unwrap(); let c_value = CString::new(value).unwrap(); diff --git a/src/wand/mod.rs b/src/wand/mod.rs index 29601df..2cf9201 100644 --- a/src/wand/mod.rs +++ b/src/wand/mod.rs @@ -20,5 +20,5 @@ mod magick; mod pixel; pub use self::drawing::DrawingWand; -pub use self::magick::MagickWand; +pub use self::magick::{MagickWand, ResourceType}; pub use self::pixel::{PixelWand, HSL}; diff --git a/tests/lib.rs b/tests/lib.rs index 89d31ff..eefbc0a 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -16,7 +16,7 @@ extern crate magick_rust; -use magick_rust::{bindings, magick_wand_genesis, MagickWand, PixelWand}; +use magick_rust::{bindings, magick_wand_genesis, MagickWand, PixelWand, ResourceType}; use magick_rust::ToMagick; use std::error::Error; @@ -361,3 +361,13 @@ fn test_negate_image() { pixel_color.get_color_as_string().unwrap() ); } + +#[test] +fn test_resource_limits() { + START.call_once(|| { + magick_wand_genesis(); + }); + MagickWand::set_resource_limit(ResourceType::Thread, 1).unwrap(); + let wand = MagickWand::new(); + assert!(wand.read_image("tests/data/rust.png").is_ok()); +}