Exemple #1
0
	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);
		}
	}