
/* cairo025.c 模式 cairo_mesh_pattern_line_to
* C1 Side 1 C2
* +---------------+
* | |
* | P1 P2 |
* | |
* Side 0 | | Side 2
* | |
* | |
* | P0 P3 |
* | |
* +---------------+
* C0 Side 3 C3
*/
#include <cairo.h>
#include <stdlib.h>
#include <string.h>
static cairo_surface_t *surface = NULL;
struct df_canvas
{
char filename[28];
int type;
double width;
double height;
};
void df_draw_brush (struct df_canvas const *pcanvas)
{
cairo_t *cr;
cairo_pattern_t *pat;
cr = cairo_create (surface);
pat = cairo_pattern_create_mesh();
cairo_set_source_rgba (cr, 0.1, 0.1, 0.1, 0.9);
/* 第一张图 黄色直线 */
cairo_mesh_pattern_begin_patch (pat);
cairo_mesh_pattern_move_to (pat, 150, 80);
cairo_mesh_pattern_line_to (pat, 500, 80);
cairo_mesh_pattern_set_corner_color_rgba (pat, 0, 1, 1, 0, 0.9); /* side 0*/
cairo_mesh_pattern_end_patch (pat);
cairo_rectangle (cr, 100, 60, 400, 40); /* 黑色四边形剪切路径 */
cairo_fill_preserve (cr);
/* 第二张图 */
cairo_mesh_pattern_begin_patch (pat);
cairo_mesh_pattern_move_to (pat, 300, 300);
cairo_mesh_pattern_line_to (pat, 100, 200);
cairo_mesh_pattern_line_to (pat, 500, 200);
cairo_mesh_pattern_set_corner_color_rgba (pat, 0, 1, 0, 0, 0.9); /* 红色 */
cairo_mesh_pattern_end_patch (pat);
cairo_rectangle (cr, 100, 180, 400, 150);
cairo_fill_preserve (cr);
/* 第三张图 */
cairo_mesh_pattern_begin_patch (pat);
cairo_mesh_pattern_move_to (pat, 300, 500);
cairo_mesh_pattern_line_to (pat, 100, 400);
cairo_mesh_pattern_line_to (pat, 500, 400);
cairo_mesh_pattern_set_corner_color_rgba (pat, 0, 1, 0, 0, 0.9); /* 红色 c0 */
cairo_mesh_pattern_set_corner_color_rgba (pat, 1, 0, 1, 0, 0.9); /* 绿色 c1 */
cairo_mesh_pattern_end_patch (pat);
cairo_rectangle (cr, 100, 380, 400, 150);
cairo_fill_preserve (cr);
/* 第四张图 */
cairo_mesh_pattern_begin_patch (pat);
cairo_mesh_pattern_move_to (pat, 300, 700);
cairo_mesh_pattern_line_to (pat, 100, 600);
cairo_mesh_pattern_line_to (pat, 500, 600);
cairo_mesh_pattern_set_corner_color_rgba (pat, 0, 1, 0, 0, 0.9); /* 红色 c0 */
cairo_mesh_pattern_set_corner_color_rgba (pat, 2, 0, 1, 0, 0.9); /* 绿色 c2 */
cairo_mesh_pattern_end_patch (pat);
cairo_rectangle (cr, 100, 580, 400, 150);
cairo_fill_preserve (cr);
/* 第五张图 */
cairo_mesh_pattern_begin_patch (pat);
cairo_mesh_pattern_move_to (pat, 300, 900);
cairo_mesh_pattern_line_to (pat, 100, 800);
cairo_mesh_pattern_line_to (pat, 500, 800);
cairo_mesh_pattern_set_corner_color_rgba (pat, 0, 1, 0, 0, 0.9); /* 红色 c0 */
cairo_mesh_pattern_set_corner_color_rgba (pat, 3, 0, 1, 0, 0.9); /* 绿色 c3 */
cairo_mesh_pattern_end_patch (pat);
cairo_rectangle (cr, 100, 780, 400, 150);
cairo_fill_preserve (cr);
/* 第六张图 */
cairo_mesh_pattern_begin_patch (pat);
cairo_mesh_pattern_move_to (pat, 300, 1100);
cairo_mesh_pattern_line_to (pat, 100, 1000);
cairo_mesh_pattern_line_to (pat, 500, 1000);
cairo_mesh_pattern_set_corner_color_rgba (pat, 1, 1, 0, 0, 0.9); /* 红色 c1 */
cairo_mesh_pattern_set_corner_color_rgba (pat, 2, 0, 1, 0, 0.9); /* 绿色 c2 */
cairo_mesh_pattern_end_patch (pat);
cairo_rectangle (cr, 100, 980, 400, 150);
cairo_fill_preserve (cr);
/* 第七张图 */
cairo_mesh_pattern_begin_patch (pat);
cairo_mesh_pattern_move_to (pat, 300, 1300);
cairo_mesh_pattern_line_to (pat, 100, 1200);
cairo_mesh_pattern_line_to (pat, 500, 1200);
cairo_mesh_pattern_set_corner_color_rgba (pat, 1, 1, 0, 0, 0.9); /* 红色 c1 */
cairo_mesh_pattern_set_corner_color_rgba (pat, 3, 0, 1, 0, 0.9); /* 绿色 c3 */
cairo_mesh_pattern_end_patch (pat);
cairo_rectangle (cr, 100, 1180, 400, 150);
cairo_fill_preserve (cr);
cairo_set_source (cr, pat);
cairo_fill (cr);
cairo_stroke (cr);
cairo_surface_write_to_png (surface, pcanvas -> filename);
cairo_pattern_destroy (pat);
cairo_destroy (cr);
}
void df_init_canvas (struct df_canvas const *pcanvas)
{
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, (int) pcanvas -> width, (int) pcanvas -> height);
}
int main (int argc, char *argv[])
{
struct df_canvas *canvas;
canvas = (struct df_canvas*) malloc (sizeof (struct df_canvas));
strncpy(canvas -> filename, "hello.png",28);
canvas -> type = CAIRO_SURFACE_TYPE_IMAGE;
canvas -> width = 600.0;
canvas -> height = 1400.0;
df_init_canvas (canvas);
df_draw_brush (canvas);
free (canvas);
if (surface != NULL) cairo_surface_destroy (surface);
return 0;
}