void draw(cairo_t* cr = NULL) { cairo_t* target = cr; if (subject->buffered || !cr) { if (!buffer) { buffer = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, subject->size.x, subject->size.y); } } else { if (buffer) { cairo_surface_destroy(buffer); buffer = NULL; } } if (buffer) { target = cairo_create(buffer); } if (cr) { cairo_save(cr); cairo_translate(cr, subject->position.x, subject->position.y); } subject->draw(target, this); if (buffer) { cairo_destroy(target); } if (cr && target != cr) { cairo_set_source_surface(cr, buffer, 0, 0); cairo_paint(cr); } if (cr) { cairo_restore(cr); } }