static VALUE cr_mesh_pattern_get_control_point (VALUE self, VALUE rb_nth_patch, VALUE rb_nth_point) { cairo_pattern_t *pattern; unsigned int nth_patch, nth_point; double x, y; cairo_status_t status; nth_patch = NUM2UINT (rb_nth_patch); nth_point = NUM2UINT (rb_nth_point); if (nth_point > 3) { VALUE inspected; inspected = rb_funcall (rb_ary_new3 (2, rb_nth_patch, rb_nth_point), id_inspect, 0); rb_raise (rb_eArgError, "nth_point must be 0, 1, 2 or 3: <%u>: <%s>", nth_point, RVAL2CSTR (inspected)); } pattern = _SELF (self); status = cairo_mesh_pattern_get_control_point (pattern, nth_patch, nth_point, &x, &y); rb_cairo_check_status (status); return rb_ary_new3 (2, rb_float_new (x), rb_float_new (y)); }
static cairo_test_status_t draw (cairo_t *cr, int width, int height) { cairo_pattern_t *pattern; unsigned int i, j; unsigned int num_patches; double x, y; cairo_set_source_rgb (cr, 1, 1, 1); cairo_paint (cr); cairo_translate (cr, PAD, PAD); pattern = cairo_pattern_create_mesh (); cairo_mesh_pattern_begin_patch (pattern); cairo_mesh_pattern_move_to (pattern, 0, 0); cairo_mesh_pattern_line_to (pattern, SIZE, 0); cairo_mesh_pattern_line_to (pattern, SIZE, SIZE); cairo_mesh_pattern_line_to (pattern, 0, SIZE); cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0); cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 1); cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0); cairo_mesh_pattern_set_control_point (pattern, 0, SIZE * .7, SIZE * .7); cairo_mesh_pattern_set_control_point (pattern, 1, SIZE * .9, SIZE * .7); cairo_mesh_pattern_set_control_point (pattern, 2, SIZE * .9, SIZE * .9); cairo_mesh_pattern_set_control_point (pattern, 3, SIZE * .7, SIZE * .9); cairo_mesh_pattern_end_patch (pattern); cairo_mesh_pattern_begin_patch (pattern); cairo_mesh_pattern_move_to (pattern, SIZE + PAD, 0); cairo_mesh_pattern_line_to (pattern, 2*SIZE + PAD, 0); cairo_mesh_pattern_line_to (pattern, 2*SIZE + PAD, SIZE); cairo_mesh_pattern_line_to (pattern, SIZE + PAD, SIZE); cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0); cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 1); cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0); cairo_mesh_pattern_end_patch (pattern); cairo_set_source (cr, pattern); cairo_paint (cr); /* mark the location of the control points */ cairo_set_source_rgb (cr, 0, 0, 0); cairo_mesh_pattern_get_patch_count (pattern, &num_patches); for (i = 0; i < num_patches; i++) { for (j = 0; j < 4; j++) { cairo_mesh_pattern_get_control_point (pattern, i, j, &x, &y); cairo_rectangle (cr, x - 5, y - 5, 10, 10); cairo_fill (cr); } } cairo_pattern_destroy (pattern); return CAIRO_TEST_SUCCESS; }