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 = (int) 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);
RTYPEDDATA_DATA (self) = pattern;
return Qnil;
}