# class Cairo::Context

### Public Class Methods

new(p1) click to toggle source

    static VALUE
    cr_initialize (VALUE self, VALUE target)
    {
      cairo_t *cr;
      VALUE result = Qnil;

      cr = cairo_create (RVAL2CRSURFACE (target));
      cr_check_status (cr);
      rb_ivar_set (self, cr_id_surface, target);
      rb_ivar_set (self, cr_id_source, Qnil);
      if (rb_ivar_defined (target, rb_cairo__io_id_output))
        cr_set_user_data (cr,
                          &cr_object_holder_key,
                          cr_object_holder_new (self),
                          cr_object_holder_free);
      DATA_PTR (self) = cr;
      if (rb_block_given_p ())
        result = rb_ensure (rb_yield, self, cr_destroy_with_destroy_check, self);
      return result;
    }

wrap(p1) click to toggle source

    static VALUE
    cr_s_wrap (VALUE self, VALUE pointer)
    {
      VALUE result;
      VALUE rb_cr;
      cairo_t *cr;

      if (NIL_P (rb_cairo__cFFIPointer))
        {
          rb_raise (rb_eNotImpError,
                    "%s: FFI::Pointer is required",
                    rb_id2name (rb_frame_this_func ()));
        }

      if (!RTEST (rb_obj_is_kind_of (pointer, rb_cairo__cFFIPointer)))
        {
          rb_raise (rb_eArgError,
                    "must be FFI::Pointer: %s",
                    rb_cairo__inspect (pointer));
        }

      {
        VALUE rb_cr_address;
        rb_cr_address = rb_funcall (pointer, rb_intern ("address"), 0);
        cr = NUM2PTR (rb_cr_address);
        cr_check_status (cr);
      }

      rb_cr = rb_obj_alloc (self);
      cairo_reference (cr);
      DATA_PTR (rb_cr) = cr;
      rb_ivar_set (rb_cr, cr_id_surface, Qnil);

      if (rb_block_given_p ())
        {
          result = rb_ensure (rb_yield, rb_cr, cr_destroy_with_destroy_check, rb_cr);
        }
      else
        {
          result = rb_cr;
        }

      return result;
    }

### Public Instance Methods

antialias() click to toggle source

    static VALUE
    cr_get_antialias(VALUE self)
    {
      return INT2NUM (cairo_get_antialias (_SELF));
    }

append_path(p1) click to toggle source

    static VALUE
    cr_copy_append_path (VALUE self, VALUE path)
    {
      cairo_append_path (_SELF, RVAL2CRPATH (path));
      cr_check_status (_SELF);
      return self;
    }

arc(p1, p2, p3, p4, p5) click to toggle source

    static VALUE
    cr_arc (VALUE self, VALUE xc, VALUE yc, VALUE radius,
            VALUE angle1, VALUE angle2)
    {
      cairo_arc (_SELF, NUM2DBL (xc), NUM2DBL (yc), NUM2DBL (radius),
                 NUM2DBL (angle1), NUM2DBL (angle2));
      cr_check_status (_SELF);
      return self;
    }

arc_negative(p1, p2, p3, p4, p5) click to toggle source

    static VALUE
    cr_arc_negative (VALUE self, VALUE xc, VALUE yc, VALUE radius,
                     VALUE angle1, VALUE angle2)
    {
      cairo_arc_negative (_SELF, NUM2DBL (xc), NUM2DBL (yc), NUM2DBL (radius),
                          NUM2DBL (angle1), NUM2DBL (angle2));
      cr_check_status (_SELF);
      return self;
    }

clip(p1 = v1) click to toggle source

    static VALUE
    cr_clip (int argc, VALUE *argv, VALUE self)
    {
      VALUE preserve;

      rb_scan_args(argc, argv, "01", &preserve);

      if (rb_block_given_p ())
        {
          cr_new_path (self);
          rb_yield (self);
        }

      if (RVAL2CBOOL (preserve))
        cairo_clip_preserve(_SELF);
      else
        cairo_clip (_SELF);

      cr_check_status (_SELF);
      return self;
    }

clip_extents() click to toggle source

    static VALUE
    cr_clip_extents (VALUE self)
    {
      double x1, y1, x2, y2;
      cairo_clip_extents (_SELF, &x1, &y1, &x2, &y2);
      cr_check_status (_SELF);
      return rb_ary_new3 (4,
                          rb_float_new (x1), rb_float_new (y1),
                          rb_float_new (x2), rb_float_new (y2));
    }

clip_preserve(&block) click to toggle source

    # File lib/cairo/context.rb, line 25
    def clip_preserve(&block)
      clip(true, &block)
    end

clip_rectangle_list() click to toggle source

    static VALUE
    cr_clip_rectangle_list (VALUE self)
    {
      VALUE rb_rectangles;
      cairo_rectangle_list_t *rectangles;
      int i;

      rectangles = cairo_copy_clip_rectangle_list (_SELF);
      rb_cairo_check_status (rectangles->status);

      rb_rectangles = rb_ary_new2 (rectangles->num_rectangles);
      for (i = 0; i < rectangles->num_rectangles; i++) {
        VALUE argv[4];
        cairo_rectangle_t rectangle = rectangles->rectangles[i];

        argv[0] = rb_float_new (rectangle.x);
        argv[1] = rb_float_new (rectangle.y);
        argv[2] = rb_float_new (rectangle.width);
        argv[3] = rb_float_new (rectangle.height);
        rb_ary_push (rb_rectangles,
                     rb_class_new_instance (4, argv, rb_cCairo_Rectangle));
      }
      cairo_rectangle_list_destroy (rectangles);

      return rb_rectangles;
    }

