static void patch_line (cairo_pattern_t *pattern, double x0, double y0, double x1, double y1, double radius, double r, double g, double b, double a) { double dx = y1 - y0; double dy = x0 - x1; double len = radius / hypot (dx, dy); dx *= len; dy *= len; cairo_mesh_pattern_begin_patch (pattern); cairo_mesh_pattern_move_to (pattern, x0, y0); cairo_mesh_pattern_line_to (pattern, x0 + dx, y0 + dy); cairo_mesh_pattern_line_to (pattern, x1 + dx, y1 + dy); cairo_mesh_pattern_line_to (pattern, x1, y1); cairo_mesh_pattern_set_corner_color_rgba (pattern, 0, r, g, b, a); cairo_mesh_pattern_set_corner_color_rgba (pattern, 1, r, g, b, 0); cairo_mesh_pattern_set_corner_color_rgba (pattern, 2, r, g, b, 0); cairo_mesh_pattern_set_corner_color_rgba (pattern, 3, r, g, b, a); cairo_mesh_pattern_end_patch (pattern); }
static VALUE cr_mesh_pattern_line_to (VALUE self, VALUE x, VALUE y) { cairo_pattern_t *pattern; pattern = _SELF (self); cairo_mesh_pattern_line_to (pattern, NUM2DBL (x), NUM2DBL (y)); cr_pattern_check_status (pattern); return self; }
static void patch_arc (cairo_pattern_t *pattern, double x, double y, double start, double end, double radius, double r, double g, double b, double a) { double r_sin_A, r_cos_A; double r_sin_B, r_cos_B; double h; r_sin_A = radius * sin (start); r_cos_A = radius * cos (start); r_sin_B = radius * sin (end); r_cos_B = radius * cos (end); h = 4.0/3.0 * tan ((end - start) / 4.0); cairo_mesh_pattern_begin_patch (pattern); cairo_mesh_pattern_move_to (pattern, x, y); cairo_mesh_pattern_line_to (pattern, x + r_cos_A, y + r_sin_A); cairo_mesh_pattern_curve_to (pattern, x + r_cos_A - h * r_sin_A, y + r_sin_A + h * r_cos_A, x + r_cos_B + h * r_sin_B, y + r_sin_B - h * r_cos_B, x + r_cos_B, y + r_sin_B); cairo_mesh_pattern_line_to (pattern, x, y); cairo_mesh_pattern_set_corner_color_rgba (pattern, 0, r, g, b, a); cairo_mesh_pattern_set_corner_color_rgba (pattern, 1, r, g, b, 0); cairo_mesh_pattern_set_corner_color_rgba (pattern, 2, r, g, b, 0); cairo_mesh_pattern_set_corner_color_rgba (pattern, 3, r, g, b, a); cairo_mesh_pattern_end_patch (pattern); }
static cairo_test_status_t draw (cairo_t *cr, int width, int height) { cairo_pattern_t *pattern; double offset; cairo_test_paint_checkered (cr); 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, 1, 0); cairo_mesh_pattern_line_to (pattern, 1, 1); cairo_mesh_pattern_line_to (pattern, 0, 1); cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 0, 0, 0); cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 1, 1, 1); cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 0, 0, 0); cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 1); cairo_mesh_pattern_end_patch (pattern); cairo_mesh_pattern_begin_patch (pattern); /* A small 1x1 red patch, that should be rendered as a 2x2 red * square in the center of the image */ offset = 0.5 / SIZE; cairo_mesh_pattern_move_to (pattern, 0.5 + offset, 0.5 + offset); cairo_mesh_pattern_line_to (pattern, 0.5 + offset, 0.5 - offset); cairo_mesh_pattern_line_to (pattern, 0.5 - offset, 0.5 - offset); cairo_mesh_pattern_line_to (pattern, 0.5 - offset, 0.5 + offset); cairo_mesh_pattern_set_corner_color_rgb (pattern, 0, 1, 0, 0); cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 1, 0, 0); cairo_mesh_pattern_set_corner_color_rgb (pattern, 2, 1, 0, 0); cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 0, 0); cairo_mesh_pattern_end_patch (pattern); cairo_scale (cr, SIZE, SIZE); cairo_set_source (cr, pattern); cairo_paint (cr); cairo_pattern_destroy (pattern); return CAIRO_TEST_SUCCESS; }
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; }