Я рисую некоторые дуги, используя Каир, вот функция.
cairo_t* drawCircle(cairo_surface_t *container, int x, int y, int r, int cr, int cg, int cb, int ca)
{
cairo_t *cairoInstance; //Create instance
cairoInstance = cairo_create(container);
cairo_set_source_rgba(cairoInstance, 0,0,1,0.5);
cairo_arc(cairoInstance, x, y, r, 0, 2*M_PI);
cairo_stroke_preserve(cairoInstance);
cairo_fill(cairoInstance);gtk_widget_queue_draw_area(GTK_WIDGET(window), 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); //Redraws the window
return cairoInstance;
}
Первый вопрос: когда я позже изменяю source_rgba, а затем заполняю, он заполняет предыдущий цвет. Есть ли способ сбросить заливку перед заливкой другим цветом?
Во-вторых, если я захочу позже разорвать / удалить дугу / окружность, как мне это сделать? Я попытался использовать cairo_destroy, но, похоже, он уничтожает экземпляр, а не удаляет реальный объект.
Спасибо!
Cairo использует модель трафарета / краски, поэтому рисование (обычно) выполняется поверх существующего изображения1.
Он не поддерживает слои или объекты. Так же, как рисовать на бумаге, вы не можете переехать или же модифицировать круг после его нарисован. Это стало рисунком в растровом изображении.
к удалять круг, залейте все изображение исходным фоном (cairo_set_source_rgb(cr, 1, 1, 1); cairo_paint(cr)
) и перерисовать все Кроме круг.
1. Вы можете изменить растровый код операции, чтобы выполнять другие виды композитинга.
Других решений пока нет …