static VALUE cr_toy_font_face_initialize (int argc, VALUE *argv, VALUE self) { cairo_font_face_t *face; 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); face = cairo_toy_font_face_create (family, slant, weight); cr_font_face_check_status (face); DATA_PTR (self) = face; return Qnil; }
static VALUE cr_options_equal (VALUE self, VALUE other) { if (!rb_cairo__is_kind_of (other, rb_cCairo_FontOptions)) return Qfalse; return CBOOL2RVAL (cairo_font_options_equal (_SELF (self), _SELF (other))); }
cairo_pattern_t * rb_cairo_pattern_from_ruby_object (VALUE obj) { cairo_pattern_t *pattern; if (!rb_cairo__is_kind_of (obj, rb_cCairo_Pattern)) { rb_raise (rb_eTypeError, "not a cairo pattern"); } Data_Get_Struct (obj, cairo_pattern_t, pattern); return pattern; }
cairo_glyph_t * rb_cairo_glyph_from_ruby_object (VALUE obj) { cairo_glyph_t *glyph; if (!rb_cairo__is_kind_of (obj, rb_cCairo_Glyph)) { rb_raise (rb_eTypeError, "not a cairo glyph"); } Data_Get_Struct (obj, cairo_glyph_t, glyph); return glyph; }
cairo_font_options_t * rb_cairo_font_options_from_ruby_object (VALUE obj) { cairo_font_options_t *options; if (!rb_cairo__is_kind_of (obj, rb_cCairo_FontOptions)) { rb_raise (rb_eTypeError, "not a cairo font options"); } Data_Get_Struct (obj, cairo_font_options_t, options); return options; }
/* constructor/de-constructor */ cairo_device_t * rb_cairo_device_from_ruby_object (VALUE obj) { cairo_device_t *device; if (!rb_cairo__is_kind_of (obj, rb_cCairo_Device)) { rb_raise (rb_eTypeError, "not a cairo device"); } Data_Get_Struct (obj, cairo_device_t, device); if (!device) rb_cairo_check_status (CAIRO_STATUS_NULL_POINTER); return device; }
/* Functions for manipulating state objects */ cairo_t * rb_cairo_context_from_ruby_object (VALUE obj) { cairo_t *context; if (!rb_cairo__is_kind_of (obj, rb_cCairo_Context)) { rb_raise (rb_eTypeError, "not a cairo graphics context"); } Data_Get_Struct (obj, cairo_t, context); if (!context) rb_cairo_check_status (CAIRO_STATUS_NULL_POINTER); return context; }
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))"); } }
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; }
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; }
cairo_font_face_t * rb_cairo_font_face_from_ruby_object (VALUE obj) { cairo_font_face_t *face; if (!rb_cairo__is_kind_of (obj, rb_cCairo_FontFace)) { rb_raise (rb_eTypeError, "not a cairo font face: %s", rb_cairo__inspect (obj)); } Data_Get_Struct (obj, cairo_font_face_t, face); if (!face) rb_cairo_check_status (CAIRO_STATUS_NULL_POINTER); cr_font_face_check_status (face); return face; }
/* Cairo::GradientPattern */ static VALUE cr_gradient_pattern_add_color_stop_generic (int argc, VALUE *argv, VALUE self) { VALUE offset, red, green, blue, alpha; int n; n = rb_scan_args (argc, argv, "23", &offset, &red, &green, &blue, &alpha); if (n == 2) { VALUE color = red; color = cr_color_parse (color); if (rb_cairo__is_kind_of (color, rb_cCairo_Color_Base)) red = rb_funcall (rb_funcall (color, id_to_rgb, 0), id_to_a, 0); } if (n == 2 && rb_cairo__is_kind_of (red, rb_cArray)) { VALUE ary = red; n = RARRAY_LEN (ary) + 1; 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 == 4 || (n == 5 && NIL_P (alpha))) { cairo_pattern_add_color_stop_rgb (_SELF (self), NUM2DBL (offset), NUM2DBL (red), NUM2DBL (green), NUM2DBL (blue)); } else if (n == 5) { cairo_pattern_add_color_stop_rgba (_SELF (self), NUM2DBL (offset), NUM2DBL (red), NUM2DBL (green), NUM2DBL (blue), NUM2DBL (alpha)); } else { VALUE inspected; inspected = rb_funcall (rb_ary_new4 (argc, argv), id_inspect, 0); rb_raise (rb_eArgError, "invalid argument: %s (expect " "(offset, color_name), " "(offset, color_hex_triplet), " "(offset, Cairo::Color::RGB), " "(offset, Cairo::Color::CMYK), " "(offset, Cairo::Color::HSV), " "(offset, red, green, blue), " "(offset, [red, green, blue]), " "(offset, red, green, blue, alpha) or " "(offset, [red, green, blue, alpha])" ")", RVAL2CSTR (inspected)); } cr_pattern_check_status (_SELF (self)); return self; }
static VALUE cr_solid_pattern_initialize (int argc, VALUE *argv, VALUE self) { VALUE red, green, blue, alpha; int n; cairo_pattern_t *pattern; n = rb_scan_args (argc, argv, "13", &red, &green, &blue, &alpha); if (n == 1) { VALUE color = red; color = cr_color_parse (color); if (rb_cairo__is_kind_of (color, rb_cCairo_Color_Base)) red = rb_funcall (rb_funcall (color, id_to_rgb, 0), id_to_a, 0); } if (n == 1 && rb_cairo__is_kind_of (red, rb_cArray) && (RARRAY_LEN (red) == 3 || RARRAY_LEN (red) == 4)) { 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) { pattern = cairo_pattern_create_rgb (NUM2DBL (red), NUM2DBL (green), NUM2DBL (blue)); } else if (n == 4) { pattern = cairo_pattern_create_rgba (NUM2DBL (red), NUM2DBL (green), NUM2DBL (blue), NUM2DBL (alpha)); } else { VALUE inspected; inspected = rb_funcall (argc == 1 ? red : rb_ary_new4 (argc, argv), id_inspect, 0); rb_raise (rb_eArgError, "invalid argument: %s (expect " "(color_name), " "(color_hex_triplet), " "(Cairo::Color::RGB), " "(Cairo::Color::CMYK), " "(Cairo::Color::HSV), " "(red, green, blue), " "([red, green, blue]), " "(red, green, blue, alpha) or " "([red, green, blue, alpha])" ")", RVAL2CSTR (inspected)); } cr_pattern_check_status (pattern); DATA_PTR (self) = pattern; return Qnil; }
static VALUE cr_win32_surface_initialize (int argc, VALUE *argv, VALUE self) { cairo_surface_t *surface = NULL; VALUE arg1, arg2, arg3, arg4; VALUE hdc, format, width, height; rb_scan_args (argc, argv, "13", &arg1, &arg2, &arg3, &arg4); switch (argc) { case 1: hdc = arg1; surface = cairo_win32_surface_create (NUM2PTR (hdc)); break; case 2: width = arg1; height = arg2; surface = cairo_win32_surface_create_with_dib (CAIRO_FORMAT_ARGB32, NUM2INT (width), NUM2INT (height)); break; case 3: if (NIL_P (arg1) || (rb_cairo__is_kind_of (arg1, rb_cNumeric) && NUM2INT (arg1) != CAIRO_FORMAT_RGB24)) { # if CAIRO_CHECK_VERSION(1, 4, 0) HDC win32_hdc; hdc = arg1; width = arg2; height = arg3; win32_hdc = NIL_P (hdc) ? NULL : NUM2PTR (hdc); surface = cairo_win32_surface_create_with_ddb (win32_hdc, CAIRO_FORMAT_RGB24, NUM2INT (width), NUM2INT (height)); # else rb_raise (rb_eArgError, "Cairo::Win32Surface.new(hdc, width, height) " "is available since cairo >= 1.4.0"); # endif } else { format = arg1; width = arg2; height = arg3; surface = cairo_win32_surface_create_with_dib (RVAL2CRFORMAT (format), NUM2INT (width), NUM2INT (height)); } break; case 4: { # if CAIRO_CHECK_VERSION(1, 4, 0) HDC win32_hdc; hdc = arg1; format = arg2; width = arg3; height = arg4; win32_hdc = NIL_P (hdc) ? NULL : (HDC) NUM2UINT (hdc); surface = cairo_win32_surface_create_with_ddb (win32_hdc, RVAL2CRFORMAT (format), NUM2INT (width), NUM2INT (height)); # else rb_raise (rb_eArgError, "Cairo::Win32Surface.new(hdc, format, width, height) " "is available since cairo >= 1.4.0"); # endif } break; } if (!surface) rb_cairo_check_status (CAIRO_STATUS_INVALID_FORMAT); cr_surface_check_status (surface); DATA_PTR (self) = surface; if (rb_block_given_p ()) yield_and_finish (self); return Qnil; }