close_path() click to toggle source

    static VALUE
    cr_close_path (VALUE self)
    {
      cairo_close_path (_SELF);
      cr_check_status (_SELF);
      return self;
    }

copy_page() click to toggle source

    static VALUE
    cr_copy_page (VALUE self)
    {
      cairo_copy_page (_SELF);
      cr_check_status (_SELF);
      return self;
    }

copy_path() click to toggle source

Paths

    static VALUE
    cr_copy_path (VALUE self)
    {
      cairo_path_t *path;

      path = cairo_copy_path (_SELF);
      rb_cairo_check_status (path->status);
      return CRPATH2RVAL (path);
    }

copy_path_flat() click to toggle source

    static VALUE
    cr_copy_path_flat (VALUE self)
    {
      cairo_path_t *path;

      path =  cairo_copy_path_flat (_SELF);
      rb_cairo_check_status (path->status);
      return CRPATH2RVAL (path);
    }

current_point() click to toggle source

    static VALUE
    cr_get_current_point (VALUE self)
    {
      double point[2];
      cairo_get_current_point (_SELF, point, point + 1);
      return rb_cairo__float_array (point, 2);
    }

curve_to(*args) click to toggle source

    static VALUE
    cr_curve_to_generic (int argc, VALUE *argv, VALUE self)
    {
      VALUE x1, y1, x2, y2, x3, y3;

      rb_scan_args (argc, argv, "42", &x1, &y1, &x2, &y2, &x3, &y3);

      if (!(argc == 4 || argc == 6))
        {
          VALUE inspected_arg = rb_inspect (rb_ary_new4 (argc, argv));
          rb_raise (rb_eArgError,
                    "invalid argument: %s (expect "
                    "(x1, y1, x2, y2) (quadratic) or "
                    "(x1, y1, x2, y2, x3, y3) (cubic))",
                    StringValuePtr (inspected_arg));
        }

      if (argc == 4)
        return cr_quadratic_curve_to (self, x1, y1, x2, y2);
      else
        return cr_curve_to (self, x1, y1, x2, y2, x3, y3);
    }

dash() click to toggle source

    static VALUE
    cr_get_dash (VALUE self)
    {
      int count;
      double *dashes, offset;

      count = cairo_get_dash_count (_SELF);
      dashes = ALLOCA_N (double, count);
      cairo_get_dash (_SELF, dashes, &offset);

      return rb_ary_new3 (2,
                          rb_cairo__float_array (dashes, count),
                          rb_float_new (offset));
    }

dash_count() click to toggle source

    static VALUE
    cr_get_dash_count (VALUE self)
    {
      return INT2NUM (cairo_get_dash_count (_SELF));
    }

destroy() click to toggle source

    static VALUE
    cr_destroy (VALUE self)
    {
      cairo_t *cr;

      cr = _SELF;
      cr_set_user_data (cr, &cr_object_holder_key, NULL, NULL);
      cairo_destroy (cr);

      DATA_PTR (self) = NULL;
      return Qnil;
    }

device_to_user(p1, p2) click to toggle source

    static VALUE
    cr_device_to_user (VALUE self, VALUE x, VALUE y)
    {
      double pair[2];
      pair[0] = NUM2DBL (x);
      pair[1] = NUM2DBL (y);
      cairo_device_to_user (_SELF, pair, pair + 1);
      cr_check_status (_SELF);
      return rb_cairo__float_array (pair, 2);
    }

device_to_user_distance(p1, p2) click to toggle source

    static VALUE
    cr_device_to_user_distance (VALUE self, VALUE dx, VALUE dy)
    {
      double pair[2];
      pair[0] = NUM2DBL (dx);
      pair[1] = NUM2DBL (dy);
      cairo_device_to_user_distance (_SELF, pair, pair + 1);
      cr_check_status (_SELF);
      return rb_cairo__float_array (pair, 2);
    }

fill(*args) click to toggle source

    static VALUE
    cr_fill (int argc, VALUE *argv, VALUE self)
    {
      VALUE preserve;

      rb_scan_args (argc, argv, "01", &preserve);

      if (rb_block_given_p ())
        {
          cr_new_path (self);
          rb_yield (self);
        }

      if (RVAL2CBOOL (preserve))
        cairo_fill_preserve (_SELF);
      else
        cairo_fill (_SELF);

      cr_check_status (_SELF);
      return self;
    }

fill_extents() click to toggle source

    static VALUE
    cr_fill_extents (VALUE self)
    {
      double extents[4];
      if (rb_block_given_p ())
        {
          cr_new_path (self);
          rb_yield (self);
        }
      cairo_fill_extents (_SELF, extents, extents + 1, extents + 2, extents + 3);
      return rb_cairo__float_array (extents, 4);
    }

