Merge pull request #113 from 5ohue/composite

CompositeOperator type
This commit is contained in:
Nathan Fiedler
2023-11-18 07:52:07 -08:00
committed by GitHub
4 changed files with 288 additions and 11 deletions

View File

@ -36,9 +36,7 @@ use libc::size_t;
#[cfg(not(target_os = "freebsd"))] #[cfg(not(target_os = "freebsd"))]
use libc::ssize_t; use libc::ssize_t;
pub use bindings::{ pub use bindings::{ColorspaceType, DitherMethod, FilterType, GravityType, MetricType};
ColorspaceType, CompositeOperator, DitherMethod, FilterType, GravityType, MetricType,
};
pub use conversions::ToMagick; pub use conversions::ToMagick;
pub use result::MagickError; pub use result::MagickError;
use result::Result; use result::Result;

View File

@ -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<CompositeOperator> 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<crate::bindings::CompositeOperator> 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(),
}
}
}

View File

@ -28,7 +28,7 @@ use {size_t, ssize_t};
use crate::result::Result; use crate::result::Result;
use super::{DrawingWand, PixelWand}; use super::{CompositeOperator, DrawingWand, PixelWand};
wand_common!( wand_common!(
MagickWand, MagickWand,
@ -232,11 +232,24 @@ impl MagickWand {
(distortion, wand) (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 /// Compose another image onto self at (x, y) using composition_operator
pub fn compose_images( pub fn compose_images(
&self, &self,
reference: &MagickWand, reference: &MagickWand,
composition_operator: bindings::CompositeOperator, composition_operator: CompositeOperator,
clip_to_self: bool, clip_to_self: bool,
x: isize, x: isize,
y: isize, y: isize,
@ -250,7 +263,7 @@ impl MagickWand {
bindings::MagickCompositeImage( bindings::MagickCompositeImage(
self.wand, self.wand,
reference.wand, reference.wand,
composition_operator, composition_operator.into(),
native_clip_to_self, native_clip_to_self,
x, x,
y, y,
@ -266,14 +279,14 @@ impl MagickWand {
pub fn compose_images_gravity( pub fn compose_images_gravity(
&self, &self,
reference: &MagickWand, reference: &MagickWand,
composition_operator: bindings::CompositeOperator, composition_operator: CompositeOperator,
gravity_type: bindings::GravityType, gravity_type: bindings::GravityType,
) -> Result<()> { ) -> Result<()> {
let result = unsafe { let result = unsafe {
bindings::MagickCompositeImageGravity( bindings::MagickCompositeImageGravity(
self.wand, self.wand,
reference.wand, reference.wand,
composition_operator, composition_operator.into(),
gravity_type, gravity_type,
) )
}; };
@ -973,10 +986,10 @@ impl MagickWand {
pixel_wand: &PixelWand, pixel_wand: &PixelWand,
width: usize, width: usize,
height: usize, height: usize,
compose: bindings::CompositeOperator, compose: CompositeOperator,
) -> Result<()> { ) -> Result<()> {
match unsafe { 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(()), bindings::MagickBooleanType_MagickTrue => Ok(()),
@ -1110,7 +1123,6 @@ impl MagickWand {
get_compression_quality, set_compression_quality, MagickGetCompressionQuality, MagickSetCompressionQuality, size_t get_compression_quality, set_compression_quality, MagickGetCompressionQuality, MagickSetCompressionQuality, size_t
get_gravity, set_gravity, MagickGetGravity, MagickSetGravity, bindings::GravityType get_gravity, set_gravity, MagickGetGravity, MagickSetGravity, bindings::GravityType
get_image_colorspace, set_image_colorspace, MagickGetImageColorspace, MagickSetImageColorspace, bindings::ColorspaceType 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, set_image_compression, MagickGetImageCompression, MagickSetImageCompression, bindings::CompressionType
get_image_compression_quality, set_image_compression_quality, MagickGetImageCompressionQuality, MagickSetImageCompressionQuality, size_t get_image_compression_quality, set_image_compression_quality, MagickGetImageCompressionQuality, MagickSetImageCompressionQuality, size_t
get_image_delay, set_image_delay, MagickGetImageDelay, MagickSetImageDelay, size_t get_image_delay, set_image_delay, MagickGetImageDelay, MagickSetImageDelay, size_t

View File

@ -15,10 +15,12 @@
*/ */
#[macro_use] #[macro_use]
mod macros; mod macros;
mod composite_operator;
mod drawing; mod drawing;
mod magick; mod magick;
mod pixel; mod pixel;
pub use self::composite_operator::CompositeOperator;
pub use self::drawing::DrawingWand; pub use self::drawing::DrawingWand;
pub use self::magick::{MagickWand, ResourceType}; pub use self::magick::{MagickWand, ResourceType};
pub use self::pixel::{PixelWand, HSL}; pub use self::pixel::{PixelWand, HSL};