# class Cairo::Region

### Public Class Methods

new(*args) click to toggle source

    static VALUE
    cr_region_initialize (int argc, VALUE *argv, VALUE self)
    {
      cairo_region_t *region;

      if (argc == 0)
        {
          region = cairo_region_create ();
        }
      else
        {
          int i;
          cairo_rectangle_int_t *rectangles;

          rectangles = ALLOCA_N (cairo_rectangle_int_t, argc);
          for (i = 0; i < argc; i++)
            {
              VALUE rb_rectangle;

              rb_rectangle = rb_check_array_type (argv[i]);
              if (RARRAY_LEN (rb_rectangle) != 4)
                rb_raise (rb_eArgError,
                          "invalid argument (expect "
                          "() or ([x, y, width, height], ...): %s",
                          rb_cairo__inspect (rb_ary_new4 (argc, argv)));
              rectangles[i].x = NUM2INT (RARRAY_PTR (rb_rectangle)[0]);
              rectangles[i].y = NUM2INT (RARRAY_PTR (rb_rectangle)[1]);
              rectangles[i].width = NUM2INT (RARRAY_PTR (rb_rectangle)[2]);
              rectangles[i].height = NUM2INT (RARRAY_PTR (rb_rectangle)[3]);
            }
          region = cairo_region_create_rectangles (rectangles, argc);
        }
      cr_region_check_status (region);
      DATA_PTR (self) = region;
      return Qnil;
    }

### Public Instance Methods

==(p1) click to toggle source

    static VALUE
    cr_region_equal (VALUE self, VALUE other)
    {
      cairo_region_t *region, *other_region;

      if (!rb_cairo__is_kind_of (other, rb_cCairo_Region))
        return Qfalse;

      region = _SELF;
      other_region = RVAL2CRREGION (other);
      return CBOOL2RVAL (cairo_region_equal (region, other_region));
    }

[](p1) click to toggle source

    static VALUE
    cr_region_get_rectangle (VALUE self, VALUE index)
    {
      cairo_region_t *region;
      cairo_rectangle_int_t extents;

      region = _SELF;
      cairo_region_get_rectangle (region, NUM2INT (index), &extents);
      cr_region_check_status (region);
      return rb_ary_new3 (4,
                          INT2NUM (extents.x), INT2NUM (extents.y),
                          INT2NUM (extents.width), INT2NUM (extents.height));
    }

contains_point?(*args) click to toggle source

    static VALUE
    cr_region_containts_point (int argc, VALUE *argv, VALUE self)
    {
      cairo_region_t *region;
      int x, y;
      VALUE arg1, arg2;
      const char *error_message =
        "invalid argument (expect "
        "(x, y) or ([x, y])): %s";

      rb_scan_args (argc, argv, "11", &arg1, &arg2);

      region = _SELF;
      if (argc == 1)
        {
          VALUE point;

          point = rb_check_array_type (arg1);
          if (RARRAY_LEN (point) != 4)
            rb_raise (rb_eArgError, error_message,
                      rb_cairo__inspect (rb_ary_new4 (argc, argv)));
          x = NUM2INT (RARRAY_PTR (point)[0]);
          y = NUM2INT (RARRAY_PTR (point)[1]);
        }
      else
        {
          x = NUM2INT (arg1);
          y = NUM2INT (arg2);
        }
      return CBOOL2RVAL (cairo_region_contains_point (region, x, y));
    }