fill_preserve(&block) click to toggle source

    # File lib/cairo/context.rb, line 21
    def fill_preserve(&block)
      fill(true, &block)
    end

fill_rule() click to toggle source

    static VALUE
    cr_get_fill_rule (VALUE self)
    {
      return INT2FIX (cairo_get_fill_rule (_SELF));
    }

font_extents() click to toggle source

    static VALUE
    cr_font_extents (VALUE self)
    {
      cairo_font_extents_t extents;
      cairo_font_extents (_SELF, &extents);
      cr_check_status (_SELF);
      return CRFONTEXTENTS2RVAL (&extents);
    }

font_face() click to toggle source

    static VALUE
    cr_get_font_face (VALUE self)
    {
      cairo_font_face_t *face;

      face = cairo_get_font_face (_SELF);
      rb_cairo_check_status (cairo_font_face_status (face));
      return CRFONTFACE2RVAL (face);
    }

font_matrix() click to toggle source

    static VALUE
    cr_get_font_matrix (VALUE self)
    {
      cairo_matrix_t matrix;
      cairo_get_font_matrix (_SELF, &matrix);
      cr_check_status (_SELF);
      return CRMATRIX2RVAL (&matrix);
    }

font_options() click to toggle source

    static VALUE
    cr_get_font_options (VALUE self)
    {
      cairo_font_options_t *options = cairo_font_options_create ();
      rb_cairo_check_status (cairo_font_options_status (options));
      cairo_get_font_options (_SELF, options);
      rb_cairo_check_status (cairo_font_options_status (options));
      return CRFONTOPTIONS2RVAL (options);
    }

glyph_extents(p1) click to toggle source

    static VALUE
    cr_glyph_extents (VALUE self, VALUE rb_glyphs)
    {
      cairo_text_extents_t extents;
      cairo_glyph_t *glyphs;
      int length;

      RB_CAIRO__GLYPHS_TO_ARRAY (rb_glyphs, glyphs, length);
      cairo_glyph_extents (_SELF, glyphs, length, &extents);
      cr_check_status (_SELF);
      return CRTEXTEXTENTS2RVAL (&extents);
    }

glyph_path(p1) click to toggle source

    static VALUE
    cr_glyph_path (VALUE self, VALUE rb_glyphs)
    {
      int count;
      cairo_glyph_t *glyphs;

      RB_CAIRO__GLYPHS_TO_ARRAY (rb_glyphs, glyphs, count);
      cairo_glyph_path (_SELF, glyphs, count);
      cr_check_status (_SELF);

      return self;
    }

group_target() click to toggle source

    static VALUE
    cr_get_group_target (VALUE self)
    {
      cairo_surface_t *surface;

      surface = cairo_get_group_target (_SELF);
      if (!surface)
        return Qnil;
      rb_cairo_check_status (cairo_surface_status (surface));
      return CRSURFACE2RVAL (surface);
    }

has_current_point?()
Alias for: have_current_point?
have_current_point?() click to toggle source

    static VALUE
    cr_has_current_point(VALUE self)
    {
      return RTEST (cairo_has_current_point (_SELF));
    }

Also aliased as: has_current_point?
identity_matrix() click to toggle source

    static VALUE
    cr_identity_matrix (VALUE self)
    {
      cairo_identity_matrix (_SELF);
      cr_check_status (_SELF);
      return self;
    }

in_clip?(p1, p2) click to toggle source

    static VALUE
    cr_in_clip (VALUE self, VALUE x, VALUE y)
    {
      if (rb_block_given_p ())
        {
          cr_new_path (self);
          rb_yield (self);
        }
      return CBOOL2RVAL (cairo_in_clip (_SELF, NUM2DBL (x), NUM2DBL (y)));
    }

in_fill?(p1, p2) click to toggle source

    static VALUE
    cr_in_fill (VALUE self, VALUE x, VALUE y)
    {
      if (rb_block_given_p ())
        {
          cr_new_path (self);
          rb_yield (self);
        }
      return CBOOL2RVAL (cairo_in_fill (_SELF, NUM2DBL (x), NUM2DBL (y)));
    }

in_stroke?(p1, p2) click to toggle source

Insideness testing

    static VALUE
    cr_in_stroke (VALUE self, VALUE x, VALUE y)
    {
      if (rb_block_given_p ())
        {
          cr_new_path (self);
          rb_yield (self);
        }
      return CBOOL2RVAL (cairo_in_stroke (_SELF, NUM2DBL (x), NUM2DBL (y)));
    }

line_cap() click to toggle source

    static VALUE
    cr_get_line_cap (VALUE self)
    {
      return INT2FIX (cairo_get_line_cap (_SELF));
    }

line_join() click to toggle source

    static VALUE
    cr_get_line_join (VALUE self)
    {
      return INT2FIX (cairo_get_line_join (_SELF));
    }

line_to(p1, p2) click to toggle source

    static VALUE
    cr_line_to (VALUE self, VALUE x, VALUE y)
    {
      cairo_line_to (_SELF, NUM2DBL (x), NUM2DBL (y));
      cr_check_status (_SELF);
      return self;
    }

