static cairo_status_t _cairo_xml_emit_surface (cairo_xml_t *xml, const cairo_surface_pattern_t *pattern) { cairo_surface_t *source = pattern->surface; cairo_status_t status; if (_cairo_surface_is_recording (source)) { status = cairo_xml_for_recording_surface (&xml->base, source); } else { cairo_image_surface_t *image; void *image_extra; status = _cairo_surface_acquire_source_image (source, &image, &image_extra); if (unlikely (status)) return status; status = _cairo_xml_emit_image (xml, image); _cairo_surface_release_source_image (source, image, image_extra); } return status; }
static VALUE cr_xml_device_reply (VALUE self, VALUE recording_surface) { cairo_device_t *device; device = _SELF; cairo_xml_for_recording_surface (device, RVAL2CRSURFACE (recording_surface)); cr_device_check_status (device); return Qnil; }
int main (int argc, char **argv) { cairo_surface_t *surface = NULL; const cairo_script_interpreter_hooks_t hooks = { .closure = &surface, .surface_create = _surface_create, }; cairo_script_interpreter_t *csi; FILE *in = stdin, *out = stdout; if (argc >= 2 && strcmp (argv[1], "-")) in = fopen (argv[1], "r"); if (argc >= 3 && strcmp (argv[2], "-")) out = fopen (argv[2], "w"); csi = cairo_script_interpreter_create (); cairo_script_interpreter_install_hooks (csi, &hooks); cairo_script_interpreter_feed_stream (csi, in); cairo_script_interpreter_finish (csi); cairo_script_interpreter_destroy (csi); if (surface != NULL) { cairo_device_t *xml; xml = cairo_xml_create_for_stream (stdio_write, out); cairo_xml_for_recording_surface (xml, surface); cairo_device_destroy (xml); cairo_surface_destroy (surface); } if (in != stdin) fclose (in); if (out != stdout) fclose (out); return 0; }