开罗 - 重叠线 - “死区”没有平局

问题描述 投票:0回答:1

我在开罗有多条线路。我希望在线周围有一个“死区”,所以如果我渲染多条重叠线,它们就不会重叠。

下面的图片上有一些东西。

enter image description here

cairo
1个回答
1
投票

下面是一个示例程序,首先绘制后面的行,白色,线宽较大,然后再用黑色绘制实际线宽:

#include <cairo.h>

int main()
{
    cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 200, 200);
    cairo_t *cr = cairo_create(s);

    cairo_set_source_rgb(cr, 1, 1, 1);
    cairo_paint(cr);

    cairo_move_to(cr, 50, 20);
    cairo_line_to(cr, 110, 160);

    cairo_set_line_width(cr, 4);
    cairo_set_source_rgb(cr, 0, 0, 0);
    cairo_stroke(cr);


    cairo_move_to(cr, 200, 0);
    cairo_line_to(cr, 60, 160);

    cairo_set_line_width(cr, 15);
    cairo_set_source_rgb(cr, 1, 1, 1);
    cairo_stroke_preserve(cr);

    cairo_set_line_width(cr, 4);
    cairo_set_source_rgb(cr, 0, 0, 0);
    cairo_stroke(cr);


    cairo_move_to(cr, 10, 100);
    cairo_line_to(cr, 220, 50);

    cairo_set_line_width(cr, 15);
    cairo_set_source_rgb(cr, 1, 1, 1);
    cairo_stroke_preserve(cr);

    cairo_set_line_width(cr, 4);
    cairo_set_source_rgb(cr, 0, 0, 0);
    cairo_stroke(cr);

    cairo_surface_write_to_png(s, "out.png");

    cairo_destroy(cr);
    cairo_surface_destroy(s);
}

输出:

Output of the sample program

好的,现在到后台。选项1是绘制具有透明背景的线条,然后通过运算符DEST_OVER绘制下面的背景:

#include <cairo.h>

int main()
{
    /* I changed this to ARGB32 */
    cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 200, 200);
    cairo_t *cr = cairo_create(s);
    cairo_pattern_t *p = cairo_pattern_create_linear(0, 0, 200, 200);

    /* Draw the lines */

    cairo_move_to(cr, 50, 20);
    cairo_line_to(cr, 110, 160);

    cairo_set_line_width(cr, 4);
    cairo_set_source_rgb(cr, 0, 0, 0);
    cairo_stroke(cr);


    cairo_move_to(cr, 200, 0);
    cairo_line_to(cr, 60, 160);

    cairo_set_line_width(cr, 15);
    /* I changed all "drawing white" to "drawing transparency" */
    cairo_save(cr);
    cairo_set_source_rgba(cr, 0, 0, 0, 0);
    cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
    cairo_stroke_preserve(cr);
    cairo_restore(cr);

    cairo_set_line_width(cr, 4);
    cairo_set_source_rgb(cr, 0, 0, 0);
    cairo_stroke(cr);


    cairo_move_to(cr, 10, 100);
    cairo_line_to(cr, 220, 50);

    cairo_set_line_width(cr, 15);
    cairo_save(cr);
    cairo_set_source_rgba(cr, 0, 0, 0, 0);
    cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
    cairo_stroke_preserve(cr);
    cairo_restore(cr);

    cairo_set_line_width(cr, 4);
    cairo_set_source_rgb(cr, 0, 0, 0);
    cairo_stroke(cr);

    /* Draw a background below what we drew so far */
    cairo_pattern_add_color_stop_rgb(p, 0, 1, 0, 0);
    cairo_pattern_add_color_stop_rgb(p, 1, 0, 0, 1);
    cairo_set_source(cr, p);
    /* Actually, I mean DEST_OVER instead of ATOP (which I wrote in my comment) */
    cairo_set_operator(cr, CAIRO_OPERATOR_DEST_OVER);
    cairo_paint(cr);

    cairo_surface_write_to_png(s, "out.png");

    cairo_pattern_destroy(p);
    cairo_destroy(cr);
    cairo_surface_destroy(s);
}

输出:

Same image with a background

选项2是使用临时表面。用透明背景绘制线条。之后,这是在现有背景的基础上绘制的:

#include <cairo.h>

int main()
{
    cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_RGB24, 200, 200);
    cairo_t *cr = cairo_create(s);
    cairo_pattern_t *p = cairo_pattern_create_linear(0, 0, 200, 200);

    /* Draw a background */
    cairo_pattern_add_color_stop_rgb(p, 0, 1, 0, 0);
    cairo_pattern_add_color_stop_rgb(p, 1, 0, 0, 1);
    cairo_set_source(cr, p);
    cairo_paint(cr);
    cairo_pattern_destroy(p);

    /* Draw the lines */

    /* but draw them to a temporary surface */
    cairo_push_group_with_content(cr, CAIRO_CONTENT_COLOR_ALPHA);

    cairo_move_to(cr, 50, 20);
    cairo_line_to(cr, 110, 160);

    cairo_set_line_width(cr, 4);
    cairo_set_source_rgb(cr, 0, 0, 0);
    cairo_stroke(cr);


    cairo_move_to(cr, 200, 0);
    cairo_line_to(cr, 60, 160);

    cairo_set_line_width(cr, 15);
    /* I changed all "drawing white" to "drawing transparency" */
    cairo_save(cr);
    cairo_set_source_rgba(cr, 0, 0, 0, 0);
    cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
    cairo_stroke_preserve(cr);
    cairo_restore(cr);

    cairo_set_line_width(cr, 4);
    cairo_set_source_rgb(cr, 0, 0, 0);
    cairo_stroke(cr);


    cairo_move_to(cr, 10, 100);
    cairo_line_to(cr, 220, 50);

    cairo_set_line_width(cr, 15);
    cairo_save(cr);
    cairo_set_source_rgba(cr, 0, 0, 0, 0);
    cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
    cairo_stroke_preserve(cr);
    cairo_restore(cr);

    cairo_set_line_width(cr, 4);
    cairo_set_source_rgb(cr, 0, 0, 0);
    cairo_stroke(cr);

    /* Now draw the temporary surface to the target surface */
    cairo_pop_group_to_source(cr);
    cairo_paint(cr);

    cairo_surface_write_to_png(s, "out.png");

    cairo_destroy(cr);
    cairo_surface_destroy(s);
}

输出:

another way to draw this on some background

© www.soinside.com 2019 - 2024. All rights reserved.