line_width() click to toggle source

    static VALUE
    cr_get_line_width (VALUE self)
    {
      return rb_float_new (cairo_get_line_width (_SELF));
    }

mask(*args) click to toggle source

    static VALUE
    cr_mask_generic (int argc, VALUE *argv, VALUE self)
    {
      VALUE arg1, arg2, arg3;
      int n;

      n = rb_scan_args (argc, argv, "12", &arg1, &arg2, &arg3);

      if (n == 1)
        {
          return cr_mask (self, arg1);
        }
      else if (n == 3)
        {
          return cr_mask_surface (self, arg1, arg2, arg3);
        }
      else
        {
          rb_raise (rb_eArgError,
                    "invalid argument (expect (pattern) or (surface, x, y))");
        }
    }

matrix() click to toggle source

    static VALUE
    cr_get_matrix (VALUE self)
    {
      cairo_matrix_t matrix;
      cairo_get_matrix (_SELF, &matrix);
      cr_check_status (_SELF);
      return CRMATRIX2RVAL (&matrix);
    }

miter_limit() click to toggle source

    static VALUE
    cr_get_miter_limit (VALUE self)
    {
      return rb_float_new (cairo_get_miter_limit (_SELF));
    }

move_to(p1, p2) click to toggle source

    static VALUE
    cr_move_to (VALUE self, VALUE x, VALUE y)
    {
      cairo_move_to (_SELF, NUM2DBL (x), NUM2DBL (y));
      cr_check_status (_SELF);
      return self;
    }

new_path() click to toggle source

Path creation functions

    static VALUE
    cr_new_path (VALUE self)
    {
      cairo_new_path (_SELF);
      cr_check_status (_SELF);
      return self;
    }

new_sub_path() click to toggle source

    static VALUE
    cr_new_sub_path (VALUE self)
    {
      cairo_new_sub_path (_SELF);
      cr_check_status (_SELF);
      return self;
    }

operator() click to toggle source

Query functions

    static VALUE
    cr_get_operator (VALUE self)
    {
      return INT2FIX (cairo_get_operator (_SELF));
    }

paint(*args) click to toggle source

    static VALUE
    cr_paint_generic (int argc, VALUE *argv, VALUE self)
    {
      VALUE alpha;
      int n;

      n = rb_scan_args (argc, argv, "01", &alpha);

      if (n == 0 || (n == 1 && NIL_P (alpha)))
        {
          return cr_paint (self);
        }
      if (n == 1)
        {
          return cr_paint_with_alpha (self, alpha);
        }
      else
        {
          rb_raise (rb_eArgError,
                    "invalid argument (expect () or (alpha))");
        }
    }

path_extents() click to toggle source

    static VALUE
    cr_path_extents (VALUE self)
    {
      double x1, y1, x2, y2;
      cairo_path_extents (_SELF, &x1, &y1, &x2, &y2);
      cr_check_status (_SELF);
      return rb_ary_new3 (4,
                          rb_float_new(x1), rb_float_new(y1),
                          rb_float_new(x2), rb_float_new(y2));
    }

pop_group(*args) click to toggle source

    static VALUE
    cr_pop_group_generic (int argc, VALUE *argv, VALUE self)
    {
      VALUE to_source;
      rb_scan_args (argc, argv, "01", &to_source);
      if (RVAL2CBOOL (to_source))
        return cr_pop_group_to_source (self);
      else
        return cr_pop_group (self);
    }

pop_group_to_source() click to toggle source

    static VALUE
    cr_pop_group_to_source (VALUE self)
    {
      cairo_pop_group_to_source (_SELF);
      cr_check_status (_SELF);
      return Qnil;
    }

push_group(*args) click to toggle source

    static VALUE
    cr_push_group (int argc, VALUE *argv, VALUE self)
    {
      VALUE result = Qnil;
      VALUE content, pop_to_source;
      rb_scan_args (argc, argv, "02", &content, &pop_to_source);

      if (NIL_P(content))
        cairo_push_group (_SELF);
      else
        cairo_push_group_with_content (_SELF, RVAL2CRCONTENT(content));
      cr_check_status (_SELF);

      if (rb_block_given_p ())
        {
          int state = 0;

          if (NIL_P (pop_to_source))
            pop_to_source = Qtrue;

          result = rb_protect (rb_yield, self, &state);
          if (cairo_status(_SELF) == CAIRO_STATUS_SUCCESS)
            {
              if (RVAL2CBOOL (pop_to_source))
                cr_pop_group_to_source (self);
              else
                result = cr_pop_group (self);
            }

          if (state)
            rb_jump_tag (state);
        }

      return result;
    }

rectangle(p1, p2, p3, p4) click to toggle source

    static VALUE
    cr_rectangle (VALUE self, VALUE x, VALUE y, VALUE width, VALUE height)
    {
      cairo_rectangle (_SELF, NUM2DBL (x), NUM2DBL (y),
                       NUM2DBL (width), NUM2DBL (height));
      cr_check_status (_SELF);
      return self;
    }

