Method: Magick::Image#store_pixels
- Defined in:
- ext/RMagick/rmimage.c
#store_pixels(x_arg, y_arg, cols_arg, rows_arg, new_pixels) ⇒ Object
Replace the pixels in the specified rectangle.
Ruby usage:
- @verbatim Image#store_pixels(x,y,cols,rows,new_pixels) @endverbatim
Notes:
- Calls GetImagePixels, then SyncImagePixels after replacing the pixels.
- This is the complement of get_pixels. The array object returned by
get_pixels is suitable for use as the "new_pixels" argument.
12676 12677 12678 12679 12680 12681 12682 12683 12684 12685 12686 12687 12688 12689 12690 12691 12692 12693 12694 12695 12696 12697 12698 12699 12700 12701 12702 12703 12704 12705 12706 12707 12708 12709 12710 12711 12712 12713 12714 12715 12716 12717 12718 12719 12720 12721 12722 12723 12724 12725 12726 12727 12728 12729 12730 12731 12732 12733 12734 12735 12736 12737 12738 12739 12740 12741 12742 12743 12744 12745 12746 12747 12748 12749 |
# File 'ext/RMagick/rmimage.c', line 12676
VALUE
Image_store_pixels(VALUE self, VALUE x_arg, VALUE y_arg, VALUE cols_arg
, VALUE rows_arg, VALUE new_pixels)
{
Image *image;
Pixel *pixels, *pixel;
volatile VALUE new_pixel;
long n, size;
long x, y;
unsigned long cols, rows;
unsigned int okay;
image = rm_check_destroyed(self);
x = NUM2LONG(x_arg);
y = NUM2LONG(y_arg);
cols = NUM2ULONG(cols_arg);
rows = NUM2ULONG(rows_arg);
if (x < 0 || y < 0 || x+cols > image->columns || y+rows > image->rows)
{
rb_raise(rb_eRangeError, "geometry (%lux%lu%+ld%+ld) exceeds image bounds"
, cols, rows, x, y);
}
size = (long)(cols * rows);
rm_check_ary_len(new_pixels, size);
okay = SetImageStorageClass(image, DirectClass);
rm_check_image_exception(image, RetainOnError);
if (!okay)
{
rb_raise(Class_ImageMagickError, "SetImageStorageClass failed. Can't store pixels.");
}
// Get a pointer to the pixels. Replace the values with the PixelPackets
// from the pixels argument.
{
#if defined(HAVE_SYNCAUTHENTICPIXELS) || defined(HAVE_GETAUTHENTICPIXELS)
ExceptionInfo exception;
GetExceptionInfo(&exception);
#endif
#if defined(HAVE_GETAUTHENTICPIXELS)
pixels = GetAuthenticPixels(image, x, y, cols, rows, &exception);
CHECK_EXCEPTION()
#else
pixels = GetImagePixels(image, x, y, cols, rows);
rm_check_image_exception(image, RetainOnError);
#endif
if (pixels)
{
for (n = 0; n < size; n++)
{
new_pixel = rb_ary_entry(new_pixels, n);
Data_Get_Struct(new_pixel, Pixel, pixel);
pixels[n] = *pixel;
}
#if defined(HAVE_SYNCAUTHENTICPIXELS)
SyncAuthenticPixels(image, &exception);
CHECK_EXCEPTION()
#else
SyncImagePixels(image);
rm_check_image_exception(image, RetainOnError);
#endif
}
#if defined(HAVE_SYNCAUTHENTICPIXELS) || defined(HAVE_GETAUTHENTICPIXELS)
DestroyExceptionInfo(&exception);
#endif
}
return self;
}
|