C语言使用Cairo绘制光学三原色
2022-03-17 本文已影响0人
一路向后
1.源码实现
#include <stdio.h>
#include <cairo/cairo.h>
#define CR_NUM 15
#define M_PI 3.141592654
int main()
{
cairo_surface_t *surface[CR_NUM];
cairo_t *cr[CR_NUM];
int i;
for(i=0; i<CR_NUM; i++)
{
surface[i] = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 300, 300);
cr[i] = cairo_create(surface[i]);
}
cairo_set_source_rgb(cr[1], 1, 0, 0);
cairo_arc(cr[1], 100, 190, 80, 0, 2 * M_PI);
cairo_fill(cr[1]);
cairo_set_source_rgb(cr[2], 0, 1, 0);
cairo_arc(cr[2], 200, 190, 80, 0, 2 * M_PI);
cairo_fill(cr[2]);
cairo_set_source_rgb(cr[3], 0, 0, 1);
cairo_arc(cr[3], 150, 110, 80, 0, 2 * M_PI);
cairo_fill(cr[3]);
cairo_set_source_rgb(cr[4], 1, 1, 0);
cairo_arc(cr[4], 100, 190, 80, 0, 2 * M_PI);
cairo_fill(cr[4]);
cairo_set_source_rgb(cr[5], 0, 1, 1);
cairo_arc(cr[5], 200, 190, 80, 0, 2 * M_PI);
cairo_fill(cr[5]);
cairo_set_source_rgb(cr[6], 1, 0, 1);
cairo_arc(cr[6], 150, 110, 80, 0, 2 * M_PI);
cairo_fill(cr[6]);
cairo_set_source_rgb(cr[7], 1, 1, 1);
cairo_arc(cr[7], 150, 110, 80, 0, 2 * M_PI);
cairo_fill(cr[7]);
cairo_set_source_surface(cr[8], surface[7], 0, 0);
cairo_paint(cr[8]);
cairo_set_source_surface(cr[9], surface[1], 0, 0);
cairo_paint(cr[9]);
cairo_set_source_surface(cr[10], surface[2], 0, 0);
cairo_paint(cr[10]);
cairo_set_source_surface(cr[11], surface[3], 0, 0);
cairo_paint(cr[11]);
cairo_set_source_surface(cr[12], surface[4], 0, 0);
cairo_paint(cr[12]);
cairo_set_source_surface(cr[13], surface[5], 0, 0);
cairo_paint(cr[13]);
cairo_set_source_surface(cr[14], surface[6], 0, 0);
cairo_paint(cr[14]);
cairo_set_operator(cr[0], CAIRO_OPERATOR_ADD);
cairo_set_operator(cr[8], CAIRO_OPERATOR_DEST_IN);
cairo_set_operator(cr[9], CAIRO_OPERATOR_DEST_OUT);
cairo_set_operator(cr[10], CAIRO_OPERATOR_DEST_OUT);
cairo_set_operator(cr[11], CAIRO_OPERATOR_DEST_OUT);
cairo_set_operator(cr[12], CAIRO_OPERATOR_DEST_IN);
cairo_set_operator(cr[13], CAIRO_OPERATOR_DEST_IN);
cairo_set_operator(cr[14], CAIRO_OPERATOR_DEST_IN);
cairo_set_source_surface(cr[8], surface[4], 0, 0);
cairo_paint(cr[8]);
cairo_set_source_surface(cr[8], surface[5], 0, 0);
cairo_paint(cr[8]);
cairo_set_source_surface(cr[9], surface[2], 0, 0);
cairo_paint(cr[9]);
cairo_set_source_surface(cr[9], surface[3], 0, 0);
cairo_paint(cr[9]);
cairo_set_source_surface(cr[10], surface[1], 0, 0);
cairo_paint(cr[10]);
cairo_set_source_surface(cr[10], surface[3], 0, 0);
cairo_paint(cr[10]);
cairo_set_source_surface(cr[11], surface[1], 0, 0);
cairo_paint(cr[11]);
cairo_set_source_surface(cr[11], surface[2], 0, 0);
cairo_paint(cr[11]);
cairo_set_source_surface(cr[12], surface[2], 0, 0);
cairo_paint(cr[12]);
cairo_set_source_surface(cr[13], surface[3], 0, 0);
cairo_paint(cr[13]);
cairo_set_source_surface(cr[14], surface[1], 0, 0);
cairo_paint(cr[14]);
cairo_set_source_surface(cr[0], surface[8], 0, 0);
cairo_paint(cr[0]);
cairo_set_source_surface(cr[0], surface[9], 0, 0);
cairo_paint(cr[0]);
cairo_set_source_surface(cr[0], surface[10], 0, 0);
cairo_paint(cr[0]);
cairo_set_source_surface(cr[0], surface[11], 0, 0);
cairo_paint(cr[0]);
cairo_set_source_surface(cr[0], surface[12], 0, 0);
cairo_paint(cr[0]);
cairo_set_source_surface(cr[0], surface[13], 0, 0);
cairo_paint(cr[0]);
cairo_set_source_surface(cr[0], surface[14], 0, 0);
cairo_paint(cr[0]);
cairo_surface_write_to_png(surface[0], "a.png");
for(i=0; i<CR_NUM; i++)
{
cairo_surface_destroy(surface[i]);
cairo_destroy(cr[i]);
}
return 0;
}
2.编译源码
$ gcc -o test test.c -lcairo
3.运行程序
$ ./test