rel_curve_to(*args) click to toggle source

    static VALUE
    cr_rel_curve_to_generic (int argc, VALUE *argv, VALUE self)
    {
      VALUE dx1, dy1, dx2, dy2, dx3, dy3;

      rb_scan_args (argc, argv, "42", &dx1, &dy1, &dx2, &dy2, &dx3, &dy3);

      if (!(argc == 4 || argc == 6))
        {
          VALUE inspected_arg = rb_inspect (rb_ary_new4 (argc, argv));
          rb_raise (rb_eArgError,
                    "invalid argument: %s (expect "
                    "(dx1, dy1, dx2, dy2) (quadratic) or "
                    "(dx1, dy1, dx2, dy2, dx3, dy3) (cubic))",
                    StringValuePtr (inspected_arg));
        }

      if (argc == 4)
        return cr_rel_quadratic_curve_to (self, dx1, dy1, dx2, dy2);
      else
        return cr_rel_curve_to (self, dx1, dy1, dx2, dy2, dx3, dy3);
    }

rel_line_to(p1, p2) click to toggle source

    static VALUE
    cr_rel_line_to (VALUE self, VALUE x, VALUE y)
    {
      cairo_rel_line_to (_SELF, NUM2DBL (x), NUM2DBL (y));
      cr_check_status (_SELF);
      return self;
    }

rel_move_to(p1, p2) click to toggle source

    static VALUE
    cr_rel_move_to (VALUE self, VALUE x, VALUE y)
    {
      cairo_rel_move_to (_SELF, NUM2DBL (x), NUM2DBL (y));
      cr_check_status (_SELF);
      return self;
    }

reset_clip() click to toggle source

Clipping

    static VALUE
    cr_reset_clip (VALUE self)
    {
      cairo_reset_clip (_SELF);
      cr_check_status (_SELF);
      return self;
    }

restore() click to toggle source

    static VALUE
    cr_restore (VALUE self)
    {
      cairo_restore (_SELF);
      cr_check_status (_SELF);
      return Qnil;
    }

rotate(p1) click to toggle source

    static VALUE
    cr_rotate (VALUE self, VALUE radians)
    {
      cairo_rotate (_SELF, NUM2DBL (radians));
      cr_check_status (_SELF);
      return self;
    }

save() click to toggle source

    static VALUE
    cr_save (VALUE self)
    {
      VALUE result = Qnil;
      cairo_save (_SELF);
      cr_check_status (_SELF);
      if (rb_block_given_p ())
        {
          result = rb_ensure (rb_yield, self, cr_restore, self);
        }
      return result;
    }

scale(p1, p2) click to toggle source

    static VALUE
    cr_scale (VALUE self, VALUE sx, VALUE sy)
    {
      cairo_scale (_SELF, NUM2DBL (sx), NUM2DBL (sy));
      cr_check_status (_SELF);
      return self;
    }

scaled_font() click to toggle source

    static VALUE
    cr_get_scaled_font (VALUE self)
    {
      return CRSCALEDFONT2RVAL (cairo_get_scaled_font (_SELF));
    }

select_font_face(p1 = v1, p2 = v2, p3 = v3) click to toggle source

Font/Text functions

    static   VALUE
    cr_select_font_face (int argc, VALUE *argv, VALUE self)
    {
      VALUE rb_family, rb_slant, rb_weight;
      const char *family;
      cairo_font_slant_t slant;
      cairo_font_weight_t weight;

      rb_scan_args(argc, argv, "03", &rb_family, &rb_slant, &rb_weight);

      if (NIL_P (rb_family))
        {
          family = "";
        }
      else if (rb_cairo__is_kind_of (rb_family, rb_cString))
        {
          family = RSTRING_PTR (rb_family);
        }
      else if (rb_cairo__is_kind_of (rb_family, rb_cSymbol))
        {
          family = rb_id2name (SYM2ID (rb_family));
        }
      else
        {
          rb_raise (rb_eArgError,
                    "family name should be nil, String or Symbol: %s",
                    rb_cairo__inspect (rb_family));
        }

      if (NIL_P (rb_slant))
        slant = CAIRO_FONT_SLANT_NORMAL;
      else
        slant = RVAL2CRFONTSLANT (rb_slant);

      if (NIL_P (rb_weight))
        weight = CAIRO_FONT_WEIGHT_NORMAL;
      else
        weight = RVAL2CRFONTWEIGHT (rb_weight);

      cairo_select_font_face (_SELF, family, slant, weight);
      cr_check_status (_SELF);
      return self;
    }

set_antialias(p1) click to toggle source

    static VALUE
    cr_set_antialias(VALUE self, VALUE antialias)
    {
      cairo_set_antialias(_SELF, RVAL2CRANTIALIAS (antialias));
      cr_check_status(_SELF);
      return self;
    }

