C/CPLUS

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

4.结果展示

a.png
上一篇 下一篇

猜你喜欢

热点阅读