Method: Magick::Image#mask
- Defined in:
- ext/RMagick/rmimage.c
permalink #mask(*args) ⇒ Object
Associate a clip mask with the image.
Ruby usage:
- @verbatim Image#mask @endverbatim
- @verbatim Image#mask(mask-image) @endverbatim
Notes:
- Omit the argument to get a copy of the current clip mask.
- Pass "nil" for the mask-image to remove the current clip mask.
- If the clip mask is not the same size as the target image, resizes the
clip mask to match the target.
- Distinguish from Image#clip_mask=
8330 8331 8332 8333 8334 8335 8336 8337 8338 8339 8340 8341 8342 8343 8344 8345 8346 8347 8348 8349 8350 8351 8352 8353 8354 8355 8356 8357 8358 8359 8360 8361 8362 8363 8364 8365 8366 8367 8368 8369 8370 8371 8372 8373 8374 8375 8376 8377 8378 8379 8380 8381 8382 8383 8384 8385 8386 8387 8388 8389 8390 8391 8392 8393 8394 8395 8396 8397 8398 8399 8400 8401 8402 8403 8404 8405 8406 8407 8408 8409 8410 8411 8412 8413 8414 8415 8416 8417 8418 8419 8420 8421 8422 8423 8424 8425 8426 8427 8428 8429 8430 8431 |
# File 'ext/RMagick/rmimage.c', line 8330
VALUE
Image_mask(int argc, VALUE *argv, VALUE self)
{
volatile VALUE mask;
Image *image, *mask_image, *resized_image;
Image *clip_mask;
long x, y;
PixelPacket *q;
ExceptionInfo exception;
image = rm_check_destroyed(self);
if (argc == 0)
{
return get_image_mask(image);
}
if (argc > 1)
{
rb_raise(rb_eArgError, "wrong number of arguments (expected 0 or 1, got %d)", argc);
}
rb_check_frozen(self);
mask = argv[0];
if (mask != Qnil)
{
mask = rm_cur_image(mask);
mask_image = rm_check_destroyed(mask);
clip_mask = rm_clone_image(mask_image);
// Resize if necessary
if (clip_mask->columns != image->columns || clip_mask->rows != image->rows)
{
GetExceptionInfo(&exception);
resized_image = ResizeImage(clip_mask, image->columns, image->rows
, UndefinedFilter, 0.0, &exception);
rm_check_exception(&exception, resized_image, DestroyOnError);
(void) DestroyExceptionInfo(&exception);
rm_ensure_result(resized_image);
(void) DestroyImage(clip_mask);
clip_mask = resized_image;
}
// The following section is copied from mogrify.c (6.2.8-8)
#if defined(HAVE_SYNCAUTHENTICPIXELS)
GetExceptionInfo(&exception);
#endif
for (y = 0; y < (long) clip_mask->rows; y++)
{
#if defined(HAVE_GETAUTHENTICPIXELS)
q = GetAuthenticPixels(clip_mask, 0, y, clip_mask->columns, 1, &exception);
rm_check_exception(&exception, clip_mask, DestroyOnError);
#else
q = GetImagePixels(clip_mask, 0, y, clip_mask->columns, 1);
rm_check_image_exception(clip_mask, DestroyOnError);
#endif
if (!q)
{
break;
}
for (x = 0; x < (long) clip_mask->columns; x++)
{
if (clip_mask->matte == MagickFalse)
{
q->opacity = PIXEL_INTENSITY(q);
}
q->red = q->opacity;
q->green = q->opacity;
q->blue = q->opacity;
q += 1;
}
#if defined(HAVE_SYNCAUTHENTICPIXELS)
SyncAuthenticPixels(clip_mask, &exception);
rm_check_exception(&exception, clip_mask, DestroyOnError);
#else
SyncImagePixels(clip_mask);
rm_check_image_exception(clip_mask, DestroyOnError);
#endif
}
#if defined(HAVE_SYNCAUTHENTICPIXELS)
(void) DestroyExceptionInfo(&exception);
#endif
SetImageStorageClass(clip_mask, DirectClass);
rm_check_image_exception(clip_mask, DestroyOnError);
clip_mask->matte = MagickTrue;
// SetImageClipMask clones the clip_mask image. We can
// destroy our copy after SetImageClipMask is done with it.
(void) SetImageClipMask(image, clip_mask);
(void) DestroyImage(clip_mask);
}
else
{
(void) SetImageClipMask(image, NULL);
}
// Always return a copy of the mask!
return get_image_mask(image);
}
|