set_dash(p1, p2 = v2) click to toggle source

    static VALUE
    cr_set_dash (int argc, VALUE *argv, VALUE self)
    {
      VALUE dash_array, rb_offset;
      double offset;
      cairo_bool_t is_num;

      rb_scan_args(argc, argv, "11", &dash_array, &rb_offset);

      is_num = rb_cairo__is_kind_of (dash_array, rb_cNumeric);
      if (!(NIL_P (dash_array) || is_num))
        {
          Check_Type (dash_array, T_ARRAY);
        }

      if (NIL_P (rb_offset))
        offset = 0.0;
      else
        offset = NUM2DBL (rb_offset);

      if (is_num)
        {
          double values[1];
          values[0] = NUM2DBL (dash_array);
          cairo_set_dash (_SELF, values, 1, offset);
        }
      else if (NIL_P (dash_array) || RARRAY_LEN (dash_array) == 0)
        {
          cairo_set_dash (_SELF, NULL, 0, offset);
        }
      else
        {
          int i, length;
          double *values;
          length = RARRAY_LEN (dash_array);
          values = ALLOCA_N (double, length);
          if (!values)
            {
              rb_cairo_check_status (CAIRO_STATUS_NO_MEMORY);
            }
          for (i = 0; i < length; i++)
            {
              values[i] = NUM2DBL (RARRAY_PTR (dash_array)[i]);
            }
          cairo_set_dash (_SELF, values, length, offset);
        }

      cr_check_status (_SELF);
      return self;
    }

set_fill_rule(p1) click to toggle source

    static VALUE
    cr_set_fill_rule (VALUE self, VALUE rule)
    {
      cairo_set_fill_rule (_SELF, RVAL2CRFILLRULE (rule));
      cr_check_status (_SELF);
      return self;
    }

set_font_face(p1) click to toggle source

    static VALUE
    cr_set_font_face (VALUE self, VALUE face)
    {
      cairo_set_font_face (_SELF, NIL_P (face) ? NULL : RVAL2CRFONTFACE (face));
      cr_check_status (_SELF);
      return self;
    }

set_font_matrix(p1) click to toggle source

    static VALUE
    cr_set_font_matrix (VALUE self, VALUE matrix)
    {
      cairo_set_font_matrix (_SELF, RVAL2CRMATRIX (matrix));
      cr_check_status (_SELF);
      return self;
    }

set_font_options(p1) click to toggle source

    static VALUE
    cr_set_font_options (VALUE self, VALUE options)
    {
      cairo_set_font_options (_SELF, RVAL2CRFONTOPTIONS (options));
      cr_check_status (_SELF);
      return self;
    }

set_font_size(p1) click to toggle source

    static VALUE
    cr_set_font_size (VALUE self, VALUE scale)
    {
      cairo_set_font_size (_SELF, NUM2DBL (scale));
      cr_check_status (_SELF);
      return self;
    }

set_line_cap(p1) click to toggle source

    static VALUE
    cr_set_line_cap (VALUE self, VALUE cap)
    {
      cairo_set_line_cap (_SELF, RVAL2CRLINECAP (cap));
      cr_check_status (_SELF);
      return self;
    }

set_line_join(p1) click to toggle source

    static VALUE
    cr_set_line_join (VALUE self, VALUE join)
    {
      cairo_set_line_join (_SELF, RVAL2CRLINEJOIN (join));
      cr_check_status (_SELF);
      return self;
    }

set_line_width(p1) click to toggle source

    static VALUE
    cr_set_line_width (VALUE self, VALUE width)
    {
      cairo_set_line_width (_SELF, NUM2DBL (width));
      return self;
    }

set_matrix(p1) click to toggle source

    static VALUE
    cr_set_matrix (VALUE self, VALUE matrix)
    {
      cairo_set_matrix (_SELF, RVAL2CRMATRIX (matrix));
      cr_check_status (_SELF);
      return self;
    }

set_miter_limit(p1) click to toggle source

    static VALUE
    cr_set_miter_limit (VALUE self, VALUE limit)
    {
      cairo_set_miter_limit (_SELF, NUM2DBL (limit));
      cr_check_status (_SELF);
      return self;
    }

set_operator(p1) click to toggle source

Modify state

    static VALUE
    cr_set_operator (VALUE self, VALUE operator)
    {
      cairo_set_operator (_SELF, RVAL2CROPERATOR (operator));
      cr_check_status (_SELF);
      return self;
    }

set_scaled_font(p1) click to toggle source

    static VALUE
    cr_set_scaled_font (VALUE self, VALUE scaled_font)
    {
      cairo_set_scaled_font (_SELF, RVAL2CRSCALEDFONT (scaled_font));
      cr_check_status (_SELF);
      return self;
    }

set_source(*args) click to toggle source

    static VALUE
    cr_set_source_generic (int argc, VALUE *argv, VALUE self)
    {
      VALUE arg1, arg2, arg3, arg4;
      int n;

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

      if (n == 1 && rb_cairo__is_kind_of (arg1, rb_cArray))
        {
          return cr_set_source_rgba (argc, argv, self);
        }
      else if (n == 1 && rb_cairo__is_kind_of (arg1, rb_cCairo_Surface))
        {
          return cr_set_source_surface (self, arg1,
                                        rb_float_new (0),
                                        rb_float_new (0));
        }
      else if (n == 1)
        {
          return cr_set_source (self, arg1);
        }
      else if (n == 3 && rb_cairo__is_kind_of (arg1, rb_cCairo_Surface))
        {
          return cr_set_source_surface (self, arg1, arg2, arg3);
        }
      else if (n == 3 || n == 4)
        {
          return cr_set_source_rgba (argc, argv, self);
        }
      else
        {
          rb_raise (rb_eArgError,
                    "invalid argument (expect "
                    "(red, green, blue), (red, green, blue, alpha), "
                    "([red, green, blue]), ([red, green, blue, alpha]), "
                    "(surface), (pattern) or (surface, x, y))");
        }
    }

