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.

Parameters:

  • self

    this object

  • x_arg

    x position of start of region

  • y_arg

    y position of start of region

  • cols_arg

    width of region

  • rows_arg

    height of region

  • new_pixels

    the replacing pixels

Returns:

  • self


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;
}