int main(int argc, char *argv[]) { FILE *fp; RsvgHandle *rsvg; cairo_device_t *dev = NULL; cairo_surface_t *surface = NULL; cairo_t *cr = NULL; RsvgDimensionData dimensions; if (argc < 3) { usage(); return 0; } fp = fopen(argv[1], "r"); if (fp == NULL) { printf("could not open '%s' for read\n", argv[1]); return 1; } fclose(fp); fp = fopen(argv[2], "w"); if (fp == NULL) { printf("could not open '%s' for write\n", argv[2]); return 1; } dev = cairo_xml_create_for_stream((cairo_write_func_t)write_func, fp); rsvg_set_default_dpi_x_y(-1, -1); rsvg = rsvg_handle_new_from_file(argv[1], NULL); rsvg_handle_get_dimensions(rsvg, &dimensions); fprintf(fp, "<image width='%d' height='%d'>\n", dimensions.width, dimensions.height); surface = cairo_xml_surface_create(dev, CAIRO_CONTENT_COLOR_ALPHA, dimensions.width, dimensions.height); cr = cairo_create(surface); rsvg_handle_render_cairo(rsvg, cr); rsvg_handle_close(rsvg, NULL); cairo_destroy(cr); cairo_surface_destroy(surface); fprintf(fp, "</image>\n"); fclose(fp); return 0; }
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; }