Я обнаружил Cairo Recoding Surface , который точно делает то, что мне нужно.
Я рисую свои объекты на неограниченной поверхности записи и позволяю Каиру вычислить ограничивающую рамку.
Небольшой пример, который создает несколько строк и вычисляет ограничивающий прямоугольник, выглядит следующим образом:
void main(void)
{
cairo_surface_t *rec;
cairo_t *cr;
double x0, y0, width, height;
rec = cairo_recording_surface_create(CAIRO_CONTENT_COLOR_ALPHA, NULL);
cr = cairo_create(rec);
cairo_scale(cr, 10, 10);
cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
cairo_set_line_width(cr, 2);
cairo_move_to(cr, 0, 0);
cairo_rel_line_to(cr, 0, 20);
cairo_rel_line_to(cr, 5, 0);
cairo_rel_line_to(cr, 1, 1);
cairo_stroke(cr);
cairo_recording_surface_ink_extents(rec, &x0, &y0, &width, &height);
printf("Size: %lf / %lf at (%lf, %lf)\n", width, height, x0, y0);
}