Method: Magick::Image#add_compose_mask
- Defined in:
- ext/RMagick/rmimage.cpp
#add_compose_mask(mask) ⇒ Object
Associates a mask with an image that will be used as the destination image in a #composite operation.
The areas of the destination image that are masked by white pixels will be modified by the #composite method, while areas masked by black pixels are unchanged.
647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 |
# File 'ext/RMagick/rmimage.cpp', line 647
VALUE
Image_add_compose_mask(VALUE self, VALUE mask)
{
Image *image, *mask_image = NULL;
#if defined(IMAGEMAGICK_7)
ExceptionInfo *exception;
Image *clip_mask = NULL;
#endif
image = rm_check_frozen(self);
mask_image = rm_check_destroyed(rm_cur_image(mask));
if (image->columns != mask_image->columns || image->rows != mask_image->rows)
{
rb_raise(rb_eArgError, "mask must be the same size as image");
}
#if defined(IMAGEMAGICK_7)
clip_mask = rm_clone_image(mask_image);
exception = AcquireExceptionInfo();
GVL_STRUCT_TYPE(NegateImage) args_NegateImage = { clip_mask, MagickFalse, exception };
CALL_FUNC_WITHOUT_GVL(GVL_FUNC(NegateImage), &args_NegateImage);
rm_check_exception(exception, clip_mask, DestroyOnError);
GVL_STRUCT_TYPE(SetImageMask) args_SetImageMask = { image, CompositePixelMask, clip_mask, exception };
CALL_FUNC_WITHOUT_GVL(GVL_FUNC(SetImageMask), &args_SetImageMask);
DestroyImage(clip_mask);
CHECK_EXCEPTION();
DestroyExceptionInfo(exception);
#else
// Delete any previously-existing mask image.
// Store a clone of the new mask image.
GVL_STRUCT_TYPE(SetImageMask) args_SetImageMask = { image, mask_image };
CALL_FUNC_WITHOUT_GVL(GVL_FUNC(SetImageMask), &args_SetImageMask);
GVL_STRUCT_TYPE(NegateImage) args_NegateImage = { image->mask, MagickFalse };
CALL_FUNC_WITHOUT_GVL(GVL_FUNC(NegateImage), &args_NegateImage);
// Since both Set and GetImageMask clone the mask image I don't see any
// way to negate the mask without referencing it directly. Sigh.
#endif
return self;
}
|