Есть ли способ сохранить путь и восстановить его в Каире? - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть два графика рисования сигналов в приложении gtkmm.

Проблема возникает, когда мне приходится рисовать график с множеством точек (около 300-350k) и линиями к следующим точкам, поскольку он замедляется много, чтобы нарисовать все точки на каждой итерации.

bool DrawArea::on_draw(const Cairo::RefPtr<Cairo::Context>& c) 
{  
    cairo_t* cr = c->cobj();

    //xSignal.size() = ySignal.size() = 350000
    for (int j = 0; j < xSignal.size() - 1; ++j)
    {
        cairo_move_to(cr, xSignal[j], ySignal[j]);
        cairo_line_to(cr, xSignal[j + 1], ySignal[j + 1]);
    }
    cairo_stroke(cr);

    return true;
}

Я знаю, что существует cairo_stroke_preserve , но я думаю, что это недопустимо для меня, потому что когда я переключаюсь между графиками, он исчезает.

Я исследовал вопрос о сохранении пути и его восстановлении в документации по Каиру, но ничего не вижу. В 2007 году пользователь из Каира предложил в документации «сделать» то же самое, но, видимо, это не было сделано.

Любое предложение?

1 Ответ

0 голосов
/ 29 апреля 2020

Чтобы ответить на ваш вопрос:

Есть cairo_copy_path() и cairo_append_path() (есть также cairo_copy_path_flat() и cairo_path_destroy()).

Таким образом, вы можете сохранить путь с помощью cairo_copy_path() и позже добавьте его к текущему пути с помощью cairo_append_path().

Чтобы ответить на ваш не-вопрос:

Я сомневаюсь, что это ускорит ваш рисунок. Добавление этих строк к текущему пути вряд ли будет медленным. Скорее, я ожидаю, что фактическое рисование этих линий будет медленным.

Вы пишете: «Это сильно замедляет, чтобы нарисовать все точки на каждой итерации». Я не уверен, что означает «каждая итерация», но почему вы все время рисуете все эти точки? Разве не имеет смысла рисовать их только один раз, а затем повторно использовать полученный результат?

...