contains_rectangle(*args) click to toggle source

    static VALUE
    cr_region_containts_rectangle (int argc, VALUE *argv, VALUE self)
    {
      cairo_region_t *region;
      cairo_rectangle_int_t rectangle;
      cairo_region_overlap_t overlap;
      VALUE arg1, arg2, arg3, arg4;
      const char *error_message =
        "invalid argument (expect "
        "(x, y, width, height) or ([x, y, width, height])): %s";

      rb_scan_args (argc, argv, "13", &arg1, &arg2, &arg3, &arg4);

      region = _SELF;
      if (argc == 1)
        {
          VALUE rb_rectangle;

          rb_rectangle = rb_check_array_type (arg1);
          if (RARRAY_LEN (rb_rectangle) != 4)
            rb_raise (rb_eArgError, error_message,
                      rb_cairo__inspect (rb_ary_new4 (argc, argv)));
          rectangle.x = NUM2INT (RARRAY_PTR (rb_rectangle)[0]);
          rectangle.y = NUM2INT (RARRAY_PTR (rb_rectangle)[1]);
          rectangle.width = NUM2INT (RARRAY_PTR (rb_rectangle)[2]);
          rectangle.height = NUM2INT (RARRAY_PTR (rb_rectangle)[3]);
        }
      else if (argc == 4)
        {
          rectangle.x = NUM2INT (arg1);
          rectangle.y = NUM2INT (arg2);
          rectangle.width = NUM2INT (arg3);
          rectangle.height = NUM2INT (arg4);
        }
      else
        {
          rb_raise (rb_eArgError, error_message,
                    rb_cairo__inspect (rb_ary_new4 (argc, argv)));
        }

      overlap = cairo_region_contains_rectangle (region, &rectangle);
      cr_region_check_status (region);
      return INT2NUM (overlap);
    }

dup() click to toggle source

    static VALUE
    cr_region_dup (VALUE self)
    {
      cairo_region_t *copied_region;
      VALUE rb_copied_region;

      copied_region = cairo_region_copy (_SELF);
      cr_region_check_status (copied_region);
      rb_copied_region = CRREGION2RVAL (copied_region);
      cairo_region_destroy (copied_region);
      return rb_copied_region;
    }

each_rectangle() { |self| ... } click to toggle source

    # File lib/cairo/region.rb, line 3
    def each_rectangle
      return to_enum(:each_rectangle) unless block_given?
      num_rectangles.times.each do |i|
        yield(self[i])
      end
    end

empty?() click to toggle source

    static VALUE
    cr_region_is_empty (VALUE self)
    {
      return CBOOL2RVAL (cairo_region_is_empty (_SELF));
    }

extents() click to toggle source

    static VALUE
    cr_region_get_extents (VALUE self)
    {
      cairo_region_t *region;
      cairo_rectangle_int_t extents;

      region = _SELF;
      cairo_region_get_extents (region, &extents);
      cr_region_check_status (region);
      return rb_ary_new3 (4,
                          INT2NUM (extents.x), INT2NUM (extents.y),
                          INT2NUM (extents.width), INT2NUM (extents.height));
    }

num_rectangles() click to toggle source

    static VALUE
    cr_region_num_rectangles (VALUE self)
    {
      cairo_region_t *region;
      int num_rectangles;

      region = _SELF;
      num_rectangles = cairo_region_num_rectangles (region);
      cr_region_check_status (region);
      return INT2NUM (num_rectangles);
    }

rectangles() click to toggle source

    # File lib/cairo/region.rb, line 10
    def rectangles
      each_rectangle.to_a
    end

translate!(*args) click to toggle source

    static VALUE
    cr_region_translate (int argc, VALUE *argv, VALUE self)
    {
      cairo_region_t *region;
      int x, y;
      VALUE arg1, arg2;
      const char *error_message =
        "invalid argument (expect "
        "(x, y) or ([x, y])): %s";

      rb_scan_args (argc, argv, "11", &arg1, &arg2);

      region = _SELF;
      if (argc == 1)
        {
          VALUE point;

          point = rb_check_array_type (arg1);
          if (RARRAY_LEN (point) != 4)
            rb_raise (rb_eArgError, error_message,
                      rb_cairo__inspect (rb_ary_new4 (argc, argv)));
          x = NUM2INT (RARRAY_PTR (point)[0]);
          y = NUM2INT (RARRAY_PTR (point)[1]);
        }
      else
        {
          x = NUM2INT (arg1);
          y = NUM2INT (arg2);
        }

      cairo_region_translate (region, x, y);
      cr_region_check_status (region);
      return Qnil;
    }