diff --git a/src/lib.rs b/src/lib.rs index 4cffebd..32fbc30 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,9 +36,7 @@ use libc::size_t; #[cfg(not(target_os = "freebsd"))] use libc::ssize_t; -pub use bindings::{ - ColorspaceType, CompositeOperator, DitherMethod, FilterType, GravityType, MetricType, -}; +pub use bindings::{ColorspaceType, DitherMethod, FilterType, GravityType, MetricType}; pub use conversions::ToMagick; pub use result::MagickError; use result::Result; diff --git a/src/wand/composite_operator.rs b/src/wand/composite_operator.rs new file mode 100644 index 0000000..a03e0b7 --- /dev/null +++ b/src/wand/composite_operator.rs @@ -0,0 +1,265 @@ +#[derive(Default, Debug, Clone, Copy)] +pub enum CompositeOperator { + Undefined, + Alpha, + Atop, + Blend, + Blur, + Bumpmap, + ChangeMask, + Clear, + ColorBurn, + ColorDodge, + Colorize, + CopyBlack, + CopyBlue, + Copy, + CopyCyan, + CopyGreen, + CopyMagenta, + CopyAlpha, + CopyRed, + CopyYellow, + Darken, + DarkenIntensity, + Difference, + Displace, + Dissolve, + Distort, + DivideDst, + DivideSrc, + DstAtop, + Dst, + DstIn, + DstOut, + DstOver, + Exclusion, + HardLight, + HardMix, + Hue, + In, + Intensity, + Lighten, + LightenIntensity, + LinearBurn, + LinearDodge, + LinearLight, + Luminize, + Mathematics, + MinusDst, + MinusSrc, + Modulate, + ModulusAdd, + ModulusSubtract, + Multiply, + No, + Out, + #[default] + Over, + Overlay, + PegtopLight, + PinLight, + Plus, + Replace, + Saturate, + Screen, + SoftLight, + SrcAtop, + Src, + SrcIn, + SrcOut, + SrcOver, + Threshold, + VividLight, + Xor, + Stereo, + Freeze, + Interpolate, + Negate, + Reflect, + SoftBurn, + SoftDodge, + Stamp, + RMSE, + SaliencyBlend, + SeamlessBlend, +} + +impl From for crate::bindings::CompositeOperator { + fn from(value: CompositeOperator) -> Self { + match value { + CompositeOperator::Undefined => crate::bindings::CompositeOperator_UndefinedCompositeOp, + CompositeOperator::Alpha => crate::bindings::CompositeOperator_AlphaCompositeOp, + CompositeOperator::Atop => crate::bindings::CompositeOperator_AtopCompositeOp, + CompositeOperator::Blend => crate::bindings::CompositeOperator_BlendCompositeOp, + CompositeOperator::Blur => crate::bindings::CompositeOperator_BlurCompositeOp, + CompositeOperator::Bumpmap => crate::bindings::CompositeOperator_BumpmapCompositeOp, + CompositeOperator::ChangeMask => crate::bindings::CompositeOperator_ChangeMaskCompositeOp, + CompositeOperator::Clear => crate::bindings::CompositeOperator_ClearCompositeOp, + CompositeOperator::ColorBurn => crate::bindings::CompositeOperator_ColorBurnCompositeOp, + CompositeOperator::ColorDodge => crate::bindings::CompositeOperator_ColorDodgeCompositeOp, + CompositeOperator::Colorize => crate::bindings::CompositeOperator_ColorizeCompositeOp, + CompositeOperator::CopyBlack => crate::bindings::CompositeOperator_CopyBlackCompositeOp, + CompositeOperator::CopyBlue => crate::bindings::CompositeOperator_CopyBlueCompositeOp, + CompositeOperator::Copy => crate::bindings::CompositeOperator_CopyCompositeOp, + CompositeOperator::CopyCyan => crate::bindings::CompositeOperator_CopyCyanCompositeOp, + CompositeOperator::CopyGreen => crate::bindings::CompositeOperator_CopyGreenCompositeOp, + CompositeOperator::CopyMagenta => crate::bindings::CompositeOperator_CopyMagentaCompositeOp, + CompositeOperator::CopyAlpha => crate::bindings::CompositeOperator_CopyAlphaCompositeOp, + CompositeOperator::CopyRed => crate::bindings::CompositeOperator_CopyRedCompositeOp, + CompositeOperator::CopyYellow => crate::bindings::CompositeOperator_CopyYellowCompositeOp, + CompositeOperator::Darken => crate::bindings::CompositeOperator_DarkenCompositeOp, + CompositeOperator::DarkenIntensity => crate::bindings::CompositeOperator_DarkenIntensityCompositeOp, + CompositeOperator::Difference => crate::bindings::CompositeOperator_DifferenceCompositeOp, + CompositeOperator::Displace => crate::bindings::CompositeOperator_DisplaceCompositeOp, + CompositeOperator::Dissolve => crate::bindings::CompositeOperator_DissolveCompositeOp, + CompositeOperator::Distort => crate::bindings::CompositeOperator_DistortCompositeOp, + CompositeOperator::DivideDst => crate::bindings::CompositeOperator_DivideDstCompositeOp, + CompositeOperator::DivideSrc => crate::bindings::CompositeOperator_DivideSrcCompositeOp, + CompositeOperator::DstAtop => crate::bindings::CompositeOperator_DstAtopCompositeOp, + CompositeOperator::Dst => crate::bindings::CompositeOperator_DstCompositeOp, + CompositeOperator::DstIn => crate::bindings::CompositeOperator_DstInCompositeOp, + CompositeOperator::DstOut => crate::bindings::CompositeOperator_DstOutCompositeOp, + CompositeOperator::DstOver => crate::bindings::CompositeOperator_DstOverCompositeOp, + CompositeOperator::Exclusion => crate::bindings::CompositeOperator_ExclusionCompositeOp, + CompositeOperator::HardLight => crate::bindings::CompositeOperator_HardLightCompositeOp, + CompositeOperator::HardMix => crate::bindings::CompositeOperator_HardMixCompositeOp, + CompositeOperator::Hue => crate::bindings::CompositeOperator_HueCompositeOp, + CompositeOperator::In => crate::bindings::CompositeOperator_InCompositeOp, + CompositeOperator::Intensity => crate::bindings::CompositeOperator_IntensityCompositeOp, + CompositeOperator::Lighten => crate::bindings::CompositeOperator_LightenCompositeOp, + CompositeOperator::LightenIntensity => crate::bindings::CompositeOperator_LightenIntensityCompositeOp, + CompositeOperator::LinearBurn => crate::bindings::CompositeOperator_LinearBurnCompositeOp, + CompositeOperator::LinearDodge => crate::bindings::CompositeOperator_LinearDodgeCompositeOp, + CompositeOperator::LinearLight => crate::bindings::CompositeOperator_LinearLightCompositeOp, + CompositeOperator::Luminize => crate::bindings::CompositeOperator_LuminizeCompositeOp, + CompositeOperator::Mathematics => crate::bindings::CompositeOperator_MathematicsCompositeOp, + CompositeOperator::MinusDst => crate::bindings::CompositeOperator_MinusDstCompositeOp, + CompositeOperator::MinusSrc => crate::bindings::CompositeOperator_MinusSrcCompositeOp, + CompositeOperator::Modulate => crate::bindings::CompositeOperator_ModulateCompositeOp, + CompositeOperator::ModulusAdd => crate::bindings::CompositeOperator_ModulusAddCompositeOp, + CompositeOperator::ModulusSubtract => crate::bindings::CompositeOperator_ModulusSubtractCompositeOp, + CompositeOperator::Multiply => crate::bindings::CompositeOperator_MultiplyCompositeOp, + CompositeOperator::No => crate::bindings::CompositeOperator_NoCompositeOp, + CompositeOperator::Out => crate::bindings::CompositeOperator_OutCompositeOp, + CompositeOperator::Over => crate::bindings::CompositeOperator_OverCompositeOp, + CompositeOperator::Overlay => crate::bindings::CompositeOperator_OverlayCompositeOp, + CompositeOperator::PegtopLight => crate::bindings::CompositeOperator_PegtopLightCompositeOp, + CompositeOperator::PinLight => crate::bindings::CompositeOperator_PinLightCompositeOp, + CompositeOperator::Plus => crate::bindings::CompositeOperator_PlusCompositeOp, + CompositeOperator::Replace => crate::bindings::CompositeOperator_ReplaceCompositeOp, + CompositeOperator::Saturate => crate::bindings::CompositeOperator_SaturateCompositeOp, + CompositeOperator::Screen => crate::bindings::CompositeOperator_ScreenCompositeOp, + CompositeOperator::SoftLight => crate::bindings::CompositeOperator_SoftLightCompositeOp, + CompositeOperator::SrcAtop => crate::bindings::CompositeOperator_SrcAtopCompositeOp, + CompositeOperator::Src => crate::bindings::CompositeOperator_SrcCompositeOp, + CompositeOperator::SrcIn => crate::bindings::CompositeOperator_SrcInCompositeOp, + CompositeOperator::SrcOut => crate::bindings::CompositeOperator_SrcOutCompositeOp, + CompositeOperator::SrcOver => crate::bindings::CompositeOperator_SrcOverCompositeOp, + CompositeOperator::Threshold => crate::bindings::CompositeOperator_ThresholdCompositeOp, + CompositeOperator::VividLight => crate::bindings::CompositeOperator_VividLightCompositeOp, + CompositeOperator::Xor => crate::bindings::CompositeOperator_XorCompositeOp, + CompositeOperator::Stereo => crate::bindings::CompositeOperator_StereoCompositeOp, + CompositeOperator::Freeze => crate::bindings::CompositeOperator_FreezeCompositeOp, + CompositeOperator::Interpolate => crate::bindings::CompositeOperator_InterpolateCompositeOp, + CompositeOperator::Negate => crate::bindings::CompositeOperator_NegateCompositeOp, + CompositeOperator::Reflect => crate::bindings::CompositeOperator_ReflectCompositeOp, + CompositeOperator::SoftBurn => crate::bindings::CompositeOperator_SoftBurnCompositeOp, + CompositeOperator::SoftDodge => crate::bindings::CompositeOperator_SoftDodgeCompositeOp, + CompositeOperator::Stamp => crate::bindings::CompositeOperator_StampCompositeOp, + CompositeOperator::RMSE => crate::bindings::CompositeOperator_RMSECompositeOp, + CompositeOperator::SaliencyBlend => crate::bindings::CompositeOperator_SaliencyBlendCompositeOp, + CompositeOperator::SeamlessBlend => crate::bindings::CompositeOperator_SeamlessBlendCompositeOp, + } + } +} + +impl From for CompositeOperator { + fn from(value: crate::bindings::CompositeOperator) -> Self { + match value { + crate::bindings::CompositeOperator_UndefinedCompositeOp => CompositeOperator::Undefined, + crate::bindings::CompositeOperator_AlphaCompositeOp => CompositeOperator::Alpha, + crate::bindings::CompositeOperator_AtopCompositeOp => CompositeOperator::Atop, + crate::bindings::CompositeOperator_BlendCompositeOp => CompositeOperator::Blend, + crate::bindings::CompositeOperator_BlurCompositeOp => CompositeOperator::Blur, + crate::bindings::CompositeOperator_BumpmapCompositeOp => CompositeOperator::Bumpmap, + crate::bindings::CompositeOperator_ChangeMaskCompositeOp => CompositeOperator::ChangeMask, + crate::bindings::CompositeOperator_ClearCompositeOp => CompositeOperator::Clear, + crate::bindings::CompositeOperator_ColorBurnCompositeOp => CompositeOperator::ColorBurn, + crate::bindings::CompositeOperator_ColorDodgeCompositeOp => CompositeOperator::ColorDodge, + crate::bindings::CompositeOperator_ColorizeCompositeOp => CompositeOperator::Colorize, + crate::bindings::CompositeOperator_CopyBlackCompositeOp => CompositeOperator::CopyBlack, + crate::bindings::CompositeOperator_CopyBlueCompositeOp => CompositeOperator::CopyBlue, + crate::bindings::CompositeOperator_CopyCompositeOp => CompositeOperator::Copy, + crate::bindings::CompositeOperator_CopyCyanCompositeOp => CompositeOperator::CopyCyan, + crate::bindings::CompositeOperator_CopyGreenCompositeOp => CompositeOperator::CopyGreen, + crate::bindings::CompositeOperator_CopyMagentaCompositeOp => CompositeOperator::CopyMagenta, + crate::bindings::CompositeOperator_CopyAlphaCompositeOp => CompositeOperator::CopyAlpha, + crate::bindings::CompositeOperator_CopyRedCompositeOp => CompositeOperator::CopyRed, + crate::bindings::CompositeOperator_CopyYellowCompositeOp => CompositeOperator::CopyYellow, + crate::bindings::CompositeOperator_DarkenCompositeOp => CompositeOperator::Darken, + crate::bindings::CompositeOperator_DarkenIntensityCompositeOp => CompositeOperator::DarkenIntensity, + crate::bindings::CompositeOperator_DifferenceCompositeOp => CompositeOperator::Difference, + crate::bindings::CompositeOperator_DisplaceCompositeOp => CompositeOperator::Displace, + crate::bindings::CompositeOperator_DissolveCompositeOp => CompositeOperator::Dissolve, + crate::bindings::CompositeOperator_DistortCompositeOp => CompositeOperator::Distort, + crate::bindings::CompositeOperator_DivideDstCompositeOp => CompositeOperator::DivideDst, + crate::bindings::CompositeOperator_DivideSrcCompositeOp => CompositeOperator::DivideSrc, + crate::bindings::CompositeOperator_DstAtopCompositeOp => CompositeOperator::DstAtop, + crate::bindings::CompositeOperator_DstCompositeOp => CompositeOperator::Dst, + crate::bindings::CompositeOperator_DstInCompositeOp => CompositeOperator::DstIn, + crate::bindings::CompositeOperator_DstOutCompositeOp => CompositeOperator::DstOut, + crate::bindings::CompositeOperator_DstOverCompositeOp => CompositeOperator::DstOver, + crate::bindings::CompositeOperator_ExclusionCompositeOp => CompositeOperator::Exclusion, + crate::bindings::CompositeOperator_HardLightCompositeOp => CompositeOperator::HardLight, + crate::bindings::CompositeOperator_HardMixCompositeOp => CompositeOperator::HardMix, + crate::bindings::CompositeOperator_HueCompositeOp => CompositeOperator::Hue, + crate::bindings::CompositeOperator_InCompositeOp => CompositeOperator::In, + crate::bindings::CompositeOperator_IntensityCompositeOp => CompositeOperator::Intensity, + crate::bindings::CompositeOperator_LightenCompositeOp => CompositeOperator::Lighten, + crate::bindings::CompositeOperator_LightenIntensityCompositeOp => CompositeOperator::LightenIntensity, + crate::bindings::CompositeOperator_LinearBurnCompositeOp => CompositeOperator::LinearBurn, + crate::bindings::CompositeOperator_LinearDodgeCompositeOp => CompositeOperator::LinearDodge, + crate::bindings::CompositeOperator_LinearLightCompositeOp => CompositeOperator::LinearLight, + crate::bindings::CompositeOperator_LuminizeCompositeOp => CompositeOperator::Luminize, + crate::bindings::CompositeOperator_MathematicsCompositeOp => CompositeOperator::Mathematics, + crate::bindings::CompositeOperator_MinusDstCompositeOp => CompositeOperator::MinusDst, + crate::bindings::CompositeOperator_MinusSrcCompositeOp => CompositeOperator::MinusSrc, + crate::bindings::CompositeOperator_ModulateCompositeOp => CompositeOperator::Modulate, + crate::bindings::CompositeOperator_ModulusAddCompositeOp => CompositeOperator::ModulusAdd, + crate::bindings::CompositeOperator_ModulusSubtractCompositeOp => CompositeOperator::ModulusSubtract, + crate::bindings::CompositeOperator_MultiplyCompositeOp => CompositeOperator::Multiply, + crate::bindings::CompositeOperator_NoCompositeOp => CompositeOperator::No, + crate::bindings::CompositeOperator_OutCompositeOp => CompositeOperator::Out, + crate::bindings::CompositeOperator_OverCompositeOp => CompositeOperator::Over, + crate::bindings::CompositeOperator_OverlayCompositeOp => CompositeOperator::Overlay, + crate::bindings::CompositeOperator_PegtopLightCompositeOp => CompositeOperator::PegtopLight, + crate::bindings::CompositeOperator_PinLightCompositeOp => CompositeOperator::PinLight, + crate::bindings::CompositeOperator_PlusCompositeOp => CompositeOperator::Plus, + crate::bindings::CompositeOperator_ReplaceCompositeOp => CompositeOperator::Replace, + crate::bindings::CompositeOperator_SaturateCompositeOp => CompositeOperator::Saturate, + crate::bindings::CompositeOperator_ScreenCompositeOp => CompositeOperator::Screen, + crate::bindings::CompositeOperator_SoftLightCompositeOp => CompositeOperator::SoftLight, + crate::bindings::CompositeOperator_SrcAtopCompositeOp => CompositeOperator::SrcAtop, + crate::bindings::CompositeOperator_SrcCompositeOp => CompositeOperator::Src, + crate::bindings::CompositeOperator_SrcInCompositeOp => CompositeOperator::SrcIn, + crate::bindings::CompositeOperator_SrcOutCompositeOp => CompositeOperator::SrcOut, + crate::bindings::CompositeOperator_SrcOverCompositeOp => CompositeOperator::SrcOver, + crate::bindings::CompositeOperator_ThresholdCompositeOp => CompositeOperator::Threshold, + crate::bindings::CompositeOperator_VividLightCompositeOp => CompositeOperator::VividLight, + crate::bindings::CompositeOperator_XorCompositeOp => CompositeOperator::Xor, + crate::bindings::CompositeOperator_StereoCompositeOp => CompositeOperator::Stereo, + crate::bindings::CompositeOperator_FreezeCompositeOp => CompositeOperator::Freeze, + crate::bindings::CompositeOperator_InterpolateCompositeOp => CompositeOperator::Interpolate, + crate::bindings::CompositeOperator_NegateCompositeOp => CompositeOperator::Negate, + crate::bindings::CompositeOperator_ReflectCompositeOp => CompositeOperator::Reflect, + crate::bindings::CompositeOperator_SoftBurnCompositeOp => CompositeOperator::SoftBurn, + crate::bindings::CompositeOperator_SoftDodgeCompositeOp => CompositeOperator::SoftDodge, + crate::bindings::CompositeOperator_StampCompositeOp => CompositeOperator::Stamp, + crate::bindings::CompositeOperator_RMSECompositeOp => CompositeOperator::RMSE, + crate::bindings::CompositeOperator_SaliencyBlendCompositeOp => CompositeOperator::SaliencyBlend, + crate::bindings::CompositeOperator_SeamlessBlendCompositeOp => CompositeOperator::SeamlessBlend, + _ => CompositeOperator::default(), + } + } +} diff --git a/src/wand/magick.rs b/src/wand/magick.rs index d50f1f5..2a4f4a4 100644 --- a/src/wand/magick.rs +++ b/src/wand/magick.rs @@ -28,7 +28,7 @@ use {size_t, ssize_t}; use crate::result::Result; -use super::{DrawingWand, PixelWand}; +use super::{CompositeOperator, DrawingWand, PixelWand}; wand_common!( MagickWand, @@ -232,11 +232,24 @@ impl MagickWand { (distortion, wand) } + pub fn get_image_compose(&self) -> CompositeOperator { + unsafe { bindings::MagickGetImageCompose(self.wand).into() } + } + + pub fn set_image_compose(&self, composite_operator: CompositeOperator) -> Result<()> { + match unsafe { bindings::MagickSetImageCompose(self.wand, composite_operator.into()) } { + bindings::MagickBooleanType_MagickTrue => Ok(()), + _ => Err(MagickError( + "Failed to set the image composite operator type", + )), + } + } + /// Compose another image onto self at (x, y) using composition_operator pub fn compose_images( &self, reference: &MagickWand, - composition_operator: bindings::CompositeOperator, + composition_operator: CompositeOperator, clip_to_self: bool, x: isize, y: isize, @@ -250,7 +263,7 @@ impl MagickWand { bindings::MagickCompositeImage( self.wand, reference.wand, - composition_operator, + composition_operator.into(), native_clip_to_self, x, y, @@ -266,14 +279,14 @@ impl MagickWand { pub fn compose_images_gravity( &self, reference: &MagickWand, - composition_operator: bindings::CompositeOperator, + composition_operator: CompositeOperator, gravity_type: bindings::GravityType, ) -> Result<()> { let result = unsafe { bindings::MagickCompositeImageGravity( self.wand, reference.wand, - composition_operator, + composition_operator.into(), gravity_type, ) }; @@ -973,10 +986,10 @@ impl MagickWand { pixel_wand: &PixelWand, width: usize, height: usize, - compose: bindings::CompositeOperator, + compose: CompositeOperator, ) -> Result<()> { match unsafe { - bindings::MagickBorderImage(self.wand, pixel_wand.wand, width, height, compose) + bindings::MagickBorderImage(self.wand, pixel_wand.wand, width, height, compose.into()) } { bindings::MagickBooleanType_MagickTrue => Ok(()), @@ -1110,7 +1123,6 @@ impl MagickWand { get_compression_quality, set_compression_quality, MagickGetCompressionQuality, MagickSetCompressionQuality, size_t get_gravity, set_gravity, MagickGetGravity, MagickSetGravity, bindings::GravityType get_image_colorspace, set_image_colorspace, MagickGetImageColorspace, MagickSetImageColorspace, bindings::ColorspaceType - get_image_compose, set_image_compose, MagickGetImageCompose, MagickSetImageCompose, bindings::CompositeOperator get_image_compression, set_image_compression, MagickGetImageCompression, MagickSetImageCompression, bindings::CompressionType get_image_compression_quality, set_image_compression_quality, MagickGetImageCompressionQuality, MagickSetImageCompressionQuality, size_t get_image_delay, set_image_delay, MagickGetImageDelay, MagickSetImageDelay, size_t diff --git a/src/wand/mod.rs b/src/wand/mod.rs index 2cf9201..1e40284 100644 --- a/src/wand/mod.rs +++ b/src/wand/mod.rs @@ -15,10 +15,12 @@ */ #[macro_use] mod macros; +mod composite_operator; mod drawing; mod magick; mod pixel; +pub use self::composite_operator::CompositeOperator; pub use self::drawing::DrawingWand; pub use self::magick::{MagickWand, ResourceType}; pub use self::pixel::{PixelWand, HSL};