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; }
static VALUE cr_surface_create_similar (VALUE self, VALUE content, VALUE width, VALUE height) { cairo_surface_t *surface; surface = cairo_surface_create_similar (RVAL2CRSURFACE (self), RVAL2CRCONTENT (content), NUM2INT (width), NUM2INT (height)); cr_surface_check_status (surface); return CRSURFACE2RVAL_WITH_DESTROY (surface); }
static VALUE cr_raster_source_pattern_initialize (int argc, VALUE *argv, VALUE self) { cairo_pattern_t *pattern; cairo_content_t content; int width, height; VALUE arg1, arg2, arg3; rb_scan_args (argc, argv, "21", &arg1, &arg2, &arg3); if (argc == 2) { content = CAIRO_CONTENT_COLOR_ALPHA; width = NUM2INT (arg1); height = NUM2INT (arg2); } else { content = RVAL2CRCONTENT (arg1); width = NUM2INT (arg2); height = NUM2INT (arg3); } pattern = cairo_pattern_create_raster_source (RVAL2POINTER (self), content, width, height); cr_pattern_check_status (pattern); DATA_PTR (self) = pattern; rb_iv_set (self, "@acquire", Qnil); rb_iv_set (self, "@release", Qnil); rb_iv_set (self, "@snapshot", Qnil); rb_iv_set (self, "@copy", Qnil); rb_iv_set (self, "@finish", Qnil); cairo_raster_source_pattern_set_acquire (pattern, cr_raster_source_acquire_callback, cr_raster_source_release_callback); cairo_raster_source_pattern_set_snapshot (pattern, cr_raster_source_snapshot_callback); cairo_raster_source_pattern_set_copy (pattern, cr_raster_source_copy_callback); cairo_raster_source_pattern_set_finish (pattern, cr_raster_source_finish_callback); return Qnil; }