set_source_rgb(*args) click to toggle source

    static VALUE
    cr_set_source_rgb (int argc, VALUE *argv, VALUE self)
    {
      VALUE red, green, blue;
      int n;

      n = rb_scan_args (argc, argv, "12", &red, &green, &blue);

      if (n == 1 && rb_cairo__is_kind_of (red, rb_cArray))
        {
          VALUE ary = red;
          n = RARRAY_LEN (ary);
          red = rb_ary_entry (ary, 0);
          green = rb_ary_entry (ary, 1);
          blue = rb_ary_entry (ary, 2);
        }

      if (n == 3)
        {
          cairo_set_source_rgb (_SELF,
                                NUM2DBL (red),
                                NUM2DBL (green),
                                NUM2DBL (blue));
        }
      else
        {
          VALUE inspected_arg = rb_inspect (rb_ary_new4 (argc, argv));
          rb_raise (rb_eArgError,
                    "invalid RGB: %s (expect "
                    "(red, green, blue) or ([red, green, blue]))",
                    StringValuePtr (inspected_arg));
        }
      cr_check_status (_SELF);
      rb_ivar_set (self, cr_id_source, Qnil);
      return self;
    }

set_source_rgba(*args) click to toggle source

    static VALUE
    cr_set_source_rgba (int argc, VALUE *argv, VALUE self)
    {
      VALUE red, green, blue, alpha;
      int n;

      n = rb_scan_args (argc, argv, "13", &red, &green, &blue, &alpha);

      if (n == 1 && rb_cairo__is_kind_of (red, rb_cArray))
        {
          VALUE ary = red;
          n = RARRAY_LEN (ary);
          red = rb_ary_entry (ary, 0);
          green = rb_ary_entry (ary, 1);
          blue = rb_ary_entry (ary, 2);
          alpha = rb_ary_entry (ary, 3);
        }

      if (n == 3)
        {
          cairo_set_source_rgb (_SELF,
                                NUM2DBL (red),
                                NUM2DBL (green),
                                NUM2DBL (blue));
        }
      else if (n == 4)
        {
          cairo_set_source_rgba (_SELF,
                                 NUM2DBL (red),
                                 NUM2DBL (green),
                                 NUM2DBL (blue),
                                 NUM2DBL (alpha));
        }
      else
        {
          VALUE inspected_arg = rb_inspect (rb_ary_new4 (argc, argv));
          rb_raise (rb_eArgError,
                    "invalid RGB%s: %s (expect "
                    "(red, green, blue), (red, green, blue, alpha), "
                    "([red, green, blue]) or ([red, green, blue, alpha]))",
                    n == 4 ? "A" : "",
                    StringValuePtr (inspected_arg));
        }
      cr_check_status (_SELF);
      rb_ivar_set (self, cr_id_source, Qnil);
      return self;
    }

set_tolerance(p1) click to toggle source

    static VALUE
    cr_set_tolerance (VALUE self, VALUE tolerance)
    {
      cairo_set_tolerance (_SELF, NUM2DBL (tolerance));
      cr_check_status (_SELF);
      return self;
    }

show_glyphs(p1) click to toggle source

    static VALUE
    cr_show_glyphs (VALUE self, VALUE rb_glyphs)
    {
      int count;
      cairo_glyph_t *glyphs;

      RB_CAIRO__GLYPHS_TO_ARRAY (rb_glyphs, glyphs, count);
      cairo_show_glyphs (_SELF, glyphs, count);
      cr_check_status (_SELF);
      return self;
    }

show_page() click to toggle source

    static VALUE
    cr_show_page (VALUE self)
    {
      cairo_show_page (_SELF);
      cr_check_status (_SELF);
      return self;
    }

show_text(p1) click to toggle source

    static VALUE
    cr_show_text (VALUE self, VALUE utf8)
    {
      cairo_show_text (_SELF, RVAL2CSTR (utf8));
      cr_check_status (_SELF);
      return self;
    }

show_text_glyphs(p1, p2, p3, p4) click to toggle source

    static VALUE
    cr_show_text_glyphs (VALUE self, VALUE rb_utf8, VALUE rb_glyphs,
                         VALUE rb_clusters, VALUE rb_cluster_flags)
    {
      cairo_t *cr;
      const char *utf8;
      int utf8_len;
      cairo_glyph_t *glyphs = NULL;
      int num_glyphs = 0;
      cairo_text_cluster_t *clusters = NULL;
      int num_clusters = 0;
      cairo_text_cluster_flags_t cluster_flags;

      cr = _SELF;
      utf8 = RSTRING_PTR (rb_utf8);
      utf8_len = RSTRING_LEN (rb_utf8);
      rb_cairo__glyphs_from_ruby_object (rb_glyphs, &glyphs, &num_glyphs);
      rb_cairo__text_clusters_from_ruby_object (rb_clusters,
                                                &clusters, &num_clusters);
      cluster_flags = RVAL2CRTEXTCLUSTERFLAGS (rb_cluster_flags);
      cairo_show_text_glyphs (cr, utf8, utf8_len,
                              glyphs, num_glyphs,
                              clusters, num_clusters,
                              cluster_flags);
      if (glyphs)
        cairo_glyph_free (glyphs);
      if (clusters)
        cairo_text_cluster_free (clusters);

      return self;
    }

