Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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;
}