Каир: заправка объекта (кружок) и удаление его

Я рисую некоторые дуги, используя Каир, вот функция.

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, но, похоже, он уничтожает экземпляр, а не удаляет реальный объект.

Спасибо!

1

Решение

Cairo использует модель трафарета / краски, поэтому рисование (обычно) выполняется поверх существующего изображения1.

Он не поддерживает слои или объекты. Так же, как рисовать на бумаге, вы не можете переехать или же модифицировать круг после его нарисован. Это стало рисунком в растровом изображении.

к удалять круг, залейте все изображение исходным фоном (cairo_set_source_rgb(cr, 1, 1, 1); cairo_paint(cr)) и перерисовать все Кроме круг.

1. Вы можете изменить растровый код операции, чтобы выполнять другие виды композитинга.

2

Другие решения

Других решений пока нет …