static cairo_test_status_t draw (cairo_t *cr, int width, int height) { cairo_pattern_t *pattern; cairo_test_paint_checkered (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_curve_to (pattern, 30, -30, 60, 30, 100, 0); cairo_mesh_pattern_curve_to (pattern, 130, 140, 60, -40, 100, 100); cairo_mesh_pattern_curve_to (pattern, 60, 70, 30, 130, 0, 100); cairo_mesh_pattern_curve_to (pattern, -30, -40, 30, 140, 0, 0); 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); 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; cairo_test_paint_checkered (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_curve_to (pattern, 30, -30, 60, 30, 100, 0); cairo_mesh_pattern_curve_to (pattern, 60, 30, 130, 60, 100, 100); cairo_mesh_pattern_curve_to (pattern, 60, 70, 30, 130, 0, 100); cairo_mesh_pattern_curve_to (pattern, 30, 70, -30, 30, 0, 0); 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_mesh_pattern_begin_patch (pattern); cairo_mesh_pattern_move_to (pattern, 50, 50); cairo_mesh_pattern_curve_to (pattern, 80, 20, 110, 80, 150, 50); cairo_mesh_pattern_curve_to (pattern, 110, 80, 180, 110, 150, 150); cairo_mesh_pattern_curve_to (pattern, 110, 120, 80, 180, 50, 150); cairo_mesh_pattern_curve_to (pattern, 80, 120, 20, 80, 50, 50); cairo_mesh_pattern_set_corner_color_rgba (pattern, 0, 1, 0, 0, 0.3); cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); cairo_mesh_pattern_set_corner_color_rgba (pattern, 2, 0, 0, 1, 0.3); cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0); cairo_mesh_pattern_end_patch (pattern); cairo_scale (cr, .5, .5); cairo_set_source (cr, pattern); cairo_paint (cr); cairo_translate (cr, PAT_WIDTH, PAT_HEIGHT); cairo_translate (cr, PAT_WIDTH/2, PAT_HEIGHT/2); cairo_rotate (cr, M_PI/4); cairo_translate (cr, -PAT_WIDTH, -PAT_HEIGHT); cairo_set_source (cr, pattern); cairo_paint (cr); cairo_pattern_destroy (pattern); return CAIRO_TEST_SUCCESS; }
static VALUE cr_mesh_pattern_curve_to (VALUE self, VALUE x1, VALUE y1, VALUE x2, VALUE y2, VALUE x3, VALUE y3) { cairo_pattern_t *pattern; pattern = _SELF (self); cairo_mesh_pattern_curve_to (pattern, NUM2DBL (x1), NUM2DBL (y1), NUM2DBL (x2), NUM2DBL (y2), NUM2DBL (x3), NUM2DBL (y3)); 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_pattern_t * mesh (void) { cairo_pattern_t *pattern; pattern = cairo_pattern_create_mesh (); cairo_mesh_pattern_begin_patch (pattern); cairo_mesh_pattern_move_to (pattern, 0, 0); cairo_mesh_pattern_curve_to (pattern, 30, -30, 60, 30, 100, 0); cairo_mesh_pattern_curve_to (pattern, 60, 30, 130, 60, 100, 100); cairo_mesh_pattern_curve_to (pattern, 60, 70, 30, 130, 0, 100); cairo_mesh_pattern_curve_to (pattern, 30, 70, -30, 30, 0, 0); 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_mesh_pattern_begin_patch (pattern); cairo_mesh_pattern_move_to (pattern, 50, 50); cairo_mesh_pattern_curve_to (pattern, 80, 20, 110, 80, 150, 50); cairo_mesh_pattern_curve_to (pattern, 110, 80, 180, 110, 150, 150); cairo_mesh_pattern_curve_to (pattern, 110, 120, 80, 180, 50, 150); cairo_mesh_pattern_curve_to (pattern, 80, 120, 20, 80, 50, 50); cairo_mesh_pattern_set_corner_color_rgba (pattern, 0, 1, 0, 0, 0.3); cairo_mesh_pattern_set_corner_color_rgb (pattern, 1, 0, 1, 0); cairo_mesh_pattern_set_corner_color_rgba (pattern, 2, 0, 0, 1, 0.3); cairo_mesh_pattern_set_corner_color_rgb (pattern, 3, 1, 1, 0); cairo_mesh_pattern_end_patch (pattern); return pattern; }