source() click to toggle source

    static VALUE
    cr_get_source (VALUE self)
    {
      VALUE rb_source = Qnil;
      cairo_pattern_t *source;
      source = cairo_get_source (_SELF);

      if (source)
        {
          rb_cairo_check_status (cairo_pattern_status (source));
          rb_source = rb_ivar_get (self, cr_id_source);
          if (NIL_P (rb_source) || RVAL2CRPATTERN (rb_source) != source)
            {
              rb_source = CRPATTERN2RVAL (source);
              rb_ivar_set (self, cr_id_source, rb_source);
            }
        }
      else
        {
          rb_source = Qnil;
          rb_ivar_set (self, cr_id_source, rb_source);
        }

      return rb_source;
    }

stroke(*args) click to toggle source

    static VALUE
    cr_stroke (int argc, VALUE *argv, VALUE self)
    {
      VALUE preserve;

      rb_scan_args (argc, argv, "01", &preserve);

      if (rb_block_given_p ())
        {
          cr_new_path (self);
          rb_yield (self);
        }

      if (RVAL2CBOOL (preserve))
        cairo_stroke_preserve (_SELF);
      else
        cairo_stroke (_SELF);

      cr_check_status (_SELF);
      return self;
    }

stroke_extents() click to toggle source

Rectangular extents

    static VALUE
    cr_stroke_extents (VALUE self)
    {
      double extents[4];
      if (rb_block_given_p ())
        {
          cr_new_path (self);
          rb_yield (self);
        }
      cairo_stroke_extents (_SELF, extents, extents + 1, extents + 2, extents + 3);
      return rb_cairo__float_array (extents, 4);
    }

stroke_preserve(&block) click to toggle source

    # File lib/cairo/context.rb, line 17
    def stroke_preserve(&block)
      stroke(true, &block)
    end

target() click to toggle source

    static VALUE
    cr_get_target (VALUE self)
    {
      cairo_surface_t *surface;
      VALUE rb_surface = Qnil;

      surface = cairo_get_target (_SELF);
      rb_cairo_check_status (cairo_surface_status (surface));

      if (RTEST (rb_ivar_defined (self, cr_id_surface)))
          rb_surface = rb_ivar_get (self, cr_id_surface);
      if (NIL_P (rb_surface) || RVAL2CRSURFACE (rb_surface) != surface)
        {
          rb_surface = CRSURFACE2RVAL (surface);
          rb_ivar_set (self, cr_id_surface, rb_surface);
        }

      return rb_surface;
    }

text_extents(p1) click to toggle source

    static VALUE
    cr_text_extents (VALUE self, VALUE utf8)
    {
      cairo_text_extents_t extents;
      cairo_text_extents (_SELF, StringValuePtr (utf8), &extents);
      cr_check_status (_SELF);
      return CRTEXTEXTENTS2RVAL (&extents);
    }

text_path(p1) click to toggle source

    static VALUE
    cr_text_path (VALUE self, VALUE utf8)
    {
      cairo_text_path (_SELF, StringValuePtr (utf8));
      cr_check_status (_SELF);
      return self;
    }

to_ptr() click to toggle source

    static VALUE
    cr_to_ptr (VALUE self)
    {
      if (NIL_P (rb_cairo__cFFIPointer))
        return Qnil;

      return rb_funcall (rb_cairo__cFFIPointer, rb_intern ("new"),
                         1, PTR2NUM (_SELF));
    }

tolerance() click to toggle source

    static VALUE
    cr_get_tolerance (VALUE self)
    {
      return rb_float_new (cairo_get_tolerance (_SELF));
    }

transform(p1) click to toggle source

    static VALUE
    cr_transform (VALUE self, VALUE matrix)
    {
      cairo_transform (_SELF, RVAL2CRMATRIX (matrix));
      cr_check_status (_SELF);
      return self;
    }

translate(p1, p2) click to toggle source

    static VALUE
    cr_translate (VALUE self, VALUE tx, VALUE ty)
    {
      cairo_translate (_SELF, NUM2DBL (tx), NUM2DBL (ty));
      cr_check_status (_SELF);
      return self;
    }

user_to_device(p1, p2) click to toggle source

    static VALUE
    cr_user_to_device (VALUE self, VALUE x, VALUE y)
    {
      double pair[2];
      pair[0] = NUM2DBL (x);
      pair[1] = NUM2DBL (y);
      cairo_user_to_device (_SELF, pair, pair + 1);
      cr_check_status (_SELF);
      return rb_cairo__float_array (pair, 2);
    }

user_to_device_distance(p1, p2) click to toggle source

    static VALUE
    cr_user_to_device_distance (VALUE self, VALUE dx, VALUE dy)
    {
      double pair[2];
      pair[0] = NUM2DBL (dx);
      pair[1] = NUM2DBL (dy);
      cairo_user_to_device_distance (_SELF, pair, pair + 1);
      cr_check_status (_SELF);
      return rb_cairo__float_array (pair, 2);
    }